diff --git a/.cdtproject b/.cdtproject
new file mode 100644
index 00000000..69405851
--- /dev/null
+++ b/.cdtproject
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="scannerConfiguration">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+</item>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="org.eclipse.cdt.make.core.buildtargets">
+<buildTargets>
+<target name="Build toolchain" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildArguments/>
+<buildTarget>all</buildTarget>
+<stopOnError>true</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+</buildTargets>
+</item>
+</data>
+</cdtproject>
diff --git a/.project b/.project
new file mode 100644
index 00000000..521ece31
--- /dev/null
+++ b/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>crosstool-ng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/org.eclipse.cdt.make.core.makeBuilder.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/org.eclipse.cdt.make.core.ScannerConfigBuilder.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs
new file mode 100644
index 00000000..d9cabed8
--- /dev/null
+++ b/.settings/org.eclipse.cdt.core.prefs
@@ -0,0 +1,3 @@
+#Sat Feb 17 16:17:18 CET 2007
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.fastIndexer
diff --git a/COPYING b/COPYING
new file mode 100644
index 00000000..8c36fbea
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,21 @@
+Unless otherwise stated in individaul files, this work is licensed to you under
+the following terms.
+
+- Files in docs/ are available under the Creative Commons Attribution, Share
+  Alike (by-sa), v2.5, to be found there:
+    licenses/by-sa/deed.en     (human-readable summary)
+    licenses/by-sa/legalcode   (legal code, the full license)
+    
+- Files found in patches/uClibc/*/ are available under the GNU Lesser General
+  Public License (LGPL), v2.1, to be found here:
+    licenses/lgpl.txt
+
+- Files found in patches/glibc/*/ are available under the GNU Lesser General
+  Public License (LGPL), v2.1, to be found there:
+    licenses/lgpl.txt
+
+- Other files not covered by the above licenses, and not covered by an
+  individual license specified in the file itself, or an accompanying file,
+  are available under the GNU General Public License (GPL), v2, to be found
+  here:
+    licenses/gpl.txt
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 00000000..b571936e
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,9 @@
+I would like to thank these fine people for making crosstool-NG possible:
+
+  Dan KEGEL, the original author of crosstool: http://www.kegel.com/
+    Dan was very helpfull and willing to help when I build my first toolchains.
+    I owe him one. Thank you Dan!
+    Some crosstool-NG scripts have code snippets coming almost as-is from the
+    original work by Dan.
+
+More to come as they help.
diff --git a/LICENSES b/LICENSES
new file mode 120000
index 00000000..d24842f3
--- /dev/null
+++ b/LICENSES
@@ -0,0 +1 @@
+COPYING
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..bab78281
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,46 @@
+# Makefile for crosstool-NG.
+# Copyright 2006 Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
+
+# The project version
+export PROJECTVERSION=0.0.1
+
+# This should eventually be computed if compiling out-of-tree is implemented
+export CT_TOP_DIR=$(shell pwd)
+
+.PHONY: all
+all: build
+
+HOST_CC = gcc -funsigned-char
+
+help::
+	@echo  'Available make targets (*: default target):'
+	@echo
+
+include $(CT_TOP_DIR)/kconfig/Makefile
+#include $(CT_TOP_DIR)/samples/Makefile
+
+help::
+	@echo  'Build targets:'
+	@echo  '* build		  - Build the toolchain'
+	@echo  '  clean		  - Remove generated files'
+	@echo  '  distclean	  - Remove generated files and configuration'
+
+include $(CT_TOP_DIR)/tools/Makefile
+
+.config: config/*.in
+	@make menuconfig
+	@# Because exiting menuconfig without saving is not an error to menuconfig
+	@test -f .config
+
+# Actual build
+build: .config
+	@$(CT_TOP_DIR)/scripts/crosstool.sh
+
+.PHONY: clean
+clean::
+	@rm -f .crosstool.config
+
+.PHONY: distclean
+distclean:: clean
+	@rm -f .config* ..config.tmp
+
diff --git a/README b/README
new file mode 100644
index 00000000..2d1f1546
--- /dev/null
+++ b/README
@@ -0,0 +1,9 @@
+This is the README for crosstool-NG
+
+To get you started, hust enter:
+  make help
+
+You can find a (terse and WIP) documentation in docs/.
+
+You can also point your browser to
+  http://ymorin.is-a-geek.org/dokuwiki/doku.php?id=projects:crosstool
diff --git a/config/binutils.in b/config/binutils.in
new file mode 100644
index 00000000..e91b64e8
--- /dev/null
+++ b/config/binutils.in
@@ -0,0 +1,133 @@
+# binutils options
+
+menu "binutils"
+
+config BINUTILS_VERSION
+    string
+
+choice
+    bool
+    prompt "binutils version"
+
+config BINUTILS_V_2_11_2
+    bool
+    prompt "2.11.2"
+
+config BINUTILS_V_2_13_90
+    bool
+    prompt "2.13.90"
+
+config BINUTILS_V_2_14
+    bool
+    prompt "2.14"
+
+config BINUTILS_V_2_14_90
+    bool
+    prompt "2.14.90"
+
+config BINUTILS_V_2_14_92
+    bool
+    prompt "2.14.92"
+
+config BINUTILS_V_2_15
+    bool
+    prompt "2.15"
+
+config BINUTILS_V_2_15_90
+    bool
+    prompt "2.15.90"
+
+config BINUTILS_V_2_15_91
+    bool
+    prompt "2.15.91"
+
+config BINUTILS_V_2_16
+    bool
+    prompt "2.16"
+
+config BINUTILS_V_2_16_1
+    bool
+    prompt "2.16.1"
+
+config BINUTILS_V_2_17
+    bool
+    prompt "2.17"
+
+config BINUTILS_V_2_17_50_0_1
+    bool
+    prompt "2.17.50.0.1"
+
+config BINUTILS_V_2_17_50_0_2
+    bool
+    prompt "2.17.50.0.2"
+
+config BINUTILS_V_2_17_50_0_3
+    bool
+    prompt "2.17.50.0.3"
+
+config BINUTILS_V_2_17_50_0_4
+    bool
+    prompt "2.17.50.0.4"
+
+config BINUTILS_V_2_17_50_0_5
+    bool
+    prompt "2.17.50.0.5"
+
+config BINUTILS_V_2_17_50_0_6
+    bool
+    prompt "2.17.50.0.6"
+
+config BINUTILS_V_2_17_50_0_7
+    bool
+    prompt "2.17.50.0.7"
+
+config BINUTILS_V_2_17_50_0_8
+    bool
+    prompt "2.17.50.0.8"
+
+config BINUTILS_V_2_17_50_0_9
+    bool
+    prompt "2.17.50.0.9"
+
+config BINUTILS_V_2_17_50_0_10
+    bool
+    prompt "2.17.50.0.10"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove qbove line!
+endchoice
+
+config BINUTILS_VERSION
+    string
+    default "2.11.2" if BINUTILS_V_2_11_2
+    default "2.13.90" if BINUTILS_V_2_13_90
+    default "2.14" if BINUTILS_V_2_14
+    default "2.14.90" if BINUTILS_V_2_14_90
+    default "2.14.92" if BINUTILS_V_2_14_92
+    default "2.15" if BINUTILS_V_2_15
+    default "2.15.90" if BINUTILS_V_2_15_90
+    default "2.15.91" if BINUTILS_V_2_15_91
+    default "2.16" if BINUTILS_V_2_16
+    default "2.16.1" if BINUTILS_V_2_16_1
+    default "2.17" if BINUTILS_V_2_17
+    default "2.17.50.0.1" if BINUTILS_V_2_17_50_0_1
+    default "2.17.50.0.2" if BINUTILS_V_2_17_50_0_2
+    default "2.17.50.0.3" if BINUTILS_V_2_17_50_0_3
+    default "2.17.50.0.4" if BINUTILS_V_2_17_50_0_4
+    default "2.17.50.0.5" if BINUTILS_V_2_17_50_0_5
+    default "2.17.50.0.6" if BINUTILS_V_2_17_50_0_6
+    default "2.17.50.0.7" if BINUTILS_V_2_17_50_0_7
+    default "2.17.50.0.8" if BINUTILS_V_2_17_50_0_8
+    default "2.17.50.0.9" if BINUTILS_V_2_17_50_0_9
+    default "2.17.50.0.10" if BINUTILS_V_2_17_50_0_10
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove qbove line!
+
+config BINUTILS_EXTRA_CONFIG
+    string
+    prompt "binutils extra config"
+    default ""
+    help
+      Extra flags passed onto ./configure when configuring
+
+endmenu
diff --git a/config/cc.in b/config/cc.in
new file mode 100644
index 00000000..18eb559f
--- /dev/null
+++ b/config/cc.in
@@ -0,0 +1,185 @@
+# Compiler options
+
+menu "C compiler"
+
+comment "Core C Compiler (used to build the C library)"
+
+config CC_USE_CORE
+    bool
+    prompt "Use a different core C compiler"
+    default n
+    help
+      Use a different compiler to build the C library than the one
+      in the final toolchain.
+      
+      You can change the compiler used, or only the version used.
+
+      You most probably don't need that.
+
+config CC_CORE_GCC
+    bool
+    default y if ! CC_USE_CORE && CC_GCC
+    default n if CC_USE_CORE || ! CC_GCC
+
+config CC_CORE_TCC
+    bool
+    default y if ! CC_USE_CORE && CC_TCC
+    default n if CC_USE_CORE || ! CC_TCC
+
+choice
+    bool
+    prompt "Core C compiler:"
+    depends on CC_USE_CORE
+
+config CC_CORE_GCC
+    bool
+    prompt "gcc"
+
+#config CC_CORE_TCC
+#    bool
+#    prompt "tcc (EXPERIMENTAL)"
+
+endchoice
+
+config CC_CORE_VERSION
+    string
+
+config CC_CORE
+    string
+    default "gcc" if CC_CORE_GCC
+    default "tcc" if CC_CORE_TCC
+
+if CC_CORE_GCC && CC_USE_CORE
+source config/cc_core_gcc.in
+endif
+
+if CC_CORE_TCC && CC_USE_CORE
+source config/cc_core_tcc.in
+endif
+
+comment "Final C compiler"
+
+choice
+    bool
+    prompt "Final C compiler"
+    default CC_GCC
+
+config CC_GCC
+    bool
+    prompt "gcc"
+    select CC_SUPPORT_CXX
+    select CC_SUPPORT_FORTRAN
+    select CC_SUPPORT_JAVA
+    select CC_SUPPORT_ADA
+    select CC_SUPPORT_OBJC
+    select CC_SUPPORT_OBJCXX
+
+#config CC_TCC
+#    bool
+#    prompt "tcc (EXPERIMENTAL)"
+#    select CC_LANG_C
+
+endchoice
+
+config CC_VERSION
+    string
+
+config CC
+    string
+    default "gcc" if CC_GCC
+    default "tcc" if CC_TCC
+
+if CC_GCC
+source config/cc_gcc.in
+endif
+
+if CC_GCC
+source config/cc_tcc.in
+endif
+
+config CC_SUPPORT_CXX
+    bool
+
+config CC_SUPPORT_FORTRAN
+    bool
+
+config CC_SUPPORT_JAVA
+    bool
+
+config CC_SUPPORT_ADA
+    bool
+
+config CC_SUPPORT_OBJC
+    bool
+
+config CC_SUPPORT_OBJCXX
+    bool
+
+comment "Additionnal supported languages:"
+
+config CC_LANG_CXX
+    bool
+    prompt "C++"
+    default n
+    depends on CC_SUPPORT_CXX
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_FORTRAN
+    bool
+    prompt "Fortran"
+    default n
+    depends on CC_SUPPORT_FORTRAN
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_JAVA
+    bool
+    prompt "Java"
+    default n
+    depends on CC_SUPPORT_JAVA
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_ADA
+    bool
+    prompt "ADA"
+    default n
+    depends on CC_SUPPORT_ADA
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_OBJC
+    bool
+    prompt "Objective-C"
+    default n
+    depends on CC_SUPPORT_OBJC
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_OBJCXX
+    bool
+    prompt "Objective-C++"
+    default n
+    depends on CC_SUPPORT_OBJCXX
+    help
+      Only select this if you know that your specific combination of
+      compiler and its version does support this language.
+
+config CC_LANG_OTHERS
+    string
+    prompt "Other languages"
+    default ""
+    help
+      Enter here a comma-separated list of languages that you know your compiler
+      supports, besides those listed above.
+
+      Eg. gcc-4.1+ has a toy programming language, treelang. As it is not usefull
+      in real life, it is not available in the selection above.
+
+endmenu
diff --git a/config/cc_core_gcc.in b/config/cc_core_gcc.in
new file mode 100644
index 00000000..f9222196
--- /dev/null
+++ b/config/cc_core_gcc.in
@@ -0,0 +1,137 @@
+# Compiler options
+
+choice
+    bool
+    prompt "Core gcc version"
+
+config CC_CORE_V_2_95_3
+    bool
+    prompt "2.95.3"
+
+config CC_CORE_V_3_2_3
+    bool
+    prompt "3.2.3"
+
+config CC_CORE_V_3_3
+    bool
+    prompt "3.3"
+
+config CC_CORE_V_3_3_1
+    bool
+    prompt "3.3.1"
+
+config CC_CORE_V_3_3_2
+    bool
+    prompt "3.3.2"
+
+config CC_CORE_V_3_3_3
+    bool
+    prompt "3.3.3"
+
+config CC_CORE_V_3_3_4
+    bool
+    prompt "3.3.4"
+
+config CC_CORE_V_3_3_5
+    bool
+    prompt "3.3.5"
+
+config CC_CORE_V_3_3_6
+    bool
+    prompt "3.3.6"
+
+config CC_CORE_V_3_4_0
+    bool
+    prompt "3.4.0"
+
+config CC_CORE_V_3_4_1
+    bool
+    prompt "3.4.1"
+
+config CC_CORE_V_3_4_2
+    bool
+    prompt "3.4.2"
+
+config CC_CORE_V_3_4_3
+    bool
+    prompt "3.4.3"
+
+config CC_CORE_V_3_4_4
+    bool
+    prompt "3.4.4"
+
+config CC_CORE_V_3_4_5
+    bool
+    prompt "3.4.5"
+
+config CC_CORE_V_3_4_6
+    bool
+    prompt "3.4.6"
+
+config CC_CORE_V_4_0_0
+    bool
+    prompt "4.0.0"
+
+config CC_CORE_V_4_0_1
+    bool
+    prompt "4.0.1"
+
+config CC_CORE_V_4_0_2
+    bool
+    prompt "4.0.2"
+
+config CC_CORE_V_4_0_3
+    bool
+    prompt "4.0.3"
+
+config CC_CORE_V_4_0_4
+    bool
+    prompt "4.0.4"
+
+config CC_CORE_V_4_1_0
+    bool
+    prompt "4.1.0"
+
+config CC_CORE_V_4_1_1
+    bool
+    prompt "4.1.1"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config CC_CORE_VERSION
+    string
+    default "2.95.3" if CC_CORE_V_2_95_3
+    default "3.2.3" if CC_CORE_V_3_2_3
+    default "3.3" if CC_CORE_V_3_3
+    default "3.3.1" if CC_CORE_V_3_3_1
+    default "3.3.2" if CC_CORE_V_3_3_2
+    default "3.3.3" if CC_CORE_V_3_3_3
+    default "3.3.4" if CC_CORE_V_3_3_4
+    default "3.3.5" if CC_CORE_V_3_3_5
+    default "3.3.6" if CC_CORE_V_3_3_6
+    default "3.4.0" if CC_CORE_V_3_4_0
+    default "3.4.1" if CC_CORE_V_3_4_1
+    default "3.4.2" if CC_CORE_V_3_4_2
+    default "3.4.3" if CC_CORE_V_3_4_3
+    default "3.4.4" if CC_CORE_V_3_4_4
+    default "3.4.5" if CC_CORE_V_3_4_5
+    default "3.4.6" if CC_CORE_V_3_4_6
+    default "4.0.0" if CC_CORE_V_4_0_0
+    default "4.0.1" if CC_CORE_V_4_0_1
+    default "4.0.2" if CC_CORE_V_4_0_2
+    default "4.0.3" if CC_CORE_V_4_0_3
+    default "4.0.4" if CC_CORE_V_4_0_4
+    default "4.1.0" if CC_CORE_V_4_1_0
+    default "4.1.1" if CC_CORE_V_4_1_1
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
+
+config CC_CORE_EXTRA_CONFIG
+    string
+    prompt "Core gcc extra config"
+    default ""
+    depends on CC_USE_CORE && CC_CORE_GCC || ! CC_USE_CORE && CC_GCC
+    help
+      Extra flags to pass onto ./configure when configuring the core gcc.
diff --git a/config/cc_core_tcc.in b/config/cc_core_tcc.in
new file mode 100644
index 00000000..e69de29b
diff --git a/config/cc_gcc.in b/config/cc_gcc.in
new file mode 100644
index 00000000..3e64b7f6
--- /dev/null
+++ b/config/cc_gcc.in
@@ -0,0 +1,131 @@
+# Compiler options
+
+choice
+    bool
+    prompt "Final gcc version"
+
+config CC_V_2_95_3
+    bool
+    prompt "2.95.3"
+
+config CC_V_3_2_3
+    bool
+    prompt "3.2.3"
+
+config CC_V_3_3
+    bool
+    prompt "3.3"
+
+config CC_V_3_3_1
+    bool
+    prompt "3.3.1"
+
+config CC_V_3_3_2
+    bool
+    prompt "3.3.2"
+
+config CC_V_3_3_3
+    bool
+    prompt "3.3.3"
+
+config CC_V_3_3_4
+    bool
+    prompt "3.3.4"
+
+config CC_V_3_3_5
+    bool
+    prompt "3.3.5"
+
+config CC_V_3_3_6
+    bool
+    prompt "3.3.6"
+
+config CC_V_3_4_0
+    bool
+    prompt "3.4.0"
+
+config CC_V_3_4_1
+    bool
+    prompt "3.4.1"
+
+config CC_V_3_4_2
+    bool
+    prompt "3.4.2"
+
+config CC_V_3_4_3
+    bool
+    prompt "3.4.3"
+
+config CC_V_3_4_4
+    bool
+    prompt "3.4.4"
+
+config CC_V_3_4_5
+    bool
+    prompt "3.4.5"
+
+config CC_V_4_0_0
+    bool
+    prompt "4.0.0"
+
+config CC_V_4_0_1
+    bool
+    prompt "4.0.1"
+
+config CC_V_4_0_2
+    bool
+    prompt "4.0.2"
+
+config CC_V_4_0_3
+    bool
+    prompt "4.0.3"
+
+config CC_V_4_0_4
+    bool
+    prompt "4.0.4"
+
+config CC_V_4_1_0
+    bool
+    prompt "4.1.0"
+
+config CC_V_4_1_1
+    bool
+    prompt "4.1.1"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config CC_VERSION
+    string
+    default "2.95.3" if CC_V_2_95_3
+    default "3.2.3" if CC_V_3_2_3
+    default "3.3" if CC_V_3_3
+    default "3.3.1" if CC_V_3_3_1
+    default "3.3.2" if CC_V_3_3_2
+    default "3.3.3" if CC_V_3_3_3
+    default "3.3.4" if CC_V_3_3_4
+    default "3.3.5" if CC_V_3_3_5
+    default "3.3.6" if CC_V_3_3_6
+    default "3.4.0" if CC_V_3_4_0
+    default "3.4.1" if CC_V_3_4_1
+    default "3.4.2" if CC_V_3_4_2
+    default "3.4.3" if CC_V_3_4_3
+    default "3.4.4" if CC_V_3_4_4
+    default "3.4.5" if CC_V_3_4_5
+    default "4.0.0" if CC_V_4_0_0
+    default "4.0.1" if CC_V_4_0_1
+    default "4.0.2" if CC_V_4_0_2
+    default "4.0.3" if CC_V_4_0_3
+    default "4.0.4" if CC_V_4_0_4
+    default "4.1.0" if CC_V_4_1_0
+    default "4.1.1" if CC_V_4_1_1
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
+
+config CC_EXTRA_CONFIG
+    string
+    prompt "Final gcc extra config"
+    default ""
+    help
+      Extra flags to pass onto ./configure when configuring gcc.
diff --git a/config/cc_tcc.in b/config/cc_tcc.in
new file mode 100644
index 00000000..e69de29b
diff --git a/config/config.in b/config/config.in
new file mode 100644
index 00000000..76bc8ca8
--- /dev/null
+++ b/config/config.in
@@ -0,0 +1,6 @@
+source config/global.in
+source config/target.in
+source config/kernel.in
+source config/binutils.in
+source config/cc.in
+source config/libc.in
diff --git a/config/global.in b/config/global.in
new file mode 100644
index 00000000..e61b1329
--- /dev/null
+++ b/config/global.in
@@ -0,0 +1,256 @@
+# Overall toolchain configuration: paths, jobs, etc...
+
+menu "Paths and misc options"
+
+config PARALLEL_JOBS
+    int
+    prompt "Number of parallel jobs"
+    default 1
+    help
+      Number of jobs make will be allowed to run concurently.
+      Set this higher than the number of processors you have, but not too high.
+      A good rule of thumb is twice the number of processors you have.
+      
+      Enter 1 (or 0) to have only one job at a time.
+
+config LOAD
+    int
+    prompt "Maximum allowed load"
+    default 0
+    help
+      Specifies that no new jobs should be started if there are others jobs
+      running and the load average is at least this value.
+      
+      Makes sense on SMP machines only.
+      
+      Enter 0 to have no limit on the load average.
+      
+      Note: only the integer part of the load is allowed here (you can't enter
+            0.75 for example).
+
+config NICE
+    int
+    prompt "Nice level"
+    default 0
+    range 0 19
+    help
+      Renices the build process up.
+
+config USE_PIPES
+    bool
+    prompt "Use -pipe"
+    default y
+    help
+      Use gcc's option -pipe to use pipes rather than temp files when building
+      the toolchain.
+
+comment "Paths"
+
+config TARBALLS_DIR
+    string
+    prompt "Tarballs directory"
+    default "`pwd`/tarballs"
+    help
+      This is the directory into which tarballs are going to be stored once
+      they are downloaded (or otherwise retrieved).
+
+config SRC_DIR
+    string
+    prompt "Extract directory"
+    default "`pwd`/${CT_TARGET}/src"
+    help
+      This is the directory into which tarballs will be extracted.
+      
+      If you will build multiple toolchains, you should arrange to have one
+      SRC_DIR for each toolchain, as different targets may require different
+      patches to be applied.
+
+config BUILD_DIR
+    string
+    prompt "Build directory"
+    default "`pwd`/${CT_TARGET}/gcc-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+    help
+      This is the directory into which builds will occur.
+      
+      Once again, arrange for one build directory for each toolchain you build,
+      to avoid collision.
+
+config PREFIX_DIR
+    string
+    prompt "Prefix directory"
+    default "${HOME}/${CT_TARGET}"
+    help
+      This is the path the toolchain will run from.
+
+config INSTALL_DIR
+    string
+#    prompt "Install directory"
+    default "${CT_PREFIX_DIR}"
+#    help
+#      This is the path the target will be installed into.
+#      
+#      Normally, you would set this to ${CT_PREFIX_DIR}, but if for some reasons
+#      you can't write there, you can install somewhere else and have a third
+#      person do the install for you.
+#      The reason you might also want to install elsewhere is if you are going
+#      to package your shinny new toolchain for distribution.
+
+config CUSTOM_PATCH
+    bool
+    prompt "Use custom patch directory"
+    default n
+    help
+      If you have custom patches that you want to be applied, say 'Y' here and
+      enter the path directory below.
+      
+      Note that you must ensure that the patch directory is arranged the same
+      way the official directory is.
+
+config CUSTOM_PATCH_ONLY
+    bool
+    prompt "Only use custom patches"
+    default n
+    depends on CUSTOM_PATCH
+    help
+      Don't apply patches coming with CT-NG, only those patches available in
+      the directory below.
+      
+      If you say 'N' here, then the patches provided with CT-NG will be applied
+      first, and then your patches.
+
+config CUSTOM_PATCH_DIR
+    string
+    prompt "Custom patch directory"
+    default ""
+    depends on CUSTOM_PATCH
+    help
+      Enter the custom patch directory here.
+
+comment "Downloading and extracting"
+
+config NO_DOWNLOAD
+    bool
+    prompt "Avoid downloads"
+    default n
+    help
+      Avoid downloading anything. Bail out if a tarball is missing.
+
+config ONLY_DOWNLOAD
+    bool
+    prompt "Only download tarballs"
+    default n
+    depends on ! NO_DOWNLOAD
+    help
+      Only download the tarballs. Exit once it done.
+      
+      Usefull to pre-retrieve the tarballs before going off-line.
+
+config FORCE_DOWNLOAD
+    bool
+    prompt "Force downloads"
+    default n
+    depends on ! NO_DOWNLOAD
+    help
+      Force downloading tarballs, even if one already exists.
+      Usefull if you suspect a tarball to be damaged.
+
+config FORCE_EXTRACT
+    bool
+    prompt "Force extractions"
+    depends on ! ONLY_DOWNLOAD
+    default n
+    help
+      Force extraction of already exctracted tarballs.
+      
+      Usefull if you suspect a previous extract did not complete (eg. broken
+      tarball), or you added a new set of patches for this component.
+
+comment "Logging"
+
+choice
+    bool
+    prompt "Maximum log level to see:"
+    default LOG_INFO
+
+config LOG_ERROR
+    bool
+    prompt "ERROR"
+    help
+      The build will be silent.
+      Only if there is an error will you see a mesage.
+
+config LOG_WARN
+    bool
+    prompt "WARN"
+    help
+      The same as above, plus warnings.
+
+config LOG_INFO
+    bool
+    prompt "INFO"
+    help
+      The same as above, plus informational messages (main steps).
+
+config LOG_EXTRA
+    bool
+    prompt "EXTRA"
+    help
+      The same as above, plus extra messages (sub-steps).
+
+config LOG_DEBUG
+    bool
+    prompt "DEBUG"
+    help
+      The same as above, plus lots of debug information, of which each
+      component's build messages (very noisy!).
+
+endchoice
+
+config LOG_LEVEL_MAX
+    string
+    default "ERROR"   if LOG_ERROR
+    default "WARN"    if LOG_WARN
+    default "INFO"    if LOG_INFO
+    default "EXTRA"   if LOG_EXTRA
+    default "DEBUG"   if LOG_DEBUG
+
+config LOG_PROGRESS_BAR
+    bool
+    prompt "Progress bar"
+    default n
+    depends on ! LOG_DEBUG
+    help
+      This option will print a "rotating bar" (/-\|) below the last log line
+      to show work is not stalled.
+      
+      Available when not in DEBUG log level.
+
+config LOG_USE_COLORS
+    bool
+    prompt "Use colors for logging to console"
+    default n
+    help
+      Use colors to highlight important messages.
+      ERROR: bright red
+      WARN : bright yellow
+      INFO : bright green
+      EXTRA: dim green
+      DEBUG: dim white
+
+config LOG_TO_FILE
+    bool
+    prompt "Log to a file"
+    default y
+    help
+      Save *full* logs to a file. Even log levels you didn't specify above
+      will be available in this file.
+
+config LOG_FILE
+    string
+    prompt "Log file"
+    default "${CT_PREFIX_DIR}/${CT_TARGET}.log"
+    depends on LOG_TO_FILE
+    help
+      File name into which to put logs.
+
+endmenu
diff --git a/config/kernel.in b/config/kernel.in
new file mode 100644
index 00000000..414ab26d
--- /dev/null
+++ b/config/kernel.in
@@ -0,0 +1,36 @@
+# Kernel options
+
+menu "Kernel"
+
+choice
+    bool
+    prompt "\"Kernel\" to use:"
+    default KERNEL_LINUX
+
+config KERNEL_LINUX
+    bool
+    prompt "linux"
+    help
+      Build a toolchain targeting systems running Linux as a kernel.
+
+config KERNEL_CYGWIN
+    bool
+    prompt "cygwin"
+    depends on ARCH_x86 || ARCH_x86_64
+    help
+      Build a toolchain targeting systems running Windows/cygwin as a kernel.
+
+endchoice
+
+config KERNEL_VERSION
+    string
+
+if KERNEL_LINUX
+source config/kernel_linux.in
+endif
+
+if KERNEL_CYGWIN
+source config/kernel_cygwin.in
+endif
+
+endmenu
diff --git a/config/kernel_cygwin.in b/config/kernel_cygwin.in
new file mode 100644
index 00000000..1edac593
--- /dev/null
+++ b/config/kernel_cygwin.in
@@ -0,0 +1,5 @@
+# Cygwin 'kernel' options
+
+config KERNEL
+    string
+    default "cygwin"
diff --git a/config/kernel_linux.in b/config/kernel_linux.in
new file mode 100644
index 00000000..aa07cadc
--- /dev/null
+++ b/config/kernel_linux.in
@@ -0,0 +1,102 @@
+# Linux kernel options
+
+choice
+    bool
+    prompt "Get kernel headers from:"
+
+config KERNEL_LINUX_HEADERS_INSTALL
+    bool
+    prompt "kernel's 'headers_install'"
+    help
+      This will make use of the new headers_install rule in recent kernels.
+      This is most probably what you want to use.
+
+config KERNEL_LINUX_HEADERS_SANITISED
+    bool
+    prompt "Mazur's sanitized headers (OBSOLETE)"
+    help
+      M. Mazur used to maintain a tree of sanitised headers, but it is now
+      obsoleted by the headers_install rule (above), and has not seen eny
+      update since 2.6.12
+
+config KERNEL_LINUX_HEADERS_COPY
+    bool
+    prompt "pure kernel headers (NOT RECOMMENDED)"
+    help
+      This will simply copy the kernel headers to the toolchain.
+
+      You do NOT want this. It's badly broken because it leaks kernel internals
+      to userspace.
+
+endchoice
+
+config KERNEL
+    string
+    default "linux" if KERNEL_LINUX_HEADERS_INSTALL || KERNEL_LINUX_HEADERS_COPY
+    default "linux-libc-headers" if KERNEL_LINUX_HEADERS_SANITISED
+
+config KERNEL_VERSION_SEE_EXTRAVERSION
+    bool
+    prompt "See extra versions"
+    default n
+    depends on ! KERNEL_LINUX_HEADERS_SANITISED
+    help
+      See extra versions (kernel with 4 numbers, eg 2.6.19.1).
+
+      If you say 'no', you'll only see sub-level, 3-digit versions.
+      If you say 'yes', you'll see far more versions!
+
+      It is recommended that you say 'no', unless you _*know*_
+      that an extra version fixes a headers bug.
+
+if KERNEL_LINUX_HEADERS_INSTALL
+source config/kernel_linux_headers_install.in
+endif
+
+if KERNEL_LINUX_HEADERS_COPY
+source config/kernel_linux_headers_copy.in
+endif
+
+if KERNEL_LINUX_HEADERS_SANITISED
+source config/kernel_linux_headers_sanitised.in
+endif
+
+choice
+    bool
+    prompt "Kernel verbosity:"
+    default KERNEL_LINUX_VERBOSITY_0
+
+config KERNEL_LINUX_VERBOSITY_0
+    bool
+    prompt "Simplified"
+    help
+      Print simplified command lines.
+
+config KERNEL_LINUX_VERBOSITY_1
+    bool
+    prompt "Full commands"
+    help
+      Print full command lines.
+
+config KERNEL_LINUX_VERBOSITY_2
+    bool
+    prompt "Exec reasons"
+    help
+      Print the reasons why a make target is rebuild.
+
+endchoice
+
+config KERNEL_LINUX_VERBOSE_LEVEL
+    int
+    default 0 if KERNEL_LINUX_VERBOSITY_0
+    default 1 if KERNEL_LINUX_VERBOSITY_1
+    default 2 if KERNEL_LINUX_VERBOSITY_2
+
+config KERNEL_LINUX_CONFIG_FILE
+    string
+    prompt "Configuration file"
+    default ""
+    help
+      Path to the kernel configuration file.
+      
+      You _must_ provide one (for now).
diff --git a/config/kernel_linux_headers_copy.in b/config/kernel_linux_headers_copy.in
new file mode 100644
index 00000000..f18bed5b
--- /dev/null
+++ b/config/kernel_linux_headers_copy.in
@@ -0,0 +1,682 @@
+choice
+    bool
+    prompt "Linux kernel version"
+
+config KERNEL_COPY_V_2_6_0
+    bool
+    prompt "2.6.0"
+
+config KERNEL_COPY_V_2_6_1
+    bool
+    prompt "2.6.1"
+
+config KERNEL_COPY_V_2_6_2
+    bool
+    prompt "2.6.2"
+
+config KERNEL_COPY_V_2_6_3
+    bool
+    prompt "2.6.3"
+
+config KERNEL_COPY_V_2_6_4
+    bool
+    prompt "2.6.4"
+
+config KERNEL_COPY_V_2_6_5
+    bool
+    prompt "2.6.5"
+
+config KERNEL_COPY_V_2_6_6
+    bool
+    prompt "2.6.6"
+
+config KERNEL_COPY_V_2_6_7
+    bool
+    prompt "2.6.7"
+
+config KERNEL_COPY_V_2_6_8
+    bool
+    prompt "2.6.8"
+
+config KERNEL_COPY_V_2_6_8_1
+    bool
+    prompt "2.6.8.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_9
+    bool
+    prompt "2.6.9"
+
+config KERNEL_COPY_V_2_6_10
+    bool
+    prompt "2.6.10"
+
+config KERNEL_COPY_V_2_6_11
+    bool
+    prompt "2.6.11"
+
+config KERNEL_COPY_V_2_6_11_1
+    bool
+    prompt "2.6.11.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_10
+    bool
+    prompt "2.6.11.10"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_11
+    bool
+    prompt "2.6.11.11"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_12
+    bool
+    prompt "2.6.11.12"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_2
+    bool
+    prompt "2.6.11.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_3
+    bool
+    prompt "2.6.11.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_4
+    bool
+    prompt "2.6.11.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_5
+    bool
+    prompt "2.6.11.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_6
+    bool
+    prompt "2.6.11.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_7
+    bool
+    prompt "2.6.11.7"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_8
+    bool
+    prompt "2.6.11.8"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_11_9
+    bool
+    prompt "2.6.11.9"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12
+    bool
+    prompt "2.6.12"
+
+config KERNEL_COPY_V_2_6_12_1
+    bool
+    prompt "2.6.12.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12_2
+    bool
+    prompt "2.6.12.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12_3
+    bool
+    prompt "2.6.12.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12_4
+    bool
+    prompt "2.6.12.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12_5
+    bool
+    prompt "2.6.12.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_12_6
+    bool
+    prompt "2.6.12.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_13
+    bool
+    prompt "2.6.13"
+
+config KERNEL_COPY_V_2_6_13_1
+    bool
+    prompt "2.6.13.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_13_2
+    bool
+    prompt "2.6.13.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_13_3
+    bool
+    prompt "2.6.13.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_13_4
+    bool
+    prompt "2.6.13.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_13_5
+    bool
+    prompt "2.6.13.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14
+    bool
+    prompt "2.6.14"
+
+config KERNEL_COPY_V_2_6_14_1
+    bool
+    prompt "2.6.14.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_2
+    bool
+    prompt "2.6.14.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_3
+    bool
+    prompt "2.6.14.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_4
+    bool
+    prompt "2.6.14.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_5
+    bool
+    prompt "2.6.14.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_6
+    bool
+    prompt "2.6.14.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_14_7
+    bool
+    prompt "2.6.14.7"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15
+    bool
+    prompt "2.6.15"
+
+config KERNEL_COPY_V_2_6_15_1
+    bool
+    prompt "2.6.15.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_2
+    bool
+    prompt "2.6.15.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_3
+    bool
+    prompt "2.6.15.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_4
+    bool
+    prompt "2.6.15.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_5
+    bool
+    prompt "2.6.15.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_6
+    bool
+    prompt "2.6.15.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_15_7
+    bool
+    prompt "2.6.15.7"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16
+    bool
+    prompt "2.6.16"
+
+config KERNEL_COPY_V_2_6_16_1
+    bool
+    prompt "2.6.16.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_10
+    bool
+    prompt "2.6.16.10"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_11
+    bool
+    prompt "2.6.16.11"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_12
+    bool
+    prompt "2.6.16.12"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_13
+    bool
+    prompt "2.6.16.13"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_14
+    bool
+    prompt "2.6.16.14"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_15
+    bool
+    prompt "2.6.16.15"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_16
+    bool
+    prompt "2.6.16.16"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_17
+    bool
+    prompt "2.6.16.17"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_18
+    bool
+    prompt "2.6.16.18"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_19
+    bool
+    prompt "2.6.16.19"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_2
+    bool
+    prompt "2.6.16.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_20
+    bool
+    prompt "2.6.16.20"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_21
+    bool
+    prompt "2.6.16.21"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_22
+    bool
+    prompt "2.6.16.22"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_23
+    bool
+    prompt "2.6.16.23"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_24
+    bool
+    prompt "2.6.16.24"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_25
+    bool
+    prompt "2.6.16.25"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_26
+    bool
+    prompt "2.6.16.26"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_27
+    bool
+    prompt "2.6.16.27"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_28
+    bool
+    prompt "2.6.16.28"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_29
+    bool
+    prompt "2.6.16.29"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_3
+    bool
+    prompt "2.6.16.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_30
+    bool
+    prompt "2.6.16.30"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_31
+    bool
+    prompt "2.6.16.31"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_32
+    bool
+    prompt "2.6.16.32"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_33
+    bool
+    prompt "2.6.16.33"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_34
+    bool
+    prompt "2.6.16.34"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_35
+    bool
+    prompt "2.6.16.35"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_36
+    bool
+    prompt "2.6.16.36"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_4
+    bool
+    prompt "2.6.16.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_5
+    bool
+    prompt "2.6.16.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_6
+    bool
+    prompt "2.6.16.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_7
+    bool
+    prompt "2.6.16.7"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_8
+    bool
+    prompt "2.6.16.8"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_16_9
+    bool
+    prompt "2.6.16.9"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17
+    bool
+    prompt "2.6.17"
+
+config KERNEL_COPY_V_2_6_17_1
+    bool
+    prompt "2.6.17.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_10
+    bool
+    prompt "2.6.17.10"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_11
+    bool
+    prompt "2.6.17.11"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_12
+    bool
+    prompt "2.6.17.12"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_13
+    bool
+    prompt "2.6.17.13"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_14
+    bool
+    prompt "2.6.17.14"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_2
+    bool
+    prompt "2.6.17.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_3
+    bool
+    prompt "2.6.17.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_4
+    bool
+    prompt "2.6.17.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_5
+    bool
+    prompt "2.6.17.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_6
+    bool
+    prompt "2.6.17.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_7
+    bool
+    prompt "2.6.17.7"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_8
+    bool
+    prompt "2.6.17.8"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_17_9
+    bool
+    prompt "2.6.17.9"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18
+    bool
+    prompt "2.6.18"
+
+config KERNEL_COPY_V_2_6_18_1
+    bool
+    prompt "2.6.18.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18_2
+    bool
+    prompt "2.6.18.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18_3
+    bool
+    prompt "2.6.18.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18_4
+    bool
+    prompt "2.6.18.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18_5
+    bool
+    prompt "2.6.18.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_18_6
+    bool
+    prompt "2.6.18.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_COPY_V_2_6_19
+    bool
+    prompt "2.6.19"
+
+config KERNEL_COPY_V_2_6_19_1
+    bool
+    prompt "2.6.19.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config KERNEL_VERSION
+    string
+    default "2.6.0" if KERNEL_COPY_V_2_6_0
+    default "2.6.1" if KERNEL_COPY_V_2_6_1
+    default "2.6.2" if KERNEL_COPY_V_2_6_2
+    default "2.6.3" if KERNEL_COPY_V_2_6_3
+    default "2.6.4" if KERNEL_COPY_V_2_6_4
+    default "2.6.5" if KERNEL_COPY_V_2_6_5
+    default "2.6.6" if KERNEL_COPY_V_2_6_6
+    default "2.6.7" if KERNEL_COPY_V_2_6_7
+    default "2.6.8" if KERNEL_COPY_V_2_6_8
+    default "2.6.8.1" if KERNEL_COPY_V_2_6_8_1
+    default "2.6.9" if KERNEL_COPY_V_2_6_9
+    default "2.6.10" if KERNEL_COPY_V_2_6_10
+    default "2.6.11" if KERNEL_COPY_V_2_6_11
+    default "2.6.11.1" if KERNEL_COPY_V_2_6_11_1
+    default "2.6.11.10" if KERNEL_COPY_V_2_6_11_10
+    default "2.6.11.11" if KERNEL_COPY_V_2_6_11_11
+    default "2.6.11.12" if KERNEL_COPY_V_2_6_11_12
+    default "2.6.11.2" if KERNEL_COPY_V_2_6_11_2
+    default "2.6.11.3" if KERNEL_COPY_V_2_6_11_3
+    default "2.6.11.4" if KERNEL_COPY_V_2_6_11_4
+    default "2.6.11.5" if KERNEL_COPY_V_2_6_11_5
+    default "2.6.11.6" if KERNEL_COPY_V_2_6_11_6
+    default "2.6.11.7" if KERNEL_COPY_V_2_6_11_7
+    default "2.6.11.8" if KERNEL_COPY_V_2_6_11_8
+    default "2.6.11.9" if KERNEL_COPY_V_2_6_11_9
+    default "2.6.12" if KERNEL_COPY_V_2_6_12
+    default "2.6.12.1" if KERNEL_COPY_V_2_6_12_1
+    default "2.6.12.2" if KERNEL_COPY_V_2_6_12_2
+    default "2.6.12.3" if KERNEL_COPY_V_2_6_12_3
+    default "2.6.12.4" if KERNEL_COPY_V_2_6_12_4
+    default "2.6.12.5" if KERNEL_COPY_V_2_6_12_5
+    default "2.6.12.6" if KERNEL_COPY_V_2_6_12_6
+    default "2.6.13" if KERNEL_COPY_V_2_6_13
+    default "2.6.13.1" if KERNEL_COPY_V_2_6_13_1
+    default "2.6.13.2" if KERNEL_COPY_V_2_6_13_2
+    default "2.6.13.3" if KERNEL_COPY_V_2_6_13_3
+    default "2.6.13.4" if KERNEL_COPY_V_2_6_13_4
+    default "2.6.13.5" if KERNEL_COPY_V_2_6_13_5
+    default "2.6.14" if KERNEL_COPY_V_2_6_14
+    default "2.6.14.1" if KERNEL_COPY_V_2_6_14_1
+    default "2.6.14.2" if KERNEL_COPY_V_2_6_14_2
+    default "2.6.14.3" if KERNEL_COPY_V_2_6_14_3
+    default "2.6.14.4" if KERNEL_COPY_V_2_6_14_4
+    default "2.6.14.5" if KERNEL_COPY_V_2_6_14_5
+    default "2.6.14.6" if KERNEL_COPY_V_2_6_14_6
+    default "2.6.14.7" if KERNEL_COPY_V_2_6_14_7
+    default "2.6.15" if KERNEL_COPY_V_2_6_15
+    default "2.6.15.1" if KERNEL_COPY_V_2_6_15_1
+    default "2.6.15.2" if KERNEL_COPY_V_2_6_15_2
+    default "2.6.15.3" if KERNEL_COPY_V_2_6_15_3
+    default "2.6.15.4" if KERNEL_COPY_V_2_6_15_4
+    default "2.6.15.5" if KERNEL_COPY_V_2_6_15_5
+    default "2.6.15.6" if KERNEL_COPY_V_2_6_15_6
+    default "2.6.15.7" if KERNEL_COPY_V_2_6_15_7
+    default "2.6.16" if KERNEL_COPY_V_2_6_16
+    default "2.6.16.1" if KERNEL_COPY_V_2_6_16_1
+    default "2.6.16.10" if KERNEL_COPY_V_2_6_16_10
+    default "2.6.16.11" if KERNEL_COPY_V_2_6_16_11
+    default "2.6.16.12" if KERNEL_COPY_V_2_6_16_12
+    default "2.6.16.13" if KERNEL_COPY_V_2_6_16_13
+    default "2.6.16.14" if KERNEL_COPY_V_2_6_16_14
+    default "2.6.16.15" if KERNEL_COPY_V_2_6_16_15
+    default "2.6.16.16" if KERNEL_COPY_V_2_6_16_16
+    default "2.6.16.17" if KERNEL_COPY_V_2_6_16_17
+    default "2.6.16.18" if KERNEL_COPY_V_2_6_16_18
+    default "2.6.16.19" if KERNEL_COPY_V_2_6_16_19
+    default "2.6.16.2" if KERNEL_COPY_V_2_6_16_2
+    default "2.6.16.20" if KERNEL_COPY_V_2_6_16_20
+    default "2.6.16.21" if KERNEL_COPY_V_2_6_16_21
+    default "2.6.16.22" if KERNEL_COPY_V_2_6_16_22
+    default "2.6.16.23" if KERNEL_COPY_V_2_6_16_23
+    default "2.6.16.24" if KERNEL_COPY_V_2_6_16_24
+    default "2.6.16.25" if KERNEL_COPY_V_2_6_16_25
+    default "2.6.16.26" if KERNEL_COPY_V_2_6_16_26
+    default "2.6.16.27" if KERNEL_COPY_V_2_6_16_27
+    default "2.6.16.28" if KERNEL_COPY_V_2_6_16_28
+    default "2.6.16.29" if KERNEL_COPY_V_2_6_16_29
+    default "2.6.16.3" if KERNEL_COPY_V_2_6_16_3
+    default "2.6.16.30" if KERNEL_COPY_V_2_6_16_30
+    default "2.6.16.31" if KERNEL_COPY_V_2_6_16_31
+    default "2.6.16.32" if KERNEL_COPY_V_2_6_16_32
+    default "2.6.16.33" if KERNEL_COPY_V_2_6_16_33
+    default "2.6.16.34" if KERNEL_COPY_V_2_6_16_34
+    default "2.6.16.35" if KERNEL_COPY_V_2_6_16_35
+    default "2.6.16.36" if KERNEL_COPY_V_2_6_16_36
+    default "2.6.16.4" if KERNEL_COPY_V_2_6_16_4
+    default "2.6.16.5" if KERNEL_COPY_V_2_6_16_5
+    default "2.6.16.6" if KERNEL_COPY_V_2_6_16_6
+    default "2.6.16.7" if KERNEL_COPY_V_2_6_16_7
+    default "2.6.16.8" if KERNEL_COPY_V_2_6_16_8
+    default "2.6.16.9" if KERNEL_COPY_V_2_6_16_9
+    default "2.6.17" if KERNEL_COPY_V_2_6_17
+    default "2.6.17.1" if KERNEL_COPY_V_2_6_17_1
+    default "2.6.17.10" if KERNEL_COPY_V_2_6_17_10
+    default "2.6.17.11" if KERNEL_COPY_V_2_6_17_11
+    default "2.6.17.12" if KERNEL_COPY_V_2_6_17_12
+    default "2.6.17.13" if KERNEL_COPY_V_2_6_17_13
+    default "2.6.17.14" if KERNEL_COPY_V_2_6_17_14
+    default "2.6.17.2" if KERNEL_COPY_V_2_6_17_2
+    default "2.6.17.3" if KERNEL_COPY_V_2_6_17_3
+    default "2.6.17.4" if KERNEL_COPY_V_2_6_17_4
+    default "2.6.17.5" if KERNEL_COPY_V_2_6_17_5
+    default "2.6.17.6" if KERNEL_COPY_V_2_6_17_6
+    default "2.6.17.7" if KERNEL_COPY_V_2_6_17_7
+    default "2.6.17.8" if KERNEL_COPY_V_2_6_17_8
+    default "2.6.17.9" if KERNEL_COPY_V_2_6_17_9
+    default "2.6.18" if KERNEL_COPY_V_2_6_18
+    default "2.6.18.1" if KERNEL_COPY_V_2_6_18_1
+    default "2.6.18.2" if KERNEL_COPY_V_2_6_18_2
+    default "2.6.18.3" if KERNEL_COPY_V_2_6_18_3
+    default "2.6.18.4" if KERNEL_COPY_V_2_6_18_4
+    default "2.6.18.5" if KERNEL_COPY_V_2_6_18_5
+    default "2.6.18.6" if KERNEL_COPY_V_2_6_18_6
+    default "2.6.19" if KERNEL_COPY_V_2_6_19
+    default "2.6.19.1" if KERNEL_COPY_V_2_6_19_1
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
diff --git a/config/kernel_linux_headers_install.in b/config/kernel_linux_headers_install.in
new file mode 100644
index 00000000..f89957bf
--- /dev/null
+++ b/config/kernel_linux_headers_install.in
@@ -0,0 +1,75 @@
+choice
+    bool
+    prompt "Linux kernel version"
+
+config KERNEL_INSTALL_V_2_6_18
+    bool
+    prompt "2.6.18"
+
+config KERNEL_INSTALL_V_2_6_18_1
+    bool
+    prompt "2.6.18.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_18_2
+    bool
+    prompt "2.6.18.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_18_3
+    bool
+    prompt "2.6.18.3"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_18_4
+    bool
+    prompt "2.6.18.4"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_18_5
+    bool
+    prompt "2.6.18.5"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_18_6
+    bool
+    prompt "2.6.18.6"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_19
+    bool
+    prompt "2.6.19"
+
+config KERNEL_INSTALL_V_2_6_19_1
+    bool
+    prompt "2.6.19.1"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_19_2
+    bool
+    prompt "2.6.19.2"
+    depends on KERNEL_VERSION_SEE_EXTRAVERSION
+
+config KERNEL_INSTALL_V_2_6_20
+    bool
+    prompt "2.6.20"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config KERNEL_VERSION
+    string
+    default "2.6.18" if KERNEL_INSTALL_V_2_6_18
+    default "2.6.18.1" if KERNEL_INSTALL_V_2_6_18_1
+    default "2.6.18.2" if KERNEL_INSTALL_V_2_6_18_2
+    default "2.6.18.3" if KERNEL_INSTALL_V_2_6_18_3
+    default "2.6.18.4" if KERNEL_INSTALL_V_2_6_18_4
+    default "2.6.18.5" if KERNEL_INSTALL_V_2_6_18_5
+    default "2.6.18.6" if KERNEL_INSTALL_V_2_6_18_6
+    default "2.6.19" if KERNEL_INSTALL_V_2_6_19
+    default "2.6.19.1" if KERNEL_INSTALL_V_2_6_19_1
+    default "2.6.19.2" if KERNEL_INSTALL_V_2_6_19_2
+    default "2.6.20" if KERNEL_INSTALL_V_2_6_20
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
diff --git a/config/kernel_linux_headers_sanitised.in b/config/kernel_linux_headers_sanitised.in
new file mode 100644
index 00000000..820df6ed
--- /dev/null
+++ b/config/kernel_linux_headers_sanitised.in
@@ -0,0 +1,62 @@
+choice
+    bool
+    prompt "Linux headers version"
+
+config KERNEL_SANITISED_V_2_6_7_0
+    bool
+    prompt "2.6.7.0"
+
+config KERNEL_SANITISED_V_2_6_8_0
+    bool
+    prompt "2.6.8.0"
+
+config KERNEL_SANITISED_V_2_6_8_1
+    bool
+    prompt "2.6.8.1"
+
+config KERNEL_SANITISED_V_2_6_9_0
+    bool
+    prompt "2.6.9.0"
+
+config KERNEL_SANITISED_V_2_6_9_1
+    bool
+    prompt "2.6.9.1"
+
+config KERNEL_SANITISED_V_2_6_10_0
+    bool
+    prompt "2.6.10.0"
+
+config KERNEL_SANITISED_V_2_6_11_0
+    bool
+    prompt "2.6.11.0"
+
+config KERNEL_SANITISED_V_2_6_11_1
+    bool
+    prompt "2.6.11.1"
+
+config KERNEL_SANITISED_V_2_6_11_2
+    bool
+    prompt "2.6.11.2"
+
+config KERNEL_SANITISED_V_2_6_12_0
+    bool
+    prompt "2.6.12.0"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config KERNEL_VERSION
+    string
+    default "2.6.7.0" if KERNEL_SANITISED_V_2_6_7_0
+    default "2.6.8.0" if KERNEL_SANITISED_V_2_6_8_0
+    default "2.6.8.1" if KERNEL_SANITISED_V_2_6_8_1
+    default "2.6.9.0" if KERNEL_SANITISED_V_2_6_9_0
+    default "2.6.9.1" if KERNEL_SANITISED_V_2_6_9_1
+    default "2.6.10.0" if KERNEL_SANITISED_V_2_6_10_0
+    default "2.6.11.0" if KERNEL_SANITISED_V_2_6_11_0
+    default "2.6.11.1" if KERNEL_SANITISED_V_2_6_11_1
+    default "2.6.11.2" if KERNEL_SANITISED_V_2_6_11_2
+    default "2.6.12.0" if KERNEL_SANITISED_V_2_6_12_0
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
diff --git a/config/libc.in b/config/libc.in
new file mode 100644
index 00000000..ba6a1bee
--- /dev/null
+++ b/config/libc.in
@@ -0,0 +1,36 @@
+# C library options
+
+menu "C-library"
+
+choice
+    bool
+    prompt "C-library to use:"
+    default LIBC_GLIBC
+
+config LIBC_GLIBC
+    bool
+    prompt "glibc"
+
+config LIBC_UCLIBC
+    bool
+    prompt "uClibc"
+
+endchoice
+
+config LIBC_VERSION
+    string
+
+config LIBC
+    string
+    default "glibc" if LIBC_GLIBC
+    default "uClibc" if LIBC_UCLIBC
+
+if LIBC_GLIBC
+source config/libc_glibc.in
+endif
+
+if LIBC_UCLIBC
+source config/libc_uClibc.in
+endif
+
+endmenu
diff --git a/config/libc_glibc.in b/config/libc_glibc.in
new file mode 100644
index 00000000..867e0a0c
--- /dev/null
+++ b/config/libc_glibc.in
@@ -0,0 +1,199 @@
+# glibc options
+
+choice
+    bool
+    prompt "glibc version"
+
+config LIBC_V_1_09_1
+    bool
+    prompt "1.09.1"
+
+config LIBC_V_2_0_1
+    bool
+    prompt "2.0.1"
+
+config LIBC_V_2_0_6
+    bool
+    prompt "2.0.6"
+
+config LIBC_V_2_1_1
+    bool
+    prompt "2.1.1"
+
+config LIBC_V_2_1_2
+    bool
+    prompt "2.1.2"
+
+config LIBC_V_2_1_3
+    bool
+    prompt "2.1.3"
+
+config LIBC_V_2_2
+    bool
+    prompt "2.2"
+
+config LIBC_V_2_2_1
+    bool
+    prompt "2.2.1"
+
+config LIBC_V_2_2_2
+    bool
+    prompt "2.2.2"
+
+config LIBC_V_2_2_3
+    bool
+    prompt "2.2.3"
+
+config LIBC_V_2_2_4
+    bool
+    prompt "2.2.4"
+
+config LIBC_V_2_2_5
+    bool
+    prompt "2.2.5"
+
+config LIBC_V_2_3
+    bool
+    prompt "2.3"
+
+config LIBC_V_2_3_1
+    bool
+    prompt "2.3.1"
+
+config LIBC_V_2_3_2
+    bool
+    prompt "2.3.2"
+
+config LIBC_V_2_3_3
+    bool
+    prompt "2.3.3"
+
+config LIBC_V_2_3_4
+    bool
+    prompt "2.3.4"
+
+config LIBC_V_2_3_5
+    bool
+    prompt "2.3.5"
+
+config LIBC_V_2_3_6
+    bool
+    prompt "2.3.6"
+
+config LIBC_V_2_4
+    bool
+    prompt "2.4"
+
+config LIBC_V_2_5
+    bool
+    prompt "2.5"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove qbove line!
+endchoice
+
+config LIBC_VERSION
+    string
+    default "1.09.1" if LIBC_V_1_09_1
+    default "2.0.1" if LIBC_V_2_0_1
+    default "2.0.6" if LIBC_V_2_0_6
+    default "2.1.1" if LIBC_V_2_1_1
+    default "2.1.2" if LIBC_V_2_1_2
+    default "2.1.3" if LIBC_V_2_1_3
+    default "2.2" if LIBC_V_2_2
+    default "2.2.1" if LIBC_V_2_2_1
+    default "2.2.2" if LIBC_V_2_2_2
+    default "2.2.3" if LIBC_V_2_2_3
+    default "2.2.4" if LIBC_V_2_2_4
+    default "2.2.5" if LIBC_V_2_2_5
+    default "2.3" if LIBC_V_2_3
+    default "2.3.1" if LIBC_V_2_3_1
+    default "2.3.2" if LIBC_V_2_3_2
+    default "2.3.3" if LIBC_V_2_3_3
+    default "2.3.4" if LIBC_V_2_3_4
+    default "2.3.5" if LIBC_V_2_3_5
+    default "2.3.6" if LIBC_V_2_3_6
+    default "2.4" if LIBC_V_2_4
+    default "2.5" if LIBC_V_2_5
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove above line!
+
+choice
+    bool
+    prompt "Threading implentation to use:"
+    default LIBC_GLIBC_THREADS_LINUXTHREADS
+
+config LIBC_GLIBC_THREADS_NPTL
+    bool
+    prompt "nptl (not implemented)"
+
+config LIBC_GLIBC_THREADS_LINUXTHREADS
+    bool
+    prompt "linuxthreads"
+
+config LIBC_GLIBC_THREADS_NONE
+    bool
+    prompt "none"
+
+endchoice
+
+config LIBC_GLIBC_EXTRA_CONFIG
+    string
+    prompt "glibc extra config"
+    default ""
+    help
+      Extra flags to pass onto ./configure when configuring glibc.
+
+      Eg.: --enable-static-nss
+
+config LIBC_GLIBC_EXTRA_CFLAGS
+    string
+    prompt "glibc extra target CFLAGS"
+    default ""
+    help
+      Extra target CFLAGS to use when building glibc.
+
+config LIBC_EXTRA_CC_ARGS
+    string
+    prompt "gcc extra flags"
+    default ""
+    help
+      Extra flags to pass gcc when building glibc.
+
+      Seldom used, except for sparc64 which seems to need the flag -64
+      to be passed onto gcc.
+
+# Please note: This is not used for now (no sh support).
+config LIBC_GLIBC_CONFIGPARMS
+    string
+    prompt "Extra config params (READ HELP)"
+    default "" if ARCH != "sh3" && ARCH != "sh4"
+    default "no-z-defs=yes" if ARCH = "sh3" || ARCH = "sh4"
+    help
+      Some architectures need to set options in the file configparms.
+      This is the case for sh3/4, which really need to set configparms as of
+      gcc-3.4/glibc-2.3.2.
+
+      Unless you are building a toolchain for sh3/4, you should leave that empty.
+
+      Note: this is awkward, doesn't work well if you need more than one
+            line in configparms
+
+config LIBC_ADDONS
+    bool
+    prompt "Pass extra addons list"
+    default n
+    help
+      If you say Y here, you'll be able to give the list of addons you want to
+      include in your C library.
+
+config LIBC_ADDONS_LIST
+    string
+    prompt "Extra addons"
+    default ""
+    help
+      Extra addons to include in glibc.
+      
+      Eg.: crypt        (for very old glibces)
+           ports        (for the ports addon, with other architectures)
+           linuxthreads (for the linuxthreads implementation of threads)
diff --git a/config/libc_uClibc.in b/config/libc_uClibc.in
new file mode 100644
index 00000000..f6939125
--- /dev/null
+++ b/config/libc_uClibc.in
@@ -0,0 +1,92 @@
+# uClibc options
+
+choice
+    bool
+    prompt "uClibc version"
+
+config LIBC_V_snapshot
+    bool
+    prompt "latest snapshot"
+
+config LIBC_V_specific_date
+    bool
+    prompt "<specific date>"
+
+config LIBC_V_0_9_26
+    bool
+    prompt "0.9.26"
+
+config LIBC_V_0_9_27
+    bool
+    prompt "0.9.27"
+
+config LIBC_V_0_9_28
+    bool
+    prompt "0.9.28"
+
+config LIBC_V_0_9_28_1
+    bool
+    prompt "0.9.28.1"
+
+config LIBC_V_0_9_28_2
+    bool
+    prompt "0.9.28.2"
+
+# CT_INSERT_VERSION_ABOVE
+# Don't remove above line!
+endchoice
+
+config LIBC_VERSION
+    string
+    prompt "Enter date (YYYYMMDD)" if LIBC_V_specific_date
+    default "snapshot" if LIBC_V_snapshot
+    default "0.9.26" if LIBC_V_0_9_26
+    default "0.9.27" if LIBC_V_0_9_27
+    default "0.9.28" if LIBC_V_0_9_28
+    default "0.9.28.1" if LIBC_V_0_9_28_1
+    default "0.9.28.2" if LIBC_V_0_9_28_2
+# CT_INSERT_VERSION_STRING_ABOVE
+# Don't remove qbove line!
+
+choice
+    bool
+    prompt "Debug level"
+    default LIBC_UCLIBC_DEBUG_LEVEL_0
+
+config LIBC_UCLIBC_DEBUG_LEVEL_0
+    bool
+    prompt "none"
+
+config LIBC_UCLIBC_DEBUG_LEVEL_1
+    bool
+    prompt "minimal"
+
+config LIBC_UCLIBC_DEBUG_LEVEL_2
+    bool
+    prompt "all"
+
+endchoice
+
+config LIBC_UCLIBC_DEBUG_LEVEL
+    int
+    default 0 if LIBC_UCLIBC_DEBUG_LEVEL_0
+    default 1 if LIBC_UCLIBC_DEBUG_LEVEL_1
+    default 2 if LIBC_UCLIBC_DEBUG_LEVEL_2
+
+config LIBC_UCLIBC_CONFIG_FILE
+    string
+    prompt "Configuration file"
+    default ""
+    help
+      Path to the configuration file.
+      
+      You _must_ provide one (for now).
+
+config LIBC_UCLIBC_LOCALES
+    bool
+    prompt "Add support for locales"
+    default n
+    help
+      Say y if you want uClibc to support localisation.
+
+      Note that seems to be broken on recent uClibc releases.
diff --git a/config/target.in b/config/target.in
new file mode 100644
index 00000000..42a7a3a4
--- /dev/null
+++ b/config/target.in
@@ -0,0 +1,300 @@
+# Target definition: architecture, optimisations, etc...
+
+menu "Target options"
+
+comment "General target options"
+
+choice
+    bool
+    prompt "Target architecture:"
+    default ARCH_x86
+
+config ARCH_ARM
+    bool
+    prompt "arm"
+
+config ARCH_MIPS
+    bool
+    prompt "mips"
+
+config ARCH_x86
+    bool
+    prompt "x86"
+
+config ARCH_x86_64
+    bool
+    prompt "x86_64"
+
+endchoice
+
+choice
+    bool
+    prompt "Endianness:"
+
+config ARCH_BE
+    bool
+    prompt "Big endian"
+
+config ARCH_LE
+    bool
+    prompt "Little endian"
+
+endchoice
+
+comment "Target optimisations"
+
+config ARCH_CPU
+    string
+    prompt "Emit assembly for CPU"
+    default ""
+    help
+      This specifies the name of the target ARM processor. GCC uses this name
+      to determine what kind of instructions it can emit when generating
+      assembly code.
+      
+      Pick a value from the gcc manual for your choosen gcc version and your
+      target CPU.
+      
+      Leave blank if you don't know, or if your target architecture does not
+      offer this option.
+
+config ARCH_TUNE
+    string
+    prompt "Tune for CPU"
+    default ""
+    help
+      This option is very similar to the ARCH_CPU option (above), except
+      that instead of specifying the actual target processor type, and hence
+      restricting which instructions can be used, it specifies that GCC should
+      tune the performance of the code as if the target were of the type
+      specified in this option, but still choosing the instructions that it
+      will generate based on the cpu specified by the ARCH_CPU option
+      (above), or a (command-line) -mcpu= option.
+      
+      Pick a value from the gcc manual for your choosen gcc version and your
+      target CPU.
+      
+      Leave blank if you don't know, or if your target architecture does not
+      offer this option.
+
+config ARCH_ARCH
+    string
+    prompt "Achitecture level"
+    default ""
+    help
+      GCC uses this name to determine what kind of instructions it can emit
+      when generating assembly code. This option can be used in conjunction
+      with or instead of the ARCH_CPU option (above), or a (command-line)
+      -mcpu= option.
+      
+      Pick a value from the gcc manual for your choosen gcc version and your
+      target CPU.
+      
+      Leave blank if you don't know, or if your target architecture does not
+      offer this option.
+
+config ARCH_FPU
+    string
+    prompt "Use FPU"
+    default ""
+    help
+      On some targets (eg. ARM), you can specify the kind of FPU to emit
+      code for.
+      
+      See below wether to actually emit FP opcodes, or to emulate them.
+      
+      Pick a value from the gcc manual for your choosen gcc version and your
+      target CPU.
+      
+      Leave blank if you don't know, or if your target architecture does not
+      offer this option.
+
+choice
+    bool
+    prompt "Floating point:"
+
+config ARCH_FLOAT_HW
+    bool
+    prompt "hardware (FPU)"
+    help
+      Emit hardware floating point opcodes.
+      
+      If you've got a processor with a FPU, then you want that.
+      If your hardware has no FPU, you still can use HW floating point, but
+      need to compile support for FPU emulation in your kernel. Needless to
+      say that emulating the FPU is /slooowwwww/...
+      
+      One situation you'd want HW floating point without a FPU is if you get
+      binary blobs from different vendors that are compiling this way and
+      can't (don't wan't to) change.
+
+config ARCH_FLOAT_SW
+    bool
+    prompt "software"
+    help
+      Do not emit any hardware floating point opcode.
+      
+      If your processor has no FPU, then you most probably want this, as it
+      is faster than emulating the FPU in the kernel.
+
+endchoice
+
+config ARCH_FLOAT_SW_LIBFLOAT
+    bool
+    prompt "Use libfloat"
+    default n
+    depends on ARCH_FLOAT_SW
+    help
+      For those targets upporting it, you can use libfloat for the software
+      floating point emulation.
+      
+      Note that some versions of gcc have support code that supersedes libfloat,
+      while others don't. Known version of gcc that don't have support code are
+      versions prior to 3.0, and version above 4.0.
+      
+      You should check gcc before deciding to use libfloat.
+
+config TARGET_CFLAGS
+    string
+    prompt "Default target CFLAGS"
+    default ""
+    help
+      Used to add specific options when compiling libraries of the toolchain,
+      that will run on the target (eg. libc.so).
+      
+      Note that the options above for CPU, tune, arch and FPU will be
+      automaticaly used. You don't need to specify them here.
+      
+      Leave blank if you don't know better.
+
+comment "Toolchain options"
+
+config USE_SYSROOT
+    bool
+    prompt "Use sysroot'ed toolchain"
+    default y
+    help
+      Use the 'shinny new' sysroot feature of gcc: libraries split between
+      prefix/target/sys-root/lib and prefix/target/sys-root/usr/lib
+      
+      You definitely want to say 'Y' here. Yes you do. I know you do. Say 'Y'.
+
+config SHARED_LIBS
+    bool
+    prompt "Build shared libraries"
+    default y
+    help
+      Say 'y' here, unless you don't want shared libraries.
+      
+      You might not want shared librries if you're building for a target that
+      don't support it (maybe some nommu targets, for example, or bare metal).
+
+config TARGET_MULTILIB
+    bool
+#    prompt "Enable 'multilib' support (EXPERIMENTAL)"
+    default n
+    help
+      Enable the so-called 'multilib' support.
+      
+      With the same toolchain, and on some architectures, you will be able to
+      build big and little endian binaries, soft- and hard-float, etc...
+      
+      See the gcc configure manual at http://gcc.gnu.org/install/configure.html
+      to see what multilib your target supports.
+      
+      It's preferable for now to build two (or more) toolchains, one for each
+      configuration you need to support (eg. one for thumb and one for ARM,
+      etc...). You can use the vendor string to diferentiate those toolchains.
+
+config TARGET_VENDOR
+    string
+    prompt "Vendor string"
+    default "unknown"
+    help
+      Vendor part of the machine triplet.
+      
+      A triplet is of the form arch-vendor-kernel-system.
+      You can set the second part, vendor, to whatever you see fit.
+      Use a single word, or use underscores "_" to separate words.
+      
+      Keep the default (unkown) if you don't know better.
+
+config TARGET_ALIAS
+    string
+    prompt "Target alias"
+    default ""
+    help
+      Normaly, you'd call your toolchain component (especially gcc) by
+      prefixing the target triplet followed by a dash and the component name
+      (eg. armeb-unknown-linux-uclibc-gcc).
+      
+      You can enter a shortcut here. This string will be used to create
+      symbolic links to the toolchain tools (eg. if you enter "foo-bar" here,
+      then gcc for your toolchain will also be available as "foo-bar-gcc" along
+      with the original name).
+      
+      You shouldn't need to enter anything here, unless you plan to manually
+      call the tools (autotools-based ./configure will use the standard name).
+
+config ARCH
+    string
+    default "arm"     if ARCH_ARM
+    default "mips"    if ARCH_MIPS
+    default "x86"     if ARCH_x86
+    default "x86_64"  if ARCH_x86_64
+
+config BUILD 
+    string
+    prompt "Build system triplet"
+    default ""
+    help
+      Canonical name of the machine building the toolchain.
+      You should leave empty, unless you really now what you're doing.
+
+config CC_NATIVE
+    string
+    prompt "Native gcc"
+    default "gcc"
+    help
+      The native C compiler.
+      
+      You can set this to an alternative compiler if you have more than one
+      installed (eg. gcc is gcc-4.1.1 and you want to use gcc-3.4.6).
+      
+      You can leave this empty as well, in which case gcc will be used.
+
+config CANADIAN
+    bool
+    prompt "Canadian build (EXPERIMENTAL)"
+    default n
+    help
+      A canadian build allows to build a compiler on a first machine
+      (build system), that will run on second machine (host system),
+      targetting a third machine (target system).
+      
+      An example where you'd want a candian cross-compiler is to create
+      a native compiler for your target. In this case host and target
+      are the same.
+
+config HOST
+    string
+    prompt "Host system triplet"
+    default ""
+    depends on CANADIAN
+    help
+      Canonical name of the machine serving as host.
+
+config HOST_CC
+    string
+    prompt "Host system compiler"
+    default "${CT_HOST}-"
+    depends on CANADIAN
+    help
+      C compiler targeting the host system.
+      If HOST_CC ends with a dash (-), then it is considered to be the
+      prefix to gcc (eg. x86-pc-linuc-gnu-).
+      If it is empty, it is formed by appending '-gcc' to HOST.
+      Else it is considered to be the complete name of the compiler, with
+      full path, or without path (provided that it can be found in PATH).
+
+endmenu
diff --git a/docs/overview.txt b/docs/overview.txt
new file mode 100644
index 00000000..8027180f
--- /dev/null
+++ b/docs/overview.txt
@@ -0,0 +1,108 @@
+File.........: overview.txt
+Content......: Overview of how ct-ng works.
+Copyrigth....: (C) 2006 Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
+License......: see COPYING in the root of this package
+________________
+               /
+Introduction  /
+_____________/
+
+crosstool-NG aims at building toolchains. Toolchains are an essential component
+in a software development project. It will compile, assemble and link the code
+that is being developped. Some pieces of the toolchain will eventually end up
+in the resulting binary/ies: static libraries are but an example.
+
+So, a toolchain is a very sensitive piece of software, as any bug in one of the
+components, or a poorly configured component, can lead to execution problems,
+ranging from poor performance, to applications ending unexpectedly, to
+mis-behaving software (which more than often is hard to detect), to hardware
+damage, or even to human risks (which is more than regretable).
+
+Toolchains are made of different piece of software, each being quite complex
+and requiring specially crafted options to build and work seamlessly. This
+is usually not that easy, even in the not-so-trivial case of native toolchains.
+The work reaches a higher degree of complexity when it comes to cross-
+compilation, where it can becomes quite a nightmare...
+
+Some cross-toolchain exits on the internet, and can be used for general
+development, but they have a number of limitations:
+  - they can be general purpose, in that they are configured for the majority:
+    no optimisation for your specific target,
+  - they can be prepared for a specific target and thus are not easy to use,
+    nor optimised for, or even supporting your target,
+  - they often are using ageing components (compiler, C library, etc...) not
+    supporting special features of your shiny new processor;
+On the other side, these toolchain offer some advantages:
+  - they are ready to use and quite easy to install and setup,
+  - they are proven if used by a wide community.
+
+But once you want to get all the juice out of your specific hardware, you will
+want to build your own toolchain. This is where crosstool-ng comes into play.
+
+There are also a number of tools that builds toolchains for specific needs,
+which is not really scalable. Examples are:
+  - buildroot (buildroot.uclibc.org) whose main puprpose is to build root file
+    systems, hence the name. But once you have your toolchain with buildroot,
+    part of it is installed in the root-to-be, so if you want to build a whole
+    new root, you either have to save the existing one as a template and
+    restore it later, or restart again from scratch. This is not convenient,
+  - ptxdist (www.pengutronix.de/software/ptxdist), whose purpose is very
+    similar to buildroot,
+  - other projects (openembeded.org for example), which is again used to
+    build root file systems.
+
+crosstool-NG is really targetted at building toolchains, and only toolchains.
+It is then up to you to use it the way you want.
+
+___________
+          /
+History  /
+________/
+
+crosstool was first 'conceived' by Dan Kegel, which offered it to the community,
+as a set of scripts, a repository of patches, and some pre-configured, general
+purpose setup files to be used to configure crosstool. This is available at
+www.kegel.com/crosstool, and the subversion repository is hosted on google at
+http://code.google.com/p/crosstool/.
+
+At the time of writing, crosstool only supports building with one C library,
+namely glibc, and one C compiler, gcc; it is cripled with historical support
+for legacy components, and is some kind of a mess to upgrade.
+
+I once managed to add support for uClibc-based toolchains, but it did not make
+into mainline, mostly because I don't have time to port the patch forward to
+the new versions, due in part to the big effort it was taking.
+
+So I decided to clean up crosstool in the state it was, re-order the things
+in place, and add appropriate support for what I needed, that is uClibc
+support.
+
+The only option left to me was rewrite crosstool from scratch. I decided to go
+this way, and name the new implementation ct-ng, standing for crosstool Next
+Generation, as many other comunity projects do, and as a wink at the TV series
+"Star Trek: The Next Generation". ;-)
+
+_____________
+            /
+Operation  /
+__________/
+
+ct-ng is configured by a configurator presenting a menu-stuctured set of
+options. These options let you specify the way you want your toolchain built,
+where you want it installed, what architecture and specific processor it
+will support, the version of the components you want to use, etc... The
+value for those options are then stored in a configuration file.
+
+You then simply run make. It will use this configuration file to retrieve,
+extract and patch the components, build, install and test your newly built
+toolchain.
+
+You are then free to add the toolchain /bin directory in your PATH to use
+it at will.
+
+_____________
+            /
+Internals  /
+__________/
+
+<To be completed>
diff --git a/kconfig/Makefile b/kconfig/Makefile
new file mode 100644
index 00000000..74635488
--- /dev/null
+++ b/kconfig/Makefile
@@ -0,0 +1,71 @@
+# ===========================================================================
+# crosstool-ng configuration targets
+# These targets are used from top-level makefile
+
+KCONFIG_TOP = config/config.in
+obj = ./kconfig
+PHONY += clean help oldconfig menuconfig config silentoldconfig \
+	randconfig allyesconfig allnoconfig allmodconfig defconfig
+
+menuconfig: $(obj)/mconf
+	@$< $(KCONFIG_TOP)
+
+config: $(obj)/conf
+	@$< $(KCONFIG_TOP)
+
+oldconfig: $(obj)/conf
+	@$< -s $(KCONFIG_TOP)
+
+randconfig: $(obj)/conf
+	@$< -r $(KCONFIG_TOP)
+
+allyesconfig: $(obj)/conf
+	@$< -y $(KCONFIG_TOP)
+
+allnoconfig: $(obj)/conf
+	@$< -n $(KCONFIG_TOP)
+
+defconfig: $(obj)/conf
+	@$< -d $(KCONFIG_TOP)
+
+# Build a list of all available samples
+SAMPLES = $(patsubst $(CT_TOP_DIR)/samples/%,%,$(filter-out %Makefile,$(wildcard $(CT_TOP_DIR)/samples/*)))
+SAMPLES_CONFIG = $(patsubst %,%_config,$(SAMPLES))
+.PHONY: $(SAMPLES_CONFIG)
+$(SAMPLES_CONFIG):
+	@cp "$(CT_TOP_DIR)/samples/$(patsubst %_config,%,$@)/crosstool.config" "$(CT_TOP_DIR)/.config"
+	@$(MAKE) oldconfig
+
+# Help text used by make help
+help::
+	@echo  'General purpose configuration targets:'
+	@echo  '  config	  - Update current config utilising a line-oriented program'
+	@echo  '  menuconfig	  - Update current config utilising a menu based program'
+	@echo  '  oldconfig	  - Update current config utilising a provided .config as base'
+	@echo  '  randconfig	  - New config with random answer to all options'
+	@echo  '  defconfig	  - New config with default answer to all options'
+	@echo  '  allyesconfig	  - New config where all options are accepted with yes'
+	@echo  '  allnoconfig	  - New config where all options are answered with no'
+	@echo
+	@echo  'Preconfigured configuration targets:'
+	@for s in $(SAMPLES_CONFIG); do   \
+	    echo  "  $${s}"; \
+	 done
+	@echo  ''
+
+# Cheesy build
+
+SHIPPED = kconfig/zconf.tab.c kconfig/lex.zconf.c kconfig/zconf.hash.c
+
+%.c: %.c_shipped
+	@ln -s $(notdir $<) $@
+
+kconfig/mconf: $(SHIPPED) kconfig/mconf.c
+	@$(HOST_CC) -o $@ kconfig/{mconf.c,zconf.tab.c,lxdialog/*.c} \
+		-lcurses "-DCURSES_LOC=<ncurses.h>"
+
+kconfig/conf: $(SHIPPED) kconfig/conf.c
+	@$(HOST_CC) -o $@ kconfig/{conf.c,zconf.tab.c}
+
+clean::
+	@rm -f $(wildcard kconfig/*zconf*.c) kconfig/{conf,mconf}
diff --git a/kconfig/conf.c b/kconfig/conf.c
new file mode 100644
index 00000000..1b5b5d51
--- /dev/null
+++ b/kconfig/conf.c
@@ -0,0 +1,623 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf(struct menu *menu);
+static void check_conf(struct menu *menu);
+
+enum {
+	ask_all,
+	ask_new,
+	ask_silent,
+	set_default,
+	set_yes,
+	set_mod,
+	set_no,
+	set_random
+} input_mode = ask_all;
+char *defconfig_file;
+
+static int indent = 1;
+static int valid_stdin = 1;
+static int conf_cnt;
+static char line[128];
+static struct menu *rootEntry;
+
+static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
+
+static void strip(char *str)
+{
+	char *p = str;
+	int l;
+
+	while ((isspace(*p)))
+		p++;
+	l = strlen(p);
+	if (p != str)
+		memmove(str, p, l + 1);
+	if (!l)
+		return;
+	p = str + l - 1;
+	while ((isspace(*p)))
+		*p-- = 0;
+}
+
+static void check_stdin(void)
+{
+	if (!valid_stdin && input_mode == ask_silent) {
+		printf(_("aborted!\n\n"));
+		printf(_("Console input/output is redirected. "));
+		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
+		exit(1);
+	}
+}
+
+static void conf_askvalue(struct symbol *sym, const char *def)
+{
+	enum symbol_type type = sym_get_type(sym);
+	tristate val;
+
+	if (!sym_has_value(sym))
+		printf("(NEW) ");
+
+	line[0] = '\n';
+	line[1] = 0;
+
+	if (!sym_is_changable(sym)) {
+		printf("%s\n", def);
+		line[0] = '\n';
+		line[1] = 0;
+		return;
+	}
+
+	switch (input_mode) {
+	case set_no:
+	case set_mod:
+	case set_yes:
+	case set_random:
+		if (sym_has_value(sym)) {
+			printf("%s\n", def);
+			return;
+		}
+		break;
+	case ask_new:
+	case ask_silent:
+		if (sym_has_value(sym)) {
+			printf("%s\n", def);
+			return;
+		}
+		check_stdin();
+	case ask_all:
+		fflush(stdout);
+		fgets(line, 128, stdin);
+		return;
+	case set_default:
+		printf("%s\n", def);
+		return;
+	default:
+		break;
+	}
+
+	switch (type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		printf("%s\n", def);
+		return;
+	default:
+		;
+	}
+	switch (input_mode) {
+	case set_yes:
+		if (sym_tristate_within_range(sym, yes)) {
+			line[0] = 'y';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_mod:
+		if (type == S_TRISTATE) {
+			if (sym_tristate_within_range(sym, mod)) {
+				line[0] = 'm';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		} else {
+			if (sym_tristate_within_range(sym, yes)) {
+				line[0] = 'y';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		}
+	case set_no:
+		if (sym_tristate_within_range(sym, no)) {
+			line[0] = 'n';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_random:
+		do {
+			val = (tristate)(random() % 3);
+		} while (!sym_tristate_within_range(sym, val));
+		switch (val) {
+		case no: line[0] = 'n'; break;
+		case mod: line[0] = 'm'; break;
+		case yes: line[0] = 'y'; break;
+		}
+		line[1] = '\n';
+		line[2] = 0;
+		break;
+	default:
+		break;
+	}
+	printf("%s", line);
+}
+
+int conf_string(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	const char *def, *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("(%s) ", sym->name);
+		def = sym_get_string_value(sym);
+		if (sym_get_string_value(sym))
+			printf("[%s] ", def);
+		conf_askvalue(sym, def);
+		switch (line[0]) {
+		case '\n':
+			break;
+		case '?':
+			/* print help */
+			if (line[1] == '\n') {
+				help = nohelp_text;
+				if (menu->sym->help)
+					help = menu->sym->help;
+				printf("\n%s\n", menu->sym->help);
+				def = NULL;
+				break;
+			}
+		default:
+			line[strlen(line)-1] = 0;
+			def = line;
+		}
+		if (def && sym_set_string_value(sym, def))
+			return 0;
+	}
+}
+
+static int conf_sym(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	int type;
+	tristate oldval, newval;
+	const char *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		if (sym->name)
+			printf("(%s) ", sym->name);
+		type = sym_get_type(sym);
+		putchar('[');
+		oldval = sym_get_tristate_value(sym);
+		switch (oldval) {
+		case no:
+			putchar('N');
+			break;
+		case mod:
+			putchar('M');
+			break;
+		case yes:
+			putchar('Y');
+			break;
+		}
+		if (oldval != no && sym_tristate_within_range(sym, no))
+			printf("/n");
+		if (oldval != mod && sym_tristate_within_range(sym, mod))
+			printf("/m");
+		if (oldval != yes && sym_tristate_within_range(sym, yes))
+			printf("/y");
+		if (sym->help)
+			printf("/?");
+		printf("] ");
+		conf_askvalue(sym, sym_get_string_value(sym));
+		strip(line);
+
+		switch (line[0]) {
+		case 'n':
+		case 'N':
+			newval = no;
+			if (!line[1] || !strcmp(&line[1], "o"))
+				break;
+			continue;
+		case 'm':
+		case 'M':
+			newval = mod;
+			if (!line[1])
+				break;
+			continue;
+		case 'y':
+		case 'Y':
+			newval = yes;
+			if (!line[1] || !strcmp(&line[1], "es"))
+				break;
+			continue;
+		case 0:
+			newval = oldval;
+			break;
+		case '?':
+			goto help;
+		default:
+			continue;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			return 0;
+help:
+		help = nohelp_text;
+		if (sym->help)
+			help = sym->help;
+		printf("\n%s\n", help);
+	}
+}
+
+static int conf_choice(struct menu *menu)
+{
+	struct symbol *sym, *def_sym;
+	struct menu *child;
+	int type;
+	bool is_new;
+
+	sym = menu->sym;
+	type = sym_get_type(sym);
+	is_new = !sym_has_value(sym);
+	if (sym_is_changable(sym)) {
+		conf_sym(menu);
+		sym_calc_value(sym);
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			return 0;
+		case yes:
+			break;
+		}
+	} else {
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+			return 0;
+		case yes:
+			break;
+		}
+	}
+
+	while (1) {
+		int cnt, def;
+
+		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+		def_sym = sym_get_choice_value(sym);
+		cnt = def = 0;
+		line[0] = 0;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			if (!child->sym) {
+				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+				continue;
+			}
+			cnt++;
+			if (child->sym == def_sym) {
+				def = cnt;
+				printf("%*c", indent, '>');
+			} else
+				printf("%*c", indent, ' ');
+			printf(" %d. %s", cnt, menu_get_prompt(child));
+			if (child->sym->name)
+				printf(" (%s)", child->sym->name);
+			if (!sym_has_value(child->sym))
+				printf(" (NEW)");
+			printf("\n");
+		}
+		printf("%*schoice", indent - 1, "");
+		if (cnt == 1) {
+			printf("[1]: 1\n");
+			goto conf_childs;
+		}
+		printf("[1-%d", cnt);
+		if (sym->help)
+			printf("?");
+		printf("]: ");
+		switch (input_mode) {
+		case ask_new:
+		case ask_silent:
+			if (!is_new) {
+				cnt = def;
+				printf("%d\n", cnt);
+				break;
+			}
+			check_stdin();
+		case ask_all:
+			fflush(stdout);
+			fgets(line, 128, stdin);
+			strip(line);
+			if (line[0] == '?') {
+				printf("\n%s\n", menu->sym->help ?
+					menu->sym->help : nohelp_text);
+				continue;
+			}
+			if (!line[0])
+				cnt = def;
+			else if (isdigit(line[0]))
+				cnt = atoi(line);
+			else
+				continue;
+			break;
+		case set_random:
+			def = (random() % cnt) + 1;
+		case set_default:
+		case set_yes:
+		case set_mod:
+		case set_no:
+			cnt = def;
+			printf("%d\n", cnt);
+			break;
+		}
+
+	conf_childs:
+		for (child = menu->list; child; child = child->next) {
+			if (!child->sym || !menu_is_visible(child))
+				continue;
+			if (!--cnt)
+				break;
+		}
+		if (!child)
+			continue;
+		if (line[strlen(line) - 1] == '?') {
+			printf("\n%s\n", child->sym->help ?
+				child->sym->help : nohelp_text);
+			continue;
+		}
+		sym_set_choice_value(sym, child->sym);
+		if (child->list) {
+			indent += 2;
+			conf(child->list);
+			indent -= 2;
+		}
+		return 1;
+	}
+}
+
+static void conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (prop) {
+		const char *prompt;
+
+		switch (prop->type) {
+		case P_MENU:
+			if (input_mode == ask_silent && rootEntry != menu) {
+				check_conf(menu);
+				return;
+			}
+		case P_COMMENT:
+			prompt = menu_get_prompt(menu);
+			if (prompt)
+				printf("%*c\n%*c %s\n%*c\n",
+					indent, '*',
+					indent, '*', prompt,
+					indent, '*');
+		default:
+			;
+		}
+	}
+
+	if (!sym)
+		goto conf_childs;
+
+	if (sym_is_choice(sym)) {
+		conf_choice(menu);
+		if (sym->curr.tri != mod)
+			return;
+		goto conf_childs;
+	}
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		conf_string(menu);
+		break;
+	default:
+		conf_sym(menu);
+		break;
+	}
+
+conf_childs:
+	if (sym)
+		indent += 2;
+	for (child = menu->list; child; child = child->next)
+		conf(child);
+	if (sym)
+		indent -= 2;
+}
+
+static void check_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	if (sym && !sym_has_value(sym)) {
+		if (sym_is_changable(sym) ||
+		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
+			if (!conf_cnt++)
+				printf(_("*\n* Restart config...\n*\n"));
+			rootEntry = menu_get_parent_menu(menu);
+			conf(rootEntry);
+		}
+	}
+
+	for (child = menu->list; child; child = child->next)
+		check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+	int i = 1;
+	const char *name;
+	struct stat tmpstat;
+
+	if (ac > i && av[i][0] == '-') {
+		switch (av[i++][1]) {
+		case 'o':
+			input_mode = ask_new;
+			break;
+		case 's':
+			input_mode = ask_silent;
+			valid_stdin = isatty(0) && isatty(1) && isatty(2);
+			break;
+		case 'd':
+			input_mode = set_default;
+			break;
+		case 'D':
+			input_mode = set_default;
+			defconfig_file = av[i++];
+			if (!defconfig_file) {
+				printf(_("%s: No default config file specified\n"),
+					av[0]);
+				exit(1);
+			}
+			break;
+		case 'n':
+			input_mode = set_no;
+			break;
+		case 'm':
+			input_mode = set_mod;
+			break;
+		case 'y':
+			input_mode = set_yes;
+			break;
+		case 'r':
+			input_mode = set_random;
+			srandom(time(NULL));
+			break;
+		case 'h':
+		case '?':
+			fprintf(stderr, "See README for usage info\n");
+			exit(0);
+		}
+	}
+  	name = av[i];
+	if (!name) {
+		printf(_("%s: Kconfig file missing\n"), av[0]);
+		exit(1);
+	}
+	conf_parse(name);
+	//zconfdump(stdout);
+	switch (input_mode) {
+	case set_default:
+		if (!defconfig_file)
+			defconfig_file = conf_get_default_confname();
+		if (conf_read(defconfig_file)) {
+			printf("***\n"
+				"*** Can't find default configuration \"%s\"!\n"
+				"***\n", defconfig_file);
+			exit(1);
+		}
+		break;
+	case ask_silent:
+		if (stat(".config", &tmpstat)) {
+			printf(_("***\n"
+				"*** You have not yet configured your "PROJECT_NAME"!\n"
+				"***\n"
+				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+				"*** \"make menuconfig\" or \"make xconfig\").\n"
+				"***\n"));
+			exit(1);
+		}
+	case ask_all:
+	case ask_new:
+		conf_read(NULL);
+		break;
+	case set_no:
+	case set_mod:
+	case set_yes:
+	case set_random:
+		name = getenv("KCONFIG_ALLCONFIG");
+		if (name && !stat(name, &tmpstat)) {
+			conf_read_simple(name, S_DEF_USER);
+			break;
+		}
+		switch (input_mode) {
+		case set_no:	 name = "allno.config"; break;
+		case set_mod:	 name = "allmod.config"; break;
+		case set_yes:	 name = "allyes.config"; break;
+		case set_random: name = "allrandom.config"; break;
+		default: break;
+		}
+		if (!stat(name, &tmpstat))
+			conf_read_simple(name, S_DEF_USER);
+		else if (!stat("all.config", &tmpstat))
+			conf_read_simple("all.config", S_DEF_USER);
+		break;
+	default:
+		break;
+	}
+
+	if (input_mode != ask_silent) {
+		rootEntry = &rootmenu;
+		conf(&rootmenu);
+		if (input_mode == ask_all) {
+			input_mode = ask_silent;
+			valid_stdin = 1;
+		}
+	} else if (sym_change_count) {
+		name = getenv("KCONFIG_NOSILENTUPDATE");
+		if (name && *name) {
+			fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n"));
+			return 1;
+		}
+	} else
+		goto skip_check;
+
+	do {
+		conf_cnt = 0;
+		check_conf(&rootmenu);
+	} while (conf_cnt);
+
+	if (!conf_write(NULL)) {
+skip_check:
+		return 0;
+	}
+	fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n"));
+	return 1;
+}
diff --git a/kconfig/confdata.c b/kconfig/confdata.c
new file mode 100644
index 00000000..8d79f442
--- /dev/null
+++ b/kconfig/confdata.c
@@ -0,0 +1,800 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf_warning(const char *fmt, ...)
+	__attribute__ ((format (printf, 1, 2)));
+
+static const char *conf_filename;
+static int conf_lineno, conf_warnings, conf_unsaved;
+
+#ifndef conf_defname
+const char conf_defname[] = "arch/$ARCH/defconfig";
+#endif
+
+static void conf_warning(const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+	conf_warnings++;
+}
+
+const char *conf_get_configname(void)
+{
+	char *name = getenv("KCONFIG_CONFIG");
+
+	return name ? name : ".config";
+}
+
+static char *conf_expand_value(const char *in)
+{
+	struct symbol *sym;
+	const char *src;
+	static char res_value[SYMBOL_MAXLENGTH];
+	char *dst, name[SYMBOL_MAXLENGTH];
+
+	res_value[0] = 0;
+	dst = name;
+	while ((src = strchr(in, '$'))) {
+		strncat(res_value, in, src - in);
+		src++;
+		dst = name;
+		while (isalnum(*src) || *src == '_')
+			*dst++ = *src++;
+		*dst = 0;
+		sym = sym_lookup(name, 0);
+		sym_calc_value(sym);
+		strcat(res_value, sym_get_string_value(sym));
+		in = src;
+	}
+	strcat(res_value, in);
+
+	return res_value;
+}
+
+char *conf_get_default_confname(void)
+{
+	struct stat buf;
+	static char fullname[PATH_MAX+1];
+	char *env, *name;
+
+	name = conf_expand_value(conf_defname);
+	env = getenv(SRCTREE);
+	if (env) {
+		sprintf(fullname, "%s/%s", env, name);
+		if (!stat(fullname, &buf))
+			return fullname;
+	}
+	return name;
+}
+
+int conf_read_simple(const char *name, int def)
+{
+	FILE *in = NULL;
+	char line[1024];
+	char *p, *p2;
+	struct symbol *sym;
+	int i, def_flags;
+
+	if (name) {
+		in = zconf_fopen(name);
+	} else {
+		struct property *prop;
+
+		name = conf_get_configname();
+		in = zconf_fopen(name);
+		if (in)
+			goto load;
+		sym_change_count++;
+		if (!sym_defconfig_list)
+			return 1;
+
+		for_all_defaults(sym_defconfig_list, prop) {
+			if (expr_calc_value(prop->visible.expr) == no ||
+			    prop->expr->type != E_SYMBOL)
+				continue;
+			name = conf_expand_value(prop->expr->left.sym->name);
+			in = zconf_fopen(name);
+			if (in) {
+				printf(_("#\n"
+					 "# using defaults found in %s\n"
+					 "#\n"), name);
+				goto load;
+			}
+		}
+	}
+	if (!in)
+		return 1;
+
+load:
+	conf_filename = name;
+	conf_lineno = 0;
+	conf_warnings = 0;
+	conf_unsaved = 0;
+
+	def_flags = SYMBOL_DEF << def;
+	for_all_symbols(i, sym) {
+		sym->flags |= SYMBOL_CHANGED;
+		sym->flags &= ~(def_flags|SYMBOL_VALID);
+		if (sym_is_choice(sym))
+			sym->flags |= def_flags;
+		switch (sym->type) {
+		case S_INT:
+		case S_HEX:
+		case S_STRING:
+			if (sym->def[def].val)
+				free(sym->def[def].val);
+		default:
+			sym->def[def].val = NULL;
+			sym->def[def].tri = no;
+		}
+	}
+
+	while (fgets(line, sizeof(line), in)) {
+		conf_lineno++;
+		sym = NULL;
+		switch (line[0]) {
+		case '#':
+			if (memcmp(line + 2, "CT_", 3))
+				continue;
+			p = strchr(line + 5, ' ');
+			if (!p)
+				continue;
+			*p++ = 0;
+			if (strncmp(p, "is not set", 10))
+				continue;
+			if (def == S_DEF_USER) {
+				sym = sym_find(line + 5);
+				if (!sym) {
+					conf_warning("trying to assign nonexistent symbol %s", line + 5);
+					break;
+				}
+			} else {
+				sym = sym_lookup(line + 5, 0);
+				if (sym->type == S_UNKNOWN)
+					sym->type = S_BOOLEAN;
+			}
+			if (sym->flags & def_flags) {
+				conf_warning("trying to reassign symbol %s", sym->name);
+				break;
+			}
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				sym->def[def].tri = no;
+				sym->flags |= def_flags;
+				break;
+			default:
+				;
+			}
+			break;
+		case 'C':
+			if (memcmp(line, "CT_", 3)) {
+				conf_warning("unexpected data");
+				continue;
+			}
+			p = strchr(line + 3, '=');
+			if (!p)
+				continue;
+			*p++ = 0;
+			p2 = strchr(p, '\n');
+			if (p2) {
+				*p2-- = 0;
+				if (*p2 == '\r')
+					*p2 = 0;
+			}
+			if (def == S_DEF_USER) {
+				sym = sym_find(line + 3);
+				if (!sym) {
+					conf_warning("trying to assign nonexistent symbol %s", line + 3);
+					break;
+				}
+			} else {
+				sym = sym_lookup(line + 3, 0);
+				if (sym->type == S_UNKNOWN)
+					sym->type = S_OTHER;
+			}
+			if (sym->flags & def_flags) {
+				conf_warning("trying to reassign symbol %s", sym->name);
+				break;
+			}
+			switch (sym->type) {
+			case S_TRISTATE:
+				if (p[0] == 'm') {
+					sym->def[def].tri = mod;
+					sym->flags |= def_flags;
+					break;
+				}
+			case S_BOOLEAN:
+				if (p[0] == 'y') {
+					sym->def[def].tri = yes;
+					sym->flags |= def_flags;
+					break;
+				}
+				if (p[0] == 'n') {
+					sym->def[def].tri = no;
+					sym->flags |= def_flags;
+					break;
+				}
+				conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+				break;
+			case S_OTHER:
+				if (*p != '"') {
+					for (p2 = p; *p2 && !isspace(*p2); p2++)
+						;
+					sym->type = S_STRING;
+					goto done;
+				}
+			case S_STRING:
+				if (*p++ != '"')
+					break;
+				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+					if (*p2 == '"') {
+						*p2 = 0;
+						break;
+					}
+					memmove(p2, p2 + 1, strlen(p2));
+				}
+				if (!p2) {
+					conf_warning("invalid string found");
+					continue;
+				}
+			case S_INT:
+			case S_HEX:
+			done:
+				if (sym_string_valid(sym, p)) {
+					sym->def[def].val = strdup(p);
+					sym->flags |= def_flags;
+				} else {
+					conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+					continue;
+				}
+				break;
+			default:
+				;
+			}
+			break;
+		case '\r':
+		case '\n':
+			break;
+		default:
+			conf_warning("unexpected data");
+			continue;
+		}
+		if (sym && sym_is_choice_value(sym)) {
+			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+			switch (sym->def[def].tri) {
+			case no:
+				break;
+			case mod:
+				if (cs->def[def].tri == yes) {
+					conf_warning("%s creates inconsistent choice state", sym->name);
+					cs->flags &= ~def_flags;
+				}
+				break;
+			case yes:
+				if (cs->def[def].tri != no) {
+					conf_warning("%s creates inconsistent choice state", sym->name);
+					cs->flags &= ~def_flags;
+				} else
+					cs->def[def].val = sym;
+				break;
+			}
+			cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri);
+		}
+	}
+	fclose(in);
+
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+	return 0;
+}
+
+int conf_read(const char *name)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *e;
+	int i, flags;
+
+	sym_change_count = 0;
+
+	if (conf_read_simple(name, S_DEF_USER))
+		return 1;
+
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
+			goto sym_ok;
+		if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
+			/* check that calculated value agrees with saved value */
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
+					break;
+				if (!sym_is_choice(sym))
+					goto sym_ok;
+			default:
+				if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
+					goto sym_ok;
+				break;
+			}
+		} else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
+			/* no previous value and not saved */
+			goto sym_ok;
+		conf_unsaved++;
+		/* maybe print value in verbose mode... */
+	sym_ok:
+		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+			if (sym->visible == no)
+				sym->flags &= ~SYMBOL_DEF_USER;
+			switch (sym->type) {
+			case S_STRING:
+			case S_INT:
+			case S_HEX:
+				if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val))
+					sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
+			default:
+				break;
+			}
+		}
+		if (!sym_is_choice(sym))
+			continue;
+		prop = sym_get_choice_prop(sym);
+		flags = sym->flags;
+		for (e = prop->expr; e; e = e->left.expr)
+			if (e->right.sym->visible != no)
+				flags &= e->right.sym->flags;
+		sym->flags &= flags | ~SYMBOL_DEF_USER;
+	}
+
+	sym_change_count += conf_warnings || conf_unsaved;
+
+	return 0;
+}
+
+struct menu *next_menu(struct menu *menu)
+{
+	if (menu->list) return menu->list;
+	do {
+		if (menu->next) {
+			menu = menu->next;
+			break;
+		}
+	} while ((menu = menu->parent));
+
+	return menu;
+}
+
+#define SYMBOL_FORCEWRITE (1<<31)
+
+int conf_write(const char *name)
+{
+	FILE *out;
+	struct symbol *sym;
+	struct menu *menu;
+	const char *basename;
+	char dirname[128], tmpname[128], newname[128];
+	int type, l, writetype;
+	const char *str;
+	time_t now;
+	int use_timestamp = 1;
+	char *env;
+
+	dirname[0] = 0;
+	if (name && name[0]) {
+		struct stat st;
+		char *slash;
+
+		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+			strcpy(dirname, name);
+			strcat(dirname, "/");
+			basename = conf_get_configname();
+		} else if ((slash = strrchr(name, '/'))) {
+			int size = slash - name + 1;
+			memcpy(dirname, name, size);
+			dirname[size] = 0;
+			if (slash[1])
+				basename = slash + 1;
+			else
+				basename = conf_get_configname();
+		} else
+			basename = name;
+	} else
+		basename = conf_get_configname();
+
+	sprintf(newname, "%s%s", dirname, basename);
+	env = getenv("KCONFIG_OVERWRITECONFIG");
+	if (!env || !*env) {
+		sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
+		out = fopen(tmpname, "w");
+	} else {
+		*tmpname = 0;
+		out = fopen(newname, "w");
+	}
+	if (!out)
+		return 1;
+
+	sym = sym_lookup("PROJECTVERSION", 0);
+	sym_calc_value(sym);
+	time(&now);
+	env = getenv("KCONFIG_NOTIMESTAMP");
+	if (env && *env)
+		use_timestamp = 0;
+
+	fprintf(out, _("#\n"
+		       "# Automatically generated make config: don't edit\n"
+		       "# "PROJECT_NAME" version: %s\n"
+		       "%s%s"
+		       "#\n"),
+		     sym_get_string_value(sym),
+		     use_timestamp ? "# " : "",
+		     use_timestamp ? ctime(&now) : "");
+
+	if (!sym_change_count)
+		sym_clear_all_valid();
+
+	// Write out all symbols (even in closed sub-menus).
+	if (1) {
+		for (menu = rootmenu.list; menu; menu = next_menu(menu))
+			if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE;
+		writetype = SYMBOL_FORCEWRITE;
+
+	// Don't write  out symbols in closed menus.
+
+	} else writetype = SYMBOL_WRITE;
+
+
+	menu = rootmenu.list;
+	while (menu) {
+		sym = menu->sym;
+		if (!sym) {
+			if (!menu_is_visible(menu))
+				goto next;
+			str = menu_get_prompt(menu);
+			fprintf(out, "\n"
+				     "#\n"
+				     "# %s\n"
+				     "#\n", str);
+		} else if (!(sym->flags & SYMBOL_CHOICE)) {
+			sym_calc_value(sym);
+			if (!(sym->flags & writetype))
+				goto next;
+			sym->flags &= ~writetype;
+			type = sym->type;
+			if (type == S_TRISTATE) {
+				sym_calc_value(modules_sym);
+				if (modules_sym->curr.tri == no)
+					type = S_BOOLEAN;
+			}
+			switch (type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				switch (sym_get_tristate_value(sym)) {
+				case no:
+					fprintf(out, "# CT_%s is not set\n", sym->name);
+					break;
+				case mod:
+					fprintf(out, "CT_%s=m\n", sym->name);
+					break;
+				case yes:
+					fprintf(out, "CT_%s=y\n", sym->name);
+					break;
+				}
+				break;
+			case S_STRING:
+				str = sym_get_string_value(sym);
+				fprintf(out, "CT_%s=\"", sym->name);
+				while (1) {
+					l = strcspn(str, "\"\\");
+					if (l) {
+						fwrite(str, l, 1, out);
+						str += l;
+					}
+					if (!*str)
+						break;
+					fprintf(out, "\\%c", *str++);
+				}
+				fputs("\"\n", out);
+				break;
+			case S_HEX:
+				str = sym_get_string_value(sym);
+				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+					fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0");
+					break;
+				}
+			case S_INT:
+				str = sym_get_string_value(sym);
+				fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0");
+				break;
+			}
+		}
+
+	next:
+		if (writetype == SYMBOL_WRITE) {
+			if (menu->list) {
+				menu = menu->list;
+				continue;
+			}
+			if (menu->next)
+				menu = menu->next;
+			else while ((menu = menu->parent)) {
+				if (menu->next) {
+					menu = menu->next;
+					break;
+				}
+			}
+		} else
+			menu = next_menu(menu);
+	}
+	fclose(out);
+
+	if (*tmpname) {
+		strcat(dirname, basename);
+		strcat(dirname, ".old");
+		rename(newname, dirname);
+		if (rename(tmpname, newname))
+			return 1;
+	}
+
+	printf(_("#\n"
+		 "# configuration written to %s\n"
+		 "#\n"), newname);
+
+	sym_change_count = 0;
+
+	return 0;
+}
+
+int conf_split_config(void)
+{
+	char *name, path[128];
+	char *s, *d, c;
+	struct symbol *sym;
+	struct stat sb;
+	int res, i, fd;
+
+	name = getenv("KCONFIG_AUTOCONFIG");
+	if (!name)
+		name = "include/config/auto.conf";
+	conf_read_simple(name, S_DEF_AUTO);
+
+	if (chdir("include/config"))
+		return 1;
+
+	res = 0;
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if ((sym->flags & SYMBOL_AUTO) || !sym->name)
+			continue;
+		if (sym->flags & SYMBOL_WRITE) {
+			if (sym->flags & SYMBOL_DEF_AUTO) {
+				/*
+				 * symbol has old and new value,
+				 * so compare them...
+				 */
+				switch (sym->type) {
+				case S_BOOLEAN:
+				case S_TRISTATE:
+					if (sym_get_tristate_value(sym) ==
+					    sym->def[S_DEF_AUTO].tri)
+						continue;
+					break;
+				case S_STRING:
+				case S_HEX:
+				case S_INT:
+					if (!strcmp(sym_get_string_value(sym),
+						    sym->def[S_DEF_AUTO].val))
+						continue;
+					break;
+				default:
+					break;
+				}
+			} else {
+				/*
+				 * If there is no old value, only 'no' (unset)
+				 * is allowed as new value.
+				 */
+				switch (sym->type) {
+				case S_BOOLEAN:
+				case S_TRISTATE:
+					if (sym_get_tristate_value(sym) == no)
+						continue;
+					break;
+				default:
+					break;
+				}
+			}
+		} else if (!(sym->flags & SYMBOL_DEF_AUTO))
+			/* There is neither an old nor a new value. */
+			continue;
+		/* else
+		 *	There is an old value, but no new value ('no' (unset)
+		 *	isn't saved in auto.conf, so the old value is always
+		 *	different from 'no').
+		 */
+
+		/* Replace all '_' and append ".h" */
+		s = sym->name;
+		d = path;
+		while ((c = *s++)) {
+			c = tolower(c);
+			*d++ = (c == '_') ? '/' : c;
+		}
+		strcpy(d, ".h");
+
+		/* Assume directory path already exists. */
+		fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+		if (fd == -1) {
+			if (errno != ENOENT) {
+				res = 1;
+				break;
+			}
+			/*
+			 * Create directory components,
+			 * unless they exist already.
+			 */
+			d = path;
+			while ((d = strchr(d, '/'))) {
+				*d = 0;
+				if (stat(path, &sb) && mkdir(path, 0755)) {
+					res = 1;
+					goto out;
+				}
+				*d++ = '/';
+			}
+			/* Try it again. */
+			fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+			if (fd == -1) {
+				res = 1;
+				break;
+			}
+		}
+		close(fd);
+	}
+out:
+	if (chdir("../.."))
+		return 1;
+
+	return res;
+}
+
+int conf_write_autoconf(void)
+{
+	struct symbol *sym;
+	const char *str;
+	char *name;
+	FILE *out, *out_h;
+	time_t now;
+	int i, l;
+
+	sym_clear_all_valid();
+
+	file_write_dep("include/config/auto.conf.cmd");
+
+	if (conf_split_config())
+		return 1;
+
+	out = fopen(".tmpconfig", "w");
+	if (!out)
+		return 1;
+
+	out_h = fopen(".tmpconfig.h", "w");
+	if (!out_h) {
+		fclose(out);
+		return 1;
+	}
+
+	sym = sym_lookup("PROJECTVERSION", 0);
+	sym_calc_value(sym);
+	time(&now);
+	fprintf(out, "#\n"
+		     "# Automatically generated make config: don't edit\n"
+		     "# "PROJECT_NAME" version: %s\n"
+		     "# %s"
+		     "#\n",
+		     sym_get_string_value(sym), ctime(&now));
+	fprintf(out_h, "/*\n"
+		       " * Automatically generated C config: don't edit\n"
+		       " * "PROJECT_NAME" version: %s\n"
+		       " * %s"
+		       " */\n"
+		       "#define AUTOCONF_INCLUDED\n",
+		       sym_get_string_value(sym), ctime(&now));
+
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
+			continue;
+		switch (sym->type) {
+		case S_BOOLEAN:
+		case S_TRISTATE:
+			switch (sym_get_tristate_value(sym)) {
+			case no:
+				break;
+			case mod:
+				fprintf(out, "CT_%s=m\n", sym->name);
+				fprintf(out_h, "#define CT_%s_MODULE 1\n", sym->name);
+				break;
+			case yes:
+				fprintf(out, "CT_%s=y\n", sym->name);
+				fprintf(out_h, "#define CT_%s 1\n", sym->name);
+				break;
+			}
+			break;
+		case S_STRING:
+			str = sym_get_string_value(sym);
+			fprintf(out, "CT_%s=\"", sym->name);
+			fprintf(out_h, "#define CT_%s \"", sym->name);
+			while (1) {
+				l = strcspn(str, "\"\\");
+				if (l) {
+					fwrite(str, l, 1, out);
+					fwrite(str, l, 1, out_h);
+					str += l;
+				}
+				if (!*str)
+					break;
+				fprintf(out, "\\%c", *str);
+				fprintf(out_h, "\\%c", *str);
+				str++;
+			}
+			fputs("\"\n", out);
+			fputs("\"\n", out_h);
+			break;
+		case S_HEX:
+			str = sym_get_string_value(sym);
+			if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+				fprintf(out, "CT_%s=%s\n", sym->name, str);
+				fprintf(out_h, "#define CT_%s 0x%s\n", sym->name, str);
+				break;
+			}
+		case S_INT:
+			str = sym_get_string_value(sym);
+			fprintf(out, "CT_%s=%s\n", sym->name, str);
+			fprintf(out_h, "#define CT_%s %s\n", sym->name, str);
+			break;
+		default:
+			break;
+		}
+	}
+	fclose(out);
+	fclose(out_h);
+
+	name = getenv("KCONFIG_AUTOHEADER");
+	if (!name)
+		name = "include/linux/autoconf.h";
+	if (rename(".tmpconfig.h", name))
+		return 1;
+	name = getenv("KCONFIG_AUTOCONFIG");
+	if (!name)
+		name = "include/config/auto.conf";
+	/*
+	 * This must be the last step, kbuild has a dependency on auto.conf
+	 * and this marks the successful completion of the previous steps.
+	 */
+	if (rename(".tmpconfig", name))
+		return 1;
+
+	return 0;
+}
diff --git a/kconfig/expr.c b/kconfig/expr.c
new file mode 100644
index 00000000..6f98dbfe
--- /dev/null
+++ b/kconfig/expr.c
@@ -0,0 +1,1100 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define DEBUG_EXPR	0
+
+struct expr *expr_alloc_symbol(struct symbol *sym)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = E_SYMBOL;
+	e->left.sym = sym;
+	return e;
+}
+
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = ce;
+	return e;
+}
+
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = e1;
+	e->right.expr = e2;
+	return e;
+}
+
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.sym = s1;
+	e->right.sym = s2;
+	return e;
+}
+
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
+}
+
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
+struct expr *expr_copy(struct expr *org)
+{
+	struct expr *e;
+
+	if (!org)
+		return NULL;
+
+	e = malloc(sizeof(*org));
+	memcpy(e, org, sizeof(*org));
+	switch (org->type) {
+	case E_SYMBOL:
+		e->left = org->left;
+		break;
+	case E_NOT:
+		e->left.expr = expr_copy(org->left.expr);
+		break;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		e->left.sym = org->left.sym;
+		e->right.sym = org->right.sym;
+		break;
+	case E_AND:
+	case E_OR:
+	case E_CHOICE:
+		e->left.expr = expr_copy(org->left.expr);
+		e->right.expr = expr_copy(org->right.expr);
+		break;
+	default:
+		printf("can't copy type %d\n", e->type);
+		free(e);
+		e = NULL;
+		break;
+	}
+
+	return e;
+}
+
+void expr_free(struct expr *e)
+{
+	if (!e)
+		return;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		break;
+	case E_NOT:
+		expr_free(e->left.expr);
+		return;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		break;
+	case E_OR:
+	case E_AND:
+		expr_free(e->left.expr);
+		expr_free(e->right.expr);
+		break;
+	default:
+		printf("how to free type %d?\n", e->type);
+		break;
+	}
+	free(e);
+}
+
+static int trans_count;
+
+#define e1 (*ep1)
+#define e2 (*ep2)
+
+static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+	if (e1->type == type) {
+		__expr_eliminate_eq(type, &e1->left.expr, &e2);
+		__expr_eliminate_eq(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		__expr_eliminate_eq(type, &e1, &e2->left.expr);
+		__expr_eliminate_eq(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+	    e1->left.sym == e2->left.sym &&
+	    (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no))
+		return;
+	if (!expr_eq(e1, e2))
+		return;
+	trans_count++;
+	expr_free(e1); expr_free(e2);
+	switch (type) {
+	case E_OR:
+		e1 = expr_alloc_symbol(&symbol_no);
+		e2 = expr_alloc_symbol(&symbol_no);
+		break;
+	case E_AND:
+		e1 = expr_alloc_symbol(&symbol_yes);
+		e2 = expr_alloc_symbol(&symbol_yes);
+		break;
+	default:
+		;
+	}
+}
+
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
+{
+	if (!e1 || !e2)
+		return;
+	switch (e1->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e1->type, ep1, ep2);
+	default:
+		;
+	}
+	if (e1->type != e2->type) switch (e2->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e2->type, ep1, ep2);
+	default:
+		;
+	}
+	e1 = expr_eliminate_yn(e1);
+	e2 = expr_eliminate_yn(e2);
+}
+
+#undef e1
+#undef e2
+
+int expr_eq(struct expr *e1, struct expr *e2)
+{
+	int res, old_count;
+
+	if (e1->type != e2->type)
+		return 0;
+	switch (e1->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
+	case E_SYMBOL:
+		return e1->left.sym == e2->left.sym;
+	case E_NOT:
+		return expr_eq(e1->left.expr, e2->left.expr);
+	case E_AND:
+	case E_OR:
+		e1 = expr_copy(e1);
+		e2 = expr_copy(e2);
+		old_count = trans_count;
+		expr_eliminate_eq(&e1, &e2);
+		res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+		       e1->left.sym == e2->left.sym);
+		expr_free(e1);
+		expr_free(e2);
+		trans_count = old_count;
+		return res;
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+
+	if (DEBUG_EXPR) {
+		expr_fprint(e1, stdout);
+		printf(" = ");
+		expr_fprint(e2, stdout);
+		printf(" ?\n");
+	}
+
+	return 0;
+}
+
+struct expr *expr_eliminate_yn(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (e) switch (e->type) {
+	case E_AND:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		break;
+	case E_OR:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * bool FOO!=n => FOO
+ */
+struct expr *expr_trans_bool(struct expr *e)
+{
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_AND:
+	case E_OR:
+	case E_NOT:
+		e->left.expr = expr_trans_bool(e->left.expr);
+		e->right.expr = expr_trans_bool(e->right.expr);
+		break;
+	case E_UNEQUAL:
+		// FOO!=n -> FOO
+		if (e->left.sym->type == S_TRISTATE) {
+			if (e->right.sym == &symbol_no) {
+				e->type = E_SYMBOL;
+				e->right.sym = NULL;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * e1 || e2 -> ?
+ */
+struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+		     (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='m') -> (a!='n')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='n') -> (a!='m')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
+			// (a='m') || (a='n') -> (a!='y')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
+		}
+	}
+	if (sym1->type == S_BOOLEAN && sym1 == sym2) {
+		if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
+		    (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
+			return expr_alloc_symbol(&symbol_yes);
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") || (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+
+	if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
+	    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
+		// (a) && (a='y') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
+		// (a) && (a!='n') -> (a)
+		return expr_alloc_symbol(sym1);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
+		// (a) && (a!='m') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e1->right.sym;
+			if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e2->right.sym;
+			if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+			    (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='m') -> (a='n')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
+			// (a!='m') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+		if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
+		    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
+		    (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
+		    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
+			return NULL;
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") && (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp;
+
+	if (e1->type == type) {
+		expr_eliminate_dups1(type, &e1->left.expr, &e2);
+		expr_eliminate_dups1(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups1(type, &e1, &e2->left.expr);
+		expr_eliminate_dups1(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR: case E_AND:
+		expr_eliminate_dups1(e1->type, &e1, &e1);
+	default:
+		;
+	}
+
+	switch (type) {
+	case E_OR:
+		tmp = expr_join_or(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	case E_AND:
+		tmp = expr_join_and(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp, *tmp1, *tmp2;
+
+	if (e1->type == type) {
+		expr_eliminate_dups2(type, &e1->left.expr, &e2);
+		expr_eliminate_dups2(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups2(type, &e1, &e2->left.expr);
+		expr_eliminate_dups2(type, &e1, &e2->right.expr);
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO || BAR) && (!FOO && !BAR) -> n
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_and(&tmp1, &tmp2);
+		if (expr_is_yes(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_no);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	case E_AND:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO && BAR) || (!FOO || !BAR) -> y
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_or(&tmp1, &tmp2);
+		if (expr_is_no(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_eliminate_dups(struct expr *e)
+{
+	int oldcount;
+	if (!e)
+		return e;
+
+	oldcount = trans_count;
+	while (1) {
+		trans_count = 0;
+		switch (e->type) {
+		case E_OR: case E_AND:
+			expr_eliminate_dups1(e->type, &e, &e);
+			expr_eliminate_dups2(e->type, &e, &e);
+		default:
+			;
+		}
+		if (!trans_count)
+			break;
+		e = expr_eliminate_yn(e);
+	}
+	trans_count = oldcount;
+	return e;
+}
+
+struct expr *expr_transform(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+	case E_SYMBOL:
+	case E_CHOICE:
+		break;
+	default:
+		e->left.expr = expr_transform(e->left.expr);
+		e->right.expr = expr_transform(e->right.expr);
+	}
+
+	switch (e->type) {
+	case E_EQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_no;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_UNEQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_yes;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_NOT:
+		switch (e->left.expr->type) {
+		case E_NOT:
+			// !!a -> a
+			tmp = e->left.expr->left.expr;
+			free(e->left.expr);
+			free(e);
+			e = tmp;
+			e = expr_transform(e);
+			break;
+		case E_EQUAL:
+		case E_UNEQUAL:
+			// !a='x' -> a!='x'
+			tmp = e->left.expr;
+			free(e);
+			e = tmp;
+			e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
+			break;
+		case E_OR:
+			// !(a || b) -> !a && !b
+			tmp = e->left.expr;
+			e->type = E_AND;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_AND:
+			// !(a && b) -> !a || !b
+			tmp = e->left.expr;
+			e->type = E_OR;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_SYMBOL:
+			if (e->left.expr->left.sym == &symbol_yes) {
+				// !'y' -> 'n'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_mod) {
+				// !'m' -> 'm'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_mod;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_no) {
+				// !'n' -> 'y'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				break;
+			}
+			break;
+		default:
+			;
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+int expr_contains_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return 0;
+
+	switch (dep->type) {
+	case E_AND:
+	case E_OR:
+		return expr_contains_symbol(dep->left.expr, sym) ||
+		       expr_contains_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return dep->left.sym == sym ||
+		       dep->right.sym == sym;
+	case E_NOT:
+		return expr_contains_symbol(dep->left.expr, sym);
+	default:
+		;
+	}
+	return 0;
+}
+
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return false;
+
+	switch (dep->type) {
+	case E_AND:
+		return expr_depends_symbol(dep->left.expr, sym) ||
+		       expr_depends_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
+				return true;
+		}
+		break;
+	case E_UNEQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_no)
+				return true;
+		}
+		break;
+	default:
+		;
+	}
+ 	return false;
+}
+
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_AND, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_OR, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	if (e1->type == type) {
+		expr_extract_eq(type, ep, &e1->left.expr, &e2);
+		expr_extract_eq(type, ep, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_extract_eq(type, ep, ep1, &e2->left.expr);
+		expr_extract_eq(type, ep, ep1, &e2->right.expr);
+		return;
+	}
+	if (expr_eq(e1, e2)) {
+		*ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
+		expr_free(e2);
+		if (type == E_AND) {
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = expr_alloc_symbol(&symbol_yes);
+		} else if (type == E_OR) {
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = expr_alloc_symbol(&symbol_no);
+		}
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
+{
+	struct expr *e1, *e2;
+
+	if (!e) {
+		e = expr_alloc_symbol(sym);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	}
+	switch (e->type) {
+	case E_AND:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_OR:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_NOT:
+		return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
+	case E_UNEQUAL:
+	case E_EQUAL:
+		if (type == E_EQUAL) {
+			if (sym == &symbol_yes)
+				return expr_copy(e);
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_no);
+			if (sym == &symbol_no)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+		} else {
+			if (sym == &symbol_yes)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_yes);
+			if (sym == &symbol_no)
+				return expr_copy(e);
+		}
+		break;
+	case E_SYMBOL:
+		return expr_alloc_comp(type, e->left.sym, sym);
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+	return NULL;
+}
+
+tristate expr_calc_value(struct expr *e)
+{
+	tristate val1, val2;
+	const char *str1, *str2;
+
+	if (!e)
+		return yes;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		sym_calc_value(e->left.sym);
+		return e->left.sym->curr.tri;
+	case E_AND:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_AND(val1, val2);
+	case E_OR:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_OR(val1, val2);
+	case E_NOT:
+		val1 = expr_calc_value(e->left.expr);
+		return E_NOT(val1);
+	case E_EQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? yes : no;
+	case E_UNEQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? no : yes;
+	default:
+		printf("expr_calc_value: %d?\n", e->type);
+		return no;
+	}
+}
+
+int expr_compare_type(enum expr_type t1, enum expr_type t2)
+{
+#if 0
+	return 1;
+#else
+	if (t1 == t2)
+		return 0;
+	switch (t1) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		if (t2 == E_NOT)
+			return 1;
+	case E_NOT:
+		if (t2 == E_AND)
+			return 1;
+	case E_AND:
+		if (t2 == E_OR)
+			return 1;
+	case E_OR:
+		if (t2 == E_CHOICE)
+			return 1;
+	case E_CHOICE:
+		if (t2 == 0)
+			return 1;
+	default:
+		return -1;
+	}
+	printf("[%dgt%d?]", t1, t2);
+	return 0;
+#endif
+}
+
+void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
+{
+	if (!e) {
+		fn(data, NULL, "y");
+		return;
+	}
+
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, NULL, "(");
+	switch (e->type) {
+	case E_SYMBOL:
+		if (e->left.sym->name)
+			fn(data, e->left.sym, e->left.sym->name);
+		else
+			fn(data, NULL, "<choice>");
+		break;
+	case E_NOT:
+		fn(data, NULL, "!");
+		expr_print(e->left.expr, fn, data, E_NOT);
+		break;
+	case E_EQUAL:
+		fn(data, e->left.sym, e->left.sym->name);
+		fn(data, NULL, "=");
+		fn(data, e->right.sym, e->right.sym->name);
+		break;
+	case E_UNEQUAL:
+		fn(data, e->left.sym, e->left.sym->name);
+		fn(data, NULL, "!=");
+		fn(data, e->right.sym, e->right.sym->name);
+		break;
+	case E_OR:
+		expr_print(e->left.expr, fn, data, E_OR);
+		fn(data, NULL, " || ");
+		expr_print(e->right.expr, fn, data, E_OR);
+		break;
+	case E_AND:
+		expr_print(e->left.expr, fn, data, E_AND);
+		fn(data, NULL, " && ");
+		expr_print(e->right.expr, fn, data, E_AND);
+		break;
+	case E_CHOICE:
+		fn(data, e->right.sym, e->right.sym->name);
+		if (e->left.expr) {
+			fn(data, NULL, " ^ ");
+			expr_print(e->left.expr, fn, data, E_CHOICE);
+		}
+		break;
+	case E_RANGE:
+		fn(data, NULL, "[");
+		fn(data, e->left.sym, e->left.sym->name);
+		fn(data, NULL, " ");
+		fn(data, e->right.sym, e->right.sym->name);
+		fn(data, NULL, "]");
+		break;
+	default:
+	  {
+		char buf[32];
+		sprintf(buf, "<unknown type %d>", e->type);
+		fn(data, NULL, buf);
+		break;
+	  }
+	}
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, NULL, ")");
+}
+
+static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
+{
+	fwrite(str, strlen(str), 1, data);
+}
+
+void expr_fprint(struct expr *e, FILE *out)
+{
+	expr_print(e, expr_print_file_helper, out, E_NONE);
+}
+
+static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
+{
+	str_append((struct gstr*)data, str);
+}
+
+void expr_gstr_print(struct expr *e, struct gstr *gs)
+{
+	expr_print(e, expr_print_gstr_helper, gs, E_NONE);
+}
diff --git a/kconfig/expr.h b/kconfig/expr.h
new file mode 100644
index 00000000..6084525f
--- /dev/null
+++ b/kconfig/expr.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef EXPR_H
+#define EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+struct file {
+	struct file *next;
+	struct file *parent;
+	char *name;
+	int lineno;
+	int flags;
+};
+
+#define FILE_BUSY		0x0001
+#define FILE_SCANNED		0x0002
+#define FILE_PRINTED		0x0004
+
+typedef enum tristate {
+	no, mod, yes
+} tristate;
+
+enum expr_type {
+	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
+};
+
+union expr_data {
+	struct expr *expr;
+	struct symbol *sym;
+};
+
+struct expr {
+	enum expr_type type;
+	union expr_data left, right;
+};
+
+#define E_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
+#define E_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
+#define E_NOT(dep)		(2-(dep))
+
+struct expr_value {
+	struct expr *expr;
+	tristate tri;
+};
+
+struct symbol_value {
+	void *val;
+	tristate tri;
+};
+
+enum symbol_type {
+	S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
+};
+
+enum {
+	S_DEF_USER,		/* main user value */
+	S_DEF_AUTO,
+};
+
+struct symbol {
+	struct symbol *next;
+	char *name;
+	char *help;
+	enum symbol_type type;
+	struct symbol_value curr;
+	struct symbol_value def[4];
+	tristate visible;
+	int flags;
+	struct property *prop;
+	struct expr *dep, *dep2;
+	struct expr_value rev_dep;
+};
+
+#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define SYMBOL_CONST		0x0001
+#define SYMBOL_CHECK		0x0008
+#define SYMBOL_CHOICE		0x0010
+#define SYMBOL_CHOICEVAL	0x0020
+#define SYMBOL_PRINTED		0x0040
+#define SYMBOL_VALID		0x0080
+#define SYMBOL_OPTIONAL		0x0100
+#define SYMBOL_WRITE		0x0200
+#define SYMBOL_CHANGED		0x0400
+#define SYMBOL_AUTO		0x1000
+#define SYMBOL_CHECKED		0x2000
+#define SYMBOL_WARNED		0x8000
+#define SYMBOL_DEF		0x10000
+#define SYMBOL_DEF_USER		0x10000
+#define SYMBOL_DEF_AUTO		0x20000
+#define SYMBOL_DEF3		0x40000
+#define SYMBOL_DEF4		0x80000
+
+#define SYMBOL_MAXLENGTH	256
+#define SYMBOL_HASHSIZE		257
+#define SYMBOL_HASHMASK		0xff
+
+enum prop_type {
+	P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
+};
+
+struct property {
+	struct property *next;
+	struct symbol *sym;
+	enum prop_type type;
+	const char *text;
+	struct expr_value visible;
+	struct expr *expr;
+	struct menu *menu;
+	struct file *file;
+	int lineno;
+};
+
+#define for_all_properties(sym, st, tok) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->type == (tok))
+#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
+#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->text)
+
+struct menu {
+	struct menu *next;
+	struct menu *parent;
+	struct menu *list;
+	struct symbol *sym;
+	struct property *prompt;
+	struct expr *dep;
+	unsigned int flags;
+	//char *help;
+	struct file *file;
+	int lineno;
+	void *data;
+};
+
+#define MENU_CHANGED		0x0001
+#define MENU_ROOT		0x0002
+
+#ifndef SWIG
+
+extern struct file *file_list;
+extern struct file *current_file;
+struct file *lookup_file(const char *name);
+
+extern struct symbol symbol_yes, symbol_no, symbol_mod;
+extern struct symbol *modules_sym;
+extern struct symbol *sym_defconfig_list;
+extern int cdebug;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
+struct expr *expr_copy(struct expr *org);
+void expr_free(struct expr *e);
+int expr_eq(struct expr *e1, struct expr *e2);
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+tristate expr_calc_value(struct expr *e);
+struct expr *expr_eliminate_yn(struct expr *e);
+struct expr *expr_trans_bool(struct expr *e);
+struct expr *expr_eliminate_dups(struct expr *e);
+struct expr *expr_transform(struct expr *e);
+int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
+
+void expr_fprint(struct expr *e, FILE *out);
+struct gstr; /* forward */
+void expr_gstr_print(struct expr *e, struct gstr *gs);
+
+static inline int expr_is_yes(struct expr *e)
+{
+	return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+	return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */
diff --git a/kconfig/lex.zconf.c_shipped b/kconfig/lex.zconf.c_shipped
new file mode 100644
index 00000000..800f8c71
--- /dev/null
+++ b/kconfig/lex.zconf.c_shipped
@@ -0,0 +1,2350 @@
+
+#line 3 "scripts/kconfig/lex.zconf.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 33
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE zconfrestart(zconfin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int zconfleng;
+
+extern FILE *zconfin, *zconfout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via zconfrestart()), so that the user can continue scanning by
+	 * just pointing zconfin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when zconftext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int zconfleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 0;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow zconfwrap()'s to do buffer switches
+ * instead of setting up a fresh zconfin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void zconfrestart (FILE *input_file  );
+void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size  );
+void zconf_delete_buffer (YY_BUFFER_STATE b  );
+void zconf_flush_buffer (YY_BUFFER_STATE b  );
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void zconfpop_buffer_state (void );
+
+static void zconfensure_buffer_stack (void );
+static void zconf_load_buffer_state (void );
+static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len  );
+
+void *zconfalloc (yy_size_t  );
+void *zconfrealloc (void *,yy_size_t  );
+void zconffree (void *  );
+
+#define yy_new_buffer zconf_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define zconfwrap() 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int zconflineno;
+
+int zconflineno = 1;
+
+extern char *zconftext;
+#define yytext_ptr zconftext
+static yyconst flex_int16_t yy_nxt[][17] =
+    {
+    {
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   16
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   16
+
+    },
+
+    {
+       11,   19,   20,   21,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19
+    },
+
+    {
+       11,   19,   20,   21,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19
+    },
+
+    {
+       11,   22,   22,   23,   22,   24,   22,   22,   24,   22,
+       22,   22,   22,   22,   22,   25,   22
+    },
+
+    {
+       11,   22,   22,   23,   22,   24,   22,   22,   24,   22,
+       22,   22,   22,   22,   22,   25,   22
+    },
+
+    {
+       11,   26,   26,   27,   28,   29,   30,   31,   29,   32,
+       33,   34,   35,   35,   36,   37,   38
+
+    },
+
+    {
+       11,   26,   26,   27,   28,   29,   30,   31,   29,   32,
+       33,   34,   35,   35,   36,   37,   38
+    },
+
+    {
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11
+    },
+
+    {
+       11,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12
+    },
+
+    {
+       11,  -13,   39,   40,  -13,  -13,   41,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13
+    },
+
+    {
+       11,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14
+
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16
+    },
+
+    {
+       11,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17
+    },
+
+    {
+       11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,   44,  -18,  -18,  -18
+    },
+
+    {
+       11,   45,   45,  -19,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45
+
+    },
+
+    {
+       11,  -20,   46,   47,  -20,  -20,  -20,  -20,  -20,  -20,
+      -20,  -20,  -20,  -20,  -20,  -20,  -20
+    },
+
+    {
+       11,   48,  -21,  -21,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48
+    },
+
+    {
+       11,   49,   49,   50,   49,  -22,   49,   49,  -22,   49,
+       49,   49,   49,   49,   49,  -22,   49
+    },
+
+    {
+       11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,  -23,  -23,  -23,  -23
+    },
+
+    {
+       11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
+      -24,  -24,  -24,  -24,  -24,  -24,  -24
+
+    },
+
+    {
+       11,   51,   51,   52,   51,   51,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51
+    },
+
+    {
+       11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,  -26,  -26,  -26,  -26
+    },
+
+    {
+       11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,  -27,  -27,  -27,  -27
+    },
+
+    {
+       11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,  -28,   53,  -28,  -28
+    },
+
+    {
+       11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29
+
+    },
+
+    {
+       11,   54,   54,  -30,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+    },
+
+    {
+       11,  -31,  -31,  -31,  -31,  -31,  -31,   55,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31
+    },
+
+    {
+       11,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32
+    },
+
+    {
+       11,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
+      -33,  -33,  -33,  -33,  -33,  -33,  -33
+    },
+
+    {
+       11,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
+      -34,   56,   57,   57,  -34,  -34,  -34
+
+    },
+
+    {
+       11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,   57,   57,   57,  -35,  -35,  -35
+    },
+
+    {
+       11,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36
+    },
+
+    {
+       11,  -37,  -37,   58,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37
+    },
+
+    {
+       11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,   59
+    },
+
+    {
+       11,  -39,   39,   40,  -39,  -39,   41,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39
+
+    },
+
+    {
+       11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,   42,   42,   43,   42,   42,   42,   42,   42,   42,
+       42,   42,   42,   42,   42,   42,   42
+    },
+
+    {
+       11,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43
+    },
+
+    {
+       11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,   44,  -44,  -44,  -44
+
+    },
+
+    {
+       11,   45,   45,  -45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45
+    },
+
+    {
+       11,  -46,   46,   47,  -46,  -46,  -46,  -46,  -46,  -46,
+      -46,  -46,  -46,  -46,  -46,  -46,  -46
+    },
+
+    {
+       11,   48,  -47,  -47,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48
+    },
+
+    {
+       11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48
+    },
+
+    {
+       11,   49,   49,   50,   49,  -49,   49,   49,  -49,   49,
+       49,   49,   49,   49,   49,  -49,   49
+
+    },
+
+    {
+       11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,  -50,  -50,  -50,  -50,  -50,  -50
+    },
+
+    {
+       11,  -51,  -51,   52,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,  -51,  -51,  -51,  -51,  -51,  -51
+    },
+
+    {
+       11,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52
+    },
+
+    {
+       11,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53
+    },
+
+    {
+       11,   54,   54,  -54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+
+    },
+
+    {
+       11,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
+      -55,  -55,  -55,  -55,  -55,  -55,  -55
+    },
+
+    {
+       11,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,
+      -56,   60,   57,   57,  -56,  -56,  -56
+    },
+
+    {
+       11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,   57,   57,   57,  -57,  -57,  -57
+    },
+
+    {
+       11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+      -58,  -58,  -58,  -58,  -58,  -58,  -58
+    },
+
+    {
+       11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
+      -59,  -59,  -59,  -59,  -59,  -59,  -59
+
+    },
+
+    {
+       11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+      -60,   57,   57,   57,  -60,  -60,  -60
+    },
+
+    } ;
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up zconftext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	zconfleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 33
+#define YY_END_OF_BUFFER 34
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[61] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       34,    5,    4,    2,    3,    7,    8,    6,   32,   29,
+       31,   24,   28,   27,   26,   22,   17,   13,   16,   20,
+       22,   11,   12,   19,   19,   14,   22,   22,    4,    2,
+        3,    3,    1,    6,   32,   29,   31,   30,   24,   23,
+       26,   25,   15,   20,    9,   19,   19,   21,   10,   18
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
+       10,    1,    1,    1,   11,   12,   12,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,    1,    1,    1,
+       14,    1,    1,    1,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+        1,   15,    1,    1,   13,    1,   13,   13,   13,   13,
+
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,    1,   16,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+extern int zconf_flex_debug;
+int zconf_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *zconftext;
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+static struct {
+	struct file *file;
+	int lineno;
+} current_pos;
+
+static char *text;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static void zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_size = 0;
+	*text = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		new_size += START_STRSIZE - 1;
+		new_size &= -START_STRSIZE;
+		text = realloc(text, new_size);
+		text_asize = new_size;
+	}
+	memcpy(text + text_size, str, size);
+	text_size += size;
+	text[text_size] = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+
+#define INITIAL 0
+#define COMMAND 1
+#define HELP 2
+#define STRING 3
+#define PARAM 4
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals (void );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int zconfwrap (void );
+#else
+extern int zconfwrap (void );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  );
+    
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	errno=0; \
+	while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
+	{ \
+		if( errno != EINTR) \
+		{ \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+			break; \
+		} \
+		errno=0; \
+		clearerr(zconfin); \
+	}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int zconflex (void);
+
+#define YY_DECL int zconflex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after zconftext and zconfleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+    
+	int str = 0;
+	int ts, i;
+
+	if ( !(yy_init) )
+		{
+		(yy_init) = 1;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! zconfin )
+			zconfin = stdin;
+
+		if ( ! zconfout )
+			zconfout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			zconfensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				zconf_create_buffer(zconfin,YY_BUF_SIZE );
+		}
+
+		zconf_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of zconftext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+yy_match:
+		while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)]  ]) > 0 )
+			++yy_cp;
+
+		yy_current_state = -yy_current_state;
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+{
+	current_file->lineno++;
+	return T_EOL;
+}
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+{
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+{
+	unput(zconftext[0]);
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+
+case 6:
+YY_RULE_SETUP
+{
+		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		BEGIN(PARAM);
+		current_pos.file = current_file;
+		current_pos.lineno = current_file->lineno;
+		if (id && id->flags & TF_COMMAND) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 8:
+/* rule 8 can match eol */
+YY_RULE_SETUP
+{
+		BEGIN(INITIAL);
+		current_file->lineno++;
+		return T_EOL;
+	}
+	YY_BREAK
+
+case 9:
+YY_RULE_SETUP
+return T_AND;
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+return T_OR;
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+return T_OPEN_PAREN;
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+return T_CLOSE_PAREN;
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+return T_NOT;
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+return T_EQUAL;
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+return T_UNEQUAL;
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+{
+		str = zconftext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+{
+		struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
+		if (id && id->flags & TF_PARAM) {
+			zconflval.id = id;
+			return id->token;
+		}
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+/* comment */
+	YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+current_file->lineno++;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+
+	YY_BREAK
+case YY_STATE_EOF(PARAM):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 23:
+/* rule 23 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+	}
+	YY_BREAK
+case 25:
+/* rule 25 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+	}
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+{
+		if (str == zconftext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(zconftext, 1);
+	}
+	YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	YY_BREAK
+case YY_STATE_EOF(STRING):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 29:
+YY_RULE_SETUP
+{
+		ts = 0;
+		for (i = 0; i < zconfleng; i++) {
+			if (zconftext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	YY_BREAK
+case 30:
+/* rule 30 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	YY_BREAK
+case YY_STATE_EOF(HELP):
+{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(COMMAND):
+{
+	if (current_file) {
+		zconf_endfile();
+		return T_EOL;
+	}
+	fclose(zconfin);
+	yyterminate();
+}
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+YY_FATAL_ERROR( "flex scanner jammed" );
+	YY_BREAK
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed zconfin at a new source and called
+			 * zconflex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( zconfwrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * zconftext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of zconflex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			int num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			zconfrestart(zconfin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+    
+	yy_current_state = (yy_start);
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+    
+	yy_current_state = yy_nxt[yy_current_state][1];
+	yy_is_jam = (yy_current_state <= 0);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
+
+	/* undo effects of setting up zconftext */
+	*yy_cp = (yy_hold_char);
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+    
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					zconfrestart(zconfin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( zconfwrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve zconftext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void zconfrestart  (FILE * input_file )
+{
+    
+	if ( ! YY_CURRENT_BUFFER ){
+        zconfensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            zconf_create_buffer(zconfin,YY_BUF_SIZE );
+	}
+
+	zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
+	zconf_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void zconf_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		zconfpop_buffer_state();
+	 *		zconfpush_buffer_state(new_buffer);
+     */
+	zconfensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	zconf_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (zconfwrap()) processing, but the only time this flag
+	 * is looked at is after zconfwrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void zconf_load_buffer_state  (void)
+{
+    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE zconf_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+    
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	zconf_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with zconf_create_buffer()
+ * 
+ */
+    void zconf_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		zconffree((void *) b->yy_ch_buf  );
+
+	zconffree((void *) b  );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a zconfrestart() or at EOF.
+ */
+    static void zconf_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+    
+	zconf_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then zconf_init_buffer was _probably_
+     * called from zconfrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+    
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void zconf_flush_buffer (YY_BUFFER_STATE  b )
+{
+    	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		zconf_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+    	if (new_buffer == NULL)
+		return;
+
+	zconfensure_buffer_stack();
+
+	/* This block is copied from zconf_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from zconf_switch_to_buffer. */
+	zconf_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void zconfpop_buffer_state (void)
+{
+    	if (!YY_CURRENT_BUFFER)
+		return;
+
+	zconf_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		zconf_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void zconfensure_buffer_stack (void)
+{
+	int num_to_alloc;
+    
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+		
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+				
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE zconf_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+    
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	zconf_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to zconflex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       zconf_scan_bytes() instead.
+ */
+YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
+{
+    
+	return zconf_scan_bytes(yystr,strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+    
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = _yybytes_len + 2;
+	buf = (char *) zconfalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
+
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
+
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = zconf_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+    	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		zconftext[zconfleng] = (yy_hold_char); \
+		(yy_c_buf_p) = zconftext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		zconfleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int zconfget_lineno  (void)
+{
+        
+    return zconflineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *zconfget_in  (void)
+{
+        return zconfin;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *zconfget_out  (void)
+{
+        return zconfout;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int zconfget_leng  (void)
+{
+        return zconfleng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *zconfget_text  (void)
+{
+        return zconftext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void zconfset_lineno (int  line_number )
+{
+    
+    zconflineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see zconf_switch_to_buffer
+ */
+void zconfset_in (FILE *  in_str )
+{
+        zconfin = in_str ;
+}
+
+void zconfset_out (FILE *  out_str )
+{
+        zconfout = out_str ;
+}
+
+int zconfget_debug  (void)
+{
+        return zconf_flex_debug;
+}
+
+void zconfset_debug (int  bdebug )
+{
+        zconf_flex_debug = bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from zconflex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    zconfin = stdin;
+    zconfout = stdout;
+#else
+    zconfin = (FILE *) 0;
+    zconfout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * zconflex_init()
+     */
+    return 0;
+}
+
+/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
+int zconflex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		zconf_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		zconfpop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	zconffree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * zconflex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *zconfalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *zconfrealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void zconffree (void * ptr )
+{
+	free( (char *) ptr );	/* see zconfrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	struct file *file = file_lookup(name);
+	struct buffer *buf = malloc(sizeof(*buf));
+	memset(buf, 0, sizeof(*buf));
+
+	current_buf->state = YY_CURRENT_BUFFER;
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		exit(1);
+	}
+	zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
+	buf->parent = current_buf;
+	current_buf = buf;
+
+	if (file->flags & FILE_BUSY) {
+		printf("recursive scan (%s)?\n", name);
+		exit(1);
+	}
+	if (file->flags & FILE_SCANNED) {
+		printf("file %s already scanned?\n", name);
+		exit(1);
+	}
+	file->flags |= FILE_BUSY;
+	file->lineno = 1;
+	file->parent = current_file;
+	current_file = file;
+}
+
+static void zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(zconfin);
+		zconf_delete_buffer(YY_CURRENT_BUFFER);
+		zconf_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+}
+
+int zconf_lineno(void)
+{
+	return current_pos.lineno;
+}
+
+char *zconf_curname(void)
+{
+	return current_pos.file ? current_pos.file->name : "<none>";
+}
+
diff --git a/kconfig/lkc.h b/kconfig/lkc.h
new file mode 100644
index 00000000..cf326792
--- /dev/null
+++ b/kconfig/lkc.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef LKC_H
+#define LKC_H
+
+#define PROJECT_NAME "crosstool-NG"
+
+// Make some warnings go away
+#define YYENABLE_NLS 0
+#define YYLTYPE_IS_TRIVIAL 0
+
+#include "expr.h"
+
+#ifndef KBUILD_NO_NLS
+# include <libintl.h>
+#else
+# define gettext(Msgid) ((const char *) (Msgid))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef LKC_DIRECT_LINK
+#define P(name,type,arg)	extern type name arg
+#else
+#include "lkc_defs.h"
+#define P(name,type,arg)	extern type (*name ## _p) arg
+#endif
+#include "lkc_proto.h"
+#undef P
+
+#define SRCTREE "srctree"
+
+#define PACKAGE "crosstool-NG"
+#define LOCALEDIR "/usr/share/locale"
+
+#define _(text) gettext(text)
+#define N_(text) (text)
+
+
+#define TF_COMMAND	0x0001
+#define TF_PARAM	0x0002
+#define TF_OPTION	0x0004
+
+#define T_OPT_MODULES		1
+#define T_OPT_DEFCONFIG_LIST	2
+
+struct kconf_id {
+	int name;
+	int token;
+	unsigned int flags;
+	enum symbol_type stype;
+};
+
+int zconfparse(void);
+void zconfdump(FILE *out);
+
+extern int zconfdebug;
+void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
+void zconf_initscan(const char *name);
+void zconf_nextfile(const char *name);
+int zconf_lineno(void);
+char *zconf_curname(void);
+
+/* confdata.c */
+char *conf_get_default_confname(void);
+
+/* kconfig_load.c */
+void kconfig_load(void);
+
+/* menu.c */
+void menu_init(void);
+struct menu *menu_add_menu(void);
+void menu_end_menu(void);
+void menu_add_entry(struct symbol *sym);
+void menu_end_entry(void);
+void menu_add_dep(struct expr *dep);
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
+struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
+void menu_add_option(int token, char *arg);
+void menu_finalize(struct menu *parent);
+void menu_set_type(int type);
+
+/* util.c */
+struct file *file_lookup(const char *name);
+int file_write_dep(const char *name);
+
+struct gstr {
+	size_t len;
+	char  *s;
+};
+struct gstr str_new(void);
+struct gstr str_assign(const char *s);
+void str_free(struct gstr *gs);
+void str_append(struct gstr *gs, const char *s);
+void str_printf(struct gstr *gs, const char *fmt, ...);
+const char *str_get(struct gstr *gs);
+
+/* symbol.c */
+void sym_init(void);
+void sym_clear_all_valid(void);
+void sym_set_all_changed(void);
+void sym_set_changed(struct symbol *sym);
+struct symbol *sym_check_deps(struct symbol *sym);
+struct property *prop_alloc(enum prop_type type, struct symbol *sym);
+struct symbol *prop_get_symbol(struct property *prop);
+
+static inline tristate sym_get_tristate_value(struct symbol *sym)
+{
+	return sym->curr.tri;
+}
+
+
+static inline struct symbol *sym_get_choice_value(struct symbol *sym)
+{
+	return (struct symbol *)sym->curr.val;
+}
+
+static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
+{
+	return sym_set_tristate_value(chval, yes);
+}
+
+static inline bool sym_is_choice(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICE ? true : false;
+}
+
+static inline bool sym_is_choice_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICEVAL ? true : false;
+}
+
+static inline bool sym_is_optional(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_OPTIONAL ? true : false;
+}
+
+static inline bool sym_has_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_DEF_USER ? true : false;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LKC_H */
diff --git a/kconfig/lkc_proto.h b/kconfig/lkc_proto.h
new file mode 100644
index 00000000..a263746c
--- /dev/null
+++ b/kconfig/lkc_proto.h
@@ -0,0 +1,42 @@
+
+/* confdata.c */
+P(conf_parse,void,(const char *name));
+P(conf_read,int,(const char *name));
+P(conf_read_simple,int,(const char *name, int));
+P(conf_write,int,(const char *name));
+P(conf_write_autoconf,int,(void));
+
+/* menu.c */
+P(rootmenu,struct menu,);
+
+P(menu_is_visible,bool,(struct menu *menu));
+P(menu_get_prompt,const char *,(struct menu *menu));
+P(menu_get_root_menu,struct menu *,(struct menu *menu));
+P(menu_get_parent_menu,struct menu *,(struct menu *menu));
+
+/* symbol.c */
+P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
+P(sym_change_count,int,);
+
+P(sym_lookup,struct symbol *,(const char *name, int isconst));
+P(sym_find,struct symbol *,(const char *name));
+P(sym_re_search,struct symbol **,(const char *pattern));
+P(sym_type_name,const char *,(enum symbol_type type));
+P(sym_calc_value,void,(struct symbol *sym));
+P(sym_get_type,enum symbol_type,(struct symbol *sym));
+P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
+P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
+P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
+P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
+P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
+P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
+P(sym_is_changable,bool,(struct symbol *sym));
+P(sym_get_choice_prop,struct property *,(struct symbol *sym));
+P(sym_get_default_prop,struct property *,(struct symbol *sym));
+P(sym_get_string_value,const char *,(struct symbol *sym));
+
+P(prop_get_type_name,const char *,(enum prop_type type));
+
+/* expr.c */
+P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
+P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken));
diff --git a/kconfig/lxdialog/BIG.FAT.WARNING b/kconfig/lxdialog/BIG.FAT.WARNING
new file mode 100644
index 00000000..a8999d82
--- /dev/null
+++ b/kconfig/lxdialog/BIG.FAT.WARNING
@@ -0,0 +1,4 @@
+This is NOT the official version of dialog.  This version has been
+significantly modified from the original.  It is for use by the Linux
+kernel configuration script.  Please do not bother Savio Lam with 
+questions about this program.
diff --git a/kconfig/lxdialog/check-lxdialog.sh b/kconfig/lxdialog/check-lxdialog.sh
new file mode 100644
index 00000000..120d624e
--- /dev/null
+++ b/kconfig/lxdialog/check-lxdialog.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+# Check ncurses compatibility
+
+# What library to link
+ldflags()
+{
+	$cc -print-file-name=libncursesw.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lncursesw'
+		exit
+	fi
+	$cc -print-file-name=libncurses.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lncurses'
+		exit
+	fi
+	$cc -print-file-name=libcurses.so | grep -q /
+	if [ $? -eq 0 ]; then
+		echo '-lcurses'
+		exit
+	fi
+	exit 1
+}
+
+# Where is ncurses.h?
+ccflags()
+{
+	if [ -f /usr/include/ncurses/ncurses.h ]; then
+		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'
+	elif [ -f /usr/include/ncurses/curses.h ]; then
+		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"'
+	elif [ -f /usr/include/ncurses.h ]; then
+		echo '-DCURSES_LOC="<ncurses.h>"'
+	else
+		echo '-DCURSES_LOC="<curses.h>"'
+	fi
+}
+
+# Temp file, try to clean up after us
+tmp=.lxdialog.tmp
+trap "rm -f $tmp" 0 1 2 3 15
+
+# Check if we can link to ncurses
+check() {
+	echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null
+	if [ $? != 0 ]; then
+		echo " *** Unable to find the ncurses libraries."          1>&2
+		echo " *** make menuconfig require the ncurses libraries"  1>&2
+		echo " *** "                                               1>&2
+		echo " *** Install ncurses (ncurses-devel) and try again"  1>&2
+		echo " *** "                                               1>&2
+		exit 1
+	fi
+}
+
+usage() {
+	printf "Usage: $0 [-check compiler options|-header|-library]\n"
+}
+
+if [ $# == 0 ]; then
+	usage
+	exit 1
+fi
+
+cc=""
+case "$1" in
+	"-check")
+		shift
+		cc="$@"
+		check
+		;;
+	"-ccflags")
+		ccflags
+		;;
+	"-ldflags")
+		shift
+		cc="$@"
+		ldflags
+		;;
+	"*")
+		usage
+		exit 1
+		;;
+esac
diff --git a/kconfig/lxdialog/checklist.c b/kconfig/lxdialog/checklist.c
new file mode 100644
index 00000000..cf697080
--- /dev/null
+++ b/kconfig/lxdialog/checklist.c
@@ -0,0 +1,325 @@
+/*
+ *  checklist.c -- implements the checklist box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *     Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
+ *     Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static int list_width, check_x, item_x;
+
+/*
+ * Print list item
+ */
+static void print_item(WINDOW * win, int choice, int selected)
+{
+	int i;
+
+	/* Clear 'residue' of last item */
+	wattrset(win, dlg.menubox.atr);
+	wmove(win, choice, 0);
+	for (i = 0; i < list_width; i++)
+		waddch(win, ' ');
+
+	wmove(win, choice, check_x);
+	wattrset(win, selected ? dlg.check_selected.atr
+		 : dlg.check.atr);
+	wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
+
+	wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
+	mvwaddch(win, choice, item_x, item_str()[0]);
+	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
+	waddstr(win, (char *)item_str() + 1);
+	if (selected) {
+		wmove(win, choice, check_x + 1);
+		wrefresh(win);
+	}
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
+	     int y, int x, int height)
+{
+	wmove(win, y, x);
+
+	if (scroll > 0) {
+		wattrset(win, dlg.uarrow.atr);
+		waddch(win, ACS_UARROW);
+		waddstr(win, "(-)");
+	} else {
+		wattrset(win, dlg.menubox.atr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	y = y + height + 1;
+	wmove(win, y, x);
+
+	if ((height < item_no) && (scroll + choice < item_no - 1)) {
+		wattrset(win, dlg.darrow.atr);
+		waddch(win, ACS_DARROW);
+		waddstr(win, "(+)");
+	} else {
+		wattrset(win, dlg.menubox_border.atr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+}
+
+/*
+ *  Display the termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 11;
+	int y = height - 2;
+
+	print_button(dialog, "Select", y, x, selected == 0);
+	print_button(dialog, " Help ", y, x + 14, selected == 1);
+
+	wmove(dialog, y, x + 1 + 14 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * in the style of radiolist (only one option turned on at a time).
+ */
+int dialog_checklist(const char *title, const char *prompt, int height,
+		     int width, int list_height)
+{
+	int i, x, y, box_x, box_y;
+	int key = 0, button = 0, choice = 0, scroll = 0, max_choice;
+	WINDOW *dialog, *list;
+
+	/* which item to highlight */
+	item_foreach() {
+		if (item_is_tag('X'))
+			choice = item_n();
+		if (item_is_selected()) {
+			choice = item_n();
+			break;
+		}
+	}
+
+do_resize:
+	if (getmaxy(stdscr) < (height + 6))
+		return -ERRDISPLAYTOOSMALL;
+	if (getmaxx(stdscr) < (width + 6))
+		return -ERRDISPLAYTOOSMALL;
+
+	max_choice = MIN(list_height, item_count());
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width,
+		 dlg.dialog.atr, dlg.border.atr);
+	wattrset(dialog, dlg.border.atr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dlg.dialog.atr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dlg.dialog.atr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	list_width = width - 6;
+	box_y = height - list_height - 5;
+	box_x = (width - list_width) / 2 - 1;
+
+	/* create new window for the list */
+	list = subwin(dialog, list_height, list_width, y + box_y + 1,
+	              x + box_x + 1);
+
+	keypad(list, TRUE);
+
+	/* draw a box around the list items */
+	draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
+	         dlg.menubox_border.atr, dlg.menubox.atr);
+
+	/* Find length of longest item in order to center checklist */
+	check_x = 0;
+	item_foreach()
+		check_x = MAX(check_x, strlen(item_str()) + 4);
+
+	check_x = (list_width - check_x) / 2;
+	item_x = check_x + 4;
+
+	if (choice >= list_height) {
+		scroll = choice - list_height + 1;
+		choice -= scroll;
+	}
+
+	/* Print the list */
+	for (i = 0; i < max_choice; i++) {
+		item_set(scroll + i);
+		print_item(list, i, i == choice);
+	}
+
+	print_arrows(dialog, choice, item_count(), scroll,
+		     box_y, box_x + check_x + 5, list_height);
+
+	print_buttons(dialog, height, width, 0);
+
+	wnoutrefresh(dialog);
+	wnoutrefresh(list);
+	doupdate();
+
+	while (key != KEY_ESC) {
+		key = wgetch(dialog);
+
+		for (i = 0; i < max_choice; i++) {
+			item_set(i + scroll);
+			if (toupper(key) == toupper(item_str()[0]))
+				break;
+		}
+
+		if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
+		    key == '+' || key == '-') {
+			if (key == KEY_UP || key == '-') {
+				if (!choice) {
+					if (!scroll)
+						continue;
+					/* Scroll list down */
+					if (list_height > 1) {
+						/* De-highlight current first item */
+						item_set(scroll);
+						print_item(list, 0, FALSE);
+						scrollok(list, TRUE);
+						wscrl(list, -1);
+						scrollok(list, FALSE);
+					}
+					scroll--;
+					item_set(scroll);
+					print_item(list, 0, TRUE);
+					print_arrows(dialog, choice, item_count(),
+						     scroll, box_y, box_x + check_x + 5, list_height);
+
+					wnoutrefresh(dialog);
+					wrefresh(list);
+
+					continue;	/* wait for another key press */
+				} else
+					i = choice - 1;
+			} else if (key == KEY_DOWN || key == '+') {
+				if (choice == max_choice - 1) {
+					if (scroll + choice >= item_count() - 1)
+						continue;
+					/* Scroll list up */
+					if (list_height > 1) {
+						/* De-highlight current last item before scrolling up */
+						item_set(scroll + max_choice - 1);
+						print_item(list,
+							    max_choice - 1,
+							    FALSE);
+						scrollok(list, TRUE);
+						wscrl(list, 1);
+						scrollok(list, FALSE);
+					}
+					scroll++;
+					item_set(scroll + max_choice - 1);
+					print_item(list, max_choice - 1, TRUE);
+
+					print_arrows(dialog, choice, item_count(),
+						     scroll, box_y, box_x + check_x + 5, list_height);
+
+					wnoutrefresh(dialog);
+					wrefresh(list);
+
+					continue;	/* wait for another key press */
+				} else
+					i = choice + 1;
+			}
+			if (i != choice) {
+				/* De-highlight current item */
+				item_set(scroll + choice);
+				print_item(list, choice, FALSE);
+				/* Highlight new item */
+				choice = i;
+				item_set(scroll + choice);
+				print_item(list, choice, TRUE);
+				wnoutrefresh(dialog);
+				wrefresh(list);
+			}
+			continue;	/* wait for another key press */
+		}
+		switch (key) {
+		case 'H':
+		case 'h':
+		case '?':
+			button = 1;
+			/* fall-through */
+		case 'S':
+		case 's':
+		case ' ':
+		case '\n':
+			item_foreach()
+				item_set_selected(0);
+			item_set(scroll + choice);
+			item_set_selected(1);
+			delwin(list);
+			delwin(dialog);
+			return button;
+		case TAB:
+		case KEY_LEFT:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			    ? 1 : (button > 1 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(dialog);
+			break;
+		case 'X':
+		case 'x':
+			key = KEY_ESC;
+			break;
+		case KEY_ESC:
+			key = on_key_esc(dialog);
+			break;
+		case KEY_RESIZE:
+			delwin(list);
+			delwin(dialog);
+			on_key_resize();
+			goto do_resize;
+		}
+
+		/* Now, update everything... */
+		doupdate();
+	}
+	delwin(list);
+	delwin(dialog);
+	return key;		/* ESC pressed */
+}
diff --git a/kconfig/lxdialog/dialog.h b/kconfig/lxdialog/dialog.h
new file mode 100644
index 00000000..fd695e10
--- /dev/null
+++ b/kconfig/lxdialog/dialog.h
@@ -0,0 +1,224 @@
+/*
+ *  dialog.h -- common declarations for all dialog modules
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#ifdef __sun__
+#define CURS_MACROS
+#endif
+#include CURSES_LOC
+
+/*
+ * Colors in ncurses 1.9.9e do not work properly since foreground and
+ * background colors are OR'd rather than separately masked.  This version
+ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
+ * with standard curses.  The simplest fix (to make this work with standard
+ * curses) uses the wbkgdset() function, not used in the original hack.
+ * Turn it off if we're building with 1.9.9e, since it just confuses things.
+ */
+#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
+#define OLD_NCURSES 1
+#undef  wbkgdset
+#define wbkgdset(w,p)		/*nothing */
+#else
+#define OLD_NCURSES 0
+#endif
+
+#define TR(params) _tracef params
+
+#define KEY_ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+
+/* error return codes */
+#define ERRDISPLAYTOOSMALL (KEY_MAX + 1)
+
+/*
+ *   Color definitions
+ */
+struct dialog_color {
+	chtype atr;	/* Color attribute */
+	int fg;		/* foreground */
+	int bg;		/* background */
+	int hl;		/* highlight this item */
+};
+
+struct dialog_info {
+	const char *backtitle;
+	struct dialog_color screen;
+	struct dialog_color shadow;
+	struct dialog_color dialog;
+	struct dialog_color title;
+	struct dialog_color border;
+	struct dialog_color button_active;
+	struct dialog_color button_inactive;
+	struct dialog_color button_key_active;
+	struct dialog_color button_key_inactive;
+	struct dialog_color button_label_active;
+	struct dialog_color button_label_inactive;
+	struct dialog_color inputbox;
+	struct dialog_color inputbox_border;
+	struct dialog_color searchbox;
+	struct dialog_color searchbox_title;
+	struct dialog_color searchbox_border;
+	struct dialog_color position_indicator;
+	struct dialog_color menubox;
+	struct dialog_color menubox_border;
+	struct dialog_color item;
+	struct dialog_color item_selected;
+	struct dialog_color tag;
+	struct dialog_color tag_selected;
+	struct dialog_color tag_key;
+	struct dialog_color tag_key_selected;
+	struct dialog_color check;
+	struct dialog_color check_selected;
+	struct dialog_color uarrow;
+	struct dialog_color darrow;
+};
+
+/*
+ * Global variables
+ */
+extern struct dialog_info dlg;
+extern char dialog_input_result[];
+
+/*
+ * Function prototypes
+ */
+
+/* item list as used by checklist and menubox */
+void item_reset(void);
+void item_make(const char *fmt, ...);
+void item_add_str(const char *fmt, ...);
+void item_set_tag(char tag);
+void item_set_data(void *p);
+void item_set_selected(int val);
+int item_activate_selected(void);
+void *item_data(void);
+char item_tag(void);
+
+/* item list manipulation for lxdialog use */
+#define MAXITEMSTR 200
+struct dialog_item {
+	char str[MAXITEMSTR];	/* promtp displayed */
+	char tag;
+	void *data;	/* pointer to menu item - used by menubox+checklist */
+	int selected;	/* Set to 1 by dialog_*() function if selected. */
+};
+
+/* list of lialog_items */
+struct dialog_list {
+	struct dialog_item node;
+	struct dialog_list *next;
+};
+
+extern struct dialog_list *item_cur;
+extern struct dialog_list item_nil;
+extern struct dialog_list *item_head;
+
+int item_count(void);
+void item_set(int n);
+int item_n(void);
+const char *item_str(void);
+int item_is_selected(void);
+int item_is_tag(char tag);
+#define item_foreach() \
+	for (item_cur = item_head ? item_head: item_cur; \
+	     item_cur && (item_cur != &item_nil); item_cur = item_cur->next)
+
+/* generic key handlers */
+int on_key_esc(WINDOW *win);
+int on_key_resize(void);
+
+void init_dialog(const char *backtitle);
+void reset_dialog(void);
+void end_dialog(void);
+void attr_clear(WINDOW * win, int height, int width, chtype attr);
+void dialog_clear(void);
+void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
+void print_button(WINDOW * win, const char *label, int y, int x, int selected);
+void print_title(WINDOW *dialog, const char *title, int width);
+void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box,
+	      chtype border);
+void draw_shadow(WINDOW * win, int y, int x, int height, int width);
+
+int first_alpha(const char *string, const char *exempt);
+int dialog_yesno(const char *title, const char *prompt, int height, int width);
+int dialog_msgbox(const char *title, const char *prompt, int height,
+		  int width, int pause);
+int dialog_textbox(const char *title, const char *file, int height, int width);
+int dialog_menu(const char *title, const char *prompt,
+		const void *selected, int *s_scroll);
+int dialog_checklist(const char *title, const char *prompt, int height,
+		     int width, int list_height);
+extern char dialog_input_result[];
+int dialog_inputbox(const char *title, const char *prompt, int height,
+		    int width, const char *init);
+
+/*
+ * This is the base for fictitious keys, which activate
+ * the buttons.
+ *
+ * Mouse-generated keys are the following:
+ *   -- the first 32 are used as numbers, in addition to '0'-'9'
+ *   -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
+ *   -- uppercase chars are used to invoke the button (M_EVENT + 'O')
+ */
+#define M_EVENT (KEY_MAX+1)
diff --git a/kconfig/lxdialog/inputbox.c b/kconfig/lxdialog/inputbox.c
new file mode 100644
index 00000000..05e72066
--- /dev/null
+++ b/kconfig/lxdialog/inputbox.c
@@ -0,0 +1,238 @@
+/*
+ *  inputbox.c -- implements the input box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+char dialog_input_result[MAX_LEN + 1];
+
+/*
+ *  Print the termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 11;
+	int y = height - 2;
+
+	print_button(dialog, "  Ok  ", y, x, selected == 0);
+	print_button(dialog, " Help ", y, x + 14, selected == 1);
+
+	wmove(dialog, y, x + 1 + 14 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int dialog_inputbox(const char *title, const char *prompt, int height, int width,
+                    const char *init)
+{
+	int i, x, y, box_y, box_x, box_width;
+	int input_x = 0, scroll = 0, key = 0, button = -1;
+	char *instr = dialog_input_result;
+	WINDOW *dialog;
+
+	if (!init)
+		instr[0] = '\0';
+	else
+		strcpy(instr, init);
+
+do_resize:
+	if (getmaxy(stdscr) <= (height - 2))
+		return -ERRDISPLAYTOOSMALL;
+	if (getmaxx(stdscr) <= (width - 2))
+		return -ERRDISPLAYTOOSMALL;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width,
+		 dlg.dialog.atr, dlg.border.atr);
+	wattrset(dialog, dlg.border.atr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dlg.dialog.atr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dlg.dialog.atr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	/* Draw the input field box */
+	box_width = width - 6;
+	getyx(dialog, y, x);
+	box_y = y + 2;
+	box_x = (width - box_width) / 2;
+	draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
+		 dlg.border.atr, dlg.dialog.atr);
+
+	print_buttons(dialog, height, width, 0);
+
+	/* Set up the initial value */
+	wmove(dialog, box_y, box_x);
+	wattrset(dialog, dlg.inputbox.atr);
+
+	input_x = strlen(instr);
+
+	if (input_x >= box_width) {
+		scroll = input_x - box_width + 1;
+		input_x = box_width - 1;
+		for (i = 0; i < box_width - 1; i++)
+			waddch(dialog, instr[scroll + i]);
+	} else {
+		waddstr(dialog, instr);
+	}
+
+	wmove(dialog, box_y, box_x + input_x);
+
+	wrefresh(dialog);
+
+	while (key != KEY_ESC) {
+		key = wgetch(dialog);
+
+		if (button == -1) {	/* Input box selected */
+			switch (key) {
+			case TAB:
+			case KEY_UP:
+			case KEY_DOWN:
+				break;
+			case KEY_LEFT:
+				continue;
+			case KEY_RIGHT:
+				continue;
+			case KEY_BACKSPACE:
+			case 127:
+				if (input_x || scroll) {
+					wattrset(dialog, dlg.inputbox.atr);
+					if (!input_x) {
+						scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
+						wmove(dialog, box_y, box_x);
+						for (i = 0; i < box_width; i++)
+							waddch(dialog,
+							       instr[scroll + input_x + i] ?
+							       instr[scroll + input_x + i] : ' ');
+						input_x = strlen(instr) - scroll;
+					} else
+						input_x--;
+					instr[scroll + input_x] = '\0';
+					mvwaddch(dialog, box_y, input_x + box_x, ' ');
+					wmove(dialog, box_y, input_x + box_x);
+					wrefresh(dialog);
+				}
+				continue;
+			default:
+				if (key < 0x100 && isprint(key)) {
+					if (scroll + input_x < MAX_LEN) {
+						wattrset(dialog, dlg.inputbox.atr);
+						instr[scroll + input_x] = key;
+						instr[scroll + input_x + 1] = '\0';
+						if (input_x == box_width - 1) {
+							scroll++;
+							wmove(dialog, box_y, box_x);
+							for (i = 0; i < box_width - 1; i++)
+								waddch(dialog, instr [scroll + i]);
+						} else {
+							wmove(dialog, box_y, input_x++ + box_x);
+							waddch(dialog, key);
+						}
+						wrefresh(dialog);
+					} else
+						flash();	/* Alarm user about overflow */
+					continue;
+				}
+			}
+		}
+		switch (key) {
+		case 'O':
+		case 'o':
+			delwin(dialog);
+			return 0;
+		case 'H':
+		case 'h':
+			delwin(dialog);
+			return 1;
+		case KEY_UP:
+		case KEY_LEFT:
+			switch (button) {
+			case -1:
+				button = 1;	/* Indicates "Cancel" button is selected */
+				print_buttons(dialog, height, width, 1);
+				break;
+			case 0:
+				button = -1;	/* Indicates input box is selected */
+				print_buttons(dialog, height, width, 0);
+				wmove(dialog, box_y, box_x + input_x);
+				wrefresh(dialog);
+				break;
+			case 1:
+				button = 0;	/* Indicates "OK" button is selected */
+				print_buttons(dialog, height, width, 0);
+				break;
+			}
+			break;
+		case TAB:
+		case KEY_DOWN:
+		case KEY_RIGHT:
+			switch (button) {
+			case -1:
+				button = 0;	/* Indicates "OK" button is selected */
+				print_buttons(dialog, height, width, 0);
+				break;
+			case 0:
+				button = 1;	/* Indicates "Cancel" button is selected */
+				print_buttons(dialog, height, width, 1);
+				break;
+			case 1:
+				button = -1;	/* Indicates input box is selected */
+				print_buttons(dialog, height, width, 0);
+				wmove(dialog, box_y, box_x + input_x);
+				wrefresh(dialog);
+				break;
+			}
+			break;
+		case ' ':
+		case '\n':
+			delwin(dialog);
+			return (button == -1 ? 0 : button);
+		case 'X':
+		case 'x':
+			key = KEY_ESC;
+			break;
+		case KEY_ESC:
+			key = on_key_esc(dialog);
+			break;
+		case KEY_RESIZE:
+			delwin(dialog);
+			on_key_resize();
+			goto do_resize;
+		}
+	}
+
+	delwin(dialog);
+	return KEY_ESC;		/* ESC pressed */
+}
diff --git a/kconfig/lxdialog/menubox.c b/kconfig/lxdialog/menubox.c
new file mode 100644
index 00000000..0d83159d
--- /dev/null
+++ b/kconfig/lxdialog/menubox.c
@@ -0,0 +1,434 @@
+/*
+ *  menubox.c -- implements the menu box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *  Changes by Clifford Wolf (god@clifford.at)
+ *
+ *  [ 1998-06-13 ]
+ *
+ *    *)  A bugfix for the Page-Down problem
+ *
+ *    *)  Formerly when I used Page Down and Page Up, the cursor would be set 
+ *        to the first position in the menu box.  Now lxdialog is a bit
+ *        smarter and works more like other menu systems (just have a look at
+ *        it).
+ *
+ *    *)  Formerly if I selected something my scrolling would be broken because
+ *        lxdialog is re-invoked by the Menuconfig shell script, can't
+ *        remember the last scrolling position, and just sets it so that the
+ *        cursor is at the bottom of the box.  Now it writes the temporary file
+ *        lxdialog.scrltmp which contains this information. The file is
+ *        deleted by lxdialog if the user leaves a submenu or enters a new
+ *        one, but it would be nice if Menuconfig could make another "rm -f"
+ *        just to be sure.  Just try it out - you will recognise a difference!
+ *
+ *  [ 1998-06-14 ]
+ *
+ *    *)  Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
+ *        and menus change their size on the fly.
+ *
+ *    *)  If for some reason the last scrolling position is not saved by
+ *        lxdialog, it sets the scrolling so that the selected item is in the
+ *        middle of the menu box, not at the bottom.
+ *
+ * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
+ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
+ * This fixes a bug in Menuconfig where using ' ' to descend into menus
+ * would leave mis-synchronized lxdialog.scrltmp files lying around,
+ * fscanf would read in 'scroll', and eventually that value would get used.
+ */
+
+#include "dialog.h"
+
+static int menu_width, item_x;
+
+/*
+ * Print menu item
+ */
+static void do_print_item(WINDOW * win, const char *item, int line_y,
+                          int selected, int hotkey)
+{
+	int j;
+	char *menu_item = malloc(menu_width + 1);
+
+	strncpy(menu_item, item, menu_width - item_x);
+	menu_item[menu_width - item_x] = '\0';
+	j = first_alpha(menu_item, "YyNnMmHh");
+
+	/* Clear 'residue' of last item */
+	wattrset(win, dlg.menubox.atr);
+	wmove(win, line_y, 0);
+#if OLD_NCURSES
+	{
+		int i;
+		for (i = 0; i < menu_width; i++)
+			waddch(win, ' ');
+	}
+#else
+	wclrtoeol(win);
+#endif
+	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
+	mvwaddstr(win, line_y, item_x, menu_item);
+	if (hotkey) {
+		wattrset(win, selected ? dlg.tag_key_selected.atr
+			 : dlg.tag_key.atr);
+		mvwaddch(win, line_y, item_x + j, menu_item[j]);
+	}
+	if (selected) {
+		wmove(win, line_y, item_x + 1);
+	}
+	free(menu_item);
+	wrefresh(win);
+}
+
+#define print_item(index, choice, selected)				\
+do {									\
+	item_set(index);						\
+	do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \
+} while (0)
+
+/*
+ * Print the scroll indicators.
+ */
+static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
+			 int height)
+{
+	int cur_y, cur_x;
+
+	getyx(win, cur_y, cur_x);
+
+	wmove(win, y, x);
+
+	if (scroll > 0) {
+		wattrset(win, dlg.uarrow.atr);
+		waddch(win, ACS_UARROW);
+		waddstr(win, "(-)");
+	} else {
+		wattrset(win, dlg.menubox.atr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	y = y + height + 1;
+	wmove(win, y, x);
+	wrefresh(win);
+
+	if ((height < item_no) && (scroll + height < item_no)) {
+		wattrset(win, dlg.darrow.atr);
+		waddch(win, ACS_DARROW);
+		waddstr(win, "(+)");
+	} else {
+		wattrset(win, dlg.menubox_border.atr);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+		waddch(win, ACS_HLINE);
+	}
+
+	wmove(win, cur_y, cur_x);
+	wrefresh(win);
+}
+
+/*
+ * Display the termination buttons.
+ */
+static void print_buttons(WINDOW * win, int height, int width, int selected)
+{
+	int x = width / 2 - 16;
+	int y = height - 2;
+
+	print_button(win, "Select", y, x, selected == 0);
+	print_button(win, " Exit ", y, x + 12, selected == 1);
+	print_button(win, " Help ", y, x + 24, selected == 2);
+
+	wmove(win, y, x + 1 + 12 * selected);
+	wrefresh(win);
+}
+
+/* scroll up n lines (n may be negative) */
+static void do_scroll(WINDOW *win, int *scroll, int n)
+{
+	/* Scroll menu up */
+	scrollok(win, TRUE);
+	wscrl(win, n);
+	scrollok(win, FALSE);
+	*scroll = *scroll + n;
+	wrefresh(win);
+}
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int dialog_menu(const char *title, const char *prompt,
+                const void *selected, int *s_scroll)
+{
+	int i, j, x, y, box_x, box_y;
+	int height, width, menu_height;
+	int key = 0, button = 0, scroll = 0, choice = 0;
+	int first_item =  0, max_choice;
+	WINDOW *dialog, *menu;
+
+do_resize:
+	height = getmaxy(stdscr);
+	width = getmaxx(stdscr);
+	if (height < 15 || width < 65)
+		return -ERRDISPLAYTOOSMALL;
+
+	height -= 4;
+	width  -= 5;
+	menu_height = height - 10;
+
+	max_choice = MIN(menu_height, item_count());
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width,
+		 dlg.dialog.atr, dlg.border.atr);
+	wattrset(dialog, dlg.border.atr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dlg.dialog.atr);
+	wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dlg.dialog.atr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	menu_width = width - 6;
+	box_y = height - menu_height - 5;
+	box_x = (width - menu_width) / 2 - 1;
+
+	/* create new window for the menu */
+	menu = subwin(dialog, menu_height, menu_width,
+		      y + box_y + 1, x + box_x + 1);
+	keypad(menu, TRUE);
+
+	/* draw a box around the menu items */
+	draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2,
+		 dlg.menubox_border.atr, dlg.menubox.atr);
+
+	if (menu_width >= 80)
+		item_x = (menu_width - 70) / 2;
+	else
+		item_x = 4;
+
+	/* Set choice to default item */
+	item_foreach()
+		if (selected && (selected == item_data()))
+			choice = item_n();
+	/* get the saved scroll info */
+	scroll = *s_scroll;
+	if ((scroll <= choice) && (scroll + max_choice > choice) &&
+	   (scroll >= 0) && (scroll + max_choice <= item_count())) {
+		first_item = scroll;
+		choice = choice - scroll;
+	} else {
+		scroll = 0;
+	}
+	if ((choice >= max_choice)) {
+		if (choice >= item_count() - max_choice / 2)
+			scroll = first_item = item_count() - max_choice;
+		else
+			scroll = first_item = choice - max_choice / 2;
+		choice = choice - scroll;
+	}
+
+	/* Print the menu */
+	for (i = 0; i < max_choice; i++) {
+		print_item(first_item + i, i, i == choice);
+	}
+
+	wnoutrefresh(menu);
+
+	print_arrows(dialog, item_count(), scroll,
+		     box_y, box_x + item_x + 1, menu_height);
+
+	print_buttons(dialog, height, width, 0);
+	wmove(menu, choice, item_x + 1);
+	wrefresh(menu);
+
+	while (key != KEY_ESC) {
+		key = wgetch(menu);
+
+		if (key < 256 && isalpha(key))
+			key = tolower(key);
+
+		if (strchr("ynmh", key))
+			i = max_choice;
+		else {
+			for (i = choice + 1; i < max_choice; i++) {
+				item_set(scroll + i);
+				j = first_alpha(item_str(), "YyNnMmHh");
+				if (key == tolower(item_str()[j]))
+					break;
+			}
+			if (i == max_choice)
+				for (i = 0; i < max_choice; i++) {
+					item_set(scroll + i);
+					j = first_alpha(item_str(), "YyNnMmHh");
+					if (key == tolower(item_str()[j]))
+						break;
+				}
+		}
+
+		if (i < max_choice ||
+		    key == KEY_UP || key == KEY_DOWN ||
+		    key == '-' || key == '+' ||
+		    key == KEY_PPAGE || key == KEY_NPAGE) {
+			/* Remove highligt of current item */
+			print_item(scroll + choice, choice, FALSE);
+
+			if (key == KEY_UP || key == '-') {
+				if (choice < 2 && scroll) {
+					/* Scroll menu down */
+					do_scroll(menu, &scroll, -1);
+
+					print_item(scroll, 0, FALSE);
+				} else
+					choice = MAX(choice - 1, 0);
+
+			} else if (key == KEY_DOWN || key == '+') {
+				print_item(scroll+choice, choice, FALSE);
+
+				if ((choice > max_choice - 3) &&
+				    (scroll + max_choice < item_count())) {
+					/* Scroll menu up */
+					do_scroll(menu, &scroll, 1);
+
+					print_item(scroll+max_choice - 1,
+						   max_choice - 1, FALSE);
+				} else
+					choice = MIN(choice + 1, max_choice - 1);
+
+			} else if (key == KEY_PPAGE) {
+				scrollok(menu, TRUE);
+				for (i = 0; (i < max_choice); i++) {
+					if (scroll > 0) {
+						do_scroll(menu, &scroll, -1);
+						print_item(scroll, 0, FALSE);
+					} else {
+						if (choice > 0)
+							choice--;
+					}
+				}
+
+			} else if (key == KEY_NPAGE) {
+				for (i = 0; (i < max_choice); i++) {
+					if (scroll + max_choice < item_count()) {
+						do_scroll(menu, &scroll, 1);
+						print_item(scroll+max_choice-1,
+							   max_choice - 1, FALSE);
+					} else {
+						if (choice + 1 < max_choice)
+							choice++;
+					}
+				}
+			} else
+				choice = i;
+
+			print_item(scroll + choice, choice, TRUE);
+
+			print_arrows(dialog, item_count(), scroll,
+				     box_y, box_x + item_x + 1, menu_height);
+
+			wnoutrefresh(dialog);
+			wrefresh(menu);
+
+			continue;	/* wait for another key press */
+		}
+
+		switch (key) {
+		case KEY_LEFT:
+		case TAB:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			    ? 2 : (button > 2 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(menu);
+			break;
+		case ' ':
+		case 's':
+		case 'y':
+		case 'n':
+		case 'm':
+		case '/':
+			/* save scroll info */
+			*s_scroll = scroll;
+			delwin(menu);
+			delwin(dialog);
+			item_set(scroll + choice);
+			item_set_selected(1);
+			switch (key) {
+			case 's':
+				return 3;
+			case 'y':
+				return 3;
+			case 'n':
+				return 4;
+			case 'm':
+				return 5;
+			case ' ':
+				return 6;
+			case '/':
+				return 7;
+			}
+			return 0;
+		case 'h':
+		case '?':
+			button = 2;
+		case '\n':
+			*s_scroll = scroll;
+			delwin(menu);
+			delwin(dialog);
+			item_set(scroll + choice);
+			item_set_selected(1);
+			return button;
+		case 'e':
+		case 'x':
+			key = KEY_ESC;
+			break;
+		case KEY_ESC:
+			key = on_key_esc(menu);
+			break;
+		case KEY_RESIZE:
+			on_key_resize();
+			delwin(menu);
+			delwin(dialog);
+			goto do_resize;
+		}
+	}
+	delwin(menu);
+	delwin(dialog);
+	return key;		/* ESC pressed */
+}
diff --git a/kconfig/lxdialog/textbox.c b/kconfig/lxdialog/textbox.c
new file mode 100644
index 00000000..fabfc1ad
--- /dev/null
+++ b/kconfig/lxdialog/textbox.c
@@ -0,0 +1,391 @@
+/*
+ *  textbox.c -- implements the text box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static void back_lines(int n);
+static void print_page(WINDOW * win, int height, int width);
+static void print_line(WINDOW * win, int row, int width);
+static char *get_line(void);
+static void print_position(WINDOW * win);
+
+static int hscroll;
+static int begin_reached, end_reached, page_length;
+static const char *buf;
+static const char *page;
+
+/*
+ * refresh window content
+ */
+static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
+							  int cur_y, int cur_x)
+{
+	print_page(box, boxh, boxw);
+	print_position(dialog);
+	wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+	wrefresh(dialog);
+}
+
+
+/*
+ * Display text from a file in a dialog box.
+ */
+int dialog_textbox(const char *title, const char *tbuf,
+		   int initial_height, int initial_width)
+{
+	int i, x, y, cur_x, cur_y, key = 0;
+	int height, width, boxh, boxw;
+	int passed_end;
+	WINDOW *dialog, *box;
+
+	begin_reached = 1;
+	end_reached = 0;
+	page_length = 0;
+	hscroll = 0;
+	buf = tbuf;
+	page = buf;	/* page is pointer to start of page to be displayed */
+
+do_resize:
+	getmaxyx(stdscr, height, width);
+	if (height < 8 || width < 8)
+		return -ERRDISPLAYTOOSMALL;
+	if (initial_height != 0)
+		height = initial_height;
+	else
+		if (height > 4)
+			height -= 4;
+		else
+			height = 0;
+	if (initial_width != 0)
+		width = initial_width;
+	else
+		if (width > 5)
+			width -= 5;
+		else
+			width = 0;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	/* Create window for box region, used for scrolling text */
+	boxh = height - 4;
+	boxw = width - 2;
+	box = subwin(dialog, boxh, boxw, y + 1, x + 1);
+	wattrset(box, dlg.dialog.atr);
+	wbkgdset(box, dlg.dialog.atr & A_COLOR);
+
+	keypad(box, TRUE);
+
+	/* register the new window, along with its borders */
+	draw_box(dialog, 0, 0, height, width,
+		 dlg.dialog.atr, dlg.border.atr);
+
+	wattrset(dialog, dlg.border.atr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dlg.dialog.atr);
+	wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
+	wnoutrefresh(dialog);
+	getyx(dialog, cur_y, cur_x);	/* Save cursor position */
+
+	/* Print first page of text */
+	attr_clear(box, boxh, boxw, dlg.dialog.atr);
+	refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
+
+	while ((key != KEY_ESC) && (key != '\n')) {
+		key = wgetch(dialog);
+		switch (key) {
+		case 'E':	/* Exit */
+		case 'e':
+		case 'X':
+		case 'x':
+			delwin(box);
+			delwin(dialog);
+			return 0;
+		case 'g':	/* First page */
+		case KEY_HOME:
+			if (!begin_reached) {
+				begin_reached = 1;
+				page = buf;
+				refresh_text_box(dialog, box, boxh, boxw,
+						 cur_y, cur_x);
+			}
+			break;
+		case 'G':	/* Last page */
+		case KEY_END:
+
+			end_reached = 1;
+			/* point to last char in buf */
+			page = buf + strlen(buf);
+			back_lines(boxh);
+			refresh_text_box(dialog, box, boxh, boxw,
+					 cur_y, cur_x);
+			break;
+		case 'K':	/* Previous line */
+		case 'k':
+		case KEY_UP:
+			if (!begin_reached) {
+				back_lines(page_length + 1);
+
+				/* We don't call print_page() here but use
+				 * scrolling to ensure faster screen update.
+				 * However, 'end_reached' and 'page_length'
+				 * should still be updated, and 'page' should
+				 * point to start of next page. This is done
+				 * by calling get_line() in the following
+				 * 'for' loop. */
+				scrollok(box, TRUE);
+				wscrl(box, -1);	/* Scroll box region down one line */
+				scrollok(box, FALSE);
+				page_length = 0;
+				passed_end = 0;
+				for (i = 0; i < boxh; i++) {
+					if (!i) {
+						/* print first line of page */
+						print_line(box, 0, boxw);
+						wnoutrefresh(box);
+					} else
+						/* Called to update 'end_reached' and 'page' */
+						get_line();
+					if (!passed_end)
+						page_length++;
+					if (end_reached && !passed_end)
+						passed_end = 1;
+				}
+
+				print_position(dialog);
+				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+				wrefresh(dialog);
+			}
+			break;
+		case 'B':	/* Previous page */
+		case 'b':
+		case KEY_PPAGE:
+			if (begin_reached)
+				break;
+			back_lines(page_length + boxh);
+			refresh_text_box(dialog, box, boxh, boxw,
+					 cur_y, cur_x);
+			break;
+		case 'J':	/* Next line */
+		case 'j':
+		case KEY_DOWN:
+			if (!end_reached) {
+				begin_reached = 0;
+				scrollok(box, TRUE);
+				scroll(box);	/* Scroll box region up one line */
+				scrollok(box, FALSE);
+				print_line(box, boxh - 1, boxw);
+				wnoutrefresh(box);
+				print_position(dialog);
+				wmove(dialog, cur_y, cur_x);	/* Restore cursor position */
+				wrefresh(dialog);
+			}
+			break;
+		case KEY_NPAGE:	/* Next page */
+		case ' ':
+			if (end_reached)
+				break;
+
+			begin_reached = 0;
+			refresh_text_box(dialog, box, boxh, boxw,
+					 cur_y, cur_x);
+			break;
+		case '0':	/* Beginning of line */
+		case 'H':	/* Scroll left */
+		case 'h':
+		case KEY_LEFT:
+			if (hscroll <= 0)
+				break;
+
+			if (key == '0')
+				hscroll = 0;
+			else
+				hscroll--;
+			/* Reprint current page to scroll horizontally */
+			back_lines(page_length);
+			refresh_text_box(dialog, box, boxh, boxw,
+					 cur_y, cur_x);
+			break;
+		case 'L':	/* Scroll right */
+		case 'l':
+		case KEY_RIGHT:
+			if (hscroll >= MAX_LEN)
+				break;
+			hscroll++;
+			/* Reprint current page to scroll horizontally */
+			back_lines(page_length);
+			refresh_text_box(dialog, box, boxh, boxw,
+					 cur_y, cur_x);
+			break;
+		case KEY_ESC:
+			key = on_key_esc(dialog);
+			break;
+		case KEY_RESIZE:
+			back_lines(height);
+			delwin(box);
+			delwin(dialog);
+			on_key_resize();
+			goto do_resize;
+		}
+	}
+	delwin(box);
+	delwin(dialog);
+	return key;		/* ESC pressed */
+}
+
+/*
+ * Go back 'n' lines in text. Called by dialog_textbox().
+ * 'page' will be updated to point to the desired line in 'buf'.
+ */
+static void back_lines(int n)
+{
+	int i;
+
+	begin_reached = 0;
+	/* Go back 'n' lines */
+	for (i = 0; i < n; i++) {
+		if (*page == '\0') {
+			if (end_reached) {
+				end_reached = 0;
+				continue;
+			}
+		}
+		if (page == buf) {
+			begin_reached = 1;
+			return;
+		}
+		page--;
+		do {
+			if (page == buf) {
+				begin_reached = 1;
+				return;
+			}
+			page--;
+		} while (*page != '\n');
+		page++;
+	}
+}
+
+/*
+ * Print a new page of text. Called by dialog_textbox().
+ */
+static void print_page(WINDOW * win, int height, int width)
+{
+	int i, passed_end = 0;
+
+	page_length = 0;
+	for (i = 0; i < height; i++) {
+		print_line(win, i, width);
+		if (!passed_end)
+			page_length++;
+		if (end_reached && !passed_end)
+			passed_end = 1;
+	}
+	wnoutrefresh(win);
+}
+
+/*
+ * Print a new line of text. Called by dialog_textbox() and print_page().
+ */
+static void print_line(WINDOW * win, int row, int width)
+{
+	int y, x;
+	char *line;
+
+	line = get_line();
+	line += MIN(strlen(line), hscroll);	/* Scroll horizontally */
+	wmove(win, row, 0);	/* move cursor to correct line */
+	waddch(win, ' ');
+	waddnstr(win, line, MIN(strlen(line), width - 2));
+
+	getyx(win, y, x);
+	/* Clear 'residue' of previous line */
+#if OLD_NCURSES
+	{
+		int i;
+		for (i = 0; i < width - x; i++)
+			waddch(win, ' ');
+	}
+#else
+	wclrtoeol(win);
+#endif
+}
+
+/*
+ * Return current line of text. Called by dialog_textbox() and print_line().
+ * 'page' should point to start of current line before calling, and will be
+ * updated to point to start of next line.
+ */
+static char *get_line(void)
+{
+	int i = 0;
+	static char line[MAX_LEN + 1];
+
+	end_reached = 0;
+	while (*page != '\n') {
+		if (*page == '\0') {
+			if (!end_reached) {
+				end_reached = 1;
+				break;
+			}
+		} else if (i < MAX_LEN)
+			line[i++] = *(page++);
+		else {
+			/* Truncate lines longer than MAX_LEN characters */
+			if (i == MAX_LEN)
+				line[i++] = '\0';
+			page++;
+		}
+	}
+	if (i <= MAX_LEN)
+		line[i] = '\0';
+	if (!end_reached)
+		page++;		/* move pass '\n' */
+
+	return line;
+}
+
+/*
+ * Print current position
+ */
+static void print_position(WINDOW * win)
+{
+	int percent;
+
+	wattrset(win, dlg.position_indicator.atr);
+	wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
+	percent = (page - buf) * 100 / strlen(buf);
+	wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
+	wprintw(win, "(%3d%%)", percent);
+}
diff --git a/kconfig/lxdialog/util.c b/kconfig/lxdialog/util.c
new file mode 100644
index 00000000..ebc781b4
--- /dev/null
+++ b/kconfig/lxdialog/util.c
@@ -0,0 +1,642 @@
+/*
+ *  util.c
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+struct dialog_info dlg;
+
+static void set_mono_theme(void)
+{
+	dlg.screen.atr = A_NORMAL;
+	dlg.shadow.atr = A_NORMAL;
+	dlg.dialog.atr = A_NORMAL;
+	dlg.title.atr = A_BOLD;
+	dlg.border.atr = A_NORMAL;
+	dlg.button_active.atr = A_REVERSE;
+	dlg.button_inactive.atr = A_DIM;
+	dlg.button_key_active.atr = A_REVERSE;
+	dlg.button_key_inactive.atr = A_BOLD;
+	dlg.button_label_active.atr = A_REVERSE;
+	dlg.button_label_inactive.atr = A_NORMAL;
+	dlg.inputbox.atr = A_NORMAL;
+	dlg.inputbox_border.atr = A_NORMAL;
+	dlg.searchbox.atr = A_NORMAL;
+	dlg.searchbox_title.atr = A_BOLD;
+	dlg.searchbox_border.atr = A_NORMAL;
+	dlg.position_indicator.atr = A_BOLD;
+	dlg.menubox.atr = A_NORMAL;
+	dlg.menubox_border.atr = A_NORMAL;
+	dlg.item.atr = A_NORMAL;
+	dlg.item_selected.atr = A_REVERSE;
+	dlg.tag.atr = A_BOLD;
+	dlg.tag_selected.atr = A_REVERSE;
+	dlg.tag_key.atr = A_BOLD;
+	dlg.tag_key_selected.atr = A_REVERSE;
+	dlg.check.atr = A_BOLD;
+	dlg.check_selected.atr = A_REVERSE;
+	dlg.uarrow.atr = A_BOLD;
+	dlg.darrow.atr = A_BOLD;
+}
+
+#define DLG_COLOR(dialog, f, b, h) \
+do {                               \
+	dlg.dialog.fg = (f);       \
+	dlg.dialog.bg = (b);       \
+	dlg.dialog.hl = (h);       \
+} while (0)
+
+static void set_classic_theme(void)
+{
+	DLG_COLOR(screen,                COLOR_CYAN,   COLOR_BLUE,   true);
+	DLG_COLOR(shadow,                COLOR_BLACK,  COLOR_BLACK,  true);
+	DLG_COLOR(dialog,                COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(title,                 COLOR_YELLOW, COLOR_WHITE,  true);
+	DLG_COLOR(border,                COLOR_WHITE,  COLOR_WHITE,  true);
+	DLG_COLOR(button_active,         COLOR_WHITE,  COLOR_BLUE,   true);
+	DLG_COLOR(button_inactive,       COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(button_key_active,     COLOR_WHITE,  COLOR_BLUE,   true);
+	DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_WHITE,  false);
+	DLG_COLOR(button_label_active,   COLOR_YELLOW, COLOR_BLUE,   true);
+	DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_WHITE,  true);
+	DLG_COLOR(inputbox,              COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(inputbox_border,       COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(searchbox,             COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(searchbox_title,       COLOR_YELLOW, COLOR_WHITE,  true);
+	DLG_COLOR(searchbox_border,      COLOR_WHITE,  COLOR_WHITE,  true);
+	DLG_COLOR(position_indicator,    COLOR_YELLOW, COLOR_WHITE,  true);
+	DLG_COLOR(menubox,               COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(menubox_border,        COLOR_WHITE,  COLOR_WHITE,  true);
+	DLG_COLOR(item,                  COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(item_selected,         COLOR_WHITE,  COLOR_BLUE,   true);
+	DLG_COLOR(tag,                   COLOR_YELLOW, COLOR_WHITE,  true);
+	DLG_COLOR(tag_selected,          COLOR_YELLOW, COLOR_BLUE,   true);
+	DLG_COLOR(tag_key,               COLOR_YELLOW, COLOR_WHITE,  true);
+	DLG_COLOR(tag_key_selected,      COLOR_YELLOW, COLOR_BLUE,   true);
+	DLG_COLOR(check,                 COLOR_BLACK,  COLOR_WHITE,  false);
+	DLG_COLOR(check_selected,        COLOR_WHITE,  COLOR_BLUE,   true);
+	DLG_COLOR(uarrow,                COLOR_GREEN,  COLOR_WHITE,  true);
+	DLG_COLOR(darrow,                COLOR_GREEN,  COLOR_WHITE,  true);
+}
+
+static void set_blackbg_theme(void)
+{
+	DLG_COLOR(screen, COLOR_RED,   COLOR_BLACK, true);
+	DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false);
+	DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false);
+	DLG_COLOR(title,  COLOR_RED,   COLOR_BLACK, false);
+	DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true);
+
+	DLG_COLOR(button_active,         COLOR_YELLOW, COLOR_RED,   false);
+	DLG_COLOR(button_inactive,       COLOR_YELLOW, COLOR_BLACK, false);
+	DLG_COLOR(button_key_active,     COLOR_YELLOW, COLOR_RED,   true);
+	DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_BLACK, false);
+	DLG_COLOR(button_label_active,   COLOR_WHITE,  COLOR_RED,   false);
+	DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_BLACK, true);
+
+	DLG_COLOR(inputbox,         COLOR_YELLOW, COLOR_BLACK, false);
+	DLG_COLOR(inputbox_border,  COLOR_YELLOW, COLOR_BLACK, false);
+
+	DLG_COLOR(searchbox,        COLOR_YELLOW, COLOR_BLACK, false);
+	DLG_COLOR(searchbox_title,  COLOR_YELLOW, COLOR_BLACK, true);
+	DLG_COLOR(searchbox_border, COLOR_BLACK,  COLOR_BLACK, true);
+
+	DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK,  false);
+
+	DLG_COLOR(menubox,          COLOR_YELLOW, COLOR_BLACK, false);
+	DLG_COLOR(menubox_border,   COLOR_BLACK,  COLOR_BLACK, true);
+
+	DLG_COLOR(item,             COLOR_WHITE, COLOR_BLACK, false);
+	DLG_COLOR(item_selected,    COLOR_WHITE, COLOR_RED,   false);
+
+	DLG_COLOR(tag,              COLOR_RED,    COLOR_BLACK, false);
+	DLG_COLOR(tag_selected,     COLOR_YELLOW, COLOR_RED,   true);
+	DLG_COLOR(tag_key,          COLOR_RED,    COLOR_BLACK, false);
+	DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED,   true);
+
+	DLG_COLOR(check,            COLOR_YELLOW, COLOR_BLACK, false);
+	DLG_COLOR(check_selected,   COLOR_YELLOW, COLOR_RED,   true);
+
+	DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false);
+	DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false);
+}
+
+static void set_bluetitle_theme(void)
+{
+	set_classic_theme();
+	DLG_COLOR(title,               COLOR_BLUE,   COLOR_WHITE, true);
+	DLG_COLOR(button_key_active,   COLOR_YELLOW, COLOR_BLUE,  true);
+	DLG_COLOR(button_label_active, COLOR_WHITE,  COLOR_BLUE,  true);
+	DLG_COLOR(searchbox_title,     COLOR_BLUE,   COLOR_WHITE, true);
+	DLG_COLOR(position_indicator,  COLOR_BLUE,   COLOR_WHITE, true);
+	DLG_COLOR(tag,                 COLOR_BLUE,   COLOR_WHITE, true);
+	DLG_COLOR(tag_key,             COLOR_BLUE,   COLOR_WHITE, true);
+
+}
+
+/*
+ * Select color theme
+ */
+static int set_theme(const char *theme)
+{
+	int use_color = 1;
+	if (!theme)
+		set_bluetitle_theme();
+	else if (strcmp(theme, "classic") == 0)
+		set_classic_theme();
+	else if (strcmp(theme, "bluetitle") == 0)
+		set_bluetitle_theme();
+	else if (strcmp(theme, "blackbg") == 0)
+		set_blackbg_theme();
+	else if (strcmp(theme, "mono") == 0)
+		use_color = 0;
+
+	return use_color;
+}
+
+static void init_one_color(struct dialog_color *color)
+{
+	static int pair = 0;
+
+	pair++;
+	init_pair(pair, color->fg, color->bg);
+	if (color->hl)
+		color->atr = A_BOLD | COLOR_PAIR(pair);
+	else
+		color->atr = COLOR_PAIR(pair);
+}
+
+static void init_dialog_colors(void)
+{
+	init_one_color(&dlg.screen);
+	init_one_color(&dlg.shadow);
+	init_one_color(&dlg.dialog);
+	init_one_color(&dlg.title);
+	init_one_color(&dlg.border);
+	init_one_color(&dlg.button_active);
+	init_one_color(&dlg.button_inactive);
+	init_one_color(&dlg.button_key_active);
+	init_one_color(&dlg.button_key_inactive);
+	init_one_color(&dlg.button_label_active);
+	init_one_color(&dlg.button_label_inactive);
+	init_one_color(&dlg.inputbox);
+	init_one_color(&dlg.inputbox_border);
+	init_one_color(&dlg.searchbox);
+	init_one_color(&dlg.searchbox_title);
+	init_one_color(&dlg.searchbox_border);
+	init_one_color(&dlg.position_indicator);
+	init_one_color(&dlg.menubox);
+	init_one_color(&dlg.menubox_border);
+	init_one_color(&dlg.item);
+	init_one_color(&dlg.item_selected);
+	init_one_color(&dlg.tag);
+	init_one_color(&dlg.tag_selected);
+	init_one_color(&dlg.tag_key);
+	init_one_color(&dlg.tag_key_selected);
+	init_one_color(&dlg.check);
+	init_one_color(&dlg.check_selected);
+	init_one_color(&dlg.uarrow);
+	init_one_color(&dlg.darrow);
+}
+
+/*
+ * Setup for color display
+ */
+static void color_setup(const char *theme)
+{
+	if (set_theme(theme)) {
+		if (has_colors()) {	/* Terminal supports color? */
+			start_color();
+			init_dialog_colors();
+		}
+	}
+	else
+	{
+		set_mono_theme();
+	}
+}
+
+/*
+ * Set window to attribute 'attr'
+ */
+void attr_clear(WINDOW * win, int height, int width, chtype attr)
+{
+	int i, j;
+
+	wattrset(win, attr);
+	for (i = 0; i < height; i++) {
+		wmove(win, i, 0);
+		for (j = 0; j < width; j++)
+			waddch(win, ' ');
+	}
+	touchwin(win);
+}
+
+void dialog_clear(void)
+{
+	attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
+	/* Display background title if it exists ... - SLH */
+	if (dlg.backtitle != NULL) {
+		int i;
+
+		wattrset(stdscr, dlg.screen.atr);
+		mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
+		wmove(stdscr, 1, 1);
+		for (i = 1; i < COLS - 1; i++)
+			waddch(stdscr, ACS_HLINE);
+	}
+	wnoutrefresh(stdscr);
+}
+
+/*
+ * Do some initialization for dialog
+ */
+void init_dialog(const char *backtitle)
+{
+	dlg.backtitle = backtitle;
+	color_setup(getenv("MENUCONFIG_COLOR"));
+}
+
+void reset_dialog(void)
+{
+	initscr();		/* Init curses */
+	keypad(stdscr, TRUE);
+	cbreak();
+	noecho();
+	dialog_clear();
+}
+
+/*
+ * End using dialog functions.
+ */
+void end_dialog(void)
+{
+	endwin();
+}
+
+/* Print the title of the dialog. Center the title and truncate
+ * tile if wider than dialog (- 2 chars).
+ **/
+void print_title(WINDOW *dialog, const char *title, int width)
+{
+	if (title) {
+		int tlen = MIN(width - 2, strlen(title));
+		wattrset(dialog, dlg.title.atr);
+		mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
+		mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
+		waddch(dialog, ' ');
+	}
+}
+
+/*
+ * Print a string of text in a window, automatically wrap around to the
+ * next line if the string is too long to fit on one line. Newline
+ * characters '\n' are replaced by spaces.  We start on a new line
+ * if there is no room for at least 4 nonblanks following a double-space.
+ */
+void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
+{
+	int newl, cur_x, cur_y;
+	int i, prompt_len, room, wlen;
+	char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+
+	strcpy(tempstr, prompt);
+
+	prompt_len = strlen(tempstr);
+
+	/*
+	 * Remove newlines
+	 */
+	for (i = 0; i < prompt_len; i++) {
+		if (tempstr[i] == '\n')
+			tempstr[i] = ' ';
+	}
+
+	if (prompt_len <= width - x * 2) {	/* If prompt is short */
+		wmove(win, y, (width - prompt_len) / 2);
+		waddstr(win, tempstr);
+	} else {
+		cur_x = x;
+		cur_y = y;
+		newl = 1;
+		word = tempstr;
+		while (word && *word) {
+			sp = index(word, ' ');
+			if (sp)
+				*sp++ = 0;
+
+			/* Wrap to next line if either the word does not fit,
+			   or it is the first word of a new sentence, and it is
+			   short, and the next word does not fit. */
+			room = width - cur_x;
+			wlen = strlen(word);
+			if (wlen > room ||
+			    (newl && wlen < 4 && sp
+			     && wlen + 1 + strlen(sp) > room
+			     && (!(sp2 = index(sp, ' '))
+				 || wlen + 1 + (sp2 - sp) > room))) {
+				cur_y++;
+				cur_x = x;
+			}
+			wmove(win, cur_y, cur_x);
+			waddstr(win, word);
+			getyx(win, cur_y, cur_x);
+			cur_x++;
+			if (sp && *sp == ' ') {
+				cur_x++;	/* double space */
+				while (*++sp == ' ') ;
+				newl = 1;
+			} else
+				newl = 0;
+			word = sp;
+		}
+	}
+}
+
+/*
+ * Print a button
+ */
+void print_button(WINDOW * win, const char *label, int y, int x, int selected)
+{
+	int i, temp;
+
+	wmove(win, y, x);
+	wattrset(win, selected ? dlg.button_active.atr
+		 : dlg.button_inactive.atr);
+	waddstr(win, "<");
+	temp = strspn(label, " ");
+	label += temp;
+	wattrset(win, selected ? dlg.button_label_active.atr
+		 : dlg.button_label_inactive.atr);
+	for (i = 0; i < temp; i++)
+		waddch(win, ' ');
+	wattrset(win, selected ? dlg.button_key_active.atr
+		 : dlg.button_key_inactive.atr);
+	waddch(win, label[0]);
+	wattrset(win, selected ? dlg.button_label_active.atr
+		 : dlg.button_label_inactive.atr);
+	waddstr(win, (char *)label + 1);
+	wattrset(win, selected ? dlg.button_active.atr
+		 : dlg.button_inactive.atr);
+	waddstr(win, ">");
+	wmove(win, y, x + temp + 1);
+}
+
+/*
+ * Draw a rectangular box with line drawing characters
+ */
+void
+draw_box(WINDOW * win, int y, int x, int height, int width,
+	 chtype box, chtype border)
+{
+	int i, j;
+
+	wattrset(win, 0);
+	for (i = 0; i < height; i++) {
+		wmove(win, y + i, x);
+		for (j = 0; j < width; j++)
+			if (!i && !j)
+				waddch(win, border | ACS_ULCORNER);
+			else if (i == height - 1 && !j)
+				waddch(win, border | ACS_LLCORNER);
+			else if (!i && j == width - 1)
+				waddch(win, box | ACS_URCORNER);
+			else if (i == height - 1 && j == width - 1)
+				waddch(win, box | ACS_LRCORNER);
+			else if (!i)
+				waddch(win, border | ACS_HLINE);
+			else if (i == height - 1)
+				waddch(win, box | ACS_HLINE);
+			else if (!j)
+				waddch(win, border | ACS_VLINE);
+			else if (j == width - 1)
+				waddch(win, box | ACS_VLINE);
+			else
+				waddch(win, box | ' ');
+	}
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes
+ */
+void draw_shadow(WINDOW * win, int y, int x, int height, int width)
+{
+	int i;
+
+	if (has_colors()) {	/* Whether terminal supports color? */
+		wattrset(win, dlg.shadow.atr);
+		wmove(win, y + height, x + 2);
+		for (i = 0; i < width; i++)
+			waddch(win, winch(win) & A_CHARTEXT);
+		for (i = y + 1; i < y + height + 1; i++) {
+			wmove(win, i, x + width);
+			waddch(win, winch(win) & A_CHARTEXT);
+			waddch(win, winch(win) & A_CHARTEXT);
+		}
+		wnoutrefresh(win);
+	}
+}
+
+/*
+ *  Return the position of the first alphabetic character in a string.
+ */
+int first_alpha(const char *string, const char *exempt)
+{
+	int i, in_paren = 0, c;
+
+	for (i = 0; i < strlen(string); i++) {
+		c = tolower(string[i]);
+
+		if (strchr("<[(", c))
+			++in_paren;
+		if (strchr(">])", c) && in_paren > 0)
+			--in_paren;
+
+		if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
+			return i;
+	}
+
+	return 0;
+}
+
+/*
+ * ncurses uses ESC to detect escaped char sequences. This resutl in
+ * a small timeout before ESC is actually delivered to the application.
+ * lxdialog suggest <ESC> <ESC> which is correctly translated to two
+ * times esc. But then we need to ignore the second esc to avoid stepping
+ * out one menu too much. Filter away all escaped key sequences since
+ * keypad(FALSE) turn off ncurses support for escape sequences - and thats
+ * needed to make notimeout() do as expected.
+ */
+int on_key_esc(WINDOW *win)
+{
+	int key;
+	int key2;
+	int key3;
+
+	nodelay(win, TRUE);
+	keypad(win, FALSE);
+	key = wgetch(win);
+	key2 = wgetch(win);
+	do {
+		key3 = wgetch(win);
+	} while (key3 != ERR);
+	nodelay(win, FALSE);
+	keypad(win, TRUE);
+	if (key == KEY_ESC && key2 == ERR)
+		return KEY_ESC;
+	else if (key != ERR && key != KEY_ESC && key2 == ERR)
+		ungetch(key);
+
+	return -1;
+}
+
+/* redraw screen in new size */
+int on_key_resize(void)
+{
+	dialog_clear();
+	return KEY_RESIZE;
+}
+
+struct dialog_list *item_cur;
+struct dialog_list item_nil;
+struct dialog_list *item_head;
+
+void item_reset(void)
+{
+	struct dialog_list *p, *next;
+
+	for (p = item_head; p; p = next) {
+		next = p->next;
+		free(p);
+	}
+	item_head = NULL;
+	item_cur = &item_nil;
+}
+
+void item_make(const char *fmt, ...)
+{
+	va_list ap;
+	struct dialog_list *p = malloc(sizeof(*p));
+
+	if (item_head)
+		item_cur->next = p;
+	else
+		item_head = p;
+	item_cur = p;
+	memset(p, 0, sizeof(*p));
+
+	va_start(ap, fmt);
+	vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
+	va_end(ap);
+}
+
+void item_add_str(const char *fmt, ...)
+{
+	va_list ap;
+        size_t avail;
+
+	avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
+
+	va_start(ap, fmt);
+	vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
+		  avail, fmt, ap);
+	item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
+	va_end(ap);
+}
+
+void item_set_tag(char tag)
+{
+	item_cur->node.tag = tag;
+}
+void item_set_data(void *ptr)
+{
+	item_cur->node.data = ptr;
+}
+
+void item_set_selected(int val)
+{
+	item_cur->node.selected = val;
+}
+
+int item_activate_selected(void)
+{
+	item_foreach()
+		if (item_is_selected())
+			return 1;
+	return 0;
+}
+
+void *item_data(void)
+{
+	return item_cur->node.data;
+}
+
+char item_tag(void)
+{
+	return item_cur->node.tag;
+}
+
+int item_count(void)
+{
+	int n = 0;
+	struct dialog_list *p;
+
+	for (p = item_head; p; p = p->next)
+		n++;
+	return n;
+}
+
+void item_set(int n)
+{
+	int i = 0;
+	item_foreach()
+		if (i++ == n)
+			return;
+}
+
+int item_n(void)
+{
+	int n = 0;
+	struct dialog_list *p;
+
+	for (p = item_head; p; p = p->next) {
+		if (p == item_cur)
+			return n;
+		n++;
+	}
+	return 0;
+}
+
+const char *item_str(void)
+{
+	return item_cur->node.str;
+}
+
+int item_is_selected(void)
+{
+	return (item_cur->node.selected != 0);
+}
+
+int item_is_tag(char tag)
+{
+	return (item_cur->node.tag == tag);
+}
diff --git a/kconfig/lxdialog/yesno.c b/kconfig/lxdialog/yesno.c
new file mode 100644
index 00000000..ee0a04e3
--- /dev/null
+++ b/kconfig/lxdialog/yesno.c
@@ -0,0 +1,114 @@
+/*
+ *  yesno.c -- implements the yes/no box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  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
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display termination buttons
+ */
+static void print_buttons(WINDOW * dialog, int height, int width, int selected)
+{
+	int x = width / 2 - 10;
+	int y = height - 2;
+
+	print_button(dialog, " Yes ", y, x, selected == 0);
+	print_button(dialog, "  No  ", y, x + 13, selected == 1);
+
+	wmove(dialog, y, x + 1 + 13 * selected);
+	wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box with two buttons - Yes and No
+ */
+int dialog_yesno(const char *title, const char *prompt, int height, int width)
+{
+	int i, x, y, key = 0, button = 0;
+	WINDOW *dialog;
+
+do_resize:
+	if (getmaxy(stdscr) < (height + 4))
+		return -ERRDISPLAYTOOSMALL;
+	if (getmaxx(stdscr) < (width + 4))
+		return -ERRDISPLAYTOOSMALL;
+
+	/* center dialog box on screen */
+	x = (COLS - width) / 2;
+	y = (LINES - height) / 2;
+
+	draw_shadow(stdscr, y, x, height, width);
+
+	dialog = newwin(height, width, y, x);
+	keypad(dialog, TRUE);
+
+	draw_box(dialog, 0, 0, height, width,
+		 dlg.dialog.atr, dlg.border.atr);
+	wattrset(dialog, dlg.border.atr);
+	mvwaddch(dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+		waddch(dialog, ACS_HLINE);
+	wattrset(dialog, dlg.dialog.atr);
+	waddch(dialog, ACS_RTEE);
+
+	print_title(dialog, title, width);
+
+	wattrset(dialog, dlg.dialog.atr);
+	print_autowrap(dialog, prompt, width - 2, 1, 3);
+
+	print_buttons(dialog, height, width, 0);
+
+	while (key != KEY_ESC) {
+		key = wgetch(dialog);
+		switch (key) {
+		case 'Y':
+		case 'y':
+			delwin(dialog);
+			return 0;
+		case 'N':
+		case 'n':
+			delwin(dialog);
+			return 1;
+
+		case TAB:
+		case KEY_LEFT:
+		case KEY_RIGHT:
+			button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button);
+
+			print_buttons(dialog, height, width, button);
+			wrefresh(dialog);
+			break;
+		case ' ':
+		case '\n':
+			delwin(dialog);
+			return button;
+		case KEY_ESC:
+			key = on_key_esc(dialog);
+			break;
+		case KEY_RESIZE:
+			delwin(dialog);
+			on_key_resize();
+			goto do_resize;
+		}
+	}
+
+	delwin(dialog);
+	return key;		/* ESC pressed */
+}
diff --git a/kconfig/mconf.c b/kconfig/mconf.c
new file mode 100644
index 00000000..8f268bec
--- /dev/null
+++ b/kconfig/mconf.c
@@ -0,0 +1,919 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Introduced single menu mode (show all sub-menus in one large tree).
+ * 2002-11-06 Petr Baudis <pasky@ucw.cz>
+ *
+ * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ */
+
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <locale.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+#include "lxdialog/dialog.h"
+
+static char menu_backtitle[128];
+static const char mconf_readme[] = N_(
+"Overview\n"
+"--------\n"
+"Some kernel features may be built directly into the kernel.\n"
+"Some may be made into loadable runtime modules.  Some features\n"
+"may be completely removed altogether.  There are also certain\n"
+"kernel parameters which are not really features, but must be\n"
+"entered in as decimal or hexadecimal numbers or possibly text.\n"
+"\n"
+"Menu items beginning with [*], <M> or [ ] represent features\n"
+"configured to be built in, modularized or removed respectively.\n"
+"Pointed brackets <> represent module capable features.\n"
+"\n"
+"To change any of these features, highlight it with the cursor\n"
+"keys and press <Y> to build it in, <M> to make it a module or\n"
+"<N> to removed it.  You may also press the <Space Bar> to cycle\n"
+"through the available options (ie. Y->N->M->Y).\n"
+"\n"
+"Some additional keyboard hints:\n"
+"\n"
+"Menus\n"
+"----------\n"
+"o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
+"   you wish to change or submenu wish to select and press <Enter>.\n"
+"   Submenus are designated by \"--->\".\n"
+"\n"
+"   Shortcut: Press the option's highlighted letter (hotkey).\n"
+"             Pressing a hotkey more than once will sequence\n"
+"             through all visible items which use that hotkey.\n"
+"\n"
+"   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
+"   unseen options into view.\n"
+"\n"
+"o  To exit a menu use the cursor keys to highlight the <Exit> button\n"
+"   and press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
+"             using those letters.  You may press a single <ESC>, but\n"
+"             there is a delayed response which you may find annoying.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
+"   <Exit> and <Help>\n"
+"\n"
+"o  To get help with an item, use the cursor keys to highlight <Help>\n"
+"   and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"\n"
+"Radiolists  (Choice lists)\n"
+"-----------\n"
+"o  Use the cursor keys to select the option you wish to set and press\n"
+"   <S> or the <SPACE BAR>.\n"
+"\n"
+"   Shortcut: Press the first letter of the option you wish to set then\n"
+"             press <S> or <SPACE BAR>.\n"
+"\n"
+"o  To see available help for the item, use the cursor keys to highlight\n"
+"   <Help> and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select> and\n"
+"   <Help>\n"
+"\n"
+"\n"
+"Data Entry\n"
+"-----------\n"
+"o  Enter the requested information and press <ENTER>\n"
+"   If you are entering hexadecimal values, it is not necessary to\n"
+"   add the '0x' prefix to the entry.\n"
+"\n"
+"o  For help, use the <TAB> or cursor keys to highlight the help option\n"
+"   and press <ENTER>.  You can try <TAB><H> as well.\n"
+"\n"
+"\n"
+"Text Box    (Help Window)\n"
+"--------\n"
+"o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
+"   keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
+"   who are familiar with less and lynx.\n"
+"\n"
+"o  Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
+"\n"
+"\n"
+"Alternate Configuration Files\n"
+"-----------------------------\n"
+"Menuconfig supports the use of alternate configuration files for\n"
+"those who, for various reasons, find it necessary to switch\n"
+"between different kernel configurations.\n"
+"\n"
+"At the end of the main menu you will find two options.  One is\n"
+"for saving the current configuration to a file of your choosing.\n"
+"The other option is for loading a previously saved alternate\n"
+"configuration.\n"
+"\n"
+"Even if you don't use alternate configuration files, but you\n"
+"find during a Menuconfig session that you have completely messed\n"
+"up your settings, you may use the \"Load Alternate...\" option to\n"
+"restore your previously saved settings from \".config\" without\n"
+"restarting Menuconfig.\n"
+"\n"
+"Other information\n"
+"-----------------\n"
+"If you use Menuconfig in an XTERM window make sure you have your\n"
+"$TERM variable set to point to a xterm definition which supports color.\n"
+"Otherwise, Menuconfig will look rather bad.  Menuconfig will not\n"
+"display correctly in a RXVT window because rxvt displays only one\n"
+"intensity of color, bright.\n"
+"\n"
+"Menuconfig will display larger menus on screens or xterms which are\n"
+"set to display more than the standard 25 row by 80 column geometry.\n"
+"In order for this to work, the \"stty size\" command must be able to\n"
+"display the screen's current row and column geometry.  I STRONGLY\n"
+"RECOMMEND that you make sure you do NOT have the shell variables\n"
+"LINES and COLUMNS exported into your environment.  Some distributions\n"
+"export those variables via /etc/profile.  Some ncurses programs can\n"
+"become confused when those variables (LINES & COLUMNS) don't reflect\n"
+"the true screen size.\n"
+"\n"
+"Optional personality available\n"
+"------------------------------\n"
+"If you prefer to have all of the kernel options listed in a single\n"
+"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
+"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
+"\n"
+"make MENUCONFIG_MODE=single_menu menuconfig\n"
+"\n"
+"<Enter> will then unroll the appropriate category, or enfold it if it\n"
+"is already unrolled.\n"
+"\n"
+"Note that this mode can eventually be a little more CPU expensive\n"
+"(especially with a larger number of unrolled categories) than the\n"
+"default mode.\n"
+"\n"
+"Different color themes available\n"
+"--------------------------------\n"
+"It is possible to select different color themes using the variable\n"
+"MENUCONFIG_COLOR. To select a theme use:\n"
+"\n"
+"make MENUCONFIG_COLOR=<theme> menuconfig\n"
+"\n"
+"Available themes are\n"
+" mono       => selects colors suitable for monochrome displays\n"
+" blackbg    => selects a color scheme with black background\n"
+" classic    => theme with blue background. The classic look\n"
+" bluetitle  => a LCD friendly version of classic. (default)\n"
+"\n"),
+menu_instructions[] = N_(
+	"Arrow keys navigate the menu.  "
+	"<Enter> selects submenus --->.  "
+	"Highlighted letters are hotkeys.  "
+	"Pressing <Y> includes, <N> excludes, <M> modularizes features.  "
+	"Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
+	"Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"),
+radiolist_instructions[] = N_(
+	"Use the arrow keys to navigate this window or "
+	"press the hotkey of the item you wish to select "
+	"followed by the <SPACE BAR>. "
+	"Press <?> for additional information about this option."),
+inputbox_instructions_int[] = N_(
+	"Please enter a decimal value. "
+	"Fractions will not be accepted.  "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+inputbox_instructions_hex[] = N_(
+	"Please enter a hexadecimal value. "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+inputbox_instructions_string[] = N_(
+	"Please enter a string value. "
+	"Use the <TAB> key to move from the input field to the buttons below it."),
+setmod_text[] = N_(
+	"This feature depends on another which has been configured as a module.\n"
+	"As a result, this feature will be built as a module."),
+nohelp_text[] = N_(
+	"There is no help available for this kernel option.\n"),
+load_config_text[] = N_(
+	"Enter the name of the configuration file you wish to load.  "
+	"Accept the name shown to restore the configuration you "
+	"last retrieved.  Leave blank to abort."),
+load_config_help[] = N_(
+	"\n"
+	"For various reasons, one may wish to keep several different kernel\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"If you have saved a previous configuration in a file other than the\n"
+	"kernel's default, entering the name of the file here will allow you\n"
+	"to modify that configuration.\n"
+	"\n"
+	"If you are uncertain, then you have probably never used alternate\n"
+	"configuration files.  You should therefor leave this blank to abort.\n"),
+save_config_text[] = N_(
+	"Enter a filename to which this configuration should be saved "
+	"as an alternate.  Leave blank to abort."),
+save_config_help[] = N_(
+	"\n"
+	"For various reasons, one may wish to keep different kernel\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"Entering a file name here will allow you to later retrieve, modify\n"
+	"and use the current configuration as an alternate to whatever\n"
+	"configuration options you have selected at that time.\n"
+	"\n"
+	"If you are uncertain what all this means then you should probably\n"
+	"leave this blank.\n"),
+search_help[] = N_(
+	"\n"
+	"Search for CT_ symbols and display their relations.\n"
+	"Regular expressions are allowed.\n"
+	"Example: search for \"^FOO\"\n"
+	"Result:\n"
+	"-----------------------------------------------------------------\n"
+	"Symbol: FOO [=m]\n"
+	"Prompt: Foo bus is used to drive the bar HW\n"
+	"Defined at drivers/pci/Kconfig:47\n"
+	"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+	"Location:\n"
+	"  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
+	"    -> PCI support (PCI [=y])\n"
+	"      -> PCI access mode (<choice> [=y])\n"
+	"Selects: LIBCRC32\n"
+	"Selected by: BAR\n"
+	"-----------------------------------------------------------------\n"
+	"o The line 'Prompt:' shows the text used in the menu structure for\n"
+	"  this CT_ symbol\n"
+	"o The 'Defined at' line tell at what file / line number the symbol\n"
+	"  is defined\n"
+	"o The 'Depends on:' line tell what symbols needs to be defined for\n"
+	"  this symbol to be visible in the menu (selectable)\n"
+	"o The 'Location:' lines tell where in the menu structure this symbol\n"
+	"  is located\n"
+	"    A location followed by a [=y] indicate that this is a selectable\n"
+	"    menu item - and current value is displayed inside brackets.\n"
+	"o The 'Selects:' line tell what symbol will be automatically\n"
+	"  selected if this symbol is selected (y or m)\n"
+	"o The 'Selected by' line tell what symbol has selected this symbol\n"
+	"\n"
+	"Only relevant lines are shown.\n"
+	"\n\n"
+	"Search examples:\n"
+	"Examples: USB	=> find all CT_ symbols containing USB\n"
+	"          ^USB => find all CT_ symbols starting with USB\n"
+	"          USB$ => find all CT_ symbols ending with USB\n"
+	"\n");
+
+static char filename[PATH_MAX+1] = ".config";
+static int indent;
+static struct termios ios_org;
+static int rows = 0, cols = 0;
+static struct menu *current_menu;
+static int child_count;
+static int single_menu_mode;
+
+static void conf(struct menu *menu);
+static void conf_choice(struct menu *menu);
+static void conf_string(struct menu *menu);
+static void conf_load(void);
+static void conf_save(void);
+static void show_textbox(const char *title, const char *text, int r, int c);
+static void show_helptext(const char *title, const char *text);
+static void show_help(struct menu *menu);
+
+static void init_wsize(void)
+{
+	struct winsize ws;
+	char *env;
+
+	if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+	}
+
+	if (!rows) {
+		env = getenv("LINES");
+		if (env)
+			rows = atoi(env);
+		if (!rows)
+			rows = 24;
+	}
+	if (!cols) {
+		env = getenv("COLUMNS");
+		if (env)
+			cols = atoi(env);
+		if (!cols)
+			cols = 80;
+	}
+
+	if (rows < 19 || cols < 80) {
+		fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
+		fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+}
+
+static void get_prompt_str(struct gstr *r, struct property *prop)
+{
+	int i, j;
+	struct menu *submenu[8], *menu;
+
+	str_printf(r, "Prompt: %s\n", prop->text);
+	str_printf(r, "  Defined at %s:%d\n", prop->menu->file->name,
+		prop->menu->lineno);
+	if (!expr_is_yes(prop->visible.expr)) {
+		str_append(r, "  Depends on: ");
+		expr_gstr_print(prop->visible.expr, r);
+		str_append(r, "\n");
+	}
+	menu = prop->menu->parent;
+	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
+		submenu[i++] = menu;
+	if (i > 0) {
+		str_printf(r, "  Location:\n");
+		for (j = 4; --i >= 0; j += 2) {
+			menu = submenu[i];
+			str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
+			if (menu->sym) {
+				str_printf(r, " (%s [=%s])", menu->sym->name ?
+					menu->sym->name : "<choice>",
+					sym_get_string_value(menu->sym));
+			}
+			str_append(r, "\n");
+		}
+	}
+}
+
+static void get_symbol_str(struct gstr *r, struct symbol *sym)
+{
+	bool hit;
+	struct property *prop;
+
+	str_printf(r, "Symbol: %s [=%s]\n", sym->name,
+	                               sym_get_string_value(sym));
+	for_all_prompts(sym, prop)
+		get_prompt_str(r, prop);
+	hit = false;
+	for_all_properties(sym, prop, P_SELECT) {
+		if (!hit) {
+			str_append(r, "  Selects: ");
+			hit = true;
+		} else
+			str_printf(r, " && ");
+		expr_gstr_print(prop->expr, r);
+	}
+	if (hit)
+		str_append(r, "\n");
+	if (sym->rev_dep.expr) {
+		str_append(r, "  Selected by: ");
+		expr_gstr_print(sym->rev_dep.expr, r);
+		str_append(r, "\n");
+	}
+	str_append(r, "\n\n");
+}
+
+static struct gstr get_relations_str(struct symbol **sym_arr)
+{
+	struct symbol *sym;
+	struct gstr res = str_new();
+	int i;
+
+	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
+		get_symbol_str(&res, sym);
+	if (!i)
+		str_append(&res, "No matches found.\n");
+	return res;
+}
+
+static void search_conf(void)
+{
+	struct symbol **sym_arr;
+	struct gstr res;
+	int dres;
+again:
+	dialog_clear();
+	dres = dialog_inputbox(_("Search Configuration Parameter"),
+			      _("Enter CT_ (sub)string to search for (omit CT_)"),
+			      10, 75, "");
+	switch (dres) {
+	case 0:
+		break;
+	case 1:
+		show_helptext(_("Search Configuration"), search_help);
+		goto again;
+	default:
+		return;
+	}
+
+	sym_arr = sym_re_search(dialog_input_result);
+	res = get_relations_str(sym_arr);
+	free(sym_arr);
+	show_textbox(_("Search Results"), str_get(&res), 0, 0);
+	str_free(&res);
+}
+
+static void build_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+	int type, tmp, doint = 2;
+	tristate val;
+	char ch;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (!sym) {
+		if (prop && menu != current_menu) {
+			const char *prompt = menu_get_prompt(menu);
+			switch (prop->type) {
+			case P_MENU:
+				child_count++;
+				if (single_menu_mode) {
+					item_make("%s%*c%s",
+						  menu->data ? "-->" : "++>",
+						  indent + 1, ' ', prompt);
+				} else
+					item_make("   %*c%s  --->", indent + 1, ' ', prompt);
+
+				item_set_tag('m');
+				item_set_data(menu);
+				if (single_menu_mode && menu->data)
+					goto conf_childs;
+				return;
+			default:
+				if (prompt) {
+					child_count++;
+					item_make("---%*c%s", indent + 1, ' ', prompt);
+					item_set_tag(':');
+					item_set_data(menu);
+				}
+			}
+		} else
+			doint = 0;
+		goto conf_childs;
+	}
+
+	type = sym_get_type(sym);
+	if (sym_is_choice(sym)) {
+		struct symbol *def_sym = sym_get_choice_value(sym);
+		struct menu *def_menu = NULL;
+
+		child_count++;
+		for (child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		val = sym_get_tristate_value(sym);
+		if (sym_is_changable(sym)) {
+			switch (type) {
+			case S_BOOLEAN:
+				item_make("[%c]", val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				item_make("<%c>", ch);
+				break;
+			}
+			item_set_tag('t');
+			item_set_data(menu);
+		} else {
+			item_make("   ");
+			item_set_tag(def_menu ? 't' : ':');
+			item_set_data(menu);
+		}
+
+		item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+		if (val == yes) {
+			if (def_menu) {
+				item_add_str(" (%s)", menu_get_prompt(def_menu));
+				item_add_str("  --->");
+				if (def_menu->list) {
+					indent += 2;
+					build_conf(def_menu);
+					indent -= 2;
+				}
+			}
+			return;
+		}
+	} else {
+		if (menu == current_menu) {
+			item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+			item_set_tag(':');
+			item_set_data(menu);
+			goto conf_childs;
+		}
+		child_count++;
+		val = sym_get_tristate_value(sym);
+		if (sym_is_choice_value(sym) && val == yes) {
+			item_make("   ");
+			item_set_tag(':');
+			item_set_data(menu);
+		} else {
+			switch (type) {
+			case S_BOOLEAN:
+				if (sym_is_changable(sym))
+					item_make("[%c]", val == no ? ' ' : '*');
+				else
+					item_make("---");
+				item_set_tag('t');
+				item_set_data(menu);
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				if (sym_is_changable(sym))
+					item_make("<%c>", ch);
+				else
+					item_make("---");
+				item_set_tag('t');
+				item_set_data(menu);
+				break;
+			default:
+				tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
+				item_make("(%s)", sym_get_string_value(sym));
+				tmp = indent - tmp + 4;
+				if (tmp < 0)
+					tmp = 0;
+				item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
+					     (sym_has_value(sym) || !sym_is_changable(sym)) ?
+					     "" : " (NEW)");
+				item_set_tag('s');
+				item_set_data(menu);
+				goto conf_childs;
+			}
+		}
+		item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
+			  (sym_has_value(sym) || !sym_is_changable(sym)) ?
+			  "" : " (NEW)");
+		if (menu->prompt->type == P_MENU) {
+			item_add_str("  --->");
+			return;
+		}
+	}
+
+conf_childs:
+	indent += doint;
+	for (child = menu->list; child; child = child->next)
+		build_conf(child);
+	indent -= doint;
+}
+
+static void conf(struct menu *menu)
+{
+	struct menu *submenu;
+	const char *prompt = menu_get_prompt(menu);
+	struct symbol *sym;
+	struct menu *active_menu = NULL;
+	int res;
+	int s_scroll = 0;
+
+	while (1) {
+		item_reset();
+		current_menu = menu;
+		build_conf(menu);
+		if (!child_count)
+			break;
+		if (menu == &rootmenu) {
+			item_make("--- ");
+			item_set_tag(':');
+			item_make(_("    Load an Alternate Configuration File"));
+			item_set_tag('L');
+			item_make(_("    Save an Alternate Configuration File"));
+			item_set_tag('S');
+		}
+		dialog_clear();
+		res = dialog_menu(prompt ? prompt : _("Main Menu"),
+				  _(menu_instructions),
+				  active_menu, &s_scroll);
+		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
+			break;
+		if (!item_activate_selected())
+			continue;
+		if (!item_tag())
+			continue;
+
+		submenu = item_data();
+		active_menu = item_data();
+		if (submenu)
+			sym = submenu->sym;
+		else
+			sym = NULL;
+
+		switch (res) {
+		case 0:
+			switch (item_tag()) {
+			case 'm':
+				if (single_menu_mode)
+					submenu->data = (void *) (long) !submenu->data;
+				else
+					conf(submenu);
+				break;
+			case 't':
+				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
+					conf_choice(submenu);
+				else if (submenu->prompt->type == P_MENU)
+					conf(submenu);
+				break;
+			case 's':
+				conf_string(submenu);
+				break;
+			case 'L':
+				conf_load();
+				break;
+			case 'S':
+				conf_save();
+				break;
+			}
+			break;
+		case 2:
+			if (sym)
+				show_help(submenu);
+			else
+				show_helptext("README", _(mconf_readme));
+			break;
+		case 3:
+			if (item_is_tag('t')) {
+				if (sym_set_tristate_value(sym, yes))
+					break;
+				if (sym_set_tristate_value(sym, mod))
+					show_textbox(NULL, setmod_text, 6, 74);
+			}
+			break;
+		case 4:
+			if (item_is_tag('t'))
+				sym_set_tristate_value(sym, no);
+			break;
+		case 5:
+			if (item_is_tag('t'))
+				sym_set_tristate_value(sym, mod);
+			break;
+		case 6:
+			if (item_is_tag('t'))
+				sym_toggle_tristate_value(sym);
+			else if (item_is_tag('m'))
+				conf(submenu);
+			break;
+		case 7:
+			search_conf();
+			break;
+		}
+	}
+}
+
+static void show_textbox(const char *title, const char *text, int r, int c)
+{
+	dialog_clear();
+	dialog_textbox(title, text, r, c);
+}
+
+static void show_helptext(const char *title, const char *text)
+{
+	show_textbox(title, text, 0, 0);
+}
+
+static void show_help(struct menu *menu)
+{
+	struct gstr help = str_new();
+	struct symbol *sym = menu->sym;
+
+	if (sym->help)
+	{
+		if (sym->name) {
+			str_printf(&help, "CT_%s:\n\n", sym->name);
+			str_append(&help, _(sym->help));
+			str_append(&help, "\n");
+		}
+	} else {
+		str_append(&help, nohelp_text);
+	}
+	get_symbol_str(&help, sym);
+	show_helptext(menu_get_prompt(menu), str_get(&help));
+	str_free(&help);
+}
+
+static void conf_choice(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	struct menu *child;
+	struct symbol *active;
+
+	active = sym_get_choice_value(menu->sym);
+	while (1) {
+		int res;
+		int selected;
+		item_reset();
+
+		current_menu = menu;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			item_make("%s", menu_get_prompt(child));
+			item_set_data(child);
+			if (child->sym == active)
+				item_set_selected(1);
+			if (child->sym == sym_get_choice_value(menu->sym))
+				item_set_tag('X');
+		}
+		dialog_clear();
+		res = dialog_checklist(prompt ? prompt : _("Main Menu"),
+					_(radiolist_instructions),
+					 15, 70, 6);
+		selected = item_activate_selected();
+		switch (res) {
+		case 0:
+			if (selected) {
+				child = item_data();
+				sym_set_tristate_value(child->sym, yes);
+			}
+			return;
+		case 1:
+			if (selected) {
+				child = item_data();
+				show_help(child);
+				active = child->sym;
+			} else
+				show_help(menu);
+			break;
+		case KEY_ESC:
+			return;
+		case -ERRDISPLAYTOOSMALL:
+			return;
+		}
+	}
+}
+
+static void conf_string(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+
+	while (1) {
+		int res;
+		char *heading;
+
+		switch (sym_get_type(menu->sym)) {
+		case S_INT:
+			heading = _(inputbox_instructions_int);
+			break;
+		case S_HEX:
+			heading = _(inputbox_instructions_hex);
+			break;
+		case S_STRING:
+			heading = _(inputbox_instructions_string);
+			break;
+		default:
+			heading = "Internal mconf error!";
+		}
+		dialog_clear();
+		res = dialog_inputbox(prompt ? prompt : _("Main Menu"),
+				      heading, 10, 75,
+				      sym_get_string_value(menu->sym));
+		switch (res) {
+		case 0:
+			if (sym_set_string_value(menu->sym, dialog_input_result))
+				return;
+			show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
+			break;
+		case 1:
+			show_help(menu);
+			break;
+		case KEY_ESC:
+			return;
+		}
+	}
+}
+
+static void conf_load(void)
+{
+
+	while (1) {
+		int res;
+		dialog_clear();
+		res = dialog_inputbox(NULL, load_config_text,
+				      11, 55, filename);
+		switch(res) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_read(dialog_input_result))
+				return;
+			show_textbox(NULL, _("File does not exist!"), 5, 38);
+			break;
+		case 1:
+			show_helptext(_("Load Alternate Configuration"), load_config_help);
+			break;
+		case KEY_ESC:
+			return;
+		}
+	}
+}
+
+static void conf_save(void)
+{
+	while (1) {
+		int res;
+		dialog_clear();
+		res = dialog_inputbox(NULL, save_config_text,
+				      11, 55, filename);
+		switch(res) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_write(dialog_input_result))
+				return;
+			show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);
+			break;
+		case 1:
+			show_helptext(_("Save Alternate Configuration"), save_config_help);
+			break;
+		case KEY_ESC:
+			return;
+		}
+	}
+}
+
+static void conf_cleanup(void)
+{
+	tcsetattr(1, TCSAFLUSH, &ios_org);
+}
+
+int main(int ac, char **av)
+{
+	struct symbol *sym;
+	char *mode;
+	int res;
+
+	setlocale(LC_ALL, "");
+	bindtextdomain(PACKAGE, LOCALEDIR);
+	textdomain(PACKAGE);
+
+	conf_parse(av[1] ? av[1] : "");
+	conf_read(NULL);
+
+	sym = sym_lookup("PROJECTVERSION", 0);
+	sym_calc_value(sym);
+	sprintf(menu_backtitle, _(PROJECT_NAME" v%s Configuration"),
+		sym_get_string_value(sym));
+
+	mode = getenv("MENUCONFIG_MODE");
+	if (mode) {
+		if (!strcasecmp(mode, "single_menu"))
+			single_menu_mode = 1;
+	}
+
+	tcgetattr(1, &ios_org);
+	atexit(conf_cleanup);
+	init_wsize();
+	reset_dialog();
+	init_dialog(menu_backtitle);
+	do {
+		conf(&rootmenu);
+		dialog_clear();
+		res = dialog_yesno(NULL,
+				   _("Do you wish to save your "
+				     "new "PROJECT_NAME" configuration?\n"
+				     "<ESC><ESC> to continue."),
+				   6, 60);
+	} while (res == KEY_ESC);
+	end_dialog();
+	if (res == 0) {
+		if (conf_write(NULL)) {
+			fprintf(stderr, _("\n\n"
+				"Error writing "PROJECT_NAME" configuration.\n"
+				"Your configuration changes were NOT saved."
+				"\n\n"));
+			return 1;
+		}
+		printf(_("\n\n"
+			"*** End of "PROJECT_NAME" configuration.\n"
+			"*** Execute 'make' to build, or try 'make help'."
+			"\n\n"));
+	} else {
+		fprintf(stderr, _("\n\n"
+			"Your configuration changes were NOT saved."
+			"\n\n"));
+	}
+
+	return 0;
+}
diff --git a/kconfig/menu.c b/kconfig/menu.c
new file mode 100644
index 00000000..c86c27f2
--- /dev/null
+++ b/kconfig/menu.c
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct menu rootmenu;
+static struct menu **last_entry_ptr;
+
+struct file *file_list;
+struct file *current_file;
+
+static void menu_warn(struct menu *menu, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+static void prop_warn(struct property *prop, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+void menu_init(void)
+{
+	current_entry = current_menu = &rootmenu;
+	last_entry_ptr = &rootmenu.list;
+}
+
+void menu_add_entry(struct symbol *sym)
+{
+	struct menu *menu;
+
+	menu = malloc(sizeof(*menu));
+	memset(menu, 0, sizeof(*menu));
+	menu->sym = sym;
+	menu->parent = current_menu;
+	menu->file = current_file;
+	menu->lineno = zconf_lineno();
+
+	*last_entry_ptr = menu;
+	last_entry_ptr = &menu->next;
+	current_entry = menu;
+}
+
+void menu_end_entry(void)
+{
+}
+
+struct menu *menu_add_menu(void)
+{
+	menu_end_entry();
+	last_entry_ptr = &current_entry->list;
+	return current_menu = current_entry;
+}
+
+void menu_end_menu(void)
+{
+	last_entry_ptr = &current_menu->next;
+	current_menu = current_menu->parent;
+}
+
+struct expr *menu_check_dep(struct expr *e)
+{
+	if (!e)
+		return e;
+
+	switch (e->type) {
+	case E_NOT:
+		e->left.expr = menu_check_dep(e->left.expr);
+		break;
+	case E_OR:
+	case E_AND:
+		e->left.expr = menu_check_dep(e->left.expr);
+		e->right.expr = menu_check_dep(e->right.expr);
+		break;
+	case E_SYMBOL:
+		/* change 'm' into 'm' && MODULES */
+		if (e->left.sym == &symbol_mod)
+			return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
+		break;
+	default:
+		break;
+	}
+	return e;
+}
+
+void menu_add_dep(struct expr *dep)
+{
+	current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+}
+
+void menu_set_type(int type)
+{
+	struct symbol *sym = current_entry->sym;
+
+	if (sym->type == type)
+		return;
+	if (sym->type == S_UNKNOWN) {
+		sym->type = type;
+		return;
+	}
+	menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'",
+	    sym->name ? sym->name : "<choice>",
+	    sym_type_name(sym->type), sym_type_name(type));
+}
+
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
+{
+	struct property *prop = prop_alloc(type, current_entry->sym);
+
+	prop->menu = current_entry;
+	prop->expr = expr;
+	prop->visible.expr = menu_check_dep(dep);
+
+	if (prompt) {
+		if (isspace(*prompt)) {
+			prop_warn(prop, "leading whitespace ignored");
+			while (isspace(*prompt))
+				prompt++;
+		}
+		if (current_entry->prompt)
+			prop_warn(prop, "prompt redefined");
+		current_entry->prompt = prop;
+	}
+	prop->text = prompt;
+
+	return prop;
+}
+
+struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
+{
+	return menu_add_prop(type, prompt, NULL, dep);
+}
+
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr, dep);
+}
+
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
+}
+
+void menu_add_option(int token, char *arg)
+{
+	struct property *prop;
+
+	switch (token) {
+	case T_OPT_MODULES:
+		prop = prop_alloc(P_DEFAULT, modules_sym);
+		prop->expr = expr_alloc_symbol(current_entry->sym);
+		break;
+	case T_OPT_DEFCONFIG_LIST:
+		if (!sym_defconfig_list)
+			sym_defconfig_list = current_entry->sym;
+		else if (sym_defconfig_list != current_entry->sym)
+			zconf_error("trying to redefine defconfig symbol");
+		break;
+	}
+}
+
+static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
+{
+	return sym2->type == S_INT || sym2->type == S_HEX ||
+	       (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
+}
+
+void sym_check_prop(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *sym2;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		switch (prop->type) {
+		case P_DEFAULT:
+			if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
+			    prop->expr->type != E_SYMBOL)
+				prop_warn(prop,
+				    "default for config symbol '%'"
+				    " must be a single symbol", sym->name);
+			break;
+		case P_SELECT:
+			sym2 = prop_get_symbol(prop);
+			if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
+				prop_warn(prop,
+				    "config symbol '%s' uses select, but is "
+				    "not boolean or tristate", sym->name);
+			else if (sym2->type == S_UNKNOWN)
+				prop_warn(prop,
+				    "'select' used by config symbol '%s' "
+				    "refer to undefined symbol '%s'",
+				    sym->name, sym2->name);
+			else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+				prop_warn(prop,
+				    "'%s' has wrong type. 'select' only "
+				    "accept arguments of boolean and "
+				    "tristate type", sym2->name);
+			break;
+		case P_RANGE:
+			if (sym->type != S_INT && sym->type != S_HEX)
+				prop_warn(prop, "range is only allowed "
+				                "for int or hex symbols");
+			if (!menu_range_valid_sym(sym, prop->expr->left.sym) ||
+			    !menu_range_valid_sym(sym, prop->expr->right.sym))
+				prop_warn(prop, "range is invalid");
+			break;
+		default:
+			;
+		}
+	}
+}
+
+void menu_finalize(struct menu *parent)
+{
+	struct menu *menu, *last_menu;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *parentdep, *basedep, *dep, *dep2, **ep;
+
+	sym = parent->sym;
+	if (parent->list) {
+		if (sym && sym_is_choice(sym)) {
+			/* find the first choice value and find out choice type */
+			for (menu = parent->list; menu; menu = menu->next) {
+				if (menu->sym) {
+					current_entry = parent;
+					menu_set_type(menu->sym->type);
+					current_entry = menu;
+					menu_set_type(sym->type);
+					break;
+				}
+			}
+			parentdep = expr_alloc_symbol(sym);
+		} else if (parent->prompt)
+			parentdep = parent->prompt->visible.expr;
+		else
+			parentdep = parent->dep;
+
+		for (menu = parent->list; menu; menu = menu->next) {
+			basedep = expr_transform(menu->dep);
+			basedep = expr_alloc_and(expr_copy(parentdep), basedep);
+			basedep = expr_eliminate_dups(basedep);
+			menu->dep = basedep;
+			if (menu->sym)
+				prop = menu->sym->prop;
+			else
+				prop = menu->prompt;
+			for (; prop; prop = prop->next) {
+				if (prop->menu != menu)
+					continue;
+				dep = expr_transform(prop->visible.expr);
+				dep = expr_alloc_and(expr_copy(basedep), dep);
+				dep = expr_eliminate_dups(dep);
+				if (menu->sym && menu->sym->type != S_TRISTATE)
+					dep = expr_trans_bool(dep);
+				prop->visible.expr = dep;
+				if (prop->type == P_SELECT) {
+					struct symbol *es = prop_get_symbol(prop);
+					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+				}
+			}
+		}
+		for (menu = parent->list; menu; menu = menu->next)
+			menu_finalize(menu);
+	} else if (sym) {
+		basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
+		basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
+		basedep = expr_eliminate_dups(expr_transform(basedep));
+		last_menu = NULL;
+		for (menu = parent->next; menu; menu = menu->next) {
+			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
+			if (!expr_contains_symbol(dep, sym))
+				break;
+			if (expr_depends_symbol(dep, sym))
+				goto next;
+			dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
+			dep = expr_eliminate_dups(expr_transform(dep));
+			dep2 = expr_copy(basedep);
+			expr_eliminate_eq(&dep, &dep2);
+			expr_free(dep);
+			if (!expr_is_yes(dep2)) {
+				expr_free(dep2);
+				break;
+			}
+			expr_free(dep2);
+		next:
+			menu_finalize(menu);
+			menu->parent = parent;
+			last_menu = menu;
+		}
+		if (last_menu) {
+			parent->list = parent->next;
+			parent->next = last_menu->next;
+			last_menu->next = NULL;
+		}
+	}
+	for (menu = parent->list; menu; menu = menu->next) {
+		if (sym && sym_is_choice(sym) && menu->sym) {
+			menu->sym->flags |= SYMBOL_CHOICEVAL;
+			if (!menu->prompt)
+				menu_warn(menu, "choice value must have a prompt");
+			for (prop = menu->sym->prop; prop; prop = prop->next) {
+				if (prop->type == P_PROMPT && prop->menu != menu) {
+					prop_warn(prop, "choice values "
+					    "currently only support a "
+					    "single prompt");
+				}
+				if (prop->type == P_DEFAULT)
+					prop_warn(prop, "defaults for choice "
+					    "values not supported");
+			}
+			current_entry = menu;
+			menu_set_type(sym->type);
+			menu_add_symbol(P_CHOICE, sym, NULL);
+			prop = sym_get_choice_prop(sym);
+			for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
+				;
+			*ep = expr_alloc_one(E_CHOICE, NULL);
+			(*ep)->right.sym = menu->sym;
+		}
+		if (menu->list && (!menu->prompt || !menu->prompt->text)) {
+			for (last_menu = menu->list; ; last_menu = last_menu->next) {
+				last_menu->parent = parent;
+				if (!last_menu->next)
+					break;
+			}
+			last_menu->next = menu->next;
+			menu->next = menu->list;
+			menu->list = NULL;
+		}
+	}
+
+	if (sym && !(sym->flags & SYMBOL_WARNED)) {
+		if (sym->type == S_UNKNOWN)
+			menu_warn(parent, "config symbol defined without type");
+
+		if (sym_is_choice(sym) && !parent->prompt)
+			menu_warn(parent, "choice must have a prompt");
+
+		/* Check properties connected to this symbol */
+		sym_check_prop(sym);
+		sym->flags |= SYMBOL_WARNED;
+	}
+
+	if (sym && !sym_is_optional(sym) && parent->prompt) {
+		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
+				expr_alloc_and(parent->prompt->visible.expr,
+					expr_alloc_symbol(&symbol_mod)));
+	}
+}
+
+bool menu_is_visible(struct menu *menu)
+{
+	struct menu *child;
+	struct symbol *sym;
+	tristate visible;
+
+	if (!menu->prompt)
+		return false;
+	sym = menu->sym;
+	if (sym) {
+		sym_calc_value(sym);
+		visible = menu->prompt->visible.tri;
+	} else
+		visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
+
+	if (visible != no)
+		return true;
+	if (!sym || sym_get_tristate_value(menu->sym) == no)
+		return false;
+
+	for (child = menu->list; child; child = child->next)
+		if (menu_is_visible(child))
+			return true;
+	return false;
+}
+
+const char *menu_get_prompt(struct menu *menu)
+{
+	if (menu->prompt)
+		return _(menu->prompt->text);
+	else if (menu->sym)
+		return _(menu->sym->name);
+	return NULL;
+}
+
+struct menu *menu_get_root_menu(struct menu *menu)
+{
+	return &rootmenu;
+}
+
+struct menu *menu_get_parent_menu(struct menu *menu)
+{
+	enum prop_type type;
+
+	for (; menu != &rootmenu; menu = menu->parent) {
+		type = menu->prompt ? menu->prompt->type : 0;
+		if (type == P_MENU)
+			break;
+	}
+	return menu;
+}
+
diff --git a/kconfig/symbol.c b/kconfig/symbol.c
new file mode 100644
index 00000000..34f42fb2
--- /dev/null
+++ b/kconfig/symbol.c
@@ -0,0 +1,882 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <regex.h>
+#include <sys/utsname.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct symbol symbol_yes = {
+	.name = "y",
+	.curr = { "y", yes },
+	.flags = SYMBOL_CONST|SYMBOL_VALID,
+}, symbol_mod = {
+	.name = "m",
+	.curr = { "m", mod },
+	.flags = SYMBOL_CONST|SYMBOL_VALID,
+}, symbol_no = {
+	.name = "n",
+	.curr = { "n", no },
+	.flags = SYMBOL_CONST|SYMBOL_VALID,
+}, symbol_empty = {
+	.name = "",
+	.curr = { "", no },
+	.flags = SYMBOL_VALID,
+};
+
+int sym_change_count;
+struct symbol *sym_defconfig_list;
+struct symbol *modules_sym;
+tristate modules_val;
+
+void sym_add_default(struct symbol *sym, const char *def)
+{
+	struct property *prop = prop_alloc(P_DEFAULT, sym);
+
+	prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
+}
+
+void sym_init(void)
+{
+	struct symbol *sym;
+	struct utsname uts;
+	char *p;
+	static bool inited = false;
+
+	if (inited)
+		return;
+	inited = true;
+
+	uname(&uts);
+
+	sym = sym_lookup("ARCH", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("ARCH");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("PROJECTVERSION", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("PROJECTVERSION");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("UNAME_RELEASE", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	sym_add_default(sym, uts.release);
+}
+
+enum symbol_type sym_get_type(struct symbol *sym)
+{
+	enum symbol_type type = sym->type;
+
+	if (type == S_TRISTATE) {
+		if (sym_is_choice_value(sym) && sym->visible == yes)
+			type = S_BOOLEAN;
+		else if (modules_val == no)
+			type = S_BOOLEAN;
+	}
+	return type;
+}
+
+const char *sym_type_name(enum symbol_type type)
+{
+	switch (type) {
+	case S_BOOLEAN:
+		return "boolean";
+	case S_TRISTATE:
+		return "tristate";
+	case S_INT:
+		return "integer";
+	case S_HEX:
+		return "hex";
+	case S_STRING:
+		return "string";
+	case S_UNKNOWN:
+		return "unknown";
+	case S_OTHER:
+		break;
+	}
+	return "???";
+}
+
+struct property *sym_get_choice_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_choices(sym, prop)
+		return prop;
+	return NULL;
+}
+
+struct property *sym_get_default_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+struct property *sym_get_range_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_properties(sym, prop, P_RANGE) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+static int sym_get_range_val(struct symbol *sym, int base)
+{
+	sym_calc_value(sym);
+	switch (sym->type) {
+	case S_INT:
+		base = 10;
+		break;
+	case S_HEX:
+		base = 16;
+		break;
+	default:
+		break;
+	}
+	return strtol(sym->curr.val, NULL, base);
+}
+
+static void sym_validate_range(struct symbol *sym)
+{
+	struct property *prop;
+	int base, val, val2;
+	char str[64];
+
+	switch (sym->type) {
+	case S_INT:
+		base = 10;
+		break;
+	case S_HEX:
+		base = 16;
+		break;
+	default:
+		return;
+	}
+	prop = sym_get_range_prop(sym);
+	if (!prop)
+		return;
+	val = strtol(sym->curr.val, NULL, base);
+	val2 = sym_get_range_val(prop->expr->left.sym, base);
+	if (val >= val2) {
+		val2 = sym_get_range_val(prop->expr->right.sym, base);
+		if (val <= val2)
+			return;
+	}
+	if (sym->type == S_INT)
+		sprintf(str, "%d", val2);
+	else
+		sprintf(str, "0x%x", val2);
+	sym->curr.val = strdup(str);
+}
+
+static void sym_calc_visibility(struct symbol *sym)
+{
+	struct property *prop;
+	tristate tri;
+
+	/* any prompt visible? */
+	tri = no;
+	for_all_prompts(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		tri = E_OR(tri, prop->visible.tri);
+	}
+	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
+		tri = yes;
+	if (sym->visible != tri) {
+		sym->visible = tri;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym))
+		return;
+	tri = no;
+	if (sym->rev_dep.expr)
+		tri = expr_calc_value(sym->rev_dep.expr);
+	if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
+		tri = yes;
+	if (sym->rev_dep.tri != tri) {
+		sym->rev_dep.tri = tri;
+		sym_set_changed(sym);
+	}
+}
+
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+	struct symbol *def_sym;
+	struct property *prop;
+	struct expr *e;
+
+	/* is the user choice visible? */
+	def_sym = sym->def[S_DEF_USER].val;
+	if (def_sym) {
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* any of the defaults visible? */
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri == no)
+			continue;
+		def_sym = prop_get_symbol(prop);
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* just get the first visible value */
+	prop = sym_get_choice_prop(sym);
+	for (e = prop->expr; e; e = e->left.expr) {
+		def_sym = e->right.sym;
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* no choice? reset tristate value */
+	sym->curr.tri = no;
+	return NULL;
+}
+
+void sym_calc_value(struct symbol *sym)
+{
+	struct symbol_value newval, oldval;
+	struct property *prop;
+	struct expr *e;
+
+	if (!sym)
+		return;
+
+	if (sym->flags & SYMBOL_VALID)
+		return;
+	sym->flags |= SYMBOL_VALID;
+
+	oldval = sym->curr;
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		newval = symbol_empty.curr;
+		break;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		newval = symbol_no.curr;
+		break;
+	default:
+		sym->curr.val = sym->name;
+		sym->curr.tri = no;
+		return;
+	}
+	if (!sym_is_choice_value(sym))
+		sym->flags &= ~SYMBOL_WRITE;
+
+	sym_calc_visibility(sym);
+
+	/* set default if recursively called */
+	sym->curr = newval;
+
+	switch (sym_get_type(sym)) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		if (sym_is_choice_value(sym) && sym->visible == yes) {
+			prop = sym_get_choice_prop(sym);
+			newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
+		} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym))
+				newval.tri = sym->def[S_DEF_USER].tri;
+			else if (!sym_is_choice(sym)) {
+				prop = sym_get_default_prop(sym);
+				if (prop)
+					newval.tri = expr_calc_value(prop->expr);
+			}
+			newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
+		} else if (!sym_is_choice(sym)) {
+			prop = sym_get_default_prop(sym);
+			if (prop) {
+				sym->flags |= SYMBOL_WRITE;
+				newval.tri = expr_calc_value(prop->expr);
+			}
+		}
+		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
+			newval.tri = yes;
+		break;
+	case S_STRING:
+	case S_HEX:
+	case S_INT:
+		if (sym->visible != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym)) {
+				newval.val = sym->def[S_DEF_USER].val;
+				break;
+			}
+		}
+		prop = sym_get_default_prop(sym);
+		if (prop) {
+			struct symbol *ds = prop_get_symbol(prop);
+			if (ds) {
+				sym->flags |= SYMBOL_WRITE;
+				sym_calc_value(ds);
+				newval.val = ds->curr.val;
+			}
+		}
+		break;
+	default:
+		;
+	}
+
+	sym->curr = newval;
+	if (sym_is_choice(sym) && newval.tri == yes)
+		sym->curr.val = sym_calc_choice(sym);
+	sym_validate_range(sym);
+
+	if (memcmp(&oldval, &sym->curr, sizeof(oldval))) {
+		sym_set_changed(sym);
+		if (modules_sym == sym) {
+			sym_set_all_changed();
+			modules_val = modules_sym->curr.tri;
+		}
+	}
+
+	if (sym_is_choice(sym)) {
+		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr) {
+			e->right.sym->flags |= flags;
+			if (flags & SYMBOL_CHANGED)
+				sym_set_changed(e->right.sym);
+		}
+	}
+}
+
+void sym_clear_all_valid(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym->flags &= ~SYMBOL_VALID;
+	sym_change_count++;
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+}
+
+void sym_set_changed(struct symbol *sym)
+{
+	struct property *prop;
+
+	sym->flags |= SYMBOL_CHANGED;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu)
+			prop->menu->flags |= MENU_CHANGED;
+	}
+}
+
+void sym_set_all_changed(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym_set_changed(sym);
+}
+
+bool sym_tristate_within_range(struct symbol *sym, tristate val)
+{
+	int type = sym_get_type(sym);
+
+	if (sym->visible == no)
+		return false;
+
+	if (type != S_BOOLEAN && type != S_TRISTATE)
+		return false;
+
+	if (type == S_BOOLEAN && val == mod)
+		return false;
+	if (sym->visible <= sym->rev_dep.tri)
+		return false;
+	if (sym_is_choice_value(sym) && sym->visible == yes)
+		return val == yes;
+	return val >= sym->rev_dep.tri && val <= sym->visible;
+}
+
+bool sym_set_tristate_value(struct symbol *sym, tristate val)
+{
+	tristate oldval = sym_get_tristate_value(sym);
+
+	if (oldval != val && !sym_tristate_within_range(sym, val))
+		return false;
+
+	if (!(sym->flags & SYMBOL_DEF_USER)) {
+		sym->flags |= SYMBOL_DEF_USER;
+		sym_set_changed(sym);
+	}
+	/*
+	 * setting a choice value also resets the new flag of the choice
+	 * symbol and all other choice values.
+	 */
+	if (sym_is_choice_value(sym) && val == yes) {
+		struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+		struct property *prop;
+		struct expr *e;
+
+		cs->def[S_DEF_USER].val = sym;
+		cs->flags |= SYMBOL_DEF_USER;
+		prop = sym_get_choice_prop(cs);
+		for (e = prop->expr; e; e = e->left.expr) {
+			if (e->right.sym->visible != no)
+				e->right.sym->flags |= SYMBOL_DEF_USER;
+		}
+	}
+
+	sym->def[S_DEF_USER].tri = val;
+	if (oldval != val)
+		sym_clear_all_valid();
+
+	return true;
+}
+
+tristate sym_toggle_tristate_value(struct symbol *sym)
+{
+	tristate oldval, newval;
+
+	oldval = newval = sym_get_tristate_value(sym);
+	do {
+		switch (newval) {
+		case no:
+			newval = mod;
+			break;
+		case mod:
+			newval = yes;
+			break;
+		case yes:
+			newval = no;
+			break;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			break;
+	} while (oldval != newval);
+	return newval;
+}
+
+bool sym_string_valid(struct symbol *sym, const char *str)
+{
+	signed char ch;
+
+	switch (sym->type) {
+	case S_STRING:
+		return true;
+	case S_INT:
+		ch = *str++;
+		if (ch == '-')
+			ch = *str++;
+		if (!isdigit(ch))
+			return false;
+		if (ch == '0' && *str != 0)
+			return false;
+		while ((ch = *str++)) {
+			if (!isdigit(ch))
+				return false;
+		}
+		return true;
+	case S_HEX:
+		if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+			str += 2;
+		ch = *str++;
+		do {
+			if (!isxdigit(ch))
+				return false;
+		} while ((ch = *str++));
+		return true;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+		case 'm': case 'M':
+		case 'n': case 'N':
+			return true;
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_string_within_range(struct symbol *sym, const char *str)
+{
+	struct property *prop;
+	int val;
+
+	switch (sym->type) {
+	case S_STRING:
+		return sym_string_valid(sym, str);
+	case S_INT:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 10);
+		return val >= sym_get_range_val(prop->expr->left.sym, 10) &&
+		       val <= sym_get_range_val(prop->expr->right.sym, 10);
+	case S_HEX:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 16);
+		return val >= sym_get_range_val(prop->expr->left.sym, 16) &&
+		       val <= sym_get_range_val(prop->expr->right.sym, 16);
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+			return sym_tristate_within_range(sym, yes);
+		case 'm': case 'M':
+			return sym_tristate_within_range(sym, mod);
+		case 'n': case 'N':
+			return sym_tristate_within_range(sym, no);
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_set_string_value(struct symbol *sym, const char *newval)
+{
+	const char *oldval;
+	char *val;
+	int size;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (newval[0]) {
+		case 'y': case 'Y':
+			return sym_set_tristate_value(sym, yes);
+		case 'm': case 'M':
+			return sym_set_tristate_value(sym, mod);
+		case 'n': case 'N':
+			return sym_set_tristate_value(sym, no);
+		}
+		return false;
+	default:
+		;
+	}
+
+	if (!sym_string_within_range(sym, newval))
+		return false;
+
+	if (!(sym->flags & SYMBOL_DEF_USER)) {
+		sym->flags |= SYMBOL_DEF_USER;
+		sym_set_changed(sym);
+	}
+
+	oldval = sym->def[S_DEF_USER].val;
+	size = strlen(newval) + 1;
+	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
+		size += 2;
+		sym->def[S_DEF_USER].val = val = malloc(size);
+		*val++ = '0';
+		*val++ = 'x';
+	} else if (!oldval || strcmp(oldval, newval))
+		sym->def[S_DEF_USER].val = val = malloc(size);
+	else
+		return true;
+
+	strcpy(val, newval);
+	free((void *)oldval);
+	sym_clear_all_valid();
+
+	return true;
+}
+
+const char *sym_get_string_value(struct symbol *sym)
+{
+	tristate val;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		val = sym_get_tristate_value(sym);
+		switch (val) {
+		case no:
+			return "n";
+		case mod:
+			return "m";
+		case yes:
+			return "y";
+		}
+		break;
+	default:
+		;
+	}
+	return (const char *)sym->curr.val;
+}
+
+bool sym_is_changable(struct symbol *sym)
+{
+	return sym->visible > sym->rev_dep.tri;
+}
+
+struct symbol *sym_lookup(const char *name, int isconst)
+{
+	struct symbol *symbol;
+	const char *ptr;
+	char *new_name;
+	int hash = 0;
+
+	if (name) {
+		if (name[0] && !name[1]) {
+			switch (name[0]) {
+			case 'y': return &symbol_yes;
+			case 'm': return &symbol_mod;
+			case 'n': return &symbol_no;
+			}
+		}
+		for (ptr = name; *ptr; ptr++)
+			hash += *ptr;
+		hash &= 0xff;
+
+		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+			if (!strcmp(symbol->name, name)) {
+				if ((isconst && symbol->flags & SYMBOL_CONST) ||
+				    (!isconst && !(symbol->flags & SYMBOL_CONST)))
+					return symbol;
+			}
+		}
+		new_name = strdup(name);
+	} else {
+		new_name = NULL;
+		hash = 256;
+	}
+
+	symbol = malloc(sizeof(*symbol));
+	memset(symbol, 0, sizeof(*symbol));
+	symbol->name = new_name;
+	symbol->type = S_UNKNOWN;
+	if (isconst)
+		symbol->flags |= SYMBOL_CONST;
+
+	symbol->next = symbol_hash[hash];
+	symbol_hash[hash] = symbol;
+
+	return symbol;
+}
+
+struct symbol *sym_find(const char *name)
+{
+	struct symbol *symbol = NULL;
+	const char *ptr;
+	int hash = 0;
+
+	if (!name)
+		return NULL;
+
+	if (name[0] && !name[1]) {
+		switch (name[0]) {
+		case 'y': return &symbol_yes;
+		case 'm': return &symbol_mod;
+		case 'n': return &symbol_no;
+		}
+	}
+	for (ptr = name; *ptr; ptr++)
+		hash += *ptr;
+	hash &= 0xff;
+
+	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+		if (!strcmp(symbol->name, name) &&
+		    !(symbol->flags & SYMBOL_CONST))
+				break;
+	}
+
+	return symbol;
+}
+
+struct symbol **sym_re_search(const char *pattern)
+{
+	struct symbol *sym, **sym_arr = NULL;
+	int i, cnt, size;
+	regex_t re;
+
+	cnt = size = 0;
+	/* Skip if empty */
+	if (strlen(pattern) == 0)
+		return NULL;
+	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
+		return NULL;
+
+	for_all_symbols(i, sym) {
+		if (sym->flags & SYMBOL_CONST || !sym->name)
+			continue;
+		if (regexec(&re, sym->name, 0, NULL, 0))
+			continue;
+		if (cnt + 1 >= size) {
+			void *tmp = sym_arr;
+			size += 16;
+			sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
+			if (!sym_arr) {
+				free(tmp);
+				return NULL;
+			}
+		}
+		sym_arr[cnt++] = sym;
+	}
+	if (sym_arr)
+		sym_arr[cnt] = NULL;
+	regfree(&re);
+
+	return sym_arr;
+}
+
+
+struct symbol *sym_check_deps(struct symbol *sym);
+
+static struct symbol *sym_check_expr_deps(struct expr *e)
+{
+	struct symbol *sym;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_OR:
+	case E_AND:
+		sym = sym_check_expr_deps(e->left.expr);
+		if (sym)
+			return sym;
+		return sym_check_expr_deps(e->right.expr);
+	case E_NOT:
+		return sym_check_expr_deps(e->left.expr);
+	case E_EQUAL:
+	case E_UNEQUAL:
+		sym = sym_check_deps(e->left.sym);
+		if (sym)
+			return sym;
+		return sym_check_deps(e->right.sym);
+	case E_SYMBOL:
+		return sym_check_deps(e->left.sym);
+	default:
+		break;
+	}
+	printf("Oops! How to check %d?\n", e->type);
+	return NULL;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+	struct symbol *sym2;
+	struct property *prop;
+
+	if (sym->flags & SYMBOL_CHECK) {
+		printf("Warning! Found recursive dependency: %s", sym->name);
+		return sym;
+	}
+	if (sym->flags & SYMBOL_CHECKED)
+		return NULL;
+
+	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+	sym2 = sym_check_expr_deps(sym->rev_dep.expr);
+	if (sym2)
+		goto out;
+
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->type == P_CHOICE || prop->type == P_SELECT)
+			continue;
+		sym2 = sym_check_expr_deps(prop->visible.expr);
+		if (sym2)
+			goto out;
+		if (prop->type != P_DEFAULT || sym_is_choice(sym))
+			continue;
+		sym2 = sym_check_expr_deps(prop->expr);
+		if (sym2)
+			goto out;
+	}
+out:
+	if (sym2) {
+		printf(" %s", sym->name);
+		if (sym2 == sym) {
+			printf("\n");
+			sym2 = NULL;
+		}
+	}
+	sym->flags &= ~SYMBOL_CHECK;
+	return sym2;
+}
+
+struct property *prop_alloc(enum prop_type type, struct symbol *sym)
+{
+	struct property *prop;
+	struct property **propp;
+
+	prop = malloc(sizeof(*prop));
+	memset(prop, 0, sizeof(*prop));
+	prop->type = type;
+	prop->sym = sym;
+	prop->file = current_file;
+	prop->lineno = zconf_lineno();
+
+	/* append property to the prop list of symbol */
+	if (sym) {
+		for (propp = &sym->prop; *propp; propp = &(*propp)->next)
+			;
+		*propp = prop;
+	}
+
+	return prop;
+}
+
+struct symbol *prop_get_symbol(struct property *prop)
+{
+	if (prop->expr && (prop->expr->type == E_SYMBOL ||
+			   prop->expr->type == E_CHOICE))
+		return prop->expr->left.sym;
+	return NULL;
+}
+
+const char *prop_get_type_name(enum prop_type type)
+{
+	switch (type) {
+	case P_PROMPT:
+		return "prompt";
+	case P_COMMENT:
+		return "comment";
+	case P_MENU:
+		return "menu";
+	case P_DEFAULT:
+		return "default";
+	case P_CHOICE:
+		return "choice";
+	case P_SELECT:
+		return "select";
+	case P_RANGE:
+		return "range";
+	case P_UNKNOWN:
+		break;
+	}
+	return "unknown";
+}
diff --git a/kconfig/util.c b/kconfig/util.c
new file mode 100644
index 00000000..e3f28b9d
--- /dev/null
+++ b/kconfig/util.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
+ * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
+ *
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <string.h>
+#include "lkc.h"
+
+/* file already present in list? If not add it */
+struct file *file_lookup(const char *name)
+{
+	struct file *file;
+
+	for (file = file_list; file; file = file->next) {
+		if (!strcmp(name, file->name))
+			return file;
+	}
+
+	file = malloc(sizeof(*file));
+	memset(file, 0, sizeof(*file));
+	file->name = strdup(name);
+	file->next = file_list;
+	file_list = file;
+	return file;
+}
+
+/* write a dependency file as used by kbuild to track dependencies */
+int file_write_dep(const char *name)
+{
+	struct file *file;
+	FILE *out;
+
+	if (!name)
+		name = ".kconfig.d";
+	out = fopen("..config.tmp", "w");
+	if (!out)
+		return 1;
+	fprintf(out, "deps_config := \\\n");
+	for (file = file_list; file; file = file->next) {
+		if (file->next)
+			fprintf(out, "\t%s \\\n", file->name);
+		else
+			fprintf(out, "\t%s\n", file->name);
+	}
+	fprintf(out, "\ninclude/config/auto.conf: \\\n"
+		     "\t$(deps_config)\n\n"
+		     "$(deps_config): ;\n");
+	fclose(out);
+	rename("..config.tmp", name);
+	return 0;
+}
+
+
+/* Allocate initial growable sting */
+struct gstr str_new(void)
+{
+	struct gstr gs;
+	gs.s = malloc(sizeof(char) * 64);
+	gs.len = 16;
+	strcpy(gs.s, "\0");
+	return gs;
+}
+
+/* Allocate and assign growable string */
+struct gstr str_assign(const char *s)
+{
+	struct gstr gs;
+	gs.s = strdup(s);
+	gs.len = strlen(s) + 1;
+	return gs;
+}
+
+/* Free storage for growable string */
+void str_free(struct gstr *gs)
+{
+	if (gs->s)
+		free(gs->s);
+	gs->s = NULL;
+	gs->len = 0;
+}
+
+/* Append to growable string */
+void str_append(struct gstr *gs, const char *s)
+{
+	size_t l = strlen(gs->s) + strlen(s) + 1;
+	if (l > gs->len) {
+		gs->s   = realloc(gs->s, l);
+		gs->len = l;
+	}
+	strcat(gs->s, s);
+}
+
+/* Append printf formatted string to growable string */
+void str_printf(struct gstr *gs, const char *fmt, ...)
+{
+	va_list ap;
+	char s[10000]; /* big enough... */
+	va_start(ap, fmt);
+	vsnprintf(s, sizeof(s), fmt, ap);
+	str_append(gs, s);
+	va_end(ap);
+}
+
+/* Retrieve value of growable string */
+const char *str_get(struct gstr *gs)
+{
+	return gs->s;
+}
+
diff --git a/kconfig/zconf.hash.c_shipped b/kconfig/zconf.hash.c_shipped
new file mode 100644
index 00000000..47c8b5ba
--- /dev/null
+++ b/kconfig/zconf.hash.c_shipped
@@ -0,0 +1,242 @@
+/* ANSI-C code produced by gperf version 3.0.1 */
+/* Command-line: gperf  */
+/* Computed positions: -k'1,3' */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+struct kconf_id;
+/* maximum key range = 45, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+kconf_id_hash (register const char *str, register unsigned int len)
+{
+  static unsigned char asso_values[] =
+    {
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 25, 30, 15,
+       0, 15,  0, 47,  5, 15, 47, 47, 30, 20,
+       5,  0, 25, 15,  0,  0, 10, 35, 47, 47,
+       5, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+      47, 47, 47, 47, 47, 47
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval;
+}
+
+struct kconf_id_strings_t
+  {
+    char kconf_id_strings_str2[sizeof("on")];
+    char kconf_id_strings_str6[sizeof("string")];
+    char kconf_id_strings_str7[sizeof("default")];
+    char kconf_id_strings_str8[sizeof("def_bool")];
+    char kconf_id_strings_str10[sizeof("range")];
+    char kconf_id_strings_str11[sizeof("def_boolean")];
+    char kconf_id_strings_str12[sizeof("def_tristate")];
+    char kconf_id_strings_str13[sizeof("hex")];
+    char kconf_id_strings_str14[sizeof("defconfig_list")];
+    char kconf_id_strings_str16[sizeof("option")];
+    char kconf_id_strings_str17[sizeof("if")];
+    char kconf_id_strings_str18[sizeof("optional")];
+    char kconf_id_strings_str20[sizeof("endif")];
+    char kconf_id_strings_str21[sizeof("choice")];
+    char kconf_id_strings_str22[sizeof("endmenu")];
+    char kconf_id_strings_str23[sizeof("requires")];
+    char kconf_id_strings_str24[sizeof("endchoice")];
+    char kconf_id_strings_str26[sizeof("config")];
+    char kconf_id_strings_str27[sizeof("modules")];
+    char kconf_id_strings_str28[sizeof("int")];
+    char kconf_id_strings_str29[sizeof("menu")];
+    char kconf_id_strings_str31[sizeof("prompt")];
+    char kconf_id_strings_str32[sizeof("depends")];
+    char kconf_id_strings_str33[sizeof("tristate")];
+    char kconf_id_strings_str34[sizeof("bool")];
+    char kconf_id_strings_str35[sizeof("menuconfig")];
+    char kconf_id_strings_str36[sizeof("select")];
+    char kconf_id_strings_str37[sizeof("boolean")];
+    char kconf_id_strings_str39[sizeof("help")];
+    char kconf_id_strings_str41[sizeof("source")];
+    char kconf_id_strings_str42[sizeof("comment")];
+    char kconf_id_strings_str43[sizeof("mainmenu")];
+    char kconf_id_strings_str46[sizeof("enable")];
+  };
+static struct kconf_id_strings_t kconf_id_strings_contents =
+  {
+    "on",
+    "string",
+    "default",
+    "def_bool",
+    "range",
+    "def_boolean",
+    "def_tristate",
+    "hex",
+    "defconfig_list",
+    "option",
+    "if",
+    "optional",
+    "endif",
+    "choice",
+    "endmenu",
+    "requires",
+    "endchoice",
+    "config",
+    "modules",
+    "int",
+    "menu",
+    "prompt",
+    "depends",
+    "tristate",
+    "bool",
+    "menuconfig",
+    "select",
+    "boolean",
+    "help",
+    "source",
+    "comment",
+    "mainmenu",
+    "enable"
+  };
+#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
+#ifdef __GNUC__
+__inline
+#endif
+struct kconf_id *
+kconf_id_lookup (register const char *str, register unsigned int len)
+{
+  enum
+    {
+      TOTAL_KEYWORDS = 33,
+      MIN_WORD_LENGTH = 2,
+      MAX_WORD_LENGTH = 14,
+      MIN_HASH_VALUE = 2,
+      MAX_HASH_VALUE = 46
+    };
+
+  static struct kconf_id wordlist[] =
+    {
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_ON,		TF_PARAM},
+      {-1}, {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_TYPE,		TF_COMMAND, S_STRING},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,		T_TYPE,		TF_COMMAND, S_HEX},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_OPTION,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_IF,		TF_COMMAND|TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,		T_ENDIF,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_CHOICE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_REQUIRES,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24,	T_ENDCHOICE,	TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_CONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,		T_TYPE,		TF_COMMAND, S_INT},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_PROMPT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_DEPENDS,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_TYPE,		TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,	T_MENUCONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_HELP,		TF_COMMAND},
+      {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_COMMENT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,	T_MAINMENU,	TF_COMMAND},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_SELECT,	TF_COMMAND}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = kconf_id_hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register int o = wordlist[key].name;
+          if (o >= 0)
+            {
+              register const char *s = o + kconf_id_strings;
+
+              if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+                return &wordlist[key];
+            }
+        }
+    }
+  return 0;
+}
+
diff --git a/kconfig/zconf.tab.c_shipped b/kconfig/zconf.tab.c_shipped
new file mode 100644
index 00000000..34ccabdd
--- /dev/null
+++ b/kconfig/zconf.tab.c_shipped
@@ -0,0 +1,2345 @@
+/* A Bison parser, made by GNU Bison 2.1.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.1"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse zconfparse
+#define yylex   zconflex
+#define yyerror zconferror
+#define yylval  zconflval
+#define yychar  zconfchar
+#define yydebug zconfdebug
+#define yynerrs zconfnerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     T_MAINMENU = 258,
+     T_MENU = 259,
+     T_ENDMENU = 260,
+     T_SOURCE = 261,
+     T_CHOICE = 262,
+     T_ENDCHOICE = 263,
+     T_COMMENT = 264,
+     T_CONFIG = 265,
+     T_MENUCONFIG = 266,
+     T_HELP = 267,
+     T_HELPTEXT = 268,
+     T_IF = 269,
+     T_ENDIF = 270,
+     T_DEPENDS = 271,
+     T_REQUIRES = 272,
+     T_OPTIONAL = 273,
+     T_PROMPT = 274,
+     T_TYPE = 275,
+     T_DEFAULT = 276,
+     T_SELECT = 277,
+     T_RANGE = 278,
+     T_OPTION = 279,
+     T_ON = 280,
+     T_WORD = 281,
+     T_WORD_QUOTE = 282,
+     T_UNEQUAL = 283,
+     T_CLOSE_PAREN = 284,
+     T_OPEN_PAREN = 285,
+     T_EOL = 286,
+     T_OR = 287,
+     T_AND = 288,
+     T_EQUAL = 289,
+     T_NOT = 290
+   };
+#endif
+/* Tokens.  */
+#define T_MAINMENU 258
+#define T_MENU 259
+#define T_ENDMENU 260
+#define T_SOURCE 261
+#define T_CHOICE 262
+#define T_ENDCHOICE 263
+#define T_COMMENT 264
+#define T_CONFIG 265
+#define T_MENUCONFIG 266
+#define T_HELP 267
+#define T_HELPTEXT 268
+#define T_IF 269
+#define T_ENDIF 270
+#define T_DEPENDS 271
+#define T_REQUIRES 272
+#define T_OPTIONAL 273
+#define T_PROMPT 274
+#define T_TYPE 275
+#define T_DEFAULT 276
+#define T_SELECT 277
+#define T_RANGE 278
+#define T_OPTION 279
+#define T_ON 280
+#define T_WORD 281
+#define T_WORD_QUOTE 282
+#define T_UNEQUAL 283
+#define T_CLOSE_PAREN 284
+#define T_OPEN_PAREN 285
+#define T_EOL 286
+#define T_OR 287
+#define T_AND 288
+#define T_EQUAL 289
+#define T_NOT 290
+
+
+
+
+/* Copy the first part of user declarations.  */
+
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#include "zconf.hash.c"
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconf_error(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+static struct menu *current_menu, *current_entry;
+
+#define YYDEBUG 0
+#if YYDEBUG
+#define YYERROR_VERBOSE
+#endif
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+
+typedef union YYSTYPE {
+	char *string;
+	struct file *file;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+	struct kconf_id *id;
+} YYSTYPE;
+/* Line 196 of yacc.c.  */
+
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 219 of yacc.c.  */
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if defined (__STDC__) || defined (__cplusplus)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     define YYINCLUDED_STDLIB_H
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#  endif
+#  ifdef __cplusplus
+extern "C" {
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
+	&& (defined (__STDC__) || defined (__cplusplus)))
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
+	&& (defined (__STDC__) || defined (__cplusplus)))
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifdef __cplusplus
+}
+#  endif
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short int yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined (__GNUC__) && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)					\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack, Stack, yysize);				\
+	Stack = &yyptr->Stack;						\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short int yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  3
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   275
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  36
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  45
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  110
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  183
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   290
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned short int yyprhs[] =
+{
+       0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
+      28,    33,    37,    39,    41,    43,    45,    47,    49,    51,
+      53,    55,    57,    59,    61,    63,    67,    70,    74,    77,
+      81,    84,    85,    88,    91,    94,    97,   100,   103,   107,
+     112,   117,   122,   128,   132,   133,   137,   138,   141,   144,
+     147,   149,   153,   154,   157,   160,   163,   166,   169,   174,
+     178,   181,   186,   187,   190,   194,   196,   200,   201,   204,
+     207,   210,   214,   217,   219,   223,   224,   227,   230,   233,
+     237,   241,   244,   247,   250,   251,   254,   257,   260,   265,
+     269,   273,   274,   277,   279,   281,   284,   287,   290,   292,
+     295,   296,   299,   301,   305,   309,   313,   316,   320,   324,
+     326
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      37,     0,    -1,    38,    -1,    -1,    38,    40,    -1,    38,
+      54,    -1,    38,    65,    -1,    38,     3,    75,    77,    -1,
+      38,    76,    -1,    38,    26,     1,    31,    -1,    38,    39,
+       1,    31,    -1,    38,     1,    31,    -1,    16,    -1,    19,
+      -1,    20,    -1,    22,    -1,    18,    -1,    23,    -1,    21,
+      -1,    31,    -1,    60,    -1,    69,    -1,    43,    -1,    45,
+      -1,    67,    -1,    26,     1,    31,    -1,     1,    31,    -1,
+      10,    26,    31,    -1,    42,    46,    -1,    11,    26,    31,
+      -1,    44,    46,    -1,    -1,    46,    47,    -1,    46,    48,
+      -1,    46,    73,    -1,    46,    71,    -1,    46,    41,    -1,
+      46,    31,    -1,    20,    74,    31,    -1,    19,    75,    78,
+      31,    -1,    21,    79,    78,    31,    -1,    22,    26,    78,
+      31,    -1,    23,    80,    80,    78,    31,    -1,    24,    49,
+      31,    -1,    -1,    49,    26,    50,    -1,    -1,    34,    75,
+      -1,     7,    31,    -1,    51,    55,    -1,    76,    -1,    52,
+      57,    53,    -1,    -1,    55,    56,    -1,    55,    73,    -1,
+      55,    71,    -1,    55,    31,    -1,    55,    41,    -1,    19,
+      75,    78,    31,    -1,    20,    74,    31,    -1,    18,    31,
+      -1,    21,    26,    78,    31,    -1,    -1,    57,    40,    -1,
+      14,    79,    77,    -1,    76,    -1,    58,    61,    59,    -1,
+      -1,    61,    40,    -1,    61,    65,    -1,    61,    54,    -1,
+       4,    75,    31,    -1,    62,    72,    -1,    76,    -1,    63,
+      66,    64,    -1,    -1,    66,    40,    -1,    66,    65,    -1,
+      66,    54,    -1,     6,    75,    31,    -1,     9,    75,    31,
+      -1,    68,    72,    -1,    12,    31,    -1,    70,    13,    -1,
+      -1,    72,    73,    -1,    72,    31,    -1,    72,    41,    -1,
+      16,    25,    79,    31,    -1,    16,    79,    31,    -1,    17,
+      79,    31,    -1,    -1,    75,    78,    -1,    26,    -1,    27,
+      -1,     5,    31,    -1,     8,    31,    -1,    15,    31,    -1,
+      31,    -1,    77,    31,    -1,    -1,    14,    79,    -1,    80,
+      -1,    80,    34,    80,    -1,    80,    28,    80,    -1,    30,
+      79,    29,    -1,    35,    79,    -1,    79,    32,    79,    -1,
+      79,    33,    79,    -1,    26,    -1,    27,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned short int yyrline[] =
+{
+       0,   105,   105,   107,   109,   110,   111,   112,   113,   114,
+     115,   119,   123,   123,   123,   123,   123,   123,   123,   127,
+     128,   129,   130,   131,   132,   136,   137,   143,   151,   157,
+     165,   175,   177,   178,   179,   180,   181,   182,   185,   193,
+     199,   209,   215,   221,   224,   226,   237,   238,   243,   252,
+     257,   265,   268,   270,   271,   272,   273,   274,   277,   283,
+     294,   300,   310,   312,   317,   325,   333,   336,   338,   339,
+     340,   345,   352,   357,   365,   368,   370,   371,   372,   375,
+     383,   390,   397,   403,   410,   412,   413,   414,   417,   422,
+     427,   435,   437,   442,   443,   446,   447,   448,   452,   453,
+     456,   457,   460,   461,   462,   463,   464,   465,   466,   469,
+     470
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
+  "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
+  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
+  "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT",
+  "T_SELECT", "T_RANGE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
+  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
+  "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name",
+  "common_stmt", "option_error", "config_entry_start", "config_stmt",
+  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
+  "config_option", "symbol_option", "symbol_option_list",
+  "symbol_option_arg", "choice", "choice_entry", "choice_end",
+  "choice_stmt", "choice_option_list", "choice_option", "choice_block",
+  "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry",
+  "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment",
+  "comment_stmt", "help_start", "help", "depends_list", "depends",
+  "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short int yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    36,    37,    38,    38,    38,    38,    38,    38,    38,
+      38,    38,    39,    39,    39,    39,    39,    39,    39,    40,
+      40,    40,    40,    40,    40,    41,    41,    42,    43,    44,
+      45,    46,    46,    46,    46,    46,    46,    46,    47,    47,
+      47,    47,    47,    48,    49,    49,    50,    50,    51,    52,
+      53,    54,    55,    55,    55,    55,    55,    55,    56,    56,
+      56,    56,    57,    57,    58,    59,    60,    61,    61,    61,
+      61,    62,    63,    64,    65,    66,    66,    66,    66,    67,
+      68,    69,    70,    71,    72,    72,    72,    72,    73,    73,
+      73,    74,    74,    75,    75,    76,    76,    76,    77,    77,
+      78,    78,    79,    79,    79,    79,    79,    79,    79,    80,
+      80
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     0,     2,     2,     2,     4,     2,     4,
+       4,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     3,     2,     3,     2,     3,
+       2,     0,     2,     2,     2,     2,     2,     2,     3,     4,
+       4,     4,     5,     3,     0,     3,     0,     2,     2,     2,
+       1,     3,     0,     2,     2,     2,     2,     2,     4,     3,
+       2,     4,     0,     2,     3,     1,     3,     0,     2,     2,
+       2,     3,     2,     1,     3,     0,     2,     2,     2,     3,
+       3,     2,     2,     2,     0,     2,     2,     2,     4,     3,
+       3,     0,     2,     1,     1,     2,     2,     2,     1,     2,
+       0,     2,     1,     3,     3,     3,     2,     3,     3,     1,
+       1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       3,     0,     0,     1,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    12,    16,    13,    14,
+      18,    15,    17,     0,    19,     0,     4,    31,    22,    31,
+      23,    52,    62,     5,    67,    20,    84,    75,     6,    24,
+      84,    21,     8,    11,    93,    94,     0,     0,    95,     0,
+      48,    96,     0,     0,     0,   109,   110,     0,     0,     0,
+     102,    97,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    98,     7,    71,    79,    80,    27,    29,     0,
+     106,     0,     0,    64,     0,     0,     9,    10,     0,     0,
+       0,     0,     0,    91,     0,     0,     0,    44,     0,    37,
+      36,    32,    33,     0,    35,    34,     0,     0,    91,     0,
+      56,    57,    53,    55,    54,    63,    51,    50,    68,    70,
+      66,    69,    65,    86,    87,    85,    76,    78,    74,    77,
+      73,    99,   105,   107,   108,   104,   103,    26,    82,     0,
+       0,     0,   100,     0,   100,   100,   100,     0,     0,     0,
+      83,    60,   100,     0,   100,     0,    89,    90,     0,     0,
+      38,    92,     0,     0,   100,    46,    43,    25,     0,    59,
+       0,    88,   101,    39,    40,    41,     0,     0,    45,    58,
+      61,    42,    47
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const short int yydefgoto[] =
+{
+      -1,     1,     2,    25,    26,   100,    27,    28,    29,    30,
+      64,   101,   102,   148,   178,    31,    32,   116,    33,    66,
+     112,    67,    34,   120,    35,    68,    36,    37,   128,    38,
+      70,    39,    40,    41,   103,   104,    69,   105,   143,   144,
+      42,    73,   159,    59,    60
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -135
+static const short int yypact[] =
+{
+    -135,     2,   170,  -135,   -14,    56,    56,    -8,    56,    24,
+      67,    56,     7,    14,    62,    97,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,   156,  -135,   166,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,  -135,  -135,  -135,   138,   151,  -135,   152,
+    -135,  -135,   163,   167,   176,  -135,  -135,    62,    62,   185,
+     -19,  -135,   188,   190,    42,   103,   194,    85,    70,   222,
+      70,   132,  -135,   191,  -135,  -135,  -135,  -135,  -135,   127,
+    -135,    62,    62,   191,   104,   104,  -135,  -135,   193,   203,
+       9,    62,    56,    56,    62,   161,   104,  -135,   196,  -135,
+    -135,  -135,  -135,   233,  -135,  -135,   204,    56,    56,   221,
+    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,   219,  -135,  -135,  -135,  -135,  -135,    62,
+     209,   212,   240,   224,   240,    -1,   240,   104,    41,   225,
+    -135,  -135,   240,   226,   240,   218,  -135,  -135,    62,   227,
+    -135,  -135,   228,   229,   240,   230,  -135,  -135,   231,  -135,
+     232,  -135,   112,  -135,  -135,  -135,   234,    56,  -135,  -135,
+    -135,  -135,  -135
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const short int yypgoto[] =
+{
+    -135,  -135,  -135,  -135,    94,   -45,  -135,  -135,  -135,  -135,
+     237,  -135,  -135,  -135,  -135,  -135,  -135,  -135,   -54,  -135,
+    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,     1,
+    -135,  -135,  -135,  -135,  -135,   195,   235,   -44,   159,    -5,
+      98,   210,  -134,   -53,   -77
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -82
+static const short int yytable[] =
+{
+      46,    47,     3,    49,    79,    80,    52,   135,   136,    84,
+     161,   162,   163,   158,   119,    85,   127,    43,   168,   147,
+     170,   111,   114,    48,   124,   125,   124,   125,   133,   134,
+     176,    81,    82,    53,   139,    55,    56,   140,   141,    57,
+      54,   145,   -28,    88,    58,   -28,   -28,   -28,   -28,   -28,
+     -28,   -28,   -28,   -28,    89,    50,   -28,   -28,    90,    91,
+     -28,    92,    93,    94,    95,    96,    97,   165,    98,   121,
+     164,   129,   166,    99,     6,     7,     8,     9,    10,    11,
+      12,    13,    44,    45,    14,    15,   155,   142,    55,    56,
+       7,     8,    57,    10,    11,    12,    13,    58,    51,    14,
+      15,    24,   152,   -30,    88,   172,   -30,   -30,   -30,   -30,
+     -30,   -30,   -30,   -30,   -30,    89,    24,   -30,   -30,    90,
+      91,   -30,    92,    93,    94,    95,    96,    97,    61,    98,
+      55,    56,   -81,    88,    99,   -81,   -81,   -81,   -81,   -81,
+     -81,   -81,   -81,   -81,    81,    82,   -81,   -81,    90,    91,
+     -81,   -81,   -81,   -81,   -81,   -81,   132,    62,    98,    81,
+      82,   115,   118,   123,   126,   117,   122,    63,   130,    72,
+      -2,     4,   182,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    74,    75,    14,    15,    16,   146,    17,    18,
+      19,    20,    21,    22,    76,    88,    23,   149,    77,   -49,
+     -49,    24,   -49,   -49,   -49,   -49,    89,    78,   -49,   -49,
+      90,    91,   106,   107,   108,   109,    72,    81,    82,    86,
+      98,    87,   131,    88,   137,   110,   -72,   -72,   -72,   -72,
+     -72,   -72,   -72,   -72,   138,   151,   -72,   -72,    90,    91,
+     156,    81,    82,   157,    81,    82,   150,   154,    98,   171,
+      81,    82,    82,   123,   158,   160,   167,   169,   173,   174,
+     175,   113,   179,   180,   177,   181,    65,   153,     0,    83,
+       0,     0,     0,     0,     0,    71
+};
+
+static const short int yycheck[] =
+{
+       5,     6,     0,     8,    57,    58,    11,    84,    85,    28,
+     144,   145,   146,    14,    68,    34,    70,    31,   152,    96,
+     154,    66,    66,    31,    69,    69,    71,    71,    81,    82,
+     164,    32,    33,    26,    25,    26,    27,    90,    91,    30,
+      26,    94,     0,     1,    35,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    31,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    26,    26,    68,
+     147,    70,    31,    31,     4,     5,     6,     7,     8,     9,
+      10,    11,    26,    27,    14,    15,   139,    92,    26,    27,
+       5,     6,    30,     8,     9,    10,    11,    35,    31,    14,
+      15,    31,   107,     0,     1,   158,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    31,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    31,    26,
+      26,    27,     0,     1,    31,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    32,    33,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    29,     1,    26,    32,
+      33,    67,    68,    31,    70,    67,    68,     1,    70,    31,
+       0,     1,   177,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    31,    31,    14,    15,    16,    26,    18,    19,
+      20,    21,    22,    23,    31,     1,    26,     1,    31,     5,
+       6,    31,     8,     9,    10,    11,    12,    31,    14,    15,
+      16,    17,    18,    19,    20,    21,    31,    32,    33,    31,
+      26,    31,    31,     1,    31,    31,     4,     5,     6,     7,
+       8,     9,    10,    11,    31,    31,    14,    15,    16,    17,
+      31,    32,    33,    31,    32,    33,    13,    26,    26,    31,
+      32,    33,    33,    31,    14,    31,    31,    31,    31,    31,
+      31,    66,    31,    31,    34,    31,    29,   108,    -1,    59,
+      -1,    -1,    -1,    -1,    -1,    40
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    37,    38,     0,     1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    14,    15,    16,    18,    19,    20,
+      21,    22,    23,    26,    31,    39,    40,    42,    43,    44,
+      45,    51,    52,    54,    58,    60,    62,    63,    65,    67,
+      68,    69,    76,    31,    26,    27,    75,    75,    31,    75,
+      31,    31,    75,    26,    26,    26,    27,    30,    35,    79,
+      80,    31,     1,     1,    46,    46,    55,    57,    61,    72,
+      66,    72,    31,    77,    31,    31,    31,    31,    31,    79,
+      79,    32,    33,    77,    28,    34,    31,    31,     1,    12,
+      16,    17,    19,    20,    21,    22,    23,    24,    26,    31,
+      41,    47,    48,    70,    71,    73,    18,    19,    20,    21,
+      31,    41,    56,    71,    73,    40,    53,    76,    40,    54,
+      59,    65,    76,    31,    41,    73,    40,    54,    64,    65,
+      76,    31,    29,    79,    79,    80,    80,    31,    31,    25,
+      79,    79,    75,    74,    75,    79,    26,    80,    49,     1,
+      13,    31,    75,    74,    26,    79,    31,    31,    14,    78,
+      31,    78,    78,    78,    80,    26,    31,    31,    78,    31,
+      78,    31,    79,    31,    31,    31,    78,    34,    50,    31,
+      31,    31,    75
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (0)
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (N)								\
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (0)
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+              (Loc).first_line, (Loc).first_column,	\
+              (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (0)
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr,					\
+                  Type, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short int *bottom;
+    short int *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      size_t yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+#endif /* YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+      case 52: /* "choice_entry" */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+      case 58: /* "if_entry" */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+      case 63: /* "menu_entry" */
+
+        {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
+	if (current_menu == (yyvaluep->menu))
+		menu_end_menu();
+};
+
+        break;
+
+      default:
+        break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol.  */
+int yychar;
+
+/* The semantic value of the look-ahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+    ;
+#endif
+#endif
+{
+  
+  int yystate;
+  int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short int yyssa[YYINITDEPTH];
+  short int *yyss = yyssa;
+  short int *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack. Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	short int *yyss1 = yyss;
+
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	short int *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss);
+	YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a look-ahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to look-ahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a look-ahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 8:
+
+    { zconf_error("unexpected end statement"); ;}
+    break;
+
+  case 9:
+
+    { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); ;}
+    break;
+
+  case 10:
+
+    {
+	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name);
+;}
+    break;
+
+  case 11:
+
+    { zconf_error("invalid statement"); ;}
+    break;
+
+  case 25:
+
+    { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); ;}
+    break;
+
+  case 26:
+
+    { zconf_error("invalid option"); ;}
+    break;
+
+  case 27:
+
+    {
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+;}
+    break;
+
+  case 28:
+
+    {
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 29:
+
+    {
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+;}
+    break;
+
+  case 30:
+
+    {
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 38:
+
+    {
+	menu_set_type((yyvsp[-2].id)->stype);
+	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		(yyvsp[-2].id)->stype);
+;}
+    break;
+
+  case 39:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 40:
+
+    {
+	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
+	if ((yyvsp[-3].id)->stype != S_UNKNOWN)
+		menu_set_type((yyvsp[-3].id)->stype);
+	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
+		zconf_curname(), zconf_lineno(),
+		(yyvsp[-3].id)->stype);
+;}
+    break;
+
+  case 41:
+
+    {
+	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 42:
+
+    {
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 45:
+
+    {
+	struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
+	if (id && id->flags & TF_OPTION)
+		menu_add_option(id->token, (yyvsp[0].string));
+	else
+		zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string));
+	free((yyvsp[-1].string));
+;}
+    break;
+
+  case 46:
+
+    { (yyval.string) = NULL; ;}
+    break;
+
+  case 47:
+
+    { (yyval.string) = (yyvsp[0].string); ;}
+    break;
+
+  case 48:
+
+    {
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 49:
+
+    {
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 50:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 58:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 59:
+
+    {
+	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
+		menu_set_type((yyvsp[-2].id)->stype);
+		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+			zconf_curname(), zconf_lineno(),
+			(yyvsp[-2].id)->stype);
+	} else
+		YYERROR;
+;}
+    break;
+
+  case 60:
+
+    {
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 61:
+
+    {
+	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
+		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+		printd(DEBUG_PARSE, "%s:%d:default\n",
+			zconf_curname(), zconf_lineno());
+	} else
+		YYERROR;
+;}
+    break;
+
+  case 64:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep((yyvsp[-1].expr));
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 65:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 71:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 72:
+
+    {
+	(yyval.menu) = menu_add_menu();
+;}
+    break;
+
+  case 73:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 79:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+	zconf_nextfile((yyvsp[-1].string));
+;}
+    break;
+
+  case 80:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 81:
+
+    {
+	menu_end_entry();
+;}
+    break;
+
+  case 82:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+;}
+    break;
+
+  case 83:
+
+    {
+	current_entry->sym->help = (yyvsp[0].string);
+;}
+    break;
+
+  case 88:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 89:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 90:
+
+    {
+	menu_add_dep((yyvsp[-1].expr));
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 92:
+
+    {
+	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
+;}
+    break;
+
+  case 95:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 96:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 97:
+
+    { (yyval.id) = (yyvsp[-1].id); ;}
+    break;
+
+  case 100:
+
+    { (yyval.expr) = NULL; ;}
+    break;
+
+  case 101:
+
+    { (yyval.expr) = (yyvsp[0].expr); ;}
+    break;
+
+  case 102:
+
+    { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;}
+    break;
+
+  case 103:
+
+    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    break;
+
+  case 104:
+
+    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    break;
+
+  case 105:
+
+    { (yyval.expr) = (yyvsp[-1].expr); ;}
+    break;
+
+  case 106:
+
+    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;}
+    break;
+
+  case 107:
+
+    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 108:
+
+    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    break;
+
+  case 109:
+
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;}
+    break;
+
+  case 110:
+
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;}
+    break;
+
+
+      default: break;
+    }
+
+/* Line 1126 of yacc.c.  */
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+	{
+	  int yytype = YYTRANSLATE (yychar);
+	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+	  YYSIZE_T yysize = yysize0;
+	  YYSIZE_T yysize1;
+	  int yysize_overflow = 0;
+	  char *yymsg = 0;
+#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
+	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+	  int yyx;
+
+#if 0
+	  /* This is so xgettext sees the translatable formats that are
+	     constructed on the fly.  */
+	  YY_("syntax error, unexpected %s");
+	  YY_("syntax error, unexpected %s, expecting %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+#endif
+	  char *yyfmt;
+	  char const *yyf;
+	  static char const yyunexpected[] = "syntax error, unexpected %s";
+	  static char const yyexpecting[] = ", expecting %s";
+	  static char const yyor[] = " or %s";
+	  char yyformat[sizeof yyunexpected
+			+ sizeof yyexpecting - 1
+			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+			   * (sizeof yyor - 1))];
+	  char const *yyprefix = yyexpecting;
+
+	  /* Start YYX at -YYN if negative to avoid negative indexes in
+	     YYCHECK.  */
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
+
+	  /* Stay within bounds of both yycheck and yytname.  */
+	  int yychecklim = YYLAST - yyn;
+	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+	  int yycount = 1;
+
+	  yyarg[0] = yytname[yytype];
+	  yyfmt = yystpcpy (yyformat, yyunexpected);
+
+	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	      {
+		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+		  {
+		    yycount = 1;
+		    yysize = yysize0;
+		    yyformat[sizeof yyunexpected - 1] = '\0';
+		    break;
+		  }
+		yyarg[yycount++] = yytname[yyx];
+		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+		yysize_overflow |= yysize1 < yysize;
+		yysize = yysize1;
+		yyfmt = yystpcpy (yyfmt, yyprefix);
+		yyprefix = yyor;
+	      }
+
+	  yyf = YY_(yyformat);
+	  yysize1 = yysize + yystrlen (yyf);
+	  yysize_overflow |= yysize1 < yysize;
+	  yysize = yysize1;
+
+	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
+	    yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg)
+	    {
+	      /* Avoid sprintf, as that infringes on the user's name space.
+		 Don't have undefined behavior even if the translation
+		 produced a string with the wrong number of "%s"s.  */
+	      char *yyp = yymsg;
+	      int yyi = 0;
+	      while ((*yyp = *yyf))
+		{
+		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		    {
+		      yyp += yytnamerr (yyp, yyarg[yyi++]);
+		      yyf += 2;
+		    }
+		  else
+		    {
+		      yyp++;
+		      yyf++;
+		    }
+		}
+	      yyerror (yymsg);
+	      YYSTACK_FREE (yymsg);
+	    }
+	  else
+	    {
+	      yyerror (YY_("syntax error"));
+	      goto yyexhaustedlab;
+	    }
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror (YY_("syntax error"));
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+        }
+      else
+	{
+	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (0)
+     goto yyerrorlab;
+
+yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping", yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token. */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEOF && yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp);
+      YYPOPSTACK;
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+
+
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup(NULL, 0);
+	modules_sym->type = S_BOOLEAN;
+	modules_sym->flags |= SYMBOL_AUTO;
+	rootmenu.prompt = menu_add_prompt(P_MENU, PROJECT_NAME" Configuration", NULL);
+
+#if YYDEBUG
+	if (getenv("ZCONF_DEBUG"))
+		zconfdebug = 1;
+#endif
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	if (!modules_sym->prop) {
+		struct property *prop;
+
+		prop = prop_alloc(P_DEFAULT, modules_sym);
+		prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
+	}
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+		sym_check_deps(sym);
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	case T_DEPENDS:		return "depends";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken)
+{
+	if (id->token != endtoken) {
+		zconf_error("unexpected '%s' within %s block",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconf_error("'%s' in different file than '%s'",
+			kconf_id_strings + id->name, zconf_tokenname(starttoken));
+		fprintf(stderr, "%s:%d: location of the '%s'\n",
+			current_menu->file->name, current_menu->lineno,
+			zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconf_error(const char *err, ...)
+{
+	va_list ap;
+
+	zconfnerrs++;
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+#if YYDEBUG
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+#endif
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "util.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"
+
+
diff --git a/licenses/by-sa/deed.en b/licenses/by-sa/deed.en
new file mode 100644
index 00000000..6f1fae79
--- /dev/null
+++ b/licenses/by-sa/deed.en
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Creative Commons Deed</title>
+
+
+
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<link rel="stylesheet" type="text/css" href="deed_files/deeds.css">
+<link rel="alternate" type="application/rdf+xml" href="http://creativecommons.org/licenses/by-sa/2.5/rdf"> 
+
+<script language="javascript">
+function setCookie(name, value, expires, path, domain, secure) {
+    document.cookie= name + "=" + escape(value) +
+        ((expires) ? "; expires=" + expires.toGMTString() : "") +
+        ((path) ? "; path=" + path : "") +
+        ((domain) ? "; domain=" + domain : "") +
+        ((secure) ? "; secure" : "");
+}
+var expiry = new Date();
+expiry.setTime(expiry.getTime()+(5*365*24*60*60*1000));
+setCookie('lang','en', expiry, '/');
+</script></head><body>
+
+<!--
+
+<rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/"><permits rdf:resource="http://web.resource.org/cc/Reproduction"/><permits rdf:resource="http://web.resource.org/cc/Distribution"/><requires rdf:resource="http://web.resource.org/cc/Notice"/><requires rdf:resource="http://web.resource.org/cc/Attribution"/><permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/><requires
+    rdf:resource="http://web.resource.org/cc/ShareAlike"/></License></rdf:RDF>
+
+
+-->
+
+<p align="center"><a href="http://creativecommons.org/">Creative Commons</a></p>
+
+
+
+<div style="width: 620px; margin-left: auto; margin-right: auto;"><div style="text-align: center;">
+This page is available in the following languages:
+<br>
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.bg" title="български" hreflang="bg" rel="alternate" lang="bg">български</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ca" title="Català" hreflang="ca" rel="alternate" lang="ca">Català</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.da" title="Dansk" hreflang="da" rel="alternate" lang="da">Dansk</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.de" title="Deutsch" hreflang="de" rel="alternate" lang="de">Deutsch</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en" title="English" hreflang="en" rel="alternate" lang="en">English</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en_CA" title="English (CA)" hreflang="en_CA" rel="alternate" lang="en_CA">English (CA)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en_GB" title="English (GB)" hreflang="en_GB" rel="alternate" lang="en_GB">English (GB)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es" title="Castellano" hreflang="es" rel="alternate" lang="es">Castellano</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_AR" title="Spanish (AR)" hreflang="es_AR" rel="alternate" lang="es_AR">Castellano (AR)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_CL" title="Spanish (CL)" hreflang="es_CL" rel="alternate" lang="es_CL">Español (CL)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_MX" title="Spanish (MX)" hreflang="es_MX" rel="alternate" lang="es_MX">Castellano (MX)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.eu" title="Euskara" hreflang="eu" rel="alternate" lang="eu">Euskara</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fi" title="Suomeksi" hreflang="fi" rel="alternate" lang="fi">Suomeksi</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fr" title="français" hreflang="fr" rel="alternate" lang="fr">français</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fr_CA" title="French (CA)" hreflang="fr_CA" rel="alternate" lang="fr_CA">français (CA)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.gl" title="Galego" hreflang="gl" rel="alternate" lang="gl">Galego</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.he" title="עברית" hreflang="he" rel="alternate" lang="he">עברית</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.hr" title="hrvatski" hreflang="hr" rel="alternate" lang="hr">hrvatski</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.hu" title="Magyar" hreflang="hu" rel="alternate" lang="hu">Magyar</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.it" title="Italiano" hreflang="it" rel="alternate" lang="it">Italiano</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ja" title="日本語" hreflang="ja" rel="alternate" lang="ja">日本語</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ko" title="한국어" hreflang="ko" rel="alternate" lang="ko">한국어</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ms" title="Melayu" hreflang="ms" rel="alternate" lang="ms">Melayu</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.nl" title="Nederlands" hreflang="nl" rel="alternate" lang="nl">Nederlands</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pl" title="polski" hreflang="pl" rel="alternate" lang="pl">polski</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pt" title="Português" hreflang="pt" rel="alternate" lang="pt">Português</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pt_PT" hreflang="pt_PT" rel="alternate" lang="pt_PT">Português (PT)</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.se" title="svenska" hreflang="se" rel="alternate" lang="se">svenska</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.sl" title="slovenski jezik" hreflang="sl" rel="alternate" lang="sl">slovenski jezik</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh" title="简体中文" hreflang="zh" rel="alternate" lang="zh">简体中文</a>
+
+
+
+
+<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh_TW" title="Chinese (Taiwan)" hreflang="zh_TW" rel="alternate" lang="zh_TW">華語 (台灣)</a>
+
+
+</div></div>
+
+
+
+
+<div id="deed">
+
+	<div align="center">
+
+	<img src="deed_files/logo_deed.gif" alt="Creative Commons Deed" border="0" height="79" vspace="14" width="280">
+
+	<p><b>Attribution-ShareAlike 2.5 </b></p>
+
+
+
+	<div class="text">
+
+        
+
+		<p><strong>You are free:</strong></p>
+
+			<ul>
+
+				<li>to copy, distribute, display, and perform the work</li>
+
+				<li>to make derivative works</li>
+
+				<li>to make commercial use of the work</li>
+
+			</ul>
+
+
+
+		<p><strong>Under the following conditions:</strong></p>
+
+	        <div align="center"><table class="draft" border="0" cellpadding="4" cellspacing="0" width="500">
+
+		<tbody>
+
+                <tr>
+                   <td>
+                     <img src="deed_files/deed.gif" alt="by" align="left" border="0" hspace="4">
+                   </td>
+                   <td align="left">
+                      <div class="tiny"><strong>Attribution</strong>. 
+                             You must attribute the work in the manner specified by the author or licensor.</div>
+                   </td>
+                </tr>
+                <tr>
+                   <td>
+                     <img src="deed_files/deed_002.gif" alt="sa" align="left" border="0" hspace="4">
+                   </td>
+                   <td align="left">
+                      <div class="tiny"><strong>Share Alike</strong>.
+If you alter, transform, or build upon this work, you may distribute
+the resulting work only under a license identical to this one.</div>
+                   </td>
+                </tr>
+
+                </tbody></table></div>
+
+		
+
+    <ul>
+
+    <li>For any reuse or distribution, you must make clear to others the license terms of this work.</li>
+
+    <li>Any of these conditions can be waived if you get permission from the copyright holder.</li>
+
+    </ul>
+
+
+
+<p style="margin-top: 40px;" align="center"><strong>Your fair use and other rights are in no way affected by the above.</strong></p>
+
+
+
+		
+
+		<p align="center">
+
+                
+                This is a human-readable summary of the <a href="http://creativecommons.org/licenses/by-sa/2.5/legalcode" class="fulltext">Legal Code (the full license)</a>.
+
+                </p>
+
+
+
+                        
+
+			<div align="center">
+
+<a href="http://creativecommons.org/licenses/disclaimer-popup?lang=en" onclick="window.open('/licenses/disclaimer-popup?lang=en', 'characteristic_help', 'width=375,height=300,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=yes,menubar=no,status=yes'); return false;">Disclaimer</a> 
+<a href="http://creativecommons.org/licenses/disclaimer-popup?lang=en" onclick="window.open('/licenses/disclaimer-popup?lang=en', 'characteristic_help', 'width=375,height=300,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=yes,menubar=no,status=yes'); return false;"><img src="deed_files/popup.gif" alt="disclaimer" border="0" height="13" width="15"></a></div>
+
+			<p>&nbsp;</p>
+
+		</div>
+
+	</div>
+
+</div>
+
+<p>
+
+<a href="http://creativecommons.org/about/licenses">Learn how to distribute your work using this license</a>
+
+</p>
+
+
+
+
+</body></html>
\ No newline at end of file
diff --git a/licenses/by-sa/deed_files/deed.gif b/licenses/by-sa/deed_files/deed.gif
new file mode 100644
index 00000000..ef811af2
Binary files /dev/null and b/licenses/by-sa/deed_files/deed.gif differ
diff --git a/licenses/by-sa/deed_files/deed_002.gif b/licenses/by-sa/deed_files/deed_002.gif
new file mode 100644
index 00000000..2160a802
Binary files /dev/null and b/licenses/by-sa/deed_files/deed_002.gif differ
diff --git a/licenses/by-sa/deed_files/deeds.css b/licenses/by-sa/deed_files/deeds.css
new file mode 100644
index 00000000..7c50dbcd
--- /dev/null
+++ b/licenses/by-sa/deed_files/deeds.css
@@ -0,0 +1,54 @@
+body {
+	margin: 0px;
+	padding: 0px;
+	font-family: verdana, arial, helvetica, sans-serif;
+	color: black;
+	background-color: white;
+	text-align: center;
+	font-size:11px;
+	/* part 1 of 2 centering hack */
+	}
+
+#deed {
+	width: 620px; 
+	padding: 15px;
+	margin-top: 20px;
+	margin-bottom: 20px;
+	margin-right: auto;
+	margin-left: auto; 	
+	/* opera does not like 'margin:20px auto' */
+	background: #ffc;
+	border: 3px groove #333;
+	text-align:left; 
+	/* part 2 of 2 centering hack */
+	width: 620px; /* ie5win fudge begins */
+	voice-family: "\"}\"";
+	voice-family:inherit;
+	width: 584px;
+	}
+	
+html>body #content {
+	width: 584px; /* ie5win fudge ends */
+	}
+	
+.fineprint {
+	border:1px solid black; 
+	padding:8px; 
+	background:#ffffff;
+	text-align:justify;
+}
+
+.text, li {
+	font-family:verdana, sans-serif;
+	font-size:11px;
+	margin-left:20px;
+	margin-right:20px;
+	line-height:140%;
+	text-align:left;
+}
+
+.tiny {
+	font-family:verdana, sans-serif;
+	font-size:11px;
+	margin-bottom:10px;
+}
\ No newline at end of file
diff --git a/licenses/by-sa/deed_files/logo_deed.gif b/licenses/by-sa/deed_files/logo_deed.gif
new file mode 100644
index 00000000..6024290f
Binary files /dev/null and b/licenses/by-sa/deed_files/logo_deed.gif differ
diff --git a/licenses/by-sa/deed_files/popup.gif b/licenses/by-sa/deed_files/popup.gif
new file mode 100644
index 00000000..31dfb98f
Binary files /dev/null and b/licenses/by-sa/deed_files/popup.gif differ
diff --git a/licenses/by-sa/legalcode b/licenses/by-sa/legalcode
new file mode 100644
index 00000000..6cf807ef
--- /dev/null
+++ b/licenses/by-sa/legalcode
@@ -0,0 +1,378 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+<html><head><title>Creative Commons Legal Code</title>
+
+
+
+<link rel="stylesheet" type="text/css" href="legalcode_files/deeds.css">
+<style type="text/css">
+
+li {
+margin-bottom:12px;
+}
+
+</style></head><body>
+
+<p align="center"><a href="http://creativecommons.org/">Creative Commons</a></p>
+
+
+
+<div id="deed">
+<div align="center"><img src="legalcode_files/logo_code.gif" alt="Creative Commons Legal Code" border="0" height="79" vspace="14" width="280"></div>
+
+
+<p align="center"><b>Attribution-ShareAlike 2.5</b></p>
+
+
+<div class="text">
+
+
+<div class="fineprint" style="background: transparent none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
+CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL
+SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON
+AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
+INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ITS USE.</div>
+
+
+
+
+<p><em>License</em> </p>
+
+<p>THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
+CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
+PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK
+OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
+PROHIBITED. </p>
+
+<p>BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
+AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU
+THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH
+TERMS AND CONDITIONS. </p>
+
+
+<p><strong>1. Definitions</strong> </p>
+
+<ol type="a">
+<li>
+<strong>"Collective Work"</strong> means a work, such as a periodical
+issue, anthology or encyclopedia, in which the Work in its entirety in
+unmodified form, along with a number of other contributions,
+constituting separate and independent works in themselves, are
+assembled into a collective whole. A work that constitutes a Collective
+Work will not be considered a Derivative Work (as defined below) for
+the purposes of this License.
+</li>
+
+<li>
+<strong>"Derivative Work"</strong> means a work based upon the Work or
+upon the Work and other pre-existing works, such as a translation,
+musical arrangement, dramatization, fictionalization, motion picture
+version, sound recording, art reproduction, abridgment, condensation,
+or any other form in which the Work may be recast, transformed, or
+adapted, except that a work that constitutes a Collective Work will not
+be considered a Derivative Work for the purpose of this License. For
+the avoidance of doubt, where the Work is a musical composition or
+sound recording, the synchronization of the Work in timed-relation with
+a moving image ("synching") will be considered a Derivative Work for
+the purpose of this License.
+</li>
+
+<li>
+<strong>"Licensor"</strong> means the individual or entity that offers the Work under the terms of this License.
+</li>
+
+<li>
+<strong>"Original Author"</strong> means the individual or entity who created the Work.
+</li>
+
+<li>
+<strong>"Work"</strong> means the copyrightable work of authorship offered under the terms of this License.
+</li>
+
+<li>
+<strong>"You"</strong> means an individual or entity exercising rights
+under this License who has not previously violated the terms of this
+License with respect to the Work, or who has received express
+permission from the Licensor to exercise rights under this License
+despite a previous violation.
+</li>
+
+<li><strong>"License Elements"</strong> means the following high-level
+license attributes as selected by Licensor and indicated in the title
+of this License: Attribution, ShareAlike.</li></ol>
+
+<p><strong>2. Fair Use Rights.</strong> Nothing in this license is
+intended to reduce, limit, or restrict any rights arising from fair
+use, first sale or other limitations on the exclusive rights of the
+copyright owner under copyright law or other applicable laws. </p>
+
+
+<p><strong>3. License Grant.</strong> Subject to the terms and
+conditions of this License, Licensor hereby grants You a worldwide,
+royalty-free, non-exclusive, perpetual (for the duration of the
+applicable copyright) license to exercise the rights in the Work as
+stated below: </p>
+
+
+<ol type="a">
+<li>
+to reproduce the Work, to incorporate the Work into one or more
+Collective Works, and to reproduce the Work as incorporated in the
+Collective Works;
+</li>
+
+<li>
+to create and reproduce Derivative Works;
+</li>
+
+<li>to distribute copies or phonorecords of, display publicly, perform
+publicly, and perform publicly by means of a digital audio transmission
+the Work including as incorporated in Collective Works;
+</li>
+
+<li>to distribute copies or phonorecords of, display publicly, perform
+publicly, and perform publicly by means of a digital audio transmission
+Derivative Works.
+</li>
+
+<li><p>For the avoidance of doubt, where the work is a musical composition:</p>
+
+<ol type="i">
+<li><strong>Performance Royalties Under Blanket Licenses</strong>.
+Licensor waives the exclusive right to collect, whether individually or
+via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties
+for the public performance or public digital performance (e.g. webcast)
+of the Work.</li>
+
+<li><strong>Mechanical Rights and Statutory Royalties</strong>.
+Licensor waives the exclusive right to collect, whether individually or
+via a music rights society or designated agent (e.g. Harry Fox Agency),
+royalties for any phonorecord You create from the Work ("cover
+version") and distribute, subject to the compulsory license created by
+17 USC Section 115 of the US Copyright Act (or the equivalent in other
+jurisdictions).
+</li>
+</ol>
+</li>
+
+<li><strong>Webcasting Rights and Statutory Royalties</strong>. For the
+avoidance of doubt, where the Work is a sound recording, Licensor
+waives the exclusive right to collect, whether individually or via a
+performance-rights society (e.g. SoundExchange), royalties for the
+public digital performance (e.g. webcast) of the Work, subject to the
+compulsory license created by 17 USC Section 114 of the US Copyright
+Act (or the equivalent in other jurisdictions).</li>
+</ol>
+
+
+<p>The above rights may be exercised in all media and formats whether
+now known or hereafter devised. The above rights include the right to
+make such modifications as are technically necessary to exercise the
+rights in other media and formats. All rights not expressly granted by
+Licensor are hereby reserved.</p>
+
+<p><strong>4. Restrictions.</strong>The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: </p>
+
+
+<ol type="a">
+<li>
+You may distribute, publicly display, publicly perform, or publicly
+digitally perform the Work only under the terms of this License, and
+You must include a copy of, or the Uniform Resource Identifier for,
+this License with every copy or phonorecord of the Work You distribute,
+publicly display, publicly perform, or publicly digitally perform. You
+may not offer or impose any terms on the Work that alter or restrict
+the terms of this License or the recipients' exercise of the rights
+granted hereunder. You may not sublicense the Work. You must keep
+intact all notices that refer to this License and to the disclaimer of
+warranties. You may not distribute, publicly display, publicly perform,
+or publicly digitally perform the Work with any technological measures
+that control access or use of the Work in a manner inconsistent with
+the terms of this License Agreement. The above applies to the Work as
+incorporated in a Collective Work, but this does not require the
+Collective Work apart from the Work itself to be made subject to the
+terms of this License. If You create a Collective Work, upon notice
+from any Licensor You must, to the extent practicable, remove from the
+Collective Work any credit as required by clause 4(c), as requested. If
+You create a Derivative Work, upon notice from any Licensor You must,
+to the extent practicable, remove from the Derivative Work any credit
+as required by clause 4(c), as requested.
+</li>
+
+<li>You may distribute, publicly display, publicly perform, or publicly
+digitally perform a Derivative Work only under the terms of this
+License, a later version of this License with the same License Elements
+as this License, or a Creative Commons iCommons license that contains
+the same License Elements as this License (e.g. Attribution-ShareAlike
+2.5 Japan). You must include a copy of, or the Uniform Resource
+Identifier for, this License or other license specified in the previous
+sentence with every copy or phonorecord of each Derivative Work You
+distribute, publicly display, publicly perform, or publicly digitally
+perform. You may not offer or impose any terms on the Derivative Works
+that alter or restrict the terms of this License or the recipients'
+exercise of the rights granted hereunder, and You must keep intact all
+notices that refer to this License and to the disclaimer of warranties.
+You may not distribute, publicly display, publicly perform, or publicly
+digitally perform the Derivative Work with any technological measures
+that control access or use of the Work in a manner inconsistent with
+the terms of this License Agreement. The above applies to the
+Derivative Work as incorporated in a Collective Work, but this does not
+require the Collective Work apart from the Derivative Work itself to be
+made subject to the terms of this License.
+</li>
+
+<li>If you distribute, publicly display, publicly perform, or publicly
+digitally perform the Work or any Derivative Works or Collective Works,
+You must keep intact all copyright notices for the Work and provide,
+reasonable to the medium or means You are utilizing: (i) the name of
+the Original Author (or pseudonym, if applicable) if supplied, and/or
+(ii) if the Original Author and/or Licensor designate another party or
+parties (e.g. a sponsor institute, publishing entity, journal) for
+attribution in Licensor's copyright notice, terms of service or by
+other reasonable means, the name of such party or parties; the title of
+the Work if supplied; to the extent reasonably practicable, the Uniform
+Resource Identifier, if any, that Licensor specifies to be associated
+with the Work, unless such URI does not refer to the copyright notice
+or licensing information for the Work; and in the case of a Derivative
+Work, a credit identifying the use of the Work in the Derivative Work
+(e.g., "French translation of the Work by Original Author," or
+"Screenplay based on original Work by Original Author"). Such credit
+may be implemented in any reasonable manner; provided, however, that in
+the case of a Derivative Work or Collective Work, at a minimum such
+credit will appear where any other comparable authorship credit appears
+and in a manner at least as prominent as such other comparable
+authorship credit.
+</li>
+
+
+
+
+</ol>
+
+
+
+
+
+<p><strong>5. Representations, Warranties and Disclaimer</strong></p>
+
+<p>UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR
+OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE,
+MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR
+THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF
+ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY
+NOT APPLY TO YOU.</p>
+
+
+<p><strong>6. Limitation on Liability.</strong> EXCEPT TO THE EXTENT
+REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU
+ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL,
+PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF
+THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES. </p>
+
+<p><strong>7. Termination</strong> </p>
+
+<ol type="a">
+
+<li>
+This License and the rights granted hereunder will terminate
+automatically upon any breach by You of the terms of this License.
+Individuals or entities who have received Derivative Works or
+Collective Works from You under this License, however, will not have
+their licenses terminated provided such individuals or entities remain
+in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8
+will survive any termination of this License.
+</li>
+
+<li>Subject to the above terms and conditions, the license granted here
+is perpetual (for the duration of the applicable copyright in the
+Work). Notwithstanding the above, Licensor reserves the right to
+release the Work under different license terms or to stop distributing
+the Work at any time; provided, however that any such election will not
+serve to withdraw this License (or any other license that has been, or
+is required to be, granted under the terms of this License), and this
+License will continue in full force and effect unless terminated as
+stated above.
+</li>
+</ol>
+
+<p><strong>8. Miscellaneous</strong> </p>
+
+<ol type="a">
+
+<li>Each time You distribute or publicly digitally perform the Work or
+a Collective Work, the Licensor offers to the recipient a license to
+the Work on the same terms and conditions as the license granted to You
+under this License.
+</li>
+
+<li>Each time You distribute or publicly digitally perform a Derivative
+Work, Licensor offers to the recipient a license to the original Work
+on the same terms and conditions as the license granted to You under
+this License.
+</li>
+
+<li>If any provision of this License is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this License, and without further action
+by the parties to this agreement, such provision shall be reformed to
+the minimum extent necessary to make such provision valid and
+enforceable.
+</li>
+
+<li>No term or provision of this License shall be deemed waived and no
+breach consented to unless such waiver or consent shall be in writing
+and signed by the party to be charged with such waiver or consent.
+</li>
+
+<li>This License constitutes the entire agreement between the parties
+with respect to the Work licensed here. There are no understandings,
+agreements or representations with respect to the Work not specified
+here. Licensor shall not be bound by any additional provisions that may
+appear in any communication from You. This License may not be modified
+without the mutual written agreement of the Licensor and You.
+</li>
+</ol>
+
+
+<!-- BREAKOUT FOR CC NOTICE. NOT A PART OF THE LICENSE -->
+<div class="fineprint">
+
+
+<p>Creative Commons is not a party to this License, and makes no
+warranty whatsoever in connection with the Work. Creative Commons will
+not be liable to You or any party on any legal theory for any damages
+whatsoever, including without limitation any general, special,
+incidental or consequential damages arising in connection to this
+license. Notwithstanding the foregoing two (2) sentences, if Creative
+Commons has expressly identified itself as the Licensor hereunder, it
+shall have all rights and obligations of Licensor. </p>
+
+
+<p>Except for the limited purpose of indicating to the public that the
+Work is licensed under the CCPL, neither party will use the trademark
+"Creative Commons" or any related trademark or logo of Creative Commons
+without the prior written consent of Creative Commons. Any permitted
+use will be in compliance with Creative Commons' then-current trademark
+usage guidelines, as may be published on its website or otherwise made
+available upon request from time to time.</p>
+
+
+<p>Creative Commons may be contacted at <a href="http://creativecommons.org/">http://creativecommons.org/</a>.</p>
+
+
+</div>
+<!-- END CC NOTICE -->
+
+
+</div>
+
+
+<div style="margin-bottom: 10px;" align="right"><a href="http://creativecommons.org/licenses/by-sa/2.5/" class="fulltext">� Back to Commons Deed</a></div>
+
+</div>
+</body></html>
\ No newline at end of file
diff --git a/licenses/by-sa/legalcode_files/deeds.css b/licenses/by-sa/legalcode_files/deeds.css
new file mode 100644
index 00000000..7c50dbcd
--- /dev/null
+++ b/licenses/by-sa/legalcode_files/deeds.css
@@ -0,0 +1,54 @@
+body {
+	margin: 0px;
+	padding: 0px;
+	font-family: verdana, arial, helvetica, sans-serif;
+	color: black;
+	background-color: white;
+	text-align: center;
+	font-size:11px;
+	/* part 1 of 2 centering hack */
+	}
+
+#deed {
+	width: 620px; 
+	padding: 15px;
+	margin-top: 20px;
+	margin-bottom: 20px;
+	margin-right: auto;
+	margin-left: auto; 	
+	/* opera does not like 'margin:20px auto' */
+	background: #ffc;
+	border: 3px groove #333;
+	text-align:left; 
+	/* part 2 of 2 centering hack */
+	width: 620px; /* ie5win fudge begins */
+	voice-family: "\"}\"";
+	voice-family:inherit;
+	width: 584px;
+	}
+	
+html>body #content {
+	width: 584px; /* ie5win fudge ends */
+	}
+	
+.fineprint {
+	border:1px solid black; 
+	padding:8px; 
+	background:#ffffff;
+	text-align:justify;
+}
+
+.text, li {
+	font-family:verdana, sans-serif;
+	font-size:11px;
+	margin-left:20px;
+	margin-right:20px;
+	line-height:140%;
+	text-align:left;
+}
+
+.tiny {
+	font-family:verdana, sans-serif;
+	font-size:11px;
+	margin-bottom:10px;
+}
\ No newline at end of file
diff --git a/licenses/by-sa/legalcode_files/logo_code.gif b/licenses/by-sa/legalcode_files/logo_code.gif
new file mode 100644
index 00000000..7de342c7
Binary files /dev/null and b/licenses/by-sa/legalcode_files/logo_code.gif differ
diff --git a/licenses/gpl.txt b/licenses/gpl.txt
new file mode 100644
index 00000000..d511905c
--- /dev/null
+++ b/licenses/gpl.txt
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/licenses/lgpl.txt b/licenses/lgpl.txt
new file mode 100644
index 00000000..5ab7695a
--- /dev/null
+++ b/licenses/lgpl.txt
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/patches/binutils/2.11.2/gcc-pr3106.patch b/patches/binutils/2.11.2/gcc-pr3106.patch
new file mode 100644
index 00000000..c3a02646
--- /dev/null
+++ b/patches/binutils/2.11.2/gcc-pr3106.patch
@@ -0,0 +1,28 @@
+See http://gcc.gnu.org/PR3106
+Backported from gcc-3.0.x
+
+Fixes error
+  .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr'
+  /usr/include/stdio.h:258: error: previous declaration of `sys_nerr'
+  make[1]: *** [strerror.o] Error 1
+  make: *** [all-libiberty] Error 2
+on Mac OS X.
+
+--- binutils-2.11.2/libiberty/strerror.c.old	2004-03-24 16:23:19.000000000 -0800
++++ binutils-2.11.2/libiberty/strerror.c	2004-03-24 16:23:48.000000000 -0800
+@@ -13,6 +13,7 @@
+    incompatible with our later declaration, perhaps by using const
+    attributes.  So we hide the declaration in errno.h (if any) using a
+    macro. */
++#define sys_nerr sys_nerr__
+ #define sys_errlist sys_errlist__
+ #endif
+ 
+@@ -20,6 +21,7 @@
+ #include <errno.h>
+ 
+ #ifdef HAVE_SYS_ERRLIST
++#undef sys_nerr
+ #undef sys_errlist
+ #endif
+ 
diff --git a/patches/binutils/2.13.90.0.2/README b/patches/binutils/2.13.90.0.2/README
new file mode 100644
index 00000000..521e6699
--- /dev/null
+++ b/patches/binutils/2.13.90.0.2/README
@@ -0,0 +1,6 @@
+The files rh62*.patch are from the Red Hat 6.2 file
+binutils-2.13.90.0.2-2.src.rpm
+
+I am trusting here that Red Hat's patches are appropriate for all CPU
+types.  If I'm wrong, just remove the offending patch...
+- Dan Kegel
diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch
new file mode 100644
index 00000000..f8719a5c
--- /dev/null
+++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch
@@ -0,0 +1,96 @@
+2002-04-20  Jakub Jelinek  <jakub@redhat.com>
+
+	* elf32-sparc.c (elf32_sparc_relocate_section): Find real output
+	section with SEC_MERGE.
+	* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
+
+--- binutils/bfd/elf32-sparc.c.jj	Sat Apr 20 22:11:57 2002
++++ binutils/bfd/elf32-sparc.c	Sat Apr 20 23:06:33 2002
+@@ -1144,7 +1144,7 @@ elf32_sparc_relocate_section (output_bfd
+       struct elf_link_hash_entry *h;
+       Elf_Internal_Sym *sym;
+       asection *sec;
+-      bfd_vma relocation, off;
++      bfd_vma relocation, off, orig_addend = 0;
+       bfd_reloc_status_type r;
+       boolean is_plt = false;
+       boolean unresolved_reloc;
+@@ -1192,6 +1192,7 @@ elf32_sparc_relocate_section (output_bfd
+ 	{
+ 	  sym = local_syms + r_symndx;
+ 	  sec = local_sections[r_symndx];
++	  orig_addend = rel->r_addend;
+ 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
+ 	}
+       else
+@@ -1527,6 +1528,25 @@ elf32_sparc_relocate_section (output_bfd
+ 			  asection *osec;
+ 
+ 			  osec = sec->output_section;
++			  /* FIXME: As soon as making sections zero size
++			     is possible, this if can go away.  */
++			  if (bfd_is_abs_section (osec)
++			      && h == NULL
++			      && (sec->flags & SEC_MERGE)
++			      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
++			      && (elf_section_data (sec)->sec_info_type
++				  == ELF_INFO_TYPE_MERGE))
++			    {
++			      asection *msec;
++
++			      msec = sec;
++			      _bfd_merged_section_offset (output_bfd, &msec,
++					elf_section_data (sec)->sec_info,
++					sym->st_value + orig_addend,
++					(bfd_vma) 0);
++			      osec = msec->output_section;
++			     }
++
+ 			  indx = elf_section_data (osec)->dynindx;
+ 
+ 			  /* FIXME: we really should be able to link non-pic
+--- binutils/bfd/elf64-sparc.c.jj	Sat Apr 20 22:11:57 2002
++++ binutils/bfd/elf64-sparc.c	Sat Apr 20 23:12:18 2002
+@@ -1939,7 +1939,7 @@ sparc64_elf_relocate_section (output_bfd
+       struct elf_link_hash_entry *h;
+       Elf_Internal_Sym *sym;
+       asection *sec;
+-      bfd_vma relocation, off;
++      bfd_vma relocation, off, orig_addend = 0;
+       bfd_reloc_status_type r;
+       boolean is_plt = false;
+       boolean unresolved_reloc;
+@@ -1982,6 +1982,7 @@ sparc64_elf_relocate_section (output_bfd
+ 	{
+ 	  sym = local_syms + r_symndx;
+ 	  sec = local_sections[r_symndx];
++	  orig_addend = rel->r_addend;
+ 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
+ 	}
+       else
+@@ -2211,6 +2212,25 @@ sparc64_elf_relocate_section (output_bfd
+ 			    asection *osec;
+ 
+ 			    osec = sec->output_section;
++			    /* FIXME: As soon as making sections zero size
++			       is possible, this if can go away.  */
++			    if (bfd_is_abs_section (osec)
++				&& h == NULL
++				&& (sec->flags & SEC_MERGE)
++				&& ELF_ST_TYPE (sym->st_info) == STT_SECTION
++				&& (elf_section_data (sec)->sec_info_type
++				    == ELF_INFO_TYPE_MERGE))
++			      {
++				asection *msec;
++
++				msec = sec;
++				_bfd_merged_section_offset (output_bfd, &msec,
++					elf_section_data (sec)->sec_info,
++					sym->st_value + orig_addend,
++					(bfd_vma) 0);
++				osec = msec->output_section;
++			      }
++
+ 			    indx = elf_section_data (osec)->dynindx;
+ 
+ 			    /* FIXME: we really should be able to link non-pic
diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch
new file mode 100644
index 00000000..a35b8f8f
--- /dev/null
+++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch
@@ -0,0 +1,58 @@
+--- binutils/ld/emulparams/elf_i386_glibc21.sh.jj	Sat Aug  3 17:04:41 2002
++++ binutils/ld/emulparams/elf_i386_glibc21.sh	Sat Aug  3 17:04:41 2002
+@@ -0,0 +1,11 @@
++SCRIPT_NAME=elf
++OUTPUT_FORMAT="elf32-i386"
++TEXT_START_ADDR=0x08048000
++MAXPAGESIZE=0x1000
++NONPAGED_TEXT_START_ADDR=0x08048000
++ARCH=i386
++MACHINE=
++NOP=0x9090
++TEMPLATE_NAME=elf32
++GENERATE_SHLIB_SCRIPT=yes
++LIB_PATH=/usr/i386-glibc21-linux/lib:/usr/local/lib
+--- binutils/ld/configure.tgt.jj	Thu Aug  1 20:49:32 2002
++++ binutils/ld/configure.tgt	Sat Aug  3 17:06:18 2002
+@@ -143,7 +143,8 @@ i[3456]86-*-linux*aout*)	targ_emul=i386l
+ 			;;
+ i[3456]86-*-linux*oldld)	targ_emul=i386linux; targ_extra_emuls=elf_i386 ;;
+ i[3456]86-*-linux-gnu*)	targ_emul=elf_i386
+-			targ_extra_emuls=i386linux
++			targ_extra_emuls="i386linux elf_i386_glibc21"
++			targ_extra_libpath=elf_i386_glibc21
+ 			if test x${want64} = xtrue; then
+ 			  targ_extra_emuls="$targ_extra_emuls elf_x86_64"
+ 			fi
+--- binutils/ld/Makefile.am.jj	Thu Aug  1 20:49:32 2002
++++ binutils/ld/Makefile.am	Sat Aug  3 17:04:41 2002
+@@ -181,6 +181,7 @@ ALL_EMULATIONS = \
+ 	eelf_i386.o \
+ 	eelf_i386_be.o \
+ 	eelf_i386_chaos.o \
++	eelf_i386_glibc21.o \
+ 	eelf_i386_fbsd.o \
+ 	eelf_i386_ldso.o \
+ 	eelf_s390.o \
+@@ -718,6 +719,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf
+ eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \
+   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS}
+ 	${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)"
++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \
++  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
++	${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)"
+ eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \
+   $(srcdir)/emulparams/elf_i386.sh \
+   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+--- binutils/ld/Makefile.in.jj	Thu Aug  1 20:49:32 2002
++++ binutils/ld/Makefile.in	Sat Aug  3 17:07:34 2002
+@@ -1197,6 +1197,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf
+ eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \
+   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS}
+ 	${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)"
++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \
++  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
++	${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)"
+ eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \
+   $(srcdir)/emulparams/elf_i386.sh \
+   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch
new file mode 100644
index 00000000..030dfa96
--- /dev/null
+++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch
@@ -0,0 +1,372 @@
+2002-08-03  Jakub Jelinek  <jakub@redhat.com>
+
+	* config/tc-i386.c (output_insn): Save frag_now and frag_now_fix ()
+	at start of insn, pass it to output_disp and output_imm.
+	(output_disp): Added arguments.  If _GLOBAL_OFFSET_TABLE_ is seen
+	in displacement for R_386_32 reloc, use R_386_GOTPC and compute
+	properly addend.
+	(output_imm): Added arguments.  Compute properly addend for
+	R_386_GOTPC.
+	(md_apply_fix3): Remove R_386_GOTPC handling.
+	* testsuite/gas/i386/gotpc.s: New.
+	* testsuite/gas/i386/gotpc.d: New.
+	* testsuite/gas/i386/i386.exp: Add gotpc test.
+
+--- binutils/gas/config/tc-i386.c.jj	2002-07-18 11:35:39.000000000 +0200
++++ binutils/gas/config/tc-i386.c	2002-08-02 21:13:18.000000000 +0200
+@@ -104,8 +104,10 @@ static void output_insn PARAMS ((void));
+ static void output_branch PARAMS ((void));
+ static void output_jump PARAMS ((void));
+ static void output_interseg_jump PARAMS ((void));
+-static void output_imm PARAMS ((void));
+-static void output_disp PARAMS ((void));
++static void output_imm PARAMS ((fragS *insn_start_frag,
++				offsetT insn_start_off));
++static void output_disp PARAMS ((fragS *insn_start_frag,
++				 offsetT insn_start_off));
+ #ifndef I386COFF
+ static void s_bss PARAMS ((int));
+ #endif
+@@ -3101,14 +3103,21 @@ output_interseg_jump ()
+   md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
+ }
+ 
++
+ static void
+ output_insn ()
+ {
++  fragS *insn_start_frag;
++  offsetT insn_start_off;
++
+   /* Tie dwarf2 debug info to the address at the start of the insn.
+      We can't do this after the insn has been output as the current
+      frag may have been closed off.  eg. by frag_var.  */
+   dwarf2_emit_insn (0);
+ 
++  insn_start_frag = frag_now;
++  insn_start_off = frag_now_fix ();
++
+   /* Output jumps.  */
+   if (i.tm.opcode_modifier & Jump)
+     output_branch ();
+@@ -3179,10 +3188,10 @@ output_insn ()
+ 	}
+ 
+       if (i.disp_operands)
+-	output_disp ();
++	output_disp (insn_start_frag, insn_start_off);
+ 
+       if (i.imm_operands)
+-	output_imm ();
++	output_imm (insn_start_frag, insn_start_off);
+     }
+ 
+ #ifdef DEBUG386
+@@ -3194,7 +3203,9 @@ output_insn ()
+ }
+ 
+ static void
+-output_disp ()
++output_disp (insn_start_frag, insn_start_off)
++    fragS *insn_start_frag;
++    offsetT insn_start_off;
+ {
+   char *p;
+   unsigned int n;
+@@ -3224,6 +3235,7 @@ output_disp ()
+ 	    }
+ 	  else
+ 	    {
++	      RELOC_ENUM reloc_type;
+ 	      int size = 4;
+ 	      int sign = 0;
+ 	      int pcrel = (i.flags[n] & Operand_PCrel) != 0;
+@@ -3266,16 +3278,50 @@ output_disp ()
+ 		}
+ 
+ 	      p = frag_more (size);
++	      reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
++#ifdef BFD_ASSEMBLER
++	      if (reloc_type == BFD_RELOC_32
++		  && GOT_symbol
++		  && GOT_symbol == i.op[n].disps->X_add_symbol
++		  && (i.op[n].disps->X_op == O_symbol
++		      || (i.op[n].disps->X_op == O_add
++			  && ((symbol_get_value_expression
++			       (i.op[n].disps->X_op_symbol)->X_op)
++			      == O_subtract))))
++		{
++		  offsetT add;
++
++		  if (insn_start_frag == frag_now)
++		    add = (p - frag_now->fr_literal) - insn_start_off;
++		  else
++		    {
++		      fragS *fr;
++
++		      add = insn_start_frag->fr_fix - insn_start_off;
++		      for (fr = insn_start_frag->fr_next;
++			   fr && fr != frag_now; fr = fr->fr_next)
++			add += fr->fr_fix;
++		      add += p - frag_now->fr_literal;
++		    }
++
++		  /* We don't support dynamic linking on x86-64 yet.  */
++		  if (flag_code == CODE_64BIT)
++		    abort ();
++		  reloc_type = BFD_RELOC_386_GOTPC;
++		  i.op[n].disps->X_add_number += add;
++		}
++#endif
+ 	      fix_new_exp (frag_now, p - frag_now->fr_literal, size,
+-			   i.op[n].disps, pcrel,
+-			   reloc (size, pcrel, sign, i.reloc[n]));
++			   i.op[n].disps, pcrel, reloc_type);
+ 	    }
+ 	}
+     }
+ }
+ 
+ static void
+-output_imm ()
++output_imm (insn_start_frag, insn_start_off)
++    fragS *insn_start_frag;
++    offsetT insn_start_off;
+ {
+   char *p;
+   unsigned int n;
+@@ -3328,6 +3374,48 @@ output_imm ()
+ 	      p = frag_more (size);
+ 	      reloc_type = reloc (size, 0, sign, i.reloc[n]);
+ #ifdef BFD_ASSEMBLER
++	      /*   This is tough to explain.  We end up with this one if we
++	       * have operands that look like
++	       * "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal here is to
++	       * obtain the absolute address of the GOT, and it is strongly
++	       * preferable from a performance point of view to avoid using
++	       * a runtime relocation for this.  The actual sequence of
++	       * instructions often look something like:
++	       *
++	       *	call	.L66
++	       * .L66:
++	       *	popl	%ebx
++	       *	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
++	       *
++	       *   The call and pop essentially return the absolute address
++	       * of the label .L66 and store it in %ebx.  The linker itself
++	       * will ultimately change the first operand of the addl so
++	       * that %ebx points to the GOT, but to keep things simple, the
++	       * .o file must have this operand set so that it generates not
++	       * the absolute address of .L66, but the absolute address of
++	       * itself.  This allows the linker itself simply treat a GOTPC
++	       * relocation as asking for a pcrel offset to the GOT to be
++	       * added in, and the addend of the relocation is stored in the
++	       * operand field for the instruction itself.
++	       *
++	       *   Our job here is to fix the operand so that it would add
++	       * the correct offset so that %ebx would point to itself.  The
++	       * thing that is tricky is that .-.L66 will point to the
++	       * beginning of the instruction, so we need to further modify
++	       * the operand so that it will point to itself.  There are
++	       * other cases where you have something like:
++	       *
++	       *	.long	$_GLOBAL_OFFSET_TABLE_+[.-.L66]
++	       *
++	       * and here no correction would be required.  Internally in
++	       * the assembler we treat operands of this form as not being
++	       * pcrel since the '.' is explicitly mentioned, and I wonder
++	       * whether it would simplify matters to do it this way.  Who
++	       * knows.  In earlier versions of the PIC patches, the
++	       * pcrel_adjust field was used to store the correction, but
++	       * since the expression is not pcrel, I felt it would be
++	       * confusing to do it this way.  */
++
+ 	      if (reloc_type == BFD_RELOC_32
+ 		  && GOT_symbol
+ 		  && GOT_symbol == i.op[n].imms->X_add_symbol
+@@ -3337,11 +3425,26 @@ output_imm ()
+ 			       (i.op[n].imms->X_op_symbol)->X_op)
+ 			      == O_subtract))))
+ 		{
++		  offsetT add;
++
++		  if (insn_start_frag == frag_now)
++		    add = (p - frag_now->fr_literal) - insn_start_off;
++		  else
++		    {
++		      fragS *fr;
++
++		      add = insn_start_frag->fr_fix - insn_start_off;
++		      for (fr = insn_start_frag->fr_next;
++			   fr && fr != frag_now; fr = fr->fr_next)
++			add += fr->fr_fix;
++		      add += p - frag_now->fr_literal;
++		    }
++
+ 		  /* We don't support dynamic linking on x86-64 yet.  */
+ 		  if (flag_code == CODE_64BIT)
+ 		    abort ();
+ 		  reloc_type = BFD_RELOC_386_GOTPC;
+-		  i.op[n].imms->X_add_number += 3;
++		  i.op[n].imms->X_add_number += add;
+ 		}
+ #endif
+ 	      fix_new_exp (frag_now, p - frag_now->fr_literal, size,
+@@ -4542,48 +4645,6 @@ md_apply_fix3 (fixP, valP, seg)
+ 	   runtime we merely add the offset to the actual PLT entry.  */
+ 	value = -4;
+ 	break;
+-      case BFD_RELOC_386_GOTPC:
+-
+-/*   This is tough to explain.  We end up with this one if we have
+- * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal
+- * here is to obtain the absolute address of the GOT, and it is strongly
+- * preferable from a performance point of view to avoid using a runtime
+- * relocation for this.  The actual sequence of instructions often look
+- * something like:
+- *
+- *	call	.L66
+- * .L66:
+- *	popl	%ebx
+- *	addl	$_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
+- *
+- *   The call and pop essentially return the absolute address of
+- * the label .L66 and store it in %ebx.  The linker itself will
+- * ultimately change the first operand of the addl so that %ebx points to
+- * the GOT, but to keep things simple, the .o file must have this operand
+- * set so that it generates not the absolute address of .L66, but the
+- * absolute address of itself.  This allows the linker itself simply
+- * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be
+- * added in, and the addend of the relocation is stored in the operand
+- * field for the instruction itself.
+- *
+- *   Our job here is to fix the operand so that it would add the correct
+- * offset so that %ebx would point to itself.  The thing that is tricky is
+- * that .-.L66 will point to the beginning of the instruction, so we need
+- * to further modify the operand so that it will point to itself.
+- * There are other cases where you have something like:
+- *
+- *	.long	$_GLOBAL_OFFSET_TABLE_+[.-.L66]
+- *
+- * and here no correction would be required.  Internally in the assembler
+- * we treat operands of this form as not being pcrel since the '.' is
+- * explicitly mentioned, and I wonder whether it would simplify matters
+- * to do it this way.  Who knows.  In earlier versions of the PIC patches,
+- * the pcrel_adjust field was used to store the correction, but since the
+- * expression is not pcrel, I felt it would be confusing to do it this
+- * way.  */
+-
+-	value -= 1;
+-	break;
+       case BFD_RELOC_386_GOT32:
+       case BFD_RELOC_386_TLS_GD:
+       case BFD_RELOC_386_TLS_LDM:
+--- binutils/gas/testsuite/gas/i386/gotpc.s.jj	2002-08-02 21:17:57.000000000 +0200
++++ binutils/gas/testsuite/gas/i386/gotpc.s	2002-08-03 22:55:47.000000000 +0200
+@@ -0,0 +1,40 @@
++	.text
++test:
++	addl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax
++	addl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx
++	addl $_GLOBAL_OFFSET_TABLE_, %eax
++	addl $_GLOBAL_OFFSET_TABLE_, %ebx
++	leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %ebx
++	leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %eax
++	leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %eax
++	leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %ebx
++	subl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax
++	subl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx
++	subl $_GLOBAL_OFFSET_TABLE_, %eax
++	subl $_GLOBAL_OFFSET_TABLE_, %ebx
++	orl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax
++	orl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx
++	orl $_GLOBAL_OFFSET_TABLE_, %eax
++	orl $_GLOBAL_OFFSET_TABLE_, %ebx
++	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax
++	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx
++	movl $_GLOBAL_OFFSET_TABLE_, %eax
++	movl $_GLOBAL_OFFSET_TABLE_, %ebx
++	movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo
++	movl $_GLOBAL_OFFSET_TABLE_+[.-test], %gs:foo
++	gs; movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo
++	movl $_GLOBAL_OFFSET_TABLE_+[.-test], _GLOBAL_OFFSET_TABLE_
++	movl _GLOBAL_OFFSET_TABLE_+[.-test], %eax
++	movl _GLOBAL_OFFSET_TABLE_+[.-test], %ebx
++	movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test]
++	movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test]
++	movl %eax, %gs:_GLOBAL_OFFSET_TABLE_+[.-test]
++	movl %ebx, %gs:_GLOBAL_OFFSET_TABLE_+[.-test]
++	gs; movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test]
++	gs; movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test]
++	leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax
++	leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx
++	movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax
++	movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx
++	.long _GLOBAL_OFFSET_TABLE_+[.-test]
++	.long _GLOBAL_OFFSET_TABLE_@GOTOFF
+--- binutils/gas/testsuite/gas/i386/gotpc.d.jj	2002-08-02 21:18:43.000000000 +0200
++++ binutils/gas/testsuite/gas/i386/gotpc.d	2002-08-03 23:05:43.000000000 +0200
+@@ -0,0 +1,52 @@
++#objdump: -drw
++#name: i386 gotpc
++
++.*: +file format .*
++
++Disassembly of section .text:
++
++0+000 <test>:
++   0:	05 01 00 00 00 [ 	]*add    \$0x1,%eax	1: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++   5:	81 c3 07 00 00 00 [ 	]*add    \$0x7,%ebx	7: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++   b:	05 01 00 00 00 [ 	]*add    \$0x1,%eax	c: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  10:	81 c3 02 00 00 00 [ 	]*add    \$0x2,%ebx	12: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  16:	8d 98 16 00 00 00 [ 	]*lea    0x16\(%eax\),%ebx	18: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE
++  1c:	8d 83 1c 00 00 00 [ 	]*lea    0x1c\(%ebx\),%eax	1e: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE
++  22:	8d 80 22 00 00 00 [ 	]*lea    0x22\(%eax\),%eax	24: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE
++  28:	8d 9b 28 00 00 00 [ 	]*lea    0x28\(%ebx\),%ebx	2a: (R_386_)?(dir)?32	_GLOBAL_OFFSET_TABLE
++  2e:	2d 2f 00 00 00 [ 	]*sub    \$0x2f,%eax	2f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  33:	81 eb 35 00 00 00 [ 	]*sub    \$0x35,%ebx	35: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  39:	2d 01 00 00 00 [ 	]*sub    \$0x1,%eax	3a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  3e:	81 eb 02 00 00 00 [ 	]*sub    \$0x2,%ebx	40: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  44:	0d 45 00 00 00 [ 	]*or     \$0x45,%eax	45: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  49:	81 cb 4b 00 00 00 [ 	]*or     \$0x4b,%ebx	4b: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  4f:	0d 01 00 00 00 [ 	]*or     \$0x1,%eax	50: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  54:	81 cb 02 00 00 00 [ 	]*or     \$0x2,%ebx	56: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  5a:	b8 5b 00 00 00 [ 	]*mov    \$0x5b,%eax	5b: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  5f:	bb 60 00 00 00 [ 	]*mov    \$0x60,%ebx	60: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  64:	b8 01 00 00 00 [ 	]*mov    \$0x1,%eax	65: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  69:	bb 01 00 00 00 [ 	]*mov    \$0x1,%ebx	6a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  6e:	c7 05 00 00 00 00 74 00 00 00 [ 	]*movl   \$0x74,0x0	70: (R_386_)?(dir)?32	foo
++[ 	]*74: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  78:	65 c7 05 00 00 00 00 7f 00 00 00 [ 	]*movl   \$0x7f,%gs:0x0	7b: (R_386_)?(dir)?32	foo
++[ 	]*7f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  83:	65 c7 05 00 00 00 00 8a 00 00 00 [ 	]*movl   \$0x8a,%gs:0x0	86: (R_386_)?(dir)?32	foo
++[ 	]*8a: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  8e:	c7 05 02 00 00 00 94 00 00 00 [ 	]*movl   \$0x94,0x2	90: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++[ 	]*94: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  98:	a1 99 00 00 00 [ 	]*mov    0x99,%eax	99: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  9d:	8b 1d 9f 00 00 00 [ 	]*mov    0x9f,%ebx	9f: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  a3:	a3 a4 00 00 00 [ 	]*mov    %eax,0xa4	a4: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  a8:	89 1d aa 00 00 00 [ 	]*mov    %ebx,0xaa	aa: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  ae:	65 a3 b0 00 00 00 [ 	]*mov    %eax,%gs:0xb0	b0: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  b4:	65 89 1d b7 00 00 00 [ 	]*mov    %ebx,%gs:0xb7	b7: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  bb:	65 a3 bd 00 00 00 [ 	]*mov    %eax,%gs:0xbd	bd: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  c1:	65 89 1d c4 00 00 00 [ 	]*mov    %ebx,%gs:0xc4	c4: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  c8:	8d 83 00 00 00 00 [ 	]*lea    0x0\(%ebx\),%eax	ca: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
++  ce:	8d 9b 00 00 00 00 [ 	]*lea    0x0\(%ebx\),%ebx	d0: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
++  d4:	8b 83 00 00 00 00 [ 	]*mov    0x0\(%ebx\),%eax	d6: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
++  da:	8b 9b 00 00 00 00 [ 	]*mov    0x0\(%ebx\),%ebx	dc: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
++  e0:	e0 00 [ 	]*loopne e2 <test\+0xe2>	e0: (R_386_)?GOTPC	_GLOBAL_OFFSET_TABLE_
++  e2:	00 00 [ 	]*add    %al,\(%eax\)
++  e4:	00 00 [ 	]*add    %al,\(%eax\)	e4: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
++	...
+--- binutils/gas/testsuite/gas/i386/i386.exp.jj	2002-07-18 11:35:39.000000000 +0200
++++ binutils/gas/testsuite/gas/i386/i386.exp	2002-08-02 21:57:46.000000000 +0200
+@@ -53,6 +53,7 @@ if [expr ([istarget "i*86-*-*"] ||  [ist
+     run_dump_test "jump"
+     run_dump_test "ssemmx2"
+     run_dump_test "sse2"
++    run_dump_test "gotpc"
+ 
+     # PIC is only supported on ELF targets.
+     if { ([istarget "*-*-elf*"] || [istarget "*-*-linux*"] )
+
diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch
new file mode 100644
index 00000000..511a11e5
--- /dev/null
+++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch
@@ -0,0 +1,27 @@
+2002-08-07  Jakub Jelinek  <jakub@redhat.com>
+
+	* elf32-i386.c (elf_i386_relocate_section): Fill in proper addend
+	for R_386_TLS_TPOFF32 relocs against symndx 0.
+
+--- binutils/bfd/elf32-i386.c.jj	2002-07-30 16:14:55.000000000 +0200
++++ binutils/bfd/elf32-i386.c	2002-08-07 23:41:48.000000000 +0200
+@@ -2561,13 +2567,17 @@ elf_i386_relocate_section (output_bfd, i
+ 	      outrel.r_offset = (htab->sgot->output_section->vma
+ 				 + htab->sgot->output_offset + off);
+ 
+-	      bfd_put_32 (output_bfd, 0,
+-			  htab->sgot->contents + off);
+ 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
+ 	      if (r_type == R_386_TLS_GD)
+ 		dr_type = R_386_TLS_DTPMOD32;
+ 	      else
+ 		dr_type = R_386_TLS_TPOFF32;
++	      if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
++		bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
++			    htab->sgot->contents + off);
++	      else
++		bfd_put_32 (output_bfd, 0,
++			    htab->sgot->contents + off);
+ 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
+ 	      loc = (Elf32_External_Rel *) htab->srelgot->contents;
+ 	      loc += htab->srelgot->reloc_count++;
diff --git a/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch
new file mode 100644
index 00000000..ec701ce6
--- /dev/null
+++ b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch
@@ -0,0 +1,11 @@
+--- orig/Makefile.in	2004-05-12 18:22:30.000000000 -0700
++++ binutils-2.14.90.0.5/Makefile.in	2004-05-12 18:26:19.000000000 -0700
+@@ -24384,6 +24384,8 @@
+ # Demangler depends on libiberty.
+ configure-demangler: maybe-configure-libiberty
+ all-demangler: maybe-all-libiberty
++configure-build-demangler: maybe-configure-build-libiberty
++all-build-demangler: maybe-all-build-libiberty
+ 
+ # The new demangler, which is included in libiberty, is written in C++.
+ # A working C++ compiler is required. For the target demangler, it may
diff --git a/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch
new file mode 100644
index 00000000..ca0f2ac2
--- /dev/null
+++ b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch
@@ -0,0 +1,38 @@
+Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: kkojima@rr.iij4u.or.jp
+Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700"
+	<3F28A15A.5010400@kegel.com>
+References: <3F28A15A.5010400@kegel.com>
+Date: Thu, 31 Jul 2003 21:47:38 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+Dan Kegel <dank@kegel.com> wrote:
+>> I'll give binutils-2.14.90.0.5 a shot, then. 
+> 
+> No joy - same problem.  Guess I'll take this up on binutils and/or libc-alpha.
+
+Please try the patch below, though it's a diff against the current
+binutils CVS.
+
+Regards,
+	kaz
+--
+diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c
+--- src/bfd/elf32-sh.c.old	Fri Jul 25 14:46:58 2003
++++ src/bfd/elf32-sh.c	Thu Jul 31 21:09:38 2003
+@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b
+ 							  sreloc, 2))
+ 			return FALSE;
+ 		    }
++#if 0
+ 		  if (sec->flags & SEC_READONLY)
+ 		    info->flags |= DF_TEXTREL;
++#endif
+ 		  elf_section_data (sec)->sreloc = sreloc;
+ 		}
+ 
+
+
diff --git a/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch
new file mode 100644
index 00000000..ec701ce6
--- /dev/null
+++ b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch
@@ -0,0 +1,11 @@
+--- orig/Makefile.in	2004-05-12 18:22:30.000000000 -0700
++++ binutils-2.14.90.0.5/Makefile.in	2004-05-12 18:26:19.000000000 -0700
+@@ -24384,6 +24384,8 @@
+ # Demangler depends on libiberty.
+ configure-demangler: maybe-configure-libiberty
+ all-demangler: maybe-all-libiberty
++configure-build-demangler: maybe-configure-build-libiberty
++all-build-demangler: maybe-all-build-libiberty
+ 
+ # The new demangler, which is included in libiberty, is written in C++.
+ # A working C++ compiler is required. For the target demangler, it may
diff --git a/patches/binutils/2.14.92/binutils-skip-comments.patch b/patches/binutils/2.14.92/binutils-skip-comments.patch
new file mode 100644
index 00000000..804a17e0
--- /dev/null
+++ b/patches/binutils/2.14.92/binutils-skip-comments.patch
@@ -0,0 +1,101 @@
+Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html
+Fixes
+localealias.s:544: Error: junk at end of line, first unrecognized character is `,' 
+when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3
+
+Paths adjusted to match crosstool's patcher.
+
+Message-Id: m3n052qw2g.fsf@whitebox.m5r.de
+From: Andreas Schwab <schwab at suse dot de>
+To: Nathan Sidwell <nathan at codesourcery dot com>
+Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com
+Date: Fri, 23 Apr 2004 22:27:19 +0200
+Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line
+
+Nathan Sidwell <nathan@codesourcery.com> writes:
+
+> Index: read.c
+> ===================================================================
+> RCS file: /cvs/src/src/gas/read.c,v
+> retrieving revision 1.76
+> diff -c -3 -p -r1.76 read.c
+> *** read.c	12 Mar 2004 17:48:12 -0000	1.76
+> --- read.c	18 Mar 2004 09:56:05 -0000
+> *************** read_a_source_file (char *name)
+> *** 1053,1059 ****
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  ignore_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+> --- 1053,1059 ----
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  demand_empty_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+
+This means that the unknown character is no longer ignored, despite the
+comment.  As a side effect a line starting with a line comment character
+not followed by APP in NO_APP mode now triggers an error instead of just a
+warning, breaking builds of glibc on m68k-linux.  Earlier in
+read_a_source_file where #APP is handled there is another comment that
+claims that unknown comments are ignored, when in fact they aren't (only
+the initial line comment character is skipped).
+
+Note that the presence of #APP will mess up the line counters, but
+that appears to be difficult to fix.
+
+Andreas.
+
+2004-04-23  Andreas Schwab  <schwab@suse.de>
+
+	* read.c (read_a_source_file): Ignore unknown text after line
+	comment character.  Fix misleading comment.
+
+--- binutils/gas/read.c.~1.78.~	2004-04-23 08:58:23.000000000 +0200
++++ binutils/gas/read.c	2004-04-23 21:49:01.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* read.c - read a source file -
+    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+-   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 
+ This file is part of GAS, the GNU Assembler.
+ 
+@@ -950,10 +950,14 @@ read_a_source_file (char *name)
+ 	      unsigned int new_length;
+ 	      char *tmp_buf = 0;
+ 
+-	      bump_line_counters ();
+ 	      s = input_line_pointer;
+ 	      if (strncmp (s, "APP\n", 4))
+-		continue;	/* We ignore it */
++		{
++		  /* We ignore it */
++		  ignore_rest_of_line ();
++		  continue;
++		}
++	      bump_line_counters ();
+ 	      s += 4;
+ 
+ 	      sb_new (&sbuf);
+@@ -1052,7 +1056,7 @@ read_a_source_file (char *name)
+ 	    continue;
+ #endif
+ 	  input_line_pointer--;
+-	  /* Report unknown char as ignored.  */
++	  /* Report unknown char as error.  */
+ 	  demand_empty_rest_of_line ();
+ 	}
+ 
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstra&#xC3;e 5, 90409 N&#xC3;rnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
diff --git a/patches/binutils/2.14.92/gccpr15247-fix.patch b/patches/binutils/2.14.92/gccpr15247-fix.patch
new file mode 100644
index 00000000..967bf7f9
--- /dev/null
+++ b/patches/binutils/2.14.92/gccpr15247-fix.patch
@@ -0,0 +1,192 @@
+See
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247
+
+Fixes spurious error
+/tmp/ccvNi4ou.s: Assembler messages:
+/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31]
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1
+
+when compiling glibc's dosincos.c with gcc-3.4.0
+
+===================================================================
+RCS file: /cvs/src/src/opcodes/sparc-opc.c,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/opcodes/sparc-opc.c	2004/01/18 23:46:32	1.9
++++ src/opcodes/sparc-opc.c	2004/04/20 10:23:51	1.10
+@@ -1273,110 +1273,72 @@
+ #define FM_DF 2		/* v9 */
+ #define FM_QF 3		/* v9 */
+ 
+-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }
+-
+-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags, v9 }
++
++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 }
+ 
+ /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
+-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 }
+-
+-/* v9 */ fmovcc  ("fmovda",	FM_DF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovqa",	FM_QF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovsa",	FM_SF, CONDA, FCONDA, 0),
+-/* v9 */ fmovicc ("fmovdcc",	FM_DF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovqcc",	FM_QF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovscc",	FM_SF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovdcs",	FM_DF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovqcs",	FM_QF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovscs",	FM_SF, CONDCS, 0),
+-/* v9 */ fmovcc  ("fmovde",	FM_DF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovqe",	FM_QF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovse",	FM_SF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovdg",	FM_DF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovqg",	FM_QF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovsg",	FM_SF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovdge",	FM_DF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovqge",	FM_QF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovsge",	FM_SF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovicc ("fmovdgeu",	FM_DF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqgeu",	FM_QF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovsgeu",	FM_SF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovdgu",	FM_DF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovqgu",	FM_QF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovsgu",	FM_SF, CONDGU, 0),
+-/* v9 */ fmovcc  ("fmovdl",	FM_DF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovql",	FM_QF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovsl",	FM_SF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovdle",	FM_DF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovqle",	FM_QF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovsle",	FM_SF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovicc ("fmovdleu",	FM_DF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovqleu",	FM_QF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovsleu",	FM_SF, CONDLEU, 0),
+-/* v9 */ fmovfcc ("fmovdlg",	FM_DF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovqlg",	FM_QF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovslg",	FM_SF, FCONDLG, 0),
+-/* v9 */ fmovicc ("fmovdlu",	FM_DF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqlu",	FM_QF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovslu",	FM_SF, CONDLU, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovdn",	FM_DF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovqn",	FM_QF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovsn",	FM_SF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovdne",	FM_DF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovqne",	FM_QF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovsne",	FM_SF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovicc ("fmovdneg",	FM_DF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovqneg",	FM_QF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovsneg",	FM_SF, CONDNEG, 0),
+-/* v9 */ fmovcc  ("fmovdnz",	FM_DF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqnz",	FM_QF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsnz",	FM_SF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovfcc ("fmovdo",	FM_DF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovqo",	FM_QF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovso",	FM_SF, FCONDO, 0),
+-/* v9 */ fmovicc ("fmovdpos",	FM_DF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovqpos",	FM_QF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovspos",	FM_SF, CONDPOS, 0),
+-/* v9 */ fmovfcc ("fmovdu",	FM_DF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovqu",	FM_QF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovsu",	FM_SF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovdue",	FM_DF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovque",	FM_QF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovsue",	FM_SF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovdug",	FM_DF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovqug",	FM_QF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovsug",	FM_SF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovduge",	FM_DF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovquge",	FM_QF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovsuge",	FM_SF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovdul",	FM_DF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovqul",	FM_QF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovsul",	FM_SF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovdule",	FM_DF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovqule",	FM_QF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovsule",	FM_SF, FCONDULE, 0),
+-/* v9 */ fmovicc ("fmovdvc",	FM_DF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovqvc",	FM_QF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovsvc",	FM_SF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovdvs",	FM_DF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovqvs",	FM_QF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovsvs",	FM_SF, CONDVS, 0),
+-/* v9 */ fmovcc  ("fmovdz",	FM_DF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqz",	FM_QF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsz",	FM_SF, CONDZ, FCONDZ, F_ALIAS),
+-
++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 }
++
++#define fmovicc(suffix, cond, flags) /* v9 */ \
++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags),		\
++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags),		\
++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags)
++
++#define fmovfcc(suffix, fcond, flags) /* v9 */ \
++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags),		\
++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags),		\
++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags)
++
++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \
++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags),	\
++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags),	\
++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags)
++
++/* v9 */ fmovcc  ("a", CONDA, FCONDA, 0),
++/* v9 */ fmovicc ("cc", CONDCC, 0),
++/* v9 */ fmovicc ("cs", CONDCS, 0),
++/* v9 */ fmovcc  ("e", CONDE, FCONDE, 0),
++/* v9 */ fmovcc  ("g", CONDG, FCONDG, 0),
++/* v9 */ fmovcc  ("ge", CONDGE, FCONDGE, 0),
++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS),
++/* v9 */ fmovicc ("gu", CONDGU, 0),
++/* v9 */ fmovcc  ("l", CONDL, FCONDL, 0),
++/* v9 */ fmovcc  ("le", CONDLE, FCONDLE, 0),
++/* v9 */ fmovicc ("leu", CONDLEU, 0),
++/* v9 */ fmovfcc ("lg", FCONDLG, 0),
++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS),
++/* v9 */ fmovcc  ("n", CONDN, FCONDN, 0),
++/* v9 */ fmovcc  ("ne", CONDNE, FCONDNE, 0),
++/* v9 */ fmovicc ("neg", CONDNEG, 0),
++/* v9 */ fmovcc  ("nz", CONDNZ, FCONDNZ, F_ALIAS),
++/* v9 */ fmovfcc ("o", FCONDO, 0),
++/* v9 */ fmovicc ("pos", CONDPOS, 0),
++/* v9 */ fmovfcc ("u", FCONDU, 0),
++/* v9 */ fmovfcc ("ue", FCONDUE, 0),
++/* v9 */ fmovfcc ("ug", FCONDUG, 0),
++/* v9 */ fmovfcc ("uge", FCONDUGE, 0),
++/* v9 */ fmovfcc ("ul", FCONDUL, 0),
++/* v9 */ fmovfcc ("ule", FCONDULE, 0),
++/* v9 */ fmovicc ("vc", CONDVC, 0),
++/* v9 */ fmovicc ("vs", CONDVS, 0),
++/* v9 */ fmovcc  ("z", CONDZ, FCONDZ, F_ALIAS),
++
++#undef fmoviccx /* v9 */
++#undef fmovfccx /* v9 */
++#undef fmovccx /* v9 */
+ #undef fmovicc /* v9 */
+ #undef fmovfcc /* v9 */
+ #undef fmovcc /* v9 */
diff --git a/patches/binutils/2.14/binutils-sh-relocs.patch b/patches/binutils/2.14/binutils-sh-relocs.patch
new file mode 100644
index 00000000..ca0f2ac2
--- /dev/null
+++ b/patches/binutils/2.14/binutils-sh-relocs.patch
@@ -0,0 +1,38 @@
+Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: kkojima@rr.iij4u.or.jp
+Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700"
+	<3F28A15A.5010400@kegel.com>
+References: <3F28A15A.5010400@kegel.com>
+Date: Thu, 31 Jul 2003 21:47:38 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+Dan Kegel <dank@kegel.com> wrote:
+>> I'll give binutils-2.14.90.0.5 a shot, then. 
+> 
+> No joy - same problem.  Guess I'll take this up on binutils and/or libc-alpha.
+
+Please try the patch below, though it's a diff against the current
+binutils CVS.
+
+Regards,
+	kaz
+--
+diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c
+--- src/bfd/elf32-sh.c.old	Fri Jul 25 14:46:58 2003
++++ src/bfd/elf32-sh.c	Thu Jul 31 21:09:38 2003
+@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b
+ 							  sreloc, 2))
+ 			return FALSE;
+ 		    }
++#if 0
+ 		  if (sec->flags & SEC_READONLY)
+ 		    info->flags |= DF_TEXTREL;
++#endif
+ 		  elf_section_data (sec)->sreloc = sreloc;
+ 		}
+ 
+
+
diff --git a/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch
new file mode 100644
index 00000000..97fa6eed
--- /dev/null
+++ b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch
@@ -0,0 +1,118 @@
+From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html
+
+Date: Tue, 17 Aug 2004 12:04:29 +0200
+From: Jakub Jelinek <jakub at redhat dot com>
+To: binutils at sources dot redhat dot com
+Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc
+Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz>
+Reply-To: Jakub Jelinek <jakub at redhat dot com>
+References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz>
+In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz>
+
+On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote:
+> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS
+> binutils (nor 2.15.91.0.2).
+> The problem is that libstdc++.so linking fails with:
+> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o
+> The problem is that both io-inst.s and sstream-inst.s have
+> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc
+> also instantiates some templates sstream-inst.cc doesn't instantiate,
+> the inliner can do a better job in io-inst.cc.
+> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while
+> it is not in sstream-inst.cc (in assembly,
+> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives,
+> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some
+> .save directives.
+> IA-64 ABI allows leaf routines to have no unwind section at all,
+> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in
+> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first
+> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly
+> references a discarded section.
+> 
+> Not sure what should be done here, but certainly the compiler
+> isn't at fault here, it is a binutils problem.
+> One fix could be to create empty .gnu.linkonce.ia64unw.* section
+> in assembler, another special case ia64 unwind sections in the linker.
+
+Here is a patch for the first possibility.
+It certainly makes libstdc++.so to link and even the unwind info looks
+good on brief skimming.
+
+2004-08-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* config/tc-ia64.c (start_unwind_section): Add linkonce_empty
+	argument, don't do anything if current section is not
+	.gnu.linkonce.t.* and linkonce_empty is set.
+	(generate_unwind_image, dot_endp): Adjust callers, call
+	start_unwind_section (*, 1) if nothing will be put into the
+	section.
+
+--- binutils/gas/config/tc-ia64.c.jj	2004-07-30 11:42:24.000000000 +0200
++++ binutils/gas/config/tc-ia64.c	2004-08-17 13:45:04.288173205 +0200
+@@ -1,5 +1,6 @@
+ /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
+-   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
++   Free Software Foundation, Inc.
+    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+ 
+    This file is part of GAS, the GNU Assembler.
+@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] =
+   };
+ 
+ static void
+-start_unwind_section (const segT text_seg, int sec_index)
++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty)
+ {
+   /*
+     Use a slightly ugly scheme to derive the unwind section names from
+@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se
+       prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
+       suffix += sizeof (".gnu.linkonce.t.") - 1;
+     }
++  else if (linkonce_empty)
++    return;
+ 
+   prefix_len = strlen (prefix);
+   suffix_len = strlen (suffix);
+@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s
+       expressionS exp;
+       bfd_reloc_code_real_type reloc;
+ 
+-      start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO);
++      start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0);
+ 
+       /* Make sure the section has 4 byte alignment for ILP32 and
+ 	 8 byte alignment for LP64.  */
+@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s
+ 	  unwind.personality_routine = 0;
+ 	}
+     }
++  else
++    start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1);
+ 
+   free_saved_prologue_counts ();
+   unwind.list = unwind.tail = unwind.current_entry = NULL;
+@@ -4164,7 +4169,7 @@ dot_endp (dummy)
+       subseg_set (md.last_text_seg, 0);
+       unwind.proc_end = expr_build_dot ();
+ 
+-      start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND);
++      start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0);
+ 
+       /* Make sure that section has 4 byte alignment for ILP32 and
+          8 byte alignment for LP64.  */
+@@ -4204,6 +4209,9 @@ dot_endp (dummy)
+ 			    bytes_per_address);
+ 
+     }
++  else
++    start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1);
++
+   subseg_set (saved_seg, saved_subseg);
+ 
+   /* Parse names of main and alternate entry points and set symbol sizes.  */
+
+
+	Jakub
+
diff --git a/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch
new file mode 100644
index 00000000..03f64533
--- /dev/null
+++ b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch
@@ -0,0 +1,74 @@
+See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html
+
+Date: Fri, 20 Aug 2004 21:13:43 -0400
+From: Daniel Jacobowitz <drow at false dot org>
+To: binutils at sources dot redhat dot com
+Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux
+Message-ID: <20040821011342.GA30319@nevyn.them.org>
+Mail-Followup-To: binutils at sources dot redhat dot com
+References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org>
+In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org>
+
+On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote:
+> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote:
+> > Thanks.  How's this?
+> 
+> As you might have guessed from my rather slack review of your previous
+> patch, I trust you enough to give the OK without proper review.  But
+> since you asked...  :)
+
+Checked in as so.
+
+-- 
+Daniel Jacobowitz
+
+2004-08-20  Daniel Jacobowitz  <dan@debian.org>
+
+	* elflink.c (_bfd_elf_section_already_linked): Handle
+	SEC_LINK_DUPLICATES_SAME_CONTENTS.
+
+Index: elflink.c
+===================================================================
+RCS file: /big/fsf/rsync/src-cvs/src/bfd/elflink.c,v
+retrieving revision 1.97
+diff -u -p -r1.97 elflink.c
+--- binutils/bfd/elflink.c	18 Aug 2004 02:45:42 -0000	1.97
++++ binutils/bfd/elflink.c	21 Aug 2004 00:59:08 -0000
+@@ -9366,6 +9366,36 @@ _bfd_elf_section_already_linked (bfd *ab
+ 		  (_("%B: duplicate section `%A' has different size\n"),
+ 		   abfd, sec);
+ 	      break;
++
++	    case SEC_LINK_DUPLICATES_SAME_CONTENTS:
++	      if (sec->size != l->sec->size)
++		(*_bfd_error_handler)
++		  (_("%B: duplicate section `%A' has different size\n"),
++		   abfd, sec);
++	      else if (sec->size != 0)
++		{
++		  bfd_byte *sec_contents, *l_sec_contents;
++
++		  if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents))
++		    (*_bfd_error_handler)
++		      (_("%B: warning: could not read contents of section `%A'\n"),
++		       abfd, sec);
++		  else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec,
++							&l_sec_contents))
++		    (*_bfd_error_handler)
++		      (_("%B: warning: could not read contents of section `%A'\n"),
++		       l->sec->owner, l->sec);
++		  else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
++		    (*_bfd_error_handler)
++		      (_("%B: warning: duplicate section `%A' has different contents\n"),
++		       abfd, sec);
++
++		  if (sec_contents)
++		    free (sec_contents);
++		  if (l_sec_contents)
++		    free (l_sec_contents);
++		}
++	      break;
+ 	    }
+ 
+ 	  /* Set the output_section field so that lang_add_section
+
diff --git a/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch
new file mode 100644
index 00000000..804a17e0
--- /dev/null
+++ b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch
@@ -0,0 +1,101 @@
+Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html
+Fixes
+localealias.s:544: Error: junk at end of line, first unrecognized character is `,' 
+when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3
+
+Paths adjusted to match crosstool's patcher.
+
+Message-Id: m3n052qw2g.fsf@whitebox.m5r.de
+From: Andreas Schwab <schwab at suse dot de>
+To: Nathan Sidwell <nathan at codesourcery dot com>
+Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com
+Date: Fri, 23 Apr 2004 22:27:19 +0200
+Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line
+
+Nathan Sidwell <nathan@codesourcery.com> writes:
+
+> Index: read.c
+> ===================================================================
+> RCS file: /cvs/src/src/gas/read.c,v
+> retrieving revision 1.76
+> diff -c -3 -p -r1.76 read.c
+> *** read.c	12 Mar 2004 17:48:12 -0000	1.76
+> --- read.c	18 Mar 2004 09:56:05 -0000
+> *************** read_a_source_file (char *name)
+> *** 1053,1059 ****
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  ignore_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+> --- 1053,1059 ----
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  demand_empty_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+
+This means that the unknown character is no longer ignored, despite the
+comment.  As a side effect a line starting with a line comment character
+not followed by APP in NO_APP mode now triggers an error instead of just a
+warning, breaking builds of glibc on m68k-linux.  Earlier in
+read_a_source_file where #APP is handled there is another comment that
+claims that unknown comments are ignored, when in fact they aren't (only
+the initial line comment character is skipped).
+
+Note that the presence of #APP will mess up the line counters, but
+that appears to be difficult to fix.
+
+Andreas.
+
+2004-04-23  Andreas Schwab  <schwab@suse.de>
+
+	* read.c (read_a_source_file): Ignore unknown text after line
+	comment character.  Fix misleading comment.
+
+--- binutils/gas/read.c.~1.78.~	2004-04-23 08:58:23.000000000 +0200
++++ binutils/gas/read.c	2004-04-23 21:49:01.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* read.c - read a source file -
+    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+-   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 
+ This file is part of GAS, the GNU Assembler.
+ 
+@@ -950,10 +950,14 @@ read_a_source_file (char *name)
+ 	      unsigned int new_length;
+ 	      char *tmp_buf = 0;
+ 
+-	      bump_line_counters ();
+ 	      s = input_line_pointer;
+ 	      if (strncmp (s, "APP\n", 4))
+-		continue;	/* We ignore it */
++		{
++		  /* We ignore it */
++		  ignore_rest_of_line ();
++		  continue;
++		}
++	      bump_line_counters ();
+ 	      s += 4;
+ 
+ 	      sb_new (&sbuf);
+@@ -1052,7 +1056,7 @@ read_a_source_file (char *name)
+ 	    continue;
+ #endif
+ 	  input_line_pointer--;
+-	  /* Report unknown char as ignored.  */
++	  /* Report unknown char as error.  */
+ 	  demand_empty_rest_of_line ();
+ 	}
+ 
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstra&#xC3;e 5, 90409 N&#xC3;rnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
diff --git a/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch
new file mode 100644
index 00000000..967bf7f9
--- /dev/null
+++ b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch
@@ -0,0 +1,192 @@
+See
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247
+
+Fixes spurious error
+/tmp/ccvNi4ou.s: Assembler messages:
+/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31]
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1
+
+when compiling glibc's dosincos.c with gcc-3.4.0
+
+===================================================================
+RCS file: /cvs/src/src/opcodes/sparc-opc.c,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/opcodes/sparc-opc.c	2004/01/18 23:46:32	1.9
++++ src/opcodes/sparc-opc.c	2004/04/20 10:23:51	1.10
+@@ -1273,110 +1273,72 @@
+ #define FM_DF 2		/* v9 */
+ #define FM_QF 3		/* v9 */
+ 
+-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }
+-
+-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags, v9 }
++
++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 }
+ 
+ /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
+-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 }
+-
+-/* v9 */ fmovcc  ("fmovda",	FM_DF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovqa",	FM_QF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovsa",	FM_SF, CONDA, FCONDA, 0),
+-/* v9 */ fmovicc ("fmovdcc",	FM_DF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovqcc",	FM_QF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovscc",	FM_SF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovdcs",	FM_DF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovqcs",	FM_QF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovscs",	FM_SF, CONDCS, 0),
+-/* v9 */ fmovcc  ("fmovde",	FM_DF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovqe",	FM_QF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovse",	FM_SF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovdg",	FM_DF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovqg",	FM_QF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovsg",	FM_SF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovdge",	FM_DF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovqge",	FM_QF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovsge",	FM_SF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovicc ("fmovdgeu",	FM_DF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqgeu",	FM_QF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovsgeu",	FM_SF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovdgu",	FM_DF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovqgu",	FM_QF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovsgu",	FM_SF, CONDGU, 0),
+-/* v9 */ fmovcc  ("fmovdl",	FM_DF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovql",	FM_QF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovsl",	FM_SF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovdle",	FM_DF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovqle",	FM_QF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovsle",	FM_SF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovicc ("fmovdleu",	FM_DF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovqleu",	FM_QF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovsleu",	FM_SF, CONDLEU, 0),
+-/* v9 */ fmovfcc ("fmovdlg",	FM_DF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovqlg",	FM_QF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovslg",	FM_SF, FCONDLG, 0),
+-/* v9 */ fmovicc ("fmovdlu",	FM_DF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqlu",	FM_QF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovslu",	FM_SF, CONDLU, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovdn",	FM_DF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovqn",	FM_QF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovsn",	FM_SF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovdne",	FM_DF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovqne",	FM_QF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovsne",	FM_SF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovicc ("fmovdneg",	FM_DF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovqneg",	FM_QF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovsneg",	FM_SF, CONDNEG, 0),
+-/* v9 */ fmovcc  ("fmovdnz",	FM_DF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqnz",	FM_QF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsnz",	FM_SF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovfcc ("fmovdo",	FM_DF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovqo",	FM_QF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovso",	FM_SF, FCONDO, 0),
+-/* v9 */ fmovicc ("fmovdpos",	FM_DF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovqpos",	FM_QF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovspos",	FM_SF, CONDPOS, 0),
+-/* v9 */ fmovfcc ("fmovdu",	FM_DF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovqu",	FM_QF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovsu",	FM_SF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovdue",	FM_DF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovque",	FM_QF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovsue",	FM_SF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovdug",	FM_DF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovqug",	FM_QF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovsug",	FM_SF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovduge",	FM_DF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovquge",	FM_QF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovsuge",	FM_SF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovdul",	FM_DF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovqul",	FM_QF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovsul",	FM_SF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovdule",	FM_DF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovqule",	FM_QF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovsule",	FM_SF, FCONDULE, 0),
+-/* v9 */ fmovicc ("fmovdvc",	FM_DF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovqvc",	FM_QF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovsvc",	FM_SF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovdvs",	FM_DF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovqvs",	FM_QF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovsvs",	FM_SF, CONDVS, 0),
+-/* v9 */ fmovcc  ("fmovdz",	FM_DF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqz",	FM_QF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsz",	FM_SF, CONDZ, FCONDZ, F_ALIAS),
+-
++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 }
++
++#define fmovicc(suffix, cond, flags) /* v9 */ \
++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags),		\
++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags),		\
++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags)
++
++#define fmovfcc(suffix, fcond, flags) /* v9 */ \
++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags),		\
++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags),		\
++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags)
++
++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \
++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags),	\
++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags),	\
++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags)
++
++/* v9 */ fmovcc  ("a", CONDA, FCONDA, 0),
++/* v9 */ fmovicc ("cc", CONDCC, 0),
++/* v9 */ fmovicc ("cs", CONDCS, 0),
++/* v9 */ fmovcc  ("e", CONDE, FCONDE, 0),
++/* v9 */ fmovcc  ("g", CONDG, FCONDG, 0),
++/* v9 */ fmovcc  ("ge", CONDGE, FCONDGE, 0),
++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS),
++/* v9 */ fmovicc ("gu", CONDGU, 0),
++/* v9 */ fmovcc  ("l", CONDL, FCONDL, 0),
++/* v9 */ fmovcc  ("le", CONDLE, FCONDLE, 0),
++/* v9 */ fmovicc ("leu", CONDLEU, 0),
++/* v9 */ fmovfcc ("lg", FCONDLG, 0),
++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS),
++/* v9 */ fmovcc  ("n", CONDN, FCONDN, 0),
++/* v9 */ fmovcc  ("ne", CONDNE, FCONDNE, 0),
++/* v9 */ fmovicc ("neg", CONDNEG, 0),
++/* v9 */ fmovcc  ("nz", CONDNZ, FCONDNZ, F_ALIAS),
++/* v9 */ fmovfcc ("o", FCONDO, 0),
++/* v9 */ fmovicc ("pos", CONDPOS, 0),
++/* v9 */ fmovfcc ("u", FCONDU, 0),
++/* v9 */ fmovfcc ("ue", FCONDUE, 0),
++/* v9 */ fmovfcc ("ug", FCONDUG, 0),
++/* v9 */ fmovfcc ("uge", FCONDUGE, 0),
++/* v9 */ fmovfcc ("ul", FCONDUL, 0),
++/* v9 */ fmovfcc ("ule", FCONDULE, 0),
++/* v9 */ fmovicc ("vc", CONDVC, 0),
++/* v9 */ fmovicc ("vs", CONDVS, 0),
++/* v9 */ fmovcc  ("z", CONDZ, FCONDZ, F_ALIAS),
++
++#undef fmoviccx /* v9 */
++#undef fmovfccx /* v9 */
++#undef fmovccx /* v9 */
+ #undef fmovicc /* v9 */
+ #undef fmovfcc /* v9 */
+ #undef fmovcc /* v9 */
diff --git a/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch
new file mode 100644
index 00000000..97fa6eed
--- /dev/null
+++ b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch
@@ -0,0 +1,118 @@
+From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html
+
+Date: Tue, 17 Aug 2004 12:04:29 +0200
+From: Jakub Jelinek <jakub at redhat dot com>
+To: binutils at sources dot redhat dot com
+Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc
+Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz>
+Reply-To: Jakub Jelinek <jakub at redhat dot com>
+References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz>
+In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz>
+
+On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote:
+> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS
+> binutils (nor 2.15.91.0.2).
+> The problem is that libstdc++.so linking fails with:
+> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o
+> The problem is that both io-inst.s and sstream-inst.s have
+> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc
+> also instantiates some templates sstream-inst.cc doesn't instantiate,
+> the inliner can do a better job in io-inst.cc.
+> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while
+> it is not in sstream-inst.cc (in assembly,
+> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives,
+> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some
+> .save directives.
+> IA-64 ABI allows leaf routines to have no unwind section at all,
+> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in
+> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first
+> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly
+> references a discarded section.
+> 
+> Not sure what should be done here, but certainly the compiler
+> isn't at fault here, it is a binutils problem.
+> One fix could be to create empty .gnu.linkonce.ia64unw.* section
+> in assembler, another special case ia64 unwind sections in the linker.
+
+Here is a patch for the first possibility.
+It certainly makes libstdc++.so to link and even the unwind info looks
+good on brief skimming.
+
+2004-08-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* config/tc-ia64.c (start_unwind_section): Add linkonce_empty
+	argument, don't do anything if current section is not
+	.gnu.linkonce.t.* and linkonce_empty is set.
+	(generate_unwind_image, dot_endp): Adjust callers, call
+	start_unwind_section (*, 1) if nothing will be put into the
+	section.
+
+--- binutils/gas/config/tc-ia64.c.jj	2004-07-30 11:42:24.000000000 +0200
++++ binutils/gas/config/tc-ia64.c	2004-08-17 13:45:04.288173205 +0200
+@@ -1,5 +1,6 @@
+ /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
+-   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
++   Free Software Foundation, Inc.
+    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
+ 
+    This file is part of GAS, the GNU Assembler.
+@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] =
+   };
+ 
+ static void
+-start_unwind_section (const segT text_seg, int sec_index)
++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty)
+ {
+   /*
+     Use a slightly ugly scheme to derive the unwind section names from
+@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se
+       prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
+       suffix += sizeof (".gnu.linkonce.t.") - 1;
+     }
++  else if (linkonce_empty)
++    return;
+ 
+   prefix_len = strlen (prefix);
+   suffix_len = strlen (suffix);
+@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s
+       expressionS exp;
+       bfd_reloc_code_real_type reloc;
+ 
+-      start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO);
++      start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0);
+ 
+       /* Make sure the section has 4 byte alignment for ILP32 and
+ 	 8 byte alignment for LP64.  */
+@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s
+ 	  unwind.personality_routine = 0;
+ 	}
+     }
++  else
++    start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1);
+ 
+   free_saved_prologue_counts ();
+   unwind.list = unwind.tail = unwind.current_entry = NULL;
+@@ -4164,7 +4169,7 @@ dot_endp (dummy)
+       subseg_set (md.last_text_seg, 0);
+       unwind.proc_end = expr_build_dot ();
+ 
+-      start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND);
++      start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0);
+ 
+       /* Make sure that section has 4 byte alignment for ILP32 and
+          8 byte alignment for LP64.  */
+@@ -4204,6 +4209,9 @@ dot_endp (dummy)
+ 			    bytes_per_address);
+ 
+     }
++  else
++    start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1);
++
+   subseg_set (saved_seg, saved_subseg);
+ 
+   /* Parse names of main and alternate entry points and set symbol sizes.  */
+
+
+	Jakub
+
diff --git a/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch
new file mode 100644
index 00000000..4e4934d8
--- /dev/null
+++ b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch
@@ -0,0 +1,68 @@
+See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html
+
+Date: Fri, 20 Aug 2004 21:13:43 -0400
+From: Daniel Jacobowitz <drow at false dot org>
+To: binutils at sources dot redhat dot com
+Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux
+Message-ID: <20040821011342.GA30319@nevyn.them.org>
+Mail-Followup-To: binutils at sources dot redhat dot com
+References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org>
+In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org>
+
+On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote:
+> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote:
+> > Thanks.  How's this?
+> 
+> As you might have guessed from my rather slack review of your previous
+> patch, I trust you enough to give the OK without proper review.  But
+> since you asked...  :)
+
+Checked in as so.
+
+-- 
+Daniel Jacobowitz
+
+[ rediffed against binutils-2.15.91.0.2, with some elbow grease ]
+
+2004-08-20  Daniel Jacobowitz  <dan@debian.org>
+
+	* elflink.c (_bfd_elf_section_already_linked): Handle
+	SEC_LINK_DUPLICATES_SAME_CONTENTS.
+--- binutils-2.15.91.0.2/bfd/elflink.c.old	2004-07-27 21:36:08.000000000 -0700
++++ binutils-2.15.91.0.2/bfd/elflink.c	2004-08-26 06:38:07.000000000 -0700
+@@ -9359,6 +9359,35 @@
+ 		  (_("%s: %s: warning: duplicate section `%s' has different size\n"),
+ 		   bfd_archive_filename (abfd), name);
+ 	      break;
++	    case SEC_LINK_DUPLICATES_SAME_CONTENTS:
++	      if (sec->size != l->sec->size)
++		(*_bfd_error_handler)
++		  (_("%B: duplicate section `%A' has different size\n"),
++		   bfd_archive_filename (abfd), sec);
++	      else if (sec->size != 0)
++		{
++		  bfd_byte *sec_contents, *l_sec_contents;
++
++		  if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents))
++		    (*_bfd_error_handler)
++		      (_("%B: warning: could not read contents of section `%A'\n"),
++		       bfd_archive_filename (abfd), sec);
++		  else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec,
++							&l_sec_contents))
++		    (*_bfd_error_handler)
++		      (_("%B: warning: could not read contents of section `%A'\n"),
++		       bfd_archive_filename(l->sec->owner), l->sec);
++		  else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
++		    (*_bfd_error_handler)
++		      (_("%B: warning: duplicate section `%A' has different contents\n"),
++		       bfd_archive_filename (abfd), sec);
++
++		  if (sec_contents)
++		    free (sec_contents);
++		  if (l_sec_contents)
++		    free (l_sec_contents);
++		}
++	      break;
+ 	    }
+ 
+ 	  /* Set the output_section field so that lang_add_section
diff --git a/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch
new file mode 100644
index 00000000..804a17e0
--- /dev/null
+++ b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch
@@ -0,0 +1,101 @@
+Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html
+Fixes
+localealias.s:544: Error: junk at end of line, first unrecognized character is `,' 
+when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3
+
+Paths adjusted to match crosstool's patcher.
+
+Message-Id: m3n052qw2g.fsf@whitebox.m5r.de
+From: Andreas Schwab <schwab at suse dot de>
+To: Nathan Sidwell <nathan at codesourcery dot com>
+Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com
+Date: Fri, 23 Apr 2004 22:27:19 +0200
+Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line
+
+Nathan Sidwell <nathan@codesourcery.com> writes:
+
+> Index: read.c
+> ===================================================================
+> RCS file: /cvs/src/src/gas/read.c,v
+> retrieving revision 1.76
+> diff -c -3 -p -r1.76 read.c
+> *** read.c	12 Mar 2004 17:48:12 -0000	1.76
+> --- read.c	18 Mar 2004 09:56:05 -0000
+> *************** read_a_source_file (char *name)
+> *** 1053,1059 ****
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  ignore_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+> --- 1053,1059 ----
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  demand_empty_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+
+This means that the unknown character is no longer ignored, despite the
+comment.  As a side effect a line starting with a line comment character
+not followed by APP in NO_APP mode now triggers an error instead of just a
+warning, breaking builds of glibc on m68k-linux.  Earlier in
+read_a_source_file where #APP is handled there is another comment that
+claims that unknown comments are ignored, when in fact they aren't (only
+the initial line comment character is skipped).
+
+Note that the presence of #APP will mess up the line counters, but
+that appears to be difficult to fix.
+
+Andreas.
+
+2004-04-23  Andreas Schwab  <schwab@suse.de>
+
+	* read.c (read_a_source_file): Ignore unknown text after line
+	comment character.  Fix misleading comment.
+
+--- binutils/gas/read.c.~1.78.~	2004-04-23 08:58:23.000000000 +0200
++++ binutils/gas/read.c	2004-04-23 21:49:01.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* read.c - read a source file -
+    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+-   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 
+ This file is part of GAS, the GNU Assembler.
+ 
+@@ -950,10 +950,14 @@ read_a_source_file (char *name)
+ 	      unsigned int new_length;
+ 	      char *tmp_buf = 0;
+ 
+-	      bump_line_counters ();
+ 	      s = input_line_pointer;
+ 	      if (strncmp (s, "APP\n", 4))
+-		continue;	/* We ignore it */
++		{
++		  /* We ignore it */
++		  ignore_rest_of_line ();
++		  continue;
++		}
++	      bump_line_counters ();
+ 	      s += 4;
+ 
+ 	      sb_new (&sbuf);
+@@ -1052,7 +1056,7 @@ read_a_source_file (char *name)
+ 	    continue;
+ #endif
+ 	  input_line_pointer--;
+-	  /* Report unknown char as ignored.  */
++	  /* Report unknown char as error.  */
+ 	  demand_empty_rest_of_line ();
+ 	}
+ 
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstra&#xC3;e 5, 90409 N&#xC3;rnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
diff --git a/patches/binutils/2.15/002-uclibc.patch b/patches/binutils/2.15/002-uclibc.patch
new file mode 100644
index 00000000..c64e74f5
--- /dev/null
+++ b/patches/binutils/2.15/002-uclibc.patch
@@ -0,0 +1,144 @@
+diff -uNr binutils-2.15-pristine/bfd/configure binutils-2.15/bfd/configure
+--- binutils-2.15-pristine/bfd/configure	2004-05-17 12:35:57.000000000 -0700
++++ binutils-2.15/bfd/configure	2004-07-19 16:36:19.000000000 -0700
+@@ -1009,7 +1009,7 @@
+ bfd_version_string="\"${VERSION}\""
+ if test x${is_release} = x; then
+   bfd_version_date=`sed -n -e 's/.*DATE //p' < ${srcdir}/version.h`
+-  bfd_version_string="\"${VERSION} ${bfd_version_date}\""
++  bfd_version_string="\"${VERSION} ${bfd_version_date} uClibc\""
+ fi
+ 
+ 
+diff -uNr binutils-2.15-pristine/bfd/elf32-arm.h binutils-2.15/bfd/elf32-arm.h
+--- binutils-2.15-pristine/bfd/elf32-arm.h	2004-05-17 12:35:58.000000000 -0700
++++ binutils-2.15/bfd/elf32-arm.h	2004-07-19 16:37:06.000000000 -0700
+@@ -124,7 +124,7 @@
+ 
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+-#define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER     "/lib/ld-uClibc.so.0"
+ 
+ #ifdef FOUR_WORD_PLT
+ 
+diff -uNr binutils-2.15-pristine/bfd/elf32-cris.c binutils-2.15/bfd/elf32-cris.c
+--- binutils-2.15-pristine/bfd/elf32-cris.c	2004-05-17 12:35:58.000000000 -0700
++++ binutils-2.15/bfd/elf32-cris.c	2004-07-19 16:49:59.000000000 -0700
+@@ -536,7 +536,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* The size in bytes of an entry in the procedure linkage table.  */
+ 
+diff -uNr binutils-2.15-pristine/bfd/elf32-frv.c binutils-2.15/bfd/elf32-frv.c
+--- binutils-2.15-pristine/bfd/elf32-frv.c	2004-05-17 12:35:58.000000000 -0700
++++ binutils-2.15/bfd/elf32-frv.c	2004-07-19 16:49:59.000000000 -0700
+@@ -2913,7 +2913,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ #define DEFAULT_STACK_SIZE 0x20000
+ 
+diff -uNr binutils-2.15-pristine/bfd/elf32-hppa.c binutils-2.15/bfd/elf32-hppa.c
+--- binutils-2.15-pristine/bfd/elf32-hppa.c	2004-05-17 12:35:58.000000000 -0700
++++ binutils-2.15/bfd/elf32-hppa.c	2004-07-19 16:49:59.000000000 -0700
+@@ -115,7 +115,7 @@
+ 
+ #define PLT_ENTRY_SIZE 8
+ #define GOT_ENTRY_SIZE 4
+-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ static const bfd_byte plt_stub[] =
+ {
+diff -uNr binutils-2.15-pristine/bfd/elf32-ppc.c binutils-2.15/bfd/elf32-ppc.c
+--- binutils-2.15-pristine/bfd/elf32-ppc.c	2004-05-17 12:35:59.000000000 -0700
++++ binutils-2.15/bfd/elf32-ppc.c	2004-07-19 16:49:59.000000000 -0700
+@@ -49,7 +49,7 @@
+ 
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* The size in bytes of an entry in the procedure linkage table.  */
+ #define PLT_ENTRY_SIZE 12
+diff -uNr binutils-2.15-pristine/bfd/elf32-s390.c binutils-2.15/bfd/elf32-s390.c
+--- binutils-2.15-pristine/bfd/elf32-s390.c	2004-05-17 12:35:59.000000000 -0700
++++ binutils-2.15/bfd/elf32-s390.c	2004-07-19 16:49:59.000000000 -0700
+@@ -452,7 +452,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
+    copying dynamic variables from a shared lib into an app's dynbss
+diff -uNr binutils-2.15-pristine/bfd/elf32-sparc.c binutils-2.15/bfd/elf32-sparc.c
+--- binutils-2.15-pristine/bfd/elf32-sparc.c	2004-05-17 12:36:00.000000000 -0700
++++ binutils-2.15/bfd/elf32-sparc.c	2004-07-19 16:49:59.000000000 -0700
+@@ -536,7 +536,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* The nop opcode we use.  */
+ 
+diff -uNr binutils-2.15-pristine/bfd/elf64-ppc.c binutils-2.15/bfd/elf64-ppc.c
+--- binutils-2.15-pristine/bfd/elf64-ppc.c	2004-05-17 12:36:01.000000000 -0700
++++ binutils-2.15/bfd/elf64-ppc.c	2004-07-19 16:49:59.000000000 -0700
+@@ -99,7 +99,7 @@
+ 
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* The size in bytes of an entry in the procedure linkage table.  */
+ #define PLT_ENTRY_SIZE 24
+diff -uNr binutils-2.15-pristine/bfd/elf64-s390.c binutils-2.15/bfd/elf64-s390.c
+--- binutils-2.15-pristine/bfd/elf64-s390.c	2004-05-17 12:36:01.000000000 -0700
++++ binutils-2.15/bfd/elf64-s390.c	2004-07-19 16:49:59.000000000 -0700
+@@ -473,7 +473,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
+    copying dynamic variables from a shared lib into an app's dynbss
+diff -uNr binutils-2.15-pristine/bfd/elf-m10300.c binutils-2.15/bfd/elf-m10300.c
+--- binutils-2.15-pristine/bfd/elf-m10300.c	2004-05-17 12:35:57.000000000 -0700
++++ binutils-2.15/bfd/elf-m10300.c	2004-07-19 16:49:59.000000000 -0700
+@@ -4026,7 +4026,7 @@
+ /* The name of the dynamic interpreter.  This is put in the .interp
+    section.  */
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ /* Create dynamic sections when linking against a dynamic object.  */
+ 
+diff -uNr binutils-2.15-pristine/bfd/elfxx-ia64.c binutils-2.15/bfd/elfxx-ia64.c
+--- binutils-2.15-pristine/bfd/elfxx-ia64.c	2004-05-17 12:36:02.000000000 -0700
++++ binutils-2.15/bfd/elfxx-ia64.c	2004-07-19 16:49:59.000000000 -0700
+@@ -643,7 +643,7 @@
+   0x60, 0x00, 0x80, 0x00               /*               br.few b6;;        */
+ };
+ 
+-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
+ 
+ static const bfd_byte oor_brl[16] =
+ {
diff --git a/patches/binutils/2.15/100-uclibc-conf.patch b/patches/binutils/2.15/100-uclibc-conf.patch
new file mode 100644
index 00000000..1c7fa4a4
--- /dev/null
+++ b/patches/binutils/2.15/100-uclibc-conf.patch
@@ -0,0 +1,692 @@
+diff -urN binutils-2.15-dist/bfd/config.bfd binutils-2.15/bfd/config.bfd
+--- binutils-2.15-dist/bfd/config.bfd	2004-05-17 14:35:56.000000000 -0500
++++ binutils-2.15/bfd/config.bfd	2004-08-04 12:01:44.000000000 -0500
+@@ -126,7 +126,7 @@
+     targ_defvec=ecoffalpha_little_vec
+     targ_selvecs=bfd_elf64_alpha_vec
+     ;;
+-  alpha*-*-linux-gnu* | alpha*-*-elf*)
++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*)
+     targ_defvec=bfd_elf64_alpha_vec
+     targ_selvecs=ecoffalpha_little_vec
+     ;;
+@@ -136,7 +136,7 @@
+   alpha*-*-*)
+     targ_defvec=ecoffalpha_little_vec
+     ;;
+-  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu)
++  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu)
+     targ_defvec=bfd_elf64_ia64_little_vec
+     targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec"
+     ;;
+@@ -213,7 +213,7 @@
+     targ_defvec=bfd_elf32_littlearm_vec
+     targ_selvecs=bfd_elf32_bigarm_vec
+     ;;
+-  armeb-*-elf | arm*b-*-linux-gnu*)
++  armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*)
+     targ_defvec=bfd_elf32_bigarm_vec
+     targ_selvecs=bfd_elf32_littlearm_vec
+     ;;
+@@ -221,7 +221,7 @@
+     targ_defvec=bfd_elf32_littlearm_vec
+     targ_selvecs=bfd_elf32_bigarm_vec
+     ;;
+-  arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \
++  arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \
+   arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks)
+     targ_defvec=bfd_elf32_littlearm_vec
+     targ_selvecs=bfd_elf32_bigarm_vec
+@@ -360,7 +360,7 @@
+     ;;
+ 
+ #ifdef BFD64
+-  hppa*64*-*-linux-gnu*)
++  hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*)
+     targ_defvec=bfd_elf64_hppa_linux_vec
+     targ_selvecs=bfd_elf64_hppa_vec
+     ;;
+@@ -371,7 +371,7 @@
+     ;;
+ #endif
+ 
+-  hppa*-*-linux-gnu* | hppa*-*-netbsd*)
++  hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*)
+     targ_defvec=bfd_elf32_hppa_linux_vec
+     targ_selvecs=bfd_elf32_hppa_vec
+     ;;
+@@ -494,7 +494,7 @@
+     targ_selvecs=bfd_elf32_i386_vec
+     targ_underscore=yes
+     ;;
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*)
+     targ_defvec=bfd_elf32_i386_vec
+     targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec"
+     targ64_selvecs=bfd_elf64_x86_64_vec
+@@ -508,7 +508,7 @@
+     targ_defvec=bfd_elf64_x86_64_vec
+     targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec"
+     ;;
+-  x86_64-*-linux-gnu*)
++  x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*)
+     targ_defvec=bfd_elf64_x86_64_vec
+     targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec"
+     ;;
+@@ -683,7 +683,7 @@
+     targ_selvecs=bfd_elf32_m68k_vec
+     targ_underscore=yes
+     ;;
+-  m68*-*-linux-gnu*)
++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*)
+     targ_defvec=bfd_elf32_m68k_vec
+     targ_selvecs=m68klinux_vec
+     ;;
+@@ -955,7 +955,8 @@
+     ;;
+ #endif
+   powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \
+-  powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \
++  powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \
++  powerpc-*-rtems* | \
+   powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*)
+     targ_defvec=bfd_elf32_powerpc_vec
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec"
+@@ -987,8 +988,8 @@
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec"
+     ;;
+   powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \
+-  powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\
+-  powerpcle-*-rtems*)
++  powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\
++  powerpcle-*-vxworks* | powerpcle-*-rtems*)
+     targ_defvec=bfd_elf32_powerpcle_vec
+     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec"
+     targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec"
+@@ -1149,7 +1150,7 @@
+     targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec"
+     targ_underscore=yes
+     ;;
+-  sparc-*-linux-gnu*)
++  sparc-*-linux-gnu* | sparc-*-linux-uclibc*)
+     targ_defvec=bfd_elf32_sparc_vec
+     targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec"
+     ;;
+@@ -1196,7 +1197,7 @@
+     targ_defvec=sunos_big_vec
+     targ_underscore=yes
+     ;;
+-  sparc64-*-linux-gnu*)
++  sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*)
+     targ_defvec=bfd_elf64_sparc_vec
+     targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec"
+     ;;
+@@ -1265,7 +1266,7 @@
+     targ_underscore=yes
+     ;;
+ 
+-  vax-*-linux-gnu*)
++  vax-*-linux-gnu* | vax-*-linux-uclibc*)
+     targ_defvec=bfd_elf32_vax_vec
+     ;;
+ 
+diff -urN binutils-2.15-dist/bfd/configure binutils-2.15/bfd/configure
+--- binutils-2.15-dist/bfd/configure	2004-05-17 14:35:57.000000000 -0500
++++ binutils-2.15/bfd/configure	2004-08-04 12:01:44.000000000 -0500
+@@ -1699,6 +1699,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5278,7 +5283,7 @@
+   alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
+ 	COREFILE=''
+ 	;;
+-  alpha*-*-linux-gnu*)
++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/alphalinux.h"'
+ 	;;
+@@ -5338,7 +5343,7 @@
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/i386mach3.h"'
+ 	;;
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/i386linux.h"'
+ 	;;
+@@ -5376,7 +5381,7 @@
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/hp300bsd.h"'
+ 	;;
+-  m68*-*-linux-gnu*)
++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/m68klinux.h"'
+ 	;;
+@@ -5477,7 +5482,7 @@
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/vaxult2.h"'
+ 	;;
+-  vax-*-linux-gnu*)
++  vax-*-linux-gnu* | vax-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/vaxlinux.h"'
+ 	;;
+diff -urN binutils-2.15-dist/bfd/configure.in binutils-2.15/bfd/configure.in
+--- binutils-2.15-dist/bfd/configure.in	2004-05-17 14:35:57.000000000 -0500
++++ binutils-2.15/bfd/configure.in	2004-08-04 12:01:44.000000000 -0500
+@@ -178,7 +178,7 @@
+   alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
+ 	COREFILE=''
+ 	;;
+-  alpha*-*-linux-gnu*)
++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/alphalinux.h"'
+ 	;;
+@@ -259,7 +259,7 @@
+ 	TRAD_HEADER='"hosts/i386mach3.h"'
+ 	;;
+ changequote(,)dnl
+-  i[3-7]86-*-linux-gnu*)
++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*)
+ changequote([,])dnl
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/i386linux.h"'
+@@ -300,7 +300,7 @@
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/hp300bsd.h"'
+ 	;;
+-  m68*-*-linux-gnu*)
++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/m68klinux.h"'
+ 	;;
+@@ -385,7 +385,7 @@
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/vaxult2.h"'
+ 	;;
+-  vax-*-linux-gnu*)
++  vax-*-linux-gnu* | vax-*-linux-uclibc*)
+ 	COREFILE=trad-core.lo
+ 	TRAD_HEADER='"hosts/vaxlinux.h"'
+ 	;;
+diff -urN binutils-2.15-dist/binutils/configure binutils-2.15/binutils/configure
+--- binutils-2.15-dist/binutils/configure	2004-01-02 11:08:04.000000000 -0600
++++ binutils-2.15/binutils/configure	2004-08-04 12:01:44.000000000 -0500
+@@ -1585,6 +1585,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+diff -urN binutils-2.15-dist/configure binutils-2.15/configure
+--- binutils-2.15-dist/configure	2004-05-17 14:36:20.000000000 -0500
++++ binutils-2.15/configure	2004-08-04 12:01:44.000000000 -0500
+@@ -1288,6 +1288,18 @@
+   i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu)
+     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+     ;;
++  i[3456789]86-*-linux-uclibc*)
++    # This section makes it possible to build newlib natively on linux.
++    # If we are using a cross compiler then don't configure newlib.
++    if test x${is_cross_compiler} != xno ; then
++      noconfigdirs="$noconfigdirs target-newlib"
++    fi
++    noconfigdirs="$noconfigdirs target-libgloss"
++    # If we are not using a cross compiler, do configure newlib.
++    # Note however, that newlib will only be configured in this situation
++    # if the --with-newlib option has been given, because otherwise
++    # 'target-newlib' will appear in skipdirs.
++    ;;
+   i[3456789]86-*-linux*)
+     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
+     # not build java stuff by default.
+diff -urN binutils-2.15-dist/configure.in binutils-2.15/configure.in
+--- binutils-2.15-dist/configure.in	2004-05-17 14:40:54.000000000 -0500
++++ binutils-2.15/configure.in	2004-08-04 12:01:44.000000000 -0500
+@@ -521,6 +521,18 @@
+   i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu)
+     noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+     ;;
++  i[[3456789]]86-*-linux-uclibc*)
++    # This section makes it possible to build newlib natively on linux.
++    # If we are using a cross compiler then don't configure newlib.
++    if test x${is_cross_compiler} != xno ; then
++      noconfigdirs="$noconfigdirs target-newlib"
++    fi
++    noconfigdirs="$noconfigdirs target-libgloss"
++    # If we are not using a cross compiler, do configure newlib.
++    # Note however, that newlib will only be configured in this situation
++    # if the --with-newlib option has been given, because otherwise
++    # 'target-newlib' will appear in skipdirs.
++    ;;
+   i[[3456789]]86-*-linux*)
+     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's
+     # not build java stuff by default.
+diff -urN binutils-2.15-dist/gas/configure binutils-2.15/gas/configure
+--- binutils-2.15-dist/gas/configure	2004-05-17 14:36:07.000000000 -0500
++++ binutils-2.15/gas/configure	2004-08-04 12:07:50.000000000 -0500
+@@ -3400,6 +3400,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -4224,6 +4229,7 @@
+       alpha*-*-osf*)			fmt=ecoff ;;
+       alpha*-*-linuxecoff*)		fmt=ecoff ;;
+       alpha*-*-linux-gnu*)		fmt=elf em=linux ;;
++      alpha*-*-linux-uclibc*)		fmt=elf em=linux ;;
+       alpha*-*-netbsd*)			fmt=elf em=nbsd ;;
+       alpha*-*-openbsd*)		fmt=elf em=obsd ;;
+ 
+@@ -4240,6 +4246,7 @@
+       arm*-*-conix*)			fmt=elf ;;
+       arm-*-linux*aout*)		fmt=aout em=linux ;;
+       arm*-*-linux-gnu*)		fmt=elf  em=linux ;;
++      arm*-*-linux-uclibc*)		fmt=elf  em=linux ;;
+       arm*-*-uclinux*)			fmt=elf  em=linux ;;
+       arm-*-netbsdelf*)                 fmt=elf  em=nbsd ;;
+       arm-*-*n*bsd*)			fmt=aout em=nbsd ;;
+@@ -4253,6 +4260,7 @@
+       avr-*-*)				fmt=elf ;;
+ 
+       cris-*-linux-gnu*)		fmt=multi bfd_gas=yes em=linux ;;
++      cris-*-linux-uclibc*)		fmt=multi bfd_gas=yes em=linux ;;
+       cris-*-*)				fmt=multi bfd_gas=yes ;;
+ 
+       d10v-*-*)				fmt=elf ;;
+@@ -4310,7 +4318,9 @@
+       i386-*-linux*oldld)		fmt=aout em=linux ;;
+       i386-*-linux*coff*)		fmt=coff em=linux ;;
+       i386-*-linux-gnu*)		fmt=elf em=linux ;;
++      i386-*-linux-uclibc*)		fmt=elf em=linux ;;
+       x86_64-*-linux-gnu*)		fmt=elf em=linux ;;
++      x86_64-*-linux-uclibc*)		fmt=elf em=linux ;;
+       i386-*-lynxos*)			fmt=coff em=lynx ;;
+       i386-*-sysv[45]*)			fmt=elf ;;
+       i386-*-solaris*)			fmt=elf ;;
+@@ -4370,6 +4380,7 @@
+       ia64-*-elf*)			fmt=elf ;;
+       ia64-*-aix*)			fmt=elf em=ia64aix ;;
+       ia64-*-linux-gnu*)		fmt=elf em=linux ;;
++      ia64-*-linux-uclibc*)		fmt=elf em=linux ;;
+       ia64-*-hpux*)			fmt=elf em=hpux ;;
+       ia64-*-netbsd*)			fmt=elf em=nbsd ;;
+ 
+@@ -4397,6 +4408,7 @@
+       m68k-*-hpux*)			fmt=hp300 em=hp300 ;;
+       m68k-*-linux*aout*)		fmt=aout em=linux ;;
+       m68k-*-linux-gnu*)		fmt=elf em=linux ;;
++      m68k-*-linux-uclibc*)		fmt=elf em=linux ;;
+       m68k-*-uclinux*)			fmt=elf ;;
+       m68k-*-gnu*)			fmt=elf ;;
+       m68k-*-lynxos*)			fmt=coff em=lynx ;;
+@@ -4459,6 +4471,7 @@
+       ppc-*-beos*)			fmt=coff ;;
+       ppc-*-*n*bsd* | ppc-*-elf*)	fmt=elf ;;
+       ppc-*-eabi* | ppc-*-sysv4*)	fmt=elf ;;
++      ppc-*-linux-uclibc* | \
+       ppc-*-linux-gnu*)			fmt=elf em=linux
+ 	    case "$endian" in
+ 		big)  ;;
+@@ -4486,7 +4499,9 @@
+       ppc-*-kaos*)			fmt=elf ;;
+ 
+       s390x-*-linux-gnu*)		fmt=elf em=linux ;;
++      s390x-*-linux-uclibc*)		fmt=elf em=linux ;;
+       s390-*-linux-gnu*)		fmt=elf em=linux ;;
++      s390-*-linux-uclibc*)		fmt=elf em=linux ;;
+ 
+       sh*-*-linux*)			fmt=elf em=linux
+ 	    case ${cpu} in
+@@ -4519,6 +4534,7 @@
+       sparc-*-coff)			fmt=coff ;;
+       sparc-*-linux*aout*)		fmt=aout em=linux ;;
+       sparc-*-linux-gnu*)		fmt=elf em=linux ;;
++      sparc-*-linux-uclibc*)		fmt=elf em=linux ;;
+       sparc-*-lynxos*)			fmt=coff em=lynx ;;
+       sparc-fujitsu-none)		fmt=aout ;;
+       sparc-*-elf)			fmt=elf ;;
+diff -urN binutils-2.15-dist/gas/configure.in binutils-2.15/gas/configure.in
+--- binutils-2.15-dist/gas/configure.in	2004-05-17 14:36:07.000000000 -0500
++++ binutils-2.15/gas/configure.in	2004-08-04 12:07:21.000000000 -0500
+@@ -194,6 +194,7 @@
+       alpha*-*-osf*)			fmt=ecoff ;;
+       alpha*-*-linuxecoff*)		fmt=ecoff ;;
+       alpha*-*-linux-gnu*)		fmt=elf em=linux ;;
++      alpha*-*-linux-uclibc*)		fmt=elf em=linux ;;
+       alpha*-*-netbsd*)			fmt=elf em=nbsd ;;
+       alpha*-*-openbsd*)		fmt=elf em=obsd ;;
+ 
+@@ -210,6 +211,7 @@
+       arm*-*-conix*)			fmt=elf ;;
+       arm-*-linux*aout*)		fmt=aout em=linux ;;
+       arm*-*-linux-gnu*)		fmt=elf  em=linux ;;
++      arm*-*-linux-uclibc*)		fmt=elf  em=linux ;;
+       arm*-*-uclinux*)			fmt=elf  em=linux ;;
+       arm-*-netbsdelf*)                 fmt=elf  em=nbsd ;;
+       arm-*-*n*bsd*)			fmt=aout em=nbsd ;;
+@@ -223,6 +225,7 @@
+       avr-*-*)				fmt=elf ;;
+ 
+       cris-*-linux-gnu*)		fmt=multi bfd_gas=yes em=linux ;;
++      cris-*-linux-uclibc*)		fmt=multi bfd_gas=yes em=linux ;;
+       cris-*-*)				fmt=multi bfd_gas=yes ;;
+ 
+       d10v-*-*)				fmt=elf ;;
+@@ -280,7 +283,9 @@
+       i386-*-linux*oldld)		fmt=aout em=linux ;;
+       i386-*-linux*coff*)		fmt=coff em=linux ;;
+       i386-*-linux-gnu*)		fmt=elf em=linux ;;
++      i386-*-linux-uclibc*)		fmt=elf em=linux ;;
+       x86_64-*-linux-gnu*)		fmt=elf em=linux ;;
++      x86_64-*-linux-uclibc*)		fmt=elf em=linux ;;
+       i386-*-lynxos*)			fmt=coff em=lynx ;;
+ changequote(,)dnl
+       i386-*-sysv[45]*)			fmt=elf ;;
+@@ -333,6 +338,7 @@
+       ia64-*-elf*)			fmt=elf ;;
+       ia64-*-aix*)			fmt=elf em=ia64aix ;;
+       ia64-*-linux-gnu*)		fmt=elf em=linux ;;
++      ia64-*-linux-uclibc*)		fmt=elf em=linux ;;
+       ia64-*-hpux*)			fmt=elf em=hpux ;;
+       ia64-*-netbsd*)			fmt=elf em=nbsd ;;
+ 
+@@ -360,6 +366,7 @@
+       m68k-*-hpux*)			fmt=hp300 em=hp300 ;;
+       m68k-*-linux*aout*)		fmt=aout em=linux ;;
+       m68k-*-linux-gnu*)		fmt=elf em=linux ;;
++      m68k-*-linux-uclibc*)		fmt=elf em=linux ;;
+       m68k-*-uclinux*)			fmt=elf ;;
+       m68k-*-gnu*)			fmt=elf ;;
+       m68k-*-lynxos*)			fmt=coff em=lynx ;;
+@@ -419,6 +426,7 @@
+       ppc-*-beos*)			fmt=coff ;;
+       ppc-*-*n*bsd* | ppc-*-elf*)	fmt=elf ;;
+       ppc-*-eabi* | ppc-*-sysv4*)	fmt=elf ;;
++      ppc-*-linux-uclibc* | \
+       ppc-*-linux-gnu*)			fmt=elf em=linux
+ 	    case "$endian" in
+ 		big)  ;;
+@@ -439,7 +447,9 @@
+       ppc-*-kaos*)			fmt=elf ;;
+ 
+       s390x-*-linux-gnu*)		fmt=elf em=linux ;;
++      s390x-*-linux-uclibc*)		fmt=elf em=linux ;;
+       s390-*-linux-gnu*)		fmt=elf em=linux ;;
++      s390-*-linux-uclibc*)		fmt=elf em=linux ;;
+ 
+       sh*-*-linux*)			fmt=elf em=linux
+ 	    case ${cpu} in
+@@ -472,6 +482,7 @@
+       sparc-*-coff)			fmt=coff ;;
+       sparc-*-linux*aout*)		fmt=aout em=linux ;;
+       sparc-*-linux-gnu*)		fmt=elf em=linux ;;
++      sparc-*-linux-uclibc*)		fmt=elf em=linux ;;
+       sparc-*-lynxos*)			fmt=coff em=lynx ;;
+       sparc-fujitsu-none)		fmt=aout ;;
+       sparc-*-elf)			fmt=elf ;;
+diff -urN binutils-2.15-dist/gprof/configure binutils-2.15/gprof/configure
+--- binutils-2.15-dist/gprof/configure	2003-08-26 12:19:19.000000000 -0500
++++ binutils-2.15/gprof/configure	2004-08-04 12:01:45.000000000 -0500
+@@ -1581,6 +1581,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+diff -urN binutils-2.15-dist/ld/configure binutils-2.15/ld/configure
+--- binutils-2.15-dist/ld/configure	2003-04-24 07:36:07.000000000 -0500
++++ binutils-2.15/ld/configure	2004-08-04 12:01:45.000000000 -0500
+@@ -1589,6 +1589,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+diff -urN binutils-2.15-dist/ld/configure.tgt binutils-2.15/ld/configure.tgt
+--- binutils-2.15-dist/ld/configure.tgt	2004-05-17 14:36:15.000000000 -0500
++++ binutils-2.15/ld/configure.tgt	2004-08-04 12:01:45.000000000 -0500
+@@ -30,6 +30,7 @@
+ 			targ_extra_emuls="criself crislinux"
+ 			targ_extra_libpath=$targ_extra_emuls ;;
+ cris-*-linux-gnu*)	targ_emul=crislinux ;;
++cris-*-linux-uclibc*)	targ_emul=crislinux ;;
+ cris-*-*)		targ_emul=criself
+ 			targ_extra_emuls="crisaout crislinux"
+ 			targ_extra_libpath=$targ_extra_emuls ;;
+@@ -59,14 +60,16 @@
+ 			tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'`
+ 			tdir_sun4=sparc-sun-sunos4
+ 			;;
+-sparc64-*-linux-gnu*)	targ_emul=elf64_sparc
++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*)	 \
++			targ_emul=elf64_sparc
+ 			targ_extra_emuls="elf32_sparc sparclinux sun4"
+ 			targ_extra_libpath=elf32_sparc
+ 			tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'`
+ 			tdir_sparclinux=${tdir_elf32_sparc}aout
+ 			tdir_sun4=sparc-sun-sunos4
+ 			;;
+-sparc*-*-linux-gnu*)	targ_emul=elf32_sparc
++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \
++			targ_emul=elf32_sparc
+ 			targ_extra_emuls="sparclinux elf64_sparc sun4"
+ 			targ_extra_libpath=elf64_sparc
+ 			tdir_sparclinux=${targ_alias}aout
+@@ -118,7 +121,9 @@
+ m32r*le-*-elf*)         targ_emul=m32rlelf ;;
+ m32r*-*-elf*)           targ_emul=m32relf ;;
+ m32r*le-*-linux-gnu*)   targ_emul=m32rlelf_linux ;;
++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;;
+ m32r*-*-linux-gnu*)     targ_emul=m32relf_linux ;;
++m32r*-*-linux-uclibc*)  targ_emul=m32relf_linux ;;
+ m68hc11-*-*|m6811-*-*)	targ_emul=m68hc11elf 
+ 			targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;;
+ m68hc12-*-*|m6812-*-*)	targ_emul=m68hc12elf 
+@@ -128,7 +133,7 @@
+ m68*-ericsson-ose)	targ_emul=sun3 ;;
+ m68*-apple-aux*)	targ_emul=m68kaux ;;
+ *-tandem-none)		targ_emul=st2000 ;;
+-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;;
++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;;
+ i[3-7]86-*-nto-qnx*)	targ_emul=i386nto ;;
+ i[3-7]86-*-vsta)	targ_emul=vsta ;;
+ i[3-7]86-go32-rtems*)	targ_emul=i386go32 ;;
+@@ -152,14 +157,16 @@
+ 			tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'`
+ 			;;
+ i[3-7]86-*-linux*oldld)	targ_emul=i386linux; targ_extra_emuls=elf_i386 ;;
+-i[3-7]86-*-linux-gnu*)	targ_emul=elf_i386
++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \
++			targ_emul=elf_i386
+ 			targ_extra_emuls=i386linux
+ 			if test x${want64} = xtrue; then
+ 			  targ_extra_emuls="$targ_extra_emuls elf_x86_64"
+ 			fi
+ 			tdir_i386linux=${targ_alias}aout
+ 			;;
+-x86_64-*-linux-gnu*)	targ_emul=elf_x86_64
++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \
++			targ_emul=elf_x86_64
+ 			targ_extra_emuls="elf_i386 i386linux"
+ 			targ_extra_libpath=elf_i386
+ 			tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'`
+@@ -259,10 +266,13 @@
+ arm9e-*-elf)		targ_emul=armelf ;;
+ arm-*-oabi)		targ_emul=armelf_oabi ;;
+ arm*b-*-linux-gnu*)	targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;;
++arm*b-*-linux-uclibc*)	targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;;
+ arm*-*-linux-gnu*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
++arm*-*-linux-uclibc*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
+ arm*-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
+ arm*-*-conix*)		targ_emul=armelf ;;
+-thumb-*-linux-gnu* | thumb-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \
++			targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
+ strongarm-*-coff)	targ_emul=armcoff ;;
+ strongarm-*-elf)	targ_emul=armelf ;;
+ strongarm-*-kaos*)	targ_emul=armelf ;;
+@@ -364,7 +374,8 @@
+ 			targ_extra_emuls=m68kelf
+ 			tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'`
+ 			;;
+-m68k-*-linux-gnu*)	targ_emul=m68kelf
++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \
++			targ_emul=m68kelf
+ 			targ_extra_emuls=m68klinux
+ 			tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'`
+ 			;;
+@@ -381,9 +392,9 @@
+ m68*-*-psos*)		targ_emul=m68kpsos ;;
+ m68*-*-rtemscoff*)	targ_emul=m68kcoff ;;
+ m68*-*-rtems*)		targ_emul=m68kelf ;;
+-hppa*64*-*-linux-gnu*)	targ_emul=hppa64linux ;;
++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*)  targ_emul=hppa64linux ;;
+ hppa*64*-*)		targ_emul=elf64hppa ;;
+-hppa*-*-linux-gnu*)	targ_emul=hppalinux ;;
++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*)	targ_emul=hppalinux ;;
+ hppa*-*-*elf*)		targ_emul=hppaelf ;;
+ hppa*-*-lites*)		targ_emul=hppaelf ;;
+ hppa*-*-netbsd*)	targ_emul=hppanbsd ;;
+@@ -396,6 +407,7 @@
+ 			targ_emul=vaxnbsd
+ 			targ_extra_emuls=elf32vax ;;
+ vax-*-linux-gnu*)	targ_emul=elf32vax ;;
++vax-*-linux-uclibc*)	targ_emul=elf32vax ;;
+ mips*-*-pe)		targ_emul=mipspe ;
+ 			targ_extra_ofiles="deffilep.o pe-dll.o" ;;
+ mips*-dec-ultrix*)	targ_emul=mipslit ;;
+@@ -429,16 +441,16 @@
+ mips*-*-vxworks*)	targ_emul=elf32ebmip
+ 		        targ_extra_emuls="elf32elmip" ;;
+ mips*-*-windiss)	targ_emul=elf32mipswindiss ;;
+-mips64*el-*-linux-gnu*)	targ_emul=elf32ltsmipn32
++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*)	targ_emul=elf32ltsmipn32
+ 			targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
+ 			;;
+-mips64*-*-linux-gnu*)	targ_emul=elf32btsmipn32
++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*)	targ_emul=elf32btsmipn32
+ 			targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
+ 			;;
+-mips*el-*-linux-gnu*)	targ_emul=elf32ltsmip
++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*)	targ_emul=elf32ltsmip
+ 			targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip"
+ 			;;
+-mips*-*-linux-gnu*)	targ_emul=elf32btsmip
++mips*-*-linux-gnu* | mips*-*-linux-uclibc*)	targ_emul=elf32btsmip
+ 			targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip"
+ 			;;
+ mips*-*-lnews*)		targ_emul=mipslnews ;;
+@@ -461,6 +473,10 @@
+ alpha*-*-linux-gnu*)	targ_emul=elf64alpha targ_extra_emuls=alpha
+ 			tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'`
+ 			;;
++alpha*-*-linux-uclibc*)	targ_emul=elf64alpha targ_extra_emuls=alpha
++			# The following needs to be checked...
++			tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'`
++			;;
+ alpha*-*-osf*)		targ_emul=alpha ;;
+ alpha*-*-gnu*)		targ_emul=elf64alpha ;;
+ alpha*-*-netware*)	targ_emul=alpha ;;
+diff -urN binutils-2.15-dist/libtool.m4 binutils-2.15/libtool.m4
+--- binutils-2.15-dist/libtool.m4	2003-04-10 22:58:39.000000000 -0500
++++ binutils-2.15/libtool.m4	2004-08-04 12:01:45.000000000 -0500
+@@ -645,6 +645,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+diff -urN binutils-2.15-dist/ltconfig binutils-2.15/ltconfig
+--- binutils-2.15-dist/ltconfig	2003-10-03 23:54:47.000000000 -0500
++++ binutils-2.15/ltconfig	2004-08-04 12:01:45.000000000 -0500
+@@ -603,6 +603,7 @@
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
+ linux-gnu*) ;;
++linux-uclibc*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+ 
+@@ -1259,6 +1260,24 @@
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  # Note: copied from linux-gnu, and may not be appropriate.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+diff -urN binutils-2.15-dist/opcodes/configure binutils-2.15/opcodes/configure
+--- binutils-2.15-dist/opcodes/configure	2003-08-05 04:39:31.000000000 -0500
++++ binutils-2.15/opcodes/configure	2004-08-04 12:01:45.000000000 -0500
+@@ -1700,6 +1700,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
diff --git a/patches/binutils/2.15/210-cflags.patch b/patches/binutils/2.15/210-cflags.patch
new file mode 100644
index 00000000..dc67d3c4
--- /dev/null
+++ b/patches/binutils/2.15/210-cflags.patch
@@ -0,0 +1,32 @@
+diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am
+--- binutils-2.14.90.0.6/bfd/doc/Makefile.am	2003-07-23 10:08:09.000000000 -0500
++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am	2004-03-01 16:05:16.000000000 -0600
+@@ -55,10 +55,10 @@
+ MKDOC = chew$(EXEEXT_FOR_BUILD)
+ 
+ $(MKDOC): chew.o
+-	$(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS)
++	$(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS)
+ 
+ chew.o: chew.c
+-	$(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c
++	$(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c
+ 
+ protos: libbfd.h libcoff.h bfd.h
+ 
+diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in
+--- binutils-2.14.90.0.6/bfd/doc/Makefile.in	2003-07-23 10:08:09.000000000 -0500
++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in	2004-03-01 16:05:03.000000000 -0600
+@@ -469,10 +469,10 @@
+ 
+ 
+ $(MKDOC): chew.o
+-	$(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS)
++	$(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS)
+ 
+ chew.o: chew.c
+-	$(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c
++	$(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c
+ 
+ protos: libbfd.h libcoff.h bfd.h
+ 
diff --git a/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch
new file mode 100644
index 00000000..e07a7e8c
--- /dev/null
+++ b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch
@@ -0,0 +1,26 @@
+--- binutils/bfd/elf32-mips.c~
++++ binutils/bfd/elf32-mips.c
+@@ -1611,7 +1611,9 @@
+ 
+ /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
+    page sizes of up to that limit, so we need to respect it.  */
+-#define ELF_MAXPAGESIZE			0x10000
++/*#define ELF_MAXPAGESIZE			0x10000*/
++/* Use 4K to shrink the elf header.  NOT for general use! */
++#define ELF_MAXPAGESIZE			0x1000
+ #define elf32_bed			elf32_tradbed
+ 
+ /* Include the target file again for this target.  */
+--- binutils/bfd/elfn32-mips.c~
++++ binutils/bfd/elfn32-mips.c
+@@ -1976,7 +1976,9 @@
+ 
+ /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
+    page sizes of up to that limit, so we need to respect it.  */
+-#define ELF_MAXPAGESIZE			0x10000
++/*#define ELF_MAXPAGESIZE			0x10000*/
++/* Use 4K to shrink the elf header.  NOT for general use! */
++#define ELF_MAXPAGESIZE			0x1000
+ #define elf32_bed			elf32_tradbed
+ 
+ /* Include the target file again for this target.  */
diff --git a/patches/binutils/2.15/600-arm-textrel.patch b/patches/binutils/2.15/600-arm-textrel.patch
new file mode 100644
index 00000000..73d5b9df
--- /dev/null
+++ b/patches/binutils/2.15/600-arm-textrel.patch
@@ -0,0 +1,63 @@
+http://sources.redhat.com/ml/binutils/2004-06/msg00010.html
+--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h	2004-04-12 14:56:33.000000000 -0500
++++ binutils-2.15.90.0.3/bfd/elf32-arm.h	2004-09-03 06:56:40.000000000 -0500
+@@ -87,6 +87,8 @@
+ #endif
+ static bfd_boolean allocate_dynrelocs 
+   PARAMS ((struct elf_link_hash_entry *h, PTR inf));
++static bfd_boolean elf32_arm_readonly_dynrelocs
++  PARAMS ((struct elf_link_hash_entry *, PTR));
+ static bfd_boolean create_got_section 
+   PARAMS ((bfd * dynobj, struct bfd_link_info * info));
+ static bfd_boolean elf32_arm_create_dynamic_sections 
+@@ -3531,6 +3533,37 @@
+   return TRUE;
+ }
+ 
++/* Find any dynamic relocs that apply to read-only sections.  */
++
++static bfd_boolean
++elf32_arm_readonly_dynrelocs (h, inf)
++     struct elf_link_hash_entry *h;
++     PTR inf;
++{
++  struct elf32_arm_link_hash_entry *eh;
++  struct elf32_arm_relocs_copied *p;
++
++  if (h->root.type == bfd_link_hash_warning)
++    h = (struct elf_link_hash_entry *) h->root.u.i.link;
++
++  eh = (struct elf32_arm_link_hash_entry *) h;
++  for (p = eh->relocs_copied; p != NULL; p = p->next)
++    {
++      asection *s = p->section;
++
++      if (s != NULL && (s->flags & SEC_READONLY) != 0)
++       {
++         struct bfd_link_info *info = (struct bfd_link_info *) inf;
++
++         info->flags |= DF_TEXTREL;
++
++         /* Not an error, just cut short the traversal.  */
++         return FALSE;
++       }
++    }
++  return TRUE;
++}
++
+ /* Set the sizes of the dynamic sections.  */
+ 
+ static bfd_boolean
+@@ -3740,6 +3773,12 @@
+ 	    return FALSE;
+ 	}
+ 
++      /* If any dynamic relocs apply to a read-only section,
++         then we need a DT_TEXTREL entry.  */
++      if ((info->flags & DF_TEXTREL) == 0)
++        elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs,
++                                (PTR) info);
++
+       if ((info->flags & DF_TEXTREL) != 0)
+ 	{
+ 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
diff --git a/patches/binutils/2.15/bfd-hash-tweak.patch b/patches/binutils/2.15/bfd-hash-tweak.patch
new file mode 100644
index 00000000..6b8fc412
--- /dev/null
+++ b/patches/binutils/2.15/bfd-hash-tweak.patch
@@ -0,0 +1,24 @@
+Signed-off-by: dank@kegel.com
+
+Raising the size of the hash table is a noticable win when linking 
+at least one large app.  
+
+There was a patch,
+http://sources.redhat.com/ml/binutils/2004-06/msg00165.html
+to do this dynamically.  No idea why that didn't make it in.
+So this tiny change to raise the default size is just
+a stopgap for now.
+
+
+--- binutils-2.15/bfd/hash.c.old	2003-12-01 01:33:01.000000000 -0500
++++ binutils-2.15/bfd/hash.c	2006-03-01 16:26:26.701991000 -0500
+@@ -295,7 +295,7 @@
+ */
+ 
+ /* The default number of entries to use when creating a hash table.  */
+-#define DEFAULT_SIZE (4051)
++#define DEFAULT_SIZE (32749)
+ 
+ /* Create a new hash table, given a number of entries.  */
+ 
+
diff --git a/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch
new file mode 100644
index 00000000..26e5a121
--- /dev/null
+++ b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch
@@ -0,0 +1,75 @@
+Fix found here: http://www.freelists.org/archives/openbeos/11-2005/msg00090.html
+
+Fixes:
+In file included from ./targ-cpu.h:1,
+                 from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/obj-elf.h:42,
+                 from ./obj-format.h:1,
+                 from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/te-linux.h:4,
+                 from ./targ-env.h:1,
+                 from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/as.h:626,
+                 from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/app.c:30:
+/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/tc-i386.h:451: error: array type has incomplete element type
+make[3]: *** [app.o] Error 1
+make[3]: Leaving directory `/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-binutils/gas'
+
+when building binutils-2.15 with gcc-4.0
+
+
+diff -ur binutils-2.15.old/gas/as.h binutils-2.15/gas/as.h
+--- binutils-2.15.old/gas/as.h	2003-11-22 18:14:21.000000000 -0800
++++ binutils-2.15/gas/as.h	2006-02-14 22:05:35.000000000 -0800
+@@ -605,7 +605,26 @@
+ struct expressionS;
+ struct fix;
+ typedef struct symbol symbolS;
+-struct relax_type;
++
++/* JF moved this here from as.h under the theory that nobody except MACHINE.c
++   and write.c care about it anyway.  */
++/* [zooey]: the above no longer holds with gcc4, as it keeps bugging about
++            incomplete element types in arrays, if relax_type isn't defined
++            here. So I moved the definition back from tc.h to here. */
++struct relax_type
++{
++  /* Forward reach. Signed number. > 0.  */
++  long rlx_forward;
++  /* Backward reach. Signed number. < 0.  */
++  long rlx_backward;
++
++  /* Bytes length of this address.  */
++  unsigned char rlx_length;
++
++  /* Next longer relax-state.  0 means there is no 'next' relax-state.  */
++  relax_substateT rlx_more;
++};
++
+ typedef struct frag fragS;
+ 
+ #ifdef BFD_ASSEMBLER
+diff -ur binutils-2.15.old/gas/tc.h binutils-2.15/gas/tc.h
+--- binutils-2.15.old/gas/tc.h	2003-12-03 15:39:38.000000000 -0800
++++ binutils-2.15/gas/tc.h	2006-02-14 22:03:35.000000000 -0800
+@@ -24,23 +24,6 @@
+ 
+ extern const pseudo_typeS md_pseudo_table[];
+ 
+-/* JF moved this here from as.h under the theory that nobody except MACHINE.c
+-   and write.c care about it anyway.  */
+-
+-struct relax_type
+-{
+-  /* Forward reach. Signed number. > 0.  */
+-  long rlx_forward;
+-  /* Backward reach. Signed number. < 0.  */
+-  long rlx_backward;
+-
+-  /* Bytes length of this address.  */
+-  unsigned char rlx_length;
+-
+-  /* Next longer relax-state.  0 means there is no 'next' relax-state.  */
+-  relax_substateT rlx_more;
+-};
+-
+ typedef struct relax_type relax_typeS;
+ 
+ extern const int md_reloc_size;	/* Size of a relocation record */
diff --git a/patches/binutils/2.15/binutils-2.15-psignal.patch b/patches/binutils/2.15/binutils-2.15-psignal.patch
new file mode 100644
index 00000000..98fa600e
--- /dev/null
+++ b/patches/binutils/2.15/binutils-2.15-psignal.patch
@@ -0,0 +1,40 @@
+Make psignal prototype in libiberty match that in glibc.
+
+Fixes:
+
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal':
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype
+/usr/include/signal.h:131: prototype declaration
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype
+/usr/include/signal.h:131: prototype declaration
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned
+mprotect... make[1]: *** [strsignal.o] Error 1
+make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty'
+make: *** [all-libiberty] Error 2
+
+when building on red hat 7.1
+though it's a bit of a mystery why libiberty's psignal is being compiled at
+all, since red hat 7.1's glibc supports psignal (hence the error message)
+
+--- binutils-2.15/libiberty/strsignal.c.old	2005-04-18 13:57:40.000000000 -0700
++++ binutils-2.15/libiberty/strsignal.c	2005-04-18 13:59:09.000000000 -0700
+@@ -544,7 +544,7 @@
+ 
+ /*
+ 
+-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message})
++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message})
+ 
+ Print @var{message} to the standard error, followed by a colon,
+ followed by the description of the signal specified by @var{signo},
+@@ -557,9 +557,7 @@
+ #ifndef HAVE_PSIGNAL
+ 
+ void
+-psignal (signo, message)
+-  unsigned signo;
+-  char *message;
++psignal (int signo, const char *message)
+ {
+   if (signal_names == NULL)
+     {
diff --git a/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch
new file mode 100644
index 00000000..5fe36231
--- /dev/null
+++ b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch
@@ -0,0 +1,22 @@
+See http://sources.redhat.com/ml/binutils/2004-06/msg00114.html
+
+--- src/bfd/elflink.c.org	2004-07-05 09:11:42.920597000 -0400
++++ src/bfd/elflink.c	2004-07-05 09:12:59.240847000 -0400
+@@ -2700,7 +2700,7 @@
+     return vdiff > 0 ? 1 : -1;
+   else
+     {
+-      long sdiff = h1->root.u.def.section - h2->root.u.def.section;
++      long sdiff = h1->root.u.def.section->id - h2->root.u.def.section->id;
+       if (sdiff != 0)
+ 	return sdiff > 0 ? 1 : -1;
+     }
+@@ -3954,7 +3954,7 @@
+ 		i = idx + 1;
+ 	      else
+ 		{
+-		  long sdiff = slook - h->root.u.def.section;
++		  long sdiff = slook->id - h->root.u.def.section->id;
+ 		  if (sdiff < 0)
+ 		    j = idx;
+ 		  else if (sdiff > 0)
diff --git a/patches/binutils/2.15/binutils-2.15-vmx.patch b/patches/binutils/2.15/binutils-2.15-vmx.patch
new file mode 100644
index 00000000..5ae9efeb
--- /dev/null
+++ b/patches/binutils/2.15/binutils-2.15-vmx.patch
@@ -0,0 +1,45 @@
+Grabbed with
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/opcodes/ppc-opc.c.diff?r1=1.70&r2=1.71&cvsroot=src'
+See 
+http://mail.gnu.org/archive/html/bug-binutils/2004-05/msg00071.html
+and
+http://sources.redhat.com/ml/binutils-cvs/2004-05/msg00111.html
+
+This fixes problems like
+{standard input}: Assembler messages:
+{standard input}:1: Error: Unrecognized opcode: `dssall' 
+which show up in binutils-2.15 when building the Linux kernel,
+or possibly failed compilations when building setjmp/longjmp in glibc.
+
+An alternative fix would be to pass -many to the assembler.
+A patch to do that for glibc is at
+wget 'http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2004-05&msgid=40B36E8C.9030609%40us.ibm.com'
+Yet another, better, fix would be for gcc to generate assembly
+that told the assembler which processor type to use.
+Presumably the Linux kernel sources would need a fix, too.
+Probably better to just fix binutils to accept sources that it used to.
+
+
+===================================================================
+RCS file: /cvs/src/src/opcodes/ppc-opc.c,v
+retrieving revision 1.70
+retrieving revision 1.71
+diff -u -r1.70 -r1.71
+--- src/opcodes/ppc-opc.c	2004/05/05 13:43:36	1.70
++++ src/opcodes/ppc-opc.c	2004/05/19 05:11:48	1.71
+@@ -1004,8 +1004,13 @@
+ 
+   /* If only one bit of the FXM field is set, we can use the new form
+      of the instruction, which is faster.  Unlike the Power4 branch hint
+-     encoding, this is not backward compatible.  */
+-  else if ((dialect & PPC_OPCODE_POWER4) != 0 && (value & -value) == value)
++     encoding, this is not backward compatible.  Do not generate the
++     new form unless -mpower4 has been given, or -many and the two
++     operand form of mfcr was used.  */
++  else if ((value & -value) == value
++	   && ((dialect & PPC_OPCODE_POWER4) != 0
++	       || ((dialect & PPC_OPCODE_ANY) != 0
++		   && (insn & (0x3ff << 1)) == 19 << 1)))
+     insn |= 1 << 20;
+ 
+   /* Any other value on mfcr is an error.  */
diff --git a/patches/binutils/2.15/binutils-arm-undef-imm.patch b/patches/binutils/2.15/binutils-arm-undef-imm.patch
new file mode 100644
index 00000000..6bf403ca
--- /dev/null
+++ b/patches/binutils/2.15/binutils-arm-undef-imm.patch
@@ -0,0 +1,51 @@
+From http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/gas/config/tc-arm.c.diff?r1=1.168&r2=1.169&cvsroot=src
+See also http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-July/023128.html,
+"[CRITICAL PATCH] 2.6: fix silent build error]"
+
+Revision 1.169, Fri Jul 2 11:12:29 2004 UTC (19 hours, 4 minutes ago) by nickc
+Branch: MAIN
+CVS Tags: binutils_latest_snapshot, HEAD
+Changes since 1.168: +14 -1 lines
+
+(md_apply_fix3:BFD_RELOC_ARM_IMMEDIATE): Do not allow values which have come
+from undefined symbols.
+Always consider this fixup to have been processed as a reloc cannot be
+generated for it.
+
+
+===================================================================
+RCS file: /cvs/src/src/gas/config/tc-arm.c,v
+retrieving revision 1.168
+retrieving revision 1.169
+diff -u -r1.168 -r1.169
+--- src/gas/config/tc-arm.c	2004/04/30 10:51:12	1.168
++++ src/gas/config/tc-arm.c	2004/07/02 11:12:29	1.169
+@@ -12186,6 +12186,20 @@
+   switch (fixP->fx_r_type)
+     {
+     case BFD_RELOC_ARM_IMMEDIATE:
++      /* We claim that this fixup has been processed here,
++	 even if in fact we generate an error because we do
++	 not have a reloc for it, so tc_gen_reloc will reject it.  */
++      fixP->fx_done = 1;
++
++      if (fixP->fx_addsy
++	  && ! S_IS_DEFINED (fixP->fx_addsy))
++	{
++	  as_bad_where (fixP->fx_file, fixP->fx_line,
++			_("undefined symbol %s used as an immediate value"),
++			S_GET_NAME (fixP->fx_addsy));
++	  break;
++	}
++
+       newimm = validate_immediate (value);
+       temp = md_chars_to_number (buf, INSN_SIZE);
+ 
+@@ -12202,7 +12216,6 @@
+ 
+       newimm |= (temp & 0xfffff000);
+       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
+-      fixP->fx_done = 1;
+       break;
+ 
+     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
diff --git a/patches/binutils/2.15/binutils-skip-comments.patch b/patches/binutils/2.15/binutils-skip-comments.patch
new file mode 100644
index 00000000..804a17e0
--- /dev/null
+++ b/patches/binutils/2.15/binutils-skip-comments.patch
@@ -0,0 +1,101 @@
+Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html
+Fixes
+localealias.s:544: Error: junk at end of line, first unrecognized character is `,' 
+when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3
+
+Paths adjusted to match crosstool's patcher.
+
+Message-Id: m3n052qw2g.fsf@whitebox.m5r.de
+From: Andreas Schwab <schwab at suse dot de>
+To: Nathan Sidwell <nathan at codesourcery dot com>
+Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com
+Date: Fri, 23 Apr 2004 22:27:19 +0200
+Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line
+
+Nathan Sidwell <nathan@codesourcery.com> writes:
+
+> Index: read.c
+> ===================================================================
+> RCS file: /cvs/src/src/gas/read.c,v
+> retrieving revision 1.76
+> diff -c -3 -p -r1.76 read.c
+> *** read.c	12 Mar 2004 17:48:12 -0000	1.76
+> --- read.c	18 Mar 2004 09:56:05 -0000
+> *************** read_a_source_file (char *name)
+> *** 1053,1059 ****
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  ignore_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+> --- 1053,1059 ----
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  demand_empty_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+
+This means that the unknown character is no longer ignored, despite the
+comment.  As a side effect a line starting with a line comment character
+not followed by APP in NO_APP mode now triggers an error instead of just a
+warning, breaking builds of glibc on m68k-linux.  Earlier in
+read_a_source_file where #APP is handled there is another comment that
+claims that unknown comments are ignored, when in fact they aren't (only
+the initial line comment character is skipped).
+
+Note that the presence of #APP will mess up the line counters, but
+that appears to be difficult to fix.
+
+Andreas.
+
+2004-04-23  Andreas Schwab  <schwab@suse.de>
+
+	* read.c (read_a_source_file): Ignore unknown text after line
+	comment character.  Fix misleading comment.
+
+--- binutils/gas/read.c.~1.78.~	2004-04-23 08:58:23.000000000 +0200
++++ binutils/gas/read.c	2004-04-23 21:49:01.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* read.c - read a source file -
+    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+-   1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 
+ This file is part of GAS, the GNU Assembler.
+ 
+@@ -950,10 +950,14 @@ read_a_source_file (char *name)
+ 	      unsigned int new_length;
+ 	      char *tmp_buf = 0;
+ 
+-	      bump_line_counters ();
+ 	      s = input_line_pointer;
+ 	      if (strncmp (s, "APP\n", 4))
+-		continue;	/* We ignore it */
++		{
++		  /* We ignore it */
++		  ignore_rest_of_line ();
++		  continue;
++		}
++	      bump_line_counters ();
+ 	      s += 4;
+ 
+ 	      sb_new (&sbuf);
+@@ -1052,7 +1056,7 @@ read_a_source_file (char *name)
+ 	    continue;
+ #endif
+ 	  input_line_pointer--;
+-	  /* Report unknown char as ignored.  */
++	  /* Report unknown char as error.  */
+ 	  demand_empty_rest_of_line ();
+ 	}
+ 
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstra&#xC3;e 5, 90409 N&#xC3;rnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
diff --git a/patches/binutils/2.15/cross-gprof.patch b/patches/binutils/2.15/cross-gprof.patch
new file mode 100644
index 00000000..ea6c18fd
--- /dev/null
+++ b/patches/binutils/2.15/cross-gprof.patch
@@ -0,0 +1,22 @@
+--- binutils-2.15/configure.old	2004-07-21 21:36:47.000000000 -0700
++++ binutils-2.15/configure	2004-07-21 21:37:08.000000000 -0700
+@@ -999,7 +999,7 @@
+ 
+ # Some tools are only suitable for building in a "native" situation.
+ # Remove these if host!=target.  
+-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
+ 
+ # Similarly, some are only suitable for cross toolchains.
+ # Remove these if host=target.
+--- binutils-2.15/configure.in.old	2004-07-21 21:37:19.000000000 -0700
++++ binutils-2.15/configure.in	2004-07-21 21:37:34.000000000 -0700
+@@ -236,7 +236,7 @@
+ 
+ # Some tools are only suitable for building in a "native" situation.
+ # Remove these if host!=target.  
+-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
+ 
+ # Similarly, some are only suitable for cross toolchains.
+ # Remove these if host=target.
diff --git a/patches/binutils/2.15/gccpr15247-fix.patch b/patches/binutils/2.15/gccpr15247-fix.patch
new file mode 100644
index 00000000..967bf7f9
--- /dev/null
+++ b/patches/binutils/2.15/gccpr15247-fix.patch
@@ -0,0 +1,192 @@
+See
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247
+
+Fixes spurious error
+/tmp/ccvNi4ou.s: Assembler messages:
+/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31]
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1
+
+when compiling glibc's dosincos.c with gcc-3.4.0
+
+===================================================================
+RCS file: /cvs/src/src/opcodes/sparc-opc.c,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- src/opcodes/sparc-opc.c	2004/01/18 23:46:32	1.9
++++ src/opcodes/sparc-opc.c	2004/04/20 10:23:51	1.10
+@@ -1273,110 +1273,72 @@
+ #define FM_DF 2		/* v9 */
+ #define FM_QF 3		/* v9 */
+ 
+-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags, v9 }
+-
+-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 }
++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags, v9 }
++
++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 }
+ 
+ /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
+-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \
+-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \
+-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 }
+-
+-/* v9 */ fmovcc  ("fmovda",	FM_DF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovqa",	FM_QF, CONDA, FCONDA, 0),
+-/* v9 */ fmovcc  ("fmovsa",	FM_SF, CONDA, FCONDA, 0),
+-/* v9 */ fmovicc ("fmovdcc",	FM_DF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovqcc",	FM_QF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovscc",	FM_SF, CONDCC, 0),
+-/* v9 */ fmovicc ("fmovdcs",	FM_DF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovqcs",	FM_QF, CONDCS, 0),
+-/* v9 */ fmovicc ("fmovscs",	FM_SF, CONDCS, 0),
+-/* v9 */ fmovcc  ("fmovde",	FM_DF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovqe",	FM_QF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovse",	FM_SF, CONDE, FCONDE, 0),
+-/* v9 */ fmovcc  ("fmovdg",	FM_DF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovqg",	FM_QF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovsg",	FM_SF, CONDG, FCONDG, 0),
+-/* v9 */ fmovcc  ("fmovdge",	FM_DF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovqge",	FM_QF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovcc  ("fmovsge",	FM_SF, CONDGE, FCONDGE, 0),
+-/* v9 */ fmovicc ("fmovdgeu",	FM_DF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqgeu",	FM_QF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovsgeu",	FM_SF, CONDGEU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovdgu",	FM_DF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovqgu",	FM_QF, CONDGU, 0),
+-/* v9 */ fmovicc ("fmovsgu",	FM_SF, CONDGU, 0),
+-/* v9 */ fmovcc  ("fmovdl",	FM_DF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovql",	FM_QF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovsl",	FM_SF, CONDL, FCONDL, 0),
+-/* v9 */ fmovcc  ("fmovdle",	FM_DF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovqle",	FM_QF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovcc  ("fmovsle",	FM_SF, CONDLE, FCONDLE, 0),
+-/* v9 */ fmovicc ("fmovdleu",	FM_DF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovqleu",	FM_QF, CONDLEU, 0),
+-/* v9 */ fmovicc ("fmovsleu",	FM_SF, CONDLEU, 0),
+-/* v9 */ fmovfcc ("fmovdlg",	FM_DF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovqlg",	FM_QF, FCONDLG, 0),
+-/* v9 */ fmovfcc ("fmovslg",	FM_SF, FCONDLG, 0),
+-/* v9 */ fmovicc ("fmovdlu",	FM_DF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovqlu",	FM_QF, CONDLU, F_ALIAS),
+-/* v9 */ fmovicc ("fmovslu",	FM_SF, CONDLU, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovdn",	FM_DF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovqn",	FM_QF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovsn",	FM_SF, CONDN, FCONDN, 0),
+-/* v9 */ fmovcc  ("fmovdne",	FM_DF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovqne",	FM_QF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovcc  ("fmovsne",	FM_SF, CONDNE, FCONDNE, 0),
+-/* v9 */ fmovicc ("fmovdneg",	FM_DF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovqneg",	FM_QF, CONDNEG, 0),
+-/* v9 */ fmovicc ("fmovsneg",	FM_SF, CONDNEG, 0),
+-/* v9 */ fmovcc  ("fmovdnz",	FM_DF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqnz",	FM_QF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsnz",	FM_SF, CONDNZ, FCONDNZ, F_ALIAS),
+-/* v9 */ fmovfcc ("fmovdo",	FM_DF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovqo",	FM_QF, FCONDO, 0),
+-/* v9 */ fmovfcc ("fmovso",	FM_SF, FCONDO, 0),
+-/* v9 */ fmovicc ("fmovdpos",	FM_DF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovqpos",	FM_QF, CONDPOS, 0),
+-/* v9 */ fmovicc ("fmovspos",	FM_SF, CONDPOS, 0),
+-/* v9 */ fmovfcc ("fmovdu",	FM_DF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovqu",	FM_QF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovsu",	FM_SF, FCONDU, 0),
+-/* v9 */ fmovfcc ("fmovdue",	FM_DF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovque",	FM_QF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovsue",	FM_SF, FCONDUE, 0),
+-/* v9 */ fmovfcc ("fmovdug",	FM_DF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovqug",	FM_QF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovsug",	FM_SF, FCONDUG, 0),
+-/* v9 */ fmovfcc ("fmovduge",	FM_DF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovquge",	FM_QF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovsuge",	FM_SF, FCONDUGE, 0),
+-/* v9 */ fmovfcc ("fmovdul",	FM_DF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovqul",	FM_QF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovsul",	FM_SF, FCONDUL, 0),
+-/* v9 */ fmovfcc ("fmovdule",	FM_DF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovqule",	FM_QF, FCONDULE, 0),
+-/* v9 */ fmovfcc ("fmovsule",	FM_SF, FCONDULE, 0),
+-/* v9 */ fmovicc ("fmovdvc",	FM_DF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovqvc",	FM_QF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovsvc",	FM_SF, CONDVC, 0),
+-/* v9 */ fmovicc ("fmovdvs",	FM_DF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovqvs",	FM_QF, CONDVS, 0),
+-/* v9 */ fmovicc ("fmovsvs",	FM_SF, CONDVS, 0),
+-/* v9 */ fmovcc  ("fmovdz",	FM_DF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovqz",	FM_QF, CONDZ, FCONDZ, F_ALIAS),
+-/* v9 */ fmovcc  ("fmovsz",	FM_SF, CONDZ, FCONDZ, F_ALIAS),
+-
++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \
++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \
++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 }
++
++#define fmovicc(suffix, cond, flags) /* v9 */ \
++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags),		\
++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags),		\
++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags)
++
++#define fmovfcc(suffix, fcond, flags) /* v9 */ \
++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags),		\
++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags),		\
++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags)
++
++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \
++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags),	\
++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags),	\
++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags)
++
++/* v9 */ fmovcc  ("a", CONDA, FCONDA, 0),
++/* v9 */ fmovicc ("cc", CONDCC, 0),
++/* v9 */ fmovicc ("cs", CONDCS, 0),
++/* v9 */ fmovcc  ("e", CONDE, FCONDE, 0),
++/* v9 */ fmovcc  ("g", CONDG, FCONDG, 0),
++/* v9 */ fmovcc  ("ge", CONDGE, FCONDGE, 0),
++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS),
++/* v9 */ fmovicc ("gu", CONDGU, 0),
++/* v9 */ fmovcc  ("l", CONDL, FCONDL, 0),
++/* v9 */ fmovcc  ("le", CONDLE, FCONDLE, 0),
++/* v9 */ fmovicc ("leu", CONDLEU, 0),
++/* v9 */ fmovfcc ("lg", FCONDLG, 0),
++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS),
++/* v9 */ fmovcc  ("n", CONDN, FCONDN, 0),
++/* v9 */ fmovcc  ("ne", CONDNE, FCONDNE, 0),
++/* v9 */ fmovicc ("neg", CONDNEG, 0),
++/* v9 */ fmovcc  ("nz", CONDNZ, FCONDNZ, F_ALIAS),
++/* v9 */ fmovfcc ("o", FCONDO, 0),
++/* v9 */ fmovicc ("pos", CONDPOS, 0),
++/* v9 */ fmovfcc ("u", FCONDU, 0),
++/* v9 */ fmovfcc ("ue", FCONDUE, 0),
++/* v9 */ fmovfcc ("ug", FCONDUG, 0),
++/* v9 */ fmovfcc ("uge", FCONDUGE, 0),
++/* v9 */ fmovfcc ("ul", FCONDUL, 0),
++/* v9 */ fmovfcc ("ule", FCONDULE, 0),
++/* v9 */ fmovicc ("vc", CONDVC, 0),
++/* v9 */ fmovicc ("vs", CONDVS, 0),
++/* v9 */ fmovcc  ("z", CONDZ, FCONDZ, F_ALIAS),
++
++#undef fmoviccx /* v9 */
++#undef fmovfccx /* v9 */
++#undef fmovccx /* v9 */
+ #undef fmovicc /* v9 */
+ #undef fmovfcc /* v9 */
+ #undef fmovcc /* v9 */
diff --git a/patches/binutils/2.15/ld-2.15-callahan.patch b/patches/binutils/2.15/ld-2.15-callahan.patch
new file mode 100644
index 00000000..bb4a69c8
--- /dev/null
+++ b/patches/binutils/2.15/ld-2.15-callahan.patch
@@ -0,0 +1,677 @@
+Signed-off-by: dank@kegel.com
+Fixes ld speed issue. 
+See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html
+See thread "Re: optimizations for 3x speedup in ld",
+http://sources.redhat.com/ml/binutils/2005-03/msg00847.html
+
+Wildcard section matching enhancement, backported from the binutils CVS tree.
+Here's the CVS log comment from the original change to ldlang.c:
+
+revision 1.177
+date: 2005/04/06 15:33:02;  author: jakub;  state: Exp;  lines: +438 -51
+2005-04-06  Jakub Jelinek  <jakub@redhat.com>
+
+        * ldlang.c: Formatting.
+        (walk_wild_consider_section): Remember return value from wildcardp.
+        (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
+        (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
+
+2005-04-06  Robert O'Callahan  <rocallahan@novell.com>
+
+        * ld.h (lean_section_userdata_type): Remove.
+        (fat_section_userdata_type): Remove file field.
+        (SECTION_USERDATA_SIZE): Remove.
+        * ldlang.c (init_os): Eliminate initialization of unused
+        lean_section_userdata_type.
+
+        * ldlang.h (callback_t, walk_wild_section_handler_t): New
+        typedefs.
+        (struct lang_wild_statement_struct): Add walk_wild_section_handler
+        and handler_data fields.
+        * ldlang.c (callback_t): Removed.
+        (walk_wild_consider_section, walk_wild_section_general,
+        section_iterator_callback, find_section, is_simple_wild,
+        match_simple_wild, walk_wild_section_specs1_wild0,
+        walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
+        walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
+        wild_spec_can_overlap, analyze_walk_wild_section_handler): New
+        functions.
+        (lang_add_wild): Call analyze_walk_wild_section_handler.
+        (walk_wild_section): Renamed to walk_wild_section_general and
+        created a wrapper function.
+        (section_iterator_callback_data): New typedef.
+
+Note that bfd_get_section_by_name_if didn't exist in 2.15, so it was backported
+as well.
+
+--- binutils-2.15/bfd/bfd-in2.h.old	2004-05-17 15:35:56.000000000 -0400
++++ binutils-2.15/bfd/bfd-in2.h	2006-02-09 11:54:45.989940000 -0500
+@@ -1425,6 +1425,10 @@
+ 
+ asection *bfd_get_section_by_name (bfd *abfd, const char *name);
+ 
++asection *bfd_get_section_by_name_if (bfd *abfd, const char *name,
++   bfd_boolean (*operation) (bfd *, asection *, void *),
++   void *user_storage);
++
+ char *bfd_get_unique_section_name
+    (bfd *abfd, const char *templat, int *count);
+ 
+--- binutils-2.15/bfd/section.c.old	2003-12-01 01:33:01.000000000 -0500
++++ binutils-2.15/bfd/section.c	2006-01-23 14:16:54.768993000 -0500
+@@ -801,6 +801,57 @@
+ 
+ /*
+ FUNCTION
++	bfd_get_section_by_name_if
++
++SYNOPSIS
++	asection *bfd_get_section_by_name_if
++	  (bfd *abfd,
++	   const char *name,
++	   bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj),
++	   void *obj);
++
++DESCRIPTION
++	Call the provided function @var{func} for each section
++	attached to the BFD @var{abfd} whose name matches @var{name},
++	passing @var{obj} as an argument. The function will be called
++	as if by
++
++|	func (abfd, the_section, obj);
++
++	It returns the first section for which @var{func} returns true,
++	otherwise <<NULL>>.
++
++*/
++
++asection *
++bfd_get_section_by_name_if (bfd *abfd, const char *name,
++			    bfd_boolean (*operation) (bfd *,
++						      asection *,
++						      void *),
++			    void *user_storage)
++{
++  struct section_hash_entry *sh;
++  unsigned long hash;
++
++  sh = section_hash_lookup (&abfd->section_htab, name, FALSE, FALSE);
++  if (sh == NULL)
++    return NULL;
++
++  hash = sh->root.hash;
++  do
++    {
++      if ((*operation) (abfd, &sh->section, user_storage))
++	return &sh->section;
++      sh = (struct section_hash_entry *) sh->root.next;
++    }
++  while (sh != NULL && sh->root.hash == hash
++	 && strcmp (sh->root.string, name) == 0);
++
++  return NULL;
++}
++
++/*
++FUNCTION
+ 	bfd_get_unique_section_name
+ 
+ SYNOPSIS
+--- binutils-2.15/ld/ldlang.c.old	2004-05-17 15:36:16.000000000 -0400
++++ binutils-2.15/ld/ldlang.c	2006-01-23 13:40:12.745499000 -0500
+@@ -81,9 +81,6 @@
+ static void lang_record_phdrs (void);
+ static void lang_do_version_exports_section (void);
+ 
+-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
+-			    asection *, lang_input_statement_type *, void *);
+-
+ /* Exported variables.  */
+ lang_output_section_statement_type *abs_output_section;
+ lang_statement_list_type lang_output_section_statement;
+@@ -138,21 +135,71 @@
+ 
+ /* Generic traversal routines for finding matching sections.  */
+ 
++/* Try processing a section against a wildcard.  This just calls
++   the callback unless the filename exclusion list is present
++   and excludes the file.  It's hardly ever present so this
++   function is very fast.  */
++
++static void
++walk_wild_consider_section (lang_wild_statement_type *ptr,
++			    lang_input_statement_type *file,
++			    asection *s,
++			    struct wildcard_list *sec,
++			    callback_t callback,
++			    void *data)
++{
++  bfd_boolean skip = FALSE;
++  struct name_list *list_tmp;
++
++  /* Don't process sections from files which were
++     excluded.  */
++  for (list_tmp = sec->spec.exclude_name_list;
++       list_tmp;
++       list_tmp = list_tmp->next)
++    {
++      bfd_boolean is_wildcard = wildcardp (list_tmp->name);
++      if (is_wildcard)
++	skip = fnmatch (list_tmp->name, file->filename, 0) == 0;
++      else
++	skip = strcmp (list_tmp->name, file->filename) == 0;
++
++      /* If this file is part of an archive, and the archive is
++	 excluded, exclude this file.  */
++      if (! skip && file->the_bfd != NULL
++	  && file->the_bfd->my_archive != NULL
++	  && file->the_bfd->my_archive->filename != NULL)
++	{
++	  if (is_wildcard)
++	    skip = fnmatch (list_tmp->name,
++			    file->the_bfd->my_archive->filename,
++			    0) == 0;
++	  else
++	    skip = strcmp (list_tmp->name,
++			   file->the_bfd->my_archive->filename) == 0;
++	}
++
++      if (skip)
++	break;
++    }
++
++  if (!skip)
++    (*callback) (ptr, sec, s, file, data);
++}
++
++/* Lowest common denominator routine that can handle everything correctly,
++   but slowly.  */
++
+ static void
+-walk_wild_section (lang_wild_statement_type *ptr,
+-		   lang_input_statement_type *file,
+-		   callback_t callback,
+-		   void *data)
++walk_wild_section_general (lang_wild_statement_type *ptr,
++			   lang_input_statement_type *file,
++			   callback_t callback,
++			   void *data)
+ {
+   asection *s;
+-
+-  if (file->just_syms_flag)
+-    return;
++  struct wildcard_list *sec;
+ 
+   for (s = file->the_bfd->sections; s != NULL; s = s->next)
+     {
+-      struct wildcard_list *sec;
+-
+       sec = ptr->section_list;
+       if (sec == NULL)
+ 	(*callback) (ptr, sec, s, file, data);
+@@ -160,39 +207,8 @@
+       while (sec != NULL)
+ 	{
+ 	  bfd_boolean skip = FALSE;
+-	  struct name_list *list_tmp;
+-
+-	  /* Don't process sections from files which were
+-	     excluded.  */
+-	  for (list_tmp = sec->spec.exclude_name_list;
+-	       list_tmp;
+-	       list_tmp = list_tmp->next)
+-	    {
+-	      if (wildcardp (list_tmp->name))
+-		skip = fnmatch (list_tmp->name, file->filename, 0) == 0;
+-	      else
+-		skip = strcmp (list_tmp->name, file->filename) == 0;
+-
+-	      /* If this file is part of an archive, and the archive is
+-		 excluded, exclude this file.  */
+-	      if (! skip && file->the_bfd != NULL
+-		  && file->the_bfd->my_archive != NULL
+-		  && file->the_bfd->my_archive->filename != NULL)
+-		{
+-		  if (wildcardp (list_tmp->name))
+-		    skip = fnmatch (list_tmp->name,
+-				    file->the_bfd->my_archive->filename,
+-				    0) == 0;
+-		  else
+-		    skip = strcmp (list_tmp->name,
+-				   file->the_bfd->my_archive->filename) == 0;
+-		}
+-
+-	      if (skip)
+-		break;
+-	    }
+ 
+-	  if (!skip && sec->spec.name != NULL)
++	  if (sec->spec.name != NULL)
+ 	    {
+ 	      const char *sname = bfd_get_section_name (file->the_bfd, s);
+ 
+@@ -203,13 +219,381 @@
+ 	    }
+ 
+ 	  if (!skip)
+-	    (*callback) (ptr, sec, s, file, data);
++	    walk_wild_consider_section (ptr, file, s, sec, callback, data);
+ 
+ 	  sec = sec->next;
+ 	}
+     }
+ }
+ 
++/* Routines to find a single section given its name.  If there's more
++   than one section with that name, we report that.  */
++
++typedef struct
++{
++  asection *found_section;
++  bfd_boolean multiple_sections_found;
++} section_iterator_callback_data;
++
++static bfd_boolean
++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data)
++{
++  section_iterator_callback_data *d = data;
++
++  if (d->found_section != NULL)
++    {
++      d->multiple_sections_found = TRUE;
++      return TRUE;
++    }
++
++  d->found_section = s;
++  return FALSE;
++}
++
++static asection *
++find_section (lang_input_statement_type *file,
++	      struct wildcard_list *sec,
++	      bfd_boolean *multiple_sections_found)
++{
++  section_iterator_callback_data cb_data = { NULL, FALSE };
++
++  bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, 
++			      section_iterator_callback, &cb_data);
++  *multiple_sections_found = cb_data.multiple_sections_found;
++  return cb_data.found_section;
++}
++
++/* Code for handling simple wildcards without going through fnmatch,
++   which can be expensive because of charset translations etc.  */
++
++/* A simple wild is a literal string followed by a single '*',
++   where the literal part is at least 4 characters long.  */
++
++static bfd_boolean
++is_simple_wild (const char *name)
++{
++  size_t len = strcspn (name, "*?[");
++  return len >= 4 && name[len] == '*' && name[len + 1] == '\0';
++}
++
++static bfd_boolean
++match_simple_wild (const char *pattern, const char *name)
++{
++  /* The first four characters of the pattern are guaranteed valid
++     non-wildcard characters.  So we can go faster.  */
++  if (pattern[0] != name[0] || pattern[1] != name[1]
++      || pattern[2] != name[2] || pattern[3] != name[3])
++    return FALSE;
++
++  pattern += 4;
++  name += 4;
++  while (*pattern != '*')
++    if (*name++ != *pattern++)
++      return FALSE;
++
++  return TRUE;
++}
++
++/* Specialized, optimized routines for handling different kinds of
++   wildcards */
++
++static void
++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  /* We can just do a hash lookup for the section with the right name.
++     But if that lookup discovers more than one section with the name
++     (should be rare), we fall back to the general algorithm because
++     we would otherwise have to sort the sections to make sure they
++     get processed in the bfd's order.  */
++  bfd_boolean multiple_sections_found;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    walk_wild_section_general (ptr, file, callback, data);
++  else if (s0)
++    walk_wild_consider_section (ptr, file, s0, sec0, callback, data);
++}
++
++static void
++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *wildsec0 = ptr->handler_data[0];
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      const char *sname = bfd_get_section_name (file->the_bfd, s);
++      bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname);
++
++      if (!skip)
++	walk_wild_consider_section (ptr, file, s, wildsec0, callback, data);
++    }
++}
++
++static void
++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *wildsec1 = ptr->handler_data[1];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  /* Note that if the section was not found, s0 is NULL and
++     we'll simply never succeed the s == s0 test below.  */
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      /* Recall that in this code path, a section cannot satisfy more
++	 than one spec, so if s == s0 then it cannot match
++	 wildspec1.  */
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	{
++	  const char *sname = bfd_get_section_name (file->the_bfd, s);
++	  bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
++
++	  if (!skip)
++	    walk_wild_consider_section (ptr, file, s, wildsec1, callback,
++					data);
++	}
++    }
++}
++
++static void
++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *wildsec1 = ptr->handler_data[1];
++  struct wildcard_list *wildsec2 = ptr->handler_data[2];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	{
++	  const char *sname = bfd_get_section_name (file->the_bfd, s);
++	  bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
++
++	  if (!skip)
++	    walk_wild_consider_section (ptr, file, s, wildsec1, callback, data);
++	  else
++	    {
++	      skip = !match_simple_wild (wildsec2->spec.name, sname);
++	      if (!skip)
++		walk_wild_consider_section (ptr, file, s, wildsec2, callback,
++					    data);
++	    }
++	}
++    }
++}
++
++static void
++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *sec1 = ptr->handler_data[1];
++  struct wildcard_list *wildsec2 = ptr->handler_data[2];
++  struct wildcard_list *wildsec3 = ptr->handler_data[3];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1;
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  s1 = find_section (file, sec1, &multiple_sections_found);
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	if (s == s1)
++	  walk_wild_consider_section (ptr, file, s, sec1, callback, data);
++	else
++	  {
++	    const char *sname = bfd_get_section_name (file->the_bfd, s);
++	    bfd_boolean skip = !match_simple_wild (wildsec2->spec.name,
++						   sname);
++
++	    if (!skip)
++	      walk_wild_consider_section (ptr, file, s, wildsec2, callback,
++					  data);
++	    else
++	      {
++		skip = !match_simple_wild (wildsec3->spec.name, sname);
++		if (!skip)
++		  walk_wild_consider_section (ptr, file, s, wildsec3,
++					      callback, data);
++	      }
++	  }
++    }
++}
++
++static void
++walk_wild_section (lang_wild_statement_type *ptr,
++		   lang_input_statement_type *file,
++		   callback_t callback,
++		   void *data)
++{
++  if (file->just_syms_flag)
++    return;
++
++  (*ptr->walk_wild_section_handler) (ptr, file, callback, data);
++}
++
++/* Returns TRUE when name1 is a wildcard spec that might match
++   something name2 can match.  We're conservative: we return FALSE
++   only if the prefixes of name1 and name2 are different up to the
++   first wildcard character.  */
++
++static bfd_boolean
++wild_spec_can_overlap (const char *name1, const char *name2)
++{
++  size_t prefix1_len = strcspn (name1, "?*[");
++  size_t prefix2_len = strcspn (name2, "?*[");
++  size_t min_prefix_len;
++
++  /* Note that if there is no wildcard character, then we treat the
++     terminating 0 as part of the prefix.  Thus ".text" won't match
++     ".text." or ".text.*", for example.  */
++  if (name1[prefix1_len] == '\0')
++    prefix1_len++;
++  if (name2[prefix2_len] == '\0')
++    prefix2_len++;
++
++  min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len;
++
++  return memcmp (name1, name2, min_prefix_len) == 0;
++}
++
++/* Select specialized code to handle various kinds of wildcard
++   statements.  */
++
++static void
++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr)
++{
++  int sec_count = 0;
++  int wild_name_count = 0;
++  struct wildcard_list *sec;
++  int signature;
++  int data_counter;
++
++  ptr->walk_wild_section_handler = walk_wild_section_general;
++
++  /* Count how many wildcard_specs there are, and how many of those
++     actually use wildcards in the name.  Also, bail out if any of the
++     wildcard names are NULL. (Can this actually happen?
++     walk_wild_section used to test for it.)  And bail out if any
++     of the wildcards are more complex than a simple string
++     ending in a single '*'.  */
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    {
++      ++sec_count;
++      if (sec->spec.name == NULL)
++	return;
++      if (wildcardp (sec->spec.name))
++	{
++	  ++wild_name_count;
++	  if (!is_simple_wild (sec->spec.name))
++	    return;
++	}
++    }
++
++  /* The zero-spec case would be easy to optimize but it doesn't
++     happen in practice.  Likewise, more than 4 specs doesn't
++     happen in practice.  */
++  if (sec_count == 0 || sec_count > 4)
++    return;
++
++  /* Check that no two specs can match the same section.  */
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    {
++      struct wildcard_list *sec2;
++      for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next)
++	{
++	  if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name))
++	    return;
++	}
++    }
++
++  signature = (sec_count << 8) + wild_name_count;
++  switch (signature)
++    {
++    case 0x0100:
++      ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0;
++      break;
++    case 0x0101:
++      ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1;
++      break;
++    case 0x0201:
++      ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1;
++      break;
++    case 0x0302:
++      ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2;
++      break;
++    case 0x0402:
++      ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2;
++      break;
++    default:
++      return;
++    }
++
++  /* Now fill the data array with pointers to the specs, first the
++     specs with non-wildcard names, then the specs with wildcard
++     names.  It's OK to process the specs in different order from the
++     given order, because we've already determined that no section
++     will match more than one spec.  */
++  data_counter = 0;
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    if (!wildcardp (sec->spec.name))
++      ptr->handler_data[data_counter++] = sec;
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    if (wildcardp (sec->spec.name))
++      ptr->handler_data[data_counter++] = sec;
++}
++
+ /* Handle a wild statement for a single file F.  */
+ 
+ static void
+@@ -4353,6 +4737,7 @@
+   new->section_list = section_list;
+   new->keep_sections = keep_sections;
+   lang_list_init (&new->children);
++  analyze_walk_wild_section_handler (new);
+ }
+ 
+ void
+--- binutils-2.15/ld/ldlang.h.old	2004-05-17 15:36:16.000000000 -0400
++++ binutils-2.15/ld/ldlang.h	2006-01-23 13:32:33.653292000 -0500
+@@ -295,7 +295,17 @@
+   union lang_statement_union *file;
+ } lang_afile_asection_pair_statement_type;
+ 
+-typedef struct lang_wild_statement_struct
++typedef struct lang_wild_statement_struct lang_wild_statement_type;
++
++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
++			    asection *, lang_input_statement_type *, void *);
++
++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
++					     lang_input_statement_type *,
++					     callback_t callback,
++					     void *data);
++
++struct lang_wild_statement_struct
+ {
+   lang_statement_header_type header;
+   const char *filename;
+@@ -303,7 +313,10 @@
+   struct wildcard_list *section_list;
+   bfd_boolean keep_sections;
+   lang_statement_list_type children;
+-} lang_wild_statement_type;
++
++  walk_wild_section_handler_t walk_wild_section_handler;
++  struct wildcard_list *handler_data[4];
++};
+ 
+ typedef struct lang_address_statement_struct
+ {
diff --git a/patches/binutils/2.15/ld-2.15-stabs-tweak.patch b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch
new file mode 100644
index 00000000..bd6ae7a1
--- /dev/null
+++ b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch
@@ -0,0 +1,33 @@
+Signed-off-by: dank@kegel.com
+
+See http://sourceware.org/ml/binutils/2005-12/msg00270.html
+http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html
+
+STABS hash table size change, backported from the binutils CVS tree.  Here's
+the CVS log comment for the original change:
+
+revision 1.25
+date: 2005/12/29 10:29:23;  author: nickc;  state: Exp;  lines: +2 -3
+(_bfd_link_section_stabs): Use bfd_hash_table_init rather than
+bfd_hash_table_init_n(...,251) so that the size of the hash table can be
+controlled by the user.
+
+Note that tunable hash table size changes were added after 2.15.  The effect
+of this change is to make bfd use its default hash table size for the stabs
+hash as well.
+
+
+--- binutils-2.15/bfd/stabs.c.old	2004-05-17 15:36:04.000000000 -0400
++++ binutils-2.15/bfd/stabs.c	2006-02-09 15:21:56.567014000 -0500
+@@ -241,9 +241,8 @@
+ 	goto error_return;
+       /* Make sure the first byte is zero.  */
+       (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE);
+-      if (! bfd_hash_table_init_n (&sinfo->includes.root,
+-				   stab_link_includes_newfunc,
+-				   251))
++      if (! bfd_hash_table_init (&sinfo->includes.root,
++				   stab_link_includes_newfunc))
+ 	goto error_return;
+       sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr");
+       sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
diff --git a/patches/binutils/2.15/s390-invalid-insn-format.patch b/patches/binutils/2.15/s390-invalid-insn-format.patch
new file mode 100644
index 00000000..32962015
--- /dev/null
+++ b/patches/binutils/2.15/s390-invalid-insn-format.patch
@@ -0,0 +1,42 @@
+Message-ID: <000801c48f60$cec16630$9103a8c0@ULOC5012>
+From: "Michael Geiger" <mcgege@gmx.de>
+To: <dank@kegel.com>
+Subject: Patch for cross compiling s/390 kernel on linux host
+Date: Tue, 31 Aug 2004 15:45:41 +0200
+
+Dear Dan,
+
+I had big problems compiling a kernel for s/390 on my linux host - I tried
+different chains from crosstool-0.28-rc34 and finally succeded with
+gcc-3.3.4-glibc-2.3.2 after applying another patch to binutils-2.15
+(attached).
+All compilations of the different kernel versions I tried stopped with
+"Invalid .insn format" somewhere. I checked the recent cvs version of
+binutils and applied the latest diff to gas/config/tc-s390.c and that solved
+it.
+
+Greetings
+
+Michael Geiger
+
+
+diff -u -r1.39 -r1.40
+--- src/gas/config/tc-s390.c	2004/05/06 11:01:48	1.39
++++ src/gas/config/tc-s390.c	2004/06/15 12:38:08	1.40
+@@ -1596,13 +1596,13 @@
+   if (exp.X_op == O_constant)
+     {
+       if (   (   opformat->oplen == 6
+-	      && exp.X_add_number >= 0
++	      && (addressT) exp.X_add_number >= 0
+ 	      && (addressT) exp.X_add_number < (1ULL << 48))
+ 	  || (   opformat->oplen == 4
+-	      && exp.X_add_number >= 0
++	      && (addressT) exp.X_add_number >= 0
+ 	      && (addressT) exp.X_add_number < (1ULL << 32))
+ 	  || (   opformat->oplen == 2
+-	      && exp.X_add_number >= 0
++	      && (addressT) exp.X_add_number >= 0
+ 	      && (addressT) exp.X_add_number < (1ULL << 16)))
+ 	md_number_to_chars (insn, exp.X_add_number, opformat->oplen);
+       else
diff --git a/patches/binutils/2.16.1/bfd-hash-tweak.patch b/patches/binutils/2.16.1/bfd-hash-tweak.patch
new file mode 100644
index 00000000..c6de93a9
--- /dev/null
+++ b/patches/binutils/2.16.1/bfd-hash-tweak.patch
@@ -0,0 +1,23 @@
+Signed-off-by: dank@kegel.com
+
+Raising the size of the hash table is a noticable win when linking 
+at least one large app.  
+
+There was a patch,
+http://sources.redhat.com/ml/binutils/2004-06/msg00165.html
+to do this dynamically.  No idea why that didn't make it in.
+So this tiny change to raise the default size is just
+a stopgap for now.
+
+
+--- binutils-2.16.1/bfd/hash.c.old	2006-03-02 23:01:39.000000000 -0800
++++ binutils-2.16.1/bfd/hash.c	2006-03-02 23:01:58.000000000 -0800
+@@ -300,7 +300,7 @@
+ */
+ 
+ /* The default number of entries to use when creating a hash table.  */
+-#define DEFAULT_SIZE 4051
++#define DEFAULT_SIZE 32749
+ static size_t bfd_default_hash_table_size = DEFAULT_SIZE;
+ 
+ /* Create a new hash table, given a number of entries.  */
diff --git a/patches/binutils/2.16.1/binutils-2.15-psignal.patch b/patches/binutils/2.16.1/binutils-2.15-psignal.patch
new file mode 100644
index 00000000..98fa600e
--- /dev/null
+++ b/patches/binutils/2.16.1/binutils-2.15-psignal.patch
@@ -0,0 +1,40 @@
+Make psignal prototype in libiberty match that in glibc.
+
+Fixes:
+
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal':
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype
+/usr/include/signal.h:131: prototype declaration
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype
+/usr/include/signal.h:131: prototype declaration
+gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned
+mprotect... make[1]: *** [strsignal.o] Error 1
+make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty'
+make: *** [all-libiberty] Error 2
+
+when building on red hat 7.1
+though it's a bit of a mystery why libiberty's psignal is being compiled at
+all, since red hat 7.1's glibc supports psignal (hence the error message)
+
+--- binutils-2.15/libiberty/strsignal.c.old	2005-04-18 13:57:40.000000000 -0700
++++ binutils-2.15/libiberty/strsignal.c	2005-04-18 13:59:09.000000000 -0700
+@@ -544,7 +544,7 @@
+ 
+ /*
+ 
+-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message})
++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message})
+ 
+ Print @var{message} to the standard error, followed by a colon,
+ followed by the description of the signal specified by @var{signo},
+@@ -557,9 +557,7 @@
+ #ifndef HAVE_PSIGNAL
+ 
+ void
+-psignal (signo, message)
+-  unsigned signo;
+-  char *message;
++psignal (int signo, const char *message)
+ {
+   if (signal_names == NULL)
+     {
diff --git a/patches/binutils/2.16.1/binutils-skip-comments.patch b/patches/binutils/2.16.1/binutils-skip-comments.patch
new file mode 100644
index 00000000..0ca9a471
--- /dev/null
+++ b/patches/binutils/2.16.1/binutils-skip-comments.patch
@@ -0,0 +1,95 @@
+[removed first hunk so it would apply to 2.16.1 - copyright date already updated - dank]
+
+Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html
+Fixes
+localealias.s:544: Error: junk at end of line, first unrecognized character is `,' 
+when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3
+
+Paths adjusted to match crosstool's patcher.
+
+Message-Id: m3n052qw2g.fsf@whitebox.m5r.de
+From: Andreas Schwab <schwab at suse dot de>
+To: Nathan Sidwell <nathan at codesourcery dot com>
+Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com
+Date: Fri, 23 Apr 2004 22:27:19 +0200
+Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line
+
+Nathan Sidwell <nathan@codesourcery.com> writes:
+
+> Index: read.c
+> ===================================================================
+> RCS file: /cvs/src/src/gas/read.c,v
+> retrieving revision 1.76
+> diff -c -3 -p -r1.76 read.c
+> *** read.c	12 Mar 2004 17:48:12 -0000	1.76
+> --- read.c	18 Mar 2004 09:56:05 -0000
+> *************** read_a_source_file (char *name)
+> *** 1053,1059 ****
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  ignore_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+> --- 1053,1059 ----
+>   #endif
+>   	  input_line_pointer--;
+>   	  /* Report unknown char as ignored.  */
+> ! 	  demand_empty_rest_of_line ();
+>   	}
+>   
+>   #ifdef md_after_pass_hook
+
+This means that the unknown character is no longer ignored, despite the
+comment.  As a side effect a line starting with a line comment character
+not followed by APP in NO_APP mode now triggers an error instead of just a
+warning, breaking builds of glibc on m68k-linux.  Earlier in
+read_a_source_file where #APP is handled there is another comment that
+claims that unknown comments are ignored, when in fact they aren't (only
+the initial line comment character is skipped).
+
+Note that the presence of #APP will mess up the line counters, but
+that appears to be difficult to fix.
+
+Andreas.
+
+2004-04-23  Andreas Schwab  <schwab@suse.de>
+
+	* read.c (read_a_source_file): Ignore unknown text after line
+	comment character.  Fix misleading comment.
+
+--- binutils/gas/read.c.~1.78.~	2004-04-23 08:58:23.000000000 +0200
++++ binutils/gas/read.c	2004-04-23 21:49:01.000000000 +0200
+@@ -950,10 +950,14 @@ read_a_source_file (char *name)
+ 	      unsigned int new_length;
+ 	      char *tmp_buf = 0;
+ 
+-	      bump_line_counters ();
+ 	      s = input_line_pointer;
+ 	      if (strncmp (s, "APP\n", 4))
+-		continue;	/* We ignore it */
++		{
++		  /* We ignore it */
++		  ignore_rest_of_line ();
++		  continue;
++		}
++	      bump_line_counters ();
+ 	      s += 4;
+ 
+ 	      sb_new (&sbuf);
+@@ -1052,7 +1056,7 @@ read_a_source_file (char *name)
+ 	    continue;
+ #endif
+ 	  input_line_pointer--;
+-	  /* Report unknown char as ignored.  */
++	  /* Report unknown char as error.  */
+ 	  demand_empty_rest_of_line ();
+ 	}
+ 
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstra&#xC3;e 5, 90409 N&#xC3;rnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
diff --git a/patches/binutils/2.16.1/callahan.patch b/patches/binutils/2.16.1/callahan.patch
new file mode 100644
index 00000000..a39050f9
--- /dev/null
+++ b/patches/binutils/2.16.1/callahan.patch
@@ -0,0 +1,693 @@
+Signed-off-by: dank@kegel.com
+Fixes ld speed issue. 
+See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html
+See thread "Re: optimizations for 3x speedup in ld",
+http://sources.redhat.com/ml/binutils/2005-03/msg00847.html
+
+Wildcard section matching enhancement, backported from the binutils CVS tree.
+Here's the CVS log comment from the original change to ldlang.c:
+
+revision 1.177
+date: 2005/04/06 15:33:02;  author: jakub;  state: Exp;  lines: +438 -51
+2005-04-06  Jakub Jelinek  <jakub@redhat.com>
+
+        * ldlang.c: Formatting.
+        (walk_wild_consider_section): Remember return value from wildcardp.
+        (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
+        (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
+
+2005-04-06  Robert O'Callahan  <rocallahan@novell.com>
+
+        * ld.h (lean_section_userdata_type): Remove.
+        (fat_section_userdata_type): Remove file field.
+        (SECTION_USERDATA_SIZE): Remove.
+        * ldlang.c (init_os): Eliminate initialization of unused
+        lean_section_userdata_type.
+
+        * ldlang.h (callback_t, walk_wild_section_handler_t): New
+        typedefs.
+        (struct lang_wild_statement_struct): Add walk_wild_section_handler
+        and handler_data fields.
+        * ldlang.c (callback_t): Removed.
+        (walk_wild_consider_section, walk_wild_section_general,
+        section_iterator_callback, find_section, is_simple_wild,
+        match_simple_wild, walk_wild_section_specs1_wild0,
+        walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
+        walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
+        wild_spec_can_overlap, analyze_walk_wild_section_handler): New
+        functions.
+        (lang_add_wild): Call analyze_walk_wild_section_handler.
+        (walk_wild_section): Renamed to walk_wild_section_general and
+        created a wrapper function.
+        (section_iterator_callback_data): New typedef.
+
+
+Index: src/ld/ld.h
+===================================================================
+RCS file: /cvs/src/src/ld/ld.h,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- binutils/ld/ld.h.old	16 Mar 2005 21:52:42 -0000	1.26
++++ binutils/ld/ld.h	6 Apr 2005 15:33:02 -0000	1.27
+@@ -1,6 +1,6 @@
+ /* ld.h -- general linker header file
+    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+-   2001, 2002, 2003, 2004
++   2001, 2002, 2003, 2004, 2005
+    Free Software Foundation, Inc.
+ 
+    This file is part of GLD, the Gnu Linker.
+@@ -89,28 +89,15 @@
+   struct map_symbol_def *next;
+ };
+ 
+-/* Extra information we hold on sections */
+-typedef struct lean_user_section_struct {
+-  /* For output sections: pointer to the section where this data will go.  */
+-  struct lang_input_statement_struct *file;
+-} lean_section_userdata_type;
+-
+ /* The initial part of fat_user_section_struct has to be idential with
+    lean_user_section_struct.  */
+ typedef struct fat_user_section_struct {
+-  /* For output sections: pointer to the section where this data will go.  */
+-  struct lang_input_statement_struct *file;
+   /* For input sections, when writing a map file: head / tail of a linked
+      list of hash table entries for symbols defined in this section.  */
+   struct map_symbol_def *map_symbol_def_head;
+   struct map_symbol_def **map_symbol_def_tail;
+ } fat_section_userdata_type;
+ 
+-#define SECTION_USERDATA_SIZE \
+- (command_line.reduce_memory_overheads \
+-  ? sizeof (lean_section_userdata_type) \
+-  : sizeof (fat_section_userdata_type))
+-
+ #define get_userdata(x) ((x)->userdata)
+ 
+ #define BYTE_SIZE	(1)
+Index: src/ld/ldlang.c
+===================================================================
+RCS file: /cvs/src/src/ld/ldlang.c,v
+retrieving revision 1.176
+retrieving revision 1.177
+diff -u -r1.176 -r1.177
+--- binutils/ld/ldlang.c.old	18 Mar 2005 13:56:26 -0000	1.176
++++ binutils/ld/ldlang.c	6 Apr 2005 15:33:02 -0000	1.177
+@@ -84,9 +84,6 @@
+ static void lang_record_phdrs (void);
+ static void lang_do_version_exports_section (void);
+ 
+-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
+-			    asection *, lang_input_statement_type *, void *);
+-
+ /* Exported variables.  */
+ lang_output_section_statement_type *abs_output_section;
+ lang_statement_list_type lang_output_section_statement;
+@@ -155,21 +152,71 @@
+ 
+ /* Generic traversal routines for finding matching sections.  */
+ 
++/* Try processing a section against a wildcard.  This just calls
++   the callback unless the filename exclusion list is present
++   and excludes the file.  It's hardly ever present so this
++   function is very fast.  */
++
++static void
++walk_wild_consider_section (lang_wild_statement_type *ptr,
++			    lang_input_statement_type *file,
++			    asection *s,
++			    struct wildcard_list *sec,
++			    callback_t callback,
++			    void *data)
++{
++  bfd_boolean skip = FALSE;
++  struct name_list *list_tmp;
++
++  /* Don't process sections from files which were
++     excluded.  */
++  for (list_tmp = sec->spec.exclude_name_list;
++       list_tmp;
++       list_tmp = list_tmp->next)
++    {
++      bfd_boolean is_wildcard = wildcardp (list_tmp->name);
++      if (is_wildcard)
++	skip = fnmatch (list_tmp->name, file->filename, 0) == 0;
++      else
++	skip = strcmp (list_tmp->name, file->filename) == 0;
++
++      /* If this file is part of an archive, and the archive is
++	 excluded, exclude this file.  */
++      if (! skip && file->the_bfd != NULL
++	  && file->the_bfd->my_archive != NULL
++	  && file->the_bfd->my_archive->filename != NULL)
++	{
++	  if (is_wildcard)
++	    skip = fnmatch (list_tmp->name,
++			    file->the_bfd->my_archive->filename,
++			    0) == 0;
++	  else
++	    skip = strcmp (list_tmp->name,
++			   file->the_bfd->my_archive->filename) == 0;
++	}
++
++      if (skip)
++	break;
++    }
++
++  if (!skip)
++    (*callback) (ptr, sec, s, file, data);
++}
++
++/* Lowest common denominator routine that can handle everything correctly,
++   but slowly.  */
++
+ static void
+-walk_wild_section (lang_wild_statement_type *ptr,
+-		   lang_input_statement_type *file,
+-		   callback_t callback,
+-		   void *data)
++walk_wild_section_general (lang_wild_statement_type *ptr,
++			   lang_input_statement_type *file,
++			   callback_t callback,
++			   void *data)
+ {
+   asection *s;
+-
+-  if (file->just_syms_flag)
+-    return;
++  struct wildcard_list *sec;
+ 
+   for (s = file->the_bfd->sections; s != NULL; s = s->next)
+     {
+-      struct wildcard_list *sec;
+-
+       sec = ptr->section_list;
+       if (sec == NULL)
+ 	(*callback) (ptr, sec, s, file, data);
+@@ -177,39 +224,8 @@
+       while (sec != NULL)
+ 	{
+ 	  bfd_boolean skip = FALSE;
+-	  struct name_list *list_tmp;
+ 
+-	  /* Don't process sections from files which were
+-	     excluded.  */
+-	  for (list_tmp = sec->spec.exclude_name_list;
+-	       list_tmp;
+-	       list_tmp = list_tmp->next)
+-	    {
+-	      if (wildcardp (list_tmp->name))
+-		skip = fnmatch (list_tmp->name, file->filename, 0) == 0;
+-	      else
+-		skip = strcmp (list_tmp->name, file->filename) == 0;
+-
+-	      /* If this file is part of an archive, and the archive is
+-		 excluded, exclude this file.  */
+-	      if (! skip && file->the_bfd != NULL
+-		  && file->the_bfd->my_archive != NULL
+-		  && file->the_bfd->my_archive->filename != NULL)
+-		{
+-		  if (wildcardp (list_tmp->name))
+-		    skip = fnmatch (list_tmp->name,
+-				    file->the_bfd->my_archive->filename,
+-				    0) == 0;
+-		  else
+-		    skip = strcmp (list_tmp->name,
+-				   file->the_bfd->my_archive->filename) == 0;
+-		}
+-
+-	      if (skip)
+-		break;
+-	    }
+-
+-	  if (!skip && sec->spec.name != NULL)
++	  if (sec->spec.name != NULL)
+ 	    {
+ 	      const char *sname = bfd_get_section_name (file->the_bfd, s);
+ 
+@@ -220,13 +236,381 @@
+ 	    }
+ 
+ 	  if (!skip)
+-	    (*callback) (ptr, sec, s, file, data);
++	    walk_wild_consider_section (ptr, file, s, sec, callback, data);
+ 
+ 	  sec = sec->next;
+ 	}
+     }
+ }
+ 
++/* Routines to find a single section given its name.  If there's more
++   than one section with that name, we report that.  */
++
++typedef struct
++{
++  asection *found_section;
++  bfd_boolean multiple_sections_found;
++} section_iterator_callback_data;
++
++static bfd_boolean
++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data)
++{
++  section_iterator_callback_data *d = data;
++
++  if (d->found_section != NULL)
++    {
++      d->multiple_sections_found = TRUE;
++      return TRUE;
++    }
++
++  d->found_section = s;
++  return FALSE;
++}
++
++static asection *
++find_section (lang_input_statement_type *file,
++	      struct wildcard_list *sec,
++	      bfd_boolean *multiple_sections_found)
++{
++  section_iterator_callback_data cb_data = { NULL, FALSE };
++
++  bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, 
++			      section_iterator_callback, &cb_data);
++  *multiple_sections_found = cb_data.multiple_sections_found;
++  return cb_data.found_section;
++}
++
++/* Code for handling simple wildcards without going through fnmatch,
++   which can be expensive because of charset translations etc.  */
++
++/* A simple wild is a literal string followed by a single '*',
++   where the literal part is at least 4 characters long.  */
++
++static bfd_boolean
++is_simple_wild (const char *name)
++{
++  size_t len = strcspn (name, "*?[");
++  return len >= 4 && name[len] == '*' && name[len + 1] == '\0';
++}
++
++static bfd_boolean
++match_simple_wild (const char *pattern, const char *name)
++{
++  /* The first four characters of the pattern are guaranteed valid
++     non-wildcard characters.  So we can go faster.  */
++  if (pattern[0] != name[0] || pattern[1] != name[1]
++      || pattern[2] != name[2] || pattern[3] != name[3])
++    return FALSE;
++
++  pattern += 4;
++  name += 4;
++  while (*pattern != '*')
++    if (*name++ != *pattern++)
++      return FALSE;
++
++  return TRUE;
++}
++
++/* Specialized, optimized routines for handling different kinds of
++   wildcards */
++
++static void
++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  /* We can just do a hash lookup for the section with the right name.
++     But if that lookup discovers more than one section with the name
++     (should be rare), we fall back to the general algorithm because
++     we would otherwise have to sort the sections to make sure they
++     get processed in the bfd's order.  */
++  bfd_boolean multiple_sections_found;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    walk_wild_section_general (ptr, file, callback, data);
++  else if (s0)
++    walk_wild_consider_section (ptr, file, s0, sec0, callback, data);
++}
++
++static void
++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *wildsec0 = ptr->handler_data[0];
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      const char *sname = bfd_get_section_name (file->the_bfd, s);
++      bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname);
++
++      if (!skip)
++	walk_wild_consider_section (ptr, file, s, wildsec0, callback, data);
++    }
++}
++
++static void
++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *wildsec1 = ptr->handler_data[1];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  /* Note that if the section was not found, s0 is NULL and
++     we'll simply never succeed the s == s0 test below.  */
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      /* Recall that in this code path, a section cannot satisfy more
++	 than one spec, so if s == s0 then it cannot match
++	 wildspec1.  */
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	{
++	  const char *sname = bfd_get_section_name (file->the_bfd, s);
++	  bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
++
++	  if (!skip)
++	    walk_wild_consider_section (ptr, file, s, wildsec1, callback,
++					data);
++	}
++    }
++}
++
++static void
++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *wildsec1 = ptr->handler_data[1];
++  struct wildcard_list *wildsec2 = ptr->handler_data[2];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found);
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	{
++	  const char *sname = bfd_get_section_name (file->the_bfd, s);
++	  bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
++
++	  if (!skip)
++	    walk_wild_consider_section (ptr, file, s, wildsec1, callback, data);
++	  else
++	    {
++	      skip = !match_simple_wild (wildsec2->spec.name, sname);
++	      if (!skip)
++		walk_wild_consider_section (ptr, file, s, wildsec2, callback,
++					    data);
++	    }
++	}
++    }
++}
++
++static void
++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr,
++				lang_input_statement_type *file,
++				callback_t callback,
++				void *data)
++{
++  asection *s;
++  struct wildcard_list *sec0 = ptr->handler_data[0];
++  struct wildcard_list *sec1 = ptr->handler_data[1];
++  struct wildcard_list *wildsec2 = ptr->handler_data[2];
++  struct wildcard_list *wildsec3 = ptr->handler_data[3];
++  bfd_boolean multiple_sections_found;
++  asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1;
++
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  s1 = find_section (file, sec1, &multiple_sections_found);
++  if (multiple_sections_found)
++    {
++      walk_wild_section_general (ptr, file, callback, data);
++      return;
++    }
++
++  for (s = file->the_bfd->sections; s != NULL; s = s->next)
++    {
++      if (s == s0)
++	walk_wild_consider_section (ptr, file, s, sec0, callback, data);
++      else
++	if (s == s1)
++	  walk_wild_consider_section (ptr, file, s, sec1, callback, data);
++	else
++	  {
++	    const char *sname = bfd_get_section_name (file->the_bfd, s);
++	    bfd_boolean skip = !match_simple_wild (wildsec2->spec.name,
++						   sname);
++
++	    if (!skip)
++	      walk_wild_consider_section (ptr, file, s, wildsec2, callback,
++					  data);
++	    else
++	      {
++		skip = !match_simple_wild (wildsec3->spec.name, sname);
++		if (!skip)
++		  walk_wild_consider_section (ptr, file, s, wildsec3,
++					      callback, data);
++	      }
++	  }
++    }
++}
++
++static void
++walk_wild_section (lang_wild_statement_type *ptr,
++		   lang_input_statement_type *file,
++		   callback_t callback,
++		   void *data)
++{
++  if (file->just_syms_flag)
++    return;
++
++  (*ptr->walk_wild_section_handler) (ptr, file, callback, data);
++}
++
++/* Returns TRUE when name1 is a wildcard spec that might match
++   something name2 can match.  We're conservative: we return FALSE
++   only if the prefixes of name1 and name2 are different up to the
++   first wildcard character.  */
++
++static bfd_boolean
++wild_spec_can_overlap (const char *name1, const char *name2)
++{
++  size_t prefix1_len = strcspn (name1, "?*[");
++  size_t prefix2_len = strcspn (name2, "?*[");
++  size_t min_prefix_len;
++
++  /* Note that if there is no wildcard character, then we treat the
++     terminating 0 as part of the prefix.  Thus ".text" won't match
++     ".text." or ".text.*", for example.  */
++  if (name1[prefix1_len] == '\0')
++    prefix1_len++;
++  if (name2[prefix2_len] == '\0')
++    prefix2_len++;
++
++  min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len;
++
++  return memcmp (name1, name2, min_prefix_len) == 0;
++}
++
++/* Select specialized code to handle various kinds of wildcard
++   statements.  */
++
++static void
++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr)
++{
++  int sec_count = 0;
++  int wild_name_count = 0;
++  struct wildcard_list *sec;
++  int signature;
++  int data_counter;
++
++  ptr->walk_wild_section_handler = walk_wild_section_general;
++
++  /* Count how many wildcard_specs there are, and how many of those
++     actually use wildcards in the name.  Also, bail out if any of the
++     wildcard names are NULL. (Can this actually happen?
++     walk_wild_section used to test for it.)  And bail out if any
++     of the wildcards are more complex than a simple string
++     ending in a single '*'.  */
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    {
++      ++sec_count;
++      if (sec->spec.name == NULL)
++	return;
++      if (wildcardp (sec->spec.name))
++	{
++	  ++wild_name_count;
++	  if (!is_simple_wild (sec->spec.name))
++	    return;
++	}
++    }
++
++  /* The zero-spec case would be easy to optimize but it doesn't
++     happen in practice.  Likewise, more than 4 specs doesn't
++     happen in practice.  */
++  if (sec_count == 0 || sec_count > 4)
++    return;
++
++  /* Check that no two specs can match the same section.  */
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    {
++      struct wildcard_list *sec2;
++      for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next)
++	{
++	  if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name))
++	    return;
++	}
++    }
++
++  signature = (sec_count << 8) + wild_name_count;
++  switch (signature)
++    {
++    case 0x0100:
++      ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0;
++      break;
++    case 0x0101:
++      ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1;
++      break;
++    case 0x0201:
++      ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1;
++      break;
++    case 0x0302:
++      ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2;
++      break;
++    case 0x0402:
++      ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2;
++      break;
++    default:
++      return;
++    }
++
++  /* Now fill the data array with pointers to the specs, first the
++     specs with non-wildcard names, then the specs with wildcard
++     names.  It's OK to process the specs in different order from the
++     given order, because we've already determined that no section
++     will match more than one spec.  */
++  data_counter = 0;
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    if (!wildcardp (sec->spec.name))
++      ptr->handler_data[data_counter++] = sec;
++  for (sec = ptr->section_list; sec != NULL; sec = sec->next)
++    if (wildcardp (sec->spec.name))
++      ptr->handler_data[data_counter++] = sec;
++}
++
+ /* Handle a wild statement for a single file F.  */
+ 
+ static void
+@@ -1175,17 +1559,12 @@
+ static void
+ init_os (lang_output_section_statement_type *s)
+ {
+-  lean_section_userdata_type *new;
+-
+   if (s->bfd_section != NULL)
+     return;
+ 
+   if (strcmp (s->name, DISCARD_SECTION_NAME) == 0)
+     einfo (_("%P%F: Illegal use of `%s' section\n"), DISCARD_SECTION_NAME);
+ 
+-  new = stat_alloc (SECTION_USERDATA_SIZE);
+-  memset (new, 0, SECTION_USERDATA_SIZE);
+-
+   s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
+   if (s->bfd_section == NULL)
+     s->bfd_section = bfd_make_section (output_bfd, s->name);
+@@ -1199,7 +1578,14 @@
+   /* We initialize an output sections output offset to minus its own
+      vma to allow us to output a section through itself.  */
+   s->bfd_section->output_offset = 0;
+-  get_userdata (s->bfd_section) = new;
++  if (!command_line.reduce_memory_overheads)
++    {
++      fat_section_userdata_type *new
++	= stat_alloc (sizeof (fat_section_userdata_type));
++      memset (new, 0, sizeof (fat_section_userdata_type));
++      get_userdata (s->bfd_section) = new;
++    }
++
+ 
+   /* If there is a base address, make sure that any sections it might
+      mention are initialized.  */
+@@ -4939,6 +5325,7 @@
+   new->section_list = section_list;
+   new->keep_sections = keep_sections;
+   lang_list_init (&new->children);
++  analyze_walk_wild_section_handler (new);
+ }
+ 
+ void
+Index: src/ld/ldlang.h
+===================================================================
+RCS file: /cvs/src/src/ld/ldlang.h,v
+retrieving revision 1.44
+retrieving revision 1.45
+diff -u -r1.44 -r1.45
+--- binutils/ld/ldlang.h.old	3 Mar 2005 11:51:58 -0000	1.44
++++ binutils/ld/ldlang.h	6 Apr 2005 15:33:03 -0000	1.45
+@@ -298,7 +298,17 @@
+   union lang_statement_union *file;
+ } lang_afile_asection_pair_statement_type;
+ 
+-typedef struct lang_wild_statement_struct
++typedef struct lang_wild_statement_struct lang_wild_statement_type;
++
++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
++			    asection *, lang_input_statement_type *, void *);
++
++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
++					     lang_input_statement_type *,
++					     callback_t callback,
++					     void *data);
++
++struct lang_wild_statement_struct
+ {
+   lang_statement_header_type header;
+   const char *filename;
+@@ -306,7 +316,10 @@
+   struct wildcard_list *section_list;
+   bfd_boolean keep_sections;
+   lang_statement_list_type children;
+-} lang_wild_statement_type;
++
++  walk_wild_section_handler_t walk_wild_section_handler;
++  struct wildcard_list *handler_data[4];
++};
+ 
+ typedef struct lang_address_statement_struct
+ {
diff --git a/patches/binutils/2.16.1/cross-gprof.patch b/patches/binutils/2.16.1/cross-gprof.patch
new file mode 100644
index 00000000..ea6c18fd
--- /dev/null
+++ b/patches/binutils/2.16.1/cross-gprof.patch
@@ -0,0 +1,22 @@
+--- binutils-2.15/configure.old	2004-07-21 21:36:47.000000000 -0700
++++ binutils-2.15/configure	2004-07-21 21:37:08.000000000 -0700
+@@ -999,7 +999,7 @@
+ 
+ # Some tools are only suitable for building in a "native" situation.
+ # Remove these if host!=target.  
+-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
+ 
+ # Similarly, some are only suitable for cross toolchains.
+ # Remove these if host=target.
+--- binutils-2.15/configure.in.old	2004-07-21 21:37:19.000000000 -0700
++++ binutils-2.15/configure.in	2004-07-21 21:37:34.000000000 -0700
+@@ -236,7 +236,7 @@
+ 
+ # Some tools are only suitable for building in a "native" situation.
+ # Remove these if host!=target.  
+-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf"
+ 
+ # Similarly, some are only suitable for cross toolchains.
+ # Remove these if host=target.
diff --git a/patches/binutils/2.16.1/stabs-tweak.patch b/patches/binutils/2.16.1/stabs-tweak.patch
new file mode 100644
index 00000000..86e36114
--- /dev/null
+++ b/patches/binutils/2.16.1/stabs-tweak.patch
@@ -0,0 +1,28 @@
+Signed-off-by: dank@kegel.com
+
+See http://sourceware.org/ml/binutils/2005-12/msg00270.html
+http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html
+
+STABS hash table size change, backported from the binutils CVS tree.  Here's
+the CVS log comment for the original change:
+
+revision 1.25
+date: 2005/12/29 10:29:23;  author: nickc;  state: Exp;  lines: +2 -3
+(_bfd_link_section_stabs): Use bfd_hash_table_init rather than
+bfd_hash_table_init_n(...,251) so that the size of the hash table can be
+controlled by the user.
+
+--- binutils/bfd/stabs.c.old	4 May 2005 15:53:39 -0000	1.24
++++ binutils/bfd/stabs.c	29 Dec 2005 10:29:23 -0000	1.25
+@@ -194,9 +194,8 @@
+ 	goto error_return;
+       /* Make sure the first byte is zero.  */
+       (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE);
+-      if (! bfd_hash_table_init_n (&sinfo->includes,
+-				   stab_link_includes_newfunc,
+-				   251))
++      if (! bfd_hash_table_init (&sinfo->includes,
++				 stab_link_includes_newfunc))
+ 	goto error_return;
+       sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr");
+       if (sinfo->stabstr == NULL)
diff --git a/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch
new file mode 100644
index 00000000..25222e5d
--- /dev/null
+++ b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch
@@ -0,0 +1,139 @@
+--- binutils-2.16.91.0.7/bfd/configure
++++ binutils-2.16.91.0.7/bfd/configure
+@@ -3576,7 +3576,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/binutils/configure
++++ binutils-2.16.91.0.7/binutils/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/configure
++++ binutils-2.16.91.0.7/configure
+@@ -1270,7 +1270,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -1578,7 +1578,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[3456789]86-*-vsta) ;; # don't add gprof back in
+       i[3456789]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/configure.in
++++ binutils-2.16.91.0.7/configure.in
+@@ -468,7 +468,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -776,7 +776,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[[3456789]]86-*-vsta) ;; # don't add gprof back in
+       i[[3456789]]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/gas/configure
++++ binutils-2.16.91.0.7/gas/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/gprof/configure
++++ binutils-2.16.91.0.7/gprof/configure
+@@ -3419,6 +3419,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- binutils-2.16.91.0.7/ld/configure
++++ binutils-2.16.91.0.7/ld/configure
+@@ -3413,7 +3413,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/libtool.m4
++++ binutils-2.16.91.0.7/libtool.m4
+@@ -739,7 +739,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/ltconfig
++++ binutils-2.16.91.0.7/ltconfig
+@@ -602,6 +602,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1247,7 +1248,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   version_type=linux
+   need_lib_prefix=no
+   need_version=no
+--- binutils-2.16.91.0.7/opcodes/configure
++++ binutils-2.16.91.0.7/opcodes/configure
+@@ -3579,7 +3579,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
diff --git a/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch
new file mode 100644
index 00000000..be85ceb1
--- /dev/null
+++ b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch
@@ -0,0 +1,24 @@
+diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure
+--- binutils-2.16.91.0.7.orig/configure	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure	2006-05-31 14:55:53.000000000 +0300
+@@ -1299,7 +1299,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
+diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in
+--- binutils-2.16.91.0.7.orig/configure.in	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure.in	2006-05-31 14:55:53.000000000 +0300
+@@ -497,7 +497,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
diff --git a/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch
new file mode 100644
index 00000000..04a7e61e
--- /dev/null
+++ b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch
@@ -0,0 +1,50 @@
+#!/bin/sh -e
+## 001_ld_makefile_patch.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Description: correct where ld scripts are installed
+## DP: Author: Chris Chimelis <chris@debian.org>
+## DP: Upstream status: N/A
+## DP: Date: ??
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+--- binutils-2.16.91.0.1/ld/Makefile.am
++++ binutils-2.16.91.0.1/ld/Makefile.am
+@@ -20,7 +20,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ 
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- binutils-2.16.91.0.1/ld/Makefile.in
++++ binutils-2.16.91.0.1/ld/Makefile.in
+@@ -268,7 +268,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch
new file mode 100644
index 00000000..498651a9
--- /dev/null
+++ b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch
@@ -0,0 +1,47 @@
+#!/bin/sh -e
+## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for
+## DP: cases where -rpath isn't specified. (#151024)
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em
+--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:58.000000000 +0100
++++ binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:59.000000000 +0100
+@@ -692,6 +692,8 @@
+ 	      && command_line.rpath == NULL)
+ 	    {
+ 	      lib_path = (const char *) getenv ("LD_RUN_PATH");
++	      if ((lib_path) && (strlen (lib_path) == 0))
++		  lib_path = NULL;
+ 	      if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
+ 						      force))
+ 		break;
+@@ -871,6 +873,8 @@
+   rpath = command_line.rpath;
+   if (rpath == NULL)
+     rpath = (const char *) getenv ("LD_RUN_PATH");
++  if ((rpath) && (strlen (rpath) == 0))
++      rpath = NULL;
+   if (! (bfd_elf_size_dynamic_sections
+ 	 (output_bfd, command_line.soname, rpath,
+ 	  command_line.filter_shlib,
diff --git a/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch
new file mode 100644
index 00000000..25222e5d
--- /dev/null
+++ b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch
@@ -0,0 +1,139 @@
+--- binutils-2.16.91.0.7/bfd/configure
++++ binutils-2.16.91.0.7/bfd/configure
+@@ -3576,7 +3576,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/binutils/configure
++++ binutils-2.16.91.0.7/binutils/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/configure
++++ binutils-2.16.91.0.7/configure
+@@ -1270,7 +1270,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -1578,7 +1578,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[3456789]86-*-vsta) ;; # don't add gprof back in
+       i[3456789]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/configure.in
++++ binutils-2.16.91.0.7/configure.in
+@@ -468,7 +468,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -776,7 +776,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[[3456789]]86-*-vsta) ;; # don't add gprof back in
+       i[[3456789]]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/gas/configure
++++ binutils-2.16.91.0.7/gas/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/gprof/configure
++++ binutils-2.16.91.0.7/gprof/configure
+@@ -3419,6 +3419,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- binutils-2.16.91.0.7/ld/configure
++++ binutils-2.16.91.0.7/ld/configure
+@@ -3413,7 +3413,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/libtool.m4
++++ binutils-2.16.91.0.7/libtool.m4
+@@ -739,7 +739,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/ltconfig
++++ binutils-2.16.91.0.7/ltconfig
+@@ -602,6 +602,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1247,7 +1248,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   version_type=linux
+   need_lib_prefix=no
+   need_version=no
+--- binutils-2.16.91.0.7/opcodes/configure
++++ binutils-2.16.91.0.7/opcodes/configure
+@@ -3579,7 +3579,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
diff --git a/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch
new file mode 100644
index 00000000..be85ceb1
--- /dev/null
+++ b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch
@@ -0,0 +1,24 @@
+diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure
+--- binutils-2.16.91.0.7.orig/configure	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure	2006-05-31 14:55:53.000000000 +0300
+@@ -1299,7 +1299,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
+diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in
+--- binutils-2.16.91.0.7.orig/configure.in	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure.in	2006-05-31 14:55:53.000000000 +0300
+@@ -497,7 +497,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
diff --git a/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch
new file mode 100644
index 00000000..04a7e61e
--- /dev/null
+++ b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch
@@ -0,0 +1,50 @@
+#!/bin/sh -e
+## 001_ld_makefile_patch.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Description: correct where ld scripts are installed
+## DP: Author: Chris Chimelis <chris@debian.org>
+## DP: Upstream status: N/A
+## DP: Date: ??
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+--- binutils-2.16.91.0.1/ld/Makefile.am
++++ binutils-2.16.91.0.1/ld/Makefile.am
+@@ -20,7 +20,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ 
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- binutils-2.16.91.0.1/ld/Makefile.in
++++ binutils-2.16.91.0.1/ld/Makefile.in
+@@ -268,7 +268,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch
new file mode 100644
index 00000000..498651a9
--- /dev/null
+++ b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch
@@ -0,0 +1,47 @@
+#!/bin/sh -e
+## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for
+## DP: cases where -rpath isn't specified. (#151024)
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em
+--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:58.000000000 +0100
++++ binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:59.000000000 +0100
+@@ -692,6 +692,8 @@
+ 	      && command_line.rpath == NULL)
+ 	    {
+ 	      lib_path = (const char *) getenv ("LD_RUN_PATH");
++	      if ((lib_path) && (strlen (lib_path) == 0))
++		  lib_path = NULL;
+ 	      if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
+ 						      force))
+ 		break;
+@@ -871,6 +873,8 @@
+   rpath = command_line.rpath;
+   if (rpath == NULL)
+     rpath = (const char *) getenv ("LD_RUN_PATH");
++  if ((rpath) && (strlen (rpath) == 0))
++      rpath = NULL;
+   if (! (bfd_elf_size_dynamic_sections
+ 	 (output_bfd, command_line.soname, rpath,
+ 	  command_line.filter_shlib,
diff --git a/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch
new file mode 100644
index 00000000..25222e5d
--- /dev/null
+++ b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch
@@ -0,0 +1,139 @@
+--- binutils-2.16.91.0.7/bfd/configure
++++ binutils-2.16.91.0.7/bfd/configure
+@@ -3576,7 +3576,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/binutils/configure
++++ binutils-2.16.91.0.7/binutils/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/configure
++++ binutils-2.16.91.0.7/configure
+@@ -1270,7 +1270,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -1578,7 +1578,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[3456789]86-*-vsta) ;; # don't add gprof back in
+       i[3456789]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/configure.in
++++ binutils-2.16.91.0.7/configure.in
+@@ -468,7 +468,7 @@
+   am33_2.0-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;
+-  sh-*-linux*)
++  sh*-*-linux*)
+     noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss"
+     ;;    
+   sh*-*-pe|mips*-*-pe|*arm-wince-pe)
+@@ -776,7 +776,7 @@
+   romp-*-*)
+     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}"
+     ;;
+-  sh-*-* | sh64-*-*)
++  sh*-*-* | sh64-*-*)
+     case "${host}" in
+       i[[3456789]]86-*-vsta) ;; # don't add gprof back in
+       i[[3456789]]86-*-go32*) ;; # don't add gprof back in
+--- binutils-2.16.91.0.7/gas/configure
++++ binutils-2.16.91.0.7/gas/configure
+@@ -3411,7 +3411,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/gprof/configure
++++ binutils-2.16.91.0.7/gprof/configure
+@@ -3419,6 +3419,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- binutils-2.16.91.0.7/ld/configure
++++ binutils-2.16.91.0.7/ld/configure
+@@ -3413,7 +3413,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/libtool.m4
++++ binutils-2.16.91.0.7/libtool.m4
+@@ -739,7 +739,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
+--- binutils-2.16.91.0.7/ltconfig
++++ binutils-2.16.91.0.7/ltconfig
+@@ -602,6 +602,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1247,7 +1248,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   version_type=linux
+   need_lib_prefix=no
+   need_version=no
+--- binutils-2.16.91.0.7/opcodes/configure
++++ binutils-2.16.91.0.7/opcodes/configure
+@@ -3579,7 +3579,7 @@
+   ;;
+ 
+ # This must be Linux ELF.
+-linux-gnu*)
++linux-gnu*|linux-uclibc*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
diff --git a/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch
new file mode 100644
index 00000000..be85ceb1
--- /dev/null
+++ b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch
@@ -0,0 +1,24 @@
+diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure
+--- binutils-2.16.91.0.7.orig/configure	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure	2006-05-31 14:55:53.000000000 +0300
+@@ -1299,7 +1299,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
+diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in
+--- binutils-2.16.91.0.7.orig/configure.in	2006-05-31 14:54:24.000000000 +0300
++++ binutils-2.16.91.0.7/configure.in	2006-05-31 14:55:53.000000000 +0300
+@@ -497,7 +497,7 @@
+   arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* )
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     ;;
+-  arm*-*-linux-gnueabi)
++  arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
+     noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+     ;;
diff --git a/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch
new file mode 100644
index 00000000..04a7e61e
--- /dev/null
+++ b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch
@@ -0,0 +1,50 @@
+#!/bin/sh -e
+## 001_ld_makefile_patch.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Description: correct where ld scripts are installed
+## DP: Author: Chris Chimelis <chris@debian.org>
+## DP: Upstream status: N/A
+## DP: Date: ??
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+--- binutils-2.16.91.0.1/ld/Makefile.am
++++ binutils-2.16.91.0.1/ld/Makefile.am
+@@ -20,7 +20,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ 
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- binutils-2.16.91.0.1/ld/Makefile.in
++++ binutils-2.16.91.0.1/ld/Makefile.in
+@@ -268,7 +268,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch
new file mode 100644
index 00000000..498651a9
--- /dev/null
+++ b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch
@@ -0,0 +1,47 @@
+#!/bin/sh -e
+## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for
+## DP: cases where -rpath isn't specified. (#151024)
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em
+--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:58.000000000 +0100
++++ binutils-2.15/ld/emultempl/elf32.em	2004-05-21 23:12:59.000000000 +0100
+@@ -692,6 +692,8 @@
+ 	      && command_line.rpath == NULL)
+ 	    {
+ 	      lib_path = (const char *) getenv ("LD_RUN_PATH");
++	      if ((lib_path) && (strlen (lib_path) == 0))
++		  lib_path = NULL;
+ 	      if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
+ 						      force))
+ 		break;
+@@ -871,6 +873,8 @@
+   rpath = command_line.rpath;
+   if (rpath == NULL)
+     rpath = (const char *) getenv ("LD_RUN_PATH");
++  if ((rpath) && (strlen (rpath) == 0))
++      rpath = NULL;
+   if (! (bfd_elf_size_dynamic_sections
+ 	 (output_bfd, command_line.soname, rpath,
+ 	  command_line.filter_shlib,
diff --git a/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch
new file mode 100644
index 00000000..d3124031
--- /dev/null
+++ b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch
@@ -0,0 +1,40 @@
+Message-ID: <4269173F.7020705@zee2.com>
+Date: Fri, 22 Apr 2005 16:24:47 +0100
+From: Steve Papacharalambous <stevep@zee2.com>
+To: "Robert P. J. Day" <rpjday@mindspring.com>
+CC: crossgcc list <crossgcc@sources.redhat.com>
+Subject: Re: cygwin source directory has moved
+In-Reply-To: <Pine.LNX.4.61.0504181746050.11794@localhost.localdomain>
+
+Hi Robert,
+
+I've attached two patches:
+
+1/  For crosstool-0.31 which changes the CYGWIN_URL to one which has the
+cygwin source archives.  The version of cygwin that is used to build the
+cross toolchain has been changed to cygwin-1.5.15-1-src.tar.bz2 since
+most of the mirror sites don't seem to have the original archive used.
+[created gcc-3.3.2-cygwin-1.5.15-1.dat - dank]
+
+
+2/ The later cygwin source archive fails to cross build with the error:
+/opt/crosstool/i686-pc-cygwin/gcc-3.3.2-cygwin-1.5.15-1/lib/gcc-lib/i686-pc-cygwin/bin/ld:
+cannot find -luser32
+
+unless the second patch is applied,
+
+
+diff -uNr cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in cygwin-1.5.15-1/winsup/mingw/Makefile.in
+--- cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in	2005-02-28 22:51:02.000000000 +0000
++++ cygwin-1.5.15-1/winsup/mingw/Makefile.in	2005-04-22 15:29:18.000000000 +0100
+@@ -71,7 +71,7 @@
+ mkinstalldirs = $(SHELL) @MKINSTALLDIRS@
+ 
+ CC := @CC@
+-override CC := ${filter-out -L% -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\)  *[^ ]*\( \|$$\)% %g'}}
++override CC := ${filter-out -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\)  *[^ ]*\( \|$$\)% %g'}}
+ # FIXME: Which is it, CC or CC_FOR_TARGET?
+ CC_FOR_TARGET = $(CC)
+ AS_FOR_TARGET = $(AS)
+
+
diff --git a/patches/gcc/2.95.3/arm-linux.patch b/patches/gcc/2.95.3/arm-linux.patch
new file mode 100644
index 00000000..00974f6e
--- /dev/null
+++ b/patches/gcc/2.95.3/arm-linux.patch
@@ -0,0 +1,647 @@
+--------- snip -------
+Downloaded from ftp://ftp.linux.org.uk/pub/armlinux/toolchain/src-2.95.3/gcc-2.95.3.diff.bz2
+Not sure what it fixes, but this appears to be The Patch used with gcc-2.95.3 on arm.
+--------- snip -------
+
+diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.c gcc-2.95.3/gcc/config/arm/arm.c
+--- gcc-2.95.3-orig/gcc/config/arm/arm.c	Thu Jan 25 15:03:24 2001
++++ gcc-2.95.3/gcc/config/arm/arm.c	Fri Jul 20 19:39:11 2001
+@@ -1529,27 +1529,34 @@
+       return gen_rtx_PLUS (Pmode, base, offset);
+     }
+   else if (GET_CODE (orig) == LABEL_REF)
+-    current_function_uses_pic_offset_table = 1;
+-
+-  return orig;
+-}
++    {
++      current_function_uses_pic_offset_table = 1;
+ 
+-static rtx pic_rtx;
++      if (NEED_PLT_GOT)
++	{
++	  rtx pic_ref, address = gen_reg_rtx (Pmode);
++	  
++	  emit_insn (gen_pic_load_addr (address, orig));
++	  pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
++				  address);
++	  emit_move_insn (address, pic_ref);
++	  return address;
++	}
++    }
+ 
+-int
+-is_pic(x)
+-     rtx x;
+-{
+-  if (x == pic_rtx)
+-    return 1;
+-  return 0;
++  return orig;
+ }
+ 
++/* Generate code to load the PIC register.  PROLOGUE is true if
++   called from arm_expand_prologue (in which case we want the 
++   generated insns at the start of the function);  false if called
++   by an exception receiver that needs the PIC register reloaded
++   (in which case the insns are just dumped at the current location).  */
+ void
+-arm_finalize_pic ()
++arm_finalize_pic (int prologue)
+ {
+ #ifndef AOF_ASSEMBLER
+-  rtx l1, pic_tmp, pic_tmp2, seq;
++  rtx l1, pic_tmp, pic_tmp2, seq, pic_rtx;
+   rtx global_offset_table;
+ 
+   if (current_function_uses_pic_offset_table == 0)
+@@ -1578,7 +1585,10 @@
+ 
+   seq = gen_sequence ();
+   end_sequence ();
+-  emit_insn_after (seq, get_insns ());
++  if (prologue)
++    emit_insn_after (seq, get_insns ());
++  else
++    emit_insn (seq);
+ 
+   /* Need to emit this whether or not we obey regdecls,
+      since setjmp/longjmp can cause life info to screw up.  */
+@@ -5327,7 +5337,13 @@
+   if (frame_pointer_needed)
+     live_regs += 4;
+ 
+-  if (live_regs)
++  if (live_regs == 1 && regs_ever_live[LR_REGNUM]
++      && ! lr_save_eliminated && ! really_return)
++    {
++      output_asm_insn (reverse ? "ldr%?%D0\t%|lr, [%|sp}, #4"
++      		       : "ldr%?%d0\t%|lr, [%|sp], #4", &operand);
++    }
++  else if (live_regs)
+     {
+       if (lr_save_eliminated || ! regs_ever_live[14])
+         live_regs++;
+@@ -5446,7 +5462,7 @@
+   rtx           x;
+ 
+   length = strlen (name);
+-  alignlength = (length + 1) + 3 & ~3;
++  alignlength = ((length + 1) + 3) & ~3;
+   
+   ASM_OUTPUT_ASCII (stream, name, length + 1);
+   ASM_OUTPUT_ALIGN (stream, 2);
+@@ -5838,6 +5854,9 @@
+   int store_arg_regs = 0;
+   int volatile_func = (optimize > 0
+ 		       && TREE_THIS_VOLATILE (current_function_decl));
++  rtx ip_rtx;
++  int fp_offset = 0;
++  rtx insn;
+ 
+   /* Naked functions don't have prologues.  */
+   if (arm_naked_function_p (current_function_decl))
+@@ -5859,11 +5878,59 @@
+ 	live_regs_mask |= 0x4000;
+     }
+ 
++  ip_rtx = gen_rtx_REG (SImode, IP_REGNUM);
++
+   if (frame_pointer_needed)
+     {
++      if (current_function_needs_context)
++	{
++	  /* The Static chain register is the same as the IP register
++	     used as a scratch register during stack frame creation.
++	     To get around this need to find somewhere to store IP
++	     whilst the frame is being created.  We try the following
++	     places in order:
++	     
++	       1. An unused argument register.
++	       2. A slot on the stack above the frame.  (This only
++	          works if the function is not a varargs function).
++		  
++	     If neither of these places is available, we abort (for now).  */
++	  if (regs_ever_live[3] == 0)
++	    {
++	      insn = gen_rtx_REG (SImode, 3);
++	      insn = gen_rtx_SET (SImode, insn, ip_rtx);
++	      insn = emit_insn (insn);
++	      RTX_FRAME_RELATED_P (insn) = 1;	  
++	    }
++	  else if (current_function_pretend_args_size == 0)
++	    {
++	      insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
++	      insn = gen_rtx_MEM (SImode, insn);
++	      insn = gen_rtx_SET (VOIDmode, insn, ip_rtx);
++	      insn = emit_insn (insn);
++	      RTX_FRAME_RELATED_P (insn) = 1;
++	      fp_offset = 4;
++	    }
++	  else
++	    /* FIXME - the way to handle this situation is to allow
++	       the pretend args to be dumped onto the stack, then
++	       reuse r3 to save IP.  This would involve moving the
++	       copying os SP into IP until after the pretend args
++	       have been dumped, but this is not too hard.  */
++	    error ("Unable to find a temporary location for static chanin register");
++	}
++
+       live_regs_mask |= 0xD800;
+-      emit_insn (gen_movsi (gen_rtx_REG (SImode, 12),
+-			    stack_pointer_rtx));
++      if (fp_offset)
++	{
++	  insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset));
++	  insn = gen_rtx_SET  (SImode, ip_rtx, insn);
++	}
++      else
++	insn = gen_movsi (ip_rtx, stack_pointer_rtx);
++      
++       insn = emit_insn (insn);
++       RTX_FRAME_RELATED_P (insn) = 1;
+     }
+ 
+   if (current_function_pretend_args_size)
+@@ -5927,9 +5994,31 @@
+     }
+ 
+   if (frame_pointer_needed)
+-    emit_insn (gen_addsi3 (hard_frame_pointer_rtx, gen_rtx_REG (SImode, 12),
+-			   (GEN_INT
+-			    (-(4 + current_function_pretend_args_size)))));
++    {
++      insn = GEN_INT (-(4 + current_function_pretend_args_size + fp_offset));
++      insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, ip_rtx, insn));
++      RTX_FRAME_RELATED_P (insn) = 1;
++      
++      if (current_function_needs_context)
++	{
++	  /* Recover the static chain register.  */
++	  if (regs_ever_live [3] == 0)
++	    {
++	      insn = gen_rtx_REG (SImode, 3);
++	      insn = gen_rtx_SET (SImode, ip_rtx, insn);
++	      insn = emit_insn (insn);
++	      RTX_FRAME_RELATED_P (insn) = 1;	  
++	    }
++	  else /* if (current_function_pretend_args_size == 0) */
++	    {
++	      insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx, GEN_INT (4));
++	      insn = gen_rtx_MEM (SImode, insn);
++	      insn = gen_rtx_SET (SImode, ip_rtx, insn);
++	      insn = emit_insn (insn);
++	      RTX_FRAME_RELATED_P (insn) = 1;	  
++	    }
++	}
++    }
+ 
+   if (amount != const0_rtx)
+     {
+diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.h gcc-2.95.3/gcc/config/arm/arm.h
+--- gcc-2.95.3-orig/gcc/config/arm/arm.h	Thu Jan 25 15:03:26 2001
++++ gcc-2.95.3/gcc/config/arm/arm.h	Fri Jul 20 19:39:11 2001
+@@ -601,14 +601,20 @@
+   (TREE_CODE (EXP) == STRING_CST        \
+    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
+ 
++#ifndef STRUCTURE_SIZE_BOUNDARY
+ /* Every structures size must be a multiple of 32 bits.  */
+ /* This is for compatibility with ARMCC.  ARM SDT Reference Manual
+    (ARM DUI 0020D) page 2-20 says "Structures are aligned on word
+    boundaries".  */
+-#ifndef STRUCTURE_SIZE_BOUNDARY
+-#define STRUCTURE_SIZE_BOUNDARY 32
++/* Setting this to 32 produces more efficient code, but the value set in previous
++   versions of this toolchain was 8, which produces more compact structures. The
++   command line option -mstructure_size_boundary=<n> can be used to change this
++   value.  */
++#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
+ #endif
+ 
++extern int arm_structure_size_boundary;
++
+ /* Used when parsing command line option -mstructure_size_boundary.  */
+ extern const char * structure_size_string;
+ 
+@@ -768,6 +774,9 @@
+ /* Specify the registers used for certain standard purposes.
+    The values of these macros are register numbers.  */
+ 
++/* Register which holds return address from a subroutine call.  */
++#define LR_REGNUM		14
++
+ /* Define this if the program counter is overloaded on a register.  */
+ #define PC_REGNUM		15
+ 
+@@ -777,6 +786,9 @@
+ /* Base register for access to local variables of the function.  */
+ #define FRAME_POINTER_REGNUM	25
+ 
++/* Scratch register - used in all kinds of places, eg trampolines.  */
++#define IP_REGNUM		12
++
+ /* Define this to be where the real frame pointer is if it is not possible to
+    work out the offset between the frame pointer and the automatic variables
+    until after register allocation has taken place.  FRAME_POINTER_REGNUM
+@@ -798,7 +810,7 @@
+ /* The native (Norcroft) Pascal compiler for the ARM passes the static chain
+    as an invisible last argument (possible since varargs don't exist in
+    Pascal), so the following is not true.  */
+-#define STATIC_CHAIN_REGNUM	8
++#define STATIC_CHAIN_REGNUM	12
+ 
+ /* Register in which address to store a structure value
+    is passed to a function.  */
+@@ -1248,7 +1260,12 @@
+ {									\
+   int volatile_func = arm_volatile_func ();				\
+   if ((FROM) == ARG_POINTER_REGNUM && (TO) == HARD_FRAME_POINTER_REGNUM)\
+-    (OFFSET) = 0;							\
++    {                                                                   \
++      if (! current_function_needs_context || ! frame_pointer_needed)   \
++        (OFFSET) = 0;                                                   \
++      else                                                              \
++        (OFFSET) = 4;                                                   \
++    }                                                                   \
+   else if ((FROM) == FRAME_POINTER_REGNUM				\
+ 	   && (TO) == STACK_POINTER_REGNUM)				\
+     (OFFSET) = (current_function_outgoing_args_size			\
+@@ -1379,8 +1396,10 @@
+ 
+    On the ARM, allow any integer (invalid ones are removed later by insn
+    patterns), nice doubles and symbol_refs which refer to the function's
+-   constant pool XXX.  */
+-#define LEGITIMATE_CONSTANT_P(X)	(! label_mentioned_p (X))
++   constant pool XXX.
++
++   When generating PIC code, allow anything.  */
++#define LEGITIMATE_CONSTANT_P(X)	(flag_pic || ! label_mentioned_p (X))
+ 
+ /* Symbols in the text segment can be accessed without indirecting via the
+    constant pool; it may take an extra binary operation, but this is still
+@@ -1496,9 +1515,8 @@
+ 	      && INTVAL (op) <= 31)					\
+ 	    goto LABEL;							\
+         }								\
+-      /* NASTY: Since this limits the addressing of unsigned byte loads */      \
+       range = ((MODE) == HImode || (MODE) == QImode)                    \
+-              ? (arm_arch4 ? 256 : 4095) : 4096;                        \
++              ? (((MODE) == HImode && arm_arch4) ? 256 : 4095) : 4096;  \
+       if (code == CONST_INT && INTVAL (INDEX) < range			\
+ 	  && INTVAL (INDEX) > -range)  	      				\
+         goto LABEL;							\
+@@ -1812,14 +1830,15 @@
+    data addresses in memory.  */
+ #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
+ 
+-#define FINALIZE_PIC arm_finalize_pic ()
++#define FINALIZE_PIC arm_finalize_pic (1)
+ 
+-/* We can't directly access anything that contains a symbol,
++/* We can't directly access anything that contains a symbol or label,
+    nor can we indirect via the constant pool.  */
+ #define LEGITIMATE_PIC_OPERAND_P(X)				\
+-	(! symbol_mentioned_p (X)				\
++	(! symbol_mentioned_p (X) && ! label_mentioned_p (X)	\
+ 	 && (! CONSTANT_POOL_ADDRESS_P (X)			\
+-	     || ! symbol_mentioned_p (get_pool_constant (X))))
++	     || (! symbol_mentioned_p (get_pool_constant (X)))  \
++		&& (! label_mentioned_p (get_pool_constant (X)))))
+  
+ /* We need to know when we are making a constant pool; this determines
+    whether data needs to be in the GOT or can be referenced via a GOT
+@@ -2046,17 +2065,9 @@
+   else output_addr_const(STREAM, X);					\
+ }
+ 
+-/* Handles PIC addr specially */
+ #define OUTPUT_INT_ADDR_CONST(STREAM,X) \
+   {									\
+-    if (flag_pic && GET_CODE(X) == CONST && is_pic(X))			\
+-      {									\
+-	output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0));	\
+-	fputs(" - (", STREAM);						\
+-	output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0));	\
+-	fputs(")", STREAM);						\
+-      }									\
+-    else output_addr_const(STREAM, X);					\
++    output_addr_const(STREAM, X);					\
+ 									\
+     /* Mark symbols as position independent.  We only do this in the	\
+       .text segment, not in the .data segment. */			\
+@@ -2170,8 +2181,7 @@
+ int    arm_return_in_memory PROTO ((Tree));
+ int    legitimate_pic_operand_p PROTO ((Rtx));
+ Rtx    legitimize_pic_address PROTO ((Rtx, Mmode, Rtx));
+-int    is_pic PROTO ((Rtx));
+-void   arm_finalize_pic PROTO ((void));
++void   arm_finalize_pic PROTO ((int));
+ int    arm_rtx_costs RTX_CODE_PROTO ((Rtx, Rcode));
+ int    arm_adjust_cost PROTO ((Rtx, Rtx, Rtx, int));
+ int    const_double_rtx_ok_for_fpu PROTO ((Rtx));
+diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.md gcc-2.95.3/gcc/config/arm/arm.md
+--- gcc-2.95.3-orig/gcc/config/arm/arm.md	Thu Jan 25 15:03:27 2001
++++ gcc-2.95.3/gcc/config/arm/arm.md	Fri Jul 20 19:39:11 2001
+@@ -2629,7 +2629,8 @@
+ 			   : preserve_subexpressions_p ()));
+       DONE;
+     }
+-  if (CONSTANT_P (operands[1]) && flag_pic)
++  if ((CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1])
++        || label_mentioned_p (operands[1])) && flag_pic)
+     operands[1] = legitimize_pic_address (operands[1], SImode,
+ 					  ((reload_in_progress
+ 					    || reload_completed)
+@@ -2721,6 +2722,15 @@
+   return \"add%?\\t%0, %|pc, %0\";
+ ")
+ 
++(define_expand "builtin_setjmp_receiver"
++  [(label_ref (match_operand 0 "" ""))]
++  "flag_pic"
++  "
++{
++  arm_finalize_pic (0);
++  DONE;
++}")
++
+ ;; If copying one reg to another we can set the condition codes according to
+ ;; its value.  Such a move is common after a return from subroutine and the
+ ;; result is being tested against zero.
+@@ -6184,15 +6194,20 @@
+ 	abort ();
+       return \"\";
+     }
+-  strcpy (pattern, \"stmfd\\t%m0!, {%1\");
+-  for (i = 1; i < XVECLEN (operands[2], 0); i++)
++  if (XVECLEN (operands[2], 0) > 1)
+     {
+-      strcat (pattern, \", %|\");
+-      strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i),
++      strcpy (pattern, \"stmfd\\t%m0!, {%1\");
++      for (i = 1; i < XVECLEN (operands[2], 0); i++)
++        {
++           strcat (pattern, \", %|\");
++           strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i),
+ 					      0))]);
++        }
++      strcat (pattern, \"}\");
++      output_asm_insn (pattern, operands);
+     }
+-  strcat (pattern, \"}\");
+-  output_asm_insn (pattern, operands);
++  else
++    output_asm_insn (\"str\\t%1, [%m0, #-4]!\", operands);
+   return \"\";
+ }"
+ [(set_attr "type" "store4")])
+diff -urN gcc-2.95.3-orig/gcc/config/arm/elf.h gcc-2.95.3/gcc/config/arm/elf.h
+--- gcc-2.95.3-orig/gcc/config/arm/elf.h	Mon May 31 10:21:53 1999
++++ gcc-2.95.3/gcc/config/arm/elf.h	Fri Jul 20 19:39:11 2001
+@@ -167,15 +167,6 @@
+ #define MULTILIB_DEFAULTS { "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
+ #endif
+ 
+-/* Setting this to 32 produces more efficient code, but the value set in previous
+-   versions of this toolchain was 8, which produces more compact structures. The
+-   command line option -mstructure_size_boundary=<n> can be used to change this
+-   value.  */
+-#undef  STRUCTURE_SIZE_BOUNDARY
+-#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
+-
+-extern int arm_structure_size_boundary;
+-
+ /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
+    is a valid machine specific attribute for DECL.
+    The attributes in ATTRIBUTES have previously been assigned to DECL.  */
+diff -urN gcc-2.95.3-orig/gcc/config/arm/linux-gas.h gcc-2.95.3/gcc/config/arm/linux-gas.h
+--- gcc-2.95.3-orig/gcc/config/arm/linux-gas.h	Mon Feb 22 17:47:57 1999
++++ gcc-2.95.3/gcc/config/arm/linux-gas.h	Fri Jul 20 19:39:11 2001
+@@ -1,6 +1,6 @@
+ /* Definitions of target machine for GNU compiler.
+    ARM Linux-based GNU systems version.
+-   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+    Contributed by Russell King  <rmk92@ecs.soton.ac.uk>.
+ 
+ This file is part of GNU CC.
+@@ -79,5 +79,7 @@
+   register unsigned long _beg __asm ("a1") = (unsigned long) (BEG);	\
+   register unsigned long _end __asm ("a2") = (unsigned long) (END);	\
+   register unsigned long _flg __asm ("a3") = 0;				\
+-  __asm __volatile ("swi 0x9f0002");					\
++  __asm __volatile ("swi 0x9f0002		@ sys_cacheflush"	\
++		    : "=r" (_beg)					\
++		    : "0" (_beg), "r" (_end), "r" (_flg));		\
+ }
+diff -urN gcc-2.95.3-orig/gcc/config/arm/t-linux gcc-2.95.3/gcc/config/arm/t-linux
+--- gcc-2.95.3-orig/gcc/config/arm/t-linux	Fri Mar 26 16:30:20 1999
++++ gcc-2.95.3/gcc/config/arm/t-linux	Fri Jul 20 20:46:19 2001
+@@ -1,6 +1,6 @@
+ # Just for these, we omit the frame pointer since it makes such a big
+ # difference.  It is then pointless adding debugging.
+-TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC
++TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC 
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ # Don't build enquire
+diff -urN gcc-2.95.3-orig/gcc/final.c gcc-2.95.3/gcc/final.c
+--- gcc-2.95.3-orig/gcc/final.c	Mon Mar 12 13:07:59 2001
++++ gcc-2.95.3/gcc/final.c	Fri Jul 20 19:39:11 2001
+@@ -3652,8 +3652,9 @@
+ 
+       output_addr_const (file, XEXP (x, 0));
+       fprintf (file, "-");
+-      if (GET_CODE (XEXP (x, 1)) == CONST_INT
+-	  && INTVAL (XEXP (x, 1)) < 0)
++      if ((GET_CODE (XEXP (x, 1)) == CONST_INT
++	   && INTVAL (XEXP (x, 1)) < 0)
++	  || GET_CODE (XEXP (x, 1)) != CONST_INT)
+ 	{
+ 	  fprintf (file, ASM_OPEN_PAREN);
+ 	  output_addr_const (file, XEXP (x, 1));
+diff -urN gcc-2.95.3-orig/gcc/function.c gcc-2.95.3/gcc/function.c
+--- gcc-2.95.3-orig/gcc/function.c	Thu Jan 25 15:03:15 2001
++++ gcc-2.95.3/gcc/function.c	Fri Jul 20 19:39:10 2001
+@@ -3053,6 +3053,105 @@
+    extracted by usage MEM with narrower mode. */
+ static rtx purge_addressof_replacements;
+ 
++/* Return 1 if X and Y are identical-looking rtx's.
++   This is the Lisp function EQUAL for rtx arguments.  */
++
++int
++rtx_equal_for_addressof_p (x, y)
++     rtx x, y;
++{
++  register int i;
++  register int j;
++  register enum rtx_code code;
++  register char *fmt;
++
++  if (x == y)
++    return 1;
++  if (x == 0 || y == 0)
++    return 0;
++
++  code = GET_CODE (x);
++  /* Rtx's of different codes cannot be equal.  */
++  if (code != GET_CODE (y))
++    return 0;
++
++  /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
++     (REG:SI x) and (REG:HI x) are NOT equivalent. 
++     But (MEM:SI x) and (MEM:HI x) are equivalent for our purposes.  */
++
++  if (code != MEM && (GET_MODE (x) != GET_MODE (y)))
++    return 0;
++
++  /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
++
++  if (code == REG)
++    return REGNO (x) == REGNO (y);
++  else if (code == LABEL_REF)
++    return XEXP (x, 0) == XEXP (y, 0);
++  else if (code == SYMBOL_REF)
++    return XSTR (x, 0) == XSTR (y, 0);
++  else if (code == SCRATCH || code == CONST_DOUBLE)
++    return 0;
++
++  /* Compare the elements.  If any pair of corresponding elements
++     fail to match, return 0 for the whole things.  */
++
++  fmt = GET_RTX_FORMAT (code);
++  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
++    {
++      switch (fmt[i])
++	{
++	case 'w':
++	  if (XWINT (x, i) != XWINT (y, i))
++	    return 0;
++	  break;
++
++	case 'n':
++	case 'i':
++	  if (XINT (x, i) != XINT (y, i))
++	    return 0;
++	  break;
++
++	case 'V':
++	case 'E':
++	  /* Two vectors must have the same length.  */
++	  if (XVECLEN (x, i) != XVECLEN (y, i))
++	    return 0;
++
++	  /* And the corresponding elements must match.  */
++	  for (j = 0; j < XVECLEN (x, i); j++)
++	    if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
++	      return 0;
++	  break;
++
++	case 'e':
++	  if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
++	    return 0;
++	  break;
++
++	case 'S':
++	case 's':
++	  if (strcmp (XSTR (x, i), XSTR (y, i)))
++	    return 0;
++	  break;
++
++	case 'u':
++	  /* These are just backpointers, so they don't matter.  */
++	  break;
++
++	case '0':
++	  break;
++
++	  /* It is believed that rtx's at this level will never
++	     contain anything but integers and other rtx's,
++	     except for within LABEL_REFs and SYMBOL_REFs.  */
++	default:
++	  abort ();
++	}
++    }
++  return 1;
++}
++
+ /* Helper function for purge_addressof.  See if the rtx expression at *LOC
+    in INSN needs to be changed.  If FORCE, always put any ADDRESSOFs into
+    the stack.  */
+@@ -3133,7 +3232,7 @@
+ 	      for (tem = purge_bitfield_addressof_replacements;
+ 		   tem != NULL_RTX;
+ 		   tem = XEXP (XEXP (tem, 1), 1))
+-		if (rtx_equal_p (x, XEXP (tem, 0)))
++		if (rtx_equal_for_addressof_p (x, XEXP (tem, 0)))
+ 		  {
+ 		    *loc = XEXP (XEXP (tem, 1), 0);
+ 		    return;
+@@ -3143,7 +3242,7 @@
+ 	      for (tem = purge_addressof_replacements;
+ 		   tem != NULL_RTX;
+ 		   tem = XEXP (XEXP (tem, 1), 1))
+-		if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0)))
++		if (rtx_equal_for_addressof_p (XEXP (x, 0), XEXP (tem, 0)))
+ 		  {
+ 		    rtx z = XEXP (XEXP (tem, 1), 0);
+ 
+diff -urN gcc-2.95.3-orig/gcc/jump.c gcc-2.95.3/gcc/jump.c
+--- gcc-2.95.3-orig/gcc/jump.c	Thu Oct 21 08:24:03 1999
++++ gcc-2.95.3/gcc/jump.c	Fri Jul 20 19:39:10 2001
+@@ -115,7 +115,7 @@
+ static rtx delete_unreferenced_labels	PROTO((rtx));
+ static void delete_noop_moves		PROTO((rtx));
+ static int calculate_can_reach_end	PROTO((rtx, int, int));
+-static int duplicate_loop_exit_test	PROTO((rtx));
++static int duplicate_loop_exit_test	PROTO((rtx, int));
+ static void find_cross_jump		PROTO((rtx, rtx, int, rtx *, rtx *));
+ static void do_cross_jump		PROTO((rtx, rtx, rtx));
+ static int jump_back_p			PROTO((rtx, rtx));
+@@ -338,7 +338,7 @@
+ 	      && simplejump_p (temp1))
+ 	    {
+ 	      temp = PREV_INSN (insn);
+-	      if (duplicate_loop_exit_test (insn))
++	      if (duplicate_loop_exit_test (insn, after_regscan))
+ 		{
+ 		  changed = 1;
+ 		  next = NEXT_INSN (temp);
+@@ -2548,8 +2548,9 @@
+    values of regno_first_uid and regno_last_uid.  */
+ 
+ static int
+-duplicate_loop_exit_test (loop_start)
++duplicate_loop_exit_test (loop_start, after_regscan)
+      rtx loop_start;
++     int after_regscan;
+ {
+   rtx insn, set, reg, p, link;
+   rtx copy = 0, first_copy = 0;
+@@ -2662,6 +2663,9 @@
+ 	    reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg));
+ 	  }
+       }
++
++  if (after_regscan)
++    reg_scan_update (exitcode, lastexit, max_reg);
+ 
+   /* Now copy each insn.  */
+   for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
+diff -urN gcc-2.95.3-orig/gcc/varasm.c gcc-2.95.3/gcc/varasm.c
+--- gcc-2.95.3-orig/gcc/varasm.c	Mon Feb 19 15:02:02 2001
++++ gcc-2.95.3/gcc/varasm.c	Fri Jul 20 19:39:11 2001
+@@ -3286,7 +3286,10 @@
+ 	  value->un.addr.offset = - INTVAL (XEXP (x, 1));
+ 	}
+       else
+-	abort ();
++	{
++	  value->un.addr.base = x;
++	  value->un.addr.offset = 0;
++	}
+       break;
+ 
+     default:
diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.4.patch b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch
new file mode 100644
index 00000000..141de0c7
--- /dev/null
+++ b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch
@@ -0,0 +1,35 @@
+# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.3&r2=1.4
+# Should fix error
+#   Configuration powerpc-host_apple-darwin7.3.0 not supported
+# when configuring gcc-2.95 on Mac OS X for i686 target
+# Also create xm-darwin.h, seems to be required, else we get the error
+#   In file included from .../gcc-2.95.3/gcc/gencheck.c:21:
+#   hconfig.h:11:30: rs6000/xm-darwin.h: No such file or directory
+#   make[1]: *** [gencheck.o] Error 1
+
+
+--- gcc-2.95.3/gcc/configure.old	2004-03-24 12:17:44.000000000 -0800
++++ gcc-2.95.3/gcc/configure	2004-03-24 17:14:38.000000000 -0800
+@@ -5079,6 +5079,10 @@
+ 		tmake_file=rs6000/t-beos
+ 		xmake_file=rs6000/x-beos
+ 		;;
++	powerpc-*-darwin*)
++		xm_file="rs6000/xm-rs6000.h rs6000/xm-darwin.h"
++		xmake_file=rs6000/x-darwin
++		;;
+ 	powerpc-*-sysv* | powerpc-*-elf*)
+ 		tm_file=rs6000/sysv4.h
+ 		xm_file="xm-siglist.h rs6000/xm-sysv4.h"
+--- /dev/null	2003-01-30 02:24:37.000000000 -0800
++++ gcc-3.0.4/gcc/config/rs6000/xm-darwin.h	2000-11-20 19:02:09.000000000 -0800
+@@ -0,0 +1,9 @@
++/* Undo the USG definition in xm-rs6000.h, Darwin is a BSD flavor.  */
++
++#undef USG
++
++/* Override the usual setting, since Apple's GCC has lame bugs and
++   can't handle the initializers.  Someday the bugs will be fixed and
++   we can get rid of this silliness.  */
++
++#define HAVE_DESIGNATED_INITIALIZERS 0
diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.92.patch b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch
new file mode 100644
index 00000000..fc55681d
--- /dev/null
+++ b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch
@@ -0,0 +1,39 @@
+# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.91&r2=1.92
+# Should fix error
+#   Configuration x86_64-host_unknown-linux-gnu not supported
+# when configuring gcc-2.95 on x86_64 build for i686 target
+# It's a bit silly, since tm_file refers to files that don't exist,
+# but as long as x86_64 is just the build machine, that doesn't matter.
+
+--- gcc-2.95.3/gcc/configure.old	2004-03-24 12:17:44.000000000 -0800
++++ gcc-2.95.3/gcc/configure	2004-03-24 12:19:30.000000000 -0800
+@@ -2929,6 +2929,9 @@
+ 	i[34567]86-*-*)
+ 		cpu_type=i386
+ 		;;
++	x86_64-*-*)
++		cpu_type=i386
++		;;
+ 	hppa*-*-*)
+ 		cpu_type=pa
+ 		;;
+@@ -3643,6 +3646,19 @@
+  			thread_file='posix'
+  		fi
+ 		;;
++	x86_64-*-linux*)
++		xmake_file=x-linux
++		tm_file="i386/biarch64.h i386/i386.h i386/att.h linux.h i386/x86-64.h \
++			 i386/linux64.h"
++		tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff"
++		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++		gnu_ld=yes
++		float_format=i386
++		if test x$enable_threads = xyes; then
++			thread_file='posix'
++		fi
++		;;
++
+ 	i[34567]86-*-gnu*)
+ 		float_format=i386
+ 		;;
diff --git a/patches/gcc/2.95.3/config.sub.patch b/patches/gcc/2.95.3/config.sub.patch
new file mode 100644
index 00000000..c8189b59
--- /dev/null
+++ b/patches/gcc/2.95.3/config.sub.patch
@@ -0,0 +1,1257 @@
+# Backport from gcc-3.3.3
+# Fixes errors like
+#   Invalid configuration `x86_64-host_unknown-linux-gnu': machine `x86_64-host_unknown' not recognized
+#   Unrecognized host system name x86_64-host_unknown-linux-gnu.
+# when configuring on chip types or operating systems like x86_64 or Darwin
+# which are newer than gcc-2.95
+
+--- gcc-2.95.3/config.sub.old	1999-08-04 01:09:26.000000000 -0700
++++ gcc-2.95.3/config.sub	2004-03-24 11:28:24.000000000 -0800
+@@ -1,6 +1,10 @@
+ #! /bin/sh
+-# Configuration validation subroutine script, version 1.1.
+-#   Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
++# Configuration validation subroutine script.
++#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
++#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++
++timestamp='2003-01-28'
++
+ # This file is (in principle) common to ALL GNU software.
+ # The presence of a machine in this file suggests that SOME GNU software
+ # can handle that machine.  It does not imply ALL GNU software can.
+@@ -25,6 +29,9 @@
+ # configuration script generated by Autoconf, you may include it under
+ # the same distribution terms that you use for the rest of that program.
+ 
++# Please send patches to <config-patches@gnu.org>.  Submit a context
++# diff and a properly formatted ChangeLog entry.
++#
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+ # If it is invalid, we print an error message on stderr and exit with code 1.
+@@ -45,30 +52,73 @@
+ #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+ # It is wrong to echo any other type of specification.
+ 
+-if [ x$1 = x ]
+-then
+-	echo Configuration name missing. 1>&2
+-	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+-	echo "or     $0 ALIAS" 1>&2
+-	echo where ALIAS is a recognized configuration type. 1>&2
+-	exit 1
+-fi
++me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+-# First pass through any local machine types.
+-case $1 in
+-	*local*)
+-		echo $1
+-		exit 0
+-		;;
+-	*)
+-	;;
++usage="\
++Usage: $0 [OPTION] CPU-MFR-OPSYS
++       $0 [OPTION] ALIAS
++
++Canonicalize a configuration name.
++
++Operation modes:
++  -h, --help         print this help, then exit
++  -t, --time-stamp   print date of last modification, then exit
++  -v, --version      print version number, then exit
++
++Report bugs and patches to <config-patches@gnu.org>."
++
++version="\
++GNU config.sub ($timestamp)
++
++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
++Free Software Foundation, Inc.
++
++This is free software; see the source for copying conditions.  There is NO
++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
++
++help="
++Try \`$me --help' for more information."
++
++# Parse command line
++while test $# -gt 0 ; do
++  case $1 in
++    --time-stamp | --time* | -t )
++       echo "$timestamp" ; exit 0 ;;
++    --version | -v )
++       echo "$version" ; exit 0 ;;
++    --help | --h* | -h )
++       echo "$usage"; exit 0 ;;
++    -- )     # Stop option processing
++       shift; break ;;
++    - )	# Use stdin as input.
++       break ;;
++    -* )
++       echo "$me: invalid option $1$help"
++       exit 1 ;;
++
++    *local*)
++       # First pass through any local machine types.
++       echo $1
++       exit 0;;
++
++    * )
++       break ;;
++  esac
++done
++
++case $# in
++ 0) echo "$me: missing argument$help" >&2
++    exit 1;;
++ 1) ;;
++ *) echo "$me: too many arguments$help" >&2
++    exit 1;;
+ esac
+ 
+ # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+ # Here we must recognize all the valid KERNEL-OS combinations.
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+-  linux-gnu*)
++  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+     os=-$maybe_os
+     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+     ;;
+@@ -94,20 +144,28 @@
+ 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+-	-apple)
++	-apple | -axis)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+-	-sim | -cisco | -oki | -wec | -winbond )	# EGCS LOCAL
++	-sim | -cisco | -oki | -wec | -winbond)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+-	-scout)						# EGCS LOCAL
++	-scout)
+ 		;;
+-	-wrs)						# EGCS LOCAL
++	-wrs)
+ 		os=-vxworks
+ 		basic_machine=$1
+ 		;;
++	-chorusos*)
++		os=-chorusos
++		basic_machine=$1
++		;;
++ 	-chorusrdb)
++ 		os=-chorusrdb
++		basic_machine=$1
++ 		;;
+ 	-hiux*)
+ 		os=-hiuxwe2
+ 		;;
+@@ -156,49 +214,72 @@
+ 	-psos*)
+ 		os=-psos
+ 		;;
++	-mint | -mint[0-9]*)
++		basic_machine=m68k-atari
++		os=-mint
++		;;
+ esac
+ 
+ # Decode aliases for certain CPU-COMPANY combinations.
+ case $basic_machine in
+ 	# Recognize the basic CPU types without company name.
+ 	# Some are omitted here because they have special meanings below.
+-	tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+-		| arme[lb] | pyramid | mn10200 | mn10300 \
+-		| tron | a29k | 580 | i960 | h8300 \
+-		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+-		| alpha | alphaev5 | alphaev56 | alphapca56 | alphaev6 \
+-		| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+-		| 1750a | dsp16xx | pdp11 \
+-		| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+-		| mipstx39 | mipstx39el \
+-		| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x)
+-		basic_machine=$basic_machine-unknown
+-		;;
+-	m88110 | m680[012346]0 | m683?2 | m68360 | m5200 | z8k | v70 \
+-	        | h8500 | w65) # EGCS LOCAL
+-		;;
+-	thumb)
+-		basic_machine=$basic_machine-unknown
+-		;;
+-	mips64vr4300 | mips64vr4300el) # EGCS LOCAL jsmith/vr4300
++	1750a | 580 \
++	| a29k \
++	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
++	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
++	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
++	| clipper \
++	| d10v | d30v | dlx | dsp16xx \
++	| fr30 | frv \
++	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
++	| i370 | i860 | i960 | ia64 \
++	| ip2k \
++	| m32r | m68000 | m68k | m88k | mcore \
++	| mips | mipsbe | mipseb | mipsel | mipsle \
++	| mips16 \
++	| mips64 | mips64el \
++	| mips64vr | mips64vrel \
++	| mips64orion | mips64orionel \
++	| mips64vr4100 | mips64vr4100el \
++	| mips64vr4300 | mips64vr4300el \
++	| mips64vr5000 | mips64vr5000el \
++	| mipsisa32 | mipsisa32el \
++	| mipsisa32r2 | mipsisa32r2el \
++	| mipsisa64 | mipsisa64el \
++	| mipsisa64sb1 | mipsisa64sb1el \
++	| mipsisa64sr71k | mipsisa64sr71kel \
++	| mipstx39 | mipstx39el \
++	| mn10200 | mn10300 \
++	| msp430 \
++	| ns16k | ns32k \
++	| openrisc | or32 \
++	| pdp10 | pdp11 | pj | pjl \
++	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
++	| pyramid \
++	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
++	| sh64 | sh64le \
++	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
++	| strongarm \
++	| tahoe | thumb | tic80 | tron \
++	| v850 | v850e \
++	| we32k \
++	| x86 | xscale | xstormy16 | xtensa \
++	| z8k)
+ 		basic_machine=$basic_machine-unknown
+ 		;;
+-	mips64vr4100 | mips64vr4100el) # EGCS LOCAL jsmith/vr4100
+-		basic_machine=$basic_machine-unknown
+-		;;
+-	mips64vr5000 | mips64vr5000el) # EGCS LOCAL ian/vr5000
+-		basic_machine=$basic_machine-unknown
+-		;;
+-	mips16)
++	m6811 | m68hc11 | m6812 | m68hc12)
++		# Motorola 68HC11/12.
+ 		basic_machine=$basic_machine-unknown
++		os=-none
+ 		;;
+-	d10v)
+-		basic_machine=$basic_machine-unknown
++	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ 		;;
++
+ 	# We use `pc' rather than `unknown'
+ 	# because (1) that's what they normally are, and
+ 	# (2) the word "unknown" tends to confuse beginning users.
+-	i[34567]86)
++	i*86 | x86_64)
+ 	  basic_machine=$basic_machine-pc
+ 	  ;;
+ 	# Object if more than one company name word.
+@@ -207,44 +288,62 @@
+ 		exit 1
+ 		;;
+ 	# Recognize the basic CPU types with company name.
+-	vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+-	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+-	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+-	      | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+-	      | xmp-* | ymp-* \
+-	      | hppa-* | hppa1.0-* | hppa1.1-* \
+-	      | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+-	      | alpha-* | alphaev5-* | alphaev56-* | alphapca56-* \
+-	      | alphaev6-* | we32k-* | cydra-* | ns16k-* | pn-* | np1-* \
+-	      | xps100-* | clipper-* | orion-* \
+-	      | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+-	      | sparc64-* | sparcv9-* | sparc86x-* | mips64-* | mipsel-* \
+-	      | mips64el-* | mips64orion-* | mips64orionel-*  \
+-	      | mipstx39-* | mipstx39el-* \
+-	      | f301-* | arm*-*)
+-		;;
+-	m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-* | d10v-*) # EGCS LOCAL
+-		;;
+-	thumb-*) # EGCS LOCAL angela/thumb
+-		;;
+-	v850-*) # EGCS LOCAL
+-	        ;;
+-	d30v-*) # EGCS LOCAL
+-	        ;;
+-	mips64vr4300-* | mips64vr4300el-*) # EGCS LOCAL jsmith/vr4300
+-		;;
+-	mips64vr4100-* | mips64vr4100el-*) # EGCS LOCAL jsmith/vr4100
+-		;;
+-	mips16-*) # EGCS LOCAL krk/mips16
+-		;;
+-	tic30-*) # EGCS LOCAL ian/tic30
+-		;;
+-	c30-*) # EGCS LOCAL ian/tic30
+-		basic_machine=tic30-unknown
++	580-* \
++	| a29k-* \
++	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
++	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
++	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
++	| avr-* \
++	| bs2000-* \
++	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \
++	| clipper-* | cydra-* \
++	| d10v-* | d30v-* | dlx-* \
++	| elxsi-* \
++	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
++	| h8300-* | h8500-* \
++	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
++	| i*86-* | i860-* | i960-* | ia64-* \
++	| ip2k-* \
++	| m32r-* \
++	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
++	| m88110-* | m88k-* | mcore-* \
++	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
++	| mips16-* \
++	| mips64-* | mips64el-* \
++	| mips64vr-* | mips64vrel-* \
++	| mips64orion-* | mips64orionel-* \
++	| mips64vr4100-* | mips64vr4100el-* \
++	| mips64vr4300-* | mips64vr4300el-* \
++	| mips64vr5000-* | mips64vr5000el-* \
++	| mipsisa32-* | mipsisa32el-* \
++	| mipsisa32r2-* | mipsisa32r2el-* \
++	| mipsisa64-* | mipsisa64el-* \
++	| mipsisa64sb1-* | mipsisa64sb1el-* \
++	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
++	| mipstx39-* | mipstx39el-* \
++	| msp430-* \
++	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
++	| orion-* \
++	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
++	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
++	| pyramid-* \
++	| romp-* | rs6000-* \
++	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
++	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
++	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
++	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
++	| tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \
++	| v850-* | v850e-* | vax-* \
++	| we32k-* \
++	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
++	| xtensa-* \
++	| ymp-* \
++	| z8k-*)
+ 		;;
+ 	# Recognize the various machine names and aliases which stand
+ 	# for a CPU type and a company and sometimes even an OS.
+-	386bsd)						# EGCS LOCAL
++	386bsd)
+ 		basic_machine=i386-unknown
+ 		os=-bsd
+ 		;;
+@@ -254,11 +353,11 @@
+ 	3b*)
+ 		basic_machine=we32k-att
+ 		;;
+-	a29khif)					# EGCS LOCAL
++	a29khif)
+ 		basic_machine=a29k-amd
+ 		os=-udi
+ 		;;
+-	adobe68k)					# EGCS LOCAL
++	adobe68k)
+ 		basic_machine=m68010-adobe
+ 		os=-scout
+ 		;;
+@@ -277,21 +376,21 @@
+ 		os=-sysv
+ 		;;
+ 	amiga | amiga-*)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		;;
+ 	amigaos | amigados)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		os=-amigaos
+ 		;;
+ 	amigaunix | amix)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		os=-sysv4
+ 		;;
+ 	apollo68)
+ 		basic_machine=m68k-apollo
+ 		os=-sysv
+ 		;;
+-	apollo68bsd)					# EGCS LOCAL
++	apollo68bsd)
+ 		basic_machine=m68k-apollo
+ 		os=-bsd
+ 		;;
+@@ -303,6 +402,10 @@
+ 		basic_machine=ns32k-sequent
+ 		os=-dynix
+ 		;;
++	c90)
++		basic_machine=c90-cray
++		os=-unicos
++		;;
+ 	convex-c1)
+ 		basic_machine=c1-convex
+ 		os=-bsd
+@@ -323,27 +426,30 @@
+ 		basic_machine=c38-convex
+ 		os=-bsd
+ 		;;
+-	cray | ymp)
+-		basic_machine=ymp-cray
+-		os=-unicos
+-		;;
+-	cray2)
+-		basic_machine=cray2-cray
+-		os=-unicos
+-		;;
+-	[ctj]90-cray)
+-		basic_machine=c90-cray
++	cray | j90)
++		basic_machine=j90-cray
+ 		os=-unicos
+ 		;;
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
++	cris | cris-* | etrax*)
++		basic_machine=cris-axis
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+ 	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ 		basic_machine=mips-dec
+ 		;;
++	decsystem10* | dec10*)
++		basic_machine=pdp10-dec
++		os=-tops10
++		;;
++	decsystem20* | dec20*)
++		basic_machine=pdp10-dec
++		os=-tops20
++		;;
+ 	delta | 3300 | motorola-3300 | motorola-delta \
+ 	      | 3300-motorola | delta-motorola)
+ 		basic_machine=m68k-motorola
+@@ -371,7 +477,7 @@
+ 	encore | umax | mmax)
+ 		basic_machine=ns32k-encore
+ 		;;
+-	es1800 | OSE68k | ose68k | ose | OSE)		# EGCS LOCAL
++	es1800 | OSE68k | ose68k | ose | OSE)
+ 		basic_machine=m68k-ericsson
+ 		os=-ose
+ 		;;
+@@ -385,6 +491,10 @@
+ 		basic_machine=tron-gmicro
+ 		os=-sysv
+ 		;;
++	go32)
++		basic_machine=i386-pc
++		os=-go32
++		;;
+ 	h3050r* | hiux*)
+ 		basic_machine=hppa1.1-hitachi
+ 		os=-hiuxwe2
+@@ -393,11 +503,11 @@
+ 		basic_machine=h8300-hitachi
+ 		os=-hms
+ 		;;
+-	h8300xray)					# EGCS LOCAL
++	h8300xray)
+ 		basic_machine=h8300-hitachi
+ 		os=-xray
+ 		;;
+-	h8500hms)					# EGCS LOCAL
++	h8500hms)
+ 		basic_machine=h8500-hitachi
+ 		os=-hms
+ 		;;
+@@ -416,22 +526,6 @@
+ 		basic_machine=m68k-hp
+ 		os=-hpux
+ 		;;
+-        w89k-*)						# EGCS LOCAL
+-                basic_machine=hppa1.1-winbond
+-                os=-proelf
+-                ;;
+-        op50n-*)					# EGCS LOCAL
+-                basic_machine=hppa1.1-oki
+-                os=-proelf
+-                ;;
+-        op60c-*)					# EGCS LOCAL
+-                basic_machine=hppa1.1-oki
+-                os=-proelf
+-                ;;
+-        hppro)						# EGCS LOCAL
+-                basic_machine=hppa1.1-hp
+-                os=-proelf
+-                ;;
+ 	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ 		basic_machine=hppa1.0-hp
+ 		;;
+@@ -441,22 +535,21 @@
+ 	hp9k3[2-9][0-9])
+ 		basic_machine=m68k-hp
+ 		;;
+-	hp9k6[0-9][0-9] | hp6[0-9][0-9] )
++	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ 		basic_machine=hppa1.0-hp
+ 		;;
+-	hp9k7[0-79][0-9] | hp7[0-79][0-9] )
++	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ 		basic_machine=hppa1.1-hp
+ 		;;
+-	hp9k78[0-9] | hp78[0-9] )
++	hp9k78[0-9] | hp78[0-9])
+ 		# FIXME: really hppa2.0-hp
+ 		basic_machine=hppa1.1-hp
+ 		;;
+-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | \
+-	hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893 )
++	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ 		# FIXME: really hppa2.0-hp
+ 		basic_machine=hppa1.1-hp
+ 		;;
+-	hp9k8[0-9][13679] | hp8[0-9][13679] )
++	hp9k8[0-9][13679] | hp8[0-9][13679])
+ 		basic_machine=hppa1.1-hp
+ 		;;
+ 	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+@@ -465,47 +558,42 @@
+ 	hppa-next)
+ 		os=-nextstep3
+ 		;;
+-	hppaosf)					# EGCS LOCAL
++	hppaosf)
+ 		basic_machine=hppa1.1-hp
+ 		os=-osf
+ 		;;
++	hppro)
++		basic_machine=hppa1.1-hp
++		os=-proelf
++		;;
+ 	i370-ibm* | ibm*)
+ 		basic_machine=i370-ibm
+-		os=-mvs
+ 		;;
+ # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+-	i[34567]86v32)
++	i*86v32)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv32
+ 		;;
+-	i[34567]86v4*)
++	i*86v4*)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv4
+ 		;;
+-	i[34567]86v)
++	i*86v)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv
+ 		;;
+-	i[34567]86sol2)
++	i*86sol2)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-solaris2
+ 		;;
+-	i386mach)					# EGCS LOCAL
++	i386mach)
+ 		basic_machine=i386-mach
+ 		os=-mach
+ 		;;
+-	i386-vsta | vsta)				# EGCS LOCAL
++	i386-vsta | vsta)
+ 		basic_machine=i386-unknown
+ 		os=-vsta
+ 		;;
+-	i386-go32 | go32)				# EGCS LOCAL
+-		basic_machine=i386-unknown
+-		os=-go32
+-		;;
+-	i386-mingw32 | mingw32)
+-		basic_machine=i386-unknown
+-		os=-mingw32
+-		;;
+ 	iris | iris4d)
+ 		basic_machine=mips-sgi
+ 		case $os in
+@@ -531,16 +619,16 @@
+ 		basic_machine=ns32k-utek
+ 		os=-sysv
+ 		;;
++	mingw32)
++		basic_machine=i386-pc
++		os=-mingw32
++		;;
+ 	miniframe)
+ 		basic_machine=m68000-convergent
+ 		;;
+-	mipsel*-linux*)
+-		basic_machine=mipsel-unknown
+-		os=-linux-gnu
+-		;;
+-	mips*-linux*)
+-		basic_machine=mips-unknown
+-		os=-linux-gnu
++	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
++		basic_machine=m68k-atari
++		os=-mint
+ 		;;
+ 	mips3*-*)
+ 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+@@ -548,24 +636,36 @@
+ 	mips3*)
+ 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ 		;;
+-	monitor)					# EGCS LOCAL
++	mmix*)
++		basic_machine=mmix-knuth
++		os=-mmixware
++		;;
++	monitor)
+ 		basic_machine=m68k-rom68k
+ 		os=-coff
+ 		;;
+-	msdos)						# EGCS LOCAL
+-		basic_machine=i386-unknown	
++	morphos)
++		basic_machine=powerpc-unknown
++		os=-morphos
++		;;
++	msdos)
++		basic_machine=i386-pc
+ 		os=-msdos
+ 		;;
++	mvs)
++		basic_machine=i370-ibm
++		os=-mvs
++		;;
+ 	ncr3000)
+ 		basic_machine=i486-ncr
+ 		os=-sysv4
+ 		;;
+ 	netbsd386)
+-		basic_machine=i386-unknown		# EGCS LOCAL
++		basic_machine=i386-unknown
+ 		os=-netbsd
+ 		;;
+ 	netwinder)
+-		basic_machine=armv4l-corel
++		basic_machine=armv4l-rebel
+ 		os=-linux
+ 		;;
+ 	news | news700 | news800 | news900)
+@@ -580,7 +680,7 @@
+ 		basic_machine=mips-sony
+ 		os=-newsos
+ 		;;
+-	necv70)						# EGCS LOCAL
++	necv70)
+ 		basic_machine=v70-nec
+ 		os=-sysv
+ 		;;
+@@ -609,18 +709,37 @@
+ 		basic_machine=i960-intel
+ 		os=-nindy
+ 		;;
+-	mon960)						# EGCS LOCAL
++	mon960)
+ 		basic_machine=i960-intel
+ 		os=-mon960
+ 		;;
++	nonstopux)
++		basic_machine=mips-compaq
++		os=-nonstopux
++		;;
+ 	np1)
+ 		basic_machine=np1-gould
+ 		;;
+-	OSE68000 | ose68000)				# EGCS LOCAL
++	nv1)
++		basic_machine=nv1-cray
++		os=-unicosmp
++		;;
++	nsr-tandem)
++		basic_machine=nsr-tandem
++		;;
++	op50n-* | op60c-*)
++		basic_machine=hppa1.1-oki
++		os=-proelf
++		;;
++	or32 | or32-*)
++		basic_machine=or32-unknown
++		os=-coff
++		;;
++	OSE68000 | ose68000)
+ 		basic_machine=m68000-ericsson
+ 		os=-ose
+ 		;;
+-	os68k)						# EGCS LOCAL
++	os68k)
+ 		basic_machine=m68k-none
+ 		os=-os68k
+ 		;;
+@@ -638,46 +757,60 @@
+ 	pbb)
+ 		basic_machine=m68k-tti
+ 		;;
+-        pc532 | pc532-*)
++	pc532 | pc532-*)
+ 		basic_machine=ns32k-pc532
+ 		;;
+-	pentium | p5 | k5 | k6 | nexen)
++	pentium | p5 | k5 | k6 | nexgen | viac3)
+ 		basic_machine=i586-pc
+ 		;;
+-	pentiumpro | p6 | 6x86)
++	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ 		basic_machine=i686-pc
+ 		;;
+ 	pentiumii | pentium2)
+-		basic_machine=i786-pc
++		basic_machine=i686-pc
+ 		;;
+-	pentium-* | p5-* | k5-* | k6-* | nexen-*)
++	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ 		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+-	pentiumpro-* | p6-* | 6x86-*)
++	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	pentiumii-* | pentium2-*)
+-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
++		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	pn)
+ 		basic_machine=pn-gould
+ 		;;
+-	power)	basic_machine=rs6000-ibm
++	power)	basic_machine=power-ibm
+ 		;;
+ 	ppc)	basic_machine=powerpc-unknown
+-	        ;;
++		;;
+ 	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	ppcle | powerpclittle | ppc-le | powerpc-little)
+ 		basic_machine=powerpcle-unknown
+-	        ;;
++		;;
+ 	ppcle-* | powerpclittle-*)
+ 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
++	ppc64)	basic_machine=powerpc64-unknown
++		;;
++	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
++		basic_machine=powerpc64le-unknown
++		;;
++	ppc64le-* | powerpc64little-*)
++		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	ps2)
+ 		basic_machine=i386-ibm
+ 		;;
+-	rom68k)						# EGCS LOCAL
++	pw32)
++		basic_machine=i586-unknown
++		os=-pw32
++		;;
++	rom68k)
+ 		basic_machine=m68k-rom68k
+ 		os=-coff
+ 		;;
+@@ -687,10 +820,22 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
+-	sa29200)					# EGCS LOCAL
++	s390 | s390-*)
++		basic_machine=s390-ibm
++		;;
++	s390x | s390x-*)
++		basic_machine=s390x-ibm
++		;;
++	sa29200)
+ 		basic_machine=a29k-amd
+ 		os=-udi
+ 		;;
++	sb1)
++		basic_machine=mipsisa64sb1-unknown
++		;;
++	sb1el)
++		basic_machine=mipsisa64sb1el-unknown
++		;;
+ 	sequent)
+ 		basic_machine=i386-sequent
+ 		;;
+@@ -698,7 +843,7 @@
+ 		basic_machine=sh-hitachi
+ 		os=-hms
+ 		;;
+-	sparclite-wrs)					# EGCS LOCAL
++	sparclite-wrs | simso-wrs)
+ 		basic_machine=sparclite-wrs
+ 		os=-vxworks
+ 		;;
+@@ -709,10 +854,10 @@
+ 	spur)
+ 		basic_machine=spur-unknown
+ 		;;
+-	st2000)						# EGCS LOCAL
++	st2000)
+ 		basic_machine=m68k-tandem
+ 		;;
+-	stratus)					# EGCS LOCAL
++	stratus)
+ 		basic_machine=i860-stratus
+ 		os=-sysv4
+ 		;;
+@@ -756,16 +901,40 @@
+ 	sun386 | sun386i | roadrunner)
+ 		basic_machine=i386-sun
+ 		;;
++	sv1)
++		basic_machine=sv1-cray
++		os=-unicos
++		;;
+ 	symmetry)
+ 		basic_machine=i386-sequent
+ 		os=-dynix
+ 		;;
++	t3e)
++		basic_machine=alphaev5-cray
++		os=-unicos
++		;;
++	t90)
++		basic_machine=t90-cray
++		os=-unicos
++		;;
++        tic4x | c4x*)
++		basic_machine=tic4x-unknown
++		os=-coff
++		;;
++	tic54x | c54x*)
++		basic_machine=tic54x-unknown
++		os=-coff
++		;;
+ 	tx39)
+ 		basic_machine=mipstx39-unknown
+ 		;;
+ 	tx39el)
+ 		basic_machine=mipstx39el-unknown
+ 		;;
++	toad1)
++		basic_machine=pdp10-xkl
++		os=-tops20
++		;;
+ 	tower | tower-32)
+ 		basic_machine=m68k-ncr
+ 		;;
+@@ -777,7 +946,7 @@
+ 		basic_machine=a29k-nyu
+ 		os=-sym1
+ 		;;
+-	v810 | necv810)					# EGCS LOCAL
++	v810 | necv810)
+ 		basic_machine=v810-nec
+ 		os=-none
+ 		;;
+@@ -790,8 +959,8 @@
+ 		os=-vms
+ 		;;
+ 	vpp*|vx|vx-*)
+-               basic_machine=f301-fujitsu
+-               ;;
++		basic_machine=f301-fujitsu
++		;;
+ 	vxworks960)
+ 		basic_machine=i960-wrs
+ 		os=-vxworks
+@@ -804,18 +973,22 @@
+ 		basic_machine=a29k-wrs
+ 		os=-vxworks
+ 		;;
+-	w65*)						# EGCS LOCAL
+- 		basic_machine=w65-wdc
+- 		os=-none
++	w65*)
++		basic_machine=w65-wdc
++		os=-none
+ 		;;
+-	xmp)
+-		basic_machine=xmp-cray
+-		os=-unicos
++	w89k-*)
++		basic_machine=hppa1.1-winbond
++		os=-proelf
+ 		;;
+-        xps | xps100)
++	xps | xps100)
+ 		basic_machine=xps100-honeywell
+ 		;;
+-	z8k-*-coff)					# EGCS LOCAL
++	ymp)
++		basic_machine=ymp-cray
++		os=-unicos
++		;;
++	z8k-*-coff)
+ 		basic_machine=z8k-unknown
+ 		os=-sim
+ 		;;
+@@ -826,22 +999,15 @@
+ 
+ # Here we handle the default manufacturer of certain CPU types.  It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+-	w89k)						# EGCS LOCAL
++	w89k)
+ 		basic_machine=hppa1.1-winbond
+ 		;;
+-	op50n)						# EGCS LOCAL
++	op50n)
+ 		basic_machine=hppa1.1-oki
+ 		;;
+-	op60c)						# EGCS LOCAL
++	op60c)
+ 		basic_machine=hppa1.1-oki
+ 		;;
+-	mips)
+-		if [ x$os = x-linux-gnu ]; then
+-			basic_machine=mips-unknown
+-		else
+-			basic_machine=mips-mips
+-		fi
+-		;;
+ 	romp)
+ 		basic_machine=romp-ibm
+ 		;;
+@@ -851,16 +1017,26 @@
+ 	vax)
+ 		basic_machine=vax-dec
+ 		;;
++	pdp10)
++		# there are many clones, so DEC is not a safe bet
++		basic_machine=pdp10-unknown
++		;;
+ 	pdp11)
+ 		basic_machine=pdp11-dec
+ 		;;
+ 	we32k)
+ 		basic_machine=we32k-att
+ 		;;
+-	sparc | sparcv9)
++	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
++		basic_machine=sh-unknown
++		;;
++	sh64)
++		basic_machine=sh64-unknown
++		;;
++	sparc | sparcv9 | sparcv9b)
+ 		basic_machine=sparc-sun
+ 		;;
+-        cydra)
++	cydra)
+ 		basic_machine=cydra-cydrome
+ 		;;
+ 	orion)
+@@ -869,16 +1045,15 @@
+ 	orion105)
+ 		basic_machine=clipper-highlevel
+ 		;;
+-	mac | mpw | mac-mpw)				# EGCS LOCAL
++	mac | mpw | mac-mpw)
+ 		basic_machine=m68k-apple
+ 		;;
+-	pmac | pmac-mpw)				# EGCS LOCAL
++	pmac | pmac-mpw)
+ 		basic_machine=powerpc-apple
+ 		;;
+- 	c4x*)
+- 		basic_machine=c4x-none
+- 		os=-coff
+-  		;;
++	*-unknown)
++		# Make sure to match an already-canonicalized machine name.
++		;;
+ 	*)
+ 		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ 		exit 1
+@@ -935,20 +1110,38 @@
+ 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
++	      | -chorusos* | -chorusrdb* \
+ 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+-	      | -interix* | -uwin* )
++	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
++	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
++	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
++	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
++	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
++	      | -powermax* | -dnix* | -microbsd*)
+ 	# Remember, each alternative MUST END IN *, to match a version number.
+ 		;;
+-	# EGCS LOCAL
++	-qnx*)
++		case $basic_machine in
++		    x86-* | i*86-*)
++			;;
++		    *)
++			os=-nto$os
++			;;
++		esac
++		;;
++	-nto-qnx*)
++		;;
++	-nto*)
++		os=`echo $os | sed -e 's|nto|nto-qnx|'`
++		;;
+ 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+-	      | -windows* | -osx | -abug |  -netware* | -os9* | -beos* \
+-	      | -macos* | -mpw* | -magic* | -mon960* | -lnews* )
++	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
++	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ 		;;
+ 	-mac*)
+ 		os=`echo $os | sed -e 's|mac|macos|'`
+ 		;;
+-	# END EGCS LOCAL
+ 	-linux*)
+ 		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ 		;;
+@@ -958,6 +1151,12 @@
+ 	-sunos6*)
+ 		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ 		;;
++	-opened*)
++		os=-openedition
++		;;
++	-wince*)
++		os=-wince
++		;;
+ 	-osfrose*)
+ 		os=-osfrose
+ 		;;
+@@ -973,14 +1172,23 @@
+ 	-acis*)
+ 		os=-aos
+ 		;;
+-	-386bsd)					# EGCS LOCAL
++	-atheos*)
++		os=-atheos
++		;;
++	-386bsd)
+ 		os=-bsd
+ 		;;
+ 	-ctix* | -uts*)
+ 		os=-sysv
+ 		;;
++	-nova*)
++		os=-rtmk-nova
++		;;
+ 	-ns2 )
+-	        os=-nextstep2
++		os=-nextstep2
++		;;
++	-nsk*)
++		os=-nsk
+ 		;;
+ 	# Preserve the version number of sinix5.
+ 	-sinix5.*)
+@@ -1007,15 +1215,21 @@
+ 	# This must come after -sysvr4.
+ 	-sysv*)
+ 		;;
+-	-ose*)						# EGCS LOCAL
++	-ose*)
+ 		os=-ose
+ 		;;
+-	-es1800*)					# EGCS LOCAL
++	-es1800*)
+ 		os=-ose
+ 		;;
+ 	-xenix)
+ 		os=-xenix
+ 		;;
++	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
++		os=-mint
++		;;
++	-aros*)
++		os=-aros
++		;;
+ 	-none)
+ 		;;
+ 	*)
+@@ -1041,13 +1255,17 @@
+ 	*-acorn)
+ 		os=-riscix1.2
+ 		;;
+-	arm*-corel)
++	arm*-rebel)
+ 		os=-linux
+ 		;;
+ 	arm*-semi)
+ 		os=-aout
+ 		;;
+-        pdp11-*)
++	# This must come before the *-dec entry.
++	pdp10-*)
++		os=-tops20
++		;;
++	pdp11-*)
+ 		os=-none
+ 		;;
+ 	*-dec | vax-*)
+@@ -1065,15 +1283,18 @@
+ 		# default.
+ 		# os=-sunos4
+ 		;;
+-	m68*-cisco)					# EGCS LOCAL
++	m68*-cisco)
+ 		os=-aout
+ 		;;
+-	mips*-cisco)					# EGCS LOCAL
++	mips*-cisco)
+ 		os=-elf
+ 		;;
+-        mips*-*)                                        # EGCS LOCAL
+-                os=-elf
+-                ;;
++	mips*-*)
++		os=-elf
++		;;
++	or32-*)
++		os=-coff
++		;;
+ 	*-tti)	# must be before sparc entry or we get the wrong os.
+ 		os=-sysv3
+ 		;;
+@@ -1086,13 +1307,13 @@
+ 	*-ibm)
+ 		os=-aix
+ 		;;
+-	*-wec)						# EGCS LOCAL
++	*-wec)
+ 		os=-proelf
+ 		;;
+-	*-winbond)					# EGCS LOCAL
++	*-winbond)
+ 		os=-proelf
+ 		;;
+-	*-oki)						# EGCS LOCAL
++	*-oki)
+ 		os=-proelf
+ 		;;
+ 	*-hp)
+@@ -1137,36 +1358,39 @@
+ 	*-next)
+ 		os=-nextstep3
+ 		;;
+-        *-gould)
++	*-gould)
+ 		os=-sysv
+ 		;;
+-        *-highlevel)
++	*-highlevel)
+ 		os=-bsd
+ 		;;
+ 	*-encore)
+ 		os=-bsd
+ 		;;
+-        *-sgi)
++	*-sgi)
+ 		os=-irix
+ 		;;
+-        *-siemens)
++	*-siemens)
+ 		os=-sysv4
+ 		;;
+ 	*-masscomp)
+ 		os=-rtu
+ 		;;
+-	f301-fujitsu)
++	f30[01]-fujitsu | f700-fujitsu)
+ 		os=-uxpv
+ 		;;
+-	*-rom68k)					# EGCS LOCAL
++	*-rom68k)
+ 		os=-coff
+ 		;;
+-	*-*bug)						# EGCS LOCAL
++	*-*bug)
+ 		os=-coff
+ 		;;
+-	*-apple)					# EGCS LOCAL
++	*-apple)
+ 		os=-macos
+ 		;;
++	*-atari*)
++		os=-mint
++		;;
+ 	*)
+ 		os=-none
+ 		;;
+@@ -1212,27 +1436,41 @@
+ 			-genix*)
+ 				vendor=ns
+ 				;;
+-			-mvs*)
++			-mvs* | -opened*)
+ 				vendor=ibm
+ 				;;
+ 			-ptx*)
+ 				vendor=sequent
+ 				;;
+-			-vxsim* | -vxworks*)
++			-vxsim* | -vxworks* | -windiss*)
+ 				vendor=wrs
+ 				;;
+ 			-aux*)
+ 				vendor=apple
+ 				;;
+-			-hms*)				# EGCS LOCAL
++			-hms*)
+ 				vendor=hitachi
+ 				;;
+-			-mpw* | -macos*)		# EGCS LOCAL
++			-mpw* | -macos*)
+ 				vendor=apple
+ 				;;
++			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
++				vendor=atari
++				;;
++			-vos*)
++				vendor=stratus
++				;;
+ 		esac
+ 		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ 		;;
+ esac
+ 
+ echo $basic_machine$os
++exit 0
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "timestamp='"
++# time-stamp-format: "%:y-%02m-%02d"
++# time-stamp-end: "'"
++# End:
diff --git a/patches/gcc/2.95.3/deque-leak-fix.patch b/patches/gcc/2.95.3/deque-leak-fix.patch
new file mode 100644
index 00000000..44d2a012
--- /dev/null
+++ b/patches/gcc/2.95.3/deque-leak-fix.patch
@@ -0,0 +1,31 @@
+[See also http://gcc.gnu.org/ml/libstdc++/2001-11/msg00133.html ]
+
+Date: Fri, 16 Nov 2001 16:06:22 -0500
+From: Phil Edwards <pedwards at disaster dot jaj dot com>
+To: gcc-patches at gcc dot gnu dot org
+Subject: [libstdc++ trunk & 3.0]  Fix deque memory leak
+Message-ID: <20011116160622.A23094@disaster.jaj.com>
+
+
+As discussed on the libstdc++ mailing list.  Tested on i686/linux.
+
+
+
+2001-11-16  Paolo Carlini  <pcarlini@unitus.it>
+
+	* include/bits/stl_deque.h (deque::erase()):  Fix memory leak.
+
+
+[rediffed against 2.95.3 -- dank]
+
+--- gcc-2.95.3/libstdc++/stl/stl_deque.h.old	2001-01-01 09:48:22.000000000 -0800
++++ gcc-2.95.3/libstdc++/stl/stl_deque.h	2006-02-18 15:24:17.000000000 -0800
+@@ -1052,7 +1052,7 @@
+       copy_backward(_M_start, __first, __last);
+       iterator __new_start = _M_start + __n;
+       destroy(_M_start, __new_start);
+-      _M_destroy_nodes(__new_start._M_node, _M_start._M_node);
++      _M_destroy_nodes(_M_start._M_node, __new_start._M_node);  /* fixed per http://gcc.gnu.org/ml/libstdc++/2001-11/msg00139.html */
+       _M_start = __new_start;
+     }
+     else {
diff --git a/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch
new file mode 100644
index 00000000..fb2b8da9
--- /dev/null
+++ b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch
@@ -0,0 +1,33 @@
+[ Building gcc-2.95.3 on cygwin yields a compiler that sticks a .exe
+  on the end of every executable, even if they're linux executable.
+  This is highly annoying, and causes glibc build failures that look like this:
+    mv: `.../bin/makedb.new' and `.../bin/makedb' are the same file
+    make[2]: *** [.../bin/makedb] Error 1
+    make[2]: Leaving directory `.../gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/db2'
+
+  The mainline solves this with http://gcc.gnu.org/ml/gcc-cvs/2001-04/msg00440.html,
+  but that doesn't apply cleanly to gcc-2.95.3.
+
+  So, I'm using
+  http://www.uclinux.org/pub/uClinux/uclinux-elf-tools/tools-20030314/gcc-2.95.3-cygwin-020611.patch
+  This is the only patch in crosstool that *isn't* suitable for the mainline.
+  I can live with this patch simply because crosstool does not build
+  compilers that target cygwin or VAX/VMS. 
+  If that ever changes, I might need to try applying the real patch.
+]
+
+
+
+#
+# This patch can be found at http://www.uclinux.org/pub/uClinux/m68k-elf-tools/
+#
+--- gcc-2.95.3/gcc/config/i386/xm-cygwin.h	1999-04-22 16:40:56.000000000 +0200
++++ gcc-2.95.3-cygwin/gcc/config/i386/xm-cygwin.h	2002-06-11 08:23:18.000000000 +0200
+@@ -19,7 +19,6 @@
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+ 
+-#define EXECUTABLE_SUFFIX ".exe"
+ #define NO_SYS_SIGLIST 1
+ 
+ /* We support both "/" and "\" since everybody tests both but we
diff --git a/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch
new file mode 100644
index 00000000..1d180552
--- /dev/null
+++ b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch
@@ -0,0 +1,44 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-2.95.3-orig/configure gcc-2.95.3/configure
+--- gcc-2.95.3-orig/configure	1999-04-02 16:17:40.000000000 +0200
++++ gcc-2.95.3/configure	2005-04-20 18:25:45.030488235 +0200
+@@ -687,7 +687,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -f Makefile* ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1599,7 +1599,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -f ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/2.95.3/gcc-pr3106.patch b/patches/gcc/2.95.3/gcc-pr3106.patch
new file mode 100644
index 00000000..0e077ea3
--- /dev/null
+++ b/patches/gcc/2.95.3/gcc-pr3106.patch
@@ -0,0 +1,28 @@
+See http://gcc.gnu.org/PR3106
+Backported from gcc-3.0.x
+
+Fixes error
+  .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr'
+  /usr/include/stdio.h:258: error: previous declaration of `sys_nerr'
+  make[1]: *** [strerror.o] Error 1
+  make: *** [all-libiberty] Error 2
+on Mac OS X.
+
+--- gcc-2.95.3/libiberty/strerror.c.old	2004-03-24 16:23:19.000000000 -0800
++++ gcc-2.95.3/libiberty/strerror.c	2004-03-24 16:23:48.000000000 -0800
+@@ -13,6 +13,7 @@
+    incompatible with our later declaration, perhaps by using const
+    attributes.  So we hide the declaration in errno.h (if any) using a
+    macro. */
++#define sys_nerr sys_nerr__
+ #define sys_errlist sys_errlist__
+ #endif
+ 
+@@ -20,6 +21,7 @@
+ #include <errno.h>
+ 
+ #ifdef HAVE_SYS_ERRLIST
++#undef sys_nerr
+ #undef sys_errlist
+ #endif
+ 
diff --git a/patches/gcc/2.95.3/threads_snafu.patch b/patches/gcc/2.95.3/threads_snafu.patch
new file mode 100644
index 00000000..2c5297ef
--- /dev/null
+++ b/patches/gcc/2.95.3/threads_snafu.patch
@@ -0,0 +1,28 @@
+This fixes the error
+
+In file included from gthr-default.h:1,
+                 from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr.h:98,
+                 from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/libgcc2.c:3034:
+/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directory
+make[3]: *** [libgcc2.a] Error 1
+make[3]: Leaving directory `/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-gcc-core/gcc'
+
+in what I think is a nicer way than the patch used by the arm team,
+i.e. "perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc -D__gthr_posix_h/' gcc/config/arm/t-linux"
+which seems a bit of a kludge.
+
+--- gcc-2.95.3/gcc/configure.old	Fri Mar 16 06:13:48 2001
++++ gcc-2.95.3/gcc/configure	Sun Jun  8 13:02:20 2003
+@@ -853,9 +853,9 @@
+ # Check whether --enable-threads or --disable-threads was given.
+ if test "${enable_threads+set}" = set; then
+   enableval="$enable_threads"
+-  if test x$enable_threads = xno; then
+-	enable_threads=''
+-fi
++  #if test x$enable_threads = xno; then
++	#enable_threads=''
++  #fi
+ else
+   enable_threads=''
+ fi
diff --git a/patches/gcc/3.2.3/README-mips b/patches/gcc/3.2.3/README-mips
new file mode 100644
index 00000000..170b21d9
--- /dev/null
+++ b/patches/gcc/3.2.3/README-mips
@@ -0,0 +1,1648 @@
+See also http://www.spinics.net/lists/mips/msg12236.html
+
+ftp://ftp.linux-mips.org/pub/linux/mips/redhat/7.3/test/SRPMS/gcc-3.2-7.1.src.rpm
+contains the following patches and spec file.
+You may wish to investigate some of these patches; I haven't.
+I think this is mostly the Red Hat 8.0 srpm for a prerelease gcc-3.2, plus a couple
+mips specific fixes, but you'd have to ask H.J.Lu or compare with the regular
+Red Hat 8.0 srpm to find out.
+In any case, the spec file is interesting reading.
+- Dan K. 
+
+total 1164
+   4 boehm-gc-LINUX.patch
+   4 boehm-gc-mips.patch
+   4 contrib-touch.patch
+   8 gcc-arch.patch
+   4 gcc-c++-template.patch
+   4 gcc-copy.patch
+   4 gcc-cross-bfd.patch
+   4 gcc-cross.patch
+   4 gcc-gcj-cross.patch
+   4 gcc-libffi-mips.patch
+   4 gcc-libgcc.patch
+ 480 gcc-libstdc++-glibc-2.2.patch
+   4 gcc-libstdc++-mips.patch
+   4 gcc-linux-atexit.patch
+   8 gcc-linux-crt.patch
+   4 gcc-mips-coff.patch
+   4 gcc-mips-file.patch
+   4 gcc-mips-ieee.patch
+   4 gcc-mips-return.patch
+   4 gcc-ppc-linux.patch
+   8 gcc-sizeof.patch
+   4 gcc-test-atexit.patch
+   4 gcc-testsuite-c++.patch
+   4 gcc-var.patch
+   8 gcc32-2.96-RH-compat.patch
+   4 gcc32-ada-addr2line.patch
+   8 gcc32-ada-link.patch
+  12 gcc32-attr-visibility.patch
+   4 gcc32-attr-visibility2.patch
+   4 gcc32-attr-visibility3.patch
+   4 gcc32-attr-visibility4.patch
+   4 gcc32-attr-visibility5.patch
+   8 gcc32-boehm-gc-libs.patch
+   4 gcc32-bogus-inline.patch
+   4 gcc32-c++-nrv-test.patch
+   4 gcc32-c++-pretty_function.patch
+  16 gcc32-c++-tail-pad-backout.patch
+   4 gcc32-c++-tsubst-asm.patch
+   4 gcc32-cfg-eh.patch
+   4 gcc32-debug-pr7241.patch
+   4 gcc32-doc-gcov.patch
+   4 gcc32-duplicate-decl.patch
+   4 gcc32-dwarf2-pr6381.patch
+   4 gcc32-dwarf2-pr6436-test.patch
+   4 gcc32-fde-merge-compat.patch
+   4 gcc32-fold-const-associate.patch
+   4 gcc32-fold-const2.patch
+  24 gcc32-hard-reg-sharing.patch
+   4 gcc32-hard-reg-sharing2.patch
+   4 gcc32-i386-default-momit-leaf-frame-pointer.patch
+   4 gcc32-i386-memtest-test.patch
+   4 gcc32-i386-no-default-momit-leaf-frame-pointer.patch
+   4 gcc32-i386-pic-label-thunk.patch
+   4 gcc32-i386-pr7242.patch
+   4 gcc32-i386-profile-olfp.patch
+   4 gcc32-inline-label.patch
+   4 gcc32-interface_only.patch
+   4 gcc32-java-no-rpath.patch
+  20 gcc32-libstdc++-glibc23-1.patch
+   4 gcc32-libstdc++-glibc23-2.patch
+   4 gcc32-libstdc++-glibc23-3.patch
+   4 gcc32-libstdc++-glibc23-4.patch
+   4 gcc32-loop-prefetch.patch
+   4 gcc32-pr6842.patch
+   8 gcc32-rh69989.patch
+  40 gcc32-s390-java.patch
+   4 gcc32-sparc-sll1.patch
+   4 gcc32-test-rh65771.patch
+   8 gcc32-test-rotate.patch
+  12 gcc32-tls-dwarf2.patch
+ 140 gcc32-tls.patch
+   4 gcc32-tls2.patch
+   4 gcc32-tls3.patch
+   4 gcc32-tls4.patch
+   4 gcc32-tls5.patch
+  24 gcc32-tree-code.patch
+   4 gcc32-trunc_int_for_mode.patch
+   4 gcc32-typeof-asm.patch
+   4 gcc32-x86_64-libiberty-pic.patch
+   4 gcc32-x86_64-pr7559.patch
+   4 gcc32-x86_64-q_regs_operand.patch
+   4 gcc32-x86_64-rip-lowercase.patch
+   4 libjava-cross.patch
+   4 libtool-libs.patch
+   4 libtool-mips.patch
+
+---------- gcc32.spec ---------
+
+%if %{_arch} != %{_build_arch}
+%define cross_compile 1
+%else
+%define cross_compile 0
+%endif
+%{?_with_crosscompile: %{expand: %%define cross_compile 1}}
+
+%if %{cross_compile}
+%define make_check 0
+%else
+%define make_check 1
+%endif
+%{?_without_check: %{expand: %%define make_check 0}}
+%{?_with_check: %{expand: %%define make_check 1}}
+
+%define default 0
+%{?_with_default: %{expand: %%define default 1}}
+
+%define gcconly 0
+%{?_with_gcconly: %{expand: %%define gcconly 1}}
+
+%define DATE 20020903
+%define gcc_version 3.2
+%define gcc_release 7.1
+%ifarch %{ix86} alpha ia64 ppc
+%define build_ada 1
+%else
+%define build_ada 0
+%endif
+%{?_without_ada: %{expand: %%define build_ada 0}}
+%if %{cross_compile}
+%define build_ada 0
+%endif
+Summary: Various compilers (C, C++, Objective-C, Java, ...)
+%if !%{gcconly}
+Name: gcc
+Version: 3.2
+Release: %{gcc_release}
+%else
+Name: gcc-%{gcc_version}
+Version: %{gcc_release}
+Release: 1
+%endif
+Copyright: GPL
+Group: Development/Languages
+Source0: gcc-%{version}-%{DATE}.tar.bz2
+URL: http://gcc.gnu.org
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+BuildRequires: binutils >= 2.12.90.0.9-1
+BuildRequires: zlib-devel, gettext, dejagnu
+# Make sure pthread.h doesn't contain __thread tokens
+BuildRequires: glibc-devel >= 2.2.5-36.2
+%if %{build_ada}
+# Ada requires Ada to build
+BuildRequires: gcc-gnat >= 3.1, libgnat >= 3.1
+%endif
+Requires: cpp = %{version}-%{release}
+# Need .eh_frame ld optimizations
+# Need proper visibility support
+Requires: binutils >= 2.12.90.0.7-1
+# Make sure gdb will understand DW_FORM_strp
+Conflicts: gdb < 5.1-2
+Requires: glibc-devel >= 2.2.5-36.2
+Requires: libgcc >= %{version}-%{release}
+%if !%{gcconly}
+Obsoletes: gcc3
+%endif
+Prereq: /sbin/install-info
+
+Patch1: gcc32-2.96-RH-compat.patch
+Patch2: gcc32-boehm-gc-libs.patch
+Patch3: gcc32-bogus-inline.patch
+Patch6: gcc32-fde-merge-compat.patch
+Patch7: gcc32-attr-visibility.patch
+Patch8: gcc32-attr-visibility2.patch
+Patch9: gcc32-duplicate-decl.patch
+Patch10: gcc32-trunc_int_for_mode.patch
+Patch11: gcc32-sparc-sll1.patch
+Patch12: gcc32-x86_64-q_regs_operand.patch
+Patch13: gcc32-dwarf2-pr6381.patch
+Patch14: gcc32-dwarf2-pr6436-test.patch
+Patch15: gcc32-c++-pretty_function.patch
+Patch16: gcc32-c++-tsubst-asm.patch
+Patch18: gcc32-i386-memtest-test.patch
+Patch19: gcc32-fold-const2.patch
+Patch21: gcc32-ada-addr2line.patch
+Patch22: gcc32-ada-link.patch
+Patch23: gcc32-java-no-rpath.patch
+Patch25: gcc32-s390-java.patch
+Patch26: gcc32-test-rotate.patch
+Patch27: gcc32-x86_64-libiberty-pic.patch
+Patch29: gcc32-test-rh65771.patch
+Patch30: gcc32-i386-default-momit-leaf-frame-pointer.patch
+Patch31: gcc32-i386-pic-label-thunk.patch
+Patch34: gcc32-pr6842.patch
+Patch35: gcc32-tls.patch
+Patch36: gcc32-i386-profile-olfp.patch
+Patch37: gcc32-tree-code.patch
+Patch38: gcc32-hard-reg-sharing.patch
+Patch39: gcc32-hard-reg-sharing2.patch
+Patch40: gcc32-c++-nrv-test.patch
+Patch41: gcc32-debug-pr7241.patch
+Patch42: gcc32-i386-pr7242.patch
+Patch43: gcc32-cfg-eh.patch
+Patch44: gcc32-attr-visibility3.patch
+Patch45: gcc32-tls2.patch
+Patch46: gcc32-fold-const-associate.patch
+Patch47: gcc32-inline-label.patch
+Patch48: gcc32-typeof-asm.patch
+Patch50: gcc32-rh69989.patch
+Patch51: gcc32-tls3.patch
+Patch52: gcc32-tls4.patch
+Patch54: gcc32-tls5.patch
+Patch55: gcc32-tls-dwarf2.patch
+Patch56: gcc32-x86_64-pr7559.patch
+Patch57: gcc32-loop-prefetch.patch
+Patch58: gcc32-doc-gcov.patch
+Patch59: gcc32-attr-visibility4.patch
+Patch60: gcc32-c++-tail-pad-backout.patch
+Patch61: gcc32-attr-visibility5.patch
+Patch62: gcc32-i386-no-default-momit-leaf-frame-pointer.patch
+Patch64: gcc32-x86_64-rip-lowercase.patch
+Patch65: gcc32-libstdc++-glibc23-1.patch
+Patch66: gcc32-libstdc++-glibc23-2.patch
+Patch67: gcc32-libstdc++-glibc23-3.patch
+Patch68: gcc32-libstdc++-glibc23-4.patch
+Patch69: gcc32-interface_only.patch
+
+%define _gnu %{nil}
+
+Patch10000: boehm-gc-mips.patch
+Patch10001: boehm-gc-LINUX.patch
+Patch10002: gcc-libffi-mips.patch
+
+Patch11000: gcc-mips-coff.patch
+Patch11001: gcc-mips-file.patch
+Patch11002: gcc-mips-ieee.patch
+Patch11003: gcc-mips-return.patch
+Patch11004: gcc-libstdc++-mips.patch
+Patch11005: libtool-mips.patch
+
+Patch12000: gcc-libgcc.patch
+
+Patch13000: gcc-ppc-linux.patch
+Patch13001: gcc-linux-crt.patch
+
+Patch14000: gcc-linux-atexit.patch
+Patch14001: gcc-test-atexit.patch
+
+Patch15000: gcc-var.patch
+Patch15001: gcc-copy.patch
+
+Patch16000: gcc-c++-template.patch
+Patch16001: gcc-testsuite-c++.patch
+
+Patch17000: gcc-cross.patch
+Patch17001: gcc-cross-bfd.patch
+Patch17002: gcc-sizeof.patch
+Patch17003: gcc-arch.patch
+
+Patch18000: libjava-cross.patch
+Patch18001: gcc-gcj-cross.patch
+
+Patch19000: contrib-touch.patch
+
+Patch20000: libtool-libs.patch
+
+Patch21000: gcc-libstdc++-glibc-2.2.patch
+
+%description
+The gcc package contains the GNU Compiler Collection version 3.2.
+You'll need this package in order to compile C code.
+
+%package -n libgcc
+Summary: GCC version 3.2 shared support library
+Group: System Environment/Libraries
+
+%description -n libgcc
+This package contains GCC shared support library which is needed
+e.g. for exception handling support.
+
+%package c++
+Summary: C++ support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libstdc++ = %{version}
+Requires: libstdc++-devel = %{version}
+Obsoletes: gcc3-c++
+
+%description c++
+This package adds C++ support to the GNU Compiler Collection.
+It includes support for most of the current C++ specification,
+including templates and exception handling.
+
+%package -n libstdc++
+Summary: GNU Standard C++ Library
+Group: System Environment/Libraries
+Obsoletes: libstdc++3
+
+%description -n libstdc++
+The libstdc++ package contains a rewritten standard compliant GCC Standard
+C++ Library.
+
+%package -n libstdc++-devel
+Summary: Header files and libraries for C++ development
+Group: Development/Libraries
+Requires: libstdc++ = %{version}-%{release}
+Obsoletes: libstdc++3-devel
+
+%description -n libstdc++-devel
+This is the GNU implementation of the standard C++ libraries.  This
+package includes the header files and libraries needed for C++
+development. This includes rewritten implementation of STL.
+
+%package objc
+Summary: Objective-C support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libobjc = %{version}-%{release}
+Obsoletes: gcc3-objc
+
+%description objc
+gcc-objc provides Objective-C support for the GCC.
+Mainly used on systems running NeXTSTEP, Objective-C is an
+object-oriented derivative of the C language.
+
+%package -n libobjc
+Summary: Objective-C runtime
+Group: System Environment/Libraries
+
+%description -n libobjc
+This package contains Objective-C shared library which is needed to run
+Objective-C dynamically linked programs.
+
+%package g77
+Summary: Fortran 77 support
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libf2c = %{version}-%{release}
+Prereq: /sbin/install-info
+Obsoletes: gcc3-g77
+
+%description g77
+The gcc-g77 package provides support for compiling Fortran 77
+programs with the GNU Compiler Collection.
+
+%package -n libf2c
+Summary: Fortran 77 runtime
+Group: System Environment/Libraries
+
+%description -n libf2c
+This package contains Fortran 77 shared library which is needed to run
+Fortran 77 dynamically linked programs.
+
+%package java
+Summary: Java support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+Requires: libgcj >= %{version}, libgcj-devel >= %{version}
+Obsoletes: gcc3-java
+Prereq: /sbin/install-info
+
+%description java
+This package adds support for compiling Java(tm) programs and
+bytecode into native code.
+
+%package -n libgcj
+Summary: Java runtime library for gcc
+Group: System Environment/Libraries
+Requires: zip >= 2.1
+Obsoletes: gcc-libgcj
+Obsoletes: libgcj3
+# Kaffe includes jar too
+Conflicts: kaffe
+
+%description -n libgcj
+The Java(tm) runtime library. You will need this package to run your Java
+programs compiled using the Java compiler from GNU Compiler Collection (gcj).
+
+%package -n libgcj-devel
+Summary: Libraries for Java development using GCC
+Group: Development/Languages
+Requires: zip >= 2.1, libgcj = %{version}
+Obsoletes: libgcj3-devel
+
+%description -n libgcj-devel
+The Java(tm) static libraries and C header files. You will need this
+package to compile your Java programs using the GCC Java compiler (gcj).
+
+%package -n cpp
+Summary: The C Preprocessor.
+Group: Development/Languages
+Prereq: /sbin/install-info
+%ifarch ia64
+Obsoletes: gnupro
+%endif
+
+%description -n cpp
+Cpp is the GNU C-Compatible Compiler Preprocessor.
+Cpp is a macro processor which is used automatically
+by the C compiler to transform your program before actual
+compilation. It is called a macro processor because it allows
+you to define macros, abbreviations for longer
+constructs.
+
+The C preprocessor provides four separate functionalities: the
+inclusion of header files (files of declarations that can be
+substituted into your program); macro expansion (you can define macros,
+and the C preprocessor will replace the macros with their definitions
+throughout the program); conditional compilation (using special
+preprocessing directives, you can include or exclude parts of the
+program according to various conditions); and line control (if you use
+a program to combine or rearrange source files into an intermediate
+file which is then compiled, you can use line control to inform the
+compiler about where each source line originated).
+
+You should install this package if you are a C programmer and you use
+macros.
+
+%package gnat
+Summary: Ada 95 support for GCC
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}, libgnat = %{version}-%{release}
+Obsoletes: gnat-devel, gcc3-gnat
+Prereq: /sbin/install-info
+
+%description gnat
+GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools,
+the documents and Ada 95 compiler.
+
+%package -n libgnat
+Summary: GNU Ada 95 runtime shared libraries
+Group: System Environment/Libraries
+Obsoletes: gnat libgnat3
+
+%description -n libgnat
+GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries,
+which are required to run programs compiled with the GNAT.
+
+%prep
+%setup -q -n gcc-%{version}-%{DATE}
+%patch1 -p0 -b .2.96-RH-compat~
+%patch2 -p0 -b .boehm-gc-libs~
+%patch3 -p0 -b .bogus-inline~
+%patch6 -p0 -b .fde-merge-compat~
+%patch7 -p0 -b .attr-visibility~
+%patch8 -p0 -b .attr-visibility2~
+%patch9 -p0 -b .duplicate-decl~
+%patch10 -p0 -b .trunc_int_for_mode~
+%patch11 -p0 -b .sparc-sll1~
+%patch12 -p0 -b .x86_64-q_regs_operand~
+%patch13 -p0 -b .dwarf2-pr6381~
+%patch14 -p0 -b .dwarf2-pr6436-test~
+%patch15 -p0 -b .c++-pretty_function~
+%patch16 -p0 -b .c++-tsubst-asm~
+%patch18 -p0 -b .i386-memtest-test~
+%patch19 -p0 -b .fold-const2~
+%patch21 -p0 -b .ada-addr2line~
+%patch22 -p0 -b .ada-link~
+%patch23 -p0 -b .java-no-rpath~
+%patch25 -p0 -b .s390-java~
+%patch26 -p0 -b .test-rotate~
+%patch27 -p0 -b .x86_64-libiberty-pic~
+%patch29 -p0 -b .test-rh65771~
+%patch30 -p0 -b .i386-default-momit-leaf-frame-pointer~
+%patch31 -p0 -b .i386-pic-label-thunk~
+%patch34 -p0 -b .pr6842~
+%patch35 -p0 -b .tls~
+%patch36 -p0 -b .i386-profile-olfp~
+%patch37 -p0 -b .tree-code~
+%patch38 -p0 -b .hard-reg-sharing~
+%patch39 -p0 -b .hard-reg-sharing2~
+%patch40 -p0 -b .c++-nrv-test~
+%patch41 -p0 -b .debug-pr7241~
+%patch42 -p0 -b .i386-pr7242~
+%patch43 -p0 -b .cfg-eh~
+%patch44 -p0 -b .attr-visibility3~
+%patch45 -p0 -b .tls2~
+%patch46 -p0 -b .fold-const-associate~
+%patch47 -p0 -b .inline-label~
+%patch48 -p0 -b .typeof-asm~
+%patch50 -p0 -b .rh69989~
+%patch51 -p0 -b .tls3~
+%patch52 -p0 -b .tls4~
+%patch54 -p0 -b .tls5~
+%patch55 -p0 -b .tls-dwarf2~
+%patch56 -p0 -b .x86_64-pr7559~
+%patch57 -p0 -b .loop-prefetch~
+%patch58 -p0 -b .doc-gcov~
+%patch59 -p0 -b .attr-visibility4~
+%patch60 -p0 -b .c++-tail-pad-backout~
+%patch61 -p0 -b .attr-visibility5~
+%patch62 -p0 -b .i386-no-default-momit-leaf-frame-pointer~
+%patch64 -p0 -b .x86_64-rip-lowercase~
+%patch65 -p0 -b .libstdc++-glibc23-1~
+%patch66 -p0 -b .libstdc++-glibc23-2~
+%patch67 -p0 -b .libstdc++-glibc23-3~
+%patch68 -p0 -b .libstdc++-glibc23-4~
+%patch69 -p0 -b .interface_only
+
+%patch10000 -p0 -b .mips
+%patch10001 -p0 -b .LINUX
+%patch10002 -p0 -b .mips
+pushd boehm-gc
+autoconf
+popd
+pushd libffi
+autoconf
+# Ignore the error from automake
+automake --cygnus Makefile || :
+popd
+
+%patch11000 -p0 -b .coff
+%patch11001 -p0 -b .file
+%patch11002 -p0 -b .ieee
+%patch11003 -p0 -b .return
+%patch11004 -p0 -b .mips
+%patch11005 -p1 -b .mips
+
+%patch12000 -p0 -b .libgcc
+
+%patch13000 -p0 -b .ppc
+%patch13001 -p0 -b .crt
+
+%patch14000 -p0 -b .order
+%patch14001 -p0 -b .order
+
+%patch15000 -p0 -b .var
+%patch15001 -p0 -b .copy
+
+%patch16000 -p0 -b .template
+%patch16001 -p0 -b .template
+
+%patch17000 -p1 -b .cross
+%patch17001 -p0 -b .cross-bfd
+%patch17002 -p1 -b .sizeof
+%patch17003 -p0 -b .arch
+pushd gcc
+autoheader
+autoconf
+popd
+pushd fastjar
+aclocal
+autoconf
+popd
+pushd libffi
+aclocal
+autoconf
+popd
+
+%patch18000 -p0 -b .cross
+%patch18001 -p0 -b .build
+pushd libjava
+autoconf
+automake --foreign Makefile
+popd
+
+%patch19000 -p0 -b .touch
+
+%patch20000 -p0 -b .libs
+
+%patch21000 -p0 -b .glibc-2.2
+pushd libstdc++-v3
+autoconf
+popd
+
+perl -pi -e 's/3\.2\.1/3.2/' gcc/version.c gcc/f/version.c gcc/ada/gnatvsn.ads
+perl -pi -e 's/"%{gcc_version}"/"%{gcc_version} \(release\)"/' gcc/version.c
+perl -pi -e 's/\((prerelease|experimental|release)\)/\(Red Hat Linux 8.0 %{version}-%{gcc_release}\)/' gcc/version.c gcc/f/version.c
+perl -pi -e 's/\((prerelease|experimental|release)\)/\(%{version}-%{gcc_release}\)/' gcc/ada/gnatvsn.ads
+perl -pi -e 's/#define GCCBUGURL.*$/#define GCCBUGURL "<URL:http:\/\/bugzilla.redhat.com\/bugzilla\/>"/' gcc/system.h
+# The version string is now longer than 32 bytes and the line containing it
+# doesn't fit into 80 columns
+#perl -pi -e 's/:= 32/:= 64/;s/(Gnat_Version_String.*:=)/\1\n    /' gcc/ada/gnatvsn.ads
+
+./contrib/gcc_update --touch
+
+%build
+rm -fr obj-%{_target_platform}
+mkdir obj-%{_target_platform}
+cd obj-%{_target_platform}
+
+%if %{_arch} != %{_build_arch}
+%ifos linux
+export ac_cv_func_mmap_anywhere=yes
+export ac_cv_func_mmap_file=yes
+export ac_cv_func_mmap_fixed_mapped=yes
+export ac_cv_func_strncmp_works=yes
+export gcc_cv_func_printf_ptr=yes
+%endif
+%endif
+
+DEFAULT_FLAGS=
+%if %{default}
+%ifarch %{ix86}
+TARGET_CPU="%{_target_cpu}"
+DEFAULT_FLAGS="--with-arch=$TARGET_CPU --with-cpu=$TARGET_CPU"
+%endif
+%endif
+
+CC=%{__cc}
+OPT_FLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/-fno-rtti//g' -e 's/-fno-exceptions//g'`
+CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$OPT_FLAGS" XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \
+	../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
+	--enable-shared --enable-threads=posix --disable-checking --host=%{_target_platform} \
+	$DEFAULT_FLAGS \
+%if %{cross_compile}
+	--target=%{_target_platform} --build=%{_build_alias} \
+%endif
+	--with-system-zlib --enable-__cxa_atexit
+
+# We have to make sure all gcc configure files are up to date for
+# parallel build. We have to do it twice due to the stupid Makefile.
+make -C gcc cstamp-h
+make -C gcc cstamp-h
+
+# if RPM_BUILD_NCPUS unset, set it
+if [ -z "$RPM_BUILD_NCPUS" ] ; then
+  if [ -x /usr/bin/getconf ] ; then
+    RPM_BUILD_NCPUS=$(/usr/bin/getconf _NPROCESSORS_ONLN)
+    if [ $RPM_BUILD_NCPUS -eq 0 ]; then
+      RPM_BUILD_NCPUS=1
+    fi
+  else
+    RPM_BUILD_NCPUS=1
+  fi
+fi
+
+RPM_BUILD_NCPUS=`expr $RPM_BUILD_NCPUS + $RPM_BUILD_NCPUS`
+
+cat <<EOF > makefile
+MAKE=make -j $RPM_BUILD_NCPUS
+include Makefile
+CFLAGS:=\$(CFLAGS) -pipe
+CXXFLAGS:=\$(CXXFLAGS) -pipe
+EOF
+
+# FIXME: It is a kludge.
+export GCJFLAGS="$OPT_FLAGS"
+
+%if %{cross_compile}
+make -j$RPM_BUILD_NCPUS \
+	CC=%{__cc} \
+	CXX=%{__cxx} \
+	AR=%{__ar} \
+	AS=%{__as} \
+	LD=%{__ld} \
+	NM=%{__nm} \
+	RANLIB=%{__ranlib} \
+	CC_FOR_TARGET=%{__cc} \
+	GCC_FOR_TARGET=%{__cc} \
+	CXX_FOR_TARGET=%{__cxx} \
+	AR_FOR_TARGET=%{__ar} \
+	AS_FOR_TARGET=%{__as} \
+	LD_FOR_TARGET=%{__ld} \
+	NM_FOR_TARGET=%{__nm} \
+	RANLIB_FOR_TARGET=%{__ranlib} \
+	HOST_CC=cc \
+	CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \
+	CFLAGS_FOR_BUILD="-O -pipe" \
+	CFLAGS="$RPM_OPT_FLAGS -pipe" \
+	CXXFLAGS="$RPM_OPT_FLAGS -pipe"
+%else
+make -j$RPM_BUILD_NCPUS bootstrap-lean
+#make -j$RPM_BUILD_NCPUS bootstrap
+%endif
+
+%if %{build_ada}
+# This doesn't work with -j$RPM_BUILD_NCPUS
+make -C gcc gnatlib-shared
+make -C gcc gnattools
+make -C gcc/ada doc
+%endif
+
+%if %{make_check}
+# run the tests.
+make -j$RPM_BUILD_NCPUS -k check || :
+%ifarch %{ix86}
+ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}
+ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}-gnu
+%endif
+echo ====================TESTING=========================
+( ../contrib/test_summary || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}'
+%ifarch %{ix86}
+make -C %{_target_platform}/libstdc++-v3 check-abi
+%endif
+echo ====================TESTING END=====================
+#cd %{_target_platform}/libstdc++-v3
+#./mkcheck 0
+#cd ../..
+%endif
+
+%if !%{cross_compile}
+# Make protoize
+make -C gcc CC="./xgcc -B ./ -O2" proto
+%endif
+
+# Make generated man pages even if Pod::Man is not new enough
+perl -pi -e 's/head3/head2/' ../contrib/texi2pod.pl
+for i in ../gcc/doc/*.texi; do
+  cp -a $i $i.orig; sed 's/ftable/table/' $i.orig > $i
+done
+make -C gcc generated-manpages
+for i in ../gcc/doc/*.texi; do mv -f $i.orig $i; done
+
+# Copy various doc files here and there
+cd ..
+mkdir -p rpm.doc/g77 rpm.doc/objc
+mkdir -p rpm.doc/boehm-gc rpm.doc/fastjar rpm.doc/libffi rpm.doc/libjava
+
+(cd gcc/f; for i in ChangeLog*; do
+	cp -p $i ../../rpm.doc/g77/$i.f
+done)
+(cd libf2c; for i in ChangeLog*; do
+	cp -p $i ../rpm.doc/g77/$i.libf2c
+done)
+(cd gcc/objc; for i in README*; do
+	cp -p $i ../../rpm.doc/objc/$i.objc
+done)
+(cd libobjc; for i in README*; do
+	cp -p $i ../rpm.doc/objc/$i.libobjc
+done)
+(cd boehm-gc; for i in ChangeLog*; do
+	cp -p $i ../rpm.doc/boehm-gc/$i.gc
+done)
+(cd fastjar; for i in ChangeLog* README*; do
+	cp -p $i ../rpm.doc/fastjar/$i.fastjar
+done)
+(cd libffi; for i in ChangeLog* README* LICENSE; do
+	cp -p $i ../rpm.doc/libffi/$i.libffi
+done)
+(cd libjava; for i in ChangeLog* README*; do
+	cp -p $i ../rpm.doc/libjava/$i.libjava
+done)
+
+%install
+rm -fr $RPM_BUILD_ROOT
+
+perl -pi -e \
+  's~href="l(ibstdc|atest)~href="http://gcc.gnu.org/onlinedocs/libstdc++/l\1~' \
+  libstdc++-v3/docs/html/documentation.html
+ln -sf documentation.html libstdc++-v3/docs/html/index.html
+find libstdc++-v3/docs/html -name CVS | xargs rm -rf
+
+cd obj-%{_target_platform}
+TARGET_PLATFORM=%{_target_platform}
+
+# There are some MP bugs in libstdc++ and libjava Makefiles
+make -C %{_target_platform}/libstdc++-v3
+make -C %{_target_platform}/libjava
+
+make prefix=$RPM_BUILD_ROOT%{_prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \
+%if %{cross_compile}
+	CC=%{__cc} \
+	CXX=%{__cxx} \
+	AR=%{__ar} \
+	AS=%{__as} \
+	LD=%{__ld} \
+	NM=%{__nm} \
+	RANLIB=%{__ranlib} \
+	CC_FOR_TARGET=%{__cc} \
+	GCC_FOR_TARGET=%{__cc} \
+	CXX_FOR_TARGET=%{__cxx} \
+	AR_FOR_TARGET=%{__ar} \
+	AS_FOR_TARGET=%{__as} \
+	LD_FOR_TARGET=%{__ld} \
+	NM_FOR_TARGET=%{__nm} \
+	RANLIB_FOR_TARGET=%{__ranlib} \
+	HOST_CC=cc \
+	CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \
+	CFLAGS_FOR_BUILD="-O -pipe" \
+	CFLAGS="$RPM_OPT_FLAGS -pipe" \
+	CXXFLAGS="$RPM_OPT_FLAGS -pipe" \
+%endif
+  infodir=$RPM_BUILD_ROOT%{_infodir} install
+%if %{build_ada}
+pushd gcc/ada
+cp -a gnat-style.info* gnat_rm.info* $RPM_BUILD_ROOT%{_infodir}/
+for i in gnat_ug_unx.info*; do
+  sed 's/gnat_ug_unx/gnat_ug/g' $i > $RPM_BUILD_ROOT%{_infodir}/`echo $i | sed 's/gnat_ug_unx/gnat_ug/'`
+done
+chmod 644 $RPM_BUILD_ROOT%{_infodir}/gnat*
+popd
+%endif
+
+FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1)
+
+file $RPM_BUILD_ROOT/%{_prefix}/bin/* | grep ELF | cut -d':' -f1 | xargs %{__strip} || :
+%{__strip} $FULLPATH/{cc1,cc1obj,cc1plus,cpp0,tradcpp0,f771,jc1,jvgenmain}
+
+# fix some things
+ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/cc
+mkdir -p $RPM_BUILD_ROOT/lib
+ln -sf ..%{_prefix}/bin/cpp $RPM_BUILD_ROOT/lib/cpp
+ln -sf g77 $RPM_BUILD_ROOT%{_prefix}/bin/f77
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+gzip -9 $RPM_BUILD_ROOT%{_infodir}/*.info*
+ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/gnatgcc
+
+mv $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.*a $FULLPATH/
+sed 's/-lgcjgc//g;s/-lzgcj//g;s/-lpthread//g' $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.spec > $FULLPATH/libgcj.spec
+mv $RPM_BUILD_ROOT%{_prefix}/include/gc*.h $FULLPATH/include/
+mv $RPM_BUILD_ROOT%{_prefix}/include/j*.h $FULLPATH/include/
+mv -f $RPM_BUILD_ROOT%{_prefix}/include/{java,javax,gnu,org} $FULLPATH/include/
+mkdir -p $FULLPATH/include/gcj
+mv -f $RPM_BUILD_ROOT%{_prefix}/include/gcj/* $FULLPATH/include/gcj/
+rmdir $RPM_BUILD_ROOT%{_prefix}/include/gcj
+
+mkdir -p $RPM_BUILD_ROOT/%{_lib}
+mv -f `find $RPM_BUILD_ROOT%{_prefix}/lib -name libgcc_s.so.1` $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+chmod 755 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s.so.1
+ln -sf ../../%{_lib}/libgcc_s.so.1 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so
+#ln -sf `echo "%{_prefix}" | sed 's~/[^/]*~\.\./~g'`../%{_lib}/libgcc_s.so.1 \
+#  $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so
+#mv -f $FULLPATH/libobjc.so.1* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+%if %{build_ada}
+mv -f $FULLPATH/adalib/libgnarl-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+mv -f $FULLPATH/adalib/libgnat-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/
+rm -f $FULLPATH/adalib/libgnarl.so* $FULLPATH/adalib/libgnat.so*
+%endif
+pushd $FULLPATH
+if [ "%{_lib}" = "lib" ]; then
+ln -sf ../../../libobjc.so.1 libobjc.so
+ln -sf ../../../libstdc++.so.5.* libstdc++.so
+ln -sf ../../../libgcj.so.3.* libgcj.so
+ln -sf ../../../libg2c.so.0.* libg2c.so
+%if %{build_ada}
+cd adalib
+ln -sf ../../../../libgnarl-*.so.* libgnarl.so
+ln -sf ../../../../libgnat-*.so.* libgnat.so
+cd ..
+%endif
+else
+ln -sf ../../../../%{_lib}/libobjc.so.1 libobjc.so
+ln -sf ../../../../%{_lib}/libstdc++.so.5.* libstdc++.so
+ln -sf ../../../../%{_lib}/libgcj.so.3.* libgcj.so
+ln -sf ../../../../%{_lib}/libg2c.so.0.* libg2c.so
+%if %{build_ada}
+cd adalib
+ln -sf ../../../../../%{_lib}/libgnarl-*.so.* libgnarl.so
+ln -sf ../../../../../%{_lib}/libgnat-*.so.* libgnat.so
+cd ..
+%endif
+fi
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libstdc++.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libsupc++.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libfrtbegin.*a .
+mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.*a .
+# Strip debug info from Fortran/ObjC/Java static libraries
+%{__strip} -g libg2c.a libobjc.a libgcj.a
+# Fix up .la files
+for i in *.la; do
+  sed -e '/^libdir/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \
+      -e '/^dependency_libs/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \
+      -e '/^dependency_libs/s~'\''$~ '\''~' \
+      -e '/^dependency_libs/s~[ 	][ 	]*~ ~g' \
+      -e '/^dependency_libs/s~-L[^ ]* ~~g' \
+      -e '/^dependency_libs/s~-lgcc_s -lgcc -lc -lgcc_s -lgcc ~~g' \
+      -e '/^dependency_libs/s~-lgcc -lc -lgcc ~~g' \
+      -e '/^dependency_libs/s~-lc ~~g' \
+      -e '/^dependency_libs/s~-lm \(-lm \)*~-lm ~g' \
+      $i > $i.tmp
+  mv -f $i.tmp $i
+done
+popd
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.so.0.*
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.so.1.*
+%if %{build_ada}
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnarl*so*
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnat*so*
+%endif
+
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/c89 <<"EOF"
+#!/bin/sh
+fl="-std=c89"
+for opt; do
+  case "$opt" in
+    -ansi|-std=c89|-std=iso9899:1990) fl="";;
+    -std=*) echo "`basename $0` called with non ANSI/ISO C option $opt" >&2
+	    exit 1;;
+  esac
+done
+exec %{_prefix}/bin/gcc $fl ${1+"$@"}
+EOF
+cat > $RPM_BUILD_ROOT%{_prefix}/bin/c99 <<"EOF"
+#!/bin/sh
+fl="-std=c99"
+for opt; do
+  case "$opt" in
+    -std=c99|-std=iso9899:1999) fl="";;
+    -std=*) echo "`basename $0` called with non ISO C99 option $opt" >&2
+	    exit 1;;
+  esac
+done
+exec %{_prefix}/bin/gcc $fl ${1+"$@"}
+EOF
+chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/c?9
+
+cd ..
+%find_lang %{name}
+
+%if %{cross_compile}
+# Install syslimits.h for canadian cross compile.
+pushd $RPM_BUILD_DIR/gcc-%{gcc_version}-%{DATE}/obj-%{_target_platform}
+cp -af ../gcc/gsyslimits.h $FULLPATH/include/syslimits.h
+# Fix the specs file.
+cat gcc/specs |
+awk '
+BEGIN {
+  cross=0;
+}
+/cross_compile/ { print; cross = 1; next; }
+/^1$/ {
+  if (cross == 0) {
+    print;
+  }
+  else {
+    cross = 0;
+    print "0";
+  }
+  next;
+}
+{ print; }
+' > $FULLPATH/specs
+popd
+%endif
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/gcc.info.gz
+
+%preun
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/gcc.info.gz
+fi
+
+%post -n cpp
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/cpp.info.gz
+
+%preun -n cpp
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/cpp.info.gz
+fi
+
+%post g77
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/g77.info.gz
+
+%preun g77
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/g77.info.gz
+fi
+
+%post java
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/gcj.info.gz
+
+%preun java
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/gcj.info.gz
+fi
+
+%post gnat
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz
+/sbin/install-info \
+  --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz
+
+%preun gnat
+if [ $1 = 0 ]; then
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz
+  /sbin/install-info --delete \
+    --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz
+fi
+
+%post -n libgcc -p /sbin/ldconfig
+
+%postun -n libgcc -p /sbin/ldconfig
+
+%post -n libstdc++ -p /sbin/ldconfig
+
+%postun -n libstdc++ -p /sbin/ldconfig
+
+%post -n libobjc -p /sbin/ldconfig
+
+%postun -n libobjc -p /sbin/ldconfig
+
+%post -n libgcj -p /sbin/ldconfig
+
+%postun -n libgcj -p /sbin/ldconfig
+
+%post -n libf2c -p /sbin/ldconfig
+
+%postun -n libf2c -p /sbin/ldconfig
+
+%post -n libgnat -p /sbin/ldconfig
+
+%postun -n libgnat -p /sbin/ldconfig
+
+%files -f %{name}.lang
+%defattr(-,root,root)
+%{_prefix}/bin/cc
+%{_prefix}/bin/c89
+%{_prefix}/bin/c99
+%{_prefix}/bin/gcc
+%{_prefix}/bin/gcov
+%if !%{cross_compile}
+%{_prefix}/bin/protoize
+%{_prefix}/bin/unprotoize
+%endif
+%{_prefix}/bin/%{_target_platform}-gcc
+%{_mandir}/man1/gcc.1*
+%{_mandir}/man1/gcov.1*
+%{_infodir}/gcc*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stddef.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/varargs.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/float.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/limits.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/iso646.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/syslimits.h
+%ifarch %{ix86} x86_64
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/mmintrin.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/xmmintrin.h
+%endif
+%ifarch ia64
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ia64intrin.h
+%endif
+%ifarch ppc
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ppc-asm.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/altivec.h
+%endif
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/README
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/collect2
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/crt*.o
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc_eh.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/specs
+%{_prefix}/%{_lib}/libgcc_s.so
+%doc gcc/README* gcc/*ChangeLog*
+
+%if !%{gcconly}
+%files -n cpp
+%defattr(-,root,root)
+/lib/cpp
+%endif
+%{_prefix}/bin/cpp
+%{_mandir}/man1/cpp.1*
+%{_infodir}/cpp*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cpp0
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/tradcpp0
+
+%files -n libgcc
+%defattr(-,root,root)
+/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1
+/%{_lib}/libgcc_s.so.1
+
+%if !%{gcconly}
+%files c++
+%defattr(-,root,root)
+%{_prefix}/bin/%{_target_platform}-*++
+%{_prefix}/bin/g++
+%{_prefix}/bin/c++
+%{_prefix}/bin/c++filt
+%{_mandir}/man1/g++.1*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1plus
+%doc gcc/cp/ChangeLog*
+
+%files -n libstdc++
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libstdc++.so.5*
+
+%files -n libstdc++-devel
+%defattr(-,root,root)
+%{_prefix}/include/c++
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libsupc++.a
+%doc libstdc++-v3/ChangeLog* libstdc++-v3/README* libstdc++-v3/docs/html/
+
+%files objc
+%defattr(-,root,root)
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/objc
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1obj
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.so
+%doc rpm.doc/objc/*
+%doc libobjc/THREADS* libobjc/ChangeLog
+
+%files -n libobjc
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libobjc.so.1*
+
+%files g77
+%defattr(-,root,root)
+%{_prefix}/bin/g77
+%{_prefix}/bin/f77
+%{_mandir}/man1/g77.1*
+%{_infodir}/g77*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/f771
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libfrtbegin.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/g2c.h
+%doc gcc/f/README rpm.doc/g77/*
+
+%files -n libf2c
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libg2c.so.0*
+
+%files java
+%defattr(-,root,root)
+%{_prefix}/bin/gcj
+%{_prefix}/bin/gcjh
+%{_prefix}/bin/jcf-dump
+%{_prefix}/bin/jv-scan
+%{_mandir}/man1/gcj.1*
+%{_mandir}/man1/gcjh.1*
+%{_mandir}/man1/jcf-dump.1*
+%{_mandir}/man1/jv-scan.1*
+%{_infodir}/gcj*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jc1
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jvgenmain
+%doc gcc/java/ChangeLog*
+
+%files -n libgcj
+%defattr(-,root,root)
+%{_prefix}/bin/jv-convert
+%{_prefix}/bin/gij
+%{_prefix}/bin/jar
+%{_prefix}/bin/grepjar
+%{_prefix}/bin/rmic
+%{_prefix}/bin/rmiregistry
+%{_mandir}/man1/jv-convert.1*
+%{_mandir}/man1/gij.1*
+%{_mandir}/man1/rmic.1*
+%{_mandir}/man1/rmiregistry.1*
+%{_prefix}/%{_lib}/libgcj.so.*
+%{_prefix}/share/java
+%{_prefix}/lib/security
+
+%files -n libgcj-devel
+%defattr(-,root,root)
+%{_prefix}/bin/addr2name.awk
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.a
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.so
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.spec
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gc*.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/j*.h
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/java
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/javax
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gnu
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gcj
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/org
+%doc rpm.doc/boehm-gc/* rpm.doc/fastjar/* rpm.doc/libffi/*
+%doc rpm.doc/libjava/*
+
+%if %{build_ada}
+%files gnat
+%defattr(-,root,root)
+%{_prefix}/bin/gnat*
+%{_infodir}/gnat*
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}
+%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adainclude
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adalib
+%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/gnat1
+%doc gcc/ada/ChangeLog
+
+%files -n libgnat
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libgnat-*.so.*
+%{_prefix}/%{_lib}/libgnarl-*.so.*
+%endif
+%endif
+
+%changelog
+* Tue Sep  3 2002 Bill Nottingham <notting@redhat.com> 3.2-7
+- fix calling of C++ destructors in certain cases
+
+* Tue Sep  3 2002 Jakub Jelinek <jakub@redhat.com> 3.2-6
+- update from CVS (but revert C++ tail padding patches
+  for now)
+- further fixes to make libstdc++-v3 build on glibc 2.3
+- run libstdc++-v3 make check-abi on IA-32 during testing
+
+* Fri Aug 30 2002 Jakub Jelinek <jakub@redhat.com> 3.2-5
+- disable tail copy patches, they seem to still have problems
+- make libstdc++-v3 build on glibc 2.3 (and use thread-local
+  locale model)
+- fix c89 and c99 scripts (#73104)
+
+* Wed Aug 26 2002 Jakub Jelinek <jakub@redhat.com> 3.2-4
+- reorder alpha_encode_section_info checks slightly to fix an ICE
+  when building glibc and to take better advantage of visibility
+  attribute on Alpha
+- as gdb is not there yet, disable -momit-leaf-frame-pointer
+  by default for now on IA-32
+- fix IA-64 bootstrap with tail padding patch (Jason Merrill, Daniel Berlin)
+- fix x86-64 %RIP to %rip, only output (%rip) if no other relocation
+  is used (Richard Henderson)
+
+* Fri Aug 23 2002 Jakub Jelinek <jakub@redhat.com> 3.2-3
+- take advantage of __attribute__((visibility())) on Alpha
+- avoid copying tail padding (Jason Merrill)
+
+* Thu Aug 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-2
+- fixed Dwarf2 DW_OP_GNU_push_tls_address patch from Richard Henderson
+- don't mention removed -a and -ax options in the documentation
+  (Nathan Sidwell, #72233)
+- fixed __typeof() followed by __asm() redirection from Alexandre Oliva
+
+* Wed Aug 14 2002 Jakub Jelinek <jakub@redhat.com> 3.2-1
+- update to 3.2 release
+- fix x86-64 PR target/7559 (Jan Hubicka)
+- fix -fprefetch-loop-arrays (Janis Johnson)
+- fix x86-64 prefetch (Jan Hubicka)
+
+* Fri Aug  9 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.3
+- istream fix (Benjamin Kosnik)
+- emit Dwarf2 DW_OP_GNU_push_tls_address extension for TLS (Richard Henderson)
+- temporarily disable __typeof() + __asm() fix
+
+* Thu Aug  8 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.2
+- update from 3.2 branch
+  - ABI incompatible changes in libstdc++.so.5, long long bitfield
+    layout on IA-32 (both C and C++), oversized bitfields layout
+    on IA-32 and bitfields with base type with __attribute__((aligned ()))
+  - fix strstream segfaults (#68292, Benjamin Kosnik)
+- fix __attribute__((visibility())) together with __asm__()
+  function redirection
+- fix __typeof() followed by __asm() redirection (Alexandre Oliva)
+- fix TLS ICE on glibc (#70061)
+- fix K6 ICE on linux kernel (#69989, Richard Sandiford, Jan Hubicka)
+- fix inlining bug with labels (#70941)
+- fix fold-const bug (#70541)
+- fix PR preprocessor/7358 (Neil Booth)
+- error when mixing __thread and non-__thread declarations
+  (#70059, Aldy Hernandez)
+- fix TLS bug on g++.dg/tls/diag-1.C (Jason Merrill)
+- add -mcmodel= x86-64 documentation (Andreas Jaeger)
+- avoid TLS emitting movl %gs:0, MEMORY on IA-32 (#71033)
+
+* Mon Jul 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.1
+- first attempt for gcc 3.2
+- remove .la files
+
+* Sat Jul 20 2002 Jakub Jelinek <jakub@redhat.com> 3.1-10
+- update from 3.1 branch
+  - add throw() to set_new_handler (Andreas Schwab)
+  - fixed PR optimization/7147, optimization/7153
+- make sure pic register is set up even when the only @PLT calls
+  are done in EH basic blocks (Richard Henderson)
+
+* Sun Jul 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-9
+- define %%_gnu to nothing for compatibility
+
+* Sat Jul 13 2002 Jakub Jelinek <jakub@redhat.com> 3.1-8
+- update from 3.1 branch
+  - fix OpenOffice miscompilation (PR c++/7279, Jason Merrill)
+  - PRs c++/7224, c++/6255, optimization/7145, c++/6706, preprocessor/7070,
+    middle-end/6963, target/6841, target/6770, target/6719,
+    other/6836, libstdc++/7057, libstdc++/7097, libstdc++/3946,
+    libstdc++/7173
+  - fix a GC bug with named labels in C++ (Jim Wilson)
+  - fix ICE on Mesa (Bernd Schmidt, #65771)
+- added some NRV tests
+- fix typo in i386 specs (PR c/7242)
+- fix IA-32 ICE with shifts by negative values followed by compare
+  (PR middle-end/7245, #68395)
+- fixed DWARF-2 output for const char * (PR debug/7241)
+- actually enable __cxa_atexit for standard compliance at configury time
+- added PPC as Ada enabled architecture
+
+* Wed Jun 19 2002 Jakub Jelinek <jakub@redhat.com> 3.1-7
+- update from 3.1 branch
+  - PRs target/6922, opt/6722, c/7030, c/6677, objc/6834, c++/6892,
+    c++/6723, opt/6793
+- use __cxa_atexit for standard compliance:
+  if your C++ project knows it won't call atexit from within its
+  static constructors, use -fno-use-cxa-atexit to optimize it
+- share hard register rtxs where possible to speed the compiler up (Jeff Law)
+- optimize tree_code_* arrays (Kaveh Ghazi)
+- don't link prefix.o into libgnat, link libgnat against libgcc_s and
+  libgnarl against libgnat
+- fix typo in GNAT %%post (#66847, #66941, #66639)
+- add TLS support
+
+* Fri Jun  7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-6
+- add GNAT
+- remove DT_RPATH from Java binaries (#66103)
+- obsolete kaffe, install jar as %{_prefix}/bin/jar
+- add include/org directory in java
+- add rmic and rmiregistry programs to libgcj
+- add info documentation for gcj and various man pages
+- add message catalogues for da, el, es, fr, ja, nl, sv, tr
+- don't put IA-64 vtables with relocations into read-only sections
+  with -fpic
+
+* Tue Jun  4 2002 Jakub Jelinek <jakub@redhat.com> 3.1-5
+- update from 3.1 branch
+  - PRs optimization/6822, preprocessor/6844, target/6838, target/6788,
+	libstdc++/6886, libstdc++/6795, libstdc++/6811
+- m$ compatibility for unnamed fields as typedef of struct/union
+  (PR c/6660)
+- fix -fverbose-asm with unnamed fields (PR c/6809)
+- fix -mmmx ICE (PR optimization/6842)
+- default to -momit-leaf-frame-pointer on i386 (Richard Henderson)
+- use linkonce section/hidden symbol for i686 pic getpc thunks
+  (Richard Henderson)
+
+* Tue May 28 2002 Jakub Jelinek <jakub@redhat.com> 3.1-4
+- rebuilt
+
+* Sat May 25 2002 Jakub Jelinek <jakub@redhat.com> 3.1-3
+- update from 3.1 branch
+  - PRs other/6782, preprocessor/6780, preprocessor/6517,
+	libstdc++/6282, libstdc++/6701, libstdc++/6701
+  - fix out << "" bug (Ben Kosnik, #65409, PR libstdc++/6750)
+- 3 new patches
+  - fix C++ __PRETTY_FUNCTION__ (PR c++/6794)
+  - fix ICE on jikes (#65379)
+  - add test for fixed mozilla miscompilation
+- include intrinsic headers on IA-32/x86-64, include altivec.h on PPC
+
+* Wed May 22 2002 Jakub Jelinek <jakub@redhat.com> 3.1-2
+- update from 3.1 branch
+- 8 new patches
+  - fix as version test for 2.12.1 and newer binutils non-CVS releases
+  - fix ICE in do_subst (#65049)
+  - fix SSE conditional move (PR target/6753)
+  - fix SPARC CSE ICE (PR optimization/6759)
+  - fix x86_64 dbx64_register_map typo (Jan Hubicka)
+  - fix DWARF-2 with flag_asynchronous_unwind_tables set for leaf
+    functions (Jan Hubicka)
+  - fix DWARF-2 x86_64 __builtin_dwarf_reg_sizes (Jan Hubicka)
+  - fix x86_64 movabsdi (Michael Matz)
+
+* Wed May 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-1
+- update to 3.1 final
+- 15 new patches
+  - fix PR c/6643
+  - fix fold-const.c typo
+  - fix unitialized pointer-to-member values (Alexandre Oliva)
+  - fix templates with asm inputs (Jason Merrill)
+  - fix -fdata-section (Andreas Schwab)
+  - readd warning about i386 -malign-double into documentation (Jan Hubicka)
+  - fix PR libstdc++/6594 (Ben Kosnik)
+  - fix PR PR libstdc++/6648 (Paolo Carlini)
+  - fix libstdc++ testsuite rlimits (Rainer Orth)
+  - s390 java support (Gerhard Tonn)
+  - rotate testcases (Tom Rix)
+  - build libiberty with -fpic on x86_64 (Andreas Schwab)
+  - fix x86_64 multilib build (Bo Thorsen)
+  - fix x86_64 ASM_OUTPUT_MI_THUNK (Jan Hubicka)
+  - fix loop-2[cd].c tests on i386 (Eric Botcazou)
+- fix typo in g77 info files tweaking
+- fix libgcj.so symlink
+
+* Thu May  9 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.28
+- update to CVS 3.1 branch
+  - PR c++/6212, target/6429, opt/6534, c/6543, target/6561, c/6569
+- fix x86_64 q_regs_operand (Jan Hubicka)
+- better PR c++/6381 fix (Jason Merrill)
+
+* Fri May  3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.27
+- update to CVS 3.1 branch
+  - PR target/5628, libstdc++/5820, c++/6396, preprocessor/6489,
+    libstdc++/6501, libstdc++/6511, target/6512, libstdc++/6513,
+    bootstrap/6514, opt/6516, bootstrap/6525, c++/6527, libstdc++/6533,
+    target/6540
+- fix PR target/6542, target/6522, libstdc++/6549
+
+* Mon Apr 29 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.26
+- update to CVS 3.1 branch
+  - PR c/3581, libstdc++/4150, libstdc++/4164, c/5154, c/5430, c++/5504,
+    c++/5658, c++/5719, f/6138, libgcj/6158, middle-end/6205, c++/6256,
+    c/6300, c++/6331, c/6343, c/6344, c++/6352, c/6358, libstdc++/6360,
+    c++/6395, target/6413, libstdc++/6414, target/6422, bootstrap/6445,
+    optimization/6475, target/6476, c++/6477, c++/6479, c++/6486, c++/6492,
+    target/6494, target/6496, c/6497, target/6500
+- fix PR c++/6396
+- run make check as part of build process
+
+* Thu Apr 18 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.25
+- update to CVS 3.1 branch
+  - PR opt/420, c++/525, target/817, target/1538, opt/3967, target/3997,
+    opt/4120, bootstrap/4191, opt/4311, optimization/4328, c++/4884, c++/4934,
+    c/5078, c++/5104, opt/5120, c++/5189, c++/5373, target/5446, c/5484,
+    c++/5507, c++/5571, c++/5636, target/5672, target/5715, target/5886,
+    c++/5933, c++/5964, c++/5998, opt/6007, target/6032, target/6041,
+    target/6054, c++/6073, target/6082, optimization/6086, target/6087,
+    middle-end/6096, middle-end/6098, middle-end/6099, middle-end/6100,
+    middle-end/6102, fortran/6106, c++/6119, opt/6165, optimization/6177,
+    c++/6179, optimization/6189, c/6202, c/6223, optimization/6233,
+    middle-end/6279, c/6290, optimization/6305, target/6305, bootstrap/6315,
+    c++/6320...
+- fix PR c++/6316
+
+* Wed Mar 27 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.24
+- update to CVS 3.1 branch
+  - PRs c/5656, c/5972, bootstrap/4192, target/4792, bootstrap/4195,
+    optimization/5854, target/6043, c++/6037, bootstrap/4128, target/5740,
+    c/5597, optimization/5863, optimization/5742, target/3177, c/5354,
+    optimization/5999, target/5977, middle-end/5731, target/5312...
+
+* Fri Mar 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23.1
+- fix info and man page generation
+
+* Thu Mar 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23
+- update to CVS 3.1 branch
+  - fix IA-64 packet selection (PR optimization/5892)
+  - make highest_pow2_factor work for all constants (PR middle-end/5877)
+  - fix -Wunused (#61047)
+  - fix loop on mixed mode class assignments (#60923)
+  - fix wide character literals
+  - support SPARC v9 long distance branches (PR target/5626)
+  - fix SPARC leaf functions
+  - fix a rtl sharing problem (Richard Henderson, #60760,
+    PR optimization/5844)
+  - fix va_arg with variable size types (PR c/3711)
+  - PRs optimization/5901, optimization/5878, 5693, preprocessor/5899
+- fix C++ ?: at the end of stmt expr (PR c++/5373)
+- fix loop unrolling with sibcalls (PR optimization/5891)
+
+* Thu Mar  7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.22
+- update to CVS 3.1 branch
+  - fix ICE with volatile long long (#60650)
+  - fix tempbuf.h (Philipp Thomas, #60212)
+  - fix -fssa-ccp (Jeff Law, #60651)
+  - versioned libstdc++
+  - backport __attribute__((visibility("..."))) patches from trunk
+- include libstdc++ html documentation
+
+* Tue Feb  5 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.21
+- update to CVS HEAD
+  - fix demangler (H.J. Lu, #59300, #59310)
+  - fix typo in IA-32 specs file (#59081)
+  - support moving SFmode values in MMX regs if -mmmx (#59083)
+  - fix recog_for_combine (#59084)
+  - don't ICE when inserting insns on edge from bb0 to bb0 (Bernd Schmidt,
+    #59087)
+  - make sure configure has not time in the future (#59203)
+  - fix division/modulo by certain constants (#58065, PR c/5304)
+  - fix -Wswitch (PR c/4475)
+
+* Thu Jan 31 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.20
+- update to CVS HEAD
+  - fix jar (Tom Tromey)
+  - fix loop unrolling (Richard Henderson)
+
+* Wed Jan 30 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.19
+- update to CVS HEAD
+  - fix a reload bug on ia32 (#58579, #58648)
+  - issue error about unknown -W* options (#58909)
+  - fix ia64 libbfd miscompilation (#58694)
+  - register all pending unparsed_text structures with GC (#58647)
+  - fix __builtin_apply with ia32 -msse (#58447)
+  - prevent ia64 prologue insns saving regs required for eh from being
+    deleted (#58387)
+
+* Tue Jan 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.18
+- update to CVS HEAD
+  - handle static x[] = { [X...Y] = (foo) { Z } } (#58338)
+  - fix getdents.os miscompilation (Richard Henderson, #58308)
+  - fix ICE in try_forward_edges (#58125)
+  - fix ICE with -fexceptions -foptimize-sibling-calls
+
+* Tue Jan  8 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.17
+- avoid division by 0 when computing prediction probabilities (#57992)
+- fix ICE due to store_expr not adjusting value back for mode
+- increase -ftemplate-depth default value to 500
+
+* Mon Jan  7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.16
+- if using PT_GNU_EH_FRAME registry, work around assembler bug resp. feature
+  and don't provide weak prototypes of functions which won't be used
+- on Alpha, fix a typo so that crtbeginT.o is built and installed
+- fix glibc inl-tester miscompilation on ia32
+
+* Sun Jan  6 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.15
+- update to CVS HEAD (fix glibc bootstrap failure)
+
+* Thu Jan  3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.14
+- update to CVS HEAD (#57907)
+  - fix alpha bootstrap (Richard Henderson)
+- fix simplification of (div:SI (???:DI ???) (const_int 1))
+  (#57916)
+- add contrib/gcc_update --touch
+
+* Tue Jan  1 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.13
+- update to CVS HEAD (fix glibc miscompilation on alpha)
+- fix objc to not emit __objc_class_name_* without type and size
+
+* Mon Dec 31 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.12
+- update to CVS HEAD
+- fix sed commands for .la files
+- make Alpha use PT_GNU_EH_FRAME
+
+* Thu Dec 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.11
+- update to CVS HEAD (#57165, #57212, #57467, #57488, #57502,
+  #57505, #57574)
+- readd .la files after fixing them up by sed
+- add %%defattr(-,root,root) to libobjc subpackage
+
+* Mon Dec  3 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.10
+- one more gcc.spec fix for passing --gdwarf-2 resp. --gstabs to as
+- fix conditional register dead computation on IA-64
+- fix extern array of incomplete structures handling
+- fix gcc -xc -
+- fix Fortran ICEs with SAVE_EXPRs (Richard Kenner)
+
+* Tue Nov 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.9
+- update to CVS HEAD
+- make DWARF 2 preferred debugging format on Linux
+
+* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.8
+- don't ship .la files (#56072)
+- include libfrtbegin.a (#56098)
+
+* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.7
+- update to CVS HEAD
+- back out Nov 7th loop.c change for now
+
+* Fri Nov  9 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.6
+- update to CVS HEAD
+- frame unwind compatibility with 7.[12] binutils
+
+* Tue Nov  6 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.5
+- update to CVS HEAD
+- merge DW_EH_PE_indirect constants and their relocs
+
+* Thu Oct 25 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.4
+- don't loop forever or ICE on bogus array initializers (#53704)
+- fix store motion with pure calls
+- disable store motion for now
+
+* Tue Oct 23 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.3
+- fix inlining of C nested functions with auto prototypes
+
+* Mon Oct 22 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.2
+- update to CVS HEAD
+- tree inlining fix from Alexandre Oliva
+- fix anonymous union ICE on alpha
+
+* Mon Oct 15 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.1
+- switch package to main compiler from alternate compiler
+- update to CVS HEAD
+- early gcc-2.96-RH compatibility in __frame_state_for
+- change weak function tests for functions always present in GLIBC 2.2
+  into simple non-weak calls in crt*.o to avoid unnecessary symbol
+  lookups and prelink conflicts
+- don't link against libgcc_s C shared libraries
+
+* Tue Oct  2 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-4
+- update from CVS 3.0 branch
+  - ia64 function descriptors in vtables
+- handle large files in Fortran (#53328)
+- allow Java programs to be statically linked (#53605)
+- remove #include_next patch, Benjamin commited it
+
+* Thu Sep  6 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-3
+- don't use #include_next in <bits/std_c*> headers (Benjamin Kosnik, #53262)
+
+* Wed Sep  5 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-2
+- update from CVS 3.0 branch
+- check all gcc-2.96-RH patches whether they have made it into 3.0.1,
+  and if not, whether they are appropriate for 3.0.1
+- 8 new patches
+  - add 36 testcases from gcc-2.96-RH
+  - fix ICE on very questionable C++ code from JDK (#39858, #52960)
+  - fix -frepo (Nathan Sidwell, #52877)
+  - avoid generating bogus .stabs (#49214)
+  - issue a clear error message about invalid ia32 floating point
+    asm constraints (#27137)
+  - fix some comment typos
+  - fix ADDRESSOF recognition (#29686)
+
+* Mon Aug 27 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-1
+- update from CVS (3.0.1 final)
+- properly handle throw() exception specifiers in template decls (#51824)
+- fix IA-64 varargs handling in presence of additional anonymous arguments
+  (#50757)
+- fix boehm-gc for prelink
+- fix a typo in gcc3-c++ description (#52323)
+- remove Chill from package summary (#51764)
+
+* Tue Aug  7 2001 Jakub Jelinek <jakub@redhat.com> 3.0-6
+- update from CVS
+  - fix glibc vfprintf miscompilation
+- don't warn about if (&foo) if foo is weak (H.J.Lu, #50855)
+
+* Wed Jul 25 2001 Jakub Jelinek <jakub@redhat.com> 3.0-5
+- include libgcjgc.a in libgcj3-devel
+- include libgcjgc.so.* in libgcj3 on ia64
+- remove dependency on libgcj on ia64
+- add ldconfig to libgcj3 post/postun
+
+* Tue Jul 24 2001 Jakub Jelinek <jakub@redhat.com> 3.0-4
+- update from CVS
+- make gcc3-java/libgcj3* packages, so that they can coexist
+  with 2.96-RH Java
+- make sure shared Java libraries are built with proper dependencies
+
+* Wed Jul 11 2001 Jakub Jelinek <jakub@redhat.com> 3.0-3
+- fix libgcc_s.so and libstdc++.so symlinks
+- don't ship jar
+
+* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-2
+- move libstdc++.so into gcc-lib
+- add libobjc.so symlink
+
+* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-1
+- new rpm
diff --git a/patches/gcc/3.2.3/README-sh b/patches/gcc/3.2.3/README-sh
new file mode 100644
index 00000000..a75042a3
--- /dev/null
+++ b/patches/gcc/3.2.3/README-sh
@@ -0,0 +1,16 @@
+http://mirror.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains the following patches:
+
+gcc-20030210-sh-linux-1.patch
+gcc-3.2.3-libffi-1.patch
+gcc-3.2.3-sh-linux-dwarf2-1.patch (*not* applied by the spec file, it's in there by accident)
+
+gcc-3.2.3-libffi-1.patch was needed just to build, I think.
+
+After that was applied, sh4 gcc seemed to compile fine, but c++ programs
+failed to execute because libstdc++.so.5 was built without version
+info.  This was caused directly by libstdc++-v3/configure setting
+SYMVER_MAP=config/linker-map.dummy because it sees that 
+no libgcc_s.so was generated; configure says
+  checking for shared libgcc... no.
+
+Applying gcc-20030210-sh-linux-1.patch in hopes it makes those problems go away.
diff --git a/patches/gcc/3.2.3/config.sub.patch b/patches/gcc/3.2.3/config.sub.patch
new file mode 100644
index 00000000..928f9115
--- /dev/null
+++ b/patches/gcc/3.2.3/config.sub.patch
@@ -0,0 +1,72 @@
+When configuring a s390->s390 or cris->cris crosscompiler
+(ok, I haven't hit this yet, but one of these days I'll get me an account
+on an s390, and then I'll need this patch :-), you'll get the
+following error:
+
++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure
+--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu
+--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2
+--enable-languages=c
+--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390-
+unknown-linux-gnu --enable-threads=no --without-headers --with-newlib
+--disable-shared
+...
+*** --with-headers is only supported when cross compiling
+
+This error pops up only when you're using Daniel Jacobowitz's technique
+of slightly changing the target and host tuples to make them different
+enough to force gcc's build system to not try to pull in system libraries
+or headers.  This technique is needed e.g. to build an x86 -> x86
+cross-compiler.
+(The LFS developers ran into the same bug that prompted me to use
+this technique; they point people who run into it to
+http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different
+way of avoiding this problem.  I think the tuple tweak is the way to go, though.)
+
+config-patches@gnu.org rejected this patch, on the grounds that there
+is only one vendor of each of those two architectures, so the 
+canonicalization is by definition correct.  When I pointed out the
+difficulty this causes for people building s390 -> s390 or
+cris -> cris compilers that are incompatible with the system
+libraries and thus must be built like cross-compilers, he grumped and said 
+"autoconf should let you specify a cross-compiler in some other way than
+comparing tuple strings".
+
+
+
+--- gcc-3.3/config.sub.old	Sun Jun  8 20:38:47 2003
++++ gcc-3.3/config.sub	Sun Jun  8 20:40:34 2003
+@@ -433,9 +433,12 @@
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
+-	cris | cris-* | etrax*)
++	cris | etrax*)
+ 		basic_machine=cris-axis
+ 		;;
++	cris-*)
++		basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+@@ -820,11 +823,17 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
+-	s390 | s390-*)
++	s390)
+ 		basic_machine=s390-ibm
+ 		;;
+-	s390x | s390x-*)
++	s390-*)
++		basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	s390x)
+ 		basic_machine=s390x-ibm
++		;;
++	s390x-*)
++		basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	sa29200)
+ 		basic_machine=a29k-amd
diff --git a/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch
new file mode 100644
index 00000000..bd717f52
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch
@@ -0,0 +1,105 @@
+# See http://gcc.gnu.org/PR7383, http://www.kegel.com/xgcc3/ppc405erratum77.html
+# Fixed in gcc-3.3
+
+diff -aur gcc-20020722.orig/gcc/config/rs6000/rs6000.h gcc-20020722/gcc/config/rs6000/rs6000.h
+--- gcc-20020722.orig/gcc/config/rs6000/rs6000.h	Thu Jul 25 09:32:21 2002
++++ gcc-20020722/gcc/config/rs6000/rs6000.h	Thu Jul 25 09:34:45 2002
+@@ -66,7 +66,7 @@
+ %{mcpu=rsc1: -D_ARCH_PWR} \
+ %{mcpu=401: -D_ARCH_PPC} \
+ %{mcpu=403: -D_ARCH_PPC} \
+-%{mcpu=405: -D_ARCH_PPC} \
++%{mcpu=405: -D_ARCH_PPC -D__PPC405__} \
+ %{mcpu=505: -D_ARCH_PPC} \
+ %{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \
+ %{mcpu=602: -D_ARCH_PPC} \
+diff -aur gcc-20020722.orig/libjava/sysdep/powerpc/locks.h gcc-20020722/libjava/sysdep/powerpc/locks.h
+--- gcc-20020722.orig/libjava/sysdep/powerpc/locks.h	Thu Jul 25 09:32:30 2002
++++ gcc-20020722/libjava/sysdep/powerpc/locks.h	Thu Jul 25 11:39:13 2002
+@@ -11,6 +11,17 @@
+ #ifndef __SYSDEP_LOCKS_H__
+ #define __SYSDEP_LOCKS_H__
+ 
++#ifdef __PPC405__
++// workaround for PPC405 erratum #77 - 07/18/02 JRO, dank, NN.  References:
++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++// http://www.kegel.com/xgcc3/ppc405erratum77.html
++// FIXME: using dbct instead of sync would be faster
++#define __LIBGCJ_PPC405_ERR77_SYNC   "sync \n\t"
++#else
++#define __LIBGCJ_PPC405_ERR77_SYNC
++#endif
++
+ typedef size_t obj_addr_t;	/* Integer type big enough for object	*/
+ 				/* address.				*/
+ 
+@@ -25,6 +36,7 @@
+ 	   "0:    lwarx %0,0,%1 ;"
+ 	   "      xor. %0,%3,%0;"
+ 	   "      bne 1f;"
++  	  __LIBGCJ_PPC405_ERR77_SYNC
+ 	   "      stwcx. %2,0,%1;"
+ 	   "      bne- 0b;"
+ 	   "1:    "
+@@ -58,6 +70,7 @@
+ 	   "0:    lwarx %0,0,%1 ;"
+ 	   "      xor. %0,%3,%0;"
+ 	   "      bne 1f;"
++	   __LIBGCJ_PPC405_ERR77_SYNC	 
+ 	   "      stwcx. %2,0,%1;"
+ 	   "      bne- 0b;"
+ 	   "1:    "
+diff -aur gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h
+--- gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Thu Jul 25 09:32:31 2002
++++ gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h	Thu Jul 25 09:34:45 2002
+@@ -32,6 +32,17 @@
+ 
+ typedef int _Atomic_word;
+ 
++#ifdef __PPC405__
++// workaround for PPC405 erratum #77 - 07/18/02 JRO & dank.  References:
++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++// http://www.kegel.com/xgcc3/ppc405erratum77.html
++// FIXME: using dbct instead of sync would be faster
++#define	__LIBSTDCPP_PPC405_ERR77_SYNC	"sync \n\t"
++#else
++#define __LIBSTDCPP_PPC405_ERR77_SYNC
++#endif
++
+ static inline _Atomic_word
+ __attribute__ ((__unused__))
+ __exchange_and_add (volatile _Atomic_word* __mem, int __val)
+@@ -42,6 +53,7 @@
+ 	"0:\t"
+ 	"lwarx    %0,0,%2 \n\t"
+ 	"add%I3   %1,%0,%3 \n\t"
++	__LIBSTDCPP_PPC405_ERR77_SYNC
+ 	"stwcx.   %1,0,%2 \n\t"
+ 	"bne-     0b \n\t"
+ 	"/* End exchange & add */"
+@@ -61,6 +73,7 @@
+ 	"0:\t"
+ 	"lwarx    %0,0,%1 \n\t"
+ 	"add%I2   %0,%0,%2 \n\t"
++	__LIBSTDCPP_PPC405_ERR77_SYNC
+ 	"stwcx.   %0,0,%1 \n\t"
+ 	"bne-     0b \n\t"
+ 	"/* End atomic add */"
+@@ -78,6 +91,7 @@
+ 	"/* Inline always swap */\n"
+ 	"0:\t"
+ 	"lwarx    %0,0,%1 \n\t"
++	__LIBSTDCPP_PPC405_ERR77_SYNC
+ 	"stwcx.   %2,0,%1 \n\t"
+ 	"bne-     0b \n\t"
+ 	"/* End always swap */"
+@@ -98,6 +112,7 @@
+ 	"lwarx    %0,0,%1 \n\t"
+ 	"cmpwi    %0,0 \n\t"
+ 	"bne-     1f \n\t"
++	__LIBSTDCPP_PPC405_ERR77_SYNC
+ 	"stwcx.   %2,0,%1 \n\t"
+ 	"bne-     0b \n"
+ 	"1:\n\t"
diff --git a/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch
new file mode 100644
index 00000000..43930785
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch
@@ -0,0 +1,1761 @@
+diff -ruN gcc-20030210.orig/boehm-gc/configure gcc-20030210/boehm-gc/configure
+--- gcc-20030210.orig/boehm-gc/configure	Fri Jan 31 19:17:00 2003
++++ gcc-20030210/boehm-gc/configure	Sat Feb 22 01:40:14 2003
+@@ -1922,7 +1922,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/config-ml.in gcc-20030210/config-ml.in
+--- gcc-20030210.orig/config-ml.in	Fri Jan 31 19:16:59 2003
++++ gcc-20030210/config-ml.in	Sat Feb 22 01:40:14 2003
+@@ -545,6 +545,7 @@
+ 	      if [ -d ../$${dir}/$${lib} ]; then \
+ 		flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
+ 		if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \
++				DESTDIR="$(DESTDIR)" \
+ 				CFLAGS="$(CFLAGS) $${flags}" \
+ 				prefix="$(prefix)" \
+ 				exec_prefix="$(exec_prefix)" \
+diff -ruN gcc-20030210.orig/debian/edit-specs.in gcc-20030210/debian/edit-specs.in
+--- gcc-20030210.orig/debian/edit-specs.in	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/debian/edit-specs.in	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,45 @@
++/^*asm:$/ {
++n
++c\
++@AS_ENDIAN_FLAG@ %{mrelax:-relax}
++}
++/^*cpp:$/ {
++n
++c\
++%(cpp_default_cpu_spec)    %(subtarget_cpp_spec)    %(subtarget_cpp_ptr_spec)    %(subtarget_cpp_endian_spec)
++}
++/^*cc1:$/ {
++n
++c\
++-musermode @CC1_CPU_ENDIAN_FLAGS@  %{profile:-p}
++}
++/^*link:$/ {
++n
++c\
++%{!static:--eh-frame-hdr} @LINKER_CPU_ENDIAN_FLAGS@  @LINKER_RPATH_LINK_FLAG@ %{mrelax:-relax}  %{shared:-shared}  %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static}
++}
++/^*multilib:$/ {
++n
++c\
++. ;
++}
++/^*multilib_matches:$/ {
++n
++c\
++
++}
++/^*multilib_options:$/ {
++n
++c\
++
++}
++/^*subtarget_cpp_endian_spec:$/ {
++n
++c\
++@CPP_ENDIAN_DEF@
++}
++/^*cpp_default_cpu_spec:$/ {
++n
++c\
++@CPP_CPU_DEFS@
++}
+diff -ruN gcc-20030210.orig/debian/install-CPU-linux gcc-20030210/debian/install-CPU-linux
+--- gcc-20030210.orig/debian/install-CPU-linux	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/debian/install-CPU-linux	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,111 @@
++#! /bin/sh
++
++VERSION=$1; shift
++CPU=$1
++
++# literally (binary-ly) same
++PROGS_C="cpp gcc"
++PROGS_ADDITIONAL="c++ g++ g77 gcj"
++
++DRIVERS_C="cc1 cpp0 tradcpp0"
++DRIVERS_ADDITIONAL="cc1obj cc1plus collect2 f771 jc1 jvgenmain"
++if [ -z "$STEP1_COMPILER_BUILD" ]; then
++  PROGS="$PROGS_C $PROGS_ADDITIONAL"
++  DRIVERS="$DRIVERS_C $DRIVERSADDITIONAL"
++  INITIAL=""
++else
++  PROGS=$PROGS_C
++  DRIVERS=$DRIVERS_C
++  INITIAL="-initial"
++fi
++
++OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o"
++LIBS_C="libgcc.a"
++LIBS_1="libgcc_s.so libgcc_s.so.1 libstdc++.so libstdc++.so.3 libstdc++.so.3.0.2"
++LIBS_2="libobjc.a libstdc++.a libsupc++.a"
++INCLUDE="include"
++
++cd debian/gcc-sh-linux-others${INITIAL} || exit 1
++
++# Make directories.
++mkdir -p usr/bin usr/share usr/share/man usr/share/man/man1 usr/lib \
++	 usr/lib/gcc-lib usr/lib/gcc-lib/${CPU}-linux \
++	 usr/lib/gcc-lib/${CPU}-linux/${VERSION} \
++	 usr/${CPU}-linux usr/${CPU}-linux/lib
++
++# Make symbolic links for include dir.
++(cd usr/${CPU}-linux; ln -s ../sh-linux/include .)
++
++# Make symbolic links for executables.
++(cd usr/bin;
++  for p in ${PROGS}; do
++    ln -s shCPU-linux-GCC ${CPU}-linux-$p
++  done)
++
++case "${CPU}" in
++    sh3)
++	MULTILIBDIR=
++	AS_ENDIAN_FLAG="-little"
++	CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
++	CPP_CPU_DEFS="-D__SH3__ -D__sh3__"
++	CC1_CPU_ENDIAN_FLAGS="-ml -m3"
++	LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3"
++	LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3-linux/lib"
++    ;;
++    sh3eb)
++	MULTILIBDIR=/mb
++	AS_ENDIAN_FLAG="-big"
++	CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
++	CPP_CPU_DEFS="-D__SH3__ -D__sh3__"
++	CC1_CPU_ENDIAN_FLAGS="-mb -m3"
++	LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3"
++	LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3eb-linux/lib"
++    ;;
++    sh4)
++	MULTILIBDIR=/m4
++	AS_ENDIAN_FLAG="-little"
++	CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
++	CPP_CPU_DEFS="-D__SH4__"
++	CC1_CPU_ENDIAN_FLAGS="-ml -m4"
++	LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4"
++	LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4-linux/lib"
++    ;;
++    sh4eb)
++	MULTILIBDIR=/mb/m4
++	AS_ENDIAN_FLAG="-big"
++	CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
++	CPP_CPU_DEFS="-D__SH4__"
++	CC1_CPU_ENDIAN_FLAGS="-mb -m4"
++	LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4"
++	LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4eb-linux/lib"
++    ;;
++esac
++
++# Make symbolic links for GCC drivers, objects, libraries, and include dir.
++(cd usr/lib/gcc-lib/${CPU}-linux/${VERSION};
++ for f in ${DRIVERS} ${INCLUDE}; do
++    ln -s ../../sh-linux/${VERSION}/$f $f;
++ done
++ for f in ${OBJS} ${LIBS_C}; do
++    ln -s ../../sh-linux/${VERSION}${MULTILIBDIR}/$f $f;
++ done)
++
++if [ -z "$STEP1_COMPILER_BUILD" ]; then
++  for f in ${LIBS_1} ${LIBS_2}; do
++    mv ../gcc-sh-linux/usr/sh-linux/lib${MULTILIBDIR}/$f usr/${CPU}-linux/lib/;
++  done
++fi
++
++sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \
++    -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \
++    -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \
++    -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \
++    -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \
++    -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \
++    ../edit-specs.in >../edit-specs-${CPU}.sed
++
++sed -f ../edit-specs-${CPU}.sed \
++    ../gcc-sh-linux${INITIAL}/usr/lib/gcc-lib/sh-linux/${VERSION}/specs \
++    > usr/lib/gcc-lib/${CPU}-linux/${VERSION}/specs
++
++exit 0
+diff -ruN gcc-20030210.orig/debian/multilib-symlink gcc-20030210/debian/multilib-symlink
+--- gcc-20030210.orig/debian/multilib-symlink	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/debian/multilib-symlink	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,10 @@
++#! /bin/sh
++
++cd /usr/sh-linux/lib
++ln -s ../../sh3-linux/lib/{*.a,*.so*,*.o} .
++cd m4
++ln -s ../../../sh4-linux/lib/{*.a,*.so*,*.o} .
++cd ../mb
++ln -s ../../../sh3eb-linux/lib/{*.a,*.so*,*.o} .
++cd m4
++ln -s ../../../../sh4eb-linux/lib/{*.a,*.so*,*.o} .
+diff -ruN gcc-20030210.orig/debian/shCPU-linux-GCC gcc-20030210/debian/shCPU-linux-GCC
+--- gcc-20030210.orig/debian/shCPU-linux-GCC	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/debian/shCPU-linux-GCC	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,59 @@
++#! /bin/bash
++
++BASENAME=${0##*/}
++PROG=${BASENAME##*-}
++CPU=${BASENAME%%-*}
++
++if [ "$PROG" = gcc ]; then
++    if [ "$1" = "-b" -a "$2" = "i386-linux" ]; then
++	shift 2
++	exec /usr/bin/gcc "$@"
++    elif [ "$1" = "-print-multi-lib" -o "$1" = "--print-multi-lib" ]; then
++	echo ".;"
++	exit 0
++    elif [ "$1" = "-print-multi-os-directory" -o "$1" = "--print-multi-os-directory" ]; then
++	echo "."
++	exit 0
++    elif [ "$1" = "-dumpspecs" ]; then
++	cat /usr/lib/gcc-lib/${CPU}-linux/@@VERSION@@/specs
++	exit 0
++    fi
++fi
++
++case "${CPU}" in
++    sh3)
++	ARCH=m3
++	DEFINES="-D__sh3__ -D__SH3__ -D__LITTLE_ENDIAN__"
++	ENDIAN=ml
++    ;;
++    sh3eb)
++	ARCH=m3
++	DEFINES="-D__sh3__ -D__SH3__ -D__BIG_ENDIAN__"
++	ENDIAN=mb
++    ;;
++    sh4)
++	ARCH=m4
++	DEFINES="-D__SH4__ -D__LITTLE_ENDIAN__"
++	ENDIAN=ml
++    ;;
++    sh4eb)
++	ARCH=m4
++	DEFINES="-D__SH4__ -D__BIG_ENDIAN__"
++	ENDIAN=mb
++    ;;
++esac
++
++# Prepend the appropriate options
++# If user specifies some options, it will be overridden
++
++case "${PROG}" in
++    cpp)
++	exec sh-linux-${PROG} $DEFINES "$@"
++    ;;
++    c++|g++|g77|gcc|gcj)
++	exec sh-linux-${PROG} -$ARCH -$ENDIAN "$@"
++    ;;
++esac
++
++echo "Something wrong..."
++exit 1
+diff -ruN gcc-20030210.orig/gcc/config/sh/elf.h gcc-20030210/gcc/config/sh/elf.h
+--- gcc-20030210.orig/gcc/config/sh/elf.h	Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/elf.h	Sat Feb 22 01:40:14 2003
+@@ -170,3 +170,7 @@
+ #undef ENDFILE_SPEC
+ #define ENDFILE_SPEC \
+   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
++
++/* ASM_OUTPUT_CASE_LABEL is defined in elfos.h.  With it, 
++   redundant .align will be generated.  */
++#undef  ASM_OUTPUT_CASE_LABEL
+diff -ruN gcc-20030210.orig/gcc/config/sh/lib1funcs.asm gcc-20030210/gcc/config/sh/lib1funcs.asm
+--- gcc-20030210.orig/gcc/config/sh/lib1funcs.asm	Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/lib1funcs.asm	Sat Feb 22 01:40:14 2003
+@@ -39,8 +39,13 @@
+ 
+ #ifdef __ELF__
+ #define LOCAL(X) .L_##X
++#define FUNC(X) .type X,@function; .hidden X
++#define _ENDFUNC(X) .Lfe_##X: .size X,.Lfe_##X-X
++#define ENDFUNC(X) _ENDFUNC(X)
+ #else
+ #define LOCAL(X) L_##X
++#define FUNC(X)
++#define ENDFUNC(X)
+ #endif
+ 
+ #ifdef __linux__
+@@ -91,6 +96,40 @@
+ 	.global	GLOBAL(ashiftrt_r4_31)
+ 	.global	GLOBAL(ashiftrt_r4_32)
+ 
++	FUNC(GLOBAL(ashiftrt_r4_0))
++	FUNC(GLOBAL(ashiftrt_r4_1))
++	FUNC(GLOBAL(ashiftrt_r4_2))
++	FUNC(GLOBAL(ashiftrt_r4_3))
++	FUNC(GLOBAL(ashiftrt_r4_4))
++	FUNC(GLOBAL(ashiftrt_r4_5))
++	FUNC(GLOBAL(ashiftrt_r4_6))
++	FUNC(GLOBAL(ashiftrt_r4_7))
++	FUNC(GLOBAL(ashiftrt_r4_8))
++	FUNC(GLOBAL(ashiftrt_r4_9))
++	FUNC(GLOBAL(ashiftrt_r4_10))
++	FUNC(GLOBAL(ashiftrt_r4_11))
++	FUNC(GLOBAL(ashiftrt_r4_12))
++	FUNC(GLOBAL(ashiftrt_r4_13))
++	FUNC(GLOBAL(ashiftrt_r4_14))
++	FUNC(GLOBAL(ashiftrt_r4_15))
++	FUNC(GLOBAL(ashiftrt_r4_16))
++	FUNC(GLOBAL(ashiftrt_r4_17))
++	FUNC(GLOBAL(ashiftrt_r4_18))
++	FUNC(GLOBAL(ashiftrt_r4_19))
++	FUNC(GLOBAL(ashiftrt_r4_20))
++	FUNC(GLOBAL(ashiftrt_r4_21))
++	FUNC(GLOBAL(ashiftrt_r4_22))
++	FUNC(GLOBAL(ashiftrt_r4_23))
++	FUNC(GLOBAL(ashiftrt_r4_24))
++	FUNC(GLOBAL(ashiftrt_r4_25))
++	FUNC(GLOBAL(ashiftrt_r4_26))
++	FUNC(GLOBAL(ashiftrt_r4_27))
++	FUNC(GLOBAL(ashiftrt_r4_28))
++	FUNC(GLOBAL(ashiftrt_r4_29))
++	FUNC(GLOBAL(ashiftrt_r4_30))
++	FUNC(GLOBAL(ashiftrt_r4_31))
++	FUNC(GLOBAL(ashiftrt_r4_32))
++
+ 	.align	1
+ GLOBAL(ashiftrt_r4_32):
+ GLOBAL(ashiftrt_r4_31):
+@@ -170,6 +209,41 @@
+ GLOBAL(ashiftrt_r4_0):
+ 	rts
+ 	nop
++
++	ENDFUNC(GLOBAL(ashiftrt_r4_0))
++	ENDFUNC(GLOBAL(ashiftrt_r4_1))
++	ENDFUNC(GLOBAL(ashiftrt_r4_2))
++	ENDFUNC(GLOBAL(ashiftrt_r4_3))
++	ENDFUNC(GLOBAL(ashiftrt_r4_4))
++	ENDFUNC(GLOBAL(ashiftrt_r4_5))
++	ENDFUNC(GLOBAL(ashiftrt_r4_6))
++	ENDFUNC(GLOBAL(ashiftrt_r4_7))
++	ENDFUNC(GLOBAL(ashiftrt_r4_8))
++	ENDFUNC(GLOBAL(ashiftrt_r4_9))
++	ENDFUNC(GLOBAL(ashiftrt_r4_10))
++	ENDFUNC(GLOBAL(ashiftrt_r4_11))
++	ENDFUNC(GLOBAL(ashiftrt_r4_12))
++	ENDFUNC(GLOBAL(ashiftrt_r4_13))
++	ENDFUNC(GLOBAL(ashiftrt_r4_14))
++	ENDFUNC(GLOBAL(ashiftrt_r4_15))
++	ENDFUNC(GLOBAL(ashiftrt_r4_16))
++	ENDFUNC(GLOBAL(ashiftrt_r4_17))
++	ENDFUNC(GLOBAL(ashiftrt_r4_18))
++	ENDFUNC(GLOBAL(ashiftrt_r4_19))
++	ENDFUNC(GLOBAL(ashiftrt_r4_20))
++	ENDFUNC(GLOBAL(ashiftrt_r4_21))
++	ENDFUNC(GLOBAL(ashiftrt_r4_22))
++	ENDFUNC(GLOBAL(ashiftrt_r4_23))
++	ENDFUNC(GLOBAL(ashiftrt_r4_24))
++	ENDFUNC(GLOBAL(ashiftrt_r4_25))
++	ENDFUNC(GLOBAL(ashiftrt_r4_26))
++	ENDFUNC(GLOBAL(ashiftrt_r4_27))
++	ENDFUNC(GLOBAL(ashiftrt_r4_28))
++	ENDFUNC(GLOBAL(ashiftrt_r4_29))
++	ENDFUNC(GLOBAL(ashiftrt_r4_30))
++	ENDFUNC(GLOBAL(ashiftrt_r4_31))
++	ENDFUNC(GLOBAL(ashiftrt_r4_32))
++
+ #endif
+ 
+ #ifdef L_ashiftrt_n
+@@ -192,6 +266,7 @@
+ !
+ 
+ 	.global	GLOBAL(ashrsi3)
++	FUNC(GLOBAL(ashrsi3))
+ 	.align	2
+ GLOBAL(ashrsi3):
+ 	mov	#31,r0
+@@ -319,6 +394,8 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashrsi3))
++
+ #endif
+ 
+ #ifdef L_ashiftlt
+@@ -340,6 +417,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(ashlsi3)
++	FUNC(GLOBAL(ashlsi3))
+ 	.align	2
+ GLOBAL(ashlsi3):
+ 	mov	#31,r0
+@@ -476,6 +554,8 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashlsi3))
++
+ #endif
+ 
+ #ifdef L_lshiftrt
+@@ -497,6 +577,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(lshrsi3)
++	FUNC(GLOBAL(lshrsi3))
+ 	.align	2
+ GLOBAL(lshrsi3):
+ 	mov	#31,r0
+@@ -633,6 +714,8 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(lshrsi3))
++
+ #endif
+ 
+ #ifdef L_movstr
+@@ -649,76 +732,113 @@
+ 	add	#64,r4
+ 	.align	4
+ 	.global	GLOBAL(movstrSI64)
++	FUNC(GLOBAL(movstrSI64))
+ GLOBAL(movstrSI64):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+ 	.global	GLOBAL(movstrSI60)
++	FUNC(GLOBAL(movstrSI60))
+ GLOBAL(movstrSI60):
+ 	mov.l	@(56,r5),r0
+ 	mov.l	r0,@(56,r4)
+ 	.global	GLOBAL(movstrSI56)
++	FUNC(GLOBAL(movstrSI56))
+ GLOBAL(movstrSI56):
+ 	mov.l	@(52,r5),r0
+ 	mov.l	r0,@(52,r4)
+ 	.global	GLOBAL(movstrSI52)
++	FUNC(GLOBAL(movstrSI52))
+ GLOBAL(movstrSI52):
+ 	mov.l	@(48,r5),r0
+ 	mov.l	r0,@(48,r4)
+ 	.global	GLOBAL(movstrSI48)
++	FUNC(GLOBAL(movstrSI48))
+ GLOBAL(movstrSI48):
+ 	mov.l	@(44,r5),r0
+ 	mov.l	r0,@(44,r4)
+ 	.global	GLOBAL(movstrSI44)
++	FUNC(GLOBAL(movstrSI44))
+ GLOBAL(movstrSI44):
+ 	mov.l	@(40,r5),r0
+ 	mov.l	r0,@(40,r4)
+ 	.global	GLOBAL(movstrSI40)
++	FUNC(GLOBAL(movstrSI40))
+ GLOBAL(movstrSI40):
+ 	mov.l	@(36,r5),r0
+ 	mov.l	r0,@(36,r4)
+ 	.global	GLOBAL(movstrSI36)
++	FUNC(GLOBAL(movstrSI36))
+ GLOBAL(movstrSI36):
+ 	mov.l	@(32,r5),r0
+ 	mov.l	r0,@(32,r4)
+ 	.global	GLOBAL(movstrSI32)
++	FUNC(GLOBAL(movstrSI32))
+ GLOBAL(movstrSI32):
+ 	mov.l	@(28,r5),r0
+ 	mov.l	r0,@(28,r4)
+ 	.global	GLOBAL(movstrSI28)
++	FUNC(GLOBAL(movstrSI28))
+ GLOBAL(movstrSI28):
+ 	mov.l	@(24,r5),r0
+ 	mov.l	r0,@(24,r4)
+ 	.global	GLOBAL(movstrSI24)
++	FUNC(GLOBAL(movstrSI24))
+ GLOBAL(movstrSI24):
+ 	mov.l	@(20,r5),r0
+ 	mov.l	r0,@(20,r4)
+ 	.global	GLOBAL(movstrSI20)
++	FUNC(GLOBAL(movstrSI20))
+ GLOBAL(movstrSI20):
+ 	mov.l	@(16,r5),r0
+ 	mov.l	r0,@(16,r4)
+ 	.global	GLOBAL(movstrSI16)
++	FUNC(GLOBAL(movstrSI16))
+ GLOBAL(movstrSI16):
+ 	mov.l	@(12,r5),r0
+ 	mov.l	r0,@(12,r4)
+ 	.global	GLOBAL(movstrSI12)
++	FUNC(GLOBAL(movstrSI12))
+ GLOBAL(movstrSI12):
+ 	mov.l	@(8,r5),r0
+ 	mov.l	r0,@(8,r4)
+ 	.global	GLOBAL(movstrSI8)
++	FUNC(GLOBAL(movstrSI8))
+ GLOBAL(movstrSI8):
+ 	mov.l	@(4,r5),r0
+ 	mov.l	r0,@(4,r4)
+ 	.global	GLOBAL(movstrSI4)
++	FUNC(GLOBAL(movstrSI4))
+ GLOBAL(movstrSI4):
+ 	mov.l	@(0,r5),r0
+ 	mov.l	r0,@(0,r4)
++	.global	GLOBAL(movstrSI0)
++	FUNC(GLOBAL(movstrSI0))
+ GLOBAL(movstrSI0):
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(movstrSI64))
++	ENDFUNC(GLOBAL(movstrSI60))
++	ENDFUNC(GLOBAL(movstrSI56))
++	ENDFUNC(GLOBAL(movstrSI52))
++	ENDFUNC(GLOBAL(movstrSI48))
++	ENDFUNC(GLOBAL(movstrSI44))
++	ENDFUNC(GLOBAL(movstrSI40))
++	ENDFUNC(GLOBAL(movstrSI36))
++	ENDFUNC(GLOBAL(movstrSI32))
++	ENDFUNC(GLOBAL(movstrSI28))
++	ENDFUNC(GLOBAL(movstrSI24))
++	ENDFUNC(GLOBAL(movstrSI20))
++	ENDFUNC(GLOBAL(movstrSI16))
++	ENDFUNC(GLOBAL(movstrSI12))
++	ENDFUNC(GLOBAL(movstrSI8))
++	ENDFUNC(GLOBAL(movstrSI4))
++	ENDFUNC(GLOBAL(movstrSI0))
++
+ 	.align	4
+ 
+ 	.global	GLOBAL(movstr)
++	FUNC(GLOBAL(movstr))
+ GLOBAL(movstr):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+@@ -775,6 +895,8 @@
+ 	add	#64,r5
+ 	bra	GLOBAL(movstr)
+ 	add	#64,r4
++
++	FUNC(GLOBAL(movstr))
+ #endif
+ 
+ #ifdef L_movstr_i4
+@@ -783,6 +905,10 @@
+ 	.global	GLOBAL(movstr_i4_odd)
+ 	.global	GLOBAL(movstrSI12_i4)
+ 
++	FUNC(GLOBAL(movstr_i4_even))
++	FUNC(GLOBAL(movstr_i4_odd))
++	FUNC(GLOBAL(movstrSI12_i4))
++
+ 	.p2align	5
+ L_movstr_2mod4_end:
+ 	mov.l	r0,@(16,r4)
+@@ -791,6 +917,11 @@
+ 
+ 	.p2align	2
+ 
++GLOBAL(movstr_i4_even):
++	mov.l	@r5+,r0
++	bra	L_movstr_start_even
++	mov.l	@r5+,r1
++
+ GLOBAL(movstr_i4_odd):
+ 	mov.l	@r5+,r1
+ 	add	#-4,r4
+@@ -817,10 +948,8 @@
+ 	rts
+ 	mov.l	r3,@(12,r4)
+ 
+-GLOBAL(movstr_i4_even):
+-	mov.l	@r5+,r0
+-	bra	L_movstr_start_even
+-	mov.l	@r5+,r1
++	ENDFUNC(GLOBAL(movstr_i4_even))
++	ENDFUNC(GLOBAL(movstr_i4_odd))
+ 
+ 	.p2align	4
+ GLOBAL(movstrSI12_i4):
+@@ -831,12 +960,16 @@
+ 	mov.l	r1,@(4,r4)
+ 	rts
+ 	mov.l	r2,@(8,r4)
++
++	ENDFUNC(GLOBAL(movstrSI12_i4))
++
+ #endif
+ 
+ #ifdef L_mulsi3
+ 
+ 
+ 	.global	GLOBAL(mulsi3)
++	FUNC(GLOBAL(mulsi3))
+ 
+ ! r4 =       aabb
+ ! r5 =       ccdd
+@@ -869,7 +1002,7 @@
+ 	rts
+ 	add	r2,r0
+ 
+-
++	FUNC(GLOBAL(mulsi3))
+ #endif
+ #endif /* ! __SH5__ */
+ #ifdef L_sdivsi3_i4
+@@ -879,6 +1012,7 @@
+ !! args in r4 and r5, result in fpul, clobber dr0, dr2
+ 
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	lds r4,fpul
+ 	float fpul,dr0
+@@ -888,6 +1022,8 @@
+ 	rts
+ 	ftrc dr0,fpul
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
++
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
+ 
+@@ -896,6 +1032,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	sts.l fpscr,@-r15
+ 	mov #8,r2
+@@ -910,6 +1047,8 @@
+ 	rts
+ 	lds.l @r15+,fpscr
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
++
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -924,9 +1063,10 @@
+ !!
+ !!
+ 
+-!! args in r4 and r5, result in r0 clobber r1,r2,r3
++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
+ 
+ 	.global	GLOBAL(sdivsi3)
++	FUNC(GLOBAL(sdivsi3))
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+ 	.section	.text..SHmedia32,"ax"
+@@ -1076,6 +1216,7 @@
+ div0:	rts
+ 	mov	#0,r0
+ 
++	ENDFUNC(GLOBAL(sdivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1084,9 +1225,11 @@
+ 	.title "SH DIVIDE"
+ !! 4 byte integer Divide code for the Hitachi SH
+ #ifdef __SH4__
+-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
++!! and t bit
+ 
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	mov #1,r1
+ 	cmp/hi r1,r5
+@@ -1127,6 +1270,8 @@
+ L1:
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
++
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
+ 
+@@ -1135,6 +1280,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	mov #1,r1
+ 	cmp/hi r1,r5
+@@ -1183,6 +1329,8 @@
+ #endif
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
++
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1199,6 +1347,7 @@
+ 
+ !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
+ 	.global	GLOBAL(udivsi3)
++	FUNC(GLOBAL(udivsi3))
+ 
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+@@ -1299,6 +1448,8 @@
+ ret:	rts
+ 	mov	r4,r0
+ 
++	ENDFUNC(GLOBAL(udivsi3))
++
+ #endif /* ! __SHMEDIA__ */
+ #endif /* __SH4__ */
+ #endif
+@@ -1308,6 +1459,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global GLOBAL(set_fpscr)
++	FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
+ 	mov.l LOCAL(set_fpscr_L1),r1
+@@ -1340,11 +1492,16 @@
+ 	.align 2
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++
++	ENDFUNC(GLOBAL(set_fpscr))
++
++#ifndef NO_FPSCR_VALUES
+ #ifdef __ELF__
+         .comm   GLOBAL(fpscr_values),8,4
+ #else
+         .comm   GLOBAL(fpscr_values),8
+ #endif /* ELF */
++#endif /* NO_FPSCR_VALUES */
+ #endif /* SH3E / SH4 */
+ #endif /* L_set_fpscr */
+ #ifdef L_ic_invalidate
+@@ -1360,6 +1517,7 @@
+ 	blink	tr0, r63
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ 	.global GLOBAL(ic_invalidate)
++	FUNC(GLOBAL(ic_invalidate))
+ GLOBAL(ic_invalidate):
+ 	ocbwb	@r4
+ 	mova	0f,r0
+@@ -1382,6 +1540,9 @@
+ 	nop
+ 	.endr
+ 	.endr
++
++	ENDFUNC(GLOBAL(ic_invalidate))
++
+ #endif /* SH4 */
+ #endif /* L_ic_invalidate */
+ 
+diff -ruN gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver gcc-20030210/gcc/config/sh/libgcc-glibc.ver
+--- gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/libgcc-glibc.ver	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,21 @@
++# In order to work around the very problems that force us to now generally
++# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
++# By now choosing the same version tags for these specific routines, we
++# maintain enough binary compatibility to allow future versions of glibc
++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
++
++# Note that we cannot use the default libgcc-glibc.ver file on sh,
++# because GLIBC_2.0 does not exist on this architecture, as the first 
++# ever glibc release on the platform was GLIBC_2.2.
++
++%inherit GCC_3.0 GLIBC_2.2
++GLIBC_2.2 {
++  __register_frame
++  __register_frame_table
++  __deregister_frame
++  __register_frame_info
++  __deregister_frame_info
++  __frame_state_for
++  __register_frame_info_table
++}
++
+diff -ruN gcc-20030210.orig/gcc/config/sh/linux.h gcc-20030210/gcc/config/sh/linux.h
+--- gcc-20030210.orig/gcc/config/sh/linux.h	Tue Apr 16 05:27:42 2002
++++ gcc-20030210/gcc/config/sh/linux.h	Sat Feb 22 01:40:14 2003
+@@ -19,6 +19,10 @@
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.  */
+ 
++/* We're not SYSVR4, not having /usr/ccs */
++#undef MD_EXEC_PREFIX
++#undef MD_STARTFILE_PREFIX
++
+ /* Run-time Target Specification.  */
+ #undef TARGET_VERSION
+ #define TARGET_VERSION  fputs (" (SH GNU/Linux with ELF)", stderr);
+@@ -39,6 +43,28 @@
+ #undef WCHAR_TYPE_SIZE
+ #define WCHAR_TYPE_SIZE BITS_PER_WORD
+ 
++/* This was defined in linux.h.  Define it here also. */
++#undef  DEFAULT_VTABLE_THUNKS
++#define DEFAULT_VTABLE_THUNKS   1
++
++/* Likewise.  */
++#define HANDLE_PRAGMA_PACK_PUSH_POP
++
++/* Pick up the return address upon entry to a procedure. Used for
++   dwarf2 unwind information.  This also enables the table driven
++   mechanism.  */
++
++#define INCOMING_RETURN_ADDR_RTX	gen_rtx_REG (Pmode, PR_REG)
++#define DWARF_FRAME_RETURN_COLUMN	DWARF_FRAME_REGNUM (PR_REG)
++
++#undef CPP_SPEC
++#define CPP_SPEC "\
++   %{m4:-D__SH4__} \
++   %{!m4:%(cpp_default_cpu_spec)} \
++   %(subtarget_cpp_spec) \
++   %(subtarget_cpp_ptr_spec) \
++   %(subtarget_cpp_endian_spec) "
++
+ #undef SUBTARGET_CPP_SPEC
+ #define SUBTARGET_CPP_SPEC "\
+    %{fPIC:-D__PIC__ -D__pic__} \
+@@ -55,36 +81,45 @@
+ #undef CPP_DEFAULT_CPU_SPEC
+ #define CPP_DEFAULT_CPU_SPEC "-D__SH3__ -D__sh3__"
+ 
+-
+ #undef CPP_PREDEFINES
+ #define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sh__ -D__gnu_linux__ -Dlinux -Asystem=posix"
+ 
++/* The GNU C++ standard library requires that these macros be defined.  */
++#undef CPLUSPLUS_CPP_SPEC
++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
+ #undef ASM_SPEC
+-#define ASM_SPEC  "%{!mb:-little} %{mrelax:-relax}"
++#define ASM_SPEC  "%{mb:-big} %{!mb:-little} %{mrelax:-relax}"
+ 
+ #undef CC1_SPEC
+ #define CC1_SPEC \
+-  "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}"
+-
+-#undef CC1PLUS_SPEC
+-#define CC1PLUS_SPEC \
+-  "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}"
++  "-musermode %{!mb:-ml} %{!m4:-m3} %{profile:-p}"
+ 
++/* XXX: It's wrong if prefix != /usr */
+ #undef LINK_SPEC
+ #define LINK_SPEC \
+-  "%{!mb:-m shlelf_linux} %{mrelax:-relax} \
++  "%{!mb:-m shlelf_linux -EL} %{mb:-m shelf_linux -EB} %{mrelax:-relax} \
+    %{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+-     %{!rpath:-rpath /lib}} \
++     %{!mb:%{!m4:-rpath-link /usr/sh-linux/lib }} \
++     %{!mb:%{m4:-rpath-link /usr/sh-linux/lib/m4 }} \
++     %{mb:%{!m4:-rpath-link /usr/sh-linux/lib/mb }} \
++     %{mb:%{m4:-rpath-link /usr/sh-linux/lib/mb/m4 }}} \
+    %{static:-static}"
+ 
+ #undef LIB_SPEC
++#undef LIB_SPEC
+ #define LIB_SPEC \
+   "%{shared: -lc} \
+-   %{!shared: %{pthread:-lthread} \
+-     %{profile:-lc_p} %{!profile: -lc}}"
++   %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \
++	%{profile:-lc_p} %{!profile: -lc}}"
++
++#if defined(HAVE_LD_EH_FRAME_HDR)
++#undef LINK_EH_SPEC
++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
++#endif
+ 
+ #undef STARTFILE_SPEC
+ #define STARTFILE_SPEC \
+@@ -92,4 +127,40 @@
+      %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \
+ 		       %{!p:%{profile:gcrt1.o%s} \
+ 			 %{!profile:crt1.o%s}}}} \
+-   crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
++   crti.o%s %{static:crtbeginT.o%s}\
++   %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
++
++#undef FUNCTION_PROFILER
++#define FUNCTION_PROFILER(STREAM,LABELNO)				\
++do									\
++{									\
++  if (flag_pic)								\
++    {									\
++      fprintf (STREAM, "	mov.l	3f,r1\n");			\
++      fprintf (STREAM, "	mova	3f,r0\n");			\
++      fprintf (STREAM, "	add	r1,r0\n");			\
++      fprintf (STREAM, "	mov.l	1f,r1\n");			\
++      fprintf (STREAM, "	mov.l	@(r0,r1),r1\n");		\
++    }									\
++  else									\
++    {									\
++      fprintf (STREAM, "	mov.l	1f,r1\n");			\
++    }									\
++  fprintf (STREAM, "	sts.l	pr,@-r15\n");				\
++  fprintf (STREAM, "	mova	2f,r0\n");				\
++  fprintf (STREAM, "	jmp	@r1\n");				\
++  fprintf (STREAM, "	lds	r0,pr\n");				\
++  fprintf (STREAM, "	.align	2\n");					\
++  if (flag_pic)								\
++    {									\
++      fprintf (STREAM, "1:	.long	mcount@GOT\n");			\
++      fprintf (STREAM, "3:	.long	_GLOBAL_OFFSET_TABLE_\n");	\
++    }									\
++  else									\
++    {									\
++      fprintf (STREAM, "1:	.long	mcount\n");			\
++    }									\
++  fprintf (STREAM, "2:	lds.l	@r15+,pr\n");				\
++} while (0)
++
++#define NO_SHARED_LIBGCC_MULTILIB
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh-protos.h gcc-20030210/gcc/config/sh/sh-protos.h
+--- gcc-20030210.orig/gcc/config/sh/sh-protos.h	Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh-protos.h	Sat Feb 22 01:40:14 2003
+@@ -74,6 +74,7 @@
+ extern int shl_sext_length PARAMS ((rtx));
+ extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx));
+ extern rtx gen_datalabel_ref PARAMS ((rtx));
++extern int shl_casesi_worker_length PARAMS ((rtx));
+ extern int regs_used PARAMS ((rtx, int));
+ extern void fixup_addr_diff_vecs PARAMS ((rtx));
+ extern int get_dest_uid PARAMS ((rtx, int));
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.c gcc-20030210/gcc/config/sh/sh.c
+--- gcc-20030210.orig/gcc/config/sh/sh.c	Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh.c	Sat Feb 22 01:40:14 2003
+@@ -2143,6 +2143,48 @@
+   return sym;
+ }
+ 
++
++/* Function to be used in the length attribute of the casesi_worker
++   instruction.  Returns number of instructions, which is half of the
++   length of bytes. */
++
++int
++shl_casesi_worker_length (insn)
++     rtx insn;
++{
++  rtx set_src, label;
++  rtx diff_vec;
++
++  set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
++  if (!(GET_CODE (set_src) == UNSPEC
++	&& XINT (set_src, 1) == UNSPEC_CASESI))
++    abort ();
++
++  label = XVECEXP (set_src, 0, 2);
++  if (GET_CODE (label) != LABEL_REF)
++    abort ();
++
++  diff_vec = PATTERN (next_real_insn (XEXP (label, 0)));
++
++  if (GET_CODE (diff_vec) != ADDR_DIFF_VEC)
++    abort ();
++
++  switch (GET_MODE (diff_vec))
++    {
++    case SImode:
++      return 2;
++    case HImode:
++      if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++	return 3;
++      return 2;
++    case QImode:
++      if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++	return 2;
++      return 1;
++    default:
++      abort ();
++    }
++}
+ 
+ /* The SH cannot load a large constant into a register, constants have to
+    come from a pc relative load.  The reference of a pc relative load
+@@ -3190,7 +3232,7 @@
+       vec_lab = XEXP (XEXP (pat, 0), 0);
+ 
+       /* Search the matching casesi_jump_2.  */
+-      for (prev = vec_lab; ; prev = PREV_INSN (prev))
++      for (prev = vec_lab; prev; prev = PREV_INSN (prev))
+ 	{
+ 	  if (GET_CODE (prev) != JUMP_INSN)
+ 	    continue;
+@@ -3205,6 +3247,13 @@
+ 	    break;
+ 	}
+ 
++      if (prev == NULL)
++	{			/* Switch statement has been optimized out.  */
++	  delete_insn (PREV_INSN (insn));
++	  delete_insn (insn);
++	  continue;
++	}
++
+       /* Emit the reference label of the braf where it belongs, right after
+ 	 the casesi_jump_2 (i.e. braf).  */
+       braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);
+@@ -3223,7 +3272,7 @@
+      rtx barrier_or_label;
+ {
+   rtx next = next_real_insn (barrier_or_label), pat, prev;
+-  int slot, credit, jump_to_next;
++  int slot, credit, jump_to_next = 0;
+  
+   if (! next)
+     return 0;
+@@ -4507,7 +4556,8 @@
+   if (current_function_varargs || current_function_stdarg)
+     {
+       /* This is not used by the SH3E calling convention  */
+-      if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI)
++      if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI
++	  || TARGET_NO_IMPLICIT_FP)
+ 	{
+ 	  /* Push arg regs as if they'd been provided by caller in stack.  */
+ 	  for (i = 0; i < NPARM_REGS(SImode); i++)
+@@ -5149,7 +5199,8 @@
+   tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
+   tree record;
+ 
+-  if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)
++  if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI
++      || TARGET_NO_IMPLICIT_FP)
+     return ptr_type_node;
+ 
+   record = make_node (RECORD_TYPE);
+@@ -5211,7 +5262,8 @@
+       return;
+     }
+ 
+-  if ((! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)
++  if ((! TARGET_SH3E && ! TARGET_SH4)
++      || TARGET_HITACHI || TARGET_NO_IMPLICIT_FP)
+     {
+       std_expand_builtin_va_start (stdarg_p, valist, nextarg);
+       return;
+@@ -5289,7 +5341,8 @@
+   rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
+   pptr_type_node = build_pointer_type (ptr_type_node);
+ 
+-  if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) && ! TARGET_HITACHI)
++  if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4)
++      && ! TARGET_HITACHI && ! TARGET_NO_IMPLICIT_FP)
+     {
+       tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
+       tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack;
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.h gcc-20030210/gcc/config/sh/sh.h
+--- gcc-20030210.orig/gcc/config/sh/sh.h	Fri Feb 22 01:42:28 2002
++++ gcc-20030210/gcc/config/sh/sh.h	Sat Feb 22 01:40:14 2003
+@@ -147,10 +147,10 @@
+ #define HARD_SH4_BIT	(1<<5)
+ #define FPU_SINGLE_BIT	(1<<7)
+ #define SH4_BIT	       	(1<<12)
++#define NO_IMPLICIT_FP_BIT	(1<<3)
+ #define FMOVD_BIT	(1<<4)
+ #define SH5_BIT		(1<<0)
+ #define SPACE_BIT 	(1<<13)
+-#define BIGTABLE_BIT  	(1<<14)
+ #define RELAX_BIT	(1<<15)
+ #define USERMODE_BIT	(1<<16)
+ #define HITACHI_BIT     (1<<22)
+@@ -205,6 +205,9 @@
+ /* Nonzero if we should generate code for a SH5 CPU (either ISA).  */
+ #define TARGET_SH5 (target_flags & SH5_BIT)
+ 
++/* Nonzero if we should not use FPU implicitly.  */
++#define TARGET_NO_IMPLICIT_FP (target_flags & NO_IMPLICIT_FP_BIT)
++
+ /* Nonzero if we should generate code using the SHcompact instruction
+    set and 32-bit ABI.  */
+ #define TARGET_SHCOMPACT (TARGET_SH5 && TARGET_SH1)
+@@ -225,6 +228,7 @@
+ 
+ /* Nonzero if we should generate code using SHmedia FPU instructions.  */
+ #define TARGET_SHMEDIA_FPU (TARGET_SHMEDIA && TARGET_FPU_DOUBLE)
++
+ /* Nonzero if we should generate fmovd.  */
+ #define TARGET_FMOVD (target_flags & FMOVD_BIT)
+ 
+@@ -234,9 +238,6 @@
+ /* Nonzero if we should generate smaller code rather than faster code.  */
+ #define TARGET_SMALLCODE   (target_flags & SPACE_BIT)
+ 
+-/* Nonzero to use long jump tables.  */
+-#define TARGET_BIGTABLE     (target_flags & BIGTABLE_BIT)
+-
+ /* Nonzero to generate pseudo-ops needed by the assembler and linker
+    to do function call relaxing.  */
+ #define TARGET_RELAX (target_flags & RELAX_BIT)
+@@ -297,7 +298,6 @@
+   {"5-compact-nofpu", TARGET_NONE, "" },	\
+   {"5-compact-nofpu", SH5_BIT|SH3_BIT|SH2_BIT|SH1_BIT, "Generate FPU-less SHcompact code" }, \
+   {"b",		-LITTLE_ENDIAN_BIT, "" },  	\
+-  {"bigtable", 	BIGTABLE_BIT, "" },		\
+   {"dalign",  	DALIGN_BIT, "" },		\
+   {"fmovd",  	FMOVD_BIT, "" },		\
+   {"hitachi",	HITACHI_BIT, "" },		\
+@@ -306,6 +306,7 @@
+   {"isize", 	ISIZE_BIT, "" },		\
+   {"l",		LITTLE_ENDIAN_BIT, "" },  	\
+   {"no-ieee",  	-IEEE_BIT, "" },		\
++  {"no-implicit-fp", NO_IMPLICIT_FP_BIT, "" },	\
+   {"padstruct", PADSTRUCT_BIT, "" },    	\
+   {"prefergot",	PREFERGOT_BIT, "" },		\
+   {"relax",	RELAX_BIT, "" },		\
+@@ -2493,16 +2494,22 @@
+     goto LABEL;								\
+ }
+ 
++extern int optimize; /* needed for gen_casesi.  */
++extern int optimize_size;
++
+ /* Specify the machine mode that this machine uses
+    for the index in the tablejump instruction.  */
+-#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode)
++#define CASE_VECTOR_MODE SImode
+ 
+ #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \
+ ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \
+  ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \
+  : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \
+  ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \
+- : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \
++ : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \
++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \
++ : optimize_size && (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \
++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \
+  : SImode)
+ 
+ /* Define as C expression which evaluates to nonzero if the tablejump
+@@ -3038,10 +3045,7 @@
+ /* Output an absolute table element.  */
+ 
+ #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE)  				\
+-  if (TARGET_BIGTABLE) 							\
+-    asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); 			\
+-  else									\
+-    asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); 			\
++    asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE))
+ 
+ /* Output various types of constants.  */
+ 
+@@ -3167,8 +3171,6 @@
+ #define sh_cpu_attr ((enum attr_cpu)sh_cpu)
+ extern enum processor_type sh_cpu;
+ 
+-extern int optimize; /* needed for gen_casesi.  */
+-
+ enum mdep_reorg_phase_e
+ {
+   SH_BEFORE_MDEP_REORG,
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh.md gcc-20030210/gcc/config/sh/sh.md
+--- gcc-20030210.orig/gcc/config/sh/sh.md	Sat Nov 23 04:58:06 2002
++++ gcc-20030210/gcc/config/sh/sh.md	Sat Feb 22 01:40:14 2003
+@@ -1242,7 +1242,7 @@
+    (clobber (reg:SI PR_REG))
+    (clobber (reg:SI R4_REG))
+    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
+-  "TARGET_SH1 && ! TARGET_SH4"
++  "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP"
+   "jsr	@%1%#"
+   [(set_attr "type" "sfunc")
+    (set_attr "needs_delay_slot" "yes")])
+@@ -1336,7 +1336,7 @@
+ 
+   operands[3] = gen_reg_rtx (Pmode);
+   /* Emit the move of the address to a pseudo outside of the libcall.  */
+-  if (TARGET_HARD_SH4 && TARGET_SH3E)
++  if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP)
+     {
+       emit_move_insn (operands[3],
+ 		      gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\"));
+@@ -1391,7 +1391,7 @@
+    (clobber (reg:SI R2_REG))
+    (clobber (reg:SI R3_REG))
+    (use (match_operand:SI 1 "arith_reg_operand" "r"))]
+-  "TARGET_SH1 && ! TARGET_SH4"
++  "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP"
+   "jsr	@%1%#"
+   [(set_attr "type" "sfunc")
+    (set_attr "needs_delay_slot" "yes")])
+@@ -1476,7 +1476,7 @@
+ 
+   operands[3] = gen_reg_rtx (Pmode);
+   /* Emit the move of the address to a pseudo outside of the libcall.  */
+-  if (TARGET_HARD_SH4 && TARGET_SH3E)
++  if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP)
+     {
+       emit_move_insn (operands[3],
+ 		      gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\"));
+@@ -6446,6 +6446,8 @@
+     case SImode:
+       return \"shll2	%1\;mov.l	@(r0,%1),%0\";
+     case HImode:
++      if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
++	return \"add	%1,%1\;mov.w	@(r0,%1),%0\;extu.w	%0,%0\";
+       return \"add	%1,%1\;mov.w	@(r0,%1),%0\";
+     case QImode:
+       if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
+@@ -6455,7 +6457,15 @@
+       abort ();
+     }
+ }"
+-  [(set_attr "length" "4")])
++  [(set (attr "length")
++	(cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1))
++	       (const_string "2")
++	       (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2))
++	       (const_string "4")
++	       ;; Put "match_dup" here so that insn_variable_length_p return 1.
++	       (ne (match_dup 2) (match_dup 2))
++	       (const_string "4")]
++	      (const_string "6")))])
+ 
+ (define_insn "casesi_shift_media"
+   [(set (match_operand 0 "arith_reg_operand" "=r")
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh3-linux.h gcc-20030210/gcc/config/sh/sh3-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh3-linux.h	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh3-linux.h	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION  fputs (" (SH3 GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++  "-D__LITTLE_ENDIAN__ \
++   -D__SH3__ -D__sh3__ \
++   -D__SIZE_TYPE__=unsigned\\ int \
++   -D__PTRDIFF_TYPE__=int \
++   %{fPIC:-D__PIC__ -D__pic__} \
++   %{fpic:-D__PIC__ -D__pic__} \
++   %{posix:-D_POSIX_SOURCE} \
++   %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC  "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++  "-musermode -ml -m3 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++  "%{mrelax:-relax} \
++   %{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++    %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h gcc-20030210/gcc/config/sh/sh3eb-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh3eb-linux.h	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION  fputs (" (SH3EB GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++  "-D__BIG_ENDIAN__ \
++   -D__SH3__ -D__sh3__ \
++   -D__SIZE_TYPE__=unsigned\\ int \
++   -D__PTRDIFF_TYPE__=int \
++   %{fPIC:-D__PIC__ -D__pic__} \
++   %{fpic:-D__PIC__ -D__pic__} \
++   %{posix:-D_POSIX_SOURCE} \
++   %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC  "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++  "-musermode -mb -m3 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++  "%{mrelax:-relax} \
++   %{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++    %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh4-linux.h gcc-20030210/gcc/config/sh/sh4-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh4-linux.h	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh4-linux.h	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION  fputs (" (SH4 GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++  "-D__LITTLE_ENDIAN__ \
++   -D__SH4__ \
++   -D__SIZE_TYPE__=unsigned\\ int \
++   -D__PTRDIFF_TYPE__=int \
++   %{fPIC:-D__PIC__ -D__pic__} \
++   %{fpic:-D__PIC__ -D__pic__} \
++   %{posix:-D_POSIX_SOURCE} \
++   %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC  "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++  "-musermode -ml -m4 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++  "%{mrelax:-relax} \
++   %{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++    %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h gcc-20030210/gcc/config/sh/sh4eb-linux.h
+--- gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/sh4eb-linux.h	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,29 @@
++#undef TARGET_VERSION
++#define TARGET_VERSION  fputs (" (SH4EB GNU/Linux with ELF)", stderr);
++
++#undef CPP_SPEC
++#define CPP_SPEC \
++  "-D__BIG_ENDIAN__ \
++   -D__SH4__ \
++   -D__SIZE_TYPE__=unsigned\\ int \
++   -D__PTRDIFF_TYPE__=int \
++   %{fPIC:-D__PIC__ -D__pic__} \
++   %{fpic:-D__PIC__ -D__pic__} \
++   %{posix:-D_POSIX_SOURCE} \
++   %{pthread:-D_REENTRANT -D_PTHREADS}"
++
++#undef ASM_SPEC
++#define ASM_SPEC  "%{mrelax:-relax}"
++
++#undef CC1_SPEC
++#define CC1_SPEC \
++  "-musermode -mb -m4 %{profile:-p}"
++
++#undef LINK_SPEC
++#define LINK_SPEC \
++  "%{mrelax:-relax} \
++   %{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++    %{static:-static}"
+diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux gcc-20030210/gcc/config/sh/t-linux
+--- gcc-20030210.orig/gcc/config/sh/t-linux	Thu May 17 12:16:12 2001
++++ gcc-20030210/gcc/config/sh/t-linux	Sat Feb 22 01:40:14 2003
+@@ -1,10 +1,20 @@
+-TARGET_LIBGCC2_CFLAGS = -fpic
++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES
++LIBGCC1 = libgcc1-asm.a
++CROSS_LIBGCC1 = libgcc1-asm.a
++LIBGCC1_TEST = libgcc1-test
+ LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movstr \
+   _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \
+   _ic_invalidate
++LIB2ADDEH = $(srcdir)/unwind-sjlj.c
++LIB2ADDEHDEP = unwind.inc unwind-sjlj.c
+ 
+-MULTILIB_OPTIONS= mb m3e/m4
++MULTILIB_OPTIONS= mb m4
+ MULTILIB_DIRNAMES= 
+ MULTILIB_MATCHES = 
+ 
+-EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o
++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
++
++# Override t-slibgcc-elf-ver to export some libgcc symbols with
++# the symbol versions that glibc used and SH specific.
++SHLIB_MAPFILES =  $(srcdir)/libgcc-std.ver \
++		  $(srcdir)/config/sh/libgcc-glibc.ver
+diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux-nomulti gcc-20030210/gcc/config/sh/t-linux-nomulti
+--- gcc-20030210.orig/gcc/config/sh/t-linux-nomulti	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/gcc/config/sh/t-linux-nomulti	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,9 @@
++LIBGCC = libgcc.a
++EXTRA_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o
++
++INSTALL_LIBGCC = install-libgcc
++
++MULTILIB_OPTIONS=
++MULTILIB_DIRNAMES= 
++MULTILIB_MATCHES = 
++EXTRA_MULTILIB_PARTS=
+diff -ruN gcc-20030210.orig/gcc/config.gcc gcc-20030210/gcc/config.gcc
+--- gcc-20030210.orig/gcc/config.gcc	Fri Jan 31 19:17:13 2003
++++ gcc-20030210/gcc/config.gcc	Sat Feb 22 01:40:14 2003
+@@ -337,9 +337,9 @@
+ sparc*-*-*)
+ 	cpu_type=sparc
+ 	;;
+-sh64-*-*)
+-	cpu_type=sh
+-	;;
++sh*-*-*)
++ 	cpu_type=sh
++ 	;;
+ esac
+ 
+ tm_file=${cpu_type}/${cpu_type}.h
+@@ -3018,9 +3018,31 @@
+ 	  thread_file='rtems'
+ 	fi
+ 	;;
+-sh-*-linux*)
++sh*-*-linux*)
+ 	tm_file="${tm_file} sh/elf.h sh/linux.h"
+-	tmake_file="sh/t-sh sh/t-elf sh/t-linux"
++	tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux sh/t-linux"
++	extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
++	case $machine in
++		sh3eb-*)
++			tm_file="${tm_file} sh/sh3eb-linux.h"
++			tmake_file="${tmake_file} sh/t-linux-nomulti"
++			;;
++		sh4eb-*)
++			tm_file="${tm_file} sh/sh4eb-linux.h"
++			tmake_file="${tmake_file} sh/t-linux-nomulti"
++			;;
++		sh3-*)
++			tm_file="${tm_file} sh/sh3-linux.h"
++			tmake_file="${tmake_file} sh/t-linux-nomulti"
++			;;
++		sh4-*)
++			tm_file="${tm_file} sh/sh4-linux.h"
++			tmake_file="${tmake_file} sh/t-linux-nomulti"
++			;;
++		*)
++			;;
++	esac
++	xmake_file=x-linux
+ 	gas=yes gnu_ld=yes
+ 	float_format=sh
+ 	;;
+diff -ruN gcc-20030210.orig/gcc/dwarf2out.c gcc-20030210/gcc/dwarf2out.c
+--- gcc-20030210.orig/gcc/dwarf2out.c	Mon Feb 10 19:36:25 2003
++++ gcc-20030210/gcc/dwarf2out.c	Sat Feb 22 01:40:14 2003
+@@ -10224,7 +10224,9 @@
+ 	  /* We can have a normal definition following an inline one in the
+ 	     case of redefinition of GNU C extern inlines.
+ 	     It seems reasonable to use AT_specification in this case.  */
+-	  && !get_AT_unsigned (old_die, DW_AT_inline))
++	  && !get_AT_unsigned (old_die, DW_AT_inline)
++	  /* Skip the nested function.  */
++	  && !decl_function_context (decl))
+ 	{
+ 	  /* ??? This can happen if there is a bug in the program, for
+ 	     instance, if it has duplicate function definitions.  Ideally,
+diff -ruN gcc-20030210.orig/gcc/final.c gcc-20030210/gcc/final.c
+--- gcc-20030210.orig/gcc/final.c	Fri Jan 31 19:17:20 2003
++++ gcc-20030210/gcc/final.c	Sat Feb 22 01:40:14 2003
+@@ -1128,7 +1128,7 @@
+ 	    }
+ 	}
+ 
+-      INSN_ADDRESSES (uid) = insn_current_address;
++      INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
+ 
+       if (GET_CODE (insn) == NOTE || GET_CODE (insn) == BARRIER
+ 	  || GET_CODE (insn) == CODE_LABEL)
+diff -ruN gcc-20030210.orig/gcc/mkmap-symver.awk gcc-20030210/gcc/mkmap-symver.awk
+--- gcc-20030210.orig/gcc/mkmap-symver.awk	Fri Jan 31 19:17:26 2003
++++ gcc-20030210/gcc/mkmap-symver.awk	Sat Feb 22 01:40:14 2003
+@@ -89,7 +89,11 @@
+     output(inherit[lib]);
+ 
+   printf("%s {\n", lib);
+-  printf("  global:\n");
++  for (sym in ver)
++    if ((ver[sym] == lib) && (sym in def))
++      count++;
++  if (count > 0)
++    printf("  global:\n");
+   for (sym in ver)
+     if ((ver[sym] == lib) && (sym in def))
+       {
+diff -ruN gcc-20030210.orig/gcc/reload1.c gcc-20030210/gcc/reload1.c
+--- gcc-20030210.orig/gcc/reload1.c	Fri Jan 31 19:17:29 2003
++++ gcc-20030210/gcc/reload1.c	Sat Feb 22 01:40:14 2003
+@@ -6103,6 +6103,7 @@
+ 	    for (j = 0; j < n_reloads; j++)
+ 	      if (rld[j].in != 0
+ 		  && rld[j].when_needed != RELOAD_OTHER
++		  && rld[j].when_needed != RELOAD_FOR_OUTPUT_ADDRESS
+ 		  && reg_overlap_mentioned_for_reload_p (rld[j].in,
+ 							 rld[i].in))
+ 		rld[j].when_needed
+diff -ruN gcc-20030210.orig/gcc/reorg.c gcc-20030210/gcc/reorg.c
+--- gcc-20030210.orig/gcc/reorg.c	Fri Jan 31 19:17:30 2003
++++ gcc-20030210/gcc/reorg.c	Sat Feb 22 01:40:14 2003
+@@ -3265,6 +3265,14 @@
+ 		|| condjump_in_parallel_p (XVECEXP (PATTERN (insn), 0, 0))))
+ 	continue;
+ 
++#ifdef MD_CAN_REDIRECT_BRANCH
++      /* On some targets, branches with delay slots can have a limited
++	 displacement.  Give the back end a chance to tell us we can't do
++	 this.  */
++      if (! MD_CAN_REDIRECT_BRANCH (insn, delay_insn))
++	continue;
++#endif
++
+       target_label = JUMP_LABEL (delay_insn);
+ 
+       if (target_label)
+diff -ruN gcc-20030210.orig/gcc/tree-inline.c gcc-20030210/gcc/tree-inline.c
+--- gcc-20030210.orig/gcc/tree-inline.c	Fri Jan 31 19:17:33 2003
++++ gcc-20030210/gcc/tree-inline.c	Sat Feb 22 01:40:14 2003
+@@ -836,11 +836,17 @@
+ 
+   /* Don't try to inline functions that are not well-suited to
+      inlining.  */
+-  if (!inlinable_function_p (fn, id))
+-    return NULL_TREE;
++  if (! inlinable_function_p (fn, id)
++      || ! (*lang_hooks.tree_inlining.start_inlining) (fn))
++    {
++      if (DECL_INLINE (fn) && warn_inline && ! flag_really_no_inline)
++	{
++	  warning_with_decl (fn, "inlining failed in call to `%s'");
++	  warning ("called from here");
++	}
+ 
+-  if (! (*lang_hooks.tree_inlining.start_inlining) (fn))
+-    return NULL_TREE;
++      return NULL_TREE;
++    }
+ 
+   /* Set the current filename and line number to the function we are
+      inlining so that when we create new _STMT nodes here they get
+diff -ruN gcc-20030210.orig/libjava/Makefile.in gcc-20030210/libjava/Makefile.in
+--- gcc-20030210.orig/libjava/Makefile.in	Tue Jan 28 10:44:37 2003
++++ gcc-20030210/libjava/Makefile.in	Sat Feb 22 01:40:14 2003
+@@ -1637,6 +1637,7 @@
+ 	"AS=$(AS)" \
+ 	"CC=$(CC)" \
+ 	"CXX=$(CXX)" \
++	"GCJ=$(GCJ)" \
+ 	"LD=$(LD)" \
+ 	"LIBCFLAGS=$(LIBCFLAGS)" \
+ 	"NM=$(NM)" \
+diff -ruN gcc-20030210.orig/libjava/configure gcc-20030210/libjava/configure
+--- gcc-20030210.orig/libjava/configure	Tue Jan 28 10:44:37 2003
++++ gcc-20030210/libjava/configure	Sat Feb 22 01:42:11 2003
+@@ -2031,7 +2031,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/libjava/java/net/natInetAddress.cc gcc-20030210/libjava/java/net/natInetAddress.cc
+--- gcc-20030210.orig/libjava/java/net/natInetAddress.cc	Tue Mar  5 05:02:19 2002
++++ gcc-20030210/libjava/java/net/natInetAddress.cc	Sat Feb 22 01:40:14 2003
+@@ -56,7 +56,7 @@
+ #endif
+ 
+ #ifndef HAVE_GETHOSTNAME_DECL
+-extern "C" int gethostname (char *name, int namelen);
++extern "C" int gethostname (char *name, unsigned int namelen);
+ #endif
+ 
+ #ifdef DISABLE_JAVA_NET
+diff -ruN gcc-20030210.orig/libjava/libltdl/aclocal.m4 gcc-20030210/libjava/libltdl/aclocal.m4
+--- gcc-20030210.orig/libjava/libltdl/aclocal.m4	Sun Sep 10 17:04:40 2000
++++ gcc-20030210/libjava/libltdl/aclocal.m4	Sat Feb 22 01:40:14 2003
+@@ -573,7 +573,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case "$host_cpu" in
+-  alpha* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | i*86 | powerpc* | sparc* | ia64* | sh*)
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/libjava/sysdep/sh/locks.h gcc-20030210/libjava/sysdep/sh/locks.h
+--- gcc-20030210.orig/libjava/sysdep/sh/locks.h	Thu Jan  1 09:00:00 1970
++++ gcc-20030210/libjava/sysdep/sh/locks.h	Sat Feb 22 01:40:14 2003
+@@ -0,0 +1,72 @@
++// locks.h - Thread synchronization primitives. SuperH implementation.
++
++/* Copyright (C) 2002  Free Software Foundation
++
++   This file is part of libgcj.
++
++This software is copyrighted work licensed under the terms of the
++Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
++details.  */
++
++#ifndef __SYSDEP_LOCKS_H__
++#define __SYSDEP_LOCKS_H__
++
++typedef size_t obj_addr_t;	/* Integer type big enough for object	*/
++				/* address.				*/
++
++static unsigned char __cas_lock = 0;
++
++inline static void
++__cas_start_atomic (void)
++{
++  unsigned int val;
++
++  do
++    __asm__ __volatile__ ("tas.b @%1; movt %0"
++			  : "=r" (val)
++			  : "r" (&__cas_lock)
++			  : "memory");
++  while (val == 0);
++}
++
++inline static void
++__cas_end_atomic (void)
++{
++  __asm__ __volatile__ (" " : : : "memory");
++  __cas_lock = 0;
++}
++
++inline static bool
++compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old,
++		  obj_addr_t new_val)
++{
++  bool ret;
++
++  __cas_start_atomic ();
++  if (*addr != old)
++    ret = false;
++  else
++    {
++      *addr = new_val;
++      ret = true;
++    }
++  __cas_end_atomic ();
++
++  return ret;
++}
++
++inline static void
++release_set (volatile obj_addr_t *addr, obj_addr_t new_val)
++{
++  __asm__ __volatile__ (" " : : : "memory");
++  *(addr) = new_val;
++}
++
++inline static bool
++compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old,
++			  obj_addr_t new_val)
++{
++  return compare_and_swap (addr, old, new_val);
++}
++
++#endif /* ! __SYSDEP_LOCKS_H__ */
+diff -ruN gcc-20030210.orig/libstdc++-v3/acinclude.m4 gcc-20030210/libstdc++-v3/acinclude.m4
+--- gcc-20030210.orig/libstdc++-v3/acinclude.m4	Tue Jan 28 02:30:41 2003
++++ gcc-20030210/libstdc++-v3/acinclude.m4	Sat Feb 22 01:40:14 2003
+@@ -1828,9 +1828,10 @@
+   GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+ 
+   # Passed down for canadian crosses.
+-  if test x"$CANADIAN" = xyes; then
+-    TOPLEVEL_INCLUDES='-I$(includedir)'
+-  fi
++  #if test x"$CANADIAN" = xyes; then
++  #  TOPLEVEL_INCLUDES='-I$(includedir)'
++  #fi
++  TOPLEVEL_INCLUDES=''
+ 
+   LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+ 
+diff -ruN gcc-20030210.orig/libstdc++-v3/aclocal.m4 gcc-20030210/libstdc++-v3/aclocal.m4
+--- gcc-20030210.orig/libstdc++-v3/aclocal.m4	Mon Feb 10 19:36:47 2003
++++ gcc-20030210/libstdc++-v3/aclocal.m4	Sat Feb 22 01:40:14 2003
+@@ -1840,9 +1840,10 @@
+   GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+ 
+   # Passed down for canadian crosses.
+-  if test x"$CANADIAN" = xyes; then
+-    TOPLEVEL_INCLUDES='-I$(includedir)'
+-  fi
++  #if test x"$CANADIAN" = xyes; then
++  #  TOPLEVEL_INCLUDES='-I$(includedir)'
++  #fi
++  TOPLEVEL_INCLUDES=''
+ 
+   LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+ 
+diff -ruN gcc-20030210.orig/libstdc++-v3/configure gcc-20030210/libstdc++-v3/configure
+--- gcc-20030210.orig/libstdc++-v3/configure	Mon Feb 10 19:37:17 2003
++++ gcc-20030210/libstdc++-v3/configure	Sat Feb 22 01:40:14 2003
+@@ -1982,7 +1982,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh*)
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+@@ -22340,9 +22340,10 @@
+   GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include"
+ 
+   # Passed down for canadian crosses.
+-  if test x"$CANADIAN" = xyes; then
+-    TOPLEVEL_INCLUDES='-I$(includedir)'
+-  fi
++  #if test x"$CANADIAN" = xyes; then
++  #  TOPLEVEL_INCLUDES='-I$(includedir)'
++  #fi
++  TOPLEVEL_INCLUDES=''
+ 
+   LIBMATH_INCLUDES='-I$(top_srcdir)/libmath'
+ 
+diff -ruN gcc-20030210.orig/libtool.m4 gcc-20030210/libtool.m4
+--- gcc-20030210.orig/libtool.m4	Fri Jan 31 19:16:59 2003
++++ gcc-20030210/libtool.m4	Sat Feb 22 01:40:14 2003
+@@ -597,7 +597,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+diff -ruN gcc-20030210.orig/zlib/configure gcc-20030210/zlib/configure
+--- gcc-20030210.orig/zlib/configure	Tue Jan 28 10:44:15 2003
++++ gcc-20030210/zlib/configure	Sat Feb 22 01:40:14 2003
+@@ -1571,7 +1571,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch
new file mode 100644
index 00000000..0de46fc4
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch
@@ -0,0 +1,98 @@
+g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003
+
+The first hunk fixes the error
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+    while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+    (procedure "g++_include_flags" line 21)
+    invoked from within
+"g++_include_flags [get_multilibs] "
+    (procedure "g++_init" line 63)
+    invoked from within
+"${tool}_init $test_file_name"
+    (procedure "runtest" line 19)
+    invoked from within
+"runtest $test_name"
+    ("foreach" body line 42)
+    invoked from within
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+The fix isn't especially pretty, but it worked for me, and can't hurt the
+more common native compiler case.  Maybe someone who knows the code better 
+can come up with a better fix.
+
+The second hunk fixes the error
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+when trying to compile g++ testcases (!); setting up
+the shared library environment when running crosstests of g++ 
+should either be done by a special board file, or by
+setting up a remote chroot environment (see http://kegel.com/crosstool),
+not by blithely setting LD_LIBRARY_PATH on the local system.
+
+--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old	Fri Jul 11 15:42:47 2003
++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp	Sat Jul 12 12:57:07 2003
+@@ -72,6 +72,8 @@
+ #
+ proc g++_include_flags { paths } {
+     global srcdir
++    global objdir
++    global target_triplet
+     global HAVE_LIBSTDCXX_V3
+     global TESTING_IN_BUILD_TREE
+ 
+@@ -90,6 +92,20 @@
+ 
+     if { ${HAVE_LIBSTDCXX_V3} } {
+       set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++	  # first assume no multilibs
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++	  # assume multilib only one level deep
++          set multisub [file tail $gccpath]
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++           error "Can't find libstdc++-v3"
++      }
+       append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+     } else {
+       set odir_v2 [lookfor_file ${gccpath} libstdc++]
+@@ -192,16 +192,20 @@
+       }
+     }
+ 
+-    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+-    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+-    # (for the 64-bit ABI).  The right way to do this would be to modify
+-    # unix.exp -- but that's not an option since it's part of DejaGNU
+-    # proper, so we do it here.  We really only need to do 
+-    # this on IRIX, but it shouldn't hurt to do it anywhere else.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++      # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++      # (for the 64-bit ABI).  The right way to do this would be to modify
++      # unix.exp -- but that's not an option since it's part of DejaGNU
++      # proper, so we do it here.  We really only need to do 
++      # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++      # Doing this causes us to be unable to run cross-compilers.
++      setenv  LD_LIBRARY_PATH     $ld_library_path
++      setenv  SHLIB_PATH          $ld_library_path
++      setenv  LD_LIBRARYN32_PATH  $ld_library_path
++      setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ 
+     return "$flags"
+ }
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch
new file mode 100644
index 00000000..db78ba1f
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch
@@ -0,0 +1,6864 @@
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am
+--- gcc-3.2.2.orig/libffi/Makefile.am	Tue Jan 28 10:43:56 2003
++++ gcc/libffi/Makefile.am	Tue Jan 28 10:48:33 2003
+@@ -8,14 +8,17 @@
+ 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
+ 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
+ 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
++		src/x86/ffi64.c src/x86/unix64.S \
+ 		src/alpha/ffi.c src/alpha/osf.S \
+ 		src/m68k/ffi.c src/m68k/sysv.S \
+ 		src/powerpc/ffi.c src/powerpc/sysv.S \
+ 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
+ 		src/powerpc/ffi_darwin.c \
+ 		src/powerpc/darwin.S src/powerpc/aix.S \
+-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
+-		src/arm/ffi.c src/arm/sysv.S
++		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
++		src/arm/ffi.c src/arm/sysv.S \
++		src/s390/ffi.c src/s390/sysv.S \
++		src/sh/ffi.c src/sh/sysv.S
+ 
+ VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
+ 
+@@ -83,6 +86,7 @@
+ ffitest_LDFLAGS = -shared-libgcc
+ 
+ TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
+ TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
+ TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
+ TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
+@@ -91,9 +95,12 @@
+ TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
+ TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
+ TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+ TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+ TARGET_SRC_ARM =  src/arm/sysv.S src/arm/ffi.c
++TARGET_SRC_S390 =  src/s390/sysv.S src/s390/ffi.c
++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
++TARGET_SRC_SH =  src/sh/sysv.S src/sh/ffi.c
+ 
+ ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@)
+ ## Work around automake deficiency
+@@ -103,6 +110,10 @@
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
+ endif
++if MIPS_LINUX
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
++endif
+ if MIPS_SGI
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+@@ -147,6 +158,18 @@
+ libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
+ libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
+ endif
++if S390
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++endif
++if X86_64
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++endif
++if SH
++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
++libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
++endif
+ 
+ AM_CFLAGS = -fexceptions
+ 
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in
+--- gcc-3.2.2.orig/libffi/Makefile.in	Wed Jan 29 07:59:05 2003
++++ gcc/libffi/Makefile.in	Wed Jan 29 07:58:58 2003
+@@ -91,14 +91,17 @@
+ 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
+ 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
+ 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
++		src/x86/ffi64.c src/x86/unix64.S \
+ 		src/alpha/ffi.c src/alpha/osf.S \
+ 		src/m68k/ffi.c src/m68k/sysv.S \
+ 		src/powerpc/ffi.c src/powerpc/sysv.S \
+ 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
+ 		src/powerpc/ffi_darwin.c \
+ 		src/powerpc/darwin.S src/powerpc/aix.S \
+-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
+-		src/arm/ffi.c src/arm/sysv.S
++		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
++		src/arm/ffi.c src/arm/sysv.S \
++		src/s390/ffi.c src/s390/sysv.S \
++		src/sh/ffi.c src/sh/sysv.S
+ 
+ 
+ VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
+@@ -162,6 +165,7 @@
+ ffitest_LDFLAGS = -shared-libgcc
+ 
+ TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
+ TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
+ TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
+ TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
+@@ -170,14 +174,18 @@
+ TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
+ TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
+ TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+ TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+ TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
+ 
+ libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+ 		src/raw_api.c src/java_raw_api.c
+ 
+ @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
++@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
+ @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
+ @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
+@@ -189,7 +197,11 @@
+ @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
+ @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
+ @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
++@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
+ @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
++@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
+ @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
+ @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
+ @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
+@@ -201,6 +213,9 @@
+ @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
+ @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
+ @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
++@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
++@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
++@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
+ 
+ AM_CFLAGS = -fexceptions
+ 
+@@ -208,7 +223,7 @@
+ 
+ INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
+ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
++mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs
+ CONFIG_HEADER = fficonfig.h
+ CONFIG_CLEAN_FILES = 
+ LTLIBRARIES =  $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
+@@ -220,10 +235,6 @@
+ LIBS = @LIBS@
+ libffi_convenience_la_LDFLAGS = 
+ libffi_convenience_la_LIBADD = 
+-@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
+-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
+ @ALPHA_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+ @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo
+@@ -234,12 +245,29 @@
+ @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
+ @MIPS_GCC_TRUE@src/mips/n32.lo
+-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
++@S390_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
+ @M68K_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+ @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
++@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
++@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
++@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
++@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
++@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo
++@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
++@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
++@X86_64_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
++@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \
++@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo
+ @SPARC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+ @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \
+@@ -247,62 +275,75 @@
+ @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+ @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
+-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo
+-@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
+-@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
++@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo
++@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
++@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
++@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
++@MIPS_SGI_TRUE@src/mips/n32.lo
+ @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+ @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+ @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
+-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
+-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
+-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
+-@MIPS_SGI_TRUE@src/mips/n32.lo
++@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
++@SH_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo
+ libffi_la_LIBADD = 
++@SH_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
++@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \
++@SH_TRUE@src/sh/ffi.lo
++@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
++@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
++@X86_TRUE@src/x86/sysv.lo
+ @POWERPC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+ @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \
+ @POWERPC_TRUE@src/powerpc/ppc_closure.lo
+-@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
+-@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
+-@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+-@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
+-@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@MIPS_LINUX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo
+ @SPARC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+ @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo
+ @POWERPC_AIX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+ @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \
+-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo
+-@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
+-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
+-@X86_TRUE@src/x86/sysv.lo
++@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo
++@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+ @ARM_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
+ @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \
+ @ARM_TRUE@src/arm/ffi.lo
++@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
++@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
++@S390_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
++@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
++@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
++@X86_64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
++@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
++@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \
++@X86_64_TRUE@src/x86/sysv.lo
+ @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+ @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \
+ @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
+-@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
+-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
+-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
+ noinst_PROGRAMS =  ffitest$(EXEEXT)
+ PROGRAMS =  $(noinst_PROGRAMS)
+ 
+@@ -578,8 +616,8 @@
+ 	-chmod 777 $(distdir)
+ 	$(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \
+ 	   $(distdir)/src/m68k $(distdir)/src/mips \
+-	   $(distdir)/src/powerpc $(distdir)/src/sparc \
+-	   $(distdir)/src/x86
++	   $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \
++	   $(distdir)/src/sparc $(distdir)/src/x86
+ 	@for file in $(DISTFILES); do \
+ 	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ 	  if test -d $$d/$$file; then \
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4
+--- gcc-3.2.2.orig/libffi/acinclude.m4	Sun Sep 10 16:43:14 2000
++++ gcc/libffi/acinclude.m4	Tue Dec 17 03:22:47 2002
+@@ -4,5 +4,8 @@
+ dnl to add a definition of LIBTOOL to Makefile.in.
+ ifelse(yes,no,[
+ AC_DEFUN([AC_PROG_LIBTOOL],)
++AC_DEFUN([AM_PROG_LIBTOOL],)
+ AC_SUBST(LIBTOOL)
+ ])
++
++sinclude(../config/accross.m4)
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4
+--- gcc-3.2.2.orig/libffi/aclocal.m4	Fri Feb  1 07:25:31 2002
++++ gcc/libffi/aclocal.m4	Tue Dec 17 03:22:47 2002
+@@ -1,6 +1,6 @@
+-dnl aclocal.m4 generated automatically by aclocal 1.4
++dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+ 
+-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+ dnl This file is free software; the Free Software Foundation
+ dnl gives unlimited permission to copy and/or distribute it,
+ dnl with or without modifications, as long as this notice is preserved.
+@@ -16,108 +16,15 @@
+ dnl to add a definition of LIBTOOL to Makefile.in.
+ ifelse(yes,no,[
+ AC_DEFUN([AC_PROG_LIBTOOL],)
++AC_DEFUN([AM_PROG_LIBTOOL],)
+ AC_SUBST(LIBTOOL)
+ ])
+ 
+-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
+-[changequote(<<, >>)dnl
+-dnl The name to #define.
+-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
+-dnl The cache variable name.
+-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
+-changequote([, ])dnl
+-AC_MSG_CHECKING(size of $1)
+-AC_CACHE_VAL(AC_CV_NAME,
+-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence.
+-  AC_TRY_COMPILE([#include "confdefs.h"
+-#include <sys/types.h>
+-$2
+-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
+-  if test x$AC_CV_NAME != x ; then break; fi
+-done
+-])
+-if test x$AC_CV_NAME = x ; then
+-  AC_MSG_ERROR([cannot determine a size for $1])
+-fi
+-AC_MSG_RESULT($AC_CV_NAME)
+-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
+-undefine([AC_TYPE_NAME])dnl
+-undefine([AC_CV_NAME])dnl
+-])
+-
+-AC_DEFUN([AC_C_BIGENDIAN_CROSS],
+-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
+-[ac_cv_c_bigendian=unknown
+-# See if sys/param.h defines the BYTE_ORDER macro.
+-AC_TRY_COMPILE([#include <sys/types.h>
+-#include <sys/param.h>], [
+-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+- bogus endian macros
+-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
+-AC_TRY_COMPILE([#include <sys/types.h>
+-#include <sys/param.h>], [
+-#if BYTE_ORDER != BIG_ENDIAN
+- not big endian
+-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
+-if test $ac_cv_c_bigendian = unknown; then
+-AC_TRY_RUN([main () {
+-  /* Are we little or big endian?  From Harbison&Steele.  */
+-  union
+-  {
+-    long l;
+-    char c[sizeof (long)];
+-  } u;
+-  u.l = 1;
+-  exit (u.c[sizeof (long) - 1] == 1);
+-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
+-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
+-fi])
+-if test $ac_cv_c_bigendian = unknown; then
+-AC_MSG_CHECKING(to probe for byte ordering)
+-[
+-cat >conftest.c <<EOF
+-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
+-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
+-int main() { _ascii (); _ebcdic (); return 0; }
+-EOF
+-] if test -f conftest.c ; then
+-     if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then
+-        if test `grep -l BIGenDianSyS conftest.o` ; then
+-           echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
+-           ac_cv_c_bigendian=yes
+-        fi
+-        if test `grep -l LiTTleEnDian conftest.o` ; then
+-           echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
+-           if test $ac_cv_c_bigendian = yes ; then
+-            ac_cv_c_bigendian=unknown;
+-           else
+-            ac_cv_c_bigendian=no
+-           fi
+-        fi
+-        echo $ac_n 'guessing bigendian ...  ' >&AC_FD_MSG
+-     fi
+-  fi
+-AC_MSG_RESULT($ac_cv_c_bigendian)
+-fi
+-if test $ac_cv_c_bigendian = yes; then
+-  AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
+-  BYTEORDER=4321
+-else
+-  BYTEORDER=1234
+-fi
+-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
+-if test $ac_cv_c_bigendian = unknown; then
+-  AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
+-fi
+-])
++sinclude(../config/accross.m4)
+ 
+ # Like AC_CONFIG_HEADER, but automatically create stamp file.
+ 
+-AC_DEFUN(AM_CONFIG_HEADER,
++AC_DEFUN([AM_CONFIG_HEADER],
+ [AC_PREREQ([2.12])
+ AC_CONFIG_HEADER([$1])
+ dnl When config.status generates a header, we must update the stamp-h file.
+@@ -147,7 +54,7 @@
+ dnl Usage:
+ dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+ 
+-AC_DEFUN(AM_INIT_AUTOMAKE,
++AC_DEFUN([AM_INIT_AUTOMAKE],
+ [AC_REQUIRE([AC_PROG_INSTALL])
+ PACKAGE=[$1]
+ AC_SUBST(PACKAGE)
+@@ -175,7 +82,7 @@
+ # Check to make sure that the build environment is sane.
+ #
+ 
+-AC_DEFUN(AM_SANITY_CHECK,
++AC_DEFUN([AM_SANITY_CHECK],
+ [AC_MSG_CHECKING([whether build environment is sane])
+ # Just in case
+ sleep 1
+@@ -216,7 +123,7 @@
+ 
+ dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+ dnl The program must properly implement --version.
+-AC_DEFUN(AM_MISSING_PROG,
++AC_DEFUN([AM_MISSING_PROG],
+ [AC_MSG_CHECKING(for working $2)
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+@@ -235,7 +142,7 @@
+ 
+ # serial 1
+ 
+-AC_DEFUN(AM_MAINTAINER_MODE,
++AC_DEFUN([AM_MAINTAINER_MODE],
+ [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+   dnl maintainer-mode is disabled by default
+   AC_ARG_ENABLE(maintainer-mode,
+@@ -252,7 +159,7 @@
+ 
+ # Define a conditional.
+ 
+-AC_DEFUN(AM_CONDITIONAL,
++AC_DEFUN([AM_CONDITIONAL],
+ [AC_SUBST($1_TRUE)
+ AC_SUBST($1_FALSE)
+ if $2; then
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure
+--- gcc-3.2.2.orig/libffi/configure	Wed Jan 29 07:59:05 2003
++++ gcc/libffi/configure	Sat Feb  1 20:16:19 2003
+@@ -633,17 +633,16 @@
+ 
+ if test "${srcdir}" = "."; then
+   if test "${with_target_subdir}" != "."; then
+-    libffi_basedir="${srcdir}/${with_multisrctop}.."
++    libffi_basedir="${with_multisrctop}../"
+   else
+-    libffi_basedir="${srcdir}/${with_multisrctop}"
++    libffi_basedir="${with_multisrctop}"
+   fi
+ else
+-  libffi_basedir="${srcdir}"
++  libffi_basedir=
+ fi
+ 
+-
+ ac_aux_dir=
+-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
++for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do
+   if test -f $ac_dir/install-sh; then
+     ac_aux_dir=$ac_dir
+     ac_install_sh="$ac_aux_dir/install-sh -c"
+@@ -655,13 +654,14 @@
+   fi
+ done
+ if test -z "$ac_aux_dir"; then
+-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
++  { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; }
+ fi
+ ac_config_guess=$ac_aux_dir/config.guess
+ ac_config_sub=$ac_aux_dir/config.sub
+ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+ 
+ 
++
+ # Make sure we can run config.sub.
+ if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+@@ -1238,9 +1238,18 @@
+   ;;
+ 
+ hpux10.20*|hpux11*)
+-  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+-  lt_cv_file_magic_cmd=/usr/bin/file
+-  lt_cv_file_magic_test_file=/usr/lib/libc.sl
++  case $host_cpu in
++  hppa*)
++    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
++    lt_cv_file_magic_cmd=/usr/bin/file
++    lt_cv_file_magic_test_file=/usr/lib/libc.sl
++    ;;
++  ia64*)
++    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
++    lt_cv_file_magic_cmd=/usr/bin/file
++    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
++    ;;
++  esac
+   ;;
+ 
+ irix5* | irix6*)
+@@ -1267,7 +1276,7 @@
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+@@ -1330,13 +1339,13 @@
+ deplibs_check_method=$lt_cv_deplibs_check_method
+ 
+ echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+-echo "configure:1334: checking for object suffix" >&5
++echo "configure:1343: checking for object suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   rm -f conftest*
+ echo 'int i = 1;' > conftest.$ac_ext
+-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   for ac_file in conftest.*; do
+     case $ac_file in
+     *.c) ;;
+@@ -1356,7 +1365,7 @@
+ 
+ 
+ echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+-echo "configure:1360: checking for executable suffix" >&5
++echo "configure:1369: checking for executable suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1366,7 +1375,7 @@
+   rm -f conftest*
+   echo 'int main () { return 0; }' > conftest.$ac_ext
+   ac_cv_exeext=
+-  if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+     for file in conftest.*; do
+       case $file in
+       *.c | *.o | *.obj) ;;
+@@ -1399,7 +1408,7 @@
+ file_magic*)
+   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+     echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
+-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5
++echo "configure:1412: checking for ${ac_tool_prefix}file" >&5
+ if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1461,7 +1470,7 @@
+ if test -z "$lt_cv_path_MAGIC_CMD"; then
+   if test -n "$ac_tool_prefix"; then
+     echo $ac_n "checking for file""... $ac_c" 1>&6
+-echo "configure:1465: checking for file" >&5
++echo "configure:1474: checking for file" >&5
+ if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1532,7 +1541,7 @@
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1536: checking for $ac_word" >&5
++echo "configure:1545: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1564,7 +1573,7 @@
+   # Extract the first word of "ranlib", so it can be a program name with args.
+ set dummy ranlib; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1568: checking for $ac_word" >&5
++echo "configure:1577: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1599,7 +1608,7 @@
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}strip; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1603: checking for $ac_word" >&5
++echo "configure:1612: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1631,7 +1640,7 @@
+   # Extract the first word of "strip", so it can be a program name with args.
+ set dummy strip; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:1635: checking for $ac_word" >&5
++echo "configure:1644: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1698,8 +1707,8 @@
+ case $host in
+ *-*-irix6*)
+   # Find out which ABI we are using.
+-  echo '#line 1702 "configure"' > conftest.$ac_ext
+-  if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++  echo '#line 1711 "configure"' > conftest.$ac_ext
++  if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+     case `/usr/bin/file conftest.$ac_objext` in
+     *32-bit*)
+       LD="${LD-ld} -32"
+@@ -1715,12 +1724,70 @@
+   rm -rf conftest*
+   ;;
+ 
++ia64-*-hpux*)
++  # Find out which ABI we are using.
++  echo 'int i;' > conftest.$ac_ext
++  if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++    case "`/usr/bin/file conftest.o`" in
++    *ELF-32*)
++      HPUX_IA64_MODE="32"
++      ;;
++    *ELF-64*)
++      HPUX_IA64_MODE="64"
++      ;;
++    esac
++  fi
++  rm -rf conftest*
++  ;;
++
++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
++  # Find out which ABI we are using.
++  echo 'int i;' > conftest.$ac_ext
++  if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++    case "`/usr/bin/file conftest.o`" in
++    *32-bit*)
++      case $host in
++        x86_64-*linux*)
++          LD="${LD-ld} -m elf_i386"
++          ;;
++        ppc64-*linux*)
++          LD="${LD-ld} -m elf32ppclinux"
++          ;;
++        s390x-*linux*)
++          LD="${LD-ld} -m elf_s390"
++          ;;
++        sparc64-*linux*)
++          LD="${LD-ld} -m elf32_sparc"
++          ;;
++      esac
++      ;;
++    *64-bit*)
++      case $host in
++        x86_64-*linux*)
++          LD="${LD-ld} -m elf_x86_64"
++          ;;
++        ppc*-*linux*|powerpc*-*linux*)
++          LD="${LD-ld} -m elf64ppc"
++          ;;
++        s390*-*linux*)
++          LD="${LD-ld} -m elf64_s390"
++          ;;
++        sparc*-*linux*)
++          LD="${LD-ld} -m elf64_sparc"
++          ;;
++      esac
++      ;;
++    esac
++  fi
++  rm -rf conftest*
++  ;;
++
+ *-*-sco3.2v5*)
+   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+   SAVE_CFLAGS="$CFLAGS"
+   CFLAGS="$CFLAGS -belf"
+   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+-echo "configure:1724: checking whether the C compiler needs -belf" >&5
++echo "configure:1791: checking whether the C compiler needs -belf" >&5
+ if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -1733,14 +1800,14 @@
+ cross_compiling=$ac_cv_prog_cc_cross
+ 
+      cat > conftest.$ac_ext <<EOF
+-#line 1737 "configure"
++#line 1804 "configure"
+ #include "confdefs.h"
+ 
+ int main() {
+ 
+ ; return 0; }
+ EOF
+-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   lt_cv_cc_needs_belf=yes
+ else
+@@ -1868,7 +1935,7 @@
+ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+ # ./install, which can be erroneously created by make from ./install.sh.
+ echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+-echo "configure:1872: checking for a BSD compatible install" >&5
++echo "configure:1939: checking for a BSD compatible install" >&5
+ if test -z "$INSTALL"; then
+ if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+@@ -1921,7 +1988,7 @@
+ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+ 
+ echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+-echo "configure:1925: checking whether build environment is sane" >&5
++echo "configure:1992: checking whether build environment is sane" >&5
+ # Just in case
+ sleep 1
+ echo timestamp > conftestfile
+@@ -1978,7 +2045,7 @@
+ test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+ 
+ echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5
++echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5
+ set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+ if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+@@ -2017,7 +2084,7 @@
+ 
+ missing_dir=`cd $ac_aux_dir && pwd`
+ echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+-echo "configure:2021: checking for working aclocal" >&5
++echo "configure:2088: checking for working aclocal" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+@@ -2030,7 +2097,7 @@
+ fi
+ 
+ echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+-echo "configure:2034: checking for working autoconf" >&5
++echo "configure:2101: checking for working autoconf" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+@@ -2043,7 +2110,7 @@
+ fi
+ 
+ echo $ac_n "checking for working automake""... $ac_c" 1>&6
+-echo "configure:2047: checking for working automake" >&5
++echo "configure:2114: checking for working automake" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+@@ -2056,7 +2123,7 @@
+ fi
+ 
+ echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+-echo "configure:2060: checking for working autoheader" >&5
++echo "configure:2127: checking for working autoheader" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+@@ -2069,7 +2136,7 @@
+ fi
+ 
+ echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+-echo "configure:2073: checking for working makeinfo" >&5
++echo "configure:2140: checking for working makeinfo" >&5
+ # Run test in a subshell; some versions of sh will print an error if
+ # an executable is not found, even if stderr is redirected.
+ # Redirect stdin to placate older versions of autoconf.  Sigh.
+@@ -2086,7 +2153,7 @@
+ 
+ 
+ echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+-echo "configure:2090: checking for executable suffix" >&5
++echo "configure:2157: checking for executable suffix" >&5
+ if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2096,7 +2163,7 @@
+   rm -f conftest*
+   echo 'int main () { return 0; }' > conftest.$ac_ext
+   ac_cv_exeext=
+-  if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+     for file in conftest.*; do
+       case $file in
+       *.c | *.o | *.obj) ;;
+@@ -2117,7 +2184,7 @@
+ ac_exeext=$EXEEXT
+ 
+ echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5
++echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5
+     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+ if test "${enable_maintainer_mode+set}" = set; then
+   enableval="$enable_maintainer_mode"
+@@ -2143,7 +2210,7 @@
+ # Extract the first word of "gcc", so it can be a program name with args.
+ set dummy gcc; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:2147: checking for $ac_word" >&5
++echo "configure:2214: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2173,7 +2240,7 @@
+   # Extract the first word of "cc", so it can be a program name with args.
+ set dummy cc; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:2177: checking for $ac_word" >&5
++echo "configure:2244: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2224,7 +2291,7 @@
+       # Extract the first word of "cl", so it can be a program name with args.
+ set dummy cl; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+-echo "configure:2228: checking for $ac_word" >&5
++echo "configure:2295: checking for $ac_word" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2256,7 +2323,7 @@
+ fi
+ 
+ echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
++echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+ 
+ ac_ext=c
+ # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+@@ -2267,12 +2334,12 @@
+ 
+ cat > conftest.$ac_ext << EOF
+ 
+-#line 2271 "configure"
++#line 2338 "configure"
+ #include "confdefs.h"
+ 
+ main(){return(0);}
+ EOF
+-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   ac_cv_prog_cc_works=yes
+   # If we can't run a trivial program, we are probably using a cross compiler.
+   if (./conftest; exit) 2>/dev/null; then
+@@ -2298,12 +2365,12 @@
+   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
++echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+ echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+ cross_compiling=$ac_cv_prog_cc_cross
+ 
+ echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+-echo "configure:2307: checking whether we are using GNU C" >&5
++echo "configure:2374: checking whether we are using GNU C" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2312,7 +2379,7 @@
+   yes;
+ #endif
+ EOF
+-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+   ac_cv_prog_gcc=yes
+ else
+   ac_cv_prog_gcc=no
+@@ -2331,7 +2398,7 @@
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5
++echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5
+ if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2381,17 +2448,23 @@
+ i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
+ sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
+ sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
+ ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
+ m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
++mips64*-*);;
++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
+ powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
+ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
++sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
+ esac
+ 
+ if test $TARGETDIR = unknown; then
+@@ -2418,6 +2491,15 @@
+ fi
+ 
+ 
++if test x$TARGET = xMIPS_LINUX; then
++  MIPS_LINUX_TRUE=
++  MIPS_LINUX_FALSE='#'
++else
++  MIPS_LINUX_TRUE='#'
++  MIPS_LINUX_FALSE=
++fi
++
++
+ if test x$TARGET = xSPARC; then
+   SPARC_TRUE=
+   SPARC_FALSE='#'
+@@ -2507,8 +2589,39 @@
+   ARM_FALSE=
+ fi
+ 
++
++if test x$TARGET = xS390; then
++  S390_TRUE=
++  S390_FALSE='#'
++else
++  S390_TRUE='#'
++  S390_FALSE=
++fi
++
++
++if test x$TARGET = xX86_64; then
++  X86_64_TRUE=
++  X86_64_FALSE='#'
++else
++  X86_64_TRUE='#'
++  X86_64_FALSE=
++fi
++
++
++if test x$TARGET = xSH; then
++  SH_TRUE=
++  SH_FALSE='#'
++else
++  SH_TRUE='#'
++  SH_FALSE=
++fi
++
++if test x$TARGET = xMIPS_LINUX; then
++  TARGET=MIPS
++fi
++
+ echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+-echo "configure:2512: checking how to run the C preprocessor" >&5
++echo "configure:2625: checking how to run the C preprocessor" >&5
+ # On Suns, sometimes $CPP names a directory.
+ if test -n "$CPP" && test -d "$CPP"; then
+   CPP=
+@@ -2523,13 +2636,13 @@
+   # On the NeXT, cc -E runs the code through the compiler's parser,
+   # not just through cpp.
+   cat > conftest.$ac_ext <<EOF
+-#line 2527 "configure"
++#line 2640 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -2540,13 +2653,13 @@
+   rm -rf conftest*
+   CPP="${CC-cc} -E -traditional-cpp"
+   cat > conftest.$ac_ext <<EOF
+-#line 2544 "configure"
++#line 2657 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -2557,13 +2670,13 @@
+   rm -rf conftest*
+   CPP="${CC-cc} -nologo -E"
+   cat > conftest.$ac_ext <<EOF
+-#line 2561 "configure"
++#line 2674 "configure"
+ #include "confdefs.h"
+ #include <assert.h>
+ Syntax Error
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   :
+@@ -2588,12 +2701,12 @@
+ echo "$ac_t""$CPP" 1>&6
+ 
+ echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+-echo "configure:2592: checking for ANSI C header files" >&5
++echo "configure:2705: checking for ANSI C header files" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2597 "configure"
++#line 2710 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ #include <stdarg.h>
+@@ -2601,7 +2714,7 @@
+ #include <float.h>
+ EOF
+ ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+ if test -z "$ac_err"; then
+   rm -rf conftest*
+@@ -2618,7 +2731,7 @@
+ if test $ac_cv_header_stdc = yes; then
+   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 2622 "configure"
++#line 2735 "configure"
+ #include "confdefs.h"
+ #include <string.h>
+ EOF
+@@ -2636,7 +2749,7 @@
+ if test $ac_cv_header_stdc = yes; then
+   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat > conftest.$ac_ext <<EOF
+-#line 2640 "configure"
++#line 2753 "configure"
+ #include "confdefs.h"
+ #include <stdlib.h>
+ EOF
+@@ -2657,7 +2770,7 @@
+   :
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2661 "configure"
++#line 2774 "configure"
+ #include "confdefs.h"
+ #include <ctype.h>
+ #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+@@ -2668,7 +2781,7 @@
+ exit (0); }
+ 
+ EOF
+-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   :
+ else
+@@ -2694,12 +2807,12 @@
+ for ac_func in memcpy
+ do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:2698: checking for $ac_func" >&5
++echo "configure:2811: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2703 "configure"
++#line 2816 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+     which can conflict with char $ac_func(); below.  */
+@@ -2722,7 +2835,7 @@
+ 
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -2749,19 +2862,19 @@
+ # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+ # for constant arguments.  Useless!
+ echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+-echo "configure:2753: checking for working alloca.h" >&5
++echo "configure:2866: checking for working alloca.h" >&5
+ if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2758 "configure"
++#line 2871 "configure"
+ #include "confdefs.h"
+ #include <alloca.h>
+ int main() {
+ char *p = alloca(2 * sizeof(int));
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   ac_cv_header_alloca_h=yes
+ else
+@@ -2782,12 +2895,12 @@
+ fi
+ 
+ echo $ac_n "checking for alloca""... $ac_c" 1>&6
+-echo "configure:2786: checking for alloca" >&5
++echo "configure:2899: checking for alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2791 "configure"
++#line 2904 "configure"
+ #include "confdefs.h"
+ 
+ #ifdef __GNUC__
+@@ -2815,7 +2928,7 @@
+ char *p = (char *) alloca(1);
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   ac_cv_func_alloca_works=yes
+ else
+@@ -2847,12 +2960,12 @@
+ 
+ 
+ echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+-echo "configure:2851: checking whether alloca needs Cray hooks" >&5
++echo "configure:2964: checking whether alloca needs Cray hooks" >&5
+ if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2856 "configure"
++#line 2969 "configure"
+ #include "confdefs.h"
+ #if defined(CRAY) && ! defined(CRAY2)
+ webecray
+@@ -2877,12 +2990,12 @@
+ if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+-echo "configure:2881: checking for $ac_func" >&5
++echo "configure:2994: checking for $ac_func" >&5
+ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2886 "configure"
++#line 2999 "configure"
+ #include "confdefs.h"
+ /* System header to define __stub macros and hopefully few prototypes,
+     which can conflict with char $ac_func(); below.  */
+@@ -2905,7 +3018,7 @@
+ 
+ ; return 0; }
+ EOF
+-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   eval "ac_cv_func_$ac_func=yes"
+ else
+@@ -2932,7 +3045,7 @@
+ fi
+ 
+ echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+-echo "configure:2936: checking stack direction for C alloca" >&5
++echo "configure:3049: checking stack direction for C alloca" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -2940,7 +3053,7 @@
+   ac_cv_c_stack_direction=0
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 2944 "configure"
++#line 3057 "configure"
+ #include "confdefs.h"
+ find_stack_direction ()
+ {
+@@ -2959,7 +3072,7 @@
+   exit (find_stack_direction() < 0);
+ }
+ EOF
+-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   ac_cv_c_stack_direction=1
+ else
+@@ -2982,13 +3095,13 @@
+ 
+ 
+ echo $ac_n "checking size of short""... $ac_c" 1>&6
+-echo "configure:2986: checking size of short" >&5
++echo "configure:3099: checking size of short" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 2992 "configure"
++#line 3105 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -2998,7 +3111,7 @@
+ switch (0) case 0: case (sizeof (short) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_short=$ac_size
+ else
+@@ -3021,13 +3134,13 @@
+ 
+ 
+ echo $ac_n "checking size of int""... $ac_c" 1>&6
+-echo "configure:3025: checking size of int" >&5
++echo "configure:3138: checking size of int" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3031 "configure"
++#line 3144 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3037,7 +3150,7 @@
+ switch (0) case 0: case (sizeof (int) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_int=$ac_size
+ else
+@@ -3060,13 +3173,13 @@
+ 
+ 
+ echo $ac_n "checking size of long""... $ac_c" 1>&6
+-echo "configure:3064: checking size of long" >&5
++echo "configure:3177: checking size of long" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3070 "configure"
++#line 3183 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3076,7 +3189,7 @@
+ switch (0) case 0: case (sizeof (long) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_long=$ac_size
+ else
+@@ -3099,13 +3212,13 @@
+ 
+ 
+ echo $ac_n "checking size of long long""... $ac_c" 1>&6
+-echo "configure:3103: checking size of long long" >&5
++echo "configure:3216: checking size of long long" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3109 "configure"
++#line 3222 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3115,7 +3228,7 @@
+ switch (0) case 0: case (sizeof (long long) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_long_long=$ac_size
+ else
+@@ -3138,13 +3251,13 @@
+ 
+ 
+ echo $ac_n "checking size of float""... $ac_c" 1>&6
+-echo "configure:3142: checking size of float" >&5
++echo "configure:3255: checking size of float" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3148 "configure"
++#line 3261 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3154,7 +3267,7 @@
+ switch (0) case 0: case (sizeof (float) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_float=$ac_size
+ else
+@@ -3177,13 +3290,13 @@
+ 
+ 
+ echo $ac_n "checking size of double""... $ac_c" 1>&6
+-echo "configure:3181: checking size of double" >&5
++echo "configure:3294: checking size of double" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3187 "configure"
++#line 3300 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3193,7 +3306,7 @@
+ switch (0) case 0: case (sizeof (double) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_double=$ac_size
+ else
+@@ -3216,13 +3329,13 @@
+ 
+ 
+ echo $ac_n "checking size of long double""... $ac_c" 1>&6
+-echo "configure:3220: checking size of long double" >&5
++echo "configure:3333: checking size of long double" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3226 "configure"
++#line 3339 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3232,7 +3345,7 @@
+ switch (0) case 0: case (sizeof (long double) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_long_double=$ac_size
+ else
+@@ -3256,13 +3369,13 @@
+ 
+ 
+ echo $ac_n "checking size of void *""... $ac_c" 1>&6
+-echo "configure:3260: checking size of void *" >&5
++echo "configure:3373: checking size of void *" >&5
+ if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
+   cat > conftest.$ac_ext <<EOF
+-#line 3266 "configure"
++#line 3379 "configure"
+ #include "confdefs.h"
+ #include "confdefs.h"
+ #include <sys/types.h>
+@@ -3272,7 +3385,7 @@
+ switch (0) case 0: case (sizeof (void *) == $ac_size):;
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_sizeof_void_p=$ac_size
+ else
+@@ -3295,14 +3408,14 @@
+ 
+ 
+ echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+-echo "configure:3299: checking whether byte ordering is bigendian" >&5
++echo "configure:3412: checking whether byte ordering is bigendian" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   ac_cv_c_bigendian=unknown
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat > conftest.$ac_ext <<EOF
+-#line 3306 "configure"
++#line 3419 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #include <sys/param.h>
+@@ -3313,11 +3426,11 @@
+ #endif
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat > conftest.$ac_ext <<EOF
+-#line 3321 "configure"
++#line 3434 "configure"
+ #include "confdefs.h"
+ #include <sys/types.h>
+ #include <sys/param.h>
+@@ -3328,7 +3441,7 @@
+ #endif
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+   rm -rf conftest*
+   ac_cv_c_bigendian=yes
+ else
+@@ -3348,7 +3461,7 @@
+    echo $ac_n "cross-compiling... " 2>&6 
+ else
+   cat > conftest.$ac_ext <<EOF
+-#line 3352 "configure"
++#line 3465 "configure"
+ #include "confdefs.h"
+ main () {
+   /* Are we little or big endian?  From Harbison&Steele.  */
+@@ -3361,7 +3474,7 @@
+   exit (u.c[sizeof (long) - 1] == 1);
+ }
+ EOF
+-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
++if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+ then
+   ac_cv_c_bigendian=no
+ else
+@@ -3379,7 +3492,7 @@
+ echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+ if test $ac_cv_c_bigendian = unknown; then
+ echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
+-echo "configure:3383: checking to probe for byte ordering" >&5
++echo "configure:3496: checking to probe for byte ordering" >&5
+ 
+ cat >conftest.c <<EOF
+ short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+@@ -3414,6 +3527,10 @@
+ #define WORDS_BIGENDIAN 1
+ EOF
+ 
++  cat >> confdefs.h <<\EOF
++#define HOST_WORDS_BIG_ENDIAN 1
++EOF
++
+   BYTEORDER=4321
+ else
+   BYTEORDER=1234
+@@ -3429,7 +3546,7 @@
+ 
+ if test x$TARGET = xSPARC; then
+     echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
+-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5
++echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5
+ if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+@@ -3439,14 +3556,14 @@
+ 	CFLAGS="$CFLAGS -fpic"
+ 	LDFLAGS="$LDFLAGS -shared"
+ 	cat > conftest.$ac_ext <<EOF
+-#line 3443 "configure"
++#line 3560 "configure"
+ #include "confdefs.h"
+ asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
+ int main() {
+ 
+ ; return 0; }
+ EOF
+-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
++if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   rm -rf conftest*
+   libffi_cv_as_sparc_ua_pcrel=yes
+ else
+@@ -3709,6 +3826,8 @@
+ s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g
+ s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g
+ s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g
++s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g
++s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g
+ s%@SPARC_TRUE@%$SPARC_TRUE%g
+ s%@SPARC_FALSE@%$SPARC_FALSE%g
+ s%@X86_TRUE@%$X86_TRUE%g
+@@ -3729,6 +3848,12 @@
+ s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g
+ s%@ARM_TRUE@%$ARM_TRUE%g
+ s%@ARM_FALSE@%$ARM_FALSE%g
++s%@S390_TRUE@%$S390_TRUE%g
++s%@S390_FALSE@%$S390_FALSE%g
++s%@X86_64_TRUE@%$X86_64_TRUE%g
++s%@X86_64_FALSE@%$X86_64_FALSE%g
++s%@SH_TRUE@%$SH_TRUE%g
++s%@SH_FALSE@%$SH_FALSE%g
+ s%@CPP@%$CPP%g
+ s%@ALLOCA@%$ALLOCA%g
+ s%@TARGET@%$TARGET%g
+@@ -3969,7 +4094,7 @@
+ 
+ if test -n "$CONFIG_FILES"; then
+    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
+-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
++   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
+ fi
+ 
+ exit 0
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in
+--- gcc-3.2.2.orig/libffi/configure.in	Tue Jan 28 10:43:56 2003
++++ gcc/libffi/configure.in	Sat Feb  1 20:16:19 2003
+@@ -22,14 +22,15 @@
+ 
+ if test "${srcdir}" = "."; then
+   if test "${with_target_subdir}" != "."; then
+-    libffi_basedir="${srcdir}/${with_multisrctop}.."
++    libffi_basedir="${with_multisrctop}../"
+   else
+-    libffi_basedir="${srcdir}/${with_multisrctop}"
++    libffi_basedir="${with_multisrctop}"
+   fi
+ else
+-  libffi_basedir="${srcdir}"
++  libffi_basedir=
+ fi
+ AC_SUBST(libffi_basedir)
++AC_CONFIG_AUX_DIR(${libffi_basedir}..)
+ 
+ AC_CANONICAL_HOST
+ 
+@@ -56,17 +57,23 @@
+ i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
+ sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
+ sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
+-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
+ ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
+ m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
++mips64*-*);;
++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
+ powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
+ powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
+ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
+ arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
++sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
+ esac
+ 
+ if test $TARGETDIR = unknown; then
+@@ -75,6 +82,7 @@
+ 
+ AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
+ AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
++AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX)
+ AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
+ AM_CONDITIONAL(X86, test x$TARGET = xX86)
+ AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
+@@ -85,6 +93,13 @@
+ AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
+ AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
+ AM_CONDITIONAL(ARM, test x$TARGET = xARM)
++AM_CONDITIONAL(S390, test x$TARGET = xS390)
++AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
++AM_CONDITIONAL(SH, test x$TARGET = xSH)
++
++if test x$TARGET = xMIPS_LINUX; then
++  TARGET=MIPS
++fi
+ 
+ AC_HEADER_STDC
+ AC_CHECK_FUNCS(memcpy)
+@@ -171,7 +186,7 @@
+ [
+ if test -n "$CONFIG_FILES"; then
+    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
+-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
++   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
+ fi
+ ],
+ srcdir=${srcdir}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in
+--- gcc-3.2.2.orig/libffi/include/Makefile.in	Tue Oct  9 14:32:16 2001
++++ gcc/libffi/include/Makefile.in	Mon Apr 29 13:14:44 2002
+@@ -99,7 +99,7 @@
+ 
+ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+ 
+-TAR = gnutar
++TAR = gtar
+ GZIP_ENV = --best
+ all: all-redirect
+ .SUFFIXES:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in
+--- gcc-3.2.2.orig/libffi/include/ffi.h.in	Wed Mar 13 07:35:56 2002
++++ gcc/libffi/include/ffi.h.in	Wed Jan 29 00:54:28 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------*-C-*-
+-   libffi @VERSION@ - Copyright (c) 1996-2002  Cygnus Solutions
++   libffi @VERSION@ - Copyright (c) 1996-2003  Cygnus Solutions
+ 
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+@@ -164,6 +164,12 @@
+ #endif
+ #endif
+ 
++#ifdef S390
++#if defined (__s390x__)
++#define S390X
++#endif
++#endif
++
+ #ifndef LIBFFI_ASM
+ 
+ /* ---- Generic type definitions ----------------------------------------- */
+@@ -189,16 +195,23 @@
+ #endif
+ #endif
+ 
+-  /* ---- Intel x86 ---------------- */
+-#ifdef X86
++  /* ---- Intel x86 Win32 ---------- */
++#ifdef X86_WIN32
+   FFI_SYSV,
++  FFI_STDCALL,
++  /* TODO: Add fastcall support for the sake of completeness */
+   FFI_DEFAULT_ABI = FFI_SYSV,
+ #endif
+ 
+-  /* ---- Intel x86 Win32 ---------- */
+-#ifdef X86_WIN32
++  /* ---- Intel x86 and AMD x86-64 - */
++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
+   FFI_SYSV,
++  FFI_UNIX64,   /* Unix variants all use the same ABI for x86-64  */
++#ifdef __i386__
+   FFI_DEFAULT_ABI = FFI_SYSV,
++#else
++  FFI_DEFAULT_ABI = FFI_UNIX64,
++#endif
+ #endif
+ 
+   /* ---- Intel ia64 ---------------- */
+@@ -251,6 +264,18 @@
+   FFI_DEFAULT_ABI = FFI_SYSV,
+ #endif
+ 
++  /* ---- S390 --------------------- */
++#ifdef S390
++  FFI_SYSV,
++  FFI_DEFAULT_ABI = FFI_SYSV,
++#endif
++
++  /* ---- SuperH ------------------- */
++#ifdef SH
++  FFI_SYSV,
++  FFI_DEFAULT_ABI = FFI_SYSV,
++#endif
++
+   /* Leave this for debugging purposes */
+   FFI_LAST_ABI
+ 
+@@ -264,7 +289,7 @@
+   /*@null@*/ struct _ffi_type **elements;
+ } ffi_type;
+ 
+-/* These are defined in ffi.c */
++/* These are defined in types.c */
+ extern ffi_type ffi_type_void;
+ extern ffi_type ffi_type_uint8;
+ extern ffi_type ffi_type_sint8;
+@@ -373,13 +398,7 @@
+ 
+ /* ---- Definitions for closures ----------------------------------------- */
+ 
+-#ifdef X86
+-
+-#define FFI_CLOSURES 1		/* x86 supports closures */
+-#define FFI_TRAMPOLINE_SIZE 10
+-#define FFI_NATIVE_RAW_API 1	/* and has native raw api support */
+-
+-#elif defined(X86_WIN32)
++#ifdef __i386__
+ 
+ #define FFI_CLOSURES 1		/* x86 supports closures */
+ #define FFI_TRAMPOLINE_SIZE 10
+@@ -424,6 +443,40 @@
+ #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ 
+ #define FFI_NATIVE_RAW_API 0
+ 
++#elif defined(SPARC64)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 24
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(SPARC)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 16
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(S390)
++
++#define FFI_CLOSURES 1
++#ifdef S390X
++#define FFI_TRAMPOLINE_SIZE 32
++#else
++#define FFI_TRAMPOLINE_SIZE 16
++#endif
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(SH)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 16
++#define FFI_NATIVE_RAW_API 0
++
++#elif defined(__x86_64__)
++
++#define FFI_CLOSURES 1
++#define FFI_TRAMPOLINE_SIZE 24
++#define FFI_NATIVE_RAW_API 0
++
+ #else 
+ 
+ #define FFI_CLOSURES 0
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c
+--- gcc-3.2.2.orig/libffi/src/arm/ffi.c	Sat Mar  3 07:21:23 2001
++++ gcc/libffi/src/arm/ffi.c	Fri Jul 19 08:08:30 2002
+@@ -36,13 +36,10 @@
+ /*@=exportheader@*/
+ {
+   register unsigned int i;
+-  register int tmp;
+-  register unsigned int avn;
+   register void **p_argv;
+   register char *argp;
+   register ffi_type **p_arg;
+ 
+-  tmp = 0;
+   argp = stack;
+ 
+   if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
+@@ -50,11 +47,10 @@
+     argp += 4;
+   }
+ 
+-  avn = ecif->cif->nargs;
+   p_argv = ecif->avalue;
+ 
+   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+-       (i != 0) && (avn != 0);
++       (i != 0);
+        i--, p_arg++)
+     {
+       size_t z;
+@@ -64,9 +60,6 @@
+ 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
+       }
+ 
+-      if (avn != 0) 
+-	{
+-	  avn--;
+ 	  z = (*p_arg)->size;
+ 	  if (z < sizeof(int))
+ 	    {
+@@ -107,7 +100,6 @@
+ 	    }
+ 	  p_argv++;
+ 	  argp += z;
+-	}
+     }
+   
+   return;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S
+--- gcc-3.2.2.orig/libffi/src/arm/sysv.S	Sat Mar  3 07:21:23 2001
++++ gcc/libffi/src/arm/sysv.S	Mon Sep 30 03:08:58 2002
+@@ -28,8 +28,15 @@
+ #ifdef HAVE_MACHINE_ASM_H
+ #include <machine/asm.h>
+ #else
+-/* XXX these lose for some platforms, I'm sure. */
++#ifdef __USER_LABEL_PREFIX__
++#define CONCAT1(a, b) CONCAT2(a, b)
++#define CONCAT2(a, b) a ## b
++
++/* Use the right prefix for global labels.  */
++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
++#else
+ #define CNAME(x) x
++#endif
+ #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+ #endif
+ 	
+@@ -96,12 +103,20 @@
+ 
+ # return FLOAT
+ 	cmp     a4, #FFI_TYPE_FLOAT
++#ifdef __SOFTFP__
++	streq	a1, [a3]
++#else
+ 	stfeqs  f0, [a3]
++#endif
+ 	beq     epilogue
+ 
+ # return DOUBLE or LONGDOUBLE
+ 	cmp     a4, #FFI_TYPE_DOUBLE
++#ifdef __SOFTFP__
++	stmeqia	a3, {a1, a2}
++#else
+ 	stfeqd  f0, [a3]
++#endif
+ 
+ epilogue:
+         ldmfd sp!, {a1-a4, fp, pc}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c
+--- gcc-3.2.2.orig/libffi/src/java_raw_api.c	Tue Apr  9 07:31:14 2002
++++ gcc/libffi/src/java_raw_api.c	Tue Oct  8 23:55:02 2002
+@@ -81,21 +81,14 @@
+ 	{
+ 	case FFI_TYPE_UINT8:
+ 	case FFI_TYPE_SINT8:
+-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
++	  *args = (void*) ((char*)(raw++) + 3);
+ 	  break;
+ 	  
+ 	case FFI_TYPE_UINT16:
+ 	case FFI_TYPE_SINT16:
+-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
++	  *args = (void*) ((char*)(raw++) + 2);
+ 	  break;
+ 
+-#if SIZEOF_ARG >= 4	  
+-	case FFI_TYPE_UINT32:
+-	case FFI_TYPE_SINT32:
+-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
+-	  break;
+-#endif
+-	
+ #if SIZEOF_ARG == 8	  
+ 	case FFI_TYPE_UINT64:
+ 	case FFI_TYPE_SINT64:
+@@ -157,31 +150,54 @@
+       switch ((*tp)->type)
+ 	{
+ 	case FFI_TYPE_UINT8:
++#if WORDS_BIGENDIAN
++	  *(UINT32*)(raw++) = *(UINT8*) (*args);
++#else
+ 	  (raw++)->uint = *(UINT8*) (*args);
++#endif
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT8:
++#if WORDS_BIGENDIAN
++	  *(SINT32*)(raw++) = *(SINT8*) (*args);
++#else
+ 	  (raw++)->sint = *(SINT8*) (*args);
++#endif
+ 	  break;
+ 
+ 	case FFI_TYPE_UINT16:
++#if WORDS_BIGENDIAN
++	  *(UINT32*)(raw++) = *(UINT16*) (*args);
++#else
+ 	  (raw++)->uint = *(UINT16*) (*args);
++#endif
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT16:
++#if WORDS_BIGENDIAN
++	  *(SINT32*)(raw++) = *(SINT16*) (*args);
++#else
+ 	  (raw++)->sint = *(SINT16*) (*args);
++#endif
+ 	  break;
+ 
+-#if SIZEOF_ARG >= 4
+ 	case FFI_TYPE_UINT32:
++#if WORDS_BIGENDIAN
++	  *(UINT32*)(raw++) = *(UINT32*) (*args);
++#else
+ 	  (raw++)->uint = *(UINT32*) (*args);
++#endif
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT32:
++#if WORDS_BIGENDIAN
++	  *(SINT32*)(raw++) = *(SINT32*) (*args);
++#else
+ 	  (raw++)->sint = *(SINT32*) (*args);
+-	  break;
+ #endif
+-        case FFI_TYPE_FLOAT:
++	  break;
++
++	case FFI_TYPE_FLOAT:
+ 	  (raw++)->flt = *(FLOAT32*) (*args);
+ 	  break;
+ 
+@@ -211,6 +227,55 @@
+ 
+ #if !FFI_NATIVE_RAW_API
+ 
++static void
++ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
++{
++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
++  switch (cif->rtype->type)
++    {
++    case FFI_TYPE_UINT8:
++    case FFI_TYPE_UINT16:
++    case FFI_TYPE_UINT32:
++      *(UINT64 *)rvalue <<= 32;
++      break;
++
++    case FFI_TYPE_SINT8:
++    case FFI_TYPE_SINT16:
++    case FFI_TYPE_SINT32:
++    case FFI_TYPE_INT:
++      *(SINT64 *)rvalue <<= 32;
++      break;
++
++    default:
++      break;
++    }
++#endif
++}
++
++static void
++ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
++{
++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
++  switch (cif->rtype->type)
++    {
++    case FFI_TYPE_UINT8:
++    case FFI_TYPE_UINT16:
++    case FFI_TYPE_UINT32:
++      *(UINT64 *)rvalue >>= 32;
++      break;
++
++    case FFI_TYPE_SINT8:
++    case FFI_TYPE_SINT16:
++    case FFI_TYPE_SINT32:
++    case FFI_TYPE_INT:
++      *(SINT64 *)rvalue >>= 32;
++      break;
++
++    default:
++      break;
++    }
++#endif
++}
+ 
+ /* This is a generic definition of ffi_raw_call, to be used if the
+  * native system does not provide a machine-specific implementation.
+@@ -227,6 +292,7 @@
+   void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
+   ffi_java_raw_to_ptrarray (cif, raw, avalue);
+   ffi_call (cif, fn, rvalue, avalue);
++  ffi_java_rvalue_to_raw (cif, rvalue);
+ }
+ 
+ #if FFI_CLOSURES		/* base system provides closures */
+@@ -240,6 +306,7 @@
+ 
+   ffi_java_ptrarray_to_raw (cif, avalue, raw);
+   (*cl->fun) (cif, rvalue, raw, cl->user_data);
++  ffi_java_raw_to_rvalue (cif, rvalue);
+ }
+ 
+ /* Again, here is the generic version of ffi_prep_raw_closure, which
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c
+--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c	Sun Aug  8 22:27:19 1999
++++ gcc/libffi/src/m68k/ffi.c	Fri Jul 19 08:08:30 2002
+@@ -16,14 +16,11 @@
+ ffi_prep_args (void *stack, extended_cif *ecif)
+ {
+   unsigned int i;
+-  int tmp;
+-  unsigned int avn;
+   void **p_argv;
+   char *argp;
+   ffi_type **p_arg;
+   void *struct_value_ptr;
+ 
+-  tmp = 0;
+   argp = stack;
+ 
+   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
+@@ -32,11 +29,10 @@
+   else
+     struct_value_ptr = NULL;
+ 
+-  avn = ecif->cif->nargs;
+   p_argv = ecif->avalue;
+ 
+   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+-       i != 0 && avn != 0;
++       i != 0;
+        i--, p_arg++)
+     {
+       size_t z;
+@@ -45,9 +41,6 @@
+       if (((*p_arg)->alignment - 1) & (unsigned) argp)
+ 	argp = (char *) ALIGN (argp, (*p_arg)->alignment);
+ 
+-      if (avn != 0) 
+-	{
+-	  avn--;
+ 	  z = (*p_arg)->size;
+ 	  if (z < sizeof (int))
+ 	    {
+@@ -82,7 +75,6 @@
+ 	    memcpy (argp, *p_argv, z);
+ 	  p_argv++;
+ 	  argp += z;
+-	}
+     }
+ 
+   return struct_value_ptr;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c
+--- gcc-3.2.2.orig/libffi/src/mips/ffi.c	Sat Mar  3 07:21:23 2001
++++ gcc/libffi/src/mips/ffi.c	Fri Jul 19 08:08:31 2002
+@@ -23,6 +23,7 @@
+    OTHER DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
++#include <sgidefs.h>
+ #include <ffi.h>
+ #include <ffi_common.h>
+ 
+@@ -50,7 +51,6 @@
+ 			  int flags)
+ {
+   register int i;
+-  register int avn;
+   register void **p_argv;
+   register char *argp;
+   register ffi_type **p_arg;
+@@ -80,12 +80,9 @@
+       FIX_ARGP;
+     }
+ 
+-  avn = ecif->cif->nargs;
+   p_argv = ecif->avalue;
+ 
+-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+-       i && avn;
+-       i--, p_arg++)
++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
+     {
+       size_t z;
+ 
+@@ -101,9 +98,6 @@
+ #define OFFSET sizeof(int)
+ #endif      
+ 
+-      if (avn) 
+-	{
+-	  avn--;
+ 	  z = (*p_arg)->size;
+ 	  if (z < sizeof(SLOT_TYPE_UNSIGNED))
+ 	    {
+@@ -179,7 +173,6 @@
+ 	  p_argv++;
+ 	  argp += z;
+ 	  FIX_ARGP;
+-	}
+     }
+   
+   return;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S
+--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S	Sat Jan 19 01:22:34 2002
++++ gcc/libffi/src/powerpc/darwin.S	Thu Jan 23 03:21:55 2003
+@@ -3,8 +3,6 @@
+    
+    PowerPC Assembly glue.
+ 
+-   $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $
+-
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    ``Software''), to deal in the Software without restriction, including
+@@ -39,30 +37,34 @@
+ .text
+ 	.align 2
+ _ffi_call_DARWIN:
+-	mr      r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
++LFB0:	
++	mr      r12,r8		/* We only need r12 until the call,
++				so it doesn't have to be saved...  */
++LFB1:	
+ 	/* Save the old stack pointer as AP.  */
+ 	mr	r8,r1
+-
++LCFI0:	
+ 	/* Allocate the stack space we need.  */
+ 	stwux	r1,r1,r4	
+ 	
+ 	/* Save registers we use.  */
+ 	mflr	r9
+ 
+-	stw	r28,-16(r8)
++	stw	r28,-16(r8)	
+ 	stw	r29,-12(r8)
+ 	stw	r30, -8(r8)
+ 	stw	r31, -4(r8)
+-	
+-	stw	r9,  8(r8)
++
++	stw	r9,  8(r8)	
+ 	stw	r2, 20(r1)
++LCFI1:	
+ 
+ 	/* Save arguments over call...  */
+-	mr	r31,r5	/* flags, */
+-	mr	r30,r6	/* rvalue, */
+-	mr	r29,r7	/* function address, */
+-	mr	r28,r8	/* our AP. */
+-		
++	mr	r31,r5	/* flags,  */
++	mr	r30,r6	/* rvalue,  */
++	mr	r29,r7	/* function address,  */
++	mr	r28,r8	/* our AP.  */
++LCFI2:		
+ 	/* Call ffi_prep_args.  */
+ 	mr	r4,r1
+ 	li	r9,0
+@@ -145,7 +147,8 @@
+ L(float_return_value):
+ 	stfs	f1,0(r30)
+ 	b	L(done_return_value)
+-//END(_ffi_call_DARWIN)
++LFE1:	
++/* END(_ffi_call_DARWIN)  */
+ 
+ /* Provide a null definition of _ffi_call_AIX.  */
+ .text
+@@ -155,5 +158,61 @@
+ 	.align 2
+ _ffi_call_AIX:
+ 	blr
+-//END(_ffi_call_AIX)
++/* END(_ffi_call_AIX)  */
+ 
++.data
++.section __TEXT,__eh_frame
++Lframe1:
++	.set	L$set$0,LECIE1-LSCIE1
++	.long	L$set$0	; Length of Common Information Entry
++LSCIE1:
++	.long	0x0	; CIE Identifier Tag
++	.byte	0x1	; CIE Version
++	.ascii	"zR\0"	; CIE Augmentation
++	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
++	.byte	0x7c	; sleb128 -4; CIE Data Alignment Factor
++	.byte	0x41	; CIE RA Column
++	.byte   0x1     ; uleb128 0x1; Augmentation size
++	.byte   0x10    ; FDE Encoding (pcrel)
++	.byte	0xc	; DW_CFA_def_cfa
++	.byte	0x1	; uleb128 0x1
++	.byte	0x0	; uleb128 0x0
++	.align	2
++LECIE1:
++LSFDE1:
++	.set	L$set$1,LEFDE1-LASFDE1
++	.long	L$set$1	; FDE Length
++LASFDE1:
++	.set	L$set$2,LASFDE1-Lframe1
++	.long	L$set$2	; FDE CIE offset
++	.long	LFB0-.	; FDE initial location
++	.set	L$set$3,LFE1-LFB0
++	.long	L$set$3	; FDE address range
++	.byte   0x0     ; uleb128 0x0; Augmentation size
++	.byte	0x4	; DW_CFA_advance_loc4
++	.set	L$set$4,LCFI0-LFB1
++	.long	L$set$4
++	.byte	0xd	; DW_CFA_def_cfa_register
++	.byte	0x08	; uleb128 0x08 
++	.byte	0x4	; DW_CFA_advance_loc4
++	.set	L$set$5,LCFI1-LCFI0
++	.long	L$set$5
++	.byte   0x11    ; DW_CFA_offset_extended_sf
++	.byte	0x41	; uleb128 0x41
++	.byte   0x7e    ; sleb128 -2
++	.byte	0x9f	; DW_CFA_offset, column 0x1f 
++	.byte	0x1	; uleb128 0x1 
++	.byte	0x9e	; DW_CFA_offset, column 0x1e
++	.byte	0x2	; uleb128 0x2
++	.byte	0x9d	; DW_CFA_offset, column 0x1d 
++	.byte	0x3	; uleb128 0x3 
++	.byte	0x9c	; DW_CFA_offset, column 0x1c 
++	.byte	0x4	; uleb128 0x4
++	.byte	0x4	; DW_CFA_advance_loc4 
++	.set	L$set$6,LCFI2-LCFI1
++	.long	L$set$6
++	.byte	0xd	; DW_CFA_def_cfa_register 
++	.byte	0x1c	; uleb128 0x1c 
++	.align 2
++LEFDE1:
++	
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c
+--- gcc-3.2.2.orig/libffi/src/prep_cif.c	Sat Mar  3 07:21:22 2001
++++ gcc/libffi/src/prep_cif.c	Mon Sep 30 20:59:42 2002
+@@ -103,7 +103,8 @@
+   /* Perform a sanity check on the return type */
+   FFI_ASSERT(ffi_type_test(cif->rtype));
+ 
+-#ifndef M68K
++  /* x86-64 and s390 stack space allocation is handled in prep_machdep.  */
++#if !defined M68K && !defined __x86_64__ && !defined S390
+   /* Make space for the return structure pointer */
+   if (cif->rtype->type == FFI_TYPE_STRUCT
+ #ifdef SPARC
+@@ -122,6 +123,7 @@
+       if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
+ 	return FFI_BAD_TYPEDEF;
+ 
++#if !defined __x86_64__ && !defined S390
+ #ifdef SPARC
+       if (((*ptr)->type == FFI_TYPE_STRUCT
+ 	   && ((*ptr)->size > 16 || cif->abi != FFI_V9))
+@@ -137,6 +139,7 @@
+ 	  
+ 	  bytes += STACK_ARG_SIZE((*ptr)->size);
+ 	}
++#endif
+     }
+ 
+   cif->bytes = bytes;
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c
+--- gcc-3.2.2.orig/libffi/src/s390/ffi.c	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/s390/ffi.c	Thu Feb  6 08:58:57 2003
+@@ -0,0 +1,753 @@
++/* -----------------------------------------------------------------------
++   ffi.c - Copyright (c) 2000 Software AG
++ 
++   S390 Foreign Function Interface
++ 
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++ 
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++ 
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++/*====================================================================*/
++/*                          Includes                                  */
++/*                          --------                                  */
++/*====================================================================*/
++ 
++#include <ffi.h>
++#include <ffi_common.h>
++ 
++#include <stdlib.h>
++#include <stdio.h>
++ 
++/*====================== End of Includes =============================*/
++ 
++/*====================================================================*/
++/*                           Defines                                  */
++/*                           -------                                  */
++/*====================================================================*/
++
++/* Maximum number of GPRs available for argument passing.  */ 
++#define MAX_GPRARGS 5
++
++/* Maximum number of FPRs available for argument passing.  */ 
++#ifdef __s390x__
++#define MAX_FPRARGS 4
++#else
++#define MAX_FPRARGS 2
++#endif
++
++/* Round to multiple of 16.  */
++#define ROUND_SIZE(size) (((size) + 15) & ~15)
++
++/* If these values change, sysv.S must be adapted!  */
++#define FFI390_RET_VOID		0
++#define FFI390_RET_STRUCT	1
++#define FFI390_RET_FLOAT	2
++#define FFI390_RET_DOUBLE	3
++#define FFI390_RET_INT32	4
++#define FFI390_RET_INT64	5
++
++/*===================== End of Defines ===============================*/
++ 
++/*====================================================================*/
++/*                          Prototypes                                */
++/*                          ----------                                */
++/*====================================================================*/
++ 
++static void ffi_prep_args (unsigned char *, extended_cif *);
++static int ffi_check_float_struct (ffi_type *);
++void
++#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
++__attribute__ ((visibility ("hidden")))
++#endif
++ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, 
++			 unsigned long long *, unsigned long *);
++
++/*====================== End of Prototypes ===========================*/
++ 
++/*====================================================================*/
++/*                          Externals                                 */
++/*                          ---------                                 */
++/*====================================================================*/
++ 
++extern void ffi_call_SYSV(unsigned,
++			  extended_cif *,
++			  void (*)(unsigned char *, extended_cif *),
++			  unsigned,
++			  void *,
++			  void (*fn)());
++
++extern void ffi_closure_SYSV(void);
++ 
++/*====================== End of Externals ============================*/
++ 
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_check_struct_type.                                  */
++/*                                                                    */
++/* Function - Determine if a structure can be passed within a         */
++/*            general purpose or floating point register.             */
++/*                                                                    */
++/*====================================================================*/
++ 
++static int
++ffi_check_struct_type (ffi_type *arg)
++{
++  size_t size = arg->size;
++
++  /* If the struct has just one element, look at that element
++     to find out whether to consider the struct as floating point.  */
++  while (arg->type == FFI_TYPE_STRUCT 
++         && arg->elements[0] && !arg->elements[1])
++    arg = arg->elements[0];
++
++  /* Structs of size 1, 2, 4, and 8 are passed in registers,
++     just like the corresponding int/float types.  */
++  switch (size)
++    {
++      case 1:
++        return FFI_TYPE_UINT8;
++
++      case 2:
++        return FFI_TYPE_UINT16;
++
++      case 4:
++	if (arg->type == FFI_TYPE_FLOAT)
++          return FFI_TYPE_FLOAT;
++	else
++	  return FFI_TYPE_UINT32;
++
++      case 8:
++	if (arg->type == FFI_TYPE_DOUBLE)
++          return FFI_TYPE_DOUBLE;
++	else
++	  return FFI_TYPE_UINT64;
++
++      default:
++	break;
++    }
++
++  /* Other structs are passed via a pointer to the data.  */
++  return FFI_TYPE_POINTER;
++}
++ 
++/*======================== End of Routine ============================*/
++ 
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_prep_args.                                          */
++/*                                                                    */
++/* Function - Prepare parameters for call to function.                */
++/*                                                                    */
++/* ffi_prep_args is called by the assembly routine once stack space   */
++/* has been allocated for the function's arguments.                   */
++/*                                                                    */
++/*====================================================================*/
++ 
++static void
++ffi_prep_args (unsigned char *stack, extended_cif *ecif)
++{
++  /* The stack space will be filled with those areas:
++
++	FPR argument register save area     (highest addresses)
++	GPR argument register save area
++	temporary struct copies
++	overflow argument area              (lowest addresses)
++
++     We set up the following pointers:
++
++        p_fpr: bottom of the FPR area (growing upwards)
++	p_gpr: bottom of the GPR area (growing upwards)
++	p_ov: bottom of the overflow area (growing upwards)
++	p_struct: top of the struct copy area (growing downwards)
++
++     All areas are kept aligned to twice the word size.  */
++
++  int gpr_off = ecif->cif->bytes;
++  int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
++
++  unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
++  unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
++  unsigned char *p_struct = (unsigned char *)p_gpr;
++  unsigned long *p_ov = (unsigned long *)stack;
++
++  int n_fpr = 0;
++  int n_gpr = 0;
++  int n_ov = 0;
++
++  ffi_type **ptr;
++  void **p_argv = ecif->avalue;
++  int i;
++ 
++  /* If we returning a structure then we set the first parameter register
++     to the address of where we are returning this structure.  */
++
++  if (ecif->cif->flags == FFI390_RET_STRUCT)
++    p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
++
++  /* Now for the arguments.  */
++ 
++  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
++       i > 0;
++       i--, ptr++, p_argv++)
++    {
++      void *arg = *p_argv;
++      int type = (*ptr)->type;
++
++      /* Check how a structure type is passed.  */
++      if (type == FFI_TYPE_STRUCT)
++	{
++	  type = ffi_check_struct_type (*ptr);
++
++	  /* If we pass the struct via pointer, copy the data.  */
++	  if (type == FFI_TYPE_POINTER)
++	    {
++	      p_struct -= ROUND_SIZE ((*ptr)->size);
++	      memcpy (p_struct, (char *)arg, (*ptr)->size);
++	      arg = &p_struct;
++	    }
++	}
++
++      /* Pointers are passed like UINTs of the same size.  */
++      if (type == FFI_TYPE_POINTER)
++#ifdef __s390x__
++	type = FFI_TYPE_UINT64;
++#else
++	type = FFI_TYPE_UINT32;
++#endif
++
++      /* Now handle all primitive int/float data types.  */
++      switch (type) 
++	{
++	  case FFI_TYPE_DOUBLE:
++	    if (n_fpr < MAX_FPRARGS)
++	      p_fpr[n_fpr++] = *(unsigned long long *) arg;
++	    else
++#ifdef __s390x__
++	      p_ov[n_ov++] = *(unsigned long *) arg;
++#else
++	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
++	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
++#endif
++	    break;
++	
++	  case FFI_TYPE_FLOAT:
++	    if (n_fpr < MAX_FPRARGS)
++	      p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
++	    else
++	      p_ov[n_ov++] = *(unsigned int *) arg;
++	    break;
++ 
++	  case FFI_TYPE_UINT64:
++	  case FFI_TYPE_SINT64:
++#ifdef __s390x__
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(unsigned long *) arg;
++	    else
++	      p_ov[n_ov++] = *(unsigned long *) arg;
++#else
++	    if (n_gpr == MAX_GPRARGS-1)
++	      n_gpr = MAX_GPRARGS;
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
++	      p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
++	    else
++	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
++	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
++#endif
++	    break;
++ 
++	  case FFI_TYPE_UINT32:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(unsigned int *) arg;
++	    else
++	      p_ov[n_ov++] = *(unsigned int *) arg;
++	    break;
++ 
++	  case FFI_TYPE_INT:
++	  case FFI_TYPE_SINT32:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(signed int *) arg;
++	    else
++	      p_ov[n_ov++] = *(signed int *) arg;
++	    break;
++ 
++	  case FFI_TYPE_UINT16:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(unsigned short *) arg;
++	    else
++	      p_ov[n_ov++] = *(unsigned short *) arg;
++	    break;
++ 
++	  case FFI_TYPE_SINT16:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(signed short *) arg;
++	    else
++	      p_ov[n_ov++] = *(signed short *) arg;
++	    break;
++
++	  case FFI_TYPE_UINT8:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(unsigned char *) arg;
++	    else
++	      p_ov[n_ov++] = *(unsigned char *) arg;
++	    break;
++ 
++	  case FFI_TYPE_SINT8:
++	    if (n_gpr < MAX_GPRARGS)
++	      p_gpr[n_gpr++] = *(signed char *) arg;
++	    else
++	      p_ov[n_ov++] = *(signed char *) arg;
++	    break;
++ 
++	  default:
++	    FFI_ASSERT (0);
++	    break;
++        }
++    }
++}
++
++/*======================== End of Routine ============================*/
++ 
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_prep_cif_machdep.                                   */
++/*                                                                    */
++/* Function - Perform machine dependent CIF processing.               */
++/*                                                                    */
++/*====================================================================*/
++ 
++ffi_status
++ffi_prep_cif_machdep(ffi_cif *cif)
++{
++  size_t struct_size = 0;
++  int n_gpr = 0;
++  int n_fpr = 0;
++  int n_ov = 0;
++
++  ffi_type **ptr;
++  int i;
++
++  /* Determine return value handling.  */ 
++
++  switch (cif->rtype->type)
++    {
++      /* Void is easy.  */
++      case FFI_TYPE_VOID:
++	cif->flags = FFI390_RET_VOID;
++	break;
++
++      /* Structures are returned via a hidden pointer.  */
++      case FFI_TYPE_STRUCT:
++	cif->flags = FFI390_RET_STRUCT;
++	n_gpr++;  /* We need one GPR to pass the pointer.  */
++	break; 
++
++      /* Floating point values are returned in fpr 0.  */
++      case FFI_TYPE_FLOAT:
++	cif->flags = FFI390_RET_FLOAT;
++	break;
++
++      case FFI_TYPE_DOUBLE:
++	cif->flags = FFI390_RET_DOUBLE;
++	break;
++
++      /* Integer values are returned in gpr 2 (and gpr 3
++	 for 64-bit values on 31-bit machines).  */
++      case FFI_TYPE_UINT64:
++      case FFI_TYPE_SINT64:
++	cif->flags = FFI390_RET_INT64;
++	break;
++
++      case FFI_TYPE_POINTER:
++      case FFI_TYPE_INT:
++      case FFI_TYPE_UINT32:
++      case FFI_TYPE_SINT32:
++      case FFI_TYPE_UINT16:
++      case FFI_TYPE_SINT16:
++      case FFI_TYPE_UINT8:
++      case FFI_TYPE_SINT8:
++	/* These are to be extended to word size.  */
++#ifdef __s390x__
++	cif->flags = FFI390_RET_INT64;
++#else
++	cif->flags = FFI390_RET_INT32;
++#endif
++	break;
++ 
++      default:
++        FFI_ASSERT (0);
++        break;
++    }
++
++  /* Now for the arguments.  */
++ 
++  for (ptr = cif->arg_types, i = cif->nargs;
++       i > 0;
++       i--, ptr++)
++    {
++      int type = (*ptr)->type;
++
++      /* Check how a structure type is passed.  */
++      if (type == FFI_TYPE_STRUCT)
++	{
++	  type = ffi_check_struct_type (*ptr);
++
++	  /* If we pass the struct via pointer, we must reserve space
++	     to copy its data for proper call-by-value semantics.  */
++	  if (type == FFI_TYPE_POINTER)
++	    struct_size += ROUND_SIZE ((*ptr)->size);
++	}
++
++      /* Now handle all primitive int/float data types.  */
++      switch (type) 
++	{
++	  /* The first MAX_FPRARGS floating point arguments
++	     go in FPRs, the rest overflow to the stack.  */
++
++	  case FFI_TYPE_DOUBLE:
++	    if (n_fpr < MAX_FPRARGS)
++	      n_fpr++;
++	    else
++	      n_ov += sizeof (double) / sizeof (long);
++	    break;
++	
++	  case FFI_TYPE_FLOAT:
++	    if (n_fpr < MAX_FPRARGS)
++	      n_fpr++;
++	    else
++	      n_ov++;
++	    break;
++
++	  /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
++	     if one is still available, or else on the stack.  If only one
++	     register is free, skip the register (it won't be used for any 
++	     subsequent argument either).  */
++	      
++#ifndef __s390x__
++	  case FFI_TYPE_UINT64:
++	  case FFI_TYPE_SINT64:
++	    if (n_gpr == MAX_GPRARGS-1)
++	      n_gpr = MAX_GPRARGS;
++	    if (n_gpr < MAX_GPRARGS)
++	      n_gpr += 2;
++	    else
++	      n_ov += 2;
++	    break;
++#endif
++
++	  /* Everything else is passed in GPRs (until MAX_GPRARGS
++	     have been used) or overflows to the stack.  */
++
++	  default: 
++	    if (n_gpr < MAX_GPRARGS)
++	      n_gpr++;
++	    else
++	      n_ov++;
++	    break;
++        }
++    }
++
++  /* Total stack space as required for overflow arguments
++     and temporary structure copies.  */
++
++  cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
++ 
++  return FFI_OK;
++}
++ 
++/*======================== End of Routine ============================*/
++ 
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_call.                                               */
++/*                                                                    */
++/* Function - Call the FFI routine.                                   */
++/*                                                                    */
++/*====================================================================*/
++ 
++void
++ffi_call(ffi_cif *cif,
++	 void (*fn)(),
++	 void *rvalue,
++	 void **avalue)
++{
++  int ret_type = cif->flags;
++  extended_cif ecif;
++ 
++  ecif.cif    = cif;
++  ecif.avalue = avalue;
++  ecif.rvalue = rvalue;
++
++  /* If we don't have a return value, we need to fake one.  */
++  if (rvalue == NULL)
++    {
++      if (ret_type == FFI390_RET_STRUCT)
++	ecif.rvalue = alloca (cif->rtype->size);
++      else
++	ret_type = FFI390_RET_VOID;
++    } 
++
++  switch (cif->abi)
++    {
++      case FFI_SYSV:
++        ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
++		       ret_type, ecif.rvalue, fn);
++        break;
++ 
++      default:
++        FFI_ASSERT (0);
++        break;
++    }
++}
++ 
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_closure_helper_SYSV.                                */
++/*                                                                    */
++/* Function - Call a FFI closure target function.                     */
++/*                                                                    */
++/*====================================================================*/
++ 
++void
++ffi_closure_helper_SYSV (ffi_closure *closure,
++			 unsigned long *p_gpr,
++			 unsigned long long *p_fpr,
++			 unsigned long *p_ov)
++{
++  unsigned long long ret_buffer;
++
++  void *rvalue = &ret_buffer;
++  void **avalue;
++  void **p_arg;
++
++  int n_gpr = 0;
++  int n_fpr = 0;
++  int n_ov = 0;
++
++  ffi_type **ptr;
++  int i;
++
++  /* Allocate buffer for argument list pointers.  */
++
++  p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
++
++  /* If we returning a structure, pass the structure address 
++     directly to the target function.  Otherwise, have the target 
++     function store the return value to the GPR save area.  */
++
++  if (closure->cif->flags == FFI390_RET_STRUCT)
++    rvalue = (void *) p_gpr[n_gpr++];
++
++  /* Now for the arguments.  */
++
++  for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
++       i > 0;
++       i--, p_arg++, ptr++)
++    {
++      int deref_struct_pointer = 0;
++      int type = (*ptr)->type;
++
++      /* Check how a structure type is passed.  */
++      if (type == FFI_TYPE_STRUCT)
++	{
++	  type = ffi_check_struct_type (*ptr);
++
++	  /* If we pass the struct via pointer, remember to 
++	     retrieve the pointer later.  */
++	  if (type == FFI_TYPE_POINTER)
++	    deref_struct_pointer = 1;
++	}
++
++      /* Pointers are passed like UINTs of the same size.  */
++      if (type == FFI_TYPE_POINTER)
++#ifdef __s390x__
++	type = FFI_TYPE_UINT64;
++#else
++	type = FFI_TYPE_UINT32;
++#endif
++
++      /* Now handle all primitive int/float data types.  */
++      switch (type) 
++	{
++	  case FFI_TYPE_DOUBLE:
++	    if (n_fpr < MAX_FPRARGS)
++	      *p_arg = &p_fpr[n_fpr++];
++	    else
++	      *p_arg = &p_ov[n_ov], 
++	      n_ov += sizeof (double) / sizeof (long);
++	    break;
++	
++	  case FFI_TYPE_FLOAT:
++	    if (n_fpr < MAX_FPRARGS)
++	      *p_arg = &p_fpr[n_fpr++];
++	    else
++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
++	    break;
++ 
++	  case FFI_TYPE_UINT64:
++	  case FFI_TYPE_SINT64:
++#ifdef __s390x__
++	    if (n_gpr < MAX_GPRARGS)
++	      *p_arg = &p_gpr[n_gpr++];
++	    else
++	      *p_arg = &p_ov[n_ov++];
++#else
++	    if (n_gpr == MAX_GPRARGS-1)
++	      n_gpr = MAX_GPRARGS;
++	    if (n_gpr < MAX_GPRARGS)
++	      *p_arg = &p_gpr[n_gpr], n_gpr += 2;
++	    else
++	      *p_arg = &p_ov[n_ov], n_ov += 2;
++#endif
++	    break;
++ 
++	  case FFI_TYPE_INT:
++	  case FFI_TYPE_UINT32:
++	  case FFI_TYPE_SINT32:
++	    if (n_gpr < MAX_GPRARGS)
++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
++	    else
++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
++	    break;
++ 
++	  case FFI_TYPE_UINT16:
++	  case FFI_TYPE_SINT16:
++	    if (n_gpr < MAX_GPRARGS)
++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
++	    else
++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
++	    break;
++
++	  case FFI_TYPE_UINT8:
++	  case FFI_TYPE_SINT8:
++	    if (n_gpr < MAX_GPRARGS)
++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
++	    else
++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
++	    break;
++ 
++	  default:
++	    FFI_ASSERT (0);
++	    break;
++        }
++
++      /* If this is a struct passed via pointer, we need to
++	 actually retrieve that pointer.  */
++      if (deref_struct_pointer)
++	*p_arg = *(void **)*p_arg;
++    }
++
++
++  /* Call the target function.  */
++  (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
++
++  /* Convert the return value.  */
++  switch (closure->cif->rtype->type)
++    {
++      /* Void is easy, and so is struct.  */
++      case FFI_TYPE_VOID:
++      case FFI_TYPE_STRUCT:
++	break;
++
++      /* Floating point values are returned in fpr 0.  */
++      case FFI_TYPE_FLOAT:
++	p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
++	break;
++
++      case FFI_TYPE_DOUBLE:
++	p_fpr[0] = *(unsigned long long *) rvalue;
++	break;
++
++      /* Integer values are returned in gpr 2 (and gpr 3
++	 for 64-bit values on 31-bit machines).  */
++      case FFI_TYPE_UINT64:
++      case FFI_TYPE_SINT64:
++#ifdef __s390x__
++	p_gpr[0] = *(unsigned long *) rvalue;
++#else
++	p_gpr[0] = ((unsigned long *) rvalue)[0],
++	p_gpr[1] = ((unsigned long *) rvalue)[1];
++#endif
++	break;
++
++      case FFI_TYPE_POINTER:
++      case FFI_TYPE_UINT32:
++      case FFI_TYPE_UINT16:
++      case FFI_TYPE_UINT8:
++	p_gpr[0] = *(unsigned long *) rvalue;
++	break;
++
++      case FFI_TYPE_INT:
++      case FFI_TYPE_SINT32:
++      case FFI_TYPE_SINT16:
++      case FFI_TYPE_SINT8:
++	p_gpr[0] = *(signed long *) rvalue;
++	break;
++
++      default:
++        FFI_ASSERT (0);
++        break;
++    }
++}
++ 
++/*======================== End of Routine ============================*/
++
++/*====================================================================*/
++/*                                                                    */
++/* Name     - ffi_prep_closure.                                       */
++/*                                                                    */
++/* Function - Prepare a FFI closure.                                  */
++/*                                                                    */
++/*====================================================================*/
++ 
++ffi_status
++ffi_prep_closure (ffi_closure *closure,
++                  ffi_cif *cif,
++                  void (*fun) (ffi_cif *, void *, void **, void *),
++                  void *user_data)
++{
++  FFI_ASSERT (cif->abi == FFI_SYSV);
++
++#ifndef __s390x__
++  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
++  *(short *)&closure->tramp [2] = 0x9801;   /* lm %r0,%r1,6(%r1) */
++  *(short *)&closure->tramp [4] = 0x1006;
++  *(short *)&closure->tramp [6] = 0x07f1;   /* br %r1 */
++  *(long  *)&closure->tramp [8] = (long)closure;
++  *(long  *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
++#else
++  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
++  *(short *)&closure->tramp [2] = 0xeb01;   /* lmg %r0,%r1,14(%r1) */
++  *(short *)&closure->tramp [4] = 0x100e;
++  *(short *)&closure->tramp [6] = 0x0004;
++  *(short *)&closure->tramp [8] = 0x07f1;   /* br %r1 */
++  *(long  *)&closure->tramp[16] = (long)closure;
++  *(long  *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
++#endif 
++ 
++  closure->cif = cif;
++  closure->user_data = user_data;
++  closure->fun = fun;
++ 
++  return FFI_OK;
++}
++
++/*======================== End of Routine ============================*/
++ 
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S
+--- gcc-3.2.2.orig/libffi/src/s390/sysv.S	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/s390/sysv.S	Thu Nov 28 01:44:35 2002
+@@ -0,0 +1,425 @@
++/* -----------------------------------------------------------------------
++   sysv.S - Copyright (c) 2000 Software AG
++ 
++   S390 Foreign Function Interface
++ 
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++ 
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++ 
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++
++#ifndef __s390x__
++ 
++.text
++
++	# r2:	cif->bytes
++	# r3:	&ecif
++	# r4:	ffi_prep_args
++	# r5:	ret_type
++	# r6:	ecif.rvalue
++	# ov:	fn 
++ 
++	# This assumes we are using gas.
++	.globl	ffi_call_SYSV
++	.type	ffi_call_SYSV,%function
++ffi_call_SYSV:
++.LFB1:
++	stm	%r6,%r15,24(%r15)		# Save registers
++.LCFI0:
++	basr	%r13,0				# Set up base register
++.Lbase:
++	lr	%r11,%r15			# Set up frame pointer
++.LCFI1:
++	sr	%r15,%r2
++	ahi	%r15,-96-48			# Allocate stack
++	lr	%r8,%r6				# Save ecif.rvalue
++	sr	%r9,%r9
++	ic	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
++	l	%r7,96(%r11)			# Load function address
++	st	%r11,0(%r15)			# Set up back chain
++	ahi	%r11,-48			# Register save area
++.LCFI2:
++
++	la	%r2,96(%r15)			# Save area
++						# r3 already holds &ecif
++	basr	%r14,%r4			# Call ffi_prep_args
++
++	lm	%r2,%r6,0(%r11)			# Load arguments
++	ld	%f0,32(%r11)
++	ld	%f2,40(%r11)
++	la	%r14,0(%r13,%r9)		# Set return address
++	br	%r7				# ... and call function
++
++.LretNone:					# Return void
++	l	%r4,48+56(%r11)
++	lm	%r6,%r15,48+24(%r11)
++	br	%r4
++
++.LretFloat:
++	l	%r4,48+56(%r11)
++	ste	%f0,0(%r8)			# Return float
++	lm	%r6,%r15,48+24(%r11)
++	br	%r4
++ 
++.LretDouble:
++	l	%r4,48+56(%r11)
++	std	%f0,0(%r8)			# Return double
++	lm	%r6,%r15,48+24(%r11)
++	br	%r4
++
++.LretInt32:
++	l	%r4,48+56(%r11)
++	st	%r2,0(%r8)			# Return int
++	lm	%r6,%r15,48+24(%r11)
++	br	%r4
++ 
++.LretInt64:
++	l	%r4,48+56(%r11)
++	stm	%r2,%r3,0(%r8)			# Return long long
++	lm	%r6,%r15,48+24(%r11)
++	br	%r4
++ 
++.Ltable:
++	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
++	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
++	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
++	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
++	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
++	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
++
++.LFE1: 
++.ffi_call_SYSV_end:
++	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
++
++
++	.globl	ffi_closure_SYSV
++	.type	ffi_closure_SYSV,%function
++ffi_closure_SYSV:
++.LFB2:
++	stm	%r12,%r15,48(%r15)		# Save registers
++.LCFI10:
++	basr	%r13,0				# Set up base register
++.Lcbase:
++	stm	%r2,%r6,8(%r15)			# Save arguments
++	std	%f0,64(%r15)
++	std	%f2,72(%r15)
++	lr	%r1,%r15			# Set up stack frame
++	ahi	%r15,-96
++.LCFI11:
++	l	%r12,.Lchelper-.Lcbase(%r13)	# Get helper function
++	lr	%r2,%r0				# Closure
++	la	%r3,8(%r1)			# GPRs
++	la	%r4,64(%r1)			# FPRs
++	la	%r5,96(%r1)			# Overflow
++	st	%r1,0(%r15)			# Set up back chain
++
++	bas	%r14,0(%r12,%r13)		# Call helper
++
++	l	%r4,96+56(%r15)
++	ld	%f0,96+64(%r15)			# Load return registers
++	lm	%r2,%r3,96+8(%r15)
++	lm	%r12,%r15,96+48(%r15)
++	br	%r4
++
++	.align 4
++.Lchelper:
++	.long	ffi_closure_helper_SYSV-.Lcbase
++
++.LFE2: 
++
++.ffi_closure_SYSV_end:
++	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
++
++
++	.section	.eh_frame,"a",@progbits
++.Lframe1:
++	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
++.LSCIE1:
++	.4byte	0x0	# CIE Identifier Tag
++	.byte	0x1	# CIE Version
++	.ascii "zR\0"	# CIE Augmentation
++	.uleb128 0x1	# CIE Code Alignment Factor
++	.sleb128 -4	# CIE Data Alignment Factor
++	.byte	0xe	# CIE RA Column
++	.uleb128 0x1	# Augmentation size
++	.byte	0x1b	# FDE Encoding (pcrel sdata4)
++	.byte	0xc	# DW_CFA_def_cfa
++	.uleb128 0xf
++	.uleb128 0x60
++	.align	4
++.LECIE1:
++.LSFDE1:
++	.4byte	.LEFDE1-.LASFDE1	# FDE Length
++.LASFDE1:
++	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
++	.4byte	.LFB1-.	# FDE initial location
++	.4byte	.LFE1-.LFB1	# FDE address range
++	.uleb128 0x0	# Augmentation size
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI0-.LFB1
++	.byte	0x8f	# DW_CFA_offset, column 0xf
++	.uleb128 0x9
++	.byte	0x8e	# DW_CFA_offset, column 0xe
++	.uleb128 0xa
++	.byte	0x8d	# DW_CFA_offset, column 0xd
++	.uleb128 0xb
++	.byte	0x8c	# DW_CFA_offset, column 0xc
++	.uleb128 0xc
++	.byte	0x8b	# DW_CFA_offset, column 0xb
++	.uleb128 0xd
++	.byte	0x8a	# DW_CFA_offset, column 0xa
++	.uleb128 0xe
++	.byte	0x89	# DW_CFA_offset, column 0x9
++	.uleb128 0xf
++	.byte	0x88	# DW_CFA_offset, column 0x8
++	.uleb128 0x10
++	.byte	0x87	# DW_CFA_offset, column 0x7
++	.uleb128 0x11
++	.byte	0x86	# DW_CFA_offset, column 0x6
++	.uleb128 0x12
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI1-.LCFI0
++	.byte	0xd	# DW_CFA_def_cfa_register
++	.uleb128 0xb
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI2-.LCFI1
++	.byte	0xe	# DW_CFA_def_cfa_offset
++	.uleb128 0x90
++	.align	4
++.LEFDE1:
++.LSFDE2:
++	.4byte	.LEFDE2-.LASFDE2	# FDE Length
++.LASFDE2:
++	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
++	.4byte	.LFB2-.	# FDE initial location
++	.4byte	.LFE2-.LFB2	# FDE address range
++	.uleb128 0x0	# Augmentation size
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI10-.LFB2
++	.byte	0x8f	# DW_CFA_offset, column 0xf
++	.uleb128 0x9
++	.byte	0x8e	# DW_CFA_offset, column 0xe
++	.uleb128 0xa
++	.byte	0x8d	# DW_CFA_offset, column 0xd
++	.uleb128 0xb
++	.byte	0x8c	# DW_CFA_offset, column 0xc
++	.uleb128 0xc
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI11-.LCFI10
++	.byte	0xe	# DW_CFA_def_cfa_offset
++	.uleb128 0xc0
++	.align	4
++.LEFDE2:
++
++#else
++ 
++.text
++ 
++	# r2:	cif->bytes
++	# r3:	&ecif
++	# r4:	ffi_prep_args
++	# r5:	ret_type
++	# r6:	ecif.rvalue
++	# ov:	fn 
++ 
++	# This assumes we are using gas.
++	.globl	ffi_call_SYSV
++	.type	ffi_call_SYSV,%function
++ffi_call_SYSV:
++.LFB1:
++	stmg	%r6,%r15,48(%r15)		# Save registers
++.LCFI0:
++	larl	%r13,.Lbase			# Set up base register
++	lgr	%r11,%r15			# Set up frame pointer
++.LCFI1:
++	sgr	%r15,%r2
++	aghi	%r15,-160-80			# Allocate stack
++	lgr	%r8,%r6				# Save ecif.rvalue
++	llgc	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
++	lg	%r7,160(%r11)			# Load function address
++	stg	%r11,0(%r15)			# Set up back chain
++	aghi	%r11,-80			# Register save area
++.LCFI2:
++
++	la	%r2,160(%r15)			# Save area
++						# r3 already holds &ecif
++	basr	%r14,%r4			# Call ffi_prep_args
++
++	lmg	%r2,%r6,0(%r11)			# Load arguments
++	ld	%f0,48(%r11)
++	ld	%f2,56(%r11)
++	ld	%f4,64(%r11)
++	ld	%f6,72(%r11)
++	la	%r14,0(%r13,%r9)		# Set return address
++	br	%r7				# ... and call function
++
++.Lbase:
++.LretNone:					# Return void
++	lg	%r4,80+112(%r11)
++	lmg	%r6,%r15,80+48(%r11)
++	br	%r4
++
++.LretFloat:
++	lg	%r4,80+112(%r11)
++	ste	%f0,0(%r8)			# Return float
++	lmg	%r6,%r15,80+48(%r11)
++	br	%r4
++ 
++.LretDouble:
++	lg	%r4,80+112(%r11)
++	std	%f0,0(%r8)			# Return double
++	lmg	%r6,%r15,80+48(%r11)
++	br	%r4
++
++.LretInt32:
++	lg	%r4,80+112(%r11)
++	st	%r2,0(%r8)			# Return int
++	lmg	%r6,%r15,80+48(%r11)
++	br	%r4
++ 
++.LretInt64:
++	lg	%r4,80+112(%r11)
++	stg	%r2,0(%r8)			# Return long
++	lmg	%r6,%r15,80+48(%r11)
++	br	%r4
++ 
++.Ltable:
++	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
++	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
++	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
++	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
++	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
++	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
++
++.LFE1: 
++.ffi_call_SYSV_end:
++	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
++
++
++	.globl	ffi_closure_SYSV
++	.type	ffi_closure_SYSV,%function
++ffi_closure_SYSV:
++.LFB2:
++	stmg	%r14,%r15,112(%r15)		# Save registers
++.LCFI10:
++	stmg	%r2,%r6,16(%r15)		# Save arguments
++	std	%f0,128(%r15)
++	std	%f2,136(%r15)
++	std	%f4,144(%r15)
++	std	%f6,152(%r15)
++	lgr	%r1,%r15			# Set up stack frame
++	aghi	%r15,-160
++.LCFI11:
++	lgr	%r2,%r0				# Closure
++	la	%r3,16(%r1)			# GPRs
++	la	%r4,128(%r1)			# FPRs
++	la	%r5,160(%r1)			# Overflow
++	stg	%r1,0(%r15)			# Set up back chain
++
++	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
++
++	lg	%r14,160+112(%r15)
++	ld	%f0,160+128(%r15)		# Load return registers
++	lg	%r2,160+16(%r15)
++	la	%r15,160(%r15)
++	br	%r14
++.LFE2: 
++
++.ffi_closure_SYSV_end:
++	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
++
++
++
++	.section	.eh_frame,"a",@progbits
++.Lframe1:
++	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
++.LSCIE1:
++	.4byte	0x0	# CIE Identifier Tag
++	.byte	0x1	# CIE Version
++	.ascii "zR\0"	# CIE Augmentation
++	.uleb128 0x1	# CIE Code Alignment Factor
++	.sleb128 -8	# CIE Data Alignment Factor
++	.byte	0xe	# CIE RA Column
++	.uleb128 0x1	# Augmentation size
++	.byte	0x1b	# FDE Encoding (pcrel sdata4)
++	.byte	0xc	# DW_CFA_def_cfa
++	.uleb128 0xf
++	.uleb128 0xa0
++	.align	8
++.LECIE1:
++.LSFDE1:
++	.4byte	.LEFDE1-.LASFDE1	# FDE Length
++.LASFDE1:
++	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
++	.4byte	.LFB1-.	# FDE initial location
++	.4byte	.LFE1-.LFB1	# FDE address range
++	.uleb128 0x0	# Augmentation size
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI0-.LFB1
++	.byte	0x8f	# DW_CFA_offset, column 0xf
++	.uleb128 0x5
++	.byte	0x8e	# DW_CFA_offset, column 0xe
++	.uleb128 0x6
++	.byte	0x8d	# DW_CFA_offset, column 0xd
++	.uleb128 0x7
++	.byte	0x8c	# DW_CFA_offset, column 0xc
++	.uleb128 0x8
++	.byte	0x8b	# DW_CFA_offset, column 0xb
++	.uleb128 0x9
++	.byte	0x8a	# DW_CFA_offset, column 0xa
++	.uleb128 0xa
++	.byte	0x89	# DW_CFA_offset, column 0x9
++	.uleb128 0xb
++	.byte	0x88	# DW_CFA_offset, column 0x8
++	.uleb128 0xc
++	.byte	0x87	# DW_CFA_offset, column 0x7
++	.uleb128 0xd
++	.byte	0x86	# DW_CFA_offset, column 0x6
++	.uleb128 0xe
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI1-.LCFI0
++	.byte	0xd	# DW_CFA_def_cfa_register
++	.uleb128 0xb
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI2-.LCFI1
++	.byte	0xe	# DW_CFA_def_cfa_offset
++	.uleb128 0xf0
++	.align	8
++.LEFDE1:
++.LSFDE2:
++	.4byte	.LEFDE2-.LASFDE2	# FDE Length
++.LASFDE2:
++	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
++	.4byte	.LFB2-.	# FDE initial location
++	.4byte	.LFE2-.LFB2	# FDE address range
++	.uleb128 0x0	# Augmentation size
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI10-.LFB2
++	.byte	0x8f	# DW_CFA_offset, column 0xf
++	.uleb128 0x5
++	.byte	0x8e	# DW_CFA_offset, column 0xe
++	.uleb128 0x6
++	.byte	0x4	# DW_CFA_advance_loc4
++	.4byte	.LCFI11-.LCFI10
++	.byte	0xe	# DW_CFA_def_cfa_offset
++	.uleb128 0x140
++	.align	8
++.LEFDE2:
++
++#endif
++
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c
+--- gcc-3.2.2.orig/libffi/src/sh/ffi.c	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/sh/ffi.c	Fri Jul 19 10:08:43 2002
+@@ -0,0 +1,722 @@
++/* -----------------------------------------------------------------------
++   ffi.c - Copyright (c) 2002 Kaz Kojima
++   
++   SuperH Foreign Function Interface 
++
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++
++#define NGREGARG 4
++#if defined(__SH4__)
++#define NFREGARG 8
++#endif
++
++#if defined(__HITACHI__)
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
++#else
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
++#endif
++
++/* If the structure has essentialy an unique element, return its type.  */
++static int
++simple_type (ffi_type *arg)
++{
++  if (arg->type != FFI_TYPE_STRUCT)
++    return arg->type;
++  else if (arg->elements[1])
++    return FFI_TYPE_STRUCT;
++
++  return simple_type (arg->elements[0]);
++}
++
++static int
++return_type (ffi_type *arg)
++{
++  unsigned short type;
++
++  if (arg->type != FFI_TYPE_STRUCT)
++    return arg->type;
++
++  type = simple_type (arg->elements[0]);
++  if (! arg->elements[1])
++    {
++      switch (type)
++	{
++	case FFI_TYPE_SINT8:
++	case FFI_TYPE_UINT8:
++	case FFI_TYPE_SINT16:
++	case FFI_TYPE_UINT16:
++	case FFI_TYPE_SINT32:
++	case FFI_TYPE_UINT32:
++	  return FFI_TYPE_INT;
++
++	default:
++	  return type;
++	}
++    }
++
++  /* gcc uses r0/r1 pair for some kind of structures.  */
++  if (arg->size <= 2 * sizeof (int))
++    {
++      int i = 0;
++      ffi_type *e;
++
++      while ((e = arg->elements[i++]))
++	{
++	  type = simple_type (e);
++	  switch (type)
++	    {
++	    case FFI_TYPE_SINT32:
++	    case FFI_TYPE_UINT32:
++	    case FFI_TYPE_INT:
++	    case FFI_TYPE_FLOAT:
++	      return FFI_TYPE_UINT64;
++
++	    default:
++	      break;
++	    }
++	}
++    }
++
++  return FFI_TYPE_STRUCT;
++}
++
++/* ffi_prep_args is called by the assembly routine once stack space
++   has been allocated for the function's arguments */
++
++/*@-exportheader@*/
++void ffi_prep_args(char *stack, extended_cif *ecif)
++/*@=exportheader@*/
++{
++  register unsigned int i;
++  register int tmp;
++  register unsigned int avn;
++  register void **p_argv;
++  register char *argp;
++  register ffi_type **p_arg;
++  int greg, ireg;
++#if defined(__SH4__)
++  int freg = 0;
++#endif
++
++  tmp = 0;
++  argp = stack;
++
++  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
++    {
++      *(void **) argp = ecif->rvalue;
++      argp += 4;
++      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
++    }
++  else
++    ireg = 0;
++
++  /* Set arguments for registers.  */
++  greg = ireg;
++  avn = ecif->cif->nargs;
++  p_argv = ecif->avalue;
++
++  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      if (z < sizeof(int))
++	{
++	  if (greg++ >= NGREGARG)
++	    continue;
++
++	  z = sizeof(int);
++	  switch ((*p_arg)->type)
++	    {
++	    case FFI_TYPE_SINT8:
++	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_UINT8:
++	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_SINT16:
++	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_UINT16:
++	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_STRUCT:
++	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++	      break;
++
++	    default:
++	      FFI_ASSERT(0);
++	    }
++	  argp += z;
++	}
++      else if (z == sizeof(int))
++	{
++#if defined(__SH4__)
++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
++	    {
++	      if (freg++ >= NFREGARG)
++		continue;
++	    }
++	  else
++#endif
++	    {
++	      if (greg++ >= NGREGARG)
++		continue;
++	    }
++	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++	  argp += z;
++	}
++#if defined(__SH4__)
++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++	{
++	  if (freg + 1 >= NFREGARG)
++	    continue;
++	  freg = (freg + 1) & ~1;
++	  freg += 2;
++	  memcpy (argp, *p_argv, z);
++	  argp += z;
++	}
++#endif
++      else
++	{
++	  int n = (z + sizeof (int) - 1) / sizeof (int);
++#if defined(__SH4__)
++	  if (greg + n - 1 >= NGREGARG)
++	    continue;
++	  greg += n;
++#else
++	  if (greg >= NGREGARG)
++	    continue;
++	  else if (greg + n - 1 >= NGREGARG)
++	    greg = NGREGARG;
++	  else
++	    greg += n;
++#endif
++	  memcpy (argp, *p_argv, z);
++	  argp += z;
++	}
++    }
++
++  /* Set arguments on stack.  */
++  greg = ireg;
++#if defined(__SH4__)
++  freg = 0;
++#endif
++  p_argv = ecif->avalue;
++
++  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      if (z < sizeof(int))
++	{
++	  if (greg++ < NGREGARG)
++	    continue;
++
++	  z = sizeof(int);
++	  switch ((*p_arg)->type)
++	    {
++	    case FFI_TYPE_SINT8:
++	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_UINT8:
++	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_SINT16:
++	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_UINT16:
++	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
++	      break;
++  
++	    case FFI_TYPE_STRUCT:
++	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++	      break;
++
++	    default:
++	      FFI_ASSERT(0);
++	    }
++	  argp += z;
++	}
++      else if (z == sizeof(int))
++	{
++#if defined(__SH4__)
++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
++	    {
++	      if (freg++ < NFREGARG)
++		continue;
++	    }
++	  else
++#endif
++	    {
++	      if (greg++ < NGREGARG)
++		continue;
++	    }
++	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
++	  argp += z;
++	}
++#if defined(__SH4__)
++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++	{
++	  if (freg + 1 < NFREGARG)
++	    {
++	      freg = (freg + 1) & ~1;
++	      freg += 2;
++	      continue;
++	    }
++	  memcpy (argp, *p_argv, z);
++	  argp += z;
++	}
++#endif
++      else
++	{
++	  int n = (z + sizeof (int) - 1) / sizeof (int);
++	  if (greg + n - 1 < NGREGARG)
++	    {
++	      greg += n;
++	      continue;
++	    }
++#if (! defined(__SH4__))
++	  else if (greg < NGREGARG)
++	    {
++	      greg = NGREGARG;
++	      continue;
++	    }
++#endif
++	  memcpy (argp, *p_argv, z);
++	  argp += z;
++	}
++    }
++
++  return;
++}
++
++/* Perform machine dependent cif processing */
++ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
++{
++  int i, j;
++  int size, type;
++  int n, m;
++  int greg;
++#if defined(__SH4__)
++  int freg = 0;
++#endif
++
++  cif->flags = 0;
++
++  greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
++	  STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
++
++#if defined(__SH4__)
++  for (i = j = 0; i < cif->nargs && j < 12; i++)
++    {
++      type = (cif->arg_types)[i]->type;
++      switch (type)
++	{
++	case FFI_TYPE_FLOAT:
++	  if (freg >= NFREGARG)
++	    continue;
++	  freg++;
++	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
++	  j++;
++	  break;
++
++	case FFI_TYPE_DOUBLE:
++	  if ((freg + 1) >= NFREGARG)
++	    continue;
++	  freg = (freg + 1) & ~1;
++	  freg += 2;
++	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
++	  j++;
++	  break;
++	      
++	default:
++	  size = (cif->arg_types)[i]->size;
++	  n = (size + sizeof (int) - 1) / sizeof (int);
++	  if (greg + n - 1 >= NGREGARG)
++		continue;
++	  greg += n;
++	  for (m = 0; m < n; m++)
++	    cif->flags += FFI_TYPE_INT << (2 * j++);
++	  break;
++	}
++    }
++#else
++  for (i = j = 0; i < cif->nargs && j < 4; i++)
++    {
++      size = (cif->arg_types)[i]->size;
++      n = (size + sizeof (int) - 1) / sizeof (int);
++      if (greg >= NGREGARG)
++	continue;
++      else if (greg + n - 1 >= NGREGARG)
++	greg = NGREGARG;
++      else
++	greg += n;
++      for (m = 0; m < n; m++)
++        cif->flags += FFI_TYPE_INT << (2 * j++);
++    }
++#endif
++
++  /* Set the return type flag */
++  switch (cif->rtype->type)
++    {
++    case FFI_TYPE_STRUCT:
++      cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
++      break;
++
++    case FFI_TYPE_VOID:
++    case FFI_TYPE_FLOAT:
++    case FFI_TYPE_DOUBLE:
++    case FFI_TYPE_SINT64:
++    case FFI_TYPE_UINT64:
++      cif->flags += (unsigned) cif->rtype->type << 24;
++      break;
++
++    default:
++      cif->flags += FFI_TYPE_INT << 24;
++      break;
++    }
++
++  return FFI_OK;
++}
++
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), 
++			  /*@out@*/ extended_cif *, 
++			  unsigned, unsigned, 
++			  /*@out@*/ unsigned *, 
++			  void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++
++void ffi_call(/*@dependent@*/ ffi_cif *cif, 
++	      void (*fn)(), 
++	      /*@out@*/ void *rvalue, 
++	      /*@dependent@*/ void **avalue)
++{
++  extended_cif ecif;
++
++  ecif.cif = cif;
++  ecif.avalue = avalue;
++  
++  /* If the return value is a struct and we don't have a return	*/
++  /* value address then we need to make one		        */
++
++  if ((rvalue == NULL) && 
++      (cif->rtype->type == FFI_TYPE_STRUCT))
++    {
++      /*@-sysunrecog@*/
++      ecif.rvalue = alloca(cif->rtype->size);
++      /*@=sysunrecog@*/
++    }
++  else
++    ecif.rvalue = rvalue;
++    
++
++  switch (cif->abi) 
++    {
++    case FFI_SYSV:
++      /*@-usedef@*/
++      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
++		    cif->flags, ecif.rvalue, fn);
++      /*@=usedef@*/
++      break;
++    default:
++      FFI_ASSERT(0);
++      break;
++    }
++}
++
++extern void ffi_closure_SYSV (void);
++#if defined(__SH4__)
++extern void __ic_invalidate (void *line);
++#endif
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++		  ffi_cif* cif,
++		  void (*fun)(ffi_cif*, void*, void**, void*),
++		  void *user_data)
++{
++  unsigned int *tramp;
++
++  FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
++
++  tramp = (unsigned int *) &closure->tramp[0];
++#ifdef __LITTLE_ENDIAN__
++  tramp[0] = 0xd301d202;
++  tramp[1] = 0x0009422b;
++#else
++  tramp[0] = 0xd202d301;
++  tramp[1] = 0x422b0009;
++#endif
++  *(void **) &tramp[2] = (void *)closure;          /* ctx */
++  *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
++
++  closure->cif = cif;
++  closure->fun = fun;
++  closure->user_data = user_data;
++
++#if defined(__SH4__)
++  /* Flush the icache.  */
++  __ic_invalidate(&closure->tramp[0]);
++#endif
++
++  return FFI_OK;
++}
++
++/* Basically the trampoline invokes ffi_closure_SYSV, and on 
++ * entry, r3 holds the address of the closure.
++ * After storing the registers that could possibly contain
++ * parameters to be passed into the stack frame and setting
++ * up space for a return value, ffi_closure_SYSV invokes the 
++ * following helper function to do most of the work.
++ */
++
++#ifdef __LITTLE_ENDIAN__
++#define OFS_INT8	0
++#define OFS_INT16	2
++#else
++#define OFS_INT8	3
++#define OFS_INT16	2
++#endif
++
++int
++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, 
++			 unsigned long *pgr, unsigned long *pfr, 
++			 unsigned long *pst)
++{
++  void **avalue;
++  ffi_type **p_arg;
++  int i, avn;
++  int ireg, greg = 0;
++#if defined(__SH4__)
++  int freg = 0;
++#endif
++  ffi_cif *cif; 
++  double temp; 
++
++  cif = closure->cif;
++  avalue = alloca(cif->nargs * sizeof(void *));
++
++  /* Copy the caller's structure return value address so that the closure
++     returns the data directly to the caller.  */
++  if (cif->rtype->type == FFI_TYPE_STRUCT)
++    {
++      rvalue = *pgr++;
++      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
++    }
++  else
++    ireg = 0;
++
++  cif = closure->cif;
++  greg = ireg;
++  avn = cif->nargs;
++
++  /* Grab the addresses of the arguments from the stack frame.  */
++  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      if (z < sizeof(int))
++	{
++	  if (greg++ >= NGREGARG)
++	    continue;
++
++	  z = sizeof(int);
++	  switch ((*p_arg)->type)
++	    {
++	    case FFI_TYPE_SINT8:
++	    case FFI_TYPE_UINT8:
++	      avalue[i] = (((char *)pgr) + OFS_INT8);
++	      break;
++  
++	    case FFI_TYPE_SINT16:
++	    case FFI_TYPE_UINT16:
++	      avalue[i] = (((char *)pgr) + OFS_INT16);
++	      break;
++  
++	    case FFI_TYPE_STRUCT:
++	      avalue[i] = pgr;
++	      break;
++
++	    default:
++	      FFI_ASSERT(0);
++	    }
++	  pgr++;
++	}
++      else if (z == sizeof(int))
++	{
++#if defined(__SH4__)
++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
++	    {
++	      if (freg++ >= NFREGARG)
++		continue;
++	      avalue[i] = pfr;
++	      pfr++;
++	    }
++	  else
++#endif
++	    {
++	      if (greg++ >= NGREGARG)
++		continue;
++	      avalue[i] = pgr;
++	      pgr++;
++	    }
++	}
++#if defined(__SH4__)
++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++	{
++	  if (freg + 1 >= NFREGARG)
++	    continue;
++	  freg = (freg + 1) & ~1;
++	  freg += 2;
++	  avalue[i] = pfr;
++	  pfr += 2;
++	}
++#endif
++      else
++	{
++	  int n = (z + sizeof (int) - 1) / sizeof (int);
++#if defined(__SH4__)
++	  if (greg + n - 1 >= NGREGARG)
++	    continue;
++	  greg += n;
++#else
++	  if (greg >= NGREGARG)
++	    continue;
++	  else if (greg + n - 1 >= NGREGARG)
++	    greg = NGREGARG;
++	  else
++	    greg += n;
++#endif
++	  avalue[i] = pgr;
++	  pgr += n;
++	}
++    }
++
++  greg = ireg;
++#if defined(__SH4__)
++  freg = 0;
++#endif
++
++  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
++    {
++      size_t z;
++
++      z = (*p_arg)->size;
++      if (z < sizeof(int))
++	{
++	  if (greg++ < NGREGARG)
++	    continue;
++
++	  z = sizeof(int);
++	  switch ((*p_arg)->type)
++	    {
++	    case FFI_TYPE_SINT8:
++	    case FFI_TYPE_UINT8:
++	      avalue[i] = (((char *)pst) + OFS_INT8);
++	      break;
++  
++	    case FFI_TYPE_SINT16:
++	    case FFI_TYPE_UINT16:
++	      avalue[i] = (((char *)pst) + OFS_INT16);
++	      break;
++  
++	    case FFI_TYPE_STRUCT:
++	      avalue[i] = pst;
++	      break;
++
++	    default:
++	      FFI_ASSERT(0);
++	    }
++	  pst++;
++	}
++      else if (z == sizeof(int))
++	{
++#if defined(__SH4__)
++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
++	    {
++	      if (freg++ < NFREGARG)
++		continue;
++	    }
++	  else
++#endif
++	    {
++	      if (greg++ < NGREGARG)
++		continue;
++	    }
++	  avalue[i] = pst;
++	  pst++;
++	}
++#if defined(__SH4__)
++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
++	{
++	  if (freg + 1 < NFREGARG)
++	    {
++	      freg = (freg + 1) & ~1;
++	      freg += 2;
++	      continue;
++	    }
++	  avalue[i] = pst;
++	  pst += 2;
++	}
++#endif
++      else
++	{
++	  int n = (z + sizeof (int) - 1) / sizeof (int);
++	  if (greg + n - 1 < NGREGARG)
++	    {
++	      greg += n;
++	      continue;
++	    }
++#if (! defined(__SH4__))
++	  else if (greg < NGREGARG)
++	    {
++	      greg = NGREGARG;
++	      continue;
++	    }
++#endif
++	  avalue[i] = pst;
++	  pst += n;
++	}
++    }
++
++  (closure->fun) (cif, rvalue, avalue, closure->user_data);
++
++  /* Tell ffi_closure_osf how to perform return type promotions.  */
++  return cif->rtype->type;
++}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S
+--- gcc-3.2.2.orig/libffi/src/sh/sysv.S	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/sh/sysv.S	Tue Dec 17 03:22:48 2002
+@@ -0,0 +1,773 @@
++/* -----------------------------------------------------------------------
++   sysv.S - Copyright (c) 2002 Kaz Kojima
++   
++   SuperH Foreign Function Interface 
++
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++
++#define LIBFFI_ASM	
++#include <ffi.h>
++#ifdef HAVE_MACHINE_ASM_H
++#include <machine/asm.h>
++#else
++/* XXX these lose for some platforms, I'm sure. */
++#define CNAME(x) x
++#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
++#endif
++
++#if defined(__HITACHI__)
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
++#else
++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
++#endif
++
++.text
++
++	# r4:	ffi_prep_args
++	# r5:	&ecif
++	# r6:	bytes
++	# r7:	flags
++	# sp+0: rvalue
++	# sp+4: fn
++
++	# This assumes we are using gas.
++ENTRY(ffi_call_SYSV)
++	# Save registers
++.LFB1:
++	mov.l	r8,@-r15
++.LCFI0:
++	mov.l	r9,@-r15
++.LCFI1:
++	mov.l	r10,@-r15
++.LCFI2:
++	mov.l	r12,@-r15
++.LCFI3:
++	mov.l	r14,@-r15
++.LCFI4:
++	sts.l	pr,@-r15
++.LCFI5:
++	mov	r15,r14
++.LCFI6:
++#if defined(__SH4__)
++	mov	r6,r8
++	mov	r7,r9
++
++	sub	r6,r15
++	add	#-16,r15
++	mov	#~7,r0
++	and	r0,r15
++
++	mov	r4,r0
++	jsr	@r0
++	 mov	r15,r4
++
++	mov	r9,r1
++	shlr8	r9
++	shlr8	r9
++	shlr8	r9
++
++	mov	#FFI_TYPE_STRUCT,r2
++	cmp/eq	r2,r9
++	bf	1f
++#if STRUCT_VALUE_ADDRESS_WITH_ARG
++ 	mov.l	@r15+,r4
++	bra	2f
++	 mov	#5,r2
++#else
++ 	mov.l	@r15+,r10
++#endif
++1:
++	mov	#4,r2
++2:
++	mov	#4,r3
++
++L_pass:
++	cmp/pl	r8
++	bf	L_call_it
++
++	mov	r1,r0
++	and	#3,r0
++
++L_pass_d:
++	cmp/eq	#FFI_TYPE_DOUBLE,r0
++	bf	L_pass_f
++
++	mov	r3,r0
++	and	#1,r0
++	tst	r0,r0
++	bt	1f
++	add	#1,r3
++1:
++	mov	r15,r0
++	and	#7,r0
++	tst	r0,r0
++	bt	2f
++	add	#4,r15
++2:
++	mov	#12,r0
++	cmp/hs	r0,r3
++	bt/s	3f
++	 shlr2	r1
++	bsr	L_pop_d
++	 nop
++3:
++	add	#2,r3
++	bra	L_pass
++	 add	#-8,r8
++
++L_pop_d:
++	mov	r3,r0
++	add	r0,r0
++	add	r3,r0
++	add	#-12,r0
++	braf	r0
++	 nop
++#ifdef __LITTLE_ENDIAN__
++	fmov.s	@r15+,fr5
++	rts
++	 fmov.s	@r15+,fr4
++	fmov.s	@r15+,fr7
++	rts
++	 fmov.s	@r15+,fr6
++	fmov.s	@r15+,fr9
++	rts
++	 fmov.s	@r15+,fr8
++	fmov.s	@r15+,fr11
++	rts
++	 fmov.s	@r15+,fr10
++#else
++	fmov.s	@r15+,fr4
++	rts
++	 fmov.s	@r15+,fr5
++	fmov.s	@r15+,fr6
++	rts
++	 fmov.s	@r15+,fr7
++	fmov.s	@r15+,fr8
++	rts
++	 fmov.s	@r15+,fr9
++	fmov.s	@r15+,fr10
++	rts
++	 fmov.s	@r15+,fr11
++#endif
++
++L_pass_f:
++	cmp/eq	#FFI_TYPE_FLOAT,r0
++	bf	L_pass_i
++
++	mov	#12,r0
++	cmp/hs	r0,r3
++	bt/s	2f
++	 shlr2	r1
++	bsr	L_pop_f
++	 nop
++2:
++	add	#1,r3
++	bra	L_pass
++	 add	#-4,r8
++
++L_pop_f:
++	mov	r3,r0
++	shll2	r0
++	add	#-16,r0
++	braf	r0
++	 nop
++#ifdef __LITTLE_ENDIAN__
++	rts
++	 fmov.s	@r15+,fr5
++	rts
++	 fmov.s	@r15+,fr4
++	rts
++	 fmov.s	@r15+,fr7
++	rts
++	 fmov.s	@r15+,fr6
++	rts
++	 fmov.s	@r15+,fr9
++	rts
++	 fmov.s	@r15+,fr8
++	rts
++	 fmov.s	@r15+,fr11
++	rts
++	 fmov.s	@r15+,fr10
++#else
++	rts
++	 fmov.s	@r15+,fr4
++	rts
++	 fmov.s	@r15+,fr5
++	rts
++	 fmov.s	@r15+,fr6
++	rts
++	 fmov.s	@r15+,fr7
++	rts
++	 fmov.s	@r15+,fr8
++	rts
++	 fmov.s	@r15+,fr9
++	rts
++	 fmov.s	@r15+,fr10
++	rts
++	 fmov.s	@r15+,fr11
++#endif
++
++L_pass_i:
++	cmp/eq	#FFI_TYPE_INT,r0
++	bf	L_call_it
++
++	mov	#8,r0
++	cmp/hs	r0,r2
++	bt/s	2f
++	 shlr2	r1
++	bsr	L_pop_i
++	 nop
++2:
++	add	#1,r2
++	bra	L_pass
++	 add	#-4,r8
++
++L_pop_i:
++	mov	r2,r0
++	shll2	r0
++	add	#-16,r0
++	braf	r0
++	 nop
++	rts
++	 mov.l	@r15+,r4
++	rts
++	 mov.l	@r15+,r5
++	rts
++	 mov.l	@r15+,r6
++	rts
++	 mov.l	@r15+,r7
++
++L_call_it:
++	# call function
++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
++	mov	r10, r2
++#endif
++	mov.l  @(28,r14),r1
++	jsr    @r1
++	 nop
++
++L_ret_d:
++	mov	#FFI_TYPE_DOUBLE,r2
++	cmp/eq	r2,r9
++	bf	L_ret_ll
++
++	mov.l	@(24,r14),r1
++#ifdef __LITTLE_ENDIAN__
++	fmov.s	fr1,@r1
++	add	#4,r1
++	bra	L_epilogue
++	 fmov.s	fr0,@r1
++#else
++	fmov.s	fr0,@r1
++	add	#4,r1
++	bra	L_epilogue
++	 fmov.s	fr1,@r1
++#endif
++
++L_ret_ll:
++	mov	#FFI_TYPE_SINT64,r2
++	cmp/eq	r2,r9
++	bt/s	1f
++	 mov	#FFI_TYPE_UINT64,r2
++	cmp/eq	r2,r9
++	bf	L_ret_f
++
++1:
++	mov.l	@(24,r14),r2
++	mov.l	r0,@r2
++	bra	L_epilogue
++	 mov.l	r1,@(4,r2)
++
++L_ret_f:
++	mov	#FFI_TYPE_FLOAT,r2
++	cmp/eq	r2,r9
++	bf	L_ret_i
++
++	mov.l	@(24,r14),r1
++	bra	L_epilogue
++	 fmov.s	fr0,@r1
++
++L_ret_i:
++	mov	#FFI_TYPE_INT,r2
++	cmp/eq	r2,r9
++	bf	L_epilogue
++
++	mov.l	@(24,r14),r1
++	bra	L_epilogue
++	 mov.l	r0,@r1
++
++L_epilogue:
++	# Remove the space we pushed for the args
++	mov   r14,r15
++
++	lds.l  @r15+,pr
++	mov.l  @r15+,r14
++	mov.l  @r15+,r12
++	mov.l  @r15+,r10
++	mov.l  @r15+,r9
++	rts
++	 mov.l  @r15+,r8
++#else
++	mov	r6,r8
++	mov	r7,r9
++
++	sub	r6,r15
++	add	#-16,r15
++	mov	#~7,r0
++	and	r0,r15
++
++	mov	r4,r0
++	jsr	@r0
++	 mov	r15,r4
++
++	mov	r9,r3
++	shlr8	r9
++	shlr8	r9
++	shlr8	r9
++
++	mov	#FFI_TYPE_STRUCT,r2
++	cmp/eq	r2,r9
++	bf	1f
++#if STRUCT_VALUE_ADDRESS_WITH_ARG
++	mov.l	@r15+,r4
++	bra	2f
++	 mov	#5,r2
++#else
++	mov.l	@r15+,r10
++#endif
++1:
++	mov	#4,r2
++2:
++
++L_pass:
++	cmp/pl	r8
++	bf	L_call_it
++
++	mov	r3,r0
++	and	#3,r0
++
++L_pass_d:
++	cmp/eq	#FFI_TYPE_DOUBLE,r0
++	bf	L_pass_i
++
++	mov	r15,r0
++	and	#7,r0
++	tst	r0,r0
++	bt	1f
++	add	#4,r15
++1:
++	mov	#8,r0
++	cmp/hs	r0,r2
++	bt/s	2f
++	 shlr2	r3
++	bsr	L_pop_d
++	 nop
++2:
++	add	#2,r2
++	bra	L_pass
++	 add	#-8,r8
++
++L_pop_d:
++	mov	r2,r0
++	add	r0,r0
++	add	r2,r0
++	add	#-12,r0
++	add	r0,r0
++	braf	r0
++	 nop
++	mov.l	@r15+,r4
++	rts
++	 mov.l	@r15+,r5
++	mov.l	@r15+,r5
++	rts
++	 mov.l	@r15+,r6
++	mov.l	@r15+,r6
++	rts
++	 mov.l	@r15+,r7
++	rts
++	 mov.l	@r15+,r7
++
++L_pass_i:
++	mov	#8,r0
++	cmp/hs	r0,r2
++	bt/s	2f
++	 shlr2	r3
++	bsr	L_pop_i
++	 nop
++2:
++	add	#1,r2
++	bra	L_pass
++	 add	#-4,r8
++
++L_pop_i:
++	mov	r2,r0
++	shll2	r0
++	add	#-16,r0
++	braf	r0
++	 nop
++	rts
++	 mov.l	@r15+,r4
++	rts
++	 mov.l	@r15+,r5
++	rts
++	 mov.l	@r15+,r6
++	rts
++	 mov.l	@r15+,r7
++
++L_call_it:
++	# call function
++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
++	mov	r10, r2
++#endif
++	mov.l  @(28,r14),r1
++	jsr    @r1
++	 nop
++
++L_ret_d:
++	mov	#FFI_TYPE_DOUBLE,r2
++	cmp/eq	r2,r9
++	bf	L_ret_ll
++
++	mov.l	@(24,r14),r2
++	mov.l	r0,@r2
++	bra	L_epilogue
++	 mov.l	r1,@(4,r2)
++
++L_ret_ll:
++	mov	#FFI_TYPE_SINT64,r2
++	cmp/eq	r2,r9
++	bt/s	1f
++	 mov	#FFI_TYPE_UINT64,r2
++	cmp/eq	r2,r9
++	bf	L_ret_i
++
++1:
++	mov.l	@(24,r14),r2
++	mov.l	r0,@r2
++	bra	L_epilogue
++	 mov.l	r1,@(4,r2)
++
++L_ret_i:
++	mov	#FFI_TYPE_FLOAT,r2
++	cmp/eq	r2,r9
++	bt	1f
++	mov	#FFI_TYPE_INT,r2
++	cmp/eq	r2,r9
++	bf	L_epilogue
++1:
++	mov.l	@(24,r14),r1
++	bra	L_epilogue
++	 mov.l	r0,@r1
++
++L_epilogue:
++	# Remove the space we pushed for the args
++	mov   r14,r15
++
++	lds.l  @r15+,pr
++	mov.l  @r15+,r14
++	mov.l  @r15+,r12
++	mov.l  @r15+,r10
++	mov.l  @r15+,r9
++	rts
++	 mov.l  @r15+,r8
++#endif
++.LFE1:
++.ffi_call_SYSV_end:
++        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
++
++.globl	ffi_closure_helper_SYSV
++
++ENTRY(ffi_closure_SYSV)
++.LFB2:
++	mov.l	r14,@-r15
++.LCFI7:
++	sts.l	pr,@-r15
++
++	/* Stack layout:	
++	   ...
++	   32 bytes (floating register parameters, SH-4 only)
++	   16 bytes (register parameters)
++	    4 bytes (result)
++	    4 bytes (5th arg)
++	   <- new stack pointer
++	*/
++.LCFI8:
++#if defined(__SH4__)
++	add	#-56,r15
++#else
++	add	#-24,r15
++#endif
++.LCFI9:
++	mov	r15,r14
++.LCFIA:
++	mov	r14,r1
++	add	#24,r1
++	mov.l	r7,@-r1
++	mov.l	r6,@-r1
++	mov.l	r5,@-r1
++	mov.l	r4,@-r1
++	mov	r1,r6
++
++#if defined(__SH4__)
++	mov	r14,r1
++	add	#56,r1
++#ifdef __LITTLE_ENDIAN__
++	fmov.s	fr10,@-r1
++	fmov.s	fr11,@-r1
++	fmov.s	fr8,@-r1
++	fmov.s	fr9,@-r1
++	fmov.s	fr6,@-r1
++	fmov.s	fr7,@-r1
++	fmov.s	fr4,@-r1
++	fmov.s	fr5,@-r1
++#else
++	fmov.s	fr11,@-r1
++	fmov.s	fr10,@-r1
++	fmov.s	fr9,@-r1
++	fmov.s	fr8,@-r1
++	fmov.s	fr7,@-r1
++	fmov.s	fr6,@-r1
++	fmov.s	fr5,@-r1
++	fmov.s	fr4,@-r1
++#endif
++	mov	r1,r7
++#endif
++
++	mov	r14,r1
++	add	#4,r1
++	mov	r1,r5
++
++	mov	r14,r1
++#if defined(__SH4__)
++	add	#64,r1
++#else
++	add	#32,r1
++#endif
++	mov.l	r1,@r14
++
++	mov.l	L_helper,r0
++	jsr	@r0
++	 mov	r3,r4
++
++	shll	r0
++	mov	r0,r1
++	mova	L_table,r0
++	add	r1,r0
++	mov.w	@r0,r0
++	mov	r14,r2
++	braf	r0
++	 add	#4,r2
++0:
++	.align 2
++L_helper:
++	.long	ffi_closure_helper_SYSV
++L_table:
++	.short L_case_v - 0b	/* FFI_TYPE_VOID */
++	.short L_case_i - 0b	/* FFI_TYPE_INT */
++#if defined(__SH4__)
++	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
++	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
++	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
++#else
++	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
++	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
++	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
++#endif
++	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
++	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
++	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
++	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
++	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
++	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
++	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
++	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
++	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
++	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
++
++#if defined(__SH4__)
++L_case_d:
++#ifdef __LITTLE_ENDIAN__
++	fmov.s	@r2+,fr1
++	bra	L_case_v
++	 fmov.s	@r2,fr0
++#else
++	fmov.s	@r2+,fr0
++	bra	L_case_v
++	 fmov.s	@r2,fr1
++#endif
++
++L_case_f:
++	bra	L_case_v
++	 fmov.s	@r2,fr0
++#endif
++	
++L_case_ll:
++	mov.l	@r2+,r0
++	bra	L_case_v
++	 mov.l	@r2,r1
++	
++L_case_i:
++	bra	L_case_v
++	 mov.l	@r2,r0
++	
++L_case_q:
++#ifdef __LITTLE_ENDIAN__
++#else
++	add	#3,r2
++#endif
++	bra	L_case_v
++	 mov.b	@r2,r0
++
++L_case_uq:
++#ifdef __LITTLE_ENDIAN__
++#else
++	add	#3,r2
++#endif
++	mov.b	@r2,r0
++	bra	L_case_v
++	 extu.b r0,r0
++
++L_case_h:
++#ifdef __LITTLE_ENDIAN__
++#else
++	add	#2,r2
++#endif
++	bra	L_case_v
++	 mov.w	@r2,r0
++
++L_case_uh:
++#ifdef __LITTLE_ENDIAN__
++#else
++	add	#2,r2
++#endif
++	mov.w	@r2,r0
++	extu.w	r0,r0
++	/* fall through */
++
++L_case_v:
++#if defined(__SH4__)
++	add	#56,r15
++#else
++	add	#24,r15
++#endif
++	lds.l	@r15+,pr
++	rts
++	 mov.l	@r15+,r14
++.LFE2:
++.ffi_closure_SYSV_end:
++        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
++
++	.section	".eh_frame","aw",@progbits
++__FRAME_BEGIN__:
++	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
++.LSCIE1:
++	.4byte	0x0	/* CIE Identifier Tag */
++	.byte	0x1	/* CIE Version */
++	.byte	0x0	/* CIE Augmentation */
++	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
++	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
++	.byte	0x11	/* CIE RA Column */
++	.byte	0xc	/* DW_CFA_def_cfa */
++	.byte	0xf	/* uleb128 0xf */
++	.byte	0x0	/* uleb128 0x0 */
++	.align	2
++.LECIE1:
++.LSFDE1:
++	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
++.LASFDE1:
++	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
++	.4byte	.LFB1	/* FDE initial location */
++	.4byte	.LFE1-.LFB1	 /* FDE address range */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI0-.LFB1
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x4	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI1-.LCFI0
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x8	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI2-.LCFI1
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0xc	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI3-.LCFI2
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x10	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI4-.LCFI3
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x14	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI5-.LCFI4
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x18	/* uleb128 0x4 */
++	.byte	0x91	/* DW_CFA_offset, column 0x11 */
++	.byte	0x6	/* uleb128 0x6 */
++	.byte	0x8e	/* DW_CFA_offset, column 0xe */
++	.byte	0x5	/* uleb128 0x5 */
++	.byte	0x8c	/* DW_CFA_offset, column 0xc */
++	.byte	0x4	/* uleb128 0x4 */
++	.byte	0x8a	/* DW_CFA_offset, column 0xa */
++	.byte	0x3	/* uleb128 0x3 */
++	.byte	0x89	/* DW_CFA_offset, column 0x9 */
++	.byte	0x2	/* uleb128 0x2 */
++	.byte	0x88	/* DW_CFA_offset, column 0x8 */
++	.byte	0x1	/* uleb128 0x1 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI6-.LCFI5
++	.byte	0xd	/* DW_CFA_def_cfa_register */
++	.byte	0xe	/* uleb128 0xe */
++	.align	2
++.LEFDE1:
++
++.LSFDE3:
++	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
++.LASFDE3:
++	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
++	.4byte	.LFB2	/* FDE initial location */
++	.4byte	.LFE2-.LFB2	 /* FDE address range */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI7-.LFB2
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x4	/* uleb128 0x4 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI8-.LCFI7
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++	.byte	0x8	/* uleb128 0x8 */
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFI9-.LCFI8
++	.byte	0xe	/* DW_CFA_def_cfa_offset */
++#if defined(__SH4__)
++	.byte	8+56	/* uleb128 8+56 */
++#else
++	.byte	8+24	/* uleb128 8+24 */
++#endif
++	.byte	0x91	/* DW_CFA_offset, column 0x11 */
++        .byte	0x2
++        .byte	0x8e	/* DW_CFA_offset, column 0xe */
++        .byte	0x1
++	.byte	0x4	/* DW_CFA_advance_loc4 */
++	.4byte	.LCFIA-.LCFI9
++	.byte	0xd	/* DW_CFA_def_cfa_register */
++	.byte	0xe	/* uleb128 0xe */
++	.align	2
++.LEFDE3:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c
+--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c	Sat Mar  3 07:21:23 2001
++++ gcc/libffi/src/sparc/ffi.c	Sat Jan  4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+-   ffi.c - Copyright (c) 1996 Cygnus Solutions
++   ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions
+    
+    Sparc Foreign Function Interface 
+ 
+@@ -28,20 +28,22 @@
+ 
+ #include <stdlib.h>
+ 
++#ifdef SPARC64
++extern void ffi_closure_v9(void);
++#else
++extern void ffi_closure_v8(void);
++#endif
++
+ /* ffi_prep_args is called by the assembly routine once stack space
+    has been allocated for the function's arguments */
+ 
+ void ffi_prep_args_v8(char *stack, extended_cif *ecif)
+ {
+   int i;
+-  int tmp;
+-  int avn;
+   void **p_argv;
+   char *argp;
+   ffi_type **p_arg;
+ 
+-  tmp = 0;
+-
+   /* Skip 16 words for the window save area */
+   argp = stack + 16*sizeof(int);
+ 
+@@ -66,18 +68,12 @@
+   ((int*)argp)[5] = 0;
+ #endif
+ 
+-  avn = ecif->cif->nargs;
+   p_argv = ecif->avalue;
+ 
+-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+-       i && avn;
+-       i--, p_arg++)
++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
+     {
+       size_t z;
+ 
+-      if (avn) 
+-	{
+-	  avn--;
+ 	  if ((*p_arg)->type == FFI_TYPE_STRUCT
+ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+ 	      || (*p_arg)->type == FFI_TYPE_LONGDOUBLE
+@@ -122,7 +118,6 @@
+ 	    }
+ 	  p_argv++;
+ 	  argp += z;
+-	}
+     }
+   
+   return;
+@@ -420,3 +415,101 @@
+     }
+ 
+ }
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++		  ffi_cif* cif,
++		  void (*fun)(ffi_cif*, void*, void**, void*),
++		  void *user_data)
++{
++  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
++  unsigned long fn;
++  unsigned long ctx = (unsigned long) closure;
++
++#ifdef SPARC64
++  /* Trampoline address is equal to the closure address.  We take advantage
++     of that to reduce the trampoline size by 8 bytes. */
++  FFI_ASSERT (cif->abi == FFI_V9);
++  fn = (unsigned long) ffi_closure_v9;
++  tramp[0] = 0x83414000;	/* rd	%pc, %g1	*/
++  tramp[1] = 0xca586010;	/* ldx	[%g1+16], %g5	*/
++  tramp[2] = 0x81c14000;	/* jmp	%g5		*/
++  tramp[3] = 0x01000000;	/* nop			*/
++  *((unsigned long *) &tramp[4]) = fn;
++#else
++  FFI_ASSERT (cif->abi == FFI_V8);
++  fn = (unsigned long) ffi_closure_v8;
++  tramp[0] = 0x03000000 | fn >> 10;	/* sethi %hi(fn), %g1	*/
++  tramp[1] = 0x05000000 | ctx >> 10;	/* sethi %hi(ctx), %g2	*/
++  tramp[2] = 0x81c06000 | (fn & 0x3ff);	/* jmp   %g1+%lo(fn)	*/
++  tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or    %g2, %lo(ctx)	*/
++#endif
++
++  closure->cif = cif;
++  closure->fun = fun;
++  closure->user_data = user_data;
++
++  /* Flush the Icache.  FIXME: alignment isn't certain, assume 8 bytes */
++#ifdef SPARC64
++  asm volatile ("flush	%0" : : "r" (closure) : "memory");
++  asm volatile ("flush	%0" : : "r" (((char *) closure) + 8) : "memory");
++#else
++  asm volatile ("iflush	%0" : : "r" (closure) : "memory");
++  asm volatile ("iflush	%0" : : "r" (((char *) closure) + 8) : "memory");
++#endif
++
++  return FFI_OK;
++}
++
++int
++ffi_closure_sparc_inner(ffi_closure *closure,
++  void *rvalue, unsigned long *gpr, double *fpr)
++{
++  ffi_cif *cif;
++  void **avalue;
++  ffi_type **arg_types;
++  int i, avn, argn;
++
++  cif = closure->cif;
++  avalue = alloca(cif->nargs * sizeof(void *));
++
++  argn = 0;
++
++  /* Copy the caller's structure return address to that the closure
++     returns the data directly to the caller.  */
++  if (cif->flags == FFI_TYPE_STRUCT)
++    {
++      rvalue = (void *) gpr[0];
++      argn = 1;
++    }
++
++  i = 0;
++  avn = cif->nargs;
++  arg_types = cif->arg_types;
++  
++  /* Grab the addresses of the arguments from the stack frame.  */
++  while (i < avn)
++    {
++      /* Assume big-endian.  FIXME */
++      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
++
++#ifdef SPARC64
++      if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT
++		 || arg_types[i]->type == FFI_TYPE_DOUBLE
++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
++		 || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
++#endif
++		))
++        avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
++      else
++#endif
++        avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
++      i++;
++    }
++
++  /* Invoke the closure.  */
++  (closure->fun) (cif, rvalue, avalue, closure->user_data);
++
++  /* Tell ffi_closure_sparc how to perform return type promotions.  */
++  return cif->rtype->type;
++}
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S
+--- gcc-3.2.2.orig/libffi/src/sparc/v8.S	Mon Apr 29 05:12:04 2002
++++ gcc/libffi/src/sparc/v8.S	Sat Jan  4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+-   v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
++   v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions
+    
+    Sparc Foreign Function Interface 
+ 
+@@ -94,6 +94,72 @@
+ .ffi_call_V8_end:
+ 	.size	ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
+ 
++
++#define	STACKFRAME	104	/* 16*4 register window +
++				   1*4 struct return +	
++				   6*4 args backing store +
++				   3*4 locals */
++
++/* ffi_closure_v8(...)
++
++   Receives the closure argument in %g2.   */
++
++	.text
++	.align 8
++	.globl ffi_closure_v8
++
++ffi_closure_v8:
++	.register	%g2, #scratch
++.LLFB2:
++	save	%sp, -STACKFRAME, %sp
++.LLCFI1:
++
++	! Store all of the potential argument registers in va_list format.
++	st	%i0, [%fp+68+0]
++	st	%i1, [%fp+68+4]
++	st	%i2, [%fp+68+8]
++	st	%i3, [%fp+68+12]
++	st	%i4, [%fp+68+16]
++	st	%i5, [%fp+68+20]
++
++	! Call ffi_closure_sparc_inner to do the bulk of the work.
++	mov	%g2, %o0
++	add	%fp, -8, %o1
++	add	%fp,  68, %o2
++	call	ffi_closure_sparc_inner
++	 mov	0, %o3
++
++	! Load up the return value in the proper type.
++	cmp	%o0, FFI_TYPE_VOID
++	be	done1
++
++	cmp	%o0, FFI_TYPE_FLOAT
++	be,a	done1
++	 ld	[%fp-8], %f0
++
++	cmp	%o0, FFI_TYPE_DOUBLE
++	be,a	done1
++	 ldd	[%fp-8], %f0
++
++	cmp	%o0, FFI_TYPE_SINT64
++	be,a	integer
++	 ld	[%fp-4], %i1
++
++	cmp	%o0, FFI_TYPE_UINT64
++	be,a	integer
++	 ld	[%fp-4], %i1
++
++integer:
++	ld	[%fp-8], %i0
++
++done1:
++	ret
++	 restore
++.LLFE2:
++
++.ffi_closure_v8_end:
++	.size	ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
++
+ #ifdef SPARC64
+ #define WS 8
+ #define nword	xword
+@@ -148,3 +214,26 @@
+ 	.byte	0x1f	! uleb128 0x1f
+ 	.align	WS
+ .LLEFDE1:
++.LLSFDE2:
++	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
++.LLASFDE2:
++	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
++#ifdef HAVE_AS_SPARC_UA_PCREL
++	.uaword	%r_disp32(.LLFB2)
++	.uaword	.LLFE2-.LLFB2	! FDE address range
++#else
++	.align	WS
++	.nword	.LLFB2
++	.uanword .LLFE2-.LLFB2	! FDE address range
++#endif
++	.byte	0x0	! uleb128 0x0; Augmentation size
++	.byte	0x4	! DW_CFA_advance_loc4
++	.uaword	.LLCFI1-.LLFB2
++	.byte	0xd	! DW_CFA_def_cfa_register
++	.byte	0x1e	! uleb128 0x1e
++	.byte	0x2d	! DW_CFA_GNU_window_save
++	.byte	0x9	! DW_CFA_register
++	.byte	0xf	! uleb128 0xf
++	.byte	0x1f	! uleb128 0x1f
++	.align	WS
++.LLEFDE2:
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S
+--- gcc-3.2.2.orig/libffi/src/sparc/v9.S	Mon Apr 29 05:12:04 2002
++++ gcc/libffi/src/sparc/v9.S	Sat Jan  4 08:08:56 2003
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+-   v9.S - Copyright (c) 2000 Cygnus Solutions
++   v9.S - Copyright (c) 2000, 2003 Cygnus Solutions
+    
+    Sparc 64bit Foreign Function Interface 
+ 
+@@ -99,7 +99,7 @@
+ 	cmp	%i3, FFI_TYPE_STRUCT
+ 	be,pn	%icc, dostruct
+ 
+-	 cmp	%i3, FFI_TYPE_LONGDOUBLE
++	cmp	%i3, FFI_TYPE_LONGDOUBLE
+ 	bne,pt	%icc, done
+ 	 nop
+ 	std	%f0, [%i4+0]
+@@ -125,6 +125,88 @@
+ .ffi_call_V9_end:
+ 	.size	ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
+ 
++
++#define	STACKFRAME	 240	/* 16*8 register window +
++				   6*8 args backing store +
++				   8*8 locals */
++#define	FP		%fp+STACK_BIAS
++
++/* ffi_closure_v9(...)
++
++   Receives the closure argument in %g1.   */
++
++	.text
++	.align 8
++	.globl ffi_closure_v9
++
++ffi_closure_v9:
++.LLFB2:
++	save	%sp, -STACKFRAME, %sp
++.LLCFI1:
++
++	! Store all of the potential argument registers in va_list format.
++	stx	%i0, [FP+128+0]
++	stx	%i1, [FP+128+8]
++	stx	%i2, [FP+128+16]
++	stx	%i3, [FP+128+24]
++	stx	%i4, [FP+128+32]
++	stx	%i5, [FP+128+40]
++
++	! Store possible floating point argument registers too.
++	std	%f0, [FP-48]
++	std	%f2, [FP-40]
++	std	%f4, [FP-32]
++	std	%f6, [FP-24]
++	std	%f8, [FP-16]
++	std	%f10, [FP-8]
++
++	! Call ffi_closure_sparc_inner to do the bulk of the work.
++	mov	%g1, %o0
++	add	%fp, STACK_BIAS-64, %o1
++	add	%fp, STACK_BIAS+128, %o2
++	call	ffi_closure_sparc_inner
++	 add	%fp, STACK_BIAS-48, %o3
++
++	! Load up the return value in the proper type.
++	cmp	%o0, FFI_TYPE_VOID
++	be,pn	%icc, done1
++
++	cmp	%o0, FFI_TYPE_FLOAT
++	be,a,pn	%icc, done1
++	 ld	[FP-64], %f0
++
++	cmp	%o0, FFI_TYPE_DOUBLE
++	be,a,pn	%icc, done1
++	 ldd	[FP-64], %f0
++
++	cmp	%o0, FFI_TYPE_LONGDOUBLE
++	be,a,pn	%icc, longdouble1
++	 ldd	[FP-64], %f0
++
++	cmp	%o0, FFI_TYPE_STRUCT
++	be,pn	%icc, struct1
++
++	! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER
++	ldx	[FP-64], %i0
++
++done1:
++	ret
++	 restore
++
++struct1:
++	ldx [FP-56], %i2
++	ret
++	 restore
++
++longdouble1:
++	ldd	[FP-56], %f2
++	ret
++	 restore
++.LLFE2:
++
++.ffi_closure_v9_end:
++	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
++
+ 	.section	".eh_frame",#alloc,#write
+ .LLframe1:
+ 	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
+@@ -169,5 +251,27 @@
+ 	.byte	0x1f	! uleb128 0x1f
+ 	.align 8
+ .LLEFDE1:
+-
++.LLSFDE2:
++	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
++.LLASFDE2:
++	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
++#ifdef HAVE_AS_SPARC_UA_PCREL
++	.uaword	%r_disp32(.LLFB2)
++	.uaword	.LLFE2-.LLFB2		! FDE address range
++#else
++	.align 8
++	.xword	.LLFB2
++	.uaxword	.LLFE2-.LLFB2	! FDE address range
++#endif
++	.byte	0x0	! uleb128 0x0; Augmentation size
++	.byte	0x4	! DW_CFA_advance_loc4
++	.uaword	.LLCFI1-.LLFB2
++	.byte	0xd	! DW_CFA_def_cfa_register
++	.byte	0x1e	! uleb128 0x1e
++	.byte	0x2d	! DW_CFA_GNU_window_save
++	.byte	0x9	! DW_CFA_register
++	.byte	0xf	! uleb128 0xf
++	.byte	0x1f	! uleb128 0x1f
++	.align 8
++.LLEFDE2:
+ #endif
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c
+--- gcc-3.2.2.orig/libffi/src/types.c	Tue Mar 27 11:39:16 2001
++++ gcc/libffi/src/types.c	Wed Nov 27 07:24:05 2002
+@@ -42,7 +42,8 @@
+ FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
+ FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
+ 
+-#if defined ALPHA || defined SPARC64
++#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \
++    || defined IA64
+ 
+ FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
+ 
+@@ -52,22 +53,12 @@
+ 
+ #endif
+ 
+-#ifdef X86
++#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K
+ 
+ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+ 
+-#elif defined X86_WIN32
+-
+-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+-
+-#elif defined ARM
+-
+-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+-
+-#elif defined M68K
++#elif defined SH
+ 
+ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
+ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
+@@ -80,12 +71,7 @@
+ #endif
+ 
+ 
+-#ifdef X86
+-
+-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
+-
+-#elif defined X86_WIN32
++#if defined X86 || defined X86_WIN32 || defined M68K
+ 
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
+@@ -95,25 +81,25 @@
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
+ 
+-#elif defined M68K
++#elif defined SH
+ 
+ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
+-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
+ 
+ #elif defined SPARC
+ 
+ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
+-
+ #ifdef SPARC64
+-
+ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
+-
+ #else
+-
+ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
+-
+ #endif
+ 
++#elif defined X86_64
++
++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
++
+ #else
+ 
+ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c
+--- gcc-3.2.2.orig/libffi/src/x86/ffi.c	Tue May 28 18:22:08 2002
++++ gcc/libffi/src/x86/ffi.c	Fri Dec  6 10:16:45 2002
+@@ -1,5 +1,8 @@
+ /* -----------------------------------------------------------------------
+-   ffi.c - Copyright (c) 1996, 1998, 1999  Cygnus Solutions
++   ffi.c - Copyright (c) 1996, 1998, 1999, 2001  Red Hat, Inc.
++           Copyright (c) 2002  Ranjit Mathew
++           Copyright (c) 2002  Bo Thorsen
++           Copyright (c) 2002  Roger Sayle
+    
+    x86 Foreign Function Interface 
+ 
+@@ -23,6 +26,8 @@
+    OTHER DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
++#ifndef __x86_64__
++
+ #include <ffi.h>
+ #include <ffi_common.h>
+ 
+@@ -36,12 +41,10 @@
+ /*@=exportheader@*/
+ {
+   register unsigned int i;
+-  register int tmp;
+   register void **p_argv;
+   register char *argp;
+   register ffi_type **p_arg;
+ 
+-  tmp = 0;
+   argp = stack;
+ 
+   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
+@@ -148,6 +151,18 @@
+ /*@=declundef@*/
+ /*@=exportheader@*/
+ 
++#ifdef X86_WIN32
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *),
++			  /*@out@*/ extended_cif *,
++			  unsigned, unsigned,
++			  /*@out@*/ unsigned *,
++			  void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++#endif /* X86_WIN32 */
++
+ void ffi_call(/*@dependent@*/ ffi_cif *cif, 
+ 	      void (*fn)(), 
+ 	      /*@out@*/ void *rvalue, 
+@@ -180,6 +195,14 @@
+ 		    cif->flags, ecif.rvalue, fn);
+       /*@=usedef@*/
+       break;
++#ifdef X86_WIN32
++    case FFI_STDCALL:
++      /*@-usedef@*/
++      ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
++		    cif->flags, ecif.rvalue, fn);
++      /*@=usedef@*/
++      break;
++#endif /* X86_WIN32 */
+     default:
+       FFI_ASSERT(0);
+       break;
+@@ -266,12 +289,10 @@
+ /*@=exportheader@*/
+ {
+   register unsigned int i;
+-  register int tmp;
+   register void **p_argv;
+   register char *argp;
+   register ffi_type **p_arg;
+ 
+-  tmp = 0;
+   argp = stack;
+ 
+   if ( cif->rtype->type == FFI_TYPE_STRUCT ) {
+@@ -281,13 +302,14 @@
+ 
+   p_argv = avalue;
+ 
+-  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
++  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+     {
+       size_t z;
+ 
+       /* Align if necessary */
+-      if (((*p_arg)->alignment - 1) & (unsigned) argp)
++      if (((*p_arg)->alignment - 1) & (unsigned) argp) {
+ 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
++      }
+ 
+       z = (*p_arg)->size;
+ 
+@@ -298,7 +320,7 @@
+       p_argv++;
+       argp += z;
+     }
+-
++  
+   return;
+ }
+ 
+@@ -449,6 +471,15 @@
+ 	      /*@out@*/ unsigned *, 
+ 	      void (*fn)());
+ 
++#ifdef X86_WIN32
++extern void
++ffi_call_STDCALL(void (*)(char *, extended_cif *),
++	      /*@out@*/ extended_cif *,
++	      unsigned, unsigned,
++	      /*@out@*/ unsigned *,
++	      void (*fn)());
++#endif /* X86_WIN32 */
++
+ void
+ ffi_raw_call(/*@dependent@*/ ffi_cif *cif, 
+ 	     void (*fn)(), 
+@@ -483,6 +514,14 @@
+ 		    cif->flags, ecif.rvalue, fn);
+       /*@=usedef@*/
+       break;
++#ifdef X86_WIN32
++    case FFI_STDCALL:
++      /*@-usedef@*/
++      ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes,
++		    cif->flags, ecif.rvalue, fn);
++      /*@=usedef@*/
++      break;
++#endif /* X86_WIN32 */
+     default:
+       FFI_ASSERT(0);
+       break;
+@@ -490,3 +529,5 @@
+ }
+ 
+ #endif
++
++#endif /* __x86_64__  */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c
+--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/x86/ffi64.c	Wed Jan 29 00:54:28 2003
+@@ -0,0 +1,706 @@
++/* -----------------------------------------------------------------------
++   ffi.c - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
++   
++   x86-64 Foreign Function Interface 
++
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++
++#include <ffi.h>
++#include <ffi_common.h>
++
++#include <stdlib.h>
++#include <stdarg.h>
++
++/* ffi_prep_args is called by the assembly routine once stack space
++   has been allocated for the function's arguments */
++
++#ifdef __x86_64__
++
++#define MAX_GPR_REGS 6
++#define MAX_SSE_REGS 8
++typedef struct
++{
++  /* Registers for argument passing.  */
++  long gpr[MAX_GPR_REGS];
++  __int128_t sse[MAX_SSE_REGS];
++
++  /* Stack space for arguments.  */
++  char argspace[0];
++} stackLayout;
++
++/* All reference to register classes here is identical to the code in
++   gcc/config/i386/i386.c. Do *not* change one without the other.  */
++
++/* Register class used for passing given 64bit part of the argument.
++   These represent classes as documented by the PS ABI, with the exception
++   of SSESF, SSEDF classes, that are basically SSE class, just gcc will
++   use SF or DFmode move instead of DImode to avoid reformating penalties.
++
++   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
++   whenever possible (upper half does contain padding).
++ */
++enum x86_64_reg_class
++  {
++    X86_64_NO_CLASS,
++    X86_64_INTEGER_CLASS,
++    X86_64_INTEGERSI_CLASS,
++    X86_64_SSE_CLASS,
++    X86_64_SSESF_CLASS,
++    X86_64_SSEDF_CLASS,
++    X86_64_SSEUP_CLASS,
++    X86_64_X87_CLASS,
++    X86_64_X87UP_CLASS,
++    X86_64_MEMORY_CLASS
++  };
++
++#define MAX_CLASSES 4
++
++/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
++   of this code is to classify each 8bytes of incoming argument by the register
++   class and assign registers accordingly.  */
++
++/* Return the union class of CLASS1 and CLASS2.
++   See the x86-64 PS ABI for details.  */
++
++static enum x86_64_reg_class
++merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
++{
++  /* Rule #1: If both classes are equal, this is the resulting class.  */
++  if (class1 == class2)
++    return class1;
++
++  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
++     the other class.  */
++  if (class1 == X86_64_NO_CLASS)
++    return class2;
++  if (class2 == X86_64_NO_CLASS)
++    return class1;
++
++  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
++  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
++    return X86_64_MEMORY_CLASS;
++
++  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
++  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
++      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
++    return X86_64_INTEGERSI_CLASS;
++  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
++      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
++    return X86_64_INTEGER_CLASS;
++
++  /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used.  */
++  if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
++      || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
++    return X86_64_MEMORY_CLASS;
++
++  /* Rule #6: Otherwise class SSE is used.  */
++  return X86_64_SSE_CLASS;
++}
++
++/* Classify the argument of type TYPE and mode MODE.
++   CLASSES will be filled by the register class used to pass each word
++   of the operand.  The number of words is returned.  In case the parameter
++   should be passed in memory, 0 is returned. As a special case for zero
++   sized containers, classes[0] will be NO_CLASS and 1 is returned.
++
++   See the x86-64 PS ABI for details.
++*/
++static int
++classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
++		   int *byte_offset)
++{
++  /* First, align to the right place.  */
++  *byte_offset = ALIGN(*byte_offset, type->alignment);
++
++  switch (type->type)
++    {
++    case FFI_TYPE_UINT8:
++    case FFI_TYPE_SINT8:
++    case FFI_TYPE_UINT16:
++    case FFI_TYPE_SINT16:
++    case FFI_TYPE_UINT32:
++    case FFI_TYPE_SINT32:
++    case FFI_TYPE_UINT64:
++    case FFI_TYPE_SINT64:
++    case FFI_TYPE_POINTER:
++      if (((*byte_offset) % 8 + type->size) <= 4)
++	classes[0] = X86_64_INTEGERSI_CLASS;
++      else
++	classes[0] = X86_64_INTEGER_CLASS;
++      return 1;
++    case FFI_TYPE_FLOAT:
++      if (((*byte_offset) % 8) == 0)
++	classes[0] = X86_64_SSESF_CLASS;
++      else
++	classes[0] = X86_64_SSE_CLASS;
++      return 1;
++    case FFI_TYPE_DOUBLE:
++      classes[0] = X86_64_SSEDF_CLASS;
++      return 1;
++    case FFI_TYPE_LONGDOUBLE:
++      classes[0] = X86_64_X87_CLASS;
++      classes[1] = X86_64_X87UP_CLASS;
++      return 2;
++    case FFI_TYPE_STRUCT:
++      {
++	const int UNITS_PER_WORD = 8;
++	int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
++	ffi_type **ptr; 
++	int i;
++	enum x86_64_reg_class subclasses[MAX_CLASSES];
++
++	/* If the struct is larger than 16 bytes, pass it on the stack.  */
++	if (type->size > 16)
++	  return 0;
++
++	for (i = 0; i < words; i++)
++	  classes[i] = X86_64_NO_CLASS;
++
++	/* Merge the fields of structure.  */
++	for (ptr=type->elements; (*ptr)!=NULL; ptr++)
++	  {
++	    int num;
++
++	    num = classify_argument (*ptr, subclasses, byte_offset);
++	    if (num == 0)
++	      return 0;
++	    for (i = 0; i < num; i++)
++	      {
++		int pos = *byte_offset / 8;
++		classes[i + pos] =
++		  merge_classes (subclasses[i], classes[i + pos]);
++	      }
++
++	    if ((*ptr)->type != FFI_TYPE_STRUCT)
++	      *byte_offset += (*ptr)->size;
++	  }
++
++	/* Final merger cleanup.  */
++	for (i = 0; i < words; i++)
++	  {
++	    /* If one class is MEMORY, everything should be passed in
++	       memory.  */
++	    if (classes[i] == X86_64_MEMORY_CLASS)
++	      return 0;
++
++	    /* The X86_64_SSEUP_CLASS should be always preceded by
++	       X86_64_SSE_CLASS.  */
++	    if (classes[i] == X86_64_SSEUP_CLASS
++		&& (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
++	      classes[i] = X86_64_SSE_CLASS;
++
++	    /*  X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS.  */
++	    if (classes[i] == X86_64_X87UP_CLASS
++		&& (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
++	      classes[i] = X86_64_SSE_CLASS;
++	  }
++	return words;
++      }
++
++    default:
++      FFI_ASSERT(0);
++    }
++  return 0; /* Never reached.  */
++}
++
++/* Examine the argument and return set number of register required in each
++   class.  Return 0 iff parameter should be passed in memory.  */
++static int
++examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs)
++{
++  enum x86_64_reg_class class[MAX_CLASSES];
++  int offset = 0;
++  int n;
++
++  n = classify_argument (type, class, &offset);
++
++  if (n == 0)
++    return 0;
++
++  *int_nregs = 0;
++  *sse_nregs = 0;
++  for (n--; n>=0; n--)
++    switch (class[n])
++      {
++      case X86_64_INTEGER_CLASS:
++      case X86_64_INTEGERSI_CLASS:
++	(*int_nregs)++;
++	break;
++      case X86_64_SSE_CLASS:
++      case X86_64_SSESF_CLASS:
++      case X86_64_SSEDF_CLASS:
++	(*sse_nregs)++;
++	break;
++      case X86_64_NO_CLASS:
++      case X86_64_SSEUP_CLASS:
++	break;
++      case X86_64_X87_CLASS:
++      case X86_64_X87UP_CLASS:
++	if (!in_return)
++	  return 0;
++	break;
++      default:
++	abort ();
++      }
++  return 1;
++}
++
++/* Functions to load floats and double to an SSE register placeholder.  */
++extern void float2sse (float, __int128_t *);
++extern void double2sse (double, __int128_t *);
++extern void floatfloat2sse (void *, __int128_t *);
++
++/* Functions to put the floats and doubles back.  */
++extern float sse2float (__int128_t *);
++extern double sse2double (__int128_t *);
++extern void sse2floatfloat(__int128_t *, void *);
++
++/*@-exportheader@*/
++void
++ffi_prep_args (stackLayout *stack, extended_cif *ecif)
++/*@=exportheader@*/
++{
++  int gprcount, ssecount, i, g, s;
++  void **p_argv;
++  void *argp = &stack->argspace;
++  ffi_type **p_arg;
++
++  /* First check if the return value should be passed in memory. If so,
++     pass the pointer as the first argument.  */
++  gprcount = ssecount = 0;
++  if (ecif->cif->rtype->type != FFI_TYPE_VOID 
++      && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0)
++    (void *)stack->gpr[gprcount++] = ecif->rvalue;
++
++  for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue;
++       i!=0; i--, p_arg++, p_argv++)
++    {
++      int in_register = 0;
++
++      switch ((*p_arg)->type)
++	{
++	case FFI_TYPE_SINT8:
++	case FFI_TYPE_SINT16:
++	case FFI_TYPE_SINT32:
++	case FFI_TYPE_SINT64:
++	case FFI_TYPE_UINT8:
++	case FFI_TYPE_UINT16:
++	case FFI_TYPE_UINT32:
++	case FFI_TYPE_UINT64:
++	case FFI_TYPE_POINTER:
++	  if (gprcount < MAX_GPR_REGS)
++	    {
++	      stack->gpr[gprcount] = 0;
++	      stack->gpr[gprcount++] = *(long long *)(*p_argv);
++	      in_register = 1;
++	    }
++	  break;
++
++	case FFI_TYPE_FLOAT:
++	  if (ssecount < MAX_SSE_REGS)
++	    {
++	      float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]);
++	      in_register = 1;
++	    }
++	  break;
++
++	case FFI_TYPE_DOUBLE:
++	  if (ssecount < MAX_SSE_REGS)
++	    {
++	      double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]);
++	      in_register = 1;
++	    }
++	  break;
++	}
++
++      if (in_register)
++	continue;
++
++      /* Either all places in registers where filled, or this is a
++	 type that potentially goes into a memory slot.  */
++      if (examine_argument (*p_arg, 0, &g, &s) == 0
++	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
++	{
++	  /* Pass this argument in memory.  */
++	  argp = (void *)ALIGN(argp, (*p_arg)->alignment);
++	  memcpy (argp, *p_argv, (*p_arg)->size);
++	  argp += (*p_arg)->size;
++	}
++      else
++	{
++	  /* All easy cases are eliminated. Now fire the big guns.  */
++
++	  enum x86_64_reg_class classes[MAX_CLASSES];
++	  int offset = 0, j, num;
++	  void *a;
++
++	  num = classify_argument (*p_arg, classes, &offset);
++	  for (j=0, a=*p_argv; j<num; j++, a+=8)
++	    {
++	      switch (classes[j])
++		{
++		case X86_64_INTEGER_CLASS:
++		case X86_64_INTEGERSI_CLASS:
++		  stack->gpr[gprcount++] = *(long long *)a;
++		  break;
++		case X86_64_SSE_CLASS:
++		  floatfloat2sse (a, &stack->sse[ssecount++]);
++		  break;
++		case X86_64_SSESF_CLASS:
++		  float2sse (*(float *)a, &stack->sse[ssecount++]);
++		  break;
++		case X86_64_SSEDF_CLASS:
++		  double2sse (*(double *)a, &stack->sse[ssecount++]);
++		  break;
++		default:
++		  abort();
++		}
++	    }
++	}
++    }
++}
++
++/* Perform machine dependent cif processing.  */
++ffi_status
++ffi_prep_cif_machdep (ffi_cif *cif)
++{
++  int gprcount, ssecount, i, g, s;
++
++  gprcount = ssecount = 0;
++
++  /* Reset the byte count. We handle this size estimation here.  */
++  cif->bytes = 0;
++
++  /* If the return value should be passed in memory, pass the pointer
++     as the first argument. The actual memory isn't allocated here.  */
++  if (cif->rtype->type != FFI_TYPE_VOID 
++      && examine_argument (cif->rtype, 1, &g, &s) == 0)
++    gprcount = 1;
++
++  /* Go over all arguments and determine the way they should be passed.
++     If it's in a register and there is space for it, let that be so. If
++     not, add it's size to the stack byte count.  */
++  for (i=0; i<cif->nargs; i++)
++    {
++      if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0
++	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
++	{
++	  /* This is passed in memory. First align to the basic type.  */
++	  cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment);
++
++	  /* Stack arguments are *always* at least 8 byte aligned.  */
++	  cif->bytes = ALIGN(cif->bytes, 8);
++
++	  /* Now add the size of this argument.  */
++	  cif->bytes += cif->arg_types[i]->size;
++	}
++      else
++	{
++	  gprcount += g;
++	  ssecount += s;
++	}
++    }
++
++  /* Set the flag for the closures return.  */
++    switch (cif->rtype->type)
++    {
++    case FFI_TYPE_VOID:
++    case FFI_TYPE_STRUCT:
++    case FFI_TYPE_SINT64:
++    case FFI_TYPE_FLOAT:
++    case FFI_TYPE_DOUBLE:
++    case FFI_TYPE_LONGDOUBLE:
++      cif->flags = (unsigned) cif->rtype->type;
++      break;
++
++    case FFI_TYPE_UINT64:
++      cif->flags = FFI_TYPE_SINT64;
++      break;
++
++    default:
++      cif->flags = FFI_TYPE_INT;
++      break;
++    }
++
++  return FFI_OK;
++}
++
++typedef struct
++{
++  long gpr[2];
++  __int128_t sse[2];
++  long double st0;
++} return_value;
++
++void
++ffi_fill_return_value (return_value *rv, extended_cif *ecif)
++{
++  enum x86_64_reg_class classes[MAX_CLASSES];
++  int i = 0, num;
++  long *gpr = rv->gpr;
++  __int128_t *sse = rv->sse;
++  signed char sc;
++  signed short ss;
++
++  /* This is needed because of the way x86-64 handles signed short
++     integers.  */
++  switch (ecif->cif->rtype->type)
++    {
++    case FFI_TYPE_SINT8:
++      sc = *(signed char *)gpr;
++      *(long long *)ecif->rvalue = (long long)sc;
++      return;
++    case FFI_TYPE_SINT16:
++      ss = *(signed short *)gpr;
++      *(long long *)ecif->rvalue = (long long)ss;
++      return;
++    default:
++      /* Just continue.  */
++      ;
++    }
++
++  num = classify_argument (ecif->cif->rtype, classes, &i);
++
++  if (num == 0)
++    /* Return in memory.  */
++    ecif->rvalue = (void *) rv->gpr[0];
++  else if (num == 2 && classes[0] == X86_64_X87_CLASS &&
++	classes[1] == X86_64_X87UP_CLASS)
++    /* This is a long double (this is easiest to handle this way instead
++       of an eightbyte at a time as in the loop below.  */
++    *((long double *)ecif->rvalue) = rv->st0;
++  else
++    {
++      void *a;
++
++      for (i=0, a=ecif->rvalue; i<num; i++, a+=8)
++	{
++	  switch (classes[i])
++	    {
++	    case X86_64_INTEGER_CLASS:
++	    case X86_64_INTEGERSI_CLASS:
++	      *(long long *)a = *gpr;
++	      gpr++;
++	      break;
++	    case X86_64_SSE_CLASS:
++	      sse2floatfloat (sse++, a);
++	      break;
++	    case X86_64_SSESF_CLASS:
++	      *(float *)a = sse2float (sse++);
++	      break;
++	    case X86_64_SSEDF_CLASS:
++	      *(double *)a = sse2double (sse++);
++	      break;
++	    default:
++	      abort();
++	    }
++	}
++    }
++}
++
++/*@-declundef@*/
++/*@-exportheader@*/
++extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *),
++			    void (*) (return_value *, extended_cif *),
++			    /*@out@*/ extended_cif *, 
++			    unsigned, /*@out@*/ unsigned *, void (*fn)());
++/*@=declundef@*/
++/*@=exportheader@*/
++
++void ffi_call(/*@dependent@*/ ffi_cif *cif, 
++	      void (*fn)(), 
++	      /*@out@*/ void *rvalue, 
++	      /*@dependent@*/ void **avalue)
++{
++  extended_cif ecif;
++  int dummy;
++
++  ecif.cif = cif;
++  ecif.avalue = avalue;
++  
++  /* If the return value is a struct and we don't have a return	*/
++  /* value address then we need to make one		        */
++
++  if ((rvalue == NULL) && 
++      (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0))
++    {
++      /*@-sysunrecog@*/
++      ecif.rvalue = alloca(cif->rtype->size);
++      /*@=sysunrecog@*/
++    }
++  else
++    ecif.rvalue = rvalue;
++    
++  /* Stack must always be 16byte aligned. Make it so.  */
++  cif->bytes = ALIGN(cif->bytes, 16);
++  
++  switch (cif->abi) 
++    {
++    case FFI_SYSV:
++      /* Calling 32bit code from 64bit is not possible  */
++      FFI_ASSERT(0);
++      break;
++
++    case FFI_UNIX64:
++      /*@-usedef@*/
++      ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif,
++		       cif->bytes, ecif.rvalue, fn);
++      /*@=usedef@*/
++      break;
++
++    default:
++      FFI_ASSERT(0);
++      break;
++    }
++}
++
++extern void ffi_closure_UNIX64(void);
++
++ffi_status
++ffi_prep_closure (ffi_closure* closure,
++		  ffi_cif* cif,
++		  void (*fun)(ffi_cif*, void*, void**, void*),
++		  void *user_data)
++{
++  volatile unsigned short *tramp;
++
++  /* FFI_ASSERT (cif->abi == FFI_OSF);  */
++
++  tramp = (volatile unsigned short *) &closure->tramp[0];
++  tramp[0] = 0xbb49;		/* mov <code>, %r11	*/
++  tramp[5] = 0xba49;		/* mov <data>, %r10	*/
++  tramp[10] = 0xff49;		/* jmp *%r11	*/
++  tramp[11] = 0x00e3;
++  *(void * volatile *) &tramp[1] = ffi_closure_UNIX64;
++  *(void * volatile *) &tramp[6] = closure;
++
++  closure->cif = cif;
++  closure->fun = fun;
++  closure->user_data = user_data;
++
++  return FFI_OK;
++}
++
++int
++ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp)
++{
++  ffi_cif *cif;
++  void **avalue;
++  ffi_type **arg_types;
++  long i, avn, argn;
++
++  cif = closure->cif;
++  avalue = alloca(cif->nargs * sizeof(void *));
++
++  argn = 0;
++
++  i = 0;
++  avn = cif->nargs;
++  arg_types = cif->arg_types;
++  
++  /* Grab the addresses of the arguments from the stack frame.  */
++  while (i < avn)
++    {
++      switch (arg_types[i]->type)
++	{
++	case FFI_TYPE_SINT8:
++	case FFI_TYPE_UINT8:
++	case FFI_TYPE_SINT16:
++	case FFI_TYPE_UINT16:
++	case FFI_TYPE_SINT32:
++	case FFI_TYPE_UINT32:
++	case FFI_TYPE_SINT64:
++	case FFI_TYPE_UINT64:
++	case FFI_TYPE_POINTER:
++	  {
++	    if (l->gp_offset > 48-8)
++	      {
++		avalue[i] = l->overflow_arg_area;
++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++	      }
++	    else
++	      {
++		avalue[i] = (char *)l->reg_save_area + l->gp_offset;
++		l->gp_offset += 8;
++	      }
++	  }
++	  break;
++
++	case FFI_TYPE_STRUCT:
++	  /* FIXME  */
++	  FFI_ASSERT(0);
++	  break;
++
++	case FFI_TYPE_DOUBLE:
++	  {
++	    if (l->fp_offset > 176-16)
++	      {
++		avalue[i] = l->overflow_arg_area;
++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++	      }
++	    else
++	      {
++		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
++		l->fp_offset += 16;
++	      }
++	  }
++#if DEBUG_FFI
++	  fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]);
++#endif
++	  break;
++	  
++	case FFI_TYPE_FLOAT:
++	  {
++	    if (l->fp_offset > 176-16)
++	      {
++		avalue[i] = l->overflow_arg_area;
++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
++	      }
++	    else
++	      {
++		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
++		l->fp_offset += 16;
++	      }
++	  }
++#if DEBUG_FFI
++	  fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]);
++#endif
++	  break;
++	  
++	default:
++	  FFI_ASSERT(0);
++	}
++
++      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
++      i++;
++    }
++
++  /* Invoke the closure.  */
++  (closure->fun) (cif, rp, avalue, closure->user_data);
++
++  /* FIXME: Structs not supported.  */
++  FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT);
++
++  /* Tell ffi_closure_UNIX64 how to perform return type promotions.  */
++
++  return cif->rtype->type;
++}
++#endif /* ifndef __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S
+--- gcc-3.2.2.orig/libffi/src/x86/sysv.S	Tue Jul 17 02:10:53 2001
++++ gcc/libffi/src/x86/sysv.S	Fri Jul 19 08:08:31 2002
+@@ -1,5 +1,5 @@
+ /* -----------------------------------------------------------------------
+-   sysv.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
++   sysv.S - Copyright (c) 1996, 1998, 2001, 2002  Cygnus Solutions
+    
+    X86 Foreign Function Interface 
+ 
+@@ -23,6 +23,8 @@
+    OTHER DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
++#ifndef __x86_64__
++
+ #define LIBFFI_ASM	
+ #include <ffi.h>
+ 
+@@ -163,3 +165,5 @@
+ 	.align 4
+ .LEFDE1:
+ 	.set	.LLFDE1,.LEFDE1-.LSFDE1
++
++#endif /* ifndef __x86_64__ */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S
+--- gcc-3.2.2.orig/libffi/src/x86/unix64.S	Thu Jan  1 09:00:00 1970
++++ gcc/libffi/src/x86/unix64.S	Wed Jan 29 00:54:28 2003
+@@ -0,0 +1,302 @@
++/* -----------------------------------------------------------------------
++   unix64.S - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
++
++   x86-64 Foreign Function Interface 
++
++   Permission is hereby granted, free of charge, to any person obtaining
++   a copy of this software and associated documentation files (the
++   ``Software''), to deal in the Software without restriction, including
++   without limitation the rights to use, copy, modify, merge, publish,
++   distribute, sublicense, and/or sell copies of the Software, and to
++   permit persons to whom the Software is furnished to do so, subject to
++   the following conditions:
++
++   The above copyright notice and this permission notice shall be included
++   in all copies or substantial portions of the Software.
++
++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++   OTHER DEALINGS IN THE SOFTWARE.
++   ----------------------------------------------------------------------- */
++
++#ifdef __x86_64__
++#define LIBFFI_ASM	
++#include <ffi.h>
++
++	.section	.rodata
++.LC0:
++	.string	"asm in progress %lld\n"
++.LC1:
++	.string	"asm in progress\n"
++.text
++	.align	2
++.globl ffi_call_UNIX64
++        .type	ffi_call_UNIX64,@function
++
++ffi_call_UNIX64:
++.LFB1:
++        pushq	%rbp
++.LCFI0:
++        movq	%rsp, %rbp
++.LCFI1:
++	/* Save all arguments */
++	subq	$48, %rsp
++.LCFI2:
++	movq	%rdi, -8(%rbp)		/* ffi_prep_args	 */
++	movq	%rsi, -16(%rbp)		/* ffi_fill_return_value */
++	movq	%rdx, -24(%rbp)		/* ecif			 */
++	movq	%rcx, -32(%rbp)		/* cif->bytes		 */
++	movq	%r8, -40(%rbp)		/* ecif.rvalue		 */
++	movq	%r9, -48(%rbp)		/* fn			 */
++
++	/* Make room for all of the new args and the register args */
++	addl	$176, %ecx
++.LCFI3:
++	subq	%rcx, %rsp
++.LCFI4:
++	/* Setup the call to ffi_prep_args.  */
++	movq	%rdi, %rax		/* &ffi_prep_args	*/
++	movq	%rsp, %rdi		/* stackLayout		*/
++	movq	%rdx, %rsi		/* ecif			*/
++	call	*%rax			/* ffi_prep_args(stackLayout, ecif);*/ 
++
++	/* ffi_prep_args have put all the register contents into the  */
++	/* stackLayout struct. Now put the register values in place.  */
++	movq	(%rsp), %rdi
++	movq	8(%rsp), %rsi
++	movq	16(%rsp), %rdx
++	movq	24(%rsp), %rcx
++	movq	32(%rsp), %r8
++	movq	40(%rsp), %r9
++	movaps	48(%rsp), %xmm0
++	movaps	64(%rsp), %xmm1
++	movaps	80(%rsp), %xmm2
++	movaps	96(%rsp), %xmm3
++	movaps	112(%rsp), %xmm4
++	movaps	128(%rsp), %xmm5
++	movaps	144(%rsp), %xmm6
++	movaps	160(%rsp), %xmm7
++
++	/* Remove space for stackLayout so stack arguments are placed
++	   correctly for the call.  */
++.LCFI5:
++	addq	$176, %rsp
++.LCFI6:
++	/* Call the user function.  */
++	call	*-48(%rbp)
++
++	/* Make stack space for the return_value struct.  */
++	subq	$64, %rsp
++
++	/* Fill in all potential return values to this struct.  */
++	movq	%rax, (%rsp)
++	movq	%rdx, 8(%rsp)
++	movaps	%xmm0, 16(%rsp)
++	movaps	%xmm1, 32(%rsp)
++	fstpt	48(%rsp)
++
++	/* Now call ffi_fill_return_value.  */
++	movq	%rsp, %rdi		/* struct return_value	  */
++	movq	-24(%rbp), %rsi		/* ecif			  */
++	movq	-16(%rbp), %rax		/* &ffi_fill_return_value */
++	call	*%rax			/* call it		  */
++
++	/* And the work is done.  */
++        leave
++        ret
++.LFE1:
++.ffi_call_UNIX64_end:
++        .size    ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64
++
++.text
++	.align	2
++.globl float2sse
++        .type	float2sse,@function
++float2sse:
++	/* Save the contents of this sse-float in a pointer.  */
++	movaps	%xmm0, (%rdi)
++	ret
++
++	.align	2
++.globl floatfloat2sse
++        .type	floatfloat2sse,@function
++floatfloat2sse:
++	/* Save the contents of these two sse-floats in a pointer.  */
++	movq	(%rdi), %xmm0
++	movaps	%xmm0, (%rsi)
++	ret
++
++	.align	2
++.globl double2sse
++        .type	double2sse,@function
++double2sse:
++	/* Save the contents of this sse-double in a pointer.  */
++	movaps	%xmm0, (%rdi)
++	ret
++
++	.align	2
++.globl sse2float
++        .type	sse2float,@function
++sse2float:
++	/* Save the contents of this sse-float in a pointer.  */
++	movaps	(%rdi), %xmm0
++	ret
++
++	.align	2
++.globl sse2double
++        .type	sse2double,@function
++sse2double:
++	/* Save the contents of this pointer in a sse-double.  */
++	movaps	(%rdi), %xmm0
++	ret
++
++	.align	2
++.globl sse2floatfloat
++        .type	sse2floatfloat,@function
++sse2floatfloat:
++	/* Save the contents of this pointer in two sse-floats.  */
++	movaps	(%rdi), %xmm0
++	movq	%xmm0, (%rsi)
++	ret
++
++	.align	2
++.globl ffi_closure_UNIX64
++        .type	ffi_closure_UNIX64,@function
++
++ffi_closure_UNIX64:
++.LFB2:
++        pushq   %rbp
++.LCFI10:
++        movq    %rsp, %rbp
++.LCFI11:
++        subq    $240, %rsp
++.LCFI12:
++	movq	%rdi, -176(%rbp)
++        movq    %rsi, -168(%rbp)
++        movq    %rdx, -160(%rbp)
++        movq    %rcx, -152(%rbp)
++        movq    %r8, -144(%rbp)
++        movq    %r9, -136(%rbp)
++        /* FIXME: We can avoid all this stashing of XMM registers by
++	   (in ffi_prep_closure) computing the number of
++	   floating-point args and moving it into %rax before calling
++	   this function.  Once this is done, uncomment the next few
++	   lines and only the essential XMM registers will be written
++	   to memory.  This is a significant saving.  */
++/*         movzbl  %al, %eax  */
++/*         movq    %rax, %rdx */
++/*         leaq    0(,%rdx,4), %rax */
++/*         leaq    2f(%rip), %rdx */
++/*         subq    %rax, %rdx */
++        leaq    -1(%rbp), %rax
++/*         jmp     *%rdx */
++        movaps  %xmm7, -15(%rax)
++        movaps  %xmm6, -31(%rax)
++        movaps  %xmm5, -47(%rax)
++        movaps  %xmm4, -63(%rax)
++        movaps  %xmm3, -79(%rax)
++        movaps  %xmm2, -95(%rax)
++        movaps  %xmm1, -111(%rax)
++        movaps  %xmm0, -127(%rax)
++2:
++        movl    %edi, -180(%rbp)
++        movl    $0, -224(%rbp)
++        movl    $48, -220(%rbp)
++        leaq    16(%rbp), %rax
++        movq    %rax, -216(%rbp)
++        leaq    -176(%rbp), %rdx
++        movq    %rdx, -208(%rbp)
++        leaq    -224(%rbp), %rsi
++	movq	%r10, %rdi
++	movq	%rsp, %rdx
++        call    ffi_closure_UNIX64_inner@PLT
++
++	cmpl	$FFI_TYPE_FLOAT, %eax
++	je	1f
++	cmpl	$FFI_TYPE_DOUBLE, %eax
++	je	2f
++	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
++	je	3f
++	cmpl	$FFI_TYPE_STRUCT, %eax
++	je	4f
++	popq	%rax
++        leave
++        ret
++1:
++2:
++3:	
++	movaps	-240(%rbp), %xmm0
++        leave
++        ret
++4:
++	leave
++	ret
++.LFE2:	
++		
++        .section        .eh_frame,"a",@progbits
++.Lframe0:
++        .long   .LECIE1-.LSCIE1
++.LSCIE1:
++        .long   0x0
++        .byte   0x1
++        .string "zR"
++        .uleb128 0x1
++        .sleb128 -8
++        .byte   0x10
++        .uleb128 0x1
++        .byte   0x1b
++        .byte   0xc
++        .uleb128 0x7
++        .uleb128 0x8
++        .byte   0x90
++        .uleb128 0x1
++        .align 8
++.LECIE1:
++.LSFDE1:
++	.long	.LEFDE1-.LASFDE1
++.LASFDE1:
++        .long   .LASFDE1-.Lframe0
++
++        .long   .LFB1-.
++        .long   .LFE1-.LFB1
++        .uleb128 0x0
++        .byte   0x4		# DW_CFA_advance_loc4
++        .long   .LCFI0-.LFB1
++        .byte   0xe		# DW_CFA_def_cfa_offset
++        .uleb128 0x10
++        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
++        .uleb128 0x2
++        .byte   0x4		# DW_CFA_advance_loc4
++        .long   .LCFI1-.LCFI0
++        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
++        .uleb128 0x2
++        .byte   0xd		# DW_CFA_def_cfa_reg: r6
++        .uleb128 0x6
++	.align 8
++.LEFDE1:
++.LSFDE3:
++        .long   .LEFDE3-.LASFDE3        # FDE Length
++.LASFDE3:
++        .long   .LASFDE3-.Lframe0       # FDE CIE offset
++
++        .long   .LFB2-. # FDE initial location
++        .long   .LFE2-.LFB2     # FDE address range
++        .uleb128 0x0    # Augmentation size
++        .byte   0x4     # DW_CFA_advance_loc4
++        .long   .LCFI10-.LFB2
++        .byte   0xe     # DW_CFA_def_cfa_offset
++        .uleb128 0x10
++        .byte   0x86    # DW_CFA_offset, column 0x6
++        .uleb128 0x2
++        .byte   0x4     # DW_CFA_advance_loc4
++        .long   .LCFI11-.LCFI10
++        .byte   0xd     # DW_CFA_def_cfa_register
++        .uleb128 0x6
++        .align 8
++.LEFDE3:
++
++#endif /* __x86_64__  */
+diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S
+--- gcc-3.2.2.orig/libffi/src/x86/win32.S	Tue Mar 27 11:39:16 2001
++++ gcc/libffi/src/x86/win32.S	Fri Dec  6 10:16:45 2002
+@@ -1,5 +1,8 @@
+ /* -----------------------------------------------------------------------
+-   win32.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
++   win32.S - Copyright (c) 1996, 1998, 2001, 2002  Red Hat, Inc.
++	     Copyright (c) 2001  John Beniton
++	     Copyright (c) 2002  Ranjit Mathew
++			
+  
+    X86 Foreign Function Interface
+  
+@@ -52,7 +55,10 @@
+         # Return stack to previous state and call the function
+         addl  $8,%esp
+  
+-        call  *28(%ebp)
++        # FIXME: Align the stack to a 128-bit boundary to avoid
++        # potential performance hits.
++
++	call  *28(%ebp)
+  
+         # Remove the space we pushed for the args
+         movl  16(%ebp),%ecx
+@@ -123,3 +129,98 @@
+         ret
+  
+ .ffi_call_SYSV_end:
++
++        # This assumes we are using gas.
++        .balign 16
++.globl _ffi_call_STDCALL
++
++_ffi_call_STDCALL:
++        pushl %ebp
++        movl  %esp,%ebp
++
++        # Make room for all of the new args.
++        movl  16(%ebp),%ecx 
++        subl  %ecx,%esp
++
++        movl  %esp,%eax
++
++        # Place all of the ffi_prep_args in position
++        pushl 12(%ebp)
++        pushl %eax
++        call  *8(%ebp)
++
++        # Return stack to previous state and call the function
++        addl  $8,%esp
++
++        # FIXME: Align the stack to a 128-bit boundary to avoid
++        # potential performance hits.
++
++        call  *28(%ebp)
++
++        # stdcall functions pop arguments off the stack themselves
++
++        # Load %ecx with the return type code
++        movl  20(%ebp),%ecx
++
++        # If the return value pointer is NULL, assume no return value.
++        cmpl  $0,24(%ebp)
++        jne   sc_retint
++
++        # Even if there is no space for the return value, we are
++        # obliged to handle floating-point values.
++        cmpl  $FFI_TYPE_FLOAT,%ecx
++        jne   sc_noretval
++        fstp  %st(0)
++
++        jmp   sc_epilogue
++
++sc_retint:
++        cmpl  $FFI_TYPE_INT,%ecx
++        jne   sc_retfloat
++        # Load %ecx with the pointer to storage for the return value
++        movl  24(%ebp),%ecx
++        movl  %eax,0(%ecx)
++        jmp   sc_epilogue
++
++sc_retfloat:
++        cmpl  $FFI_TYPE_FLOAT,%ecx
++        jne   sc_retdouble
++         # Load %ecx with the pointer to storage for the return value
++        movl  24(%ebp),%ecx
++        fstps (%ecx)
++        jmp   sc_epilogue
++
++sc_retdouble:
++        cmpl  $FFI_TYPE_DOUBLE,%ecx
++        jne   sc_retlongdouble
++        # Load %ecx with the pointer to storage for the return value
++        movl  24(%ebp),%ecx
++        fstpl (%ecx)
++        jmp   sc_epilogue
++
++sc_retlongdouble:
++        cmpl  $FFI_TYPE_LONGDOUBLE,%ecx
++        jne   sc_retint64
++        # Load %ecx with the pointer to storage for the return value
++        movl  24(%ebp),%ecx
++        fstpt (%ecx)
++        jmp   sc_epilogue
++
++sc_retint64:
++        cmpl  $FFI_TYPE_SINT64,%ecx
++        jne   sc_retstruct
++        # Load %ecx with the pointer to storage for the return value
++        movl  24(%ebp),%ecx
++        movl  %eax,0(%ecx)
++        movl  %edx,4(%ecx)
++
++sc_retstruct:
++        # Nothing to do!
++
++sc_noretval:
++sc_epilogue:
++        movl %ebp,%esp
++        popl %ebp
++        ret
++
++.ffi_call_STDCALL_end:
+--- gcc-3.2.2.orig/libjava/configure.host	Mon Jun 10 13:15:26 2002
++++ gcc-3.2.2/libjava/configure.host	Sat Feb 15 19:57:25 2003
+@@ -115,6 +115,12 @@
+ 	enable_getenv_properties_default=no
+ 	enable_main_args_default=no
+ 	;;
++  sh-* | sh[34]*-*)
++	sysdeps_dir=sh
++	libgcj_flags="${libgcj_flags} -mieee"
++	libgcj_interpreter=yes
++	enable_hash_synchronization_default=yes
++	;;
+ esac
+ 
+ # This case statement supports generic port properties and may refine
+@@ -126,7 +132,8 @@
+   powerpc*-linux* | \
+   alpha*-linux* | \
+   sparc*-linux* | \
+-  ia64-*)
++  ia64-* | \
++  sh-linux* | sh[34]*-linux*)
+   	can_unwind_signal=yes
+ 	;;
+   *-*-darwin*)
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch
new file mode 100644
index 00000000..e0ccd9f1
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch
@@ -0,0 +1,54 @@
+Based on gcc-3.4.0/gcc-3.3.3h-ppc-asm-spec.patch
+
+Fixes the following errors when building gcc for ppc7450:
+
+/tmp/ccYph3gd.s: Assembler messages:
+/tmp/ccYph3gd.s:3823: Error: Unrecognized opcode: `mfvrsave'
+/tmp/ccYph3gd.s:3857: Error: Unrecognized opcode: `stvx'
+/tmp/ccYph3gd.s:4026: Error: Unrecognized opcode: `lvx'
+/tmp/ccYph3gd.s:4027: Error: Unrecognized opcode: `mtvrsave'
+make[2]: *** [libgcc/./unwind-dw2.o] Error 1
+make[2]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc'
+make[1]: *** [stmp-multilib] Error 2
+make[1]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc'
+make: *** [all-gcc] Error 2
+
+Note that the "-mcpu=7450" option must appear on the "gcc" command line in
+order for "-maltivec" to be passed to the assembler.  Or, "-maltivec" itself
+may be passed to the "gcc" command.
+
+Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil>
+
+===================================================================
+--- gcc-3.2.3/gcc/config/rs6000/rs6000.h~	2003-03-29 07:39:20.000000000 -0500
++++ gcc-3.2.3/gcc/config/rs6000/rs6000.h	2004-08-23 16:33:21.000000000 -0400
+@@ -77,8 +77,8 @@
+ %{mcpu=604e: -D_ARCH_PPC} \
+ %{mcpu=620: -D_ARCH_PPC} \
+ %{mcpu=740: -D_ARCH_PPC} \
+-%{mcpu=7400: -D_ARCH_PPC} \
+-%{mcpu=7450: -D_ARCH_PPC} \
++%{mcpu=7400: -D_ARCH_PPC -D__ALTIVEC__} \
++%{mcpu=7450: -D_ARCH_PPC -D__ALTIVEC__} \
+ %{mcpu=750: -D_ARCH_PPC} \
+ %{mcpu=801: -D_ARCH_PPC} \
+ %{mcpu=821: -D_ARCH_PPC} \
+@@ -117,14 +117,15 @@
+ %{mcpu=604e: -mppc} \
+ %{mcpu=620: -mppc} \
+ %{mcpu=740: -mppc} \
+-%{mcpu=7400: -mppc} \
+-%{mcpu=7450: -mppc} \
++%{mcpu=7400: -mppc -maltivec} \
++%{mcpu=7450: -mppc -maltivec} \
+ %{mcpu=750: -mppc} \
+ %{mcpu=801: -mppc} \
+ %{mcpu=821: -mppc} \
+ %{mcpu=823: -mppc} \
+ %{mcpu=860: -mppc} \
+-%{maltivec: -maltivec}"
++%{maltivec: -maltivec} \
++-many"
+ 
+ #define CPP_DEFAULT_SPEC ""
+ 
diff --git a/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch
new file mode 100644
index 00000000..4751e9da
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch
@@ -0,0 +1,45 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+#
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.2.3-orig/configure gcc-3.2.3/configure
+--- gcc-3.2.3-orig/configure	2002-06-24 18:14:28.000000000 +0200
++++ gcc-3.2.3/configure	2005-04-20 18:42:49.000000000 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -rf Makefile* ${tmpdir}
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1615,7 +1615,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch
new file mode 100644
index 00000000..aafc1306
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch
@@ -0,0 +1,54 @@
+Without this patch, the command
+
+RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3
+
+fails in two ways:
+1. the -L option meant to locate the testsuite directory is incorrect, and
+2. the wrong compiler is invoked, causing all sorts of havoc, not least of which
+is the native compiler is invoked when we really wanted to invoke the cross-compiler
+we just built.
+
+Here's an example log of the problem in action.  Every testcase fails, this shows just one:
+-------------
+Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc   -g -O2 -DDEBUG_ASSERT  -L/testsuite -lv3test -lm  -o ./binders.exe
+compiler exited with status 1
+output is:
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83:   instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M
+/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43:   instantiated from here^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M
+...
+FAIL: 20_util/binders.cc (test for excess errors)
+WARNING: 20_util/binders.cc compilation failed to produce executable
+-------------
+
+And here's the patch.  I'm not happy with it, and it probably gets some cases wrong,
+but it seems to work for the common native case and for my cross-compiler case.
+
+--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old	Sun Jul 13 10:42:01 2003
++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp	Sun Jul 13 11:39:54 2003
+@@ -46,8 +46,23 @@
+     global gluefile wrap_flags
+     global ld_library_path
+     global tool_root_dir
++    global target_triplet
+ 
+     set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++    if { $blddir == "" } {
++        set multilibs [get_multilibs]
++        # FIXME: assume multilib only one level deep
++        set multisub [file tail $multilibs]
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++        set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++        set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++         error "Can't find libstdc++-v3"
++    }
+ 
+     # By default, we assume we want to run program images.
+     global dg-do-what-default
diff --git a/patches/gcc/3.2.3/gcc-sh-linux.spec b/patches/gcc/3.2.3/gcc-sh-linux.spec
new file mode 100644
index 00000000..d647bb27
--- /dev/null
+++ b/patches/gcc/3.2.3/gcc-sh-linux.spec
@@ -0,0 +1,739 @@
+Summary: The GNU Compiler Collection for SuperH.
+%define GCC_VERSION 3.2.3
+%define arch_list sh3-linux sh3eb-linux sh4-linux sh4eb-linux
+%define TARGET_LIBSTDC 1
+%define TARGET_JAVA 1
+
+Name: gcc
+Version: 3.2.3
+Release: 3
+
+Copyright: GPL
+Group: Development/Languages
+Source0: gcc-%{GCC_VERSION}.tar.bz2
+Patch1: gcc-20030210-sh-linux-1.patch
+Patch2: gcc-3.2.3-libffi-1.patch
+Patch3: gcc-3.2.3-sh-linux-dwarf2-1.patch
+Buildroot: /var/tmp/gcc-%{_target}-root
+ExclusiveArch: i386 sh3 sh3eb sh4 sh4eb
+
+%description
+This package contains the GNU Compiler Collection: gcc and g++.
+You'll need this package in order to compile C/C++ code.
+
+%ifarch i386
+
+# ==================== Cross Compiler ===============================
+
+%package sh-linux
+Summary: The GNU Compiler Collection for sh-linux.
+Group: Development/Languages
+Requires: binutils-sh-linux >= 2.13.2
+Provides: gcc-sh-linux
+Obsoletes: gcc-sh3-linux gcc-sh3eb-linux gcc-sh4-linux gcc-sh4eb-linux
+Obsoletes: gcc-sh3-linux-c++ gcc-sh3eb-linux-c++ gcc-sh4-linux-c++ gcc-sh4eb-linux-c++
+Obsoletes: libstdc++-sh3-linux libstdc++-sh3eb-linux libstdc++-sh4-linux libstdc++-sh4eb-linux
+AutoReqProv: no
+
+%description sh-linux
+The gcc-sh-linux package contains GNU Compiler Collection: gcc g++ and libstdc++-v3.
+
+It includes support for most of the current C++ specification, including templates and
+exception handling. It does also include the standard C++ library and C++ header files.
+You'll need this package in order to cross compile C/C++ code for sh-linux.
+
+%package -n libgcj-sh-linux
+Summary: Header files and libraries for sh-linux Java development.
+Group: Development/Libraries
+Requires: gcc-sh-linux = %{version}-%{release}
+AutoReqProv: no
+
+%description -n libgcj-sh-linux
+The Java static libraries and C header files. You will need this
+package to compile your Java programs for sh-linux using the gcc Java compiler (gcj).
+
+%else
+# =========================== Native Compiler =================================
+%package libgcc
+Summary: runtime libraries for the GNU Compiler Collection.
+Group: System Environment/Libraries
+
+%description libgcc
+This package contains libgcc shared libraries for the GNU C Compiler Collection.
+You'll need this package in order to execute C,C++,JAVA code
+that uses shared libgcc.
+
+%package c++
+Summary: C++ support for gcc
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}
+
+%description c++
+This package adds C++ support to the GNU Compiler Collection. It includes
+support for most of the current C++ specification, including templates and
+exception handling. It does include the static standard C++
+library and C++ header files; the library for dynamically linking
+programs is available separately.
+
+%package -n libstdc++
+Summary: GNU c++ library.
+Group: System Environment/Libraries
+
+%description -n libstdc++
+The libstdc++ package contains a snapshot of the GCC Standard C++
+Library v3, an ongoing project to implement the ISO 14882 Standard C++
+library.
+
+%package -n libstdc++-devel
+Summary: Header files and libraries for C++ development
+Group: Development/Libraries
+Requires: libstdc++ = %{version}-%{release}, gcc-c++ = %{version}-%{release}
+
+%description -n libstdc++-devel
+This is the GNU implementation of the standard C++ libraries.  This
+package includes the header files and libraries needed for C++
+development. This includes SGI's implementation of the STL.
+
+%package java
+Summary: Java support for gcc
+Group: Development/Languages
+Requires: gcc = %{version}-%{release}, libgcj = %{version}-%{release}, libgcj-devel = %{version}-%{release}
+
+%description java
+This package adds experimental support for compiling Java(tm) programs and
+bytecode into native code. To use this you will also need the libgcj and
+libgcj-devel packages.
+
+%package -n libgcj
+Summary: Java runtime library for gcc.
+Group: System Environment/Libraries
+
+%description -n libgcj
+The Java runtime library. You will need this package to run your Java
+programs compiled using the gcc Java compiler (gcj).
+
+%package -n libgcj-devel
+Summary: Header files and libraries for Java development.
+Group: Development/Libraries
+Requires: libgcj = %{version}-%{release}
+
+%description -n libgcj-devel
+The Java static libraries and C header files. You will need this
+package to compile your Java programs using the gcc Java compiler (gcj).
+
+%endif
+
+%prep
+%setup -q -n gcc-%{GCC_VERSION}
+%patch1 -p1
+%patch2 -p1
+##%patch3 -p1
+
+%build
+%ifarch i386
+# build cross compiler for i386-linux host
+for arch in sh-linux; do
+  rm -rf ${arch}
+  mkdir ${arch}
+
+  CONFIG_ARGS="\
+        --prefix=%{_prefix} \
+        --mandir=%{_mandir} \
+        --infodir=%{_infodir} \
+        --target=${arch} \
+        --host=%{_host} \
+        --build=%{_build} \
+        --enable-languages=c,c++,java \
+        --with-system-zlib \
+        --with-gxx-include-dir=%{_prefix}/${arch}/include/g++-v3 \
+        --includedir=%{_prefix}/${arch}/include \
+	--disable-checking \
+	--disable-shared \
+	--enable-__cxa_atexit \
+	--enable-c99 \
+        --enable-threads=posix \
+        --enable-long-long"
+  if [ %{TARGET_JAVA} -ne 0 ]; then
+    CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj"
+  fi
+  (  cd $arch
+     ../configure ${CONFIG_ARGS}
+  )
+  if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then
+    sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$
+    mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile
+  fi
+  make all-gcc -C ${arch}
+
+  if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+    CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`"
+    make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host" all-target-libstdc++-v3 -C ${arch}
+  fi
+
+  if [ %{TARGET_JAVA} -ne 0 ]; then
+    make all-fastjar -C ${arch}
+    CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--host=%{_host}/--host=${arch}/`"
+    dir=`pwd`
+
+    ac_cv_file__proc_self_exe=yes \
+    ac_cv_prog_GCJ="$dir/$arch/gcc/gcj -B$dir/$arch/$arch/libjava/ -B$dir/$arch/gcc/ -B%{_prefix}/$arch/bin/ -B%{_prefix}/$arch/lib/ -isystem %{_prefix}/$arch/include" \
+      make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host --enable-multilib --with-target-subdir=${arch} --with-x=no" \
+      all-target-libjava -C ${arch}
+  fi
+
+%else
+# Canadian cross (build native compiler)
+for arch in %{_target}; do
+  rm -rf ${arch}
+  mkdir -p ${arch}
+  CONFIG_ARGS="\
+        --prefix=%{_prefix} \
+        --mandir=%{_mandir} \
+        --infodir=%{_infodir} \
+        --target=${arch} \
+        --host=${arch} \
+        --build=%{_build} \
+        --enable-languages=c,c++,java \
+        --with-system-zlib \
+        --with-gxx-include-dir=%{_prefix}/include/g++-v3 \
+	--disable-checking \
+	--disable-shared \
+	--enable-__cxa_atexit \
+	--enable-c99 \
+        --enable-threads=posix \
+        --enable-long-long"
+
+  if [ %{TARGET_JAVA} -ne 0 ]; then
+    CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj"
+  fi
+
+  (  cd ${arch}
+     CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ \
+        ../configure $CONFIG_ARGS
+  )
+
+  if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then
+    sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$
+    mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile
+  fi
+
+  make all-build-libiberty all-gcc -C ${arch}
+
+  if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+    CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`"
+    make TARGET_CONFIGARGS="${CONFIG_ARGS}" all-target-libstdc++-v3 -C ${arch}
+    if [ %{TARGET_JAVA} -ne 0 ]; then
+      ( mkdir -p ${arch}/fastjar; cd ${arch}/fastjar; rm *; ../../fastjar/configure --with-system-zlib; make )
+      ac_cv_file__proc_self_exe=yes \
+        CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ GCJ=${arch}-gcj \
+        make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-x=no" configure-target-libjava -C ${arch}
+
+        make -C ${arch}/${arch}/libffi
+        make -C ${arch}/${arch}/boehm-gc
+        make -C ${arch}/${arch}/zlib
+        make GCJ=${arch}-gcj GCJH=${arch}-gcjh ZIP=${arch}-jar -C ${arch}/${arch}/libjava
+      (
+        rm -rf ${arch}/${arch}/fastjar
+        mkdir -p ${arch}/${arch}/fastjar
+        cd ${arch}/${arch}/fastjar
+
+        ac_cv_sizeof_char=1 \
+        ac_cv_sizeof_short=2 \
+        ac_cv_sizeof_int=4 \
+        ac_cv_sizeof_long=4 \
+        ac_cv_sizeof_long_long=8 \
+        ac_cv_sizeof_float=4 \
+        ac_cv_sizeof_double=8 \
+        ac_cv_sizeof_long_double=8 \
+        ac_cv_sizeof_void_p=4 \
+        ac_cv_file__proc_self_exe=yes \
+        ac_cv_header_langinfo_h=yes \
+        CC=${arch}-gcc ../../../fastjar/configure $CONFIG_ARGS
+
+        make
+      )
+
+    fi
+  fi
+%endif
+done
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p ${RPM_BUILD_ROOT}/{%{_prefix}/bin,lib}
+
+%ifarch i386
+  ARCH_STRTIP=strip
+  EXESUFFIX=""
+  arch=sh-linux
+  TOOLPREFIX=${arch}-
+  mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/{bin,include,lib,share}
+  mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/lib/{m4,mb/m4}
+  make DESTDIR=${RPM_BUILD_ROOT} \
+	install-gcc \
+	install-fastjar \
+	-C ${arch}
+%if 0
+  ( cd ${RPM_BUILD_ROOT}%{_prefix}/sh-linux/lib
+    rm -f libgcc_s_*.so
+    mv libgcc_s_mb.so.1 mb/libgcc_s.so.1
+    mv libgcc_s_m4.so.1 m4/libgcc_s.so.1
+    mv libgcc_s_mb_m4.so.1 mb/m4/libgcc_s.so.1
+    ln -s libgcc_s.so.1 mb/libgcc_s.so
+    ln -s libgcc_s.so.1 m4/libgcc_s.so
+    ln -s libgcc_s.so.1 mb/m4/libgcc_s.so
+  )
+%endif
+
+  if [ %{TARGET_LIBSTDC} -ne 0 ]; then
+    make DESTDIR=${RPM_BUILD_ROOT} \
+      install-target-libstdc++-v3 \
+      -C ${arch}
+  fi
+  if [ %{TARGET_JAVA} -ne 0 ]; then
+    make DESTDIR=${RPM_BUILD_ROOT} \
+      install-target-libjava \
+      install-target-boehm-gc \
+      install-target-zlib \
+      -C ${arch}
+    make DESTDIR=${RPM_BUILD_ROOT} prefix=%{_prefix}/${arch} \
+      install -C ${arch}/${arch}/libffi
+    mv -f $RPM_BUILD_ROOT%{_prefix}/share/java $RPM_BUILD_ROOT%{_prefix}/sh-linux/share/
+  fi
+  rm -f $RPM_BUILD_ROOT%{_prefix}/bin/{gcov,gccbug}
+  rm -f $RPM_BUILD_ROOT%{_prefix}/${arch}/bin/{gij,jv-convert}
+  sed -e 's/@@VERSION@@/%{GCC_VERSION}/g' debian/shCPU-linux-GCC >$RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC
+  chmod 0755 $RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC
+
+  LIBSTDC=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libstdc++.so*`
+  LIBGCJ=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libgcj.so*`
+  LIBFFI=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libffi*.so*`
+  # literally (binary-ly) same
+  PROGS="cpp c++ g++ g77 gcc gcj"
+  DRIVERS="cc1 cc1obj cc1plus collect2 cpp0 f771 jc1 tradcpp0 jvgenmain"
+  OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o"
+  LIBS="libgcc.a libgcc_eh.a libobjc.a"
+  LIBS_1="$LIBSTDC \
+          $LIBGCJ libgcj.spec \
+          $LIBFFI "
+  LIBS_2="libstdc++.a libstdc++.la \
+	  libsupc++.a libsupc++.la \
+	  libgcj.a libgcj.la \
+          libffi.a libffi.la"
+  INCLUDE="include"
+
+  for CPU in sh3 sh3eb sh4 sh4eb; do
+    mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}
+    mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${CPU}-linux/{lib,share/java}
+    # Make symbolic links for include dir.
+    ln -s ../sh-linux/include $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/include
+
+    # Make symbolic links for libgcj.jar
+    ln -s ../../sh-linux/share/java/libgcj-%{GCC_VERSION}.jar $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/share/java/libgcj-%{GCC_VERSION}.jar
+
+    # Make symbolic links for executables.
+    for p in ${PROGS}; do
+      ln -s shCPU-linux-GCC $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-$p
+    done
+    ln -s sh-linux-gcjh $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-gcjh
+
+    case "${CPU}" in
+        sh3)
+	    MULTILIBDIR=
+	    MULTIPARENTDIR=
+	    AS_ENDIAN_FLAG="-little"
+	    CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
+	    CPP_CPU_DEFS='-D__SH3__ -D__sh3__'
+	    CC1_CPU_ENDIAN_FLAGS="-ml -m3"
+	    CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m3"
+	    LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3"
+	    LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3-linux/lib"
+        ;;
+        sh3eb)
+	    MULTILIBDIR=/mb
+	    MULTIPARENTDIR=../
+	    AS_ENDIAN_FLAG="-big"
+	    CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
+	    CPP_CPU_DEFS='-D__SH3__ -D__sh3__'
+	    CC1_CPU_ENDIAN_FLAGS="-mb -m3"
+	    CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m3"
+	    LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3"
+	    LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3eb-linux/lib"
+        ;;
+        sh4)
+	    MULTILIBDIR=/m4
+	    MULTIPARENTDIR=../
+	    AS_ENDIAN_FLAG="-little"
+	    CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__"
+	    CPP_CPU_DEFS="-D__SH4__"
+	    CC1_CPU_ENDIAN_FLAGS="-ml -m4"
+	    CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m4"
+	    LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4"
+	    LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4-linux/lib"
+        ;;
+        sh4eb)
+	    MULTILIBDIR=/mb/m4
+	    MULTIPARENTDIR=../../
+	    AS_ENDIAN_FLAG="-big"
+	    CPP_ENDIAN_DEF="-D__BIG_ENDIAN__"
+	    CPP_CPU_DEFS="-D__SH4__"
+	    CC1_CPU_ENDIAN_FLAGS="-mb -m4"
+	    CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m4"
+	    LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4"
+	    LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4eb-linux/lib"
+        ;;
+    esac
+
+    # Make symbolic links for GCC drivers, objects, libraries, and include dir.
+    for f in ${DRIVERS} ${INCLUDE}; do
+       if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/$f ]; then
+         ln -s ../../sh-linux/%{GCC_VERSION}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f
+       fi
+    done
+    for f in ${OBJS} ${LIBS}; do
+       if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f ]; then
+         ln -s ../../sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f
+       fi
+    done
+
+    for f in ${LIBS_1} ${LIBS_2}; do
+      if [ -e $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f ]; then
+        mv -f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/lib
+        ln -s ${MULTIPARENTDIR}../../${CPU}-linux/lib/$f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f
+      fi
+    done
+
+    sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \
+        -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \
+        -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \
+        -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \
+        -e "s+@CC1PLUS_CPU_ENDIAN_FLAGS@+${CC1PLUS_CPU_ENDIAN_FLAGS}+" \
+        -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \
+        -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \
+        debian/edit-specs.in >${arch}/edit-specs-${CPU}.sed
+
+    sed -f ${arch}/edit-specs-${CPU}.sed \
+        $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs \
+        > $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/specs
+
+  done
+
+%else
+  ARCH_STRTIP=%{_target}-strip
+  EXESUFFIX=""
+  TOOLPREFIX=""
+  ln -s ..%{_prefix}/bin/cpp ${RPM_BUILD_ROOT}/lib/cpp
+  ln -s gcc ${RPM_BUILD_ROOT}%{_prefix}/bin/cc
+  arch=%{_target}
+  make DESTDIR=${RPM_BUILD_ROOT} \
+	install -C ${arch}
+  if [ %{TARGET_JAVA} -ne 0 ]; then
+    make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/libffi
+    make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/fastjar
+    mv -f ${RPM_BUILD_ROOT}/%{_prefix}/%{_lib}/libgcj.spec \
+          ${RPM_BUILD_ROOT}/%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/
+  fi
+  $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/gcov$EXESUFFIX || :
+
+cat >${arch}/edit-specs <<EOF
+/^*cross_compile:$/ {
+n
+c\\
+0
+}
+EOF
+  sed -f ${arch}/edit-specs -e 's#-rpath-link.*/usr/%{_target}/lib##' \
+     ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs \
+    >${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$
+  mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$ \
+        ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs
+
+  sed -e "s/dependency_libs=.*/dependency_libs='-lm -lgcc -lc -lgcc'/" \
+     ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la \
+    >${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$
+  mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$ \
+        ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la
+
+  sed -e "s/dependency_libs=.*/dependency_libs='-lpthread -ldl -lz -lm -lgcc -lc -lgcc'/" \
+     ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la \
+    >${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$
+  mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$ \
+        ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la
+
+cat >$RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h <<EOF
+#define _GCC_NEXT_LIMITS_H		/* tell gcc's limits.h to recurse */
+#include_next <limits.h>
+#undef _GCC_NEXT_LIMITS_H
+EOF
+
+%endif
+
+  $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/${TOOLPREFIX}{gcc,cpp,c++,c++filt,gcj,gcjh,gij,jar,grepjar,jcf-dump,jv-convert,jv-scan}$EXESUFFIX || :
+  FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/cc1${EXESUFFIX})
+  $ARCH_STRTIP $FULLPATH/{cc1${EXESUFFIX},cc1plus${EXESUFFIX},cpp0${EXESUFFIX},tradcpp0${EXESUFFIX},collect2${EXESUFFIX},jc1${EXESUFFIX},jvgenmain${EXESUFFIX}} || :
+
+  # Strip static libraries
+  sh-linux-strip -S -R .comment `find $RPM_BUILD_ROOT -type f -name "*.a"` || :
+
+  # Strip ELF shared objects
+  for f in `find $RPM_BUILD_ROOT -type f  \( -perm -0100 -or -perm -0010 -or -perm -0001 \) `; do
+        if file $f | grep -q "shared object.*not stripped"; then
+                sh-linux-strip --strip-unneeded -R .comment $f
+        fi
+  done
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+# ==================== Cross Compiler ===============================
+%ifarch i386
+
+%files sh-linux
+%defattr(-,root,root)
+%{_prefix}/bin/sh*
+%dir %{_prefix}/lib/gcc-lib/sh-linux
+%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include
+%dir %{_prefix}/lib/gcc-lib/sh3-linux
+%dir %{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh3eb-linux
+%dir %{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh4-linux
+%dir %{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/sh4eb-linux
+%dir %{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION}
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1plus
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/collect2
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cpp0
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/*.o
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/libgcc*.a
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/tradcpp0
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jc1
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jvgenmain
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/m4
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/mb
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stddef.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/varargs.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/float.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/limits.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/iso646.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/syslimits.h
+%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/README
+%{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION}/*
+%{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION}/*
+%{_mandir}/man1/sh-linux-*
+%dir %{_prefix}/sh-linux/include
+%{_prefix}/sh3-linux/include
+%{_prefix}/sh3eb-linux/include
+%{_prefix}/sh4-linux/include
+%{_prefix}/sh4eb-linux/include
+%endif
+
+%if %{TARGET_LIBSTDC}
+%ifarch i386
+%{_prefix}/sh-linux/include/g++-v3
+%{_prefix}/sh-linux/lib/libs*
+%{_prefix}/sh-linux/lib/m4/libs*
+%{_prefix}/sh-linux/lib/mb/libs*
+%{_prefix}/sh-linux/lib/mb/m4/libs*
+%{_prefix}/sh3-linux/lib/libs*
+%{_prefix}/sh4-linux/lib/libs*
+%{_prefix}/sh3eb-linux/lib/libs*
+%{_prefix}/sh4eb-linux/lib/libs*
+%endif
+%endif
+
+%if %{TARGET_JAVA}
+%ifarch i386
+%files -n libgcj-sh-linux
+%defattr(-,root,root)
+%{_prefix}/sh-linux/include/*.h
+%{_prefix}/sh-linux/include/gcj
+%{_prefix}/sh-linux/include/gnu/*
+%{_prefix}/sh-linux/include/java
+%{_prefix}/sh-linux/lib/lib*gcj*
+%{_prefix}/sh-linux/lib/m4/lib*gcj*
+%{_prefix}/sh-linux/lib/mb/lib*gcj*
+%{_prefix}/sh-linux/lib/mb/m4/lib*gcj*
+%{_prefix}/sh-linux/lib/libffi*
+%{_prefix}/sh-linux/lib/m4/libffi*
+%{_prefix}/sh-linux/lib/mb/libffi*
+%{_prefix}/sh-linux/lib/mb/m4/libffi*
+%{_prefix}/sh-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh3-linux/lib/lib*gcj*
+%{_prefix}/sh3-linux/lib/libffi*
+%{_prefix}/sh3-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh4-linux/lib/lib*gcj*
+%{_prefix}/sh4-linux/lib/libffi*
+%{_prefix}/sh4-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh3eb-linux/lib/lib*gcj*
+%{_prefix}/sh3eb-linux/lib/libffi*
+%{_prefix}/sh3eb-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%{_prefix}/sh4eb-linux/lib/lib*gcj*
+%{_prefix}/sh4eb-linux/lib/libffi*
+%{_prefix}/sh4eb-linux/share/java/libgcj-%{GCC_VERSION}.jar
+%endif
+%endif
+
+%ifarch sh3 sh3eb sh4 sh4eb
+# =========================== Native Compiler =================================
+%files
+%defattr(-,root,root)
+%dir %{_prefix}/lib/gcc-lib/%{_target}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/collect2
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cpp0
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/crt*.o
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcc*.a
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/specs
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/tradcpp0
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stddef.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdarg.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/varargs.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/float.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/limits.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdbool.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/iso646.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/README
+%{_prefix}/bin/gcc
+%{_prefix}/bin/%{_target}-gcc
+%{_prefix}/bin/cpp
+%{_prefix}/bin/gccbug
+%{_prefix}/bin/gcov
+%{_prefix}/bin/cc
+/lib/cpp
+%{_infodir}/cpp*
+%{_infodir}/gcc*
+
+%if 0
+%files libgcc
+%defattr(-,root,root)
+/lib/libgcc_s.so*
+%endif
+
+%files c++
+%defattr(-,root,root)
+%{_prefix}/bin/c++
+%{_prefix}/bin/g++
+%{_prefix}/bin/c++filt
+%{_prefix}/bin/%{_target}-c++
+%{_prefix}/bin/%{_target}-g++
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1plus
+%endif
+
+%if %{TARGET_LIBSTDC}
+%ifarch sh3 sh3eb sh4 sh4eb
+%files -n libstdc++
+%defattr(-,root,root)
+%{_prefix}/lib/libstdc++.so*
+
+%files -n libstdc++-devel
+%defattr(-,root,root)
+%{_prefix}/include/g++-v3
+%{_prefix}/lib/libstdc++.*a
+%endif
+%endif
+
+%if %{TARGET_JAVA}
+%ifarch sh3 sh3eb sh4 sh4eb
+%files java
+%defattr(-,root,root)
+%{_prefix}/bin/addr2name.awk
+%{_prefix}/bin/gcj
+%{_prefix}/bin/gcjh
+%{_prefix}/bin/gij
+%{_prefix}/bin/jar
+%{_prefix}/bin/grepjar
+%{_prefix}/bin/jcf-dump
+%{_prefix}/bin/jv-convert
+%{_prefix}/bin/jv-scan
+%dir %{_prefix}/lib/gcc-lib
+%dir %{_prefix}/lib/gcc-lib/%{_target}
+%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jc1
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jvgenmain
+%{_infodir}/gcj*
+
+%files -n libgcj
+%defattr(-,root,root)
+%{_prefix}/%{_lib}/libgcj.so*
+%{_prefix}/%{_lib}/libffi*.so*
+%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcj.spec
+%{_prefix}/share/java/libgcj-%{GCC_VERSION}.jar
+
+%files -n libgcj-devel
+%defattr(-,root,root)
+%{_prefix}/include/*.h
+%{_prefix}/include/gcj
+%{_prefix}/include/gnu/*
+%{_prefix}/include/java
+%{_prefix}/lib/libgcj.*a
+%{_prefix}/lib/libffi.*a
+%endif
+%endif
+
+%changelog
+* Wed Feb 19 2003 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- version 3.2.2.
+
+* Tue Feb 19 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- version 3.0.4.
+
+* Tue Feb 12 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add java support.
+
+* Thu Feb 7 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- follow debian/SH update.
+
+* Tue Feb 5 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- follow debian/SH update.
+
+* Thu Jan 24 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- rebuild with new binutils.
+
+* Tue Jan 22 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- leaf function optimization fixed.
+
+* Thu Dec 06 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add gcc-ice-rml patch.
+
+* Tue Nov 13 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- add configure option.
+
+* Thu Nov 01 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- tablejump fix by gniibe.
+
+* Mon Oct 22 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- updated gcc patch.
+
+* Wed Oct 17 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- updated gcc patch.
+
+* Tue Oct 02 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc/config/sh/sh.c bug fix.
+
+* Fri Aug 24 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc version 3.0.1.
+
+* Thu Jun 28 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- gcc version 3.0.
+- Add libstdc++ package.
+
+* Mon Apr 23 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- Add cygwin host.
+
+* Sat Dec 23 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- fix file attribute.
+- add asmspecs patch.
+
+* Sat Nov 11 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+- initial version.
diff --git a/patches/gcc/3.3.1/compat.exp.patch b/patches/gcc/3.3.1/compat.exp.patch
new file mode 100644
index 00000000..763b8a18
--- /dev/null
+++ b/patches/gcc/3.3.1/compat.exp.patch
@@ -0,0 +1,37 @@
+Fixes the following problem when testing a cross-compiler:
+
+============================================
+Testing g++.dg/compat/abi/bitfield1,
+...
+Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++  ...
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
+pid is 16028 -16028
+compiler exited with status 1
+output is:
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file data encoding not little-endian
+
+FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile
+============================================
+
+--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old	Thu Oct 17 17:22:57 2002
++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp	Mon Jul 14 10:59:19 2003
+@@ -42,11 +42,13 @@
+ proc compat-fix-library-path { } {
+     global ld_library_path
+ 
+-    # See comments in lib/g++.exp for why this is needed.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++	# See comments in lib/g++.exp for why this is needed.
++	setenv  LD_LIBRARY_PATH     $ld_library_path
++	setenv  SHLIB_PATH          $ld_library_path
++	setenv  LD_LIBRARYN32_PATH  $ld_library_path
++	setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ }
+ 
+ #
diff --git a/patches/gcc/3.3.1/config.sub.patch b/patches/gcc/3.3.1/config.sub.patch
new file mode 100644
index 00000000..928f9115
--- /dev/null
+++ b/patches/gcc/3.3.1/config.sub.patch
@@ -0,0 +1,72 @@
+When configuring a s390->s390 or cris->cris crosscompiler
+(ok, I haven't hit this yet, but one of these days I'll get me an account
+on an s390, and then I'll need this patch :-), you'll get the
+following error:
+
++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure
+--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu
+--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2
+--enable-languages=c
+--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390-
+unknown-linux-gnu --enable-threads=no --without-headers --with-newlib
+--disable-shared
+...
+*** --with-headers is only supported when cross compiling
+
+This error pops up only when you're using Daniel Jacobowitz's technique
+of slightly changing the target and host tuples to make them different
+enough to force gcc's build system to not try to pull in system libraries
+or headers.  This technique is needed e.g. to build an x86 -> x86
+cross-compiler.
+(The LFS developers ran into the same bug that prompted me to use
+this technique; they point people who run into it to
+http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different
+way of avoiding this problem.  I think the tuple tweak is the way to go, though.)
+
+config-patches@gnu.org rejected this patch, on the grounds that there
+is only one vendor of each of those two architectures, so the 
+canonicalization is by definition correct.  When I pointed out the
+difficulty this causes for people building s390 -> s390 or
+cris -> cris compilers that are incompatible with the system
+libraries and thus must be built like cross-compilers, he grumped and said 
+"autoconf should let you specify a cross-compiler in some other way than
+comparing tuple strings".
+
+
+
+--- gcc-3.3/config.sub.old	Sun Jun  8 20:38:47 2003
++++ gcc-3.3/config.sub	Sun Jun  8 20:40:34 2003
+@@ -433,9 +433,12 @@
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
+-	cris | cris-* | etrax*)
++	cris | etrax*)
+ 		basic_machine=cris-axis
+ 		;;
++	cris-*)
++		basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+@@ -820,11 +823,17 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
+-	s390 | s390-*)
++	s390)
+ 		basic_machine=s390-ibm
+ 		;;
+-	s390x | s390x-*)
++	s390-*)
++		basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	s390x)
+ 		basic_machine=s390x-ibm
++		;;
++	s390x-*)
++		basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	sa29200)
+ 		basic_machine=a29k-amd
diff --git a/patches/gcc/3.3.1/empty6.patch b/patches/gcc/3.3.1/empty6.patch
new file mode 100644
index 00000000..1b0715ce
--- /dev/null
+++ b/patches/gcc/3.3.1/empty6.patch
@@ -0,0 +1,21 @@
+From 3.4 branch.  Fixes test failure
+FAIL: g++.dg/abi/empty6.C  (test for warnings, line 6)
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- gcc/gcc/testsuite/g++.dg/abi/empty6.C	2002/09/25 19:07:35	1.1
++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C	2003/06/03 19:10:09	1.2
+@@ -5,4 +5,9 @@
+ struct B {
+   A a; // { dg-warning "empty" }
+   virtual void f () {}
+-};
++} __attribute__((aligned(8)));
++/* The preceding attribute is necessary on targets with
++   BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit
++   offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0,
++   and then there is no discrepancy between DECL_FIELD_OFFSET and
++   byte_position to warn about.  */
diff --git a/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch
new file mode 100644
index 00000000..fb8e4f08
--- /dev/null
+++ b/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch
@@ -0,0 +1,100 @@
+See http://gcc.gnu.org/PR12010
+
+g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003
+
+The first hunk fixes the error
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+    while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+    (procedure "g++_include_flags" line 21)
+    invoked from within
+"g++_include_flags [get_multilibs] "
+    (procedure "g++_init" line 63)
+    invoked from within
+"${tool}_init $test_file_name"
+    (procedure "runtest" line 19)
+    invoked from within
+"runtest $test_name"
+    ("foreach" body line 42)
+    invoked from within
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+The fix isn't especially pretty, but it worked for me, and can't hurt the
+more common native compiler case.  Maybe someone who knows the code better 
+can come up with a better fix.
+
+The second hunk fixes the error
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+when trying to compile g++ testcases (!); setting up
+the shared library environment when running crosstests of g++ 
+should either be done by a special board file, or by
+setting up a remote chroot environment (see http://kegel.com/crosstool),
+not by blithely setting LD_LIBRARY_PATH on the local system.
+
+--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old	Fri Jul 11 15:42:47 2003
++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp	Sat Jul 12 12:57:07 2003
+@@ -72,6 +72,8 @@
+ #
+ proc g++_include_flags { paths } {
+     global srcdir
++    global objdir
++    global target_triplet
+     global HAVE_LIBSTDCXX_V3
+     global TESTING_IN_BUILD_TREE
+ 
+@@ -90,6 +92,20 @@
+ 
+     if { ${HAVE_LIBSTDCXX_V3} } {
+       set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++	  # first assume no multilibs
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++	  # assume multilib only one level deep
++          set multisub [file tail $gccpath]
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++           error "Can't find libstdc++-v3"
++      }
+       append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+     } else {
+       set odir_v2 [lookfor_file ${gccpath} libstdc++]
+@@ -192,16 +192,20 @@
+       }
+     }
+ 
+-    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+-    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+-    # (for the 64-bit ABI).  The right way to do this would be to modify
+-    # unix.exp -- but that's not an option since it's part of DejaGNU
+-    # proper, so we do it here.  We really only need to do 
+-    # this on IRIX, but it shouldn't hurt to do it anywhere else.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++      # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++      # (for the 64-bit ABI).  The right way to do this would be to modify
++      # unix.exp -- but that's not an option since it's part of DejaGNU
++      # proper, so we do it here.  We really only need to do 
++      # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++      # Doing this causes us to be unable to run cross-compilers.
++      setenv  LD_LIBRARY_PATH     $ld_library_path
++      setenv  SHLIB_PATH          $ld_library_path
++      setenv  LD_LIBRARYN32_PATH  $ld_library_path
++      setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ 
+     return "$flags"
+ }
diff --git a/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch
new file mode 100644
index 00000000..aafc1306
--- /dev/null
+++ b/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch
@@ -0,0 +1,54 @@
+Without this patch, the command
+
+RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3
+
+fails in two ways:
+1. the -L option meant to locate the testsuite directory is incorrect, and
+2. the wrong compiler is invoked, causing all sorts of havoc, not least of which
+is the native compiler is invoked when we really wanted to invoke the cross-compiler
+we just built.
+
+Here's an example log of the problem in action.  Every testcase fails, this shows just one:
+-------------
+Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc   -g -O2 -DDEBUG_ASSERT  -L/testsuite -lv3test -lm  -o ./binders.exe
+compiler exited with status 1
+output is:
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83:   instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M
+/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43:   instantiated from here^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M
+...
+FAIL: 20_util/binders.cc (test for excess errors)
+WARNING: 20_util/binders.cc compilation failed to produce executable
+-------------
+
+And here's the patch.  I'm not happy with it, and it probably gets some cases wrong,
+but it seems to work for the common native case and for my cross-compiler case.
+
+--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old	Sun Jul 13 10:42:01 2003
++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp	Sun Jul 13 11:39:54 2003
+@@ -46,8 +46,23 @@
+     global gluefile wrap_flags
+     global ld_library_path
+     global tool_root_dir
++    global target_triplet
+ 
+     set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++    if { $blddir == "" } {
++        set multilibs [get_multilibs]
++        # FIXME: assume multilib only one level deep
++        set multisub [file tail $multilibs]
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++        set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++        set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++         error "Can't find libstdc++-v3"
++    }
+ 
+     # By default, we assume we want to run program images.
+     global dg-do-what-default
diff --git a/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch b/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch
new file mode 100644
index 00000000..ce2baf37
--- /dev/null
+++ b/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch
@@ -0,0 +1,44 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.3.1-orig/configure gcc-3.3.1/configure
+--- gcc-3.3.1-orig/configure	2002-09-29 18:11:24.000000000 +0200
++++ gcc-3.3.1/configure	2005-04-20 18:49:20.223220401 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -rf Makefile* ${tmpdir}
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1596,7 +1596,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/3.3.1/pr10392-1-test.patch b/patches/gcc/3.3.1/pr10392-1-test.patch
new file mode 100644
index 00000000..e94c8b9b
--- /dev/null
+++ b/patches/gcc/3.3.1/pr10392-1-test.patch
@@ -0,0 +1,65 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10392-1.c	Sun Sep 14 14:28:24 2003
+@@ -0,0 +1,62 @@
++/* PR optimization/10392
++ * Reporter: marcus@mc.pp.se
++ * Summary: [3.3/3.4 regression] [SH] optimizer generates faulty array indexing
++ * Description:
++ * The address calculation of an index operation on an array on the stack 
++ * can _under some conditions_ get messed up completely
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Problem only happens with -O2 -m4, so it should only happen on sh4,
++ * but what the heck, let's test other architectures, too.
++ * Not marked as xfail since it's a regression.
++*/
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++/* { dg-options "-O2 -m4" { target sh4-*-* } } */
++const char *dont_optimize_function_away;
++
++const char *use(const char *str)
++{
++	dont_optimize_function_away = str;
++	if (str[0] != 'v')
++		abort();
++	if (str[1] < '1' || str[1] > '6')
++		abort();
++	if (str[2])
++		abort();
++	return str[2] ? "notused" : "v6";
++}
++
++const char *func(char *a, char *b)
++{
++	char buf[128];
++	unsigned char i;
++	const char *result;
++
++	char *item[] = {
++		"v1",
++		"v2",
++	};
++
++	buf[0] = 'v';
++	buf[1] = '3';
++	buf[2] = 0;
++
++	for (i = 0; i < 2; i++) {
++		/* bug is: following line passes wild pointer to use() on sh4 -O2 */
++		result = use(item[i]);
++
++		use(buf);
++		use(a);
++		use(b);
++		result = use(result);
++	}
++	return result;
++}
++
++int main()
++{
++	func("v4", "v5");
++	return 0;
++}
++
diff --git a/patches/gcc/3.3.1/pr10412-1-test.patch b/patches/gcc/3.3.1/pr10412-1-test.patch
new file mode 100644
index 00000000..6ca05258
--- /dev/null
+++ b/patches/gcc/3.3.1/pr10412-1-test.patch
@@ -0,0 +1,46 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10412-1.c	Sun Sep 14 16:15:21 2003
+@@ -0,0 +1,43 @@
++/* PR target/10412
++ * Reporter: shrinivasa@kpitcummins.com 
++ * Summary: Renesas SH - Incorrect code generation
++ * Description:
++ * When following code is compiled  with
++ * sh-elf-gcc  -S -mhitachi -m2 -O2 bug1.c
++ * generates an incorrect code.
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Problem only happens with -mhitachi -m2.  Not sure if I can give those
++ * options for all sh targets.  They work on sh4, though.
++ * Not marked as xfail as it's a regression relative to hardhat 2.0 gcc-2.97.
++*/
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++int global_val;
++
++int func0(int x)
++{
++	global_val += x;
++	return (x != 99);
++}
++
++int func1(unsigned long addr)
++{
++	int err;
++
++	err = func0(addr);
++	if (err)
++		return (err);
++
++	err = func0(addr * 7);	/* address of func0 is lost during multiplication -> probable SIGSEGV */
++	return (err);
++}
++
++int main(int argc, char **argv)
++{
++	global_val = 0;
++	global_val += func1(99);
++	if (global_val != 99 * 8 + 1)
++		abort();
++	return 0;
++}
diff --git a/patches/gcc/3.3.1/pr10589-1-test.patch b/patches/gcc/3.3.1/pr10589-1-test.patch
new file mode 100644
index 00000000..04882e51
--- /dev/null
+++ b/patches/gcc/3.3.1/pr10589-1-test.patch
@@ -0,0 +1,17 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10589-1.c	Mon Sep 15 08:57:58 2003
+@@ -0,0 +1,14 @@
++/* PR target/10589
++ * Reporter: mathieu@thenesis.com
++ * Summary: For Hitachi SH target, GCC crashes when both -fomit-frame-pointer and -mdalign options are specified
++ * Keywords: ice-on-valid-code
++ * Testcase by Kazu Hirata, tweaked by dank@kegel.com
++ * Did not fail in Hard Hat 2.0 gcc-2.97, nor in dodes gcc-3.0.2, so this is a regression, so I'm not marking it xfail
++ */
++/* { dg-do compile { target sh*-*-* } } */
++/* { dg-options "-fomit-frame-pointer -mdalign" } */
++
++int foo(int a, int b)
++{
++	return a / b;
++}
diff --git a/patches/gcc/3.3.1/pr11162-1-test.patch b/patches/gcc/3.3.1/pr11162-1-test.patch
new file mode 100644
index 00000000..9ab0d324
--- /dev/null
+++ b/patches/gcc/3.3.1/pr11162-1-test.patch
@@ -0,0 +1,25 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11162-1.c	Sun Sep 14 16:24:41 2003
+@@ -0,0 +1,22 @@
++/*
++ * PR optimization/11162
++ * Reporter: Toshiyasu Morita <tm@kloo.net>
++ * Summary: [3.4 Regression] [-fnew-ra] ICE compiling channel.i on sh
++ * Keywords: ice-on-valid-code
++ * Description:
++ * [ICE] when channel.i from stress-1.17 is compiled with options:
++ * -O2 -m4 -fnew-ra
++ * ...
++ * The CFG code gets confused by the addition of a USE insn after a sibcall.
++ * Sibcalls are supposed to end the block (and the function!), so the fact
++ * that we have an instruction following one (even if its fake) is confusing.
++ *
++ * testcase tweaked by dank@kegel.com
++ */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fnew-ra" } */
++
++int foo(char *p1)
++{
++	return bar(p1);
++}
diff --git a/patches/gcc/3.3.1/pr11587-1-test.patch b/patches/gcc/3.3.1/pr11587-1-test.patch
new file mode 100644
index 00000000..f6dedde0
--- /dev/null
+++ b/patches/gcc/3.3.1/pr11587-1-test.patch
@@ -0,0 +1,39 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11587-1.c	Mon Sep 15 08:46:00 2003
+@@ -0,0 +1,36 @@
++/* PR optimization/11587
++ * Reporter: Michael Eager <eager@mvista.com>
++ * Summary: [3.3/3.4 Regression] SH ICE in reload_cse_simplify_operand, postreload.c
++ * Keywords: ice-on-valid-code
++ *
++ * Note: a fix exists; see bugzilla
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Not marked as xfail since it's a regression.
++ */
++
++/* { dg-do compile } */
++/* { dg-options "-O1" } */
++int foo1(void);
++int foo2();
++int foo3();
++
++static int goo()
++{
++	int i;
++
++	if (i <= 0)
++		return i;
++
++	if (foo1() > 1) {
++		i = foo2();
++		if (i < 0)
++			return i;
++		if (i) {
++			if (foo3())
++				return 1;
++			return 0;
++		}
++	}
++
++}
diff --git a/patches/gcc/3.3.1/pr11736-1-test.patch b/patches/gcc/3.3.1/pr11736-1-test.patch
new file mode 100644
index 00000000..ea544b12
--- /dev/null
+++ b/patches/gcc/3.3.1/pr11736-1-test.patch
@@ -0,0 +1,48 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11736-1.c	Sun Sep 14 14:26:33 2003
+@@ -0,0 +1,45 @@
++/* PR optimization/11736
++ * Reporter: marcus@mc.pp.se
++ * Summary:  Stackpointer messed up on SuperH
++ * Keywords: wrong-code
++ * Description:
++ * When a function with 5 arguments is called in both branches of a
++ * conditional, and only the last argument differs, the code to push that
++ * last argument on the stack gets confused. 
++ * Space for the fifth argument is reserved on the stack by the
++ * instruction I have marked as "A".  However, if the else-branch is
++ * taken the stackpointer is decremented _again_ at "B".  This
++ * decrementation is never restored, and it is only due to the
++ * restoration of r15 from r14 that the function works at all.  With
++ * -fomit-frame-pointer it will crash.
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Not marked as xfail since it's a regression from hardhat 2.0 gcc-2.97 
++ * and dodes gcc-3.0.2
++ */
++
++/* { dg-do run } */
++/* { dg-options "-O1 -fomit-frame-pointer" } */
++
++int expected_e;
++
++void bar(int a, int b, int c, int d, int e)
++{
++	if (e != expected_e)
++		abort();
++}
++
++void foo(int a)
++{
++	if (a)
++		bar(0, 0, 0, 0, 1);
++	else
++		bar(0, 0, 0, 0, 0);	/* stack pointer decremented extra time here, causing segfault */
++}
++
++int main(int argc, char **argv)
++{
++	for (expected_e = 0; expected_e < 2; expected_e++)
++		foo(expected_e);
++	return 0;
++}
diff --git a/patches/gcc/3.3.1/pr11864-1-test.patch b/patches/gcc/3.3.1/pr11864-1-test.patch
new file mode 100644
index 00000000..f5b0d175
--- /dev/null
+++ b/patches/gcc/3.3.1/pr11864-1-test.patch
@@ -0,0 +1,45 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11864-1.c	Sun Sep 14 14:32:24 2003
+@@ -0,0 +1,42 @@
++/* PR optimization/11864
++ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org>
++ * Summary: [3.3/3.4 regression] miscompiles zero extension and test
++ * Description:
++ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension
++ * and test if it's zero.
++ *
++ * Testcase tweaked by dank@kegel.com.  Not marked as xfail because it's a regression.
++ */
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++extern void abort(void);
++
++int val = 0xff00;
++
++int f(void)
++{
++	return val;
++}
++
++unsigned char a[1];
++
++void foo(void)
++{
++	a[0] = f() & 255;
++
++	if (!a[0])
++		a[0] = f() & 255;
++
++	if (!a[0])
++		a[0] = 1 + (f() & 127);
++}
++
++int main(int argc, char **argv)
++{
++	foo();
++	if (!a[0])
++		abort();
++
++	return 0;
++}
diff --git a/patches/gcc/3.3.1/pr11949-fix.patch b/patches/gcc/3.3.1/pr11949-fix.patch
new file mode 100644
index 00000000..7f60b954
--- /dev/null
+++ b/patches/gcc/3.3.1/pr11949-fix.patch
@@ -0,0 +1,61 @@
+Message-Id: 20030822160024.GA305@ftbfs.org
+From: Matt Kraai kraai at alumni dot cmu dot edu
+To: gcc-patches at gcc dot gnu dot org
+Date: Fri, 22 Aug 2003 09:00:24 -0700
+Subject: PR 11949
+
+Howdy,
+
+I've backported the following patch from the mainline to the 3.3
+branch to fix PR 11949.
+
+Bootstrapped and regression tested on powerpc-unknown-linux-gnu.
+
+OK to commit?
+
+	PR c/11949
+	Backport from mainline:
+
+	2003-05-05  Aldy Hernandez  aldyh@redhat.com
+
+	* testsuite/gcc.c-torture/compile/simd-6.c: New.
+
+	* c-typeck.c (digest_init): Handle arrays of vector constants.
+
+Index: gcc/c-typeck.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v
+retrieving revision 1.213.2.8
+diff -3 -c -p -r1.213.2.8 c-typeck.c
+*** gcc/gcc/c-typeck.c	19 Aug 2003 01:42:35 -0000	1.213.2.8
+--- gcc/gcc/c-typeck.c	22 Aug 2003 09:24:03 -0000
+*************** digest_init (type, init, require_constan
+*** 4765,4772 ****
+    if (code == VECTOR_TYPE
+        && comptypes (TREE_TYPE (inside_init), type)
+        && TREE_CONSTANT (inside_init))
+!     return build_vector (type, TREE_OPERAND (inside_init, 1));
+! 
+  
+    /* Any type can be initialized
+       from an expression of the same type, optionally with braces.  */
+--- 4765,4778 ----
+    if (code == VECTOR_TYPE
+        && comptypes (TREE_TYPE (inside_init), type)
+        && TREE_CONSTANT (inside_init))
+!     {
+!       if (TREE_CODE (inside_init) == VECTOR_CST
+! 	  && comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
+! 			TYPE_MAIN_VARIANT (type)))
+! 	return inside_init;
+!       else
+! 	return build_vector (type, CONSTRUCTOR_ELTS (inside_init));
+!     }
+  
+    /* Any type can be initialized
+       from an expression of the same type, optionally with braces.  */
+
+typedef int __attribute__((mode(V2SI))) vec;
+
+vec a[] = {(vec) {1, 2}, {3, 4}};
+
diff --git a/patches/gcc/3.3.1/pr9365-1-test.patch b/patches/gcc/3.3.1/pr9365-1-test.patch
new file mode 100644
index 00000000..ee7dfa7c
--- /dev/null
+++ b/patches/gcc/3.3.1/pr9365-1-test.patch
@@ -0,0 +1,43 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr9365-1.c	Sun Sep 14 09:34:37 2003
+@@ -0,0 +1,40 @@
++/* PR target/9365
++ * Origin: marcus@mc.pp.se
++ * Testcase tweaked by dank@kegel.com
++ * [3.3 regression] [SH] segfault in gen_far_branch (config/sh/sh.c)
++ * ice-on-valid-code
++ * Not marked as xfail since it's a regression
++*/
++/* { dg-do compile } */
++/* { dg-options "-O2 -fomit-frame-pointer" } */
++
++
++void foo(int n, int *p)
++{
++	switch(n) {
++	case 100: case 110: case 120: case 130: case 140:
++	case 200: case 210: case 220: case 230: case 240:
++	case 300: case 310: case 320: case 330: case 340:
++	case 400: case 410: case 420: case 430: case 440:
++	case 500: case 510: case 520: case 530: case 540:
++	case 600: case 610: case 620: case 630: case 640:
++	case 700: case 710: case 720: case 730: case 740:
++	case 800: case 810: case 820: case 830: case 840:
++	case 900: case 910: case 920: case 930: case 940:
++		break;
++	default:
++		*p = n;
++		break;
++	}
++}
++
++int main(int argc, char **argv)
++{
++	int p;
++
++	(void) argv;
++
++	foo(argc, &p);
++
++	return p;
++}
diff --git a/patches/gcc/3.3.1/sh-pic-set_fpscr.patch b/patches/gcc/3.3.1/sh-pic-set_fpscr.patch
new file mode 100644
index 00000000..e83f7283
--- /dev/null
+++ b/patches/gcc/3.3.1/sh-pic-set_fpscr.patch
@@ -0,0 +1,61 @@
+See http://gcc.gnu.org/PR11901
+Should fix
+make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 
+in glibc's "make tests".
+
+-------------
+
+Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: linux-sh@m17n.org
+Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+In-Reply-To: Your message of "Wed, 30 Jul 2003 11:20:49 +0900"
+	<200307300212.h6U2CH901209@r-rr.iij4u.or.jp>
+References: <200307300212.h6U2CH901209@r-rr.iij4u.or.jp>
+Date: Wed, 30 Jul 2003 12:03:01 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+> I'll try to write the PIC version of it,
+
+Dan, does the attached patch work for you?
+
+[dank: original patch deleted; here's same thing rediffed against gcc-3.3 instead of HEAD]
+
+--- gcc-3.3/gcc/config/sh/lib1funcs.asm.old	Tue Jul 29 21:37:29 2003
++++ gcc-3.3/gcc/config/sh/lib1funcs.asm	Tue Jul 29 21:40:58 2003
+@@ -1792,7 +1792,17 @@
+ 	.global GLOBAL(set_fpscr)
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
++#ifdef __PIC__
++	mov.l	r12,@-r15
++	mova	LOCAL(set_fpscr_L0),r0
++	mov.l	LOCAL(set_fpscr_L0),r12
++	add	r0,r12
++	mov.l	LOCAL(set_fpscr_L1),r0
++	mov.l	@(r0,r12),r1
++	mov.l	@r15+,r12
++#else
+ 	mov.l LOCAL(set_fpscr_L1),r1
++#endif
+ 	swap.w r4,r0
+ 	or #24,r0
+ #ifndef FMOVD_WORKS
+@@ -1820,8 +1830,16 @@
+ 	mov.l r3,@(4,r1)
+ #endif
+ 	.align 2
++#ifdef __PIC__
++LOCAL(set_fpscr_L0):
++	.long _GLOBAL_OFFSET_TABLE_
++LOCAL(set_fpscr_L1):
++	.long GLOBAL(fpscr_values@GOT)
++#else
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++#endif
++
+ #ifdef __ELF__
+         .comm   GLOBAL(fpscr_values),8,4
+ #else
diff --git a/patches/gcc/3.3.1/sh-spec.patch b/patches/gcc/3.3.1/sh-spec.patch
new file mode 100644
index 00000000..efd4243c
--- /dev/null
+++ b/patches/gcc/3.3.1/sh-spec.patch
@@ -0,0 +1,52 @@
+See http://gcc.gnu.org/PR11902
+
+Part of fix for abort on line
+  assert (info[DT_RPATH] == NULL);
+in glibc-2.3.2's ld.so, which makes all dynamically-linked
+programs crash.
+
+Message-Id: <200308020452.h724q0n01509@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: kkojima@rr.iij4u.or.jp
+Subject: Re: Writing PIC version of __udivsi3_i4?
+In-Reply-To: Your message of "Fri, 01 Aug 2003 21:15:27 -0700"
+	<3F2B3ADF.6030206@kegel.com>
+References: <3F2B3ADF.6030206@kegel.com>
+Date: Sat, 02 Aug 2003 13:58:05 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+Dan Kegel <dank@kegel.com> wrote:
+> It seems it might be from gcc's spec file:
+> 
+> *subtarget_link_spec:
+> %{shared:-shared}    %{!static:      %{rdynamic:-export-dynamic}      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}      %{!rpath:-rpath /lib}}    %{static:-static}
+> 
+> as the only place -rpath showed up was in the output of gcc -v as it
+> was linking libc.so.
+> 
+> Well, that's a clue, anyway!  Guess I'll dig through the spec files
+> tomorrow to see if I can figure it out some more.
+
+I've grepped gcc/config/*/*.h and found only SH and old libc1 stuffs
+of i386/alpha include %{!rpath:-rpath ... in 3.3 release and the
+current CVS. And my sh-gcc's specs doesn't have this :-(
+It would be the Right Thing to remove this stuff simply. How about
+the gcc patch below?
+
+Regards,
+	kaz
+--
+--- gcc-3.3/gcc/config/sh/linux.h.orig	Sat Aug  2 13:20:57 2003
++++ gcc-3.3/gcc/config/sh/linux.h	Sat Aug  2 13:22:42 2003
+@@ -48,8 +48,7 @@ do { \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+-     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+-     %{!rpath:-rpath /lib}} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+    %{static:-static}"
+ 
+ /* The GNU C++ standard library requires that these macros be defined.  */
+
+
diff --git a/patches/gcc/3.3.1/sh4-pthread.patch b/patches/gcc/3.3.1/sh4-pthread.patch
new file mode 100644
index 00000000..95e1057b
--- /dev/null
+++ b/patches/gcc/3.3.1/sh4-pthread.patch
@@ -0,0 +1,44 @@
+See http://gcc.gnu.org/PR11903
+
+Patch to fix following test case failure:
+
+		=== libstdc++-v3 tests ===
+FAIL: thread/pthread1.cc (test for excess errors)
+Excess errors:
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/sh4-unknown-linux-gnu/bin/ld: cannot find -lthread
+collect2: ld returned 1 exit status
+
+Note that *any* program compiled with -pthread fails:
+
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c  -pthread
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/lib/gcc-lib/sh4-unknown-linux-gnu/3.3.1/../../../../sh4-unknown-linux-gnu/bin/ld: cannot find -lthread
+collect2: ld returned 1 exit status
+
+Compiling with -lpthread on the other hand works fine:
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c  -lpthread
+
+So -pthread is broken in some trivial way; it should invoke -lpthread, not -lthread,
+at least when targeting Linux. 
+
+http://www.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains a jumbo patch,
+gcc-20030210-sh-linux-1.patch, that includes a fix for this.  Here's the
+appropriate hunk (brings in a fix for the documented -mieee option).
+No idea if this fix is completely right, but it works for me...
+- dank@kegel.com  20 Jul 2003
+
+Index: linux.h
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/config/sh/linux.h,v
+retrieving revision 1.9.20.1
+diff -u -d -u -r1.9.20.1 linux.h
+--- gcc-ss-3_3-20030714/gcc/config/sh/linux.h.old	6 Jun 2003 02:30:59 -0000	1.9.20.1
++++ gcc-ss-3_3-20030714/gcc/config/sh/linux.h	20 Jul 2003 23:36:50 -0000
+@@ -59,7 +59,7 @@
+ #undef LIB_SPEC
+ #define LIB_SPEC \
+   "%{shared: -lc} \
+-   %{!shared: %{pthread:-lthread} \
++   %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \
+      %{profile:-lc_p} %{!profile: -lc}}"
+ 
+ #undef STARTFILE_SPEC
diff --git a/patches/gcc/3.3.1/thunk3.patch b/patches/gcc/3.3.1/thunk3.patch
new file mode 100644
index 00000000..7974a0c0
--- /dev/null
+++ b/patches/gcc/3.3.1/thunk3.patch
@@ -0,0 +1,23 @@
+Fixes 
+FAIL: g++.jason/thunk3.C (test for excess errors)
+on sh4-unknown-linux-gnu.
+
+Does any sh variant *not* use the generic thunk support?  If so, the patch should be
+more cautious.  As it is, it excludes all sh processors from this test.
+
+Index: thunk3.C
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v
+retrieving revision 1.13
+diff -u -d -u -r1.13 thunk3.C
+--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old	25 Mar 2002 17:57:03 -0000	1.13
++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C	20 Jul 2003 16:57:38 -0000
+@@ -2,7 +2,7 @@
+ // Note that this will break on any target that uses the generic thunk
+ //  support, because it doesn't support variadic functions.
+ 
+-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-*
++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-*
+ 
+ #include <stdarg.h>
+ 
diff --git a/patches/gcc/3.3.2/empty6.patch b/patches/gcc/3.3.2/empty6.patch
new file mode 100644
index 00000000..1b0715ce
--- /dev/null
+++ b/patches/gcc/3.3.2/empty6.patch
@@ -0,0 +1,21 @@
+From 3.4 branch.  Fixes test failure
+FAIL: g++.dg/abi/empty6.C  (test for warnings, line 6)
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- gcc/gcc/testsuite/g++.dg/abi/empty6.C	2002/09/25 19:07:35	1.1
++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C	2003/06/03 19:10:09	1.2
+@@ -5,4 +5,9 @@
+ struct B {
+   A a; // { dg-warning "empty" }
+   virtual void f () {}
+-};
++} __attribute__((aligned(8)));
++/* The preceding attribute is necessary on targets with
++   BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit
++   offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0,
++   and then there is no discrepancy between DECL_FIELD_OFFSET and
++   byte_position to warn about.  */
diff --git a/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch
new file mode 100644
index 00000000..fb8e4f08
--- /dev/null
+++ b/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch
@@ -0,0 +1,100 @@
+See http://gcc.gnu.org/PR12010
+
+g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003
+
+The first hunk fixes the error
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+    while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+    (procedure "g++_include_flags" line 21)
+    invoked from within
+"g++_include_flags [get_multilibs] "
+    (procedure "g++_init" line 63)
+    invoked from within
+"${tool}_init $test_file_name"
+    (procedure "runtest" line 19)
+    invoked from within
+"runtest $test_name"
+    ("foreach" body line 42)
+    invoked from within
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+The fix isn't especially pretty, but it worked for me, and can't hurt the
+more common native compiler case.  Maybe someone who knows the code better 
+can come up with a better fix.
+
+The second hunk fixes the error
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+when trying to compile g++ testcases (!); setting up
+the shared library environment when running crosstests of g++ 
+should either be done by a special board file, or by
+setting up a remote chroot environment (see http://kegel.com/crosstool),
+not by blithely setting LD_LIBRARY_PATH on the local system.
+
+--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old	Fri Jul 11 15:42:47 2003
++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp	Sat Jul 12 12:57:07 2003
+@@ -72,6 +72,8 @@
+ #
+ proc g++_include_flags { paths } {
+     global srcdir
++    global objdir
++    global target_triplet
+     global HAVE_LIBSTDCXX_V3
+     global TESTING_IN_BUILD_TREE
+ 
+@@ -90,6 +92,20 @@
+ 
+     if { ${HAVE_LIBSTDCXX_V3} } {
+       set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++	  # first assume no multilibs
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++	  # assume multilib only one level deep
++          set multisub [file tail $gccpath]
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++           error "Can't find libstdc++-v3"
++      }
+       append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+     } else {
+       set odir_v2 [lookfor_file ${gccpath} libstdc++]
+@@ -192,16 +192,20 @@
+       }
+     }
+ 
+-    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+-    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+-    # (for the 64-bit ABI).  The right way to do this would be to modify
+-    # unix.exp -- but that's not an option since it's part of DejaGNU
+-    # proper, so we do it here.  We really only need to do 
+-    # this on IRIX, but it shouldn't hurt to do it anywhere else.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++      # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++      # (for the 64-bit ABI).  The right way to do this would be to modify
++      # unix.exp -- but that's not an option since it's part of DejaGNU
++      # proper, so we do it here.  We really only need to do 
++      # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++      # Doing this causes us to be unable to run cross-compilers.
++      setenv  LD_LIBRARY_PATH     $ld_library_path
++      setenv  SHLIB_PATH          $ld_library_path
++      setenv  LD_LIBRARYN32_PATH  $ld_library_path
++      setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ 
+     return "$flags"
+ }
diff --git a/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch
new file mode 100644
index 00000000..aafc1306
--- /dev/null
+++ b/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch
@@ -0,0 +1,54 @@
+Without this patch, the command
+
+RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3
+
+fails in two ways:
+1. the -L option meant to locate the testsuite directory is incorrect, and
+2. the wrong compiler is invoked, causing all sorts of havoc, not least of which
+is the native compiler is invoked when we really wanted to invoke the cross-compiler
+we just built.
+
+Here's an example log of the problem in action.  Every testcase fails, this shows just one:
+-------------
+Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc   -g -O2 -DDEBUG_ASSERT  -L/testsuite -lv3test -lm  -o ./binders.exe
+compiler exited with status 1
+output is:
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83:   instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M
+/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43:   instantiated from here^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M
+...
+FAIL: 20_util/binders.cc (test for excess errors)
+WARNING: 20_util/binders.cc compilation failed to produce executable
+-------------
+
+And here's the patch.  I'm not happy with it, and it probably gets some cases wrong,
+but it seems to work for the common native case and for my cross-compiler case.
+
+--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old	Sun Jul 13 10:42:01 2003
++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp	Sun Jul 13 11:39:54 2003
+@@ -46,8 +46,23 @@
+     global gluefile wrap_flags
+     global ld_library_path
+     global tool_root_dir
++    global target_triplet
+ 
+     set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++    if { $blddir == "" } {
++        set multilibs [get_multilibs]
++        # FIXME: assume multilib only one level deep
++        set multisub [file tail $multilibs]
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++        set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++        set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++         error "Can't find libstdc++-v3"
++    }
+ 
+     # By default, we assume we want to run program images.
+     global dg-do-what-default
diff --git a/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch b/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch
new file mode 100644
index 00000000..9ec6c53c
--- /dev/null
+++ b/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch
@@ -0,0 +1,65 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+ 
+See http://gcc.gnu.org/PR16350
+ 
+diff -urN gcc-3.3.2.orig/gcc/config/arm/linux-elf.h gcc-3.3.2/gcc/config/arm/linux-elf.h
+--- gcc-3.3.2.orig/gcc/config/arm/linux-elf.h	2003-09-16 17:39:23.000000000 +0200
++++ gcc-3.3.2/gcc/config/arm/linux-elf.h	2004-07-07 14:03:54.329839922 +0200
+@@ -30,15 +30,29 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT)
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -86,7 +100,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+diff -urN gcc-3.3.2.orig/gcc/config.gcc gcc-3.3.2/gcc/config.gcc
+--- gcc-3.3.2.orig/gcc/config.gcc	2003-10-01 21:07:01.000000000 +0200
++++ gcc-3.3.2/gcc/config.gcc	2004-07-07 14:04:59.046716638 +0200
+@@ -699,6 +699,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h"
++	case $machine in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch b/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch
new file mode 100644
index 00000000..c8bc2eae
--- /dev/null
+++ b/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch
@@ -0,0 +1,44 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.3.2-orig/configure gcc-3.3.2/configure
+--- gcc-3.3.2-orig/configure	2002-09-29 18:11:24.000000000 +0200
++++ gcc-3.3.2/configure	2005-04-20 20:55:51.000000000 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -rf Makefile* ${tmpdir}
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1596,7 +1596,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/3.3.2/pr10392-1-test.patch b/patches/gcc/3.3.2/pr10392-1-test.patch
new file mode 120000
index 00000000..f02b235f
--- /dev/null
+++ b/patches/gcc/3.3.2/pr10392-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr10392-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr10412-1-test.patch b/patches/gcc/3.3.2/pr10412-1-test.patch
new file mode 120000
index 00000000..195d7f51
--- /dev/null
+++ b/patches/gcc/3.3.2/pr10412-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr10412-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr10589-1-test.patch b/patches/gcc/3.3.2/pr10589-1-test.patch
new file mode 120000
index 00000000..b7e0a6b1
--- /dev/null
+++ b/patches/gcc/3.3.2/pr10589-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr10589-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr11162-1-test.patch b/patches/gcc/3.3.2/pr11162-1-test.patch
new file mode 120000
index 00000000..9f17500b
--- /dev/null
+++ b/patches/gcc/3.3.2/pr11162-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr11162-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr11587-1-test.patch b/patches/gcc/3.3.2/pr11587-1-test.patch
new file mode 120000
index 00000000..cdb9d8ed
--- /dev/null
+++ b/patches/gcc/3.3.2/pr11587-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr11587-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr11608-fix.patch b/patches/gcc/3.3.2/pr11608-fix.patch
new file mode 100644
index 00000000..b435126b
--- /dev/null
+++ b/patches/gcc/3.3.2/pr11608-fix.patch
@@ -0,0 +1,31 @@
+pr11608
+
+------------
+I'm building and testing an x86->sh4 crosscompiler with http://kegel.com/crosstool
+With either gcc-3.3 or gcc-ss-3_3-20030714 I get:
+
+Testing debug/20020327-1.c, -gstabs1
+...
+FAIL: gcc.dg/debug/20020327-1.c (test for excess errors)
+Excess errors:
+/tmp/cc8dFF7Y.s: Assembler messages:
+/tmp/cc8dFF7Y.s:66: Error: symbol `Letext' is already defined
+
+------------
+
+Index: elf.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sh/elf.h,v
+retrieving revision 1.32
+diff -u -p -r1.32 elf.h
+--- gcc-orig/gcc/config/sh/elf.h	27 Sep 2003 04:48:28 -0000	1.32
++++ gcc-new/gcc/config/sh/elf.h	2 Jan 2004 07:23:23 -0000
+@@ -95,7 +95,7 @@ while (0)
+ #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)			\
+ do {									\
+   text_section ();							\
+-  fprintf ((FILE), "\t.stabs \"\",%d,0,0,Letext\nLetext:\n", N_SO);	\
++  asm_fprintf ((FILE), "\t.stabs \"\",%d,0,0,%LLetext\n%LLetext:\n", N_SO); \
+ } while (0)
+ 
+ #undef STARTFILE_SPEC
diff --git a/patches/gcc/3.3.2/pr11736-1-test.patch b/patches/gcc/3.3.2/pr11736-1-test.patch
new file mode 120000
index 00000000..04a0841c
--- /dev/null
+++ b/patches/gcc/3.3.2/pr11736-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr11736-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr11864-1-test.patch b/patches/gcc/3.3.2/pr11864-1-test.patch
new file mode 120000
index 00000000..b40aaa0a
--- /dev/null
+++ b/patches/gcc/3.3.2/pr11864-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr11864-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/pr13260-test.patch b/patches/gcc/3.3.2/pr13260-test.patch
new file mode 100644
index 00000000..d9cc3e45
--- /dev/null
+++ b/patches/gcc/3.3.2/pr13260-test.patch
@@ -0,0 +1,56 @@
+See http://gcc.gnu.org/PR13260
+
+/cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c,v  -->  standard output
+revision 1.1
+--- -	1970-01-01 00:00:00.000000000 +0000
++++ gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c
+@@ -0,0 +1,49 @@
++/* PR optimization/13260 */
++
++#include <string.h>
++
++typedef unsigned long u32;
++
++u32 in_aton(const char* x)
++{
++  return 0x0a0b0c0d;
++}
++
++u32 root_nfs_parse_addr(char *name)
++{
++ u32 addr;
++ int octets = 0;
++ char *cp, *cq;
++
++ cp = cq = name;
++ while (octets < 4) {
++  while (*cp >= '0' && *cp <= '9')
++   cp++;
++  if (cp == cq || cp - cq > 3)
++   break;
++  if (*cp == '.' || octets == 3)
++   octets++;
++  if (octets < 4)
++   cp++;
++  cq = cp;
++ }
++
++ if (octets == 4 && (*cp == ':' || *cp == '\0')) {
++  if (*cp == ':')
++   *cp++ = '\0';
++  addr = in_aton(name);
++  strcpy(name, cp);
++ } else
++  addr = (-1);
++
++ return addr;
++}
++
++int
++main()
++{
++  static char addr[] = "10.11.12.13:/hello";
++  u32 result = root_nfs_parse_addr(addr);
++  if (result != 0x0a0b0c0d) { abort(); }
++  return 0;
++}
diff --git a/patches/gcc/3.3.2/pr9365-1-test.patch b/patches/gcc/3.3.2/pr9365-1-test.patch
new file mode 120000
index 00000000..a8eee166
--- /dev/null
+++ b/patches/gcc/3.3.2/pr9365-1-test.patch
@@ -0,0 +1 @@
+../3.3.1/pr9365-1-test.patch
\ No newline at end of file
diff --git a/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch b/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch
new file mode 100644
index 00000000..5c1895a4
--- /dev/null
+++ b/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch
@@ -0,0 +1,610 @@
+Fixes the problem
+	[ libdemo.so and main.o both use assignment on structures ]
+	$ sh4-unknown-linux-gnu-gcc libdemo.so main.o
+	sh4-unknown-linux-gnu/bin/ld: warning: type and size of dynamic symbol `__movstr_i4_even' are not defined
+	[ resulting app links, but crashes at runtime ]
+See testcase at http://tsukuba.m17n.org/linux-sh/ml/linux-sh/2003-11/msg00016.html
+
+Patch was posted as http://gcc.gnu.org/ml/gcc-patches/2002-11/msg01641.html
+and is in cvs as http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/lib1funcs.asm.diff?r1=1.29.4.1&r2=1.29.4.2
+
+but see also sh-libgcc-hidden.patch
+
+===================================================================
+
+--- gcc/gcc/config/sh/lib1funcs.asm	2002/09/20 01:29:21	1.29.4.1
++++ gcc/gcc/config/sh/lib1funcs.asm	2003/11/18 12:27:31
+@@ -38,9 +38,14 @@
+    amylaar@cygnus.com  */
+ 
+ #ifdef __ELF__
+-#define LOCAL(X) .L_##X
+-#else
+-#define LOCAL(X) L_##X
++#define LOCAL(X)	.L_##X
++#define FUNC(X)		.type X,@function
++#define ENDFUNC0(X)	.Lfe_##X: .size X,.Lfe_##X-X
++#define ENDFUNC(X)	ENDFUNC0(X)
++#else
++#define LOCAL(X)	L_##X
++#define FUNC(X)
++#define ENDFUNC(X)
+ #endif
+ 
+ #define	CONCAT(A,B)	A##B
+@@ -87,6 +92,40 @@
+ 	.global	GLOBAL(ashiftrt_r4_31)
+ 	.global	GLOBAL(ashiftrt_r4_32)
+ 
++	FUNC(GLOBAL(ashiftrt_r4_0))
++	FUNC(GLOBAL(ashiftrt_r4_1))
++	FUNC(GLOBAL(ashiftrt_r4_2))
++	FUNC(GLOBAL(ashiftrt_r4_3))
++	FUNC(GLOBAL(ashiftrt_r4_4))
++	FUNC(GLOBAL(ashiftrt_r4_5))
++	FUNC(GLOBAL(ashiftrt_r4_6))
++	FUNC(GLOBAL(ashiftrt_r4_7))
++	FUNC(GLOBAL(ashiftrt_r4_8))
++	FUNC(GLOBAL(ashiftrt_r4_9))
++	FUNC(GLOBAL(ashiftrt_r4_10))
++	FUNC(GLOBAL(ashiftrt_r4_11))
++	FUNC(GLOBAL(ashiftrt_r4_12))
++	FUNC(GLOBAL(ashiftrt_r4_13))
++	FUNC(GLOBAL(ashiftrt_r4_14))
++	FUNC(GLOBAL(ashiftrt_r4_15))
++	FUNC(GLOBAL(ashiftrt_r4_16))
++	FUNC(GLOBAL(ashiftrt_r4_17))
++	FUNC(GLOBAL(ashiftrt_r4_18))
++	FUNC(GLOBAL(ashiftrt_r4_19))
++	FUNC(GLOBAL(ashiftrt_r4_20))
++	FUNC(GLOBAL(ashiftrt_r4_21))
++	FUNC(GLOBAL(ashiftrt_r4_22))
++	FUNC(GLOBAL(ashiftrt_r4_23))
++	FUNC(GLOBAL(ashiftrt_r4_24))
++	FUNC(GLOBAL(ashiftrt_r4_25))
++	FUNC(GLOBAL(ashiftrt_r4_26))
++	FUNC(GLOBAL(ashiftrt_r4_27))
++	FUNC(GLOBAL(ashiftrt_r4_28))
++	FUNC(GLOBAL(ashiftrt_r4_29))
++	FUNC(GLOBAL(ashiftrt_r4_30))
++	FUNC(GLOBAL(ashiftrt_r4_31))
++	FUNC(GLOBAL(ashiftrt_r4_32))
++
+ 	.align	1
+ GLOBAL(ashiftrt_r4_32):
+ GLOBAL(ashiftrt_r4_31):
+@@ -166,6 +205,40 @@
+ GLOBAL(ashiftrt_r4_0):
+ 	rts
+ 	nop
++
++	ENDFUNC(GLOBAL(ashiftrt_r4_0))
++	ENDFUNC(GLOBAL(ashiftrt_r4_1))
++	ENDFUNC(GLOBAL(ashiftrt_r4_2))
++	ENDFUNC(GLOBAL(ashiftrt_r4_3))
++	ENDFUNC(GLOBAL(ashiftrt_r4_4))
++	ENDFUNC(GLOBAL(ashiftrt_r4_5))
++	ENDFUNC(GLOBAL(ashiftrt_r4_6))
++	ENDFUNC(GLOBAL(ashiftrt_r4_7))
++	ENDFUNC(GLOBAL(ashiftrt_r4_8))
++	ENDFUNC(GLOBAL(ashiftrt_r4_9))
++	ENDFUNC(GLOBAL(ashiftrt_r4_10))
++	ENDFUNC(GLOBAL(ashiftrt_r4_11))
++	ENDFUNC(GLOBAL(ashiftrt_r4_12))
++	ENDFUNC(GLOBAL(ashiftrt_r4_13))
++	ENDFUNC(GLOBAL(ashiftrt_r4_14))
++	ENDFUNC(GLOBAL(ashiftrt_r4_15))
++	ENDFUNC(GLOBAL(ashiftrt_r4_16))
++	ENDFUNC(GLOBAL(ashiftrt_r4_17))
++	ENDFUNC(GLOBAL(ashiftrt_r4_18))
++	ENDFUNC(GLOBAL(ashiftrt_r4_19))
++	ENDFUNC(GLOBAL(ashiftrt_r4_20))
++	ENDFUNC(GLOBAL(ashiftrt_r4_21))
++	ENDFUNC(GLOBAL(ashiftrt_r4_22))
++	ENDFUNC(GLOBAL(ashiftrt_r4_23))
++	ENDFUNC(GLOBAL(ashiftrt_r4_24))
++	ENDFUNC(GLOBAL(ashiftrt_r4_25))
++	ENDFUNC(GLOBAL(ashiftrt_r4_26))
++	ENDFUNC(GLOBAL(ashiftrt_r4_27))
++	ENDFUNC(GLOBAL(ashiftrt_r4_28))
++	ENDFUNC(GLOBAL(ashiftrt_r4_29))
++	ENDFUNC(GLOBAL(ashiftrt_r4_30))
++	ENDFUNC(GLOBAL(ashiftrt_r4_31))
++	ENDFUNC(GLOBAL(ashiftrt_r4_32))
+ #endif
+ 
+ #ifdef L_ashiftrt_n
+@@ -188,6 +261,7 @@
+ !
+ 
+ 	.global	GLOBAL(ashrsi3)
++	FUNC(GLOBAL(ashrsi3))
+ 	.align	2
+ GLOBAL(ashrsi3):
+ 	mov	#31,r0
+@@ -315,6 +389,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashrsi3))
+ #endif
+ 
+ #ifdef L_ashiftlt
+@@ -336,6 +411,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(ashlsi3)
++	FUNC(GLOBAL(ashlsi3))
+ 	.align	2
+ GLOBAL(ashlsi3):
+ 	mov	#31,r0
+@@ -472,6 +548,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashlsi3))
+ #endif
+ 
+ #ifdef L_lshiftrt
+@@ -493,6 +570,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(lshrsi3)
++	FUNC(GLOBAL(lshrsi3))
+ 	.align	2
+ GLOBAL(lshrsi3):
+ 	mov	#31,r0
+@@ -629,6 +707,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(lshrsi3))
+ #endif
+ 
+ #ifdef L_movstr
+@@ -645,76 +724,113 @@
+ 	add	#64,r4
+ 	.align	4
+ 	.global	GLOBAL(movstrSI64)
++	FUNC(GLOBAL(movstrSI64))
+ GLOBAL(movstrSI64):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+ 	.global	GLOBAL(movstrSI60)
++	FUNC(GLOBAL(movstrSI60))
+ GLOBAL(movstrSI60):
+ 	mov.l	@(56,r5),r0
+ 	mov.l	r0,@(56,r4)
+ 	.global	GLOBAL(movstrSI56)
++	FUNC(GLOBAL(movstrSI56))
+ GLOBAL(movstrSI56):
+ 	mov.l	@(52,r5),r0
+ 	mov.l	r0,@(52,r4)
+ 	.global	GLOBAL(movstrSI52)
++	FUNC(GLOBAL(movstrSI52))
+ GLOBAL(movstrSI52):
+ 	mov.l	@(48,r5),r0
+ 	mov.l	r0,@(48,r4)
+ 	.global	GLOBAL(movstrSI48)
++	FUNC(GLOBAL(movstrSI48))
+ GLOBAL(movstrSI48):
+ 	mov.l	@(44,r5),r0
+ 	mov.l	r0,@(44,r4)
+ 	.global	GLOBAL(movstrSI44)
++	FUNC(GLOBAL(movstrSI44))
+ GLOBAL(movstrSI44):
+ 	mov.l	@(40,r5),r0
+ 	mov.l	r0,@(40,r4)
+ 	.global	GLOBAL(movstrSI40)
++	FUNC(GLOBAL(movstrSI40))
+ GLOBAL(movstrSI40):
+ 	mov.l	@(36,r5),r0
+ 	mov.l	r0,@(36,r4)
+ 	.global	GLOBAL(movstrSI36)
++	FUNC(GLOBAL(movstrSI36))
+ GLOBAL(movstrSI36):
+ 	mov.l	@(32,r5),r0
+ 	mov.l	r0,@(32,r4)
+ 	.global	GLOBAL(movstrSI32)
++	FUNC(GLOBAL(movstrSI32))
+ GLOBAL(movstrSI32):
+ 	mov.l	@(28,r5),r0
+ 	mov.l	r0,@(28,r4)
+ 	.global	GLOBAL(movstrSI28)
++	FUNC(GLOBAL(movstrSI28))
+ GLOBAL(movstrSI28):
+ 	mov.l	@(24,r5),r0
+ 	mov.l	r0,@(24,r4)
+ 	.global	GLOBAL(movstrSI24)
++	FUNC(GLOBAL(movstrSI24))
+ GLOBAL(movstrSI24):
+ 	mov.l	@(20,r5),r0
+ 	mov.l	r0,@(20,r4)
+ 	.global	GLOBAL(movstrSI20)
++	FUNC(GLOBAL(movstrSI20))
+ GLOBAL(movstrSI20):
+ 	mov.l	@(16,r5),r0
+ 	mov.l	r0,@(16,r4)
+ 	.global	GLOBAL(movstrSI16)
++	FUNC(GLOBAL(movstrSI16))
+ GLOBAL(movstrSI16):
+ 	mov.l	@(12,r5),r0
+ 	mov.l	r0,@(12,r4)
+ 	.global	GLOBAL(movstrSI12)
++	FUNC(GLOBAL(movstrSI12))
+ GLOBAL(movstrSI12):
+ 	mov.l	@(8,r5),r0
+ 	mov.l	r0,@(8,r4)
+ 	.global	GLOBAL(movstrSI8)
++	FUNC(GLOBAL(movstrSI8))
+ GLOBAL(movstrSI8):
+ 	mov.l	@(4,r5),r0
+ 	mov.l	r0,@(4,r4)
+ 	.global	GLOBAL(movstrSI4)
++	FUNC(GLOBAL(movstrSI4))
+ GLOBAL(movstrSI4):
+ 	mov.l	@(0,r5),r0
+ 	mov.l	r0,@(0,r4)
++	.global	GLOBAL(movstrSI0)
++	FUNC(GLOBAL(movstrSI0))
+ GLOBAL(movstrSI0):
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(movstrSI64))
++	ENDFUNC(GLOBAL(movstrSI60))
++	ENDFUNC(GLOBAL(movstrSI56))
++	ENDFUNC(GLOBAL(movstrSI52))
++	ENDFUNC(GLOBAL(movstrSI48))
++	ENDFUNC(GLOBAL(movstrSI44))
++	ENDFUNC(GLOBAL(movstrSI40))
++	ENDFUNC(GLOBAL(movstrSI36))
++	ENDFUNC(GLOBAL(movstrSI32))
++	ENDFUNC(GLOBAL(movstrSI28))
++	ENDFUNC(GLOBAL(movstrSI24))
++	ENDFUNC(GLOBAL(movstrSI20))
++	ENDFUNC(GLOBAL(movstrSI16))
++	ENDFUNC(GLOBAL(movstrSI12))
++	ENDFUNC(GLOBAL(movstrSI8))
++	ENDFUNC(GLOBAL(movstrSI4))
++	ENDFUNC(GLOBAL(movstrSI0))
++
+ 	.align	4
+ 
+ 	.global	GLOBAL(movstr)
++	FUNC(GLOBAL(movstr))
+ GLOBAL(movstr):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+@@ -771,6 +887,8 @@
+ 	add	#64,r5
+ 	bra	GLOBAL(movstr)
+ 	add	#64,r4
++
++	FUNC(GLOBAL(movstr))
+ #endif
+ 
+ #ifdef L_movstr_i4
+@@ -779,6 +897,10 @@
+ 	.global	GLOBAL(movstr_i4_odd)
+ 	.global	GLOBAL(movstrSI12_i4)
+ 
++	FUNC(GLOBAL(movstr_i4_even))
++	FUNC(GLOBAL(movstr_i4_odd))
++	FUNC(GLOBAL(movstrSI12_i4))
++
+ 	.p2align	5
+ L_movstr_2mod4_end:
+ 	mov.l	r0,@(16,r4)
+@@ -787,6 +909,11 @@
+ 
+ 	.p2align	2
+ 
++GLOBAL(movstr_i4_even):
++	mov.l	@r5+,r0
++	bra	L_movstr_start_even
++	mov.l	@r5+,r1
++
+ GLOBAL(movstr_i4_odd):
+ 	mov.l	@r5+,r1
+ 	add	#-4,r4
+@@ -813,10 +940,8 @@
+ 	rts
+ 	mov.l	r3,@(12,r4)
+ 
+-GLOBAL(movstr_i4_even):
+-	mov.l	@r5+,r0
+-	bra	L_movstr_start_even
+-	mov.l	@r5+,r1
++	ENDFUNC(GLOBAL(movstr_i4_even))
++	ENDFUNC(GLOBAL(movstr_i4_odd))
+ 
+ 	.p2align	4
+ GLOBAL(movstrSI12_i4):
+@@ -827,12 +952,15 @@
+ 	mov.l	r1,@(4,r4)
+ 	rts
+ 	mov.l	r2,@(8,r4)
++
++	ENDFUNC(GLOBAL(movstrSI12_i4))
+ #endif
+ 
+ #ifdef L_mulsi3
+ 
+ 
+ 	.global	GLOBAL(mulsi3)
++	FUNC(GLOBAL(mulsi3))
+ 
+ ! r4 =       aabb
+ ! r5 =       ccdd
+@@ -865,7 +993,7 @@
+ 	rts
+ 	add	r2,r0
+ 
+-
++	FUNC(GLOBAL(mulsi3))
+ #endif
+ #endif /* ! __SH5__ */
+ #ifdef L_sdivsi3_i4
+@@ -875,6 +1003,7 @@
+ !! args in r4 and r5, result in fpul, clobber dr0, dr2
+ 
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	lds r4,fpul
+ 	float fpul,dr0
+@@ -884,6 +1013,7 @@
+ 	rts
+ 	ftrc dr0,fpul
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
+ 
+@@ -892,6 +1022,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	sts.l fpscr,@-r15
+ 	mov #8,r2
+@@ -906,6 +1037,7 @@
+ 	rts
+ 	lds.l @r15+,fpscr
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -920,9 +1052,10 @@
+ !!
+ !!
+ 
+-!! args in r4 and r5, result in r0 clobber r1,r2,r3
++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
+ 
+ 	.global	GLOBAL(sdivsi3)
++	FUNC(GLOBAL(sdivsi3))
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+ 	.section	.text..SHmedia32,"ax"
+@@ -1166,6 +1299,7 @@
+ div0:	rts
+ 	mov	#0,r0
+ 
++	ENDFUNC(GLOBAL(sdivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1174,9 +1308,11 @@
+ 	.title "SH DIVIDE"
+ !! 4 byte integer Divide code for the Hitachi SH
+ #ifdef __SH4__
+-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
++!! and t bit
+ 
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	mov #1,r1
+ 	cmp/hi r1,r5
+@@ -1217,11 +1353,13 @@
+ L1:
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #elif defined (__SH5__) && ! defined (__SH4_NOFPU__)
+ #if ! __SH5__ || __SH5__ == 32
+ !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33
+ 	.mode	SHmedia
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	addz.l	r4,r63,r20
+ 	addz.l	r5,r63,r21
+@@ -1234,6 +1372,8 @@
+ 	ftrc.dq dr0,dr32
+ 	fmov.s fr33,fr32
+ 	blink tr0,r63
++
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
+ !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
+@@ -1287,6 +1427,7 @@
+ #endif
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #endif /* ! __SH4__ */
+ #endif
+ 
+@@ -1297,6 +1438,7 @@
+ 
+ !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
+ 	.global	GLOBAL(udivsi3)
++	FUNC(GLOBAL(udivsi3))
+ 
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+@@ -1485,6 +1627,7 @@
+  rts
+  rotcl r0
+ 
++	ENDFUNC(GLOBAL(udivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* __SH4__ */
+ #endif /* L_udivsi3 */
+@@ -1790,6 +1933,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global GLOBAL(set_fpscr)
++	FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
+ 	mov.l LOCAL(set_fpscr_L1),r1
+@@ -1822,6 +1966,8 @@
+ 	.align 2
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++
++	ENDFUNC(GLOBAL(set_fpscr))
+ #ifdef __ELF__
+         .comm   GLOBAL(fpscr_values),8,4
+ #else
+@@ -1860,6 +2006,7 @@
+ 	blink	tr0, r63
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ 	.global GLOBAL(ic_invalidate)
++	FUNC(GLOBAL(ic_invalidate))
+ GLOBAL(ic_invalidate):
+ 	ocbwb	@r4
+ 	mova	0f,r0
+@@ -1882,6 +2029,8 @@
+ 	nop
+ 	.endr
+ 	.endr
++
++	ENDFUNC(GLOBAL(ic_invalidate))
+ #endif /* SH4 */
+ #endif /* L_ic_invalidate */
+ 
+@@ -1940,6 +2089,7 @@
+ 	will be expanded into r2/r3 upon return.  */
+ 	
+ 	.global	GLOBAL(GCC_shcompact_call_trampoline)
++	FUNC(GLOBAL(GCC_shcompact_call_trampoline))
+ GLOBAL(GCC_shcompact_call_trampoline):
+ 	ptabs/l	r0, tr0	/* Prepare to call the actual function.  */
+ 	movi	((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0
+@@ -2290,6 +2440,8 @@
+ 	shari	r2, 32, r2
+ #endif
+ 	blink	tr0, r63
++
++	ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline))
+ #endif /* L_shcompact_call_trampoline */
+ 
+ #ifdef L_shcompact_return_trampoline
+@@ -2302,6 +2454,7 @@
+ 	.section	.text..SHmedia32, "ax"
+ 	.align	2
+ 	.global	GLOBAL(GCC_shcompact_return_trampoline)
++	FUNC(GLOBAL(GCC_shcompact_return_trampoline))
+ GLOBAL(GCC_shcompact_return_trampoline):
+ 	ptabs/l	r18, tr0
+ #if __LITTLE_ENDIAN__
+@@ -2313,6 +2466,8 @@
+ #endif
+ 	or	r3, r2, r2
+ 	blink	tr0, r63
++
++	ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline))
+ #endif /* L_shcompact_return_trampoline */
+ 
+ #ifdef L_shcompact_incoming_args
+@@ -2367,6 +2522,7 @@
+ 	actual bit pattern.  */
+ 	
+ 	.global	GLOBAL(GCC_shcompact_incoming_args)
++	FUNC(GLOBAL(GCC_shcompact_incoming_args))
+ GLOBAL(GCC_shcompact_incoming_args):
+ 	ptabs/l	r18, tr0	/* Prepare to return.  */
+ 	shlri	r17, 32, r0	/* Load the cookie.  */
+@@ -2519,6 +2675,7 @@
+ LOCAL(ia_return):	/* Return.  */
+ 	blink	tr0, r63
+ LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction.  */
++	ENDFUNC(GLOBAL(GCC_shcompact_incoming_args))
+ #endif /* L_shcompact_incoming_args */
+ #endif
+ #if __SH5__
+@@ -2530,6 +2687,7 @@
+ #endif
+ 	.align	3 /* It is copied in units of 8 bytes in SHmedia mode.  */
+ 	.global	GLOBAL(GCC_nested_trampoline)
++	FUNC(GLOBAL(GCC_nested_trampoline))
+ GLOBAL(GCC_nested_trampoline):
+ 	.mode	SHmedia
+ 	ptrel/u	r63, tr0
+@@ -2546,6 +2704,8 @@
+ 	ld.l	r0, 28, r1
+ #endif
+ 	blink	tr1, r63
++
++	ENDFUNC(GLOBAL(GCC_nested_trampoline))
+ #endif /* L_nested_trampoline */
+ #endif /* __SH5__ */
+ #if __SH5__ == 32
+@@ -2555,6 +2715,7 @@
+ 	.align	2
+ #ifndef __SH4_NOFPU__	
+ 	.global	GLOBAL(GCC_push_shmedia_regs)
++	FUNC(GLOBAL(GCC_push_shmedia_regs))
+ GLOBAL(GCC_push_shmedia_regs):
+ 	addi.l	r15, -14*8, r15
+ 	fst.d	r15, 13*8, dr62
+@@ -2573,6 +2734,7 @@
+ 	fst.d	r15,  0*8, dr36
+ #endif
+ 	.global	GLOBAL(GCC_push_shmedia_regs_nofpu)
++	FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
+ GLOBAL(GCC_push_shmedia_regs_nofpu):
+ 	ptabs/l	r18, tr0
+ 	addi.l	r15, -27*8, r15
+@@ -2608,8 +2770,13 @@
+ 	st.q	r15,  0*8, r28
+ 	blink	tr0, r63
+ 
++#ifndef __SH4_NOFPU__	
++	ENDFUNC(GLOBAL(GCC_push_shmedia_regs))
++#endif
++	ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
+ #ifndef __SH4_NOFPU__
+ 	.global	GLOBAL(GCC_pop_shmedia_regs)
++	FUNC(GLOBAL(GCC_pop_shmedia_regs))
+ GLOBAL(GCC_pop_shmedia_regs):
+ 	pt	.L0, tr1
+ 	movi	41*8, r0
+@@ -2630,6 +2797,7 @@
+ 	blink	tr1, r63
+ #endif
+ 	.global	GLOBAL(GCC_pop_shmedia_regs_nofpu)
++	FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
+ GLOBAL(GCC_pop_shmedia_regs_nofpu):
+ 	movi	27*8, r0
+ .L0:
+@@ -2666,5 +2834,10 @@
+ 	ld.q	r15,  0*8, r28
+ 	add.l	r15, r0, r15
+ 	blink	tr0, r63
++
++#ifndef __SH4_NOFPU__
++	ENDFUNC(GLOBAL(GCC_pop_shmedia_regs))
++#endif
++	ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
+ #endif /* __SH5__ == 32 */
+ #endif /* L_push_pop_shmedia_regs */
diff --git a/patches/gcc/3.3.2/sh-libgcc-hidden.patch b/patches/gcc/3.3.2/sh-libgcc-hidden.patch
new file mode 100644
index 00000000..adccc0e2
--- /dev/null
+++ b/patches/gcc/3.3.2/sh-libgcc-hidden.patch
@@ -0,0 +1,122 @@
+[adjusted very slightly to apply to gcc-3.3.2 - dank]
+
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+I've noticed one more problem about this issue.  In the testcase given
+by ZhouChang, libdemo.so exports __movstr_i4_even which is a function
+in libgcc.a. This itself is not a problem but it means that some functions
+in libgcc.a which should not be exported from shared objects might be
+exported from shared libs
+
+Date: Wed, 19 Nov 2003 09:04:12 +0900 (JST)
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:03096] Re: [linux]  Re: About tool chain in
+ http://kegel.com/crosstool/
+To: dank@kegel.com
+Cc: zjuzhou@yahoo.com.cn, linux-sh@m17n.org, zhan_sh@yahoo.com.cn,
+	crossgcc@sources.redhat.com
+Message-Id: <20031119.090412.85413542.kkojima@rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> I'll try that, thanks.  I notice that the '.hidden' isn't in cvs yet.
+> I also notice you've been trying to get that into CVS for two years
+> now (http://gcc.gnu.org/ml/gcc-patches/2001-10/msg00053.html).
+> Time for another try?  It'd be nice if gcc-3.4 (and maybe even gcc-3.3.3)
+> didn't need a patch for this.
+
+The situation is a bit complicated. sh-linux target doesn't make
+shared libgcc in gcc-3.3.x.
+OTOH, I withdrew that .hidden patch because gcc-3.3 has a general
+mechanism to make all libgcc functions .hidden. But I missed that
+that mechanism was conditionalized later so that it's done only
+when the target creates the shared libgcc.
+In 3.4, sh-linux target becomes to use the shared libgcc like as
+all other linux targets, so there is no problem.
+
+I inclined to backport 3.4 shared libgcc stuff to 3.3.3 rather
+than the old .hidden patch. How do you think about it?
+I'm happy if you or ZhouChang create a PR on gcc bugzilla about
+this issue.
+
+Regards,
+	kaz
+--
+	This is a backport of 3.4 shared libgcc stuff to 3.3 branch.
+	* config.gcc (sh*-*-linux*): Add t-slibgcc-elf-ver and t-linux.
+        to tmake_file.	* config/sh/libgcc-glibc.ver: New file.
+	* config/sh/t-linux (SHLIB_LINK): Override to use a linker script
+	libgcc_s.so.
+	(SHLIB_INSTALL): Likewise.
+
+diff -u3prN ORIG/gcc-3.3/gcc/config/sh/libgcc-glibc.ver gcc-3.3/gcc/config/sh/libgcc-glibc.ver
+--- ORIG/gcc-3.3/gcc/config/sh/libgcc-glibc.ver	Thu Jan  1 09:00:00 1970
++++ gcc-3.3/gcc/config/sh/libgcc-glibc.ver	Wed Nov 19 08:15:16 2003
+@@ -0,0 +1,21 @@
++# In order to work around the very problems that force us to now generally
++# create a libgcc.so, glibc reexported a number of routines from libgcc.a.
++# By now choosing the same version tags for these specific routines, we
++# maintain enough binary compatibility to allow future versions of glibc
++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY.
++
++# Note that we cannot use the default libgcc-glibc.ver file on sh,
++# because GLIBC_2.0 does not exist on this architecture, as the first 
++# ever glibc release on the platform was GLIBC_2.2.
++
++%inherit GCC_3.0 GLIBC_2.2
++GLIBC_2.2 {
++  __register_frame
++  __register_frame_table
++  __deregister_frame
++  __register_frame_info
++  __deregister_frame_info
++  __frame_state_for
++  __register_frame_info_table
++}
++
+diff -u3prN ORIG/gcc-3.3/gcc/config/sh/t-linux gcc-3.3/gcc/config/sh/t-linux
+--- ORIG/gcc-3.3/gcc/config/sh/t-linux	Fri Jun  6 11:07:14 2003
++++ gcc-3.3/gcc/config/sh/t-linux	Wed Nov 19 08:09:26 2003
+@@ -12,3 +12,27 @@ MULTILIB_MATCHES = 
+ MULTILIB_EXCEPTIONS=
+ 
+ EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o
++
++# Override t-slibgcc-elf-ver to export some libgcc symbols with
++# the symbol versions that glibc used.
++SHLIB_MAPFILES =  $(srcdir)/libgcc-std.ver $(srcdir)/config/sh/libgcc-glibc.ver
++
++# Override SHLIB_LINK and SHLIB_INSTALL to use linker script
++# libgcc_s.so.
++SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
++	-Wl,--soname=$(SHLIB_SONAME) \
++	-Wl,--version-script=$(SHLIB_MAP) \
++	-o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
++	rm -f $(SHLIB_SOLINK) && \
++	(echo "/* GNU ld script"; \
++	 echo "   Use the shared library, but some functions are only in"; \
++	 echo "   the static library.  */"; \
++	 echo "GROUP ( $(SHLIB_SONAME) libgcc.a )" \
++	) > $(SHLIB_SOLINK)
++SHLIB_INSTALL = \
++	$$(SHELL) $$(srcdir)/mkinstalldirs $$(slibdir)$(SHLIB_SLIBDIR_QUAL); \
++	$(INSTALL_DATA) $(SHLIB_NAME) \
++	  $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
++	rm -f $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
++	$(INSTALL_DATA) $(SHLIB_SOLINK) \
++	  $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
+diff -u3prN ORIG/gcc-3.3/gcc/config.gcc gcc-3.3/gcc/config.gcc
+--- ORIG/gcc-3.3/gcc/config.gcc	Sat Aug  9 07:19:07 2003
++++ gcc-3.3/gcc/config.gcc	Wed Nov 19 08:07:53 2003
+@@ -2308,7 +2308,7 @@ sh-*-rtems*)
+ 	fi
+ 	;;
+ sh-*-linux* | sh[2346lbe]*-*-linux*)
+-	tmake_file="sh/t-sh sh/t-elf"
++	tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux"
+ 	case $machine in
+ 	sh*be-*-* | sh*eb-*-*) ;;
+ 	*)
+
+
diff --git a/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch b/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch
new file mode 100644
index 00000000..2a9d592b
--- /dev/null
+++ b/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch
@@ -0,0 +1,67 @@
+See http://gcc.gnu.org/PR11901
+Should fix
+make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 
+in glibc's "make tests".
+
+Note: this patch is named
+sh-pic-set_fpscr-gcc-3.3.2.patch
+and must be applied after 
+sh-lib1funcs_sizeAndType.patch
+but that'll happen naturally if you apply them in alphabetical order.
+
+-------------
+
+Date: Wed, 30 Jul 2003 12:03:01 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02916] Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+To: dank@kegel.com
+Cc: linux-sh@m17n.org
+Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp>
+
+> I'll try to write the PIC version of it,
+
+Dan, does the attached patch work for you?
+
+Regards,
+	kaz
+--
+diff -u3prN ORIG/gcc/gcc/config/sh/lib1funcs.asm LOCAL/gcc/gcc/config/sh/lib1funcs.asm
+--- ORIG/gcc/gcc/config/sh/lib1funcs.asm	Thu Jun 19 07:38:59 2003
++++ gcc-3.3.2/gcc/config/sh/lib1funcs.asm	Wed Jul 30 11:08:49 2003
+@@ -1936,7 +1944,17 @@ GLOBAL(moddi3):
+ 	FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
++#ifdef __PIC__
++	mov.l	r12,@-r15
++	mova	LOCAL(set_fpscr_L0),r0
++	mov.l	LOCAL(set_fpscr_L0),r12
++	add	r0,r12
++	mov.l	LOCAL(set_fpscr_L1),r0
++	mov.l	@(r0,r12),r1
++	mov.l	@r15+,r12
++#else
+ 	mov.l LOCAL(set_fpscr_L1),r1
++#endif
+ 	swap.w r4,r0
+ 	or #24,r0
+ #ifndef FMOVD_WORKS
+@@ -1964,8 +1982,15 @@ GLOBAL(set_fpscr):
+ 	mov.l r3,@(4,r1)
+ #endif
+ 	.align 2
++#ifdef __PIC__
++LOCAL(set_fpscr_L0):
++	.long _GLOBAL_OFFSET_TABLE_
++LOCAL(set_fpscr_L1):
++	.long GLOBAL(fpscr_values@GOT)
++#else
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++#endif
+ 
+ 	ENDFUNC(GLOBAL(set_fpscr))
+ #ifndef NO_FPSCR_VALUES
+
+
diff --git a/patches/gcc/3.3.2/thunk3.patch b/patches/gcc/3.3.2/thunk3.patch
new file mode 100644
index 00000000..7974a0c0
--- /dev/null
+++ b/patches/gcc/3.3.2/thunk3.patch
@@ -0,0 +1,23 @@
+Fixes 
+FAIL: g++.jason/thunk3.C (test for excess errors)
+on sh4-unknown-linux-gnu.
+
+Does any sh variant *not* use the generic thunk support?  If so, the patch should be
+more cautious.  As it is, it excludes all sh processors from this test.
+
+Index: thunk3.C
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v
+retrieving revision 1.13
+diff -u -d -u -r1.13 thunk3.C
+--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old	25 Mar 2002 17:57:03 -0000	1.13
++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C	20 Jul 2003 16:57:38 -0000
+@@ -2,7 +2,7 @@
+ // Note that this will break on any target that uses the generic thunk
+ //  support, because it doesn't support variadic functions.
+ 
+-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-*
++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-*
+ 
+ #include <stdarg.h>
+ 
diff --git a/patches/gcc/3.3.3/config.sub.patch b/patches/gcc/3.3.3/config.sub.patch
new file mode 100644
index 00000000..928f9115
--- /dev/null
+++ b/patches/gcc/3.3.3/config.sub.patch
@@ -0,0 +1,72 @@
+When configuring a s390->s390 or cris->cris crosscompiler
+(ok, I haven't hit this yet, but one of these days I'll get me an account
+on an s390, and then I'll need this patch :-), you'll get the
+following error:
+
++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure
+--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu
+--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2
+--enable-languages=c
+--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390-
+unknown-linux-gnu --enable-threads=no --without-headers --with-newlib
+--disable-shared
+...
+*** --with-headers is only supported when cross compiling
+
+This error pops up only when you're using Daniel Jacobowitz's technique
+of slightly changing the target and host tuples to make them different
+enough to force gcc's build system to not try to pull in system libraries
+or headers.  This technique is needed e.g. to build an x86 -> x86
+cross-compiler.
+(The LFS developers ran into the same bug that prompted me to use
+this technique; they point people who run into it to
+http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different
+way of avoiding this problem.  I think the tuple tweak is the way to go, though.)
+
+config-patches@gnu.org rejected this patch, on the grounds that there
+is only one vendor of each of those two architectures, so the 
+canonicalization is by definition correct.  When I pointed out the
+difficulty this causes for people building s390 -> s390 or
+cris -> cris compilers that are incompatible with the system
+libraries and thus must be built like cross-compilers, he grumped and said 
+"autoconf should let you specify a cross-compiler in some other way than
+comparing tuple strings".
+
+
+
+--- gcc-3.3/config.sub.old	Sun Jun  8 20:38:47 2003
++++ gcc-3.3/config.sub	Sun Jun  8 20:40:34 2003
+@@ -433,9 +433,12 @@
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
+-	cris | cris-* | etrax*)
++	cris | etrax*)
+ 		basic_machine=cris-axis
+ 		;;
++	cris-*)
++		basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+@@ -820,11 +823,17 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
+-	s390 | s390-*)
++	s390)
+ 		basic_machine=s390-ibm
+ 		;;
+-	s390x | s390x-*)
++	s390-*)
++		basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	s390x)
+ 		basic_machine=s390x-ibm
++		;;
++	s390x-*)
++		basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	sa29200)
+ 		basic_machine=a29k-amd
diff --git a/patches/gcc/3.3.3/empty6.patch b/patches/gcc/3.3.3/empty6.patch
new file mode 100644
index 00000000..1b0715ce
--- /dev/null
+++ b/patches/gcc/3.3.3/empty6.patch
@@ -0,0 +1,21 @@
+From 3.4 branch.  Fixes test failure
+FAIL: g++.dg/abi/empty6.C  (test for warnings, line 6)
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- gcc/gcc/testsuite/g++.dg/abi/empty6.C	2002/09/25 19:07:35	1.1
++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C	2003/06/03 19:10:09	1.2
+@@ -5,4 +5,9 @@
+ struct B {
+   A a; // { dg-warning "empty" }
+   virtual void f () {}
+-};
++} __attribute__((aligned(8)));
++/* The preceding attribute is necessary on targets with
++   BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit
++   offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0,
++   and then there is no discrepancy between DECL_FIELD_OFFSET and
++   byte_position to warn about.  */
diff --git a/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch b/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch
new file mode 100644
index 00000000..9ec6c53c
--- /dev/null
+++ b/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch
@@ -0,0 +1,65 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+ 
+See http://gcc.gnu.org/PR16350
+ 
+diff -urN gcc-3.3.2.orig/gcc/config/arm/linux-elf.h gcc-3.3.2/gcc/config/arm/linux-elf.h
+--- gcc-3.3.2.orig/gcc/config/arm/linux-elf.h	2003-09-16 17:39:23.000000000 +0200
++++ gcc-3.3.2/gcc/config/arm/linux-elf.h	2004-07-07 14:03:54.329839922 +0200
+@@ -30,15 +30,29 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT)
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -86,7 +100,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+diff -urN gcc-3.3.2.orig/gcc/config.gcc gcc-3.3.2/gcc/config.gcc
+--- gcc-3.3.2.orig/gcc/config.gcc	2003-10-01 21:07:01.000000000 +0200
++++ gcc-3.3.2/gcc/config.gcc	2004-07-07 14:04:59.046716638 +0200
+@@ -699,6 +699,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h"
++	case $machine in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch b/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch
new file mode 100644
index 00000000..437c2a1e
--- /dev/null
+++ b/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch
@@ -0,0 +1,44 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.3.3-orig/configure gcc-3.3.3/configure
+--- gcc-3.3.3-orig/configure	2002-09-29 18:11:24.000000000 +0200
++++ gcc-3.3.3/configure	2005-04-20 21:03:51.000000000 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -rf Makefile* ${tmpdir}
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1596,7 +1596,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/3.3.3/pr10392-1-test.patch b/patches/gcc/3.3.3/pr10392-1-test.patch
new file mode 100644
index 00000000..e94c8b9b
--- /dev/null
+++ b/patches/gcc/3.3.3/pr10392-1-test.patch
@@ -0,0 +1,65 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10392-1.c	Sun Sep 14 14:28:24 2003
+@@ -0,0 +1,62 @@
++/* PR optimization/10392
++ * Reporter: marcus@mc.pp.se
++ * Summary: [3.3/3.4 regression] [SH] optimizer generates faulty array indexing
++ * Description:
++ * The address calculation of an index operation on an array on the stack 
++ * can _under some conditions_ get messed up completely
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Problem only happens with -O2 -m4, so it should only happen on sh4,
++ * but what the heck, let's test other architectures, too.
++ * Not marked as xfail since it's a regression.
++*/
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++/* { dg-options "-O2 -m4" { target sh4-*-* } } */
++const char *dont_optimize_function_away;
++
++const char *use(const char *str)
++{
++	dont_optimize_function_away = str;
++	if (str[0] != 'v')
++		abort();
++	if (str[1] < '1' || str[1] > '6')
++		abort();
++	if (str[2])
++		abort();
++	return str[2] ? "notused" : "v6";
++}
++
++const char *func(char *a, char *b)
++{
++	char buf[128];
++	unsigned char i;
++	const char *result;
++
++	char *item[] = {
++		"v1",
++		"v2",
++	};
++
++	buf[0] = 'v';
++	buf[1] = '3';
++	buf[2] = 0;
++
++	for (i = 0; i < 2; i++) {
++		/* bug is: following line passes wild pointer to use() on sh4 -O2 */
++		result = use(item[i]);
++
++		use(buf);
++		use(a);
++		use(b);
++		result = use(result);
++	}
++	return result;
++}
++
++int main()
++{
++	func("v4", "v5");
++	return 0;
++}
++
diff --git a/patches/gcc/3.3.3/pr10412-1-test.patch b/patches/gcc/3.3.3/pr10412-1-test.patch
new file mode 100644
index 00000000..6ca05258
--- /dev/null
+++ b/patches/gcc/3.3.3/pr10412-1-test.patch
@@ -0,0 +1,46 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10412-1.c	Sun Sep 14 16:15:21 2003
+@@ -0,0 +1,43 @@
++/* PR target/10412
++ * Reporter: shrinivasa@kpitcummins.com 
++ * Summary: Renesas SH - Incorrect code generation
++ * Description:
++ * When following code is compiled  with
++ * sh-elf-gcc  -S -mhitachi -m2 -O2 bug1.c
++ * generates an incorrect code.
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Problem only happens with -mhitachi -m2.  Not sure if I can give those
++ * options for all sh targets.  They work on sh4, though.
++ * Not marked as xfail as it's a regression relative to hardhat 2.0 gcc-2.97.
++*/
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++int global_val;
++
++int func0(int x)
++{
++	global_val += x;
++	return (x != 99);
++}
++
++int func1(unsigned long addr)
++{
++	int err;
++
++	err = func0(addr);
++	if (err)
++		return (err);
++
++	err = func0(addr * 7);	/* address of func0 is lost during multiplication -> probable SIGSEGV */
++	return (err);
++}
++
++int main(int argc, char **argv)
++{
++	global_val = 0;
++	global_val += func1(99);
++	if (global_val != 99 * 8 + 1)
++		abort();
++	return 0;
++}
diff --git a/patches/gcc/3.3.3/pr10589-1-test.patch b/patches/gcc/3.3.3/pr10589-1-test.patch
new file mode 100644
index 00000000..04882e51
--- /dev/null
+++ b/patches/gcc/3.3.3/pr10589-1-test.patch
@@ -0,0 +1,17 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10589-1.c	Mon Sep 15 08:57:58 2003
+@@ -0,0 +1,14 @@
++/* PR target/10589
++ * Reporter: mathieu@thenesis.com
++ * Summary: For Hitachi SH target, GCC crashes when both -fomit-frame-pointer and -mdalign options are specified
++ * Keywords: ice-on-valid-code
++ * Testcase by Kazu Hirata, tweaked by dank@kegel.com
++ * Did not fail in Hard Hat 2.0 gcc-2.97, nor in dodes gcc-3.0.2, so this is a regression, so I'm not marking it xfail
++ */
++/* { dg-do compile { target sh*-*-* } } */
++/* { dg-options "-fomit-frame-pointer -mdalign" } */
++
++int foo(int a, int b)
++{
++	return a / b;
++}
diff --git a/patches/gcc/3.3.3/pr11162-1-test.patch b/patches/gcc/3.3.3/pr11162-1-test.patch
new file mode 100644
index 00000000..9ab0d324
--- /dev/null
+++ b/patches/gcc/3.3.3/pr11162-1-test.patch
@@ -0,0 +1,25 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11162-1.c	Sun Sep 14 16:24:41 2003
+@@ -0,0 +1,22 @@
++/*
++ * PR optimization/11162
++ * Reporter: Toshiyasu Morita <tm@kloo.net>
++ * Summary: [3.4 Regression] [-fnew-ra] ICE compiling channel.i on sh
++ * Keywords: ice-on-valid-code
++ * Description:
++ * [ICE] when channel.i from stress-1.17 is compiled with options:
++ * -O2 -m4 -fnew-ra
++ * ...
++ * The CFG code gets confused by the addition of a USE insn after a sibcall.
++ * Sibcalls are supposed to end the block (and the function!), so the fact
++ * that we have an instruction following one (even if its fake) is confusing.
++ *
++ * testcase tweaked by dank@kegel.com
++ */
++/* { dg-do compile } */
++/* { dg-options "-O2 -fnew-ra" } */
++
++int foo(char *p1)
++{
++	return bar(p1);
++}
diff --git a/patches/gcc/3.3.3/pr11587-1-test.patch b/patches/gcc/3.3.3/pr11587-1-test.patch
new file mode 100644
index 00000000..f6dedde0
--- /dev/null
+++ b/patches/gcc/3.3.3/pr11587-1-test.patch
@@ -0,0 +1,39 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11587-1.c	Mon Sep 15 08:46:00 2003
+@@ -0,0 +1,36 @@
++/* PR optimization/11587
++ * Reporter: Michael Eager <eager@mvista.com>
++ * Summary: [3.3/3.4 Regression] SH ICE in reload_cse_simplify_operand, postreload.c
++ * Keywords: ice-on-valid-code
++ *
++ * Note: a fix exists; see bugzilla
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Not marked as xfail since it's a regression.
++ */
++
++/* { dg-do compile } */
++/* { dg-options "-O1" } */
++int foo1(void);
++int foo2();
++int foo3();
++
++static int goo()
++{
++	int i;
++
++	if (i <= 0)
++		return i;
++
++	if (foo1() > 1) {
++		i = foo2();
++		if (i < 0)
++			return i;
++		if (i) {
++			if (foo3())
++				return 1;
++			return 0;
++		}
++	}
++
++}
diff --git a/patches/gcc/3.3.3/pr11608.patch b/patches/gcc/3.3.3/pr11608.patch
new file mode 100644
index 00000000..b45959c3
--- /dev/null
+++ b/patches/gcc/3.3.3/pr11608.patch
@@ -0,0 +1,26 @@
+# See http://gcc.gnu.org/PR11608
+# Fixes following error when testing sh4 toolchain:
+# 
+# Testing debug/20020327-1.c, -gstabs1
+# ...
+# FAIL: gcc.dg/debug/20020327-1.c (test for excess errors)
+# Excess errors:
+# /tmp/cc8dFF7Y.s: Assembler messages:
+# /tmp/cc8dFF7Y.s:66: Error: symbol `Letext' is already defined
+
+Index: elf.h
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sh/elf.h,v
+retrieving revision 1.32
+diff -u -p -r1.32 elf.h
+--- gcc/gcc/config/sh/elf.h.old	27 Sep 2003 04:48:28 -0000	1.32
++++ gcc/gcc/config/sh/elf.h	2 Jan 2004 07:23:23 -0000
+@@ -95,7 +95,7 @@ while (0)
+ #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)			\
+ do {									\
+   text_section ();							\
+-  fprintf ((FILE), "\t.stabs \"\",%d,0,0,Letext\nLetext:\n", N_SO);	\
++  asm_fprintf ((FILE), "\t.stabs \"\",%d,0,0,%LLetext\n%LLetext:\n", N_SO); \
+ } while (0)
+ 
+ #undef STARTFILE_SPEC
diff --git a/patches/gcc/3.3.3/pr11736-1-test.patch b/patches/gcc/3.3.3/pr11736-1-test.patch
new file mode 100644
index 00000000..ea544b12
--- /dev/null
+++ b/patches/gcc/3.3.3/pr11736-1-test.patch
@@ -0,0 +1,48 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11736-1.c	Sun Sep 14 14:26:33 2003
+@@ -0,0 +1,45 @@
++/* PR optimization/11736
++ * Reporter: marcus@mc.pp.se
++ * Summary:  Stackpointer messed up on SuperH
++ * Keywords: wrong-code
++ * Description:
++ * When a function with 5 arguments is called in both branches of a
++ * conditional, and only the last argument differs, the code to push that
++ * last argument on the stack gets confused. 
++ * Space for the fifth argument is reserved on the stack by the
++ * instruction I have marked as "A".  However, if the else-branch is
++ * taken the stackpointer is decremented _again_ at "B".  This
++ * decrementation is never restored, and it is only due to the
++ * restoration of r15 from r14 that the function works at all.  With
++ * -fomit-frame-pointer it will crash.
++ *
++ * Testcase tweaked by dank@kegel.com
++ * Not marked as xfail since it's a regression from hardhat 2.0 gcc-2.97 
++ * and dodes gcc-3.0.2
++ */
++
++/* { dg-do run } */
++/* { dg-options "-O1 -fomit-frame-pointer" } */
++
++int expected_e;
++
++void bar(int a, int b, int c, int d, int e)
++{
++	if (e != expected_e)
++		abort();
++}
++
++void foo(int a)
++{
++	if (a)
++		bar(0, 0, 0, 0, 1);
++	else
++		bar(0, 0, 0, 0, 0);	/* stack pointer decremented extra time here, causing segfault */
++}
++
++int main(int argc, char **argv)
++{
++	for (expected_e = 0; expected_e < 2; expected_e++)
++		foo(expected_e);
++	return 0;
++}
diff --git a/patches/gcc/3.3.3/pr11864-1-test.patch b/patches/gcc/3.3.3/pr11864-1-test.patch
new file mode 100644
index 00000000..f5b0d175
--- /dev/null
+++ b/patches/gcc/3.3.3/pr11864-1-test.patch
@@ -0,0 +1,45 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11864-1.c	Sun Sep 14 14:32:24 2003
+@@ -0,0 +1,42 @@
++/* PR optimization/11864
++ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org>
++ * Summary: [3.3/3.4 regression] miscompiles zero extension and test
++ * Description:
++ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension
++ * and test if it's zero.
++ *
++ * Testcase tweaked by dank@kegel.com.  Not marked as xfail because it's a regression.
++ */
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++
++extern void abort(void);
++
++int val = 0xff00;
++
++int f(void)
++{
++	return val;
++}
++
++unsigned char a[1];
++
++void foo(void)
++{
++	a[0] = f() & 255;
++
++	if (!a[0])
++		a[0] = f() & 255;
++
++	if (!a[0])
++		a[0] = 1 + (f() & 127);
++}
++
++int main(int argc, char **argv)
++{
++	foo();
++	if (!a[0])
++		abort();
++
++	return 0;
++}
diff --git a/patches/gcc/3.3.3/pr12009.patch b/patches/gcc/3.3.3/pr12009.patch
new file mode 100644
index 00000000..cb294d57
--- /dev/null
+++ b/patches/gcc/3.3.3/pr12009.patch
@@ -0,0 +1,85 @@
+See http://gcc.gnu.org/PR12009
+
+Fixes the following problems when testing a cross-compiler:
+
+============================================
+Testing g++.dg/compat/abi/bitfield1,
+...
+Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-gli
+bc-2.2.5/build-gcc/gcc/testsuite/../g++  ...
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/test
+suite/g++.dg/compat/abi/bitfield1_main.C
+pid is 16028 -16028
+compiler exited with status 1
+output is:
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gc
+c-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding
+ not little-endian
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/te
+stsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-
+linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file da
+ta encoding not little-endian
+
+FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile
+============================================
+
+and
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+
+
+--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old	Thu Oct 17 17:22:57 2002
++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp	Mon Jul 14 10:59:19 2003
+@@ -42,11 +42,13 @@
+ proc compat-fix-library-path { } {
+     global ld_library_path
+ 
+-    # See comments in lib/g++.exp for why this is needed.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++	# See comments in lib/g++.exp for why this is needed.
++	setenv  LD_LIBRARY_PATH     $ld_library_path
++	setenv  SHLIB_PATH          $ld_library_path
++	setenv  LD_LIBRARYN32_PATH  $ld_library_path
++	setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ }
+ 
+ #
+--- gcc-3.4-20030813/gcc/testsuite/lib/g++.exp.orig	Tue Jun 17 18:56:45 2003
++++ gcc-3.4-20030813/gcc/testsuite/lib/g++.exp	Sun Aug 17 18:35:38 2003
+@@ -166,16 +182,20 @@
+       }
+     }
+ 
+-    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+-    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+-    # (for the 64-bit ABI).  The right way to do this would be to modify
+-    # unix.exp -- but that's not an option since it's part of DejaGNU
+-    # proper, so we do it here.  We really only need to do 
+-    # this on IRIX, but it shouldn't hurt to do it anywhere else.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++      # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++      # (for the 64-bit ABI).  The right way to do this would be to modify
++      # unix.exp -- but that's not an option since it's part of DejaGNU
++      # proper, so we do it here.  We really only need to do 
++      # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++      # Doing this causes us to be unable to run cross-compilers.
++      setenv  LD_LIBRARY_PATH     $ld_library_path
++      setenv  SHLIB_PATH          $ld_library_path
++      setenv  LD_LIBRARYN32_PATH  $ld_library_path
++      setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ 
+     return "$flags"
+ }
diff --git a/patches/gcc/3.3.3/pr12010.patch b/patches/gcc/3.3.3/pr12010.patch
new file mode 100644
index 00000000..bb7f171e
--- /dev/null
+++ b/patches/gcc/3.3.3/pr12010.patch
@@ -0,0 +1,81 @@
+Adjusted for gcc-3.3-20040119
+
+See http://gcc.gnu.org/PR12010
+
+Without this patch, one gets both compile and link time errors in
+'make check' when configured for cross-compiling.
+
+In particular, 'make check' on a cross-compiler fails with
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+    while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+    (procedure "g++_include_flags" line 21)
+    invoked from within
+"g++_include_flags [get_multilibs] "
+    (procedure "g++_init" line 63)
+    invoked from within
+"${tool}_init $test_file_name"
+    (procedure "runtest" line 19)
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+--- gcc-3.3-20040119/gcc/testsuite/lib/g++.exp.orig	2004-01-25 17:56:24.000000000 -0800
++++ gcc-3.3-20040119/gcc/testsuite/lib/g++.exp	2004-01-25 18:29:44.000000000 -0800
+@@ -72,6 +72,8 @@ proc g++_version { } {
+ #
+ proc g++_include_flags { paths } {
+     global srcdir
++    global objdir
++    global target_triplet
+     global HAVE_LIBSTDCXX_V3
+     global TESTING_IN_BUILD_TREE
+ 
+@@ -90,6 +92,20 @@ proc g++_include_flags { paths } {
+ 
+     if { ${HAVE_LIBSTDCXX_V3} } {
+       set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++          # first assume no multilibs
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++          # assume multilib only one level deep
++          set multisub [file tail $gccpath]
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++           error "Can't find libstdc++-v3"
++      }
+       append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+     } else {
+       set odir_v2 [lookfor_file ${gccpath} libstdc++]
+
+--- gcc-3.3-20040119/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old	Sun Jul 13 10:42:01 2003
++++ gcc-3.3-20040119/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp	Sun Jul 13 11:39:54 2003
+@@ -48,8 +48,23 @@
+     global ld_library_path
+     global original_ld_library_path
+     global tool_root_dir
++    global target_triplet
+ 
+     set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++    if { $blddir == "" } {
++        set multilibs [get_multilibs]
++        # FIXME: assume multilib only one level deep
++        set multisub [file tail $multilibs]
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++        set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++        set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++         error "Can't find libstdc++-v3"
++    }
+ 
+     # By default, we assume we want to run program images.
+     global dg-do-what-default
diff --git a/patches/gcc/3.3.3/pr13250-fix.patch b/patches/gcc/3.3.3/pr13250-fix.patch
new file mode 100644
index 00000000..ce68bb1b
--- /dev/null
+++ b/patches/gcc/3.3.3/pr13250-fix.patch
@@ -0,0 +1,19 @@
+See http://gcc.gnu.org/PR13250
+Fixes bad code generated when compiling SHA256 for SH processor
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.md,v
+retrieving revision 1.171
+retrieving revision 1.172
+diff -u -r1.171 -r1.172
+--- gcc/gcc/config/sh/sh.md	2004/05/10 23:25:13	1.171
++++ gcc/gcc/config/sh/sh.md	2004/05/28 05:47:36	1.172
+@@ -2194,7 +2194,7 @@
+ 	parts[0] = gen_reg_rtx (SImode);
+ 	parts[1] = gen_reg_rtx (SImode);
+ 	emit_insn (gen_rotlsi3_16 (parts[2-choice], operands[1]));
+-	parts[choice-1] = operands[1];
++	emit_move_insn (parts[choice-1], operands[1]);
+ 	emit_insn (gen_ashlsi3 (parts[0], parts[0], GEN_INT (8)));
+ 	emit_insn (gen_lshrsi3 (parts[1], parts[1], GEN_INT (8)));
+ 	emit_insn (gen_iorsi3 (operands[0], parts[0], parts[1]));
diff --git a/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch b/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch
new file mode 100644
index 00000000..7587ad81
--- /dev/null
+++ b/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch
@@ -0,0 +1,246 @@
+Date: Fri, 06 Feb 2004 12:35:58 +0900
+From: SUGIOKA Toshinobu <sugioka@itonet.co.jp>
+Subject: [linux-sh:03150] Re: gcc 3.3 optimisation problem
+To: linux-sh@m17n.org
+Message-Id: <4.2.0.58.J.20040206122503.04fe3058@router.itonet.co.jp>
+List-Help: <mailto:linux-sh-ctl@m17n.org?body=help>
+List-Id: linux-sh.m17n.org
+
+At 19:40 03/12/01 +0000, Stuart Menefy <stuart.menefy@st.com> wrote:
+>On Sat, 29 Nov 2003 20:19:08 +0900 kkojima@rr.iij4u.or.jp wrote:
+>
+>> Dan Kegel <dank@kegel.com> wrote:
+>> > Stuart Menefy wrote:
+>> >> I've just been trying to put together a gcc 3.3.2 based toolchain, and
+>> >> appear to be hitting a gcc optimisation bug. I was just wondering if
+>> >> anyone else had seen anything similar.
+>> >> 
+>> >> The problem is seen when building the kernel, in the function
+>> >> root_nfs_parse_addr(). I've extracted this into a small stand alone
+>> >> program which demonstrates the problem.
+>> > 
+>> > Excellent work.  I haven't seen anything like this (doesn't mean much)
+>> > and the sh-specific optimization bugs in the gcc bug database don't look
+>> > similar.  I think you should submit this as a bug report at
+>> > http://gcc.gnu.org/bugzilla/
+>> > It would be good if you could make your test case call abort() if
+>> > the problem is present, so the test case can be automated.
+>> 
+>> Indeed.  It'd be very nice to create a gcc PR for this issue.
+>
+>OK, I've done that. PR 13260.
+
+PR 13260 was fixed by amylaar@gcc.gnu.org at 2003-12-04 20:10:29 on mainline(gcc-3.4).
+I have back-ported that patch to gcc-3.3.3 and seems fine for me.
+
+	* sh-protos.h (sh_expand_t_scc): Declare.
+	* sh.h (PREDICATE_CODES): Add cmpsi_operand.
+	* sh.c (cmpsi_operand, sh_expand_t_scc): New functions.
+	* sh.md (cmpsi): Use cmpsi_operand.  If T_REG is compared to
+	something that is not a CONST_INT, copy it into a pseudo register.
+	(subc): Fix description of new T value.
+	(slt, sgt, sge, sgtu): Don't clobber T after rtl generation is over.
+	(sltu, sleu, sgeu): Likewise.
+	(seq, sne): Likewise. Use sh_expand_t_scc.
+
+diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh-protos.h gcc-3.3-20040126/gcc/config/sh/sh-protos.h
+--- gcc-3.3-20040126-1/gcc/config/sh/sh-protos.h	Tue Jan 13 02:03:24 2004
++++ gcc-3.3-20040126/gcc/config/sh/sh-protos.h	Fri Jan 30 17:54:04 2004
+@@ -102,6 +102,7 @@
+ extern int sh_can_redirect_branch PARAMS ((rtx, rtx));
+ extern void sh_expand_unop_v2sf PARAMS ((enum rtx_code, rtx, rtx));
+ extern void sh_expand_binop_v2sf PARAMS ((enum rtx_code, rtx, rtx, rtx));
++extern int sh_expand_t_scc (enum rtx_code code, rtx target);
+ #ifdef TREE_CODE
+ extern void sh_va_start PARAMS ((tree, rtx));
+ extern rtx sh_va_arg PARAMS ((tree, tree));
+diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.c gcc-3.3-20040126/gcc/config/sh/sh.c
+--- gcc-3.3-20040126-1/gcc/config/sh/sh.c	Thu Jan 15 03:11:36 2004
++++ gcc-3.3-20040126/gcc/config/sh/sh.c	Fri Jan 30 17:53:58 2004
+@@ -7870,6 +7870,15 @@
+   return register_operand (op, mode);
+ }
+ 
++int
++cmpsi_operand (rtx op, enum machine_mode mode)
++{
++  if (GET_CODE (op) == REG && REGNO (op) == T_REG
++      && GET_MODE (op) == SImode)
++    return 1;
++  return arith_operand (op, mode);
++}
++
+ /* INSN is an sfunc; return the rtx that describes the address used.  */
+ static rtx
+ extract_sfunc_addr (rtx insn)
+@@ -7917,4 +7926,33 @@
+   abort ();
+ }
+ 
++int
++sh_expand_t_scc (enum rtx_code code, rtx target)
++{
++  rtx result = target;
++  HOST_WIDE_INT val;
++
++  if (GET_CODE (sh_compare_op0) != REG || REGNO (sh_compare_op0) != T_REG
++      || GET_CODE (sh_compare_op1) != CONST_INT)
++    return 0;
++  if (GET_CODE (result) != REG)
++    result = gen_reg_rtx (SImode);
++  val = INTVAL (sh_compare_op1);
++  if ((code == EQ && val == 1) || (code == NE && val == 0))
++    emit_insn (gen_movt (result));
++  else if ((code == EQ && val == 0) || (code == NE && val == 1))
++    {
++      emit_insn (gen_rtx_CLOBBER (VOIDmode, result));
++      emit_insn (gen_subc (result, result, result));
++      emit_insn (gen_addsi3 (result, result, GEN_INT (1)));
++    }
++  else if (code == EQ || code == NE)
++    emit_insn (gen_move_insn (result, GEN_INT (code == NE)));
++  else
++    return 0;
++  if (result != target)
++    emit_move_insn (target, result);
++  return 1;
++}
++
+ #include "gt-sh.h"
+diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.h gcc-3.3-20040126/gcc/config/sh/sh.h
+--- gcc-3.3-20040126-1/gcc/config/sh/sh.h	Wed Apr 16 02:06:09 2003
++++ gcc-3.3-20040126/gcc/config/sh/sh.h	Fri Jan 30 17:53:51 2004
+@@ -3231,6 +3231,7 @@
+   {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}},	\
+   {"binary_float_operator", {PLUS, MINUS, MULT, DIV}},			\
+   {"binary_logical_operator", {AND, IOR, XOR}},				\
++  {"cmpsi_operand", {SUBREG, REG, CONST_INT}},				\
+   {"commutative_float_operator", {PLUS, MULT}},				\
+   {"equality_comparison_operator", {EQ,NE}},				\
+   {"extend_reg_operand", {SUBREG, REG, TRUNCATE}},			\
+diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.md gcc-3.3-20040126/gcc/config/sh/sh.md
+--- gcc-3.3-20040126-1/gcc/config/sh/sh.md	Tue Jan 13 02:03:25 2004
++++ gcc-3.3-20040126/gcc/config/sh/sh.md	Fri Jan 30 17:54:20 2004
+@@ -685,11 +685,14 @@
+ 
+ (define_expand "cmpsi"
+   [(set (reg:SI T_REG)
+-	(compare (match_operand:SI 0 "arith_operand" "")
++	(compare (match_operand:SI 0 "cmpsi_operand" "")
+ 		 (match_operand:SI 1 "arith_operand" "")))]
+   "TARGET_SH1"
+   "
+ {
++  if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == T_REG
++      && GET_CODE (operands[1]) != CONST_INT)
++    operands[0] = copy_to_mode_reg (SImode, operands[0]);
+   sh_compare_op0 = operands[0];
+   sh_compare_op1 = operands[1];
+   DONE;
+@@ -1147,7 +1150,9 @@
+ 			    (match_operand:SI 2 "arith_reg_operand" "r"))
+ 		  (reg:SI T_REG)))
+    (set (reg:SI T_REG)
+-	(gtu:SI (minus:SI (match_dup 1) (match_dup 2)) (match_dup 1)))]
++	(gtu:SI (minus:SI (minus:SI (match_dup 1) (match_dup 2))
++			  (reg:SI T_REG))
++		(match_dup 1)))]
+   "TARGET_SH1"
+   "subc	%2,%0"
+   [(set_attr "type" "arith")])
+@@ -7223,6 +7228,10 @@
+ 	}
+       DONE;
+     }
++  if (sh_expand_t_scc (EQ, operands[0]))
++    DONE;
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (EQ);
+ }")
+ 
+@@ -7269,6 +7278,8 @@
+ 	}
+       DONE;
+     }
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (LT);
+ }")
+ 
+@@ -7371,6 +7382,8 @@
+ 	}
+       DONE;
+     }
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (GT);
+ }")
+ 
+@@ -7423,6 +7436,8 @@
+       DONE;
+     }
+ 
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   if (GET_MODE_CLASS (GET_MODE (sh_compare_op0)) == MODE_FLOAT)
+     {
+       if (TARGET_IEEE)
+@@ -7462,6 +7477,8 @@
+ 				     sh_compare_op0, sh_compare_op1));
+       DONE;
+     }
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (GTU);
+ }")
+ 
+@@ -7486,6 +7503,8 @@
+ 				     sh_compare_op1, sh_compare_op0));
+       DONE;
+     }
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (LTU);
+ }")
+ 
+@@ -7515,6 +7534,8 @@
+ 
+       DONE;
+     }
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (LEU);
+ }")
+ 
+@@ -7545,6 +7566,8 @@
+       DONE;
+     }
+ 
++  if (! rtx_equal_function_value_matters)
++    FAIL;
+   operands[1] = prepare_scc_operands (GEU);
+ }")
+ 
+@@ -7592,8 +7615,12 @@
+       DONE;
+     }
+ 
+-   operands[1] = prepare_scc_operands (EQ);
+-   operands[2] = gen_reg_rtx (SImode);
++  if (sh_expand_t_scc (NE, operands[0]))
++    DONE;
++  if (! rtx_equal_function_value_matters)
++    FAIL;
++  operands[1] = prepare_scc_operands (EQ);
++  operands[2] = gen_reg_rtx (SImode);
+ }")
+ 
+ (define_expand "sunordered"
+
+----
+SUGIOKA Toshinobu
+
+
+
+
diff --git a/patches/gcc/3.3.3/pr13260-test.patch b/patches/gcc/3.3.3/pr13260-test.patch
new file mode 100644
index 00000000..d9cc3e45
--- /dev/null
+++ b/patches/gcc/3.3.3/pr13260-test.patch
@@ -0,0 +1,56 @@
+See http://gcc.gnu.org/PR13260
+
+/cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c,v  -->  standard output
+revision 1.1
+--- -	1970-01-01 00:00:00.000000000 +0000
++++ gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c
+@@ -0,0 +1,49 @@
++/* PR optimization/13260 */
++
++#include <string.h>
++
++typedef unsigned long u32;
++
++u32 in_aton(const char* x)
++{
++  return 0x0a0b0c0d;
++}
++
++u32 root_nfs_parse_addr(char *name)
++{
++ u32 addr;
++ int octets = 0;
++ char *cp, *cq;
++
++ cp = cq = name;
++ while (octets < 4) {
++  while (*cp >= '0' && *cp <= '9')
++   cp++;
++  if (cp == cq || cp - cq > 3)
++   break;
++  if (*cp == '.' || octets == 3)
++   octets++;
++  if (octets < 4)
++   cp++;
++  cq = cp;
++ }
++
++ if (octets == 4 && (*cp == ':' || *cp == '\0')) {
++  if (*cp == ':')
++   *cp++ = '\0';
++  addr = in_aton(name);
++  strcpy(name, cp);
++ } else
++  addr = (-1);
++
++ return addr;
++}
++
++int
++main()
++{
++  static char addr[] = "10.11.12.13:/hello";
++  u32 result = root_nfs_parse_addr(addr);
++  if (result != 0x0a0b0c0d) { abort(); }
++  return 0;
++}
diff --git a/patches/gcc/3.3.3/pr15089-fix.patch b/patches/gcc/3.3.3/pr15089-fix.patch
new file mode 100644
index 00000000..ceaf9577
--- /dev/null
+++ b/patches/gcc/3.3.3/pr15089-fix.patch
@@ -0,0 +1,25 @@
+See http://gcc.gnu.org/PR15089
+"In some cases the specified register for a local variable meant to be
+used with inline assembly code is not respected.  This breaks code 
+relying on this feature to implement non-standard calling convension."
+
+This fix is probably needed to properly implement linux syscalls in some architectures.
+
+First added to crosstool by Jamie Hicks, see
+http://www.handhelds.org/hypermail/kernel-discuss/current/0066.html
+
+Index: gcc/loop.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/loop.c,v
+retrieving revision 1.488.2.3
+diff -u -r1.488.2.3 loop.c
+--- gcc-old/gcc/loop.c	14 Feb 2004 14:46:03 -0000	1.488.2.3
++++ gcc-new/gcc/loop.c	28 Apr 2004 22:02:53 -0000
+@@ -929,6 +929,7 @@
+ 			  || (! (GET_CODE (SET_SRC (set)) == REG
+ 				 && (REGNO (SET_SRC (set))
+ 				     < FIRST_PSEUDO_REGISTER))))
++		      && regno >= FIRST_PSEUDO_REGISTER 
+ 		      /* This test is not redundant; SET_SRC (set) might be
+ 			 a call-clobbered register and the life of REGNO
+ 			 might span a call.  */
diff --git a/patches/gcc/3.3.3/pr9365-1-test.patch b/patches/gcc/3.3.3/pr9365-1-test.patch
new file mode 100644
index 00000000..ee7dfa7c
--- /dev/null
+++ b/patches/gcc/3.3.3/pr9365-1-test.patch
@@ -0,0 +1,43 @@
+--- /dev/null	Sat Dec 14 13:56:51 2002
++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr9365-1.c	Sun Sep 14 09:34:37 2003
+@@ -0,0 +1,40 @@
++/* PR target/9365
++ * Origin: marcus@mc.pp.se
++ * Testcase tweaked by dank@kegel.com
++ * [3.3 regression] [SH] segfault in gen_far_branch (config/sh/sh.c)
++ * ice-on-valid-code
++ * Not marked as xfail since it's a regression
++*/
++/* { dg-do compile } */
++/* { dg-options "-O2 -fomit-frame-pointer" } */
++
++
++void foo(int n, int *p)
++{
++	switch(n) {
++	case 100: case 110: case 120: case 130: case 140:
++	case 200: case 210: case 220: case 230: case 240:
++	case 300: case 310: case 320: case 330: case 340:
++	case 400: case 410: case 420: case 430: case 440:
++	case 500: case 510: case 520: case 530: case 540:
++	case 600: case 610: case 620: case 630: case 640:
++	case 700: case 710: case 720: case 730: case 740:
++	case 800: case 810: case 820: case 830: case 840:
++	case 900: case 910: case 920: case 930: case 940:
++		break;
++	default:
++		*p = n;
++		break;
++	}
++}
++
++int main(int argc, char **argv)
++{
++	int p;
++
++	(void) argv;
++
++	foo(argc, &p);
++
++	return p;
++}
diff --git a/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch b/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch
new file mode 100644
index 00000000..64d4fc4b
--- /dev/null
+++ b/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch
@@ -0,0 +1,610 @@
+Fixes the problem
+	[ libdemo.so and main.o both use assignment on structures ]
+	$ sh4-unknown-linux-gnu-gcc libdemo.so main.o
+	sh4-unknown-linux-gnu/bin/ld: warning: type and size of dynamic symbol `__movstr_i4_even' are not defined
+	[ resulting app links, but crashes at runtime ]
+See testcase at http://tsukuba.m17n.org/linux-sh/ml/linux-sh/2003-11/msg00016.html
+
+Patch was posted as http://gcc.gnu.org/ml/gcc-patches/2002-11/msg01641.html
+and is in cvs as http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/lib1funcs.asm.diff?r1=1.29.4.1&r2=1.29.4.2
+
+but see also sh-libgcc-hidden.patch (part of gcc-3.3.3 as of 20040119 or so)
+
+===================================================================
+
+--- gcc/gcc/config/sh/lib1funcs.asm	2002/09/20 01:29:21	1.29.4.1
++++ gcc/gcc/config/sh/lib1funcs.asm	2003/11/18 12:27:31
+@@ -38,9 +38,14 @@
+    amylaar@cygnus.com  */
+ 
+ #ifdef __ELF__
+-#define LOCAL(X) .L_##X
+-#else
+-#define LOCAL(X) L_##X
++#define LOCAL(X)	.L_##X
++#define FUNC(X)		.type X,@function
++#define ENDFUNC0(X)	.Lfe_##X: .size X,.Lfe_##X-X
++#define ENDFUNC(X)	ENDFUNC0(X)
++#else
++#define LOCAL(X)	L_##X
++#define FUNC(X)
++#define ENDFUNC(X)
+ #endif
+ 
+ #define	CONCAT(A,B)	A##B
+@@ -87,6 +92,40 @@
+ 	.global	GLOBAL(ashiftrt_r4_31)
+ 	.global	GLOBAL(ashiftrt_r4_32)
+ 
++	FUNC(GLOBAL(ashiftrt_r4_0))
++	FUNC(GLOBAL(ashiftrt_r4_1))
++	FUNC(GLOBAL(ashiftrt_r4_2))
++	FUNC(GLOBAL(ashiftrt_r4_3))
++	FUNC(GLOBAL(ashiftrt_r4_4))
++	FUNC(GLOBAL(ashiftrt_r4_5))
++	FUNC(GLOBAL(ashiftrt_r4_6))
++	FUNC(GLOBAL(ashiftrt_r4_7))
++	FUNC(GLOBAL(ashiftrt_r4_8))
++	FUNC(GLOBAL(ashiftrt_r4_9))
++	FUNC(GLOBAL(ashiftrt_r4_10))
++	FUNC(GLOBAL(ashiftrt_r4_11))
++	FUNC(GLOBAL(ashiftrt_r4_12))
++	FUNC(GLOBAL(ashiftrt_r4_13))
++	FUNC(GLOBAL(ashiftrt_r4_14))
++	FUNC(GLOBAL(ashiftrt_r4_15))
++	FUNC(GLOBAL(ashiftrt_r4_16))
++	FUNC(GLOBAL(ashiftrt_r4_17))
++	FUNC(GLOBAL(ashiftrt_r4_18))
++	FUNC(GLOBAL(ashiftrt_r4_19))
++	FUNC(GLOBAL(ashiftrt_r4_20))
++	FUNC(GLOBAL(ashiftrt_r4_21))
++	FUNC(GLOBAL(ashiftrt_r4_22))
++	FUNC(GLOBAL(ashiftrt_r4_23))
++	FUNC(GLOBAL(ashiftrt_r4_24))
++	FUNC(GLOBAL(ashiftrt_r4_25))
++	FUNC(GLOBAL(ashiftrt_r4_26))
++	FUNC(GLOBAL(ashiftrt_r4_27))
++	FUNC(GLOBAL(ashiftrt_r4_28))
++	FUNC(GLOBAL(ashiftrt_r4_29))
++	FUNC(GLOBAL(ashiftrt_r4_30))
++	FUNC(GLOBAL(ashiftrt_r4_31))
++	FUNC(GLOBAL(ashiftrt_r4_32))
++
+ 	.align	1
+ GLOBAL(ashiftrt_r4_32):
+ GLOBAL(ashiftrt_r4_31):
+@@ -166,6 +205,40 @@
+ GLOBAL(ashiftrt_r4_0):
+ 	rts
+ 	nop
++
++	ENDFUNC(GLOBAL(ashiftrt_r4_0))
++	ENDFUNC(GLOBAL(ashiftrt_r4_1))
++	ENDFUNC(GLOBAL(ashiftrt_r4_2))
++	ENDFUNC(GLOBAL(ashiftrt_r4_3))
++	ENDFUNC(GLOBAL(ashiftrt_r4_4))
++	ENDFUNC(GLOBAL(ashiftrt_r4_5))
++	ENDFUNC(GLOBAL(ashiftrt_r4_6))
++	ENDFUNC(GLOBAL(ashiftrt_r4_7))
++	ENDFUNC(GLOBAL(ashiftrt_r4_8))
++	ENDFUNC(GLOBAL(ashiftrt_r4_9))
++	ENDFUNC(GLOBAL(ashiftrt_r4_10))
++	ENDFUNC(GLOBAL(ashiftrt_r4_11))
++	ENDFUNC(GLOBAL(ashiftrt_r4_12))
++	ENDFUNC(GLOBAL(ashiftrt_r4_13))
++	ENDFUNC(GLOBAL(ashiftrt_r4_14))
++	ENDFUNC(GLOBAL(ashiftrt_r4_15))
++	ENDFUNC(GLOBAL(ashiftrt_r4_16))
++	ENDFUNC(GLOBAL(ashiftrt_r4_17))
++	ENDFUNC(GLOBAL(ashiftrt_r4_18))
++	ENDFUNC(GLOBAL(ashiftrt_r4_19))
++	ENDFUNC(GLOBAL(ashiftrt_r4_20))
++	ENDFUNC(GLOBAL(ashiftrt_r4_21))
++	ENDFUNC(GLOBAL(ashiftrt_r4_22))
++	ENDFUNC(GLOBAL(ashiftrt_r4_23))
++	ENDFUNC(GLOBAL(ashiftrt_r4_24))
++	ENDFUNC(GLOBAL(ashiftrt_r4_25))
++	ENDFUNC(GLOBAL(ashiftrt_r4_26))
++	ENDFUNC(GLOBAL(ashiftrt_r4_27))
++	ENDFUNC(GLOBAL(ashiftrt_r4_28))
++	ENDFUNC(GLOBAL(ashiftrt_r4_29))
++	ENDFUNC(GLOBAL(ashiftrt_r4_30))
++	ENDFUNC(GLOBAL(ashiftrt_r4_31))
++	ENDFUNC(GLOBAL(ashiftrt_r4_32))
+ #endif
+ 
+ #ifdef L_ashiftrt_n
+@@ -188,6 +261,7 @@
+ !
+ 
+ 	.global	GLOBAL(ashrsi3)
++	FUNC(GLOBAL(ashrsi3))
+ 	.align	2
+ GLOBAL(ashrsi3):
+ 	mov	#31,r0
+@@ -315,6 +389,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashrsi3))
+ #endif
+ 
+ #ifdef L_ashiftlt
+@@ -336,6 +411,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(ashlsi3)
++	FUNC(GLOBAL(ashlsi3))
+ 	.align	2
+ GLOBAL(ashlsi3):
+ 	mov	#31,r0
+@@ -472,6 +548,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(ashlsi3))
+ #endif
+ 
+ #ifdef L_lshiftrt
+@@ -493,6 +570,7 @@
+ ! (none)
+ !
+ 	.global	GLOBAL(lshrsi3)
++	FUNC(GLOBAL(lshrsi3))
+ 	.align	2
+ GLOBAL(lshrsi3):
+ 	mov	#31,r0
+@@ -629,6 +707,7 @@
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(lshrsi3))
+ #endif
+ 
+ #ifdef L_movstr
+@@ -645,76 +724,113 @@
+ 	add	#64,r4
+ 	.align	4
+ 	.global	GLOBAL(movstrSI64)
++	FUNC(GLOBAL(movstrSI64))
+ GLOBAL(movstrSI64):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+ 	.global	GLOBAL(movstrSI60)
++	FUNC(GLOBAL(movstrSI60))
+ GLOBAL(movstrSI60):
+ 	mov.l	@(56,r5),r0
+ 	mov.l	r0,@(56,r4)
+ 	.global	GLOBAL(movstrSI56)
++	FUNC(GLOBAL(movstrSI56))
+ GLOBAL(movstrSI56):
+ 	mov.l	@(52,r5),r0
+ 	mov.l	r0,@(52,r4)
+ 	.global	GLOBAL(movstrSI52)
++	FUNC(GLOBAL(movstrSI52))
+ GLOBAL(movstrSI52):
+ 	mov.l	@(48,r5),r0
+ 	mov.l	r0,@(48,r4)
+ 	.global	GLOBAL(movstrSI48)
++	FUNC(GLOBAL(movstrSI48))
+ GLOBAL(movstrSI48):
+ 	mov.l	@(44,r5),r0
+ 	mov.l	r0,@(44,r4)
+ 	.global	GLOBAL(movstrSI44)
++	FUNC(GLOBAL(movstrSI44))
+ GLOBAL(movstrSI44):
+ 	mov.l	@(40,r5),r0
+ 	mov.l	r0,@(40,r4)
+ 	.global	GLOBAL(movstrSI40)
++	FUNC(GLOBAL(movstrSI40))
+ GLOBAL(movstrSI40):
+ 	mov.l	@(36,r5),r0
+ 	mov.l	r0,@(36,r4)
+ 	.global	GLOBAL(movstrSI36)
++	FUNC(GLOBAL(movstrSI36))
+ GLOBAL(movstrSI36):
+ 	mov.l	@(32,r5),r0
+ 	mov.l	r0,@(32,r4)
+ 	.global	GLOBAL(movstrSI32)
++	FUNC(GLOBAL(movstrSI32))
+ GLOBAL(movstrSI32):
+ 	mov.l	@(28,r5),r0
+ 	mov.l	r0,@(28,r4)
+ 	.global	GLOBAL(movstrSI28)
++	FUNC(GLOBAL(movstrSI28))
+ GLOBAL(movstrSI28):
+ 	mov.l	@(24,r5),r0
+ 	mov.l	r0,@(24,r4)
+ 	.global	GLOBAL(movstrSI24)
++	FUNC(GLOBAL(movstrSI24))
+ GLOBAL(movstrSI24):
+ 	mov.l	@(20,r5),r0
+ 	mov.l	r0,@(20,r4)
+ 	.global	GLOBAL(movstrSI20)
++	FUNC(GLOBAL(movstrSI20))
+ GLOBAL(movstrSI20):
+ 	mov.l	@(16,r5),r0
+ 	mov.l	r0,@(16,r4)
+ 	.global	GLOBAL(movstrSI16)
++	FUNC(GLOBAL(movstrSI16))
+ GLOBAL(movstrSI16):
+ 	mov.l	@(12,r5),r0
+ 	mov.l	r0,@(12,r4)
+ 	.global	GLOBAL(movstrSI12)
++	FUNC(GLOBAL(movstrSI12))
+ GLOBAL(movstrSI12):
+ 	mov.l	@(8,r5),r0
+ 	mov.l	r0,@(8,r4)
+ 	.global	GLOBAL(movstrSI8)
++	FUNC(GLOBAL(movstrSI8))
+ GLOBAL(movstrSI8):
+ 	mov.l	@(4,r5),r0
+ 	mov.l	r0,@(4,r4)
+ 	.global	GLOBAL(movstrSI4)
++	FUNC(GLOBAL(movstrSI4))
+ GLOBAL(movstrSI4):
+ 	mov.l	@(0,r5),r0
+ 	mov.l	r0,@(0,r4)
++	.global	GLOBAL(movstrSI0)
++	FUNC(GLOBAL(movstrSI0))
+ GLOBAL(movstrSI0):
+ 	rts
+ 	nop
+ 
++	ENDFUNC(GLOBAL(movstrSI64))
++	ENDFUNC(GLOBAL(movstrSI60))
++	ENDFUNC(GLOBAL(movstrSI56))
++	ENDFUNC(GLOBAL(movstrSI52))
++	ENDFUNC(GLOBAL(movstrSI48))
++	ENDFUNC(GLOBAL(movstrSI44))
++	ENDFUNC(GLOBAL(movstrSI40))
++	ENDFUNC(GLOBAL(movstrSI36))
++	ENDFUNC(GLOBAL(movstrSI32))
++	ENDFUNC(GLOBAL(movstrSI28))
++	ENDFUNC(GLOBAL(movstrSI24))
++	ENDFUNC(GLOBAL(movstrSI20))
++	ENDFUNC(GLOBAL(movstrSI16))
++	ENDFUNC(GLOBAL(movstrSI12))
++	ENDFUNC(GLOBAL(movstrSI8))
++	ENDFUNC(GLOBAL(movstrSI4))
++	ENDFUNC(GLOBAL(movstrSI0))
++
+ 	.align	4
+ 
+ 	.global	GLOBAL(movstr)
++	FUNC(GLOBAL(movstr))
+ GLOBAL(movstr):
+ 	mov.l	@(60,r5),r0
+ 	mov.l	r0,@(60,r4)
+@@ -771,6 +887,8 @@
+ 	add	#64,r5
+ 	bra	GLOBAL(movstr)
+ 	add	#64,r4
++
++	FUNC(GLOBAL(movstr))
+ #endif
+ 
+ #ifdef L_movstr_i4
+@@ -779,6 +897,10 @@
+ 	.global	GLOBAL(movstr_i4_odd)
+ 	.global	GLOBAL(movstrSI12_i4)
+ 
++	FUNC(GLOBAL(movstr_i4_even))
++	FUNC(GLOBAL(movstr_i4_odd))
++	FUNC(GLOBAL(movstrSI12_i4))
++
+ 	.p2align	5
+ L_movstr_2mod4_end:
+ 	mov.l	r0,@(16,r4)
+@@ -787,6 +909,11 @@
+ 
+ 	.p2align	2
+ 
++GLOBAL(movstr_i4_even):
++	mov.l	@r5+,r0
++	bra	L_movstr_start_even
++	mov.l	@r5+,r1
++
+ GLOBAL(movstr_i4_odd):
+ 	mov.l	@r5+,r1
+ 	add	#-4,r4
+@@ -813,10 +940,8 @@
+ 	rts
+ 	mov.l	r3,@(12,r4)
+ 
+-GLOBAL(movstr_i4_even):
+-	mov.l	@r5+,r0
+-	bra	L_movstr_start_even
+-	mov.l	@r5+,r1
++	ENDFUNC(GLOBAL(movstr_i4_even))
++	ENDFUNC(GLOBAL(movstr_i4_odd))
+ 
+ 	.p2align	4
+ GLOBAL(movstrSI12_i4):
+@@ -827,12 +952,15 @@
+ 	mov.l	r1,@(4,r4)
+ 	rts
+ 	mov.l	r2,@(8,r4)
++
++	ENDFUNC(GLOBAL(movstrSI12_i4))
+ #endif
+ 
+ #ifdef L_mulsi3
+ 
+ 
+ 	.global	GLOBAL(mulsi3)
++	FUNC(GLOBAL(mulsi3))
+ 
+ ! r4 =       aabb
+ ! r5 =       ccdd
+@@ -865,7 +993,7 @@
+ 	rts
+ 	add	r2,r0
+ 
+-
++	FUNC(GLOBAL(mulsi3))
+ #endif
+ #endif /* ! __SH5__ */
+ #ifdef L_sdivsi3_i4
+@@ -875,6 +1003,7 @@
+ !! args in r4 and r5, result in fpul, clobber dr0, dr2
+ 
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	lds r4,fpul
+ 	float fpul,dr0
+@@ -884,6 +1013,7 @@
+ 	rts
+ 	ftrc dr0,fpul
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__)
+ !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2
+ 
+@@ -892,6 +1022,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global	GLOBAL(sdivsi3_i4)
++	FUNC(GLOBAL(sdivsi3_i4))
+ GLOBAL(sdivsi3_i4):
+ 	sts.l fpscr,@-r15
+ 	mov #8,r2
+@@ -906,6 +1037,7 @@
+ 	rts
+ 	lds.l @r15+,fpscr
+ 
++	ENDFUNC(GLOBAL(sdivsi3_i4))
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -920,9 +1052,10 @@
+ !!
+ !!
+ 
+-!! args in r4 and r5, result in r0 clobber r1,r2,r3
++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit
+ 
+ 	.global	GLOBAL(sdivsi3)
++	FUNC(GLOBAL(sdivsi3))
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+ 	.section	.text..SHmedia32,"ax"
+@@ -1166,6 +1299,7 @@
+ div0:	rts
+ 	mov	#0,r0
+ 
++	ENDFUNC(GLOBAL(sdivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* ! __SH4__ */
+ #endif
+@@ -1174,9 +1308,11 @@
+ 	.title "SH DIVIDE"
+ !! 4 byte integer Divide code for the Hitachi SH
+ #ifdef __SH4__
+-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4,
++!! and t bit
+ 
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	mov #1,r1
+ 	cmp/hi r1,r5
+@@ -1217,11 +1353,13 @@
+ L1:
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #elif defined (__SH5__) && ! defined (__SH4_NOFPU__)
+ #if ! __SH5__ || __SH5__ == 32
+ !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33
+ 	.mode	SHmedia
+ 	.global	GLOBAL(udivsi3_i4)
++	FUNC(GLOBAL(udivsi3_i4))
+ GLOBAL(udivsi3_i4):
+ 	addz.l	r4,r63,r20
+ 	addz.l	r5,r63,r21
+@@ -1234,6 +1372,8 @@
+ 	ftrc.dq dr0,dr32
+ 	fmov.s fr33,fr32
+ 	blink tr0,r63
++
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #endif /* ! __SH5__ || __SH5__ == 32 */
+ #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__)
+ !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4
+@@ -1287,6 +1427,7 @@
+ #endif
+ 	.double 2147483648
+ 
++	ENDFUNC(GLOBAL(udivsi3_i4))
+ #endif /* ! __SH4__ */
+ #endif
+ 
+@@ -1297,6 +1438,7 @@
+ 
+ !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit
+ 	.global	GLOBAL(udivsi3)
++	FUNC(GLOBAL(udivsi3))
+ 
+ #if __SHMEDIA__
+ #if __SH5__ == 32
+@@ -1485,6 +1627,7 @@
+  rts
+  rotcl r0
+ 
++	ENDFUNC(GLOBAL(udivsi3))
+ #endif /* ! __SHMEDIA__ */
+ #endif /* __SH4__ */
+ #endif /* L_udivsi3 */
+@@ -1790,6 +1933,7 @@
+ 	.mode	SHcompact
+ #endif
+ 	.global GLOBAL(set_fpscr)
++	FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
+ 	mov.l LOCAL(set_fpscr_L1),r1
+@@ -1822,6 +1966,8 @@
+ 	.align 2
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++
++	ENDFUNC(GLOBAL(set_fpscr))
+ #ifdef __ELF__
+         .comm   GLOBAL(fpscr_values),8,4
+ #else
+@@ -1860,6 +2006,7 @@
+ 	blink	tr0, r63
+ #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
+ 	.global GLOBAL(ic_invalidate)
++	FUNC(GLOBAL(ic_invalidate))
+ GLOBAL(ic_invalidate):
+ 	ocbwb	@r4
+ 	mova	0f,r0
+@@ -1882,6 +2029,8 @@
+ 	nop
+ 	.endr
+ 	.endr
++
++	ENDFUNC(GLOBAL(ic_invalidate))
+ #endif /* SH4 */
+ #endif /* L_ic_invalidate */
+ 
+@@ -1940,6 +2089,7 @@
+ 	will be expanded into r2/r3 upon return.  */
+ 	
+ 	.global	GLOBAL(GCC_shcompact_call_trampoline)
++	FUNC(GLOBAL(GCC_shcompact_call_trampoline))
+ GLOBAL(GCC_shcompact_call_trampoline):
+ 	ptabs/l	r0, tr0	/* Prepare to call the actual function.  */
+ 	movi	((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0
+@@ -2290,6 +2440,8 @@
+ 	shari	r2, 32, r2
+ #endif
+ 	blink	tr0, r63
++
++	ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline))
+ #endif /* L_shcompact_call_trampoline */
+ 
+ #ifdef L_shcompact_return_trampoline
+@@ -2302,6 +2454,7 @@
+ 	.section	.text..SHmedia32, "ax"
+ 	.align	2
+ 	.global	GLOBAL(GCC_shcompact_return_trampoline)
++	FUNC(GLOBAL(GCC_shcompact_return_trampoline))
+ GLOBAL(GCC_shcompact_return_trampoline):
+ 	ptabs/l	r18, tr0
+ #if __LITTLE_ENDIAN__
+@@ -2313,6 +2466,8 @@
+ #endif
+ 	or	r3, r2, r2
+ 	blink	tr0, r63
++
++	ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline))
+ #endif /* L_shcompact_return_trampoline */
+ 
+ #ifdef L_shcompact_incoming_args
+@@ -2367,6 +2522,7 @@
+ 	actual bit pattern.  */
+ 	
+ 	.global	GLOBAL(GCC_shcompact_incoming_args)
++	FUNC(GLOBAL(GCC_shcompact_incoming_args))
+ GLOBAL(GCC_shcompact_incoming_args):
+ 	ptabs/l	r18, tr0	/* Prepare to return.  */
+ 	shlri	r17, 32, r0	/* Load the cookie.  */
+@@ -2519,6 +2675,7 @@
+ LOCAL(ia_return):	/* Return.  */
+ 	blink	tr0, r63
+ LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction.  */
++	ENDFUNC(GLOBAL(GCC_shcompact_incoming_args))
+ #endif /* L_shcompact_incoming_args */
+ #endif
+ #if __SH5__
+@@ -2530,6 +2687,7 @@
+ #endif
+ 	.align	3 /* It is copied in units of 8 bytes in SHmedia mode.  */
+ 	.global	GLOBAL(GCC_nested_trampoline)
++	FUNC(GLOBAL(GCC_nested_trampoline))
+ GLOBAL(GCC_nested_trampoline):
+ 	.mode	SHmedia
+ 	ptrel/u	r63, tr0
+@@ -2546,6 +2704,8 @@
+ 	ld.l	r0, 28, r1
+ #endif
+ 	blink	tr1, r63
++
++	ENDFUNC(GLOBAL(GCC_nested_trampoline))
+ #endif /* L_nested_trampoline */
+ #endif /* __SH5__ */
+ #if __SH5__ == 32
+@@ -2555,6 +2715,7 @@
+ 	.align	2
+ #ifndef __SH4_NOFPU__	
+ 	.global	GLOBAL(GCC_push_shmedia_regs)
++	FUNC(GLOBAL(GCC_push_shmedia_regs))
+ GLOBAL(GCC_push_shmedia_regs):
+ 	addi.l	r15, -14*8, r15
+ 	fst.d	r15, 13*8, dr62
+@@ -2573,6 +2734,7 @@
+ 	fst.d	r15,  0*8, dr36
+ #endif
+ 	.global	GLOBAL(GCC_push_shmedia_regs_nofpu)
++	FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
+ GLOBAL(GCC_push_shmedia_regs_nofpu):
+ 	ptabs/l	r18, tr0
+ 	addi.l	r15, -27*8, r15
+@@ -2608,8 +2770,13 @@
+ 	st.q	r15,  0*8, r28
+ 	blink	tr0, r63
+ 
++#ifndef __SH4_NOFPU__	
++	ENDFUNC(GLOBAL(GCC_push_shmedia_regs))
++#endif
++	ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu))
+ #ifndef __SH4_NOFPU__
+ 	.global	GLOBAL(GCC_pop_shmedia_regs)
++	FUNC(GLOBAL(GCC_pop_shmedia_regs))
+ GLOBAL(GCC_pop_shmedia_regs):
+ 	pt	.L0, tr1
+ 	movi	41*8, r0
+@@ -2630,6 +2797,7 @@
+ 	blink	tr1, r63
+ #endif
+ 	.global	GLOBAL(GCC_pop_shmedia_regs_nofpu)
++	FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
+ GLOBAL(GCC_pop_shmedia_regs_nofpu):
+ 	movi	27*8, r0
+ .L0:
+@@ -2666,5 +2834,10 @@
+ 	ld.q	r15,  0*8, r28
+ 	add.l	r15, r0, r15
+ 	blink	tr0, r63
++
++#ifndef __SH4_NOFPU__
++	ENDFUNC(GLOBAL(GCC_pop_shmedia_regs))
++#endif
++	ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu))
+ #endif /* __SH5__ == 32 */
+ #endif /* L_push_pop_shmedia_regs */
diff --git a/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch b/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch
new file mode 100644
index 00000000..2a9d592b
--- /dev/null
+++ b/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch
@@ -0,0 +1,67 @@
+See http://gcc.gnu.org/PR11901
+Should fix
+make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 
+in glibc's "make tests".
+
+Note: this patch is named
+sh-pic-set_fpscr-gcc-3.3.2.patch
+and must be applied after 
+sh-lib1funcs_sizeAndType.patch
+but that'll happen naturally if you apply them in alphabetical order.
+
+-------------
+
+Date: Wed, 30 Jul 2003 12:03:01 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02916] Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+To: dank@kegel.com
+Cc: linux-sh@m17n.org
+Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp>
+
+> I'll try to write the PIC version of it,
+
+Dan, does the attached patch work for you?
+
+Regards,
+	kaz
+--
+diff -u3prN ORIG/gcc/gcc/config/sh/lib1funcs.asm LOCAL/gcc/gcc/config/sh/lib1funcs.asm
+--- ORIG/gcc/gcc/config/sh/lib1funcs.asm	Thu Jun 19 07:38:59 2003
++++ gcc-3.3.2/gcc/config/sh/lib1funcs.asm	Wed Jul 30 11:08:49 2003
+@@ -1936,7 +1944,17 @@ GLOBAL(moddi3):
+ 	FUNC(GLOBAL(set_fpscr))
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
++#ifdef __PIC__
++	mov.l	r12,@-r15
++	mova	LOCAL(set_fpscr_L0),r0
++	mov.l	LOCAL(set_fpscr_L0),r12
++	add	r0,r12
++	mov.l	LOCAL(set_fpscr_L1),r0
++	mov.l	@(r0,r12),r1
++	mov.l	@r15+,r12
++#else
+ 	mov.l LOCAL(set_fpscr_L1),r1
++#endif
+ 	swap.w r4,r0
+ 	or #24,r0
+ #ifndef FMOVD_WORKS
+@@ -1964,8 +1982,15 @@ GLOBAL(set_fpscr):
+ 	mov.l r3,@(4,r1)
+ #endif
+ 	.align 2
++#ifdef __PIC__
++LOCAL(set_fpscr_L0):
++	.long _GLOBAL_OFFSET_TABLE_
++LOCAL(set_fpscr_L1):
++	.long GLOBAL(fpscr_values@GOT)
++#else
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++#endif
+ 
+ 	ENDFUNC(GLOBAL(set_fpscr))
+ #ifndef NO_FPSCR_VALUES
+
+
diff --git a/patches/gcc/3.3.3/thunk3.patch b/patches/gcc/3.3.3/thunk3.patch
new file mode 100644
index 00000000..7974a0c0
--- /dev/null
+++ b/patches/gcc/3.3.3/thunk3.patch
@@ -0,0 +1,23 @@
+Fixes 
+FAIL: g++.jason/thunk3.C (test for excess errors)
+on sh4-unknown-linux-gnu.
+
+Does any sh variant *not* use the generic thunk support?  If so, the patch should be
+more cautious.  As it is, it excludes all sh processors from this test.
+
+Index: thunk3.C
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v
+retrieving revision 1.13
+diff -u -d -u -r1.13 thunk3.C
+--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old	25 Mar 2002 17:57:03 -0000	1.13
++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C	20 Jul 2003 16:57:38 -0000
+@@ -2,7 +2,7 @@
+ // Note that this will break on any target that uses the generic thunk
+ //  support, because it doesn't support variadic functions.
+ 
+-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-*
++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3  mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-*
+ 
+ #include <stdarg.h>
+ 
diff --git a/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch
new file mode 100644
index 00000000..0816b83e
--- /dev/null
+++ b/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch
@@ -0,0 +1,62 @@
+diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h
+--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h	2004-03-30 22:43:45.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/linux-elf.h	2004-08-20 02:13:02.969084177 +0200
+@@ -30,17 +30,31 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -88,7 +102,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc
+--- gcc-3.3.4.orig/gcc/config.gcc	2004-04-29 06:42:47.000000000 +0200
++++ gcc-3.3.4/gcc/config.gcc	2004-08-20 02:11:04.326143343 +0200
+@@ -699,6 +699,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $machine in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch
new file mode 100644
index 00000000..0611e2c3
--- /dev/null
+++ b/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch
@@ -0,0 +1,71 @@
+From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by
+Richard Earnshaw.  Fixes http://gcc.gnu.org/PR22528
+
+--- gcc-3.3.4/gcc/config/arm/arm.md.orig	2004-03-30 22:43:44.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/arm.md	2005-08-15 12:21:55.000000000 +0200
+@@ -4275,7 +4275,7 @@
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+    ;; store the high byte
+-   (set (match_dup 4) (subreg:QI (match_dup 2) 0))]	;explicit subreg safe
++   (set (match_dup 4) (match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4291,7 +4291,8 @@
+     operands[1] = adjust_address (operands[1], QImode, 0);
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+-    operands[2] = gen_reg_rtx (SImode); 
++    operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+@@ -4299,7 +4300,7 @@
+   [(set (match_dup 4) (match_dup 3))
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+-   (set (match_operand 1 "" "")	(subreg:QI (match_dup 2) 3))]
++   (set (match_operand 1 "" "")	(match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4316,13 +4317,14 @@
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+     operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+ ;; Subroutine to store a half word integer constant into memory.
+ (define_expand "storeinthi"
+   [(set (match_operand 0 "" "")
+-	(subreg:QI (match_operand 1 "" "") 0))
++	(match_operand 1 "" ""))
+    (set (match_dup 3) (match_dup 2))]
+   "TARGET_ARM"
+   "
+@@ -4363,6 +4365,7 @@
+     operands[3] = adjust_address (op0, QImode, 1);
+     operands[0] = adjust_address (operands[0], QImode, 0);
+     operands[2] = gen_lowpart (QImode, operands[2]);
++    operands[1] = gen_lowpart (QImode, operands[1]);
+   }"
+ )
+ 
+@@ -4682,11 +4685,12 @@
+    (set (match_dup 3)
+ 	(ashiftrt:SI (match_dup 2) (const_int 16)))
+    (set (match_operand:HI 0 "s_register_operand" "")
+-	(subreg:HI (match_dup 3) 0))]
++	(match_dup 4))]
+   "TARGET_ARM"
+   "
+   operands[2] = gen_reg_rtx (SImode);
+   operands[3] = gen_reg_rtx (SImode);
++  operands[4] = gen_lowpart (HImode, operands[3]);
+   "
+ )
+ 
diff --git a/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch b/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch
new file mode 100644
index 00000000..4f21be33
--- /dev/null
+++ b/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch
@@ -0,0 +1,38 @@
+Date: Tue, 06 Jul 2004 10:40:57 +0900 (JST)
+Message-Id: <20040706.104057.48529182.kkojima@rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: linux-sh@m17n.org, linuxsh-dev@lists.sourceforge.net
+Subject: gcc-3.4.1 (Was: The current kernel for a Jornada 680 SH3)
+From: Kaz Kojima <kkojima@rr.iij4u.or.jp>
+In-Reply-To: <20040529.175014.48668611.kkojima@rr.iij4u.or.jp>
+References: <20040528.125858.50336810.kkojima@rr.iij4u.or.jp>
+	<40B8205D.8030200@kegel.com>
+	<20040529.175014.48668611.kkojima@rr.iij4u.or.jp>
+
+Hi,
+
+...
+
+BTW, gcc-3.3.4 was also released and there is a bad news :-(  Someone
+reverted wrongly a configury patch against libstdc++ for sh-linux at
+the last moment.  We have to regenerate gcc-3.3.4/libstdc++-v3/configure
+with autoconf 2.13 or apply the one-line patch below manually:
+
+--- gcc-3.3.4-orig/libstdc++-v3/configure	2004-06-01 09:45:44.000000000 +0900
++++ gcc-3.3.4/libstdc++-v3/configure	2004-06-29 22:38:05.000000000 +0900
+@@ -2009,7 +2009,7 @@ irix5* | irix6*)
+ # This must be Linux ELF.
+ linux-gnu*)
+   case $host_cpu in
+-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
+     lt_cv_deplibs_check_method=pass_all ;;
+   *)
+     # glibc up to 2.1.1 does not perform some relocations on ARM
+
+
+Regards,
+	kaz
+
+
+
diff --git a/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch b/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch
new file mode 100644
index 00000000..9e459432
--- /dev/null
+++ b/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch
@@ -0,0 +1,86 @@
+Based on gcc-3.4.0/gcc-3.3.3h-ppc-asm-spec.patch
+
+Fixes the following errors when building gcc for ppc7450:
+
+/tmp/ccj38uQs.s: Assembler messages:
+/tmp/ccj38uQs.s:4370: Error: Unrecognized opcode: `mfvrsave'
+/tmp/ccj38uQs.s:4404: Error: Unrecognized opcode: `stvx'
+/tmp/ccj38uQs.s:4571: Error: Unrecognized opcode: `lvx'
+/tmp/ccj38uQs.s:4572: Error: Unrecognized opcode: `mtvrsave'
+make[2]: *** [libgcc/./unwind-dw2.o] Error 1
+make[2]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.3.4-glibc-2.3.2/build-gcc-core/gcc'
+make[1]: *** [stmp-multilib] Error 2
+make[1]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.3.4-glibc-2.3.2/build-gcc-core/gcc'
+make: *** [all-gcc] Error 2
+
+Note that the "-mcpu=7450" option must appear on the "gcc" command line in
+order for "-maltivec" to be passed to the assembler.  Or, "-maltivec" itself
+may be passed to the "gcc" command.
+
+Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil>
+
+===================================================================
+--- gcc-3.3.4/gcc/config/rs6000/rs6000.h~	2004-02-01 23:40:49.000000000 -0500
++++ gcc-3.3.4/gcc/config/rs6000/rs6000.h	2004-08-18 14:15:57.000000000 -0400
+@@ -52,23 +52,29 @@
+ "%{!mcpu*: \
+   %{mpower: %{!mpower2: -mpwr}} \
+   %{mpower2: -mpwrx} \
+-  %{mpowerpc*: -mppc} \
++  %{mpowerpc64*: -mppc64} \
++  %{!mpowerpc64*: %{mpowerpc*: -mppc}} \
+   %{mno-power: %{!mpowerpc*: -mcom}} \
+-  %{!mno-power: %{!mpower2: %(asm_default)}}} \
++  %{!mno-power: %{!mpower*: %(asm_default)}}} \
+ %{mcpu=common: -mcom} \
+ %{mcpu=power: -mpwr} \
+ %{mcpu=power2: -mpwrx} \
+-%{mcpu=power3: -m604} \
++%{mcpu=power3: -mppc64} \
+ %{mcpu=power4: -mpower4} \
++%{mcpu=power5: -mpower4} \
+ %{mcpu=powerpc: -mppc} \
+ %{mcpu=rios: -mpwr} \
+ %{mcpu=rios1: -mpwr} \
+ %{mcpu=rios2: -mpwrx} \
+ %{mcpu=rsc: -mpwr} \
+ %{mcpu=rsc1: -mpwr} \
++%{mcpu=rs64a: -mppc64} \
+ %{mcpu=401: -mppc} \
+ %{mcpu=403: -m403} \
+ %{mcpu=405: -m405} \
++%{mcpu=405fp: -m405} \
++%{mcpu=440: -m440} \
++%{mcpu=440fp: -m440} \
+ %{mcpu=505: -mppc} \
+ %{mcpu=601: -m601} \
+ %{mcpu=602: -mppc} \
+@@ -77,18 +83,23 @@
+ %{mcpu=ec603e: -mppc} \
+ %{mcpu=604: -mppc} \
+ %{mcpu=604e: -mppc} \
+-%{mcpu=620: -mppc} \
+-%{mcpu=630: -m604} \
++%{mcpu=620: -mppc64} \
++%{mcpu=630: -mppc64} \
+ %{mcpu=740: -mppc} \
+-%{mcpu=7400: -mppc} \
+-%{mcpu=7450: -mppc} \
+ %{mcpu=750: -mppc} \
++%{mcpu=G3: -mppc} \
++%{mcpu=7400: -mppc -maltivec} \
++%{mcpu=7450: -mppc -maltivec} \
++%{mcpu=G4: -mppc -maltivec} \
+ %{mcpu=801: -mppc} \
+ %{mcpu=821: -mppc} \
+ %{mcpu=823: -mppc} \
+ %{mcpu=860: -mppc} \
++%{mcpu=970: -mpower4 -maltivec} \
++%{mcpu=G5: -mpower4 -maltivec} \
+ %{mcpu=8540: -me500} \
+-%{maltivec: -maltivec}"
++%{maltivec: -maltivec} \
++-many"
+ 
+ #define CPP_DEFAULT_SPEC ""
+ 
diff --git a/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch b/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch
new file mode 100644
index 00000000..eef35b5a
--- /dev/null
+++ b/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch
@@ -0,0 +1,44 @@
+# 
+# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20
+#
+# Error:
+#
+# creating libintl.h
+# Configuring etc...
+# loading cache ../config.cache
+# checking for a BSD compatible install... (cached) /usr/bin/install -c
+# creating ./config.status
+# creating Makefile
+# trap: usage: trap [-lp] [[arg] signal_spec ...]
+#
+# Description:
+#
+# non-posix conform usage of trap causes bash >= 3.0 to fail
+# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html
+#
+# Status:
+#
+# fixed in gcc >= 3.3.5
+# backport of gcc-3.3.5 fix
+#
+diff -ruN gcc-3.3.4-orig/configure gcc-3.3.4/configure
+--- gcc-3.3.4-orig/configure	2002-09-29 18:11:24.000000000 +0200
++++ gcc-3.3.4/configure	2005-04-20 21:11:30.000000000 +0200
+@@ -697,7 +697,7 @@
+ if test -f skip-this-dir; then
+ 	# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ 	# and reset the trap handler.
+-	trap 0
++	trap '' 0
+ 	rm -rf Makefile* ${tmpdir}
+ 	# Execute the final clean-up actions
+ 	${config_shell} skip-this-dir
+@@ -1596,7 +1596,7 @@
+ # Perform the same cleanup as the trap handler, minus the "exit 1" of course,
+ # and reset the trap handler.
+ rm -rf ${tmpdir}
+-trap 0
++trap '' 0
+ 
+ exit 0
+ 
diff --git a/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch
new file mode 100644
index 00000000..0816b83e
--- /dev/null
+++ b/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch
@@ -0,0 +1,62 @@
+diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h
+--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h	2004-03-30 22:43:45.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/linux-elf.h	2004-08-20 02:13:02.969084177 +0200
+@@ -30,17 +30,31 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -88,7 +102,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc
+--- gcc-3.3.4.orig/gcc/config.gcc	2004-04-29 06:42:47.000000000 +0200
++++ gcc-3.3.4/gcc/config.gcc	2004-08-20 02:11:04.326143343 +0200
+@@ -699,6 +699,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $machine in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch
new file mode 100644
index 00000000..0611e2c3
--- /dev/null
+++ b/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch
@@ -0,0 +1,71 @@
+From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by
+Richard Earnshaw.  Fixes http://gcc.gnu.org/PR22528
+
+--- gcc-3.3.4/gcc/config/arm/arm.md.orig	2004-03-30 22:43:44.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/arm.md	2005-08-15 12:21:55.000000000 +0200
+@@ -4275,7 +4275,7 @@
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+    ;; store the high byte
+-   (set (match_dup 4) (subreg:QI (match_dup 2) 0))]	;explicit subreg safe
++   (set (match_dup 4) (match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4291,7 +4291,8 @@
+     operands[1] = adjust_address (operands[1], QImode, 0);
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+-    operands[2] = gen_reg_rtx (SImode); 
++    operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+@@ -4299,7 +4300,7 @@
+   [(set (match_dup 4) (match_dup 3))
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+-   (set (match_operand 1 "" "")	(subreg:QI (match_dup 2) 3))]
++   (set (match_operand 1 "" "")	(match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4316,13 +4317,14 @@
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+     operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+ ;; Subroutine to store a half word integer constant into memory.
+ (define_expand "storeinthi"
+   [(set (match_operand 0 "" "")
+-	(subreg:QI (match_operand 1 "" "") 0))
++	(match_operand 1 "" ""))
+    (set (match_dup 3) (match_dup 2))]
+   "TARGET_ARM"
+   "
+@@ -4363,6 +4365,7 @@
+     operands[3] = adjust_address (op0, QImode, 1);
+     operands[0] = adjust_address (operands[0], QImode, 0);
+     operands[2] = gen_lowpart (QImode, operands[2]);
++    operands[1] = gen_lowpart (QImode, operands[1]);
+   }"
+ )
+ 
+@@ -4682,11 +4685,12 @@
+    (set (match_dup 3)
+ 	(ashiftrt:SI (match_dup 2) (const_int 16)))
+    (set (match_operand:HI 0 "s_register_operand" "")
+-	(subreg:HI (match_dup 3) 0))]
++	(match_dup 4))]
+   "TARGET_ARM"
+   "
+   operands[2] = gen_reg_rtx (SImode);
+   operands[3] = gen_reg_rtx (SImode);
++  operands[4] = gen_lowpart (HImode, operands[3]);
+   "
+ )
+ 
diff --git a/patches/gcc/3.3.6/fix-fixincl.patch b/patches/gcc/3.3.6/fix-fixincl.patch
new file mode 100644
index 00000000..7936b19b
--- /dev/null
+++ b/patches/gcc/3.3.6/fix-fixincl.patch
@@ -0,0 +1,70 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
+(the only two I've tried like this), the configure script happily copies
+the glibc include files from include to sys-include; here's the line
+from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+
+--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
++++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
+@@ -350,7 +350,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2532,11 +2535,13 @@
+ 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: fixinc.sh gsyslimits.h
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch
new file mode 100644
index 00000000..0816b83e
--- /dev/null
+++ b/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch
@@ -0,0 +1,62 @@
+diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h
+--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h	2004-03-30 22:43:45.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/linux-elf.h	2004-08-20 02:13:02.969084177 +0200
+@@ -30,17 +30,31 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -88,7 +102,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc
+--- gcc-3.3.4.orig/gcc/config.gcc	2004-04-29 06:42:47.000000000 +0200
++++ gcc-3.3.4/gcc/config.gcc	2004-08-20 02:11:04.326143343 +0200
+@@ -699,6 +699,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $machine in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch
new file mode 100644
index 00000000..0611e2c3
--- /dev/null
+++ b/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch
@@ -0,0 +1,71 @@
+From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by
+Richard Earnshaw.  Fixes http://gcc.gnu.org/PR22528
+
+--- gcc-3.3.4/gcc/config/arm/arm.md.orig	2004-03-30 22:43:44.000000000 +0200
++++ gcc-3.3.4/gcc/config/arm/arm.md	2005-08-15 12:21:55.000000000 +0200
+@@ -4275,7 +4275,7 @@
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+    ;; store the high byte
+-   (set (match_dup 4) (subreg:QI (match_dup 2) 0))]	;explicit subreg safe
++   (set (match_dup 4) (match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4291,7 +4291,8 @@
+     operands[1] = adjust_address (operands[1], QImode, 0);
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+-    operands[2] = gen_reg_rtx (SImode); 
++    operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+@@ -4299,7 +4300,7 @@
+   [(set (match_dup 4) (match_dup 3))
+    (set (match_dup 2)
+ 	(ashiftrt:SI (match_operand 0 "" "") (const_int 8)))
+-   (set (match_operand 1 "" "")	(subreg:QI (match_dup 2) 3))]
++   (set (match_operand 1 "" "")	(match_dup 5))]
+   "TARGET_ARM"
+   "
+   {
+@@ -4316,13 +4317,14 @@
+     operands[3] = gen_lowpart (QImode, operands[0]);
+     operands[0] = gen_lowpart (SImode, operands[0]);
+     operands[2] = gen_reg_rtx (SImode);
++    operands[5] = gen_lowpart (QImode, operands[2]);
+   }"
+ )
+ 
+ ;; Subroutine to store a half word integer constant into memory.
+ (define_expand "storeinthi"
+   [(set (match_operand 0 "" "")
+-	(subreg:QI (match_operand 1 "" "") 0))
++	(match_operand 1 "" ""))
+    (set (match_dup 3) (match_dup 2))]
+   "TARGET_ARM"
+   "
+@@ -4363,6 +4365,7 @@
+     operands[3] = adjust_address (op0, QImode, 1);
+     operands[0] = adjust_address (operands[0], QImode, 0);
+     operands[2] = gen_lowpart (QImode, operands[2]);
++    operands[1] = gen_lowpart (QImode, operands[1]);
+   }"
+ )
+ 
+@@ -4682,11 +4685,12 @@
+    (set (match_dup 3)
+ 	(ashiftrt:SI (match_dup 2) (const_int 16)))
+    (set (match_operand:HI 0 "s_register_operand" "")
+-	(subreg:HI (match_dup 3) 0))]
++	(match_dup 4))]
+   "TARGET_ARM"
+   "
+   operands[2] = gen_reg_rtx (SImode);
+   operands[3] = gen_reg_rtx (SImode);
++  operands[4] = gen_lowpart (HImode, operands[3]);
+   "
+ )
+ 
diff --git a/patches/gcc/3.3/compat.exp.patch b/patches/gcc/3.3/compat.exp.patch
new file mode 100644
index 00000000..763b8a18
--- /dev/null
+++ b/patches/gcc/3.3/compat.exp.patch
@@ -0,0 +1,37 @@
+Fixes the following problem when testing a cross-compiler:
+
+============================================
+Testing g++.dg/compat/abi/bitfield1,
+...
+Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++  ...
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C
+pid is 16028 -16028
+compiler exited with status 1
+output is:
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file data encoding not little-endian
+
+FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile
+============================================
+
+--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old	Thu Oct 17 17:22:57 2002
++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp	Mon Jul 14 10:59:19 2003
+@@ -42,11 +42,13 @@
+ proc compat-fix-library-path { } {
+     global ld_library_path
+ 
+-    # See comments in lib/g++.exp for why this is needed.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++	# See comments in lib/g++.exp for why this is needed.
++	setenv  LD_LIBRARY_PATH     $ld_library_path
++	setenv  SHLIB_PATH          $ld_library_path
++	setenv  LD_LIBRARYN32_PATH  $ld_library_path
++	setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ }
+ 
+ #
diff --git a/patches/gcc/3.3/config.sub.patch b/patches/gcc/3.3/config.sub.patch
new file mode 100644
index 00000000..928f9115
--- /dev/null
+++ b/patches/gcc/3.3/config.sub.patch
@@ -0,0 +1,72 @@
+When configuring a s390->s390 or cris->cris crosscompiler
+(ok, I haven't hit this yet, but one of these days I'll get me an account
+on an s390, and then I'll need this patch :-), you'll get the
+following error:
+
++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure
+--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu
+--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2
+--enable-languages=c
+--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390-
+unknown-linux-gnu --enable-threads=no --without-headers --with-newlib
+--disable-shared
+...
+*** --with-headers is only supported when cross compiling
+
+This error pops up only when you're using Daniel Jacobowitz's technique
+of slightly changing the target and host tuples to make them different
+enough to force gcc's build system to not try to pull in system libraries
+or headers.  This technique is needed e.g. to build an x86 -> x86
+cross-compiler.
+(The LFS developers ran into the same bug that prompted me to use
+this technique; they point people who run into it to
+http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different
+way of avoiding this problem.  I think the tuple tweak is the way to go, though.)
+
+config-patches@gnu.org rejected this patch, on the grounds that there
+is only one vendor of each of those two architectures, so the 
+canonicalization is by definition correct.  When I pointed out the
+difficulty this causes for people building s390 -> s390 or
+cris -> cris compilers that are incompatible with the system
+libraries and thus must be built like cross-compilers, he grumped and said 
+"autoconf should let you specify a cross-compiler in some other way than
+comparing tuple strings".
+
+
+
+--- gcc-3.3/config.sub.old	Sun Jun  8 20:38:47 2003
++++ gcc-3.3/config.sub	Sun Jun  8 20:40:34 2003
+@@ -433,9 +433,12 @@
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
+-	cris | cris-* | etrax*)
++	cris | etrax*)
+ 		basic_machine=cris-axis
+ 		;;
++	cris-*)
++		basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+@@ -820,11 +823,17 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
+-	s390 | s390-*)
++	s390)
+ 		basic_machine=s390-ibm
+ 		;;
+-	s390x | s390x-*)
++	s390-*)
++		basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	s390x)
+ 		basic_machine=s390x-ibm
++		;;
++	s390x-*)
++		basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	sa29200)
+ 		basic_machine=a29k-amd
diff --git a/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch
new file mode 100644
index 00000000..0de46fc4
--- /dev/null
+++ b/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch
@@ -0,0 +1,98 @@
+g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003
+
+The first hunk fixes the error
+
+/testsuite_flags: /testsuite_flags: No such file or directory
+    while executing
+"exec sh ${odir_v3}/testsuite_flags --build-includes"
+    (procedure "g++_include_flags" line 21)
+    invoked from within
+"g++_include_flags [get_multilibs] "
+    (procedure "g++_init" line 63)
+    invoked from within
+"${tool}_init $test_file_name"
+    (procedure "runtest" line 19)
+    invoked from within
+"runtest $test_name"
+    ("foreach" body line 42)
+    invoked from within
+...
+make[1]: [check-g++] Error 1 (ignored)
+
+The fix isn't especially pretty, but it worked for me, and can't hurt the
+more common native compiler case.  Maybe someone who knows the code better 
+can come up with a better fix.
+
+The second hunk fixes the error
+
+sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian
+
+when trying to compile g++ testcases (!); setting up
+the shared library environment when running crosstests of g++ 
+should either be done by a special board file, or by
+setting up a remote chroot environment (see http://kegel.com/crosstool),
+not by blithely setting LD_LIBRARY_PATH on the local system.
+
+--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old	Fri Jul 11 15:42:47 2003
++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp	Sat Jul 12 12:57:07 2003
+@@ -72,6 +72,8 @@
+ #
+ proc g++_include_flags { paths } {
+     global srcdir
++    global objdir
++    global target_triplet
+     global HAVE_LIBSTDCXX_V3
+     global TESTING_IN_BUILD_TREE
+ 
+@@ -90,6 +92,20 @@
+ 
+     if { ${HAVE_LIBSTDCXX_V3} } {
+       set odir_v3 [lookfor_file ${gccpath} libstdc++-v3]
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir"
++	  # first assume no multilibs
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++          verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib"
++	  # assume multilib only one level deep
++          set multisub [file tail $gccpath]
++          set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++      }
++      if { $odir_v3 == "" } {
++           error "Can't find libstdc++-v3"
++      }
+       append flags [exec sh ${odir_v3}/testsuite_flags --build-includes]
+     } else {
+       set odir_v2 [lookfor_file ${gccpath} libstdc++]
+@@ -192,16 +192,20 @@
+       }
+     }
+ 
+-    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+-    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+-    # (for the 64-bit ABI).  The right way to do this would be to modify
+-    # unix.exp -- but that's not an option since it's part of DejaGNU
+-    # proper, so we do it here.  We really only need to do 
+-    # this on IRIX, but it shouldn't hurt to do it anywhere else.
+-    setenv  LD_LIBRARY_PATH     $ld_library_path
+-    setenv  SHLIB_PATH          $ld_library_path
+-    setenv  LD_LIBRARYN32_PATH  $ld_library_path
+-    setenv  LD_LIBRARY64_PATH   $ld_library_path
++    if {![is_remote target]} {
++      # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
++      # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
++      # (for the 64-bit ABI).  The right way to do this would be to modify
++      # unix.exp -- but that's not an option since it's part of DejaGNU
++      # proper, so we do it here.  We really only need to do 
++      # this on IRIX, but it shouldn't hurt to do it anywhere else.
++
++      # Doing this causes us to be unable to run cross-compilers.
++      setenv  LD_LIBRARY_PATH     $ld_library_path
++      setenv  SHLIB_PATH          $ld_library_path
++      setenv  LD_LIBRARYN32_PATH  $ld_library_path
++      setenv  LD_LIBRARY64_PATH   $ld_library_path
++    }
+ 
+     return "$flags"
+ }
diff --git a/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch
new file mode 100644
index 00000000..aafc1306
--- /dev/null
+++ b/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch
@@ -0,0 +1,54 @@
+Without this patch, the command
+
+RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3
+
+fails in two ways:
+1. the -L option meant to locate the testsuite directory is incorrect, and
+2. the wrong compiler is invoked, causing all sorts of havoc, not least of which
+is the native compiler is invoked when we really wanted to invoke the cross-compiler
+we just built.
+
+Here's an example log of the problem in action.  Every testcase fails, this shows just one:
+-------------
+Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc   -g -O2 -DDEBUG_ASSERT  -L/testsuite -lv3test -lm  -o ./binders.exe
+compiler exited with status 1
+output is:
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83:   instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M
+/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43:   instantiated from here^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M
+/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M
+...
+FAIL: 20_util/binders.cc (test for excess errors)
+WARNING: 20_util/binders.cc compilation failed to produce executable
+-------------
+
+And here's the patch.  I'm not happy with it, and it probably gets some cases wrong,
+but it seems to work for the common native case and for my cross-compiler case.
+
+--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old	Sun Jul 13 10:42:01 2003
++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp	Sun Jul 13 11:39:54 2003
+@@ -46,8 +46,23 @@
+     global gluefile wrap_flags
+     global ld_library_path
+     global tool_root_dir
++    global target_triplet
+ 
+     set blddir [lookfor_file [get_multilibs] libstdc++-v3]
++    if { $blddir == "" } {
++        set multilibs [get_multilibs]
++        # FIXME: assume multilib only one level deep
++        set multisub [file tail $multilibs]
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir"
++        set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++        verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs"
++        set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"]
++    }
++    if { $blddir == "" } {
++         error "Can't find libstdc++-v3"
++    }
+ 
+     # By default, we assume we want to run program images.
+     global dg-do-what-default
diff --git a/patches/gcc/3.3/sh-pic-set_fpscr.patch b/patches/gcc/3.3/sh-pic-set_fpscr.patch
new file mode 100644
index 00000000..00cfb4cf
--- /dev/null
+++ b/patches/gcc/3.3/sh-pic-set_fpscr.patch
@@ -0,0 +1,60 @@
+Should fix
+make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 
+in glibc's "make tests".
+
+-------------
+
+Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: linux-sh@m17n.org
+Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails
+ with "libc.so: text relocations used" in glibc-2.3.2 for sh4)
+In-Reply-To: Your message of "Wed, 30 Jul 2003 11:20:49 +0900"
+	<200307300212.h6U2CH901209@r-rr.iij4u.or.jp>
+References: <200307300212.h6U2CH901209@r-rr.iij4u.or.jp>
+Date: Wed, 30 Jul 2003 12:03:01 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+> I'll try to write the PIC version of it,
+
+Dan, does the attached patch work for you?
+
+[dank: original patch deleted; here's same thing rediffed against gcc-3.3 instead of HEAD]
+
+--- gcc-3.3/gcc/config/sh/lib1funcs.asm.old	Tue Jul 29 21:37:29 2003
++++ gcc-3.3/gcc/config/sh/lib1funcs.asm	Tue Jul 29 21:40:58 2003
+@@ -1792,7 +1792,17 @@
+ 	.global GLOBAL(set_fpscr)
+ GLOBAL(set_fpscr):
+ 	lds r4,fpscr
++#ifdef __PIC__
++	mov.l	r12,@-r15
++	mova	LOCAL(set_fpscr_L0),r0
++	mov.l	LOCAL(set_fpscr_L0),r12
++	add	r0,r12
++	mov.l	LOCAL(set_fpscr_L1),r0
++	mov.l	@(r0,r12),r1
++	mov.l	@r15+,r12
++#else
+ 	mov.l LOCAL(set_fpscr_L1),r1
++#endif
+ 	swap.w r4,r0
+ 	or #24,r0
+ #ifndef FMOVD_WORKS
+@@ -1820,8 +1830,16 @@
+ 	mov.l r3,@(4,r1)
+ #endif
+ 	.align 2
++#ifdef __PIC__
++LOCAL(set_fpscr_L0):
++	.long _GLOBAL_OFFSET_TABLE_
++LOCAL(set_fpscr_L1):
++	.long GLOBAL(fpscr_values@GOT)
++#else
+ LOCAL(set_fpscr_L1):
+ 	.long GLOBAL(fpscr_values)
++#endif
++
+ #ifdef __ELF__
+         .comm   GLOBAL(fpscr_values),8,4
+ #else
diff --git a/patches/gcc/3.3/sh-predef-gnu_source.patch b/patches/gcc/3.3/sh-predef-gnu_source.patch
new file mode 100644
index 00000000..dc94f4c2
--- /dev/null
+++ b/patches/gcc/3.3/sh-predef-gnu_source.patch
@@ -0,0 +1,15 @@
+See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11096
+and http://gcc.gnu.org/ml/gcc-patches/2003-06/msg00424.html
+
+--- gcc-3.3/gcc/config/sh/linux.h.old	Wed Jun  4 17:37:40 2003
++++ gcc-3.3/gcc/config/sh/linux.h	Wed Jun  4 17:38:16 2003
+@@ -53,5 +53,9 @@
+    %{static:-static}"
+ 
++/* The GNU C++ standard library requires that these macros be defined.  */
++#undef CPLUSPLUS_CPP_SPEC
++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
+ #undef LIB_SPEC
+ #define LIB_SPEC \
+   "%{shared: -lc} \
diff --git a/patches/gcc/3.3/sh-spec.patch b/patches/gcc/3.3/sh-spec.patch
new file mode 100644
index 00000000..6266c1f5
--- /dev/null
+++ b/patches/gcc/3.3/sh-spec.patch
@@ -0,0 +1,45 @@
+Message-Id: <200308020452.h724q0n01509@r-rr.iij4u.or.jp>
+To: dank@kegel.com
+Cc: kkojima@rr.iij4u.or.jp
+Subject: Re: Writing PIC version of __udivsi3_i4?
+In-Reply-To: Your message of "Fri, 01 Aug 2003 21:15:27 -0700"
+	<3F2B3ADF.6030206@kegel.com>
+References: <3F2B3ADF.6030206@kegel.com>
+Date: Sat, 02 Aug 2003 13:58:05 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+Dan Kegel <dank@kegel.com> wrote:
+> It seems it might be from gcc's spec file:
+> 
+> *subtarget_link_spec:
+> %{shared:-shared}    %{!static:      %{rdynamic:-export-dynamic}      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}      %{!rpath:-rpath /lib}}    %{static:-static}
+> 
+> as the only place -rpath showed up was in the output of gcc -v as it
+> was linking libc.so.
+> 
+> Well, that's a clue, anyway!  Guess I'll dig through the spec files
+> tomorrow to see if I can figure it out some more.
+
+I've grepped gcc/config/*/*.h and found only SH and old libc1 stuffs
+of i386/alpha include %{!rpath:-rpath ... in 3.3 release and the
+current CVS. And my sh-gcc's specs doesn't have this :-(
+It would be the Right Thing to remove this stuff simply. How about
+the gcc patch below?
+
+Regards,
+	kaz
+--
+--- gcc-3.3/gcc/config/sh/linux.h.orig	Sat Aug  2 13:20:57 2003
++++ gcc-3.3/gcc/config/sh/linux.h	Sat Aug  2 13:22:42 2003
+@@ -48,8 +48,7 @@ do { \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+-     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+-     %{!rpath:-rpath /lib}} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+    %{static:-static}"
+ 
+ /* The GNU C++ standard library requires that these macros be defined.  */
+
+
diff --git a/patches/gcc/3.3/sh4-kaz-workaround.patch b/patches/gcc/3.3/sh4-kaz-workaround.patch
new file mode 100644
index 00000000..189b1323
--- /dev/null
+++ b/patches/gcc/3.3/sh4-kaz-workaround.patch
@@ -0,0 +1,145 @@
+[lightly edited to fit my patch directory - dank]
+
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Date: Sat, 09 Aug 2003 09:46:21 +0900
+To: dank@kegel.com
+
+Hi Dan,
+
+I've come back from the vacation and looked glibc string test
+failures on sh4. This looks a gcc problem. gcc-3.3/3.4 doesn't
+compile these tests correctly. The attached testcase aborts on
+gcc-3.3/3.4 -O2 but exits normally gcc-3.2 and gcc-3.0.
+The option -O2 is not essential but it makes the testcase small.
+The failed string tests include the same pattern of the code with
+f=random to generate ramdom strings but they get strings with
+embedded NULL characters :-(
+
+...
+I've got a workaround below for this bug, though it might merely
+paper over the real bug. Anyway, I'd like to send a PR for this.
+
+Regards,
+	kaz
+--
+int val = 0xff00;
+
+int f (void) { return val; }
+
+unsigned char a[1];
+
+void
+foo (void)
+{
+  a[0] = f () & 255;
+
+  if (!a[0])
+    a[0] = f () & 255;
+
+  if (!a[0])
+    a[0] = 1 + (f () & 127);
+}
+
+int
+main (int argc, char **argv)
+{
+  foo ();
+  if (!a[0])
+    abort ();
+
+  return 0;
+}
+
+--
+
+diff -u3prN ORIG/gcc/gcc/config/sh/sh.c LOCAL/gcc/gcc/config/sh/sh.c
+--- gcc/gcc/config/sh/sh.c.old	Fri Aug  8 18:39:02 2003
++++ gcc/gcc/config/sh/sh.c	Fri Aug  8 22:31:02 2003
+@@ -6657,6 +6657,19 @@ arith_reg_dest (op, mode)
+   return arith_reg_operand (op, mode);
+ }
+ 
++/* Like above, but for SImode compare destinations: forbid paradoxical
++   subregs, because it would get the combiner confused.  */
++int
++arith_reg_cmp_dest (op, mode)
++     rtx op;
++     enum machine_mode mode;
++{
++  if (mode == SImode && GET_CODE (op) == SUBREG
++      && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 4)
++    return 0;
++  return arith_reg_operand (op, mode);
++}
++
+ int
+ int_gpr_dest (op, mode)
+      rtx op;
+diff -u3prN ORIG/gcc/gcc/config/sh/sh.h LOCAL/gcc/gcc/config/sh/sh.h
+--- gcc/gcc/config/sh/sh.h.old	Fri Aug  8 18:39:02 2003
++++ gcc/gcc/config/sh/sh.h	Fri Aug  8 22:31:02 2003
+@@ -3365,6 +3365,7 @@ extern int rtx_equal_function_value_matt
+   {"and_operand", {SUBREG, REG, CONST_INT}},				\
+   {"any_register_operand", {SUBREG, REG}},				\
+   {"arith_operand", {SUBREG, REG, CONST_INT}},				\
++  {"arith_reg_cmp_dest", {SUBREG, REG}},				\
+   {"arith_reg_dest", {SUBREG, REG}},					\
+   {"arith_reg_operand", {SUBREG, REG}},					\
+   {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}},	\
+
+--- gcc-3.3/gcc/config/sh/sh.md.orig	Tue Apr 15 10:06:10 2003
++++ gcc-3.3/gcc/config/sh/sh.md	Sat Aug  9 22:31:13 2003
+@@ -616,7 +616,7 @@
+ 
+ (define_insn ""
+   [(set (reg:SI T_REG)
+-	(eq:SI (and:SI (match_operand:SI 0 "arith_reg_operand" "z,r")
++	(eq:SI (and:SI (match_operand:SI 0 "arith_reg_cmp_dest" "z,r")
+ 		       (match_operand:SI 1 "arith_operand" "L,r"))
+ 	       (const_int 0)))]
+   "TARGET_SH1"
+@@ -631,7 +631,7 @@
+ 
+ (define_insn "cmpeqsi_t"
+   [(set (reg:SI T_REG)
+-	(eq:SI (match_operand:SI 0 "arith_reg_operand" "r,z,r")
++	(eq:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,z,r")
+ 	       (match_operand:SI 1 "arith_operand" "N,rI,r")))]
+   "TARGET_SH1"
+   "@
+@@ -642,7 +642,7 @@
+ 
+ (define_insn "cmpgtsi_t"
+   [(set (reg:SI T_REG)
+-	(gt:SI (match_operand:SI 0 "arith_reg_operand" "r,r")
++	(gt:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,r")
+ 	       (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))]
+   "TARGET_SH1"
+   "@
+@@ -652,7 +652,7 @@
+ 
+ (define_insn "cmpgesi_t"
+   [(set (reg:SI T_REG)
+-	(ge:SI (match_operand:SI 0 "arith_reg_operand" "r,r")
++	(ge:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,r")
+ 	       (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))]
+   "TARGET_SH1"
+   "@
+@@ -666,7 +666,7 @@
+ 
+ (define_insn "cmpgeusi_t"
+   [(set (reg:SI T_REG)
+-	(geu:SI (match_operand:SI 0 "arith_reg_operand" "r")
++	(geu:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r")
+ 		(match_operand:SI 1 "arith_reg_operand" "r")))]
+   "TARGET_SH1"
+   "cmp/hs	%1,%0"
+@@ -674,7 +674,7 @@
+ 
+ (define_insn "cmpgtusi_t"
+   [(set (reg:SI T_REG)
+-	(gtu:SI (match_operand:SI 0 "arith_reg_operand" "r")
++	(gtu:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r")
+ 		(match_operand:SI 1 "arith_reg_operand" "r")))]
+   "TARGET_SH1"
+   "cmp/hi	%1,%0"
diff --git a/patches/gcc/3.3/sh4-no-fix-protos.patch b/patches/gcc/3.3/sh4-no-fix-protos.patch
new file mode 100644
index 00000000..c3c478f2
--- /dev/null
+++ b/patches/gcc/3.3/sh4-no-fix-protos.patch
@@ -0,0 +1,12 @@
+See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10331
+and http://gcc.gnu.org/ml/gcc-patches/2003-06/msg00423.html
+
+--- gcc-3.3/gcc/config/sh/t-linux.old	Wed Jun  4 13:01:39 2003
++++ gcc-3.3/gcc/config/sh/t-linux	Wed Jun  4 13:02:12 2003
+@@ -1,3 +1,6 @@
++# Don't run fixproto
++STMP_FIXPROTO =
++
+ TARGET_LIBGCC2_CFLAGS = -fpic
+ LIB1ASMFUNCS_CACHE = _ic_invalidate
+ 
diff --git a/patches/gcc/3.3/sh4-pthread.patch b/patches/gcc/3.3/sh4-pthread.patch
new file mode 100644
index 00000000..a0c9233b
--- /dev/null
+++ b/patches/gcc/3.3/sh4-pthread.patch
@@ -0,0 +1,42 @@
+Patch to fix following test case failure:
+
+		=== libstdc++-v3 tests ===
+FAIL: thread/pthread1.cc (test for excess errors)
+Excess errors:
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/sh4-unknown-linux-gnu/bin/ld: cannot find -lthread
+collect2: ld returned 1 exit status
+
+Note that *any* program compiled with -pthread fails:
+
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c  -pthread
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/lib/gcc-lib/sh4-unknown-linux-gnu/3.3.1/../../../../sh4-unknown-linux-gnu/bin/ld: cannot find -lthread
+collect2: ld returned 1 exit status
+
+Compiling with -lpthread on the other hand works fine:
+/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c  -lpthread
+
+So -pthread is broken in some trivial way; it should invoke -lpthread, not -lthread,
+at least when targeting Linux. 
+
+http://www.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains a jumbo patch,
+gcc-20030210-sh-linux-1.patch, that includes a fix for this.  Here's the
+appropriate hunk (brings in a fix for the documented -mieee option).
+No idea if this fix is completely right, but it works for me...
+- dank@kegel.com  20 Jul 2003
+
+Index: linux.h
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/config/sh/linux.h,v
+retrieving revision 1.9.20.1
+diff -u -d -u -r1.9.20.1 linux.h
+--- gcc-ss-3_3-20030714/gcc/config/sh/linux.h.old	6 Jun 2003 02:30:59 -0000	1.9.20.1
++++ gcc-ss-3_3-20030714/gcc/config/sh/linux.h	20 Jul 2003 23:36:50 -0000
+@@ -59,7 +59,7 @@
+ #undef LIB_SPEC
+ #define LIB_SPEC \
+   "%{shared: -lc} \
+-   %{!shared: %{pthread:-lthread} \
++   %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \
+      %{profile:-lc_p} %{!profile: -lc}}"
+ 
+ #undef STARTFILE_SPEC
diff --git a/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch b/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch
new file mode 100644
index 00000000..870024da
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch
@@ -0,0 +1,88 @@
+Retrieved from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/rs6000.h.diff?r1=1.234.2.28&r2=1.234.2.29
+
+Should fix following error building gcc for ppc7450:
+
+/tmp/ccmfQBT9.s:5197: Error: Unrecognized opcode: `lvx'
+make[2]: *** [libgcc/./unwind-dw2.o] Error 1
+make[2]: Leaving directory `build-gcc-core/gcc'
+make[1]: *** [stmp-multilib] Error 2
+make[1]: Leaving directory `build-gcc-core/gcc'
+make: *** [all-gcc] Error 2
+
+(I'm not so sure about the unconditional -many it sends to binutils;
+that seems redundant?)
+
+Revision 1.234.2.29, Tue May 25 06:08:57 2004 UTC (6 days, 11 hours ago) by amodra
+Branch: hammer-3_3-branch
+Changes since 1.234.2.28: +15 -11 lines
+
+	* config/rs6000/rs6000.h (ASM_CPU_SPEC): Handle -mpowerpc64 and -mcpu
+	for power5 and rs64a.  Correct condition for default.  Correct power3,
+	620, 630, 7400, 7450, G4, 970 and G5 -mcpu entries.  Add -many.
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.h,v
+retrieving revision 1.234.2.28
+retrieving revision 1.234.2.29
+diff -u -r1.234.2.28 -r1.234.2.29
+--- gcc/gcc/config/rs6000/rs6000.h	2004/05/18 14:26:57	1.234.2.28
++++ gcc/gcc/config/rs6000/rs6000.h	2004/05/25 06:08:57	1.234.2.29
+@@ -51,20 +51,23 @@
+ "%{!mcpu*: \
+   %{mpower: %{!mpower2: -mpwr}} \
+   %{mpower2: -mpwrx} \
+-  %{mpowerpc*: -mppc} \
++  %{mpowerpc64*: -mppc64} \
++  %{!mpowerpc64*: %{mpowerpc*: -mppc}} \
+   %{mno-power: %{!mpowerpc*: -mcom}} \
+-  %{!mno-power: %{!mpower2: %(asm_default)}}} \
++  %{!mno-power: %{!mpower*: %(asm_default)}}} \
+ %{mcpu=common: -mcom} \
+ %{mcpu=power: -mpwr} \
+ %{mcpu=power2: -mpwrx} \
+-%{mcpu=power3: -m604} \
++%{mcpu=power3: -mppc64} \
+ %{mcpu=power4: -mpower4} \
++%{mcpu=power5: -mpower4} \
+ %{mcpu=powerpc: -mppc} \
+ %{mcpu=rios: -mpwr} \
+ %{mcpu=rios1: -mpwr} \
+ %{mcpu=rios2: -mpwrx} \
+ %{mcpu=rsc: -mpwr} \
+ %{mcpu=rsc1: -mpwr} \
++%{mcpu=rs64a: -mppc64} \
+ %{mcpu=401: -mppc} \
+ %{mcpu=403: -m403} \
+ %{mcpu=405: -m405} \
+@@ -79,22 +82,23 @@
+ %{mcpu=ec603e: -mppc} \
+ %{mcpu=604: -mppc} \
+ %{mcpu=604e: -mppc} \
+-%{mcpu=620: -mppc} \
+-%{mcpu=630: -m604} \
++%{mcpu=620: -mppc64} \
++%{mcpu=630: -mppc64} \
+ %{mcpu=740: -mppc} \
+-%{mcpu=7400: -mppc} \
+-%{mcpu=7450: -mppc} \
+-%{mcpu=G4: -mppc} \
+ %{mcpu=750: -mppc} \
+ %{mcpu=G3: -mppc} \
++%{mcpu=7400: -mppc -maltivec} \
++%{mcpu=7450: -mppc -maltivec} \
++%{mcpu=G4: -mppc -maltivec} \
+ %{mcpu=801: -mppc} \
+ %{mcpu=821: -mppc} \
+ %{mcpu=823: -mppc} \
+ %{mcpu=860: -mppc} \
+-%{mcpu=970: -mpower4} \
+-%{mcpu=G5: -mpower4} \
++%{mcpu=970: -mpower4 -maltivec} \
++%{mcpu=G5: -mpower4 -maltivec} \
+ %{mcpu=8540: -me500} \
+-%{maltivec: -maltivec}"
++%{maltivec: -maltivec} \
++-many"
+ 
+ #define CPP_DEFAULT_SPEC ""
+ 
diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch
new file mode 100644
index 00000000..c9288c6c
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch
@@ -0,0 +1,70 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+See http://gcc.gnu.org/PR16350
+
+diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-07-02 14:46:29.225443757 +0200
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -89,7 +106,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc
+--- gcc-3.4.0.orig/gcc/config.gcc	2004-04-17 04:28:24.000000000 +0200
++++ gcc-3.4.0/gcc/config.gcc	2004-07-02 14:44:40.045822542 +0200
+@@ -666,6 +666,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch
new file mode 100644
index 00000000..69a79d5d
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch
@@ -0,0 +1,27 @@
+# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01
+# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314
+# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline
+# Fixes errors like the following when building glibc (or any other executable
+# or shared library) when using gcc 3.4.0 for ARM with softfloat:
+#
+# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3'
+# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2'
+# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi'
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux
+--- gcc-3.4.0-orig/gcc/config/arm/t-linux	2003-09-20 23:09:07.000000000 +0200
++++ gcc-3.4.0/gcc/config/arm/t-linux	2004-05-01 20:31:59.102846400 +0200
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch
new file mode 100644
index 00000000..43eed3ef
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch
@@ -0,0 +1,24 @@
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+# 
+# Fixes errors like
+# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat
+# collect2: ld returned 1 exit status
+# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1
+# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-05-01 19:19:06.935979200 +0200
+@@ -55,7 +73,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+
diff --git a/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch b/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch
new file mode 100644
index 00000000..2a48c99c
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch
@@ -0,0 +1,46 @@
+See http://gcc.gnu.org/ml/gcc/2004-06/msg00394.html
+This might fix the error
+
+strstream.s: Assembler messages:
+strstream.s:8390: Error: junk `(%ecx)' after expression
+strstream.s:8402: Error: junk `(%ecx)' after expression
+strstream.s:8551: Error: junk `(%ecx)' after expression
+strstream.s:8563: Error: junk `(%ecx)' after expression
+make[3]: *** [strstream.lo] Error 1
+make[3]: Leaving directory `i686-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-gcc/i686-unknown-linux-gnu/libstdc++-v3/src'
+
+when building a cygwin->linux cross-compiler with gcc-3.4.0,
+probably caused by patch to fix http://gcc.gnu.org/PR14808
+
+
+--- gcc-3.4.0/gcc/cp/method.c.old	Sun Jun  6 22:46:04 2004
++++ gcc-3.4.0/gcc/cp/method.c	Sun Jun  6 22:48:13 2004
+@@ -286,7 +286,7 @@
+   tree alias;
+   char buf[256];
+ 
+-#if defined (__CYGWIN__) || defined (__MINGW32__)
++#if defined (TARGET_IS_PE_COFF)
+   if (DECL_ONE_ONLY (function))
+     return function;
+ #endif
+@@ -404,7 +404,7 @@
+   push_to_top_level ();
+ 
+ #if defined (ASM_OUTPUT_DEF) \
+-  && !(defined (__CYGWIN__) || defined (__MINGW32__))
++  && !defined (TARGET_IS_PE_COFF)
+   if (targetm.have_named_sections)
+     {
+       resolve_unique_section (function, 0, flag_function_sections);
+--- gcc-3.4.0/gcc/config/i386/cygming.h.old	Sun Jun  6 22:50:46 2004
++++ gcc-3.4.0/gcc/config/i386/cygming.h	Sun Jun  6 22:52:10 2004
+@@ -27,6 +27,8 @@
+ 
+ #define TARGET_EXECUTABLE_SUFFIX ".exe"
+ 
++#define TARGET_IS_PE_COFF 1
++
+ #include <stdio.h>
+ 
+ /* Masks for subtarget switches used by other files.  */
diff --git a/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch b/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch
new file mode 100644
index 00000000..6357f568
--- /dev/null
+++ b/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch
@@ -0,0 +1,52 @@
+Date: Sat, 1 May 2004 21:08:10 +0200
+From: Jakub Jelinek <jakub@redhat.com>
+To: Dan Kegel <dank@kegel.com>, mark@codesourcery.com
+Cc: gcc-patches@gcc.gnu.org
+Subject: [PATCH] sparc64-linux --with-cpu=ultrasparc fix
+Message-ID: <20040501190810.GD5191@sunsite.ms.mff.cuni.cz>
+Reply-To: Jakub Jelinek <jakub@redhat.com>
+References: <40940B11.9080907@kegel.com>
+In-Reply-To: <40940B11.9080907@kegel.com>
+
+On Sat, May 01, 2004 at 01:39:45PM -0700, Dan Kegel wrote:
+> I'm having a bit of trouble configuring gcc-3.4.0  for sparc64-linux.
+> The resulting compiler defaults to sparc32, which is a problem
+> because it means having to figure out how to add
+> -mcpu=ultrasparc3 -Wa,-Av9a -m64 to CFLAGS for everything I build.
+> The worst part is that this even affects libgcc.a, which makes it
+> pretty hard to link any sparc64 executables.  I could figure out
+> how mklibgcc and multilibbing work, and maybe thereby get a good 64 bit 
+> libgcc.a,
+> but I'd kind of like to avoid that for the moment, and just really get
+> gcc to default to 64 bit output.
+> 
+> What's the right way to get gcc to default to building 64 bit executables
+> when targeting sparc64-linux?
+
+There was TARGET_CPU_ultrasparc3 missing in linux64.h.
+I've commited the following fix to the trunk, but as it is not a regression,
+I'm not sure if Mark is ok with this for gcc-3_4-branch.
+
+2004-05-01  Jakub Jelinek  <jakub@redhat.com>
+
+	* config/sparc/linux64.h (TARGET_DEFAULT): Make 64-bit by default
+	also for TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3.
+
+--- gcc-3.4.0/gcc/config/sparc/linux64.h.jj	2004-05-01 22:59:52.000000000 +0200
++++ gcc-3.4.0/gcc/config/sparc/linux64.h	2004-05-01 23:00:41.126176529 +0200
+@@ -39,7 +39,9 @@ Boston, MA 02111-1307, USA.  */
+ #undef MD_EXEC_PREFIX
+ #undef MD_STARTFILE_PREFIX
+ 
+-#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
++#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
++    || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \
++    || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3
+ /* A 64 bit v9 compiler with stack-bias,
+    in a Medium/Low code model environment.  */
+ 
+
+	Jakub
+
+
+
diff --git a/patches/gcc/3.4.0/pr13250-fix.patch b/patches/gcc/3.4.0/pr13250-fix.patch
new file mode 100644
index 00000000..ce68bb1b
--- /dev/null
+++ b/patches/gcc/3.4.0/pr13250-fix.patch
@@ -0,0 +1,19 @@
+See http://gcc.gnu.org/PR13250
+Fixes bad code generated when compiling SHA256 for SH processor
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.md,v
+retrieving revision 1.171
+retrieving revision 1.172
+diff -u -r1.171 -r1.172
+--- gcc/gcc/config/sh/sh.md	2004/05/10 23:25:13	1.171
++++ gcc/gcc/config/sh/sh.md	2004/05/28 05:47:36	1.172
+@@ -2194,7 +2194,7 @@
+ 	parts[0] = gen_reg_rtx (SImode);
+ 	parts[1] = gen_reg_rtx (SImode);
+ 	emit_insn (gen_rotlsi3_16 (parts[2-choice], operands[1]));
+-	parts[choice-1] = operands[1];
++	emit_move_insn (parts[choice-1], operands[1]);
+ 	emit_insn (gen_ashlsi3 (parts[0], parts[0], GEN_INT (8)));
+ 	emit_insn (gen_lshrsi3 (parts[1], parts[1], GEN_INT (8)));
+ 	emit_insn (gen_iorsi3 (operands[0], parts[0], parts[1]));
diff --git a/patches/gcc/3.4.0/pr15647-fix.patch b/patches/gcc/3.4.0/pr15647-fix.patch
new file mode 100644
index 00000000..6a4265d6
--- /dev/null
+++ b/patches/gcc/3.4.0/pr15647-fix.patch
@@ -0,0 +1,288 @@
+Received: (qmail 11693 invoked from network); 26 May 2004 03:17:41 -0000
+Received: from unknown (HELO r-rr.iij4u.or.jp) (210.130.0.76)
+  by sourceware dot org with SMTP; 26 May 2004 03:17:41 -0000
+Received: from localhost (frgw.3in.ne.jp [210.251.121.226])
+	by r-rr dot iij4u dot or dot jp (8 dot 11 dot 6+IIJ/8 dot 11 dot 6) with ESMTP id i4Q3HbJ21421;
+	Wed, 26 May 2004 12:17:37 +0900 (JST)
+Date: Wed, 26 May 2004 12:13:58 +0900 (JST)
+Message-Id: <20040526.121358.39460214.kkojima@rr.iij4u.or.jp>
+To: gcc-patches at gcc dot gnu dot org
+Cc: Mark Mitchell <mark at codesourcery dot com>
+Subject: [PATCH] Fix PR target/15647 for sh-linux
+From: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp>
+Mime-Version: 1.0
+Content-Type: Text/Plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+Hi,
+
+The appended patch is to fix PR target/15647
+  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15647
+for linux.
+__udivsi3 is exported from libgcc_s.so.1 and gcc generates the code
+which assumes r1 will be not clobbered when calling __udivsi3 in SH3
+case.  This is bad because r1 is clobbered by PLT.
+The another functions listed in the standard libgcc-std.ver which
+possively have similar problem are __ashlsi3, __ashrsi3 and __lshrsi3,
+though these are used only by SH1/2.
+The patch below simply uses an SH specific libgcc-std.ver which drops
+these functions.  SH linux uses a linker script libgcc_s.so having
+libgcc.a as a suppementary library, so these functions given by
+libgcc.a when needed in the link time.
+Although mainline has one failure in bulding zlib which can be avoided
+with -fno-reorder-blocks for sh3-unknown-linux-gnu target, x86 cross
+to sh3-unknown-linux-gnu can be build successfully on mainline with
+this patch except the above failure.  3.4-branch successfully bootstraps
+with it and there are no new failures on the native sh4-unknown-linux-gnu.
+The patch is highly sh-linux specific and seems to be safe.  I'll check
+it into mainline.
+The original PR is also for sh3 netbsd.  I'd like to leave it for the
+netbsd experts.
+
+I think that it's too late for 3.3.4.  Mark, is it also late for
+3.4.1?
+
+Regards,
+	kaz
+--
+2004-05-26  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* config/sh/t-linux (SHLIB_MAPFILES): Use sh specific
+	libgcc-std.ver.
+	* config/sh/libgcc-std.ver: New file.
+
+diff -u3prN ORIG-gcc/gcc/config/sh/t-linux LOCAL-gcc/gcc/config/sh/t-linux
+--- ORIG-gcc/gcc/config/sh/t-linux	Mon Feb 16 20:13:25 2004
++++ LOCAL-gcc/gcc/config/sh/t-linux	Tue May 25 18:25:48 2004
+@@ -11,8 +11,11 @@ MULTILIB_EXCEPTIONS=
+ EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o
+ 
+ # Override t-slibgcc-elf-ver to export some libgcc symbols with
+-# the symbol versions that glibc used.
+-SHLIB_MAPFILES =  $(srcdir)/libgcc-std.ver $(srcdir)/config/sh/libgcc-glibc.ver
++# the symbol versions that glibc used.  Also use an sh specific
++# libgcc-std.ver to avoid to export some lib1func routines which
++# should not be called via PLT.
++SHLIB_MAPFILES =  $(srcdir)/config/sh/libgcc-std.ver \
++	$(srcdir)/config/sh/libgcc-glibc.ver
+ 
+ # Override SHLIB_LINK and SHLIB_INSTALL to use linker script
+ # libgcc_s.so.
+diff -u3prN ORIG-gcc/gcc/config/sh/libgcc-std.ver LOCAL-gcc/gcc/config/sh/libgcc-std.ver
+--- ORIG-gcc/gcc/config/sh/libgcc-std.ver	Thu Jan  1 09:00:00 1970
++++ LOCAL-gcc/gcc/config/sh/libgcc-std.ver	Tue May 25 18:50:54 2004
+@@ -0,0 +1,213 @@
++GCC_3.0 {
++  # libgcc1 integer symbols
++  __absvsi2
++  __addvsi3
++  # __ashlsi3
++  # __ashrsi3
++  __divsi3
++  # __lshrsi3
++  __modsi3
++  __mulsi3
++  __mulvsi3
++  __negvsi2
++  __subvsi3
++  # __udivsi3
++  __umodsi3
++
++  # libgcc1 floating point symbols
++  __addsf3
++  __adddf3
++  __addxf3
++  __addtf3
++  __divsf3
++  __divdf3
++  __divxf3
++  __divtf3
++  __eqsf2
++  __eqdf2
++  __eqxf2
++  __eqtf2
++  __extenddfxf2
++  __extenddftf2
++  __extendsfdf2
++  __extendsfxf2
++  __extendsftf2
++  __fixsfsi
++  __fixdfsi
++  __fixxfsi
++  __fixtfsi
++  __floatsisf
++  __floatsidf
++  __floatsixf
++  __floatsitf
++  __gesf2
++  __gedf2
++  __gexf2
++  __getf2
++  __gtsf2
++  __gtdf2
++  __gtxf2
++  __gttf2
++  __lesf2
++  __ledf2
++  __lexf2
++  __letf2
++  __ltsf2
++  __ltdf2
++  __ltxf2
++  __lttf2
++  __mulsf3
++  __muldf3
++  __mulxf3
++  __multf3
++  __negsf2
++  __negdf2
++  __negxf2
++  __negtf2
++  __nesf2
++  __nedf2
++  __nexf2
++  __netf2
++  __subsf3
++  __subdf3
++  __subxf3
++  __subtf3
++  __truncdfsf2
++  __truncxfsf2
++  __trunctfsf2
++  __truncxfdf2
++  __trunctfdf2
++
++  # libgcc2 DImode arithmetic (for 32-bit targets).
++  __absvdi2
++  __addvdi3
++  __ashldi3
++  __ashrdi3
++  __cmpdi2
++  __divdi3
++  __ffsdi2
++  __fixdfdi
++  __fixsfdi
++  __fixtfdi
++  __fixxfdi
++  __fixunsdfdi
++  __fixunsdfsi
++  __fixunssfsi
++  __fixunssfdi
++  __fixunstfdi
++  __fixunstfsi
++  __fixunsxfdi
++  __fixunsxfsi
++  __floatdidf
++  __floatdisf
++  __floatdixf
++  __floatditf
++  __lshrdi3
++  __moddi3
++  __muldi3
++  __mulvdi3
++  __negdi2
++  __negvdi2
++  __subvdi3
++  __ucmpdi2
++  __udivdi3
++  __udivmoddi4
++  __umoddi3
++
++  # libgcc2 TImode arithmetic (for 64-bit targets).
++  __ashlti3
++  __ashrti3
++  __cmpti2
++  __divti3
++  __ffsti2
++  __fixdfti
++  __fixsfti
++  __fixtfti
++  __fixxfti
++  __lshrti3
++  __modti3
++  __multi3
++  __negti2
++  __ucmpti2
++  __udivmodti4
++  __udivti3
++  __umodti3
++  __fixunsdfti
++  __fixunssfti
++  __fixunstfti
++  __fixunsxfti
++  __floattidf
++  __floattisf
++  __floattixf
++  __floattitf
++
++  # Used to deal with trampoline initialization on some platforms
++  __clear_cache
++
++  # EH symbols
++  _Unwind_DeleteException
++  _Unwind_Find_FDE
++  _Unwind_ForcedUnwind
++  _Unwind_GetGR
++  _Unwind_GetIP
++  _Unwind_GetLanguageSpecificData
++  _Unwind_GetRegionStart
++  _Unwind_GetTextRelBase
++  _Unwind_GetDataRelBase
++  _Unwind_RaiseException
++  _Unwind_Resume
++  _Unwind_SetGR
++  _Unwind_SetIP
++  __deregister_frame
++  __deregister_frame_info
++  __deregister_frame_info_bases
++  __register_frame
++  __register_frame_info
++  __register_frame_info_bases
++  __register_frame_info_table
++  __register_frame_info_table_bases
++  __register_frame_table
++
++  # SjLj EH symbols
++  _Unwind_SjLj_Register
++  _Unwind_SjLj_Unregister
++  _Unwind_SjLj_RaiseException
++  _Unwind_SjLj_ForcedUnwind
++  _Unwind_SjLj_Resume
++}
++
++%inherit GCC_3.3 GCC_3.0
++GCC_3.3 {
++  _Unwind_FindEnclosingFunction
++  _Unwind_GetCFA
++  _Unwind_Backtrace
++  _Unwind_Resume_or_Rethrow
++  _Unwind_SjLj_Resume_or_Rethrow
++}
++
++%inherit GCC_3.3.1 GCC_3.3
++GCC_3.3.1 {
++  __gcc_personality_sj0
++  __gcc_personality_v0
++}
++
++%inherit GCC_3.3.2 GCC_3.3.1
++GCC_3.3.2 {
++}
++
++%inherit GCC_3.4 GCC_3.3.2
++GCC_3.4 {
++  # bit scanning and counting built-ins
++  __clzsi2
++  __clzdi2
++  __clzti2
++  __ctzsi2
++  __ctzdi2
++  __ctzti2
++  __popcountsi2
++  __popcountdi2
++  __popcountti2
++  __paritysi2
++  __paritydi2
++  __parityti2
++}
+
diff --git a/patches/gcc/3.4.1/fix-fixincl.patch b/patches/gcc/3.4.1/fix-fixincl.patch
new file mode 100644
index 00000000..7936b19b
--- /dev/null
+++ b/patches/gcc/3.4.1/fix-fixincl.patch
@@ -0,0 +1,70 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
+(the only two I've tried like this), the configure script happily copies
+the glibc include files from include to sys-include; here's the line
+from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+
+--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
++++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
+@@ -350,7 +350,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2532,11 +2535,13 @@
+ 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: fixinc.sh gsyslimits.h
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch b/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch
new file mode 100644
index 00000000..2fc805b6
--- /dev/null
+++ b/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch
@@ -0,0 +1,42 @@
+Message-ID: <33159.207.230.144.240.1093980498.squirrel@207.230.144.240>
+Date: Tue, 31 Aug 2004 14:28:18 -0500 (CDT)
+Subject: Crosstool 0.28-rc35
+From: "Jason Rothstein" <fdragon@fdragon.org>
+To: dank@kegel.com
+
+Could you please add the patches in GCC PR 16430 to GCC 3.4.1?
+
+http://gcc.gnu.org/PR16430
+
+These fix one of 2 current ICE conditions when building a sparc64 ada
+compilers.
+
+
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sparc/sparc.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.271.4.16&r2=1.271.4.17
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/sparc/sparc.c,v
+retrieving revision 1.271.4.16
+retrieving revision 1.271.4.17
+diff -u -r1.271.4.16 -r1.271.4.17
+--- gcc/gcc/config/sparc/sparc.c	2004/07/08 13:00:56	1.271.4.16
++++ gcc/gcc/config/sparc/sparc.c	2004/07/08 14:36:51	1.271.4.17
+@@ -5808,6 +5808,18 @@
+ 	    abort ();
+ 
+ 	  mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
++
++	  /* ??? We probably should have made the same ABI change in
++	     3.4.0 as the one we made for unions.   The latter was
++	     required by the SCD though, while the former is not
++	     specified, so we favored compatibility and efficiency.
++
++	     Now we're stuck for aggregates larger than 16 bytes,
++	     because OImode vanished in the meantime.  Let's not
++	     try to be unduly clever, and simply follow the ABI
++	     for unions in that case.  */
++	  if (mode == BLKmode)
++	    return function_arg_union_value (bytes, mode, regbase);
+ 	}
+       else if (GET_MODE_CLASS (mode) == MODE_INT
+ 	       && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch
new file mode 100644
index 00000000..c9288c6c
--- /dev/null
+++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch
@@ -0,0 +1,70 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+See http://gcc.gnu.org/PR16350
+
+diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-07-02 14:46:29.225443757 +0200
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -89,7 +106,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc
+--- gcc-3.4.0.orig/gcc/config.gcc	2004-04-17 04:28:24.000000000 +0200
++++ gcc-3.4.0/gcc/config.gcc	2004-07-02 14:44:40.045822542 +0200
+@@ -666,6 +666,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch
new file mode 100644
index 00000000..69a79d5d
--- /dev/null
+++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch
@@ -0,0 +1,27 @@
+# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01
+# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314
+# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline
+# Fixes errors like the following when building glibc (or any other executable
+# or shared library) when using gcc 3.4.0 for ARM with softfloat:
+#
+# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3'
+# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2'
+# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi'
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux
+--- gcc-3.4.0-orig/gcc/config/arm/t-linux	2003-09-20 23:09:07.000000000 +0200
++++ gcc-3.4.0/gcc/config/arm/t-linux	2004-05-01 20:31:59.102846400 +0200
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch
new file mode 100644
index 00000000..43eed3ef
--- /dev/null
+++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch
@@ -0,0 +1,24 @@
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+# 
+# Fixes errors like
+# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat
+# collect2: ld returned 1 exit status
+# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1
+# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-05-01 19:19:06.935979200 +0200
+@@ -55,7 +73,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+
diff --git a/patches/gcc/3.4.1/pr15068-fix.patch b/patches/gcc/3.4.1/pr15068-fix.patch
new file mode 100644
index 00000000..2977765c
--- /dev/null
+++ b/patches/gcc/3.4.1/pr15068-fix.patch
@@ -0,0 +1,44 @@
+See http://gcc.gnu.org/PR15068
+
+Fixes error
+
+../sysdeps/generic/s_fmax.c: In function `__fmax':
+../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257
+Please submit a full bug report,
+with preprocessed source if appropriate.
+See <URL:http://gcc.gnu.org/bugs.html> for instructions.
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math'
+make[1]: *** [math/others] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822'
+make: *** [all] Error 2
+
+[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ]
+
+--- gcc-3.4.1/gcc/flow.c.old	2004-02-27 19:39:19.000000000 -0800
++++ gcc-3.4.1/gcc/flow.c	2004-08-26 07:29:46.000000000 -0700
+@@ -1878,6 +1878,7 @@
+ 	  rtx set_src = SET_SRC (pc_set (BB_END (bb)));
+ 	  rtx cond_true = XEXP (set_src, 0);
+ 	  rtx reg = XEXP (cond_true, 0);
++ 	  enum rtx_code inv_cond;
+ 
+ 	  if (GET_CODE (reg) == SUBREG)
+ 	    reg = SUBREG_REG (reg);
+@@ -1886,11 +1887,13 @@
+ 	     in the form of a comparison of a register against zero.  
+ 	     If the condition is more complex than that, then it is safe
+ 	     not to record any information.  */
+-	  if (GET_CODE (reg) == REG
++ 	  inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
++ 	  if (inv_cond != UNKNOWN
++	      && GET_CODE (reg) == REG
+ 	      && XEXP (cond_true, 1) == const0_rtx)
+ 	    {
+ 	      rtx cond_false
+-		= gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
++		= gen_rtx_fmt_ee (inv_cond,
+ 				  GET_MODE (cond_true), XEXP (cond_true, 0),
+ 				  XEXP (cond_true, 1));
+ 	      if (GET_CODE (XEXP (set_src, 1)) == PC)
diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch
new file mode 100644
index 00000000..f7178c19
--- /dev/null
+++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch
@@ -0,0 +1,82 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+Fixes build error
+
+/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux
+Supported emulations: armelfb_linux armelfb
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3'
+make: *** [all] Error 2
+
+
+See http://gcc.gnu.org/PR16350
+
+diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-07-02 14:46:29.225443757 +0200
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -89,7 +106,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc
+--- gcc-3.4.0.orig/gcc/config.gcc	2004-04-17 04:28:24.000000000 +0200
++++ gcc-3.4.0/gcc/config.gcc	2004-07-02 14:44:40.045822542 +0200
+@@ -666,6 +666,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch
new file mode 100644
index 00000000..69a79d5d
--- /dev/null
+++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch
@@ -0,0 +1,27 @@
+# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01
+# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314
+# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline
+# Fixes errors like the following when building glibc (or any other executable
+# or shared library) when using gcc 3.4.0 for ARM with softfloat:
+#
+# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3'
+# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2'
+# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi'
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux
+--- gcc-3.4.0-orig/gcc/config/arm/t-linux	2003-09-20 23:09:07.000000000 +0200
++++ gcc-3.4.0/gcc/config/arm/t-linux	2004-05-01 20:31:59.102846400 +0200
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch
new file mode 100644
index 00000000..43eed3ef
--- /dev/null
+++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch
@@ -0,0 +1,24 @@
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+# 
+# Fixes errors like
+# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat
+# collect2: ld returned 1 exit status
+# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1
+# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-05-01 19:19:06.935979200 +0200
+@@ -55,7 +73,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+
diff --git a/patches/gcc/3.4.3/fix-fixincl.patch b/patches/gcc/3.4.3/fix-fixincl.patch
new file mode 100644
index 00000000..7936b19b
--- /dev/null
+++ b/patches/gcc/3.4.3/fix-fixincl.patch
@@ -0,0 +1,70 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
+(the only two I've tried like this), the configure script happily copies
+the glibc include files from include to sys-include; here's the line
+from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+
+--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
++++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
+@@ -350,7 +350,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2532,11 +2535,13 @@
+ 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: fixinc.sh gsyslimits.h
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch
new file mode 100644
index 00000000..f7178c19
--- /dev/null
+++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch
@@ -0,0 +1,82 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+Fixes build error
+
+/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux
+Supported emulations: armelfb_linux armelfb
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3'
+make: *** [all] Error 2
+
+
+See http://gcc.gnu.org/PR16350
+
+diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-07-02 14:46:29.225443757 +0200
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -89,7 +106,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc
+--- gcc-3.4.0.orig/gcc/config.gcc	2004-04-17 04:28:24.000000000 +0200
++++ gcc-3.4.0/gcc/config.gcc	2004-07-02 14:44:40.045822542 +0200
+@@ -666,6 +666,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch
new file mode 100644
index 00000000..69a79d5d
--- /dev/null
+++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch
@@ -0,0 +1,27 @@
+# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01
+# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314
+# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline
+# Fixes errors like the following when building glibc (or any other executable
+# or shared library) when using gcc 3.4.0 for ARM with softfloat:
+#
+# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3'
+# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2'
+# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi'
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux
+--- gcc-3.4.0-orig/gcc/config/arm/t-linux	2003-09-20 23:09:07.000000000 +0200
++++ gcc-3.4.0/gcc/config/arm/t-linux	2004-05-01 20:31:59.102846400 +0200
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch
new file mode 100644
index 00000000..43eed3ef
--- /dev/null
+++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch
@@ -0,0 +1,24 @@
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+# 
+# Fixes errors like
+# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat
+# collect2: ld returned 1 exit status
+# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1
+# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-05-01 19:19:06.935979200 +0200
+@@ -55,7 +73,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+
diff --git a/patches/gcc/3.4.3/pr15068-fix.patch b/patches/gcc/3.4.3/pr15068-fix.patch
new file mode 100644
index 00000000..2977765c
--- /dev/null
+++ b/patches/gcc/3.4.3/pr15068-fix.patch
@@ -0,0 +1,44 @@
+See http://gcc.gnu.org/PR15068
+
+Fixes error
+
+../sysdeps/generic/s_fmax.c: In function `__fmax':
+../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257
+Please submit a full bug report,
+with preprocessed source if appropriate.
+See <URL:http://gcc.gnu.org/bugs.html> for instructions.
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math'
+make[1]: *** [math/others] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822'
+make: *** [all] Error 2
+
+[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ]
+
+--- gcc-3.4.1/gcc/flow.c.old	2004-02-27 19:39:19.000000000 -0800
++++ gcc-3.4.1/gcc/flow.c	2004-08-26 07:29:46.000000000 -0700
+@@ -1878,6 +1878,7 @@
+ 	  rtx set_src = SET_SRC (pc_set (BB_END (bb)));
+ 	  rtx cond_true = XEXP (set_src, 0);
+ 	  rtx reg = XEXP (cond_true, 0);
++ 	  enum rtx_code inv_cond;
+ 
+ 	  if (GET_CODE (reg) == SUBREG)
+ 	    reg = SUBREG_REG (reg);
+@@ -1886,11 +1887,13 @@
+ 	     in the form of a comparison of a register against zero.  
+ 	     If the condition is more complex than that, then it is safe
+ 	     not to record any information.  */
+-	  if (GET_CODE (reg) == REG
++ 	  inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
++ 	  if (inv_cond != UNKNOWN
++	      && GET_CODE (reg) == REG
+ 	      && XEXP (cond_true, 1) == const0_rtx)
+ 	    {
+ 	      rtx cond_false
+-		= gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
++		= gen_rtx_fmt_ee (inv_cond,
+ 				  GET_MODE (cond_true), XEXP (cond_true, 0),
+ 				  XEXP (cond_true, 1));
+ 	      if (GET_CODE (XEXP (set_src, 1)) == PC)
diff --git a/patches/gcc/3.4.3/pr16201-fix.patch b/patches/gcc/3.4.3/pr16201-fix.patch
new file mode 100644
index 00000000..be3fec97
--- /dev/null
+++ b/patches/gcc/3.4.3/pr16201-fix.patch
@@ -0,0 +1,149 @@
+See http://gcc.gnu.org/PR16201
+
+Should fix "bad immediate value for offset" errors for several flavors of arm, e.g.
+
+/tmp/ccmdoQyg.s: Assembler messages:
+/tmp/ccmdoQyg.s:6235: Error: bad immediate value for offset (4096)
+make[2]: *** [crosstool-0.32/build/arm-xscale-linux-gnu/gcc-3.4.3-glibc-2.3.3/build-glibc/locale/ld-collate.o] Error 1
+
+/tmp/cc0c7qop.s: Assembler messages:
+/tmp/cc0c7qop.s:6234: Error: bad immediate value for offset (4104)
+make[2]: *** [crosstool-0.32/build/armv5b-softfloat-linux/gcc-3.4.3-glibc-2.3.3/build-glibc/locale/ld-collate.o] Error 1
+
+
+CVSROOT:        /cvs/gcc
+Module name:    gcc
+Branch:         gcc-3_4-branch
+Changes by:     rearnsha@gcc.gnu.org    2005-02-01 15:07:05
+
+Modified files:
+        gcc            : ChangeLog 
+        gcc/config/arm : arm-protos.h arm.c 
+
+Log message:
+        PR target/16201
+        * arm.c (arm_eliminable_register): New function.
+        (adjacent_mem_locations): Don't allow eliminable registers.  Use
+        HOST_WIDE_INT for address offsets.
+        * arm-protos.h (arm_eliminable_register): Add prototype.
+
+Patches:
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.790&r2=2.2326.2.791
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm-protos.h.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.61&r2=1.61.4.1
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.317.4.8&r2=1.317.4.9
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/arm/arm-protos.h,v
+retrieving revision 1.61
+retrieving revision 1.61.4.1
+diff -u -r1.61 -r1.61.4.1
+--- gcc/gcc/config/arm/arm-protos.h	2003/11/20 11:44:18	1.61
++++ gcc/gcc/config/arm/arm-protos.h	2005/02/01 15:07:02	1.61.4.1
+@@ -1,5 +1,6 @@
+ /* Prototypes for exported functions defined in arm.c and pe.c
+-   Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005
++   Free Software Foundation, Inc.
+    Contributed by Richard Earnshaw (rearnsha@arm.com)
+    Minor hacks by Nick Clifton (nickc@cygnus.com)
+ 
+@@ -138,6 +139,7 @@
+ extern int arm_is_longcall_p (rtx, int, int);
+ extern int    arm_emit_vector_const (FILE *, rtx);
+ extern const char * arm_output_load_gr (rtx *);
++extern int arm_eliminable_register (rtx);
+ 
+ #if defined TREE_CODE
+ extern rtx arm_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/config/arm/arm.c,v
+retrieving revision 1.317.4.8
+retrieving revision 1.317.4.9
+diff -u -r1.317.4.8 -r1.317.4.9
+--- gcc/gcc/config/arm/arm.c	2004/04/29 19:52:41	1.317.4.8
++++ gcc/gcc/config/arm/arm.c	2005/02/01 15:07:02	1.317.4.9
+@@ -1,6 +1,6 @@
+ /* Output routines for GCC for ARM.
+    Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+-   2002, 2003, 2004  Free Software Foundation, Inc.
++   2002, 2003, 2004, 2005  Free Software Foundation, Inc.
+    Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
+    and Martin Simmons (@harleqn.co.uk).
+    More major hacks by Richard Earnshaw (rearnsha@arm.com).
+@@ -4056,6 +4056,16 @@
+ 	  && INTVAL (op) < 64);
+ }
+ 
++/* Return true if X is a register that will be eliminated later on.  */
++int
++arm_eliminable_register (rtx x)
++{
++  return REG_P (x) && (REGNO (x) == FRAME_POINTER_REGNUM
++		       || REGNO (x) == ARG_POINTER_REGNUM
++		       || (REGNO (x) >= FIRST_VIRTUAL_REGISTER
++			   && REGNO (x) <= LAST_VIRTUAL_REGISTER));
++}
++
+ /* Returns TRUE if INSN is an "LDR REG, ADDR" instruction.
+    Use by the Cirrus Maverick code which has to workaround
+    a hardware bug triggered by such instructions.  */
+@@ -4569,33 +4579,42 @@
+ 	  || (GET_CODE (XEXP (b, 0)) == PLUS
+ 	      && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT)))
+     {
+-      int val0 = 0, val1 = 0;
+-      int reg0, reg1;
+-  
++      HOST_WIDE_INT val0 = 0, val1 = 0;
++      rtx reg0, reg1;
++      int val_diff;
++
+       if (GET_CODE (XEXP (a, 0)) == PLUS)
+         {
+-	  reg0 = REGNO  (XEXP (XEXP (a, 0), 0));
++	  reg0 = XEXP (XEXP (a, 0), 0);
+ 	  val0 = INTVAL (XEXP (XEXP (a, 0), 1));
+         }
+       else
+-	reg0 = REGNO (XEXP (a, 0));
++	reg0 = XEXP (a, 0);
+ 
+       if (GET_CODE (XEXP (b, 0)) == PLUS)
+         {
+-	  reg1 = REGNO  (XEXP (XEXP (b, 0), 0));
++	  reg1 = XEXP (XEXP (b, 0), 0);
+ 	  val1 = INTVAL (XEXP (XEXP (b, 0), 1));
+         }
+       else
+-	reg1 = REGNO (XEXP (b, 0));
++	reg1 = XEXP (b, 0);
+ 
+       /* Don't accept any offset that will require multiple
+ 	 instructions to handle, since this would cause the
+ 	 arith_adjacentmem pattern to output an overlong sequence.  */
+       if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1))
+ 	return 0;
+-      
+-      return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4);
++
++      /* Don't allow an eliminable register: register elimination can make
++	 the offset too large.  */
++      if (arm_eliminable_register (reg0))
++	return 0;
++
++      val_diff = val1 - val0;
++      return ((REGNO (reg0) == REGNO (reg1))
++	      && (val_diff == 4 || val_diff == -4));
+     }
++
+   return 0;
+ }
+ 
+@@ -7301,7 +7320,6 @@
+   return "";
+ }
+ 
+-
+ /* Output a move from arm registers to an fpa registers.
+    OPERANDS[0] is an fpa register.
+    OPERANDS[1] is the first registers of an arm register pair.  */
diff --git a/patches/gcc/3.4.3/pr18508-fix.patch b/patches/gcc/3.4.3/pr18508-fix.patch
new file mode 100644
index 00000000..a438fee8
--- /dev/null
+++ b/patches/gcc/3.4.3/pr18508-fix.patch
@@ -0,0 +1,143 @@
+See http://gcc.gnu.org/PR18508
+
+This should fix cygwin errors like:
+
+basename: missing operand
+Try `basename --help' for more information.
+mv: `libgcc_s_nof.so.1' and `libgcc_s_nof.so.1.' are the same file
+make[2]: *** [nof/libgcc_s_nof.so] Error 1
+make[2]: Leaving directory `/home/cvachoucek/crosstool-0.32/build/powerpc-750-linux-gnu/gcc-3.4.3-glibc-2.3.5/build-gcc/gcc'
+make[1]: *** [stmp-multilib] Error 2
+make[1]: Leaving directory `/home/cvachoucek/crosstool-0.32/build/powerpc-750-linux-gnu/gcc-3.4.3-glibc-2.3.5/build-gcc/gcc'
+make: *** [install-gcc] Error 2
+
+From gcc-patches-return-133821-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org Wed Nov 17 00:15:28 2004
+Return-Path: <gcc-patches-return-133821-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org>
+Delivered-To: listarch-gcc-patches at gcc dot gnu dot org
+Received: (qmail 12823 invoked by alias); 17 Nov 2004 00:15:19 -0000
+Mailing-List: contact gcc-patches-help at gcc dot gnu dot org; run by ezmlm
+List-Archive: <http://gcc.gnu.org/ml/gcc-patches/>
+List-Post: <mailto:gcc-patches at gcc dot gnu dot org>
+List-Help: <mailto:gcc-patches-help at gcc dot gnu dot org>
+Sender: gcc-patches-owner at gcc dot gnu dot org
+Date: Tue, 16 Nov 2004 16:14:57 -0800
+From: "H dot  J dot  Lu" <hjl at lucon dot org>
+To: gcc-patches at gcc dot gnu dot org
+Subject: PATCH: PR other/18508: "basename: too few arguments" when building without bootstrap
+Message-ID: <20041117001457.GA13610@lucon.org>
+
+I think it is safe to use `.backup' to backup the existing shared
+library. No processes should be using the old shared library when
+we get there.
+
+
+H.J.
+---
+2004-11-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR other/18508
+	* config/alpha/t-osf4 (SHLIB_LINK): Use `.backup' as the suffix
+	to back up the existing shared library.
+	* config/arm/t-netbsd (SHLIB_LINK): Likewise.
+	* config/i386/t-nwld (SHLIB_LINK): Likewise. [deleted]
+	* config/mips/t-slibgcc-irix (SHLIB_LINK): Likewise. [deleted]
+	* config/pa/t-hpux-shlib (SHLIB_LINK): Likewise.
+	* config/sh/t-linux (SHLIB_LINK): Likewise.
+	* config/t-libunwind-elf (SHLIBUNWIND_LINK): Likewise.
+	* config/t-slibgcc-darwin (SHLIB_LINK): Likewise.
+	* config/t-slibgcc-elf-ver (SHLIB_LINK): Likewise.
+	* config/t-slibgcc-sld (SHLIB_LINK): Likewise.
+
+[ paths adjusted for patch -p1, rediffed agaainst gcc-3.4.3. 
+  Looks like the t-iris5-6 hunk in cvs is missing here; this must
+  have been the mainline patch. ]
+
+--- gcc-3.4.3/gcc/config/alpha/t-osf4.stage	2004-10-18 09:14:39.000000000 -0700
++++ gcc-3.4.3/gcc/config/alpha/t-osf4	2004-11-16 16:06:41.686905479 -0800
+@@ -19,7 +19,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \
+ 	rm -f $(SHLIB_SONAME) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+--- gcc-3.4.3/gcc/config/arm/t-netbsd.stage	2004-10-18 09:14:40.000000000 -0700
++++ gcc-3.4.3/gcc/config/arm/t-netbsd	2004-11-16 16:06:46.016348194 -0800
+@@ -14,7 +14,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \
+ 	rm -f $(SHLIB_SONAME) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+--- gcc-3.4.3/gcc/config/pa/t-hpux-shlib.stage	2004-10-18 09:14:46.000000000 -0700
++++ gcc-3.4.3/gcc/config/pa/t-hpux-shlib	2004-11-16 16:06:57.982807875 -0800
+@@ -8,7 +8,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \
+         rm -f $(SHLIB_SONAME) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+         $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+--- gcc-3.4.3/gcc/config/sh/t-linux.stage	2004-10-18 09:14:48.000000000 -0700
++++ gcc-3.4.3/gcc/config/sh/t-linux	2004-11-16 16:07:00.787446863 -0800
+@@ -24,7 +24,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
+ 	rm -f $(SHLIB_SOLINK) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	(echo "/* GNU ld script"; \
+--- gcc-3.4.3/gcc/config/t-libunwind-elf.stage	2004-10-18 09:14:39.000000000 -0700
++++ gcc-3.4.3/gcc/config/t-libunwind-elf	2004-11-16 16:07:08.133501281 -0800
+@@ -14,8 +14,7 @@ SHLIBUNWIND_LINK = $(GCC_FOR_TARGET) $(L
+ 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
+ 	rm -f $(SHLIB_SOLINK) && \
+ 	if [ -f $(SHLIBUNWIND_NAME) ]; then \
+-	  mv -f $(SHLIBUNWIND_NAME) \
+-	     $(SHLIBUNWIND_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIBUNWIND_NAME) $(SHLIBUNWIND_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIBUNWIND_NAME).tmp $(SHLIBUNWIND_NAME) && \
+ 	$(LN_S) $(SHLIBUNWIND_NAME) $(SHLIB_SOLINK)
+--- gcc-3.4.3/gcc/config/t-slibgcc-darwin.stage	2004-10-18 09:14:39.000000000 -0700
++++ gcc-3.4.3/gcc/config/t-slibgcc-darwin	2004-11-16 16:07:13.777774752 -0800
+@@ -17,7 +17,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
+ 	rm -f $(SHLIB_SOLINK) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
+--- gcc-3.4.3/gcc/config/t-slibgcc-elf-ver.stage	2004-10-18 09:14:39.000000000 -0700
++++ gcc-3.4.3/gcc/config/t-slibgcc-elf-ver	2004-11-16 16:04:40.961445223 -0800
+@@ -17,7 +17,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
+ 	-o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \
+ 	rm -f $(SHLIB_SOLINK) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
+--- gcc-3.4.3/gcc/config/t-slibgcc-sld.old	2004-10-18 09:00:47.000000000 -0700
++++ gcc-3.4.3/gcc/config/t-slibgcc-sld	2005-05-14 13:44:48.000000000 -0700
+@@ -14,7 +14,7 @@
+ 	@multilib_flags@ $(SHLIB_OBJS) -lc && \
+ 	rm -f $(SHLIB_SOLINK) && \
+ 	if [ -f $(SHLIB_NAME) ]; then \
+-	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \
++	  mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \
+ 	else true; fi && \
+ 	mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \
+ 	$(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK)
diff --git a/patches/gcc/3.4.4/100-uclibc-conf.patch b/patches/gcc/3.4.4/100-uclibc-conf.patch
new file mode 100644
index 00000000..00ea4eeb
--- /dev/null
+++ b/patches/gcc/3.4.4/100-uclibc-conf.patch
@@ -0,0 +1,470 @@
+--- gcc-3.4.1/gcc/config/t-linux-uclibc
++++ gcc-3.4.1/gcc/config/t-linux-uclibc
+@@ -0,0 +1,5 @@
++# Remove glibc specific files added in t-linux
++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES))
++
++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc
++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH))
+--- gcc-3.4.1/gcc/config.gcc
++++ gcc-3.4.1/gcc/config.gcc
+@@ -2310,10 +2310,16 @@
+ *)
+ 	echo "*** Configuration ${target} not supported" 1>&2
+ 	exit 1
+ 	;;
+ esac
++
++# Rather than hook into each target, just do it after all the linux
++# targets have been processed
++case ${target} in
++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc"
++esac
+ 
+ # Support for --with-cpu and related options (and a few unrelated options,
+ # too).
+ case ${with_cpu} in
+   yes | no)
+--- gcc-3.4.4/gcc/config/alpha/linux-elf.h
++++ gcc-3.4.4/gcc/config/alpha/linux-elf.h
+@@ -27,7 +27,11 @@
+ #define SUBTARGET_EXTRA_SPECS \
+ { "elf_dynamic_linker", ELF_DYNAMIC_LINKER },
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
+ #define ELF_DYNAMIC_LINKER	"/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}		\
+   %{O*:-O3} %{!O*:-O1}						\
+--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h	2004-01-31 00:18:11.000000000 -0600
++++ gcc-3.4.1/gcc/config/arm/linux-elf.h	2004-08-12 15:54:42.000000000 -0500
+@@ -80,14 +80,19 @@
+ #define ENDFILE_SPEC \
+   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "%{h*} %{version:-v} \
+    %{b} %{Wl,*:%*} \
+    %{static:-Bstatic} \
+    %{shared:-shared} \
+    %{symbolic:-Bsymbolic} \
+    %{rdynamic:-export-dynamic} \
+-   %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
++   %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \
+    -X \
+    %{mbig-endian:-EB}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+--- gcc-3.4.1-dist/gcc/config/cris/linux.h	2003-11-28 21:08:09.000000000 -0600
++++ gcc-3.4.1/gcc/config/cris/linux.h	2004-08-12 15:54:43.000000000 -0500
+@@ -79,6 +79,25 @@
+ #undef CRIS_DEFAULT_CPU_VERSION
+ #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG
+ 
++#ifdef USE_UCLIBC
++
++#undef CRIS_SUBTARGET_VERSION
++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc"
++
++#undef CRIS_LINK_SUBTARGET_SPEC
++#define CRIS_LINK_SUBTARGET_SPEC \
++ "-mcrislinux\
++  -rpath-link include/asm/../..%s\
++  %{shared} %{static}\
++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\
++  %{!shared: \
++    %{!static: \
++      %{rdynamic:-export-dynamic} \
++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \
++  %{!r:%{O2|O3: --gc-sections}}"
++
++#else  /* USE_UCLIBC */
++
+ #undef CRIS_SUBTARGET_VERSION
+ #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu"
+ 
+@@ -93,6 +112,8 @@
+   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\
+   %{!r:%{O2|O3: --gc-sections}}"
+ 
++#endif  /* USE_UCLIBC */
++
+ 
+ /* Node: Run-time Target */
+ 
+--- gcc-3.4.1-dist/gcc/config/i386/linux.h	2003-11-28 21:08:10.000000000 -0600
++++ gcc-3.4.1/gcc/config/i386/linux.h	2004-08-12 15:54:43.000000000 -0500
+@@ -110,22 +110,21 @@
+ 
+ #undef	LINK_SPEC
+ #ifdef USE_GNULIBC_1
+-#define LINK_SPEC "-m elf_i386 %{shared:-shared} \
+-  %{!shared: \
+-    %{!ibcs: \
+-      %{!static: \
+-	%{rdynamic:-export-dynamic} \
+-	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \
+-	%{static:-static}}}"
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.1"
++#else
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
+ #else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
++#endif
+ #define LINK_SPEC "-m elf_i386 %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+-	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++	%{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+ 	%{static:-static}}}"
+-#endif
+ 
+ /* A C statement (sans semicolon) to output to the stdio stream
+    FILE the assembler definition of uninitialized global DECL named
+--- gcc-3.4.4/gcc/config/i386/linux64.h
++++ gcc-3.4.4/gcc/config/i386/linux64.h
+@@ -54,14 +54,21 @@
+    When the -shared link option is used a final link is not being
+    done.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+-      %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
++      %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \
++      %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \
+     %{static:-static}}"
+ 
+ #define MULTILIB_DEFAULTS { "m64" }
+--- gcc-3.4.4/gcc/config/ia64/linux.h
++++ gcc-3.4.4/gcc/config/ia64/linux.h
+@@ -37,13 +37,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ 
+--- gcc-3.4.4/gcc/config/m68k/linux.h
++++ gcc-3.4.4/gcc/config/m68k/linux.h
+@@ -131,12 +131,17 @@
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "-m m68kelf %{shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+     %{static}}"
+ 
+ /* For compatibility with linux/a.out */
+--- gcc-3.4.1-dist/gcc/config/mips/linux.h	2004-06-15 20:42:24.000000000 -0500
++++ gcc-3.4.1/gcc/config/mips/linux.h	2004-08-12 15:54:43.000000000 -0500
+@@ -109,14 +109,19 @@
+ 
+ /* Borrowed from sparc/linux.h */
+ #undef LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #define LINK_SPEC \
+  "%(endian_spec) \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ #undef SUBTARGET_ASM_SPEC
+--- gcc-3.4.4/gcc/config/pa/pa-linux.h
++++ gcc-3.4.4/gcc/config/pa/pa-linux.h
+@@ -77,13 +77,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ /* glibc's profiling functions don't need gcc to allocate counters.  */
+--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h	2004-02-25 09:11:19.000000000 -0600
++++ gcc-3.4.1/gcc/config/rs6000/linux.h	2004-08-12 15:54:43.000000000 -0500
+@@ -69,7 +69,11 @@
+ #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
+ 
+ #undef	LINK_OS_DEFAULT_SPEC
++#ifdef USE_UCLIBC
++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)"
++#else
+ #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
++#endif
+ 
+ #define LINK_GCC_C_SEQUENCE_SPEC \
+   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h	2004-06-10 01:39:50.000000000 -0500
++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h	2004-08-12 15:54:43.000000000 -0500
+@@ -947,6 +947,7 @@
+   mcall-linux  : %(link_os_linux)       ; \
+   mcall-gnu    : %(link_os_gnu)         ; \
+   mcall-netbsd : %(link_os_netbsd)      ; \
++  mcall-linux-uclibc : %(link_os_linux_uclibc); \
+   mcall-openbsd: %(link_os_openbsd)     ; \
+                : %(link_os_default)     }"
+ 
+@@ -1125,6 +1126,10 @@
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ 
++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++  %{rdynamic:-export-dynamic} \
++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}"
++
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+ # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+ #endif
+@@ -1291,6 +1296,7 @@
+   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
+   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
+   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\
+   { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
+   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
+   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
+--- gcc-3.4.4/gcc/config/s390/linux.h
++++ gcc-3.4.4/gcc/config/s390/linux.h
+@@ -77,6 +77,13 @@
+ #define MULTILIB_DEFAULTS { "m31" }
+ #endif
+ 
++#ifdef USE_UCLIBC
++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC \
+   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
+@@ -86,8 +93,8 @@
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+ 	%{!dynamic-linker: \
+-          %{m31:-dynamic-linker /lib/ld.so.1} \
+-          %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
++          %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \
++          %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}"
+ 
+ 
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc-3.4.1-dist/gcc/config/sh/linux.h	2004-01-11 20:29:13.000000000 -0600
++++ gcc-3.4.1/gcc/config/sh/linux.h	2004-08-12 15:54:43.000000000 -0500
+@@ -73,11 +73,16 @@
+ #undef SUBTARGET_LINK_EMUL_SUFFIX
+ #define SUBTARGET_LINK_EMUL_SUFFIX "_linux"
+ #undef SUBTARGET_LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #define SUBTARGET_LINK_SPEC \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+-     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++     %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+    %{static:-static}"
+ 
+ #undef LIB_SPEC
+--- gcc-3.4.4/gcc/config/sparc/linux.h
++++ gcc-3.4.4/gcc/config/sparc/linux.h
+@@ -162,13 +162,18 @@
+         %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \
+         %{static:-static}}}"
+ #else
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!mno-relax:%{!r:-relax}} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ #endif
+ 
+--- gcc-3.4.4/gcc/config/sparc/linux64.h
++++ gcc-3.4.4/gcc/config/sparc/linux64.h
+@@ -167,12 +166,17 @@
+   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },	  \
+   { "link_arch",	 LINK_ARCH_SPEC },
+     
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER  "/lib/ld-linux.so.2"
++#endif
+ #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}} \
+ "
+ 
+--- gcc-3.4.1-dist/libtool.m4	2004-05-18 04:08:37.000000000 -0500
++++ gcc-3.4.1/libtool.m4	2004-08-12 15:54:43.000000000 -0500
+@@ -689,6 +689,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+--- gcc-3.4.1-dist/ltconfig	2004-03-05 15:05:41.000000000 -0600
++++ gcc-3.4.1/ltconfig	2004-08-12 15:55:48.000000000 -0500
+@@ -602,6 +602,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1262,6 +1263,24 @@
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  # Note: copied from linux-gnu, and may not be appropriate.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gcc-3.4.1-dist/boehm-gc/configure	2004-07-01 14:14:03.000000000 -0500
++++ gcc-3.4.1/boehm-gc/configure	2004-08-12 16:22:57.000000000 -0500
+@@ -1947,6 +1947,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-3.4.1-dist/boehm-gc/ltconfig	2002-11-20 09:59:06.000000000 -0600
++++ gcc-3.4.1/boehm-gc/ltconfig	2004-08-12 15:54:42.000000000 -0500
+@@ -1981,6 +1981,23 @@
+   fi
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
++  file_magic_cmd=/usr/bin/file
++  file_magic_test_file=`echo /lib/libuClibc-*.so`
++
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   version_type=sunos
+   if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
diff --git a/patches/gcc/3.4.4/200-uclibc-locale.patch b/patches/gcc/3.4.4/200-uclibc-locale.patch
new file mode 100644
index 00000000..a97f22b4
--- /dev/null
+++ b/patches/gcc/3.4.4/200-uclibc-locale.patch
@@ -0,0 +1,3255 @@
+diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4
+--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4	2004-07-15 12:42:45.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/acinclude.m4	2004-09-10 10:47:40.000000000 -0500
+@@ -996,7 +996,7 @@
+   AC_MSG_CHECKING([for C locale to use])
+   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+     [use MODEL for target locale package],
+-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
+   
+   # If they didn't use this option switch, or if they specified --enable
+   # with no specific model, we'll have to look for one.  If they
+@@ -1012,6 +1012,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case x${target_os} in
++      x*-uclibc*)
++        enable_clocale_flag=uclibc
++        ;;
+       xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1138,6 +1141,41 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4
+--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4	2004-08-13 15:44:03.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/aclocal.m4	2004-09-10 10:47:40.000000000 -0500
+@@ -1025,6 +1025,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case x${target_os} in
++      x*-uclibc*)
++	enable_clocale_flag=uclibc
++	;;
+       xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1151,6 +1154,41 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,59 @@
++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
++
++// Copyright (C) 2002, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++// Written by Jakub Jelinek <jakub@redhat.com>
++
++#include <clocale>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning clean this up
++#endif
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++                                                  
++extern "C" __typeof(iswctype_l) __iswctype_l;
++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
++extern "C" __typeof(strcoll_l) __strcoll_l;
++extern "C" __typeof(strftime_l) __strftime_l;
++extern "C" __typeof(strtod_l) __strtod_l;
++extern "C" __typeof(strtof_l) __strtof_l;
++extern "C" __typeof(strtold_l) __strtold_l;
++extern "C" __typeof(strxfrm_l) __strxfrm_l;
++extern "C" __typeof(towlower_l) __towlower_l;
++extern "C" __typeof(towupper_l) __towupper_l;
++extern "C" __typeof(wcscoll_l) __wcscoll_l;
++extern "C" __typeof(wcsftime_l) __wcsftime_l;
++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
++extern "C" __typeof(wctype_l) __wctype_l;
++extern "C" __typeof(newlocale) __newlocale;
++extern "C" __typeof(freelocale) __freelocale;
++extern "C" __typeof(duplocale) __duplocale;
++extern "C" __typeof(uselocale) __uselocale;
++
++#endif // GLIBC 2.3 and later
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,160 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno>  // For errno
++#include <locale>
++#include <stdexcept>
++#include <langinfo.h>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
++#define __strtof_l(S, E, L)         strtof((S), (E))
++#define __strtod_l(S, E, L)         strtod((S), (E))
++#define __strtold_l(S, E, L)        strtold((S), (E))
++#warning should dummy __newlocale check for C|POSIX ?
++#define __newlocale(a, b, c)        NULL
++#define __freelocale(a)             ((void)0)
++#define __duplocale(a)              __c_locale()
++#endif
++
++namespace std 
++{
++  template<>
++    void
++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  float __f = __strtof_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __f;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  double __d = __strtod_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __d;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __ld;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  void
++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
++				    __c_locale __old)
++  {
++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    if (!__cloc)
++      {
++	// This named locale is not supported by the underlying OS.
++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++			      "name not valid"));
++      }
++#endif
++  }
++  
++  void
++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++  {
++    if (_S_get_c_locale() != __cloc)
++      __freelocale(__cloc); 
++  }
++
++  __c_locale
++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
++  { return __duplocale(__cloc); }
++} // namespace std
++
++namespace __gnu_cxx
++{
++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++    {
++      "LC_CTYPE", 
++      "LC_NUMERIC",
++      "LC_TIME", 
++      "LC_COLLATE", 
++      "LC_MONETARY",
++      "LC_MESSAGES", 
++#if _GLIBCXX_NUM_CATEGORIES != 0
++      "LC_PAPER", 
++      "LC_NAME", 
++      "LC_ADDRESS",
++      "LC_TELEPHONE", 
++      "LC_MEASUREMENT", 
++      "LC_IDENTIFICATION" 
++#endif
++    };
++}
++
++namespace std
++{
++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++}  // namespace std
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h	2004-09-10 10:48:08.000000000 -0500
+@@ -0,0 +1,115 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifndef _C_LOCALE_H
++#define _C_LOCALE_H 1
++
++#pragma GCC system_header
++
++#include <cstring>              // get std::strlen
++#include <cstdio>               // get std::snprintf or std::sprintf
++#include <clocale>
++#include <langinfo.h>		// For codecvt
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC_HAS_LOCALE__
++#include <iconv.h>		// For codecvt using iconv, iconv_t
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++#include <libintl.h> 		// For messages
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning what is _GLIBCXX_C_LOCALE_GNU for
++#endif
++#define _GLIBCXX_C_LOCALE_GNU 1
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix categories
++#endif
++// #define _GLIBCXX_NUM_CATEGORIES 6
++#define _GLIBCXX_NUM_CATEGORIES 0
++ 
++#ifdef __UCLIBC_HAS_XLOCALE__
++namespace __gnu_cxx
++{
++  extern "C" __typeof(uselocale) __uselocale;
++}
++#endif
++
++namespace std
++{
++#ifdef __UCLIBC_HAS_XLOCALE__
++  typedef __locale_t		__c_locale;
++#else
++  typedef int*			__c_locale;
++#endif
++
++  // Convert numeric value of type _Tv to string and return length of
++  // string.  If snprintf is available use it, otherwise fall back to
++  // the unsafe sprintf which, in general, can be dangerous and should
++  // be avoided.
++  template<typename _Tv>
++    int
++    __convert_from_v(char* __out, const int __size, const char* __fmt,
++#ifdef __UCLIBC_HAS_XLOCALE__
++		     _Tv __v, const __c_locale& __cloc, int __prec)
++    {
++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
++#else
++		     _Tv __v, const __c_locale&, int __prec)
++    {
++# ifdef __UCLIBC_HAS_LOCALE__
++      char* __old = std::setlocale(LC_ALL, NULL);
++      char* __sav = new char[std::strlen(__old) + 1];
++      std::strcpy(__sav, __old);
++      std::setlocale(LC_ALL, "C");
++# endif
++#endif
++
++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __gnu_cxx::__uselocale(__old);
++#elif defined __UCLIBC_HAS_LOCALE__
++      std::setlocale(LC_ALL, __sav);
++      delete [] __sav;
++#endif
++      return __ret;
++    }
++}
++
++#endif
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,306 @@
++// std::codecvt implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++namespace std
++{
++  // Specializations.
++#ifdef _GLIBCXX_USE_WCHAR_T
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_out(state_type& __state, const intern_type* __from, 
++	 const intern_type* __from_end, const intern_type*& __from_next,
++	 extern_type* __to, extern_type* __to_end,
++	 extern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
++    // in case we fall back to wcrtomb and then continue, in a loop.
++    // NB: wcsnrtombs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
++						      __from_end - __from_next);
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
++					 __from_chunk_end - __from_next,
++					 __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // wcrtomb.
++	    for (; __from < __from_next; ++__from)
++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
++	    __state = __tmp_state;
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    extern_type __buf[MB_LEN_MAX];
++	    __tmp_state = __state;
++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
++	      __ret = partial;
++	    else
++	      {
++		memcpy(__to_next, __buf, __conv);
++		__state = __tmp_state;
++		__to_next += __conv;
++		++__from_next;
++	      }
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++  
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_in(state_type& __state, const extern_type* __from, 
++	const extern_type* __from_end, const extern_type*& __from_next,
++	intern_type* __to, intern_type* __to_end,
++	intern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we store a L'\0' and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
++								  __from_end
++								  - __from_next));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
++				   __from_chunk_end - __from_next,
++				   __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (;; ++__to_next, __from += __conv)
++	      {
++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __from_next = __from;
++	    __state = __tmp_state;	    
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    // It is unclear what to return in this case (see DR 382). 
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    if (__to_next < __to_end)
++	      {
++		// XXX Probably wrong for stateful encodings
++		__tmp_state = __state;		
++		++__from_next;
++		*__to_next++ = L'\0';
++	      }
++	    else
++	      __ret = partial;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_encoding() const throw()
++  {
++    // XXX This implementation assumes that the encoding is
++    // stateless and is either single-byte or variable-width.
++    int __ret = 0;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    if (MB_CUR_MAX == 1)
++      __ret = 1;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }  
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_max_length() const throw()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    // XXX Probably wrong for stateful encodings.
++    int __ret = MB_CUR_MAX;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }
++  
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_length(state_type& __state, const extern_type* __from,
++	    const extern_type* __end, size_t __max) const
++  {
++    int __ret = 0;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we advance past it and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++  
++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
++    // its fourth parameter (it wouldn't with NULL as first parameter).
++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
++							   * __max));
++    while (__from < __end && __max)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
++								  __end
++								  - __from));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __end;
++
++	const extern_type* __tmp_from = __from;
++	size_t __conv = mbsnrtowcs(__to, &__from,
++				   __from_chunk_end - __from,
++				   __max, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (__from = __tmp_from;; __from += __conv)
++	      {
++		__conv = mbrtowc(NULL, __from, __end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __state = __tmp_state;
++	    __ret += __from - __tmp_from;
++	    break;
++	  }
++	if (!__from)
++	  __from = __from_chunk_end;
++	
++	__ret += __from - __tmp_from;
++	__max -= __conv;
++
++	if (__from < __end && __max)
++	  {
++	    // XXX Probably wrong for stateful encodings
++	    __tmp_state = __state;
++	    ++__from;
++	    ++__ret;
++	    --__max;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++#endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,80 @@
++// std::collate implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
++#endif
++
++namespace std
++{
++  // These are basically extensions to char_traits, and perhaps should
++  // be put there instead of here.
++  template<>
++    int 
++    collate<char>::_M_compare(const char* __one, const char* __two) const
++    { 
++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<char>::_M_transform(char* __to, const char* __from, 
++				size_t __n) const 
++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    int 
++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
++				 const wchar_t* __two) const
++    {
++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
++				   size_t __n) const
++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++#endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,300 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __wctype_l(S, L)           wctype((S))
++#define __towupper_l(C, L)         towupper((C))
++#define __towlower_l(C, L)         towlower((C))
++#define __iswctype_l(C, M, L)      iswctype((C), (M))
++#endif
++
++namespace std
++{
++  // NB: The other ctype<char> specializations are in src/locale.cc and
++  // various /config/os/* files.
++  template<>
++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++    : ctype<char>(0, false, __refs) 
++    { 		
++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	{
++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
++#endif
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T  
++  ctype<wchar_t>::__wmask_type
++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
++  {
++    __wmask_type __ret;
++    switch (__m)
++      {
++      case space:
++	__ret = __wctype_l("space", _M_c_locale_ctype);
++	break;
++      case print:
++	__ret = __wctype_l("print", _M_c_locale_ctype);
++	break;
++      case cntrl:
++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
++	break;
++      case upper:
++	__ret = __wctype_l("upper", _M_c_locale_ctype);
++	break;
++      case lower:
++	__ret = __wctype_l("lower", _M_c_locale_ctype);
++	break;
++      case alpha:
++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
++	break;
++      case digit:
++	__ret = __wctype_l("digit", _M_c_locale_ctype);
++	break;
++      case punct:
++	__ret = __wctype_l("punct", _M_c_locale_ctype);
++	break;
++      case xdigit:
++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
++	break;
++      case alnum:
++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
++	break;
++      case graph:
++	__ret = __wctype_l("graph", _M_c_locale_ctype);
++	break;
++      default:
++	__ret = 0;
++      }
++    return __ret;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_toupper(wchar_t __c) const
++  { return __towupper_l(__c, _M_c_locale_ctype); }
++
++  const wchar_t*
++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_tolower(wchar_t __c) const
++  { return __towlower_l(__c, _M_c_locale_ctype); }
++  
++  const wchar_t*
++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++
++  bool
++  ctype<wchar_t>::
++  do_is(mask __m, wchar_t __c) const
++  { 
++    // Highest bitmask in ctype_base == 10, but extra in "C"
++    // library for blank.
++    bool __ret = false;
++    const size_t __bitmasksize = 11; 
++    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++      if (__m & _M_bit[__bitcur]
++	  && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
++	{
++	  __ret = true;
++	  break;
++	}
++    return __ret;    
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++  {
++    for (; __lo < __hi; ++__vec, ++__lo)
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11; 
++	mask __m = 0;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
++	    __m |= _M_bit[__bitcur];
++	*__vec = __m;
++      }
++    return __hi;
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi && !this->do_is(__m, *__lo))
++      ++__lo;
++    return __lo;
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++  {
++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
++      ++__lo;
++    return __lo;
++  }
++
++  wchar_t
++  ctype<wchar_t>::
++  do_widen(char __c) const
++  { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<wchar_t>::
++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++  {
++    while (__lo < __hi)
++      {
++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++	++__lo;
++	++__dest;
++      }
++    return __hi;
++  }
++
++  char
++  ctype<wchar_t>::
++  do_narrow(wchar_t __wc, char __dfault) const
++  {
++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++      return _M_narrow[__wc];
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    const int __c = wctob(__wc);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
++	    char* __dest) const
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    if (_M_narrow_ok)
++      while (__lo < __hi)
++	{
++	  if (*__lo >= 0 && *__lo < 128)
++	    *__dest = _M_narrow[*__lo];
++	  else
++	    {
++	      const int __c = wctob(*__lo);
++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	    }
++	  ++__lo;
++	  ++__dest;
++	}
++    else
++      while (__lo < __hi)
++	{
++	  const int __c = wctob(*__lo);
++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	  ++__lo;
++	  ++__dest;
++	}
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __hi;
++  }
++
++  void
++  ctype<wchar_t>::_M_initialize_ctype()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    wint_t __i;
++    for (__i = 0; __i < 128; ++__i)
++      {
++	const int __c = wctob(__i);
++	if (__c == EOF)
++	  break;
++	else
++	  _M_narrow[__i] = static_cast<char>(__c);
++      }
++    if (__i == 128)
++      _M_narrow_ok = true;
++    else
++      _M_narrow_ok = false;
++    for (size_t __j = 0;
++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
++      _M_widen[__j] = btowc(__j);
++
++    for (size_t __k = 0; __k <= 11; ++__k)
++      { 
++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
++      }
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++  }
++#endif //  _GLIBCXX_USE_WCHAR_T
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,100 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix gettext stuff
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__dcgettext(const char *domainname,
++			     const char *msgid, int category);
++#undef gettext
++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
++#else
++#undef gettext
++#define gettext(msgid) (msgid)
++#endif
++
++namespace std
++{
++  // Specializations.
++  template<>
++    string
++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
++      __uselocale(__old);
++      return string(__msg);
++#elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      const char* __msg = gettext(__dfault.c_str());
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return string(__msg);
++#else
++      const char* __msg = gettext(__dfault.c_str());
++      return string(__msg);
++#endif
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    wstring
++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
++    {
++# ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      __uselocale(__old);
++      return _M_convert_from_char(__msg);
++# elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return _M_convert_from_char(__msg);
++# else
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      return _M_convert_from_char(__msg);
++# endif
++    }
++#endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,118 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix prototypes for *textdomain funcs
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__textdomain(const char *domainname);
++extern "C" char *__bindtextdomain(const char *domainname,
++				  const char *dirname);
++#else
++#undef __textdomain
++#undef __bindtextdomain
++#define __textdomain(D)           ((void)0)
++#define __bindtextdomain(D,P)     ((void)0)
++#endif
++
++  // Non-virtual member functions.
++  template<typename _CharT>
++     messages<_CharT>::messages(size_t __refs)
++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
++     _M_name_messages(_S_get_c_name())
++     { }
++
++  template<typename _CharT>
++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
++				size_t __refs) 
++     : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
++     _M_name_messages(__s)
++     {
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       _M_name_messages = __tmp;
++     }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
++			   const char* __dir) const
++    { 
++      __bindtextdomain(__s.c_str(), __dir);
++      return this->do_open(__s, __loc); 
++    }
++
++  // Virtual member functions.
++  template<typename _CharT>
++    messages<_CharT>::~messages()
++    { 
++      if (_M_name_messages != _S_get_c_name())
++	delete [] _M_name_messages;
++      _S_destroy_c_locale(_M_c_locale_messages); 
++    }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::do_open(const basic_string<char>& __s, 
++			      const locale&) const
++    { 
++      // No error checking is done, assume the catalog exists and can
++      // be used.
++      __textdomain(__s.c_str());
++      return 0;
++    }
++
++  template<typename _CharT>
++    void    
++    messages<_CharT>::do_close(catalog) const 
++    { }
++
++   // messages_byname
++   template<typename _CharT>
++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
++     : messages<_CharT>(__refs) 
++     { 
++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
++	 delete [] this->_M_name_messages;
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       this->_M_name_messages = __tmp;
++
++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	 {
++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
++	 }
++     }
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,698 @@
++// std::moneypunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning optimize this for uclibc
++#warning tailor for stub locale support
++#endif
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  // Construct and return valid pattern consisting of some combination of:
++  // space none symbol sign value
++  money_base::pattern
++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
++  { 
++    pattern __ret;
++
++    // This insanely complicated routine attempts to construct a valid
++    // pattern for use with monyepunct. A couple of invariants:
++
++    // if (__precedes) symbol -> value
++    // else value -> symbol
++    
++    // if (__space) space
++    // else none
++
++    // none == never first
++    // space never first or last
++
++    // Any elegant implementations of this are welcome.
++    switch (__posn)
++      {
++      case 0:
++      case 1:
++	// 1 The sign precedes the value and symbol.
++	__ret.field[0] = sign;
++	if (__space)
++	  {
++	    // Pattern starts with sign.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[3] = symbol;
++	      }
++	    __ret.field[2] = space;
++	  }
++	else
++	  {
++	    // Pattern starts with sign and ends with none.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 2:
++	// 2 The sign follows the value and symbol.
++	if (__space)
++	  {
++	    // Pattern either ends with sign.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[1] = space;
++	    __ret.field[3] = sign;
++	  }
++	else
++	  {
++	    // Pattern ends with sign then none.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[1] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[1] = symbol;
++	      }
++	    __ret.field[2] = sign;
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 3:
++	// 3 The sign immediately precedes the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = sign;
++	    __ret.field[1] = symbol;	    
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;		
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = sign;
++		__ret.field[3] = symbol;
++	      }
++	    else
++	      {
++		__ret.field[1] = sign;
++		__ret.field[2] = symbol;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      case 4:
++	// 4 The sign immediately follows the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = symbol;
++	    __ret.field[1] = sign;
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = symbol;
++		__ret.field[3] = sign;
++	      }
++	    else
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = sign;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      default:
++	;
++      }
++    return __ret;
++  }
++
++  template<> 
++    void
++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++						     const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == true
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    void
++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
++						      const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, false>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == false
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    moneypunct<char, true>::~moneypunct()
++    { delete _M_data; }
++
++  template<> 
++    moneypunct<char, false>::~moneypunct()
++    { delete _M_data; }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++#ifdef __UCLIBC_HAS_XLOCALE__
++							const char*)
++#else
++							const char* __name)
++#endif
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<wchar_t, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  unsigned char uc;
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    {
++	      uc = static_cast<unsigned char>(money_base::_S_atoms[__i]);
++	      _M_data->_M_atoms[__i] = btowc(uc);
++	    }
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union __s_and_w { const char *__s; unsigned int __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w);
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w);
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  try
++	    {
++	      mbstate_t __state;
++	      size_t __len = strlen(__cpossign);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++	      
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++	  catch (...)
++	    {
++	      delete _M_data;
++	      _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++	      __throw_exception_again;
++	    } 
++	  
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++  void
++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
++#ifdef __UCLIBC_HAS_XLOCALE__
++						       const char*)
++#else
++                                                       const char* __name)
++#endif
++  {
++    if (!_M_data)
++      _M_data = new __moneypunct_cache<wchar_t, false>;
++
++    if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++          _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  unsigned char uc;
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    {
++	      uc = static_cast<unsigned char>(money_base::_S_atoms[__i]);
++	      _M_data->_M_atoms[__i] = btowc(uc);
++	    }
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union __s_and_w { const char *__s; unsigned int __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w);
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w);
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  try
++            {
++              mbstate_t __state;
++              size_t __len;
++              __len = strlen(__cpossign);
++              if (__len)
++                {
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++          catch (...)
++	    {
++	      delete _M_data;
++              _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++              __throw_exception_again;
++	    }
++
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++	                                                __pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++	                                                __nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++    moneypunct<wchar_t, true>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++
++  template<> 
++    moneypunct<wchar_t, false>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++#endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,183 @@
++// std::numpunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<> 
++    void
++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
++							__cloc));
++
++	  // Check for NULL, which implies no grouping.
++	  if (_M_data->_M_thousands_sep == '\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = "true";
++      _M_data->_M_truename_size = strlen(_M_data->_M_truename);
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = "false";
++      _M_data->_M_falsename_size = strlen(_M_data->_M_falsename);
++    }
++ 
++  template<> 
++    numpunct<char>::~numpunct()
++    { delete _M_data; }
++   
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<wchar_t>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(_S_get_c_locale());
++#endif
++	  // Use ctype::widen code without the facet...
++	  unsigned char uc;
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    {
++	      uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]);
++	      _M_data->_M_atoms_out[__i] = btowc(uc);
++	    }
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    {
++	      uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]);
++	      _M_data->_M_atoms_in[__j] = btowc(uc);
++	    }
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#endif
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union __s_and_w { const char *__s; unsigned int __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w);
++
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w);
++#endif
++
++	  if (_M_data->_M_thousands_sep == L'\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = L"true";
++      _M_data->_M_truename_size = wcslen(_M_data->_M_truename);
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = L"false";
++      _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename);
++    }
++
++  template<> 
++    numpunct<wchar_t>::~numpunct()
++    { delete _M_data; }
++ #endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc	2004-09-10 10:48:00.000000000 -0500
+@@ -0,0 +1,356 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<>
++    void
++    __timepunct<char>::
++    _M_put(char* __s, size_t __maxlen, const char* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = '\0';
++    }
++
++  template<> 
++    void
++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = "%m/%d/%y";
++	  _M_data->_M_date_era_format = "%m/%d/%y";
++	  _M_data->_M_time_format = "%H:%M:%S";
++	  _M_data->_M_time_era_format = "%H:%M:%S";
++	  _M_data->_M_date_time_format = "";
++	  _M_data->_M_date_time_era_format = "";
++	  _M_data->_M_am = "AM";
++	  _M_data->_M_pm = "PM";
++	  _M_data->_M_am_pm_format = "";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = "Sunday";
++	  _M_data->_M_day2 = "Monday";
++	  _M_data->_M_day3 = "Tuesday";
++	  _M_data->_M_day4 = "Wednesday";
++	  _M_data->_M_day5 = "Thursday";
++	  _M_data->_M_day6 = "Friday";
++	  _M_data->_M_day7 = "Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = "Sun";
++	  _M_data->_M_aday2 = "Mon";
++	  _M_data->_M_aday3 = "Tue";
++	  _M_data->_M_aday4 = "Wed";
++	  _M_data->_M_aday5 = "Thu";
++	  _M_data->_M_aday6 = "Fri";
++	  _M_data->_M_aday7 = "Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = "January";
++	  _M_data->_M_month02 = "February";
++	  _M_data->_M_month03 = "March";
++	  _M_data->_M_month04 = "April";
++	  _M_data->_M_month05 = "May";
++	  _M_data->_M_month06 = "June";
++	  _M_data->_M_month07 = "July";
++	  _M_data->_M_month08 = "August";
++	  _M_data->_M_month09 = "September";
++	  _M_data->_M_month10 = "October";
++	  _M_data->_M_month11 = "November";
++	  _M_data->_M_month12 = "December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = "Jan";
++	  _M_data->_M_amonth02 = "Feb";
++	  _M_data->_M_amonth03 = "Mar";
++	  _M_data->_M_amonth04 = "Apr";
++	  _M_data->_M_amonth05 = "May";
++	  _M_data->_M_amonth06 = "Jun";
++	  _M_data->_M_amonth07 = "Jul";
++	  _M_data->_M_amonth08 = "Aug";
++	  _M_data->_M_amonth09 = "Sep";
++	  _M_data->_M_amonth10 = "Oct";
++	  _M_data->_M_amonth11 = "Nov";
++	  _M_data->_M_amonth12 = "Dec";
++	}
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc);
++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    void
++    __timepunct<wchar_t>::
++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = L'\0';
++    }
++
++  template<> 
++    void
++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<wchar_t>;
++
++#warning wide time stuff
++//       if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = L"%m/%d/%y";
++	  _M_data->_M_date_era_format = L"%m/%d/%y";
++	  _M_data->_M_time_format = L"%H:%M:%S";
++	  _M_data->_M_time_era_format = L"%H:%M:%S";
++	  _M_data->_M_date_time_format = L"";
++	  _M_data->_M_date_time_era_format = L"";
++	  _M_data->_M_am = L"AM";
++	  _M_data->_M_pm = L"PM";
++	  _M_data->_M_am_pm_format = L"";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = L"Sunday";
++	  _M_data->_M_day2 = L"Monday";
++	  _M_data->_M_day3 = L"Tuesday";
++	  _M_data->_M_day4 = L"Wednesday";
++	  _M_data->_M_day5 = L"Thursday";
++	  _M_data->_M_day6 = L"Friday";
++	  _M_data->_M_day7 = L"Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = L"Sun";
++	  _M_data->_M_aday2 = L"Mon";
++	  _M_data->_M_aday3 = L"Tue";
++	  _M_data->_M_aday4 = L"Wed";
++	  _M_data->_M_aday5 = L"Thu";
++	  _M_data->_M_aday6 = L"Fri";
++	  _M_data->_M_aday7 = L"Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = L"January";
++	  _M_data->_M_month02 = L"February";
++	  _M_data->_M_month03 = L"March";
++	  _M_data->_M_month04 = L"April";
++	  _M_data->_M_month05 = L"May";
++	  _M_data->_M_month06 = L"June";
++	  _M_data->_M_month07 = L"July";
++	  _M_data->_M_month08 = L"August";
++	  _M_data->_M_month09 = L"September";
++	  _M_data->_M_month10 = L"October";
++	  _M_data->_M_month11 = L"November";
++	  _M_data->_M_month12 = L"December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = L"Jan";
++	  _M_data->_M_amonth02 = L"Feb";
++	  _M_data->_M_amonth03 = L"Mar";
++	  _M_data->_M_amonth04 = L"Apr";
++	  _M_data->_M_amonth05 = L"May";
++	  _M_data->_M_amonth06 = L"Jun";
++	  _M_data->_M_amonth07 = L"Jul";
++	  _M_data->_M_amonth08 = L"Aug";
++	  _M_data->_M_amonth09 = L"Sep";
++	  _M_data->_M_amonth10 = L"Oct";
++	  _M_data->_M_amonth11 = L"Nov";
++	  _M_data->_M_amonth12 = L"Dec";
++	}
++#if 0
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc));
++	  _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc));
++	  _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc));
++	  _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc));
++	  _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc));
++	  _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc));
++	  _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc));
++	  _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc));
++	  _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc));
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc));
++	  _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc));
++	  _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc));
++	  _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc));
++	  _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc));
++	  _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc));
++	  _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc));
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc));
++	  _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc));
++	  _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc));
++	  _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc));
++	  _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc));
++	  _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc));
++	  _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc));
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc));
++	  _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc));
++	  _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc));
++	  _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc));
++	  _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc));
++	  _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc));
++	  _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc));
++	  _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc));
++	  _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc));
++	  _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc));
++	  _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc));
++	  _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc));
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc));
++	  _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc));
++	  _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc));
++	  _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc));
++	  _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc));
++	  _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc));
++	  _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc));
++	  _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc));
++	  _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc));
++	  _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc));
++	  _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc));
++	  _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc));
++	}
++#endif // 0
++    }
++#endif
++}
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,68 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
++				     size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(__s)
++    { 
++      char* __tmp = new char[std::strlen(__s) + 1];
++      std::strcpy(__tmp, __s);
++      _M_name_timepunct = __tmp;
++      _M_initialize_timepunct(__cloc); 
++    }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::~__timepunct()
++    { 
++      if (_M_name_timepunct != _S_get_c_name())
++	delete [] _M_name_timepunct;
++      delete _M_data; 
++      _S_destroy_c_locale(_M_c_locale_timepunct); 
++    }
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,58 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++  
++  struct ctype_base
++  {
++    // Note: In uClibc, the following two types depend on configuration.
++ 
++    // Non-standard typedefs.
++    typedef const __ctype_touplow_t* __to_type;
++
++    // NB: Offsets into ctype<char>::_M_table force a particular size
++    // on the mask type. Because of this, we don't use an enum.
++    typedef __ctype_mask_t	mask;   
++    static const mask upper    	= _ISupper;
++    static const mask lower 	= _ISlower;
++    static const mask alpha 	= _ISalpha;
++    static const mask digit 	= _ISdigit;
++    static const mask xdigit 	= _ISxdigit;
++    static const mask space 	= _ISspace;
++    static const mask print 	= _ISprint;
++    static const mask graph 	= _ISalpha | _ISdigit | _ISpunct;
++    static const mask cntrl 	= _IScntrl;
++    static const mask punct 	= _ISpunct;
++    static const mask alnum 	= _ISalpha | _ISdigit;
++  };
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,69 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
++// functions go in ctype.cc
++  
++  bool
++  ctype<char>::
++  is(mask __m, char __c) const
++  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
++
++  const char*
++  ctype<char>::
++  is(const char* __low, const char* __high, mask* __vec) const
++  {
++    while (__low < __high)
++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
++    return __high;
++  }
++
++  const char*
++  ctype<char>::
++  scan_is(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
++      ++__low;
++    return __low;
++  }
++
++  const char*
++  ctype<char>::
++  scan_not(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
++      ++__low;
++    return __low;
++  }
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,92 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++
++  const ctype_base::mask*
++  ctype<char>::classic_table() throw()
++  { return __C_ctype_b; }
++
++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
++		     size_t __refs) 
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  char
++  ctype<char>::do_toupper(char __c) const
++  { return _M_toupper[static_cast<unsigned char>(__c)]; }
++
++  const char*
++  ctype<char>::do_toupper(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_toupper[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
++
++  char
++  ctype<char>::do_tolower(char __c) const
++  { return _M_tolower[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<char>::do_tolower(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_tolower[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
+diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h
+--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h	2004-09-10 10:47:40.000000000 -0500
+@@ -0,0 +1,44 @@
++// Specific definitions for GNU/Linux  -*- C++ -*-
++
++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here.  This
++// file will come before all others.
++
++// This keeps isanum, et al from being propagated as macros.
++#define __NO_CTYPE 1
++
++#include <features.h>
++
++// We must not see the optimized string functions GNU libc defines.
++#define __NO_STRING_INLINES
++
++#endif
+diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure
+--- gcc-3.4.2-dist/libstdc++-v3/configure	2004-08-13 15:44:04.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/configure	2004-09-10 10:47:40.000000000 -0500
+@@ -3878,6 +3878,11 @@
+   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd*)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5479,7 +5479,7 @@
+   enableval="$enable_clocale"
+ 
+       case "$enableval" in
+-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
+        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
+ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
+    { (exit 1); exit 1; }; } ;;
+@@ -5545,6 +5550,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case x${target_os} in
++      xlinux-uclibc*)
++	enable_clocale_flag=uclibc
++	;;
+       xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu)
+         cat >conftest.$ac_ext <<_ACEOF
+ #line $LINENO "configure"
+@@ -5759,6 +5767,77 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      echo "$as_me:$LINENO: result: uclibc" >&5
++echo "${ECHO_T}uclibc" >&6
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      # Extract the first word of "msgfmt", so it can be a program name with args.
++set dummy msgfmt; ac_word=$2
++echo "$as_me:$LINENO: checking for $ac_word" >&5
++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  if test -n "$check_msgfmt"; then
++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++    ac_cv_prog_check_msgfmt="yes"
++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++
++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
++fi
++fi
++check_msgfmt=$ac_cv_prog_check_msgfmt
++if test -n "$check_msgfmt"; then
++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
++echo "${ECHO_T}$check_msgfmt" >&6
++else
++  echo "$as_me:$LINENO: result: no" >&5
++echo "${ECHO_T}no" >&6
++fi
++
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++
++
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host
+--- gcc-3.4.2-dist/libstdc++-v3/configure.host	2004-08-27 14:52:30.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/configure.host	2004-09-10 10:47:40.000000000 -0500
+@@ -217,6 +217,12 @@
+     ;;
+ esac
+ 
++# Override for uClibc since linux-uclibc gets mishandled above.
++case "${host_os}" in
++  *-uclibc*)
++    os_include_dir="os/uclibc"
++    ;;
++esac
+ 
+ # Set any OS-dependent and CPU-dependent bits.
+ # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4
+--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4	2004-07-06 20:23:49.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4	2004-09-10 10:47:40.000000000 -0500
+@@ -138,6 +138,99 @@
+ 	;;
+     esac
+     ;;
++  *-uclibc*)
++# Temporary hack until we implement the float versions of the libm funcs
++    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
++      machine/endian.h machine/param.h sys/machine.h sys/types.h \
++      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
++    SECTION_FLAGS='-ffunction-sections -fdata-sections'
++    AC_SUBST(SECTION_FLAGS)
++    GLIBCXX_CHECK_LINKER_FEATURES
++    GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
++    GLIBCXX_CHECK_WCHAR_T_SUPPORT
++
++    # For LFS.
++    AC_DEFINE(HAVE_INT64_T)
++    case "$target" in
++      *-uclinux*)
++        # Don't enable LFS with uClinux
++        ;;
++      *)
++        AC_DEFINE(_GLIBCXX_USE_LFS)
++    esac
++
++    # For showmanyc_helper().
++    AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
++    GLIBCXX_CHECK_POLL
++    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
++
++    # For xsputn_2().
++    AC_CHECK_HEADERS(sys/uio.h)
++    GLIBCXX_CHECK_WRITEV
++
++#     AC_DEFINE(HAVE_ACOSF)
++#     AC_DEFINE(HAVE_ASINF)
++#     AC_DEFINE(HAVE_ATANF)
++#     AC_DEFINE(HAVE_ATAN2F)
++    AC_DEFINE(HAVE_CEILF)
++    AC_DEFINE(HAVE_COPYSIGN)
++#     AC_DEFINE(HAVE_COPYSIGNF)
++#     AC_DEFINE(HAVE_COSF)
++#     AC_DEFINE(HAVE_COSHF)
++#     AC_DEFINE(HAVE_EXPF)
++#     AC_DEFINE(HAVE_FABSF)
++    AC_DEFINE(HAVE_FINITE)
++    AC_DEFINE(HAVE_FINITEF)
++    AC_DEFINE(HAVE_FLOORF)
++#     AC_DEFINE(HAVE_FMODF)
++#     AC_DEFINE(HAVE_FREXPF)
++    AC_DEFINE(HAVE_HYPOT)
++#     AC_DEFINE(HAVE_HYPOTF)
++    AC_DEFINE(HAVE_ISINF)
++    AC_DEFINE(HAVE_ISINFF)
++    AC_DEFINE(HAVE_ISNAN)
++    AC_DEFINE(HAVE_ISNANF)
++#     AC_DEFINE(HAVE_LOGF)
++#     AC_DEFINE(HAVE_LOG10F)
++#     AC_DEFINE(HAVE_MODFF)
++#     AC_DEFINE(HAVE_SINF)
++#     AC_DEFINE(HAVE_SINHF)
++#     AC_DEFINE(HAVE_SINCOS)
++#     AC_DEFINE(HAVE_SINCOSF)
++    AC_DEFINE(HAVE_SQRTF)
++#     AC_DEFINE(HAVE_TANF)
++#     AC_DEFINE(HAVE_TANHF)
++    if test x"long_double_math_on_this_cpu" = x"yes"; then
++      AC_MSG_ERROR([long_double_math_on_this_cpu is yes!])
++#       AC_DEFINE(HAVE_ACOSL)
++#       AC_DEFINE(HAVE_ASINL)
++#       AC_DEFINE(HAVE_ATANL)
++#       AC_DEFINE(HAVE_ATAN2L)
++#       AC_DEFINE(HAVE_CEILL)
++#       AC_DEFINE(HAVE_COPYSIGNL)
++#       AC_DEFINE(HAVE_COSL)
++#       AC_DEFINE(HAVE_COSHL)
++#       AC_DEFINE(HAVE_EXPL)
++#       AC_DEFINE(HAVE_FABSL)
++#       AC_DEFINE(HAVE_FINITEL)
++#       AC_DEFINE(HAVE_FLOORL)
++#       AC_DEFINE(HAVE_FMODL)
++#       AC_DEFINE(HAVE_FREXPL)
++#       AC_DEFINE(HAVE_HYPOTL)
++#       AC_DEFINE(HAVE_ISINFL)
++#       AC_DEFINE(HAVE_ISNANL)
++#       AC_DEFINE(HAVE_LOGL)
++#       AC_DEFINE(HAVE_LOG10L)
++#       AC_DEFINE(HAVE_MODFL)
++#       AC_DEFINE(HAVE_POWL)
++#       AC_DEFINE(HAVE_SINL)
++#       AC_DEFINE(HAVE_SINHL)
++#       AC_DEFINE(HAVE_SINCOSL)
++#       AC_DEFINE(HAVE_SQRTL)
++#       AC_DEFINE(HAVE_TANL)
++#       AC_DEFINE(HAVE_TANHL)
++    fi
++    ;;
+   *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu)
+     AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+       machine/endian.h machine/param.h sys/machine.h sys/types.h \
+@@ -152,7 +245,7 @@
+     AC_DEFINE(HAVE_INT64_T)
+     case "$target" in
+       *-uclinux*)
+-        # Don't enable LFS with uClibc
++        # Don't enable LFS with uClinux
+         ;;
+       *)
+         AC_DEFINE(_GLIBCXX_USE_LFS)
+diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h
+--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h	2003-12-08 21:51:45.000000000 -0600
++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h	2004-09-10 10:47:40.000000000 -0500
+@@ -101,7 +101,9 @@
+ using std::wmemcpy;
+ using std::wmemmove;
+ using std::wmemset;
++#if _GLIBCXX_HAVE_WCSFTIME
+ using std::wcsftime;
++#endif
+ 
+ #if _GLIBCXX_USE_C99
+ using std::wcstold;
+diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h
+--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h	2004-07-20 03:52:12.000000000 -0500
++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h	2004-09-10 10:47:40.000000000 -0500
+@@ -179,7 +179,9 @@
+   using ::wcscoll;
+   using ::wcscpy;
+   using ::wcscspn;
++#if _GLIBCXX_HAVE_WCSFTIME
+   using ::wcsftime;
++#endif
+   using ::wcslen;
+   using ::wcsncat;
+   using ::wcsncmp;
diff --git a/patches/gcc/3.4.4/300-libstdc++-pic.patch b/patches/gcc/3.4.4/300-libstdc++-pic.patch
new file mode 100644
index 00000000..0c41db91
--- /dev/null
+++ b/patches/gcc/3.4.4/300-libstdc++-pic.patch
@@ -0,0 +1,46 @@
+diff -dur gcc-3.4.4.orig/libstdc++-v3/src/Makefile.am gcc-3.4.4/libstdc++-v3/src/Makefile.am
+--- gcc-3.4.4.orig/libstdc++-v3/src/Makefile.am	2004-04-16 21:08:35.000000000 +0200
++++ gcc-3.4.4/libstdc++-v3/src/Makefile.am	2007-02-14 17:24:53.000000000 +0100
+@@ -209,6 +209,9 @@
+ CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \
+ 	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@
+ 
++install-exec-local:
++	$(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
+ 
+ # Added bits to build debug library.
+ if GLIBCXX_BUILD_DEBUG
+diff -dur gcc-3.4.4.orig/libstdc++-v3/src/Makefile.in gcc-3.4.4/libstdc++-v3/src/Makefile.in
+--- gcc-3.4.4.orig/libstdc++-v3/src/Makefile.in	2004-04-16 21:08:35.000000000 +0200
++++ gcc-3.4.4/libstdc++-v3/src/Makefile.in	2007-02-14 17:25:18.000000000 +0100
+@@ -592,7 +592,7 @@
+ 
+ install-data-am: install-data-local
+ 
+-install-exec-am: install-toolexeclibLTLIBRARIES
++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local
+ 
+ install-info: install-info-am
+ 
+@@ -625,6 +625,7 @@
+ 	distclean-tags distdir dvi dvi-am info info-am install \
+ 	install-am install-data install-data-am install-data-local \
+ 	install-exec install-exec-am install-info install-info-am \
++	install-exec-local \
+ 	install-man install-strip install-toolexeclibLTLIBRARIES \
+ 	installcheck installcheck-am installdirs maintainer-clean \
+ 	maintainer-clean-generic mostlyclean mostlyclean-compile \
+@@ -709,6 +710,11 @@
+ install_debug:
+ 	(cd ${debugdir} && $(MAKE) \
+ 	toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install)
++
++install-exec-local:
++	$(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
+Only in gcc-3.4.4/libstdc++-v3/src: Makefile.in.orig
diff --git a/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch b/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch
new file mode 100644
index 00000000..0c370502
--- /dev/null
+++ b/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch
@@ -0,0 +1,65 @@
+--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole	2004-01-13 08:24:37.000000000 -0500
++++ gcc-3.4.0/gcc/config/arm/arm.md	2004-04-24 18:18:04.000000000 -0400
+@@ -8810,13 +8810,16 @@
+    (set_attr "length" "4,8,8")]
+ )
+ 
++; Try to convert LDR+LDR+arith into [add+]LDM+arith
++; On XScale, LDM is always slower than two LDRs, so only do this if
++; optimising for size.
+ (define_insn "*arith_adjacentmem"
+   [(set (match_operand:SI 0 "s_register_operand" "=r")
+ 	(match_operator:SI 1 "shiftable_operator"
+ 	 [(match_operand:SI 2 "memory_operand" "m")
+ 	  (match_operand:SI 3 "memory_operand" "m")]))
+    (clobber (match_scratch:SI 4 "=r"))]
+-  "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])"
++  "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])"
+   "*
+   {
+     rtx ldm[3];
+@@ -8851,6 +8854,8 @@
+       }
+    if (val1 && val2)
+       {
++	/* This would be a loss on a Harvard core, but adjacent_mem_locations()
++	   will prevent it from happening.  */
+ 	rtx ops[3];
+ 	ldm[0] = ops[0] = operands[4];
+ 	ops[1] = XEXP (XEXP (operands[2], 0), 0);
+--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole	2004-04-24 18:16:25.000000000 -0400
++++ gcc-3.4.0/gcc/config/arm/arm.c	2004-04-24 18:18:04.000000000 -0400
+@@ -4838,6 +4841,11 @@
+       *load_offset = unsorted_offsets[order[0]];
+     }
+ 
++  /* For XScale a two-word LDM is a performance loss, so only do this if
++     size is more important.  See comments in arm_gen_load_multiple.  */
++  if (nops == 2 && arm_tune_xscale && !optimize_size)
++    return 0;
++
+   if (unsorted_offsets[order[0]] == 0)
+     return 1; /* ldmia */
+ 
+@@ -5064,6 +5072,11 @@
+       *load_offset = unsorted_offsets[order[0]];
+     }
+ 
++  /* For XScale a two-word LDM is a performance loss, so only do this if
++     size is more important.  See comments in arm_gen_load_multiple.  */
++  if (nops == 2 && arm_tune_xscale && !optimize_size)
++    return 0;
++
+   if (unsorted_offsets[order[0]] == 0)
+     return 1; /* stmia */
+ 
+--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole	2003-07-05 01:27:22.000000000 -0400
++++ gcc-3.4.0/gcc/genpeep.c	2004-04-24 18:18:04.000000000 -0400
+@@ -381,6 +381,7 @@
+   printf ("#include \"recog.h\"\n");
+   printf ("#include \"except.h\"\n\n");
+   printf ("#include \"function.h\"\n\n");
++  printf ("#include \"flags.h\"\n\n");
+ 
+   printf ("#ifdef HAVE_peephole\n");
+   printf ("extern rtx peep_operand[];\n\n");
diff --git a/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch b/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch
new file mode 100644
index 00000000..27f7c07d
--- /dev/null
+++ b/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch
@@ -0,0 +1,42 @@
+The 30_all_gcc34-arm-ldm-peephole.patch from Debian was conflicting 
+with the newer 36_all_pr16201-fix.patch, so i cut out the hunk from 
+it that was causing problems and grabbed an updated version from 
+upstream cvs.
+
+Index: gcc/config/arm/arm.c
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/config/arm/arm.c,v
+retrieving revision 1.432
+retrieving revision 1.433
+diff -u -r1.432 -r1.433
+--- gcc-3.4.4/gcc/config/arm/arm.c	29 Mar 2005 03:00:23 -0000	1.432
++++ gcc-3.4.4/gcc/config/arm/arm.c	1 Apr 2005 11:02:22 -0000	1.433
+@@ -5139,6 +5139,10 @@
+ int
+ adjacent_mem_locations (rtx a, rtx b)
+ {
++  /* We don't guarantee to preserve the order of these memory refs.  */
++  if (volatile_refs_p (a) || volatile_refs_p (b))
++    return 0;
++
+   if ((GET_CODE (XEXP (a, 0)) == REG
+        || (GET_CODE (XEXP (a, 0)) == PLUS
+ 	   && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT))
+@@ -5178,6 +5182,17 @@
+ 	return 0;
+ 
+       val_diff = val1 - val0;
++
++      if (arm_ld_sched)
++	{
++	  /* If the target has load delay slots, then there's no benefit
++	     to using an ldm instruction unless the offset is zero and
++	     we are optimizing for size.  */
++	  return (optimize_size && (REGNO (reg0) == REGNO (reg1))
++		  && (val0 == 0 || val1 == 0 || val0 == 4 || val1 == 4)
++		  && (val_diff == 4 || val_diff == -4));
++	}
++
+       return ((REGNO (reg0) == REGNO (reg1))
+ 	      && (val_diff == 4 || val_diff == -4));
+     }
diff --git a/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch b/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch
new file mode 100644
index 00000000..142052fd
--- /dev/null
+++ b/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch
@@ -0,0 +1,119 @@
+--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm	2004-02-27 09:51:05.000000000 -0500
++++ gcc-3.4.0/gcc/config/arm/arm.c	2004-04-24 18:16:25.000000000 -0400
+@@ -8520,6 +8520,26 @@
+   return_used_this_function = 0;  
+ }
+ 
++/* Return the number (counting from 0) of
++   the least significant set bit in MASK.  */
++
++#ifdef __GNUC__
++inline
++#endif
++static int
++number_of_first_bit_set (mask)
++     int mask;
++{
++  int bit;
++
++  for (bit = 0;
++       (mask & (1 << bit)) == 0;
++       ++bit)
++    continue;
++
++  return bit;
++}
++
+ const char *
+ arm_output_epilogue (rtx sibling)
+ {
+@@ -8753,27 +8773,47 @@
+ 	  saved_regs_mask |=   (1 << PC_REGNUM);
+ 	}
+ 
+-      /* Load the registers off the stack.  If we only have one register
+-	 to load use the LDR instruction - it is faster.  */
+-      if (saved_regs_mask == (1 << LR_REGNUM))
+-	{
+-	  /* The exception handler ignores the LR, so we do
+-	     not really need to load it off the stack.  */
+-	  if (eh_ofs)
+-	    asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
+-	  else
+-	    asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
+-	}
+-      else if (saved_regs_mask)
++      if (saved_regs_mask)
+ 	{
+-	  if (saved_regs_mask & (1 << SP_REGNUM))
+-	    /* Note - write back to the stack register is not enabled
+-	       (ie "ldmfd sp!...").  We know that the stack pointer is
+-	       in the list of registers and if we add writeback the
+-	       instruction becomes UNPREDICTABLE.  */
+-	    print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
++	  /* Load the registers off the stack.  If we only have one register
++	     to load use the LDR instruction - it is faster.  */
++	  if (bit_count (saved_regs_mask) == 1)
++	    {
++	      int reg = number_of_first_bit_set (saved_regs_mask);
++
++	      switch (reg)
++		{
++		case SP_REGNUM:
++		  /* Mustn't use base writeback when loading SP.  */
++		  asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM);
++		  break;
++		  
++		case LR_REGNUM:
++		  if (eh_ofs)
++		    {
++		      /* The exception handler ignores the LR, so we do
++			 not really need to load it off the stack.  */
++		      asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
++		      break;
++		    }
++		  /* else fall through */
++		  
++		default:
++		  asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM);
++		  break;
++		}
++	    }
+ 	  else
+-	    print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
++	    {
++	      if (saved_regs_mask & (1 << SP_REGNUM))
++		/* Note - write back to the stack register is not enabled
++		   (ie "ldmfd sp!...").  We know that the stack pointer is
++		   in the list of registers and if we add writeback the
++		   instruction becomes UNPREDICTABLE.  */
++		print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
++	      else
++		print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
++	    }
+ 	}
+ 
+       if (current_function_pretend_args_size)
+@@ -11401,22 +11441,6 @@
+     }
+ }
+ 
+-/* Return the number (counting from 0) of
+-   the least significant set bit in MASK.  */
+-
+-inline static int
+-number_of_first_bit_set (int mask)
+-{
+-  int bit;
+-
+-  for (bit = 0;
+-       (mask & (1 << bit)) == 0;
+-       ++bit)
+-    continue;
+-
+-  return bit;
+-}
+-
+ /* Generate code to return from a thumb function.
+    If 'reg_containing_return_addr' is -1, then the return address is
+    actually on the stack, at the stack pointer.  */
diff --git a/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch b/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch
new file mode 100644
index 00000000..4377c214
--- /dev/null
+++ b/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch
@@ -0,0 +1,22 @@
+--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~	2003-08-27 22:29:42.000000000 +0100
++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am	2004-07-22 16:41:45.152130128 +0100
+@@ -32,7 +32,7 @@
+ 
+ libmath_la_SOURCES = stubs.c
+ 
+-AM_CPPFLAGS = $(CANADIAN_INCLUDES)
++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+ # Only compiling "C" sources in this directory.
+ LIBTOOL = @LIBTOOL@ --tag CC
+--- gcc-3.4.1/libstdc++-v3/fragment.am.old	2004-07-22 18:24:58.024083656 +0100
++++ gcc-3.4.1/libstdc++-v3/fragment.am	2004-07-22 18:24:59.019932264 +0100
+@@ -18,7 +18,7 @@
+ 	$(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once
+ 
+ # -I/-D flags to pass when compiling.
+-AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+ 
+ 
diff --git a/patches/gcc/3.4.4/700-pr15068-fix.patch b/patches/gcc/3.4.4/700-pr15068-fix.patch
new file mode 100644
index 00000000..2977765c
--- /dev/null
+++ b/patches/gcc/3.4.4/700-pr15068-fix.patch
@@ -0,0 +1,44 @@
+See http://gcc.gnu.org/PR15068
+
+Fixes error
+
+../sysdeps/generic/s_fmax.c: In function `__fmax':
+../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257
+Please submit a full bug report,
+with preprocessed source if appropriate.
+See <URL:http://gcc.gnu.org/bugs.html> for instructions.
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math'
+make[1]: *** [math/others] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822'
+make: *** [all] Error 2
+
+[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ]
+
+--- gcc-3.4.1/gcc/flow.c.old	2004-02-27 19:39:19.000000000 -0800
++++ gcc-3.4.1/gcc/flow.c	2004-08-26 07:29:46.000000000 -0700
+@@ -1878,6 +1878,7 @@
+ 	  rtx set_src = SET_SRC (pc_set (BB_END (bb)));
+ 	  rtx cond_true = XEXP (set_src, 0);
+ 	  rtx reg = XEXP (cond_true, 0);
++ 	  enum rtx_code inv_cond;
+ 
+ 	  if (GET_CODE (reg) == SUBREG)
+ 	    reg = SUBREG_REG (reg);
+@@ -1886,11 +1887,13 @@
+ 	     in the form of a comparison of a register against zero.  
+ 	     If the condition is more complex than that, then it is safe
+ 	     not to record any information.  */
+-	  if (GET_CODE (reg) == REG
++ 	  inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
++ 	  if (inv_cond != UNKNOWN
++	      && GET_CODE (reg) == REG
+ 	      && XEXP (cond_true, 1) == const0_rtx)
+ 	    {
+ 	      rtx cond_false
+-		= gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
++		= gen_rtx_fmt_ee (inv_cond,
+ 				  GET_MODE (cond_true), XEXP (cond_true, 0),
+ 				  XEXP (cond_true, 1));
+ 	      if (GET_CODE (XEXP (set_src, 1)) == PC)
diff --git a/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch b/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch
new file mode 100644
index 00000000..680bb397
--- /dev/null
+++ b/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch
@@ -0,0 +1,43 @@
+--- gcc/gcc/config/sh/sh.c
++++ gcc/gcc/config/sh/sh.c
+@@ -9106,6 +9106,15 @@ sh_output_mi_thunk (FILE *file, tree thu
+     }
+   this = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1);
+ 
++  /* In PIC case, we set PIC register to compute the target address.  We
++     can use a scratch register to save and restore the original value  
++     except for SHcompact.  For SHcompact, use stack.  */
++  if (flag_pic && TARGET_SHCOMPACT)
++    {
++      push (PIC_OFFSET_TABLE_REGNUM);
++      emit_insn (gen_GOTaddr2picreg ());
++    }
++
+   /* For SHcompact, we only have r0 for a scratch register: r1 is the
+      static chain pointer (even if you can't have nested virtual functions
+      right now, someone might implement them sometime), and the rest of the
+@@ -9188,8 +9197,24 @@ sh_output_mi_thunk (FILE *file, tree thu
+       assemble_external (function);
+       TREE_USED (function) = 1;
+     }
++  /* We can use scratch1 to save and restore the original value of
++     PIC register except for SHcompact.  */
++  if (flag_pic && ! TARGET_SHCOMPACT)
++    {
++      emit_move_insn (scratch1,
++		      gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
++      emit_insn (gen_GOTaddr2picreg ());
++    }
+   funexp = XEXP (DECL_RTL (function), 0);
+   emit_move_insn (scratch2, funexp);
++  if (flag_pic)
++    {
++      if (! TARGET_SHCOMPACT)
++	emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
++			scratch1);
++      else
++	pop (PIC_OFFSET_TABLE_REGNUM);
++    }
+   funexp = gen_rtx_MEM (FUNCTION_MODE, scratch2);
+   sibcall = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX));
+   SIBLING_CALL_P (sibcall) = 1;
diff --git a/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch b/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch
new file mode 100644
index 00000000..8b982683
--- /dev/null
+++ b/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch
@@ -0,0 +1,13 @@
+--- g/gcc/config/sh/sh.h
++++ g/gcc/config/sh/sh.h
+@@ -422,6 +422,10 @@
+ do {									\
+   if (LEVEL)								\
+     flag_omit_frame_pointer = -1;					\
++  if (LEVEL <= 2)							\
++    {									\
++      flag_reorder_blocks = 0;						\
++    }									\
+   if (SIZE)								\
+     target_flags |= SPACE_BIT;						\
+   if (TARGET_SHMEDIA && LEVEL > 1)					\
diff --git a/patches/gcc/3.4.4/73_all_sh-pr20617.patch b/patches/gcc/3.4.4/73_all_sh-pr20617.patch
new file mode 100644
index 00000000..6d8021cc
--- /dev/null
+++ b/patches/gcc/3.4.4/73_all_sh-pr20617.patch
@@ -0,0 +1,28 @@
+2005-03-24  J"orn Rennecke <joern.rennecke@st.com>
+
+	Band aid for PR target/20617:
+	* config/sh/lib1funcs.asm (FUNC, ALIAS): Add .hidden directive.
+
+--- g/gcc/config/sh/lib1funcs.asm
++++ g/gcc/config/sh/lib1funcs.asm
+@@ -37,9 +37,19 @@ Boston, MA 02111-1307, USA.  */
+    ELF local label prefixes by J"orn Rennecke
+    amylaar@cygnus.com  */
+ 
++#define ALIAS(X,Y)	.global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y)
++
+ #ifdef __ELF__
+ #define LOCAL(X)	.L_##X
+-#define FUNC(X)		.type X,@function
++
++#if 1 /* ??? The export list mechanism is broken, everything that is not
++	 hidden is exported.  */
++#undef FUNC
++#define FUNC(X)		.type X,@function; .hidden X
++#undef ALIAS
++#define ALIAS(X,Y)	.global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y); .hidden GLOBAL(X)
++#endif
++
+ #define ENDFUNC0(X)	.Lfe_##X: .size X,.Lfe_##X-X
+ #define ENDFUNC(X)	ENDFUNC0(X)
+ #else
diff --git a/patches/gcc/3.4.4/800-arm-bigendian.patch b/patches/gcc/3.4.4/800-arm-bigendian.patch
new file mode 100644
index 00000000..625e3357
--- /dev/null
+++ b/patches/gcc/3.4.4/800-arm-bigendian.patch
@@ -0,0 +1,66 @@
+diff -dur gcc-3.4.4.orig/gcc/config/arm/linux-elf.h gcc-3.4.4/gcc/config/arm/linux-elf.h
+--- gcc-3.4.4.orig/gcc/config/arm/linux-elf.h	2007-02-14 17:44:27.000000000 +0100
++++ gcc-3.4.4/gcc/config/arm/linux-elf.h	2007-02-14 17:47:32.000000000 +0100
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -94,7 +111,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+Only in gcc-3.4.4/gcc/config/arm: linux-elf.h.orig
+diff -dur gcc-3.4.4.orig/gcc/config.gcc gcc-3.4.4/gcc/config.gcc
+--- gcc-3.4.4.orig/gcc/config.gcc	2007-02-14 17:44:27.000000000 +0100
++++ gcc-3.4.4/gcc/config.gcc	2007-02-14 17:47:32.000000000 +0100
+@@ -672,6 +672,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch b/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch
new file mode 100644
index 00000000..a209470f
--- /dev/null
+++ b/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch
@@ -0,0 +1,15 @@
+--- gcc-3.4.4/gcc/config/rs6000/linux-unwind.h.org	2005-06-23 17:50:34.000000000 -0600
++++ gcc-3.4.4/gcc/config/rs6000/linux-unwind.h	2005-06-23 17:52:02.000000000 -0600
+@@ -32,6 +32,7 @@
+    these structs elsewhere;  Many fields are missing, particularly
+    from the end of the structures.  */
+ 
++#ifndef inhibit_libc
+ struct gcc_vregs
+ {
+   __attribute__ ((vector_size (16))) int vr[32];
+@@ -320,3 +321,4 @@
+ 									\
+     goto SUCCESS;							\
+   } while (0)
++#endif
diff --git a/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch b/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch
new file mode 100644
index 00000000..c7419af9
--- /dev/null
+++ b/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch
@@ -0,0 +1,16 @@
+Index: gcc/gcse.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/gcse.c,v
+retrieving revision 1.288.2.9
+diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.288.2.9 gcse.c
+--- gcc/gcc/gcse.c	30 Oct 2004 18:02:53 -0000	1.288.2.9
++++ gcc/gcc/gcse.c	14 Jul 2005 13:19:57 -0000
+@@ -6445,7 +6445,7 @@ hoist_code (void)
+ 	  insn_inserted_p = 0;
+ 
+ 	  /* These tests should be the same as the tests above.  */
+-	  if (TEST_BIT (hoist_vbeout[bb->index], i))
++	  if (TEST_BIT (hoist_exprs[bb->index], i))
+ 	    {
+ 	      /* We've found a potentially hoistable expression, now
+ 		 we look at every block BB dominates to see if it
diff --git a/patches/gcc/3.4.4/900-nios2.patch b/patches/gcc/3.4.4/900-nios2.patch
new file mode 100644
index 00000000..bfa06a21
--- /dev/null
+++ b/patches/gcc/3.4.4/900-nios2.patch
@@ -0,0 +1,10211 @@
+--- gcc-3.4.3/gcc/Makefile.in
++++ gcc-3.4.3-nios2/gcc/Makefile.in
+@@ -3085,7 +3085,7 @@ install-mkheaders: stmp-int-hdrs $(STMP_
+ 	  $(INSTALL_DATA) $(srcdir)/README-fixinc \
+ 	    $(DESTDIR)$(itoolsdatadir)/include/README ; \
+ 	  $(INSTALL_SCRIPT) fixinc.sh $(DESTDIR)$(itoolsdir)/fixinc.sh ; \
+-	  $(INSTALL_PROGRAM) fixinc/fixincl $(DESTDIR)$(itoolsdir)/fixincl ; \
++	  $(INSTALL_PROGRAM) fixinc/fixincl$(build_exeext) $(DESTDIR)$(itoolsdir)/fixincl$(build_exeext) ; \
+ 	  $(INSTALL_DATA) $(srcdir)/gsyslimits.h \
+ 	    $(DESTDIR)$(itoolsdatadir)/gsyslimits.h ; \
+ 	else :; fi
+--- gcc-3.4.3/gcc/combine.c
++++ gcc-3.4.3-nios2/gcc/combine.c
+@@ -4380,6 +4380,14 @@ combine_simplify_rtx (rtx x, enum machin
+ 					 mode);
+ 	    }
+ 
++#ifndef __nios2__
++/* This screws up Nios II in this test case:
++
++if (x & 1)
++  return 2;
++else
++  return 3;
++*/
+ 	  else if (STORE_FLAG_VALUE == 1
+ 		   && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
+ 		   && op1 == const0_rtx
+@@ -4391,6 +4399,7 @@ combine_simplify_rtx (rtx x, enum machin
+ 				 gen_lowpart_for_combine (mode, op0),
+ 				 const1_rtx);
+ 	    }
++#endif
+ 
+ 	  else if (STORE_FLAG_VALUE == 1
+ 		   && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
+--- gcc-3.4.3/gcc/config/nios2/crti.asm
++++ gcc-3.4.3-nios2/gcc/config/nios2/crti.asm
+@@ -0,0 +1,88 @@
++/*
++  Copyright (C) 2003 
++ by Jonah Graham (jgraham@altera.com)
++
++This file 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.
++
++In addition to the permissions in the GNU General Public License, the
++Free Software Foundation gives you unlimited permission to link the
++compiled version of this file with other programs, and to distribute
++those programs without any restriction coming from the use of this
++file.  (The General Public License restrictions do apply in other
++respects; for example, they cover modification of the file, and
++distribution when not linked into another program.)
++
++This file 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; see the file COPYING.  If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with GCC to produce an executable, this does not cause
++   the resulting executable to be covered by the GNU General Public License.
++   This exception does not however invalidate any other reasons why
++   the executable file might be covered by the GNU General Public License.
++
++
++This file just make a stack frame for the contents of the .fini and
++.init sections.  Users may put any desired instructions in those
++sections.
++
++
++While technically any code can be put in the init and fini sections
++most stuff will not work other than stuff which obeys the call frame
++and ABI. All the call-preserved registers are saved, the call clobbered
++registers should have been saved by the code calling init and fini.
++
++See crtstuff.c for an example of code that inserts itself in the 
++init and fini sections. 
++
++See crt0.s for the code that calls init and fini.
++*/
++
++	.file	"crti.asm"
++
++	.section	".init"
++	.align 2
++	.global	_init
++_init:
++	addi	sp, sp, -48
++	stw	ra, 44(sp)
++	stw	r23, 40(sp)
++	stw	r22, 36(sp)
++	stw	r21, 32(sp)
++	stw	r20, 28(sp)
++	stw	r19, 24(sp)
++	stw	r18, 20(sp)
++	stw	r17, 16(sp)
++	stw	r16, 12(sp)
++	stw	fp, 8(sp)
++	mov	fp, sp
++	
++	
++	.section	".fini"
++	.align	2
++	.global	_fini
++_fini:
++	addi	sp, sp, -48
++	stw	ra, 44(sp)
++	stw	r23, 40(sp)
++	stw	r22, 36(sp)
++	stw	r21, 32(sp)
++	stw	r20, 28(sp)
++	stw	r19, 24(sp)
++	stw	r18, 20(sp)
++	stw	r17, 16(sp)
++	stw	r16, 12(sp)
++	stw	fp, 8(sp)
++	mov	fp, sp
++	
++
+--- gcc-3.4.3/gcc/config/nios2/crtn.asm
++++ gcc-3.4.3-nios2/gcc/config/nios2/crtn.asm
+@@ -0,0 +1,70 @@
++/*
++  Copyright (C) 2003 
++ by Jonah Graham (jgraham@altera.com)
++
++This file 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.
++
++In addition to the permissions in the GNU General Public License, the
++Free Software Foundation gives you unlimited permission to link the
++compiled version of this file with other programs, and to distribute
++those programs without any restriction coming from the use of this
++file.  (The General Public License restrictions do apply in other
++respects; for example, they cover modification of the file, and
++distribution when not linked into another program.)
++
++This file 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; see the file COPYING.  If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with GCC to produce an executable, this does not cause
++   the resulting executable to be covered by the GNU General Public License.
++   This exception does not however invalidate any other reasons why
++   the executable file might be covered by the GNU General Public License.
++
++
++This file just makes sure that the .fini and .init sections do in
++fact return.  Users may put any desired instructions in those sections.
++This file is the last thing linked into any executable.
++*/	
++	.file	"crtn.asm"
++
++
++
++	.section	".init"
++	ldw	ra, 44(sp)
++	ldw	r23, 40(sp)
++	ldw	r22, 36(sp)
++	ldw	r21, 32(sp)
++	ldw	r20, 28(sp)
++	ldw	r19, 24(sp)
++	ldw	r18, 20(sp)
++	ldw	r17, 16(sp)
++	ldw	r16, 12(sp)
++	ldw	fp, 8(sp)
++	addi	sp, sp, -48
++	ret
++	
++	.section	".fini"
++	ldw	ra, 44(sp)
++	ldw	r23, 40(sp)
++	ldw	r22, 36(sp)
++	ldw	r21, 32(sp)
++	ldw	r20, 28(sp)
++	ldw	r19, 24(sp)
++	ldw	r18, 20(sp)
++	ldw	r17, 16(sp)
++	ldw	r16, 12(sp)
++	ldw	fp, 8(sp)
++	addi	sp, sp, -48
++	ret
++	
+--- gcc-3.4.3/gcc/config/nios2/lib2-divmod-hi.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divmod-hi.c
+@@ -0,0 +1,123 @@
++
++/* We include auto-host.h here to get HAVE_GAS_HIDDEN.  This is
++   supposedly valid even though this is a "target" file.  */
++#include "auto-host.h"
++
++
++#include "tconfig.h"
++#include "tsystem.h"
++#include "coretypes.h"
++#include "tm.h"
++
++
++/* Don't use `fancy_abort' here even if config.h says to use it.  */
++#ifdef abort
++#undef abort
++#endif
++
++
++#ifdef HAVE_GAS_HIDDEN
++#define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
++#else
++#define ATTRIBUTE_HIDDEN
++#endif
++
++#include "libgcc2.h"
++
++extern HItype __modhi3 (HItype, HItype);
++extern HItype __divhi3 (HItype, HItype);
++extern HItype __umodhi3 (HItype, HItype);
++extern HItype __udivhi3 (HItype, HItype);
++
++static UHItype udivmodhi4(UHItype, UHItype, word_type);
++
++static UHItype
++udivmodhi4(UHItype num, UHItype den, word_type modwanted)
++{
++  UHItype bit = 1;
++  UHItype res = 0;
++
++  while (den < num && bit && !(den & (1L<<15)))
++    {
++      den <<=1;
++      bit <<=1;
++    }
++  while (bit)
++    {
++      if (num >= den)
++	{
++	  num -= den;
++	  res |= bit;
++	}
++      bit >>=1;
++      den >>=1;
++    }
++  if (modwanted) return num;
++  return res;
++}
++
++
++HItype
++__divhi3 (HItype a, HItype b)
++{
++  word_type neg = 0;
++  HItype res;
++
++  if (a < 0)
++    {
++      a = -a;
++      neg = !neg;
++    }
++
++  if (b < 0)
++    {
++      b = -b;
++      neg = !neg;
++    }
++
++  res = udivmodhi4 (a, b, 0);
++
++  if (neg)
++    res = -res;
++
++  return res;
++}
++
++
++HItype
++__modhi3 (HItype a, HItype b)
++{
++  word_type neg = 0;
++  HItype res;
++
++  if (a < 0)
++    {
++      a = -a;
++      neg = 1;
++    }
++
++  if (b < 0)
++    b = -b;
++
++  res = udivmodhi4 (a, b, 1);
++
++  if (neg)
++    res = -res;
++
++  return res;
++}
++
++
++HItype
++__udivhi3 (HItype a, HItype b)
++{
++  return udivmodhi4 (a, b, 0);
++}
++
++
++HItype
++__umodhi3 (HItype a, HItype b)
++{
++  return udivmodhi4 (a, b, 1);
++}
++
+--- gcc-3.4.3/gcc/config/nios2/lib2-divmod.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divmod.c
+@@ -0,0 +1,126 @@
++
++/* We include auto-host.h here to get HAVE_GAS_HIDDEN.  This is
++   supposedly valid even though this is a "target" file.  */
++#include "auto-host.h"
++
++
++#include "tconfig.h"
++#include "tsystem.h"
++#include "coretypes.h"
++#include "tm.h"
++
++
++/* Don't use `fancy_abort' here even if config.h says to use it.  */
++#ifdef abort
++#undef abort
++#endif
++
++
++#ifdef HAVE_GAS_HIDDEN
++#define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
++#else
++#define ATTRIBUTE_HIDDEN
++#endif
++
++#include "libgcc2.h"
++
++extern SItype __modsi3 (SItype, SItype);
++extern SItype __divsi3 (SItype, SItype);
++extern SItype __umodsi3 (SItype, SItype);
++extern SItype __udivsi3 (SItype, SItype);
++
++static USItype udivmodsi4(USItype, USItype, word_type);
++
++/* 16-bit SI divide and modulo as used in NIOS */
++
++
++static USItype
++udivmodsi4(USItype num, USItype den, word_type modwanted)
++{
++  USItype bit = 1;
++  USItype res = 0;
++
++  while (den < num && bit && !(den & (1L<<31)))
++    {
++      den <<=1;
++      bit <<=1;
++    }
++  while (bit)
++    {
++      if (num >= den)
++	{
++	  num -= den;
++	  res |= bit;
++	}
++      bit >>=1;
++      den >>=1;
++    }
++  if (modwanted) return num;
++  return res;
++}
++
++
++SItype
++__divsi3 (SItype a, SItype b)
++{
++  word_type neg = 0;
++  SItype res;
++
++  if (a < 0)
++    {
++      a = -a;
++      neg = !neg;
++    }
++
++  if (b < 0)
++    {
++      b = -b;
++      neg = !neg;
++    }
++
++  res = udivmodsi4 (a, b, 0);
++
++  if (neg)
++    res = -res;
++
++  return res;
++}
++
++
++SItype
++__modsi3 (SItype a, SItype b)
++{
++  word_type neg = 0;
++  SItype res;
++
++  if (a < 0)
++    {
++      a = -a;
++      neg = 1;
++    }
++
++  if (b < 0)
++    b = -b;
++
++  res = udivmodsi4 (a, b, 1);
++
++  if (neg)
++    res = -res;
++
++  return res;
++}
++
++
++SItype
++__udivsi3 (SItype a, SItype b)
++{
++  return udivmodsi4 (a, b, 0);
++}
++
++
++SItype
++__umodsi3 (SItype a, SItype b)
++{
++  return udivmodsi4 (a, b, 1);
++}
++
+--- gcc-3.4.3/gcc/config/nios2/lib2-divtable.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divtable.c
+@@ -0,0 +1,46 @@
++
++/* We include auto-host.h here to get HAVE_GAS_HIDDEN.  This is
++   supposedly valid even though this is a "target" file.  */
++#include "auto-host.h"
++
++
++#include "tconfig.h"
++#include "tsystem.h"
++#include "coretypes.h"
++#include "tm.h"
++
++
++/* Don't use `fancy_abort' here even if config.h says to use it.  */
++#ifdef abort
++#undef abort
++#endif
++
++
++#ifdef HAVE_GAS_HIDDEN
++#define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
++#else
++#define ATTRIBUTE_HIDDEN
++#endif
++
++#include "libgcc2.h"
++
++UQItype __divsi3_table[] =
++{
++  0, 0/1, 0/2, 0/3, 0/4, 0/5, 0/6, 0/7, 0/8, 0/9, 0/10, 0/11, 0/12, 0/13, 0/14, 0/15,
++  0, 1/1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13, 1/14, 1/15,
++  0, 2/1, 2/2, 2/3, 2/4, 2/5, 2/6, 2/7, 2/8, 2/9, 2/10, 2/11, 2/12, 2/13, 2/14, 2/15,
++  0, 3/1, 3/2, 3/3, 3/4, 3/5, 3/6, 3/7, 3/8, 3/9, 3/10, 3/11, 3/12, 3/13, 3/14, 3/15,
++  0, 4/1, 4/2, 4/3, 4/4, 4/5, 4/6, 4/7, 4/8, 4/9, 4/10, 4/11, 4/12, 4/13, 4/14, 4/15,
++  0, 5/1, 5/2, 5/3, 5/4, 5/5, 5/6, 5/7, 5/8, 5/9, 5/10, 5/11, 5/12, 5/13, 5/14, 5/15,
++  0, 6/1, 6/2, 6/3, 6/4, 6/5, 6/6, 6/7, 6/8, 6/9, 6/10, 6/11, 6/12, 6/13, 6/14, 6/15,
++  0, 7/1, 7/2, 7/3, 7/4, 7/5, 7/6, 7/7, 7/8, 7/9, 7/10, 7/11, 7/12, 7/13, 7/14, 7/15,
++  0, 8/1, 8/2, 8/3, 8/4, 8/5, 8/6, 8/7, 8/8, 8/9, 8/10, 8/11, 8/12, 8/13, 8/14, 8/15,
++  0, 9/1, 9/2, 9/3, 9/4, 9/5, 9/6, 9/7, 9/8, 9/9, 9/10, 9/11, 9/12, 9/13, 9/14, 9/15,
++  0, 10/1, 10/2, 10/3, 10/4, 10/5, 10/6, 10/7, 10/8, 10/9, 10/10, 10/11, 10/12, 10/13, 10/14, 10/15,
++  0, 11/1, 11/2, 11/3, 11/4, 11/5, 11/6, 11/7, 11/8, 11/9, 11/10, 11/11, 11/12, 11/13, 11/14, 11/15,
++  0, 12/1, 12/2, 12/3, 12/4, 12/5, 12/6, 12/7, 12/8, 12/9, 12/10, 12/11, 12/12, 12/13, 12/14, 12/15,
++  0, 13/1, 13/2, 13/3, 13/4, 13/5, 13/6, 13/7, 13/8, 13/9, 13/10, 13/11, 13/12, 13/13, 13/14, 13/15,
++  0, 14/1, 14/2, 14/3, 14/4, 14/5, 14/6, 14/7, 14/8, 14/9, 14/10, 14/11, 14/12, 14/13, 14/14, 14/15,
++  0, 15/1, 15/2, 15/3, 15/4, 15/5, 15/6, 15/7, 15/8, 15/9, 15/10, 15/11, 15/12, 15/13, 15/14, 15/15,
++};
++
+--- gcc-3.4.3/gcc/config/nios2/lib2-mul.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-mul.c
+@@ -0,0 +1,103 @@
++/* while we are debugging (ie compile outside of gcc build) 
++   disable gcc specific headers */
++#ifndef DEBUG_MULSI3
++
++
++/* We include auto-host.h here to get HAVE_GAS_HIDDEN.  This is
++   supposedly valid even though this is a "target" file.  */
++#include "auto-host.h"
++
++
++#include "tconfig.h"
++#include "tsystem.h"
++#include "coretypes.h"
++#include "tm.h"
++
++
++/* Don't use `fancy_abort' here even if config.h says to use it.  */
++#ifdef abort
++#undef abort
++#endif
++
++
++#ifdef HAVE_GAS_HIDDEN
++#define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
++#else
++#define ATTRIBUTE_HIDDEN
++#endif
++
++#include "libgcc2.h"
++
++#else
++#define SItype int
++#define USItype unsigned int
++#endif
++
++
++extern SItype __mulsi3 (SItype, SItype);
++
++SItype
++__mulsi3 (SItype a, SItype b)
++{
++  SItype res = 0;
++  USItype cnt = a;
++  
++  while (cnt)
++    {
++      if (cnt & 1)
++        {
++	  res += b;	  
++	}
++      b <<= 1;
++      cnt >>= 1;
++    }
++    
++  return res;
++}
++/*
++TODO: Choose best alternative implementation.
++
++SItype
++__divsi3 (SItype a, SItype b)
++{
++  SItype res = 0;
++  USItype cnt = 0;
++  
++  while (cnt < 32)
++    {
++      if (a & (1L << cnt))
++        {
++	  res += b;	  
++	}
++      b <<= 1;
++      cnt++;
++    }
++    
++  return res;
++}
++*/
++
++
++#ifdef DEBUG_MULSI3
++
++int
++main ()
++{
++  int i, j;
++  int error = 0;
++  
++  for (i = -1000; i < 1000; i++)
++    for (j = -1000; j < 1000; j++)
++      {
++	int expect = i * j;
++	int actual = A__divsi3 (i, j);
++	if (expect != actual)
++	  {
++	    printf ("error: %d * %d = %d not %d\n", i, j, expect, actual);
++	    error = 1;
++	  }
++      }
++
++  return error;
++}
++#endif
+--- gcc-3.4.3/gcc/config/nios2/nios2-dp-bit.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-dp-bit.c
+@@ -0,0 +1,1652 @@
++
++/* This is a software floating point library which can be used
++   for targets without hardware floating point. 
++   Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
++   Free Software Foundation, Inc.
++
++This file 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.
++
++In addition to the permissions in the GNU General Public License, the
++Free Software Foundation gives you unlimited permission to link the
++compiled version of this file with other programs, and to distribute
++those programs without any restriction coming from the use of this
++file.  (The General Public License restrictions do apply in other
++respects; for example, they cover modification of the file, and
++distribution when not linked into another program.)
++
++This file 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; see the file COPYING.  If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA.  */
++
++/* As a special exception, if you link this library with other files,
++   some of which are compiled with GCC, to produce an executable,
++   this library does not by itself cause the resulting executable
++   to be covered by the GNU General Public License.
++   This exception does not however invalidate any other reasons why
++   the executable file might be covered by the GNU General Public License.  */
++
++/* This implements IEEE 754 format arithmetic, but does not provide a
++   mechanism for setting the rounding mode, or for generating or handling
++   exceptions.
++
++   The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
++   Wilson, all of Cygnus Support.  */
++
++/* The intended way to use this file is to make two copies, add `#define FLOAT'
++   to one copy, then compile both copies and add them to libgcc.a.  */
++
++#include "tconfig.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "config/fp-bit.h"
++
++/* The following macros can be defined to change the behavior of this file:
++   FLOAT: Implement a `float', aka SFmode, fp library.  If this is not
++     defined, then this file implements a `double', aka DFmode, fp library.
++   FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
++     don't include float->double conversion which requires the double library.
++     This is useful only for machines which can't support doubles, e.g. some
++     8-bit processors.
++   CMPtype: Specify the type that floating point compares should return.
++     This defaults to SItype, aka int.
++   US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
++     US Software goFast library.
++   _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
++     two integers to the FLO_union_type.
++   NO_DENORMALS: Disable handling of denormals.
++   NO_NANS: Disable nan and infinity handling
++   SMALL_MACHINE: Useful when operations on QIs and HIs are faster
++     than on an SI */
++
++/* We don't currently support extended floats (long doubles) on machines
++   without hardware to deal with them.
++
++   These stubs are just to keep the linker from complaining about unresolved
++   references which can be pulled in from libio & libstdc++, even if the
++   user isn't using long doubles.  However, they may generate an unresolved
++   external to abort if abort is not used by the function, and the stubs
++   are referenced from within libc, since libgcc goes before and after the
++   system library.  */
++
++#ifdef DECLARE_LIBRARY_RENAMES
++  DECLARE_LIBRARY_RENAMES
++#endif
++
++#ifdef EXTENDED_FLOAT_STUBS
++extern void abort (void);
++void __extendsfxf2 (void) { abort(); }
++void __extenddfxf2 (void) { abort(); }
++void __truncxfdf2 (void) { abort(); }
++void __truncxfsf2 (void) { abort(); }
++void __fixxfsi (void) { abort(); }
++void __floatsixf (void) { abort(); }
++void __addxf3 (void) { abort(); }
++void __subxf3 (void) { abort(); }
++void __mulxf3 (void) { abort(); }
++void __divxf3 (void) { abort(); }
++void __negxf2 (void) { abort(); }
++void __eqxf2 (void) { abort(); }
++void __nexf2 (void) { abort(); }
++void __gtxf2 (void) { abort(); }
++void __gexf2 (void) { abort(); }
++void __lexf2 (void) { abort(); }
++void __ltxf2 (void) { abort(); }
++
++void __extendsftf2 (void) { abort(); }
++void __extenddftf2 (void) { abort(); }
++void __trunctfdf2 (void) { abort(); }
++void __trunctfsf2 (void) { abort(); }
++void __fixtfsi (void) { abort(); }
++void __floatsitf (void) { abort(); }
++void __addtf3 (void) { abort(); }
++void __subtf3 (void) { abort(); }
++void __multf3 (void) { abort(); }
++void __divtf3 (void) { abort(); }
++void __negtf2 (void) { abort(); }
++void __eqtf2 (void) { abort(); }
++void __netf2 (void) { abort(); }
++void __gttf2 (void) { abort(); }
++void __getf2 (void) { abort(); }
++void __letf2 (void) { abort(); }
++void __lttf2 (void) { abort(); }
++#else	/* !EXTENDED_FLOAT_STUBS, rest of file */
++
++/* IEEE "special" number predicates */
++
++#ifdef NO_NANS
++
++#define nan() 0
++#define isnan(x) 0
++#define isinf(x) 0
++#else
++
++#if   defined L_thenan_sf
++const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined L_thenan_df
++const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined L_thenan_tf
++const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined TFLOAT
++extern const fp_number_type __thenan_tf;
++#elif defined FLOAT
++extern const fp_number_type __thenan_sf;
++#else
++extern const fp_number_type __thenan_df;
++#endif
++
++INLINE
++static fp_number_type *
++nan (void)
++{
++  /* Discard the const qualifier...  */
++#ifdef TFLOAT
++  return (fp_number_type *) (& __thenan_tf);
++#elif defined FLOAT  
++  return (fp_number_type *) (& __thenan_sf);
++#else
++  return (fp_number_type *) (& __thenan_df);
++#endif
++}
++
++INLINE
++static int
++isnan ( fp_number_type *  x)
++{
++  return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
++}
++
++INLINE
++static int
++isinf ( fp_number_type *  x)
++{
++  return x->class == CLASS_INFINITY;
++}
++
++#endif /* NO_NANS */
++
++INLINE
++static int
++iszero ( fp_number_type *  x)
++{
++  return x->class == CLASS_ZERO;
++}
++
++INLINE 
++static void
++flip_sign ( fp_number_type *  x)
++{
++  x->sign = !x->sign;
++}
++
++extern FLO_type pack_d ( fp_number_type * );
++
++#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
++FLO_type
++pack_d ( fp_number_type *  src)
++{
++  FLO_union_type dst;
++  fractype fraction = src->fraction.ll;	/* wasn't unsigned before? */
++  int sign = src->sign;
++  int exp = 0;
++
++  if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
++    {
++      /* We can't represent these values accurately.  By using the
++	 largest possible magnitude, we guarantee that the conversion
++	 of infinity is at least as big as any finite number.  */
++      exp = EXPMAX;
++      fraction = ((fractype) 1 << FRACBITS) - 1;
++    }
++  else if (isnan (src))
++    {
++      exp = EXPMAX;
++      if (src->class == CLASS_QNAN || 1)
++	{
++#ifdef QUIET_NAN_NEGATED
++	  fraction |= QUIET_NAN - 1;
++#else
++	  fraction |= QUIET_NAN;
++#endif
++	}
++    }
++  else if (isinf (src))
++    {
++      exp = EXPMAX;
++      fraction = 0;
++    }
++  else if (iszero (src))
++    {
++      exp = 0;
++      fraction = 0;
++    }
++  else if (fraction == 0)
++    {
++      exp = 0;
++    }
++  else
++    {
++      if (src->normal_exp < NORMAL_EXPMIN)
++	{
++#ifdef NO_DENORMALS
++	  /* Go straight to a zero representation if denormals are not
++ 	     supported.  The denormal handling would be harmless but
++ 	     isn't unnecessary.  */
++	  exp = 0;
++	  fraction = 0;
++#else /* NO_DENORMALS */
++	  /* This number's exponent is too low to fit into the bits
++	     available in the number, so we'll store 0 in the exponent and
++	     shift the fraction to the right to make up for it.  */
++
++	  int shift = NORMAL_EXPMIN - src->normal_exp;
++
++	  exp = 0;
++
++	  if (shift > FRAC_NBITS - NGARDS)
++	    {
++	      /* No point shifting, since it's more that 64 out.  */
++	      fraction = 0;
++	    }
++	  else
++	    {
++	      int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
++	      fraction = (fraction >> shift) | lowbit;
++	    }
++	  if ((fraction & GARDMASK) == GARDMSB)
++	    {
++	      if ((fraction & (1 << NGARDS)))
++		fraction += GARDROUND + 1;
++	    }
++	  else
++	    {
++	      /* Add to the guards to round up.  */
++	      fraction += GARDROUND;
++	    }
++	  /* Perhaps the rounding means we now need to change the
++             exponent, because the fraction is no longer denormal.  */
++	  if (fraction >= IMPLICIT_1)
++	    {
++	      exp += 1;
++	    }
++	  fraction >>= NGARDS;
++#endif /* NO_DENORMALS */
++	}
++      else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
++	       && src->normal_exp > EXPBIAS)
++	{
++	  exp = EXPMAX;
++	  fraction = 0;
++	}
++      else
++	{
++	  exp = src->normal_exp + EXPBIAS;
++	  if (!ROUND_TOWARDS_ZERO)
++	    {
++	      /* IF the gard bits are the all zero, but the first, then we're
++		 half way between two numbers, choose the one which makes the
++		 lsb of the answer 0.  */
++	      if ((fraction & GARDMASK) == GARDMSB)
++		{
++		  if (fraction & (1 << NGARDS))
++		    fraction += GARDROUND + 1;
++		}
++	      else
++		{
++		  /* Add a one to the guards to round up */
++		  fraction += GARDROUND;
++		}
++	      if (fraction >= IMPLICIT_2)
++		{
++		  fraction >>= 1;
++		  exp += 1;
++		}
++	    }
++	  fraction >>= NGARDS;
++
++	  if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
++	    {
++	      /* Saturate on overflow.  */
++	      exp = EXPMAX;
++	      fraction = ((fractype) 1 << FRACBITS) - 1;
++	    }
++	}
++    }
++
++  /* We previously used bitfields to store the number, but this doesn't
++     handle little/big endian systems conveniently, so use shifts and
++     masks */
++#ifdef FLOAT_BIT_ORDER_MISMATCH
++  dst.bits.fraction = fraction;
++  dst.bits.exp = exp;
++  dst.bits.sign = sign;
++#else
++# if defined TFLOAT && defined HALFFRACBITS
++ {
++   halffractype high, low, unity;
++   int lowsign, lowexp;
++
++   unity = (halffractype) 1 << HALFFRACBITS;
++
++   /* Set HIGH to the high double's significand, masking out the implicit 1.
++      Set LOW to the low double's full significand.  */
++   high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
++   low = fraction & (unity * 2 - 1);
++
++   /* Get the initial sign and exponent of the low double.  */
++   lowexp = exp - HALFFRACBITS - 1;
++   lowsign = sign;
++
++   /* HIGH should be rounded like a normal double, making |LOW| <=
++      0.5 ULP of HIGH.  Assume round-to-nearest.  */
++   if (exp < EXPMAX)
++     if (low > unity || (low == unity && (high & 1) == 1))
++       {
++	 /* Round HIGH up and adjust LOW to match.  */
++	 high++;
++	 if (high == unity)
++	   {
++	     /* May make it infinite, but that's OK.  */
++	     high = 0;
++	     exp++;
++	   }
++	 low = unity * 2 - low;
++	 lowsign ^= 1;
++       }
++
++   high |= (halffractype) exp << HALFFRACBITS;
++   high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
++
++   if (exp == EXPMAX || exp == 0 || low == 0)
++     low = 0;
++   else
++     {
++       while (lowexp > 0 && low < unity)
++	 {
++	   low <<= 1;
++	   lowexp--;
++	 }
++
++       if (lowexp <= 0)
++	 {
++	   halffractype roundmsb, round;
++	   int shift;
++
++	   shift = 1 - lowexp;
++	   roundmsb = (1 << (shift - 1));
++	   round = low & ((roundmsb << 1) - 1);
++
++	   low >>= shift;
++	   lowexp = 0;
++
++	   if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
++	     {
++	       low++;
++	       if (low == unity)
++		 /* LOW rounds up to the smallest normal number.  */
++		 lowexp++;
++	     }
++	 }
++
++       low &= unity - 1;
++       low |= (halffractype) lowexp << HALFFRACBITS;
++       low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
++     }
++   dst.value_raw = ((fractype) high << HALFSHIFT) | low;
++ }
++# else
++  dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
++  dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
++  dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
++# endif
++#endif
++
++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
++#ifdef TFLOAT
++  {
++    qrtrfractype tmp1 = dst.words[0];
++    qrtrfractype tmp2 = dst.words[1];
++    dst.words[0] = dst.words[3];
++    dst.words[1] = dst.words[2];
++    dst.words[2] = tmp2;
++    dst.words[3] = tmp1;
++  }
++#else
++  {
++    halffractype tmp = dst.words[0];
++    dst.words[0] = dst.words[1];
++    dst.words[1] = tmp;
++  }
++#endif
++#endif
++
++  return dst.value;
++}
++#endif
++
++#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
++void
++unpack_d (FLO_union_type * src, fp_number_type * dst)
++{
++  /* We previously used bitfields to store the number, but this doesn't
++     handle little/big endian systems conveniently, so use shifts and
++     masks */
++  fractype fraction;
++  int exp;
++  int sign;
++
++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
++  FLO_union_type swapped;
++
++#ifdef TFLOAT
++  swapped.words[0] = src->words[3];
++  swapped.words[1] = src->words[2];
++  swapped.words[2] = src->words[1];
++  swapped.words[3] = src->words[0];
++#else
++  swapped.words[0] = src->words[1];
++  swapped.words[1] = src->words[0];
++#endif
++  src = &swapped;
++#endif
++  
++#ifdef FLOAT_BIT_ORDER_MISMATCH
++  fraction = src->bits.fraction;
++  exp = src->bits.exp;
++  sign = src->bits.sign;
++#else
++# if defined TFLOAT && defined HALFFRACBITS
++ {
++   halffractype high, low;
++   
++   high = src->value_raw >> HALFSHIFT;
++   low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
++
++   fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
++   fraction <<= FRACBITS - HALFFRACBITS;
++   exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
++   sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
++
++   if (exp != EXPMAX && exp != 0 && low != 0)
++     {
++       int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
++       int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
++       int shift;
++       fractype xlow;
++
++       xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
++       if (lowexp)
++	 xlow |= (((halffractype)1) << HALFFRACBITS);
++       else
++	 lowexp = 1;
++       shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
++       if (shift > 0)
++	 xlow <<= shift;
++       else if (shift < 0)
++	 xlow >>= -shift;
++       if (sign == lowsign)
++	 fraction += xlow;
++       else if (fraction >= xlow)
++	 fraction -= xlow;
++       else
++	 {
++	   /* The high part is a power of two but the full number is lower.
++	      This code will leave the implicit 1 in FRACTION, but we'd
++	      have added that below anyway.  */
++	   fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
++	   exp--;
++	 }
++     }
++ }
++# else
++  fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
++  exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
++  sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
++# endif
++#endif
++
++  dst->sign = sign;
++  if (exp == 0)
++    {
++      /* Hmm.  Looks like 0 */
++      if (fraction == 0
++#ifdef NO_DENORMALS
++	  || 1
++#endif
++	  )
++	{
++	  /* tastes like zero */
++	  dst->class = CLASS_ZERO;
++	}
++      else
++	{
++	  /* Zero exponent with nonzero fraction - it's denormalized,
++	     so there isn't a leading implicit one - we'll shift it so
++	     it gets one.  */
++	  dst->normal_exp = exp - EXPBIAS + 1;
++	  fraction <<= NGARDS;
++
++	  dst->class = CLASS_NUMBER;
++#if 1
++	  while (fraction < IMPLICIT_1)
++	    {
++	      fraction <<= 1;
++	      dst->normal_exp--;
++	    }
++#endif
++	  dst->fraction.ll = fraction;
++	}
++    }
++  else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
++    {
++      /* Huge exponent*/
++      if (fraction == 0)
++	{
++	  /* Attached to a zero fraction - means infinity */
++	  dst->class = CLASS_INFINITY;
++	}
++      else
++	{
++	  /* Nonzero fraction, means nan */
++#ifdef QUIET_NAN_NEGATED
++	  if ((fraction & QUIET_NAN) == 0)
++#else
++	  if (fraction & QUIET_NAN)
++#endif
++	    {
++	      dst->class = CLASS_QNAN;
++	    }
++	  else
++	    {
++	      dst->class = CLASS_SNAN;
++	    }
++	  /* Keep the fraction part as the nan number */
++	  dst->fraction.ll = fraction;
++	}
++    }
++  else
++    {
++      /* Nothing strange about this number */
++      dst->normal_exp = exp - EXPBIAS;
++      dst->class = CLASS_NUMBER;
++      dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
++    }
++}
++#endif /* L_unpack_df || L_unpack_sf */
++
++#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
++static fp_number_type *
++_fpadd_parts (fp_number_type * a,
++	      fp_number_type * b,
++	      fp_number_type * tmp)
++{
++  intfrac tfraction;
++
++  /* Put commonly used fields in local variables.  */
++  int a_normal_exp;
++  int b_normal_exp;
++  fractype a_fraction;
++  fractype b_fraction;
++
++  if (isnan (a))
++    {
++      return a;
++    }
++  if (isnan (b))
++    {
++      return b;
++    }
++  if (isinf (a))
++    {
++      /* Adding infinities with opposite signs yields a NaN.  */
++      if (isinf (b) && a->sign != b->sign)
++	return nan ();
++      return a;
++    }
++  if (isinf (b))
++    {
++      return b;
++    }
++  if (iszero (b))
++    {
++      if (iszero (a))
++	{
++	  *tmp = *a;
++	  tmp->sign = a->sign & b->sign;
++	  return tmp;
++	}
++      return a;
++    }
++  if (iszero (a))
++    {
++      return b;
++    }
++
++  /* Got two numbers. shift the smaller and increment the exponent till
++     they're the same */
++  {
++    int diff;
++
++    a_normal_exp = a->normal_exp;
++    b_normal_exp = b->normal_exp;
++    a_fraction = a->fraction.ll;
++    b_fraction = b->fraction.ll;
++
++    diff = a_normal_exp - b_normal_exp;
++
++    if (diff < 0)
++      diff = -diff;
++    if (diff < FRAC_NBITS)
++      {
++	/* ??? This does shifts one bit at a time.  Optimize.  */
++	while (a_normal_exp > b_normal_exp)
++	  {
++	    b_normal_exp++;
++	    LSHIFT (b_fraction);
++	  }
++	while (b_normal_exp > a_normal_exp)
++	  {
++	    a_normal_exp++;
++	    LSHIFT (a_fraction);
++	  }
++      }
++    else
++      {
++	/* Somethings's up.. choose the biggest */
++	if (a_normal_exp > b_normal_exp)
++	  {
++	    b_normal_exp = a_normal_exp;
++	    b_fraction = 0;
++	  }
++	else
++	  {
++	    a_normal_exp = b_normal_exp;
++	    a_fraction = 0;
++	  }
++      }
++  }
++
++  if (a->sign != b->sign)
++    {
++      if (a->sign)
++	{
++	  tfraction = -a_fraction + b_fraction;
++	}
++      else
++	{
++	  tfraction = a_fraction - b_fraction;
++	}
++      if (tfraction >= 0)
++	{
++	  tmp->sign = 0;
++	  tmp->normal_exp = a_normal_exp;
++	  tmp->fraction.ll = tfraction;
++	}
++      else
++	{
++	  tmp->sign = 1;
++	  tmp->normal_exp = a_normal_exp;
++	  tmp->fraction.ll = -tfraction;
++	}
++      /* and renormalize it */
++
++      while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
++	{
++	  tmp->fraction.ll <<= 1;
++	  tmp->normal_exp--;
++	}
++    }
++  else
++    {
++      tmp->sign = a->sign;
++      tmp->normal_exp = a_normal_exp;
++      tmp->fraction.ll = a_fraction + b_fraction;
++    }
++  tmp->class = CLASS_NUMBER;
++  /* Now the fraction is added, we have to shift down to renormalize the
++     number */
++
++  if (tmp->fraction.ll >= IMPLICIT_2)
++    {
++      LSHIFT (tmp->fraction.ll);
++      tmp->normal_exp++;
++    }
++  return tmp;
++
++}
++
++FLO_type
++add (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpadd_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++
++FLO_type
++sub (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  b.sign ^= 1;
++
++  res = _fpadd_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++#endif /* L_addsub_sf || L_addsub_df */
++
++#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
++static inline __attribute__ ((__always_inline__)) fp_number_type *
++_fpmul_parts ( fp_number_type *  a,
++	       fp_number_type *  b,
++	       fp_number_type * tmp)
++{
++  fractype low = 0;
++  fractype high = 0;
++
++  if (isnan (a))
++    {
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (isnan (b))
++    {
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++  if (isinf (a))
++    {
++      if (iszero (b))
++	return nan ();
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (isinf (b))
++    {
++      if (iszero (a))
++	{
++	  return nan ();
++	}
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++  if (iszero (a))
++    {
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (iszero (b))
++    {
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++
++  /* Calculate the mantissa by multiplying both numbers to get a
++     twice-as-wide number.  */
++  {
++#if defined(NO_DI_MODE) || defined(TFLOAT)
++    {
++      fractype x = a->fraction.ll;
++      fractype ylow = b->fraction.ll;
++      fractype yhigh = 0;
++      int bit;
++
++      /* ??? This does multiplies one bit at a time.  Optimize.  */
++      for (bit = 0; bit < FRAC_NBITS; bit++)
++	{
++	  int carry;
++
++	  if (x & 1)
++	    {
++	      carry = (low += ylow) < ylow;
++	      high += yhigh + carry;
++	    }
++	  yhigh <<= 1;
++	  if (ylow & FRACHIGH)
++	    {
++	      yhigh |= 1;
++	    }
++	  ylow <<= 1;
++	  x >>= 1;
++	}
++    }
++#elif defined(FLOAT) 
++    /* Multiplying two USIs to get a UDI, we're safe.  */
++    {
++      UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
++      
++      high = answer >> BITS_PER_SI;
++      low = answer;
++    }
++#else
++    /* fractype is DImode, but we need the result to be twice as wide.
++       Assuming a widening multiply from DImode to TImode is not
++       available, build one by hand.  */
++    {
++      USItype nl = a->fraction.ll;
++      USItype nh = a->fraction.ll >> BITS_PER_SI;
++      USItype ml = b->fraction.ll;
++      USItype mh = b->fraction.ll >> BITS_PER_SI;
++      UDItype pp_ll = (UDItype) ml * nl;
++      UDItype pp_hl = (UDItype) mh * nl;
++      UDItype pp_lh = (UDItype) ml * nh;
++      UDItype pp_hh = (UDItype) mh * nh;
++      UDItype res2 = 0;
++      UDItype res0 = 0;
++      UDItype ps_hh__ = pp_hl + pp_lh;
++      if (ps_hh__ < pp_hl)
++	res2 += (UDItype)1 << BITS_PER_SI;
++      pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
++      res0 = pp_ll + pp_hl;
++      if (res0 < pp_ll)
++	res2++;
++      res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
++      high = res2;
++      low = res0;
++    }
++#endif
++  }
++
++  tmp->normal_exp = a->normal_exp + b->normal_exp
++    + FRAC_NBITS - (FRACBITS + NGARDS);
++  tmp->sign = a->sign != b->sign;
++  while (high >= IMPLICIT_2)
++    {
++      tmp->normal_exp++;
++      if (high & 1)
++	{
++	  low >>= 1;
++	  low |= FRACHIGH;
++	}
++      high >>= 1;
++    }
++  while (high < IMPLICIT_1)
++    {
++      tmp->normal_exp--;
++
++      high <<= 1;
++      if (low & FRACHIGH)
++	high |= 1;
++      low <<= 1;
++    }
++  /* rounding is tricky. if we only round if it won't make us round later.  */
++#if 0
++  if (low & FRACHIGH2)
++    {
++      if (((high & GARDMASK) != GARDMSB)
++	  && (((high + 1) & GARDMASK) == GARDMSB))
++	{
++	  /* don't round, it gets done again later.  */
++	}
++      else
++	{
++	  high++;
++	}
++    }
++#endif
++  if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
++    {
++      if (high & (1 << NGARDS))
++	{
++	  /* half way, so round to even */
++	  high += GARDROUND + 1;
++	}
++      else if (low)
++	{
++	  /* but we really weren't half way */
++	  high += GARDROUND + 1;
++	}
++    }
++  tmp->fraction.ll = high;
++  tmp->class = CLASS_NUMBER;
++  return tmp;
++}
++
++FLO_type
++multiply (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpmul_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++#endif /* L_mul_sf || L_mul_df */
++
++#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
++static inline __attribute__ ((__always_inline__)) fp_number_type *
++_fpdiv_parts (fp_number_type * a,
++	      fp_number_type * b)
++{
++  fractype bit;
++  fractype numerator;
++  fractype denominator;
++  fractype quotient;
++
++  if (isnan (a))
++    {
++      return a;
++    }
++  if (isnan (b))
++    {
++      return b;
++    }
++
++  a->sign = a->sign ^ b->sign;
++
++  if (isinf (a) || iszero (a))
++    {
++      if (a->class == b->class)
++	return nan ();
++      return a;
++    }
++
++  if (isinf (b))
++    {
++      a->fraction.ll = 0;
++      a->normal_exp = 0;
++      return a;
++    }
++  if (iszero (b))
++    {
++      a->class = CLASS_INFINITY;
++      return a;
++    }
++
++  /* Calculate the mantissa by multiplying both 64bit numbers to get a
++     128 bit number */
++  {
++    /* quotient =
++       ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
++     */
++
++    a->normal_exp = a->normal_exp - b->normal_exp;
++    numerator = a->fraction.ll;
++    denominator = b->fraction.ll;
++
++    if (numerator < denominator)
++      {
++	/* Fraction will be less than 1.0 */
++	numerator *= 2;
++	a->normal_exp--;
++      }
++    bit = IMPLICIT_1;
++    quotient = 0;
++    /* ??? Does divide one bit at a time.  Optimize.  */
++    while (bit)
++      {
++	if (numerator >= denominator)
++	  {
++	    quotient |= bit;
++	    numerator -= denominator;
++	  }
++	bit >>= 1;
++	numerator *= 2;
++      }
++
++    if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
++      {
++	if (quotient & (1 << NGARDS))
++	  {
++	    /* half way, so round to even */
++	    quotient += GARDROUND + 1;
++	  }
++	else if (numerator)
++	  {
++	    /* but we really weren't half way, more bits exist */
++	    quotient += GARDROUND + 1;
++	  }
++      }
++
++    a->fraction.ll = quotient;
++    return (a);
++  }
++}
++
++FLO_type
++divide (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpdiv_parts (&a, &b);
++
++  return pack_d (res);
++}
++#endif /* L_div_sf || L_div_df */
++
++#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
++    || defined(L_fpcmp_parts_tf)
++/* according to the demo, fpcmp returns a comparison with 0... thus
++   a<b -> -1
++   a==b -> 0
++   a>b -> +1
++ */
++
++int
++__fpcmp_parts (fp_number_type * a, fp_number_type * b)
++{
++#if 0
++  /* either nan -> unordered. Must be checked outside of this routine.  */
++  if (isnan (a) && isnan (b))
++    {
++      return 1;			/* still unordered! */
++    }
++#endif
++
++  if (isnan (a) || isnan (b))
++    {
++      return 1;			/* how to indicate unordered compare? */
++    }
++  if (isinf (a) && isinf (b))
++    {
++      /* +inf > -inf, but +inf != +inf */
++      /* b    \a| +inf(0)| -inf(1)
++       ______\+--------+--------
++       +inf(0)| a==b(0)| a<b(-1)
++       -------+--------+--------
++       -inf(1)| a>b(1) | a==b(0)
++       -------+--------+--------
++       So since unordered must be nonzero, just line up the columns...
++       */
++      return b->sign - a->sign;
++    }
++  /* but not both...  */
++  if (isinf (a))
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (isinf (b))
++    {
++      return b->sign ? 1 : -1;
++    }
++  if (iszero (a) && iszero (b))
++    {
++      return 0;
++    }
++  if (iszero (a))
++    {
++      return b->sign ? 1 : -1;
++    }
++  if (iszero (b))
++    {
++      return a->sign ? -1 : 1;
++    }
++  /* now both are "normal".  */
++  if (a->sign != b->sign)
++    {
++      /* opposite signs */
++      return a->sign ? -1 : 1;
++    }
++  /* same sign; exponents? */
++  if (a->normal_exp > b->normal_exp)
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (a->normal_exp < b->normal_exp)
++    {
++      return a->sign ? 1 : -1;
++    }
++  /* same exponents; check size.  */
++  if (a->fraction.ll > b->fraction.ll)
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (a->fraction.ll < b->fraction.ll)
++    {
++      return a->sign ? 1 : -1;
++    }
++  /* after all that, they're equal.  */
++  return 0;
++}
++#endif
++
++#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
++CMPtype
++compare (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_compare_sf || L_compare_df */
++
++#ifndef US_SOFTWARE_GOFAST
++
++/* These should be optimized for their specific tasks someday.  */
++
++#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
++CMPtype
++_eq_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth == 0 */
++
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_eq_sf || L_eq_df */
++
++#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
++CMPtype
++_ne_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* true, truth != 0 */
++
++  return  __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_ne_sf || L_ne_df */
++
++#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
++CMPtype
++_gt_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return -1;			/* false, truth > 0 */
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_gt_sf || L_gt_df */
++
++#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
++CMPtype
++_ge_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return -1;			/* false, truth >= 0 */
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_ge_sf || L_ge_df */
++
++#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
++CMPtype
++_lt_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth < 0 */
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_lt_sf || L_lt_df */
++
++#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
++CMPtype
++_le_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth <= 0 */
++
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_le_sf || L_le_df */
++
++#endif /* ! US_SOFTWARE_GOFAST */
++
++#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
++CMPtype
++_unord_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  return (isnan (&a) || isnan (&b));
++}
++#endif /* L_unord_sf || L_unord_df */
++
++#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
++FLO_type
++si_to_float (SItype arg_a)
++{
++  fp_number_type in;
++
++  in.class = CLASS_NUMBER;
++  in.sign = arg_a < 0;
++  if (!arg_a)
++    {
++      in.class = CLASS_ZERO;
++    }
++  else
++    {
++      in.normal_exp = FRACBITS + NGARDS;
++      if (in.sign) 
++	{
++	  /* Special case for minint, since there is no +ve integer
++	     representation for it */
++	  if (arg_a == (- MAX_SI_INT - 1))
++	    {
++	      return (FLO_type)(- MAX_SI_INT - 1);
++	    }
++	  in.fraction.ll = (-arg_a);
++	}
++      else
++	in.fraction.ll = arg_a;
++
++      while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
++	{
++	  in.fraction.ll <<= 1;
++	  in.normal_exp -= 1;
++	}
++    }
++  return pack_d (&in);
++}
++#endif /* L_si_to_sf || L_si_to_df */
++
++#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
++FLO_type
++usi_to_float (USItype arg_a)
++{
++  fp_number_type in;
++
++  in.sign = 0;
++  if (!arg_a)
++    {
++      in.class = CLASS_ZERO;
++    }
++  else
++    {
++      in.class = CLASS_NUMBER;
++      in.normal_exp = FRACBITS + NGARDS;
++      in.fraction.ll = arg_a;
++
++      while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
++        {
++          in.fraction.ll >>= 1;
++          in.normal_exp += 1;
++        }
++      while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
++	{
++	  in.fraction.ll <<= 1;
++	  in.normal_exp -= 1;
++	}
++    }
++  return pack_d (&in);
++}
++#endif
++
++#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
++SItype
++float_to_si (FLO_type arg_a)
++{
++  fp_number_type a;
++  SItype tmp;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  if (iszero (&a))
++    return 0;
++  if (isnan (&a))
++    return 0;
++  /* get reasonable MAX_SI_INT...  */
++  if (isinf (&a))
++    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
++  /* it is a number, but a small one */
++  if (a.normal_exp < 0)
++    return 0;
++  if (a.normal_exp > BITS_PER_SI - 2)
++    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
++  tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
++  return a.sign ? (-tmp) : (tmp);
++}
++#endif /* L_sf_to_si || L_df_to_si */
++
++#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
++#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
++/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
++   we also define them for GOFAST because the ones in libgcc2.c have the
++   wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
++   out of libgcc2.c.  We can't define these here if not GOFAST because then
++   there'd be duplicate copies.  */
++
++USItype
++float_to_usi (FLO_type arg_a)
++{
++  fp_number_type a;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  if (iszero (&a))
++    return 0;
++  if (isnan (&a))
++    return 0;
++  /* it is a negative number */
++  if (a.sign)
++    return 0;
++  /* get reasonable MAX_USI_INT...  */
++  if (isinf (&a))
++    return MAX_USI_INT;
++  /* it is a number, but a small one */
++  if (a.normal_exp < 0)
++    return 0;
++  if (a.normal_exp > BITS_PER_SI - 1)
++    return MAX_USI_INT;
++  else if (a.normal_exp > (FRACBITS + NGARDS))
++    return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
++  else
++    return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
++}
++#endif /* US_SOFTWARE_GOFAST */
++#endif /* L_sf_to_usi || L_df_to_usi */
++
++#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
++FLO_type
++negate (FLO_type arg_a)
++{
++  fp_number_type a;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  flip_sign (&a);
++  return pack_d (&a);
++}
++#endif /* L_negate_sf || L_negate_df */
++
++#ifdef FLOAT
++
++#if defined(L_make_sf)
++SFtype
++__make_fp(fp_class_type class,
++	     unsigned int sign,
++	     int exp, 
++	     USItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_sf */
++
++#ifndef FLOAT_ONLY
++
++/* This enables one to build an fp library that supports float but not double.
++   Otherwise, we would get an undefined reference to __make_dp.
++   This is needed for some 8-bit ports that can't handle well values that
++   are 8-bytes in size, so we just don't support double for them at all.  */
++
++#if defined(L_sf_to_df)
++DFtype
++sf_to_df (SFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_dp (in.class, in.sign, in.normal_exp,
++		    ((UDItype) in.fraction.ll) << F_D_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#if defined(L_sf_to_tf) && defined(TMODES)
++TFtype
++sf_to_tf (SFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_tp (in.class, in.sign, in.normal_exp,
++		    ((UTItype) in.fraction.ll) << F_T_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#endif /* ! FLOAT_ONLY */
++#endif /* FLOAT */
++
++#ifndef FLOAT
++
++extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
++
++#if defined(L_make_df)
++DFtype
++__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_df */
++
++#if defined(L_df_to_sf)
++SFtype
++df_to_sf (DFtype arg_a)
++{
++  fp_number_type in;
++  USItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> F_D_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_df_to_sf */
++
++#if defined(L_df_to_tf) && defined(TMODES) \
++    && !defined(FLOAT) && !defined(TFLOAT)
++TFtype
++df_to_tf (DFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_tp (in.class, in.sign, in.normal_exp,
++		    ((UTItype) in.fraction.ll) << D_T_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#ifdef TFLOAT
++#if defined(L_make_tf)
++TFtype
++__make_tp(fp_class_type class,
++	     unsigned int sign,
++	     int exp, 
++	     UTItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_tf */
++
++#if defined(L_tf_to_df)
++DFtype
++tf_to_df (TFtype arg_a)
++{
++  fp_number_type in;
++  UDItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> D_T_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_tf_to_df */
++
++#if defined(L_tf_to_sf)
++SFtype
++tf_to_sf (TFtype arg_a)
++{
++  fp_number_type in;
++  USItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> F_T_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_tf_to_sf */
++#endif /* TFLOAT */
++
++#endif /* ! FLOAT */
++#endif /* !EXTENDED_FLOAT_STUBS */
+--- gcc-3.4.3/gcc/config/nios2/nios2-fp-bit.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-fp-bit.c
+@@ -0,0 +1,1652 @@
++#define FLOAT
++/* This is a software floating point library which can be used
++   for targets without hardware floating point. 
++   Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004
++   Free Software Foundation, Inc.
++
++This file 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.
++
++In addition to the permissions in the GNU General Public License, the
++Free Software Foundation gives you unlimited permission to link the
++compiled version of this file with other programs, and to distribute
++those programs without any restriction coming from the use of this
++file.  (The General Public License restrictions do apply in other
++respects; for example, they cover modification of the file, and
++distribution when not linked into another program.)
++
++This file 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; see the file COPYING.  If not, write to
++the Free Software Foundation, 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA.  */
++
++/* As a special exception, if you link this library with other files,
++   some of which are compiled with GCC, to produce an executable,
++   this library does not by itself cause the resulting executable
++   to be covered by the GNU General Public License.
++   This exception does not however invalidate any other reasons why
++   the executable file might be covered by the GNU General Public License.  */
++
++/* This implements IEEE 754 format arithmetic, but does not provide a
++   mechanism for setting the rounding mode, or for generating or handling
++   exceptions.
++
++   The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
++   Wilson, all of Cygnus Support.  */
++
++/* The intended way to use this file is to make two copies, add `#define FLOAT'
++   to one copy, then compile both copies and add them to libgcc.a.  */
++
++#include "tconfig.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "config/fp-bit.h"
++
++/* The following macros can be defined to change the behavior of this file:
++   FLOAT: Implement a `float', aka SFmode, fp library.  If this is not
++     defined, then this file implements a `double', aka DFmode, fp library.
++   FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
++     don't include float->double conversion which requires the double library.
++     This is useful only for machines which can't support doubles, e.g. some
++     8-bit processors.
++   CMPtype: Specify the type that floating point compares should return.
++     This defaults to SItype, aka int.
++   US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
++     US Software goFast library.
++   _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
++     two integers to the FLO_union_type.
++   NO_DENORMALS: Disable handling of denormals.
++   NO_NANS: Disable nan and infinity handling
++   SMALL_MACHINE: Useful when operations on QIs and HIs are faster
++     than on an SI */
++
++/* We don't currently support extended floats (long doubles) on machines
++   without hardware to deal with them.
++
++   These stubs are just to keep the linker from complaining about unresolved
++   references which can be pulled in from libio & libstdc++, even if the
++   user isn't using long doubles.  However, they may generate an unresolved
++   external to abort if abort is not used by the function, and the stubs
++   are referenced from within libc, since libgcc goes before and after the
++   system library.  */
++
++#ifdef DECLARE_LIBRARY_RENAMES
++  DECLARE_LIBRARY_RENAMES
++#endif
++
++#ifdef EXTENDED_FLOAT_STUBS
++extern void abort (void);
++void __extendsfxf2 (void) { abort(); }
++void __extenddfxf2 (void) { abort(); }
++void __truncxfdf2 (void) { abort(); }
++void __truncxfsf2 (void) { abort(); }
++void __fixxfsi (void) { abort(); }
++void __floatsixf (void) { abort(); }
++void __addxf3 (void) { abort(); }
++void __subxf3 (void) { abort(); }
++void __mulxf3 (void) { abort(); }
++void __divxf3 (void) { abort(); }
++void __negxf2 (void) { abort(); }
++void __eqxf2 (void) { abort(); }
++void __nexf2 (void) { abort(); }
++void __gtxf2 (void) { abort(); }
++void __gexf2 (void) { abort(); }
++void __lexf2 (void) { abort(); }
++void __ltxf2 (void) { abort(); }
++
++void __extendsftf2 (void) { abort(); }
++void __extenddftf2 (void) { abort(); }
++void __trunctfdf2 (void) { abort(); }
++void __trunctfsf2 (void) { abort(); }
++void __fixtfsi (void) { abort(); }
++void __floatsitf (void) { abort(); }
++void __addtf3 (void) { abort(); }
++void __subtf3 (void) { abort(); }
++void __multf3 (void) { abort(); }
++void __divtf3 (void) { abort(); }
++void __negtf2 (void) { abort(); }
++void __eqtf2 (void) { abort(); }
++void __netf2 (void) { abort(); }
++void __gttf2 (void) { abort(); }
++void __getf2 (void) { abort(); }
++void __letf2 (void) { abort(); }
++void __lttf2 (void) { abort(); }
++#else	/* !EXTENDED_FLOAT_STUBS, rest of file */
++
++/* IEEE "special" number predicates */
++
++#ifdef NO_NANS
++
++#define nan() 0
++#define isnan(x) 0
++#define isinf(x) 0
++#else
++
++#if   defined L_thenan_sf
++const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined L_thenan_df
++const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined L_thenan_tf
++const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
++#elif defined TFLOAT
++extern const fp_number_type __thenan_tf;
++#elif defined FLOAT
++extern const fp_number_type __thenan_sf;
++#else
++extern const fp_number_type __thenan_df;
++#endif
++
++INLINE
++static fp_number_type *
++nan (void)
++{
++  /* Discard the const qualifier...  */
++#ifdef TFLOAT
++  return (fp_number_type *) (& __thenan_tf);
++#elif defined FLOAT  
++  return (fp_number_type *) (& __thenan_sf);
++#else
++  return (fp_number_type *) (& __thenan_df);
++#endif
++}
++
++INLINE
++static int
++isnan ( fp_number_type *  x)
++{
++  return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
++}
++
++INLINE
++static int
++isinf ( fp_number_type *  x)
++{
++  return x->class == CLASS_INFINITY;
++}
++
++#endif /* NO_NANS */
++
++INLINE
++static int
++iszero ( fp_number_type *  x)
++{
++  return x->class == CLASS_ZERO;
++}
++
++INLINE 
++static void
++flip_sign ( fp_number_type *  x)
++{
++  x->sign = !x->sign;
++}
++
++extern FLO_type pack_d ( fp_number_type * );
++
++#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
++FLO_type
++pack_d ( fp_number_type *  src)
++{
++  FLO_union_type dst;
++  fractype fraction = src->fraction.ll;	/* wasn't unsigned before? */
++  int sign = src->sign;
++  int exp = 0;
++
++  if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src)))
++    {
++      /* We can't represent these values accurately.  By using the
++	 largest possible magnitude, we guarantee that the conversion
++	 of infinity is at least as big as any finite number.  */
++      exp = EXPMAX;
++      fraction = ((fractype) 1 << FRACBITS) - 1;
++    }
++  else if (isnan (src))
++    {
++      exp = EXPMAX;
++      if (src->class == CLASS_QNAN || 1)
++	{
++#ifdef QUIET_NAN_NEGATED
++	  fraction |= QUIET_NAN - 1;
++#else
++	  fraction |= QUIET_NAN;
++#endif
++	}
++    }
++  else if (isinf (src))
++    {
++      exp = EXPMAX;
++      fraction = 0;
++    }
++  else if (iszero (src))
++    {
++      exp = 0;
++      fraction = 0;
++    }
++  else if (fraction == 0)
++    {
++      exp = 0;
++    }
++  else
++    {
++      if (src->normal_exp < NORMAL_EXPMIN)
++	{
++#ifdef NO_DENORMALS
++	  /* Go straight to a zero representation if denormals are not
++ 	     supported.  The denormal handling would be harmless but
++ 	     isn't unnecessary.  */
++	  exp = 0;
++	  fraction = 0;
++#else /* NO_DENORMALS */
++	  /* This number's exponent is too low to fit into the bits
++	     available in the number, so we'll store 0 in the exponent and
++	     shift the fraction to the right to make up for it.  */
++
++	  int shift = NORMAL_EXPMIN - src->normal_exp;
++
++	  exp = 0;
++
++	  if (shift > FRAC_NBITS - NGARDS)
++	    {
++	      /* No point shifting, since it's more that 64 out.  */
++	      fraction = 0;
++	    }
++	  else
++	    {
++	      int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
++	      fraction = (fraction >> shift) | lowbit;
++	    }
++	  if ((fraction & GARDMASK) == GARDMSB)
++	    {
++	      if ((fraction & (1 << NGARDS)))
++		fraction += GARDROUND + 1;
++	    }
++	  else
++	    {
++	      /* Add to the guards to round up.  */
++	      fraction += GARDROUND;
++	    }
++	  /* Perhaps the rounding means we now need to change the
++             exponent, because the fraction is no longer denormal.  */
++	  if (fraction >= IMPLICIT_1)
++	    {
++	      exp += 1;
++	    }
++	  fraction >>= NGARDS;
++#endif /* NO_DENORMALS */
++	}
++      else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS)
++	       && src->normal_exp > EXPBIAS)
++	{
++	  exp = EXPMAX;
++	  fraction = 0;
++	}
++      else
++	{
++	  exp = src->normal_exp + EXPBIAS;
++	  if (!ROUND_TOWARDS_ZERO)
++	    {
++	      /* IF the gard bits are the all zero, but the first, then we're
++		 half way between two numbers, choose the one which makes the
++		 lsb of the answer 0.  */
++	      if ((fraction & GARDMASK) == GARDMSB)
++		{
++		  if (fraction & (1 << NGARDS))
++		    fraction += GARDROUND + 1;
++		}
++	      else
++		{
++		  /* Add a one to the guards to round up */
++		  fraction += GARDROUND;
++		}
++	      if (fraction >= IMPLICIT_2)
++		{
++		  fraction >>= 1;
++		  exp += 1;
++		}
++	    }
++	  fraction >>= NGARDS;
++
++	  if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX)
++	    {
++	      /* Saturate on overflow.  */
++	      exp = EXPMAX;
++	      fraction = ((fractype) 1 << FRACBITS) - 1;
++	    }
++	}
++    }
++
++  /* We previously used bitfields to store the number, but this doesn't
++     handle little/big endian systems conveniently, so use shifts and
++     masks */
++#ifdef FLOAT_BIT_ORDER_MISMATCH
++  dst.bits.fraction = fraction;
++  dst.bits.exp = exp;
++  dst.bits.sign = sign;
++#else
++# if defined TFLOAT && defined HALFFRACBITS
++ {
++   halffractype high, low, unity;
++   int lowsign, lowexp;
++
++   unity = (halffractype) 1 << HALFFRACBITS;
++
++   /* Set HIGH to the high double's significand, masking out the implicit 1.
++      Set LOW to the low double's full significand.  */
++   high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
++   low = fraction & (unity * 2 - 1);
++
++   /* Get the initial sign and exponent of the low double.  */
++   lowexp = exp - HALFFRACBITS - 1;
++   lowsign = sign;
++
++   /* HIGH should be rounded like a normal double, making |LOW| <=
++      0.5 ULP of HIGH.  Assume round-to-nearest.  */
++   if (exp < EXPMAX)
++     if (low > unity || (low == unity && (high & 1) == 1))
++       {
++	 /* Round HIGH up and adjust LOW to match.  */
++	 high++;
++	 if (high == unity)
++	   {
++	     /* May make it infinite, but that's OK.  */
++	     high = 0;
++	     exp++;
++	   }
++	 low = unity * 2 - low;
++	 lowsign ^= 1;
++       }
++
++   high |= (halffractype) exp << HALFFRACBITS;
++   high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
++
++   if (exp == EXPMAX || exp == 0 || low == 0)
++     low = 0;
++   else
++     {
++       while (lowexp > 0 && low < unity)
++	 {
++	   low <<= 1;
++	   lowexp--;
++	 }
++
++       if (lowexp <= 0)
++	 {
++	   halffractype roundmsb, round;
++	   int shift;
++
++	   shift = 1 - lowexp;
++	   roundmsb = (1 << (shift - 1));
++	   round = low & ((roundmsb << 1) - 1);
++
++	   low >>= shift;
++	   lowexp = 0;
++
++	   if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
++	     {
++	       low++;
++	       if (low == unity)
++		 /* LOW rounds up to the smallest normal number.  */
++		 lowexp++;
++	     }
++	 }
++
++       low &= unity - 1;
++       low |= (halffractype) lowexp << HALFFRACBITS;
++       low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
++     }
++   dst.value_raw = ((fractype) high << HALFSHIFT) | low;
++ }
++# else
++  dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
++  dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
++  dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
++# endif
++#endif
++
++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
++#ifdef TFLOAT
++  {
++    qrtrfractype tmp1 = dst.words[0];
++    qrtrfractype tmp2 = dst.words[1];
++    dst.words[0] = dst.words[3];
++    dst.words[1] = dst.words[2];
++    dst.words[2] = tmp2;
++    dst.words[3] = tmp1;
++  }
++#else
++  {
++    halffractype tmp = dst.words[0];
++    dst.words[0] = dst.words[1];
++    dst.words[1] = tmp;
++  }
++#endif
++#endif
++
++  return dst.value;
++}
++#endif
++
++#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
++void
++unpack_d (FLO_union_type * src, fp_number_type * dst)
++{
++  /* We previously used bitfields to store the number, but this doesn't
++     handle little/big endian systems conveniently, so use shifts and
++     masks */
++  fractype fraction;
++  int exp;
++  int sign;
++
++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
++  FLO_union_type swapped;
++
++#ifdef TFLOAT
++  swapped.words[0] = src->words[3];
++  swapped.words[1] = src->words[2];
++  swapped.words[2] = src->words[1];
++  swapped.words[3] = src->words[0];
++#else
++  swapped.words[0] = src->words[1];
++  swapped.words[1] = src->words[0];
++#endif
++  src = &swapped;
++#endif
++  
++#ifdef FLOAT_BIT_ORDER_MISMATCH
++  fraction = src->bits.fraction;
++  exp = src->bits.exp;
++  sign = src->bits.sign;
++#else
++# if defined TFLOAT && defined HALFFRACBITS
++ {
++   halffractype high, low;
++   
++   high = src->value_raw >> HALFSHIFT;
++   low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
++
++   fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
++   fraction <<= FRACBITS - HALFFRACBITS;
++   exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
++   sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
++
++   if (exp != EXPMAX && exp != 0 && low != 0)
++     {
++       int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
++       int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
++       int shift;
++       fractype xlow;
++
++       xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
++       if (lowexp)
++	 xlow |= (((halffractype)1) << HALFFRACBITS);
++       else
++	 lowexp = 1;
++       shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
++       if (shift > 0)
++	 xlow <<= shift;
++       else if (shift < 0)
++	 xlow >>= -shift;
++       if (sign == lowsign)
++	 fraction += xlow;
++       else if (fraction >= xlow)
++	 fraction -= xlow;
++       else
++	 {
++	   /* The high part is a power of two but the full number is lower.
++	      This code will leave the implicit 1 in FRACTION, but we'd
++	      have added that below anyway.  */
++	   fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
++	   exp--;
++	 }
++     }
++ }
++# else
++  fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
++  exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
++  sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
++# endif
++#endif
++
++  dst->sign = sign;
++  if (exp == 0)
++    {
++      /* Hmm.  Looks like 0 */
++      if (fraction == 0
++#ifdef NO_DENORMALS
++	  || 1
++#endif
++	  )
++	{
++	  /* tastes like zero */
++	  dst->class = CLASS_ZERO;
++	}
++      else
++	{
++	  /* Zero exponent with nonzero fraction - it's denormalized,
++	     so there isn't a leading implicit one - we'll shift it so
++	     it gets one.  */
++	  dst->normal_exp = exp - EXPBIAS + 1;
++	  fraction <<= NGARDS;
++
++	  dst->class = CLASS_NUMBER;
++#if 1
++	  while (fraction < IMPLICIT_1)
++	    {
++	      fraction <<= 1;
++	      dst->normal_exp--;
++	    }
++#endif
++	  dst->fraction.ll = fraction;
++	}
++    }
++  else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX)
++    {
++      /* Huge exponent*/
++      if (fraction == 0)
++	{
++	  /* Attached to a zero fraction - means infinity */
++	  dst->class = CLASS_INFINITY;
++	}
++      else
++	{
++	  /* Nonzero fraction, means nan */
++#ifdef QUIET_NAN_NEGATED
++	  if ((fraction & QUIET_NAN) == 0)
++#else
++	  if (fraction & QUIET_NAN)
++#endif
++	    {
++	      dst->class = CLASS_QNAN;
++	    }
++	  else
++	    {
++	      dst->class = CLASS_SNAN;
++	    }
++	  /* Keep the fraction part as the nan number */
++	  dst->fraction.ll = fraction;
++	}
++    }
++  else
++    {
++      /* Nothing strange about this number */
++      dst->normal_exp = exp - EXPBIAS;
++      dst->class = CLASS_NUMBER;
++      dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
++    }
++}
++#endif /* L_unpack_df || L_unpack_sf */
++
++#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
++static fp_number_type *
++_fpadd_parts (fp_number_type * a,
++	      fp_number_type * b,
++	      fp_number_type * tmp)
++{
++  intfrac tfraction;
++
++  /* Put commonly used fields in local variables.  */
++  int a_normal_exp;
++  int b_normal_exp;
++  fractype a_fraction;
++  fractype b_fraction;
++
++  if (isnan (a))
++    {
++      return a;
++    }
++  if (isnan (b))
++    {
++      return b;
++    }
++  if (isinf (a))
++    {
++      /* Adding infinities with opposite signs yields a NaN.  */
++      if (isinf (b) && a->sign != b->sign)
++	return nan ();
++      return a;
++    }
++  if (isinf (b))
++    {
++      return b;
++    }
++  if (iszero (b))
++    {
++      if (iszero (a))
++	{
++	  *tmp = *a;
++	  tmp->sign = a->sign & b->sign;
++	  return tmp;
++	}
++      return a;
++    }
++  if (iszero (a))
++    {
++      return b;
++    }
++
++  /* Got two numbers. shift the smaller and increment the exponent till
++     they're the same */
++  {
++    int diff;
++
++    a_normal_exp = a->normal_exp;
++    b_normal_exp = b->normal_exp;
++    a_fraction = a->fraction.ll;
++    b_fraction = b->fraction.ll;
++
++    diff = a_normal_exp - b_normal_exp;
++
++    if (diff < 0)
++      diff = -diff;
++    if (diff < FRAC_NBITS)
++      {
++	/* ??? This does shifts one bit at a time.  Optimize.  */
++	while (a_normal_exp > b_normal_exp)
++	  {
++	    b_normal_exp++;
++	    LSHIFT (b_fraction);
++	  }
++	while (b_normal_exp > a_normal_exp)
++	  {
++	    a_normal_exp++;
++	    LSHIFT (a_fraction);
++	  }
++      }
++    else
++      {
++	/* Somethings's up.. choose the biggest */
++	if (a_normal_exp > b_normal_exp)
++	  {
++	    b_normal_exp = a_normal_exp;
++	    b_fraction = 0;
++	  }
++	else
++	  {
++	    a_normal_exp = b_normal_exp;
++	    a_fraction = 0;
++	  }
++      }
++  }
++
++  if (a->sign != b->sign)
++    {
++      if (a->sign)
++	{
++	  tfraction = -a_fraction + b_fraction;
++	}
++      else
++	{
++	  tfraction = a_fraction - b_fraction;
++	}
++      if (tfraction >= 0)
++	{
++	  tmp->sign = 0;
++	  tmp->normal_exp = a_normal_exp;
++	  tmp->fraction.ll = tfraction;
++	}
++      else
++	{
++	  tmp->sign = 1;
++	  tmp->normal_exp = a_normal_exp;
++	  tmp->fraction.ll = -tfraction;
++	}
++      /* and renormalize it */
++
++      while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
++	{
++	  tmp->fraction.ll <<= 1;
++	  tmp->normal_exp--;
++	}
++    }
++  else
++    {
++      tmp->sign = a->sign;
++      tmp->normal_exp = a_normal_exp;
++      tmp->fraction.ll = a_fraction + b_fraction;
++    }
++  tmp->class = CLASS_NUMBER;
++  /* Now the fraction is added, we have to shift down to renormalize the
++     number */
++
++  if (tmp->fraction.ll >= IMPLICIT_2)
++    {
++      LSHIFT (tmp->fraction.ll);
++      tmp->normal_exp++;
++    }
++  return tmp;
++
++}
++
++FLO_type
++add (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpadd_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++
++FLO_type
++sub (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  b.sign ^= 1;
++
++  res = _fpadd_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++#endif /* L_addsub_sf || L_addsub_df */
++
++#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
++static inline __attribute__ ((__always_inline__)) fp_number_type *
++_fpmul_parts ( fp_number_type *  a,
++	       fp_number_type *  b,
++	       fp_number_type * tmp)
++{
++  fractype low = 0;
++  fractype high = 0;
++
++  if (isnan (a))
++    {
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (isnan (b))
++    {
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++  if (isinf (a))
++    {
++      if (iszero (b))
++	return nan ();
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (isinf (b))
++    {
++      if (iszero (a))
++	{
++	  return nan ();
++	}
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++  if (iszero (a))
++    {
++      a->sign = a->sign != b->sign;
++      return a;
++    }
++  if (iszero (b))
++    {
++      b->sign = a->sign != b->sign;
++      return b;
++    }
++
++  /* Calculate the mantissa by multiplying both numbers to get a
++     twice-as-wide number.  */
++  {
++#if defined(NO_DI_MODE) || defined(TFLOAT)
++    {
++      fractype x = a->fraction.ll;
++      fractype ylow = b->fraction.ll;
++      fractype yhigh = 0;
++      int bit;
++
++      /* ??? This does multiplies one bit at a time.  Optimize.  */
++      for (bit = 0; bit < FRAC_NBITS; bit++)
++	{
++	  int carry;
++
++	  if (x & 1)
++	    {
++	      carry = (low += ylow) < ylow;
++	      high += yhigh + carry;
++	    }
++	  yhigh <<= 1;
++	  if (ylow & FRACHIGH)
++	    {
++	      yhigh |= 1;
++	    }
++	  ylow <<= 1;
++	  x >>= 1;
++	}
++    }
++#elif defined(FLOAT) 
++    /* Multiplying two USIs to get a UDI, we're safe.  */
++    {
++      UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
++      
++      high = answer >> BITS_PER_SI;
++      low = answer;
++    }
++#else
++    /* fractype is DImode, but we need the result to be twice as wide.
++       Assuming a widening multiply from DImode to TImode is not
++       available, build one by hand.  */
++    {
++      USItype nl = a->fraction.ll;
++      USItype nh = a->fraction.ll >> BITS_PER_SI;
++      USItype ml = b->fraction.ll;
++      USItype mh = b->fraction.ll >> BITS_PER_SI;
++      UDItype pp_ll = (UDItype) ml * nl;
++      UDItype pp_hl = (UDItype) mh * nl;
++      UDItype pp_lh = (UDItype) ml * nh;
++      UDItype pp_hh = (UDItype) mh * nh;
++      UDItype res2 = 0;
++      UDItype res0 = 0;
++      UDItype ps_hh__ = pp_hl + pp_lh;
++      if (ps_hh__ < pp_hl)
++	res2 += (UDItype)1 << BITS_PER_SI;
++      pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
++      res0 = pp_ll + pp_hl;
++      if (res0 < pp_ll)
++	res2++;
++      res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
++      high = res2;
++      low = res0;
++    }
++#endif
++  }
++
++  tmp->normal_exp = a->normal_exp + b->normal_exp
++    + FRAC_NBITS - (FRACBITS + NGARDS);
++  tmp->sign = a->sign != b->sign;
++  while (high >= IMPLICIT_2)
++    {
++      tmp->normal_exp++;
++      if (high & 1)
++	{
++	  low >>= 1;
++	  low |= FRACHIGH;
++	}
++      high >>= 1;
++    }
++  while (high < IMPLICIT_1)
++    {
++      tmp->normal_exp--;
++
++      high <<= 1;
++      if (low & FRACHIGH)
++	high |= 1;
++      low <<= 1;
++    }
++  /* rounding is tricky. if we only round if it won't make us round later.  */
++#if 0
++  if (low & FRACHIGH2)
++    {
++      if (((high & GARDMASK) != GARDMSB)
++	  && (((high + 1) & GARDMASK) == GARDMSB))
++	{
++	  /* don't round, it gets done again later.  */
++	}
++      else
++	{
++	  high++;
++	}
++    }
++#endif
++  if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB)
++    {
++      if (high & (1 << NGARDS))
++	{
++	  /* half way, so round to even */
++	  high += GARDROUND + 1;
++	}
++      else if (low)
++	{
++	  /* but we really weren't half way */
++	  high += GARDROUND + 1;
++	}
++    }
++  tmp->fraction.ll = high;
++  tmp->class = CLASS_NUMBER;
++  return tmp;
++}
++
++FLO_type
++multiply (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type tmp;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpmul_parts (&a, &b, &tmp);
++
++  return pack_d (res);
++}
++#endif /* L_mul_sf || L_mul_df */
++
++#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
++static inline __attribute__ ((__always_inline__)) fp_number_type *
++_fpdiv_parts (fp_number_type * a,
++	      fp_number_type * b)
++{
++  fractype bit;
++  fractype numerator;
++  fractype denominator;
++  fractype quotient;
++
++  if (isnan (a))
++    {
++      return a;
++    }
++  if (isnan (b))
++    {
++      return b;
++    }
++
++  a->sign = a->sign ^ b->sign;
++
++  if (isinf (a) || iszero (a))
++    {
++      if (a->class == b->class)
++	return nan ();
++      return a;
++    }
++
++  if (isinf (b))
++    {
++      a->fraction.ll = 0;
++      a->normal_exp = 0;
++      return a;
++    }
++  if (iszero (b))
++    {
++      a->class = CLASS_INFINITY;
++      return a;
++    }
++
++  /* Calculate the mantissa by multiplying both 64bit numbers to get a
++     128 bit number */
++  {
++    /* quotient =
++       ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
++     */
++
++    a->normal_exp = a->normal_exp - b->normal_exp;
++    numerator = a->fraction.ll;
++    denominator = b->fraction.ll;
++
++    if (numerator < denominator)
++      {
++	/* Fraction will be less than 1.0 */
++	numerator *= 2;
++	a->normal_exp--;
++      }
++    bit = IMPLICIT_1;
++    quotient = 0;
++    /* ??? Does divide one bit at a time.  Optimize.  */
++    while (bit)
++      {
++	if (numerator >= denominator)
++	  {
++	    quotient |= bit;
++	    numerator -= denominator;
++	  }
++	bit >>= 1;
++	numerator *= 2;
++      }
++
++    if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB)
++      {
++	if (quotient & (1 << NGARDS))
++	  {
++	    /* half way, so round to even */
++	    quotient += GARDROUND + 1;
++	  }
++	else if (numerator)
++	  {
++	    /* but we really weren't half way, more bits exist */
++	    quotient += GARDROUND + 1;
++	  }
++      }
++
++    a->fraction.ll = quotient;
++    return (a);
++  }
++}
++
++FLO_type
++divide (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  fp_number_type *res;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  res = _fpdiv_parts (&a, &b);
++
++  return pack_d (res);
++}
++#endif /* L_div_sf || L_div_df */
++
++#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
++    || defined(L_fpcmp_parts_tf)
++/* according to the demo, fpcmp returns a comparison with 0... thus
++   a<b -> -1
++   a==b -> 0
++   a>b -> +1
++ */
++
++int
++__fpcmp_parts (fp_number_type * a, fp_number_type * b)
++{
++#if 0
++  /* either nan -> unordered. Must be checked outside of this routine.  */
++  if (isnan (a) && isnan (b))
++    {
++      return 1;			/* still unordered! */
++    }
++#endif
++
++  if (isnan (a) || isnan (b))
++    {
++      return 1;			/* how to indicate unordered compare? */
++    }
++  if (isinf (a) && isinf (b))
++    {
++      /* +inf > -inf, but +inf != +inf */
++      /* b    \a| +inf(0)| -inf(1)
++       ______\+--------+--------
++       +inf(0)| a==b(0)| a<b(-1)
++       -------+--------+--------
++       -inf(1)| a>b(1) | a==b(0)
++       -------+--------+--------
++       So since unordered must be nonzero, just line up the columns...
++       */
++      return b->sign - a->sign;
++    }
++  /* but not both...  */
++  if (isinf (a))
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (isinf (b))
++    {
++      return b->sign ? 1 : -1;
++    }
++  if (iszero (a) && iszero (b))
++    {
++      return 0;
++    }
++  if (iszero (a))
++    {
++      return b->sign ? 1 : -1;
++    }
++  if (iszero (b))
++    {
++      return a->sign ? -1 : 1;
++    }
++  /* now both are "normal".  */
++  if (a->sign != b->sign)
++    {
++      /* opposite signs */
++      return a->sign ? -1 : 1;
++    }
++  /* same sign; exponents? */
++  if (a->normal_exp > b->normal_exp)
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (a->normal_exp < b->normal_exp)
++    {
++      return a->sign ? 1 : -1;
++    }
++  /* same exponents; check size.  */
++  if (a->fraction.ll > b->fraction.ll)
++    {
++      return a->sign ? -1 : 1;
++    }
++  if (a->fraction.ll < b->fraction.ll)
++    {
++      return a->sign ? 1 : -1;
++    }
++  /* after all that, they're equal.  */
++  return 0;
++}
++#endif
++
++#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
++CMPtype
++compare (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_compare_sf || L_compare_df */
++
++#ifndef US_SOFTWARE_GOFAST
++
++/* These should be optimized for their specific tasks someday.  */
++
++#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
++CMPtype
++_eq_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth == 0 */
++
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_eq_sf || L_eq_df */
++
++#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
++CMPtype
++_ne_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* true, truth != 0 */
++
++  return  __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_ne_sf || L_ne_df */
++
++#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
++CMPtype
++_gt_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return -1;			/* false, truth > 0 */
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_gt_sf || L_gt_df */
++
++#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
++CMPtype
++_ge_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return -1;			/* false, truth >= 0 */
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_ge_sf || L_ge_df */
++
++#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
++CMPtype
++_lt_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth < 0 */
++
++  return __fpcmp_parts (&a, &b);
++}
++#endif /* L_lt_sf || L_lt_df */
++
++#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
++CMPtype
++_le_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  if (isnan (&a) || isnan (&b))
++    return 1;			/* false, truth <= 0 */
++
++  return __fpcmp_parts (&a, &b) ;
++}
++#endif /* L_le_sf || L_le_df */
++
++#endif /* ! US_SOFTWARE_GOFAST */
++
++#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
++CMPtype
++_unord_f2 (FLO_type arg_a, FLO_type arg_b)
++{
++  fp_number_type a;
++  fp_number_type b;
++  FLO_union_type au, bu;
++
++  au.value = arg_a;
++  bu.value = arg_b;
++
++  unpack_d (&au, &a);
++  unpack_d (&bu, &b);
++
++  return (isnan (&a) || isnan (&b));
++}
++#endif /* L_unord_sf || L_unord_df */
++
++#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
++FLO_type
++si_to_float (SItype arg_a)
++{
++  fp_number_type in;
++
++  in.class = CLASS_NUMBER;
++  in.sign = arg_a < 0;
++  if (!arg_a)
++    {
++      in.class = CLASS_ZERO;
++    }
++  else
++    {
++      in.normal_exp = FRACBITS + NGARDS;
++      if (in.sign) 
++	{
++	  /* Special case for minint, since there is no +ve integer
++	     representation for it */
++	  if (arg_a == (- MAX_SI_INT - 1))
++	    {
++	      return (FLO_type)(- MAX_SI_INT - 1);
++	    }
++	  in.fraction.ll = (-arg_a);
++	}
++      else
++	in.fraction.ll = arg_a;
++
++      while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
++	{
++	  in.fraction.ll <<= 1;
++	  in.normal_exp -= 1;
++	}
++    }
++  return pack_d (&in);
++}
++#endif /* L_si_to_sf || L_si_to_df */
++
++#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
++FLO_type
++usi_to_float (USItype arg_a)
++{
++  fp_number_type in;
++
++  in.sign = 0;
++  if (!arg_a)
++    {
++      in.class = CLASS_ZERO;
++    }
++  else
++    {
++      in.class = CLASS_NUMBER;
++      in.normal_exp = FRACBITS + NGARDS;
++      in.fraction.ll = arg_a;
++
++      while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS)))
++        {
++          in.fraction.ll >>= 1;
++          in.normal_exp += 1;
++        }
++      while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS)))
++	{
++	  in.fraction.ll <<= 1;
++	  in.normal_exp -= 1;
++	}
++    }
++  return pack_d (&in);
++}
++#endif
++
++#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
++SItype
++float_to_si (FLO_type arg_a)
++{
++  fp_number_type a;
++  SItype tmp;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  if (iszero (&a))
++    return 0;
++  if (isnan (&a))
++    return 0;
++  /* get reasonable MAX_SI_INT...  */
++  if (isinf (&a))
++    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
++  /* it is a number, but a small one */
++  if (a.normal_exp < 0)
++    return 0;
++  if (a.normal_exp > BITS_PER_SI - 2)
++    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
++  tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
++  return a.sign ? (-tmp) : (tmp);
++}
++#endif /* L_sf_to_si || L_df_to_si */
++
++#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
++#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
++/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
++   we also define them for GOFAST because the ones in libgcc2.c have the
++   wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
++   out of libgcc2.c.  We can't define these here if not GOFAST because then
++   there'd be duplicate copies.  */
++
++USItype
++float_to_usi (FLO_type arg_a)
++{
++  fp_number_type a;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  if (iszero (&a))
++    return 0;
++  if (isnan (&a))
++    return 0;
++  /* it is a negative number */
++  if (a.sign)
++    return 0;
++  /* get reasonable MAX_USI_INT...  */
++  if (isinf (&a))
++    return MAX_USI_INT;
++  /* it is a number, but a small one */
++  if (a.normal_exp < 0)
++    return 0;
++  if (a.normal_exp > BITS_PER_SI - 1)
++    return MAX_USI_INT;
++  else if (a.normal_exp > (FRACBITS + NGARDS))
++    return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
++  else
++    return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
++}
++#endif /* US_SOFTWARE_GOFAST */
++#endif /* L_sf_to_usi || L_df_to_usi */
++
++#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
++FLO_type
++negate (FLO_type arg_a)
++{
++  fp_number_type a;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &a);
++
++  flip_sign (&a);
++  return pack_d (&a);
++}
++#endif /* L_negate_sf || L_negate_df */
++
++#ifdef FLOAT
++
++#if defined(L_make_sf)
++SFtype
++__make_fp(fp_class_type class,
++	     unsigned int sign,
++	     int exp, 
++	     USItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_sf */
++
++#ifndef FLOAT_ONLY
++
++/* This enables one to build an fp library that supports float but not double.
++   Otherwise, we would get an undefined reference to __make_dp.
++   This is needed for some 8-bit ports that can't handle well values that
++   are 8-bytes in size, so we just don't support double for them at all.  */
++
++#if defined(L_sf_to_df)
++DFtype
++sf_to_df (SFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_dp (in.class, in.sign, in.normal_exp,
++		    ((UDItype) in.fraction.ll) << F_D_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#if defined(L_sf_to_tf) && defined(TMODES)
++TFtype
++sf_to_tf (SFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_tp (in.class, in.sign, in.normal_exp,
++		    ((UTItype) in.fraction.ll) << F_T_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#endif /* ! FLOAT_ONLY */
++#endif /* FLOAT */
++
++#ifndef FLOAT
++
++extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
++
++#if defined(L_make_df)
++DFtype
++__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_df */
++
++#if defined(L_df_to_sf)
++SFtype
++df_to_sf (DFtype arg_a)
++{
++  fp_number_type in;
++  USItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> F_D_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_df_to_sf */
++
++#if defined(L_df_to_tf) && defined(TMODES) \
++    && !defined(FLOAT) && !defined(TFLOAT)
++TFtype
++df_to_tf (DFtype arg_a)
++{
++  fp_number_type in;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  return __make_tp (in.class, in.sign, in.normal_exp,
++		    ((UTItype) in.fraction.ll) << D_T_BITOFF);
++}
++#endif /* L_sf_to_df */
++
++#ifdef TFLOAT
++#if defined(L_make_tf)
++TFtype
++__make_tp(fp_class_type class,
++	     unsigned int sign,
++	     int exp, 
++	     UTItype frac)
++{
++  fp_number_type in;
++
++  in.class = class;
++  in.sign = sign;
++  in.normal_exp = exp;
++  in.fraction.ll = frac;
++  return pack_d (&in);
++}
++#endif /* L_make_tf */
++
++#if defined(L_tf_to_df)
++DFtype
++tf_to_df (TFtype arg_a)
++{
++  fp_number_type in;
++  UDItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> D_T_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_tf_to_df */
++
++#if defined(L_tf_to_sf)
++SFtype
++tf_to_sf (TFtype arg_a)
++{
++  fp_number_type in;
++  USItype sffrac;
++  FLO_union_type au;
++
++  au.value = arg_a;
++  unpack_d (&au, &in);
++
++  sffrac = in.fraction.ll >> F_T_BITOFF;
++
++  /* We set the lowest guard bit in SFFRAC if we discarded any non
++     zero bits.  */
++  if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
++    sffrac |= 1;
++
++  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
++}
++#endif /* L_tf_to_sf */
++#endif /* TFLOAT */
++
++#endif /* ! FLOAT */
++#endif /* !EXTENDED_FLOAT_STUBS */
+--- gcc-3.4.3/gcc/config/nios2/nios2-protos.h
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-protos.h
+@@ -0,0 +1,70 @@
++/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version.
++   Copyright (C) 2003 Altera 
++   Contributed by Jonah Graham (jgraham@altera.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.  */
++
++extern void dump_frame_size (FILE *);
++extern HOST_WIDE_INT compute_frame_size (void);
++extern int nios2_initial_elimination_offset (int, int);
++extern void override_options (void);
++extern void optimization_options (int, int);
++extern int nios2_can_use_return_insn (void);
++extern void expand_prologue (void);
++extern void expand_epilogue (bool);
++extern void function_profiler (FILE *, int);
++
++
++#ifdef RTX_CODE
++extern int nios2_legitimate_address (rtx, enum machine_mode, int);
++extern void nios2_print_operand (FILE *, rtx, int);
++extern void nios2_print_operand_address (FILE *, rtx);
++
++extern int nios2_emit_move_sequence (rtx *, enum machine_mode);
++extern int nios2_emit_expensive_div (rtx *, enum machine_mode);
++
++extern void gen_int_relational (enum rtx_code, rtx, rtx, rtx, rtx);
++extern void gen_conditional_move (rtx *, enum machine_mode);
++extern const char *asm_output_opcode (FILE *, const char *);
++
++/* predicates */
++extern int arith_operand (rtx, enum machine_mode);
++extern int uns_arith_operand (rtx, enum machine_mode);
++extern int logical_operand (rtx, enum machine_mode);
++extern int shift_operand (rtx, enum machine_mode);
++extern int reg_or_0_operand (rtx, enum machine_mode);
++extern int equality_op (rtx, enum machine_mode);
++extern int custom_insn_opcode (rtx, enum machine_mode);
++extern int rdwrctl_operand (rtx, enum machine_mode);
++
++# ifdef HAVE_MACHINE_MODES
++#  if defined TREE_CODE
++extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
++extern rtx function_arg (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
++extern int function_arg_partial_nregs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
++extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int);
++extern int nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int);
++
++#  endif /* TREE_CODE */
++# endif	/* HAVE_MACHINE_MODES */
++#endif
++
++#ifdef TREE_CODE
++extern int nios2_return_in_memory (tree);
++
++#endif /* TREE_CODE */
+--- gcc-3.4.3/gcc/config/nios2/nios2.c
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.c
+@@ -0,0 +1,2853 @@
++/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version.
++   Copyright (C) 2003 Altera
++   Contributed by Jonah Graham (jgraham@altera.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.  */
++
++
++#include <stdio.h>
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "rtl.h"
++#include "tree.h"
++#include "tm_p.h"
++#include "regs.h"
++#include "hard-reg-set.h"
++#include "real.h"
++#include "insn-config.h"
++#include "conditions.h"
++#include "output.h"
++#include "insn-attr.h"
++#include "flags.h"
++#include "recog.h"
++#include "expr.h"
++#include "toplev.h"
++#include "basic-block.h"
++#include "function.h"
++#include "ggc.h"
++#include "reload.h"
++#include "debug.h"
++#include "optabs.h"
++#include "target.h"
++#include "target-def.h"
++
++/* local prototypes */
++static bool nios2_rtx_costs (rtx, int, int, int *);
++
++static void nios2_asm_function_prologue (FILE *, HOST_WIDE_INT);
++static int nios2_use_dfa_pipeline_interface (void);
++static int nios2_issue_rate (void);
++static struct machine_function *nios2_init_machine_status (void);
++static bool nios2_in_small_data_p (tree);
++static rtx save_reg (int, HOST_WIDE_INT, rtx);
++static rtx restore_reg (int, HOST_WIDE_INT);
++static unsigned int nios2_section_type_flags (tree, const char *, int);
++static void nios2_init_builtins (void);
++static rtx nios2_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
++static bool nios2_function_ok_for_sibcall (tree, tree);
++static void nios2_encode_section_info (tree, rtx, int);
++
++/* Initialize the GCC target structure.  */
++#undef TARGET_ASM_FUNCTION_PROLOGUE
++#define TARGET_ASM_FUNCTION_PROLOGUE nios2_asm_function_prologue
++
++#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
++#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE \
++ nios2_use_dfa_pipeline_interface
++#undef TARGET_SCHED_ISSUE_RATE
++#define TARGET_SCHED_ISSUE_RATE nios2_issue_rate
++#undef TARGET_IN_SMALL_DATA_P
++#define TARGET_IN_SMALL_DATA_P nios2_in_small_data_p
++#undef  TARGET_ENCODE_SECTION_INFO
++#define TARGET_ENCODE_SECTION_INFO nios2_encode_section_info
++#undef  TARGET_SECTION_TYPE_FLAGS
++#define TARGET_SECTION_TYPE_FLAGS  nios2_section_type_flags
++
++#undef TARGET_INIT_BUILTINS
++#define TARGET_INIT_BUILTINS nios2_init_builtins
++#undef TARGET_EXPAND_BUILTIN
++#define TARGET_EXPAND_BUILTIN nios2_expand_builtin
++
++#undef TARGET_FUNCTION_OK_FOR_SIBCALL
++#define TARGET_FUNCTION_OK_FOR_SIBCALL nios2_function_ok_for_sibcall
++
++#undef TARGET_RTX_COSTS
++#define TARGET_RTX_COSTS nios2_rtx_costs
++
++
++struct gcc_target targetm = TARGET_INITIALIZER;
++
++
++
++/* Threshold for data being put into the small data/bss area, instead
++   of the normal data area (references to the small data/bss area take
++   1 instruction, and use the global pointer, references to the normal
++   data area takes 2 instructions).  */
++unsigned HOST_WIDE_INT nios2_section_threshold = NIOS2_DEFAULT_GVALUE;
++
++
++/* Structure to be filled in by compute_frame_size with register
++   save masks, and offsets for the current function.  */
++
++struct nios2_frame_info
++GTY (())
++{
++  long total_size;		/* # bytes that the entire frame takes up */
++  long var_size;		/* # bytes that variables take up */
++  long args_size;		/* # bytes that outgoing arguments take up */
++  int save_reg_size;		/* # bytes needed to store gp regs */
++  int save_reg_rounded;		/* # bytes needed to store gp regs */
++  long save_regs_offset;	/* offset from new sp to store gp registers */
++  int initialized;		/* != 0 if frame size already calculated */
++  int num_regs;			/* number of gp registers saved */
++};
++
++struct machine_function
++GTY (())
++{
++
++  /* Current frame information, calculated by compute_frame_size.  */
++  struct nios2_frame_info frame;
++};
++
++
++/***************************************
++ * Section encodings
++ ***************************************/
++
++
++
++
++
++/***************************************
++ * Stack Layout and Calling Conventions
++ ***************************************/
++
++
++#define TOO_BIG_OFFSET(X) ((X) > ((1 << 15) - 1))
++#define TEMP_REG_NUM 8
++
++static void
++nios2_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
++{
++  if (flag_verbose_asm || flag_debug_asm)
++    {
++      compute_frame_size ();
++      dump_frame_size (file);
++    }
++}
++
++static rtx
++save_reg (int regno, HOST_WIDE_INT offset, rtx cfa_store_reg)
++{
++  rtx insn, stack_slot;
++
++  stack_slot = gen_rtx_PLUS (SImode,
++			     cfa_store_reg,
++			     GEN_INT (offset));
++
++  insn = emit_insn (gen_rtx_SET (SImode,
++				 gen_rtx_MEM (SImode, stack_slot),
++				 gen_rtx_REG (SImode, regno)));
++
++  RTX_FRAME_RELATED_P (insn) = 1;
++
++  return insn;
++}
++
++static rtx
++restore_reg (int regno, HOST_WIDE_INT offset)
++{
++  rtx insn, stack_slot;
++
++  if (TOO_BIG_OFFSET (offset))
++    {
++      stack_slot = gen_rtx_REG (SImode, TEMP_REG_NUM);
++      insn = emit_insn (gen_rtx_SET (SImode,
++				     stack_slot,
++				     GEN_INT (offset)));
++
++      insn = emit_insn (gen_rtx_SET (SImode,
++				     stack_slot,
++                                     gen_rtx_PLUS (SImode,
++				                   stack_slot,
++				                   stack_pointer_rtx)));
++    }
++  else
++    {
++      stack_slot = gen_rtx_PLUS (SImode,
++			         stack_pointer_rtx,
++				 GEN_INT (offset));
++    }
++
++  stack_slot = gen_rtx_MEM (SImode, stack_slot);
++
++  insn = emit_move_insn (gen_rtx_REG (SImode, regno), stack_slot);
++
++  return insn;
++}
++
++
++/* There are two possible paths for prologue expansion,
++- the first is if the total frame size is < 2^15-1. In that
++case all the immediates will fit into the 16-bit immediate
++fields.
++- the second is when the frame size is too big, in that
++case an additional temporary register is used, first 
++as a cfa_temp to offset the sp, second as the cfa_store
++register.
++
++See the comment above dwarf2out_frame_debug_expr in 
++dwarf2out.c for more explanation of the "rules."
++
++
++Case 1:
++Rule #  Example Insn                       Effect
++2  	addi	sp, sp, -total_frame_size  cfa.reg=sp, cfa.offset=total_frame_size
++                                           cfa_store.reg=sp, cfa_store.offset=total_frame_size
++12  	stw	ra, offset(sp)		   
++12  	stw	r16, offset(sp)
++1  	mov	fp, sp
++  
++Case 2: 
++Rule #  Example Insn                       Effect
++6 	movi	r8, total_frame_size       cfa_temp.reg=r8, cfa_temp.offset=total_frame_size
++2  	sub	sp, sp, r8                 cfa.reg=sp, cfa.offset=total_frame_size
++                                           cfa_store.reg=sp, cfa_store.offset=total_frame_size
++5   	add	r8, r8, sp                 cfa_store.reg=r8, cfa_store.offset=0
++12  	stw	ra, offset(r8)
++12  	stw	r16, offset(r8)
++1  	mov	fp, sp
++
++*/
++
++void
++expand_prologue ()
++{
++  int i;
++  HOST_WIDE_INT total_frame_size;
++  int cfa_store_offset;
++  rtx insn;
++  rtx cfa_store_reg = 0;
++
++  total_frame_size = compute_frame_size ();
++
++  if (total_frame_size)
++    {
++
++      if (TOO_BIG_OFFSET (total_frame_size)) 
++	{
++	    /* cfa_temp and cfa_store_reg are the same register,
++	       cfa_store_reg overwrites cfa_temp */
++	    cfa_store_reg = gen_rtx_REG (SImode, TEMP_REG_NUM);
++	    insn = emit_insn (gen_rtx_SET (SImode,
++					   cfa_store_reg,
++					   GEN_INT (total_frame_size)));
++
++	    RTX_FRAME_RELATED_P (insn) = 1;
++
++
++	    insn = gen_rtx_SET (SImode,
++				stack_pointer_rtx,
++				gen_rtx_MINUS (SImode,
++					       stack_pointer_rtx,
++					       cfa_store_reg));
++
++	    insn = emit_insn (insn);
++	    RTX_FRAME_RELATED_P (insn) = 1;
++
++
++	    /* if there are no registers to save, I don't need to
++	       create a cfa_store */
++	    if (cfun->machine->frame.save_reg_size) 
++	      {
++		insn = gen_rtx_SET (SImode,
++				    cfa_store_reg,
++				    gen_rtx_PLUS (SImode,
++						  cfa_store_reg,
++						  stack_pointer_rtx));
++
++		insn = emit_insn (insn);
++		RTX_FRAME_RELATED_P (insn) = 1;
++	      }
++
++	    cfa_store_offset 
++	      = total_frame_size 
++		- (cfun->machine->frame.save_regs_offset
++		   + cfun->machine->frame.save_reg_rounded);
++	}
++      else
++	{
++	    insn = gen_rtx_SET (SImode,
++				stack_pointer_rtx,
++				gen_rtx_PLUS (SImode,
++					      stack_pointer_rtx,
++					      GEN_INT (-total_frame_size)));
++	    insn = emit_insn (insn);
++	    RTX_FRAME_RELATED_P (insn) = 1;
++
++	    cfa_store_reg = stack_pointer_rtx;
++	    cfa_store_offset 
++	      = cfun->machine->frame.save_regs_offset
++		+ cfun->machine->frame.save_reg_rounded;
++	}
++    }
++
++  if (MUST_SAVE_REGISTER (RA_REGNO))
++    {
++      cfa_store_offset -= 4;
++      save_reg (RA_REGNO, cfa_store_offset, cfa_store_reg);
++    }
++  if (MUST_SAVE_REGISTER (FP_REGNO))
++    {
++      cfa_store_offset -= 4;
++      save_reg (FP_REGNO, cfa_store_offset, cfa_store_reg);
++    }
++
++  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++    {
++      if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO)
++	{
++	  cfa_store_offset -= 4;
++	  save_reg (i, cfa_store_offset, cfa_store_reg);
++	}
++    }
++
++  if (frame_pointer_needed)
++    {
++      insn = emit_insn (gen_rtx_SET (SImode,
++				     gen_rtx_REG (SImode, FP_REGNO),
++				     gen_rtx_REG (SImode, SP_REGNO)));
++
++      RTX_FRAME_RELATED_P (insn) = 1;
++    }
++
++  /* If we are profiling, make sure no instructions are scheduled before
++     the call to mcount.  */
++  if (current_function_profile)
++    emit_insn (gen_blockage ());
++}
++
++void
++expand_epilogue (bool sibcall_p)
++{
++  rtx insn;
++  int i;
++  HOST_WIDE_INT total_frame_size;
++  int register_store_offset;
++
++  total_frame_size = compute_frame_size ();
++
++  if (!sibcall_p && nios2_can_use_return_insn ())
++    {
++      insn = emit_jump_insn (gen_return ());
++      return;
++    }
++
++  emit_insn (gen_blockage ());
++
++  register_store_offset =
++    cfun->machine->frame.save_regs_offset +
++    cfun->machine->frame.save_reg_rounded;
++
++  if (MUST_SAVE_REGISTER (RA_REGNO))
++    {
++      register_store_offset -= 4;
++      restore_reg (RA_REGNO, register_store_offset);
++    }
++
++  if (MUST_SAVE_REGISTER (FP_REGNO))
++    {
++      register_store_offset -= 4;
++      restore_reg (FP_REGNO, register_store_offset);
++    }
++
++  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
++    {
++      if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO)
++	{
++	  register_store_offset -= 4;
++	  restore_reg (i, register_store_offset);
++	}
++    }
++
++  if (total_frame_size)
++    {
++      rtx sp_adjust;
++
++      if (TOO_BIG_OFFSET (total_frame_size))
++        {
++	  sp_adjust = gen_rtx_REG (SImode, TEMP_REG_NUM);
++	  insn = emit_insn (gen_rtx_SET (SImode,
++					 sp_adjust,
++					 GEN_INT (total_frame_size)));
++
++      	}
++      else
++        {
++	  sp_adjust = GEN_INT (total_frame_size);
++	}
++
++      insn = gen_rtx_SET (SImode,
++			  stack_pointer_rtx,
++			  gen_rtx_PLUS (SImode,
++					stack_pointer_rtx,
++					sp_adjust));
++      insn = emit_insn (insn);
++    }
++
++
++  if (!sibcall_p)
++    {
++      insn = emit_jump_insn (gen_return_from_epilogue (gen_rtx (REG, Pmode,
++								RA_REGNO)));
++    }
++}
++
++
++bool
++nios2_function_ok_for_sibcall (tree a ATTRIBUTE_UNUSED, tree b ATTRIBUTE_UNUSED)
++{
++  return true;
++}
++
++
++
++
++
++/* ----------------------- *
++ * Profiling
++ * ----------------------- */
++
++void
++function_profiler (FILE *file, int labelno)
++{
++  fprintf (file, "\t%s mcount begin, label: .LP%d\n", 
++           ASM_COMMENT_START, labelno);
++  fprintf (file, "\tnextpc\tr8\n");
++  fprintf (file, "\tmov\tr9, ra\n");
++  fprintf (file, "\tmovhi\tr10, %%hiadj(.LP%d)\n", labelno);
++  fprintf (file, "\taddi\tr10, r10, %%lo(.LP%d)\n", labelno);
++  fprintf (file, "\tcall\tmcount\n");
++  fprintf (file, "\tmov\tra, r9\n");
++  fprintf (file, "\t%s mcount end\n", ASM_COMMENT_START);
++}
++
++
++/***************************************
++ * Stack Layout
++ ***************************************/
++
++
++void
++dump_frame_size (FILE *file)
++{
++  fprintf (file, "\t%s Current Frame Info\n", ASM_COMMENT_START);
++
++  fprintf (file, "\t%s total_size = %ld\n", ASM_COMMENT_START,
++	   cfun->machine->frame.total_size);
++  fprintf (file, "\t%s var_size = %ld\n", ASM_COMMENT_START,
++	   cfun->machine->frame.var_size);
++  fprintf (file, "\t%s args_size = %ld\n", ASM_COMMENT_START,
++	   cfun->machine->frame.args_size);
++  fprintf (file, "\t%s save_reg_size = %d\n", ASM_COMMENT_START,
++	   cfun->machine->frame.save_reg_size);
++  fprintf (file, "\t%s save_reg_rounded = %d\n", ASM_COMMENT_START,
++	   cfun->machine->frame.save_reg_rounded);
++  fprintf (file, "\t%s initialized = %d\n", ASM_COMMENT_START,
++	   cfun->machine->frame.initialized);
++  fprintf (file, "\t%s num_regs = %d\n", ASM_COMMENT_START,
++	   cfun->machine->frame.num_regs);
++  fprintf (file, "\t%s save_regs_offset = %ld\n", ASM_COMMENT_START,
++	   cfun->machine->frame.save_regs_offset);
++  fprintf (file, "\t%s current_function_is_leaf = %d\n", ASM_COMMENT_START,
++	   current_function_is_leaf);
++  fprintf (file, "\t%s frame_pointer_needed = %d\n", ASM_COMMENT_START,
++	   frame_pointer_needed);
++  fprintf (file, "\t%s pretend_args_size = %d\n", ASM_COMMENT_START,
++	   current_function_pretend_args_size);
++
++}
++
++
++/* Return the bytes needed to compute the frame pointer from the current
++   stack pointer.
++*/
++
++HOST_WIDE_INT
++compute_frame_size ()
++{
++  unsigned int regno;
++  HOST_WIDE_INT var_size;	/* # of var. bytes allocated */
++  HOST_WIDE_INT total_size;	/* # bytes that the entire frame takes up */
++  HOST_WIDE_INT save_reg_size;	/* # bytes needed to store callee save regs */
++  HOST_WIDE_INT save_reg_rounded;	
++    /* # bytes needed to store callee save regs (rounded) */
++  HOST_WIDE_INT out_args_size;	/* # bytes needed for outgoing args */
++
++  save_reg_size = 0;
++  var_size = STACK_ALIGN (get_frame_size ());
++  out_args_size = STACK_ALIGN (current_function_outgoing_args_size);
++
++  total_size = var_size + out_args_size;
++
++  /* Calculate space needed for gp registers.  */
++  for (regno = 0; regno <= FIRST_PSEUDO_REGISTER; regno++)
++    {
++      if (MUST_SAVE_REGISTER (regno))
++	{
++	  save_reg_size += 4;
++	}
++    }
++
++  save_reg_rounded = STACK_ALIGN (save_reg_size);
++  total_size += save_reg_rounded;
++
++  total_size += STACK_ALIGN (current_function_pretend_args_size);
++
++  /* Save other computed information.  */
++  cfun->machine->frame.total_size = total_size;
++  cfun->machine->frame.var_size = var_size;
++  cfun->machine->frame.args_size = current_function_outgoing_args_size;
++  cfun->machine->frame.save_reg_size = save_reg_size;
++  cfun->machine->frame.save_reg_rounded = save_reg_rounded;
++  cfun->machine->frame.initialized = reload_completed;
++  cfun->machine->frame.num_regs = save_reg_size / UNITS_PER_WORD;
++
++  cfun->machine->frame.save_regs_offset
++    = save_reg_rounded ? current_function_outgoing_args_size + var_size : 0;
++
++  return total_size;
++}
++
++
++int
++nios2_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED)
++{
++  int offset;
++
++  /* Set OFFSET to the offset from the stack pointer.  */
++  switch (from)
++    {
++    case FRAME_POINTER_REGNUM:
++      offset = 0;
++      break;
++
++    case ARG_POINTER_REGNUM:
++      compute_frame_size ();
++      offset = cfun->machine->frame.total_size;
++      offset -= current_function_pretend_args_size;
++      break;
++
++    case RETURN_ADDRESS_POINTER_REGNUM:
++      compute_frame_size ();
++      /* since the return address is always the first of the
++         saved registers, return the offset to the beginning
++         of the saved registers block */
++      offset = cfun->machine->frame.save_regs_offset;
++      break;
++
++    default:
++      abort ();
++    }
++
++  return offset;
++}
++
++/* Return nonzero if this function is known to have a null epilogue.
++   This allows the optimizer to omit jumps to jumps if no stack
++   was created.  */
++int
++nios2_can_use_return_insn ()
++{
++  if (!reload_completed)
++    return 0;
++
++  if (regs_ever_live[RA_REGNO] || current_function_profile)
++    return 0;
++
++  if (cfun->machine->frame.initialized)
++    return cfun->machine->frame.total_size == 0;
++
++  return compute_frame_size () == 0;
++}
++
++
++
++
++
++/***************************************
++ *
++ ***************************************/
++
++const char *nios2_sys_nosys_string;    /* for -msys=nosys */
++const char *nios2_sys_lib_string;    /* for -msys-lib= */
++const char *nios2_sys_crt0_string;    /* for -msys-crt0= */
++
++void
++override_options ()
++{
++  /* Function to allocate machine-dependent function status.  */
++  init_machine_status = &nios2_init_machine_status;
++
++  nios2_section_threshold 
++    = g_switch_set ? g_switch_value : NIOS2_DEFAULT_GVALUE;
++
++  if (nios2_sys_nosys_string && *nios2_sys_nosys_string)
++    {
++      error ("invalid option '-msys=nosys%s'", nios2_sys_nosys_string);
++    }
++
++  /* If we don't have mul, we don't have mulx either! */
++  if (!TARGET_HAS_MUL && TARGET_HAS_MULX) 
++    {
++      target_flags &= ~HAS_MULX_FLAG;
++    }
++
++}
++
++void
++optimization_options (int level, int size)
++{
++  if (level || size)
++    {
++      target_flags |= INLINE_MEMCPY_FLAG;
++    }
++
++  if (level >= 3 && !size)
++    {
++      target_flags |= FAST_SW_DIV_FLAG;
++    }
++}
++
++/* Allocate a chunk of memory for per-function machine-dependent data.  */
++static struct machine_function *
++nios2_init_machine_status ()
++{
++  return ((struct machine_function *)
++	  ggc_alloc_cleared (sizeof (struct machine_function)));
++}
++
++
++
++/*****************
++ * Describing Relative Costs of Operations
++ *****************/
++
++/* Compute a (partial) cost for rtx X.  Return true if the complete
++   cost has been computed, and false if subexpressions should be
++   scanned.  In either case, *TOTAL contains the cost result.  */
++
++
++
++static bool
++nios2_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total)
++{
++  switch (code)
++    {
++      case CONST_INT:
++	if (INTVAL (x) == 0)
++	  {
++	    *total = COSTS_N_INSNS (0);
++	    return true;
++	  }
++	else if (SMALL_INT (INTVAL (x))
++		|| SMALL_INT_UNSIGNED (INTVAL (x))
++		|| UPPER16_INT (INTVAL (x)))
++	  {
++	    *total = COSTS_N_INSNS (2);
++	    return true;
++	  }
++	else
++	  {
++	    *total = COSTS_N_INSNS (4);
++	    return true;
++	  }
++
++      case LABEL_REF:
++      case SYMBOL_REF:
++	/* ??? gp relative stuff will fit in here */
++	/* fall through */
++      case CONST:
++      case CONST_DOUBLE:
++	{
++	  *total = COSTS_N_INSNS (4);
++	  return true;
++	}
++
++      case MULT:
++	{
++	  *total = COSTS_N_INSNS (1);
++	  return false;
++	}
++      case SIGN_EXTEND:
++	{
++	  *total = COSTS_N_INSNS (3);
++	  return false;
++	}
++      case ZERO_EXTEND:
++	{
++	  *total = COSTS_N_INSNS (1);
++	  return false;
++	}
++
++    default:
++      return false;
++    }
++}
++
++
++/***************************************
++ * INSTRUCTION SUPPORT
++ *
++ * These functions are used within the Machine Description to
++ * handle common or complicated output and expansions from
++ * instructions.
++ ***************************************/
++
++int
++nios2_emit_move_sequence (rtx *operands, enum machine_mode mode)
++{
++  rtx to = operands[0];
++  rtx from = operands[1];
++
++  if (!register_operand (to, mode) && !reg_or_0_operand (from, mode))
++    {
++      if (no_new_pseudos)
++	internal_error ("Trying to force_reg no_new_pseudos == 1");
++      from = copy_to_mode_reg (mode, from);
++    }
++
++  operands[0] = to;
++  operands[1] = from;
++  return 0;
++}
++
++/* Divide Support */
++
++/*
++  If -O3 is used, we want to output a table lookup for
++  divides between small numbers (both num and den >= 0
++  and < 0x10). The overhead of this method in the worse
++  case is 40 bytes in the text section (10 insns) and
++  256 bytes in the data section. Additional divides do
++  not incur additional penalties in the data section.
++
++  Code speed is improved for small divides by about 5x
++  when using this method in the worse case (~9 cycles
++  vs ~45). And in the worse case divides not within the
++  table are penalized by about 10% (~5 cycles vs ~45).
++  However in the typical case the penalty is not as bad
++  because doing the long divide in only 45 cycles is
++  quite optimistic.
++
++  ??? It would be nice to have some benchmarks other
++  than Dhrystone to back this up.
++
++  This bit of expansion is to create this instruction
++  sequence as rtl.
++	or	$8, $4, $5
++	slli	$9, $4, 4
++	cmpgeui	$3, $8, 16
++	beq	$3, $0, .L3
++	or	$10, $9, $5
++	add	$12, $11, divide_table
++	ldbu	$2, 0($12)
++	br	.L1
++.L3:
++	call	slow_div
++.L1:
++#	continue here with result in $2
++
++  ??? Ideally I would like the emit libcall block to contain
++  all of this code, but I don't know how to do that. What it
++  means is that if the divide can be eliminated, it may not
++  completely disappear.
++
++  ??? The __divsi3_table label should ideally be moved out
++  of this block and into a global. If it is placed into the
++  sdata section we can save even more cycles by doing things
++  gp relative.
++*/
++int
++nios2_emit_expensive_div (rtx *operands, enum machine_mode mode)
++{
++  rtx or_result, shift_left_result;
++  rtx lookup_value;
++  rtx lab1, lab3;
++  rtx insns;
++  rtx libfunc;
++  rtx final_result;
++  rtx tmp;
++
++  /* it may look a little generic, but only SImode
++     is supported for now */
++  if (mode != SImode)
++    abort ();
++
++  libfunc = sdiv_optab->handlers[(int) SImode].libfunc;
++
++
++
++  lab1 = gen_label_rtx ();
++  lab3 = gen_label_rtx ();
++
++  or_result = expand_simple_binop (SImode, IOR,
++				   operands[1], operands[2],
++				   0, 0, OPTAB_LIB_WIDEN);
++
++  emit_cmp_and_jump_insns (or_result, GEN_INT (15), GTU, 0,
++			   GET_MODE (or_result), 0, lab3);
++  JUMP_LABEL (get_last_insn ()) = lab3;
++
++  shift_left_result = expand_simple_binop (SImode, ASHIFT,
++					   operands[1], GEN_INT (4),
++					   0, 0, OPTAB_LIB_WIDEN);
++
++  lookup_value = expand_simple_binop (SImode, IOR,
++				      shift_left_result, operands[2],
++				      0, 0, OPTAB_LIB_WIDEN);
++
++  convert_move (operands[0],
++		gen_rtx (MEM, QImode,
++			 gen_rtx (PLUS, SImode,
++				  lookup_value,
++				  gen_rtx_SYMBOL_REF (SImode, "__divsi3_table"))),
++		1);
++
++
++  tmp = emit_jump_insn (gen_jump (lab1));
++  JUMP_LABEL (tmp) = lab1;
++  emit_barrier ();
++
++  emit_label (lab3);
++  LABEL_NUSES (lab3) = 1;
++
++  start_sequence ();
++  final_result = emit_library_call_value (libfunc, NULL_RTX,
++					  LCT_CONST, SImode, 2,
++					  operands[1], SImode,
++					  operands[2], SImode);
++
++
++  insns = get_insns ();
++  end_sequence ();
++  emit_libcall_block (insns, operands[0], final_result,
++		      gen_rtx (DIV, SImode, operands[1], operands[2]));
++
++  emit_label (lab1);
++  LABEL_NUSES (lab1) = 1;
++  return 1;
++}
++
++/* Branches/Compares */
++
++/* the way of handling branches/compares
++   in gcc is heavily borrowed from MIPS */
++
++enum internal_test
++{
++  ITEST_EQ,
++  ITEST_NE,
++  ITEST_GT,
++  ITEST_GE,
++  ITEST_LT,
++  ITEST_LE,
++  ITEST_GTU,
++  ITEST_GEU,
++  ITEST_LTU,
++  ITEST_LEU,
++  ITEST_MAX
++};
++
++static enum internal_test map_test_to_internal_test (enum rtx_code);
++
++/* Cached operands, and operator to compare for use in set/branch/trap
++   on condition codes.  */
++rtx branch_cmp[2];
++enum cmp_type branch_type;
++
++/* Make normal rtx_code into something we can index from an array */
++
++static enum internal_test
++map_test_to_internal_test (enum rtx_code test_code)
++{
++  enum internal_test test = ITEST_MAX;
++
++  switch (test_code)
++    {
++    case EQ:
++      test = ITEST_EQ;
++      break;
++    case NE:
++      test = ITEST_NE;
++      break;
++    case GT:
++      test = ITEST_GT;
++      break;
++    case GE:
++      test = ITEST_GE;
++      break;
++    case LT:
++      test = ITEST_LT;
++      break;
++    case LE:
++      test = ITEST_LE;
++      break;
++    case GTU:
++      test = ITEST_GTU;
++      break;
++    case GEU:
++      test = ITEST_GEU;
++      break;
++    case LTU:
++      test = ITEST_LTU;
++      break;
++    case LEU:
++      test = ITEST_LEU;
++      break;
++    default:
++      break;
++    }
++
++  return test;
++}
++
++/* Generate the code to compare (and possibly branch) two integer values
++   TEST_CODE is the comparison code we are trying to emulate 
++     (or implement directly)
++   RESULT is where to store the result of the comparison, 
++     or null to emit a branch
++   CMP0 CMP1 are the two comparison operands
++   DESTINATION is the destination of the branch, or null to only compare
++   */
++
++void
++gen_int_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
++		    rtx result,		/* result to store comp. or 0 if branch */
++		    rtx cmp0,		/* first operand to compare */
++		    rtx cmp1,		/* second operand to compare */
++		    rtx destination)	/* destination of the branch, or 0 if compare */
++{
++  struct cmp_info
++  {
++    /* for register (or 0) compares */
++    enum rtx_code test_code_reg;	/* code to use in instruction (LT vs. LTU) */
++    int reverse_regs;		/* reverse registers in test */
++
++    /* for immediate compares */
++    enum rtx_code test_code_const;	
++         /* code to use in instruction (LT vs. LTU) */
++    int const_low;		/* low bound of constant we can accept */
++    int const_high;		/* high bound of constant we can accept */
++    int const_add;		/* constant to add */
++
++    /* generic info */
++    int unsignedp;		/* != 0 for unsigned comparisons.  */
++  };
++
++  static const struct cmp_info info[(int) ITEST_MAX] = {
++
++    {EQ, 0, EQ, -32768, 32767, 0, 0}, /* EQ  */
++    {NE, 0, NE, -32768, 32767, 0, 0}, /* NE  */
++
++    {LT, 1, GE, -32769, 32766, 1, 0}, /* GT  */
++    {GE, 0, GE, -32768, 32767, 0, 0}, /* GE  */
++    {LT, 0, LT, -32768, 32767, 0, 0}, /* LT  */
++    {GE, 1, LT, -32769, 32766, 1, 0}, /* LE  */
++
++    {LTU, 1, GEU, 0, 65534, 1, 0}, /* GTU */
++    {GEU, 0, GEU, 0, 65535, 0, 0}, /* GEU */
++    {LTU, 0, LTU, 0, 65535, 0, 0}, /* LTU */
++    {GEU, 1, LTU, 0, 65534, 1, 0}, /* LEU */
++  };
++
++  enum internal_test test;
++  enum machine_mode mode;
++  const struct cmp_info *p_info;
++  int branch_p;
++
++
++
++
++  test = map_test_to_internal_test (test_code);
++  if (test == ITEST_MAX)
++    abort ();
++
++  p_info = &info[(int) test];
++
++  mode = GET_MODE (cmp0);
++  if (mode == VOIDmode)
++    mode = GET_MODE (cmp1);
++
++  branch_p = (destination != 0);
++
++  /* We can't, under any circumstances, have const_ints in cmp0
++     ??? Actually we could have const0 */
++  if (GET_CODE (cmp0) == CONST_INT)
++    cmp0 = force_reg (mode, cmp0);
++
++  /* if the comparison is against an int not in legal range
++     move it into a register */
++  if (GET_CODE (cmp1) == CONST_INT)
++    {
++      HOST_WIDE_INT value = INTVAL (cmp1);
++
++      if (value < p_info->const_low || value > p_info->const_high)
++	cmp1 = force_reg (mode, cmp1);
++    }
++
++  /* Comparison to constants, may involve adding 1 to change a GT into GE.
++     Comparison between two registers, may involve switching operands.  */
++  if (GET_CODE (cmp1) == CONST_INT)
++    {
++      if (p_info->const_add != 0)
++	{
++	  HOST_WIDE_INT new = INTVAL (cmp1) + p_info->const_add;
++
++	  /* If modification of cmp1 caused overflow,
++	     we would get the wrong answer if we follow the usual path;
++	     thus, x > 0xffffffffU would turn into x > 0U.  */
++	  if ((p_info->unsignedp
++	       ? (unsigned HOST_WIDE_INT) new >
++	       (unsigned HOST_WIDE_INT) INTVAL (cmp1)
++	       : new > INTVAL (cmp1)) != (p_info->const_add > 0))
++	    {
++	      /* ??? This case can never happen with the current numbers,
++	         but I am paranoid and would rather an abort than
++	         a bug I will never find */
++	      abort ();
++	    }
++	  else
++	    cmp1 = GEN_INT (new);
++	}
++    }
++
++  else if (p_info->reverse_regs)
++    {
++      rtx temp = cmp0;
++      cmp0 = cmp1;
++      cmp1 = temp;
++    }
++
++
++
++  if (branch_p)
++    {
++      if (register_operand (cmp0, mode) && register_operand (cmp1, mode))
++	{
++	  rtx insn;
++	  rtx cond = gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1);
++	  rtx label = gen_rtx_LABEL_REF (VOIDmode, destination);
++
++	  insn = gen_rtx_SET (VOIDmode, pc_rtx,
++			      gen_rtx_IF_THEN_ELSE (VOIDmode,
++						    cond, label, pc_rtx));
++	  emit_jump_insn (insn);
++	}
++      else
++	{
++	  rtx cond, label;
++
++	  result = gen_reg_rtx (mode);
++
++	  emit_move_insn (result,
++			  gen_rtx (p_info->test_code_const, mode, cmp0,
++				   cmp1));
++
++	  cond = gen_rtx (NE, mode, result, const0_rtx);
++	  label = gen_rtx_LABEL_REF (VOIDmode, destination);
++
++	  emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
++				       gen_rtx_IF_THEN_ELSE (VOIDmode,
++							     cond,
++							     label, pc_rtx)));
++	}
++    }
++  else
++    {
++      if (register_operand (cmp0, mode) && register_operand (cmp1, mode))
++	{
++	  emit_move_insn (result,
++			  gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1));
++	}
++      else
++	{
++	  emit_move_insn (result,
++			  gen_rtx (p_info->test_code_const, mode, cmp0,
++				   cmp1));
++	}
++    }
++
++}
++
++
++/* ??? For now conditional moves are only supported
++   when the mode of the operands being compared are
++   the same as the ones being moved */
++
++void
++gen_conditional_move (rtx *operands, enum machine_mode mode)
++{
++  rtx insn, cond;
++  rtx cmp_reg = gen_reg_rtx (mode);
++  enum rtx_code cmp_code = GET_CODE (operands[1]);
++  enum rtx_code move_code = EQ;
++
++  /* emit a comparison if it is not "simple".
++     Simple comparisons are X eq 0 and X ne 0 */
++  if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[1] == const0_rtx)
++    {
++      cmp_reg = branch_cmp[0];
++      move_code = cmp_code;
++    }
++  else if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[0] == const0_rtx)
++    {
++      cmp_reg = branch_cmp[1];
++      move_code = cmp_code == EQ ? NE : EQ;
++    }
++  else
++    gen_int_relational (cmp_code, cmp_reg, branch_cmp[0], branch_cmp[1],
++			NULL_RTX);
++
++  cond = gen_rtx (move_code, VOIDmode, cmp_reg, CONST0_RTX (mode));
++  insn = gen_rtx_SET (mode, operands[0],
++		      gen_rtx_IF_THEN_ELSE (mode,
++					    cond, operands[2], operands[3]));
++  emit_insn (insn);
++}
++
++/*******************
++ * Addressing Modes
++ *******************/
++
++int
++nios2_legitimate_address (rtx operand, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                          int strict)
++{
++  int ret_val = 0;
++
++  switch (GET_CODE (operand))
++    {
++      /* direct.  */
++    case SYMBOL_REF:
++      if (SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (operand))
++        {
++          ret_val = 1;
++          break;
++	}
++      /* else, fall through */
++    case LABEL_REF:
++    case CONST_INT:
++    case CONST:
++    case CONST_DOUBLE:
++      /* ??? In here I need to add gp addressing */
++      ret_val = 0;
++
++      break;
++
++      /* Register indirect.  */
++    case REG:
++      ret_val = REG_OK_FOR_BASE_P2 (operand, strict);
++      break;
++
++      /* Register indirect with displacement */
++    case PLUS:
++      {
++	rtx op0 = XEXP (operand, 0);
++	rtx op1 = XEXP (operand, 1);
++
++	if (REG_P (op0) && REG_P (op1))
++	  ret_val = 0;
++	else if (REG_P (op0) && CONSTANT_P (op1))
++	  ret_val = REG_OK_FOR_BASE_P2 (op0, strict)
++	    && SMALL_INT (INTVAL (op1));
++	else if (REG_P (op1) && CONSTANT_P (op0))
++	  ret_val = REG_OK_FOR_BASE_P2 (op1, strict)
++	    && SMALL_INT (INTVAL (op0));
++	else
++	  ret_val = 0;
++      }
++      break;
++
++    default:
++      ret_val = 0;
++      break;
++    }
++
++  return ret_val;
++}
++
++/* Return true if EXP should be placed in the small data section.  */
++
++static bool
++nios2_in_small_data_p (tree exp)
++{
++  /* We want to merge strings, so we never consider them small data.  */
++  if (TREE_CODE (exp) == STRING_CST)
++    return false;
++
++  if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp))
++    {
++      const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp));
++      /* ??? these string names need moving into 
++         an array in some header file */
++      if (nios2_section_threshold > 0
++          && (strcmp (section, ".sbss") == 0
++	      || strncmp (section, ".sbss.", 6) == 0
++	      || strcmp (section, ".sdata") == 0
++	      || strncmp (section, ".sdata.", 7) == 0))
++	return true;
++    }
++  else if (TREE_CODE (exp) == VAR_DECL)
++    {
++      HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
++
++      /* If this is an incomplete type with size 0, then we can't put it
++         in sdata because it might be too big when completed.  */
++      if (size > 0 && size <= nios2_section_threshold)
++	return true;
++    }
++
++  return false;
++}
++
++static void
++nios2_encode_section_info (tree decl, rtx rtl, int first)
++{
++
++  rtx symbol;
++  int flags;
++
++  default_encode_section_info (decl, rtl, first);
++  
++  /* Careful not to prod global register variables.  */
++  if (GET_CODE (rtl) != MEM)
++    return;
++  symbol = XEXP (rtl, 0);
++  if (GET_CODE (symbol) != SYMBOL_REF)
++    return;
++
++  flags = SYMBOL_REF_FLAGS (symbol);
++    
++  /* We don't want weak variables to be addressed with gp in case they end up with
++     value 0 which is not within 2^15 of $gp */
++  if (DECL_P (decl) && DECL_WEAK (decl))
++    flags |= SYMBOL_FLAG_WEAK_DECL;
++
++  SYMBOL_REF_FLAGS (symbol) = flags;
++}
++
++
++static unsigned int
++nios2_section_type_flags (tree decl, const char *name, int reloc)
++{
++  unsigned int flags;
++
++  flags = default_section_type_flags (decl, name, reloc);
++
++  /* ??? these string names need moving into an array in some header file */
++  if (strcmp (name, ".sbss") == 0
++      || strncmp (name, ".sbss.", 6) == 0
++      || strcmp (name, ".sdata") == 0
++      || strncmp (name, ".sdata.", 7) == 0)
++    flags |= SECTION_SMALL;
++
++  return flags;
++}
++
++
++
++
++/*****************************************
++ * Defining the Output Assembler Language
++ *****************************************/
++
++/* -------------- *
++ * Output of Data
++ * -------------- */
++
++
++/* -------------------------------- *
++ * Output of Assembler Instructions
++ * -------------------------------- */
++
++
++/* print the operand OP to file stream
++   FILE modified by LETTER. LETTER
++   can be one of:
++     i: print "i" if OP is an immediate, except 0
++     o: print "io" if OP is volatile
++
++     z: for const0_rtx print $0 instead of 0
++     H: for %hiadj
++     L: for %lo
++     U: for upper half of 32 bit value
++ */
++
++void
++nios2_print_operand (FILE *file, rtx op, int letter)
++{
++
++  switch (letter)
++    {
++    case 'i':
++      if (CONSTANT_P (op) && (op != const0_rtx))
++	fprintf (file, "i");
++      return;
++
++    case 'o':
++      if (GET_CODE (op) == MEM
++          && ((MEM_VOLATILE_P (op) && !TARGET_CACHE_VOLATILE)
++              || TARGET_BYPASS_CACHE))
++	fprintf (file, "io");
++      return;
++
++    default:
++      break;
++    }
++
++  if (comparison_operator (op, VOIDmode))
++    {
++      if (letter == 0)
++	{
++	  fprintf (file, "%s", GET_RTX_NAME (GET_CODE (op)));
++	  return;
++	}
++    }
++
++
++  switch (GET_CODE (op))
++    {
++    case REG:
++      if (letter == 0 || letter == 'z')
++	{
++	  fprintf (file, "%s", reg_names[REGNO (op)]);
++	  return;
++	}
++
++    case CONST_INT:
++      if (INTVAL (op) == 0 && letter == 'z')
++	{
++	  fprintf (file, "zero");
++	  return;
++	}
++      else if (letter == 'U')
++	{
++	  HOST_WIDE_INT val = INTVAL (op);
++	  rtx new_op;
++	  val = (val / 65536) & 0xFFFF;
++	  new_op = GEN_INT (val);
++	  output_addr_const (file, new_op);
++	  return;
++	}
++
++      /* else, fall through */
++    case CONST:
++    case LABEL_REF:
++    case SYMBOL_REF:
++    case CONST_DOUBLE:
++      if (letter == 0 || letter == 'z')
++	{
++	  output_addr_const (file, op);
++	  return;
++	}
++      else if (letter == 'H')
++	{
++	  fprintf (file, "%%hiadj(");
++	  output_addr_const (file, op);
++	  fprintf (file, ")");
++	  return;
++	}
++      else if (letter == 'L')
++	{
++	  fprintf (file, "%%lo(");
++	  output_addr_const (file, op);
++	  fprintf (file, ")");
++	  return;
++	}
++
++
++    case SUBREG:
++    case MEM:
++      if (letter == 0)
++	{
++	  output_address (op);
++	  return;
++	}
++
++    case CODE_LABEL:
++      if (letter == 0)
++	{
++	  output_addr_const (file, op);
++	  return;
++	}
++
++    default:
++      break;
++    }
++
++  fprintf (stderr, "Missing way to print (%c) ", letter);
++  debug_rtx (op);
++  abort ();
++}
++
++static int gprel_constant (rtx);
++
++static int
++gprel_constant (rtx op)
++{
++  if (GET_CODE (op) == SYMBOL_REF
++      && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (op))
++    {
++      return 1;
++    }
++  else if (GET_CODE (op) == CONST
++           && GET_CODE (XEXP (op, 0)) == PLUS)
++    {
++      return gprel_constant (XEXP (XEXP (op, 0), 0));
++    }
++  else
++    {
++      return 0;
++    }
++}
++
++void
++nios2_print_operand_address (FILE *file, rtx op)
++{
++  switch (GET_CODE (op))
++    {
++    case CONST:
++    case CONST_INT:
++    case LABEL_REF:
++    case CONST_DOUBLE:
++    case SYMBOL_REF:
++      if (gprel_constant (op))
++        {
++          fprintf (file, "%%gprel(");
++          output_addr_const (file, op);
++          fprintf (file, ")(%s)", reg_names[GP_REGNO]);
++          return;
++        }
++
++      break;
++
++    case PLUS:
++      {
++	rtx op0 = XEXP (op, 0);
++	rtx op1 = XEXP (op, 1);
++
++	if (REG_P (op0) && CONSTANT_P (op1))
++	  {
++	    output_addr_const (file, op1);
++	    fprintf (file, "(%s)", reg_names[REGNO (op0)]);
++	    return;
++	  }
++	else if (REG_P (op1) && CONSTANT_P (op0))
++	  {
++	    output_addr_const (file, op0);
++	    fprintf (file, "(%s)", reg_names[REGNO (op1)]);
++	    return;
++	  }
++      }
++      break;
++
++    case REG:
++      fprintf (file, "0(%s)", reg_names[REGNO (op)]);
++      return;
++
++    case MEM:
++      {
++	rtx base = XEXP (op, 0);
++	PRINT_OPERAND_ADDRESS (file, base);
++	return;
++      }
++    default:
++      break;
++    }
++
++  fprintf (stderr, "Missing way to print address\n");
++  debug_rtx (op);
++  abort ();
++}
++
++
++
++
++
++/****************************
++ * Predicates
++ ****************************/
++
++int
++arith_operand (rtx op, enum machine_mode mode)
++{
++  if (GET_CODE (op) == CONST_INT && SMALL_INT (INTVAL (op)))
++    return 1;
++
++  return register_operand (op, mode);
++}
++
++int
++uns_arith_operand (rtx op, enum machine_mode mode)
++{
++  if (GET_CODE (op) == CONST_INT && SMALL_INT_UNSIGNED (INTVAL (op)))
++    return 1;
++
++  return register_operand (op, mode);
++}
++
++int
++logical_operand (rtx op, enum machine_mode mode)
++{
++  if (GET_CODE (op) == CONST_INT
++      && (SMALL_INT_UNSIGNED (INTVAL (op)) || UPPER16_INT (INTVAL (op))))
++    return 1;
++
++  return register_operand (op, mode);
++}
++
++int
++shift_operand (rtx op, enum machine_mode mode)
++{
++  if (GET_CODE (op) == CONST_INT && SHIFT_INT (INTVAL (op)))
++    return 1;
++
++  return register_operand (op, mode);
++}
++
++int
++rdwrctl_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
++{
++  return GET_CODE (op) == CONST_INT && RDWRCTL_INT (INTVAL (op));
++}
++
++/* Return truth value of whether OP is a register or the constant 0. */
++
++int
++reg_or_0_operand (rtx op, enum machine_mode mode)
++{
++  switch (GET_CODE (op))
++    {
++    case CONST_INT:
++      return INTVAL (op) == 0;
++
++    case CONST_DOUBLE:
++      return op == CONST0_RTX (mode);
++
++    default:
++      break;
++    }
++
++  return register_operand (op, mode);
++}
++
++
++int
++equality_op (rtx op, enum machine_mode mode)
++{
++  if (mode != GET_MODE (op))
++    return 0;
++
++  return GET_CODE (op) == EQ || GET_CODE (op) == NE;
++}
++
++int
++custom_insn_opcode (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
++{
++  return GET_CODE (op) == CONST_INT && CUSTOM_INSN_OPCODE (INTVAL (op));
++}
++
++
++
++
++
++
++
++/*****************************************************************************
++**
++** instruction scheduler
++**
++*****************************************************************************/
++static int
++nios2_use_dfa_pipeline_interface ()
++{
++  return 1;
++}
++
++
++static int
++nios2_issue_rate ()
++{
++#ifdef MAX_DFA_ISSUE_RATE
++  return MAX_DFA_ISSUE_RATE;
++#else
++  return 1;
++#endif
++}
++
++
++const char *
++asm_output_opcode (FILE *file ATTRIBUTE_UNUSED, 
++                   const char *ptr ATTRIBUTE_UNUSED)
++{
++  const char *p;
++
++  p = ptr;
++  return ptr;
++}
++
++
++
++/*****************************************************************************
++**
++** function arguments
++**
++*****************************************************************************/
++
++void
++init_cumulative_args (CUMULATIVE_ARGS *cum, 
++                      tree fntype ATTRIBUTE_UNUSED, 
++                      rtx libname ATTRIBUTE_UNUSED, 
++                      tree fndecl ATTRIBUTE_UNUSED, 
++                      int n_named_args ATTRIBUTE_UNUSED)
++{
++  cum->regs_used = 0;
++}
++
++
++/* Update the data in CUM to advance over an argument
++   of mode MODE and data type TYPE.
++   (TYPE is null for libcalls where that information may not be available.)  */
++
++void
++function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, 
++                      tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED)
++{
++  HOST_WIDE_INT param_size;
++
++  if (mode == BLKmode)
++    {
++      param_size = int_size_in_bytes (type);
++      if (param_size < 0)
++	internal_error
++	  ("Do not know how to handle large structs or variable length types");
++    }
++  else
++    {
++      param_size = GET_MODE_SIZE (mode);
++    }
++
++  /* convert to words (round up) */
++  param_size = (3 + param_size) / 4;
++
++  if (cum->regs_used + param_size > NUM_ARG_REGS)
++    {
++      cum->regs_used = NUM_ARG_REGS;
++    }
++  else
++    {
++      cum->regs_used += param_size;
++    }
++
++  return;
++}
++
++/* Define where to put the arguments to a function.  Value is zero to
++   push the argument on the stack, or a hard register in which to
++   store the argument.
++
++   MODE is the argument's machine mode.
++   TYPE is the data type of the argument (as a tree).
++   This is null for libcalls where that information may
++   not be available.
++   CUM is a variable of type CUMULATIVE_ARGS which gives info about
++   the preceding args and about the function being called.
++   NAMED is nonzero if this argument is a named parameter
++   (otherwise it is an extra parameter matching an ellipsis).  */
++rtx
++function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode, 
++              tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED)
++{
++  rtx return_rtx = NULL_RTX;
++
++  if (cum->regs_used < NUM_ARG_REGS)
++    {
++      return_rtx = gen_rtx_REG (mode, FIRST_ARG_REGNO + cum->regs_used);
++    }
++
++  return return_rtx;
++}
++
++int
++function_arg_partial_nregs (const CUMULATIVE_ARGS *cum,
++                            enum machine_mode mode, tree type, 
++                            int named ATTRIBUTE_UNUSED)
++{
++  HOST_WIDE_INT param_size;
++
++  if (mode == BLKmode)
++    {
++      param_size = int_size_in_bytes (type);
++      if (param_size < 0)
++	internal_error
++	  ("Do not know how to handle large structs or variable length types");
++    }
++  else
++    {
++      param_size = GET_MODE_SIZE (mode);
++    }
++
++  /* convert to words (round up) */
++  param_size = (3 + param_size) / 4;
++
++  if (cum->regs_used < NUM_ARG_REGS
++      && cum->regs_used + param_size > NUM_ARG_REGS)
++    {
++      return NUM_ARG_REGS - cum->regs_used;
++    }
++  else
++    {
++      return 0;
++    }
++}
++
++
++int
++nios2_return_in_memory (tree type)
++{
++  int res = ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD))
++  	     || (int_size_in_bytes (type) == -1));
++
++  return res;
++}
++
++/* ??? It may be possible to eliminate the copyback and implement
++       my own va_arg type, but that is more work for now. */
++int
++nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *cum, 
++                              enum machine_mode mode, tree type, 
++                              int no_rtl)
++{
++  CUMULATIVE_ARGS local_cum;
++  int regs_to_push;
++
++  local_cum = *cum;
++  FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1);
++
++  regs_to_push = NUM_ARG_REGS - local_cum.regs_used;
++
++  if (!no_rtl)
++    {
++      if (regs_to_push > 0)
++	{
++	  rtx ptr, mem;
++
++	  ptr = virtual_incoming_args_rtx;
++	  mem = gen_rtx_MEM (BLKmode, ptr);
++
++	  /* va_arg is an array access in this case, which causes
++	     it to get MEM_IN_STRUCT_P set.  We must set it here
++	     so that the insn scheduler won't assume that these
++	     stores can't possibly overlap with the va_arg loads.  */
++	  MEM_SET_IN_STRUCT_P (mem, 1);
++
++	  emit_insn (gen_blockage ());
++	  move_block_from_reg (local_cum.regs_used + FIRST_ARG_REGNO, mem,
++			       regs_to_push);
++	  emit_insn (gen_blockage ());
++	}
++    }
++
++  return regs_to_push * UNITS_PER_WORD;
++
++}
++
++
++
++/*****************************************************************************
++**
++** builtins
++**
++** This method for handling builtins is from CSP where _many_ more types of
++** expanders have already been written. Check there first before writing
++** new ones.
++**
++*****************************************************************************/
++
++enum nios2_builtins
++{
++  NIOS2_BUILTIN_LDBIO,
++  NIOS2_BUILTIN_LDBUIO,
++  NIOS2_BUILTIN_LDHIO,
++  NIOS2_BUILTIN_LDHUIO,
++  NIOS2_BUILTIN_LDWIO,
++  NIOS2_BUILTIN_STBIO,
++  NIOS2_BUILTIN_STHIO,
++  NIOS2_BUILTIN_STWIO,
++  NIOS2_BUILTIN_SYNC,
++  NIOS2_BUILTIN_RDCTL,
++  NIOS2_BUILTIN_WRCTL,
++
++  NIOS2_BUILTIN_CUSTOM_N,
++  NIOS2_BUILTIN_CUSTOM_NI,
++  NIOS2_BUILTIN_CUSTOM_NF,
++  NIOS2_BUILTIN_CUSTOM_NP,
++  NIOS2_BUILTIN_CUSTOM_NII,
++  NIOS2_BUILTIN_CUSTOM_NIF,
++  NIOS2_BUILTIN_CUSTOM_NIP,
++  NIOS2_BUILTIN_CUSTOM_NFI,
++  NIOS2_BUILTIN_CUSTOM_NFF,
++  NIOS2_BUILTIN_CUSTOM_NFP,
++  NIOS2_BUILTIN_CUSTOM_NPI,
++  NIOS2_BUILTIN_CUSTOM_NPF,
++  NIOS2_BUILTIN_CUSTOM_NPP,
++  NIOS2_BUILTIN_CUSTOM_IN,
++  NIOS2_BUILTIN_CUSTOM_INI,
++  NIOS2_BUILTIN_CUSTOM_INF,
++  NIOS2_BUILTIN_CUSTOM_INP,
++  NIOS2_BUILTIN_CUSTOM_INII,
++  NIOS2_BUILTIN_CUSTOM_INIF,
++  NIOS2_BUILTIN_CUSTOM_INIP,
++  NIOS2_BUILTIN_CUSTOM_INFI,
++  NIOS2_BUILTIN_CUSTOM_INFF,
++  NIOS2_BUILTIN_CUSTOM_INFP,
++  NIOS2_BUILTIN_CUSTOM_INPI,
++  NIOS2_BUILTIN_CUSTOM_INPF,
++  NIOS2_BUILTIN_CUSTOM_INPP,
++  NIOS2_BUILTIN_CUSTOM_FN,
++  NIOS2_BUILTIN_CUSTOM_FNI,
++  NIOS2_BUILTIN_CUSTOM_FNF,
++  NIOS2_BUILTIN_CUSTOM_FNP,
++  NIOS2_BUILTIN_CUSTOM_FNII,
++  NIOS2_BUILTIN_CUSTOM_FNIF,
++  NIOS2_BUILTIN_CUSTOM_FNIP,
++  NIOS2_BUILTIN_CUSTOM_FNFI,
++  NIOS2_BUILTIN_CUSTOM_FNFF,
++  NIOS2_BUILTIN_CUSTOM_FNFP,
++  NIOS2_BUILTIN_CUSTOM_FNPI,
++  NIOS2_BUILTIN_CUSTOM_FNPF,
++  NIOS2_BUILTIN_CUSTOM_FNPP,
++  NIOS2_BUILTIN_CUSTOM_PN,
++  NIOS2_BUILTIN_CUSTOM_PNI,
++  NIOS2_BUILTIN_CUSTOM_PNF,
++  NIOS2_BUILTIN_CUSTOM_PNP,
++  NIOS2_BUILTIN_CUSTOM_PNII,
++  NIOS2_BUILTIN_CUSTOM_PNIF,
++  NIOS2_BUILTIN_CUSTOM_PNIP,
++  NIOS2_BUILTIN_CUSTOM_PNFI,
++  NIOS2_BUILTIN_CUSTOM_PNFF,
++  NIOS2_BUILTIN_CUSTOM_PNFP,
++  NIOS2_BUILTIN_CUSTOM_PNPI,
++  NIOS2_BUILTIN_CUSTOM_PNPF,
++  NIOS2_BUILTIN_CUSTOM_PNPP,
++
++
++  LIM_NIOS2_BUILTINS
++};
++
++struct builtin_description
++{
++    const enum insn_code icode;
++    const char *const name;
++    const enum nios2_builtins code;
++    const tree *type;
++    rtx (* expander) PARAMS ((const struct builtin_description *,
++                              tree, rtx, rtx, enum machine_mode, int));
++};
++
++static rtx nios2_expand_STXIO (const struct builtin_description *, 
++                               tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_LDXIO (const struct builtin_description *, 
++                               tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_sync (const struct builtin_description *, 
++                              tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_rdctl (const struct builtin_description *, 
++                               tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_wrctl (const struct builtin_description *, 
++                               tree, rtx, rtx, enum machine_mode, int);
++
++static rtx nios2_expand_custom_n (const struct builtin_description *, 
++                                  tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_custom_Xn (const struct builtin_description *, 
++                                   tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_custom_nX (const struct builtin_description *, 
++                                   tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_custom_XnX (const struct builtin_description *, 
++                                    tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_custom_nXX (const struct builtin_description *, 
++                                    tree, rtx, rtx, enum machine_mode, int);
++static rtx nios2_expand_custom_XnXX (const struct builtin_description *, 
++                                     tree, rtx, rtx, enum machine_mode, int);
++
++static tree endlink;
++
++/* int fn (volatile const void *)
++ */
++static tree int_ftype_volatile_const_void_p;
++
++/* int fn (int)
++ */
++static tree int_ftype_int;
++
++/* void fn (int, int)
++ */
++static tree void_ftype_int_int;
++
++/* void fn (volatile void *, int)
++ */
++static tree void_ftype_volatile_void_p_int;
++
++/* void fn (void)
++ */
++static tree void_ftype_void;
++
++static tree custom_n;
++static tree custom_ni;
++static tree custom_nf;
++static tree custom_np;
++static tree custom_nii;
++static tree custom_nif;
++static tree custom_nip;
++static tree custom_nfi;
++static tree custom_nff;
++static tree custom_nfp;
++static tree custom_npi;
++static tree custom_npf;
++static tree custom_npp;
++static tree custom_in;
++static tree custom_ini;
++static tree custom_inf;
++static tree custom_inp;
++static tree custom_inii;
++static tree custom_inif;
++static tree custom_inip;
++static tree custom_infi;
++static tree custom_inff;
++static tree custom_infp;
++static tree custom_inpi;
++static tree custom_inpf;
++static tree custom_inpp;
++static tree custom_fn;
++static tree custom_fni;
++static tree custom_fnf;
++static tree custom_fnp;
++static tree custom_fnii;
++static tree custom_fnif;
++static tree custom_fnip;
++static tree custom_fnfi;
++static tree custom_fnff;
++static tree custom_fnfp;
++static tree custom_fnpi;
++static tree custom_fnpf;
++static tree custom_fnpp;
++static tree custom_pn;
++static tree custom_pni;
++static tree custom_pnf;
++static tree custom_pnp;
++static tree custom_pnii;
++static tree custom_pnif;
++static tree custom_pnip;
++static tree custom_pnfi;
++static tree custom_pnff;
++static tree custom_pnfp;
++static tree custom_pnpi;
++static tree custom_pnpf;
++static tree custom_pnpp;
++
++
++static const struct builtin_description bdesc[] = {
++    {CODE_FOR_ldbio, "__builtin_ldbio", NIOS2_BUILTIN_LDBIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
++    {CODE_FOR_ldbuio, "__builtin_ldbuio", NIOS2_BUILTIN_LDBUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
++    {CODE_FOR_ldhio, "__builtin_ldhio", NIOS2_BUILTIN_LDHIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
++    {CODE_FOR_ldhuio, "__builtin_ldhuio", NIOS2_BUILTIN_LDHUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
++    {CODE_FOR_ldwio, "__builtin_ldwio", NIOS2_BUILTIN_LDWIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO},
++
++    {CODE_FOR_stbio, "__builtin_stbio", NIOS2_BUILTIN_STBIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
++    {CODE_FOR_sthio, "__builtin_sthio", NIOS2_BUILTIN_STHIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
++    {CODE_FOR_stwio, "__builtin_stwio", NIOS2_BUILTIN_STWIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO},
++
++    {CODE_FOR_sync, "__builtin_sync", NIOS2_BUILTIN_SYNC, &void_ftype_void, nios2_expand_sync},
++    {CODE_FOR_rdctl, "__builtin_rdctl", NIOS2_BUILTIN_RDCTL, &int_ftype_int, nios2_expand_rdctl},
++    {CODE_FOR_wrctl, "__builtin_wrctl", NIOS2_BUILTIN_WRCTL, &void_ftype_int_int, nios2_expand_wrctl},
++
++    {CODE_FOR_custom_n, "__builtin_custom_n", NIOS2_BUILTIN_CUSTOM_N, &custom_n, nios2_expand_custom_n},
++    {CODE_FOR_custom_ni, "__builtin_custom_ni", NIOS2_BUILTIN_CUSTOM_NI, &custom_ni, nios2_expand_custom_nX},
++    {CODE_FOR_custom_nf, "__builtin_custom_nf", NIOS2_BUILTIN_CUSTOM_NF, &custom_nf, nios2_expand_custom_nX},
++    {CODE_FOR_custom_np, "__builtin_custom_np", NIOS2_BUILTIN_CUSTOM_NP, &custom_np, nios2_expand_custom_nX},
++    {CODE_FOR_custom_nii, "__builtin_custom_nii", NIOS2_BUILTIN_CUSTOM_NII, &custom_nii, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_nif, "__builtin_custom_nif", NIOS2_BUILTIN_CUSTOM_NIF, &custom_nif, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_nip, "__builtin_custom_nip", NIOS2_BUILTIN_CUSTOM_NIP, &custom_nip, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_nfi, "__builtin_custom_nfi", NIOS2_BUILTIN_CUSTOM_NFI, &custom_nfi, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_nff, "__builtin_custom_nff", NIOS2_BUILTIN_CUSTOM_NFF, &custom_nff, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_nfp, "__builtin_custom_nfp", NIOS2_BUILTIN_CUSTOM_NFP, &custom_nfp, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_npi, "__builtin_custom_npi", NIOS2_BUILTIN_CUSTOM_NPI, &custom_npi, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_npf, "__builtin_custom_npf", NIOS2_BUILTIN_CUSTOM_NPF, &custom_npf, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_npp, "__builtin_custom_npp", NIOS2_BUILTIN_CUSTOM_NPP, &custom_npp, nios2_expand_custom_nXX},
++    {CODE_FOR_custom_in, "__builtin_custom_in", NIOS2_BUILTIN_CUSTOM_IN, &custom_in, nios2_expand_custom_Xn},
++    {CODE_FOR_custom_ini, "__builtin_custom_ini", NIOS2_BUILTIN_CUSTOM_INI, &custom_ini, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_inf, "__builtin_custom_inf", NIOS2_BUILTIN_CUSTOM_INF, &custom_inf, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_inp, "__builtin_custom_inp", NIOS2_BUILTIN_CUSTOM_INP, &custom_inp, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_inii, "__builtin_custom_inii", NIOS2_BUILTIN_CUSTOM_INII, &custom_inii, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inif, "__builtin_custom_inif", NIOS2_BUILTIN_CUSTOM_INIF, &custom_inif, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inip, "__builtin_custom_inip", NIOS2_BUILTIN_CUSTOM_INIP, &custom_inip, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_infi, "__builtin_custom_infi", NIOS2_BUILTIN_CUSTOM_INFI, &custom_infi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inff, "__builtin_custom_inff", NIOS2_BUILTIN_CUSTOM_INFF, &custom_inff, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_infp, "__builtin_custom_infp", NIOS2_BUILTIN_CUSTOM_INFP, &custom_infp, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inpi, "__builtin_custom_inpi", NIOS2_BUILTIN_CUSTOM_INPI, &custom_inpi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inpf, "__builtin_custom_inpf", NIOS2_BUILTIN_CUSTOM_INPF, &custom_inpf, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_inpp, "__builtin_custom_inpp", NIOS2_BUILTIN_CUSTOM_INPP, &custom_inpp, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fn, "__builtin_custom_fn", NIOS2_BUILTIN_CUSTOM_FN, &custom_fn, nios2_expand_custom_Xn},
++    {CODE_FOR_custom_fni, "__builtin_custom_fni", NIOS2_BUILTIN_CUSTOM_FNI, &custom_fni, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_fnf, "__builtin_custom_fnf", NIOS2_BUILTIN_CUSTOM_FNF, &custom_fnf, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_fnp, "__builtin_custom_fnp", NIOS2_BUILTIN_CUSTOM_FNP, &custom_fnp, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_fnii, "__builtin_custom_fnii", NIOS2_BUILTIN_CUSTOM_FNII, &custom_fnii, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnif, "__builtin_custom_fnif", NIOS2_BUILTIN_CUSTOM_FNIF, &custom_fnif, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnip, "__builtin_custom_fnip", NIOS2_BUILTIN_CUSTOM_FNIP, &custom_fnip, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnfi, "__builtin_custom_fnfi", NIOS2_BUILTIN_CUSTOM_FNFI, &custom_fnfi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnff, "__builtin_custom_fnff", NIOS2_BUILTIN_CUSTOM_FNFF, &custom_fnff, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnfp, "__builtin_custom_fnfp", NIOS2_BUILTIN_CUSTOM_FNFP, &custom_fnfp, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnpi, "__builtin_custom_fnpi", NIOS2_BUILTIN_CUSTOM_FNPI, &custom_fnpi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnpf, "__builtin_custom_fnpf", NIOS2_BUILTIN_CUSTOM_FNPF, &custom_fnpf, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_fnpp, "__builtin_custom_fnpp", NIOS2_BUILTIN_CUSTOM_FNPP, &custom_fnpp, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pn, "__builtin_custom_pn", NIOS2_BUILTIN_CUSTOM_PN, &custom_pn, nios2_expand_custom_Xn},
++    {CODE_FOR_custom_pni, "__builtin_custom_pni", NIOS2_BUILTIN_CUSTOM_PNI, &custom_pni, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_pnf, "__builtin_custom_pnf", NIOS2_BUILTIN_CUSTOM_PNF, &custom_pnf, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_pnp, "__builtin_custom_pnp", NIOS2_BUILTIN_CUSTOM_PNP, &custom_pnp, nios2_expand_custom_XnX},
++    {CODE_FOR_custom_pnii, "__builtin_custom_pnii", NIOS2_BUILTIN_CUSTOM_PNII, &custom_pnii, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnif, "__builtin_custom_pnif", NIOS2_BUILTIN_CUSTOM_PNIF, &custom_pnif, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnip, "__builtin_custom_pnip", NIOS2_BUILTIN_CUSTOM_PNIP, &custom_pnip, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnfi, "__builtin_custom_pnfi", NIOS2_BUILTIN_CUSTOM_PNFI, &custom_pnfi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnff, "__builtin_custom_pnff", NIOS2_BUILTIN_CUSTOM_PNFF, &custom_pnff, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnfp, "__builtin_custom_pnfp", NIOS2_BUILTIN_CUSTOM_PNFP, &custom_pnfp, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnpi, "__builtin_custom_pnpi", NIOS2_BUILTIN_CUSTOM_PNPI, &custom_pnpi, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnpf, "__builtin_custom_pnpf", NIOS2_BUILTIN_CUSTOM_PNPF, &custom_pnpf, nios2_expand_custom_XnXX},
++    {CODE_FOR_custom_pnpp, "__builtin_custom_pnpp", NIOS2_BUILTIN_CUSTOM_PNPP, &custom_pnpp, nios2_expand_custom_XnXX},
++
++
++    {0, 0, 0, 0, 0},
++};
++
++/* This does not have a closing bracket on purpose (see use) */
++#define def_param(TYPE) \
++  tree_cons (NULL_TREE, TYPE,
++
++static void
++nios2_init_builtins ()
++{
++  const struct builtin_description *d;
++
++
++  endlink = void_list_node;
++
++  /* Special indenting here because one of the brackets is in def_param */
++  /* *INDENT-OFF* */
++
++  /* int fn (volatile const void *)
++   */
++  int_ftype_volatile_const_void_p
++    = build_function_type (integer_type_node,
++			   def_param (build_qualified_type (ptr_type_node,
++			                                    TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE))
++			   endlink));
++
++
++  /* void fn (volatile void *, int)
++   */
++  void_ftype_volatile_void_p_int
++    = build_function_type (void_type_node,
++			   def_param (build_qualified_type (ptr_type_node,
++			                                    TYPE_QUAL_VOLATILE))
++			   def_param (integer_type_node)
++			   endlink)));
++
++  /* void fn (void)
++   */
++  void_ftype_void
++      = build_function_type (void_type_node,
++                             endlink);
++
++  /* int fn (int)
++   */
++  int_ftype_int
++      = build_function_type (integer_type_node,
++                             def_param (integer_type_node)
++                             endlink));
++
++  /* void fn (int, int)
++   */
++  void_ftype_int_int
++      = build_function_type (void_type_node,
++                             def_param (integer_type_node)
++                             def_param (integer_type_node)
++                             endlink)));
++
++
++#define CUSTOM_NUM def_param (integer_type_node)
++
++  custom_n
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     endlink));
++  custom_ni
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     endlink)));
++  custom_nf
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     endlink)));
++  custom_np
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     endlink)));
++  custom_nii
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_nif
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_nip
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_nfi
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_nff
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_nfp
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_npi
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_npf
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_npp
++      = build_function_type (void_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++
++  custom_in
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     endlink));
++  custom_ini
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     endlink)));
++  custom_inf
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     endlink)));
++  custom_inp
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     endlink)));
++  custom_inii
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_inif
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_inip
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_infi
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_inff
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_infp
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_inpi
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_inpf
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_inpp
++      = build_function_type (integer_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++
++  custom_fn
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     endlink));
++  custom_fni
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     endlink)));
++  custom_fnf
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     endlink)));
++  custom_fnp
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     endlink)));
++  custom_fnii
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_fnif
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_fnip
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_fnfi
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_fnff
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_fnfp
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_fnpi
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_fnpf
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_fnpp
++      = build_function_type (float_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++
++
++  custom_pn
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     endlink));
++  custom_pni
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     endlink)));
++  custom_pnf
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     endlink)));
++  custom_pnp
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     endlink)));
++  custom_pnii
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_pnif
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_pnip
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (integer_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_pnfi
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_pnff
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_pnfp
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (float_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++  custom_pnpi
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (integer_type_node)
++  			     endlink))));
++  custom_pnpf
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (float_type_node)
++  			     endlink))));
++  custom_pnpp
++      = build_function_type (ptr_type_node,
++  			     CUSTOM_NUM
++  			     def_param (ptr_type_node)
++  			     def_param (ptr_type_node)
++  			     endlink))));
++
++
++
++  /* *INDENT-ON* */
++
++
++  for (d = bdesc; d->name; d++)
++    {
++      builtin_function (d->name, *d->type, d->code,
++			BUILT_IN_MD, NULL, NULL);
++    }
++}
++
++/* Expand an expression EXP that calls a built-in function,
++   with result going to TARGET if that's convenient
++   (and in mode MODE if that's convenient).
++   SUBTARGET may be used as the target for computing one of EXP's operands.
++   IGNORE is nonzero if the value is to be ignored.  */
++
++static rtx
++nios2_expand_builtin (tree exp, rtx target, rtx subtarget, 
++                      enum machine_mode mode, int ignore)
++{
++  const struct builtin_description *d;
++  tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
++  unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
++
++  for (d = bdesc; d->name; d++)
++    if (d->code == fcode)
++      return (d->expander) (d, exp, target, subtarget, mode, ignore);
++
++  /* we should have seen one of the functins we registered */
++  abort ();
++}
++
++static rtx nios2_create_target (const struct builtin_description *, rtx);
++
++
++static rtx
++nios2_create_target (const struct builtin_description *d, rtx target)
++{
++  if (!target
++      || !(*insn_data[d->icode].operand[0].predicate) (target,
++                                                       insn_data[d->icode].operand[0].mode))
++    {
++      target = gen_reg_rtx (insn_data[d->icode].operand[0].mode);
++    }
++
++  return target;
++}
++
++
++static rtx nios2_extract_opcode (const struct builtin_description *, int, tree);
++static rtx nios2_extract_operand (const struct builtin_description *, int, int, tree);
++
++static rtx
++nios2_extract_opcode (const struct builtin_description *d, int op, tree arglist)
++{
++  enum machine_mode mode = insn_data[d->icode].operand[op].mode;
++  tree arg = TREE_VALUE (arglist);
++  rtx opcode = expand_expr (arg, NULL_RTX, mode, 0);
++  opcode = protect_from_queue (opcode, 0);
++
++  if (!(*insn_data[d->icode].operand[op].predicate) (opcode, mode))
++    error ("Custom instruction opcode must be compile time constant in the range 0-255 for %s", d->name);
++
++  return opcode;
++}
++
++static rtx
++nios2_extract_operand (const struct builtin_description *d, int op, int argnum, tree arglist)
++{
++  enum machine_mode mode = insn_data[d->icode].operand[op].mode;
++  tree arg = TREE_VALUE (arglist);
++  rtx operand = expand_expr (arg, NULL_RTX, mode, 0);
++  operand = protect_from_queue (operand, 0);
++
++  if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode))
++    operand = copy_to_mode_reg (mode, operand);
++
++  /* ??? Better errors would be nice */
++  if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode))
++    error ("Invalid argument %d to %s", argnum, d->name);
++
++  return operand;
++}
++
++
++static rtx
++nios2_expand_custom_n (const struct builtin_description *d, tree exp, 
++                       rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED, 
++                       enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++
++  /* custom_n should have exactly one operand */
++  if (insn_data[d->icode].n_operands != 1)
++    abort ();
++
++  opcode = nios2_extract_opcode (d, 0, arglist);
++
++  pat = GEN_FCN (d->icode) (opcode);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return 0;
++}
++
++static rtx
++nios2_expand_custom_Xn (const struct builtin_description *d, tree exp, 
++                        rtx target, rtx subtarget ATTRIBUTE_UNUSED, 
++                        enum machine_mode mode ATTRIBUTE_UNUSED, 
++                        int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++
++  /* custom_Xn should have exactly two operands */
++  if (insn_data[d->icode].n_operands != 2)
++    abort ();
++
++  target = nios2_create_target (d, target);
++  opcode = nios2_extract_opcode (d, 1, arglist);
++
++  pat = GEN_FCN (d->icode) (target, opcode);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return target;
++}
++
++static rtx
++nios2_expand_custom_nX (const struct builtin_description *d, tree exp, 
++                        rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED, 
++                        enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++  rtx operands[1];
++  int i;
++
++
++  /* custom_nX should have exactly two operands */
++  if (insn_data[d->icode].n_operands != 2)
++    abort ();
++
++  opcode = nios2_extract_opcode (d, 0, arglist);
++  for (i = 0; i < 1; i++)
++    {
++      arglist = TREE_CHAIN (arglist);
++      operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist);
++    }
++
++  pat = GEN_FCN (d->icode) (opcode, operands[0]);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return 0;
++}
++
++static rtx
++nios2_expand_custom_XnX (const struct builtin_description *d, tree exp, rtx target, 
++                         rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                         int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++  rtx operands[1];
++  int i;
++
++  /* custom_Xn should have exactly three operands */
++  if (insn_data[d->icode].n_operands != 3)
++    abort ();
++
++  target = nios2_create_target (d, target);
++  opcode = nios2_extract_opcode (d, 1, arglist);
++
++  for (i = 0; i < 1; i++)
++    {
++      arglist = TREE_CHAIN (arglist);
++      operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist);
++    }
++
++  pat = GEN_FCN (d->icode) (target, opcode, operands[0]);
++
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return target;
++}
++
++static rtx
++nios2_expand_custom_nXX (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED, 
++                         rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                         int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++  rtx operands[2];
++  int i;
++
++
++  /* custom_nX should have exactly three operands */
++  if (insn_data[d->icode].n_operands != 3)
++    abort ();
++
++  opcode = nios2_extract_opcode (d, 0, arglist);
++  for (i = 0; i < 2; i++)
++    {
++      arglist = TREE_CHAIN (arglist);
++      operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist);
++    }
++
++  pat = GEN_FCN (d->icode) (opcode, operands[0], operands[1]);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return 0;
++}
++
++static rtx
++nios2_expand_custom_XnXX (const struct builtin_description *d, tree exp, rtx target, 
++                          rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                          int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx opcode;
++  rtx operands[2];
++  int i;
++
++
++  /* custom_XnX should have exactly four operands */
++  if (insn_data[d->icode].n_operands != 4)
++    abort ();
++
++  target = nios2_create_target (d, target);
++  opcode = nios2_extract_opcode (d, 1, arglist);
++  for (i = 0; i < 2; i++)
++    {
++      arglist = TREE_CHAIN (arglist);
++      operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist);
++    }
++
++  pat = GEN_FCN (d->icode) (target, opcode, operands[0], operands[1]);
++
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return target;
++}
++
++
++
++static rtx
++nios2_expand_STXIO (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED, 
++                    rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                    int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx store_dest, store_val;
++  enum insn_code icode = d->icode;
++
++  /* stores should have exactly two operands */
++  if (insn_data[icode].n_operands != 2)
++    abort ();
++
++  /* process the destination of the store */
++  {
++    enum machine_mode mode = insn_data[icode].operand[0].mode;
++    tree arg = TREE_VALUE (arglist);
++    store_dest = expand_expr (arg, NULL_RTX, VOIDmode, 0);
++    store_dest = protect_from_queue (store_dest, 0);
++
++    store_dest = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, store_dest));
++
++    /* ??? Better errors would be nice */
++    if (!(*insn_data[icode].operand[0].predicate) (store_dest, mode))
++      error ("Invalid argument 1 to %s", d->name);
++  }
++
++
++  /* process the value to store */
++  {
++    enum machine_mode mode = insn_data[icode].operand[1].mode;
++    tree arg = TREE_VALUE (TREE_CHAIN (arglist));
++    store_val = expand_expr (arg, NULL_RTX, mode, 0);
++    store_val = protect_from_queue (store_val, 0);
++
++    if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
++      store_val = copy_to_mode_reg (mode, store_val);
++
++    /* ??? Better errors would be nice */
++    if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
++      error ("Invalid argument 2 to %s", d->name);
++  }
++
++  pat = GEN_FCN (d->icode) (store_dest, store_val);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return 0;
++}
++
++
++static rtx
++nios2_expand_LDXIO (const struct builtin_description * d, tree exp, rtx target, 
++                    rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, 
++                    int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx ld_src;
++  enum insn_code icode = d->icode;
++
++  /* loads should have exactly two operands */
++  if (insn_data[icode].n_operands != 2)
++    abort ();
++
++  target = nios2_create_target (d, target);
++
++  {
++    enum machine_mode mode = insn_data[icode].operand[1].mode;
++    tree arg = TREE_VALUE (arglist);
++    ld_src = expand_expr (arg, NULL_RTX, VOIDmode, 0);
++    ld_src = protect_from_queue (ld_src, 0);
++
++    ld_src = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, ld_src));
++
++    /* ??? Better errors would be nice */
++    if (!(*insn_data[icode].operand[1].predicate) (ld_src, mode))
++      {
++        error ("Invalid argument 1 to %s", d->name);
++      }
++  }
++
++  pat = GEN_FCN (d->icode) (target, ld_src);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return target;
++}
++
++
++static rtx
++nios2_expand_sync (const struct builtin_description * d ATTRIBUTE_UNUSED, 
++                   tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, 
++                   rtx subtarget ATTRIBUTE_UNUSED, 
++                   enum machine_mode mode ATTRIBUTE_UNUSED, 
++                   int ignore ATTRIBUTE_UNUSED)
++{
++  emit_insn (gen_sync ());
++  return 0;
++}
++
++static rtx
++nios2_expand_rdctl (const struct builtin_description * d ATTRIBUTE_UNUSED, 
++                   tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, 
++                   rtx subtarget ATTRIBUTE_UNUSED, 
++                   enum machine_mode mode ATTRIBUTE_UNUSED, 
++                   int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx rdctl_reg;
++  enum insn_code icode = d->icode;
++
++  /* rdctl should have exactly two operands */
++  if (insn_data[icode].n_operands != 2)
++    abort ();
++
++  target = nios2_create_target (d, target);
++
++  {
++    enum machine_mode mode = insn_data[icode].operand[1].mode;
++    tree arg = TREE_VALUE (arglist);
++    rdctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0);
++    rdctl_reg = protect_from_queue (rdctl_reg, 0);
++
++    if (!(*insn_data[icode].operand[1].predicate) (rdctl_reg, mode))
++      {
++        error ("Control register number must be in range 0-31 for %s", d->name);
++      }
++  }
++
++  pat = GEN_FCN (d->icode) (target, rdctl_reg);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return target;
++}
++
++static rtx
++nios2_expand_wrctl (const struct builtin_description * d ATTRIBUTE_UNUSED, 
++                   tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, 
++                   rtx subtarget ATTRIBUTE_UNUSED, 
++                   enum machine_mode mode ATTRIBUTE_UNUSED, 
++                   int ignore ATTRIBUTE_UNUSED)
++{
++  tree arglist = TREE_OPERAND (exp, 1);
++  rtx pat;
++  rtx wrctl_reg, store_val;
++  enum insn_code icode = d->icode;
++
++  /* stores should have exactly two operands */
++  if (insn_data[icode].n_operands != 2)
++    abort ();
++
++  /* process the destination of the store */
++  {
++    enum machine_mode mode = insn_data[icode].operand[0].mode;
++    tree arg = TREE_VALUE (arglist);
++    wrctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0);
++    wrctl_reg = protect_from_queue (wrctl_reg, 0);
++
++    if (!(*insn_data[icode].operand[0].predicate) (wrctl_reg, mode))
++      error ("Control register number must be in range 0-31 for %s", d->name);
++  }
++
++
++  /* process the value to store */
++  {
++    enum machine_mode mode = insn_data[icode].operand[1].mode;
++    tree arg = TREE_VALUE (TREE_CHAIN (arglist));
++    store_val = expand_expr (arg, NULL_RTX, mode, 0);
++    store_val = protect_from_queue (store_val, 0);
++
++    if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
++      store_val = copy_to_mode_reg (mode, store_val);
++
++    /* ??? Better errors would be nice */
++    if (!(*insn_data[icode].operand[1].predicate) (store_val, mode))
++      error ("Invalid argument 2 to %s", d->name);
++  }
++
++  pat = GEN_FCN (d->icode) (wrctl_reg, store_val);
++  if (!pat)
++    return 0;
++  emit_insn (pat);
++  return 0;
++}
++
++
++#include "gt-nios2.h"
++
+--- gcc-3.4.3/gcc/config/nios2/nios2.h
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.h
+@@ -0,0 +1,824 @@
++/* Definitions of target machine for Altera NIOS 2G NIOS2 version.
++   Copyright (C) 2003 Altera 
++   Contributed by Jonah Graham (jgraham@altera.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.  */
++
++
++
++#define TARGET_CPU_CPP_BUILTINS()		\
++  do						\
++    {						\
++      builtin_define_std ("NIOS2");		\
++      builtin_define_std ("nios2");		\
++      builtin_define ("_GNU_SOURCE");		\
++    }						\
++  while (0)
++#define TARGET_VERSION fprintf (stderr, " (Altera Nios II)")
++
++
++
++
++
++/*********************************
++ * Run-time Target Specification
++ *********************************/
++
++#define HAS_DIV_FLAG 0x0001
++#define HAS_MUL_FLAG 0x0002
++#define HAS_MULX_FLAG 0x0004
++#define FAST_SW_DIV_FLAG 0x0008
++#define INLINE_MEMCPY_FLAG 0x00010
++#define CACHE_VOLATILE_FLAG 0x0020
++#define BYPASS_CACHE_FLAG 0x0040
++
++extern int target_flags;
++#define TARGET_HAS_DIV (target_flags & HAS_DIV_FLAG)
++#define TARGET_HAS_MUL (target_flags & HAS_MUL_FLAG)
++#define TARGET_HAS_MULX (target_flags & HAS_MULX_FLAG)
++#define TARGET_FAST_SW_DIV (target_flags & FAST_SW_DIV_FLAG)
++#define TARGET_INLINE_MEMCPY (target_flags & INLINE_MEMCPY_FLAG)
++#define TARGET_CACHE_VOLATILE (target_flags & CACHE_VOLATILE_FLAG)
++#define TARGET_BYPASS_CACHE (target_flags & BYPASS_CACHE_FLAG)
++
++#define TARGET_SWITCHES					\
++{							\
++    { "hw-div", HAS_DIV_FLAG,				\
++      N_("Enable DIV, DIVU") },				\
++    { "no-hw-div", -HAS_DIV_FLAG,			\
++      N_("Disable DIV, DIVU (default)") },		\
++    { "hw-mul", HAS_MUL_FLAG,				\
++      N_("Enable MUL instructions (default)") },				\
++    { "hw-mulx", HAS_MULX_FLAG,				\
++      N_("Enable MULX instructions, assume fast shifter") },				\
++    { "no-hw-mul", -HAS_MUL_FLAG,			\
++      N_("Disable MUL instructions") },		\
++    { "no-hw-mulx", -HAS_MULX_FLAG,			\
++      N_("Disable MULX instructions, assume slow shifter (default and implied by -mno-hw-mul)") },		\
++    { "fast-sw-div", FAST_SW_DIV_FLAG,				\
++      N_("Use table based fast divide (default at -O3)") },				\
++    { "no-fast-sw-div", -FAST_SW_DIV_FLAG,			\
++      N_("Don't use table based fast divide ever") },		\
++    { "inline-memcpy", INLINE_MEMCPY_FLAG,				\
++      N_("Inline small memcpy (default when optimizing)") },				\
++    { "no-inline-memcpy", -INLINE_MEMCPY_FLAG,			\
++      N_("Don't Inline small memcpy") },		\
++    { "cache-volatile", CACHE_VOLATILE_FLAG,				\
++      N_("Volatile accesses use non-io variants of instructions (default)") },				\
++    { "no-cache-volatile", -CACHE_VOLATILE_FLAG,			\
++      N_("Volatile accesses use io variants of instructions") },		\
++    { "bypass-cache", BYPASS_CACHE_FLAG,				\
++      N_("All ld/st instructins use io variants") },				\
++    { "no-bypass-cache", -BYPASS_CACHE_FLAG,			\
++      N_("All ld/st instructins do not use io variants (default)") },		\
++    { "smallc", 0,			\
++      N_("Link with a limited version of the C library") },		\
++    { "ctors-in-init", 0,			\
++      "" /* undocumented: N_("Link with static constructors and destructors in init") */ },		\
++    { "", TARGET_DEFAULT, 0 }				\
++}
++
++
++extern const char *nios2_sys_nosys_string;    /* for -msys=nosys */
++extern const char *nios2_sys_lib_string;    /* for -msys-lib= */
++extern const char *nios2_sys_crt0_string;    /* for -msys-crt0= */
++
++#define TARGET_OPTIONS					\
++{							\
++  { "sys=nosys",    &nios2_sys_nosys_string,		\
++      N_("Use stub versions of OS library calls (default)"), 0},	\
++  { "sys-lib=",    &nios2_sys_lib_string,		\
++      N_("Name of System Library to link against. (Converted to a -l option)"), 0},	\
++  { "sys-crt0=",    &nios2_sys_crt0_string,		\
++      N_("Name of the startfile. (default is a crt0 for the ISS only)"), 0},	\
++}
++
++
++/* Default target_flags if no switches specified.  */
++#ifndef TARGET_DEFAULT
++# define TARGET_DEFAULT (HAS_MUL_FLAG | CACHE_VOLATILE_FLAG)
++#endif
++
++/* Switch  Recognition by gcc.c.  Add -G xx support */
++#undef  SWITCH_TAKES_ARG
++#define SWITCH_TAKES_ARG(CHAR)						\
++  (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G')
++
++#define OVERRIDE_OPTIONS override_options ()
++#define OPTIMIZATION_OPTIONS(LEVEL, SIZE) optimization_options (LEVEL, SIZE)
++#define CAN_DEBUG_WITHOUT_FP
++ 
++#define CC1_SPEC "\
++%{G*}"
++
++#undef LIB_SPEC
++#define LIB_SPEC \
++"--start-group %{msmallc: -lsmallc} %{!msmallc: -lc} -lgcc \
++ %{msys-lib=*: -l%*} \
++ %{!msys-lib=*: -lc } \
++ --end-group \
++ %{msys-lib=: %eYou need a library name for -msys-lib=} \
++"
++
++
++#undef STARTFILE_SPEC 
++#define STARTFILE_SPEC  \
++"%{msys-crt0=*: %*} %{!msys-crt0=*: crt1%O%s} \
++ %{msys-crt0=: %eYou need a C startup file for -msys-crt0=} \
++ %{mctors-in-init: crti%O%s crtbegin%O%s} \
++"
++
++#undef ENDFILE_SPEC 
++#define ENDFILE_SPEC \
++ "%{mctors-in-init: crtend%O%s crtn%O%s}"
++
++
++/***********************
++ * Storage Layout
++ ***********************/
++
++#define DEFAULT_SIGNED_CHAR 1
++#define BITS_BIG_ENDIAN 0
++#define BYTES_BIG_ENDIAN 0
++#define WORDS_BIG_ENDIAN 0
++#define BITS_PER_UNIT 8
++#define BITS_PER_WORD 32
++#define UNITS_PER_WORD 4
++#define POINTER_SIZE 32
++#define BIGGEST_ALIGNMENT 32
++#define STRICT_ALIGNMENT 1
++#define FUNCTION_BOUNDARY 32
++#define PARM_BOUNDARY 32
++#define STACK_BOUNDARY 32
++#define PREFERRED_STACK_BOUNDARY 32
++#define MAX_FIXED_MODE_SIZE 64
++
++#define CONSTANT_ALIGNMENT(EXP, ALIGN)				\
++  ((TREE_CODE (EXP) == STRING_CST) 				\
++   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
++
++
++/**********************
++ * Layout of Source Language Data Types
++ **********************/
++
++#define INT_TYPE_SIZE 32
++#define SHORT_TYPE_SIZE 16
++#define LONG_TYPE_SIZE 32
++#define LONG_LONG_TYPE_SIZE 64
++#define FLOAT_TYPE_SIZE 32
++#define DOUBLE_TYPE_SIZE 64
++#define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE
++
++
++/*************************
++ * Condition Code Status
++ ************************/
++
++/* comparison type */
++/* ??? currently only CMP_SI is used */
++enum cmp_type {
++  CMP_SI,				/* compare four byte integers */
++  CMP_DI,				/* compare eight byte integers */
++  CMP_SF,				/* compare single precision floats */
++  CMP_DF,				/* compare double precision floats */
++  CMP_MAX				/* max comparison type */
++};
++
++extern GTY(()) rtx branch_cmp[2];	/* operands for compare */
++extern enum cmp_type branch_type;	/* what type of branch to use */
++
++/**********************
++ * Register Usage
++ **********************/
++
++/* ---------------------------------- *
++ * Basic Characteristics of Registers
++ * ---------------------------------- */
++
++/*
++Register Number
++      Register Name
++          Alternate Name
++                Purpose
++0     r0  zero  always zero
++1     r1  at    Assembler Temporary
++2-3   r2-r3     Return Location
++4-7   r4-r7     Register Arguments
++8-15  r8-r15    Caller Saved Registers
++16-22 r16-r22   Callee Saved Registers
++23    r23 sc    Static Chain (Callee Saved)
++                ??? Does $sc want to be caller or callee 
++                saved. If caller, 15, else 23. 
++24    r24       Exception Temporary
++25    r25       Breakpoint Temporary
++26    r26 gp    Global Pointer
++27    r27 sp    Stack Pointer
++28    r28 fp    Frame Pointer
++29    r29 ea    Exception Return Address
++30    r30 ba    Breakpoint Return Address
++31    r31 ra    Return Address
++
++32    ctl0 status
++33    ctl1 estatus STATUS saved by exception ? 	
++34    ctl2 bstatus STATUS saved by break ? 	
++35    ctl3 ipri    Interrupt Priority Mask ?	
++36    ctl4 ecause  Exception Cause ? 	
++
++37         pc   Not an actual register	
++
++38    rap      Return address pointer, this does not
++                   actually exist and will be eliminated
++
++39    fake_fp  Fake Frame Pointer which will always be eliminated.
++40    fake_ap  Fake Argument Pointer which will always be eliminated.
++
++41             First Pseudo Register
++
++
++The definitions for all the hard register numbers
++are located in nios2.md.
++*/
++
++#define FIRST_PSEUDO_REGISTER 41
++#define NUM_ARG_REGS (LAST_ARG_REGNO - FIRST_ARG_REGNO + 1)
++
++
++
++/* also see CONDITIONAL_REGISTER_USAGE */
++#define FIXED_REGISTERS			     \
++    {					     \
++/*        +0  1  2  3  4  5  6  7  8  9 */   \
++/*   0 */  1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     \
++/*  10 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     \
++/*  20 */  0, 0, 0, 0, 1, 1, 1, 1, 0, 1,     \
++/*  30 */  1, 0, 1, 1, 1, 1, 1, 1, 1, 1,     \
++/*  40 */  1,                                \
++    }
++
++/* call used is the same as caller saved
++   + fixed regs + args + ret vals */
++#define CALL_USED_REGISTERS		     \
++    { 					     \
++/*        +0  1  2  3  4  5  6  7  8  9 */   \
++/*   0 */  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     \
++/*  10 */  1, 1, 1, 1, 1, 1, 0, 0, 0, 0,     \
++/*  20 */  0, 0, 0, 0, 1, 1, 1, 1, 0, 1,     \
++/*  30 */  1, 0, 1, 1, 1, 1, 1, 1, 1, 1,     \
++/*  40 */  1,                                \
++    }
++
++#define HARD_REGNO_NREGS(REGNO, MODE)            \
++   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
++    / UNITS_PER_WORD)
++
++/* --------------------------- *
++ * How Values Fit in Registers
++ * --------------------------- */
++
++#define HARD_REGNO_MODE_OK(REGNO, MODE) 1
++
++#define MODES_TIEABLE_P(MODE1, MODE2) 1
++
++
++/*************************
++ * Register Classes
++ *************************/
++
++enum reg_class
++{
++    NO_REGS,
++    ALL_REGS,
++    LIM_REG_CLASSES
++};
++
++#define N_REG_CLASSES (int) LIM_REG_CLASSES
++
++#define REG_CLASS_NAMES   \
++    {"NO_REGS",           \
++     "ALL_REGS"}
++
++#define GENERAL_REGS ALL_REGS
++
++#define REG_CLASS_CONTENTS   \
++/* NO_REGS  */       {{ 0, 0},     \
++/* ALL_REGS */        {~0,~0}}    \
++
++#define REGNO_REG_CLASS(REGNO) ALL_REGS
++
++#define BASE_REG_CLASS ALL_REGS
++#define INDEX_REG_CLASS ALL_REGS
++
++/* only one reg class, 'r', is handled automatically */
++#define REG_CLASS_FROM_LETTER(CHAR) NO_REGS
++
++#define REGNO_OK_FOR_BASE_P2(REGNO, STRICT) \
++    ((STRICT) \
++     ? (REGNO) < FIRST_PSEUDO_REGISTER \
++     : (REGNO) < FIRST_PSEUDO_REGISTER || (reg_renumber && reg_renumber[REGNO] < FIRST_PSEUDO_REGISTER))
++
++#define REGNO_OK_FOR_INDEX_P2(REGNO, STRICT) \
++    (REGNO_OK_FOR_BASE_P2 (REGNO, STRICT))
++
++#define REGNO_OK_FOR_BASE_P(REGNO) \
++    (REGNO_OK_FOR_BASE_P2 (REGNO, 1))
++
++#define REGNO_OK_FOR_INDEX_P(REGNO) \
++    (REGNO_OK_FOR_INDEX_P2 (REGNO, 1))
++
++#define REG_OK_FOR_BASE_P2(X, STRICT)                                   \
++    (STRICT                                                             \
++     ? REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)                              \
++     : REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER)
++
++#define REG_OK_FOR_INDEX_P2(X, STRICT)                                  \
++    (STRICT                                                             \
++     ? REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)                             \
++     : REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER)
++
++#define CLASS_MAX_NREGS(CLASS, MODE)             \
++   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
++    / UNITS_PER_WORD)
++
++
++#define SMALL_INT(X) ((unsigned HOST_WIDE_INT) ((X) + 0x8000) < 0x10000)
++#define SMALL_INT_UNSIGNED(X) ((unsigned HOST_WIDE_INT) (X) < 0x10000)
++#define UPPER16_INT(X) (((X) & 0xffff) == 0)
++#define SHIFT_INT(X) ((X) >= 0 && (X) <= 31)
++#define RDWRCTL_INT(X) ((X) >= 0 && (X) <= 31)
++#define CUSTOM_INSN_OPCODE(X) ((X) >= 0 && (X) <= 255)
++
++#define CONST_OK_FOR_LETTER_P(VALUE, C)			\
++ (							\
++  (C) == 'I' ? SMALL_INT (VALUE) :			\
++  (C) == 'J' ? SMALL_INT_UNSIGNED (VALUE) :		\
++  (C) == 'K' ? UPPER16_INT (VALUE) :         		\
++  (C) == 'L' ? SHIFT_INT (VALUE) :			\
++  (C) == 'M' ? (VALUE) == 0 :				\
++  (C) == 'N' ? CUSTOM_INSN_OPCODE (VALUE) :		\
++  (C) == 'O' ? RDWRCTL_INT (VALUE) :			\
++  0)
++
++#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0
++
++#define PREFERRED_RELOAD_CLASS(X, CLASS) \
++    ((CLASS) == NO_REGS ? GENERAL_REGS : (CLASS))
++
++/* 'S' matches immediates which are in small data 
++   and therefore can be added to gp to create a 
++   32-bit value. */
++#define EXTRA_CONSTRAINT(VALUE, C)		\
++  ((C) == 'S' 					\
++   && (GET_CODE (VALUE) == SYMBOL_REF)   	\
++   && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (VALUE))
++
++
++
++
++/* Say that the epilogue uses the return address register.  Note that
++   in the case of sibcalls, the values "used by the epilogue" are
++   considered live at the start of the called function.  */
++#define EPILOGUE_USES(REGNO) ((REGNO) == RA_REGNO)
++
++
++#define DEFAULT_MAIN_RETURN  c_expand_return (integer_zero_node)
++
++/**********************************
++ * Trampolines for Nested Functions
++ ***********************************/
++
++#define TRAMPOLINE_TEMPLATE(FILE) \
++    error ("trampolines not yet implemented")
++#define TRAMPOLINE_SIZE 20
++#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
++    error ("trampolines not yet implemented")
++
++/***************************
++ * Stack Layout and Calling Conventions
++ ***************************/
++
++/* ------------------ *
++ * Basic Stack Layout
++ * ------------------ */
++
++/* The downward variants are used by the compiler,
++   the upward ones serve as documentation */
++#define STACK_GROWS_DOWNWARD
++#define FRAME_GROWS_UPWARD
++#define ARGS_GROW_UPWARD
++
++#define STARTING_FRAME_OFFSET current_function_outgoing_args_size
++#define FIRST_PARM_OFFSET(FUNDECL) 0
++
++/* Before the prologue, RA lives in r31.  */
++#define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (VOIDmode, RA_REGNO)
++
++/* -------------------------------------- *
++ * Registers That Address the Stack Frame
++ * -------------------------------------- */
++
++#define STACK_POINTER_REGNUM SP_REGNO
++#define STATIC_CHAIN_REGNUM SC_REGNO
++#define PC_REGNUM PC_REGNO
++#define DWARF_FRAME_RETURN_COLUMN RA_REGNO
++
++/* Base register for access to local variables of the function.  We
++   pretend that the frame pointer is a non-existent hard register, and 
++   then eliminate it to HARD_FRAME_POINTER_REGNUM. */
++#define FRAME_POINTER_REGNUM FAKE_FP_REGNO
++
++#define HARD_FRAME_POINTER_REGNUM FP_REGNO
++#define RETURN_ADDRESS_POINTER_REGNUM RAP_REGNO
++/* the argumnet pointer needs to always be eliminated
++   so it is set to a fake hard register. */
++#define ARG_POINTER_REGNUM FAKE_AP_REGNO
++
++/* ----------------------------------------- *
++ * Eliminating Frame Pointer and Arg Pointer
++ * ----------------------------------------- */
++
++#define FRAME_POINTER_REQUIRED 0
++
++#define ELIMINABLE_REGS							\
++{{ ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},				\
++ { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM},			\
++ { RETURN_ADDRESS_POINTER_REGNUM, STACK_POINTER_REGNUM},		\
++ { RETURN_ADDRESS_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM},		\
++ { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},				\
++ { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
++
++#define CAN_ELIMINATE(FROM, TO)	1
++
++#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
++	(OFFSET) = nios2_initial_elimination_offset ((FROM), (TO))
++
++#define MUST_SAVE_REGISTER(regno) \
++ ((regs_ever_live[regno] && !call_used_regs[regno])			\
++  || (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)	\
++  || (regno == RA_REGNO && regs_ever_live[RA_REGNO]))
++
++/* Treat LOC as a byte offset from the stack pointer and round it up
++   to the next fully-aligned offset.  */
++#define STACK_ALIGN(LOC)						\
++  (((LOC) + ((PREFERRED_STACK_BOUNDARY / 8) - 1)) & ~((PREFERRED_STACK_BOUNDARY / 8) - 1))
++
++
++/* ------------------------------ *
++ * Passing Arguments in Registers
++ * ------------------------------ */
++
++/* see nios2.c */
++#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
++  (function_arg (&CUM, MODE, TYPE, NAMED))
++
++#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
++  (function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED))
++
++#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0
++
++#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) 0
++
++typedef struct nios2_args
++{
++    int regs_used;
++} CUMULATIVE_ARGS;
++
++/* This is to initialize the above unused CUM data type */
++#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
++    (init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS))
++
++#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
++    (function_arg_advance (&CUM, MODE, TYPE, NAMED))
++
++#define FUNCTION_ARG_REGNO_P(REGNO) \
++    ((REGNO) >= FIRST_ARG_REGNO && (REGNO) <= LAST_ARG_REGNO)
++
++#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL)   \
++  {								    \
++    int pret_size = nios2_setup_incoming_varargs (&(CUM), (MODE),	    \
++						(TYPE), (NO_RTL));  \
++    if (pret_size)						    \
++      (PRETEND_SIZE) = pret_size;				    \
++  }
++
++/* ----------------------------- *
++ * Generating Code for Profiling
++ * ----------------------------- */
++
++#define PROFILE_BEFORE_PROLOGUE
++
++#define FUNCTION_PROFILER(FILE, LABELNO) \
++  function_profiler ((FILE), (LABELNO))
++
++/* --------------------------------------- *
++ * Passing Function Arguments on the Stack
++ * --------------------------------------- */
++
++#define PROMOTE_PROTOTYPES 1
++
++#define PUSH_ARGS 0
++#define ACCUMULATE_OUTGOING_ARGS 1
++
++#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0
++
++/* --------------------------------------- *
++ * How Scalar Function Values Are Returned
++ * --------------------------------------- */
++
++#define FUNCTION_VALUE(VALTYPE, FUNC) \
++    gen_rtx(REG, TYPE_MODE(VALTYPE), FIRST_RETVAL_REGNO)
++
++#define LIBCALL_VALUE(MODE) \
++    gen_rtx(REG, MODE, FIRST_RETVAL_REGNO)
++
++#define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == FIRST_RETVAL_REGNO)
++
++/* ----------------------------- *
++ * How Large Values Are Returned
++ * ----------------------------- */
++
++
++#define RETURN_IN_MEMORY(TYPE)	\
++  nios2_return_in_memory (TYPE)
++
++
++#define STRUCT_VALUE 0
++
++#define DEFAULT_PCC_STRUCT_RETURN 0
++
++/*******************
++ * Addressing Modes
++ *******************/
++
++
++#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)
++
++#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X))
++
++#define MAX_REGS_PER_ADDRESS 1
++
++/* Go to ADDR if X is a valid address.  */
++#ifndef REG_OK_STRICT
++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)        \
++    {                                                  \
++        if (nios2_legitimate_address ((X), (MODE), 0))  \
++            goto ADDR;                                 \
++    }
++#else
++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)        \
++    {                                                  \
++        if (nios2_legitimate_address ((X), (MODE), 1))  \
++            goto ADDR;                                 \
++    }
++#endif
++
++#ifndef REG_OK_STRICT
++#define REG_OK_FOR_BASE_P(X)   REGNO_OK_FOR_BASE_P2 (REGNO (X), 0)
++#define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P2 (REGNO (X), 0)
++#else
++#define REG_OK_FOR_BASE_P(X)   REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)
++#define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)
++#endif
++
++#define LEGITIMATE_CONSTANT_P(X) 1
++
++/* Nios II has no mode dependent addresses.  */
++#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL)
++
++/* Set if this has a weak declaration  */
++#define SYMBOL_FLAG_WEAK_DECL	(1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
++#define SYMBOL_REF_WEAK_DECL_P(RTX) \
++  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_WEAK_DECL) != 0)
++
++
++/* true if a symbol is both small and not weak. In this case, gp
++   relative access can be used */
++#define SYMBOL_REF_IN_NIOS2_SMALL_DATA_P(RTX) \
++   (SYMBOL_REF_SMALL_P(RTX) && !SYMBOL_REF_WEAK_DECL_P(RTX))
++
++/*****************
++ * Describing Relative Costs of Operations
++ *****************/
++
++#define SLOW_BYTE_ACCESS 1
++
++/* It is as good to call a constant function address as to call an address
++   kept in a register.
++   ??? Not true anymore really. Now that call cannot address full range
++   of memory callr may need to be used */
++
++#define NO_FUNCTION_CSE
++#define NO_RECURSIVE_FUNCTION_CSE
++
++
++
++/*****************************************
++ * Defining the Output Assembler Language
++ *****************************************/
++
++/* ------------------------------------------ *
++ * The Overall Framework of an Assembler File
++ * ------------------------------------------ */
++
++#define ASM_APP_ON "#APP\n"
++#define ASM_APP_OFF "#NO_APP\n"
++
++#define ASM_COMMENT_START "# "
++
++/* ------------------------------- *
++ * Output and Generation of Labels
++ * ------------------------------- */
++
++#define GLOBAL_ASM_OP "\t.global\t"
++
++
++/* -------------- *
++ * Output of Data
++ * -------------- */
++
++#define DWARF2_UNWIND_INFO 0
++
++
++/* -------------------------------- *
++ * Assembler Commands for Alignment
++ * -------------------------------- */
++
++#define ASM_OUTPUT_ALIGN(FILE, LOG) \
++  do { \
++    fprintf ((FILE), "%s%d\n", ALIGN_ASM_OP, (LOG)); \
++  } while (0)
++
++
++/* -------------------------------- *
++ * Output of Assembler Instructions
++ * -------------------------------- */
++
++#define REGISTER_NAMES \
++{ \
++    "zero", \
++    "at", \
++    "r2", \
++    "r3", \
++    "r4", \
++    "r5", \
++    "r6", \
++    "r7", \
++    "r8", \
++    "r9", \
++    "r10", \
++    "r11", \
++    "r12", \
++    "r13", \
++    "r14", \
++    "r15", \
++    "r16", \
++    "r17", \
++    "r18", \
++    "r19", \
++    "r20", \
++    "r21", \
++    "r22", \
++    "r23", \
++    "r24", \
++    "r25", \
++    "gp", \
++    "sp", \
++    "fp", \
++    "ta", \
++    "ba", \
++    "ra", \
++    "status", \
++    "estatus", \
++    "bstatus", \
++    "ipri", \
++    "ecause", \
++    "pc", \
++    "rap", \
++    "fake_fp", \
++    "fake_ap", \
++}
++
++#define ASM_OUTPUT_OPCODE(STREAM, PTR)\
++   (PTR) = asm_output_opcode (STREAM, PTR)
++
++#define PRINT_OPERAND(STREAM, X, CODE) \
++    nios2_print_operand (STREAM, X, CODE)
++
++#define PRINT_OPERAND_ADDRESS(STREAM, X) \
++    nios2_print_operand_address (STREAM, X)
++
++#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
++do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
++     fprintf (FILE, ".L%u\n", (unsigned) (VALUE));               \
++   } while (0)
++
++
++/* ------------ *
++ * Label Output
++ * ------------ */
++
++
++/* ---------------------------------------------------- *
++ * Dividing the Output into Sections (Texts, Data, ...)
++ * ---------------------------------------------------- */
++
++/* Output before read-only data.  */
++#define TEXT_SECTION_ASM_OP ("\t.section\t.text")
++
++/* Output before writable data.  */
++#define DATA_SECTION_ASM_OP ("\t.section\t.data")
++
++
++/* Default the definition of "small data" to 8 bytes. */
++/* ??? How come I can't use HOST_WIDE_INT here? */
++extern unsigned long nios2_section_threshold;
++#define NIOS2_DEFAULT_GVALUE 8
++
++
++
++/* This says how to output assembler code to declare an
++   uninitialized external linkage data object.  Under SVR4,
++   the linker seems to want the alignment of data objects
++   to depend on their types.  We do exactly that here.  */
++
++#undef COMMON_ASM_OP
++#define COMMON_ASM_OP	"\t.comm\t"
++
++#undef  ASM_OUTPUT_ALIGNED_COMMON
++#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
++do 									\
++{									\
++  if ((SIZE) <= nios2_section_threshold)				\
++    {									\
++      named_section (0, ".sbss", 0);					\
++      (*targetm.asm_out.globalize_label) (FILE, NAME);			\
++      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
++      if (!flag_inhibit_size_directive)					\
++	ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);			\
++      ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));	\
++      ASM_OUTPUT_LABEL(FILE, NAME);					\
++      ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1);			\
++    }									\
++  else									\
++    {									\
++      fprintf ((FILE), "%s", COMMON_ASM_OP);				\
++      assemble_name ((FILE), (NAME));					\
++      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
++    }									\
++}									\
++while (0)
++
++
++/* This says how to output assembler code to declare an
++   uninitialized internal linkage data object.  Under SVR4,
++   the linker seems to want the alignment of data objects
++   to depend on their types.  We do exactly that here.  */
++
++#undef  ASM_OUTPUT_ALIGNED_LOCAL
++#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
++do {									\
++  if ((SIZE) <= nios2_section_threshold)				\
++    named_section (0, ".sbss", 0);					\
++  else									\
++    named_section (0, ".bss", 0);					\
++  ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
++  if (!flag_inhibit_size_directive)					\
++    ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);			\
++  ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));	\
++  ASM_OUTPUT_LABEL(FILE, NAME);						\
++  ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1);				\
++} while (0)
++
++
++
++/***************************
++ * Miscellaneous Parameters
++ ***************************/
++
++#define MOVE_MAX 4
++
++#define Pmode SImode
++#define FUNCTION_MODE QImode
++
++#define CASE_VECTOR_MODE Pmode
++
++#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
++
++#define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND)
++
++#define WORD_REGISTER_OPERATIONS
+--- gcc-3.4.3/gcc/config/nios2/nios2.md
++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.md
+@@ -0,0 +1,2078 @@
++;; Machine Description for Altera NIOS 2G NIOS2 version.
++;;    Copyright (C) 2003 Altera 
++;;    Contributed by Jonah Graham (jgraham@altera.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.  */
++
++
++
++;*****************************************************************************
++;*
++;* constants
++;*
++;*****************************************************************************
++(define_constants [
++  (GP_REGNO 26)
++  (SP_REGNO 27)
++  (FP_REGNO 28)
++  (RA_REGNO 31)
++  (RAP_REGNO 38)
++  (FIRST_RETVAL_REGNO 2)
++  (LAST_RETVAL_REGNO 3)
++  (FIRST_ARG_REGNO 4)
++  (LAST_ARG_REGNO 7)
++  (SC_REGNO 23)
++  (PC_REGNO 37)
++  (FAKE_FP_REGNO 39)
++  (FAKE_AP_REGNO 40)
++
++
++  (UNSPEC_BLOCKAGE 0)
++  (UNSPEC_LDBIO 1)
++  (UNSPEC_LDBUIO 2)
++  (UNSPEC_LDHIO 3)
++  (UNSPEC_LDHUIO 4)
++  (UNSPEC_LDWIO 5)
++  (UNSPEC_STBIO 6)
++  (UNSPEC_STHIO 7)
++  (UNSPEC_STWIO 8)
++  (UNSPEC_SYNC 9)
++  (UNSPEC_WRCTL 10)
++  (UNSPEC_RDCTL 11)
++  
++])
++
++
++
++;*****************************************************************************
++;*
++;* instruction scheduler
++;*
++;*****************************************************************************
++
++; No schedule info is currently available, using an assumption that no
++; instruction can use the results of the previous instruction without
++; incuring a stall.
++
++; length of an instruction (in bytes)
++(define_attr "length" "" (const_int 4))
++(define_attr "type" "unknown,complex,control,alu,cond_alu,st,ld,shift,mul,div,custom" (const_string "complex"))
++
++(define_asm_attributes
++ [(set_attr "length" "4")
++  (set_attr "type" "complex")])
++
++(define_automaton "nios2")
++(automata_option "v")
++;(automata_option "no-minimization")
++(automata_option "ndfa")
++
++; The nios2 pipeline is fairly straightforward for the fast model.
++; Every alu operation is pipelined so that an instruction can
++; be issued every cycle. However, there are still potential
++; stalls which this description tries to deal with.
++
++(define_cpu_unit "cpu" "nios2")
++
++(define_insn_reservation "complex" 1
++  (eq_attr "type" "complex")
++  "cpu")
++
++(define_insn_reservation "control" 1
++  (eq_attr "type" "control")
++  "cpu")
++
++(define_insn_reservation "alu" 1
++  (eq_attr "type" "alu")
++  "cpu")
++
++(define_insn_reservation "cond_alu" 1
++  (eq_attr "type" "cond_alu")
++  "cpu")
++
++(define_insn_reservation "st" 1
++  (eq_attr "type" "st")
++  "cpu")
++  
++(define_insn_reservation "custom" 1
++  (eq_attr "type" "custom")
++  "cpu")
++
++; shifts, muls and lds have three cycle latency
++(define_insn_reservation "ld" 3
++  (eq_attr "type" "ld")
++  "cpu")
++
++(define_insn_reservation "shift" 3
++  (eq_attr "type" "shift")
++  "cpu")
++
++(define_insn_reservation "mul" 3
++  (eq_attr "type" "mul")
++  "cpu")
++
++(define_insn_reservation "div" 1
++  (eq_attr "type" "div")
++  "cpu")
++
++
++;*****************************************************************************
++;*
++;* MOV Instructions
++;*
++;*****************************************************************************
++
++(define_expand "movqi"
++  [(set (match_operand:QI 0 "nonimmediate_operand" "")
++        (match_operand:QI 1 "general_operand" ""))]
++  ""
++{
++  if (nios2_emit_move_sequence (operands, QImode))
++    DONE;
++})
++
++(define_insn "movqi_internal"
++  [(set (match_operand:QI 0 "nonimmediate_operand" "=m, r,r, r")
++        (match_operand:QI 1 "general_operand"       "rM,m,rM,I"))]
++  "(register_operand (operands[0], QImode)
++    || register_operand (operands[1], QImode)
++    || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
++  "@
++    stb%o0\\t%z1, %0
++    ldbu%o1\\t%0, %1
++    mov\\t%0, %z1
++    movi\\t%0, %1"
++  [(set_attr "type" "st,ld,alu,alu")])
++
++(define_insn "ldbio"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(const_int 0)] UNSPEC_LDBIO))
++   (use (match_operand:SI 1 "memory_operand" "m"))]
++  ""
++  "ldbio\\t%0, %1"
++  [(set_attr "type" "ld")])
++
++(define_insn "ldbuio"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(const_int 0)] UNSPEC_LDBUIO))
++   (use (match_operand:SI 1 "memory_operand" "m"))]
++  ""
++  "ldbuio\\t%0, %1"
++  [(set_attr "type" "ld")])
++
++(define_insn "stbio"
++  [(set (match_operand:SI 0 "memory_operand" "=m")
++	(match_operand:SI 1 "register_operand"   "r"))
++   (unspec_volatile:SI [(const_int 0)] UNSPEC_STBIO)]
++  ""
++  "stbio\\t%z1, %0"
++  [(set_attr "type" "st")])
++
++
++(define_expand "movhi"
++  [(set (match_operand:HI 0 "nonimmediate_operand" "")
++        (match_operand:HI 1 "general_operand" ""))]
++  ""
++{
++  if (nios2_emit_move_sequence (operands, HImode))
++    DONE;
++})
++
++(define_insn "movhi_internal"
++  [(set (match_operand:HI 0 "nonimmediate_operand" "=m, r,r, r,r")
++        (match_operand:HI 1 "general_operand"       "rM,m,rM,I,J"))]
++  "(register_operand (operands[0], HImode)
++    || register_operand (operands[1], HImode)
++    || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
++  "@
++    sth%o0\\t%z1, %0
++    ldhu%o1\\t%0, %1
++    mov\\t%0, %z1
++    movi\\t%0, %1
++    movui\\t%0, %1"
++  [(set_attr "type" "st,ld,alu,alu,alu")])
++
++(define_insn "ldhio"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(const_int 0)] UNSPEC_LDHIO))
++   (use (match_operand:SI 1 "memory_operand" "m"))]
++  ""
++  "ldhio\\t%0, %1"
++  [(set_attr "type" "ld")])
++
++(define_insn "ldhuio"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(const_int 0)] UNSPEC_LDHUIO))
++   (use (match_operand:SI 1 "memory_operand" "m"))]
++  ""
++  "ldhuio\\t%0, %1"
++  [(set_attr "type" "ld")])
++
++(define_insn "sthio"
++  [(set (match_operand:SI 0 "memory_operand" "=m")
++	(match_operand:SI 1 "register_operand"   "r"))
++   (unspec_volatile:SI [(const_int 0)] UNSPEC_STHIO)]
++  ""
++  "sthio\\t%z1, %0"
++  [(set_attr "type" "st")])
++
++(define_expand "movsi"
++  [(set (match_operand:SI 0 "nonimmediate_operand" "")
++        (match_operand:SI 1 "general_operand" ""))]
++  ""
++{
++  if (nios2_emit_move_sequence (operands, SImode))
++    DONE;
++})
++
++(define_insn "movsi_internal"
++  [(set (match_operand:SI 0 "nonimmediate_operand" "=m, r,r, r,r,r,r")
++        (match_operand:SI 1 "general_operand"       "rM,m,rM,I,J,S,i"))]
++  "(register_operand (operands[0], SImode)
++    || register_operand (operands[1], SImode)
++    || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))"
++  "@
++    stw%o0\\t%z1, %0
++    ldw%o1\\t%0, %1
++    mov\\t%0, %z1
++    movi\\t%0, %1
++    movui\\t%0, %1
++    addi\\t%0, gp, %%gprel(%1)
++    movhi\\t%0, %H1\;addi\\t%0, %0, %L1"
++  [(set_attr "type" "st,ld,alu,alu,alu,alu,alu")])
++
++(define_insn "ldwio"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(const_int 0)] UNSPEC_LDWIO))
++   (use (match_operand:SI 1 "memory_operand" "m"))]
++  ""
++  "ldwio\\t%0, %1"
++  [(set_attr "type" "ld")])
++
++(define_insn "stwio"
++  [(set (match_operand:SI 0 "memory_operand" "=m")
++	(match_operand:SI 1 "register_operand"   "r"))
++   (unspec_volatile:SI [(const_int 0)] UNSPEC_STWIO)]
++  ""
++  "stwio\\t%z1, %0"
++  [(set_attr "type" "st")])
++
++
++
++;*****************************************************************************
++;*
++;* zero extension
++;*
++;*****************************************************************************
++
++
++(define_insn "zero_extendhisi2"
++  [(set (match_operand:SI 0 "register_operand" "=r,r")
++	(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
++  ""
++  "@
++    andi\\t%0, %1, 0xffff
++    ldhu%o1\\t%0, %1"
++  [(set_attr "type"	"alu,ld")])
++
++(define_insn "zero_extendqihi2"
++  [(set (match_operand:HI 0 "register_operand" "=r,r")
++	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
++  ""
++  "@
++    andi\\t%0, %1, 0xff
++    ldbu%o1\\t%0, %1"
++  [(set_attr "type"	"alu,ld")])
++
++(define_insn "zero_extendqisi2"
++  [(set (match_operand:SI 0 "register_operand" "=r,r")
++	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
++  ""
++  "@
++    andi\\t%0, %1, 0xff
++    ldbu%o1\\t%0, %1"
++  [(set_attr "type"	"alu,ld")])
++
++
++
++;*****************************************************************************
++;*
++;* sign extension
++;*
++;*****************************************************************************
++
++(define_expand "extendhisi2"
++  [(set (match_operand:SI 0 "register_operand" "")
++	(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
++  ""
++{
++  if (optimize && GET_CODE (operands[1]) == MEM)
++    operands[1] = force_not_mem (operands[1]);
++
++  if (GET_CODE (operands[1]) != MEM)
++    {
++      rtx op1   = gen_lowpart (SImode, operands[1]);
++      rtx temp  = gen_reg_rtx (SImode);
++      rtx shift = GEN_INT (16);
++
++      emit_insn (gen_ashlsi3 (temp, op1, shift));
++      emit_insn (gen_ashrsi3 (operands[0], temp, shift));
++      DONE;
++    }
++})
++
++(define_insn "extendhisi2_internal"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))]
++  ""
++  "ldh%o1\\t%0, %1"
++  [(set_attr "type"	"ld")])
++
++(define_expand "extendqihi2"
++  [(set (match_operand:HI 0 "register_operand" "")
++	(sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
++  ""
++{
++  if (optimize && GET_CODE (operands[1]) == MEM)
++    operands[1] = force_not_mem (operands[1]);
++
++  if (GET_CODE (operands[1]) != MEM)
++    {
++      rtx op0   = gen_lowpart (SImode, operands[0]);
++      rtx op1   = gen_lowpart (SImode, operands[1]);
++      rtx temp  = gen_reg_rtx (SImode);
++      rtx shift = GEN_INT (24);
++
++      emit_insn (gen_ashlsi3 (temp, op1, shift));
++      emit_insn (gen_ashrsi3 (op0, temp, shift));
++      DONE;
++    }
++})
++
++(define_insn "extendqihi2_internal"
++  [(set (match_operand:HI 0 "register_operand" "=r")
++	(sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))]
++  ""
++  "ldb%o1\\t%0, %1"
++  [(set_attr "type"	"ld")])
++
++
++(define_expand "extendqisi2"
++  [(set (match_operand:SI 0 "register_operand" "")
++	(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
++  ""
++{
++  if (optimize && GET_CODE (operands[1]) == MEM)
++    operands[1] = force_not_mem (operands[1]);
++
++  if (GET_CODE (operands[1]) != MEM)
++    {
++      rtx op1   = gen_lowpart (SImode, operands[1]);
++      rtx temp  = gen_reg_rtx (SImode);
++      rtx shift = GEN_INT (24);
++
++      emit_insn (gen_ashlsi3 (temp, op1, shift));
++      emit_insn (gen_ashrsi3 (operands[0], temp, shift));
++      DONE;
++    }
++})
++
++(define_insn "extendqisi2_insn"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))]
++  ""
++  "ldb%o1\\t%0, %1"
++  [(set_attr "type"	"ld")])
++
++
++
++;*****************************************************************************
++;*
++;* Arithmetic Operations
++;*
++;*****************************************************************************
++
++(define_insn "addsi3"
++  [(set (match_operand:SI 0 "register_operand"          "=r,r")
++        (plus:SI (match_operand:SI 1 "register_operand" "%r,r")
++                 (match_operand:SI 2 "arith_operand"     "r,I")))]
++  ""
++  "add%i2\\t%0, %1, %z2"
++  [(set_attr "type" "alu")])
++
++(define_insn "subsi3"
++  [(set (match_operand:SI 0 "register_operand"           "=r")
++        (minus:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++                  (match_operand:SI 2 "register_operand"  "r")))]
++  ""
++  "sub\\t%0, %z1, %2"
++  [(set_attr "type" "alu")])
++
++(define_insn "mulsi3"
++  [(set (match_operand:SI 0 "register_operand"            "=r,r")
++        (mult:SI (match_operand:SI 1 "register_operand"    "r,r")
++                 (match_operand:SI 2 "arith_operand"       "r,I")))]
++  "TARGET_HAS_MUL"
++  "mul%i2\\t%0, %1, %z2"
++  [(set_attr "type" "mul")])
++
++(define_expand "divsi3"
++  [(set (match_operand:SI 0 "register_operand"            "=r")
++        (div:SI (match_operand:SI 1 "register_operand"     "r")
++                (match_operand:SI 2 "register_operand"     "r")))]
++  ""
++{
++  if (!TARGET_HAS_DIV)
++    {
++      if (!TARGET_FAST_SW_DIV)
++	FAIL;
++      else
++        {
++	  if (nios2_emit_expensive_div (operands, SImode))
++	    DONE;
++	}
++    }
++})
++
++(define_insn "divsi3_insn"
++  [(set (match_operand:SI 0 "register_operand"            "=r")
++        (div:SI (match_operand:SI 1 "register_operand"     "r")
++                (match_operand:SI 2 "register_operand"     "r")))]
++  "TARGET_HAS_DIV"
++  "div\\t%0, %1, %2"
++  [(set_attr "type" "div")])
++
++(define_insn "udivsi3"
++  [(set (match_operand:SI 0 "register_operand"            "=r")
++        (udiv:SI (match_operand:SI 1 "register_operand"     "r")
++                (match_operand:SI 2 "register_operand"     "r")))]
++  "TARGET_HAS_DIV"
++  "divu\\t%0, %1, %2"
++  [(set_attr "type" "div")])
++
++(define_insn "smulsi3_highpart"
++  [(set (match_operand:SI 0 "register_operand"                            "=r")
++	(truncate:SI
++	 (lshiftrt:DI
++	  (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand"  "r"))
++		   (sign_extend:DI (match_operand:SI 2 "register_operand"  "r")))
++	  (const_int 32))))]
++  "TARGET_HAS_MULX"
++  "mulxss\\t%0, %1, %2"
++  [(set_attr "type" "mul")])
++
++(define_insn "umulsi3_highpart"
++  [(set (match_operand:SI 0 "register_operand"                            "=r")
++	(truncate:SI
++	 (lshiftrt:DI
++	  (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand"  "r"))
++		   (zero_extend:DI (match_operand:SI 2 "register_operand"  "r")))
++	  (const_int 32))))]
++  "TARGET_HAS_MULX"
++  "mulxuu\\t%0, %1, %2"
++  [(set_attr "type" "mul")])
++
++
++(define_expand "mulsidi3"
++    [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0)
++	  (mult:SI (match_operand:SI 1 "register_operand" "")
++		   (match_operand:SI 2 "register_operand" "")))
++     (set (subreg:SI (match_dup 0) 4)
++	  (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1))
++					     (sign_extend:DI (match_dup 2)))
++				    (const_int 32))))]
++  "TARGET_HAS_MULX"
++  "")
++
++(define_expand "umulsidi3"
++    [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0)
++	  (mult:SI (match_operand:SI 1 "register_operand" "")
++		   (match_operand:SI 2 "register_operand" "")))
++     (set (subreg:SI (match_dup 0) 4)
++	  (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1))
++					     (zero_extend:DI (match_dup 2)))
++				    (const_int 32))))]
++  "TARGET_HAS_MULX"
++  "")
++
++
++
++;*****************************************************************************
++;*
++;* Negate and ones complement
++;*
++;*****************************************************************************
++
++(define_insn "negsi2"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(neg:SI (match_operand:SI 1 "register_operand" "r")))]
++  ""
++{
++  operands[2] = const0_rtx;
++  return "sub\\t%0, %z2, %1";
++}
++  [(set_attr "type" "alu")])
++
++(define_insn "one_cmplsi2"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(not:SI (match_operand:SI 1 "register_operand" "r")))]
++  ""
++{
++  operands[2] = const0_rtx;
++  return "nor\\t%0, %z2, %1";
++}
++  [(set_attr "type" "alu")])
++
++
++
++; Logical Operantions
++
++(define_insn "andsi3"
++  [(set (match_operand:SI 0 "register_operand"         "=r, r,r")
++        (and:SI (match_operand:SI 1 "register_operand" "%r, r,r")
++                (match_operand:SI 2 "logical_operand"   "rM,J,K")))]
++  ""
++  "@
++    and\\t%0, %1, %z2
++    and%i2\\t%0, %1, %2
++    andh%i2\\t%0, %1, %U2"
++  [(set_attr "type" "alu")])
++
++(define_insn "iorsi3"
++  [(set (match_operand:SI 0 "register_operand"          "=r, r,r")
++        (ior:SI (match_operand:SI 1 "register_operand"  "%r, r,r")
++                (match_operand:SI 2 "logical_operand"    "rM,J,K")))]
++  ""
++  "@
++    or\\t%0, %1, %z2
++    or%i2\\t%0, %1, %2
++    orh%i2\\t%0, %1, %U2"
++  [(set_attr "type" "alu")])
++
++(define_insn "*norsi3"
++  [(set (match_operand:SI 0 "register_operand"                  "=r")
++        (and:SI (not:SI (match_operand:SI 1 "register_operand"  "%r"))
++                (not:SI (match_operand:SI 2 "reg_or_0_operand"   "rM"))))]
++  ""
++  "nor\\t%0, %1, %z2"
++  [(set_attr "type" "alu")])
++
++(define_insn "xorsi3"
++  [(set (match_operand:SI 0 "register_operand"          "=r, r,r")
++        (xor:SI (match_operand:SI 1 "register_operand"  "%r, r,r")
++                (match_operand:SI 2 "logical_operand"    "rM,J,K")))]
++  ""
++  "@
++    xor\\t%0, %1, %z2
++    xor%i2\\t%0, %1, %2
++    xorh%i2\\t%0, %1, %U2"
++  [(set_attr "type" "alu")])
++
++
++
++;*****************************************************************************
++;*
++;* Shifts
++;*
++;*****************************************************************************
++
++(define_insn "ashlsi3"
++  [(set (match_operand:SI 0 "register_operand"           "=r,r")
++	(ashift:SI (match_operand:SI 1 "register_operand" "r,r")
++		   (match_operand:SI 2 "shift_operand"    "r,L")))]
++  ""
++  "sll%i2\\t%0, %1, %z2"
++  [(set_attr "type" "shift")])
++
++(define_insn "ashrsi3"
++  [(set (match_operand:SI 0 "register_operand"             "=r,r")
++	(ashiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
++		     (match_operand:SI 2 "shift_operand"    "r,L")))]
++  ""
++  "sra%i2\\t%0, %1, %z2"
++  [(set_attr "type" "shift")])
++
++(define_insn "lshrsi3"
++  [(set (match_operand:SI 0 "register_operand"             "=r,r")
++	(lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r")
++		     (match_operand:SI 2 "shift_operand"    "r,L")))]
++  ""
++  "srl%i2\\t%0, %1, %z2"
++  [(set_attr "type" "shift")])
++
++(define_insn "rotlsi3"
++  [(set (match_operand:SI 0 "register_operand"           "=r,r")
++	(rotate:SI (match_operand:SI 1 "register_operand" "r,r")
++		   (match_operand:SI 2 "shift_operand"    "r,L")))]
++  ""
++  "rol%i2\\t%0, %1, %z2"
++  [(set_attr "type" "shift")])
++
++(define_insn "rotrsi3"
++  [(set (match_operand:SI 0 "register_operand"             "=r,r")
++	(rotatert:SI (match_operand:SI 1 "register_operand" "r,r")
++		     (match_operand:SI 2 "register_operand" "r,r")))]
++  ""
++  "ror\\t%0, %1, %2"
++  [(set_attr "type" "shift")])
++
++(define_insn "*shift_mul_constants"
++  [(set (match_operand:SI 0 "register_operand"                     "=r")
++	(ashift:SI (mult:SI (match_operand:SI 1 "register_operand"  "r")
++		            (match_operand:SI 2 "const_int_operand" "I"))
++		   (match_operand:SI 3          "const_int_operand" "I")))]
++  "TARGET_HAS_MUL && SMALL_INT (INTVAL (operands[2]) << INTVAL (operands[3]))"
++{
++  HOST_WIDE_INT mul = INTVAL (operands[2]) << INTVAL (operands[3]);
++  rtx ops[3];
++  
++  ops[0] = operands[0];
++  ops[1] = operands[1];
++  ops[2] = GEN_INT (mul);
++  
++  output_asm_insn ("muli\t%0, %1, %2", ops);
++  return "";
++}
++  [(set_attr "type" "mul")])
++
++
++
++
++;*****************************************************************************
++;*
++;* Prologue, Epilogue and Return
++;*
++;*****************************************************************************
++
++(define_expand "prologue"
++  [(const_int 1)]
++  ""
++{
++  expand_prologue ();
++  DONE;
++})
++
++(define_expand "epilogue"
++  [(return)]
++  ""
++{
++  expand_epilogue (false);
++  DONE;
++})
++
++(define_expand "sibcall_epilogue"
++  [(return)]
++  ""
++{
++  expand_epilogue (true);
++  DONE;
++})
++
++(define_insn "return"
++  [(return)]
++  "reload_completed && nios2_can_use_return_insn ()"
++  "ret\\t"
++)
++
++(define_insn "return_from_epilogue"
++  [(use (match_operand 0 "pmode_register_operand" ""))
++   (return)]
++  "reload_completed"
++  "ret\\t"
++)
++
++;; Block any insns from being moved before this point, since the
++;; profiling call to mcount can use various registers that aren't
++;; saved or used to pass arguments.
++
++(define_insn "blockage"
++  [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)]
++  ""
++  ""
++  [(set_attr "type" "unknown")
++   (set_attr "length" "0")])
++
++
++
++;*****************************************************************************
++;*
++;* Jumps and Calls
++;*
++;*****************************************************************************
++
++(define_insn "indirect_jump"
++  [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
++  ""
++  "jmp\\t%0"
++  [(set_attr "type" "control")])
++
++(define_insn "jump"
++  [(set (pc)
++        (label_ref (match_operand 0 "" "")))]
++  ""
++  "br\\t%0"
++  [(set_attr "type" "control")])
++
++
++(define_insn "indirect_call"
++  [(call (mem:QI (match_operand:SI 0 "register_operand" "r"))
++         (match_operand 1 "" ""))
++   (clobber (reg:SI RA_REGNO))]
++  ""
++  "callr\\t%0"
++  [(set_attr "type" "control")])
++
++(define_insn "indirect_call_value"
++  [(set (match_operand 0 "" "")
++        (call (mem:QI (match_operand:SI 1 "register_operand" "r"))
++              (match_operand 2 "" "")))
++   (clobber (reg:SI RA_REGNO))]
++  ""
++  "callr\\t%1"
++)
++
++(define_expand "call"
++  [(parallel [(call (match_operand 0 "" "")
++                    (match_operand 1 "" ""))
++              (clobber (reg:SI RA_REGNO))])]
++  ""
++  "")
++
++(define_expand "call_value"
++  [(parallel [(set (match_operand 0 "" "")
++                   (call (match_operand 1 "" "")
++                         (match_operand 2 "" "")))
++              (clobber (reg:SI RA_REGNO))])]
++  ""
++  "")
++
++(define_insn "*call"
++  [(call (mem:QI (match_operand:SI 0 "immediate_operand" "i"))
++         (match_operand 1 "" ""))
++   (clobber (match_operand:SI 2 "register_operand" "=r"))]
++  ""
++  "call\\t%0"
++  [(set_attr "type" "control")])
++
++(define_insn "*call_value"
++  [(set (match_operand 0 "" "")
++        (call (mem:QI (match_operand:SI 1 "immediate_operand" "i"))
++              (match_operand 2 "" "")))
++   (clobber (match_operand:SI 3 "register_operand" "=r"))]
++  ""
++  "call\\t%1"
++  [(set_attr "type" "control")])
++
++(define_expand "sibcall"
++  [(parallel [(call (match_operand 0 "" "")
++		    (match_operand 1 "" ""))
++	      (return)
++	      (use (match_operand 2 "" ""))])]
++  ""
++  {
++    XEXP (operands[0], 0) = copy_to_mode_reg (SImode, XEXP (operands[0], 0));
++
++    if (operands[2] == NULL_RTX)
++      operands[2] = const0_rtx;
++  }
++)
++
++(define_expand "sibcall_value"
++  [(parallel [(set (match_operand 0 "" "")
++		   (call (match_operand 1 "" "")
++			 (match_operand 2 "" "")))
++	      (return)
++	      (use (match_operand 3 "" ""))])]
++  ""
++  {
++    XEXP (operands[1], 0) = copy_to_mode_reg (SImode, XEXP (operands[1], 0));
++
++    if (operands[3] == NULL_RTX)
++      operands[3] = const0_rtx;
++  }
++)
++
++(define_insn "sibcall_insn"
++ [(call (mem:QI (match_operand:SI 0 "register_operand" "r"))
++	(match_operand 1 "" ""))
++  (return)
++  (use (match_operand 2 "" ""))]
++  ""
++  "jmp\\t%0"
++)
++
++(define_insn "sibcall_value_insn"
++ [(set (match_operand 0 "register_operand" "")
++       (call (mem:QI (match_operand:SI 1 "register_operand" "r"))
++	     (match_operand 2 "" "")))
++  (return)
++  (use (match_operand 3 "" ""))]
++  ""
++  "jmp\\t%1"
++)
++
++
++
++
++(define_expand "tablejump"
++  [(parallel [(set (pc) (match_operand 0 "register_operand" "r"))
++              (use (label_ref (match_operand 1 "" "")))])]
++  ""
++  ""
++)
++
++(define_insn "*tablejump"
++  [(set (pc)
++	(match_operand:SI 0 "register_operand" "r"))
++   (use (label_ref (match_operand 1 "" "")))]
++  ""
++  "jmp\\t%0"
++  [(set_attr "type" "control")])
++
++
++
++;*****************************************************************************
++;*
++;* Comparisons
++;*
++;*****************************************************************************
++;; Flow here is rather complex (based on MIPS):
++;;
++;;  1)	The cmp{si,di,sf,df} routine is called.  It deposits the
++;;	arguments into the branch_cmp array, and the type into
++;;	branch_type.  No RTL is generated.
++;;
++;;  2)	The appropriate branch define_expand is called, which then
++;;	creates the appropriate RTL for the comparison and branch.
++;;	Different CC modes are used, based on what type of branch is
++;;	done, so that we can constrain things appropriately.  There
++;;	are assumptions in the rest of GCC that break if we fold the
++;;	operands into the branchs for integer operations, and use cc0
++;;	for floating point, so we use the fp status register instead.
++;;	If needed, an appropriate temporary is created to hold the
++;;	of the integer compare.
++
++(define_expand "cmpsi"
++  [(set (cc0)
++	(compare:CC (match_operand:SI 0 "register_operand" "")
++		    (match_operand:SI 1 "arith_operand" "")))]
++  ""
++{
++  branch_cmp[0] = operands[0];
++  branch_cmp[1] = operands[1];
++  branch_type = CMP_SI;
++  DONE;
++})
++
++(define_expand "tstsi"
++  [(set (cc0)
++	(match_operand:SI 0 "register_operand" ""))]
++  ""
++{
++  branch_cmp[0] = operands[0];
++  branch_cmp[1] = const0_rtx;
++  branch_type = CMP_SI;
++  DONE;
++})
++
++
++;*****************************************************************************
++;*
++;* setting a register from a comparison
++;*
++;*****************************************************************************
++
++(define_expand "seq"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(eq:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (EQ, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*seq"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(eq:SI (match_operand:SI 1 "reg_or_0_operand" "%rM")
++	       (match_operand:SI 2 "arith_operand"     "rI")))]
++  ""
++  "cmpeq%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sne"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(ne:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (NE, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sne"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(ne:SI (match_operand:SI 1 "reg_or_0_operand" "%rM")
++	       (match_operand:SI 2 "arith_operand"     "rI")))]
++  ""
++  "cmpne%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sgt"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(gt:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (GT, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sgt"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(gt:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	       (match_operand:SI 2 "reg_or_0_operand"  "rM")))]
++  ""
++  "cmplt\\t%0, %z2, %z1"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sge"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(ge:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (GE, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sge"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(ge:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	       (match_operand:SI 2 "arith_operand"     "rI")))]
++  ""
++  "cmpge%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++(define_expand "sle"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(le:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (LE, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sle"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(le:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	       (match_operand:SI 2 "reg_or_0_operand"  "rM")))]
++  ""
++  "cmpge\\t%0, %z2, %z1"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "slt"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(lt:SI (match_dup 1)
++	       (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (LT, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*slt"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(lt:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	       (match_operand:SI 2 "arith_operand"     "rI")))]
++  ""
++  "cmplt%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sgtu"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(gtu:SI (match_dup 1)
++	        (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (GTU, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sgtu"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(gtu:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	        (match_operand:SI 2 "reg_or_0_operand"  "rM")))]
++  ""
++  "cmpltu\\t%0, %z2, %z1"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sgeu"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(geu:SI (match_dup 1)
++	        (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (GEU, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sgeu"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(geu:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	        (match_operand:SI 2 "uns_arith_operand"     "rJ")))]
++  ""
++  "cmpgeu%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++(define_expand "sleu"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(leu:SI (match_dup 1)
++	        (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (LEU, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sleu"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(leu:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	        (match_operand:SI 2 "reg_or_0_operand"  "rM")))]
++  ""
++  "cmpgeu\\t%0, %z2, %z1"
++  [(set_attr "type" "alu")])
++
++
++(define_expand "sltu"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(ltu:SI (match_dup 1)
++	        (match_dup 2)))]
++  ""
++{
++  if (branch_type != CMP_SI)
++    FAIL;
++
++  /* set up operands from compare.  */
++  operands[1] = branch_cmp[0];
++  operands[2] = branch_cmp[1];
++
++  gen_int_relational (LTU, operands[0], operands[1], operands[2], NULL_RTX);
++  DONE;
++})
++
++
++(define_insn "*sltu"
++  [(set (match_operand:SI 0 "register_operand"        "=r")
++	(ltu:SI (match_operand:SI 1 "reg_or_0_operand"  "rM")
++	        (match_operand:SI 2 "uns_arith_operand"     "rJ")))]
++  ""
++  "cmpltu%i2\\t%0, %z1, %z2"
++  [(set_attr "type" "alu")])
++
++
++
++
++;*****************************************************************************
++;*
++;* branches
++;*
++;*****************************************************************************
++
++(define_insn "*cbranch"
++  [(set (pc)
++	(if_then_else
++         (match_operator:SI 0 "comparison_operator"
++			    [(match_operand:SI 2 "reg_or_0_operand" "rM")
++			     (match_operand:SI 3 "reg_or_0_operand" "rM")])
++        (label_ref (match_operand 1 "" ""))
++        (pc)))]
++  ""
++  "b%0\\t%z2, %z3, %l1"
++  [(set_attr "type" "control")])
++
++
++(define_expand "beq"
++  [(set (pc)
++	(if_then_else (eq:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (EQ, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++
++(define_expand "bne"
++  [(set (pc)
++	(if_then_else (ne:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (NE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++
++(define_expand "bgt"
++  [(set (pc)
++	(if_then_else (gt:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (GT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "bge"
++  [(set (pc)
++	(if_then_else (ge:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (GE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "ble"
++  [(set (pc)
++	(if_then_else (le:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (LE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "blt"
++  [(set (pc)
++	(if_then_else (lt:CC (cc0)
++			     (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (LT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++
++(define_expand "bgtu"
++  [(set (pc)
++	(if_then_else (gtu:CC (cc0)
++		 	      (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (GTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "bgeu"
++  [(set (pc)
++	(if_then_else (geu:CC (cc0)
++			      (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (GEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "bleu"
++  [(set (pc)
++	(if_then_else (leu:CC (cc0)
++			      (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (LEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++(define_expand "bltu"
++  [(set (pc)
++	(if_then_else (ltu:CC (cc0)
++			      (const_int 0))
++		      (label_ref (match_operand 0 "" ""))
++		      (pc)))]
++  ""
++{
++  gen_int_relational (LTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]);
++  DONE;
++})
++
++
++;*****************************************************************************
++;*
++;* String and Block Operations
++;*
++;*****************************************************************************
++
++; ??? This is all really a hack to get Dhrystone to work as fast as possible
++;     things to be fixed:
++;        * let the compiler core handle all of this, for that to work the extra
++;          aliasing needs to be addressed.
++;        * we use three temporary registers for loading and storing to ensure no
++;          ld use stalls, this is excessive, because after the first ld/st only
++;          two are needed. Only two would be needed all the way through if 
++;          we could schedule with other code. Consider:
++;           1  ld $1, 0($src)
++;           2  ld $2, 4($src)
++;           3  ld $3, 8($src)
++;           4  st $1, 0($dest)
++;           5  ld $1, 12($src)
++;           6  st $2, 4($src)
++;           7  etc.
++;          The first store has to wait until 4. If it does not there will be one
++;          cycle of stalling. However, if any other instruction could be placed
++;          between 1 and 4, $3 would not be needed.
++;        * In small we probably don't want to ever do this ourself because there
++;          is no ld use stall.
++
++(define_expand "movstrsi"
++  [(parallel [(set (match_operand:BLK 0 "general_operand"  "")
++		   (match_operand:BLK 1 "general_operand"  ""))
++	      (use (match_operand:SI 2 "const_int_operand" ""))
++	      (use (match_operand:SI 3 "const_int_operand" ""))
++	      (clobber (match_scratch:SI 4                "=&r"))
++	      (clobber (match_scratch:SI 5                "=&r"))
++	      (clobber (match_scratch:SI 6                "=&r"))])]
++  "TARGET_INLINE_MEMCPY"
++{
++  rtx ld_addr_reg, st_addr_reg;
++
++  /* If the predicate for op2 fails in expr.c:emit_block_move_via_movstr 
++     it trys to copy to a register, but does not re-try the predicate.
++     ??? Intead of fixing expr.c, I fix it here. */
++  if (!const_int_operand (operands[2], SImode))
++    FAIL;
++
++  /* ??? there are some magic numbers which need to be sorted out here.
++         the basis for them is not increasing code size hugely or going
++         out of range of offset addressing */
++  if (INTVAL (operands[3]) < 4)
++    FAIL;
++  if (!optimize
++      || (optimize_size && INTVAL (operands[2]) > 12)
++      || (optimize < 3 && INTVAL (operands[2]) > 100)
++      || INTVAL (operands[2]) > 200)
++    FAIL;
++
++  st_addr_reg
++    = replace_equiv_address (operands[0],
++			     copy_to_mode_reg (Pmode, XEXP (operands[0], 0)));
++  ld_addr_reg
++    = replace_equiv_address (operands[1],
++			     copy_to_mode_reg (Pmode, XEXP (operands[1], 0)));
++  emit_insn (gen_movstrsi_internal (st_addr_reg, ld_addr_reg,
++				    operands[2], operands[3]));
++
++  DONE;
++})
++
++
++(define_insn "movstrsi_internal"
++  [(set (match_operand:BLK 0 "memory_operand"   "=o")
++	(match_operand:BLK 1 "memory_operand"    "o"))
++   (use (match_operand:SI 2 "const_int_operand"  "i"))
++   (use (match_operand:SI 3 "const_int_operand"  "i"))
++   (clobber (match_scratch:SI 4                "=&r"))
++   (clobber (match_scratch:SI 5                "=&r"))
++   (clobber (match_scratch:SI 6                "=&r"))]
++  "TARGET_INLINE_MEMCPY"
++{
++  int ld_offset = INTVAL (operands[2]);
++  int ld_len = INTVAL (operands[2]);
++  int ld_reg = 0;
++  rtx ld_addr_reg = XEXP (operands[1], 0);
++  int st_offset = INTVAL (operands[2]);
++  int st_len = INTVAL (operands[2]);
++  int st_reg = 0;
++  rtx st_addr_reg = XEXP (operands[0], 0);
++  int delay_count = 0;
++  
++  /* ops[0] is the address used by the insn
++     ops[1] is the register being loaded or stored */
++  rtx ops[2];
++  
++  if (INTVAL (operands[3]) < 4)
++    abort ();
++  
++  while (ld_offset >= 4)
++    {
++      /* if the load use delay has been met, I can start
++         storing */
++      if (delay_count >= 3)
++        {
++	  ops[0] = gen_rtx (MEM, SImode, 
++			    plus_constant (st_addr_reg, st_len - st_offset));
++	  ops[1] = operands[st_reg + 4];			 
++	  output_asm_insn ("stw\t%1, %0", ops);
++	  
++	  st_reg = (st_reg + 1) % 3;
++	  st_offset -= 4;
++        }
++    
++      ops[0] = gen_rtx (MEM, SImode, 
++			plus_constant (ld_addr_reg, ld_len - ld_offset));
++      ops[1] = operands[ld_reg + 4];			 
++      output_asm_insn ("ldw\t%1, %0", ops);
++      
++      ld_reg = (ld_reg + 1) % 3;
++      ld_offset -= 4;
++      delay_count++;
++    }
++  
++  if (ld_offset >= 2)
++    {
++      /* if the load use delay has been met, I can start
++         storing */
++      if (delay_count >= 3)
++        {
++	  ops[0] = gen_rtx (MEM, SImode, 
++			    plus_constant (st_addr_reg, st_len - st_offset));
++	  ops[1] = operands[st_reg + 4];			 
++	  output_asm_insn ("stw\t%1, %0", ops);
++	  
++	  st_reg = (st_reg + 1) % 3;
++	  st_offset -= 4;
++        }
++    
++      ops[0] = gen_rtx (MEM, HImode, 
++			plus_constant (ld_addr_reg, ld_len - ld_offset));
++      ops[1] = operands[ld_reg + 4];			 
++      output_asm_insn ("ldh\t%1, %0", ops);
++      
++      ld_reg = (ld_reg + 1) % 3;
++      ld_offset -= 2;
++      delay_count++;
++    }
++  
++  if (ld_offset >= 1)
++    {
++      /* if the load use delay has been met, I can start
++         storing */
++      if (delay_count >= 3)
++        {
++	  ops[0] = gen_rtx (MEM, SImode, 
++			    plus_constant (st_addr_reg, st_len - st_offset));
++	  ops[1] = operands[st_reg + 4];			 
++	  output_asm_insn ("stw\t%1, %0", ops);
++	  
++	  st_reg = (st_reg + 1) % 3;
++	  st_offset -= 4;
++        }
++    
++      ops[0] = gen_rtx (MEM, QImode, 
++			plus_constant (ld_addr_reg, ld_len - ld_offset));
++      ops[1] = operands[ld_reg + 4];			 
++      output_asm_insn ("ldb\t%1, %0", ops);
++      
++      ld_reg = (ld_reg + 1) % 3;
++      ld_offset -= 1;
++      delay_count++;
++    }
++
++    while (st_offset >= 4)
++      {
++	ops[0] = gen_rtx (MEM, SImode, 
++			  plus_constant (st_addr_reg, st_len - st_offset));
++	ops[1] = operands[st_reg + 4];			 
++	output_asm_insn ("stw\t%1, %0", ops);
++
++	st_reg = (st_reg + 1) % 3;
++	st_offset -= 4;
++      }
++  
++    while (st_offset >= 2)
++      {
++	ops[0] = gen_rtx (MEM, HImode, 
++			  plus_constant (st_addr_reg, st_len - st_offset));
++	ops[1] = operands[st_reg + 4];			 
++	output_asm_insn ("sth\t%1, %0", ops);
++
++	st_reg = (st_reg + 1) % 3;
++	st_offset -= 2;
++      }
++  
++    while (st_offset >= 1)
++      {
++	ops[0] = gen_rtx (MEM, QImode, 
++			  plus_constant (st_addr_reg, st_len - st_offset));
++	ops[1] = operands[st_reg + 4];			 
++	output_asm_insn ("stb\t%1, %0", ops);
++
++	st_reg = (st_reg + 1) % 3;
++	st_offset -= 1;
++      }
++  
++  return "";
++}
++; ??? lengths are not being used yet, but I will probably forget
++; to update this once I am using lengths, so set it to something
++; definetely big enough to cover it. 400 allows for 200 bytes
++; of motion.
++  [(set_attr "length" "400")])
++
++
++
++;*****************************************************************************
++;*
++;* Custom instructions
++;*
++;*****************************************************************************
++
++(define_constants [
++  (CUSTOM_N 100)
++  (CUSTOM_NI 101)
++  (CUSTOM_NF 102)
++  (CUSTOM_NP 103)
++  (CUSTOM_NII 104)
++  (CUSTOM_NIF 105)
++  (CUSTOM_NIP 106)
++  (CUSTOM_NFI 107)
++  (CUSTOM_NFF 108)
++  (CUSTOM_NFP 109)
++  (CUSTOM_NPI 110)
++  (CUSTOM_NPF 111)
++  (CUSTOM_NPP 112)
++  (CUSTOM_IN 113)
++  (CUSTOM_INI 114)
++  (CUSTOM_INF 115)
++  (CUSTOM_INP 116)
++  (CUSTOM_INII 117)
++  (CUSTOM_INIF 118)
++  (CUSTOM_INIP 119)
++  (CUSTOM_INFI 120)
++  (CUSTOM_INFF 121)
++  (CUSTOM_INFP 122)
++  (CUSTOM_INPI 123)
++  (CUSTOM_INPF 124)
++  (CUSTOM_INPP 125)
++  (CUSTOM_FN 126)
++  (CUSTOM_FNI 127)
++  (CUSTOM_FNF 128)
++  (CUSTOM_FNP 129)
++  (CUSTOM_FNII 130)
++  (CUSTOM_FNIF 131)
++  (CUSTOM_FNIP 132)
++  (CUSTOM_FNFI 133)
++  (CUSTOM_FNFF 134)
++  (CUSTOM_FNFP 135)
++  (CUSTOM_FNPI 136)
++  (CUSTOM_FNPF 137)
++  (CUSTOM_FNPP 138)
++  (CUSTOM_PN 139)
++  (CUSTOM_PNI 140)
++  (CUSTOM_PNF 141)
++  (CUSTOM_PNP 142)
++  (CUSTOM_PNII 143)
++  (CUSTOM_PNIF 144)
++  (CUSTOM_PNIP 145)
++  (CUSTOM_PNFI 146)
++  (CUSTOM_PNFF 147)
++  (CUSTOM_PNFP 148)
++  (CUSTOM_PNPI 149)
++  (CUSTOM_PNPF 150)
++  (CUSTOM_PNPP 151)
++])
++
++
++(define_insn "custom_n"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")] CUSTOM_N)]
++  ""
++  "custom\\t%0, zero, zero, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_ni"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")] CUSTOM_NI)]
++  ""
++  "custom\\t%0, zero, %1, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nf"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SF 1 "register_operand"   "r")] CUSTOM_NF)]
++  ""
++  "custom\\t%0, zero, %1, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_np"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")] CUSTOM_NP)]
++  ""
++  "custom\\t%0, zero, %1, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nii"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NII)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nif"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SF 2 "register_operand"   "r")] CUSTOM_NIF)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nip"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NIP)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nfi"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SF 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NFI)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nff"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SF 1 "register_operand"   "r")
++                     (match_operand:SF 2 "register_operand"   "r")] CUSTOM_NFF)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_nfp"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SF 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NFP)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_npi"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NPI)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_npf"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SF 2 "register_operand"   "r")] CUSTOM_NPF)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_npp"
++  [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")
++                     (match_operand:SI 1 "register_operand"   "r")
++                     (match_operand:SI 2 "register_operand"   "r")] CUSTOM_NPP)]
++  ""
++  "custom\\t%0, zero, %1, %2"
++  [(set_attr "type" "custom")])
++
++
++
++(define_insn "custom_in"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_IN))]
++  ""
++  "custom\\t%1, %0, zero, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_ini"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_INI))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inf"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")] CUSTOM_INF))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_INP))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inii"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INII))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inif"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_INIF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inip"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INIP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_infi"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INFI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inff"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_INFF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_infp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INFP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inpi"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INPI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inpf"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_INPF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_inpp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_INPP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++
++
++
++
++(define_insn "custom_fn"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_FN))]
++  ""
++  "custom\\t%1, %0, zero, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fni"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_FNI))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnf"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")] CUSTOM_FNF))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnp"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_FNP))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnii"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNII))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnif"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_FNIF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnip"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNIP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnfi"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNFI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnff"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_FNFF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnfp"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNFP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnpi"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNPI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnpf"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_FNPF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_fnpp"
++  [(set (match_operand:SF 0 "register_operand"   "=r")
++        (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_FNPP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++
++
++(define_insn "custom_pn"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_PN))]
++  ""
++  "custom\\t%1, %0, zero, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pni"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_PNI))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnf"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")] CUSTOM_PNF))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")] CUSTOM_PNP))]
++  ""
++  "custom\\t%1, %0, %2, zero"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnii"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNII))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnif"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_PNIF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnip"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNIP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnfi"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNFI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnff"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_PNFF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnfp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SF 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNFP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnpi"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNPI))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnpf"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SF 3 "register_operand"   "r")] CUSTOM_PNPF))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++(define_insn "custom_pnpp"
++  [(set (match_operand:SI 0 "register_operand"   "=r")
++        (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")
++                          (match_operand:SI 2 "register_operand"   "r")
++                          (match_operand:SI 3 "register_operand"   "r")] CUSTOM_PNPP))]
++  ""
++  "custom\\t%1, %0, %2, %3"
++  [(set_attr "type" "custom")])
++
++
++
++
++
++
++;*****************************************************************************
++;*
++;* Misc
++;*
++;*****************************************************************************
++
++(define_insn "nop"
++  [(const_int 0)]
++  ""
++  "nop\\t"
++  [(set_attr "type" "alu")])
++
++(define_insn "sync"
++  [(unspec_volatile [(const_int 0)] UNSPEC_SYNC)]
++  ""
++  "sync\\t"
++  [(set_attr "type" "control")])
++
++
++(define_insn "rdctl"
++  [(set (match_operand:SI 0 "register_operand" "=r")
++	(unspec_volatile:SI [(match_operand:SI 1 "rdwrctl_operand" "O")] UNSPEC_RDCTL))]
++  ""
++  "rdctl\\t%0, ctl%1"
++  [(set_attr "type" "control")])
++
++(define_insn "wrctl"
++  [(unspec_volatile:SI [(match_operand:SI 0 "rdwrctl_operand"  "O")
++                        (match_operand:SI 1 "register_operand" "r")] UNSPEC_WRCTL)]
++  ""
++  "wrctl\\tctl%0, %1"
++  [(set_attr "type" "control")])
++
++
++
++;*****************************************************************************
++;*
++;* Peepholes
++;*
++;*****************************************************************************
++
++
+--- gcc-3.4.3/gcc/config/nios2/t-nios2
++++ gcc-3.4.3-nios2/gcc/config/nios2/t-nios2
+@@ -0,0 +1,123 @@
++##
++## Compiler flags to use when compiling libgcc2.c.
++##
++## LIB2FUNCS_EXTRA
++## A list of source file names to be compiled or assembled and inserted into libgcc.a.
++
++LIB2FUNCS_EXTRA=$(srcdir)/config/nios2/lib2-divmod.c \
++  $(srcdir)/config/nios2/lib2-divmod-hi.c \
++  $(srcdir)/config/nios2/lib2-divtable.c \
++  $(srcdir)/config/nios2/lib2-mul.c
++
++##
++## Floating Point Emulation
++## To have GCC include software floating point libraries in libgcc.a define FPBIT
++## and DPBIT along with a few rules as follows:
++##
++## # We want fine grained libraries, so use the new code
++## # to build the floating point emulation libraries.
++FPBIT=$(srcdir)/config/nios2/nios2-fp-bit.c
++DPBIT=$(srcdir)/config/nios2/nios2-dp-bit.c
++
++TARGET_LIBGCC2_CFLAGS = -O2
++
++# FLOAT_ONLY - no doubles
++# SMALL_MACHINE - QI/HI is faster than SI
++#     Actually SMALL_MACHINE uses chars and shorts instead of ints
++#     since ints (16-bit ones as they are today) are at least as fast
++#     as chars and shorts, don't define SMALL_MACHINE
++# CMPtype - type returned by FP compare, i.e. INT (hard coded in fp-bit - see code )
++
++$(FPBIT): $(srcdir)/config/fp-bit.c Makefile
++	echo '#define FLOAT'          >  ${FPBIT}
++	cat $(srcdir)/config/fp-bit.c >> ${FPBIT}
++
++$(DPBIT): $(srcdir)/config/fp-bit.c Makefile
++	echo ''          >  ${DPBIT}
++	cat $(srcdir)/config/fp-bit.c >> ${DPBIT}
++
++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o 
++
++# Assemble startup files. 
++$(T)crti.o: $(srcdir)/config/nios2/crti.asm $(GCC_PASSES) 
++	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++	-c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/nios2/crti.asm 
++
++$(T)crtn.o: $(srcdir)/config/nios2/crtn.asm $(GCC_PASSES) 
++	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
++	-c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/nios2/crtn.asm 
++
++
++## You may need to provide additional #defines at the beginning of
++## fp-bit.c and dp-bit.c to control target endianness and other options
++##
++## CRTSTUFF_T_CFLAGS
++## Special flags used when compiling crtstuff.c.  See Initialization.
++##
++## CRTSTUFF_T_CFLAGS_S
++## Special flags used when compiling crtstuff.c for shared linking.  Used
++## if you use crtbeginS.o and crtendS.o in EXTRA-PARTS. See Initialization.
++##
++## MULTILIB_OPTIONS
++## For some targets, invoking GCC in different ways produces objects that
++## can not be linked together.  For example, for some targets GCC produces
++## both big and little endian code.  For these targets, you must arrange
++## for multiple versions of libgcc.a to be compiled, one for each set of
++## incompatible options.  When GCC invokes the linker, it arranges to link
++## in the right version of libgcc.a, based on the command line options
++## used.
++## The MULTILIB_OPTIONS macro lists the set of options for which special
++## versions of libgcc.a must be built.  Write options that are mutually
++## incompatible side by side, separated by a slash.  Write options that may
++## be used together separated by a space.  The build procedure will build
++## all combinations of compatible options.
++##
++## For example, if you set MULTILIB_OPTIONS to m68000/m68020 msoft-float,
++## Makefile will build special versions of libgcc.a using the following
++## sets of options: -m68000, -m68020, -msoft-float, -m68000 -msoft-float,
++## and -m68020 -msoft-float.
++
++MULTILIB_OPTIONS = mno-hw-mul mhw-mulx
++
++## MULTILIB_DIRNAMES
++## If MULTILIB_OPTIONS is used, this variable specifies the directory names
++## that should be used to hold the various libraries.  Write one element in
++## MULTILIB_DIRNAMES for each element in MULTILIB_OPTIONS. If
++## MULTILIB_DIRNAMES is not used, the default value will be
++## MULTILIB_OPTIONS, with all slashes treated as spaces.
++## For example, if MULTILIB_OPTIONS is set to m68000/m68020 msoft-float,
++## then the default value of MULTILIB_DIRNAMES is m68000 m68020
++## msoft-float.  You may specify a different value if you desire a
++## different set of directory names.
++
++# MULTILIB_DIRNAMES =
++
++## MULTILIB_MATCHES
++## Sometimes the same option may be written in two different ways.  If an
++## option is listed in MULTILIB_OPTIONS, GCC needs to know about any
++## synonyms.  In that case, set MULTILIB_MATCHES to a list of items of the
++## form option=option to describe all relevant synonyms.  For example,
++## m68000=mc68000 m68020=mc68020.
++##
++## MULTILIB_EXCEPTIONS
++## Sometimes when there are multiple sets of MULTILIB_OPTIONS being
++## specified, there are combinations that should not be built.  In that
++## case, set MULTILIB_EXCEPTIONS to be all of the switch exceptions in
++## shell case syntax that should not be built.
++## For example, in the PowerPC embedded ABI support, it is not desirable to
++## build libraries compiled with the -mcall-aix option and either of the
++## -fleading-underscore or -mlittle options at the same time.  Therefore
++## MULTILIB_EXCEPTIONS is set to
++##
++## *mcall-aix/*fleading-underscore* *mlittle/*mcall-aix*
++##
++
++MULTILIB_EXCEPTIONS = *mno-hw-mul/*mhw-mulx*
++
++##
++## MULTILIB_EXTRA_OPTS Sometimes it is desirable that when building
++## multiple versions of libgcc.a certain options should always be passed on
++## to the compiler.  In that case, set MULTILIB_EXTRA_OPTS to be the list
++## of options to be used for all builds.
++##
++
+--- gcc-3.4.3/gcc/config.gcc
++++ gcc-3.4.3-nios2/gcc/config.gcc
+@@ -1321,6 +1321,10 @@ m32rle-*-linux*)
+ 		thread_file='posix'
+ 	fi
+ 	;;
++# JBG
++nios2-*-* | nios2-*-*)
++	tm_file="elfos.h ${tm_file}"
++	;;
+ # m68hc11 and m68hc12 share the same machine description.
+ m68hc11-*-*|m6811-*-*)
+ 	tm_file="dbxelf.h elfos.h m68hc11/m68hc11.h"
+--- gcc-3.4.3/gcc/cse.c
++++ gcc-3.4.3-nios2/gcc/cse.c
+@@ -3134,6 +3134,10 @@ find_comparison_args (enum rtx_code code
+ #ifdef FLOAT_STORE_FLAG_VALUE
+ 	  REAL_VALUE_TYPE fsfv;
+ #endif
++#ifdef __nios2__
++	  if (p->is_const)
++	    break;
++#endif
+ 
+ 	  /* If the entry isn't valid, skip it.  */
+ 	  if (! exp_equiv_p (p->exp, p->exp, 1, 0))
+--- gcc-3.4.3/gcc/doc/extend.texi
++++ gcc-3.4.3-nios2/gcc/doc/extend.texi
+@@ -5636,12 +5636,118 @@ to those machines.  Generally these gene
+ instructions, but allow the compiler to schedule those calls.
+ 
+ @menu
++* Altera Nios II Built-in Functions::
+ * Alpha Built-in Functions::
+ * ARM Built-in Functions::
+ * X86 Built-in Functions::
+ * PowerPC AltiVec Built-in Functions::
+ @end menu
+ 
++@node Altera Nios II Built-in Functions
++@subsection Altera Nios II Built-in Functions
++
++These built-in functions are available for the Altera Nios II
++family of processors.
++
++The following built-in functions are always available.  They
++all generate the machine instruction that is part of the name.
++
++@example
++int __builtin_ldbio (volatile const void *)
++int __builtin_ldbuio (volatile const void *)
++int __builtin_ldhio (volatile const void *)
++int __builtin_ldhuio (volatile const void *)
++int __builtin_ldwio (volatile const void *)
++void __builtin_stbio (volatile void *, int)
++void __builtin_sthio (volatile void *, int)
++void __builtin_stwio (volatile void *, int)
++void __builtin_sync (void)
++int __builtin_rdctl (int) 
++void __builtin_wrctl (int, int)
++@end example
++
++The following built-in functions are always available.  They
++all generate a Nios II Custom Instruction. The name of the 
++function represents the types that the function takes and 
++returns. The letter before the @code{n} is the return type
++or void if absent. The @code{n} represnts the first parameter
++to all the custom instructions, the custom instruction number.
++The two letters after the @code{n} represent the up to two 
++parameters to the function.
++
++The letters reprsent the following data types:
++@table @code
++@item <no letter>
++@code{void} for return type and no parameter for parameter types.
++
++@item i
++@code{int} for return type and parameter type
++
++@item f
++@code{float} for return type and parameter type
++
++@item p
++@code{void *} for return type and parameter type
++
++@end table
++
++And the function names are:
++@example
++void __builtin_custom_n (void)
++void __builtin_custom_ni (int)
++void __builtin_custom_nf (float)
++void __builtin_custom_np (void *)
++void __builtin_custom_nii (int, int)
++void __builtin_custom_nif (int, float)
++void __builtin_custom_nip (int, void *)
++void __builtin_custom_nfi (float, int)
++void __builtin_custom_nff (float, float)
++void __builtin_custom_nfp (float, void *)
++void __builtin_custom_npi (void *, int)
++void __builtin_custom_npf (void *, float)
++void __builtin_custom_npp (void *, void *)
++int __builtin_custom_in (void)
++int __builtin_custom_ini (int)
++int __builtin_custom_inf (float)
++int __builtin_custom_inp (void *)
++int __builtin_custom_inii (int, int)
++int __builtin_custom_inif (int, float)
++int __builtin_custom_inip (int, void *)
++int __builtin_custom_infi (float, int)
++int __builtin_custom_inff (float, float)
++int __builtin_custom_infp (float, void *)
++int __builtin_custom_inpi (void *, int)
++int __builtin_custom_inpf (void *, float)
++int __builtin_custom_inpp (void *, void *)
++float __builtin_custom_fn (void)
++float __builtin_custom_fni (int)
++float __builtin_custom_fnf (float)
++float __builtin_custom_fnp (void *)
++float __builtin_custom_fnii (int, int)
++float __builtin_custom_fnif (int, float)
++float __builtin_custom_fnip (int, void *)
++float __builtin_custom_fnfi (float, int)
++float __builtin_custom_fnff (float, float)
++float __builtin_custom_fnfp (float, void *)
++float __builtin_custom_fnpi (void *, int)
++float __builtin_custom_fnpf (void *, float)
++float __builtin_custom_fnpp (void *, void *)
++void * __builtin_custom_pn (void)
++void * __builtin_custom_pni (int)
++void * __builtin_custom_pnf (float)
++void * __builtin_custom_pnp (void *)
++void * __builtin_custom_pnii (int, int)
++void * __builtin_custom_pnif (int, float)
++void * __builtin_custom_pnip (int, void *)
++void * __builtin_custom_pnfi (float, int)
++void * __builtin_custom_pnff (float, float)
++void * __builtin_custom_pnfp (float, void *)
++void * __builtin_custom_pnpi (void *, int)
++void * __builtin_custom_pnpf (void *, float)
++void * __builtin_custom_pnpp (void *, void *)
++@end example
++
++
+ @node Alpha Built-in Functions
+ @subsection Alpha Built-in Functions
+ 
+--- gcc-3.4.3/gcc/doc/invoke.texi
++++ gcc-3.4.3-nios2/gcc/doc/invoke.texi
+@@ -337,6 +337,14 @@ in the following sections.
+ @item Machine Dependent Options
+ @xref{Submodel Options,,Hardware Models and Configurations}.
+ 
++@emph{Altera Nios II Options}
++@gccoptlist{-msmallc -mno-bypass-cache -mbypass-cache @gol
++-mno-cache-volatile -mcache-volatile -mno-inline-memcpy @gol 
++-minline-memcpy -mno-fast-sw-div -mfast-sw-div @gol
++-mhw-mul -mno-hw-mul -mhw-mulx -mno-hw-mulx @gol
++-mno-hw-div -mhw-div @gol
++-msys-crt0= -msys-lib= -msys=nosys }
++
+ @emph{M680x0 Options}
+ @gccoptlist{-m68000  -m68020  -m68020-40  -m68020-60  -m68030  -m68040 @gol
+ -m68060  -mcpu32  -m5200  -m68881  -mbitfield  -mc68000  -mc68020   @gol
+@@ -5836,6 +5844,7 @@ machine description.  The default for th
+ that macro, which enables you to change the defaults.
+ 
+ @menu
++* Altera Nios II Options::
+ * M680x0 Options::
+ * M68hc1x Options::
+ * VAX Options::
+@@ -5871,6 +5880,103 @@ that macro, which enables you to change 
+ * FRV Options::
+ @end menu
+ 
++
++@node Altera Nios II Options
++@subsection Altera Nios II Options
++@cindex Altera Nios II options
++
++These are the @samp{-m} options defined for the Altera Nios II 
++processor.
++
++@table @gcctabopt
++
++@item -msmallc
++@opindex msmallc
++
++Link with a limited version of the C library, -lsmallc. For more 
++information see the C Library Documentation.
++
++
++@item -mbypass-cache
++@itemx -mno-bypass-cache
++@opindex mno-bypass-cache
++@opindex mbypass-cache
++
++Force all load and store instructions to always bypass cache by 
++using io variants of the instructions. The default is to not
++bypass the cache.
++
++@item -mno-cache-volatile 
++@itemx -mcache-volatile       
++@opindex mcache-volatile 
++@opindex mno-cache-volatile
++
++Volatile memory access bypass the cache using the io variants of 
++the ld and st instructions. The default is to cache volatile 
++accesses. 
++
++-mno-cache-volatile is deprecated and will be deleted in a 
++future GCC release.
++
++
++@item -mno-inline-memcpy
++@itemx -minline-memcpy
++@opindex mno-inline-memcpy 
++@opindex minline-memcpy
++
++Do not inline memcpy. The default is to inline when -O is on.
++
++
++@item -mno-fast-sw-div
++@itemx -mfast-sw-div
++@opindex mno-fast-sw-div
++@opindex mfast-sw-div
++
++Do no use table based fast divide for small numbers. The default 
++is to use the fast divide at -O3 and above.
++
++
++@item -mno-hw-mul
++@itemx -mhw-mul
++@itemx -mno-hw-mulx
++@itemx -mhw-mulx
++@itemx -mno-hw-div
++@itemx -mhw-div
++@opindex mno-hw-mul
++@opindex mhw-mul
++@opindex mno-hw-mulx
++@opindex mhw-mulx
++@opindex mno-hw-div
++@opindex mhw-div
++
++Enable or disable emitting @code{mul}, @code{mulx} and @code{div} family of 
++instructions by the compiler. The default is to emit @code{mul}
++and not emit @code{div} and @code{mulx}.
++
++The different combinations of @code{mul} and @code{mulx} instructions 
++generate a different multilib options. 
++
++
++@item -msys-crt0=@var{startfile}
++@opindex msys-crt0
++
++@var{startfile} is the file name  of the startfile (crt0) to use 
++when linking. The default is crt0.o that comes with libgloss
++and is only suitable for use with the instruction set
++simulator.
++
++@item -msys-lib=@var{systemlib}
++@itemx -msys-lib=nosys
++@opindex msys-lib
++
++@var{systemlib} is the library name of the library which provides
++the system calls required by the C library, e.g. @code{read}, @code{write}
++etc. The default is to use nosys, this library provides
++stub implementations of the calls and is part of libgloss.
++
++@end table
++
++
+ @node M680x0 Options
+ @subsection M680x0 Options
+ @cindex M680x0 options
+--- gcc-3.4.3/gcc/doc/md.texi
++++ gcc-3.4.3-nios2/gcc/doc/md.texi
+@@ -1335,6 +1335,49 @@ However, here is a summary of the machin
+ available on some particular machines.
+ 
+ @table @emph
++
++@item Altera Nios II family---@file{nios2.h}
++@table @code
++
++@item I
++Integer that is valid as an immediate operand in an
++instruction taking a signed 16-bit number. Range
++@minus{}32768 to 32767.
++
++@item J
++Integer that is valid as an immediate operand in an
++instruction taking an unsigned 16-bit number. Range
++0 to 65535.
++
++@item K
++Integer that is valid as an immediate operand in an
++instruction taking only the upper 16-bits of a
++32-bit number. Range 32-bit numbers with the lower
++16-bits being 0.
++
++@item L
++Integer that is valid as an immediate operand for a 
++shift instruction. Range 0 to 31.
++
++
++@item M
++Integer that is valid as an immediate operand for
++only the value 0. Can be used in conjunction with
++the format modifier @code{z} to use @code{r0}
++instead of @code{0} in the assembly output.
++
++@item N
++Integer that is valid as an immediate operand for
++a custom instruction opcode. Range 0 to 255.
++
++@item S
++Matches immediates which are addresses in the small
++data section and therefore can be added to @code{gp}
++as a 16-bit immediate to re-create their 32-bit value.
++
++@end table
++
++
+ @item ARM family---@file{arm.h}
+ @table @code
+ @item f
diff --git a/patches/gcc/3.4.4/arm-softfloat.patch b/patches/gcc/3.4.4/arm-softfloat.patch
new file mode 100644
index 00000000..19d1b90d
--- /dev/null
+++ b/patches/gcc/3.4.4/arm-softfloat.patch
@@ -0,0 +1,270 @@
+Note... modified my mjn3 to not conflict with the big endian arm patch.
+Warning!!!  Only the linux target is aware of TARGET_ENDIAN_DEFAULT.
+Also changed
+  #define SUBTARGET_EXTRA_ASM_SPEC "\
+  %{!mcpu=*:-mcpu=xscale} \
+  %{mhard-float:-mfpu=fpa} \
+  %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
+to
+  #define SUBTARGET_EXTRA_ASM_SPEC "\
+  %{mhard-float:-mfpu=fpa} \
+  %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
+in gcc/config/arm/linux-elf.h.
+#
+# Submitted:
+#
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# Description:
+#
+# Nicholas Pitre released this patch for gcc soft-float support here: 
+# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html
+#
+# This version has been adapted to work with gcc 3.4.0.
+#
+# The original patch doesn't distinguish between softfpa and softvfp modes
+# in the way Nicholas Pitre probably meant.  His description is:
+#
+# "Default is to use APCS-32 mode with soft-vfp.  The old Linux default for
+# floats can be achieved with -mhard-float or with the configure
+# --with-float=hard option.  If -msoft-float or --with-float=soft is used then
+# software float support will be used just like the default but with the legacy
+# big endian word ordering for double float representation instead."
+#
+# Which means the following:
+#
+# * If you compile without -mhard-float or -msoft-float, you should get
+#   software floating point, using the VFP format.  The produced object file
+#   should have these flags in its header:
+#
+#     private flags = 600: [APCS-32] [VFP float format] [software FP]
+#
+# * If you compile with -mhard-float, you should get hardware floating point,
+#   which always uses the FPA format.  Object file header flags should be:
+#
+#     private flags = 0: [APCS-32] [FPA float format]
+#
+# * If you compile with -msoft-float, you should get software floating point,
+#   using the FPA format.  This is done for compatibility reasons with many
+#   existing distributions.  Object file header flags should be:
+#
+#     private flags = 200: [APCS-32] [FPA float format] [software FP]
+#
+# The original patch from Nicholas Pitre contained the following constructs:
+#
+#   #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
+#     %{mhard-float:-mfpu=fpa} \
+#     %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
+#
+# However, gcc doesn't accept this ";:" notation, used in the 3rd line.  This
+# is probably the reason Robert Schwebel modified it to:
+#
+#   #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
+#     %{mhard-float:-mfpu=fpa} \
+#     %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}"
+#
+# But this causes the following behaviour:
+#
+# * If you compile without -mhard-float or -msoft-float, the compiler generates
+#   software floating point instructions, but *nothing* is passed to the
+#   assembler, which results in an object file which has flags:
+#
+#     private flags = 0: [APCS-32] [FPA float format]
+#
+#   This is not correct!
+#
+# * If you compile with -mhard-float, the compiler generates hardware floating
+#   point instructions, and passes "-mfpu=fpa" to the assembler, which results
+#   in an object file which has the same flags as in the previous item, but now
+#   those *are* correct.
+#    
+# * If you compile with -msoft-float, the compiler generates software floating
+#   point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that
+#   order) to the assembler, which results in an object file with flags:
+#
+#   private flags = 600: [APCS-32] [VFP float format] [software FP]
+#
+#   This is not correct, because the last "-mfpu=" option on the assembler
+#   command line determines the actual FPU convention used (which should be FPA
+#   in this case).
+#
+# Therefore, I modified this patch to get the desired behaviour.  Every
+# instance of the notation:
+#
+#   %{msoft-float:-mfpu=softfpa -mfpu=softvfp}
+#
+# was changed to:
+#
+#   %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}
+#
+# I also did the following:
+# 
+# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to
+#   be consistent with Nicholas' original patch.
+# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS
+#   macros I could find.  I think that if you compile without any options, you
+#   would like to get the defaults. :)
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+
+diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h
+--- gcc-3.4.1-old/gcc/config/arm/coff.h	2004-02-24 08:25:22.000000000 -0600
++++ gcc-3.4.1/gcc/config/arm/coff.h	2004-09-02 21:51:15.000000000 -0500
+@@ -31,11 +31,16 @@
+ #define TARGET_VERSION fputs (" (ARM/coff)", stderr)
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT		\
++	( ARM_FLAG_SOFT_FLOAT	\
++	| ARM_FLAG_VFP		\
++	| ARM_FLAG_APCS_32	\
++	| ARM_FLAG_APCS_FRAME	\
++	| ARM_FLAG_MMU_TRAPS )
+ 
+ #ifndef MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-  { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
++  { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" }
+ #endif
+ 
+ /* This is COFF, but prefer stabs.  */
+diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h
+--- gcc-3.4.1-old/gcc/config/arm/elf.h	2004-02-24 08:25:22.000000000 -0600
++++ gcc-3.4.1/gcc/config/arm/elf.h	2004-09-02 21:51:15.000000000 -0500
+@@ -46,7 +46,9 @@
+ 
+ #ifndef SUBTARGET_ASM_FLOAT_SPEC
+ #define SUBTARGET_ASM_FLOAT_SPEC "\
+-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}"
++%{mapcs-float:-mfloat} \
++%{mhard-float:-mfpu=fpa} \
++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
+ #endif
+ 
+ #ifndef ASM_SPEC
+@@ -106,12 +108,17 @@
+ #endif
+ 
+ #ifndef TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT		\
++	( ARM_FLAG_SOFT_FLOAT	\
++	| ARM_FLAG_VFP		\
++	| ARM_FLAG_APCS_32	\
++	| ARM_FLAG_APCS_FRAME	\
++	| ARM_FLAG_MMU_TRAPS )
+ #endif
+ 
+ #ifndef MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-  { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
++  { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" }
+ #endif
+ 
+ #define TARGET_ASM_FILE_START_APP_OFF true
+diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h
+--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h	2004-09-02 21:50:52.000000000 -0500
++++ gcc-3.4.1/gcc/config/arm/linux-elf.h	2004-09-02 22:00:49.000000000 -0500
+@@ -44,12 +44,26 @@
+ #define TARGET_LINKER_EMULATION "armelf_linux"
+ #endif
+ 
+-/* Default is to use APCS-32 mode.  */
++/*
++ * Default is to use APCS-32 mode with soft-vfp.
++ * The old Linux default for floats can be achieved with -mhard-float
++ * or with the configure --with-float=hard option.
++ * If -msoft-float or --with-float=soft is used then software float 
++ * support will be used just like the default but with the legacy
++ * big endian word ordering for double float representation instead.
++ */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT \
+-		( ARM_FLAG_APCS_32 | \
+-		  ARM_FLAG_MMU_TRAPS | \
+-		  TARGET_ENDIAN_DEFAULT )
++#define TARGET_DEFAULT		\
++	( ARM_FLAG_APCS_32	\
++	| ARM_FLAG_SOFT_FLOAT	\
++	| TARGET_ENDIAN_DEFAULT	\
++	| ARM_FLAG_VFP		\
++	| ARM_FLAG_MMU_TRAPS )
++
++#undef  SUBTARGET_EXTRA_ASM_SPEC
++#define SUBTARGET_EXTRA_ASM_SPEC "\
++%{mhard-float:-mfpu=fpa} \
++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+@@ -57,7 +71,7 @@
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -72,7 +86,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux
+--- gcc-3.4.1-old/gcc/config/arm/t-linux	2003-09-20 16:09:07.000000000 -0500
++++ gcc-3.4.1/gcc/config/arm/t-linux	2004-09-02 21:51:15.000000000 -0500
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
+diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h
+--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h	2004-02-24 08:25:22.000000000 -0600
++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h	2004-09-02 21:51:15.000000000 -0500
+@@ -30,7 +30,12 @@
+ 
+ /* Default to using APCS-32 and software floating point.  */
+ #ifndef TARGET_DEFAULT
+-#define TARGET_DEFAULT	(ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT		\
++	( ARM_FLAG_SOFT_FLOAT	\
++	| ARM_FLAG_VFP		\
++	| ARM_FLAG_APCS_32	\
++	| ARM_FLAG_APCS_FRAME	\
++	| ARM_FLAG_MMU_TRAPS )
+ #endif
+ 
+ /* Now we define the strings used to build the spec file.  */
+diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h
+--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h	2003-07-01 18:26:43.000000000 -0500
++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h	2004-09-02 21:51:15.000000000 -0500
+@@ -49,11 +49,12 @@
+ 		     endian, regardless of the endian-ness of the memory
+ 		     system.  */
+ 		     
+-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \
+-  %{mhard-float:-mfpu=fpa} \
+-  %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}"
++#define SUBTARGET_EXTRA_ASM_SPEC "\
++%{!mcpu=*:-mcpu=xscale} \
++%{mhard-float:-mfpu=fpa} \
++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}"
+ 
+ #ifndef MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-  { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" }
++  { "mlittle-endian", "mno-thumb-interwork", "marm" }
+ #endif
diff --git a/patches/gcc/3.4.4/fix-fixincl.patch b/patches/gcc/3.4.4/fix-fixincl.patch
new file mode 100644
index 00000000..7936b19b
--- /dev/null
+++ b/patches/gcc/3.4.4/fix-fixincl.patch
@@ -0,0 +1,70 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
+(the only two I've tried like this), the configure script happily copies
+the glibc include files from include to sys-include; here's the line
+from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+
+--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
++++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
+@@ -350,7 +350,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2532,11 +2535,13 @@
+ 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: fixinc.sh gsyslimits.h
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/3.4.5/fix-fixincl.patch b/patches/gcc/3.4.5/fix-fixincl.patch
new file mode 100644
index 00000000..7936b19b
--- /dev/null
+++ b/patches/gcc/3.4.5/fix-fixincl.patch
@@ -0,0 +1,70 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX
+(the only two I've tried like this), the configure script happily copies
+the glibc include files from include to sys-include; here's the line
+from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+
+--- gcc-3.4.3/gcc/Makefile.in.foo	2005-05-20 11:41:39.000000000 -0700
++++ gcc-3.4.3/gcc/Makefile.in	2005-05-20 12:08:46.000000000 -0700
+@@ -350,7 +350,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2532,11 +2535,13 @@
+ 	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir)
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: fixinc.sh gsyslimits.h
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch
new file mode 100644
index 00000000..f7178c19
--- /dev/null
+++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch
@@ -0,0 +1,82 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+Fixes build error
+
+/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux
+Supported emulations: armelfb_linux armelfb
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3'
+make: *** [all] Error 2
+
+
+See http://gcc.gnu.org/PR16350
+
+diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-07-02 14:46:29.225443757 +0200
+@@ -30,17 +30,34 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ /* Default is to use APCS-32 mode.  */
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS)
++#define TARGET_DEFAULT \
++		( ARM_FLAG_APCS_32 | \
++		  ARM_FLAG_MMU_TRAPS | \
++		  TARGET_ENDIAN_DEFAULT )
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" }
+ 
+ #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__"
+ 
+@@ -89,7 +106,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
+diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc
+--- gcc-3.4.0.orig/gcc/config.gcc	2004-04-17 04:28:24.000000000 +0200
++++ gcc-3.4.0/gcc/config.gcc	2004-07-02 14:44:40.045822542 +0200
+@@ -666,6 +666,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch
new file mode 100644
index 00000000..69a79d5d
--- /dev/null
+++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch
@@ -0,0 +1,27 @@
+# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01
+# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314
+# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline
+# Fixes errors like the following when building glibc (or any other executable
+# or shared library) when using gcc 3.4.0 for ARM with softfloat:
+#
+# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3'
+# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3'
+# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2'
+# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi'
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux
+--- gcc-3.4.0-orig/gcc/config/arm/t-linux	2003-09-20 23:09:07.000000000 +0200
++++ gcc-3.4.0/gcc/config/arm/t-linux	2004-05-01 20:31:59.102846400 +0200
+@@ -4,7 +4,10 @@
+ LIBGCC2_DEBUG_CFLAGS = -g0
+ 
+ LIB1ASMSRC = arm/lib1funcs.asm
+-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \
++	_negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \
++	_truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \
++	_fixsfsi _fixunssfsi
+ 
+ # MULTILIB_OPTIONS = mhard-float/msoft-float
+ # MULTILIB_DIRNAMES = hard-float soft-float
diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch
new file mode 100644
index 00000000..43eed3ef
--- /dev/null
+++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch
@@ -0,0 +1,24 @@
+# Dimitry Andric <dimitry@andric.com>, 2004-05-01
+#
+# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed
+#   anymore.  (The required functions are now in libgcc.)
+# 
+# Fixes errors like
+# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat
+# collect2: ld returned 1 exit status
+# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1
+# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat
+
+diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h
+--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h	2004-01-31 07:18:11.000000000 +0100
++++ gcc-3.4.0/gcc/config/arm/linux-elf.h	2004-05-01 19:19:06.935979200 +0200
+@@ -55,7 +73,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ /* Provide a STARTFILE_SPEC appropriate for GNU/Linux.  Here we add
+    the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
+
diff --git a/patches/gcc/3.4.5/pr15068-fix.patch b/patches/gcc/3.4.5/pr15068-fix.patch
new file mode 100644
index 00000000..2977765c
--- /dev/null
+++ b/patches/gcc/3.4.5/pr15068-fix.patch
@@ -0,0 +1,44 @@
+See http://gcc.gnu.org/PR15068
+
+Fixes error
+
+../sysdeps/generic/s_fmax.c: In function `__fmax':
+../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257
+Please submit a full bug report,
+with preprocessed source if appropriate.
+See <URL:http://gcc.gnu.org/bugs.html> for instructions.
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math'
+make[1]: *** [math/others] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822'
+make: *** [all] Error 2
+
+[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ]
+
+--- gcc-3.4.1/gcc/flow.c.old	2004-02-27 19:39:19.000000000 -0800
++++ gcc-3.4.1/gcc/flow.c	2004-08-26 07:29:46.000000000 -0700
+@@ -1878,6 +1878,7 @@
+ 	  rtx set_src = SET_SRC (pc_set (BB_END (bb)));
+ 	  rtx cond_true = XEXP (set_src, 0);
+ 	  rtx reg = XEXP (cond_true, 0);
++ 	  enum rtx_code inv_cond;
+ 
+ 	  if (GET_CODE (reg) == SUBREG)
+ 	    reg = SUBREG_REG (reg);
+@@ -1886,11 +1887,13 @@
+ 	     in the form of a comparison of a register against zero.  
+ 	     If the condition is more complex than that, then it is safe
+ 	     not to record any information.  */
+-	  if (GET_CODE (reg) == REG
++ 	  inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
++ 	  if (inv_cond != UNKNOWN
++	      && GET_CODE (reg) == REG
+ 	      && XEXP (cond_true, 1) == const0_rtx)
+ 	    {
+ 	      rtx cond_false
+-		= gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
++		= gen_rtx_fmt_ee (inv_cond,
+ 				  GET_MODE (cond_true), XEXP (cond_true, 0),
+ 				  XEXP (cond_true, 1));
+ 	      if (GET_CODE (XEXP (set_src, 1)) == PC)
diff --git a/patches/gcc/4.0.0/fix-fixincl.patch b/patches/gcc/4.0.0/fix-fixincl.patch
new file mode 100644
index 00000000..8051f31c
--- /dev/null
+++ b/patches/gcc/4.0.0/fix-fixincl.patch
@@ -0,0 +1,72 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this),
+the configure script happily copies the glibc include files from include to sys-include;
+here's the line from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+[rediffed against gcc-4.0.0]
+
+--- gcc-4.0.0/gcc/Makefile.in.orig	2005-04-04 12:45:13.000000000 -0700
++++ gcc-4.0.0/gcc/Makefile.in	2005-05-20 12:33:43.000000000 -0700
+@@ -378,7 +378,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2838,13 +2841,15 @@
+ ../$(build_subdir)/fixincludes/fixincl: ; @ :
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: gsyslimits.h macro_list \
+   ../$(build_subdir)/fixincludes/fixincl \
+   ../$(build_subdir)/fixincludes/fixinc.sh
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch b/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch
new file mode 100644
index 00000000..d9bcffeb
--- /dev/null
+++ b/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch
@@ -0,0 +1,79 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+Fixes following build error for big-endian ARM targets:
+
+armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/bin/../lib/gcc/armeb-unknown-linux-gnu/4.0.0/../../../../armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux
+Supported emulations: armelfb_linux armelfb
+collect2: ld returned 1 exit status
+make[2]: *** [crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/csu/crt1.o] Error 1
+make[2]: Leaving directory `crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4'
+make: *** [lib] Error 2
+
+
+See http://gcc.gnu.org/PR16350
+
+--- gcc-4.0-20050305/gcc/config/arm/linux-elf.h.orig	2005-03-23 18:44:54.822707377 +0100
++++ gcc-4.0-20050305/gcc/config/arm/linux-elf.h	2005-03-23 18:46:18.228560206 +0100
+@@ -31,19 +31,33 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for
++ * arm*b-*-linux* (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ #undef  TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (0)
++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" }
+ 
+ /* The GNU C++ standard library requires that these macros be defined.  */
+ #undef CPLUSPLUS_CPP_SPEC
+@@ -90,7 +104,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+--- gcc-4.0-20050305/gcc/config.gcc.orig	2005-03-23 18:46:23.318105335 +0100
++++ gcc-4.0-20050305/gcc/config.gcc	2005-03-23 18:47:41.592546386 +0100
+@@ -650,6 +650,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*-linux*)
++		tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
++		;;
++	esac
+ 	tmake_file="${tmake_file} arm/t-arm arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/4.0.0/pr20815-fix.patch b/patches/gcc/4.0.0/pr20815-fix.patch
new file mode 100644
index 00000000..7ac8ab50
--- /dev/null
+++ b/patches/gcc/4.0.0/pr20815-fix.patch
@@ -0,0 +1,121 @@
+Date: 18 May 2005 22:47:59 -0000
+Message-ID: <20050518224759.7352.qmail@sourceware.org>
+From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org>
+To: dank@kegel.com
+References: <20050407215701.20815.dank@kegel.com>
+Reply-To: gcc-bugzilla@gcc.gnu.org
+Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+
+------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:47 -------
+Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+> 
+> ------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:22 -------
+> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+> 
+> coverage_checksum_string already knows a bit about ignoring random seed
+> produced mess.  It looks like this needs to be extended somehow to
+> handle namespaces too...
+
+This seems to solve the missmatch.  Would it be possible to test it on
+bigger testcase and if it works distile a testcase that don't use
+file IO so it is more suitable for gcc regtesting?
+
+Index: coverage.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/coverage.c,v
+retrieving revision 1.6.2.12.2.12
+diff -c -3 -p -r1.6.2.12.2.12 coverage.c
+*** gcc-old/gcc/coverage.c	18 May 2005 07:37:31 -0000	1.6.2.12.2.12
+--- gcc/gcc/coverage.c	18 May 2005 22:45:36 -0000
+*************** coverage_checksum_string (unsigned chksu
+*** 471,505 ****
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	for (i = i + 9; string[i]; i++)
+! 	  if (string[i]=='_')
+! 	    {
+! 	      int y;
+! 	      unsigned seed;
+! 	      int scan;
+! 
+! 	      for (y = 1; y < 9; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 9 || string[i + 9] != '_')
+! 		continue;
+! 	      for (y = 10; y < 18; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 18)
+! 		continue;
+! 	      scan = sscanf (string + i + 10, "%X", &seed);
+! 	      gcc_assert (scan);
+! 	      if (seed != crc32_string (0, flag_random_seed))
+! 		continue;
+! 	      string = dup = xstrdup (string);
+! 	      for (y = 10; y < 18; y++)
+! 		dup[i + y] = '0';
+! 	      break;
+! 	    }
+        break;
+      }
+  
+--- 471,511 ----
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
++       int offset = 0;
++       if (!strncmp (string + i, "_GLOBAL__N_", 11))
++ 	offset = 11;
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	offset = 9;
+! 
+!       /* C++ namespaces do have scheme:
+!          _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname
+! 	 since filename might contain extra underscores there seems
+! 	 to be no better chance then walk all possible offsets looking
+! 	 for magicnuber.  */
+!       if (offset)
+!         for (;string[offset]; offset++)
+! 	  for (i = i + offset; string[i]; i++)
+! 	    if (string[i]=='_')
+! 	      {
+! 		int y;
+! 
+! 		for (y = 1; y < 9; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 9 || string[i + 9] != '_')
+! 		  continue;
+! 		for (y = 10; y < 18; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 18)
+! 		  continue;
+! 		if (!dup)
+! 		  string = dup = xstrdup (string);
+! 		for (y = 10; y < 18; y++)
+! 		  dup[i + y] = '0';
+! 	      }
+        break;
+      }
+  
+
+
+-- 
+
+
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815
+
+------- You are receiving this mail because: -------
+You reported the bug, or are watching the reporter.
+
+
diff --git a/patches/gcc/4.0.0/pr20973-fix.patch b/patches/gcc/4.0.0/pr20973-fix.patch
new file mode 100644
index 00000000..74512198
--- /dev/null
+++ b/patches/gcc/4.0.0/pr20973-fix.patch
@@ -0,0 +1,80 @@
+http://gcc.gnu.org/PR20973
+
+"gcc 4 (about RC1) miscompiles khtml, in fact something in CSS, which basically 
+leads to all websites being misrendered.  I can't easily reduce the testcase, 
+but have applied the whole preprocessed source of css/cssstyleselector.ii. 
+ 
+It is to be compiled with g++ -O2 -fPIC -march=i586 -mtune=i686 
+-fno-exceptions.  A more detailed analysis will follow, as we've found out 
+some things already."
+
+---
+
+Subject: Bug 20973
+
+CVSROOT:	/cvs/gcc
+Module name:	gcc
+Branch: 	gcc-4_0-branch
+Changes by:	matz@gcc.gnu.org	2005-04-22 17:30:21
+
+Modified files:
+	gcc            : ChangeLog reload.c 
+
+Log message:
+	PR middle-end/20973
+	* reload.c (push_reload, find_dummy_reload): Check for uninitialized
+	pseudos.
+
+Patches:
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.177&r2=2.7592.2.178
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/reload.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.268&r2=1.268.2.1
+
+---
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/reload.c,v
+retrieving revision 1.268
+retrieving revision 1.268.2.1
+diff -u -r1.268 -r1.268.2.1
+--- gcc/gcc/reload.c	2005/02/24 22:06:06	1.268
++++ gcc/gcc/reload.c	2005/04/22 17:30:15	1.268.2.1
+@@ -1520,7 +1520,7 @@
+      But if there is no spilling in this block, that is OK.
+      An explicitly used hard reg cannot be a spill reg.  */
+ 
+-  if (rld[i].reg_rtx == 0 && in != 0)
++  if (rld[i].reg_rtx == 0 && in != 0 && hard_regs_live_known)
+     {
+       rtx note;
+       int regno;
+@@ -1534,6 +1534,11 @@
+ 	    && REG_P (XEXP (note, 0))
+ 	    && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER
+ 	    && reg_mentioned_p (XEXP (note, 0), in)
++	    /* Check that we don't use a hardreg for an uninitialized
++	       pseudo.  See also find_dummy_reload().  */
++	    && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
++		|| ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
++				   ORIGINAL_REGNO (XEXP (note, 0))))
+ 	    && ! refers_to_regno_for_reload_p (regno,
+ 					       (regno
+ 						+ hard_regno_nregs[regno]
+@@ -1997,7 +2002,17 @@
+ 				is a subreg, and in that case, out
+ 				has a real mode.  */
+ 			     (GET_MODE (out) != VOIDmode
+-			      ? GET_MODE (out) : outmode)))
++			      ? GET_MODE (out) : outmode))
++        /* But only do all this if we can be sure, that this input
++           operand doesn't correspond with an uninitialized pseudoreg.
++           global can assign some hardreg to it, which is the same as
++	   a different pseudo also currently live (as it can ignore the
++	   conflict).  So we never must introduce writes to such hardregs,
++	   as they would clobber the other live pseudo using the same.
++	   See also PR20973.  */
++      && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER
++          || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end,
++			     ORIGINAL_REGNO (in))))
+     {
+       unsigned int regno = REGNO (in) + in_offset;
+       unsigned int nwords = hard_regno_nregs[regno][inmode];
diff --git a/patches/gcc/4.0.0/pr21173-fix.patch b/patches/gcc/4.0.0/pr21173-fix.patch
new file mode 100644
index 00000000..0582d756
--- /dev/null
+++ b/patches/gcc/4.0.0/pr21173-fix.patch
@@ -0,0 +1,66 @@
+See http://gcc.gnu.org/PR21173
+This is a fix for a last minute brown-bag bug with gcc-4.0.0
+
+ ------- Additional Comment #24 From CVS Commits 2005-04-25 14:03 [reply] ------- 
+Subject: Bug 21173
+
+CVSROOT:        /cvs/gcc
+Module name:    gcc
+Branch:         gcc-4_0-branch
+Changes by:     dberlin@gcc.gnu.org     2005-04-25 14:02:38
+
+Modified files:
+        gcc            : ChangeLog tree-ssa-pre.c 
+
+Log message:
+        2005-04-25  Daniel Berlin  <dberlin@dberlin.org>
+        
+        Fix PR tree-optimization/21173
+        
+        * tree-ssa-pre.c (create_expression_by_pieces): Call unshare_expr
+        on things we pass to force_gimple_operand.  Don't try to special
+        case min_invariants.
+
+Patches:
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.192&r2=2.7592.2.193
+http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/tree-ssa-pre.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.65.4.2&r2=2.65.4.3
+
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/tree-ssa-pre.c,v
+retrieving revision 2.65.4.2
+retrieving revision 2.65.4.3
+diff -u -r2.65.4.2 -r2.65.4.3
+--- gcc/gcc/tree-ssa-pre.c	2005/04/17 23:40:31	2.65.4.2
++++ gcc/gcc/tree-ssa-pre.c	2005/04/25 14:02:31	2.65.4.3
+@@ -1330,7 +1330,8 @@
+ 	
+ 	folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), 
+ 			      genop1, genop2));
+-	newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
++	newexpr = force_gimple_operand (unshare_expr (folded), 
++					&forced_stmts, false, NULL);
+ 	if (forced_stmts)
+ 	  {
+ 	    tsi = tsi_start (forced_stmts);
+@@ -1372,14 +1373,8 @@
+ 	add_referenced_tmp_var (temp);
+ 	folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), 
+ 			      genop1));
+-	/* If the generated operand  is already GIMPLE min_invariant
+-	   just use it instead of calling force_gimple_operand on it,
+-	   since that may make it not invariant by copying it into an
+-	   assignment.  */
+-	if (!is_gimple_min_invariant (genop1))
+-	  newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL);
+-	else
+-	  newexpr = genop1;
++	newexpr = force_gimple_operand (unshare_expr (folded), 
++					&forced_stmts, false, NULL);
+ 	if (forced_stmts)
+ 	  {
+ 	    tsi = tsi_start (forced_stmts);
+
+    0K .                                                         1.24 MB/s
+
+13:16:54 (1.24 MB/s) - `-' saved [1303]
+
diff --git a/patches/gcc/4.0.0/pr21951.patch b/patches/gcc/4.0.0/pr21951.patch
new file mode 100644
index 00000000..8c5ffb9d
--- /dev/null
+++ b/patches/gcc/4.0.0/pr21951.patch
@@ -0,0 +1,153 @@
+Workaround for buglet in std::vector etc. when compiling 
+with gcc-4.0.0 -Wall -O -fno-exceptions
+Fixes:
+
+.../include/c++/4.0.0/bits/vector.tcc: In member function 'void std::vector<_Tp,
+_Alloc>::reserve(size_t) [with _Tp = int, _Alloc = std::allocator<int>]':
+.../include/c++/4.0.0/bits/vector.tcc:78: warning: control may reach end of
+non-void function 'typename _Alloc::pointer std::vector<_Tp,
+_Alloc>::_M_allocate_and_copy(size_t, _ForwardIterator, _ForwardIterator) [with
+_ForwardIterator = int*, _Tp = int, _Alloc = std::allocator<int>]' being inlined
+
+See http://gcc.gnu.org/PR21951
+
+--- gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_vector.h.old	2005-06-11 03:58:20.000000000 -0700
++++ gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_vector.h	2005-06-11 04:01:21.000000000 -0700
+@@ -765,13 +765,13 @@
+ 	    {
+ 	      std::__uninitialized_copy_a(__first, __last, __result,
+ 					  this->get_allocator());
+-	      return __result;
+ 	    }
+ 	  catch(...)
+ 	    {
+ 	      _M_deallocate(__result, __n);
+ 	      __throw_exception_again;
+ 	    }
++	  return __result;
+ 	}
+ 
+ 
+--- gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_uninitialized.h.old	2005-06-11 03:58:20.000000000 -0700
++++ gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_uninitialized.h	2005-06-11 04:05:18.990003248 -0700
+@@ -84,13 +84,13 @@
+ 	{
+ 	  for (; __first != __last; ++__first, ++__cur)
+ 	    std::_Construct(&*__cur, *__first);
+-	  return __cur;
+ 	}
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __cur);
+ 	  __throw_exception_again;
+ 	}
++      return __cur;
+     }
+ 
+   /**
+@@ -236,13 +236,13 @@
+ 	{
+ 	  for (; __first != __last; ++__first, ++__cur)
+ 	    __alloc.construct(&*__cur, *__first);
+-	  return __cur;
+ 	}
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __cur, __alloc);
+ 	  __throw_exception_again;
+ 	}
++      return __cur;
+     }
+ 
+   template<typename _InputIterator, typename _ForwardIterator, typename _Tp>
+@@ -337,11 +337,13 @@
+ 	{
+ 	  return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc);
+ 	}
++#ifdef __EXCEPTIONS  // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __mid, __alloc);
+ 	  __throw_exception_again;
+ 	}
++#endif
+     }
+ 
+   // __uninitialized_fill_copy
+@@ -360,11 +362,13 @@
+ 	{
+ 	  return std::__uninitialized_copy_a(__first, __last, __mid, __alloc);
+ 	}
++#ifdef __EXCEPTIONS  // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __mid, __alloc);
+ 	  __throw_exception_again;
+ 	}
++#endif
+     }
+ 
+   // __uninitialized_copy_fill
+--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/rope.old	2005-06-11 03:58:20.000000000 -0700
++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/rope	2005-06-11 04:13:26.628870872 -0700
+@@ -1645,11 +1645,13 @@
+ 	_S_cond_store_eos(__buf[__size]);
+ 	try
+ 	  { return _S_new_RopeLeaf(__buf, __size, __a); }
++#ifdef __EXCEPTIONS  // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only
+ 	catch(...)
+ 	  {
+ 	    _RopeRep::__STL_FREE_STRING(__buf, __size, __a);
+ 	    __throw_exception_again;
+ 	  }
++#endif
+       }
+ 
+       // Concatenation of nonempty strings.
+--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/memory.old	2005-06-11 03:58:20.000000000 -0700
++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/memory	2005-06-11 04:13:52.897877376 -0700
+@@ -85,11 +85,13 @@
+ 	    std::_Construct(&*__cur, *__first);
+ 	  return pair<_InputIter, _ForwardIter>(__first, __cur);
+ 	}
++#ifdef __EXCEPTIONS  // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __cur);
+ 	  __throw_exception_again;
+ 	}
++#endif
+     }
+ 
+   template<typename _RandomAccessIter, typename _Size, typename _ForwardIter>
+@@ -144,11 +146,13 @@
+ 	    __alloc.construct(&*__cur, *__first);
+ 	  return pair<_InputIter, _ForwardIter>(__first, __cur);
+ 	}
++#ifdef __EXCEPTIONS  // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only
+       catch(...)
+ 	{
+ 	  std::_Destroy(__result, __cur, __alloc);
+ 	  __throw_exception_again;
+ 	}
++#endif
+     }
+ 
+   template<typename _InputIter, typename _Size, typename _ForwardIter,
+--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/hashtable.h.old	2005-06-11 03:58:20.000000000 -0700
++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/hashtable.h	2005-06-11 04:14:28.384482592 -0700
+@@ -607,13 +607,13 @@
+ 	try
+ 	  {
+ 	    this->get_allocator().construct(&__n->_M_val, __obj);
+-	    return __n;
+ 	  }
+ 	catch(...)
+ 	  {
+ 	    _M_put_node(__n);
+ 	    __throw_exception_again;
+ 	  }
++	return __n;
+       }
+ 
+       void
diff --git a/patches/gcc/4.0.1/fix-fixincl.patch b/patches/gcc/4.0.1/fix-fixincl.patch
new file mode 100644
index 00000000..8051f31c
--- /dev/null
+++ b/patches/gcc/4.0.1/fix-fixincl.patch
@@ -0,0 +1,72 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this),
+the configure script happily copies the glibc include files from include to sys-include;
+here's the line from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+[rediffed against gcc-4.0.0]
+
+--- gcc-4.0.0/gcc/Makefile.in.orig	2005-04-04 12:45:13.000000000 -0700
++++ gcc-4.0.0/gcc/Makefile.in	2005-05-20 12:33:43.000000000 -0700
+@@ -378,7 +378,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2838,13 +2841,15 @@
+ ../$(build_subdir)/fixincludes/fixincl: ; @ :
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: gsyslimits.h macro_list \
+   ../$(build_subdir)/fixincludes/fixincl \
+   ../$(build_subdir)/fixincludes/fixinc.sh
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/4.0.1/pr20815-fix.patch b/patches/gcc/4.0.1/pr20815-fix.patch
new file mode 100644
index 00000000..7ac8ab50
--- /dev/null
+++ b/patches/gcc/4.0.1/pr20815-fix.patch
@@ -0,0 +1,121 @@
+Date: 18 May 2005 22:47:59 -0000
+Message-ID: <20050518224759.7352.qmail@sourceware.org>
+From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org>
+To: dank@kegel.com
+References: <20050407215701.20815.dank@kegel.com>
+Reply-To: gcc-bugzilla@gcc.gnu.org
+Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+
+------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:47 -------
+Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+> 
+> ------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:22 -------
+> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+> 
+> coverage_checksum_string already knows a bit about ignoring random seed
+> produced mess.  It looks like this needs to be extended somehow to
+> handle namespaces too...
+
+This seems to solve the missmatch.  Would it be possible to test it on
+bigger testcase and if it works distile a testcase that don't use
+file IO so it is more suitable for gcc regtesting?
+
+Index: coverage.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/coverage.c,v
+retrieving revision 1.6.2.12.2.12
+diff -c -3 -p -r1.6.2.12.2.12 coverage.c
+*** gcc-old/gcc/coverage.c	18 May 2005 07:37:31 -0000	1.6.2.12.2.12
+--- gcc/gcc/coverage.c	18 May 2005 22:45:36 -0000
+*************** coverage_checksum_string (unsigned chksu
+*** 471,505 ****
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	for (i = i + 9; string[i]; i++)
+! 	  if (string[i]=='_')
+! 	    {
+! 	      int y;
+! 	      unsigned seed;
+! 	      int scan;
+! 
+! 	      for (y = 1; y < 9; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 9 || string[i + 9] != '_')
+! 		continue;
+! 	      for (y = 10; y < 18; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 18)
+! 		continue;
+! 	      scan = sscanf (string + i + 10, "%X", &seed);
+! 	      gcc_assert (scan);
+! 	      if (seed != crc32_string (0, flag_random_seed))
+! 		continue;
+! 	      string = dup = xstrdup (string);
+! 	      for (y = 10; y < 18; y++)
+! 		dup[i + y] = '0';
+! 	      break;
+! 	    }
+        break;
+      }
+  
+--- 471,511 ----
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
++       int offset = 0;
++       if (!strncmp (string + i, "_GLOBAL__N_", 11))
++ 	offset = 11;
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	offset = 9;
+! 
+!       /* C++ namespaces do have scheme:
+!          _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname
+! 	 since filename might contain extra underscores there seems
+! 	 to be no better chance then walk all possible offsets looking
+! 	 for magicnuber.  */
+!       if (offset)
+!         for (;string[offset]; offset++)
+! 	  for (i = i + offset; string[i]; i++)
+! 	    if (string[i]=='_')
+! 	      {
+! 		int y;
+! 
+! 		for (y = 1; y < 9; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 9 || string[i + 9] != '_')
+! 		  continue;
+! 		for (y = 10; y < 18; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 18)
+! 		  continue;
+! 		if (!dup)
+! 		  string = dup = xstrdup (string);
+! 		for (y = 10; y < 18; y++)
+! 		  dup[i + y] = '0';
+! 	      }
+        break;
+      }
+  
+
+
+-- 
+
+
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815
+
+------- You are receiving this mail because: -------
+You reported the bug, or are watching the reporter.
+
+
diff --git a/patches/gcc/4.0.1/pr21951-fix2.patch b/patches/gcc/4.0.1/pr21951-fix2.patch
new file mode 100644
index 00000000..5e35a1e9
--- /dev/null
+++ b/patches/gcc/4.0.1/pr21951-fix2.patch
@@ -0,0 +1,71 @@
+Workaround for buglet in std::vector etc. when compiling
+with gcc-4.0.1 -Wall -O -fno-exceptions
+Fixes:
+
+.../include/c++/4.0.0/bits/vector.tcc: In member function 'void std::vector<_Tp,
+_Alloc>::reserve(size_t) [with _Tp = int, _Alloc = std::allocator<int>]':
+.../include/c++/4.0.0/bits/vector.tcc:78: warning: control may reach end of
+non-void function 'typename _Alloc::pointer std::vector<_Tp,
+_Alloc>::_M_allocate_and_copy(size_t, _ForwardIterator, _ForwardIterator) [with
+_ForwardIterator = int*, _Tp = int, _Alloc = std::allocator<int>]' being inlined
+
+See http://gcc.gnu.org/PR21951
+
+To: gcc-patches at gcc dot gnu dot org
+Subject: [4.0.x] may reach end warning in system headers
+Message-Id: <20050701183024.E138714C16A9@geoffk5.apple.com>
+Date: Fri,  1 Jul 2005 11:30:24 -0700 (PDT)
+From: gkeating at apple dot com (Geoffrey Keating)
+
+
+One of our users was getting
+
+/usr/include/gcc/darwin/4.0/c++/bits/stl_uninitialized.h:113: warning:
+control may reach end of non-void function '_ForwardIterator
+std::__uninitialized_copy_aux(_InputIterator, _InputIterator,
+_ForwardIterator, __false_type) [with _InputIterator =
+__gnu_cxx::__normal_iterator<TPoolAllocator::tAllocState*,
+std::vector<TPoolAllocator::tAllocState,
+std::allocator<TPoolAllocator::tAllocState> > >, _ForwardIterator =
+__gnu_cxx::__normal_iterator<TPoolAllocator::tAllocState*,
+std::vector<TPoolAllocator::tAllocState,
+std::allocator<TPoolAllocator::tAllocState> > >]' being inlined
+
+which shouldn't be happening, he has no way to change a standard C++
+header.  The warning is bogus anyway, but it's fixed in 4.1 through
+the CFG changes, which I don't really want to backport to the 4.0
+branch, so instead I'll add this patch.  Other warnings generated from
+tree-inline.c check for DECL_SYSTEM_HEADER like this.
+
+Bootstrapped & tested on powerpc-darwin8, I'll commit when the branch
+is unfrozen.
+
+-- 
+- Geoffrey Keating <geoffk@apple.com>
+
+===File ~/patches/gcc-40-4121982.patch======================
+Index: ChangeLog
+2005-06-28  Geoffrey Keating  <geoffk@apple.com>
+
+	* tree-inline.c (expand_call_inline): Prevent 'may reach end'
+	warning in system headers.
+
+Index: tree-inline.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v
+retrieving revision 1.170.8.4
+diff -u -p -u -p -r1.170.8.4 tree-inline.c
+--- gcc-4.0.1/gcc/tree-inline.c.old	6 Jun 2005 19:20:32 -0000	1.170.8.4
++++ gcc-4.0.1/gcc/tree-inline.c	1 Jul 2005 18:27:26 -0000
+@@ -1693,7 +1693,8 @@ expand_call_inline (tree *tp, int *walk_
+ 	&& !TREE_NO_WARNING (fn)
+ 	&& !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))
+ 	&& return_slot_addr == NULL_TREE
+-	&& block_may_fallthru (copy))
++	&& block_may_fallthru (copy)
++	&& !DECL_IN_SYSTEM_HEADER (fn))
+       {
+ 	warning ("control may reach end of non-void function %qD being inlined",
+ 		 fn);
+============================================================
+
diff --git a/patches/gcc/4.0.2/fix-fixincl.patch b/patches/gcc/4.0.2/fix-fixincl.patch
new file mode 100644
index 00000000..8051f31c
--- /dev/null
+++ b/patches/gcc/4.0.2/fix-fixincl.patch
@@ -0,0 +1,72 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this),
+the configure script happily copies the glibc include files from include to sys-include;
+here's the line from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+That's not nice.  I suspect the problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path 
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A possible fix is to replace the line in gcc/Makefile.in that says
+    SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
+with a version that gets rid of extra ..'s, e.g.
+    SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"`
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+[rediffed against gcc-4.0.0]
+
+--- gcc-4.0.0/gcc/Makefile.in.orig	2005-04-04 12:45:13.000000000 -0700
++++ gcc-4.0.0/gcc/Makefile.in	2005-05-20 12:33:43.000000000 -0700
+@@ -378,7 +378,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -2838,13 +2841,15 @@
+ ../$(build_subdir)/fixincludes/fixincl: ; @ :
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# FIXME: abort unless building --without-headers would be more accurate and less ugly
+ stmp-fixinc: gsyslimits.h macro_list \
+   ../$(build_subdir)/fixincludes/fixincl \
+   ../$(build_subdir)/fixincludes/fixinc.sh
+ 	@if test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/4.0.2/pr20815-fix.patch b/patches/gcc/4.0.2/pr20815-fix.patch
new file mode 100644
index 00000000..7ac8ab50
--- /dev/null
+++ b/patches/gcc/4.0.2/pr20815-fix.patch
@@ -0,0 +1,121 @@
+Date: 18 May 2005 22:47:59 -0000
+Message-ID: <20050518224759.7352.qmail@sourceware.org>
+From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org>
+To: dank@kegel.com
+References: <20050407215701.20815.dank@kegel.com>
+Reply-To: gcc-bugzilla@gcc.gnu.org
+Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+
+------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:47 -------
+Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+
+> 
+> ------- Additional Comments From hubicka at ucw dot cz  2005-05-18 22:22 -------
+> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'."
+> 
+> coverage_checksum_string already knows a bit about ignoring random seed
+> produced mess.  It looks like this needs to be extended somehow to
+> handle namespaces too...
+
+This seems to solve the missmatch.  Would it be possible to test it on
+bigger testcase and if it works distile a testcase that don't use
+file IO so it is more suitable for gcc regtesting?
+
+Index: coverage.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/coverage.c,v
+retrieving revision 1.6.2.12.2.12
+diff -c -3 -p -r1.6.2.12.2.12 coverage.c
+*** gcc-old/gcc/coverage.c	18 May 2005 07:37:31 -0000	1.6.2.12.2.12
+--- gcc/gcc/coverage.c	18 May 2005 22:45:36 -0000
+*************** coverage_checksum_string (unsigned chksu
+*** 471,505 ****
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	for (i = i + 9; string[i]; i++)
+! 	  if (string[i]=='_')
+! 	    {
+! 	      int y;
+! 	      unsigned seed;
+! 	      int scan;
+! 
+! 	      for (y = 1; y < 9; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 9 || string[i + 9] != '_')
+! 		continue;
+! 	      for (y = 10; y < 18; y++)
+! 		if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		    && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		  break;
+! 	      if (y != 18)
+! 		continue;
+! 	      scan = sscanf (string + i + 10, "%X", &seed);
+! 	      gcc_assert (scan);
+! 	      if (seed != crc32_string (0, flag_random_seed))
+! 		continue;
+! 	      string = dup = xstrdup (string);
+! 	      for (y = 10; y < 18; y++)
+! 		dup[i + y] = '0';
+! 	      break;
+! 	    }
+        break;
+      }
+  
+--- 471,511 ----
+       as the checksums are used only for sanity checking.  */
+    for (i = 0; string[i]; i++)
+      {
++       int offset = 0;
++       if (!strncmp (string + i, "_GLOBAL__N_", 11))
++ 	offset = 11;
+        if (!strncmp (string + i, "_GLOBAL__", 9))
+! 	offset = 9;
+! 
+!       /* C++ namespaces do have scheme:
+!          _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname
+! 	 since filename might contain extra underscores there seems
+! 	 to be no better chance then walk all possible offsets looking
+! 	 for magicnuber.  */
+!       if (offset)
+!         for (;string[offset]; offset++)
+! 	  for (i = i + offset; string[i]; i++)
+! 	    if (string[i]=='_')
+! 	      {
+! 		int y;
+! 
+! 		for (y = 1; y < 9; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 9 || string[i + 9] != '_')
+! 		  continue;
+! 		for (y = 10; y < 18; y++)
+! 		  if (!(string[i + y] >= '0' && string[i + y] <= '9')
+! 		      && !(string[i + y] >= 'A' && string[i + y] <= 'F'))
+! 		    break;
+! 		if (y != 18)
+! 		  continue;
+! 		if (!dup)
+! 		  string = dup = xstrdup (string);
+! 		for (y = 10; y < 18; y++)
+! 		  dup[i + y] = '0';
+! 	      }
+        break;
+      }
+  
+
+
+-- 
+
+
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815
+
+------- You are receiving this mail because: -------
+You reported the bug, or are watching the reporter.
+
+
diff --git a/patches/gcc/4.0.2/pr21623-workaround.patch b/patches/gcc/4.0.2/pr21623-workaround.patch
new file mode 100644
index 00000000..90453fb3
--- /dev/null
+++ b/patches/gcc/4.0.2/pr21623-workaround.patch
@@ -0,0 +1,53 @@
+Message-ID: <434576E1.6020305@sscd.de>
+Date: Thu, 06 Oct 2005 21:11:29 +0200
+From: Alexander Sieb <sieb@sscd.de>
+To: crossgcc@sourceware.org
+Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches
+
+Hi,
+
+attached you find the files I needed to add to crosstool-0.38
+in order to build a sh4-linux gcc-4.0.2-glibc-2.3.5 tool chain.
+
+Files attached:
+
+sh4-gcc4.dat:
+        * gcc4 needs --with-multilib-list=m4,m4-nofpu otherwise a linux
+        kernel won't build as it uses the -m4-nofpu option.
+
+gcc-pr21623.patch:
+        * Kaz Kojima provided a patch [really, a workaround -dank] for http://gcc.gnu.org/PR21623
+
+glibc-2.3.5-sh-memset.patch:
+        * A patch for glibc-2.3.5 which corrects memset. From SUGIOKA Toshinobu.
+        See content for rationale.
+
+-- snip --
+
+-- Here's patch 1 of 2, plus URLs showing where it is in CVS --
+
+[http://gcc.gnu.org/ml/gcc-cvs/2005-10/msg00081.html]
+
+2005-09-30  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* config/sh/sh.c (sh_register_move_cost): Add case for moving
+	from T_REGS to FP register class.
+
+[http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/sh.c.diff?cvsroot=gcc&r1=1.347&r2=1.348]
+
+RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.c,v
+retrieving revision 1.347
+retrieving revision 1.348
+diff -u -r1.347 -r1.348
+--- gcc/gcc/config/sh/sh.c	2005/09/05 12:45:22	1.347
++++ gcc/gcc/config/sh/sh.c	2005/10/03 22:07:08	1.348
+@@ -9491,6 +9491,9 @@ sh_register_move_cost (enum machine_mode
+       && REGCLASS_HAS_FP_REG (dstclass))
+     return 4;
+ 
++  if (REGCLASS_HAS_FP_REG (dstclass) && srcclass == T_REGS)
++    return ((TARGET_HARD_SH4 && !optimize_size) ? 10 : 7);
++
+   if ((REGCLASS_HAS_FP_REG (dstclass) && srcclass == MAC_REGS)
+       || (dstclass == MAC_REGS && REGCLASS_HAS_FP_REG (srcclass)))
+     return 9;
diff --git a/patches/gcc/4.0.3/100-uclibc-conf.patch b/patches/gcc/4.0.3/100-uclibc-conf.patch
new file mode 100644
index 00000000..3be7d097
--- /dev/null
+++ b/patches/gcc/4.0.3/100-uclibc-conf.patch
@@ -0,0 +1,553 @@
+--- gcc-4.0.2/gcc/config/t-linux-uclibc
++++ gcc-4.0.2/gcc/config/t-linux-uclibc
+@@ -0,0 +1,5 @@
++# Remove glibc specific files added in t-linux
++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES))
++
++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc
++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH))
+--- gcc-4.0.2/gcc/config.gcc
++++ gcc-4.0.2/gcc/config.gcc
+@@ -1778,7 +1778,7 @@
+ 	;;
+ sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \
+ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
+-  sh-*-linux* | sh[346lbe]*-*-linux* | \
++  sh*-*-linux* | sh[346lbe]*-*-linux* | \
+   sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
+    sh64-*-netbsd* | sh64l*-*-netbsd*)
+ 	tmake_file="${tmake_file} sh/t-sh sh/t-elf"
+@@ -2234,10 +2234,16 @@
+ *)
+ 	echo "*** Configuration ${target} not supported" 1>&2
+ 	exit 1
+ 	;;
+ esac
++
++# Rather than hook into each target, just do it after all the linux
++# targets have been processed
++case ${target} in
++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc"
++esac
+ 
+ case ${target} in
+ i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1)
+ 	tmake_file="${tmake_file} i386/t-gmm_malloc"
+ 	;;
+--- gcc-4.0.2/gcc/config/alpha/linux-elf.h
++++ gcc-4.0.2/gcc/config/alpha/linux-elf.h
+@@ -27,7 +27,11 @@
+ #define SUBTARGET_EXTRA_SPECS \
+ { "elf_dynamic_linker", ELF_DYNAMIC_LINKER },
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
+ #define ELF_DYNAMIC_LINKER	"/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}		\
+   %{O*:-O3} %{!O*:-O1}						\
+--- gcc-4.0.2/gcc/config/arm/linux-elf.h
++++ gcc-4.0.2/gcc/config/arm/linux-elf.h
+@@ -81,14 +81,19 @@
+ #define ENDFILE_SPEC \
+   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "%{h*} %{version:-v} \
+    %{b} %{Wl,*:%*} \
+    %{static:-Bstatic} \
+    %{shared:-shared} \
+    %{symbolic:-Bsymbolic} \
+    %{rdynamic:-export-dynamic} \
+-   %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
++   %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \
+    -X \
+    %{mbig-endian:-EB}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+--- gcc-4.0.2/gcc/config/cris/linux.h
++++ gcc-4.0.2/gcc/config/cris/linux.h
+@@ -79,6 +79,25 @@
+ #undef CRIS_DEFAULT_CPU_VERSION
+ #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG
+ 
++#ifdef USE_UCLIBC
++
++#undef CRIS_SUBTARGET_VERSION
++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc"
++
++#undef CRIS_LINK_SUBTARGET_SPEC
++#define CRIS_LINK_SUBTARGET_SPEC \
++ "-mcrislinux\
++  -rpath-link include/asm/../..%s\
++  %{shared} %{static}\
++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\
++  %{!shared: \
++    %{!static: \
++      %{rdynamic:-export-dynamic} \
++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \
++  %{!r:%{O2|O3: --gc-sections}}"
++
++#else  /* USE_UCLIBC */
++
+ #undef CRIS_SUBTARGET_VERSION
+ #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu"
+ 
+@@ -93,6 +112,8 @@
+   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\
+   %{!r:%{O2|O3: --gc-sections}}"
+ 
++#endif  /* USE_UCLIBC */
++
+ 
+ /* Node: Run-time Target */
+ 
+--- gcc-4.0.2/gcc/config/i386/linux.h
++++ gcc-4.0.2/gcc/config/i386/linux.h
+@@ -107,6 +107,11 @@
+ #define LINK_EMULATION "elf_i386"
+ #define DYNAMIC_LINKER "/lib/ld-linux.so.2"
+ 
++#ifdef USE_UCLIBC
++#undef DYNAMIC_LINKER
++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#endif
++
+ #undef  SUBTARGET_EXTRA_SPECS
+ #define SUBTARGET_EXTRA_SPECS \
+   { "link_emulation", LINK_EMULATION },\
+--- gcc-4.0.2/gcc/config/i386/linux64.h
++++ gcc-4.0.2/gcc/config/i386/linux64.h
+@@ -54,14 +54,21 @@
+    When the -shared link option is used a final link is not being
+    done.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+-      %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
++      %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \
++      %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \
+     %{static:-static}}"
+ 
+ #define MULTILIB_DEFAULTS { "m64" }
+--- gcc-4.0.2/gcc/config/ia64/linux.h
++++ gcc-4.0.2/gcc/config/ia64/linux.h
+@@ -37,13 +37,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ 
+--- gcc-4.0.2/gcc/config/m68k/linux.h
++++ gcc-4.0.2/gcc/config/m68k/linux.h
+@@ -127,12 +127,17 @@
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "-m m68kelf %{shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+     %{static}}"
+ 
+ /* For compatibility with linux/a.out */
+--- gcc-4.0.2/gcc/config/mips/linux.h
++++ gcc-4.0.2/gcc/config/mips/linux.h
+@@ -108,14 +108,19 @@
+ 
+ /* Borrowed from sparc/linux.h */
+ #undef LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #define LINK_SPEC \
+  "%(endian_spec) \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ #undef SUBTARGET_ASM_SPEC
+--- gcc-4.0.2/gcc/config/pa/pa-linux.h
++++ gcc-4.0.2/gcc/config/pa/pa-linux.h
+@@ -82,13 +82,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ /* glibc's profiling functions don't need gcc to allocate counters.  */
+--- gcc-4.0.2/gcc/config/rs6000/linux.h
++++ gcc-4.0.2/gcc/config/rs6000/linux.h
+@@ -69,7 +69,11 @@
+ #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
+ 
+ #undef	LINK_OS_DEFAULT_SPEC
++#ifdef USE_UCLIBC
++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)"
++#else
+ #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
++#endif
+ 
+ #define LINK_GCC_C_SEQUENCE_SPEC \
+   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+--- gcc-4.0.2/gcc/config/rs6000/sysv4.h
++++ gcc-4.0.2/gcc/config/rs6000/sysv4.h
+@@ -949,6 +949,7 @@
+   mcall-linux  : %(link_os_linux)       ; \
+   mcall-gnu    : %(link_os_gnu)         ; \
+   mcall-netbsd : %(link_os_netbsd)      ; \
++  mcall-linux-uclibc : %(link_os_linux_uclibc); \
+   mcall-openbsd: %(link_os_openbsd)     ; \
+                : %(link_os_default)     }"
+ 
+@@ -1127,6 +1128,10 @@
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ 
++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++  %{rdynamic:-export-dynamic} \
++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}"
++
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+ # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+ #endif
+@@ -1293,6 +1298,7 @@
+   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
+   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
+   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\
+   { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
+   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
+   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
+--- gcc-4.0.2/gcc/config/s390/linux.h
++++ gcc-4.0.2/gcc/config/s390/linux.h
+@@ -77,6 +77,13 @@
+ #define MULTILIB_DEFAULTS { "m31" }
+ #endif
+ 
++#ifdef USE_UCLIBC
++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC \
+   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
+@@ -86,8 +93,8 @@
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+ 	%{!dynamic-linker: \
+-          %{m31:-dynamic-linker /lib/ld.so.1} \
+-          %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
++          %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \
++          %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}"
+ 
+ 
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc-4.0.2/gcc/config/sh/linux.h
++++ gcc-4.0.2/gcc/config/sh/linux.h
+@@ -67,11 +67,16 @@
+ #undef SUBTARGET_LINK_EMUL_SUFFIX
+ #define SUBTARGET_LINK_EMUL_SUFFIX "_linux"
+ #undef SUBTARGET_LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #define SUBTARGET_LINK_SPEC \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+-     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++     %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+    %{static:-static}"
+ 
+ #undef LIB_SPEC
+--- gcc-4.0.2/gcc/config/sparc/linux.h
++++ gcc-4.0.2/gcc/config/sparc/linux.h
+@@ -130,14 +130,19 @@
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!mno-relax:%{!r:-relax}} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ /* The sun bundled assembler doesn't accept -Yd, (and neither does gas).
+--- gcc-4.0.2/gcc/config/sparc/linux64.h
++++ gcc-4.0.2/gcc/config/sparc/linux64.h
+@@ -167,12 +166,17 @@
+   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },	  \
+   { "link_arch",	 LINK_ARCH_SPEC },
+     
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER  "/lib/ld-linux.so.2"
++#endif
+ #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}} \
+ "
+ 
+--- gcc-4.0.2/libtool.m4
++++ gcc-4.0.2/libtool.m4
+@@ -682,6 +682,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+--- gcc-4.0.2/ltconfig
++++ gcc-4.0.2/ltconfig
+@@ -603,6 +603,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1274,6 +1275,23 @@
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gcc-4.0.2/libffi/configure
++++ gcc-4.0.2/libffi/configure
+@@ -3457,6 +3457,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libgfortran/configure
++++ gcc-4.0.2/libgfortran/configure
+@@ -3681,6 +3681,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libjava/configure
++++ gcc-4.0.2/libjava/configure
+@@ -4351,6 +4351,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libmudflap/configure
++++ gcc-4.0.2/libmudflap/configure
+@@ -5380,6 +5380,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libobjc/configure
++++ gcc-4.0.2/libobjc/configure
+@@ -3283,6 +3283,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/boehm-gc/configure
++++ gcc-4.0.2/boehm-gc/configure
+@@ -4320,6 +4320,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/configure
++++ gcc-4.0.2/configure
+@@ -1141,7 +1141,7 @@
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.0.2/configure.in
++++ gcc-4.0.2/configure.in
+@@ -350,7 +350,7 @@
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.0.2/contrib/regression/objs-gcc.sh
++++ gcc-4.0.2/contrib/regression/objs-gcc.sh
+@@ -105,6 +105,10 @@
+  then
+   make all-gdb all-dejagnu all-ld || exit 1
+   make install-gdb install-dejagnu install-ld || exit 1
++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
++ then
++  make all-gdb all-dejagnu all-ld || exit 1
++  make install-gdb install-dejagnu install-ld || exit 1
+ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+   make bootstrap || exit 1
+   make install || exit 1
+--- gcc-4.0.2/zlib/configure
++++ gcc-4.0.2/zlib/configure
+@@ -3426,6 +3426,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
diff --git a/patches/gcc/4.0.3/200-uclibc-locale.patch b/patches/gcc/4.0.3/200-uclibc-locale.patch
new file mode 100644
index 00000000..ac4cf972
--- /dev/null
+++ b/patches/gcc/4.0.3/200-uclibc-locale.patch
@@ -0,0 +1,3237 @@
+diff -urN gcc-4.0.0-100/libstdc++-v3/acinclude.m4 gcc-4.0.0/libstdc++-v3/acinclude.m4
+--- gcc-4.0.0-100/libstdc++-v3/acinclude.m4	2005-04-30 13:06:53.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/acinclude.m4	2005-04-28 20:19:01.000000000 -0500
+@@ -1104,7 +1104,7 @@
+   AC_MSG_CHECKING([for C locale to use])
+   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+     [use MODEL for target locale package],
+-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
+   
+   # If they didn't use this option switch, or if they specified --enable
+   # with no specific model, we'll have to look for one.  If they
+@@ -1120,6 +1120,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      *-uclibc*)
++        enable_clocale_flag=uclibc
++        ;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1263,6 +1266,40 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,59 @@
++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
++
++// Copyright (C) 2002, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++// Written by Jakub Jelinek <jakub@redhat.com>
++
++#include <clocale>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning clean this up
++#endif
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++                                                  
++extern "C" __typeof(iswctype_l) __iswctype_l;
++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
++extern "C" __typeof(strcoll_l) __strcoll_l;
++extern "C" __typeof(strftime_l) __strftime_l;
++extern "C" __typeof(strtod_l) __strtod_l;
++extern "C" __typeof(strtof_l) __strtof_l;
++extern "C" __typeof(strtold_l) __strtold_l;
++extern "C" __typeof(strxfrm_l) __strxfrm_l;
++extern "C" __typeof(towlower_l) __towlower_l;
++extern "C" __typeof(towupper_l) __towupper_l;
++extern "C" __typeof(wcscoll_l) __wcscoll_l;
++extern "C" __typeof(wcsftime_l) __wcsftime_l;
++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
++extern "C" __typeof(wctype_l) __wctype_l;
++extern "C" __typeof(newlocale) __newlocale;
++extern "C" __typeof(freelocale) __freelocale;
++extern "C" __typeof(duplocale) __duplocale;
++extern "C" __typeof(uselocale) __uselocale;
++
++#endif // GLIBC 2.3 and later
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,160 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno>  // For errno
++#include <locale>
++#include <stdexcept>
++#include <langinfo.h>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
++#define __strtof_l(S, E, L)         strtof((S), (E))
++#define __strtod_l(S, E, L)         strtod((S), (E))
++#define __strtold_l(S, E, L)        strtold((S), (E))
++#warning should dummy __newlocale check for C|POSIX ?
++#define __newlocale(a, b, c)        NULL
++#define __freelocale(a)             ((void)0)
++#define __duplocale(a)              __c_locale()
++#endif
++
++namespace std 
++{
++  template<>
++    void
++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  float __f = __strtof_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __f;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  double __d = __strtod_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __d;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __ld;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  void
++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
++				    __c_locale __old)
++  {
++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    if (!__cloc)
++      {
++	// This named locale is not supported by the underlying OS.
++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++			      "name not valid"));
++      }
++#endif
++  }
++  
++  void
++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++  {
++    if (_S_get_c_locale() != __cloc)
++      __freelocale(__cloc); 
++  }
++
++  __c_locale
++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
++  { return __duplocale(__cloc); }
++} // namespace std
++
++namespace __gnu_cxx
++{
++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++    {
++      "LC_CTYPE", 
++      "LC_NUMERIC",
++      "LC_TIME", 
++      "LC_COLLATE", 
++      "LC_MONETARY",
++      "LC_MESSAGES", 
++#if _GLIBCXX_NUM_CATEGORIES != 0
++      "LC_PAPER", 
++      "LC_NAME", 
++      "LC_ADDRESS",
++      "LC_TELEPHONE", 
++      "LC_MEASUREMENT", 
++      "LC_IDENTIFICATION" 
++#endif
++    };
++}
++
++namespace std
++{
++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++}  // namespace std
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,115 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifndef _C_LOCALE_H
++#define _C_LOCALE_H 1
++
++#pragma GCC system_header
++
++#include <cstring>              // get std::strlen
++#include <cstdio>               // get std::snprintf or std::sprintf
++#include <clocale>
++#include <langinfo.h>		// For codecvt
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC_HAS_LOCALE__
++#include <iconv.h>		// For codecvt using iconv, iconv_t
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++#include <libintl.h> 		// For messages
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning what is _GLIBCXX_C_LOCALE_GNU for
++#endif
++#define _GLIBCXX_C_LOCALE_GNU 1
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix categories
++#endif
++// #define _GLIBCXX_NUM_CATEGORIES 6
++#define _GLIBCXX_NUM_CATEGORIES 0
++ 
++#ifdef __UCLIBC_HAS_XLOCALE__
++namespace __gnu_cxx
++{
++  extern "C" __typeof(uselocale) __uselocale;
++}
++#endif
++
++namespace std
++{
++#ifdef __UCLIBC_HAS_XLOCALE__
++  typedef __locale_t		__c_locale;
++#else
++  typedef int*			__c_locale;
++#endif
++
++  // Convert numeric value of type _Tv to string and return length of
++  // string.  If snprintf is available use it, otherwise fall back to
++  // the unsafe sprintf which, in general, can be dangerous and should
++  // be avoided.
++  template<typename _Tv>
++    int
++    __convert_from_v(char* __out, const int __size, const char* __fmt,
++#ifdef __UCLIBC_HAS_XLOCALE__
++		     _Tv __v, const __c_locale& __cloc, int __prec)
++    {
++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
++#else
++		     _Tv __v, const __c_locale&, int __prec)
++    {
++# ifdef __UCLIBC_HAS_LOCALE__
++      char* __old = std::setlocale(LC_ALL, NULL);
++      char* __sav = new char[std::strlen(__old) + 1];
++      std::strcpy(__sav, __old);
++      std::setlocale(LC_ALL, "C");
++# endif
++#endif
++
++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __gnu_cxx::__uselocale(__old);
++#elif defined __UCLIBC_HAS_LOCALE__
++      std::setlocale(LC_ALL, __sav);
++      delete [] __sav;
++#endif
++      return __ret;
++    }
++}
++
++#endif
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,306 @@
++// std::codecvt implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++namespace std
++{
++  // Specializations.
++#ifdef _GLIBCXX_USE_WCHAR_T
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_out(state_type& __state, const intern_type* __from, 
++	 const intern_type* __from_end, const intern_type*& __from_next,
++	 extern_type* __to, extern_type* __to_end,
++	 extern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
++    // in case we fall back to wcrtomb and then continue, in a loop.
++    // NB: wcsnrtombs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
++						      __from_end - __from_next);
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
++					 __from_chunk_end - __from_next,
++					 __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // wcrtomb.
++	    for (; __from < __from_next; ++__from)
++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
++	    __state = __tmp_state;
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    extern_type __buf[MB_LEN_MAX];
++	    __tmp_state = __state;
++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
++	      __ret = partial;
++	    else
++	      {
++		memcpy(__to_next, __buf, __conv);
++		__state = __tmp_state;
++		__to_next += __conv;
++		++__from_next;
++	      }
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++  
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_in(state_type& __state, const extern_type* __from, 
++	const extern_type* __from_end, const extern_type*& __from_next,
++	intern_type* __to, intern_type* __to_end,
++	intern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we store a L'\0' and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
++								  __from_end
++								  - __from_next));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
++				   __from_chunk_end - __from_next,
++				   __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (;; ++__to_next, __from += __conv)
++	      {
++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __from_next = __from;
++	    __state = __tmp_state;	    
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    // It is unclear what to return in this case (see DR 382). 
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    if (__to_next < __to_end)
++	      {
++		// XXX Probably wrong for stateful encodings
++		__tmp_state = __state;		
++		++__from_next;
++		*__to_next++ = L'\0';
++	      }
++	    else
++	      __ret = partial;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_encoding() const throw()
++  {
++    // XXX This implementation assumes that the encoding is
++    // stateless and is either single-byte or variable-width.
++    int __ret = 0;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    if (MB_CUR_MAX == 1)
++      __ret = 1;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }  
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_max_length() const throw()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    // XXX Probably wrong for stateful encodings.
++    int __ret = MB_CUR_MAX;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }
++  
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_length(state_type& __state, const extern_type* __from,
++	    const extern_type* __end, size_t __max) const
++  {
++    int __ret = 0;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we advance past it and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++  
++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
++    // its fourth parameter (it wouldn't with NULL as first parameter).
++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
++							   * __max));
++    while (__from < __end && __max)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
++								  __end
++								  - __from));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __end;
++
++	const extern_type* __tmp_from = __from;
++	size_t __conv = mbsnrtowcs(__to, &__from,
++				   __from_chunk_end - __from,
++				   __max, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (__from = __tmp_from;; __from += __conv)
++	      {
++		__conv = mbrtowc(NULL, __from, __end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __state = __tmp_state;
++	    __ret += __from - __tmp_from;
++	    break;
++	  }
++	if (!__from)
++	  __from = __from_chunk_end;
++	
++	__ret += __from - __tmp_from;
++	__max -= __conv;
++
++	if (__from < __end && __max)
++	  {
++	    // XXX Probably wrong for stateful encodings
++	    __tmp_state = __state;
++	    ++__from;
++	    ++__ret;
++	    --__max;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,80 @@
++// std::collate implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
++#endif
++
++namespace std
++{
++  // These are basically extensions to char_traits, and perhaps should
++  // be put there instead of here.
++  template<>
++    int 
++    collate<char>::_M_compare(const char* __one, const char* __two) const
++    { 
++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<char>::_M_transform(char* __to, const char* __from, 
++				size_t __n) const 
++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    int 
++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
++				 const wchar_t* __two) const
++    {
++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
++				   size_t __n) const
++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,300 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __wctype_l(S, L)           wctype((S))
++#define __towupper_l(C, L)         towupper((C))
++#define __towlower_l(C, L)         towlower((C))
++#define __iswctype_l(C, M, L)      iswctype((C), (M))
++#endif
++
++namespace std
++{
++  // NB: The other ctype<char> specializations are in src/locale.cc and
++  // various /config/os/* files.
++  template<>
++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++    : ctype<char>(0, false, __refs) 
++    { 		
++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	{
++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
++#endif
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T  
++  ctype<wchar_t>::__wmask_type
++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
++  {
++    __wmask_type __ret;
++    switch (__m)
++      {
++      case space:
++	__ret = __wctype_l("space", _M_c_locale_ctype);
++	break;
++      case print:
++	__ret = __wctype_l("print", _M_c_locale_ctype);
++	break;
++      case cntrl:
++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
++	break;
++      case upper:
++	__ret = __wctype_l("upper", _M_c_locale_ctype);
++	break;
++      case lower:
++	__ret = __wctype_l("lower", _M_c_locale_ctype);
++	break;
++      case alpha:
++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
++	break;
++      case digit:
++	__ret = __wctype_l("digit", _M_c_locale_ctype);
++	break;
++      case punct:
++	__ret = __wctype_l("punct", _M_c_locale_ctype);
++	break;
++      case xdigit:
++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
++	break;
++      case alnum:
++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
++	break;
++      case graph:
++	__ret = __wctype_l("graph", _M_c_locale_ctype);
++	break;
++      default:
++	__ret = __wmask_type();
++      }
++    return __ret;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_toupper(wchar_t __c) const
++  { return __towupper_l(__c, _M_c_locale_ctype); }
++
++  const wchar_t*
++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_tolower(wchar_t __c) const
++  { return __towlower_l(__c, _M_c_locale_ctype); }
++  
++  const wchar_t*
++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++
++  bool
++  ctype<wchar_t>::
++  do_is(mask __m, wchar_t __c) const
++  { 
++    // Highest bitmask in ctype_base == 10, but extra in "C"
++    // library for blank.
++    bool __ret = false;
++    const size_t __bitmasksize = 11; 
++    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++      if (__m & _M_bit[__bitcur]
++	  && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
++	{
++	  __ret = true;
++	  break;
++	}
++    return __ret;    
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++  {
++    for (; __lo < __hi; ++__vec, ++__lo)
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11; 
++	mask __m = 0;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
++	    __m |= _M_bit[__bitcur];
++	*__vec = __m;
++      }
++    return __hi;
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi && !this->do_is(__m, *__lo))
++      ++__lo;
++    return __lo;
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++  {
++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
++      ++__lo;
++    return __lo;
++  }
++
++  wchar_t
++  ctype<wchar_t>::
++  do_widen(char __c) const
++  { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<wchar_t>::
++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++  {
++    while (__lo < __hi)
++      {
++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++	++__lo;
++	++__dest;
++      }
++    return __hi;
++  }
++
++  char
++  ctype<wchar_t>::
++  do_narrow(wchar_t __wc, char __dfault) const
++  {
++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++      return _M_narrow[__wc];
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    const int __c = wctob(__wc);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
++	    char* __dest) const
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    if (_M_narrow_ok)
++      while (__lo < __hi)
++	{
++	  if (*__lo >= 0 && *__lo < 128)
++	    *__dest = _M_narrow[*__lo];
++	  else
++	    {
++	      const int __c = wctob(*__lo);
++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	    }
++	  ++__lo;
++	  ++__dest;
++	}
++    else
++      while (__lo < __hi)
++	{
++	  const int __c = wctob(*__lo);
++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	  ++__lo;
++	  ++__dest;
++	}
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __hi;
++  }
++
++  void
++  ctype<wchar_t>::_M_initialize_ctype()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    wint_t __i;
++    for (__i = 0; __i < 128; ++__i)
++      {
++	const int __c = wctob(__i);
++	if (__c == EOF)
++	  break;
++	else
++	  _M_narrow[__i] = static_cast<char>(__c);
++      }
++    if (__i == 128)
++      _M_narrow_ok = true;
++    else
++      _M_narrow_ok = false;
++    for (size_t __j = 0;
++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
++      _M_widen[__j] = btowc(__j);
++
++    for (size_t __k = 0; __k <= 11; ++__k)
++      { 
++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
++      }
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++  }
++#endif //  _GLIBCXX_USE_WCHAR_T
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,100 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix gettext stuff
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__dcgettext(const char *domainname,
++			     const char *msgid, int category);
++#undef gettext
++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
++#else
++#undef gettext
++#define gettext(msgid) (msgid)
++#endif
++
++namespace std
++{
++  // Specializations.
++  template<>
++    string
++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
++      __uselocale(__old);
++      return string(__msg);
++#elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      const char* __msg = gettext(__dfault.c_str());
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return string(__msg);
++#else
++      const char* __msg = gettext(__dfault.c_str());
++      return string(__msg);
++#endif
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    wstring
++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
++    {
++# ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      __uselocale(__old);
++      return _M_convert_from_char(__msg);
++# elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return _M_convert_from_char(__msg);
++# else
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      return _M_convert_from_char(__msg);
++# endif
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,118 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix prototypes for *textdomain funcs
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__textdomain(const char *domainname);
++extern "C" char *__bindtextdomain(const char *domainname,
++				  const char *dirname);
++#else
++#undef __textdomain
++#undef __bindtextdomain
++#define __textdomain(D)           ((void)0)
++#define __bindtextdomain(D,P)     ((void)0)
++#endif
++
++  // Non-virtual member functions.
++  template<typename _CharT>
++     messages<_CharT>::messages(size_t __refs)
++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
++     _M_name_messages(_S_get_c_name())
++     { }
++
++  template<typename _CharT>
++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
++				size_t __refs) 
++     : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
++     _M_name_messages(__s)
++     {
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       _M_name_messages = __tmp;
++     }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
++			   const char* __dir) const
++    { 
++      __bindtextdomain(__s.c_str(), __dir);
++      return this->do_open(__s, __loc); 
++    }
++
++  // Virtual member functions.
++  template<typename _CharT>
++    messages<_CharT>::~messages()
++    { 
++      if (_M_name_messages != _S_get_c_name())
++	delete [] _M_name_messages;
++      _S_destroy_c_locale(_M_c_locale_messages); 
++    }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::do_open(const basic_string<char>& __s, 
++			      const locale&) const
++    { 
++      // No error checking is done, assume the catalog exists and can
++      // be used.
++      __textdomain(__s.c_str());
++      return 0;
++    }
++
++  template<typename _CharT>
++    void    
++    messages<_CharT>::do_close(catalog) const 
++    { }
++
++   // messages_byname
++   template<typename _CharT>
++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
++     : messages<_CharT>(__refs) 
++     { 
++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
++	 delete [] this->_M_name_messages;
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       this->_M_name_messages = __tmp;
++
++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	 {
++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
++	 }
++     }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2005-04-28 01:23:02.000000000 -0500
+@@ -0,0 +1,692 @@
++// std::moneypunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning optimize this for uclibc
++#warning tailor for stub locale support
++#endif
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  // Construct and return valid pattern consisting of some combination of:
++  // space none symbol sign value
++  money_base::pattern
++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
++  { 
++    pattern __ret;
++
++    // This insanely complicated routine attempts to construct a valid
++    // pattern for use with monyepunct. A couple of invariants:
++
++    // if (__precedes) symbol -> value
++    // else value -> symbol
++    
++    // if (__space) space
++    // else none
++
++    // none == never first
++    // space never first or last
++
++    // Any elegant implementations of this are welcome.
++    switch (__posn)
++      {
++      case 0:
++      case 1:
++	// 1 The sign precedes the value and symbol.
++	__ret.field[0] = sign;
++	if (__space)
++	  {
++	    // Pattern starts with sign.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[3] = symbol;
++	      }
++	    __ret.field[2] = space;
++	  }
++	else
++	  {
++	    // Pattern starts with sign and ends with none.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 2:
++	// 2 The sign follows the value and symbol.
++	if (__space)
++	  {
++	    // Pattern either ends with sign.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[1] = space;
++	    __ret.field[3] = sign;
++	  }
++	else
++	  {
++	    // Pattern ends with sign then none.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[1] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[1] = symbol;
++	      }
++	    __ret.field[2] = sign;
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 3:
++	// 3 The sign immediately precedes the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = sign;
++	    __ret.field[1] = symbol;	    
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;		
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = sign;
++		__ret.field[3] = symbol;
++	      }
++	    else
++	      {
++		__ret.field[1] = sign;
++		__ret.field[2] = symbol;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      case 4:
++	// 4 The sign immediately follows the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = symbol;
++	    __ret.field[1] = sign;
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = symbol;
++		__ret.field[3] = sign;
++	      }
++	    else
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = sign;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      default:
++	__ret = pattern();
++      }
++    return __ret;
++  }
++
++  template<> 
++    void
++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++						     const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == true
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    void
++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
++						      const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, false>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == false
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    moneypunct<char, true>::~moneypunct()
++    { delete _M_data; }
++
++  template<> 
++    moneypunct<char, false>::~moneypunct()
++    { delete _M_data; }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++#ifdef __UCLIBC_HAS_XLOCALE__
++							const char*)
++#else
++							const char* __name)
++#endif
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<wchar_t, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  try
++	    {
++	      mbstate_t __state;
++	      size_t __len = strlen(__cpossign);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++	      
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++	  catch (...)
++	    {
++	      delete _M_data;
++	      _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++	      __throw_exception_again;
++	    } 
++	  
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++  void
++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
++#ifdef __UCLIBC_HAS_XLOCALE__
++						       const char*)
++#else
++                                                       const char* __name)
++#endif
++  {
++    if (!_M_data)
++      _M_data = new __moneypunct_cache<wchar_t, false>;
++
++    if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++          _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++          union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  try
++            {
++              mbstate_t __state;
++              size_t __len;
++              __len = strlen(__cpossign);
++              if (__len)
++                {
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++          catch (...)
++	    {
++	      delete _M_data;
++              _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++              __throw_exception_again;
++	    }
++
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++	                                                __pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++	                                                __nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++    moneypunct<wchar_t, true>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++
++  template<> 
++    moneypunct<wchar_t, false>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2005-04-28 01:20:20.000000000 -0500
+@@ -0,0 +1,173 @@
++// std::numpunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<> 
++    void
++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
++							__cloc));
++
++	  // Check for NULL, which implies no grouping.
++	  if (_M_data->_M_thousands_sep == '\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = "true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = "false";
++      _M_data->_M_falsename_size = 5;
++    }
++ 
++  template<> 
++    numpunct<char>::~numpunct()
++    { delete _M_data; }
++   
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<wchar_t>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
++	}
++      else
++	{
++	  // Named locale.
++	  // NB: In the GNU model wchar_t is always 32 bit wide.
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++
++	  if (_M_data->_M_thousands_sep == L'\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = L"true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = L"false";
++      _M_data->_M_falsename_size = 5;
++    }
++
++  template<> 
++    numpunct<wchar_t>::~numpunct()
++    { delete _M_data; }
++ #endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,406 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<>
++    void
++    __timepunct<char>::
++    _M_put(char* __s, size_t __maxlen, const char* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = '\0';
++    }
++
++  template<> 
++    void
++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = "%m/%d/%y";
++	  _M_data->_M_date_era_format = "%m/%d/%y";
++	  _M_data->_M_time_format = "%H:%M:%S";
++	  _M_data->_M_time_era_format = "%H:%M:%S";
++	  _M_data->_M_date_time_format = "";
++	  _M_data->_M_date_time_era_format = "";
++	  _M_data->_M_am = "AM";
++	  _M_data->_M_pm = "PM";
++	  _M_data->_M_am_pm_format = "";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = "Sunday";
++	  _M_data->_M_day2 = "Monday";
++	  _M_data->_M_day3 = "Tuesday";
++	  _M_data->_M_day4 = "Wednesday";
++	  _M_data->_M_day5 = "Thursday";
++	  _M_data->_M_day6 = "Friday";
++	  _M_data->_M_day7 = "Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = "Sun";
++	  _M_data->_M_aday2 = "Mon";
++	  _M_data->_M_aday3 = "Tue";
++	  _M_data->_M_aday4 = "Wed";
++	  _M_data->_M_aday5 = "Thu";
++	  _M_data->_M_aday6 = "Fri";
++	  _M_data->_M_aday7 = "Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = "January";
++	  _M_data->_M_month02 = "February";
++	  _M_data->_M_month03 = "March";
++	  _M_data->_M_month04 = "April";
++	  _M_data->_M_month05 = "May";
++	  _M_data->_M_month06 = "June";
++	  _M_data->_M_month07 = "July";
++	  _M_data->_M_month08 = "August";
++	  _M_data->_M_month09 = "September";
++	  _M_data->_M_month10 = "October";
++	  _M_data->_M_month11 = "November";
++	  _M_data->_M_month12 = "December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = "Jan";
++	  _M_data->_M_amonth02 = "Feb";
++	  _M_data->_M_amonth03 = "Mar";
++	  _M_data->_M_amonth04 = "Apr";
++	  _M_data->_M_amonth05 = "May";
++	  _M_data->_M_amonth06 = "Jun";
++	  _M_data->_M_amonth07 = "Jul";
++	  _M_data->_M_amonth08 = "Aug";
++	  _M_data->_M_amonth09 = "Sep";
++	  _M_data->_M_amonth10 = "Oct";
++	  _M_data->_M_amonth11 = "Nov";
++	  _M_data->_M_amonth12 = "Dec";
++	}
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
++							     __cloc);
++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    void
++    __timepunct<wchar_t>::
++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = L'\0';
++    }
++
++  template<> 
++    void
++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<wchar_t>;
++
++#warning wide time stuff
++//       if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = L"%m/%d/%y";
++	  _M_data->_M_date_era_format = L"%m/%d/%y";
++	  _M_data->_M_time_format = L"%H:%M:%S";
++	  _M_data->_M_time_era_format = L"%H:%M:%S";
++	  _M_data->_M_date_time_format = L"";
++	  _M_data->_M_date_time_era_format = L"";
++	  _M_data->_M_am = L"AM";
++	  _M_data->_M_pm = L"PM";
++	  _M_data->_M_am_pm_format = L"";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = L"Sunday";
++	  _M_data->_M_day2 = L"Monday";
++	  _M_data->_M_day3 = L"Tuesday";
++	  _M_data->_M_day4 = L"Wednesday";
++	  _M_data->_M_day5 = L"Thursday";
++	  _M_data->_M_day6 = L"Friday";
++	  _M_data->_M_day7 = L"Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = L"Sun";
++	  _M_data->_M_aday2 = L"Mon";
++	  _M_data->_M_aday3 = L"Tue";
++	  _M_data->_M_aday4 = L"Wed";
++	  _M_data->_M_aday5 = L"Thu";
++	  _M_data->_M_aday6 = L"Fri";
++	  _M_data->_M_aday7 = L"Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = L"January";
++	  _M_data->_M_month02 = L"February";
++	  _M_data->_M_month03 = L"March";
++	  _M_data->_M_month04 = L"April";
++	  _M_data->_M_month05 = L"May";
++	  _M_data->_M_month06 = L"June";
++	  _M_data->_M_month07 = L"July";
++	  _M_data->_M_month08 = L"August";
++	  _M_data->_M_month09 = L"September";
++	  _M_data->_M_month10 = L"October";
++	  _M_data->_M_month11 = L"November";
++	  _M_data->_M_month12 = L"December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = L"Jan";
++	  _M_data->_M_amonth02 = L"Feb";
++	  _M_data->_M_amonth03 = L"Mar";
++	  _M_data->_M_amonth04 = L"Apr";
++	  _M_data->_M_amonth05 = L"May";
++	  _M_data->_M_amonth06 = L"Jun";
++	  _M_data->_M_amonth07 = L"Jul";
++	  _M_data->_M_amonth08 = L"Aug";
++	  _M_data->_M_amonth09 = L"Sep";
++	  _M_data->_M_amonth10 = L"Oct";
++	  _M_data->_M_amonth11 = L"Nov";
++	  _M_data->_M_amonth12 = L"Dec";
++	}
++#if 0
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  union { char *__s; wchar_t *__w; } __u;
++
++	  __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
++	  _M_data->_M_date_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
++	  _M_data->_M_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
++	  _M_data->_M_am = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
++	  _M_data->_M_pm = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
++	  _M_data->_M_am_pm_format = __u.__w;
++
++	  // Day names, starting with "C"'s Sunday.
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
++	  _M_data->_M_day1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
++	  _M_data->_M_day2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
++	  _M_data->_M_day3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
++	  _M_data->_M_day4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
++	  _M_data->_M_day5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
++	  _M_data->_M_day6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
++	  _M_data->_M_day7 = __u.__w;
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
++	  _M_data->_M_aday1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
++	  _M_data->_M_aday2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
++	  _M_data->_M_aday3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
++	  _M_data->_M_aday4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
++	  _M_data->_M_aday5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
++	  _M_data->_M_aday6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
++	  _M_data->_M_aday7 = __u.__w;
++
++	  // Month names, starting with "C"'s January.
++	  __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
++	  _M_data->_M_month01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
++	  _M_data->_M_month02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
++	  _M_data->_M_month03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
++	  _M_data->_M_month04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
++	  _M_data->_M_month05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
++	  _M_data->_M_month06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
++	  _M_data->_M_month07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
++	  _M_data->_M_month08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
++	  _M_data->_M_month09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
++	  _M_data->_M_month10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
++	  _M_data->_M_month11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
++	  _M_data->_M_month12 = __u.__w;
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
++	  _M_data->_M_amonth01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
++	  _M_data->_M_amonth02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
++	  _M_data->_M_amonth03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
++	  _M_data->_M_amonth04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
++	  _M_data->_M_amonth05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
++	  _M_data->_M_amonth06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
++	  _M_data->_M_amonth07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
++	  _M_data->_M_amonth08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
++	  _M_data->_M_amonth09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
++	  _M_data->_M_amonth10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
++	  _M_data->_M_amonth11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
++	  _M_data->_M_amonth12 = __u.__w;
++	}
++#endif // 0
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h	2004-05-22 18:46:31.000000000 -0500
+@@ -0,0 +1,68 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
++				     size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(__s)
++    { 
++      char* __tmp = new char[std::strlen(__s) + 1];
++      std::strcpy(__tmp, __s);
++      _M_name_timepunct = __tmp;
++      _M_initialize_timepunct(__cloc); 
++    }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::~__timepunct()
++    { 
++      if (_M_name_timepunct != _S_get_c_name())
++	delete [] _M_name_timepunct;
++      delete _M_data; 
++      _S_destroy_c_locale(_M_c_locale_timepunct); 
++    }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,64 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++/** @file ctype_base.h
++ *  This is an internal header file, included by other library headers.
++ *  You should not attempt to use it directly.
++ */
++
++// Information as gleaned from /usr/include/ctype.h
++  
++  /// @brief  Base class for ctype.
++  struct ctype_base
++  {
++    // Note: In uClibc, the following two types depend on configuration.
++ 
++    // Non-standard typedefs.
++    typedef const __ctype_touplow_t* __to_type;
++
++    // NB: Offsets into ctype<char>::_M_table force a particular size
++    // on the mask type. Because of this, we don't use an enum.
++    typedef __ctype_mask_t	mask;   
++    static const mask upper    	= _ISupper;
++    static const mask lower 	= _ISlower;
++    static const mask alpha 	= _ISalpha;
++    static const mask digit 	= _ISdigit;
++    static const mask xdigit 	= _ISxdigit;
++    static const mask space 	= _ISspace;
++    static const mask print 	= _ISprint;
++    static const mask graph 	= _ISalpha | _ISdigit | _ISpunct;
++    static const mask cntrl 	= _IScntrl;
++    static const mask punct 	= _ISpunct;
++    static const mask alnum 	= _ISalpha | _ISdigit;
++  };
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h	2002-06-24 00:49:19.000000000 -0500
+@@ -0,0 +1,69 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
++// functions go in ctype.cc
++  
++  bool
++  ctype<char>::
++  is(mask __m, char __c) const
++  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
++
++  const char*
++  ctype<char>::
++  is(const char* __low, const char* __high, mask* __vec) const
++  {
++    while (__low < __high)
++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
++    return __high;
++  }
++
++  const char*
++  ctype<char>::
++  scan_is(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
++      ++__low;
++    return __low;
++  }
++
++  const char*
++  ctype<char>::
++  scan_not(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
++      ++__low;
++    return __low;
++  }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,92 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++
++  const ctype_base::mask*
++  ctype<char>::classic_table() throw()
++  { return __C_ctype_b; }
++
++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
++		     size_t __refs) 
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  char
++  ctype<char>::do_toupper(char __c) const
++  { return _M_toupper[static_cast<unsigned char>(__c)]; }
++
++  const char*
++  ctype<char>::do_toupper(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_toupper[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
++
++  char
++  ctype<char>::do_tolower(char __c) const
++  { return _M_tolower[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<char>::do_tolower(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_tolower[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,44 @@
++// Specific definitions for GNU/Linux  -*- C++ -*-
++
++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here.  This
++// file will come before all others.
++
++// This keeps isanum, et al from being propagated as macros.
++#define __NO_CTYPE 1
++
++#include <features.h>
++
++// We must not see the optimized string functions GNU libc defines.
++#define __NO_STRING_INLINES
++
++#endif
+diff -urN gcc-4.0.0-100/libstdc++-v3/configure gcc-4.0.0/libstdc++-v3/configure
+--- gcc-4.0.0-100/libstdc++-v3/configure	2005-04-30 13:06:53.683055232 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 12:24:24.000000000 -0500
+@@ -3998,6 +3998,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5672,7 +5677,7 @@
+   enableval="$enable_clocale"
+ 
+       case "$enableval" in
+-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
+        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
+ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
+    { (exit 1); exit 1; }; } ;;
+@@ -5697,6 +5702,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      linux-uclibc*)
++	enable_clocale_flag=uclibc
++	;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+@@ -5927,6 +5935,76 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      echo "$as_me:$LINENO: result: uclibc" >&5
++echo "${ECHO_T}uclibc" >&6
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      # Extract the first word of "msgfmt", so it can be a program name with args.
++set dummy msgfmt; ac_word=$2
++echo "$as_me:$LINENO: checking for $ac_word" >&5
++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  if test -n "$check_msgfmt"; then
++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++    ac_cv_prog_check_msgfmt="yes"
++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++
++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
++fi
++fi
++check_msgfmt=$ac_cv_prog_check_msgfmt
++if test -n "$check_msgfmt"; then
++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
++echo "${ECHO_T}$check_msgfmt" >&6
++else
++  echo "$as_me:$LINENO: result: no" >&5
++echo "${ECHO_T}no" >&6
++fi
++
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++
++
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-4.0.0-100/libstdc++-v3/configure.host gcc-4.0.0/libstdc++-v3/configure.host
+--- gcc-4.0.0-100/libstdc++-v3/configure.host	2005-04-30 13:06:53.688054472 -0500
++++ gcc-4.0.0/libstdc++-v3/configure.host	2005-04-28 20:20:32.000000000 -0500
+@@ -249,6 +249,12 @@
+     ;;
+ esac
+ 
++# Override for uClibc since linux-uclibc gets mishandled above.
++case "${host_os}" in
++  *-uclibc*)
++    os_include_dir="os/uclibc"
++    ;;
++esac
+ 
+ # Set any OS-dependent and CPU-dependent bits.
+ # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+diff -urN gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 gcc-4.0.0/libstdc++-v3/crossconfig.m4
+--- gcc-4.0.0-100/libstdc++-v3/crossconfig.m4	2005-04-30 13:06:53.689054320 -0500
++++ gcc-4.0.0/libstdc++-v3/crossconfig.m4	2005-04-28 20:27:15.000000000 -0500
+@@ -142,6 +142,98 @@
+ 	;;
+     esac
+     ;;
++  *-uclibc*)
++# Temporary hack until we implement the float versions of the libm funcs
++    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
++      machine/endian.h machine/param.h sys/machine.h sys/types.h \
++      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
++    SECTION_FLAGS='-ffunction-sections -fdata-sections'
++    AC_SUBST(SECTION_FLAGS)
++    GLIBCXX_CHECK_LINKER_FEATURES
++    GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
++    GLIBCXX_CHECK_WCHAR_T_SUPPORT
++
++    # For LFS.
++    AC_DEFINE(HAVE_INT64_T)
++    case "$target" in
++      *-uclinux*)
++        # Don't enable LFS with uClinux
++        ;;
++      *)
++        AC_DEFINE(_GLIBCXX_USE_LFS)
++    esac
++
++    # For showmanyc_helper().
++    AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
++    GLIBCXX_CHECK_POLL
++    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
++
++    # For xsputn_2().
++    AC_CHECK_HEADERS(sys/uio.h)
++    GLIBCXX_CHECK_WRITEV
++
++#     AC_DEFINE(HAVE_ACOSF)
++#     AC_DEFINE(HAVE_ASINF)
++#     AC_DEFINE(HAVE_ATANF)
++#     AC_DEFINE(HAVE_ATAN2F)
++    AC_DEFINE(HAVE_CEILF)
++    AC_DEFINE(HAVE_COPYSIGN)
++#     AC_DEFINE(HAVE_COPYSIGNF)
++#     AC_DEFINE(HAVE_COSF)
++#     AC_DEFINE(HAVE_COSHF)
++#     AC_DEFINE(HAVE_EXPF)
++#     AC_DEFINE(HAVE_FABSF)
++    AC_DEFINE(HAVE_FINITE)
++    AC_DEFINE(HAVE_FINITEF)
++    AC_DEFINE(HAVE_FLOORF)
++#     AC_DEFINE(HAVE_FMODF)
++#     AC_DEFINE(HAVE_FREXPF)
++    AC_DEFINE(HAVE_HYPOT)
++#     AC_DEFINE(HAVE_HYPOTF)
++    AC_DEFINE(HAVE_ISINF)
++    AC_DEFINE(HAVE_ISINFF)
++    AC_DEFINE(HAVE_ISNAN)
++    AC_DEFINE(HAVE_ISNANF)
++#     AC_DEFINE(HAVE_LOGF)
++#     AC_DEFINE(HAVE_LOG10F)
++#     AC_DEFINE(HAVE_MODFF)
++#     AC_DEFINE(HAVE_SINF)
++#     AC_DEFINE(HAVE_SINHF)
++#     AC_DEFINE(HAVE_SINCOS)
++#     AC_DEFINE(HAVE_SINCOSF)
++    AC_DEFINE(HAVE_SQRTF)
++#     AC_DEFINE(HAVE_TANF)
++#     AC_DEFINE(HAVE_TANHF)
++    if test x"long_double_math_on_this_cpu" = x"yes"; then
++#       AC_DEFINE(HAVE_ACOSL)
++#       AC_DEFINE(HAVE_ASINL)
++#       AC_DEFINE(HAVE_ATANL)
++#       AC_DEFINE(HAVE_ATAN2L)
++#       AC_DEFINE(HAVE_CEILL)
++#       AC_DEFINE(HAVE_COPYSIGNL)
++#       AC_DEFINE(HAVE_COSL)
++#       AC_DEFINE(HAVE_COSHL)
++#       AC_DEFINE(HAVE_EXPL)
++#       AC_DEFINE(HAVE_FABSL)
++#       AC_DEFINE(HAVE_FINITEL)
++#       AC_DEFINE(HAVE_FLOORL)
++#       AC_DEFINE(HAVE_FMODL)
++#       AC_DEFINE(HAVE_FREXPL)
++#       AC_DEFINE(HAVE_HYPOTL)
++#       AC_DEFINE(HAVE_ISINFL)
++#       AC_DEFINE(HAVE_ISNANL)
++#       AC_DEFINE(HAVE_LOGL)
++#       AC_DEFINE(HAVE_LOG10L)
++#       AC_DEFINE(HAVE_MODFL)
++#       AC_DEFINE(HAVE_POWL)
++#       AC_DEFINE(HAVE_SINL)
++#       AC_DEFINE(HAVE_SINHL)
++#       AC_DEFINE(HAVE_SINCOSL)
++#       AC_DEFINE(HAVE_SQRTL)
++#       AC_DEFINE(HAVE_TANL)
++#       AC_DEFINE(HAVE_TANHL)
++    fi
++    ;;
+   *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu)
+     AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+       machine/endian.h machine/param.h sys/machine.h sys/types.h \
+@@ -156,7 +248,7 @@
+     AC_DEFINE(HAVE_INT64_T)
+     case "$target" in
+       *-uclinux*)
+-        # Don't enable LFS with uClibc
++        # Don't enable LFS with uClinux
+         ;;
+       *)
+         AC_DEFINE(_GLIBCXX_USE_LFS)
+diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h
+--- gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h	2005-04-30 13:06:53.690054168 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h	2005-04-28 20:15:56.000000000 -0500
+@@ -101,7 +101,9 @@
+ using std::wmemcpy;
+ using std::wmemmove;
+ using std::wmemset;
++#if _GLIBCXX_HAVE_WCSFTIME
+ using std::wcsftime;
++#endif
+ 
+ #if _GLIBCXX_USE_C99
+ using std::wcstold;
+diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h
+--- gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h	2005-04-30 13:06:53.691054016 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h	2005-04-28 20:15:56.000000000 -0500
+@@ -179,7 +179,9 @@
+   using ::wcscoll;
+   using ::wcscpy;
+   using ::wcscspn;
++#if _GLIBCXX_HAVE_WCSFTIME
+   using ::wcsftime;
++#endif
+   using ::wcslen;
+   using ::wcsncat;
+   using ::wcsncmp;
diff --git a/patches/gcc/4.0.3/300-libstdc++-pic.patch b/patches/gcc/4.0.3/300-libstdc++-pic.patch
new file mode 100644
index 00000000..a9d6e718
--- /dev/null
+++ b/patches/gcc/4.0.3/300-libstdc++-pic.patch
@@ -0,0 +1,45 @@
+--- gcc-4.0.0/libstdc++-v3/src/Makefile.am
++++ gcc-4.0.0/libstdc++-v3/src/Makefile.am
+@@ -214,6 +214,10 @@
+ 	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@
+ 
+ 
++install-exec-local:
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++
+ # Added bits to build debug library.
+ if GLIBCXX_BUILD_DEBUG
+ all-local: build_debug
+--- gcc-4.0.0/libstdc++-v3/src/Makefile.in
++++ gcc-4.0.0/libstdc++-v3/src/Makefile.in
+@@ -625,7 +625,7 @@
+ 
+ install-data-am: install-data-local
+ 
+-install-exec-am: install-toolexeclibLTLIBRARIES
++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local
+ 
+ install-info: install-info-am
+ 
+@@ -664,7 +664,7 @@
+ 	maintainer-clean-generic mostlyclean mostlyclean-compile \
+ 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ 	tags uninstall uninstall-am uninstall-info-am \
+-	uninstall-toolexeclibLTLIBRARIES
++	uninstall-toolexeclibLTLIBRARIES install-exec-local
+ 
+ @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@libstdc++-symbol.ver:  ${glibcxx_srcdir}/$(SYMVER_MAP)
+ @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@	cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver
+@@ -743,6 +743,11 @@
+ install_debug:
+ 	(cd ${debugdir} && $(MAKE) \
+ 	toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install)
++
++install-exec-local:
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
diff --git a/patches/gcc/4.0.3/301-missing-execinfo_h.patch b/patches/gcc/4.0.3/301-missing-execinfo_h.patch
new file mode 100644
index 00000000..0e2092f3
--- /dev/null
+++ b/patches/gcc/4.0.3/301-missing-execinfo_h.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/boehm-gc/include/gc.h-orig	2005-04-28 22:28:57.000000000 -0500
++++ gcc-4.0.0/boehm-gc/include/gc.h	2005-04-28 22:30:38.000000000 -0500
+@@ -500,7 +500,7 @@
+ #ifdef __linux__
+ # include <features.h>
+ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+-     && !defined(__ia64__)
++     && !defined(__ia64__) && !defined(__UCLIBC__)
+ #   ifndef GC_HAVE_BUILTIN_BACKTRACE
+ #     define GC_HAVE_BUILTIN_BACKTRACE
+ #   endif
diff --git a/patches/gcc/4.0.3/302-c99-snprintf.patch b/patches/gcc/4.0.3/302-c99-snprintf.patch
new file mode 100644
index 00000000..dfb22d68
--- /dev/null
+++ b/patches/gcc/4.0.3/302-c99-snprintf.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig	2005-04-29 00:08:41.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h	2005-04-29 00:08:45.000000000 -0500
+@@ -142,7 +142,7 @@
+   using ::vsprintf;
+ }
+ 
+-#if _GLIBCXX_USE_C99
++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__)
+ 
+ #undef snprintf
+ #undef vfscanf
diff --git a/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch b/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch
new file mode 100644
index 00000000..2ccc80d9
--- /dev/null
+++ b/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch
@@ -0,0 +1,12 @@
+--- gcc-4.0.0/libstdc++-v3/configure-old	2005-04-30 22:04:48.061603912 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 22:06:13.678588152 -0500
+@@ -7194,6 +7194,9 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ #include <complex.h>
++#ifdef __UCLIBC__
++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs
++#endif
+ int
+ main ()
+ {
diff --git a/patches/gcc/4.0.3/304-index_macro.patch b/patches/gcc/4.0.3/304-index_macro.patch
new file mode 100644
index 00000000..1fac112f
--- /dev/null
+++ b/patches/gcc/4.0.3/304-index_macro.patch
@@ -0,0 +1,24 @@
+--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps	2006-03-24 01:49:51 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/rope	2006-03-24 01:49:37 +0100
+@@ -59,6 +59,9 @@
+ #include <bits/allocator.h>
+ #include <ext/hash_fun.h>
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ # ifdef __GC
+ #   define __GC_CONST const
+ # else
+--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps	2006-03-24 01:50:04 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h	2006-03-24 01:50:28 +0100
+@@ -53,6 +53,9 @@
+ #include <ext/memory> // For uninitialized_copy_n
+ #include <ext/numeric> // For power
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ namespace __gnu_cxx
+ {
+   using std::size_t;
diff --git a/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch b/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch
new file mode 100644
index 00000000..c7676ae6
--- /dev/null
+++ b/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch
@@ -0,0 +1,22 @@
+diff -urN gcc-4.0.0-100/libstdc++-v3/fragment.am gcc-4.0.0/libstdc++-v3/fragment.am
+--- gcc-4.0.0-100/libstdc++-v3/fragment.am	2004-10-25 15:32:40.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/fragment.am	2005-04-28 21:48:43.000000000 -0500
+@@ -18,5 +18,5 @@
+ 	$(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once
+ 
+ # -I/-D flags to pass when compiling.
+-AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+diff -urN gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am gcc-4.0.0/libstdc++-v3/libmath/Makefile.am
+--- gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am	2003-08-27 16:29:42.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/libmath/Makefile.am	2005-04-28 21:48:43.000000000 -0500
+@@ -32,7 +32,7 @@
+ 
+ libmath_la_SOURCES = stubs.c
+ 
+-AM_CPPFLAGS = $(CANADIAN_INCLUDES)
++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+ # Only compiling "C" sources in this directory.
+ LIBTOOL = @LIBTOOL@ --tag CC
diff --git a/patches/gcc/4.0.3/800-arm-bigendian.patch b/patches/gcc/4.0.3/800-arm-bigendian.patch
new file mode 100644
index 00000000..307aea3e
--- /dev/null
+++ b/patches/gcc/4.0.3/800-arm-bigendian.patch
@@ -0,0 +1,67 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+See http://gcc.gnu.org/PR16350
+
+--- gcc-4.0.3/gcc/config/arm/linux-elf.h
++++ gcc-4.0.3/gcc/config/arm/linux-elf.h
+@@ -31,19 +31,33 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ #undef  TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (0)
++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" }
+ 
+ /* The GNU C++ standard library requires that these macros be defined.  */
+ #undef CPLUSPLUS_CPP_SPEC
+@@ -90,7 +104,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+--- gcc-4.0.3/gcc/config.gcc
++++ gcc-4.0.3/gcc/config.gcc
+@@ -672,6 +672,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="${tmake_file} arm/t-arm arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/4.0.4/100-uclibc-conf.patch b/patches/gcc/4.0.4/100-uclibc-conf.patch
new file mode 100644
index 00000000..3be7d097
--- /dev/null
+++ b/patches/gcc/4.0.4/100-uclibc-conf.patch
@@ -0,0 +1,553 @@
+--- gcc-4.0.2/gcc/config/t-linux-uclibc
++++ gcc-4.0.2/gcc/config/t-linux-uclibc
+@@ -0,0 +1,5 @@
++# Remove glibc specific files added in t-linux
++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES))
++
++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc
++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH))
+--- gcc-4.0.2/gcc/config.gcc
++++ gcc-4.0.2/gcc/config.gcc
+@@ -1778,7 +1778,7 @@
+ 	;;
+ sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \
+ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
+-  sh-*-linux* | sh[346lbe]*-*-linux* | \
++  sh*-*-linux* | sh[346lbe]*-*-linux* | \
+   sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
+    sh64-*-netbsd* | sh64l*-*-netbsd*)
+ 	tmake_file="${tmake_file} sh/t-sh sh/t-elf"
+@@ -2234,10 +2234,16 @@
+ *)
+ 	echo "*** Configuration ${target} not supported" 1>&2
+ 	exit 1
+ 	;;
+ esac
++
++# Rather than hook into each target, just do it after all the linux
++# targets have been processed
++case ${target} in
++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc"
++esac
+ 
+ case ${target} in
+ i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1)
+ 	tmake_file="${tmake_file} i386/t-gmm_malloc"
+ 	;;
+--- gcc-4.0.2/gcc/config/alpha/linux-elf.h
++++ gcc-4.0.2/gcc/config/alpha/linux-elf.h
+@@ -27,7 +27,11 @@
+ #define SUBTARGET_EXTRA_SPECS \
+ { "elf_dynamic_linker", ELF_DYNAMIC_LINKER },
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
+ #define ELF_DYNAMIC_LINKER	"/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}		\
+   %{O*:-O3} %{!O*:-O1}						\
+--- gcc-4.0.2/gcc/config/arm/linux-elf.h
++++ gcc-4.0.2/gcc/config/arm/linux-elf.h
+@@ -81,14 +81,19 @@
+ #define ENDFILE_SPEC \
+   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "%{h*} %{version:-v} \
+    %{b} %{Wl,*:%*} \
+    %{static:-Bstatic} \
+    %{shared:-shared} \
+    %{symbolic:-Bsymbolic} \
+    %{rdynamic:-export-dynamic} \
+-   %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \
++   %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \
+    -X \
+    %{mbig-endian:-EB}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+--- gcc-4.0.2/gcc/config/cris/linux.h
++++ gcc-4.0.2/gcc/config/cris/linux.h
+@@ -79,6 +79,25 @@
+ #undef CRIS_DEFAULT_CPU_VERSION
+ #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG
+ 
++#ifdef USE_UCLIBC
++
++#undef CRIS_SUBTARGET_VERSION
++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc"
++
++#undef CRIS_LINK_SUBTARGET_SPEC
++#define CRIS_LINK_SUBTARGET_SPEC \
++ "-mcrislinux\
++  -rpath-link include/asm/../..%s\
++  %{shared} %{static}\
++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\
++  %{!shared: \
++    %{!static: \
++      %{rdynamic:-export-dynamic} \
++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \
++  %{!r:%{O2|O3: --gc-sections}}"
++
++#else  /* USE_UCLIBC */
++
+ #undef CRIS_SUBTARGET_VERSION
+ #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu"
+ 
+@@ -93,6 +112,8 @@
+   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\
+   %{!r:%{O2|O3: --gc-sections}}"
+ 
++#endif  /* USE_UCLIBC */
++
+ 
+ /* Node: Run-time Target */
+ 
+--- gcc-4.0.2/gcc/config/i386/linux.h
++++ gcc-4.0.2/gcc/config/i386/linux.h
+@@ -107,6 +107,11 @@
+ #define LINK_EMULATION "elf_i386"
+ #define DYNAMIC_LINKER "/lib/ld-linux.so.2"
+ 
++#ifdef USE_UCLIBC
++#undef DYNAMIC_LINKER
++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#endif
++
+ #undef  SUBTARGET_EXTRA_SPECS
+ #define SUBTARGET_EXTRA_SPECS \
+   { "link_emulation", LINK_EMULATION },\
+--- gcc-4.0.2/gcc/config/i386/linux64.h
++++ gcc-4.0.2/gcc/config/i386/linux64.h
+@@ -54,14 +54,21 @@
+    When the -shared link option is used a final link is not being
+    done.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+-      %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
++      %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \
++      %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \
+     %{static:-static}}"
+ 
+ #define MULTILIB_DEFAULTS { "m64" }
+--- gcc-4.0.2/gcc/config/ia64/linux.h
++++ gcc-4.0.2/gcc/config/ia64/linux.h
+@@ -37,13 +37,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ 
+--- gcc-4.0.2/gcc/config/m68k/linux.h
++++ gcc-4.0.2/gcc/config/m68k/linux.h
+@@ -127,12 +127,17 @@
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "-m m68kelf %{shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+     %{static}}"
+ 
+ /* For compatibility with linux/a.out */
+--- gcc-4.0.2/gcc/config/mips/linux.h
++++ gcc-4.0.2/gcc/config/mips/linux.h
+@@ -108,14 +108,19 @@
+ 
+ /* Borrowed from sparc/linux.h */
+ #undef LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #define LINK_SPEC \
+  "%(endian_spec) \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ #undef SUBTARGET_ASM_SPEC
+--- gcc-4.0.2/gcc/config/pa/pa-linux.h
++++ gcc-4.0.2/gcc/config/pa/pa-linux.h
+@@ -82,13 +82,18 @@
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ /* glibc's profiling functions don't need gcc to allocate counters.  */
+--- gcc-4.0.2/gcc/config/rs6000/linux.h
++++ gcc-4.0.2/gcc/config/rs6000/linux.h
+@@ -69,7 +69,11 @@
+ #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
+ 
+ #undef	LINK_OS_DEFAULT_SPEC
++#ifdef USE_UCLIBC
++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)"
++#else
+ #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
++#endif
+ 
+ #define LINK_GCC_C_SEQUENCE_SPEC \
+   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+--- gcc-4.0.2/gcc/config/rs6000/sysv4.h
++++ gcc-4.0.2/gcc/config/rs6000/sysv4.h
+@@ -949,6 +949,7 @@
+   mcall-linux  : %(link_os_linux)       ; \
+   mcall-gnu    : %(link_os_gnu)         ; \
+   mcall-netbsd : %(link_os_netbsd)      ; \
++  mcall-linux-uclibc : %(link_os_linux_uclibc); \
+   mcall-openbsd: %(link_os_openbsd)     ; \
+                : %(link_os_default)     }"
+ 
+@@ -1127,6 +1128,10 @@
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ 
++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++  %{rdynamic:-export-dynamic} \
++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}"
++
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+ # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+ #endif
+@@ -1293,6 +1298,7 @@
+   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
+   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
+   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\
+   { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
+   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
+   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
+--- gcc-4.0.2/gcc/config/s390/linux.h
++++ gcc-4.0.2/gcc/config/s390/linux.h
+@@ -77,6 +77,13 @@
+ #define MULTILIB_DEFAULTS { "m31" }
+ #endif
+ 
++#ifdef USE_UCLIBC
++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC \
+   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
+@@ -86,8 +93,8 @@
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+ 	%{!dynamic-linker: \
+-          %{m31:-dynamic-linker /lib/ld.so.1} \
+-          %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
++          %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \
++          %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}"
+ 
+ 
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc-4.0.2/gcc/config/sh/linux.h
++++ gcc-4.0.2/gcc/config/sh/linux.h
+@@ -67,11 +67,16 @@
+ #undef SUBTARGET_LINK_EMUL_SUFFIX
+ #define SUBTARGET_LINK_EMUL_SUFFIX "_linux"
+ #undef SUBTARGET_LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #define SUBTARGET_LINK_SPEC \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+-     %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++     %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+    %{static:-static}"
+ 
+ #undef LIB_SPEC
+--- gcc-4.0.2/gcc/config/sparc/linux.h
++++ gcc-4.0.2/gcc/config/sparc/linux.h
+@@ -130,14 +130,19 @@
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!mno-relax:%{!r:-relax}} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ /* The sun bundled assembler doesn't accept -Yd, (and neither does gas).
+--- gcc-4.0.2/gcc/config/sparc/linux64.h
++++ gcc-4.0.2/gcc/config/sparc/linux64.h
+@@ -167,12 +166,17 @@
+   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },	  \
+   { "link_arch",	 LINK_ARCH_SPEC },
+     
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER  "/lib/ld-linux.so.2"
++#endif
+ #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}} \
+ "
+ 
+--- gcc-4.0.2/libtool.m4
++++ gcc-4.0.2/libtool.m4
+@@ -682,6 +682,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+--- gcc-4.0.2/ltconfig
++++ gcc-4.0.2/ltconfig
+@@ -603,6 +603,7 @@
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1274,6 +1275,23 @@
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gcc-4.0.2/libffi/configure
++++ gcc-4.0.2/libffi/configure
+@@ -3457,6 +3457,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libgfortran/configure
++++ gcc-4.0.2/libgfortran/configure
+@@ -3681,6 +3681,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libjava/configure
++++ gcc-4.0.2/libjava/configure
+@@ -4351,6 +4351,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libmudflap/configure
++++ gcc-4.0.2/libmudflap/configure
+@@ -5380,6 +5380,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/libobjc/configure
++++ gcc-4.0.2/libobjc/configure
+@@ -3283,6 +3283,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/boehm-gc/configure
++++ gcc-4.0.2/boehm-gc/configure
+@@ -4320,6 +4320,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.0.2/configure
++++ gcc-4.0.2/configure
+@@ -1141,7 +1141,7 @@
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.0.2/configure.in
++++ gcc-4.0.2/configure.in
+@@ -350,7 +350,7 @@
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.0.2/contrib/regression/objs-gcc.sh
++++ gcc-4.0.2/contrib/regression/objs-gcc.sh
+@@ -105,6 +105,10 @@
+  then
+   make all-gdb all-dejagnu all-ld || exit 1
+   make install-gdb install-dejagnu install-ld || exit 1
++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
++ then
++  make all-gdb all-dejagnu all-ld || exit 1
++  make install-gdb install-dejagnu install-ld || exit 1
+ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+   make bootstrap || exit 1
+   make install || exit 1
+--- gcc-4.0.2/zlib/configure
++++ gcc-4.0.2/zlib/configure
+@@ -3426,6 +3426,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
diff --git a/patches/gcc/4.0.4/200-uclibc-locale.patch b/patches/gcc/4.0.4/200-uclibc-locale.patch
new file mode 100644
index 00000000..ac4cf972
--- /dev/null
+++ b/patches/gcc/4.0.4/200-uclibc-locale.patch
@@ -0,0 +1,3237 @@
+diff -urN gcc-4.0.0-100/libstdc++-v3/acinclude.m4 gcc-4.0.0/libstdc++-v3/acinclude.m4
+--- gcc-4.0.0-100/libstdc++-v3/acinclude.m4	2005-04-30 13:06:53.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/acinclude.m4	2005-04-28 20:19:01.000000000 -0500
+@@ -1104,7 +1104,7 @@
+   AC_MSG_CHECKING([for C locale to use])
+   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+     [use MODEL for target locale package],
+-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
+   
+   # If they didn't use this option switch, or if they specified --enable
+   # with no specific model, we'll have to look for one.  If they
+@@ -1120,6 +1120,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      *-uclibc*)
++        enable_clocale_flag=uclibc
++        ;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1263,6 +1266,40 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,59 @@
++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
++
++// Copyright (C) 2002, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++// Written by Jakub Jelinek <jakub@redhat.com>
++
++#include <clocale>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning clean this up
++#endif
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++                                                  
++extern "C" __typeof(iswctype_l) __iswctype_l;
++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
++extern "C" __typeof(strcoll_l) __strcoll_l;
++extern "C" __typeof(strftime_l) __strftime_l;
++extern "C" __typeof(strtod_l) __strtod_l;
++extern "C" __typeof(strtof_l) __strtof_l;
++extern "C" __typeof(strtold_l) __strtold_l;
++extern "C" __typeof(strxfrm_l) __strxfrm_l;
++extern "C" __typeof(towlower_l) __towlower_l;
++extern "C" __typeof(towupper_l) __towupper_l;
++extern "C" __typeof(wcscoll_l) __wcscoll_l;
++extern "C" __typeof(wcsftime_l) __wcsftime_l;
++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
++extern "C" __typeof(wctype_l) __wctype_l;
++extern "C" __typeof(newlocale) __newlocale;
++extern "C" __typeof(freelocale) __freelocale;
++extern "C" __typeof(duplocale) __duplocale;
++extern "C" __typeof(uselocale) __uselocale;
++
++#endif // GLIBC 2.3 and later
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,160 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno>  // For errno
++#include <locale>
++#include <stdexcept>
++#include <langinfo.h>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
++#define __strtof_l(S, E, L)         strtof((S), (E))
++#define __strtod_l(S, E, L)         strtod((S), (E))
++#define __strtold_l(S, E, L)        strtold((S), (E))
++#warning should dummy __newlocale check for C|POSIX ?
++#define __newlocale(a, b, c)        NULL
++#define __freelocale(a)             ((void)0)
++#define __duplocale(a)              __c_locale()
++#endif
++
++namespace std 
++{
++  template<>
++    void
++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  float __f = __strtof_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __f;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  double __d = __strtod_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __d;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
++		   const __c_locale& __cloc)
++    {
++      if (!(__err & ios_base::failbit))
++	{
++	  char* __sanity;
++	  errno = 0;
++	  long double __ld = __strtold_l(__s, &__sanity, __cloc);
++          if (__sanity != __s && errno != ERANGE)
++	    __v = __ld;
++	  else
++	    __err |= ios_base::failbit;
++	}
++    }
++
++  void
++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
++				    __c_locale __old)
++  {
++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    if (!__cloc)
++      {
++	// This named locale is not supported by the underlying OS.
++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++			      "name not valid"));
++      }
++#endif
++  }
++  
++  void
++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++  {
++    if (_S_get_c_locale() != __cloc)
++      __freelocale(__cloc); 
++  }
++
++  __c_locale
++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
++  { return __duplocale(__cloc); }
++} // namespace std
++
++namespace __gnu_cxx
++{
++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++    {
++      "LC_CTYPE", 
++      "LC_NUMERIC",
++      "LC_TIME", 
++      "LC_COLLATE", 
++      "LC_MONETARY",
++      "LC_MESSAGES", 
++#if _GLIBCXX_NUM_CATEGORIES != 0
++      "LC_PAPER", 
++      "LC_NAME", 
++      "LC_ADDRESS",
++      "LC_TELEPHONE", 
++      "LC_MEASUREMENT", 
++      "LC_IDENTIFICATION" 
++#endif
++    };
++}
++
++namespace std
++{
++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++}  // namespace std
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,115 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifndef _C_LOCALE_H
++#define _C_LOCALE_H 1
++
++#pragma GCC system_header
++
++#include <cstring>              // get std::strlen
++#include <cstdio>               // get std::snprintf or std::sprintf
++#include <clocale>
++#include <langinfo.h>		// For codecvt
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC_HAS_LOCALE__
++#include <iconv.h>		// For codecvt using iconv, iconv_t
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++#include <libintl.h> 		// For messages
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning what is _GLIBCXX_C_LOCALE_GNU for
++#endif
++#define _GLIBCXX_C_LOCALE_GNU 1
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix categories
++#endif
++// #define _GLIBCXX_NUM_CATEGORIES 6
++#define _GLIBCXX_NUM_CATEGORIES 0
++ 
++#ifdef __UCLIBC_HAS_XLOCALE__
++namespace __gnu_cxx
++{
++  extern "C" __typeof(uselocale) __uselocale;
++}
++#endif
++
++namespace std
++{
++#ifdef __UCLIBC_HAS_XLOCALE__
++  typedef __locale_t		__c_locale;
++#else
++  typedef int*			__c_locale;
++#endif
++
++  // Convert numeric value of type _Tv to string and return length of
++  // string.  If snprintf is available use it, otherwise fall back to
++  // the unsafe sprintf which, in general, can be dangerous and should
++  // be avoided.
++  template<typename _Tv>
++    int
++    __convert_from_v(char* __out, const int __size, const char* __fmt,
++#ifdef __UCLIBC_HAS_XLOCALE__
++		     _Tv __v, const __c_locale& __cloc, int __prec)
++    {
++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
++#else
++		     _Tv __v, const __c_locale&, int __prec)
++    {
++# ifdef __UCLIBC_HAS_LOCALE__
++      char* __old = std::setlocale(LC_ALL, NULL);
++      char* __sav = new char[std::strlen(__old) + 1];
++      std::strcpy(__sav, __old);
++      std::setlocale(LC_ALL, "C");
++# endif
++#endif
++
++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __gnu_cxx::__uselocale(__old);
++#elif defined __UCLIBC_HAS_LOCALE__
++      std::setlocale(LC_ALL, __sav);
++      delete [] __sav;
++#endif
++      return __ret;
++    }
++}
++
++#endif
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,306 @@
++// std::codecvt implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++namespace std
++{
++  // Specializations.
++#ifdef _GLIBCXX_USE_WCHAR_T
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_out(state_type& __state, const intern_type* __from, 
++	 const intern_type* __from_end, const intern_type*& __from_next,
++	 extern_type* __to, extern_type* __to_end,
++	 extern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
++    // in case we fall back to wcrtomb and then continue, in a loop.
++    // NB: wcsnrtombs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
++						      __from_end - __from_next);
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
++					 __from_chunk_end - __from_next,
++					 __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // wcrtomb.
++	    for (; __from < __from_next; ++__from)
++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
++	    __state = __tmp_state;
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    extern_type __buf[MB_LEN_MAX];
++	    __tmp_state = __state;
++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
++	      __ret = partial;
++	    else
++	      {
++		memcpy(__to_next, __buf, __conv);
++		__state = __tmp_state;
++		__to_next += __conv;
++		++__from_next;
++	      }
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++  
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_in(state_type& __state, const extern_type* __from, 
++	const extern_type* __from_end, const extern_type*& __from_next,
++	intern_type* __to, intern_type* __to_end,
++	intern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we store a L'\0' and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
++								  __from_end
++								  - __from_next));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
++				   __from_chunk_end - __from_next,
++				   __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (;; ++__to_next, __from += __conv)
++	      {
++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __from_next = __from;
++	    __state = __tmp_state;	    
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    // It is unclear what to return in this case (see DR 382). 
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    if (__to_next < __to_end)
++	      {
++		// XXX Probably wrong for stateful encodings
++		__tmp_state = __state;		
++		++__from_next;
++		*__to_next++ = L'\0';
++	      }
++	    else
++	      __ret = partial;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_encoding() const throw()
++  {
++    // XXX This implementation assumes that the encoding is
++    // stateless and is either single-byte or variable-width.
++    int __ret = 0;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    if (MB_CUR_MAX == 1)
++      __ret = 1;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }  
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_max_length() const throw()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    // XXX Probably wrong for stateful encodings.
++    int __ret = MB_CUR_MAX;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }
++  
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_length(state_type& __state, const extern_type* __from,
++	    const extern_type* __end, size_t __max) const
++  {
++    int __ret = 0;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we advance past it and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++  
++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
++    // its fourth parameter (it wouldn't with NULL as first parameter).
++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
++							   * __max));
++    while (__from < __end && __max)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
++								  __end
++								  - __from));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __end;
++
++	const extern_type* __tmp_from = __from;
++	size_t __conv = mbsnrtowcs(__to, &__from,
++				   __from_chunk_end - __from,
++				   __max, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (__from = __tmp_from;; __from += __conv)
++	      {
++		__conv = mbrtowc(NULL, __from, __end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __state = __tmp_state;
++	    __ret += __from - __tmp_from;
++	    break;
++	  }
++	if (!__from)
++	  __from = __from_chunk_end;
++	
++	__ret += __from - __tmp_from;
++	__max -= __conv;
++
++	if (__from < __end && __max)
++	  {
++	    // XXX Probably wrong for stateful encodings
++	    __tmp_state = __state;
++	    ++__from;
++	    ++__ret;
++	    --__max;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,80 @@
++// std::collate implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
++#endif
++
++namespace std
++{
++  // These are basically extensions to char_traits, and perhaps should
++  // be put there instead of here.
++  template<>
++    int 
++    collate<char>::_M_compare(const char* __one, const char* __two) const
++    { 
++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<char>::_M_transform(char* __to, const char* __from, 
++				size_t __n) const 
++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    int 
++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
++				 const wchar_t* __two) const
++    {
++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
++				   size_t __n) const
++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,300 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __wctype_l(S, L)           wctype((S))
++#define __towupper_l(C, L)         towupper((C))
++#define __towlower_l(C, L)         towlower((C))
++#define __iswctype_l(C, M, L)      iswctype((C), (M))
++#endif
++
++namespace std
++{
++  // NB: The other ctype<char> specializations are in src/locale.cc and
++  // various /config/os/* files.
++  template<>
++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++    : ctype<char>(0, false, __refs) 
++    { 		
++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	{
++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
++#endif
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T  
++  ctype<wchar_t>::__wmask_type
++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
++  {
++    __wmask_type __ret;
++    switch (__m)
++      {
++      case space:
++	__ret = __wctype_l("space", _M_c_locale_ctype);
++	break;
++      case print:
++	__ret = __wctype_l("print", _M_c_locale_ctype);
++	break;
++      case cntrl:
++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
++	break;
++      case upper:
++	__ret = __wctype_l("upper", _M_c_locale_ctype);
++	break;
++      case lower:
++	__ret = __wctype_l("lower", _M_c_locale_ctype);
++	break;
++      case alpha:
++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
++	break;
++      case digit:
++	__ret = __wctype_l("digit", _M_c_locale_ctype);
++	break;
++      case punct:
++	__ret = __wctype_l("punct", _M_c_locale_ctype);
++	break;
++      case xdigit:
++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
++	break;
++      case alnum:
++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
++	break;
++      case graph:
++	__ret = __wctype_l("graph", _M_c_locale_ctype);
++	break;
++      default:
++	__ret = __wmask_type();
++      }
++    return __ret;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_toupper(wchar_t __c) const
++  { return __towupper_l(__c, _M_c_locale_ctype); }
++
++  const wchar_t*
++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_tolower(wchar_t __c) const
++  { return __towlower_l(__c, _M_c_locale_ctype); }
++  
++  const wchar_t*
++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++
++  bool
++  ctype<wchar_t>::
++  do_is(mask __m, wchar_t __c) const
++  { 
++    // Highest bitmask in ctype_base == 10, but extra in "C"
++    // library for blank.
++    bool __ret = false;
++    const size_t __bitmasksize = 11; 
++    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++      if (__m & _M_bit[__bitcur]
++	  && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
++	{
++	  __ret = true;
++	  break;
++	}
++    return __ret;    
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++  {
++    for (; __lo < __hi; ++__vec, ++__lo)
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11; 
++	mask __m = 0;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
++	    __m |= _M_bit[__bitcur];
++	*__vec = __m;
++      }
++    return __hi;
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi && !this->do_is(__m, *__lo))
++      ++__lo;
++    return __lo;
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++  {
++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
++      ++__lo;
++    return __lo;
++  }
++
++  wchar_t
++  ctype<wchar_t>::
++  do_widen(char __c) const
++  { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<wchar_t>::
++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++  {
++    while (__lo < __hi)
++      {
++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++	++__lo;
++	++__dest;
++      }
++    return __hi;
++  }
++
++  char
++  ctype<wchar_t>::
++  do_narrow(wchar_t __wc, char __dfault) const
++  {
++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++      return _M_narrow[__wc];
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    const int __c = wctob(__wc);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
++	    char* __dest) const
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    if (_M_narrow_ok)
++      while (__lo < __hi)
++	{
++	  if (*__lo >= 0 && *__lo < 128)
++	    *__dest = _M_narrow[*__lo];
++	  else
++	    {
++	      const int __c = wctob(*__lo);
++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	    }
++	  ++__lo;
++	  ++__dest;
++	}
++    else
++      while (__lo < __hi)
++	{
++	  const int __c = wctob(*__lo);
++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	  ++__lo;
++	  ++__dest;
++	}
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __hi;
++  }
++
++  void
++  ctype<wchar_t>::_M_initialize_ctype()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    wint_t __i;
++    for (__i = 0; __i < 128; ++__i)
++      {
++	const int __c = wctob(__i);
++	if (__c == EOF)
++	  break;
++	else
++	  _M_narrow[__i] = static_cast<char>(__c);
++      }
++    if (__i == 128)
++      _M_narrow_ok = true;
++    else
++      _M_narrow_ok = false;
++    for (size_t __j = 0;
++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
++      _M_widen[__j] = btowc(__j);
++
++    for (size_t __k = 0; __k <= 11; ++__k)
++      { 
++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
++      }
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++  }
++#endif //  _GLIBCXX_USE_WCHAR_T
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,100 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix gettext stuff
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__dcgettext(const char *domainname,
++			     const char *msgid, int category);
++#undef gettext
++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
++#else
++#undef gettext
++#define gettext(msgid) (msgid)
++#endif
++
++namespace std
++{
++  // Specializations.
++  template<>
++    string
++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
++      __uselocale(__old);
++      return string(__msg);
++#elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      const char* __msg = gettext(__dfault.c_str());
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return string(__msg);
++#else
++      const char* __msg = gettext(__dfault.c_str());
++      return string(__msg);
++#endif
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    wstring
++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
++    {
++# ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      __uselocale(__old);
++      return _M_convert_from_char(__msg);
++# elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return _M_convert_from_char(__msg);
++# else
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      return _M_convert_from_char(__msg);
++# endif
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,118 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix prototypes for *textdomain funcs
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__textdomain(const char *domainname);
++extern "C" char *__bindtextdomain(const char *domainname,
++				  const char *dirname);
++#else
++#undef __textdomain
++#undef __bindtextdomain
++#define __textdomain(D)           ((void)0)
++#define __bindtextdomain(D,P)     ((void)0)
++#endif
++
++  // Non-virtual member functions.
++  template<typename _CharT>
++     messages<_CharT>::messages(size_t __refs)
++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
++     _M_name_messages(_S_get_c_name())
++     { }
++
++  template<typename _CharT>
++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
++				size_t __refs) 
++     : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)),
++     _M_name_messages(__s)
++     {
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       _M_name_messages = __tmp;
++     }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
++			   const char* __dir) const
++    { 
++      __bindtextdomain(__s.c_str(), __dir);
++      return this->do_open(__s, __loc); 
++    }
++
++  // Virtual member functions.
++  template<typename _CharT>
++    messages<_CharT>::~messages()
++    { 
++      if (_M_name_messages != _S_get_c_name())
++	delete [] _M_name_messages;
++      _S_destroy_c_locale(_M_c_locale_messages); 
++    }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::do_open(const basic_string<char>& __s, 
++			      const locale&) const
++    { 
++      // No error checking is done, assume the catalog exists and can
++      // be used.
++      __textdomain(__s.c_str());
++      return 0;
++    }
++
++  template<typename _CharT>
++    void    
++    messages<_CharT>::do_close(catalog) const 
++    { }
++
++   // messages_byname
++   template<typename _CharT>
++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
++     : messages<_CharT>(__refs) 
++     { 
++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
++	 delete [] this->_M_name_messages;
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       this->_M_name_messages = __tmp;
++
++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	 {
++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
++	 }
++     }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2005-04-28 01:23:02.000000000 -0500
+@@ -0,0 +1,692 @@
++// std::moneypunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning optimize this for uclibc
++#warning tailor for stub locale support
++#endif
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  // Construct and return valid pattern consisting of some combination of:
++  // space none symbol sign value
++  money_base::pattern
++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
++  { 
++    pattern __ret;
++
++    // This insanely complicated routine attempts to construct a valid
++    // pattern for use with monyepunct. A couple of invariants:
++
++    // if (__precedes) symbol -> value
++    // else value -> symbol
++    
++    // if (__space) space
++    // else none
++
++    // none == never first
++    // space never first or last
++
++    // Any elegant implementations of this are welcome.
++    switch (__posn)
++      {
++      case 0:
++      case 1:
++	// 1 The sign precedes the value and symbol.
++	__ret.field[0] = sign;
++	if (__space)
++	  {
++	    // Pattern starts with sign.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[3] = symbol;
++	      }
++	    __ret.field[2] = space;
++	  }
++	else
++	  {
++	    // Pattern starts with sign and ends with none.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 2:
++	// 2 The sign follows the value and symbol.
++	if (__space)
++	  {
++	    // Pattern either ends with sign.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[1] = space;
++	    __ret.field[3] = sign;
++	  }
++	else
++	  {
++	    // Pattern ends with sign then none.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[1] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[1] = symbol;
++	      }
++	    __ret.field[2] = sign;
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 3:
++	// 3 The sign immediately precedes the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = sign;
++	    __ret.field[1] = symbol;	    
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;		
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = sign;
++		__ret.field[3] = symbol;
++	      }
++	    else
++	      {
++		__ret.field[1] = sign;
++		__ret.field[2] = symbol;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      case 4:
++	// 4 The sign immediately follows the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = symbol;
++	    __ret.field[1] = sign;
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = symbol;
++		__ret.field[3] = sign;
++	      }
++	    else
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = sign;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      default:
++	__ret = pattern();
++      }
++    return __ret;
++  }
++
++  template<> 
++    void
++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++						     const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == true
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    void
++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
++						      const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, false>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == false
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    moneypunct<char, true>::~moneypunct()
++    { delete _M_data; }
++
++  template<> 
++    moneypunct<char, false>::~moneypunct()
++    { delete _M_data; }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++#ifdef __UCLIBC_HAS_XLOCALE__
++							const char*)
++#else
++							const char* __name)
++#endif
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<wchar_t, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  try
++	    {
++	      mbstate_t __state;
++	      size_t __len = strlen(__cpossign);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++	      
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++	  catch (...)
++	    {
++	      delete _M_data;
++	      _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++	      __throw_exception_again;
++	    } 
++	  
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++  void
++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
++#ifdef __UCLIBC_HAS_XLOCALE__
++						       const char*)
++#else
++                                                       const char* __name)
++#endif
++  {
++    if (!_M_data)
++      _M_data = new __moneypunct_cache<wchar_t, false>;
++
++    if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++          _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++          union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  try
++            {
++              mbstate_t __state;
++              size_t __len;
++              __len = strlen(__cpossign);
++              if (__len)
++                {
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++          catch (...)
++	    {
++	      delete _M_data;
++              _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++              __throw_exception_again;
++	    }
++
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++	                                                __pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++	                                                __nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++    moneypunct<wchar_t, true>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++
++  template<> 
++    moneypunct<wchar_t, false>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2005-04-28 01:20:20.000000000 -0500
+@@ -0,0 +1,173 @@
++// std::numpunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<> 
++    void
++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
++							__cloc));
++
++	  // Check for NULL, which implies no grouping.
++	  if (_M_data->_M_thousands_sep == '\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = "true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = "false";
++      _M_data->_M_falsename_size = 5;
++    }
++ 
++  template<> 
++    numpunct<char>::~numpunct()
++    { delete _M_data; }
++   
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<wchar_t>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
++	}
++      else
++	{
++	  // Named locale.
++	  // NB: In the GNU model wchar_t is always 32 bit wide.
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# else
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++
++	  if (_M_data->_M_thousands_sep == L'\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = L"true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = L"false";
++      _M_data->_M_falsename_size = 5;
++    }
++
++  template<> 
++    numpunct<wchar_t>::~numpunct()
++    { delete _M_data; }
++ #endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc	2005-04-28 01:13:15.000000000 -0500
+@@ -0,0 +1,406 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<>
++    void
++    __timepunct<char>::
++    _M_put(char* __s, size_t __maxlen, const char* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = '\0';
++    }
++
++  template<> 
++    void
++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = "%m/%d/%y";
++	  _M_data->_M_date_era_format = "%m/%d/%y";
++	  _M_data->_M_time_format = "%H:%M:%S";
++	  _M_data->_M_time_era_format = "%H:%M:%S";
++	  _M_data->_M_date_time_format = "";
++	  _M_data->_M_date_time_era_format = "";
++	  _M_data->_M_am = "AM";
++	  _M_data->_M_pm = "PM";
++	  _M_data->_M_am_pm_format = "";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = "Sunday";
++	  _M_data->_M_day2 = "Monday";
++	  _M_data->_M_day3 = "Tuesday";
++	  _M_data->_M_day4 = "Wednesday";
++	  _M_data->_M_day5 = "Thursday";
++	  _M_data->_M_day6 = "Friday";
++	  _M_data->_M_day7 = "Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = "Sun";
++	  _M_data->_M_aday2 = "Mon";
++	  _M_data->_M_aday3 = "Tue";
++	  _M_data->_M_aday4 = "Wed";
++	  _M_data->_M_aday5 = "Thu";
++	  _M_data->_M_aday6 = "Fri";
++	  _M_data->_M_aday7 = "Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = "January";
++	  _M_data->_M_month02 = "February";
++	  _M_data->_M_month03 = "March";
++	  _M_data->_M_month04 = "April";
++	  _M_data->_M_month05 = "May";
++	  _M_data->_M_month06 = "June";
++	  _M_data->_M_month07 = "July";
++	  _M_data->_M_month08 = "August";
++	  _M_data->_M_month09 = "September";
++	  _M_data->_M_month10 = "October";
++	  _M_data->_M_month11 = "November";
++	  _M_data->_M_month12 = "December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = "Jan";
++	  _M_data->_M_amonth02 = "Feb";
++	  _M_data->_M_amonth03 = "Mar";
++	  _M_data->_M_amonth04 = "Apr";
++	  _M_data->_M_amonth05 = "May";
++	  _M_data->_M_amonth06 = "Jun";
++	  _M_data->_M_amonth07 = "Jul";
++	  _M_data->_M_amonth08 = "Aug";
++	  _M_data->_M_amonth09 = "Sep";
++	  _M_data->_M_amonth10 = "Oct";
++	  _M_data->_M_amonth11 = "Nov";
++	  _M_data->_M_amonth12 = "Dec";
++	}
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
++							     __cloc);
++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    void
++    __timepunct<wchar_t>::
++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = L'\0';
++    }
++
++  template<> 
++    void
++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<wchar_t>;
++
++#warning wide time stuff
++//       if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = L"%m/%d/%y";
++	  _M_data->_M_date_era_format = L"%m/%d/%y";
++	  _M_data->_M_time_format = L"%H:%M:%S";
++	  _M_data->_M_time_era_format = L"%H:%M:%S";
++	  _M_data->_M_date_time_format = L"";
++	  _M_data->_M_date_time_era_format = L"";
++	  _M_data->_M_am = L"AM";
++	  _M_data->_M_pm = L"PM";
++	  _M_data->_M_am_pm_format = L"";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = L"Sunday";
++	  _M_data->_M_day2 = L"Monday";
++	  _M_data->_M_day3 = L"Tuesday";
++	  _M_data->_M_day4 = L"Wednesday";
++	  _M_data->_M_day5 = L"Thursday";
++	  _M_data->_M_day6 = L"Friday";
++	  _M_data->_M_day7 = L"Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = L"Sun";
++	  _M_data->_M_aday2 = L"Mon";
++	  _M_data->_M_aday3 = L"Tue";
++	  _M_data->_M_aday4 = L"Wed";
++	  _M_data->_M_aday5 = L"Thu";
++	  _M_data->_M_aday6 = L"Fri";
++	  _M_data->_M_aday7 = L"Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = L"January";
++	  _M_data->_M_month02 = L"February";
++	  _M_data->_M_month03 = L"March";
++	  _M_data->_M_month04 = L"April";
++	  _M_data->_M_month05 = L"May";
++	  _M_data->_M_month06 = L"June";
++	  _M_data->_M_month07 = L"July";
++	  _M_data->_M_month08 = L"August";
++	  _M_data->_M_month09 = L"September";
++	  _M_data->_M_month10 = L"October";
++	  _M_data->_M_month11 = L"November";
++	  _M_data->_M_month12 = L"December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = L"Jan";
++	  _M_data->_M_amonth02 = L"Feb";
++	  _M_data->_M_amonth03 = L"Mar";
++	  _M_data->_M_amonth04 = L"Apr";
++	  _M_data->_M_amonth05 = L"May";
++	  _M_data->_M_amonth06 = L"Jun";
++	  _M_data->_M_amonth07 = L"Jul";
++	  _M_data->_M_amonth08 = L"Aug";
++	  _M_data->_M_amonth09 = L"Sep";
++	  _M_data->_M_amonth10 = L"Oct";
++	  _M_data->_M_amonth11 = L"Nov";
++	  _M_data->_M_amonth12 = L"Dec";
++	}
++#if 0
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  union { char *__s; wchar_t *__w; } __u;
++
++	  __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
++	  _M_data->_M_date_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
++	  _M_data->_M_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
++	  _M_data->_M_am = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
++	  _M_data->_M_pm = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
++	  _M_data->_M_am_pm_format = __u.__w;
++
++	  // Day names, starting with "C"'s Sunday.
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
++	  _M_data->_M_day1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
++	  _M_data->_M_day2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
++	  _M_data->_M_day3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
++	  _M_data->_M_day4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
++	  _M_data->_M_day5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
++	  _M_data->_M_day6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
++	  _M_data->_M_day7 = __u.__w;
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
++	  _M_data->_M_aday1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
++	  _M_data->_M_aday2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
++	  _M_data->_M_aday3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
++	  _M_data->_M_aday4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
++	  _M_data->_M_aday5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
++	  _M_data->_M_aday6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
++	  _M_data->_M_aday7 = __u.__w;
++
++	  // Month names, starting with "C"'s January.
++	  __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
++	  _M_data->_M_month01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
++	  _M_data->_M_month02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
++	  _M_data->_M_month03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
++	  _M_data->_M_month04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
++	  _M_data->_M_month05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
++	  _M_data->_M_month06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
++	  _M_data->_M_month07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
++	  _M_data->_M_month08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
++	  _M_data->_M_month09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
++	  _M_data->_M_month10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
++	  _M_data->_M_month11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
++	  _M_data->_M_month12 = __u.__w;
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
++	  _M_data->_M_amonth01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
++	  _M_data->_M_amonth02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
++	  _M_data->_M_amonth03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
++	  _M_data->_M_amonth04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
++	  _M_data->_M_amonth05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
++	  _M_data->_M_amonth06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
++	  _M_data->_M_amonth07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
++	  _M_data->_M_amonth08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
++	  _M_data->_M_amonth09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
++	  _M_data->_M_amonth10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
++	  _M_data->_M_amonth11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
++	  _M_data->_M_amonth12 = __u.__w;
++	}
++#endif // 0
++    }
++#endif
++}
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h
+--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h	2004-05-22 18:46:31.000000000 -0500
+@@ -0,0 +1,68 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
++				     size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++    _M_name_timepunct(__s)
++    { 
++      char* __tmp = new char[std::strlen(__s) + 1];
++      std::strcpy(__tmp, __s);
++      _M_name_timepunct = __tmp;
++      _M_initialize_timepunct(__cloc); 
++    }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::~__timepunct()
++    { 
++      if (_M_name_timepunct != _S_get_c_name())
++	delete [] _M_name_timepunct;
++      delete _M_data; 
++      _S_destroy_c_locale(_M_c_locale_timepunct); 
++    }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,64 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++/** @file ctype_base.h
++ *  This is an internal header file, included by other library headers.
++ *  You should not attempt to use it directly.
++ */
++
++// Information as gleaned from /usr/include/ctype.h
++  
++  /// @brief  Base class for ctype.
++  struct ctype_base
++  {
++    // Note: In uClibc, the following two types depend on configuration.
++ 
++    // Non-standard typedefs.
++    typedef const __ctype_touplow_t* __to_type;
++
++    // NB: Offsets into ctype<char>::_M_table force a particular size
++    // on the mask type. Because of this, we don't use an enum.
++    typedef __ctype_mask_t	mask;   
++    static const mask upper    	= _ISupper;
++    static const mask lower 	= _ISlower;
++    static const mask alpha 	= _ISalpha;
++    static const mask digit 	= _ISdigit;
++    static const mask xdigit 	= _ISxdigit;
++    static const mask space 	= _ISspace;
++    static const mask print 	= _ISprint;
++    static const mask graph 	= _ISalpha | _ISdigit | _ISpunct;
++    static const mask cntrl 	= _IScntrl;
++    static const mask punct 	= _ISpunct;
++    static const mask alnum 	= _ISalpha | _ISdigit;
++  };
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h	2002-06-24 00:49:19.000000000 -0500
+@@ -0,0 +1,69 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
++// functions go in ctype.cc
++  
++  bool
++  ctype<char>::
++  is(mask __m, char __c) const
++  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
++
++  const char*
++  ctype<char>::
++  is(const char* __low, const char* __high, mask* __vec) const
++  {
++    while (__low < __high)
++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
++    return __high;
++  }
++
++  const char*
++  ctype<char>::
++  scan_is(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
++      ++__low;
++    return __low;
++  }
++
++  const char*
++  ctype<char>::
++  scan_not(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
++      ++__low;
++    return __low;
++  }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,92 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++
++  const ctype_base::mask*
++  ctype<char>::classic_table() throw()
++  { return __C_ctype_b; }
++
++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
++		     size_t __refs) 
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  char
++  ctype<char>::do_toupper(char __c) const
++  { return _M_toupper[static_cast<unsigned char>(__c)]; }
++
++  const char*
++  ctype<char>::do_toupper(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_toupper[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
++
++  char
++  ctype<char>::do_tolower(char __c) const
++  { return _M_tolower[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<char>::do_tolower(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_tolower[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
+diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h
+--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h	1969-12-31 18:00:00.000000000 -0600
++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h	2005-04-28 01:10:27.000000000 -0500
+@@ -0,0 +1,44 @@
++// Specific definitions for GNU/Linux  -*- C++ -*-
++
++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here.  This
++// file will come before all others.
++
++// This keeps isanum, et al from being propagated as macros.
++#define __NO_CTYPE 1
++
++#include <features.h>
++
++// We must not see the optimized string functions GNU libc defines.
++#define __NO_STRING_INLINES
++
++#endif
+diff -urN gcc-4.0.0-100/libstdc++-v3/configure gcc-4.0.0/libstdc++-v3/configure
+--- gcc-4.0.0-100/libstdc++-v3/configure	2005-04-30 13:06:53.683055232 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 12:24:24.000000000 -0500
+@@ -3998,6 +3998,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5672,7 +5677,7 @@
+   enableval="$enable_clocale"
+ 
+       case "$enableval" in
+-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
+        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
+ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
+    { (exit 1); exit 1; }; } ;;
+@@ -5697,6 +5702,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      linux-uclibc*)
++	enable_clocale_flag=uclibc
++	;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+@@ -5927,6 +5935,76 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      echo "$as_me:$LINENO: result: uclibc" >&5
++echo "${ECHO_T}uclibc" >&6
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      # Extract the first word of "msgfmt", so it can be a program name with args.
++set dummy msgfmt; ac_word=$2
++echo "$as_me:$LINENO: checking for $ac_word" >&5
++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  if test -n "$check_msgfmt"; then
++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++    ac_cv_prog_check_msgfmt="yes"
++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++
++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
++fi
++fi
++check_msgfmt=$ac_cv_prog_check_msgfmt
++if test -n "$check_msgfmt"; then
++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
++echo "${ECHO_T}$check_msgfmt" >&6
++else
++  echo "$as_me:$LINENO: result: no" >&5
++echo "${ECHO_T}no" >&6
++fi
++
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++
++
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+diff -urN gcc-4.0.0-100/libstdc++-v3/configure.host gcc-4.0.0/libstdc++-v3/configure.host
+--- gcc-4.0.0-100/libstdc++-v3/configure.host	2005-04-30 13:06:53.688054472 -0500
++++ gcc-4.0.0/libstdc++-v3/configure.host	2005-04-28 20:20:32.000000000 -0500
+@@ -249,6 +249,12 @@
+     ;;
+ esac
+ 
++# Override for uClibc since linux-uclibc gets mishandled above.
++case "${host_os}" in
++  *-uclibc*)
++    os_include_dir="os/uclibc"
++    ;;
++esac
+ 
+ # Set any OS-dependent and CPU-dependent bits.
+ # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+diff -urN gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 gcc-4.0.0/libstdc++-v3/crossconfig.m4
+--- gcc-4.0.0-100/libstdc++-v3/crossconfig.m4	2005-04-30 13:06:53.689054320 -0500
++++ gcc-4.0.0/libstdc++-v3/crossconfig.m4	2005-04-28 20:27:15.000000000 -0500
+@@ -142,6 +142,98 @@
+ 	;;
+     esac
+     ;;
++  *-uclibc*)
++# Temporary hack until we implement the float versions of the libm funcs
++    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
++      machine/endian.h machine/param.h sys/machine.h sys/types.h \
++      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
++    SECTION_FLAGS='-ffunction-sections -fdata-sections'
++    AC_SUBST(SECTION_FLAGS)
++    GLIBCXX_CHECK_LINKER_FEATURES
++    GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
++    GLIBCXX_CHECK_WCHAR_T_SUPPORT
++
++    # For LFS.
++    AC_DEFINE(HAVE_INT64_T)
++    case "$target" in
++      *-uclinux*)
++        # Don't enable LFS with uClinux
++        ;;
++      *)
++        AC_DEFINE(_GLIBCXX_USE_LFS)
++    esac
++
++    # For showmanyc_helper().
++    AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
++    GLIBCXX_CHECK_POLL
++    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
++
++    # For xsputn_2().
++    AC_CHECK_HEADERS(sys/uio.h)
++    GLIBCXX_CHECK_WRITEV
++
++#     AC_DEFINE(HAVE_ACOSF)
++#     AC_DEFINE(HAVE_ASINF)
++#     AC_DEFINE(HAVE_ATANF)
++#     AC_DEFINE(HAVE_ATAN2F)
++    AC_DEFINE(HAVE_CEILF)
++    AC_DEFINE(HAVE_COPYSIGN)
++#     AC_DEFINE(HAVE_COPYSIGNF)
++#     AC_DEFINE(HAVE_COSF)
++#     AC_DEFINE(HAVE_COSHF)
++#     AC_DEFINE(HAVE_EXPF)
++#     AC_DEFINE(HAVE_FABSF)
++    AC_DEFINE(HAVE_FINITE)
++    AC_DEFINE(HAVE_FINITEF)
++    AC_DEFINE(HAVE_FLOORF)
++#     AC_DEFINE(HAVE_FMODF)
++#     AC_DEFINE(HAVE_FREXPF)
++    AC_DEFINE(HAVE_HYPOT)
++#     AC_DEFINE(HAVE_HYPOTF)
++    AC_DEFINE(HAVE_ISINF)
++    AC_DEFINE(HAVE_ISINFF)
++    AC_DEFINE(HAVE_ISNAN)
++    AC_DEFINE(HAVE_ISNANF)
++#     AC_DEFINE(HAVE_LOGF)
++#     AC_DEFINE(HAVE_LOG10F)
++#     AC_DEFINE(HAVE_MODFF)
++#     AC_DEFINE(HAVE_SINF)
++#     AC_DEFINE(HAVE_SINHF)
++#     AC_DEFINE(HAVE_SINCOS)
++#     AC_DEFINE(HAVE_SINCOSF)
++    AC_DEFINE(HAVE_SQRTF)
++#     AC_DEFINE(HAVE_TANF)
++#     AC_DEFINE(HAVE_TANHF)
++    if test x"long_double_math_on_this_cpu" = x"yes"; then
++#       AC_DEFINE(HAVE_ACOSL)
++#       AC_DEFINE(HAVE_ASINL)
++#       AC_DEFINE(HAVE_ATANL)
++#       AC_DEFINE(HAVE_ATAN2L)
++#       AC_DEFINE(HAVE_CEILL)
++#       AC_DEFINE(HAVE_COPYSIGNL)
++#       AC_DEFINE(HAVE_COSL)
++#       AC_DEFINE(HAVE_COSHL)
++#       AC_DEFINE(HAVE_EXPL)
++#       AC_DEFINE(HAVE_FABSL)
++#       AC_DEFINE(HAVE_FINITEL)
++#       AC_DEFINE(HAVE_FLOORL)
++#       AC_DEFINE(HAVE_FMODL)
++#       AC_DEFINE(HAVE_FREXPL)
++#       AC_DEFINE(HAVE_HYPOTL)
++#       AC_DEFINE(HAVE_ISINFL)
++#       AC_DEFINE(HAVE_ISNANL)
++#       AC_DEFINE(HAVE_LOGL)
++#       AC_DEFINE(HAVE_LOG10L)
++#       AC_DEFINE(HAVE_MODFL)
++#       AC_DEFINE(HAVE_POWL)
++#       AC_DEFINE(HAVE_SINL)
++#       AC_DEFINE(HAVE_SINHL)
++#       AC_DEFINE(HAVE_SINCOSL)
++#       AC_DEFINE(HAVE_SQRTL)
++#       AC_DEFINE(HAVE_TANL)
++#       AC_DEFINE(HAVE_TANHL)
++    fi
++    ;;
+   *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu)
+     AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+       machine/endian.h machine/param.h sys/machine.h sys/types.h \
+@@ -156,7 +248,7 @@
+     AC_DEFINE(HAVE_INT64_T)
+     case "$target" in
+       *-uclinux*)
+-        # Don't enable LFS with uClibc
++        # Don't enable LFS with uClinux
+         ;;
+       *)
+         AC_DEFINE(_GLIBCXX_USE_LFS)
+diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h
+--- gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h	2005-04-30 13:06:53.690054168 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h	2005-04-28 20:15:56.000000000 -0500
+@@ -101,7 +101,9 @@
+ using std::wmemcpy;
+ using std::wmemmove;
+ using std::wmemset;
++#if _GLIBCXX_HAVE_WCSFTIME
+ using std::wcsftime;
++#endif
+ 
+ #if _GLIBCXX_USE_C99
+ using std::wcstold;
+diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h
+--- gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h	2005-04-30 13:06:53.691054016 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h	2005-04-28 20:15:56.000000000 -0500
+@@ -179,7 +179,9 @@
+   using ::wcscoll;
+   using ::wcscpy;
+   using ::wcscspn;
++#if _GLIBCXX_HAVE_WCSFTIME
+   using ::wcsftime;
++#endif
+   using ::wcslen;
+   using ::wcsncat;
+   using ::wcsncmp;
diff --git a/patches/gcc/4.0.4/300-libstdc++-pic.patch b/patches/gcc/4.0.4/300-libstdc++-pic.patch
new file mode 100644
index 00000000..a9d6e718
--- /dev/null
+++ b/patches/gcc/4.0.4/300-libstdc++-pic.patch
@@ -0,0 +1,45 @@
+--- gcc-4.0.0/libstdc++-v3/src/Makefile.am
++++ gcc-4.0.0/libstdc++-v3/src/Makefile.am
+@@ -214,6 +214,10 @@
+ 	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@
+ 
+ 
++install-exec-local:
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++
+ # Added bits to build debug library.
+ if GLIBCXX_BUILD_DEBUG
+ all-local: build_debug
+--- gcc-4.0.0/libstdc++-v3/src/Makefile.in
++++ gcc-4.0.0/libstdc++-v3/src/Makefile.in
+@@ -625,7 +625,7 @@
+ 
+ install-data-am: install-data-local
+ 
+-install-exec-am: install-toolexeclibLTLIBRARIES
++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local
+ 
+ install-info: install-info-am
+ 
+@@ -664,7 +664,7 @@
+ 	maintainer-clean-generic mostlyclean mostlyclean-compile \
+ 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ 	tags uninstall uninstall-am uninstall-info-am \
+-	uninstall-toolexeclibLTLIBRARIES
++	uninstall-toolexeclibLTLIBRARIES install-exec-local
+ 
+ @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@libstdc++-symbol.ver:  ${glibcxx_srcdir}/$(SYMVER_MAP)
+ @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@	cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver
+@@ -743,6 +743,11 @@
+ install_debug:
+ 	(cd ${debugdir} && $(MAKE) \
+ 	toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install)
++
++install-exec-local:
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
diff --git a/patches/gcc/4.0.4/301-missing-execinfo_h.patch b/patches/gcc/4.0.4/301-missing-execinfo_h.patch
new file mode 100644
index 00000000..0e2092f3
--- /dev/null
+++ b/patches/gcc/4.0.4/301-missing-execinfo_h.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/boehm-gc/include/gc.h-orig	2005-04-28 22:28:57.000000000 -0500
++++ gcc-4.0.0/boehm-gc/include/gc.h	2005-04-28 22:30:38.000000000 -0500
+@@ -500,7 +500,7 @@
+ #ifdef __linux__
+ # include <features.h>
+ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+-     && !defined(__ia64__)
++     && !defined(__ia64__) && !defined(__UCLIBC__)
+ #   ifndef GC_HAVE_BUILTIN_BACKTRACE
+ #     define GC_HAVE_BUILTIN_BACKTRACE
+ #   endif
diff --git a/patches/gcc/4.0.4/302-c99-snprintf.patch b/patches/gcc/4.0.4/302-c99-snprintf.patch
new file mode 100644
index 00000000..dfb22d68
--- /dev/null
+++ b/patches/gcc/4.0.4/302-c99-snprintf.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig	2005-04-29 00:08:41.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h	2005-04-29 00:08:45.000000000 -0500
+@@ -142,7 +142,7 @@
+   using ::vsprintf;
+ }
+ 
+-#if _GLIBCXX_USE_C99
++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__)
+ 
+ #undef snprintf
+ #undef vfscanf
diff --git a/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch b/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch
new file mode 100644
index 00000000..2ccc80d9
--- /dev/null
+++ b/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch
@@ -0,0 +1,12 @@
+--- gcc-4.0.0/libstdc++-v3/configure-old	2005-04-30 22:04:48.061603912 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 22:06:13.678588152 -0500
+@@ -7194,6 +7194,9 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ #include <complex.h>
++#ifdef __UCLIBC__
++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs
++#endif
+ int
+ main ()
+ {
diff --git a/patches/gcc/4.0.4/304-index_macro.patch b/patches/gcc/4.0.4/304-index_macro.patch
new file mode 100644
index 00000000..1fac112f
--- /dev/null
+++ b/patches/gcc/4.0.4/304-index_macro.patch
@@ -0,0 +1,24 @@
+--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps	2006-03-24 01:49:51 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/rope	2006-03-24 01:49:37 +0100
+@@ -59,6 +59,9 @@
+ #include <bits/allocator.h>
+ #include <ext/hash_fun.h>
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ # ifdef __GC
+ #   define __GC_CONST const
+ # else
+--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps	2006-03-24 01:50:04 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h	2006-03-24 01:50:28 +0100
+@@ -53,6 +53,9 @@
+ #include <ext/memory> // For uninitialized_copy_n
+ #include <ext/numeric> // For power
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ namespace __gnu_cxx
+ {
+   using std::size_t;
diff --git a/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch b/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch
new file mode 100644
index 00000000..c7676ae6
--- /dev/null
+++ b/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch
@@ -0,0 +1,22 @@
+diff -urN gcc-4.0.0-100/libstdc++-v3/fragment.am gcc-4.0.0/libstdc++-v3/fragment.am
+--- gcc-4.0.0-100/libstdc++-v3/fragment.am	2004-10-25 15:32:40.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/fragment.am	2005-04-28 21:48:43.000000000 -0500
+@@ -18,5 +18,5 @@
+ 	$(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once
+ 
+ # -I/-D flags to pass when compiling.
+-AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+diff -urN gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am gcc-4.0.0/libstdc++-v3/libmath/Makefile.am
+--- gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am	2003-08-27 16:29:42.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/libmath/Makefile.am	2005-04-28 21:48:43.000000000 -0500
+@@ -32,7 +32,7 @@
+ 
+ libmath_la_SOURCES = stubs.c
+ 
+-AM_CPPFLAGS = $(CANADIAN_INCLUDES)
++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include
+ 
+ # Only compiling "C" sources in this directory.
+ LIBTOOL = @LIBTOOL@ --tag CC
diff --git a/patches/gcc/4.0.4/800-arm-bigendian.patch b/patches/gcc/4.0.4/800-arm-bigendian.patch
new file mode 100644
index 00000000..fd2c9bfc
--- /dev/null
+++ b/patches/gcc/4.0.4/800-arm-bigendian.patch
@@ -0,0 +1,65 @@
+diff -dur gcc-4.0.4.orig/gcc/config/arm/linux-elf.h gcc-4.0.4/gcc/config/arm/linux-elf.h
+--- gcc-4.0.4.orig/gcc/config/arm/linux-elf.h	2007-02-02 19:24:50.000000000 +0100
++++ gcc-4.0.4/gcc/config/arm/linux-elf.h	2007-02-02 19:26:12.000000000 +0100
+@@ -31,19 +31,33 @@
+ /* Do not assume anything about header files.  */
+ #define NO_IMPLICIT_EXTERN_C
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ #undef  TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (0)
++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" }
+ 
+ /* The GNU C++ standard library requires that these macros be defined.  */
+ #undef CPLUSPLUS_CPP_SPEC
+@@ -95,7 +109,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #define TARGET_OS_CPP_BUILTINS()		\
+Only in gcc-4.0.4/gcc/config/arm: linux-elf.h.orig
+diff -dur gcc-4.0.4.orig/gcc/config.gcc gcc-4.0.4/gcc/config.gcc
+--- gcc-4.0.4.orig/gcc/config.gcc	2007-02-02 19:24:50.000000000 +0100
++++ gcc-4.0.4/gcc/config.gcc	2007-02-02 19:26:12.000000000 +0100
+@@ -672,6 +672,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h  arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h"
++	case $target in
++	arm*b-*)
++		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
++		;;
++	esac
+ 	tmake_file="${tmake_file} arm/t-arm arm/t-linux"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
diff --git a/patches/gcc/4.0.4/801-arm-softfloat.patch b/patches/gcc/4.0.4/801-arm-softfloat.patch
new file mode 100644
index 00000000..9ae921e3
--- /dev/null
+++ b/patches/gcc/4.0.4/801-arm-softfloat.patch
@@ -0,0 +1,14 @@
+Enable building a pure soft-float compiler without the need for libfloat.
+
+diff -dur gcc-4.0.4.orig/gcc/config.gcc gcc-4.0.4/gcc/config.gcc
+--- gcc-4.0.4.orig/gcc/config.gcc	2007-02-02 19:12:28.000000000 +0100
++++ gcc-4.0.4/gcc/config.gcc	2007-02-02 19:12:07.000000000 +0100
+@@ -677,7 +677,7 @@
+ 		tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines"
+ 		;;
+ 	esac
+-	tmake_file="${tmake_file} arm/t-arm arm/t-linux"
++	tmake_file="${tmake_file} arm/t-arm arm/t-linux arm/t-arm-elf"
+ 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+ 	gnu_ld=yes
+ 	;;
diff --git a/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch b/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch
new file mode 100644
index 00000000..39287056
--- /dev/null
+++ b/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch
@@ -0,0 +1,71 @@
+See http://gcc.gnu.org/PR22541
+
+From: Dan Kegel
+
+When building gcc-3.4.3 or gcc-4.x into a clean $PREFIX,
+the configure script happily copies the glibc include files from include to sys-include;
+here's the line from the log file (with $PREFIX instead of the real prefix):
+
+Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include
+
+But later, when running fixincludes, it gives the error message
+ The directory that should contain system headers does not exist:
+  $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include
+
+Nevertheless, it continues building; the header files it installs in
+ $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include
+do not include the boilerplate that would cause it to #include_next the
+glibc headers in the system header directory.
+Thus the resulting toolchain can't compile the following program:
+#include <limits.h>
+int x = PATH_MAX;
+because its limits.h doesn't include the glibc header.
+
+The problem is that gcc/Makefile.in assumes that
+it can refer to $PREFIX/i686-unknown-linux-gnu  with the path
+                $PREFIX/lib/../i686-unknown-linux-gnu, but
+that fails because the directory $PREFIX/lib doesn't exist during 'make all';
+it is only created later, during 'make install'.  (Which makes this problem
+confusing, since one only notices the breakage well after 'make install',
+at which point the path configure complained about does exist, and has the
+right stuff in it.)
+
+A fix that I've been using for a while is to use sed to canonicalize
+the path.  The sed syntax is a bit obtuse, but it works. 
+
+(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq
+for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.)
+
+[rediffed against gcc-4.1-20060210]
+
+--- gcc-4.1-20060210/gcc/Makefile.in.old	2006-01-11 06:29:29.000000000 -0800
++++ gcc-4.1-20060210/gcc/Makefile.in	2006-02-14 16:08:54.000000000 -0800
+@@ -388,7 +388,10 @@
+ CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@
+ 
+ # autoconf sets SYSTEM_HEADER_DIR to one of the above.
+-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@
++# Purge it of unneccessary internal relative paths
++# to directories that might not exist yet.
++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta.
++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`
+ 
+ # Control whether to run fixproto and fixincludes.
+ STMP_FIXPROTO = @STMP_FIXPROTO@
+@@ -3167,13 +3170,15 @@
+ ../$(build_subdir)/fixincludes/fixincl: ; @ :
+ 
+ # Build fixed copies of system files.
++# Abort if no system headers available, unless building a crosscompiler.
++# Canonicalize $gcc_tooldir/sys-include in same way as $SYSTEM_HEADER_DIR was canonicalized so test still works
+ stmp-fixinc: gsyslimits.h macro_list \
+   $(build_objdir)/fixincludes/fixincl \
+   $(build_objdir)/fixincludes/fixinc.sh
+ 	@if ! $(inhibit_libc) && test ! -d ${SYSTEM_HEADER_DIR}; then \
+ 	  echo The directory that should contain system headers does not exist: >&2 ; \
+ 	  echo "  ${SYSTEM_HEADER_DIR}" >&2 ; \
+-	  if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \
++	  if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \
+ 	  then sleep 1; else exit 1; fi; \
+ 	fi
+ 	rm -rf include; mkdir include
diff --git a/patches/gcc/4.1.1/100-uclibc-conf.patch b/patches/gcc/4.1.1/100-uclibc-conf.patch
new file mode 100644
index 00000000..49d576c7
--- /dev/null
+++ b/patches/gcc/4.1.1/100-uclibc-conf.patch
@@ -0,0 +1,544 @@
+--- gcc-4.1.0/gcc/config/t-linux-uclibc
++++ gcc-4.1.0/gcc/config/t-linux-uclibc
+@@ -0,0 +1,5 @@
++# Remove glibc specific files added in t-linux
++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES))
++
++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc
++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH))
+--- gcc-4.1.0/gcc/config.gcc
++++ gcc-4.1.0/gcc/config.gcc
+@@ -1887,7 +1887,7 @@ s390x-ibm-tpf*)
+ 	;;
+ sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \
+ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
+-  sh-*-linux* | sh[346lbe]*-*-linux* | \
++  sh*-*-linux* | sh[346lbe]*-*-linux* | \
+   sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
+    sh64-*-netbsd* | sh64l*-*-netbsd*)
+ 	tmake_file="${tmake_file} sh/t-sh sh/t-elf"
+@@ -2341,6 +2341,12 @@ m32c-*-elf*)
+ 	;;
+ esac
+ 
++# Rather than hook into each target, just do it after all the linux
++# targets have been processed
++case ${target} in
++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc"
++esac
++
+ case ${target} in
+ i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1)
+ 	tmake_file="${tmake_file} i386/t-gmm_malloc"
+--- gcc-4.1.0/boehm-gc/configure
++++ gcc-4.1.0/boehm-gc/configure
+@@ -4320,6 +4320,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/configure
++++ gcc-4.1.0/configure
+@@ -1133,7 +1133,7 @@ no)
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.1.0/configure.in
++++ gcc-4.1.0/configure.in
+@@ -341,7 +341,7 @@ no)
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.1.0/contrib/regression/objs-gcc.sh
++++ gcc-4.1.0/contrib/regression/objs-gcc.sh
+@@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H
+  then
+   make all-gdb all-dejagnu all-ld || exit 1
+   make install-gdb install-dejagnu install-ld || exit 1
++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
++ then
++  make all-gdb all-dejagnu all-ld || exit 1
++  make install-gdb install-dejagnu install-ld || exit 1
+ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+   make bootstrap || exit 1
+   make install || exit 1
+--- gcc-4.1.0/gcc/config/alpha/linux-elf.h
++++ gcc-4.1.0/gcc/config/alpha/linux-elf.h
+@@ -27,7 +27,11 @@ Boston, MA 02110-1301, USA.  */
+ #define SUBTARGET_EXTRA_SPECS \
+ { "elf_dynamic_linker", ELF_DYNAMIC_LINKER },
+ 
++#if defined USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
+ #define ELF_DYNAMIC_LINKER	"/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}		\
+   %{O*:-O3} %{!O*:-O1}						\
+--- gcc-4.1.0/gcc/config/arm/linux-elf.h
++++ gcc-4.1.0/gcc/config/arm/linux-elf.h
+@@ -51,7 +51,11 @@
+ 
+ #define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc"
+ 
++#ifdef USE_UCLIBC
++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0"
++#else
+ #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINUX_TARGET_LINK_SPEC  "%{h*} %{version:-v} \
+    %{b} \
+--- gcc-4.1.0/gcc/config/cris/linux.h
++++ gcc-4.1.0/gcc/config/cris/linux.h
+@@ -73,6 +73,25 @@ Boston, MA 02110-1301, USA.  */
+ #undef CRIS_DEFAULT_CPU_VERSION
+ #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG
+ 
++#ifdef USE_UCLIBC
++
++#undef CRIS_SUBTARGET_VERSION
++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc"
++
++#undef CRIS_LINK_SUBTARGET_SPEC
++#define CRIS_LINK_SUBTARGET_SPEC \
++ "-mcrislinux\
++  -rpath-link include/asm/../..%s\
++  %{shared} %{static}\
++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\
++  %{!shared: \
++    %{!static: \
++      %{rdynamic:-export-dynamic} \
++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \
++  %{!r:%{O2|O3: --gc-sections}}"
++
++#else  /* USE_UCLIBC */
++
+ #undef CRIS_SUBTARGET_VERSION
+ #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu"
+ 
+@@ -87,6 +106,8 @@ Boston, MA 02110-1301, USA.  */
+   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\
+   %{!r:%{O2|O3: --gc-sections}}"
+ 
++#endif  /* USE_UCLIBC */
++
+ 
+ /* Node: Run-time Target */
+ 
+--- gcc-4.1.0/gcc/config/i386/linux.h
++++ gcc-4.1.0/gcc/config/i386/linux.h
+@@ -107,6 +107,11 @@ Boston, MA 02110-1301, USA.  */
+ #define LINK_EMULATION "elf_i386"
+ #define DYNAMIC_LINKER "/lib/ld-linux.so.2"
+ 
++#if defined USE_UCLIBC
++#undef DYNAMIC_LINKER
++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#endif
++
+ #undef  SUBTARGET_EXTRA_SPECS
+ #define SUBTARGET_EXTRA_SPECS \
+   { "link_emulation", LINK_EMULATION },\
+--- gcc-4.1.0/gcc/config/i386/linux64.h
++++ gcc-4.1.0/gcc/config/i386/linux64.h
+@@ -54,14 +54,21 @@ Boston, MA 02110-1301, USA.  */
+    When the -shared link option is used a final link is not being
+    done.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+-      %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
++      %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \
++      %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \
+     %{static:-static}}"
+ 
+ /* Similar to standard Linux, but adding -ffast-math support.  */
+--- gcc-4.1.0/gcc/config/ia64/linux.h
++++ gcc-4.1.0/gcc/config/ia64/linux.h
+@@ -37,13 +37,18 @@ do {						\
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ 
+--- gcc-4.1.0/gcc/config/m68k/linux.h
++++ gcc-4.1.0/gcc/config/m68k/linux.h
+@@ -123,12 +123,17 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "-m m68kelf %{shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+     %{static}}"
+ 
+ /* For compatibility with linux/a.out */
+--- gcc-4.1.0/gcc/config/mips/linux.h
++++ gcc-4.1.0/gcc/config/mips/linux.h
+@@ -105,6 +105,11 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* Borrowed from sparc/linux.h */
+ #undef LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #define LINK_SPEC \
+  "%(endian_spec) \
+   %{shared:-shared} \
+@@ -112,7 +117,7 @@ Boston, MA 02110-1301, USA.  */
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ #undef SUBTARGET_ASM_SPEC
+--- gcc-4.1.0/gcc/config/pa/pa-linux.h
++++ gcc-4.1.0/gcc/config/pa/pa-linux.h
+@@ -49,13 +49,18 @@ Boston, MA 02110-1301, USA.  */
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ /* glibc's profiling functions don't need gcc to allocate counters.  */
+--- gcc-4.1.0/gcc/config/rs6000/linux.h
++++ gcc-4.1.0/gcc/config/rs6000/linux.h
+@@ -72,7 +72,11 @@
+ #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
+ 
+ #undef	LINK_OS_DEFAULT_SPEC
++#ifdef USE_UCLIBC
++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)"
++#else
+ #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
++#endif
+ 
+ #define LINK_GCC_C_SEQUENCE_SPEC \
+   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+--- gcc-4.1.0/gcc/config/rs6000/sysv4.h
++++ gcc-4.1.0/gcc/config/rs6000/sysv4.h
+@@ -866,6 +866,7 @@ extern int fixuplabelno;
+   mcall-linux  : %(link_os_linux)       ; \
+   mcall-gnu    : %(link_os_gnu)         ; \
+   mcall-netbsd : %(link_os_netbsd)      ; \
++  mcall-linux-uclibc : %(link_os_linux_uclibc); \
+   mcall-openbsd: %(link_os_openbsd)     ; \
+                : %(link_os_default)     }"
+ 
+@@ -1043,6 +1044,10 @@ extern int fixuplabelno;
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ 
++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++  %{rdynamic:-export-dynamic} \
++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}"
++
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+ # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+ #endif
+@@ -1209,6 +1214,7 @@ ncrtn.o%s"
+   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
+   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
+   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\
+   { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
+   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
+   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
+--- gcc-4.1.0/gcc/config/s390/linux.h
++++ gcc-4.1.0/gcc/config/s390/linux.h
+@@ -77,6 +77,13 @@ Software Foundation, 51 Franklin Street,
+ #define MULTILIB_DEFAULTS { "m31" }
+ #endif
+ 
++#ifdef USE_UCLIBC
++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC \
+   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
+@@ -86,8 +93,8 @@ Software Foundation, 51 Franklin Street,
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+ 	%{!dynamic-linker: \
+-          %{m31:-dynamic-linker /lib/ld.so.1} \
+-          %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
++          %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \
++          %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}"
+ 
+ 
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc-4.1.0/gcc/config/sh/linux.h
++++ gcc-4.1.0/gcc/config/sh/linux.h
+@@ -56,12 +56,21 @@ Boston, MA 02110-1301, USA.  */
+ #undef SUBTARGET_LINK_EMUL_SUFFIX
+ #define SUBTARGET_LINK_EMUL_SUFFIX "_linux"
+ #undef SUBTARGET_LINK_SPEC
++#ifdef USE_UCLIBC
++#define SUBTARGET_LINK_SPEC \
++  "%{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
++   %{static:-static}"
++#else
+ #define SUBTARGET_LINK_SPEC \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+    %{static:-static}"
++#endif
+ 
+ /* Output assembler code to STREAM to call the profiler.  */
+ 
+--- gcc-4.1.0/gcc/config/sparc/linux.h
++++ gcc-4.1.0/gcc/config/sparc/linux.h
+@@ -125,6 +125,11 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!mno-relax:%{!r:-relax}} \
+@@ -132,7 +137,7 @@ Boston, MA 02110-1301, USA.  */
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ /* The sun bundled assembler doesn't accept -Yd, (and neither does gas).
+--- gcc-4.1.0/gcc/config/sparc/linux64.h
++++ gcc-4.1.0/gcc/config/sparc/linux64.h
+@@ -162,12 +162,17 @@ Boston, MA 02110-1301, USA.  */
+   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },	  \
+   { "link_arch",	 LINK_ARCH_SPEC },
+     
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER  "/lib/ld-linux.so.2"
++#endif
+ #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}} \
+ "
+ 
+--- gcc-4.1.0/libffi/configure
++++ gcc-4.1.0/libffi/configure
+@@ -3457,6 +3457,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libgfortran/configure
++++ gcc-4.1.0/libgfortran/configure
+@@ -3699,6 +3699,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libjava/configure
++++ gcc-4.1.0/libjava/configure
+@@ -5137,6 +5137,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libmudflap/configure
++++ gcc-4.1.0/libmudflap/configure
+@@ -5382,6 +5382,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libobjc/configure
++++ gcc-4.1.0/libobjc/configure
+@@ -3312,6 +3312,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libtool.m4
++++ gcc-4.1.0/libtool.m4
+@@ -743,6 +743,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+--- gcc-4.1.0/ltconfig
++++ gcc-4.1.0/ltconfig
+@@ -603,6 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1274,6 +1275,23 @@ linux-gnu*)
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gcc-4.1.0/zlib/configure
++++ gcc-4.1.0/zlib/configure
+@@ -3426,6 +3426,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
diff --git a/patches/gcc/4.1.1/110-arm-eabi.patch b/patches/gcc/4.1.1/110-arm-eabi.patch
new file mode 100644
index 00000000..1657e7ba
--- /dev/null
+++ b/patches/gcc/4.1.1/110-arm-eabi.patch
@@ -0,0 +1,27 @@
+--- gcc-2005q3-1.orig/gcc/config.gcc	2005-10-31 19:02:54.000000000 +0300
++++ gcc-2005q3-1/gcc/config.gcc	2006-01-27 01:09:09.000000000 +0300
+@@ -674,7 +674,7 @@
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" 
+ 	tmake_file="${tmake_file} t-linux arm/t-arm"
+ 	case ${target} in
+-	arm*-*-linux-gnueabi)
++	arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+ 	    tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h"
+ 	    tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
+   	    # The BPABI long long divmod functions return a 128-bit value in 
+
+diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h
+--- gcc-2005q3-2/gcc/config/arm/linux-eabi.h	2005-12-07 23:14:16.000000000 +0300
++++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h	2006-03-29 19:02:34.000000000 +0400
+@@ -53,7 +53,11 @@
+ /* Use ld-linux.so.3 so that it will be possible to run "classic"
+    GNU/Linux binaries on an EABI system.  */
+ #undef LINUX_TARGET_INTERPRETER
++#ifdef USE_UCLIBC
++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0"
++#else
+ #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3"
++#endif
+ 
+ /* At this point, bpabi.h will have clobbered LINK_SPEC.  We want to
+    use the GNU/Linux version, not the generic BPABI version.  */
diff --git a/patches/gcc/4.1.1/200-uclibc-locale.patch b/patches/gcc/4.1.1/200-uclibc-locale.patch
new file mode 100644
index 00000000..e5d712e7
--- /dev/null
+++ b/patches/gcc/4.1.1/200-uclibc-locale.patch
@@ -0,0 +1,3239 @@
+--- gcc-4.1.0-dist/libstdc++-v3/acinclude.m4
++++ gcc-4.1.0/libstdc++-v3/acinclude.m4
+@@ -1071,7 +1071,7 @@
+   AC_MSG_CHECKING([for C locale to use])
+   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+     [use MODEL for target locale package],
+-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
+   
+   # If they didn't use this option switch, or if they specified --enable
+   # with no specific model, we'll have to look for one.  If they
+@@ -1087,6 +1087,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      *-uclibc*)
++        enable_clocale_flag=uclibc
++        ;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1230,6 +1233,40 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
+@@ -0,0 +1,63 @@
++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
++
++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++// Written by Jakub Jelinek <jakub@redhat.com>
++
++#include <bits/c++config.h>
++#include <clocale>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning clean this up
++#endif
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++                                                  
++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
++extern "C" __typeof(strcoll_l) __strcoll_l;
++extern "C" __typeof(strftime_l) __strftime_l;
++extern "C" __typeof(strtod_l) __strtod_l;
++extern "C" __typeof(strtof_l) __strtof_l;
++extern "C" __typeof(strtold_l) __strtold_l;
++extern "C" __typeof(strxfrm_l) __strxfrm_l;
++extern "C" __typeof(newlocale) __newlocale;
++extern "C" __typeof(freelocale) __freelocale;
++extern "C" __typeof(duplocale) __duplocale;
++extern "C" __typeof(uselocale) __uselocale;
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++extern "C" __typeof(iswctype_l) __iswctype_l;
++extern "C" __typeof(towlower_l) __towlower_l;
++extern "C" __typeof(towupper_l) __towupper_l;
++extern "C" __typeof(wcscoll_l) __wcscoll_l;
++extern "C" __typeof(wcsftime_l) __wcsftime_l;
++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
++extern "C" __typeof(wctype_l) __wctype_l;
++#endif 
++
++#endif // GLIBC 2.3 and later
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc
+@@ -0,0 +1,152 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno>  // For errno
++#include <locale>
++#include <stdexcept>
++#include <langinfo.h>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
++#define __strtof_l(S, E, L)         strtof((S), (E))
++#define __strtod_l(S, E, L)         strtod((S), (E))
++#define __strtold_l(S, E, L)        strtold((S), (E))
++#warning should dummy __newlocale check for C|POSIX ?
++#define __newlocale(a, b, c)        NULL
++#define __freelocale(a)             ((void)0)
++#define __duplocale(a)              __c_locale()
++#endif
++
++namespace std 
++{
++  template<>
++    void
++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      float __f = __strtof_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __f;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      double __d = __strtod_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __d;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      long double __ld = __strtold_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __ld;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  void
++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
++				    __c_locale __old)
++  {
++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    if (!__cloc)
++      {
++	// This named locale is not supported by the underlying OS.
++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++			      "name not valid"));
++      }
++#endif
++  }
++  
++  void
++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++  {
++    if (__cloc && _S_get_c_locale() != __cloc)
++      __freelocale(__cloc); 
++  }
++
++  __c_locale
++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
++  { return __duplocale(__cloc); }
++} // namespace std
++
++namespace __gnu_cxx
++{
++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++    {
++      "LC_CTYPE", 
++      "LC_NUMERIC",
++      "LC_TIME", 
++      "LC_COLLATE", 
++      "LC_MONETARY",
++      "LC_MESSAGES", 
++#if _GLIBCXX_NUM_CATEGORIES != 0
++      "LC_PAPER", 
++      "LC_NAME", 
++      "LC_ADDRESS",
++      "LC_TELEPHONE", 
++      "LC_MEASUREMENT", 
++      "LC_IDENTIFICATION" 
++#endif
++    };
++}
++
++namespace std
++{
++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++}  // namespace std
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h
+@@ -0,0 +1,117 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifndef _C_LOCALE_H
++#define _C_LOCALE_H 1
++
++#pragma GCC system_header
++
++#include <cstring>              // get std::strlen
++#include <cstdio>               // get std::snprintf or std::sprintf
++#include <clocale>
++#include <langinfo.h>		// For codecvt
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC_HAS_LOCALE__
++#include <iconv.h>		// For codecvt using iconv, iconv_t
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++#include <libintl.h> 		// For messages
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning what is _GLIBCXX_C_LOCALE_GNU for
++#endif
++#define _GLIBCXX_C_LOCALE_GNU 1
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix categories
++#endif
++// #define _GLIBCXX_NUM_CATEGORIES 6
++#define _GLIBCXX_NUM_CATEGORIES 0
++ 
++#ifdef __UCLIBC_HAS_XLOCALE__
++namespace __gnu_cxx
++{
++  extern "C" __typeof(uselocale) __uselocale;
++}
++#endif
++
++namespace std
++{
++#ifdef __UCLIBC_HAS_XLOCALE__
++  typedef __locale_t		__c_locale;
++#else
++  typedef int*			__c_locale;
++#endif
++
++  // Convert numeric value of type _Tv to string and return length of
++  // string.  If snprintf is available use it, otherwise fall back to
++  // the unsafe sprintf which, in general, can be dangerous and should
++  // be avoided.
++  template<typename _Tv>
++    int
++    __convert_from_v(char* __out, 
++		     const int __size __attribute__ ((__unused__)),
++		     const char* __fmt,
++#ifdef __UCLIBC_HAS_XLOCALE__
++		     _Tv __v, const __c_locale& __cloc, int __prec)
++    {
++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
++#else
++		     _Tv __v, const __c_locale&, int __prec)
++    {
++# ifdef __UCLIBC_HAS_LOCALE__
++      char* __old = std::setlocale(LC_ALL, NULL);
++      char* __sav = new char[std::strlen(__old) + 1];
++      std::strcpy(__sav, __old);
++      std::setlocale(LC_ALL, "C");
++# endif
++#endif
++
++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __gnu_cxx::__uselocale(__old);
++#elif defined __UCLIBC_HAS_LOCALE__
++      std::setlocale(LC_ALL, __sav);
++      delete [] __sav;
++#endif
++      return __ret;
++    }
++}
++
++#endif
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
+@@ -0,0 +1,306 @@
++// std::codecvt implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++namespace std
++{
++  // Specializations.
++#ifdef _GLIBCXX_USE_WCHAR_T
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_out(state_type& __state, const intern_type* __from, 
++	 const intern_type* __from_end, const intern_type*& __from_next,
++	 extern_type* __to, extern_type* __to_end,
++	 extern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
++    // in case we fall back to wcrtomb and then continue, in a loop.
++    // NB: wcsnrtombs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
++						      __from_end - __from_next);
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
++					 __from_chunk_end - __from_next,
++					 __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // wcrtomb.
++	    for (; __from < __from_next; ++__from)
++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
++	    __state = __tmp_state;
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    extern_type __buf[MB_LEN_MAX];
++	    __tmp_state = __state;
++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
++	      __ret = partial;
++	    else
++	      {
++		memcpy(__to_next, __buf, __conv);
++		__state = __tmp_state;
++		__to_next += __conv;
++		++__from_next;
++	      }
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++  
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_in(state_type& __state, const extern_type* __from, 
++	const extern_type* __from_end, const extern_type*& __from_next,
++	intern_type* __to, intern_type* __to_end,
++	intern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we store a L'\0' and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
++								  __from_end
++								  - __from_next));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
++				   __from_chunk_end - __from_next,
++				   __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (;; ++__to_next, __from += __conv)
++	      {
++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __from_next = __from;
++	    __state = __tmp_state;	    
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    // It is unclear what to return in this case (see DR 382). 
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    if (__to_next < __to_end)
++	      {
++		// XXX Probably wrong for stateful encodings
++		__tmp_state = __state;		
++		++__from_next;
++		*__to_next++ = L'\0';
++	      }
++	    else
++	      __ret = partial;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_encoding() const throw()
++  {
++    // XXX This implementation assumes that the encoding is
++    // stateless and is either single-byte or variable-width.
++    int __ret = 0;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    if (MB_CUR_MAX == 1)
++      __ret = 1;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }  
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_max_length() const throw()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    // XXX Probably wrong for stateful encodings.
++    int __ret = MB_CUR_MAX;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }
++  
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_length(state_type& __state, const extern_type* __from,
++	    const extern_type* __end, size_t __max) const
++  {
++    int __ret = 0;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we advance past it and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++  
++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
++    // its fourth parameter (it wouldn't with NULL as first parameter).
++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
++							   * __max));
++    while (__from < __end && __max)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
++								  __end
++								  - __from));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __end;
++
++	const extern_type* __tmp_from = __from;
++	size_t __conv = mbsnrtowcs(__to, &__from,
++				   __from_chunk_end - __from,
++				   __max, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (__from = __tmp_from;; __from += __conv)
++	      {
++		__conv = mbrtowc(NULL, __from, __end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __state = __tmp_state;
++	    __ret += __from - __tmp_from;
++	    break;
++	  }
++	if (!__from)
++	  __from = __from_chunk_end;
++	
++	__ret += __from - __tmp_from;
++	__max -= __conv;
++
++	if (__from < __end && __max)
++	  {
++	    // XXX Probably wrong for stateful encodings
++	    __tmp_state = __state;
++	    ++__from;
++	    ++__ret;
++	    --__max;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc
+@@ -0,0 +1,80 @@
++// std::collate implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
++#endif
++
++namespace std
++{
++  // These are basically extensions to char_traits, and perhaps should
++  // be put there instead of here.
++  template<>
++    int 
++    collate<char>::_M_compare(const char* __one, const char* __two) const
++    { 
++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<char>::_M_transform(char* __to, const char* __from, 
++				size_t __n) const 
++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    int 
++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
++				 const wchar_t* __two) const
++    {
++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
++				   size_t __n) const
++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc
+@@ -0,0 +1,314 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __wctype_l(S, L)           wctype((S))
++#define __towupper_l(C, L)         towupper((C))
++#define __towlower_l(C, L)         towlower((C))
++#define __iswctype_l(C, M, L)      iswctype((C), (M))
++#endif
++
++namespace std
++{
++  // NB: The other ctype<char> specializations are in src/locale.cc and
++  // various /config/os/* files.
++  template<>
++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++    : ctype<char>(0, false, __refs) 
++    { 		
++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	{
++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
++#endif
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T  
++  ctype<wchar_t>::__wmask_type
++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
++  {
++    __wmask_type __ret;
++    switch (__m)
++      {
++      case space:
++	__ret = __wctype_l("space", _M_c_locale_ctype);
++	break;
++      case print:
++	__ret = __wctype_l("print", _M_c_locale_ctype);
++	break;
++      case cntrl:
++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
++	break;
++      case upper:
++	__ret = __wctype_l("upper", _M_c_locale_ctype);
++	break;
++      case lower:
++	__ret = __wctype_l("lower", _M_c_locale_ctype);
++	break;
++      case alpha:
++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
++	break;
++      case digit:
++	__ret = __wctype_l("digit", _M_c_locale_ctype);
++	break;
++      case punct:
++	__ret = __wctype_l("punct", _M_c_locale_ctype);
++	break;
++      case xdigit:
++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
++	break;
++      case alnum:
++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
++	break;
++      case graph:
++	__ret = __wctype_l("graph", _M_c_locale_ctype);
++	break;
++      default:
++	__ret = __wmask_type();
++      }
++    return __ret;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_toupper(wchar_t __c) const
++  { return __towupper_l(__c, _M_c_locale_ctype); }
++
++  const wchar_t*
++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_tolower(wchar_t __c) const
++  { return __towlower_l(__c, _M_c_locale_ctype); }
++  
++  const wchar_t*
++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++
++  bool
++  ctype<wchar_t>::
++  do_is(mask __m, wchar_t __c) const
++  { 
++    // The case of __m == ctype_base::space is particularly important,
++    // due to its use in many istream functions.  Therefore we deal with
++    // it first, exploiting the knowledge that on GNU systems _M_bit[5]
++    // is the mask corresponding to ctype_base::space.  NB: an encoding
++    // change would not affect correctness!
++    bool __ret = false;
++    if (__m == _M_bit[5])
++      __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
++    else
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__m & _M_bit[__bitcur])
++	    {
++	      if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
++		{
++		  __ret = true;
++		  break;
++		}
++	      else if (__m == _M_bit[__bitcur])
++		break;
++	    }
++      }
++    return __ret;    
++  }
++
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++  {
++    for (; __lo < __hi; ++__vec, ++__lo)
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11; 
++	mask __m = 0;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
++	    __m |= _M_bit[__bitcur];
++	*__vec = __m;
++      }
++    return __hi;
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi && !this->do_is(__m, *__lo))
++      ++__lo;
++    return __lo;
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++  {
++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
++      ++__lo;
++    return __lo;
++  }
++
++  wchar_t
++  ctype<wchar_t>::
++  do_widen(char __c) const
++  { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<wchar_t>::
++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++  {
++    while (__lo < __hi)
++      {
++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++	++__lo;
++	++__dest;
++      }
++    return __hi;
++  }
++
++  char
++  ctype<wchar_t>::
++  do_narrow(wchar_t __wc, char __dfault) const
++  {
++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++      return _M_narrow[__wc];
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    const int __c = wctob(__wc);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
++	    char* __dest) const
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    if (_M_narrow_ok)
++      while (__lo < __hi)
++	{
++	  if (*__lo >= 0 && *__lo < 128)
++	    *__dest = _M_narrow[*__lo];
++	  else
++	    {
++	      const int __c = wctob(*__lo);
++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	    }
++	  ++__lo;
++	  ++__dest;
++	}
++    else
++      while (__lo < __hi)
++	{
++	  const int __c = wctob(*__lo);
++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	  ++__lo;
++	  ++__dest;
++	}
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __hi;
++  }
++
++  void
++  ctype<wchar_t>::_M_initialize_ctype()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    wint_t __i;
++    for (__i = 0; __i < 128; ++__i)
++      {
++	const int __c = wctob(__i);
++	if (__c == EOF)
++	  break;
++	else
++	  _M_narrow[__i] = static_cast<char>(__c);
++      }
++    if (__i == 128)
++      _M_narrow_ok = true;
++    else
++      _M_narrow_ok = false;
++    for (size_t __j = 0;
++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
++      _M_widen[__j] = btowc(__j);
++
++    for (size_t __k = 0; __k <= 11; ++__k)
++      { 
++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
++      }
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++  }
++#endif //  _GLIBCXX_USE_WCHAR_T
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc
+@@ -0,0 +1,100 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix gettext stuff
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__dcgettext(const char *domainname,
++			     const char *msgid, int category);
++#undef gettext
++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
++#else
++#undef gettext
++#define gettext(msgid) (msgid)
++#endif
++
++namespace std
++{
++  // Specializations.
++  template<>
++    string
++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
++      __uselocale(__old);
++      return string(__msg);
++#elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      const char* __msg = gettext(__dfault.c_str());
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return string(__msg);
++#else
++      const char* __msg = gettext(__dfault.c_str());
++      return string(__msg);
++#endif
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    wstring
++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
++    {
++# ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      __uselocale(__old);
++      return _M_convert_from_char(__msg);
++# elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return _M_convert_from_char(__msg);
++# else
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      return _M_convert_from_char(__msg);
++# endif
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h
+@@ -0,0 +1,121 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix prototypes for *textdomain funcs
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__textdomain(const char *domainname);
++extern "C" char *__bindtextdomain(const char *domainname,
++				  const char *dirname);
++#else
++#undef __textdomain
++#undef __bindtextdomain
++#define __textdomain(D)           ((void)0)
++#define __bindtextdomain(D,P)     ((void)0)
++#endif
++
++  // Non-virtual member functions.
++  template<typename _CharT>
++     messages<_CharT>::messages(size_t __refs)
++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
++       _M_name_messages(_S_get_c_name())
++     { }
++
++  template<typename _CharT>
++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
++				size_t __refs) 
++     : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL)
++     {
++       const size_t __len = std::strlen(__s) + 1;
++       char* __tmp = new char[__len];
++       std::memcpy(__tmp, __s, __len);
++       _M_name_messages = __tmp;
++
++       // Last to avoid leaking memory if new throws.
++       _M_c_locale_messages = _S_clone_c_locale(__cloc);
++     }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
++			   const char* __dir) const
++    { 
++      __bindtextdomain(__s.c_str(), __dir);
++      return this->do_open(__s, __loc); 
++    }
++
++  // Virtual member functions.
++  template<typename _CharT>
++    messages<_CharT>::~messages()
++    { 
++      if (_M_name_messages != _S_get_c_name())
++	delete [] _M_name_messages;
++      _S_destroy_c_locale(_M_c_locale_messages); 
++    }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::do_open(const basic_string<char>& __s, 
++			      const locale&) const
++    { 
++      // No error checking is done, assume the catalog exists and can
++      // be used.
++      __textdomain(__s.c_str());
++      return 0;
++    }
++
++  template<typename _CharT>
++    void    
++    messages<_CharT>::do_close(catalog) const 
++    { }
++
++   // messages_byname
++   template<typename _CharT>
++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
++     : messages<_CharT>(__refs) 
++     { 
++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
++	 delete [] this->_M_name_messages;
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       this->_M_name_messages = __tmp;
++
++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	 {
++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
++	 }
++     }
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc
+@@ -0,0 +1,692 @@
++// std::moneypunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning optimize this for uclibc
++#warning tailor for stub locale support
++#endif
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  // Construct and return valid pattern consisting of some combination of:
++  // space none symbol sign value
++  money_base::pattern
++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
++  { 
++    pattern __ret;
++
++    // This insanely complicated routine attempts to construct a valid
++    // pattern for use with monyepunct. A couple of invariants:
++
++    // if (__precedes) symbol -> value
++    // else value -> symbol
++    
++    // if (__space) space
++    // else none
++
++    // none == never first
++    // space never first or last
++
++    // Any elegant implementations of this are welcome.
++    switch (__posn)
++      {
++      case 0:
++      case 1:
++	// 1 The sign precedes the value and symbol.
++	__ret.field[0] = sign;
++	if (__space)
++	  {
++	    // Pattern starts with sign.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[3] = symbol;
++	      }
++	    __ret.field[2] = space;
++	  }
++	else
++	  {
++	    // Pattern starts with sign and ends with none.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 2:
++	// 2 The sign follows the value and symbol.
++	if (__space)
++	  {
++	    // Pattern either ends with sign.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[1] = space;
++	    __ret.field[3] = sign;
++	  }
++	else
++	  {
++	    // Pattern ends with sign then none.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[1] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[1] = symbol;
++	      }
++	    __ret.field[2] = sign;
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 3:
++	// 3 The sign immediately precedes the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = sign;
++	    __ret.field[1] = symbol;	    
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;		
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = sign;
++		__ret.field[3] = symbol;
++	      }
++	    else
++	      {
++		__ret.field[1] = sign;
++		__ret.field[2] = symbol;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      case 4:
++	// 4 The sign immediately follows the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = symbol;
++	    __ret.field[1] = sign;
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = symbol;
++		__ret.field[3] = sign;
++	      }
++	    else
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = sign;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      default:
++	__ret = pattern();
++      }
++    return __ret;
++  }
++
++  template<> 
++    void
++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++						     const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == true
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    void
++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
++						      const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, false>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == false
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    moneypunct<char, true>::~moneypunct()
++    { delete _M_data; }
++
++  template<> 
++    moneypunct<char, false>::~moneypunct()
++    { delete _M_data; }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++#ifdef __UCLIBC_HAS_XLOCALE__
++							const char*)
++#else
++							const char* __name)
++#endif
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<wchar_t, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  try
++	    {
++	      mbstate_t __state;
++	      size_t __len = strlen(__cpossign);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++	      
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++	  catch (...)
++	    {
++	      delete _M_data;
++	      _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++	      __throw_exception_again;
++	    } 
++	  
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++  void
++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
++#ifdef __UCLIBC_HAS_XLOCALE__
++						       const char*)
++#else
++                                                       const char* __name)
++#endif
++  {
++    if (!_M_data)
++      _M_data = new __moneypunct_cache<wchar_t, false>;
++
++    if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++          _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++          union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  try
++            {
++              mbstate_t __state;
++              size_t __len;
++              __len = strlen(__cpossign);
++              if (__len)
++                {
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++          catch (...)
++	    {
++	      delete _M_data;
++              _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++              __throw_exception_again;
++	    }
++
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++	                                                __pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++	                                                __nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++    moneypunct<wchar_t, true>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++
++  template<> 
++    moneypunct<wchar_t, false>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc
+@@ -0,0 +1,173 @@
++// std::numpunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<> 
++    void
++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
++							__cloc));
++
++	  // Check for NULL, which implies no grouping.
++	  if (_M_data->_M_thousands_sep == '\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = "true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = "false";
++      _M_data->_M_falsename_size = 5;
++    }
++ 
++  template<> 
++    numpunct<char>::~numpunct()
++    { delete _M_data; }
++   
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<wchar_t>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
++	}
++      else
++	{
++	  // Named locale.
++	  // NB: In the GNU model wchar_t is always 32 bit wide.
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++
++	  if (_M_data->_M_thousands_sep == L'\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = L"true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = L"false";
++      _M_data->_M_falsename_size = 5;
++    }
++
++  template<> 
++    numpunct<wchar_t>::~numpunct()
++    { delete _M_data; }
++ #endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc
+@@ -0,0 +1,406 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<>
++    void
++    __timepunct<char>::
++    _M_put(char* __s, size_t __maxlen, const char* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = '\0';
++    }
++
++  template<> 
++    void
++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = "%m/%d/%y";
++	  _M_data->_M_date_era_format = "%m/%d/%y";
++	  _M_data->_M_time_format = "%H:%M:%S";
++	  _M_data->_M_time_era_format = "%H:%M:%S";
++	  _M_data->_M_date_time_format = "";
++	  _M_data->_M_date_time_era_format = "";
++	  _M_data->_M_am = "AM";
++	  _M_data->_M_pm = "PM";
++	  _M_data->_M_am_pm_format = "";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = "Sunday";
++	  _M_data->_M_day2 = "Monday";
++	  _M_data->_M_day3 = "Tuesday";
++	  _M_data->_M_day4 = "Wednesday";
++	  _M_data->_M_day5 = "Thursday";
++	  _M_data->_M_day6 = "Friday";
++	  _M_data->_M_day7 = "Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = "Sun";
++	  _M_data->_M_aday2 = "Mon";
++	  _M_data->_M_aday3 = "Tue";
++	  _M_data->_M_aday4 = "Wed";
++	  _M_data->_M_aday5 = "Thu";
++	  _M_data->_M_aday6 = "Fri";
++	  _M_data->_M_aday7 = "Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = "January";
++	  _M_data->_M_month02 = "February";
++	  _M_data->_M_month03 = "March";
++	  _M_data->_M_month04 = "April";
++	  _M_data->_M_month05 = "May";
++	  _M_data->_M_month06 = "June";
++	  _M_data->_M_month07 = "July";
++	  _M_data->_M_month08 = "August";
++	  _M_data->_M_month09 = "September";
++	  _M_data->_M_month10 = "October";
++	  _M_data->_M_month11 = "November";
++	  _M_data->_M_month12 = "December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = "Jan";
++	  _M_data->_M_amonth02 = "Feb";
++	  _M_data->_M_amonth03 = "Mar";
++	  _M_data->_M_amonth04 = "Apr";
++	  _M_data->_M_amonth05 = "May";
++	  _M_data->_M_amonth06 = "Jun";
++	  _M_data->_M_amonth07 = "Jul";
++	  _M_data->_M_amonth08 = "Aug";
++	  _M_data->_M_amonth09 = "Sep";
++	  _M_data->_M_amonth10 = "Oct";
++	  _M_data->_M_amonth11 = "Nov";
++	  _M_data->_M_amonth12 = "Dec";
++	}
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
++							     __cloc);
++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    void
++    __timepunct<wchar_t>::
++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = L'\0';
++    }
++
++  template<> 
++    void
++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<wchar_t>;
++
++#warning wide time stuff
++//       if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = L"%m/%d/%y";
++	  _M_data->_M_date_era_format = L"%m/%d/%y";
++	  _M_data->_M_time_format = L"%H:%M:%S";
++	  _M_data->_M_time_era_format = L"%H:%M:%S";
++	  _M_data->_M_date_time_format = L"";
++	  _M_data->_M_date_time_era_format = L"";
++	  _M_data->_M_am = L"AM";
++	  _M_data->_M_pm = L"PM";
++	  _M_data->_M_am_pm_format = L"";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = L"Sunday";
++	  _M_data->_M_day2 = L"Monday";
++	  _M_data->_M_day3 = L"Tuesday";
++	  _M_data->_M_day4 = L"Wednesday";
++	  _M_data->_M_day5 = L"Thursday";
++	  _M_data->_M_day6 = L"Friday";
++	  _M_data->_M_day7 = L"Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = L"Sun";
++	  _M_data->_M_aday2 = L"Mon";
++	  _M_data->_M_aday3 = L"Tue";
++	  _M_data->_M_aday4 = L"Wed";
++	  _M_data->_M_aday5 = L"Thu";
++	  _M_data->_M_aday6 = L"Fri";
++	  _M_data->_M_aday7 = L"Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = L"January";
++	  _M_data->_M_month02 = L"February";
++	  _M_data->_M_month03 = L"March";
++	  _M_data->_M_month04 = L"April";
++	  _M_data->_M_month05 = L"May";
++	  _M_data->_M_month06 = L"June";
++	  _M_data->_M_month07 = L"July";
++	  _M_data->_M_month08 = L"August";
++	  _M_data->_M_month09 = L"September";
++	  _M_data->_M_month10 = L"October";
++	  _M_data->_M_month11 = L"November";
++	  _M_data->_M_month12 = L"December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = L"Jan";
++	  _M_data->_M_amonth02 = L"Feb";
++	  _M_data->_M_amonth03 = L"Mar";
++	  _M_data->_M_amonth04 = L"Apr";
++	  _M_data->_M_amonth05 = L"May";
++	  _M_data->_M_amonth06 = L"Jun";
++	  _M_data->_M_amonth07 = L"Jul";
++	  _M_data->_M_amonth08 = L"Aug";
++	  _M_data->_M_amonth09 = L"Sep";
++	  _M_data->_M_amonth10 = L"Oct";
++	  _M_data->_M_amonth11 = L"Nov";
++	  _M_data->_M_amonth12 = L"Dec";
++	}
++#if 0
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  union { char *__s; wchar_t *__w; } __u;
++
++	  __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
++	  _M_data->_M_date_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
++	  _M_data->_M_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
++	  _M_data->_M_am = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
++	  _M_data->_M_pm = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
++	  _M_data->_M_am_pm_format = __u.__w;
++
++	  // Day names, starting with "C"'s Sunday.
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
++	  _M_data->_M_day1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
++	  _M_data->_M_day2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
++	  _M_data->_M_day3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
++	  _M_data->_M_day4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
++	  _M_data->_M_day5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
++	  _M_data->_M_day6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
++	  _M_data->_M_day7 = __u.__w;
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
++	  _M_data->_M_aday1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
++	  _M_data->_M_aday2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
++	  _M_data->_M_aday3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
++	  _M_data->_M_aday4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
++	  _M_data->_M_aday5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
++	  _M_data->_M_aday6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
++	  _M_data->_M_aday7 = __u.__w;
++
++	  // Month names, starting with "C"'s January.
++	  __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
++	  _M_data->_M_month01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
++	  _M_data->_M_month02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
++	  _M_data->_M_month03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
++	  _M_data->_M_month04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
++	  _M_data->_M_month05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
++	  _M_data->_M_month06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
++	  _M_data->_M_month07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
++	  _M_data->_M_month08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
++	  _M_data->_M_month09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
++	  _M_data->_M_month10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
++	  _M_data->_M_month11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
++	  _M_data->_M_month12 = __u.__w;
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
++	  _M_data->_M_amonth01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
++	  _M_data->_M_amonth02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
++	  _M_data->_M_amonth03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
++	  _M_data->_M_amonth04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
++	  _M_data->_M_amonth05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
++	  _M_data->_M_amonth06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
++	  _M_data->_M_amonth07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
++	  _M_data->_M_amonth08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
++	  _M_data->_M_amonth09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
++	  _M_data->_M_amonth10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
++	  _M_data->_M_amonth11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
++	  _M_data->_M_amonth12 = __u.__w;
++	}
++#endif // 0
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h
+@@ -0,0 +1,76 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
++				     size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(NULL)
++    { 
++      const size_t __len = std::strlen(__s) + 1;
++      char* __tmp = new char[__len];
++      std::memcpy(__tmp, __s, __len);
++      _M_name_timepunct = __tmp;
++
++      try
++	{ _M_initialize_timepunct(__cloc); }
++      catch(...)
++	{
++	  delete [] _M_name_timepunct;
++	  __throw_exception_again;
++	}
++    }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::~__timepunct()
++    { 
++      if (_M_name_timepunct != _S_get_c_name())
++	delete [] _M_name_timepunct;
++      delete _M_data; 
++      _S_destroy_c_locale(_M_c_locale_timepunct); 
++    }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h
+@@ -0,0 +1,64 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++/** @file ctype_base.h
++ *  This is an internal header file, included by other library headers.
++ *  You should not attempt to use it directly.
++ */
++
++// Information as gleaned from /usr/include/ctype.h
++  
++  /// @brief  Base class for ctype.
++  struct ctype_base
++  {
++    // Note: In uClibc, the following two types depend on configuration.
++ 
++    // Non-standard typedefs.
++    typedef const __ctype_touplow_t* __to_type;
++
++    // NB: Offsets into ctype<char>::_M_table force a particular size
++    // on the mask type. Because of this, we don't use an enum.
++    typedef __ctype_mask_t	mask;   
++    static const mask upper    	= _ISupper;
++    static const mask lower 	= _ISlower;
++    static const mask alpha 	= _ISalpha;
++    static const mask digit 	= _ISdigit;
++    static const mask xdigit 	= _ISxdigit;
++    static const mask space 	= _ISspace;
++    static const mask print 	= _ISprint;
++    static const mask graph 	= _ISalpha | _ISdigit | _ISpunct;
++    static const mask cntrl 	= _IScntrl;
++    static const mask punct 	= _ISpunct;
++    static const mask alnum 	= _ISalpha | _ISdigit;
++  };
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h
+@@ -0,0 +1,69 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
++// functions go in ctype.cc
++  
++  bool
++  ctype<char>::
++  is(mask __m, char __c) const
++  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
++
++  const char*
++  ctype<char>::
++  is(const char* __low, const char* __high, mask* __vec) const
++  {
++    while (__low < __high)
++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
++    return __high;
++  }
++
++  const char*
++  ctype<char>::
++  scan_is(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
++      ++__low;
++    return __low;
++  }
++
++  const char*
++  ctype<char>::
++  scan_not(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
++      ++__low;
++    return __low;
++  }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h
+@@ -0,0 +1,92 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++
++  const ctype_base::mask*
++  ctype<char>::classic_table() throw()
++  { return __C_ctype_b; }
++
++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
++		     size_t __refs) 
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  char
++  ctype<char>::do_toupper(char __c) const
++  { return _M_toupper[static_cast<unsigned char>(__c)]; }
++
++  const char*
++  ctype<char>::do_toupper(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_toupper[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
++
++  char
++  ctype<char>::do_tolower(char __c) const
++  { return _M_tolower[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<char>::do_tolower(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_tolower[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h
+@@ -0,0 +1,44 @@
++// Specific definitions for GNU/Linux  -*- C++ -*-
++
++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here.  This
++// file will come before all others.
++
++// This keeps isanum, et al from being propagated as macros.
++#define __NO_CTYPE 1
++
++#include <features.h>
++
++// We must not see the optimized string functions GNU libc defines.
++#define __NO_STRING_INLINES
++
++#endif
+--- gcc-4.1.0-dist/libstdc++-v3/configure
++++ gcc-4.1.0/libstdc++-v3/configure
+@@ -4005,6 +4005,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5740,7 +5745,7 @@
+   enableval="$enable_clocale"
+ 
+       case "$enableval" in
+-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
+        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
+ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
+    { (exit 1); exit 1; }; } ;;
+@@ -5765,6 +5770,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      linux-uclibc*)
++        enable_clocale_flag=uclibc
++	;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+@@ -5995,6 +6003,76 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      echo "$as_me:$LINENO: result: uclibc" >&5
++echo "${ECHO_T}uclibc" >&6
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      # Extract the first word of "msgfmt", so it can be a program name with args.
++set dummy msgfmt; ac_word=$2
++echo "$as_me:$LINENO: checking for $ac_word" >&5
++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  if test -n "$check_msgfmt"; then
++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++    ac_cv_prog_check_msgfmt="yes"
++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++
++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
++fi
++fi
++check_msgfmt=$ac_cv_prog_check_msgfmt
++if test -n "$check_msgfmt"; then
++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
++echo "${ECHO_T}$check_msgfmt" >&6
++else
++  echo "$as_me:$LINENO: result: no" >&5
++echo "${ECHO_T}no" >&6
++fi
++
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++
++
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+--- gcc-4.1.0-dist/libstdc++-v3/configure.host
++++ gcc-4.1.0/libstdc++-v3/configure.host
+@@ -261,6 +261,12 @@
+     ;;
+ esac
+ 
++# Override for uClibc since linux-uclibc gets mishandled above.
++case "${host_os}" in
++  *-uclibc*)
++    os_include_dir="os/uclibc"
++    ;;
++esac
+ 
+ # Set any OS-dependent and CPU-dependent bits.
+ # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+--- gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4
++++ gcc-4.1.0/libstdc++-v3/crossconfig.m4
+@@ -143,6 +143,99 @@
+ 	;;
+     esac
+     ;;
++  *-uclibc*)
++# Temporary hack until we implement the float versions of the libm funcs
++    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
++      machine/endian.h machine/param.h sys/machine.h sys/types.h \
++      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
++    SECTION_FLAGS='-ffunction-sections -fdata-sections'
++    AC_SUBST(SECTION_FLAGS)
++    GLIBCXX_CHECK_LINKER_FEATURES
++    GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
++    GLIBCXX_CHECK_WCHAR_T_SUPPORT
++
++    # For LFS.
++    AC_DEFINE(HAVE_INT64_T)
++    case "$target" in
++      *-uclinux*)
++        # Don't enable LFS with uClinux
++        ;;
++      *)
++        AC_DEFINE(_GLIBCXX_USE_LFS)
++    esac
++
++    # For showmanyc_helper().
++    AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
++    GLIBCXX_CHECK_POLL
++    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
++
++    # For xsputn_2().
++    AC_CHECK_HEADERS(sys/uio.h)
++    GLIBCXX_CHECK_WRITEV
++
++#     AC_DEFINE(HAVE_ACOSF)
++#     AC_DEFINE(HAVE_ASINF)
++#     AC_DEFINE(HAVE_ATANF)
++#     AC_DEFINE(HAVE_ATAN2F)
++    AC_DEFINE(HAVE_CEILF)
++    AC_DEFINE(HAVE_COPYSIGN)
++#     AC_DEFINE(HAVE_COPYSIGNF)
++#     AC_DEFINE(HAVE_COSF)
++#     AC_DEFINE(HAVE_COSHF)
++#     AC_DEFINE(HAVE_EXPF)
++#     AC_DEFINE(HAVE_FABSF)
++    AC_DEFINE(HAVE_FINITE)
++    AC_DEFINE(HAVE_FINITEF)
++    AC_DEFINE(HAVE_FLOORF)
++#     AC_DEFINE(HAVE_FMODF)
++#     AC_DEFINE(HAVE_FREXPF)
++    AC_DEFINE(HAVE_HYPOT)
++#     AC_DEFINE(HAVE_HYPOTF)
++    AC_DEFINE(HAVE_ISINF)
++    AC_DEFINE(HAVE_ISINFF)
++    AC_DEFINE(HAVE_ISNAN)
++    AC_DEFINE(HAVE_ISNANF)
++#     AC_DEFINE(HAVE_LOGF)
++#     AC_DEFINE(HAVE_LOG10F)
++#     AC_DEFINE(HAVE_MODFF)
++#     AC_DEFINE(HAVE_SINF)
++#     AC_DEFINE(HAVE_SINHF)
++#     AC_DEFINE(HAVE_SINCOS)
++#     AC_DEFINE(HAVE_SINCOSF)
++    AC_DEFINE(HAVE_SQRTF)
++#     AC_DEFINE(HAVE_TANF)
++#     AC_DEFINE(HAVE_TANHF)
++    if test x"long_double_math_on_this_cpu" = x"yes"; then
++      AC_MSG_ERROR([long_double_math_on_this_cpu is yes!])
++#       AC_DEFINE(HAVE_ACOSL)
++#       AC_DEFINE(HAVE_ASINL)
++#       AC_DEFINE(HAVE_ATANL)
++#       AC_DEFINE(HAVE_ATAN2L)
++#       AC_DEFINE(HAVE_CEILL)
++#       AC_DEFINE(HAVE_COPYSIGNL)
++#       AC_DEFINE(HAVE_COSL)
++#       AC_DEFINE(HAVE_COSHL)
++#       AC_DEFINE(HAVE_EXPL)
++#       AC_DEFINE(HAVE_FABSL)
++#       AC_DEFINE(HAVE_FINITEL)
++#       AC_DEFINE(HAVE_FLOORL)
++#       AC_DEFINE(HAVE_FMODL)
++#       AC_DEFINE(HAVE_FREXPL)
++#       AC_DEFINE(HAVE_HYPOTL)
++#       AC_DEFINE(HAVE_ISINFL)
++#       AC_DEFINE(HAVE_ISNANL)
++#       AC_DEFINE(HAVE_LOGL)
++#       AC_DEFINE(HAVE_LOG10L)
++#       AC_DEFINE(HAVE_MODFL)
++#       AC_DEFINE(HAVE_POWL)
++#       AC_DEFINE(HAVE_SINL)
++#       AC_DEFINE(HAVE_SINHL)
++#       AC_DEFINE(HAVE_SINCOSL)
++#       AC_DEFINE(HAVE_SQRTL)
++#       AC_DEFINE(HAVE_TANL)
++#       AC_DEFINE(HAVE_TANHL)
++    fi
++    ;;
+   *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu)
+     AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+       machine/endian.h machine/param.h sys/machine.h sys/types.h \
+@@ -157,7 +250,7 @@
+     AC_DEFINE(HAVE_INT64_T)
+     case "$target" in
+       *-uclinux*)
+-        # Don't enable LFS with uClibc
++        # Don't enable LFS with uClinux
+         ;;
+       *)
+         AC_DEFINE(_GLIBCXX_USE_LFS)
+--- gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h
++++ gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h
+@@ -101,7 +101,9 @@
+ using std::wmemcpy;
+ using std::wmemmove;
+ using std::wmemset;
++#if _GLIBCXX_HAVE_WCSFTIME
+ using std::wcsftime;
++#endif
+ 
+ #if _GLIBCXX_USE_C99
+ using std::wcstold;
+--- gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h
++++ gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h
+@@ -180,7 +180,9 @@
+   using ::wcscoll;
+   using ::wcscpy;
+   using ::wcscspn;
++#if _GLIBCXX_HAVE_WCSFTIME
+   using ::wcsftime;
++#endif
+   using ::wcslen;
+   using ::wcsncat;
+   using ::wcsncmp;
diff --git a/patches/gcc/4.1.1/300-libstdc++-pic.patch b/patches/gcc/4.1.1/300-libstdc++-pic.patch
new file mode 100644
index 00000000..560bcb23
--- /dev/null
+++ b/patches/gcc/4.1.1/300-libstdc++-pic.patch
@@ -0,0 +1,50 @@
+# DP: Build and install libstdc++_pic.a library.
+
+--- gcc/libstdc++-v3/src/Makefile.am
++++ gcc/libstdc++-v3/src/Makefile.am
+@@ -214,6 +214,12 @@
+ 	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@
+ 
+ 
++install-exec-local:
++ifeq ($(enable_shared),yes)
++	$(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++endif
++
+ # Added bits to build debug library.
+ if GLIBCXX_BUILD_DEBUG
+ all-local: build_debug
+--- gcc/libstdc++-v3/src/Makefile.in
++++ gcc/libstdc++-v3/src/Makefile.in
+@@ -627,7 +627,7 @@
+ 
+ install-data-am: install-data-local
+ 
+-install-exec-am: install-toolexeclibLTLIBRARIES
++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local
+ 
+ install-info: install-info-am
+ 
+@@ -660,6 +660,7 @@
+ 	distclean-libtool distclean-tags distdir dvi dvi-am html \
+ 	html-am info info-am install install-am install-data \
+ 	install-data-am install-data-local install-exec \
++	install-exec-local \
+ 	install-exec-am install-info install-info-am install-man \
+ 	install-strip install-toolexeclibLTLIBRARIES installcheck \
+ 	installcheck-am installdirs maintainer-clean \
+@@ -743,6 +743,13 @@
+ install_debug:
+ 	(cd ${debugdir} && $(MAKE) \
+ 	toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install)
++
++install-exec-local:
++ifeq ($(enable_shared),yes)
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++endif
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
diff --git a/patches/gcc/4.1.1/301-missing-execinfo_h.patch b/patches/gcc/4.1.1/301-missing-execinfo_h.patch
new file mode 100644
index 00000000..0e2092f3
--- /dev/null
+++ b/patches/gcc/4.1.1/301-missing-execinfo_h.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/boehm-gc/include/gc.h-orig	2005-04-28 22:28:57.000000000 -0500
++++ gcc-4.0.0/boehm-gc/include/gc.h	2005-04-28 22:30:38.000000000 -0500
+@@ -500,7 +500,7 @@
+ #ifdef __linux__
+ # include <features.h>
+ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+-     && !defined(__ia64__)
++     && !defined(__ia64__) && !defined(__UCLIBC__)
+ #   ifndef GC_HAVE_BUILTIN_BACKTRACE
+ #     define GC_HAVE_BUILTIN_BACKTRACE
+ #   endif
diff --git a/patches/gcc/4.1.1/302-c99-snprintf.patch b/patches/gcc/4.1.1/302-c99-snprintf.patch
new file mode 100644
index 00000000..dfb22d68
--- /dev/null
+++ b/patches/gcc/4.1.1/302-c99-snprintf.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig	2005-04-29 00:08:41.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h	2005-04-29 00:08:45.000000000 -0500
+@@ -142,7 +142,7 @@
+   using ::vsprintf;
+ }
+ 
+-#if _GLIBCXX_USE_C99
++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__)
+ 
+ #undef snprintf
+ #undef vfscanf
diff --git a/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch b/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch
new file mode 100644
index 00000000..2ccc80d9
--- /dev/null
+++ b/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch
@@ -0,0 +1,12 @@
+--- gcc-4.0.0/libstdc++-v3/configure-old	2005-04-30 22:04:48.061603912 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 22:06:13.678588152 -0500
+@@ -7194,6 +7194,9 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ #include <complex.h>
++#ifdef __UCLIBC__
++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs
++#endif
+ int
+ main ()
+ {
diff --git a/patches/gcc/4.1.1/304-index_macro.patch b/patches/gcc/4.1.1/304-index_macro.patch
new file mode 100644
index 00000000..1fac112f
--- /dev/null
+++ b/patches/gcc/4.1.1/304-index_macro.patch
@@ -0,0 +1,24 @@
+--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps	2006-03-24 01:49:51 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/rope	2006-03-24 01:49:37 +0100
+@@ -59,6 +59,9 @@
+ #include <bits/allocator.h>
+ #include <ext/hash_fun.h>
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ # ifdef __GC
+ #   define __GC_CONST const
+ # else
+--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps	2006-03-24 01:50:04 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h	2006-03-24 01:50:28 +0100
+@@ -53,6 +53,9 @@
+ #include <ext/memory> // For uninitialized_copy_n
+ #include <ext/numeric> // For power
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ namespace __gnu_cxx
+ {
+   using std::size_t;
diff --git a/patches/gcc/4.1.1/740-sh-pr24836.patch b/patches/gcc/4.1.1/740-sh-pr24836.patch
new file mode 100644
index 00000000..7992282c
--- /dev/null
+++ b/patches/gcc/4.1.1/740-sh-pr24836.patch
@@ -0,0 +1,25 @@
+http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836
+
+--- gcc/gcc/configure.ac	(revision 106699)
++++ gcc/gcc/configure.ac	(working copy)
+@@ -2446,7 +2446,7 @@
+ 	tls_first_minor=14
+ 	tls_as_opt="-m64 -Aesame --fatal-warnings"
+ 	;;
+-  sh-*-* | sh[34]-*-*)
++  sh-*-* | sh[34]*-*-*)
+     conftest_s='
+ 	.section ".tdata","awT",@progbits
+ foo:	.long	25
+--- gcc/gcc/configure
++++ gcc/gcc/configure
+@@ -14846,7 +14846,7 @@
+ 	tls_first_minor=14
+ 	tls_as_opt="-m64 -Aesame --fatal-warnings"
+ 	;;
+-  sh-*-* | sh[34]-*-*)
++  sh-*-* | sh[34]*-*-*)
+     conftest_s='
+ 	.section ".tdata","awT",@progbits
+ foo:	.long	25
diff --git a/patches/gcc/4.1.1/800-arm-bigendian.patch b/patches/gcc/4.1.1/800-arm-bigendian.patch
new file mode 100644
index 00000000..1fa5ae1c
--- /dev/null
+++ b/patches/gcc/4.1.1/800-arm-bigendian.patch
@@ -0,0 +1,67 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+See http://gcc.gnu.org/PR16350
+
+--- gcc-4.1.0/gcc/config/arm/linux-elf.h
++++ gcc-4.1.0/gcc/config/arm/linux-elf.h
+@@ -28,19 +28,33 @@
+ #undef  TARGET_VERSION
+ #define TARGET_VERSION  fputs (" (ARM GNU/Linux with ELF)", stderr);
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ #undef  TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (0)
++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" }
+ 
+ /* Now we define the strings used to build the spec file.  */
+ #undef  LIB_SPEC
+@@ -61,7 +75,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker " LINUX_TARGET_INTERPRETER "} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #undef  LINK_SPEC
+--- gcc-4.1.0/gcc/config.gcc
++++ gcc-4.1.0/gcc/config.gcc
+@@ -672,6 +672,11 @@
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" 
++	case $target in
++	arm*b-*)
++		tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
++		;;
++	esac
+ 	tmake_file="${tmake_file} t-linux arm/t-arm"
+ 	case ${target} in
+ 	arm*-*-linux-gnueabi)
diff --git a/patches/gcc/4.1.1/801-softfloat-fix.patch b/patches/gcc/4.1.1/801-softfloat-fix.patch
new file mode 100644
index 00000000..844c9a06
--- /dev/null
+++ b/patches/gcc/4.1.1/801-softfloat-fix.patch
@@ -0,0 +1,58 @@
+This patch (C) 2007 Yann E. MORIN
+Licensed under GPL v2.
+
+First hunk of this patch solves compiling uClibc-0.9.28{,.1} :
+
+make[1]: Entering directory `/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc'
+  LD libuClibc-0.9.29.so
+libc/libc_so.a(difftime.os): In function `difftime':
+difftime.c:(.text+0x8): undefined reference to `__floatsidf'
+difftime.c:(.text+0x2c): undefined reference to `__subdf3'
+libc/libc_so.a(_fpmaxtostr.os): In function `_fpmaxtostr':
+_fpmaxtostr.c:(.text+0xd4): undefined reference to `__nedf2'
+_fpmaxtostr.c:(.text+0xf8): undefined reference to `__eqdf2'
+_fpmaxtostr.c:(.text+0x114): undefined reference to `__divdf3'
+_fpmaxtostr.c:(.text+0x120): undefined reference to `__ltdf2'
+_fpmaxtostr.c:(.text+0x1c4): undefined reference to `__muldf3'
+_fpmaxtostr.c:(.text+0x388): undefined reference to `__gedf2'
+_fpmaxtostr.c:(.text+0x430): undefined reference to `__adddf3'
+libc/libc_so.a(__psfs_do_numeric.os): In function `__psfs_do_numeric':
+__psfs_do_numeric.c:(.text+0x520): undefined reference to `__truncdfsf2'
+libc/libc_so.a(strtof.os): In function `strtof':
+strtof.c:(.text+0x1c): undefined reference to `__extendsfdf2'
+/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/cc_core_prefix/lib/gcc/arm-linux-uclibc/4.1.1/libgcc.a(_fixunsdfsi.o):
+In function `__fixunsdfsi':
+libgcc2.c:(.text+0x34): undefined reference to `__fixdfsi'
+make[2]: *** [lib/libc.so] Error 1
+make[1]: *** [lib/libc.so.0] Error 2
+make[1]: Leaving directory `/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc'
+make: *** [/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc/lib/libc.a]
+Error 2
+
+The second hunk fixes building final gcc because soft-float implies using -lfloat (which we don't have).
+
+
+diff -dur gcc-4.1.1.no-softfloat-fix/gcc/config.gcc gcc-4.1.1/gcc/config.gcc
+--- gcc-4.1.1.no-softfloat-fix/gcc/config.gcc	2007-02-01 21:57:17.000000000 +0100
++++ gcc-4.1.1/gcc/config.gcc	2007-02-01 22:11:06.000000000 +0100
+@@ -690,7 +690,7 @@
+ 	    default_use_cxa_atexit=yes
+ 	    ;;
+ 	*)
+-	    tmake_file="$tmake_file arm/t-linux"
++	    tmake_file="$tmake_file arm/t-linux arm/t-arm-elf"
+ 	    ;;
+ 	esac
+ 	tm_file="$tm_file arm/aout.h arm/arm.h"
+diff -dur gcc-4.1.1.-lfloat/gcc/config/arm/linux-elf.h gcc-4.1.1/gcc/config/arm/linux-elf.h
+--- gcc-4.1.1.-lfloat/gcc/config/arm/linux-elf.h	2007-02-01 21:57:17.000000000 +0100
++++ gcc-4.1.1/gcc/config/arm/linux-elf.h	2007-02-01 23:00:42.000000000 +0100
+@@ -63,7 +63,7 @@
+    %{shared:-lc} \
+    %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
+ 
+-#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc"
++#define LIBGCC_SPEC "-lgcc"
+ 
+ #ifdef USE_UCLIBC
+ #define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0"
diff --git a/patches/gcc/4.1.2/100-uclibc-conf.patch b/patches/gcc/4.1.2/100-uclibc-conf.patch
new file mode 100644
index 00000000..49d576c7
--- /dev/null
+++ b/patches/gcc/4.1.2/100-uclibc-conf.patch
@@ -0,0 +1,544 @@
+--- gcc-4.1.0/gcc/config/t-linux-uclibc
++++ gcc-4.1.0/gcc/config/t-linux-uclibc
+@@ -0,0 +1,5 @@
++# Remove glibc specific files added in t-linux
++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES))
++
++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc
++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH))
+--- gcc-4.1.0/gcc/config.gcc
++++ gcc-4.1.0/gcc/config.gcc
+@@ -1887,7 +1887,7 @@ s390x-ibm-tpf*)
+ 	;;
+ sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \
+ sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \
+-  sh-*-linux* | sh[346lbe]*-*-linux* | \
++  sh*-*-linux* | sh[346lbe]*-*-linux* | \
+   sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \
+    sh64-*-netbsd* | sh64l*-*-netbsd*)
+ 	tmake_file="${tmake_file} sh/t-sh sh/t-elf"
+@@ -2341,6 +2341,12 @@ m32c-*-elf*)
+ 	;;
+ esac
+ 
++# Rather than hook into each target, just do it after all the linux
++# targets have been processed
++case ${target} in
++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc"
++esac
++
+ case ${target} in
+ i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1)
+ 	tmake_file="${tmake_file} i386/t-gmm_malloc"
+--- gcc-4.1.0/boehm-gc/configure
++++ gcc-4.1.0/boehm-gc/configure
+@@ -4320,6 +4320,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/configure
++++ gcc-4.1.0/configure
+@@ -1133,7 +1133,7 @@ no)
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.1.0/configure.in
++++ gcc-4.1.0/configure.in
+@@ -341,7 +341,7 @@ no)
+     ;;
+ "")
+     case "${target}" in
+-    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu)
++    *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*)
+         # Enable libmudflap by default in GNU and friends.
+ 	;;
+     *-*-freebsd*)
+--- gcc-4.1.0/contrib/regression/objs-gcc.sh
++++ gcc-4.1.0/contrib/regression/objs-gcc.sh
+@@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H
+  then
+   make all-gdb all-dejagnu all-ld || exit 1
+   make install-gdb install-dejagnu install-ld || exit 1
++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
++ then
++  make all-gdb all-dejagnu all-ld || exit 1
++  make install-gdb install-dejagnu install-ld || exit 1
+ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
+   make bootstrap || exit 1
+   make install || exit 1
+--- gcc-4.1.0/gcc/config/alpha/linux-elf.h
++++ gcc-4.1.0/gcc/config/alpha/linux-elf.h
+@@ -27,7 +27,11 @@ Boston, MA 02110-1301, USA.  */
+ #define SUBTARGET_EXTRA_SPECS \
+ { "elf_dynamic_linker", ELF_DYNAMIC_LINKER },
+ 
++#if defined USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
+ #define ELF_DYNAMIC_LINKER	"/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax}		\
+   %{O*:-O3} %{!O*:-O1}						\
+--- gcc-4.1.0/gcc/config/arm/linux-elf.h
++++ gcc-4.1.0/gcc/config/arm/linux-elf.h
+@@ -51,7 +51,11 @@
+ 
+ #define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc"
+ 
++#ifdef USE_UCLIBC
++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0"
++#else
+ #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.2"
++#endif
+ 
+ #define LINUX_TARGET_LINK_SPEC  "%{h*} %{version:-v} \
+    %{b} \
+--- gcc-4.1.0/gcc/config/cris/linux.h
++++ gcc-4.1.0/gcc/config/cris/linux.h
+@@ -73,6 +73,25 @@ Boston, MA 02110-1301, USA.  */
+ #undef CRIS_DEFAULT_CPU_VERSION
+ #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG
+ 
++#ifdef USE_UCLIBC
++
++#undef CRIS_SUBTARGET_VERSION
++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc"
++
++#undef CRIS_LINK_SUBTARGET_SPEC
++#define CRIS_LINK_SUBTARGET_SPEC \
++ "-mcrislinux\
++  -rpath-link include/asm/../..%s\
++  %{shared} %{static}\
++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\
++  %{!shared: \
++    %{!static: \
++      %{rdynamic:-export-dynamic} \
++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \
++  %{!r:%{O2|O3: --gc-sections}}"
++
++#else  /* USE_UCLIBC */
++
+ #undef CRIS_SUBTARGET_VERSION
+ #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu"
+ 
+@@ -87,6 +106,8 @@ Boston, MA 02110-1301, USA.  */
+   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\
+   %{!r:%{O2|O3: --gc-sections}}"
+ 
++#endif  /* USE_UCLIBC */
++
+ 
+ /* Node: Run-time Target */
+ 
+--- gcc-4.1.0/gcc/config/i386/linux.h
++++ gcc-4.1.0/gcc/config/i386/linux.h
+@@ -107,6 +107,11 @@ Boston, MA 02110-1301, USA.  */
+ #define LINK_EMULATION "elf_i386"
+ #define DYNAMIC_LINKER "/lib/ld-linux.so.2"
+ 
++#if defined USE_UCLIBC
++#undef DYNAMIC_LINKER
++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#endif
++
+ #undef  SUBTARGET_EXTRA_SPECS
+ #define SUBTARGET_EXTRA_SPECS \
+   { "link_emulation", LINK_EMULATION },\
+--- gcc-4.1.0/gcc/config/i386/linux64.h
++++ gcc-4.1.0/gcc/config/i386/linux64.h
+@@ -54,14 +54,21 @@ Boston, MA 02110-1301, USA.  */
+    When the -shared link option is used a final link is not being
+    done.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+-      %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \
++      %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \
++      %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \
+     %{static:-static}}"
+ 
+ /* Similar to standard Linux, but adding -ffast-math support.  */
+--- gcc-4.1.0/gcc/config/ia64/linux.h
++++ gcc-4.1.0/gcc/config/ia64/linux.h
+@@ -37,13 +37,18 @@ do {						\
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ 
+--- gcc-4.1.0/gcc/config/m68k/linux.h
++++ gcc-4.1.0/gcc/config/m68k/linux.h
+@@ -123,12 +123,17 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef	LINK_SPEC
+ #define LINK_SPEC "-m m68kelf %{shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+     %{static}}"
+ 
+ /* For compatibility with linux/a.out */
+--- gcc-4.1.0/gcc/config/mips/linux.h
++++ gcc-4.1.0/gcc/config/mips/linux.h
+@@ -105,6 +105,11 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* Borrowed from sparc/linux.h */
+ #undef LINK_SPEC
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #define LINK_SPEC \
+  "%(endian_spec) \
+   %{shared:-shared} \
+@@ -112,7 +117,7 @@ Boston, MA 02110-1301, USA.  */
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ #undef SUBTARGET_ASM_SPEC
+--- gcc-4.1.0/gcc/config/pa/pa-linux.h
++++ gcc-4.1.0/gcc/config/pa/pa-linux.h
+@@ -49,13 +49,18 @@ Boston, MA 02110-1301, USA.  */
+ /* Define this for shared library support because it isn't in the main
+    linux.h file.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1"
++#endif
+ #undef LINK_SPEC
+ #define LINK_SPEC "\
+   %{shared:-shared} \
+   %{!shared: \
+     %{!static: \
+       %{rdynamic:-export-dynamic} \
+-      %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
++      %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+       %{static:-static}}"
+ 
+ /* glibc's profiling functions don't need gcc to allocate counters.  */
+--- gcc-4.1.0/gcc/config/rs6000/linux.h
++++ gcc-4.1.0/gcc/config/rs6000/linux.h
+@@ -72,7 +72,11 @@
+ #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
+ 
+ #undef	LINK_OS_DEFAULT_SPEC
++#ifdef USE_UCLIBC
++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)"
++#else
+ #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
++#endif
+ 
+ #define LINK_GCC_C_SEQUENCE_SPEC \
+   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+--- gcc-4.1.0/gcc/config/rs6000/sysv4.h
++++ gcc-4.1.0/gcc/config/rs6000/sysv4.h
+@@ -866,6 +866,7 @@ extern int fixuplabelno;
+   mcall-linux  : %(link_os_linux)       ; \
+   mcall-gnu    : %(link_os_gnu)         ; \
+   mcall-netbsd : %(link_os_netbsd)      ; \
++  mcall-linux-uclibc : %(link_os_linux_uclibc); \
+   mcall-openbsd: %(link_os_openbsd)     ; \
+                : %(link_os_default)     }"
+ 
+@@ -1043,6 +1044,10 @@ extern int fixuplabelno;
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+ 
++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++  %{rdynamic:-export-dynamic} \
++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}"
++
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+ # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+ #endif
+@@ -1209,6 +1214,7 @@ ncrtn.o%s"
+   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
+   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
+   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\
+   { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
+   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
+   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
+--- gcc-4.1.0/gcc/config/s390/linux.h
++++ gcc-4.1.0/gcc/config/s390/linux.h
+@@ -77,6 +77,13 @@ Software Foundation, 51 Franklin Street,
+ #define MULTILIB_DEFAULTS { "m31" }
+ #endif
+ 
++#ifdef USE_UCLIBC
++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0"
++#else
++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1"
++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC \
+   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
+@@ -86,8 +93,8 @@ Software Foundation, 51 Franklin Street,
+       %{!static: \
+ 	%{rdynamic:-export-dynamic} \
+ 	%{!dynamic-linker: \
+-          %{m31:-dynamic-linker /lib/ld.so.1} \
+-          %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
++          %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \
++          %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}"
+ 
+ 
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc-4.1.0/gcc/config/sh/linux.h
++++ gcc-4.1.0/gcc/config/sh/linux.h
+@@ -56,12 +56,21 @@ Boston, MA 02110-1301, USA.  */
+ #undef SUBTARGET_LINK_EMUL_SUFFIX
+ #define SUBTARGET_LINK_EMUL_SUFFIX "_linux"
+ #undef SUBTARGET_LINK_SPEC
++#ifdef USE_UCLIBC
++#define SUBTARGET_LINK_SPEC \
++  "%{shared:-shared} \
++   %{!static: \
++     %{rdynamic:-export-dynamic} \
++     %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
++   %{static:-static}"
++#else
+ #define SUBTARGET_LINK_SPEC \
+   "%{shared:-shared} \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
+    %{static:-static}"
++#endif
+ 
+ /* Output assembler code to STREAM to call the profiler.  */
+ 
+--- gcc-4.1.0/gcc/config/sparc/linux.h
++++ gcc-4.1.0/gcc/config/sparc/linux.h
+@@ -125,6 +125,11 @@ Boston, MA 02110-1301, USA.  */
+ 
+ /* If ELF is the default format, we should not use /lib/elf.  */
+ 
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++#endif
+ #undef  LINK_SPEC
+ #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!mno-relax:%{!r:-relax}} \
+@@ -132,7 +137,7 @@ Boston, MA 02110-1301, USA.  */
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}}"
+ 
+ /* The sun bundled assembler doesn't accept -Yd, (and neither does gas).
+--- gcc-4.1.0/gcc/config/sparc/linux64.h
++++ gcc-4.1.0/gcc/config/sparc/linux64.h
+@@ -162,12 +162,17 @@ Boston, MA 02110-1301, USA.  */
+   { "link_arch_default", LINK_ARCH_DEFAULT_SPEC },	  \
+   { "link_arch",	 LINK_ARCH_SPEC },
+     
++#ifdef USE_UCLIBC
++#define ELF_DYNAMIC_LINKER	"/lib/ld-uClibc.so.0"
++#else
++#define ELF_DYNAMIC_LINKER  "/lib/ld-linux.so.2"
++#endif
+ #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \
+   %{!shared: \
+     %{!ibcs: \
+       %{!static: \
+         %{rdynamic:-export-dynamic} \
+-        %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
++        %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \
+         %{static:-static}}} \
+ "
+ 
+--- gcc-4.1.0/libffi/configure
++++ gcc-4.1.0/libffi/configure
+@@ -3457,6 +3457,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libgfortran/configure
++++ gcc-4.1.0/libgfortran/configure
+@@ -3699,6 +3699,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libjava/configure
++++ gcc-4.1.0/libjava/configure
+@@ -5137,6 +5137,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libmudflap/configure
++++ gcc-4.1.0/libmudflap/configure
+@@ -5382,6 +5382,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libobjc/configure
++++ gcc-4.1.0/libobjc/configure
+@@ -3312,6 +3312,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+--- gcc-4.1.0/libtool.m4
++++ gcc-4.1.0/libtool.m4
+@@ -743,6 +743,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$']
+--- gcc-4.1.0/ltconfig
++++ gcc-4.1.0/ltconfig
+@@ -603,6 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-
+ 
+ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+ case $host_os in
++linux-uclibc*) ;;
+ linux-gnu*) ;;
+ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+ esac
+@@ -1274,6 +1275,23 @@ linux-gnu*)
+   dynamic_linker='GNU/Linux ld.so'
+   ;;
+ 
++linux-uclibc*)
++  version_type=linux
++  need_lib_prefix=no
++  need_version=no
++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
++  soname_spec='${libname}${release}.so$major'
++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
++  shlibpath_var=LD_LIBRARY_PATH
++  shlibpath_overrides_runpath=no
++  # This implies no fast_install, which is unacceptable.
++  # Some rework will be needed to allow for fast_install
++  # before this can be enabled.
++  hardcode_into_libs=yes
++  # Assume using the uClibc dynamic linker.
++  dynamic_linker="uClibc ld.so"
++  ;;
++
+ netbsd*)
+   need_lib_prefix=no
+   need_version=no
+--- gcc-4.1.0/zlib/configure
++++ gcc-4.1.0/zlib/configure
+@@ -3426,6 +3426,11 @@ linux-gnu*)
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
diff --git a/patches/gcc/4.1.2/110-arm-eabi.patch b/patches/gcc/4.1.2/110-arm-eabi.patch
new file mode 100644
index 00000000..acebe530
--- /dev/null
+++ b/patches/gcc/4.1.2/110-arm-eabi.patch
@@ -0,0 +1,27 @@
+--- gcc-2005q3-1.orig/gcc/config.gcc	2005-10-31 19:02:54.000000000 +0300
++++ gcc-2005q3-1/gcc/config.gcc	2006-01-27 01:09:09.000000000 +0300
+@@ -674,7 +674,7 @@
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" 
+ 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-arm"
+ 	case ${target} in
+-	arm*-*-linux-gnueabi)
++	arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi)
+ 	    tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h"
+ 	    tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
+   	    # The BPABI long long divmod functions return a 128-bit value in 
+
+diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h
+--- gcc-2005q3-2/gcc/config/arm/linux-eabi.h	2005-12-07 23:14:16.000000000 +0300
++++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h	2006-03-29 19:02:34.000000000 +0400
+@@ -53,7 +53,11 @@
+ /* Use ld-linux.so.3 so that it will be possible to run "classic"
+    GNU/Linux binaries on an EABI system.  */
+ #undef LINUX_TARGET_INTERPRETER
++#ifdef USE_UCLIBC
++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0"
++#else
+ #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3"
++#endif
+ 
+ /* At this point, bpabi.h will have clobbered LINK_SPEC.  We want to
+    use the GNU/Linux version, not the generic BPABI version.  */
diff --git a/patches/gcc/4.1.2/200-uclibc-locale.patch b/patches/gcc/4.1.2/200-uclibc-locale.patch
new file mode 100644
index 00000000..e5d712e7
--- /dev/null
+++ b/patches/gcc/4.1.2/200-uclibc-locale.patch
@@ -0,0 +1,3239 @@
+--- gcc-4.1.0-dist/libstdc++-v3/acinclude.m4
++++ gcc-4.1.0/libstdc++-v3/acinclude.m4
+@@ -1071,7 +1071,7 @@
+   AC_MSG_CHECKING([for C locale to use])
+   GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+     [use MODEL for target locale package],
+-    [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++    [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto])
+   
+   # If they didn't use this option switch, or if they specified --enable
+   # with no specific model, we'll have to look for one.  If they
+@@ -1087,6 +1087,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      *-uclibc*)
++        enable_clocale_flag=uclibc
++        ;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         AC_EGREP_CPP([_GLIBCXX_ok], [
+         #include <features.h>
+@@ -1230,6 +1233,40 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      AC_MSG_RESULT(uclibc)
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++      AC_SUBST(glibcxx_MOFILES)
++      AC_SUBST(glibcxx_POFILES)
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h
+@@ -0,0 +1,63 @@
++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*-
++
++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++// Written by Jakub Jelinek <jakub@redhat.com>
++
++#include <bits/c++config.h>
++#include <clocale>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning clean this up
++#endif
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++                                                  
++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l;
++extern "C" __typeof(strcoll_l) __strcoll_l;
++extern "C" __typeof(strftime_l) __strftime_l;
++extern "C" __typeof(strtod_l) __strtod_l;
++extern "C" __typeof(strtof_l) __strtof_l;
++extern "C" __typeof(strtold_l) __strtold_l;
++extern "C" __typeof(strxfrm_l) __strxfrm_l;
++extern "C" __typeof(newlocale) __newlocale;
++extern "C" __typeof(freelocale) __freelocale;
++extern "C" __typeof(duplocale) __duplocale;
++extern "C" __typeof(uselocale) __uselocale;
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++extern "C" __typeof(iswctype_l) __iswctype_l;
++extern "C" __typeof(towlower_l) __towlower_l;
++extern "C" __typeof(towupper_l) __towupper_l;
++extern "C" __typeof(wcscoll_l) __wcscoll_l;
++extern "C" __typeof(wcsftime_l) __wcsftime_l;
++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l;
++extern "C" __typeof(wctype_l) __wctype_l;
++#endif 
++
++#endif // GLIBC 2.3 and later
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc
+@@ -0,0 +1,152 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <cerrno>  // For errno
++#include <locale>
++#include <stdexcept>
++#include <langinfo.h>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B))
++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B))
++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B))
++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B))
++#define __strtof_l(S, E, L)         strtof((S), (E))
++#define __strtod_l(S, E, L)         strtod((S), (E))
++#define __strtold_l(S, E, L)        strtold((S), (E))
++#warning should dummy __newlocale check for C|POSIX ?
++#define __newlocale(a, b, c)        NULL
++#define __freelocale(a)             ((void)0)
++#define __duplocale(a)              __c_locale()
++#endif
++
++namespace std 
++{
++  template<>
++    void
++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      float __f = __strtof_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __f;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, 
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      double __d = __strtod_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __d;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  template<>
++    void
++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err,
++		   const __c_locale& __cloc)
++    {
++      char* __sanity;
++      errno = 0;
++      long double __ld = __strtold_l(__s, &__sanity, __cloc);
++      if (__sanity != __s && errno != ERANGE)
++	__v = __ld;
++      else
++	__err |= ios_base::failbit;
++    }
++
++  void
++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, 
++				    __c_locale __old)
++  {
++    __cloc = __newlocale(1 << LC_ALL, __s, __old);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    if (!__cloc)
++      {
++	// This named locale is not supported by the underlying OS.
++	__throw_runtime_error(__N("locale::facet::_S_create_c_locale "
++			      "name not valid"));
++      }
++#endif
++  }
++  
++  void
++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc)
++  {
++    if (__cloc && _S_get_c_locale() != __cloc)
++      __freelocale(__cloc); 
++  }
++
++  __c_locale
++  locale::facet::_S_clone_c_locale(__c_locale& __cloc)
++  { return __duplocale(__cloc); }
++} // namespace std
++
++namespace __gnu_cxx
++{
++  const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] =
++    {
++      "LC_CTYPE", 
++      "LC_NUMERIC",
++      "LC_TIME", 
++      "LC_COLLATE", 
++      "LC_MONETARY",
++      "LC_MESSAGES", 
++#if _GLIBCXX_NUM_CATEGORIES != 0
++      "LC_PAPER", 
++      "LC_NAME", 
++      "LC_ADDRESS",
++      "LC_TELEPHONE", 
++      "LC_MEASUREMENT", 
++      "LC_IDENTIFICATION" 
++#endif
++    };
++}
++
++namespace std
++{
++  const char* const* const locale::_S_categories = __gnu_cxx::category_names;
++}  // namespace std
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h
+@@ -0,0 +1,117 @@
++// Wrapper for underlying C-language localization -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.8  Standard locale categories.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifndef _C_LOCALE_H
++#define _C_LOCALE_H 1
++
++#pragma GCC system_header
++
++#include <cstring>              // get std::strlen
++#include <cstdio>               // get std::snprintf or std::sprintf
++#include <clocale>
++#include <langinfo.h>		// For codecvt
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC_HAS_LOCALE__
++#include <iconv.h>		// For codecvt using iconv, iconv_t
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++#include <libintl.h> 		// For messages
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning what is _GLIBCXX_C_LOCALE_GNU for
++#endif
++#define _GLIBCXX_C_LOCALE_GNU 1
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix categories
++#endif
++// #define _GLIBCXX_NUM_CATEGORIES 6
++#define _GLIBCXX_NUM_CATEGORIES 0
++ 
++#ifdef __UCLIBC_HAS_XLOCALE__
++namespace __gnu_cxx
++{
++  extern "C" __typeof(uselocale) __uselocale;
++}
++#endif
++
++namespace std
++{
++#ifdef __UCLIBC_HAS_XLOCALE__
++  typedef __locale_t		__c_locale;
++#else
++  typedef int*			__c_locale;
++#endif
++
++  // Convert numeric value of type _Tv to string and return length of
++  // string.  If snprintf is available use it, otherwise fall back to
++  // the unsafe sprintf which, in general, can be dangerous and should
++  // be avoided.
++  template<typename _Tv>
++    int
++    __convert_from_v(char* __out, 
++		     const int __size __attribute__ ((__unused__)),
++		     const char* __fmt,
++#ifdef __UCLIBC_HAS_XLOCALE__
++		     _Tv __v, const __c_locale& __cloc, int __prec)
++    {
++      __c_locale __old = __gnu_cxx::__uselocale(__cloc);
++#else
++		     _Tv __v, const __c_locale&, int __prec)
++    {
++# ifdef __UCLIBC_HAS_LOCALE__
++      char* __old = std::setlocale(LC_ALL, NULL);
++      char* __sav = new char[std::strlen(__old) + 1];
++      std::strcpy(__sav, __old);
++      std::setlocale(LC_ALL, "C");
++# endif
++#endif
++
++      const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __gnu_cxx::__uselocale(__old);
++#elif defined __UCLIBC_HAS_LOCALE__
++      std::setlocale(LC_ALL, __sav);
++      delete [] __sav;
++#endif
++      return __ret;
++    }
++}
++
++#endif
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc
+@@ -0,0 +1,306 @@
++// std::codecvt implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.5 - Template class codecvt
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++namespace std
++{
++  // Specializations.
++#ifdef _GLIBCXX_USE_WCHAR_T
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_out(state_type& __state, const intern_type* __from, 
++	 const intern_type* __from_end, const intern_type*& __from_next,
++	 extern_type* __to, extern_type* __to_end,
++	 extern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // wcsnrtombs is *very* fast but stops if encounters NUL characters:
++    // in case we fall back to wcrtomb and then continue, in a loop.
++    // NB: wcsnrtombs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0',
++						      __from_end - __from_next);
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	const size_t __conv = wcsnrtombs(__to_next, &__from_next,
++					 __from_chunk_end - __from_next,
++					 __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // wcrtomb.
++	    for (; __from < __from_next; ++__from)
++	      __to_next += wcrtomb(__to_next, *__from, &__tmp_state);
++	    __state = __tmp_state;
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    extern_type __buf[MB_LEN_MAX];
++	    __tmp_state = __state;
++	    const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state);
++	    if (__conv > static_cast<size_t>(__to_end - __to_next))
++	      __ret = partial;
++	    else
++	      {
++		memcpy(__to_next, __buf, __conv);
++		__state = __tmp_state;
++		__to_next += __conv;
++		++__from_next;
++	      }
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++  
++  codecvt_base::result
++  codecvt<wchar_t, char, mbstate_t>::
++  do_in(state_type& __state, const extern_type* __from, 
++	const extern_type* __from_end, const extern_type*& __from_next,
++	intern_type* __to, intern_type* __to_end,
++	intern_type*& __to_next) const
++  {
++    result __ret = ok;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we store a L'\0' and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++    for (__from_next = __from, __to_next = __to;
++	 __from_next < __from_end && __to_next < __to_end
++	 && __ret == ok;)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0',
++								  __from_end
++								  - __from_next));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __from_end;
++
++	__from = __from_next;
++	size_t __conv = mbsnrtowcs(__to_next, &__from_next,
++				   __from_chunk_end - __from_next,
++				   __to_end - __to_next, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (;; ++__to_next, __from += __conv)
++	      {
++		__conv = mbrtowc(__to_next, __from, __from_end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __from_next = __from;
++	    __state = __tmp_state;	    
++	    __ret = error;
++	  }
++	else if (__from_next && __from_next < __from_chunk_end)
++	  {
++	    // It is unclear what to return in this case (see DR 382). 
++	    __to_next += __conv;
++	    __ret = partial;
++	  }
++	else
++	  {
++	    __from_next = __from_chunk_end;
++	    __to_next += __conv;
++	  }
++
++	if (__from_next < __from_end && __ret == ok)
++	  {
++	    if (__to_next < __to_end)
++	      {
++		// XXX Probably wrong for stateful encodings
++		__tmp_state = __state;		
++		++__from_next;
++		*__to_next++ = L'\0';
++	      }
++	    else
++	      __ret = partial;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_encoding() const throw()
++  {
++    // XXX This implementation assumes that the encoding is
++    // stateless and is either single-byte or variable-width.
++    int __ret = 0;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    if (MB_CUR_MAX == 1)
++      __ret = 1;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }  
++
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_max_length() const throw()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++    // XXX Probably wrong for stateful encodings.
++    int __ret = MB_CUR_MAX;
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __ret;
++  }
++  
++  int 
++  codecvt<wchar_t, char, mbstate_t>::
++  do_length(state_type& __state, const extern_type* __from,
++	    const extern_type* __end, size_t __max) const
++  {
++    int __ret = 0;
++    state_type __tmp_state(__state);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_codecvt);
++#endif
++
++    // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
++    // in case we advance past it and then continue, in a loop.
++    // NB: mbsnrtowcs is a GNU extension
++  
++    // A dummy internal buffer is needed in order for mbsnrtocws to consider
++    // its fourth parameter (it wouldn't with NULL as first parameter).
++    wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) 
++							   * __max));
++    while (__from < __end && __max)
++      {
++	const extern_type* __from_chunk_end;
++	__from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0',
++								  __end
++								  - __from));
++	if (!__from_chunk_end)
++	  __from_chunk_end = __end;
++
++	const extern_type* __tmp_from = __from;
++	size_t __conv = mbsnrtowcs(__to, &__from,
++				   __from_chunk_end - __from,
++				   __max, &__state);
++	if (__conv == static_cast<size_t>(-1))
++	  {
++	    // In case of error, in order to stop at the exact place we
++	    // have to start again from the beginning with a series of
++	    // mbrtowc.
++	    for (__from = __tmp_from;; __from += __conv)
++	      {
++		__conv = mbrtowc(NULL, __from, __end - __from,
++				 &__tmp_state);
++		if (__conv == static_cast<size_t>(-1)
++		    || __conv == static_cast<size_t>(-2))
++		  break;
++	      }
++	    __state = __tmp_state;
++	    __ret += __from - __tmp_from;
++	    break;
++	  }
++	if (!__from)
++	  __from = __from_chunk_end;
++	
++	__ret += __from - __tmp_from;
++	__max -= __conv;
++
++	if (__from < __end && __max)
++	  {
++	    // XXX Probably wrong for stateful encodings
++	    __tmp_state = __state;
++	    ++__from;
++	    ++__ret;
++	    --__max;
++	  }
++      }
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++
++    return __ret; 
++  }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc
+@@ -0,0 +1,80 @@
++// std::collate implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2))
++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N))
++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2))
++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N))
++#endif
++
++namespace std
++{
++  // These are basically extensions to char_traits, and perhaps should
++  // be put there instead of here.
++  template<>
++    int 
++    collate<char>::_M_compare(const char* __one, const char* __two) const
++    { 
++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<char>::_M_transform(char* __to, const char* __from, 
++				size_t __n) const 
++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    int 
++    collate<wchar_t>::_M_compare(const wchar_t* __one, 
++				 const wchar_t* __two) const
++    {
++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
++    }
++  
++  template<>
++    size_t
++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
++				   size_t __n) const
++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc
+@@ -0,0 +1,314 @@
++// std::ctype implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions.
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __wctype_l(S, L)           wctype((S))
++#define __towupper_l(C, L)         towupper((C))
++#define __towlower_l(C, L)         towlower((C))
++#define __iswctype_l(C, M, L)      iswctype((C), (M))
++#endif
++
++namespace std
++{
++  // NB: The other ctype<char> specializations are in src/locale.cc and
++  // various /config/os/* files.
++  template<>
++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
++    : ctype<char>(0, false, __refs) 
++    { 		
++      if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	{
++	  this->_S_destroy_c_locale(this->_M_c_locale_ctype);
++	  this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper;
++	  this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower;
++	  this->_M_table = this->_M_c_locale_ctype->__ctype_b;
++#endif
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T  
++  ctype<wchar_t>::__wmask_type
++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
++  {
++    __wmask_type __ret;
++    switch (__m)
++      {
++      case space:
++	__ret = __wctype_l("space", _M_c_locale_ctype);
++	break;
++      case print:
++	__ret = __wctype_l("print", _M_c_locale_ctype);
++	break;
++      case cntrl:
++	__ret = __wctype_l("cntrl", _M_c_locale_ctype);
++	break;
++      case upper:
++	__ret = __wctype_l("upper", _M_c_locale_ctype);
++	break;
++      case lower:
++	__ret = __wctype_l("lower", _M_c_locale_ctype);
++	break;
++      case alpha:
++	__ret = __wctype_l("alpha", _M_c_locale_ctype);
++	break;
++      case digit:
++	__ret = __wctype_l("digit", _M_c_locale_ctype);
++	break;
++      case punct:
++	__ret = __wctype_l("punct", _M_c_locale_ctype);
++	break;
++      case xdigit:
++	__ret = __wctype_l("xdigit", _M_c_locale_ctype);
++	break;
++      case alnum:
++	__ret = __wctype_l("alnum", _M_c_locale_ctype);
++	break;
++      case graph:
++	__ret = __wctype_l("graph", _M_c_locale_ctype);
++	break;
++      default:
++	__ret = __wmask_type();
++      }
++    return __ret;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_toupper(wchar_t __c) const
++  { return __towupper_l(__c, _M_c_locale_ctype); }
++
++  const wchar_t*
++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++  
++  wchar_t
++  ctype<wchar_t>::do_tolower(wchar_t __c) const
++  { return __towlower_l(__c, _M_c_locale_ctype); }
++  
++  const wchar_t*
++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi)
++      {
++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype);
++        ++__lo;
++      }
++    return __hi;
++  }
++
++  bool
++  ctype<wchar_t>::
++  do_is(mask __m, wchar_t __c) const
++  { 
++    // The case of __m == ctype_base::space is particularly important,
++    // due to its use in many istream functions.  Therefore we deal with
++    // it first, exploiting the knowledge that on GNU systems _M_bit[5]
++    // is the mask corresponding to ctype_base::space.  NB: an encoding
++    // change would not affect correctness!
++    bool __ret = false;
++    if (__m == _M_bit[5])
++      __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype);
++    else
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__m & _M_bit[__bitcur])
++	    {
++	      if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype))
++		{
++		  __ret = true;
++		  break;
++		}
++	      else if (__m == _M_bit[__bitcur])
++		break;
++	    }
++      }
++    return __ret;    
++  }
++
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const
++  {
++    for (; __lo < __hi; ++__vec, ++__lo)
++      {
++	// Highest bitmask in ctype_base == 10, but extra in "C"
++	// library for blank.
++	const size_t __bitmasksize = 11; 
++	mask __m = 0;
++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
++	  if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype))
++	    __m |= _M_bit[__bitcur];
++	*__vec = __m;
++      }
++    return __hi;
++  }
++  
++  const wchar_t* 
++  ctype<wchar_t>::
++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const
++  {
++    while (__lo < __hi && !this->do_is(__m, *__lo))
++      ++__lo;
++    return __lo;
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const
++  {
++    while (__lo < __hi && this->do_is(__m, *__lo) != 0)
++      ++__lo;
++    return __lo;
++  }
++
++  wchar_t
++  ctype<wchar_t>::
++  do_widen(char __c) const
++  { return _M_widen[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<wchar_t>::
++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
++  {
++    while (__lo < __hi)
++      {
++	*__dest = _M_widen[static_cast<unsigned char>(*__lo)];
++	++__lo;
++	++__dest;
++      }
++    return __hi;
++  }
++
++  char
++  ctype<wchar_t>::
++  do_narrow(wchar_t __wc, char __dfault) const
++  {
++    if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
++      return _M_narrow[__wc];
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    const int __c = wctob(__wc);
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return (__c == EOF ? __dfault : static_cast<char>(__c)); 
++  }
++
++  const wchar_t*
++  ctype<wchar_t>::
++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, 
++	    char* __dest) const
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    if (_M_narrow_ok)
++      while (__lo < __hi)
++	{
++	  if (*__lo >= 0 && *__lo < 128)
++	    *__dest = _M_narrow[*__lo];
++	  else
++	    {
++	      const int __c = wctob(*__lo);
++	      *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	    }
++	  ++__lo;
++	  ++__dest;
++	}
++    else
++      while (__lo < __hi)
++	{
++	  const int __c = wctob(*__lo);
++	  *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
++	  ++__lo;
++	  ++__dest;
++	}
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++    return __hi;
++  }
++
++  void
++  ctype<wchar_t>::_M_initialize_ctype()
++  {
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __c_locale __old = __uselocale(_M_c_locale_ctype);
++#endif
++    wint_t __i;
++    for (__i = 0; __i < 128; ++__i)
++      {
++	const int __c = wctob(__i);
++	if (__c == EOF)
++	  break;
++	else
++	  _M_narrow[__i] = static_cast<char>(__c);
++      }
++    if (__i == 128)
++      _M_narrow_ok = true;
++    else
++      _M_narrow_ok = false;
++    for (size_t __j = 0;
++	 __j < sizeof(_M_widen) / sizeof(wint_t); ++__j)
++      _M_widen[__j] = btowc(__j);
++
++    for (size_t __k = 0; __k <= 11; ++__k)
++      { 
++	_M_bit[__k] = static_cast<mask>(_ISbit(__k));
++	_M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]);
++      }
++#ifdef __UCLIBC_HAS_XLOCALE__
++    __uselocale(__old);
++#endif
++  }
++#endif //  _GLIBCXX_USE_WCHAR_T
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc
+@@ -0,0 +1,100 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix gettext stuff
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__dcgettext(const char *domainname,
++			     const char *msgid, int category);
++#undef gettext
++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES)
++#else
++#undef gettext
++#define gettext(msgid) (msgid)
++#endif
++
++namespace std
++{
++  // Specializations.
++  template<>
++    string
++    messages<char>::do_get(catalog, int, int, const string& __dfault) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str()));
++      __uselocale(__old);
++      return string(__msg);
++#elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      const char* __msg = gettext(__dfault.c_str());
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return string(__msg);
++#else
++      const char* __msg = gettext(__dfault.c_str());
++      return string(__msg);
++#endif
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    wstring
++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const
++    {
++# ifdef __UCLIBC_HAS_XLOCALE__
++      __c_locale __old = __uselocale(_M_c_locale_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      __uselocale(__old);
++      return _M_convert_from_char(__msg);
++# elif defined __UCLIBC_HAS_LOCALE__
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_messages);
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      setlocale(LC_ALL, __old);
++      free(__old);
++      return _M_convert_from_char(__msg);
++# else
++      char* __msg = gettext(_M_convert_to_char(__dfault));
++      return _M_convert_from_char(__msg);
++# endif
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h
+@@ -0,0 +1,121 @@
++// std::messages implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.7.1.2  messages functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix prototypes for *textdomain funcs
++#endif
++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__
++extern "C" char *__textdomain(const char *domainname);
++extern "C" char *__bindtextdomain(const char *domainname,
++				  const char *dirname);
++#else
++#undef __textdomain
++#undef __bindtextdomain
++#define __textdomain(D)           ((void)0)
++#define __bindtextdomain(D,P)     ((void)0)
++#endif
++
++  // Non-virtual member functions.
++  template<typename _CharT>
++     messages<_CharT>::messages(size_t __refs)
++     : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), 
++       _M_name_messages(_S_get_c_name())
++     { }
++
++  template<typename _CharT>
++     messages<_CharT>::messages(__c_locale __cloc, const char* __s, 
++				size_t __refs) 
++     : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL)
++     {
++       const size_t __len = std::strlen(__s) + 1;
++       char* __tmp = new char[__len];
++       std::memcpy(__tmp, __s, __len);
++       _M_name_messages = __tmp;
++
++       // Last to avoid leaking memory if new throws.
++       _M_c_locale_messages = _S_clone_c_locale(__cloc);
++     }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, 
++			   const char* __dir) const
++    { 
++      __bindtextdomain(__s.c_str(), __dir);
++      return this->do_open(__s, __loc); 
++    }
++
++  // Virtual member functions.
++  template<typename _CharT>
++    messages<_CharT>::~messages()
++    { 
++      if (_M_name_messages != _S_get_c_name())
++	delete [] _M_name_messages;
++      _S_destroy_c_locale(_M_c_locale_messages); 
++    }
++
++  template<typename _CharT>
++    typename messages<_CharT>::catalog 
++    messages<_CharT>::do_open(const basic_string<char>& __s, 
++			      const locale&) const
++    { 
++      // No error checking is done, assume the catalog exists and can
++      // be used.
++      __textdomain(__s.c_str());
++      return 0;
++    }
++
++  template<typename _CharT>
++    void    
++    messages<_CharT>::do_close(catalog) const 
++    { }
++
++   // messages_byname
++   template<typename _CharT>
++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs)
++     : messages<_CharT>(__refs) 
++     { 
++       if (this->_M_name_messages != locale::facet::_S_get_c_name())
++	 delete [] this->_M_name_messages;
++       char* __tmp = new char[std::strlen(__s) + 1];
++       std::strcpy(__tmp, __s);
++       this->_M_name_messages = __tmp;
++
++       if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
++	 {
++	   this->_S_destroy_c_locale(this->_M_c_locale_messages);
++	   this->_S_create_c_locale(this->_M_c_locale_messages, __s); 
++	 }
++     }
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc
+@@ -0,0 +1,692 @@
++// std::moneypunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning optimize this for uclibc
++#warning tailor for stub locale support
++#endif
++
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  // Construct and return valid pattern consisting of some combination of:
++  // space none symbol sign value
++  money_base::pattern
++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn)
++  { 
++    pattern __ret;
++
++    // This insanely complicated routine attempts to construct a valid
++    // pattern for use with monyepunct. A couple of invariants:
++
++    // if (__precedes) symbol -> value
++    // else value -> symbol
++    
++    // if (__space) space
++    // else none
++
++    // none == never first
++    // space never first or last
++
++    // Any elegant implementations of this are welcome.
++    switch (__posn)
++      {
++      case 0:
++      case 1:
++	// 1 The sign precedes the value and symbol.
++	__ret.field[0] = sign;
++	if (__space)
++	  {
++	    // Pattern starts with sign.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[3] = symbol;
++	      }
++	    __ret.field[2] = space;
++	  }
++	else
++	  {
++	    // Pattern starts with sign and ends with none.
++	    if (__precedes)
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[1] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 2:
++	// 2 The sign follows the value and symbol.
++	if (__space)
++	  {
++	    // Pattern either ends with sign.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[2] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[2] = symbol;
++	      }
++	    __ret.field[1] = space;
++	    __ret.field[3] = sign;
++	  }
++	else
++	  {
++	    // Pattern ends with sign then none.
++	    if (__precedes)
++	      {
++		__ret.field[0] = symbol;
++		__ret.field[1] = value;
++	      }
++	    else
++	      {
++		__ret.field[0] = value;
++		__ret.field[1] = symbol;
++	      }
++	    __ret.field[2] = sign;
++	    __ret.field[3] = none;
++	  }
++	break;
++      case 3:
++	// 3 The sign immediately precedes the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = sign;
++	    __ret.field[1] = symbol;	    
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;		
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = sign;
++		__ret.field[3] = symbol;
++	      }
++	    else
++	      {
++		__ret.field[1] = sign;
++		__ret.field[2] = symbol;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      case 4:
++	// 4 The sign immediately follows the symbol.
++	if (__precedes)
++	  {
++	    __ret.field[0] = symbol;
++	    __ret.field[1] = sign;
++	    if (__space)
++	      {
++		__ret.field[2] = space;
++		__ret.field[3] = value;
++	      }
++	    else
++	      {
++		__ret.field[2] = value;
++		__ret.field[3] = none;
++	      }
++	  }
++	else
++	  {
++	    __ret.field[0] = value;
++	    if (__space)
++	      {
++		__ret.field[1] = space;
++		__ret.field[2] = symbol;
++		__ret.field[3] = sign;
++	      }
++	    else
++	      {
++		__ret.field[1] = symbol;
++		__ret.field[2] = sign;
++		__ret.field[3] = none;
++	      }
++	  }
++	break;
++      default:
++	__ret = pattern();
++      }
++    return __ret;
++  }
++
++  template<> 
++    void
++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++						     const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, 
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == true
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    void
++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, 
++						      const char*)
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<char, false>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = "";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = "";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = "";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, 
++							__cloc));
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	  _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign);
++
++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  if (!__nposn)
++	    _M_data->_M_negative_sign = "()";
++	  else
++	    _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN,
++							__cloc);
++	  _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign);
++
++	  // _Intl == false
++	  _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++	  _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol);
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++	}
++    }
++
++  template<> 
++    moneypunct<char, true>::~moneypunct()
++    { delete _M_data; }
++
++  template<> 
++    moneypunct<char, false>::~moneypunct()
++    { delete _M_data; }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, 
++#ifdef __UCLIBC_HAS_XLOCALE__
++							const char*)
++#else
++							const char* __name)
++#endif
++    {
++      if (!_M_data)
++	_M_data = new __moneypunct_cache<wchar_t, true>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc));
++	  try
++	    {
++	      mbstate_t __state;
++	      size_t __len = strlen(__cpossign);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++	      _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++	      _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++	      
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++	      _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++	  catch (...)
++	    {
++	      delete _M_data;
++	      _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++	      __throw_exception_again;
++	    } 
++	  
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, 
++						      __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++							__pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++							__nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++  void
++  moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc,
++#ifdef __UCLIBC_HAS_XLOCALE__
++						       const char*)
++#else
++                                                       const char* __name)
++#endif
++  {
++    if (!_M_data)
++      _M_data = new __moneypunct_cache<wchar_t, false>;
++
++    if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++	  _M_data->_M_grouping = "";
++          _M_data->_M_grouping_size = 0;
++	  _M_data->_M_curr_symbol = L"";
++	  _M_data->_M_curr_symbol_size = 0;
++	  _M_data->_M_positive_sign = L"";
++	  _M_data->_M_positive_sign_size = 0;
++	  _M_data->_M_negative_sign = L"";
++	  _M_data->_M_negative_sign_size = 0;
++	  _M_data->_M_frac_digits = 0;
++	  _M_data->_M_pos_format = money_base::_S_default_pattern;
++	  _M_data->_M_neg_format = money_base::_S_default_pattern;
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < money_base::_S_end; ++__i)
++	    _M_data->_M_atoms[__i] =
++	      static_cast<wchar_t>(money_base::_S_atoms[__i]);
++	}
++      else
++	{
++	  // Named locale.
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __c_locale __old = __uselocale(__cloc);
++#else
++	  // Switch to named locale so that mbsrtowcs will work.
++	  char* __old = strdup(setlocale(LC_ALL, NULL));
++	  setlocale(LC_ALL, __name);
++#endif
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this... should be monetary
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++          union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++	  _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc);
++          _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++
++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc);
++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc);
++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc);
++
++	  wchar_t* __wcs_ps = 0;
++	  wchar_t* __wcs_ns = 0;
++	  const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc));
++	  try
++            {
++              mbstate_t __state;
++              size_t __len;
++              __len = strlen(__cpossign);
++              if (__len)
++                {
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ps = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state);
++		  _M_data->_M_positive_sign = __wcs_ps;
++		}
++	      else
++		_M_data->_M_positive_sign = L"";
++              _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign);
++	      
++	      __len = strlen(__cnegsign);
++	      if (!__nposn)
++		_M_data->_M_negative_sign = L"()";
++	      else if (__len)
++		{ 
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  __wcs_ns = new wchar_t[__len];
++		  mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state);
++		  _M_data->_M_negative_sign = __wcs_ns;
++		}
++	      else
++		_M_data->_M_negative_sign = L"";
++              _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign);
++
++	      // _Intl == true.
++	      __len = strlen(__ccurr);
++	      if (__len)
++		{
++		  ++__len;
++		  memset(&__state, 0, sizeof(mbstate_t));
++		  wchar_t* __wcs = new wchar_t[__len];
++		  mbsrtowcs(__wcs, &__ccurr, __len, &__state);
++		  _M_data->_M_curr_symbol = __wcs;
++		}
++	      else
++		_M_data->_M_curr_symbol = L"";
++              _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol);
++	    }
++          catch (...)
++	    {
++	      delete _M_data;
++              _M_data = 0;
++	      delete __wcs_ps;
++	      delete __wcs_ns;	      
++#ifdef __UCLIBC_HAS_XLOCALE__
++	      __uselocale(__old);
++#else
++	      setlocale(LC_ALL, __old);
++	      free(__old);
++#endif
++              __throw_exception_again;
++	    }
++
++	  _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc));
++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc));
++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc));
++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc));
++	  _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, 
++	                                                __pposn);
++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc));
++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc));
++	  _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, 
++	                                                __nposn);
++
++#ifdef __UCLIBC_HAS_XLOCALE__
++	  __uselocale(__old);
++#else
++	  setlocale(LC_ALL, __old);
++	  free(__old);
++#endif
++	}
++    }
++
++  template<> 
++    moneypunct<wchar_t, true>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++
++  template<> 
++    moneypunct<wchar_t, false>::~moneypunct()
++    {
++      if (_M_data->_M_positive_sign_size)
++	delete [] _M_data->_M_positive_sign;
++      if (_M_data->_M_negative_sign_size
++          && wcscmp(_M_data->_M_negative_sign, L"()") != 0)
++	delete [] _M_data->_M_negative_sign;
++      if (_M_data->_M_curr_symbol_size)
++	delete [] _M_data->_M_curr_symbol;
++      delete _M_data;
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc
+@@ -0,0 +1,173 @@
++// std::numpunct implementation details, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#define _LIBC
++#include <locale>
++#undef _LIBC
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<> 
++    void
++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = '.';
++	  _M_data->_M_thousands_sep = ',';
++
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i];
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j];
++	}
++      else
++	{
++	  // Named locale.
++	  _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, 
++							__cloc));
++	  _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, 
++							__cloc));
++
++	  // Check for NULL, which implies no grouping.
++	  if (_M_data->_M_thousands_sep == '\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = "true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = "false";
++      _M_data->_M_falsename_size = 5;
++    }
++ 
++  template<> 
++    numpunct<char>::~numpunct()
++    { delete _M_data; }
++   
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<> 
++    void
++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __numpunct_cache<wchar_t>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_data->_M_grouping = "";
++	  _M_data->_M_grouping_size = 0;
++	  _M_data->_M_use_grouping = false;
++
++	  _M_data->_M_decimal_point = L'.';
++	  _M_data->_M_thousands_sep = L',';
++
++	  // Use ctype::widen code without the facet...
++	  for (size_t __i = 0; __i < __num_base::_S_oend; ++__i)
++	    _M_data->_M_atoms_out[__i] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_out[__i]);
++
++	  for (size_t __j = 0; __j < __num_base::_S_iend; ++__j)
++	    _M_data->_M_atoms_in[__j] =
++	      static_cast<wchar_t>(__num_base::_S_atoms_in[__j]);
++	}
++      else
++	{
++	  // Named locale.
++	  // NB: In the GNU model wchar_t is always 32 bit wide.
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning fix this
++#endif
++#ifdef __UCLIBC__
++# ifdef __UCLIBC_HAS_XLOCALE__
++	  _M_data->_M_decimal_point = __cloc->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __cloc->thousands_sep_wc;
++# elif defined __UCLIBC_HAS_LOCALE__
++	  _M_data->_M_decimal_point = __global_locale->decimal_point_wc;
++	  _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc;
++# endif
++#else
++	  union { char *__s; wchar_t __w; } __u;
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
++	  _M_data->_M_decimal_point = __u.__w;
++
++	  __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc);
++	  _M_data->_M_thousands_sep = __u.__w;
++#endif
++
++	  if (_M_data->_M_thousands_sep == L'\0')
++	    _M_data->_M_grouping = "";
++	  else
++	    _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc);
++	  _M_data->_M_grouping_size = strlen(_M_data->_M_grouping);
++	}
++
++      // NB: There is no way to extact this info from posix locales.
++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc);
++      _M_data->_M_truename = L"true";
++      _M_data->_M_truename_size = 4;
++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc);
++      _M_data->_M_falsename = L"false";
++      _M_data->_M_falsename_size = 5;
++    }
++
++  template<> 
++    numpunct<wchar_t>::~numpunct()
++    { delete _M_data; }
++ #endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc
+@@ -0,0 +1,406 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++#include <locale>
++#include <bits/c++locale_internal.h>
++
++#ifdef __UCLIBC_MJN3_ONLY__
++#warning tailor for stub locale support
++#endif
++#ifndef __UCLIBC_HAS_XLOCALE__
++#define __nl_langinfo_l(N, L)         nl_langinfo((N))
++#endif
++
++namespace std
++{
++  template<>
++    void
++    __timepunct<char>::
++    _M_put(char* __s, size_t __maxlen, const char* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      const size_t __len = __strftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = strftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = '\0';
++    }
++
++  template<> 
++    void
++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<char>;
++
++      if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = "%m/%d/%y";
++	  _M_data->_M_date_era_format = "%m/%d/%y";
++	  _M_data->_M_time_format = "%H:%M:%S";
++	  _M_data->_M_time_era_format = "%H:%M:%S";
++	  _M_data->_M_date_time_format = "";
++	  _M_data->_M_date_time_era_format = "";
++	  _M_data->_M_am = "AM";
++	  _M_data->_M_pm = "PM";
++	  _M_data->_M_am_pm_format = "";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = "Sunday";
++	  _M_data->_M_day2 = "Monday";
++	  _M_data->_M_day3 = "Tuesday";
++	  _M_data->_M_day4 = "Wednesday";
++	  _M_data->_M_day5 = "Thursday";
++	  _M_data->_M_day6 = "Friday";
++	  _M_data->_M_day7 = "Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = "Sun";
++	  _M_data->_M_aday2 = "Mon";
++	  _M_data->_M_aday3 = "Tue";
++	  _M_data->_M_aday4 = "Wed";
++	  _M_data->_M_aday5 = "Thu";
++	  _M_data->_M_aday6 = "Fri";
++	  _M_data->_M_aday7 = "Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = "January";
++	  _M_data->_M_month02 = "February";
++	  _M_data->_M_month03 = "March";
++	  _M_data->_M_month04 = "April";
++	  _M_data->_M_month05 = "May";
++	  _M_data->_M_month06 = "June";
++	  _M_data->_M_month07 = "July";
++	  _M_data->_M_month08 = "August";
++	  _M_data->_M_month09 = "September";
++	  _M_data->_M_month10 = "October";
++	  _M_data->_M_month11 = "November";
++	  _M_data->_M_month12 = "December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = "Jan";
++	  _M_data->_M_amonth02 = "Feb";
++	  _M_data->_M_amonth03 = "Mar";
++	  _M_data->_M_amonth04 = "Apr";
++	  _M_data->_M_amonth05 = "May";
++	  _M_data->_M_amonth06 = "Jun";
++	  _M_data->_M_amonth07 = "Jul";
++	  _M_data->_M_amonth08 = "Aug";
++	  _M_data->_M_amonth09 = "Sep";
++	  _M_data->_M_amonth10 = "Oct";
++	  _M_data->_M_amonth11 = "Nov";
++	  _M_data->_M_amonth12 = "Dec";
++	}
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc);
++	  _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT,
++							     __cloc);
++	  _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc);
++	  _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc);
++	  _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc);
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc);
++	  _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc);
++	  _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc);
++	  _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc);
++	  _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc);
++	  _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc);
++	  _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc);
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc);
++	  _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc);
++	  _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc);
++	  _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc);
++	  _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc);
++	  _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc);
++	  _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc);
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc);
++	  _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc);
++	  _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc);
++	  _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc);
++	  _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc);
++	  _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc);
++	  _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc);
++	  _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc);
++	  _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc);
++	  _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc);
++	  _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc);
++	  _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc);
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc);
++	  _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc);
++	  _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc);
++	  _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc);
++	  _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc);
++	  _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc);
++	  _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc);
++	  _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc);
++	  _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc);
++	  _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc);
++	  _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc);
++	  _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc);
++	}
++    }
++
++#ifdef _GLIBCXX_USE_WCHAR_T
++  template<>
++    void
++    __timepunct<wchar_t>::
++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, 
++	   const tm* __tm) const
++    {
++#ifdef __UCLIBC_HAS_XLOCALE__
++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct);
++      const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm,
++					_M_c_locale_timepunct);
++#else
++      char* __old = strdup(setlocale(LC_ALL, NULL));
++      setlocale(LC_ALL, _M_name_timepunct);
++      const size_t __len = wcsftime(__s, __maxlen, __format, __tm);
++      setlocale(LC_ALL, __old);
++      free(__old);
++#endif
++      // Make sure __s is null terminated.
++      if (__len == 0)
++	__s[0] = L'\0';
++    }
++
++  template<> 
++    void
++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc)
++    {
++      if (!_M_data)
++	_M_data = new __timepunct_cache<wchar_t>;
++
++#warning wide time stuff
++//       if (!__cloc)
++	{
++	  // "C" locale
++	  _M_c_locale_timepunct = _S_get_c_locale();
++
++	  _M_data->_M_date_format = L"%m/%d/%y";
++	  _M_data->_M_date_era_format = L"%m/%d/%y";
++	  _M_data->_M_time_format = L"%H:%M:%S";
++	  _M_data->_M_time_era_format = L"%H:%M:%S";
++	  _M_data->_M_date_time_format = L"";
++	  _M_data->_M_date_time_era_format = L"";
++	  _M_data->_M_am = L"AM";
++	  _M_data->_M_pm = L"PM";
++	  _M_data->_M_am_pm_format = L"";
++
++	  // Day names, starting with "C"'s Sunday.
++	  _M_data->_M_day1 = L"Sunday";
++	  _M_data->_M_day2 = L"Monday";
++	  _M_data->_M_day3 = L"Tuesday";
++	  _M_data->_M_day4 = L"Wednesday";
++	  _M_data->_M_day5 = L"Thursday";
++	  _M_data->_M_day6 = L"Friday";
++	  _M_data->_M_day7 = L"Saturday";
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  _M_data->_M_aday1 = L"Sun";
++	  _M_data->_M_aday2 = L"Mon";
++	  _M_data->_M_aday3 = L"Tue";
++	  _M_data->_M_aday4 = L"Wed";
++	  _M_data->_M_aday5 = L"Thu";
++	  _M_data->_M_aday6 = L"Fri";
++	  _M_data->_M_aday7 = L"Sat";
++
++	  // Month names, starting with "C"'s January.
++	  _M_data->_M_month01 = L"January";
++	  _M_data->_M_month02 = L"February";
++	  _M_data->_M_month03 = L"March";
++	  _M_data->_M_month04 = L"April";
++	  _M_data->_M_month05 = L"May";
++	  _M_data->_M_month06 = L"June";
++	  _M_data->_M_month07 = L"July";
++	  _M_data->_M_month08 = L"August";
++	  _M_data->_M_month09 = L"September";
++	  _M_data->_M_month10 = L"October";
++	  _M_data->_M_month11 = L"November";
++	  _M_data->_M_month12 = L"December";
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  _M_data->_M_amonth01 = L"Jan";
++	  _M_data->_M_amonth02 = L"Feb";
++	  _M_data->_M_amonth03 = L"Mar";
++	  _M_data->_M_amonth04 = L"Apr";
++	  _M_data->_M_amonth05 = L"May";
++	  _M_data->_M_amonth06 = L"Jun";
++	  _M_data->_M_amonth07 = L"Jul";
++	  _M_data->_M_amonth08 = L"Aug";
++	  _M_data->_M_amonth09 = L"Sep";
++	  _M_data->_M_amonth10 = L"Oct";
++	  _M_data->_M_amonth11 = L"Nov";
++	  _M_data->_M_amonth12 = L"Dec";
++	}
++#if 0
++      else
++	{
++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc); 
++
++	  union { char *__s; wchar_t *__w; } __u;
++
++	  __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc);
++	  _M_data->_M_date_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc);
++	  _M_data->_M_date_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc);
++	  _M_data->_M_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc);
++	  _M_data->_M_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc);
++	  _M_data->_M_date_time_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc);
++	  _M_data->_M_date_time_era_format = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc);
++	  _M_data->_M_am = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc);
++	  _M_data->_M_pm = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc);
++	  _M_data->_M_am_pm_format = __u.__w;
++
++	  // Day names, starting with "C"'s Sunday.
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc);
++	  _M_data->_M_day1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc);
++	  _M_data->_M_day2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc);
++	  _M_data->_M_day3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc);
++	  _M_data->_M_day4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc);
++	  _M_data->_M_day5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc);
++	  _M_data->_M_day6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc);
++	  _M_data->_M_day7 = __u.__w;
++
++	  // Abbreviated day names, starting with "C"'s Sun.
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc);
++	  _M_data->_M_aday1 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc);
++	  _M_data->_M_aday2 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc);
++	  _M_data->_M_aday3 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc);
++	  _M_data->_M_aday4 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc);
++	  _M_data->_M_aday5 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc);
++	  _M_data->_M_aday6 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc);
++	  _M_data->_M_aday7 = __u.__w;
++
++	  // Month names, starting with "C"'s January.
++	  __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc);
++	  _M_data->_M_month01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc);
++	  _M_data->_M_month02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc);
++	  _M_data->_M_month03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc);
++	  _M_data->_M_month04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc);
++	  _M_data->_M_month05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc);
++	  _M_data->_M_month06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc);
++	  _M_data->_M_month07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc);
++	  _M_data->_M_month08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc);
++	  _M_data->_M_month09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc);
++	  _M_data->_M_month10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc);
++	  _M_data->_M_month11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc);
++	  _M_data->_M_month12 = __u.__w;
++
++	  // Abbreviated month names, starting with "C"'s Jan.
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc);
++	  _M_data->_M_amonth01 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc);
++	  _M_data->_M_amonth02 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc);
++	  _M_data->_M_amonth03 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc);
++	  _M_data->_M_amonth04 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc);
++	  _M_data->_M_amonth05 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc);
++	  _M_data->_M_amonth06 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc);
++	  _M_data->_M_amonth07 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc);
++	  _M_data->_M_amonth08 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc);
++	  _M_data->_M_amonth09 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc);
++	  _M_data->_M_amonth10 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc);
++	  _M_data->_M_amonth11 = __u.__w;
++	  __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc);
++	  _M_data->_M_amonth12 = __u.__w;
++	}
++#endif // 0
++    }
++#endif
++}
+--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h
++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h
+@@ -0,0 +1,76 @@
++// std::time_get, std::time_put implementation, GNU version -*- C++ -*-
++
++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.2.5.1.2 - time_get functions
++// ISO C++ 14882: 22.2.5.3.2 - time_put functions
++//
++
++// Written by Benjamin Kosnik <bkoz@redhat.com>
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) 
++    : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(_S_get_c_name())
++    { _M_initialize_timepunct(); }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
++				     size_t __refs) 
++    : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
++      _M_name_timepunct(NULL)
++    { 
++      const size_t __len = std::strlen(__s) + 1;
++      char* __tmp = new char[__len];
++      std::memcpy(__tmp, __s, __len);
++      _M_name_timepunct = __tmp;
++
++      try
++	{ _M_initialize_timepunct(__cloc); }
++      catch(...)
++	{
++	  delete [] _M_name_timepunct;
++	  __throw_exception_again;
++	}
++    }
++
++  template<typename _CharT>
++    __timepunct<_CharT>::~__timepunct()
++    { 
++      if (_M_name_timepunct != _S_get_c_name())
++	delete [] _M_name_timepunct;
++      delete _M_data; 
++      _S_destroy_c_locale(_M_c_locale_timepunct); 
++    }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h
+@@ -0,0 +1,64 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++/** @file ctype_base.h
++ *  This is an internal header file, included by other library headers.
++ *  You should not attempt to use it directly.
++ */
++
++// Information as gleaned from /usr/include/ctype.h
++  
++  /// @brief  Base class for ctype.
++  struct ctype_base
++  {
++    // Note: In uClibc, the following two types depend on configuration.
++ 
++    // Non-standard typedefs.
++    typedef const __ctype_touplow_t* __to_type;
++
++    // NB: Offsets into ctype<char>::_M_table force a particular size
++    // on the mask type. Because of this, we don't use an enum.
++    typedef __ctype_mask_t	mask;   
++    static const mask upper    	= _ISupper;
++    static const mask lower 	= _ISlower;
++    static const mask alpha 	= _ISalpha;
++    static const mask digit 	= _ISdigit;
++    static const mask xdigit 	= _ISxdigit;
++    static const mask space 	= _ISspace;
++    static const mask print 	= _ISprint;
++    static const mask graph 	= _ISalpha | _ISdigit | _ISpunct;
++    static const mask cntrl 	= _IScntrl;
++    static const mask punct 	= _ISpunct;
++    static const mask alnum 	= _ISalpha | _ISdigit;
++  };
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h
+@@ -0,0 +1,69 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
++// functions go in ctype.cc
++  
++  bool
++  ctype<char>::
++  is(mask __m, char __c) const
++  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
++
++  const char*
++  ctype<char>::
++  is(const char* __low, const char* __high, mask* __vec) const
++  {
++    while (__low < __high)
++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
++    return __high;
++  }
++
++  const char*
++  ctype<char>::
++  scan_is(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m))
++      ++__low;
++    return __low;
++  }
++
++  const char*
++  ctype<char>::
++  scan_not(mask __m, const char* __low, const char* __high) const
++  {
++    while (__low < __high 
++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0)
++      ++__low;
++    return __low;
++  }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h
+@@ -0,0 +1,92 @@
++// Locale support -*- C++ -*-
++
++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++//
++// ISO C++ 14882: 22.1  Locales
++//
++  
++// Information as gleaned from /usr/include/ctype.h
++
++  const ctype_base::mask*
++  ctype<char>::classic_table() throw()
++  { return __C_ctype_b; }
++
++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
++		     size_t __refs) 
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
++  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), 
++  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
++  {
++    _M_toupper = __C_ctype_toupper;
++    _M_tolower = __C_ctype_tolower;
++    _M_table = __table ? __table : __C_ctype_b;
++    memset(_M_widen, 0, sizeof(_M_widen));
++    memset(_M_narrow, 0, sizeof(_M_narrow));
++  }
++
++  char
++  ctype<char>::do_toupper(char __c) const
++  { return _M_toupper[static_cast<unsigned char>(__c)]; }
++
++  const char*
++  ctype<char>::do_toupper(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_toupper[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
++
++  char
++  ctype<char>::do_tolower(char __c) const
++  { return _M_tolower[static_cast<unsigned char>(__c)]; }
++
++  const char* 
++  ctype<char>::do_tolower(char* __low, const char* __high) const
++  {
++    while (__low < __high)
++      {
++	*__low = _M_tolower[static_cast<unsigned char>(*__low)];
++	++__low;
++      }
++    return __high;
++  }
+--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h
++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h
+@@ -0,0 +1,44 @@
++// Specific definitions for GNU/Linux  -*- C++ -*-
++
++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library 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 library 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 library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#ifndef _GLIBCXX_OS_DEFINES
++#define _GLIBCXX_OS_DEFINES 1
++
++// System-specific #define, typedefs, corrections, etc, go here.  This
++// file will come before all others.
++
++// This keeps isanum, et al from being propagated as macros.
++#define __NO_CTYPE 1
++
++#include <features.h>
++
++// We must not see the optimized string functions GNU libc defines.
++#define __NO_STRING_INLINES
++
++#endif
+--- gcc-4.1.0-dist/libstdc++-v3/configure
++++ gcc-4.1.0/libstdc++-v3/configure
+@@ -4005,6 +4005,11 @@
+   lt_cv_deplibs_check_method=pass_all
+   ;;
+ 
++linux-uclibc*)
++  lt_cv_deplibs_check_method=pass_all
++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so`
++  ;;
++
+ netbsd* | knetbsd*-gnu)
+   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
+@@ -5740,7 +5745,7 @@
+   enableval="$enable_clocale"
+ 
+       case "$enableval" in
+-       generic|gnu|ieee_1003.1-2001|yes|no|auto) ;;
++       generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;;
+        *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5
+ echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;}
+    { (exit 1); exit 1; }; } ;;
+@@ -5765,6 +5770,9 @@
+   # Default to "generic".
+   if test $enable_clocale_flag = auto; then
+     case ${target_os} in
++      linux-uclibc*)
++        enable_clocale_flag=uclibc
++	;;
+       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+         cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+@@ -5995,6 +6003,76 @@
+       CTIME_CC=config/locale/generic/time_members.cc
+       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
+       ;;
++    uclibc)
++      echo "$as_me:$LINENO: result: uclibc" >&5
++echo "${ECHO_T}uclibc" >&6
++
++      # Declare intention to use gettext, and add support for specific
++      # languages.
++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
++      ALL_LINGUAS="de fr"
++
++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
++      # Extract the first word of "msgfmt", so it can be a program name with args.
++set dummy msgfmt; ac_word=$2
++echo "$as_me:$LINENO: checking for $ac_word" >&5
++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
++if test "${ac_cv_prog_check_msgfmt+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  if test -n "$check_msgfmt"; then
++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++  IFS=$as_save_IFS
++  test -z "$as_dir" && as_dir=.
++  for ac_exec_ext in '' $ac_executable_extensions; do
++  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++    ac_cv_prog_check_msgfmt="yes"
++    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++    break 2
++  fi
++done
++done
++
++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
++fi
++fi
++check_msgfmt=$ac_cv_prog_check_msgfmt
++if test -n "$check_msgfmt"; then
++  echo "$as_me:$LINENO: result: $check_msgfmt" >&5
++echo "${ECHO_T}$check_msgfmt" >&6
++else
++  echo "$as_me:$LINENO: result: no" >&5
++echo "${ECHO_T}no" >&6
++fi
++
++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
++        USE_NLS=yes
++      fi
++      # Export the build objects.
++      for ling in $ALL_LINGUAS; do \
++        glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
++        glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
++      done
++
++
++
++      CLOCALE_H=config/locale/uclibc/c_locale.h
++      CLOCALE_CC=config/locale/uclibc/c_locale.cc
++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc
++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc
++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc
++      CMESSAGES_H=config/locale/uclibc/messages_members.h
++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc
++      CMONEY_CC=config/locale/uclibc/monetary_members.cc
++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc
++      CTIME_H=config/locale/uclibc/time_members.h
++      CTIME_CC=config/locale/uclibc/time_members.cc
++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h
++      ;;
+   esac
+ 
+   # This is where the testsuite looks for locale catalogs, using the
+--- gcc-4.1.0-dist/libstdc++-v3/configure.host
++++ gcc-4.1.0/libstdc++-v3/configure.host
+@@ -261,6 +261,12 @@
+     ;;
+ esac
+ 
++# Override for uClibc since linux-uclibc gets mishandled above.
++case "${host_os}" in
++  *-uclibc*)
++    os_include_dir="os/uclibc"
++    ;;
++esac
+ 
+ # Set any OS-dependent and CPU-dependent bits.
+ # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+--- gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4
++++ gcc-4.1.0/libstdc++-v3/crossconfig.m4
+@@ -143,6 +143,99 @@
+ 	;;
+     esac
+     ;;
++  *-uclibc*)
++# Temporary hack until we implement the float versions of the libm funcs
++    AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
++      machine/endian.h machine/param.h sys/machine.h sys/types.h \
++      fp.h float.h endian.h inttypes.h locale.h float.h stdint.h])
++    SECTION_FLAGS='-ffunction-sections -fdata-sections'
++    AC_SUBST(SECTION_FLAGS)
++    GLIBCXX_CHECK_LINKER_FEATURES
++    GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT
++    GLIBCXX_CHECK_WCHAR_T_SUPPORT
++
++    # For LFS.
++    AC_DEFINE(HAVE_INT64_T)
++    case "$target" in
++      *-uclinux*)
++        # Don't enable LFS with uClinux
++        ;;
++      *)
++        AC_DEFINE(_GLIBCXX_USE_LFS)
++    esac
++
++    # For showmanyc_helper().
++    AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
++    GLIBCXX_CHECK_POLL
++    GLIBCXX_CHECK_S_ISREG_OR_S_IFREG
++
++    # For xsputn_2().
++    AC_CHECK_HEADERS(sys/uio.h)
++    GLIBCXX_CHECK_WRITEV
++
++#     AC_DEFINE(HAVE_ACOSF)
++#     AC_DEFINE(HAVE_ASINF)
++#     AC_DEFINE(HAVE_ATANF)
++#     AC_DEFINE(HAVE_ATAN2F)
++    AC_DEFINE(HAVE_CEILF)
++    AC_DEFINE(HAVE_COPYSIGN)
++#     AC_DEFINE(HAVE_COPYSIGNF)
++#     AC_DEFINE(HAVE_COSF)
++#     AC_DEFINE(HAVE_COSHF)
++#     AC_DEFINE(HAVE_EXPF)
++#     AC_DEFINE(HAVE_FABSF)
++    AC_DEFINE(HAVE_FINITE)
++    AC_DEFINE(HAVE_FINITEF)
++    AC_DEFINE(HAVE_FLOORF)
++#     AC_DEFINE(HAVE_FMODF)
++#     AC_DEFINE(HAVE_FREXPF)
++    AC_DEFINE(HAVE_HYPOT)
++#     AC_DEFINE(HAVE_HYPOTF)
++    AC_DEFINE(HAVE_ISINF)
++    AC_DEFINE(HAVE_ISINFF)
++    AC_DEFINE(HAVE_ISNAN)
++    AC_DEFINE(HAVE_ISNANF)
++#     AC_DEFINE(HAVE_LOGF)
++#     AC_DEFINE(HAVE_LOG10F)
++#     AC_DEFINE(HAVE_MODFF)
++#     AC_DEFINE(HAVE_SINF)
++#     AC_DEFINE(HAVE_SINHF)
++#     AC_DEFINE(HAVE_SINCOS)
++#     AC_DEFINE(HAVE_SINCOSF)
++    AC_DEFINE(HAVE_SQRTF)
++#     AC_DEFINE(HAVE_TANF)
++#     AC_DEFINE(HAVE_TANHF)
++    if test x"long_double_math_on_this_cpu" = x"yes"; then
++      AC_MSG_ERROR([long_double_math_on_this_cpu is yes!])
++#       AC_DEFINE(HAVE_ACOSL)
++#       AC_DEFINE(HAVE_ASINL)
++#       AC_DEFINE(HAVE_ATANL)
++#       AC_DEFINE(HAVE_ATAN2L)
++#       AC_DEFINE(HAVE_CEILL)
++#       AC_DEFINE(HAVE_COPYSIGNL)
++#       AC_DEFINE(HAVE_COSL)
++#       AC_DEFINE(HAVE_COSHL)
++#       AC_DEFINE(HAVE_EXPL)
++#       AC_DEFINE(HAVE_FABSL)
++#       AC_DEFINE(HAVE_FINITEL)
++#       AC_DEFINE(HAVE_FLOORL)
++#       AC_DEFINE(HAVE_FMODL)
++#       AC_DEFINE(HAVE_FREXPL)
++#       AC_DEFINE(HAVE_HYPOTL)
++#       AC_DEFINE(HAVE_ISINFL)
++#       AC_DEFINE(HAVE_ISNANL)
++#       AC_DEFINE(HAVE_LOGL)
++#       AC_DEFINE(HAVE_LOG10L)
++#       AC_DEFINE(HAVE_MODFL)
++#       AC_DEFINE(HAVE_POWL)
++#       AC_DEFINE(HAVE_SINL)
++#       AC_DEFINE(HAVE_SINHL)
++#       AC_DEFINE(HAVE_SINCOSL)
++#       AC_DEFINE(HAVE_SQRTL)
++#       AC_DEFINE(HAVE_TANL)
++#       AC_DEFINE(HAVE_TANHL)
++    fi
++    ;;
+   *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu)
+     AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \
+       machine/endian.h machine/param.h sys/machine.h sys/types.h \
+@@ -157,7 +250,7 @@
+     AC_DEFINE(HAVE_INT64_T)
+     case "$target" in
+       *-uclinux*)
+-        # Don't enable LFS with uClibc
++        # Don't enable LFS with uClinux
+         ;;
+       *)
+         AC_DEFINE(_GLIBCXX_USE_LFS)
+--- gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h
++++ gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h
+@@ -101,7 +101,9 @@
+ using std::wmemcpy;
+ using std::wmemmove;
+ using std::wmemset;
++#if _GLIBCXX_HAVE_WCSFTIME
+ using std::wcsftime;
++#endif
+ 
+ #if _GLIBCXX_USE_C99
+ using std::wcstold;
+--- gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h
++++ gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h
+@@ -180,7 +180,9 @@
+   using ::wcscoll;
+   using ::wcscpy;
+   using ::wcscspn;
++#if _GLIBCXX_HAVE_WCSFTIME
+   using ::wcsftime;
++#endif
+   using ::wcslen;
+   using ::wcsncat;
+   using ::wcsncmp;
diff --git a/patches/gcc/4.1.2/300-libstdc++-pic.patch b/patches/gcc/4.1.2/300-libstdc++-pic.patch
new file mode 100644
index 00000000..560bcb23
--- /dev/null
+++ b/patches/gcc/4.1.2/300-libstdc++-pic.patch
@@ -0,0 +1,50 @@
+# DP: Build and install libstdc++_pic.a library.
+
+--- gcc/libstdc++-v3/src/Makefile.am
++++ gcc/libstdc++-v3/src/Makefile.am
+@@ -214,6 +214,12 @@
+ 	  $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@
+ 
+ 
++install-exec-local:
++ifeq ($(enable_shared),yes)
++	$(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++endif
++
+ # Added bits to build debug library.
+ if GLIBCXX_BUILD_DEBUG
+ all-local: build_debug
+--- gcc/libstdc++-v3/src/Makefile.in
++++ gcc/libstdc++-v3/src/Makefile.in
+@@ -627,7 +627,7 @@
+ 
+ install-data-am: install-data-local
+ 
+-install-exec-am: install-toolexeclibLTLIBRARIES
++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local
+ 
+ install-info: install-info-am
+ 
+@@ -660,6 +660,7 @@
+ 	distclean-libtool distclean-tags distdir dvi dvi-am html \
+ 	html-am info info-am install install-am install-data \
+ 	install-data-am install-data-local install-exec \
++	install-exec-local \
+ 	install-exec-am install-info install-info-am install-man \
+ 	install-strip install-toolexeclibLTLIBRARIES installcheck \
+ 	installcheck-am installdirs maintainer-clean \
+@@ -743,6 +743,13 @@
+ install_debug:
+ 	(cd ${debugdir} && $(MAKE) \
+ 	toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install)
++
++install-exec-local:
++ifeq ($(enable_shared),yes)
++	$(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o
++	$(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir)
++endif
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
diff --git a/patches/gcc/4.1.2/301-missing-execinfo_h.patch b/patches/gcc/4.1.2/301-missing-execinfo_h.patch
new file mode 100644
index 00000000..0e2092f3
--- /dev/null
+++ b/patches/gcc/4.1.2/301-missing-execinfo_h.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/boehm-gc/include/gc.h-orig	2005-04-28 22:28:57.000000000 -0500
++++ gcc-4.0.0/boehm-gc/include/gc.h	2005-04-28 22:30:38.000000000 -0500
+@@ -500,7 +500,7 @@
+ #ifdef __linux__
+ # include <features.h>
+ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \
+-     && !defined(__ia64__)
++     && !defined(__ia64__) && !defined(__UCLIBC__)
+ #   ifndef GC_HAVE_BUILTIN_BACKTRACE
+ #     define GC_HAVE_BUILTIN_BACKTRACE
+ #   endif
diff --git a/patches/gcc/4.1.2/302-c99-snprintf.patch b/patches/gcc/4.1.2/302-c99-snprintf.patch
new file mode 100644
index 00000000..dfb22d68
--- /dev/null
+++ b/patches/gcc/4.1.2/302-c99-snprintf.patch
@@ -0,0 +1,11 @@
+--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig	2005-04-29 00:08:41.000000000 -0500
++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h	2005-04-29 00:08:45.000000000 -0500
+@@ -142,7 +142,7 @@
+   using ::vsprintf;
+ }
+ 
+-#if _GLIBCXX_USE_C99
++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__)
+ 
+ #undef snprintf
+ #undef vfscanf
diff --git a/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch b/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch
new file mode 100644
index 00000000..2ccc80d9
--- /dev/null
+++ b/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch
@@ -0,0 +1,12 @@
+--- gcc-4.0.0/libstdc++-v3/configure-old	2005-04-30 22:04:48.061603912 -0500
++++ gcc-4.0.0/libstdc++-v3/configure	2005-04-30 22:06:13.678588152 -0500
+@@ -7194,6 +7194,9 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ #include <complex.h>
++#ifdef __UCLIBC__
++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs
++#endif
+ int
+ main ()
+ {
diff --git a/patches/gcc/4.1.2/304-index_macro.patch b/patches/gcc/4.1.2/304-index_macro.patch
new file mode 100644
index 00000000..1fac112f
--- /dev/null
+++ b/patches/gcc/4.1.2/304-index_macro.patch
@@ -0,0 +1,24 @@
+--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps	2006-03-24 01:49:51 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/rope	2006-03-24 01:49:37 +0100
+@@ -59,6 +59,9 @@
+ #include <bits/allocator.h>
+ #include <ext/hash_fun.h>
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ # ifdef __GC
+ #   define __GC_CONST const
+ # else
+--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps	2006-03-24 01:50:04 +0100
++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h	2006-03-24 01:50:28 +0100
+@@ -53,6 +53,9 @@
+ #include <ext/memory> // For uninitialized_copy_n
+ #include <ext/numeric> // For power
+ 
++/* cope w/ index defined as macro, SuSv3 proposal */
++#undef index
++
+ namespace __gnu_cxx
+ {
+   using std::size_t;
diff --git a/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch b/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch
new file mode 100644
index 00000000..b7d9bb99
--- /dev/null
+++ b/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch
@@ -0,0 +1,12 @@
+# gcc.gnu.org/PR30620
+--- gcc-4.1.2-20070208.orig/gcc/Makefile.in	2006-11-01 15:40:44.000000000 +0100
++++ gcc-4.1.2-20070208/gcc/Makefile.in	2007-02-13 19:23:31.000000000 +0100
+@@ -2522,7 +2522,7 @@
+ # FIXME: writing proper dependencies for this is a *LOT* of work.
+ libbackend.o : $(OBJS-common:.o=.c) $(out_file) \
+   insn-config.h insn-flags.h insn-codes.h insn-constants.h \
+-  insn-attr.h  $(DATESTAMP) $(BASEVER) $(DEVPHASE)
++  insn-attr.h  $(DATESTAMP) $(BASEVER) $(DEVPHASE) gcov-iov.h
+ 	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \
+ 	  -DTARGET_NAME=\"$(target_noncanonical)\" \
+ 	  -DLOCALEDIR=\"$(localedir)\" \
diff --git a/patches/gcc/4.1.2/740-sh-pr24836.patch b/patches/gcc/4.1.2/740-sh-pr24836.patch
new file mode 100644
index 00000000..7992282c
--- /dev/null
+++ b/patches/gcc/4.1.2/740-sh-pr24836.patch
@@ -0,0 +1,25 @@
+http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836
+
+--- gcc/gcc/configure.ac	(revision 106699)
++++ gcc/gcc/configure.ac	(working copy)
+@@ -2446,7 +2446,7 @@
+ 	tls_first_minor=14
+ 	tls_as_opt="-m64 -Aesame --fatal-warnings"
+ 	;;
+-  sh-*-* | sh[34]-*-*)
++  sh-*-* | sh[34]*-*-*)
+     conftest_s='
+ 	.section ".tdata","awT",@progbits
+ foo:	.long	25
+--- gcc/gcc/configure
++++ gcc/gcc/configure
+@@ -14846,7 +14846,7 @@
+ 	tls_first_minor=14
+ 	tls_as_opt="-m64 -Aesame --fatal-warnings"
+ 	;;
+-  sh-*-* | sh[34]-*-*)
++  sh-*-* | sh[34]*-*-*)
+     conftest_s='
+ 	.section ".tdata","awT",@progbits
+ foo:	.long	25
diff --git a/patches/gcc/4.1.2/800-arm-bigendian.patch b/patches/gcc/4.1.2/800-arm-bigendian.patch
new file mode 100644
index 00000000..0a941741
--- /dev/null
+++ b/patches/gcc/4.1.2/800-arm-bigendian.patch
@@ -0,0 +1,127 @@
+By Lennert Buytenhek <buytenh@wantstofly.org>
+Adds support for arm*b-linux* big-endian ARM targets
+
+See http://gcc.gnu.org/PR16350
+
+Index: gcc-4.1.1/gcc/config/arm/linux-elf.h
+===================================================================
+--- gcc-4.1.1.orig/gcc/config/arm/linux-elf.h
++++ gcc-4.1.1/gcc/config/arm/linux-elf.h
+@@ -28,19 +28,33 @@
+ #undef  TARGET_VERSION
+ #define TARGET_VERSION  fputs (" (ARM GNU/Linux with ELF)", stderr);
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END
++#define TARGET_ENDIAN_OPTION "mbig-endian"
++#define TARGET_LINKER_EMULATION "armelfb_linux"
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#define TARGET_ENDIAN_OPTION "mlittle-endian"
++#define TARGET_LINKER_EMULATION "armelf_linux"
++#endif
++
+ #undef  TARGET_DEFAULT_FLOAT_ABI
+ #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
+ 
+ #undef  TARGET_DEFAULT
+-#define TARGET_DEFAULT (0)
++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
+ 
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
+ 
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
+ 
+ #undef  MULTILIB_DEFAULTS
+ #define MULTILIB_DEFAULTS \
+-	{ "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" }
++	{ "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" }
+ 
+ /* Now we define the strings used to build the spec file.  */
+ #undef  LIB_SPEC
+@@ -61,7 +75,7 @@
+    %{rdynamic:-export-dynamic} \
+    %{!dynamic-linker:-dynamic-linker " LINUX_TARGET_INTERPRETER "} \
+    -X \
+-   %{mbig-endian:-EB}" \
++   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
+    SUBTARGET_EXTRA_LINK_SPEC
+ 
+ #undef  LINK_SPEC
+Index: gcc-4.1.1/gcc/config.gcc
+===================================================================
+--- gcc-4.1.1.orig/gcc/config.gcc
++++ gcc-4.1.1/gcc/config.gcc
+@@ -672,6 +672,11 @@ arm*-*-netbsd*)
+ 	;;
+ arm*-*-linux*)			# ARM GNU/Linux with ELF
+ 	tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" 
++	case $target in
++	arm*b-*)
++		tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1"
++		;;
++	esac
+ 	tmake_file="${tmake_file} t-linux arm/t-arm"
+ 	case ${target} in
+ 	arm*-*-linux-gnueabi)
+Index: gcc-4.1.1/gcc/config/arm/linux-eabi.h
+===================================================================
+--- gcc-4.1.1.orig/gcc/config/arm/linux-eabi.h
++++ gcc-4.1.1/gcc/config/arm/linux-eabi.h
+@@ -20,6 +20,17 @@
+    the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.  */
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#undef TARGET_LINKER_EMULATION
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_LINKER_EMULATION "armelfb_linux_eabi"
++#else
++#define TARGET_LINKER_EMULATION "armelf_linux_eabi"
++#endif
++
+ /* On EABI GNU/Linux, we want both the BPABI builtins and the
+    GNU/Linux builtins.  */
+ #undef TARGET_OS_CPP_BUILTINS
+@@ -48,7 +59,7 @@
+ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi
+ 
+ #undef SUBTARGET_EXTRA_LINK_SPEC
+-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux_eabi"
++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION
+ 
+ /* Use ld-linux.so.3 so that it will be possible to run "classic"
+    GNU/Linux binaries on an EABI system.  */
+Index: gcc-4.1.1/gcc/config/arm/bpabi.h
+===================================================================
+--- gcc-4.1.1.orig/gcc/config/arm/bpabi.h
++++ gcc-4.1.1/gcc/config/arm/bpabi.h
+@@ -33,9 +33,19 @@
+ #undef FPUTYPE_DEFAULT
+ #define FPUTYPE_DEFAULT FPUTYPE_VFP
+ 
++/*
++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-*
++ * (big endian) configurations.
++ */
++#if TARGET_BIG_ENDIAN_DEFAULT
++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END
++#else
++#define TARGET_ENDIAN_DEFAULT 0
++#endif
++
+ /* EABI targets should enable interworking by default.  */
+ #undef TARGET_DEFAULT
+-#define TARGET_DEFAULT MASK_INTERWORK
++#define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT)
+ 
+ /* The ARM BPABI functions return a boolean; they use no special
+    calling convention.  */
diff --git a/patches/glibc/2.1.3/README b/patches/glibc/2.1.3/README
new file mode 100644
index 00000000..2b17d93e
--- /dev/null
+++ b/patches/glibc/2.1.3/README
@@ -0,0 +1,4 @@
+The files rh62*.patch are from the Red Hat 6.2 file glibc-2.1.3-28.src.rpm
+I am trusting here that Red Hat's patches are appropriate for all CPU
+types.  If I'm wrong, just remove the offending patch...
+- Dan Kegel
diff --git a/patches/glibc/2.1.3/arm-ctl_bus_isa.patch b/patches/glibc/2.1.3/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.1.3/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.1.3/backport-config.sub.patch b/patches/glibc/2.1.3/backport-config.sub.patch
new file mode 100644
index 00000000..8c1b1afe
--- /dev/null
+++ b/patches/glibc/2.1.3/backport-config.sub.patch
@@ -0,0 +1,834 @@
+# Backport glibc-2.3.2's config.sub to glibc-2.1.3 
+# Should fix nonfatal but annoying like
+#   checking build system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
+#   ../glibc-2.1.3/configure: line 1227: test: i686-unknown-linux-gnu: unary operator expected
+#   checking build system type... Configuration name missing.
+
+
+--- glibc-2.1.3/scripts/config.sub	2004-03-24 13:27:06.000000000 -0800
++++ glibc-2.3.2/scripts/config.sub	2002-07-10 00:24:32.000000000 -0700
+@@ -1,6 +1,10 @@
+ #! /bin/sh
+-# Configuration validation subroutine script, version 1.1.
+-#   Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
++# Configuration validation subroutine script.
++#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
++#   2000, 2001, 2002 Free Software Foundation, Inc.
++
++timestamp='2002-07-03'
++
+ # This file is (in principle) common to ALL GNU software.
+ # The presence of a machine in this file suggests that SOME GNU software
+ # can handle that machine.  It does not imply ALL GNU software can.
+@@ -25,6 +29,9 @@
+ # configuration script generated by Autoconf, you may include it under
+ # the same distribution terms that you use for the rest of that program.
+ 
++# Please send patches to <config-patches@gnu.org>.  Submit a context
++# diff and a properly formatted ChangeLog entry.
++#
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+ # If it is invalid, we print an error message on stderr and exit with code 1.
+@@ -45,30 +52,73 @@
+ #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+ # It is wrong to echo any other type of specification.
+ 
+-if [ x$1 = x ]
+-then
+-	echo Configuration name missing. 1>&2
+-	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+-	echo "or     $0 ALIAS" 1>&2
+-	echo where ALIAS is a recognized configuration type. 1>&2
+-	exit 1
+-fi
++me=`echo "$0" | sed -e 's,.*/,,'`
+ 
+-# First pass through any local machine types.
+-case $1 in
+-	*local*)
+-		echo $1
+-		exit 0
+-		;;
+-	*)
+-	;;
++usage="\
++Usage: $0 [OPTION] CPU-MFR-OPSYS
++       $0 [OPTION] ALIAS
++
++Canonicalize a configuration name.
++
++Operation modes:
++  -h, --help         print this help, then exit
++  -t, --time-stamp   print date of last modification, then exit
++  -v, --version      print version number, then exit
++
++Report bugs and patches to <config-patches@gnu.org>."
++
++version="\
++GNU config.sub ($timestamp)
++
++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
++Free Software Foundation, Inc.
++
++This is free software; see the source for copying conditions.  There is NO
++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
++
++help="
++Try \`$me --help' for more information."
++
++# Parse command line
++while test $# -gt 0 ; do
++  case $1 in
++    --time-stamp | --time* | -t )
++       echo "$timestamp" ; exit 0 ;;
++    --version | -v )
++       echo "$version" ; exit 0 ;;
++    --help | --h* | -h )
++       echo "$usage"; exit 0 ;;
++    -- )     # Stop option processing
++       shift; break ;;
++    - )	# Use stdin as input.
++       break ;;
++    -* )
++       echo "$me: invalid option $1$help"
++       exit 1 ;;
++
++    *local*)
++       # First pass through any local machine types.
++       echo $1
++       exit 0;;
++
++    * )
++       break ;;
++  esac
++done
++
++case $# in
++ 0) echo "$me: missing argument$help" >&2
++    exit 1;;
++ 1) ;;
++ *) echo "$me: too many arguments$help" >&2
++    exit 1;;
+ esac
+ 
+ # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+ # Here we must recognize all the valid KERNEL-OS combinations.
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+-  linux-gnu*)
++  nto-qnx* | linux-gnu* | freebsd*-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
+     os=-$maybe_os
+     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+     ;;
+@@ -94,7 +144,7 @@
+ 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+-	-apple)
++	-apple | -axis)
+ 		os=
+ 		basic_machine=$1
+ 		;;
+@@ -108,6 +158,14 @@
+ 		os=-vxworks
+ 		basic_machine=$1
+ 		;;
++	-chorusos*)
++		os=-chorusos
++		basic_machine=$1
++		;;
++ 	-chorusrdb)
++ 		os=-chorusrdb
++		basic_machine=$1
++ 		;;
+ 	-hiux*)
+ 		os=-hiuxwe2
+ 		;;
+@@ -166,27 +224,58 @@
+ case $basic_machine in
+ 	# Recognize the basic CPU types without company name.
+ 	# Some are omitted here because they have special meanings below.
+-	tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+-		| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+-		| 580 | i960 | h8300 \
+-		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+-		| alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+-		| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+-		| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
+-		| mips64orion | mips64orionel | mipstx39 | mipstx39el \
+-		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+-		| mips64vr5000 | miprs64vr5000el | mcore \
+-		| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
+-		| thumb | d10v | fr30)
++	1750a | 580 \
++	| a29k \
++	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
++	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
++	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
++	| c4x | clipper \
++	| d10v | d30v | dlx | dsp16xx \
++	| fr30 | frv \
++	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
++	| i370 | i860 | i960 | ia64 \
++	| ip2k \
++	| m32r | m68000 | m68k | m88k | mcore \
++	| mips | mipsbe | mipseb | mipsel | mipsle \
++	| mips16 \
++	| mips64 | mips64el \
++	| mips64orion | mips64orionel \
++	| mips64vr4100 | mips64vr4100el \
++	| mips64vr4300 | mips64vr4300el \
++	| mips64vr5000 | mips64vr5000el \
++	| mipsisa32 | mipsisa32el \
++	| mipsisa64 | mipsisa64el \
++	| mipsisa64sb1 | mipsisa64sb1el \
++	| mipstx39 | mipstx39el \
++	| mn10200 | mn10300 \
++	| ns16k | ns32k \
++	| openrisc | or32 \
++	| pdp10 | pdp11 | pj | pjl \
++	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
++	| pyramid \
++	| sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
++	| sh64 | sh64le \
++	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
++	| strongarm \
++	| tahoe | thumb | tic80 | tron \
++	| v850 | v850e \
++	| we32k \
++	| x86 | xscale | xstormy16 | xtensa \
++	| z8k)
++		basic_machine=$basic_machine-unknown
++		;;
++	m6811 | m68hc11 | m6812 | m68hc12)
++		# Motorola 68HC11/12.
+ 		basic_machine=$basic_machine-unknown
++		os=-none
+ 		;;
+-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
++	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ 		;;
+ 
+ 	# We use `pc' rather than `unknown'
+ 	# because (1) that's what they normally are, and
+ 	# (2) the word "unknown" tends to confuse beginning users.
+-	i[34567]86)
++	i*86 | x86_64)
+ 	  basic_machine=$basic_machine-pc
+ 	  ;;
+ 	# Object if more than one company name word.
+@@ -195,24 +284,54 @@
+ 		exit 1
+ 		;;
+ 	# Recognize the basic CPU types with company name.
+-	# FIXME: clean up the formatting here.
+-	vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+-	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+-	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+-	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+-	      | xmp-* | ymp-* \
+-	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+-	      | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
+-	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+-	      | clipper-* | orion-* \
+-	      | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+-	      | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+-	      | mips64el-* | mips64orion-* | mips64orionel-* \
+-	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+-	      | mipstx39-* | mipstx39el-* | mcore-* \
+-	      | f301-* | armv*-* | t3e-* \
+-	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+-	      | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* )
++	580-* \
++	| a29k-* \
++	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
++	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
++	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
++	| avr-* \
++	| bs2000-* \
++	| c[123]* | c30-* | [cjt]90-* | c54x-* \
++	| clipper-* | cydra-* \
++	| d10v-* | d30v-* | dlx-* \
++	| elxsi-* \
++	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
++	| h8300-* | h8500-* \
++	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
++	| i*86-* | i860-* | i960-* | ia64-* \
++	| ip2k-* \
++	| m32r-* \
++	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
++	| m88110-* | m88k-* | mcore-* \
++	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
++	| mips16-* \
++	| mips64-* | mips64el-* \
++	| mips64orion-* | mips64orionel-* \
++	| mips64vr4100-* | mips64vr4100el-* \
++	| mips64vr4300-* | mips64vr4300el-* \
++	| mips64vr5000-* | mips64vr5000el-* \
++	| mipsisa32-* | mipsisa32el-* \
++	| mipsisa64-* | mipsisa64el-* \
++	| mipsisa64sb1-* | mipsisa64sb1el-* \
++	| mipstx39 | mipstx39el \
++	| none-* | np1-* | ns16k-* | ns32k-* \
++	| orion-* \
++	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
++	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
++	| pyramid-* \
++	| romp-* | rs6000-* \
++	| sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \
++	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
++	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
++	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
++	| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
++	| v850-* | v850e-* | vax-* \
++	| we32k-* \
++	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
++	| xtensa-* \
++	| ymp-* \
++	| z8k-*)
+ 		;;
+ 	# Recognize the various machine names and aliases which stand
+ 	# for a CPU type and a company and sometimes even an OS.
+@@ -249,14 +368,14 @@
+ 		os=-sysv
+ 		;;
+ 	amiga | amiga-*)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		;;
+ 	amigaos | amigados)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		os=-amigaos
+ 		;;
+ 	amigaunix | amix)
+-		basic_machine=m68k-cbm
++		basic_machine=m68k-unknown
+ 		os=-sysv4
+ 		;;
+ 	apollo68)
+@@ -275,6 +394,10 @@
+ 		basic_machine=ns32k-sequent
+ 		os=-dynix
+ 		;;
++	c90)
++		basic_machine=c90-cray
++		os=-unicos
++		;;
+ 	convex-c1)
+ 		basic_machine=c1-convex
+ 		os=-bsd
+@@ -295,27 +418,30 @@
+ 		basic_machine=c38-convex
+ 		os=-bsd
+ 		;;
+-	cray | ymp)
+-		basic_machine=ymp-cray
+-		os=-unicos
+-		;;
+-	cray2)
+-		basic_machine=cray2-cray
+-		os=-unicos
+-		;;
+-	[ctj]90-cray)
+-		basic_machine=c90-cray
++	cray | j90)
++		basic_machine=j90-cray
+ 		os=-unicos
+ 		;;
+ 	crds | unos)
+ 		basic_machine=m68k-crds
+ 		;;
++	cris | cris-* | etrax*)
++		basic_machine=cris-axis
++		;;
+ 	da30 | da30-*)
+ 		basic_machine=m68k-da30
+ 		;;
+ 	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ 		basic_machine=mips-dec
+ 		;;
++	decsystem10* | dec10*)
++		basic_machine=pdp10-dec
++		os=-tops10
++		;;
++	decsystem20* | dec20*)
++		basic_machine=pdp10-dec
++		os=-tops20
++		;;
+ 	delta | 3300 | motorola-3300 | motorola-delta \
+ 	      | 3300-motorola | delta-motorola)
+ 		basic_machine=m68k-motorola
+@@ -357,6 +483,10 @@
+ 		basic_machine=tron-gmicro
+ 		os=-sysv
+ 		;;
++	go32)
++		basic_machine=i386-pc
++		os=-go32
++		;;
+ 	h3050r* | hiux*)
+ 		basic_machine=hppa1.1-hitachi
+ 		os=-hiuxwe2
+@@ -432,19 +562,19 @@
+ 		basic_machine=i370-ibm
+ 		;;
+ # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+-	i[34567]86v32)
++	i*86v32)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv32
+ 		;;
+-	i[34567]86v4*)
++	i*86v4*)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv4
+ 		;;
+-	i[34567]86v)
++	i*86v)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-sysv
+ 		;;
+-	i[34567]86sol2)
++	i*86sol2)
+ 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ 		os=-solaris2
+ 		;;
+@@ -456,17 +586,6 @@
+ 		basic_machine=i386-unknown
+ 		os=-vsta
+ 		;;
+-	i386-go32 | go32)
+-		basic_machine=i386-unknown
+-		os=-go32
+-		;;
+-	i386-mingw32 | mingw32)
+-		basic_machine=i386-unknown
+-		os=-mingw32
+-		;;
+-	i386-qnx | qnx)
+-		basic_machine=i386-qnx
+-		;;
+ 	iris | iris4d)
+ 		basic_machine=mips-sgi
+ 		case $os in
+@@ -492,6 +611,10 @@
+ 		basic_machine=ns32k-utek
+ 		os=-sysv
+ 		;;
++	mingw32)
++		basic_machine=i386-pc
++		os=-mingw32
++		;;
+ 	miniframe)
+ 		basic_machine=m68000-convergent
+ 		;;
+@@ -499,26 +622,26 @@
+ 		basic_machine=m68k-atari
+ 		os=-mint
+ 		;;
+-	mipsel*-linux*)
+-		basic_machine=mipsel-unknown
+-		os=-linux-gnu
+-		;;
+-	mips*-linux*)
+-		basic_machine=mips-unknown
+-		os=-linux-gnu
+-		;;
+ 	mips3*-*)
+ 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ 		;;
+ 	mips3*)
+ 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ 		;;
++	mmix*)
++		basic_machine=mmix-knuth
++		os=-mmixware
++		;;
+ 	monitor)
+ 		basic_machine=m68k-rom68k
+ 		os=-coff
+ 		;;
++	morphos)
++		basic_machine=powerpc-unknown
++		os=-morphos
++		;;
+ 	msdos)
+-		basic_machine=i386-unknown
++		basic_machine=i386-pc
+ 		os=-msdos
+ 		;;
+ 	mvs)
+@@ -582,13 +705,24 @@
+ 		basic_machine=i960-intel
+ 		os=-mon960
+ 		;;
++	nonstopux)
++		basic_machine=mips-compaq
++		os=-nonstopux
++		;;
+ 	np1)
+ 		basic_machine=np1-gould
+ 		;;
++	nsr-tandem)
++		basic_machine=nsr-tandem
++		;;
+ 	op50n-* | op60c-*)
+ 		basic_machine=hppa1.1-oki
+ 		os=-proelf
+ 		;;
++	or32 | or32-*)
++		basic_machine=or32-unknown
++		os=-coff
++		;;
+ 	OSE68000 | ose68000)
+ 		basic_machine=m68000-ericsson
+ 		os=-ose
+@@ -614,28 +748,28 @@
+         pc532 | pc532-*)
+ 		basic_machine=ns32k-pc532
+ 		;;
+-	pentium | p5 | k5 | k6 | nexen)
++	pentium | p5 | k5 | k6 | nexgen | viac3)
+ 		basic_machine=i586-pc
+ 		;;
+-	pentiumpro | p6 | 6x86)
++	pentiumpro | p6 | 6x86 | athlon)
+ 		basic_machine=i686-pc
+ 		;;
+ 	pentiumii | pentium2)
+-		basic_machine=i786-pc
++		basic_machine=i686-pc
+ 		;;
+-	pentium-* | p5-* | k5-* | k6-* | nexen-*)
++	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ 		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+-	pentiumpro-* | p6-* | 6x86-*)
++	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	pentiumii-* | pentium2-*)
+-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
++		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	pn)
+ 		basic_machine=pn-gould
+ 		;;
+-	power)	basic_machine=rs6000-ibm
++	power)	basic_machine=power-ibm
+ 		;;
+ 	ppc)	basic_machine=powerpc-unknown
+ 	        ;;
+@@ -647,9 +781,23 @@
+ 	ppcle-* | powerpclittle-*)
+ 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
++	ppc64)	basic_machine=powerpc64-unknown
++	        ;;
++	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
++	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
++		basic_machine=powerpc64le-unknown
++	        ;;
++	ppc64le-* | powerpc64little-*)
++		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
++		;;
+ 	ps2)
+ 		basic_machine=i386-ibm
+ 		;;
++	pw32)
++		basic_machine=i586-unknown
++		os=-pw32
++		;;
+ 	rom68k)
+ 		basic_machine=m68k-rom68k
+ 		os=-coff
+@@ -660,6 +808,12 @@
+ 	rtpc | rtpc-*)
+ 		basic_machine=romp-ibm
+ 		;;
++	s390 | s390-*)
++		basic_machine=s390-ibm
++		;;
++	s390x | s390x-*)
++		basic_machine=s390x-ibm
++		;;
+ 	sa29200)
+ 		basic_machine=a29k-amd
+ 		os=-udi
+@@ -671,7 +825,7 @@
+ 		basic_machine=sh-hitachi
+ 		os=-hms
+ 		;;
+-	sparclite-wrs)
++	sparclite-wrs | simso-wrs)
+ 		basic_machine=sparclite-wrs
+ 		os=-vxworks
+ 		;;
+@@ -729,20 +883,40 @@
+ 	sun386 | sun386i | roadrunner)
+ 		basic_machine=i386-sun
+ 		;;
++        sv1)
++		basic_machine=sv1-cray
++		os=-unicos
++		;;
+ 	symmetry)
+ 		basic_machine=i386-sequent
+ 		os=-dynix
+ 		;;
++	t3d)
++		basic_machine=alpha-cray
++		os=-unicos
++		;;
+ 	t3e)
+-		basic_machine=t3e-cray
++		basic_machine=alphaev5-cray
++		os=-unicos
++		;;
++	t90)
++		basic_machine=t90-cray
+ 		os=-unicos
+ 		;;
++	tic54x | c54x*)
++		basic_machine=tic54x-unknown
++		os=-coff
++		;;
+ 	tx39)
+ 		basic_machine=mipstx39-unknown
+ 		;;
+ 	tx39el)
+ 		basic_machine=mipstx39el-unknown
+ 		;;
++	toad1)
++		basic_machine=pdp10-xkl
++		os=-tops20
++		;;
+ 	tower | tower-32)
+ 		basic_machine=m68k-ncr
+ 		;;
+@@ -789,13 +963,17 @@
+ 		basic_machine=hppa1.1-winbond
+ 		os=-proelf
+ 		;;
+-	xmp)
+-		basic_machine=xmp-cray
+-		os=-unicos
++	windows32)
++		basic_machine=i386-pc
++		os=-windows32-msvcrt
+ 		;;
+         xps | xps100)
+ 		basic_machine=xps100-honeywell
+ 		;;
++	ymp)
++		basic_machine=ymp-cray
++		os=-unicos
++		;;
+ 	z8k-*-coff)
+ 		basic_machine=z8k-unknown
+ 		os=-sim
+@@ -816,13 +994,6 @@
+ 	op60c)
+ 		basic_machine=hppa1.1-oki
+ 		;;
+-	mips)
+-		if [ x$os = x-linux-gnu ]; then
+-			basic_machine=mips-unknown
+-		else
+-			basic_machine=mips-mips
+-		fi
+-		;;
+ 	romp)
+ 		basic_machine=romp-ibm
+ 		;;
+@@ -832,13 +1003,23 @@
+ 	vax)
+ 		basic_machine=vax-dec
+ 		;;
++	pdp10)
++		# there are many clones, so DEC is not a safe bet
++		basic_machine=pdp10-unknown
++		;;
+ 	pdp11)
+ 		basic_machine=pdp11-dec
+ 		;;
+ 	we32k)
+ 		basic_machine=we32k-att
+ 		;;
+-	sparc | sparcv9)
++	sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele)
++		basic_machine=sh-unknown
++		;;
++	sh64)
++		basic_machine=sh64-unknown
++		;;
++	sparc | sparcv9 | sparcv9b)
+ 		basic_machine=sparc-sun
+ 		;;
+         cydra)
+@@ -860,6 +1041,9 @@
+ 		basic_machine=c4x-none
+ 		os=-coff
+ 		;;
++	*-unknown)
++		# Make sure to match an already-canonicalized machine name.
++		;;
+ 	*)
+ 		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ 		exit 1
+@@ -916,14 +1100,31 @@
+ 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
++	      | -chorusos* | -chorusrdb* \
+ 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+-	      | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*)
++	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
++	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
++	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
++	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
++	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* | -powermax*)
+ 	# Remember, each alternative MUST END IN *, to match a version number.
+ 		;;
++	-qnx*)
++		case $basic_machine in
++		    x86-* | i*86-*)
++			;;
++		    *)
++			os=-nto$os
++			;;
++		esac
++		;;
++	-nto*)
++		os=-nto-qnx
++		;;
+ 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ 	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+-	      | -macos* | -mpw* | -magic* | -mon960* | -lnews*)
++	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ 		;;
+ 	-mac*)
+ 		os=`echo $os | sed -e 's|mac|macos|'`
+@@ -940,6 +1141,9 @@
+ 	-opened*)
+ 		os=-openedition
+ 		;;
++	-wince*)
++		os=-wince
++		;;
+ 	-osfrose*)
+ 		os=-osfrose
+ 		;;
+@@ -955,15 +1159,24 @@
+ 	-acis*)
+ 		os=-aos
+ 		;;
++	-atheos*)
++		os=-atheos
++		;;
+ 	-386bsd)
+ 		os=-bsd
+ 		;;
+ 	-ctix* | -uts*)
+ 		os=-sysv
+ 		;;
++	-nova*)
++		os=-rtmk-nova
++		;;
+ 	-ns2 )
+ 	        os=-nextstep2
+ 		;;
++	-nsk*)
++		os=-nsk
++		;;
+ 	# Preserve the version number of sinix5.
+ 	-sinix5.*)
+ 		os=`echo $os | sed -e 's|sinix|sysv|'`
+@@ -977,9 +1190,6 @@
+ 	-oss*)
+ 		os=-sysv3
+ 		;;
+-        -qnx)
+-		os=-qnx4
+-		;;
+ 	-svr4)
+ 		os=-sysv4
+ 		;;
+@@ -1001,7 +1211,7 @@
+ 	-xenix)
+ 		os=-xenix
+ 		;;
+-        -*mint | -*MiNT)
++        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ 	        os=-mint
+ 		;;
+ 	-none)
+@@ -1035,6 +1245,10 @@
+ 	arm*-semi)
+ 		os=-aout
+ 		;;
++	# This must come before the *-dec entry.
++	pdp10-*)
++		os=-tops20
++		;;
+         pdp11-*)
+ 		os=-none
+ 		;;
+@@ -1062,6 +1276,9 @@
+ 	mips*-*)
+ 		os=-elf
+ 		;;
++	or32-*)
++		os=-coff
++		;;
+ 	*-tti)	# must be before sparc entry or we get the wrong os.
+ 		os=-sysv3
+ 		;;
+@@ -1143,7 +1360,7 @@
+ 	*-masscomp)
+ 		os=-rtu
+ 		;;
+-	f301-fujitsu)
++	f30[01]-fujitsu | f700-fujitsu)
+ 		os=-uxpv
+ 		;;
+ 	*-rom68k)
+@@ -1209,7 +1426,7 @@
+ 			-ptx*)
+ 				vendor=sequent
+ 				;;
+-			-vxsim* | -vxworks*)
++			-vxsim* | -vxworks* | -windiss*)
+ 				vendor=wrs
+ 				;;
+ 			-aux*)
+@@ -1221,12 +1438,23 @@
+ 			-mpw* | -macos*)
+ 				vendor=apple
+ 				;;
+-			-*mint | -*MiNT)
++			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ 				vendor=atari
+ 				;;
++			-vos*)
++				vendor=stratus
++				;;
+ 		esac
+ 		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ 		;;
+ esac
+ 
+ echo $basic_machine$os
++exit 0
++
++# Local variables:
++# eval: (add-hook 'write-file-hooks 'time-stamp)
++# time-stamp-start: "timestamp='"
++# time-stamp-format: "%:y-%02m-%02d"
++# time-stamp-end: "'"
++# End:
diff --git a/patches/glibc/2.1.3/el.po.patch b/patches/glibc/2.1.3/el.po.patch
new file mode 100644
index 00000000..15ed1de9
--- /dev/null
+++ b/patches/glibc/2.1.3/el.po.patch
@@ -0,0 +1,40 @@
+From
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/po/Makefile.diff?r1=1.17&r2=1.18&cvsroot=glibc
+
+Fixes error
+  msgfmt -o el.mo el.po
+  el.po:538:31: invalid multibyte sequence
+  el.po:539:21: invalid multibyte sequence
+  el.po:1537:38: invalid multibyte sequence
+  msgfmt: found 3 fatal errors
+  make[2]: *** [el.mo] Error 1
+  make[2]: Leaving directory
+  `/home/dkegel/wk/crosstool-0.25/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/po'
+
+===================================================================
+RCS file: /cvs/glibc/libc/po/Makefile,v
+retrieving revision 1.17
+retrieving revision 1.18
+diff -u -r1.17 -r1.18
+--- libc/po/Makefile	1999/09/13 08:48:40	1.17
++++ libc/po/Makefile	2001/04/20 04:45:54	1.18
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++# Copyright (C) 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
+ # This file is part of the GNU C Library.
+ 
+ # The GNU C Library is free software; you can redistribute it and/or
+@@ -20,8 +20,12 @@
+ 
+ subdir := po
+ 
++# List of languages that are currently broken (just run msgfmt from
++# GNU gettext 0.10.36 on them to see why)
++BROKEN_LINGUAS = el
++
+ # List of languages for which we have message catalogs of translations.
+-ALL_LINGUAS := $(basename $(wildcard *.po))
++ALL_LINGUAS := $(filter-out $(BROKEN_LINGUAS),$(basename $(wildcard *.po)))
+ 
+ # You can override this in configparms or the make command line to limit
+ # the languages which get installed.
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch b/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch
new file mode 100644
index 00000000..0b5c5750
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch
@@ -0,0 +1,44 @@
+Lets you work around the canadian cross build error
+
+.../gcc-3.4.0-glibc-2.1.3/build-glibc/elf/sln .../gcc-3.4.0-glibc-2.1.3/build-glibc/elf/symlink.list
+make[1]: *** [install-symbolic-link] Segmentation fault
+make[1]: Leaving directory `.../gcc-3.4.0-glibc-2.1.3/glibc-2.1.3'
+make: *** [install] Error 2
+
+by setting --host != --build when running glibc-2.1.3/configure
+instead of hoping that host and build aren't aliases for each other
+and that running a host program on the build machine doesn't 
+put up a dialog box or accidentally work.
+
+(cf. http://sources.redhat.com/ml/crossgcc/2002-08/msg00099.html, in which 
+the run of conftest caused a dialog box to pop up and block the build on cygwin)
+
+--- glibc-2.1.3/configure.old	2004-05-26 19:30:45.000000000 -0700
++++ glibc-2.1.3/configure	2004-05-26 19:42:29.000000000 -0700
+@@ -1224,7 +1224,7 @@
+ build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ echo "$ac_t""$build" 1>&6
+ 
+-if test $host != $build; then
++if test x$host_alias != x$build_alias; then
+   ac_tool_prefix=${host_alias}-
+ else
+   ac_tool_prefix=
+@@ -1487,7 +1487,7 @@
+ if { (eval echo configure:1488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+   ac_cv_prog_cc_works=yes
+   # If we can't run a trivial program, we are probably using a cross compiler.
+-  if (./conftest; exit) 2>/dev/null; then
++  if test x$host_alias == x$build_alias && (./conftest; exit) 2>/dev/null; then
+     ac_cv_prog_cc_cross=no
+   else
+     ac_cv_prog_cc_cross=yes
+@@ -1566,7 +1566,7 @@
+ build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+ echo "$ac_t""$build" 1>&6
+ 
+-if test $host != $build; then
++if test x$host_alias != x$build_alias; then
+   for ac_prog in gcc cc
+ do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch
new file mode 100644
index 00000000..b337d0a9
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch
@@ -0,0 +1,17 @@
+Fixes error compiling with gcc-3.4.0:
+
+os/os_oflags.c: In function `__db_oflags':
+os/os_oflags.c:48: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/db2/os_oflags.os] Error 1
+
+--- glibc-2.1.3/db2/os/os_oflags.c.old	Sun Apr 11 19:56:44 2004
++++ glibc-2.1.3/db2/os/os_oflags.c	Sun Apr 11 19:57:06 2004
+@@ -44,7 +44,7 @@
+ 	case O_RDWR:
+ 		break;
+ 	default:		/* Bogus flags value from user.  */
+-	  /* XXX no way to return error from here */
++		; /* XXX no way to return error from here */
+ 	}
+ 	if (oflags & O_CREAT)
+ 		dbflags |= DB_CREATE;
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch
new file mode 100644
index 00000000..4005df75
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch
@@ -0,0 +1,21 @@
+Fixes
+
+nss_dns/dns-host.c: In function `_nss_dns_gethostbyaddr_r':
+nss_dns/dns-host.c:268: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/resolv/dns-host.os] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/resolv'
+make[1]: *** [resolv/others] Error 2
+
+when building with gcc-3.4.0
+
+--- glibc-2.1.3/resolv/nss_dns/dns-host.c.old	Sun Apr 11 20:32:47 2004
++++ glibc-2.1.3/resolv/nss_dns/dns-host.c	Sun Apr 11 20:33:07 2004
+@@ -264,7 +264,7 @@
+       strcpy (qp, "ip6.int");
+       break;
+     default:
+-      /* Cannot happen.  */
++      ; /* Cannot happen.  */
+     }
+ 
+   host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch
new file mode 100644
index 00000000..0028d23d
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch
@@ -0,0 +1,70 @@
+Fixes
+dl-runtime.c:56: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here
+when building with gcc-3.4.0
+
+First hunk:
+Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc
+[rediffed against glibc-2.1.3]
+
+Second hunk:
+If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition.
+Use macro in fixup function definitions.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc
+[rediffed against glibc-2.3.2]
+
+===================================================================
+--- glibc-2.1.3/sysdeps/i386/dl-machine.h.old	Sun Apr 11 18:58:45 2004
++++ glibc-2.1.3/sysdeps/i386/dl-machine.h	Sun Apr 11 18:59:51 2004
+@@ -70,11 +70,14 @@
+ 
+    We cannot use this scheme for profiling because the _mcount call
+    destroys the passed register information.  */
++
++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused))
++
+ static ElfW(Addr) fixup (struct link_map *l, ElfW(Word) reloc_offset)
+-     __attribute__ ((regparm (2), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+ 				 ElfW(Addr) retaddr)
+-     __attribute__ ((regparm (3), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ #endif
+ 
+ /* Set up the loaded object described by L so its unrelocated PLT
+===================================================================
+--- glibc-2.1.3/elf/dl-runtime.c~	Thu Jul 15 11:32:41 1999
++++ glibc-2.1.3/elf/dl-runtime.c	Sun Apr 11 19:02:01 2004
+@@ -31,6 +31,12 @@
+ # define VERSYMIDX(sym)	(DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (sym))
+ #endif
+ 
++/* The fixup functions might have need special attributes.  If none
++   are provided define the macro as empty.  */
++#ifndef ARCH_FIXUP_ATTRIBUTE
++# define ARCH_FIXUP_ATTRIBUTE
++#endif
++
+ 
+ /* This function is called through a special trampoline from the PLT the
+    first time each PLT entry is called.  We must perform the relocation
+@@ -40,7 +46,7 @@
+    function.  */
+ 
+ #ifndef ELF_MACHINE_NO_PLT
+-static ElfW(Addr) __attribute__ ((unused))
++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE
+ fixup (
+ # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+@@ -105,7 +111,7 @@
+ 
+ #if !defined PROF && !defined ELF_MACHINE_NO_PLT
+ 
+-static ElfW(Addr) __attribute__ ((unused))
++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE
+ profile_fixup (
+ #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch
new file mode 100644
index 00000000..8359cc66
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch
@@ -0,0 +1,157 @@
+Fixes following error when building with gcc-3.4.0:
+../sysdeps/generic/strstr.c: In function `strstr':
+../sysdeps/generic/strstr.c:85: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/string/strstr.o] Error 1
+
+
+--------
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	drepper@sources.redhat.com	2000-11-25 23:30:03
+
+Modified files:
+	sysdeps/generic: _strerror.c memrchr.c strcasestr.c strstr.c 
+
+Log message:
+	Add casts to avoid warnings.
+--------
+
+Retrieved with
+ cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2000-11-24 23:30:03" -D"2000-11-26 23:30:03" 
+then fixed paths and threw out first two hunks
+
+
+#Index: _strerror.c
+#===================================================================
+#RCS file: /cvs/libc/sysdeps/generic/_strerror.c,v
+#retrieving revision 1.16
+#retrieving revision 1.17
+#diff -u -r1.16 -r1.17
+#--- libc/sysdeps/generic/_strerror.c	29 Aug 2000 01:09:56 -0000	1.16
+#+++ libc/sysdeps/generic/_strerror.c	26 Nov 2000 07:30:03 -0000	1.17
+#@@ -56,7 +56,7 @@
+# 	 buffer size.  */
+#       q = __mempcpy (buf, unk, MIN (unklen, buflen));
+#       if (unklen < buflen)
+#-	memcpy (q, p, MIN (&numbuf[21] - p, buflen - unklen));
+#+	memcpy (q, p, MIN ((size_t) (&numbuf[21] - p), buflen - unklen));
+# 
+#       /* Terminate the string in any case.  */
+#       if (buflen > 0)
+#Index: memrchr.c
+#===================================================================
+#RCS file: /cvs/libc/sysdeps/generic/memrchr.c,v
+#retrieving revision 1.5
+#retrieving revision 1.6
+#diff -u -r1.5 -r1.6
+#--- libc/sysdeps/generic/memrchr.c	23 Oct 2000 23:07:32 -0000	1.5
+#+++ libc/sysdeps/generic/memrchr.c	26 Nov 2000 07:30:03 -0000	1.6
+#@@ -86,7 +86,7 @@
+#   /* All these elucidatory comments refer to 4-byte longwords,
+#      but the theory applies equally well to 8-byte longwords.  */
+# 
+#-  longword_ptr = (unsigned long int *) char_ptr;
+#+  longword_ptr = (const unsigned long int *) char_ptr;
+# 
+#   /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
+#      the "holes."  Note that there is a hole just to the left of
+Index: strcasestr.c
+===================================================================
+RCS file: /cvs/libc/sysdeps/generic/strcasestr.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/generic/strcasestr.c	23 Jan 1999 22:16:03 -0000	1.3
++++ libc/sysdeps/generic/strcasestr.c	26 Nov 2000 07:30:03 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Return the offset of one string within another.
+-   Copyright (C) 1994, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1994,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -62,7 +62,7 @@
+ 	  if (c == '\0')
+ 	    goto ret0;
+ 	}
+-      while (_tolower (c) != b);
++      while (_tolower (c) != (int) b);
+ 
+       c = _tolower (*++needle);
+       if (c == '\0')
+@@ -80,40 +80,42 @@
+ 	      a = *++haystack;
+ 	      if (a == '\0')
+ 		goto ret0;
+-	      if (_tolower (a) == b)
++	      if (_tolower (a) == (int) b)
+ 		break;
+ 	      a = *++haystack;
+ 	      if (a == '\0')
+ 		goto ret0;
+-shloop:	    }
+-          while (_tolower (a) != b);
++shloop:
++	      ;
++	    }
++          while (_tolower (a) != (int) b);
+ 
+ jin:	  a = *++haystack;
+ 	  if (a == '\0')
+ 	    goto ret0;
+ 
+-	  if (_tolower (a) != c)
++	  if (_tolower (a) != (int) c)
+ 	    goto shloop;
+ 
+ 	  rhaystack = haystack-- + 1;
+ 	  rneedle = needle;
+ 	  a = _tolower (*rneedle);
+ 
+-	  if (_tolower (*rhaystack) == a)
++	  if (_tolower (*rhaystack) == (int) a)
+ 	    do
+ 	      {
+ 		if (a == '\0')
+ 		  goto foundneedle;
+ 		++rhaystack;
+ 		a = _tolower (*++needle);
+-		if (_tolower (*rhaystack) != a)
++		if (_tolower (*rhaystack) != (int) a)
+ 		  break;
+ 		if (a == '\0')
+ 		  goto foundneedle;
+ 		++rhaystack;
+ 		a = _tolower (*++needle);
+ 	      }
+-	    while (_tolower (*rhaystack) == a);
++	    while (_tolower (*rhaystack) == (int) a);
+ 
+ 	  needle = rneedle;		/* took the register-poor approach */
+ 
+Index: strstr.c
+===================================================================
+RCS file: /cvs/libc/sysdeps/generic/strstr.c,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- libc/sysdeps/generic/strstr.c	11 Sep 1997 03:18:20 -0000	1.10
++++ libc/sysdeps/generic/strstr.c	26 Nov 2000 07:30:03 -0000	1.11
+@@ -1,5 +1,5 @@
+ /* Return the offset of one string within another.
+-   Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1996, 1997, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -82,7 +82,9 @@
+ 	      a = *++haystack;
+ 	      if (a == '\0')
+ 		goto ret0;
+-shloop:	    }
++shloop:
++	      ;
++	    }
+           while (a != b);
+ 
+ jin:	  a = *++haystack;
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch
new file mode 100644
index 00000000..db70efb2
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch
@@ -0,0 +1,56 @@
+Fixes
+initgroups.c: In function `internal_getgrouplist':
+initgroups.c:179: error: parse error before "__FUNCTION__"
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	roland@sources.redhat.com	2001-12-16 21:52:12
+
+Modified files:
+	nss            : nsswitch.c 
+	grp            : initgroups.c 
+
+Log message:
+	2001-12-16  Roland McGrath  <roland@frob.com>
+	
+	* nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal.
+	* grp/initgroups.c (internal_getgrouplist): Likewise.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc
+
+Removed 2nd hunk for glibc-2.1.3 (it was just whitespace)
+
+===================================================================
+RCS file: /cvs/glibc/libc/grp/initgroups.c,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- libc/grp/initgroups.c	2001/07/06 04:54:46	1.26
++++ libc/grp/initgroups.c	2001/12/17 05:52:11	1.27
+@@ -176,7 +176,7 @@
+ 
+       /* This is really only for debugging.  */
+       if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	__libc_fatal ("illegal status in " __FUNCTION__);
++	__libc_fatal ("illegal status in internal_getgrouplist");
+ 
+       if (status != NSS_STATUS_SUCCESS
+ 	  && nss_next_action (nip, status) == NSS_ACTION_RETURN)
+
+===================================================================
+RCS file: /cvs/glibc/libc/nss/nsswitch.c,v
+retrieving revision 1.52
+retrieving revision 1.53
+diff -u -r1.52 -r1.53
+--- libc/nss/nsswitch.c	2001/07/17 08:21:36	1.52
++++ libc/nss/nsswitch.c	2001/12/17 05:52:11	1.53
+@@ -178,7 +178,7 @@
+     {
+       /* This is really only for debugging.  */
+        if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	 __libc_fatal ("illegal status in " __FUNCTION__);
++	 __libc_fatal ("illegal status in __nss_next");
+ 
+        if (nss_next_action (*ni, status) == NSS_ACTION_RETURN)
+ 	 return 1;
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch
new file mode 100644
index 00000000..f3bd4abf
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch
@@ -0,0 +1,33 @@
+programs/locfile.c: In function `locfile_read':
+programs/locfile.c:863: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/locale/locfile.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/locale'
+
+programs/locale.c: In function `print_item':
+programs/locale.c:666: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/locale/locale.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/locale'
+
+
+Mechanical changes to quiet the errors.
+
+--- glibc-2.1.3/locale/programs/locfile.c.old	Sun Apr 11 20:03:52 2004
++++ glibc-2.1.3/locale/programs/locfile.c	Sun Apr 11 20:04:47 2004
+@@ -860,6 +860,7 @@
+ 
+ 	    collate_end_weight (ldfile, result);
+ 	  illegal_weight:
++		;	/* gcc-3.4 requires a statement here */
+ 	  }
+ 	  continue;
+ 
+--- glibc-2.1.3/locale/programs/locale.c.old	Sun Apr 11 20:08:48 2004
++++ glibc-2.1.3/locale/programs/locale.c	Sun Apr 11 20:09:04 2004
+@@ -663,6 +663,7 @@
+ 	  }
+ 	  break;
+ 	default:
++		;       /* gcc-3.4 requires a statement here */
+ 	}
+       putchar ('\n');
+     }
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch
new file mode 100644
index 00000000..dde7bf34
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch
@@ -0,0 +1,39 @@
+Fixes compilation with gcc-3.4.0:
+
+mntent_r.c: In function `__getmntent_r':
+mntent_r.c:146: error: label at end of compound statement
+mntent_r.c: In function `__addmntent':
+mntent_r.c:214: warning: implicit declaration of function `alloca'
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/misc/mntent_r.c.diff?r1=1.9&r2=1.11&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/misc/mntent_r.c,v
+retrieving revision 1.9
+retrieving revision 1.11
+diff -u -r1.9 -r1.11
+--- libc/misc/mntent_r.c	1999/07/26 01:45:32	1.9
++++ libc/misc/mntent_r.c	2000/11/28 07:27:14	1.11
+@@ -1,5 +1,5 @@
+ /* Utilities for reading/writing fstab, mtab, etc.
+-   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1995,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -17,6 +17,7 @@
+    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
+ 
++#include <alloca.h>
+ #include <mntent.h>
+ #include <stdio.h>
+ #include <string.h>
+@@ -143,6 +144,7 @@
+     case 1:
+       mp->mnt_passno = 0;
+     case 2:
++      break;
+     }
+   funlockfile (stream);
+ 
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch
new file mode 100644
index 00000000..c54d7a22
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch
@@ -0,0 +1,33 @@
+Fixes gcc-3.4.0 compilation errors
+
+rpc_hout.c: In function `print_funcdef':
+rpc_hout.c:140: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/sunrpc/rpc_hout.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/sunrpc'
+
+rpc_cout.c: In function `emit_inline':
+rpc_cout.c:743: error: label at end of compound statement
+...
+
+--- glibc-2.1.3/sunrpc/rpc_hout.c.old	Sun Apr 11 22:06:26 2004
++++ glibc-2.1.3/sunrpc/rpc_hout.c	Sun Apr 11 22:06:42 2004
+@@ -136,7 +136,7 @@
+       pprogramdef (def);
+       break;
+     default:
+-      /* ?... shouldn't happen I guess */
++      ; /* ?... shouldn't happen I guess */
+     }
+ }
+ 
+--- glibc-2.1.3/sunrpc/rpc_cout.c.old	Sun Apr 11 22:10:39 2004
++++ glibc-2.1.3/sunrpc/rpc_cout.c	Sun Apr 11 22:10:53 2004
+@@ -739,7 +739,7 @@
+       f_print (fout, "}\n");
+       break;
+     default:
+-      /* ?... do nothing I guess */
++      ; /* ?... do nothing I guess */
+     }
+ }
+ 
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch
new file mode 100644
index 00000000..eb03dd02
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch
@@ -0,0 +1,11 @@
+--- glibc-2.1.3/configure.old	2004-03-04 11:05:49.000000000 -0800
++++ glibc-2.1.3/configure	2004-03-04 11:07:58.000000000 -0800
+@@ -1273,7 +1273,7 @@
+   ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustp-]*[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    egcs-2.9[1-9].*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*gcc-2.9[1-9].*|pgcc-2.90.2[789]|pgcc-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9].*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9])
++    egcs-2.9[1-9].*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*gcc-2.9[1-9].*|pgcc-2.90.2[789]|pgcc-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[2-9]*|cygnus-2.9[1-9].*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9])
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch
new file mode 100644
index 00000000..2a98ac94
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch
@@ -0,0 +1,171 @@
+	* sysdeps/i386/dl-machine.h (RTLD_START): Don't use multi-line
+	strings.
+	(ELF_MACHINE_RUNTIME_TRAMPOLINE): Likewise.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.82&r2=1.83&cvsroot=glibc&hideattic=0
+backported a bit
+
+--- glibc-2.1.3/sysdeps/i386/dl-machine.h.old	1999-02-20 10:19:47.000000000 -0800
++++ glibc-2.1.3/sysdeps/i386/dl-machine.h	2004-03-05 15:56:25.000000000 -0800
+@@ -124,68 +124,68 @@
+    and then redirect to the address it returns.  */
+ #ifndef PROF
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.type _dl_runtime_resolve, @function
+-	.align 16
+-_dl_runtime_resolve:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note
+-	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.
+-	call fixup		# Call resolver.
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_profile, @function
+-	.align 16
+-_dl_runtime_profile:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 20(%esp), %ecx	# Load return address
+-	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note
+-	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.
+-	call profile_fixup	# Call resolver.
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_profile, .-_dl_runtime_profile
+-	.previous
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.type _dl_runtime_resolve, @function\n\
++	.align 16\n\
++_dl_runtime_resolve:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note\n\
++	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.\n\
++	call fixup		# Call resolver.\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_profile, @function\n\
++	.align 16\n\
++_dl_runtime_profile:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 20(%esp), %ecx	# Load return address\n\
++	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note\n\
++	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.\n\
++	call profile_fixup	# Call resolver.\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
++	.previous\n\
+ ");
+ #else
+-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_resolve, @function
+-	.type _dl_runtime_profile, @function
+-	.align 16
+-_dl_runtime_resolve:
+-_dl_runtime_profile:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 16(%esp), %edx	# Push the arguments for `fixup'
+-	movl 12(%esp), %eax
+-	pushl %edx
+-	pushl %eax
+-	call fixup		# Call resolver.
+-	popl %edx		# Pop the parameters
+-	popl %ecx
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-	.size _dl_runtime_profile, .-_dl_runtime_profile
+-	.previous
++# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_resolve, @function\n\
++	.type _dl_runtime_profile, @function\n\
++	.align 16\n\
++_dl_runtime_resolve:\n\
++_dl_runtime_profile:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 16(%esp), %edx	# Push the arguments for `fixup'\n\
++	movl 12(%esp), %eax\n\
++	pushl %edx\n\
++	pushl %eax\n\
++	call fixup		# Call resolver.\n\
++	popl %edx		# Pop the parameters\n\
++	popl %ecx\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
++	.previous\n\
+ ");
+ #endif
+ 
+@@ -197,10 +197,10 @@
+    The C function `_dl_start' is the real entry point;
+    its return value is the user program's entry point.  */
+ 
+-#define RTLD_START asm ("\
+-.text\n\
+-.globl _start\n\
+-.globl _dl_start_user\n\
++#define RTLD_START asm ("\n\
++	.text\n\
++	.globl _start\n\
++	.globl _dl_start_user\n\
+ _start:\n\
+ 	pushl %esp\n\
+ 	call _dl_start\n\
+@@ -208,7 +208,7 @@
+ _dl_start_user:\n\
+ 	# Save the user entry point address in %edi.\n\
+ 	movl %eax, %edi\n\
+-	# Point %ebx at the GOT.
++	# Point %ebx at the GOT.\n\
+ 	call 0f\n\
+ 0:	popl %ebx\n\
+ 	addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx\n\
+@@ -255,7 +255,7 @@
+ 	movl _dl_fini@GOT(%ebx), %edx\n\
+ 	# Jump to the user's entry point.\n\
+ 	jmp *%edi\n\
+-.previous\n\
++	.previous\n\
+ ");
+ 
+ /* Nonzero iff TYPE should not be allowed to resolve to one of
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch
new file mode 100644
index 00000000..7c035298
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch
@@ -0,0 +1,48 @@
+Backport from cvs 
+
+Fixes:
+
+../sysdeps/unix/sysv/linux/errlist.c:41: weak declaration of `_old_sys_nerr' must precede definition
+make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/stdio-common/errlist.os] Error 1
+
+as well as breakage on arches where ; is a comment char in asm
+
+--- glibc-2.1.3/sysdeps/unix/sysv/linux/errlist.c.old	2004-03-05 15:32:21.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/errlist.c	2004-03-05 15:39:39.000000000 -0800
+@@ -24,13 +24,13 @@
+ # define SYS_ERRLIST __new_sys_errlist
+ # define SYS_NERR __new_sys_nerr
+ 
+-asm (".data; .globl __old_sys_errlist;  __old_sys_errlist:");
++asm (".data\n\t.globl __old_sys_errlist\n\t __old_sys_errlist:");
+ #endif
+ 
+ #include <sysdeps/gnu/errlist.c>
+ 
+ #if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+-asm (".type __old_sys_errlist,@object;.size __old_sys_errlist,"
++asm (".type __old_sys_errlist,@object\n\t.size __old_sys_errlist,"
+      OLD_ERRLIST_SIZE_STR "*" PTR_SIZE_STR);
+ 
+ extern const char *const *__old_sys_errlist;
+@@ -38,17 +38,16 @@
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ symbol_version (__old_sys_nerr, _sys_nerr, GLIBC_2.0);
+ symbol_version (_old_sys_nerr, sys_nerr, GLIBC_2.0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ symbol_version (__old_sys_errlist, _sys_errlist, GLIBC_2.0);
+ symbol_version (_old_sys_errlist, sys_errlist, GLIBC_2.0);
+ 
+-weak_alias (__new_sys_nerr, _new_sys_nerr)
++strong_alias (__new_sys_nerr, _new_sys_nerr)
+ default_symbol_version (__new_sys_nerr, _sys_nerr, GLIBC_2.1);
+ default_symbol_version (_new_sys_nerr, sys_nerr, GLIBC_2.1);
+-weak_alias (__new_sys_errlist, _new_sys_errlist)
++strong_alias (__new_sys_errlist, _new_sys_errlist)
+ default_symbol_version (__new_sys_errlist, _sys_errlist, GLIBC_2.1);
+ default_symbol_version (_new_sys_errlist, sys_errlist, GLIBC_2.1);
+ 
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch
new file mode 100644
index 00000000..99ef3564
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch
@@ -0,0 +1,774 @@
+--- glibc-2.1.3/stdlib/longlong.h.old	2004-03-05 14:49:14.000000000 -0800
++++ glibc-2.1.3/stdlib/longlong.h	2004-03-05 15:19:26.000000000 -0800
+@@ -106,8 +106,8 @@
+ 
+ #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add %1,%4,%5
+-	addc %0,%2,%3"							\
++  __asm__ ("add %1,%4,%5\n"						\
++	"addc %0,%2,%3"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	    "=&r" ((USItype)(sl))					\
+ 	   : "%r" ((USItype)(ah)),					\
+@@ -115,8 +115,8 @@
+ 	     "%r" ((USItype)(al)),					\
+ 	     "rI" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub %1,%4,%5
+-	subc %0,%2,%3"							\
++  __asm__ ("sub %1,%4,%5\n"						\
++	"subc %0,%2,%3"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "r" ((USItype)(ah)),					\
+@@ -173,8 +173,8 @@
+ 
+ #if defined (__arm__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("adds	%1, %4, %5
+-	adc	%0, %2, %3"						\
++  __asm__ ("adds	%1, %4, %5\n"					\
++	"adc	%0, %2, %3"						\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%r" ((USItype)(ah)),					\
+@@ -182,8 +182,8 @@
+ 	     "%r" ((USItype)(al)),					\
+ 	     "rI" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subs	%1, %4, %5
+-	sbc	%0, %2, %3"						\
++  __asm__ ("subs	%1, %4, %5\n"					\
++	"sbc	%0, %2, %3"						\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "r" ((USItype)(ah)),					\
+@@ -192,19 +192,19 @@
+ 	     "rI" ((USItype)(bl)))
+ #if 0
+ #define umul_ppmm(xh, xl, a, b) \
+-  __asm__ ("%@ Inlined umul_ppmm
+-	mov	%|r0, %2, lsr #16
+-	mov	%|r2, %3, lsr #16
+-	bic	%|r1, %2, %|r0, lsl #16
+-	bic	%|r2, %3, %|r2, lsl #16
+-	mul	%1, %|r1, %|r2
+-	mul	%|r2, %|r0, %|r2
+-	mul	%|r1, %0, %|r1
+-	mul	%0, %|r0, %0
+-	adds	%|r1, %|r2, %|r1
+-	addcs	%0, %0, #65536
+-	adds	%1, %1, %|r1, lsl #16
+-	adc	%0, %0, %|r1, lsr #16"					\
++  __asm__ ("%@ Inlined umul_ppmm\n"					\
++	"mov	%|r0, %2, lsr #16\n"					\
++	"mov	%|r2, %3, lsr #16\n"					\
++	"bic	%|r1, %2, %|r0, lsl #16\n"				\
++	"bic	%|r2, %3, %|r2, lsl #16\n"				\
++	"mul	%1, %|r1, %|r2\n"					\
++	"mul	%|r2, %|r0, %|r2\n"					\
++	"mul	%|r1, %0, %|r1\n"					\
++	"mul	%0, %|r0, %0\n"						\
++	"adds	%|r1, %|r2, %|r1\n"					\
++	"addcs	%0, %0, #65536\n"					\
++	"adds	%1, %1, %|r1, lsl #16\n"				\
++	"adc	%0, %0, %|r1, lsr #16"					\
+ 	   : "=&r" ((USItype)(xh)),					\
+ 	     "=r" ((USItype)(xl))					\
+ 	   : "r" ((USItype)(a)),					\
+@@ -245,8 +245,8 @@
+ 
+ #if defined (__gmicro__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add.w %5,%1
+-	addx %3,%0"							\
++  __asm__ ("add.w %5,%1\n"						\
++	"addx %3,%0"							\
+ 	   : "=g" ((USItype)(sh)),					\
+ 	     "=&g" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -254,8 +254,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "g" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub.w %5,%1
+-	subx %3,%0"							\
++  __asm__ ("sub.w %5,%1\n"						\
++	"subx %3,%0"							\
+ 	   : "=g" ((USItype)(sh)),					\
+ 	     "=&g" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
+@@ -284,8 +284,8 @@
+ 
+ #if defined (__hppa) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add %4,%5,%1
+-	addc %2,%3,%0"							\
++  __asm__ ("add %4,%5,%1\n"						\
++	"addc %2,%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%rM" ((USItype)(ah)),					\
+@@ -293,8 +293,8 @@
+ 	     "%rM" ((USItype)(al)),					\
+ 	     "rM" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub %4,%5,%1
+-	subb %2,%3,%0"							\
++  __asm__ ("sub %4,%5,%1\n"						\
++	"subb %2,%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "rM" ((USItype)(ah)),					\
+@@ -332,22 +332,22 @@
+   do {									\
+     USItype __tmp;							\
+     __asm__ (								\
+-       "ldi		1,%0
+-	extru,=		%1,15,16,%%r0		; Bits 31..16 zero?
+-	extru,tr	%1,15,16,%1		; No.  Shift down, skip add.
+-	ldo		16(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,23,8,%%r0		; Bits 15..8 zero?
+-	extru,tr	%1,23,8,%1		; No.  Shift down, skip add.
+-	ldo		8(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,27,4,%%r0		; Bits 7..4 zero?
+-	extru,tr	%1,27,4,%1		; No.  Shift down, skip add.
+-	ldo		4(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,29,2,%%r0		; Bits 3..2 zero?
+-	extru,tr	%1,29,2,%1		; No.  Shift down, skip add.
+-	ldo		2(%0),%0		; Yes.  Perform add.
+-	extru		%1,30,1,%1		; Extract bit 1.
+-	sub		%0,%1,%0		; Subtract it.
+-	" : "=r" (count), "=r" (__tmp) : "1" (x));			\
++       "ldi		1,%0\n"						\
++	"extru,=	%1,15,16,%%r0		; Bits 31..16 zero?\n"			\
++	"extru,tr	%1,15,16,%1		; No.  Shift down, skip add.\n"		\
++	"ldo		16(%0),%0		; Yes.  Perform add.\n"			\
++	"extru,=	%1,23,8,%%r0		; Bits 15..8 zero?\n"			\
++	"extru,tr	%1,23,8,%1		; No.  Shift down, skip add.\n"		\
++	"ldo		8(%0),%0		; Yes.  Perform add.\n"			\
++	"extru,=	%1,27,4,%%r0		; Bits 7..4 zero?\n"			\
++	"extru,tr	%1,27,4,%1		; No.  Shift down, skip add.\n"		\
++	"ldo		4(%0),%0		; Yes.  Perform add.\n"			\
++	"extru,=	%1,29,2,%%r0		; Bits 3..2 zero?\n"			\
++	"extru,tr	%1,29,2,%1		; No.  Shift down, skip add.\n"		\
++	"ldo		2(%0),%0		; Yes.  Perform add.\n"			\
++	"extru		%1,30,1,%1		; Extract bit 1.\n"			\
++	"sub		%0,%1,%0		; Subtract it.\n"			\
++	: "=r" (count), "=r" (__tmp) : "1" (x));			\
+   } while (0)
+ #endif /* hppa */
+ 
+@@ -394,8 +394,8 @@
+ 
+ #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addl %5,%1
+-	adcl %3,%0"							\
++  __asm__ ("addl %5,%1\n"						\
++	"adcl %3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -403,8 +403,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "g" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subl %5,%1
+-	sbbl %3,%0"							\
++  __asm__ ("subl %5,%1\n"						\
++	"sbbl %3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
+@@ -516,8 +516,8 @@
+ 
+ #if (defined (__mc68000__) || defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add%.l %5,%1
+-	addx%.l %3,%0"							\
++  __asm__ ("add%.l %5,%1\n"						\
++	"addx%.l %3,%0"							\
+ 	   : "=d" ((USItype)(sh)),					\
+ 	     "=&d" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -525,8 +525,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "g" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub%.l %5,%1
+-	subx%.l %3,%0"							\
++  __asm__ ("sub%.l %5,%1\n"						\
++	"subx%.l %3,%0"							\
+ 	   : "=d" ((USItype)(sh)),					\
+ 	     "=&d" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
+@@ -564,28 +564,28 @@
+ #else /* not mc68020 */
+ #define umul_ppmm(xh, xl, a, b) \
+   do { USItype __umul_tmp1, __umul_tmp2;				\
+-	__asm__ ("| Inlined umul_ppmm
+-	move%.l	%5,%3
+-	move%.l	%2,%0
+-	move%.w	%3,%1
+-	swap	%3
+-	swap	%0
+-	mulu	%2,%1
+-	mulu	%3,%0
+-	mulu	%2,%3
+-	swap	%2
+-	mulu	%5,%2
+-	add%.l	%3,%2
+-	jcc	1f
+-	add%.l	%#0x10000,%0
+-1:	move%.l	%2,%3
+-	clr%.w	%2
+-	swap	%2
+-	swap	%3
+-	clr%.w	%3
+-	add%.l	%3,%1
+-	addx%.l	%2,%0
+-	| End inlined umul_ppmm"					\
++	__asm__ ("| Inlined umul_ppmm\n"				\
++	"move%.l	%5,%3\n"					\
++	"move%.l	%2,%0\n"					\
++	"move%.w	%3,%1\n"					\
++	"swap	%3\n"							\
++	"swap	%0\n"							\
++	"mulu	%2,%1\n"						\
++	"mulu	%3,%0\n"						\
++	"mulu	%2,%3\n"						\
++	"swap	%2\n"							\
++	"mulu	%5,%2\n"						\
++	"add%.l	%3,%2\n"						\
++	"jcc	1f\n"							\
++	"add%.l	%#0x10000,%0\n"						\
++"1:	move%.l	%2,%3\n"						\
++	"clr%.w	%2\n"							\
++	"swap	%2\n"							\
++	"swap	%3\n"							\
++	"clr%.w	%3\n"							\
++	"add%.l	%3,%1\n"						\
++	"addx%.l	%2,%0\n"					\
++	"| End inlined umul_ppmm"					\
+ 	      : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)),		\
+ 		"=d" (__umul_tmp1), "=&d" (__umul_tmp2)			\
+ 	      : "%2" ((USItype)(a)), "d" ((USItype)(b)));		\
+@@ -597,8 +597,8 @@
+ 
+ #if defined (__m88000__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addu.co %1,%r4,%r5
+-	addu.ci %0,%r2,%r3"						\
++  __asm__ ("addu.co %1,%r4,%r5\n"					\
++	"addu.ci %0,%r2,%r3"						\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%rJ" ((USItype)(ah)),					\
+@@ -606,8 +606,8 @@
+ 	     "%rJ" ((USItype)(al)),					\
+ 	     "rJ" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subu.co %1,%r4,%r5
+-	subu.ci %0,%r2,%r3"						\
++  __asm__ ("subu.co %1,%r4,%r5\n"					\
++	"subu.ci %0,%r2,%r3"						\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "rJ" ((USItype)(ah)),					\
+@@ -665,9 +665,9 @@
+ 	     "d" ((USItype)(v)))
+ #else
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("multu %2,%3
+-	mflo %0
+-	mfhi %1"							\
++  __asm__ ("multu %2,%3\n"						\
++	"mflo %0\n"							\
++	"mfhi %1"							\
+ 	   : "=d" ((USItype)(w0)),					\
+ 	     "=d" ((USItype)(w1))					\
+ 	   : "d" ((USItype)(u)),					\
+@@ -687,9 +687,9 @@
+ 	     "d" ((UDItype)(v)))
+ #else
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("dmultu %2,%3
+-	mflo %0
+-	mfhi %1"							\
++  __asm__ ("dmultu %2,%3\n"						\
++	"mflo %0\n"							\
++	"mfhi %1"							\
+ 	   : "=d" ((UDItype)(w0)),					\
+ 	     "=d" ((UDItype)(w1))					\
+ 	   : "d" ((UDItype)(u)),					\
+@@ -857,8 +857,8 @@
+ 
+ #if defined (__pyr__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addw	%5,%1
+-	addwc	%3,%0"							\
++  __asm__ ("addw	%5,%1\n"					\
++	"addwc	%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -866,8 +866,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "g" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subw	%5,%1
+-	subwb	%3,%0"							\
++  __asm__ ("subw	%5,%1\n"					\
++	"subwb	%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
+@@ -879,8 +879,8 @@
+   ({union {UDItype __ll;						\
+ 	   struct {USItype __h, __l;} __i;				\
+ 	  } __xx;							\
+-  __asm__ ("movw %1,%R0
+-	uemul %2,%0"							\
++  __asm__ ("movw %1,%R0\n"						\
++	"uemul %2,%0"							\
+ 	   : "=&r" (__xx.__ll)						\
+ 	   : "g" ((USItype) (u)),					\
+ 	     "g" ((USItype)(v)));					\
+@@ -889,8 +889,8 @@
+ 
+ #if defined (__ibm032__) /* RT/ROMP */  && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("a %1,%5
+-	ae %0,%3"							\
++  __asm__ ("a %1,%5\n"							\
++	"ae %0,%3"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -898,8 +898,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "r" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("s %1,%5
+-	se %0,%3"							\
++  __asm__ ("s %1,%5\n"							\
++	"se %0,%3"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
+@@ -910,26 +910,26 @@
+   do {									\
+     USItype __m0 = (m0), __m1 = (m1);					\
+     __asm__ (								\
+-       "s	r2,r2
+-	mts	r10,%2
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	cas	%0,r2,r0
+-	mfs	r10,%1"							\
++       "s	r2,r2\n"						\
++	"mts	r10,%2\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"m	r2,%3\n"						\
++	"cas	%0,r2,r0\n"						\
++	"mfs	r10,%1"							\
+ 	     : "=r" ((USItype)(ph)),					\
+ 	       "=r" ((USItype)(pl))					\
+ 	     : "%r" (__m0),						\
+@@ -959,9 +959,9 @@
+ #if defined (__sh2__) && W_TYPE_SIZE == 32
+ #define umul_ppmm(w1, w0, u, v) \
+   __asm__ (								\
+-       "dmulu.l	%2,%3
+-	sts	macl,%1
+-	sts	mach,%0"						\
++       "dmulu.l	%2,%3\n"						\
++	"sts	macl,%1\n"						\
++	"sts	mach,%0"						\
+ 	   : "=r" ((USItype)(w1)),					\
+ 	     "=r" ((USItype)(w0))					\
+ 	   : "r" ((USItype)(u)),					\
+@@ -972,8 +972,8 @@
+ 
+ #if defined (__sparc__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addcc %r4,%5,%1
+-	addx %r2,%3,%0"							\
++  __asm__ ("addcc %r4,%5,%1\n"						\
++	"addx %r2,%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "%rJ" ((USItype)(ah)),					\
+@@ -982,8 +982,8 @@
+ 	     "rI" ((USItype)(bl))					\
+ 	   __CLOBBER_CC)
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subcc %r4,%5,%1
+-	subx %r2,%3,%0"							\
++  __asm__ ("subcc %r4,%5,%1\n"						\
++	"subx %r2,%3,%0"							\
+ 	   : "=r" ((USItype)(sh)),					\
+ 	     "=&r" ((USItype)(sl))					\
+ 	   : "rJ" ((USItype)(ah)),					\
+@@ -1029,45 +1029,45 @@
+ 	     "r" ((USItype)(v)))
+ #define UMUL_TIME 5
+ #define udiv_qrnnd(q, r, n1, n0, d) \
+-  __asm__ ("! Inlined udiv_qrnnd
+-	wr	%%g0,%2,%%y	! Not a delayed write for sparclite
+-	tst	%%g0
+-	divscc	%3,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%0
+-	rd	%%y,%1
+-	bl,a 1f
+-	add	%1,%4,%1
+-1:	! End of inline udiv_qrnnd"					\
++  __asm__ ("! Inlined udiv_qrnnd\n"					\
++	"wr	%%g0,%2,%%y	! Not a delayed write for sparclite\n"	\
++	"tst	%%g0\n"							\
++	"divscc	%3,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%%g1\n"						\
++	"divscc	%%g1,%4,%0\n"						\
++	"rd	%%y,%1\n"						\
++	"bl,a 1f\n"							\
++	"add	%1,%4,%1\n"						\
++"1:	! End of inline udiv_qrnnd"					\
+ 	   : "=r" ((USItype)(q)),					\
+ 	     "=r" ((USItype)(r))					\
+ 	   : "r" ((USItype)(n1)),					\
+@@ -1087,46 +1087,46 @@
+ /* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd.  */
+ #ifndef umul_ppmm
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("! Inlined umul_ppmm
+-	wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr
+-	sra	%3,31,%%g2	! Don't move this insn
+-	and	%2,%%g2,%%g2	! Don't move this insn
+-	andcc	%%g0,0,%%g1	! Don't move this insn
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,0,%%g1
+-	add	%%g1,%%g2,%0
+-	rd	%%y,%1"							\
++  __asm__ ("! Inlined umul_ppmm\n"					\
++	"wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr\n" \
++	"sra	%3,31,%%g2	! Don't move this insn\n"		\
++	"and	%2,%%g2,%%g2	! Don't move this insn\n"		\
++	"andcc	%%g0,0,%%g1	! Don't move this insn\n"		\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,%3,%%g1\n"						\
++	"mulscc	%%g1,0,%%g1\n"						\
++	"add	%%g1,%%g2,%0\n"						\
++	"rd	%%y,%1"							\
+ 	   : "=r" ((USItype)(w1)),					\
+ 	     "=r" ((USItype)(w0))					\
+ 	   : "%rI" ((USItype)(u)),					\
+@@ -1138,30 +1138,30 @@
+ /* It's quite necessary to add this much assembler for the sparc.
+    The default udiv_qrnnd (in C) is more than 10 times slower!  */
+ #define udiv_qrnnd(q, r, n1, n0, d) \
+-  __asm__ ("! Inlined udiv_qrnnd
+-	mov	32,%%g1
+-	subcc	%1,%2,%%g0
+-1:	bcs	5f
+-	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+-	sub	%1,%2,%1	! this kills msb of n
+-	addx	%1,%1,%1	! so this can't give carry
+-	subcc	%%g1,1,%%g1
+-2:	bne	1b
+-	 subcc	%1,%2,%%g0
+-	bcs	3f
+-	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+-	b	3f
+-	 sub	%1,%2,%1	! this kills msb of n
+-4:	sub	%1,%2,%1
+-5:	addxcc	%1,%1,%1
+-	bcc	2b
+-	 subcc	%%g1,1,%%g1
+-! Got carry from n.  Subtract next step to cancel this carry.
+-	bne	4b
+-	 addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb
+-	sub	%1,%2,%1
+-3:	xnor	%0,0,%0
+-	! End of inline udiv_qrnnd"					\
++  __asm__ ("! Inlined udiv_qrnnd\n"					\
++	"mov	32,%%g1\n"						\
++	"subcc	%1,%2,%%g0\n"						\
++"1:	bcs	5f\n"							\
++	"addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n"	\
++	"sub	%1,%2,%1	! this kills msb of n\n"		\
++	"addx	%1,%1,%1	! so this can't give carry\n"		\
++	"subcc	%%g1,1,%%g1\n"						\
++"2:	bne	1b\n"							\
++	"subcc	%1,%2,%%g0\n"						\
++	"bcs	3f\n"							\
++	"addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n"	\
++	"b	3f\n"							\
++	"sub	%1,%2,%1	! this kills msb of n\n"		\
++"4:	sub	%1,%2,%1\n"						\
++"5:	addxcc	%1,%1,%1\n"						\
++	"bcc	2b\n"							\
++	"subcc	%%g1,1,%%g1\n"						\
++"! Got carry from n.  Subtract next step to cancel this carry.\n"	\
++	"bne	4b\n"							\
++	"addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb\n"	\
++	"sub	%1,%2,%1\n"						\
++"3:	xnor	%0,0,%0\n"						\
++	"! End of inline udiv_qrnnd"					\
+ 	   : "=&r" ((USItype)(q)),					\
+ 	     "=&r" ((USItype)(r))					\
+ 	   : "r" ((USItype)(d)),					\
+@@ -1179,11 +1179,11 @@
+ #if (defined (__sparc_v9__) || (defined (__sparc__) && defined (__arch64__)) \
+     || defined (__sparcv9)) && W_TYPE_SIZE == 64
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl)				\
+-  __asm__ ("addcc %r4,%5,%1
+-  	    add %r2,%3,%0
+-  	    bcs,a,pn %%xcc, 1f
+-  	    add %0, 1, %0
+-  	    1:"								\
++  __asm__ ("addcc %r4,%5,%1\n"						\
++  	    "add %r2,%3,%0\n"						\
++  	    "bcs,a,pn %%xcc, 1f\n"					\
++  	    "add %0, 1, %0\n"						\
++  	    "1:"							\
+ 	   : "=r" ((UDItype)(sh)),				      	\
+ 	     "=&r" ((UDItype)(sl))				      	\
+ 	   : "r" ((UDItype)(ah)),				     	\
+@@ -1193,11 +1193,11 @@
+ 	   : "cc")
+ 
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) 				\
+-  __asm__ ("subcc %r4,%5,%1
+-  	    sub %r2,%3,%0
+-  	    bcs,a,pn %%xcc, 1f
+-  	    sub %0, 1, %0
+-  	    1:"								\
++  __asm__ ("subcc %r4,%5,%1\n"						\
++  	    "sub %r2,%3,%0\n"						\
++  	    "bcs,a,pn %%xcc, 1f\n"					\
++  	    "sub %0, 1, %0\n"						\
++  	    "1:"							\
+ 	   : "=r" ((UDItype)(sh)),				      	\
+ 	     "=&r" ((UDItype)(sl))				      	\
+ 	   : "r" ((UDItype)(ah)),				     	\
+@@ -1210,27 +1210,27 @@
+   do {									\
+ 	  UDItype tmp1, tmp2, tmp3, tmp4;				\
+ 	  __asm__ __volatile__ (					\
+-		   "srl %7,0,%3
+-		    mulx %3,%6,%1
+-		    srlx %6,32,%2
+-		    mulx %2,%3,%4
+-		    sllx %4,32,%5
+-		    srl %6,0,%3
+-		    sub %1,%5,%5
+-		    srlx %5,32,%5
+-		    addcc %4,%5,%4
+-		    srlx %7,32,%5
+-		    mulx %3,%5,%3
+-		    mulx %2,%5,%5
+-		    sethi %%hi(0x80000000),%2
+-		    addcc %4,%3,%4
+-		    srlx %4,32,%4
+-		    add %2,%2,%2
+-		    movcc %%xcc,%%g0,%2
+-		    addcc %5,%4,%5
+-		    sllx %3,32,%3
+-		    add %1,%3,%1
+-		    add %5,%2,%0"					\
++		   "srl %7,0,%3\n"					\
++		    "mulx %3,%6,%1\n"					\
++		    "srlx %6,32,%2\n"					\
++		    "mulx %2,%3,%4\n"					\
++		    "sllx %4,32,%5\n"					\
++		    "srl %6,0,%3\n"					\
++		    "sub %1,%5,%5\n"					\
++		    "srlx %5,32,%5\n"					\
++		    "addcc %4,%5,%4\n"					\
++		    "srlx %7,32,%5\n"					\
++		    "mulx %3,%5,%3\n"					\
++		    "mulx %2,%5,%5\n"					\
++		    "sethi %%hi(0x80000000),%2\n"			\
++		    "addcc %4,%3,%4\n"					\
++		    "srlx %4,32,%4\n"					\
++		    "add %2,%2,%2\n"					\
++		    "movcc %%xcc,%%g0,%2\n"				\
++		    "addcc %5,%4,%5\n"					\
++		    "sllx %3,32,%3\n"					\
++		    "add %1,%3,%1\n"					\
++		    "add %5,%2,%0"					\
+ 	   : "=r" ((UDItype)(wh)),					\
+ 	     "=&r" ((UDItype)(wl)),					\
+ 	     "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)	\
+@@ -1244,8 +1244,8 @@
+ 
+ #if defined (__vax__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addl2 %5,%1
+-	adwc %3,%0"							\
++  __asm__ ("addl2 %5,%1\n"						\
++	"adwc %3,%0"							\
+ 	   : "=g" ((USItype)(sh)),					\
+ 	     "=&g" ((USItype)(sl))					\
+ 	   : "%0" ((USItype)(ah)),					\
+@@ -1253,8 +1253,8 @@
+ 	     "%1" ((USItype)(al)),					\
+ 	     "g" ((USItype)(bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subl2 %5,%1
+-	sbwc %3,%0"							\
++  __asm__ ("subl2 %5,%1\n"						\
++	"sbwc %3,%0"							\
+ 	   : "=g" ((USItype)(sh)),					\
+ 	     "=&g" ((USItype)(sl))					\
+ 	   : "0" ((USItype)(ah)),					\
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch
new file mode 100644
index 00000000..b1269e09
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch
@@ -0,0 +1,73 @@
+http://sources.redhat.com/ml/bug-glibc/2003-08/msg00087.html
+
+From: Gernot Hillier <gernot dot hillier at siemens dot com>
+Organization: Siemens AG
+To: Jeffrey Bedard <jefbed at e-list dot net>, bug-glibc at gnu dot org
+Date: Mon, 18 Aug 2003 08:50:03 +0200
+References: <3F3D0899.6020004@e-list.net>
+Message-Id: <200308180850.03431.gernot.hillier@siemens.com>
+Subject: Re: Build Fails with gcc 3.3.1
+X-BeenThere: bug-glibc@gnu.org
+
+Hi!
+
+Am Freitag, 15. August 2003 18:21 schrieb Jeffrey Bedard:
+> gcc sscanf.c -c -std=gnu99 -O2 -Wall -Winline -Wstrict-prototypes
+[...]
+> sscanf.c:31: warning: conflicting types for built-in function `sscanf'
+> sscanf.c: In function `sscanf':
+> sscanf.c:37: error: `va_start' used in function with fixed args
+> .../stdio-common/_itoa.h: At top level:
+> .../stdio-common/_itoa.h:40: warning: inlining failed in call to
+> `_itoa_word' .../stdio-common/_itoa.h:76: warning: called from here
+> make[2]: ***
+> [/home/jefbed/src/packages/glibc-build/stdio-common/sscanf.o] Error 1
+
+You can find the fitting patch in the glibc CVS. You have to replace some 
+function headers. 
+
+I created a patch for glibc-2.2.5 for the same reason. I don't know if it 
+applies cleanly, but if not it should at least show you what to do...
+
+-- 
+Bye,
+
+Gernot Hillier
+Siemens AG
+
+
+
+
+Content-Disposition: attachment; filename="glibc-2.2.5-gcc-3.3.diff"
+
+diff -ur glibc-2.2.5.orig/stdio-common/sprintf.c glibc-2.2.5/stdio-common/sprintf.c
+--- glibc-2.2.5.orig/stdio-common/sprintf.c	2001-07-06 06:55:41.000000000 +0200
++++ glibc-2.2.5/stdio-common/sprintf.c	2003-08-11 13:25:48.000000000 +0200
+@@ -27,9 +27,7 @@
+ /* Write formatted output into S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sprintf (s, format)
+-     char *s;
+-     const char *format;
++sprintf (char *s, const char *format,...)
+ {
+   va_list arg;
+   int done;
+Only in glibc-2.2.5/stdio-common: sprintf.c.orig
+Only in glibc-2.2.5/stdio-common: sprintf.c.rej
+diff -ur glibc-2.2.5.orig/stdio-common/sscanf.c glibc-2.2.5/stdio-common/sscanf.c
+--- glibc-2.2.5.orig/stdio-common/sscanf.c	2001-07-06 06:55:41.000000000 +0200
++++ glibc-2.2.5/stdio-common/sscanf.c	2003-08-11 13:27:58.000000000 +0200
+@@ -27,9 +27,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sscanf (s, format)
+-     const char *s;
+-     const char *format;
++sscanf (const char *s, const char *format,...)
+ {
+   va_list arg;
+   int done;
+
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch
new file mode 100644
index 00000000..e04b5691
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch
@@ -0,0 +1,29 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/i386/sysdep.h.diff?r1=1.40&r2=1.41&cvsroot=glibc
+See also http://gcc.gnu.org/PR12928, comment 6 (which says this is a glibc bug, not a gcc bug)
+
+Fixes
+/tmp/ccdGVIRa.s: Assembler messages:
+/tmp/ccdGVIRa.s:82: Error: non-constant expression in ".if" statement
+/tmp/ccdGVIRa.s:83: Error: non-constant expression in ".if" statement
+/tmp/ccdGVIRa.s:86: Error: non-constant expression in ".if" statement
+make[2]: *** [/crosstool-0.28-pre4/build/i686-unknown-linux-gnu/gcc-3.3.3-glibc-2.1.3/build-glibc/signal/sigsuspend.o] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/i386/sysdep.h,v
+retrieving revision 1.40
+retrieving revision 1.41
+diff -u -r1.40 -r1.41
+--- libc/sysdeps/unix/sysv/linux/i386/sysdep.h	2002/10/16 08:57:25	1.40
++++ libc/sysdeps/unix/sysv/linux/i386/sysdep.h	2002/11/28 05:21:48	1.41
+@@ -347,9 +347,9 @@
+ #define ASMFMT_1(arg1) \
+ 	, "acdSD" (arg1)
+ #define ASMFMT_2(arg1, arg2) \
+-	, "adCD" (arg1), "c" (arg2)
++	, "adSD" (arg1), "c" (arg2)
+ #define ASMFMT_3(arg1, arg2, arg3) \
+-	, "aCD" (arg1), "c" (arg2), "d" (arg3)
++	, "aSD" (arg1), "c" (arg2), "d" (arg3)
+ #define ASMFMT_4(arg1, arg2, arg3, arg4) \
+ 	, "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
+ #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch
new file mode 100644
index 00000000..ce888792
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch
@@ -0,0 +1,17 @@
+# gcc-3.x doesn't like run-on strings
+# See also http://sources.redhat.com/ml/libc-alpha/2004-01/msg00032.html
+
+--- glibc-2.1.3/csu/Makefile.old	2004-03-04 12:18:52.000000000 -0800
++++ glibc-2.1.3/csu/Makefile	2004-03-04 12:19:35.000000000 -0800
+@@ -188,8 +188,8 @@
+ 	 esac; \
+ 	 files="$(all-Banner-files)";				\
+ 	 if test -n "$$files"; then				\
+-	   echo "\"Available extensions:";			\
+-	   sed -e '/^#/d' -e 's/^[[:space:]]*/	/' $$files;	\
+-	   echo "\"";						\
++	   echo -e "\"Available extensions:\\\\n\"";		\
++  	   sed -e '/^#/d' -e 's/^[[:space:]]*/	/'		\
++	       -e 's/^\(.*\)$$/\"\1\\n\"/' $$files;		\
+ 	 fi) > $@T
+ 	mv -f $@T $@
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch b/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch
new file mode 100644
index 00000000..3f5e5f01
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch
@@ -0,0 +1,80 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.1.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+backported to glibc-2.1.3.
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+
+--- glibc-2.1.3/Makeconfig.old 	1999-11-29 11:19:20.000000000 -0800
++++ glibc-2.1.3/Makeconfig	2004-03-14 16:38:43.218750000 -0800
+@@ -406,7 +406,7 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # Choose the default search path for the dynamic linker based on
+ # where we will install libraries.
+ ifneq ($(libdir),$(slibdir))
+@@ -586,7 +586,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -636,14 +636,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ 
+--- glibc-2.1.3/Makerules.old 	1999-08-01 15:12:23.000000000 -0700
++++ glibc-2.1.3/Makerules	2004-03-14 16:39:07.906250000 -0800
+@@ -386,7 +386,7 @@
+ static-only-routines =
+ endif
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines))
+ elide-routines.os += $(static-only-routines)
+ 
+@@ -694,14 +694,14 @@
+ # of the files are taken by the linker.
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+ 	 echo '   Use the shared library, but some functions are only in';\
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/2.1.3/glibc-2.1.3-override.patch b/patches/glibc/2.1.3/glibc-2.1.3-override.patch
new file mode 100644
index 00000000..ddaaa9b2
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.1.3-override.patch
@@ -0,0 +1,48 @@
+The error
+
+make[2]: *** [.../gcc-3.3.3-glibc-2.1.3/i686-unknown-linux-gnu/share/zoneinfo/Africa/Algiers] Segmentation fault
+make[2]: Leaving directory `.../gcc-3.3.3-glibc-2.1.3/glibc-2.1.3/timezone'
+make[1]: *** [timezone/subdir_install] Error 2
+
+is caused by glibc trying to run something it just compiled.
+A crude workaround for this was posted at
+http://lists.scratchbox.org/pipermail/scratchbox-users/2004-February/000018.html
+but the following patch lets you optionally override these programs at
+make time by setting environment variables 
+  localedef_FOR_BUILD rpcgen_FOR_BUILD zic_FOR_BUILD
+and maybe a few others to point to versions of those programs
+that can run on the build machine.
+Thanks to http://groups.google.com/groups?selm=9012160052.AA23106%40kaos.ksr.com
+for pointing out the idiom for inline $(ifdef ...) in GNU Make.
+
+Dan Kegel 2004-05-17
+
+--- glibc-2.1.3/Makeconfig.old	1999-11-29 11:19:20.000000000 -0800
++++ glibc-2.1.3/Makeconfig	2004-05-17 15:57:53.000000000 -0700
+@@ -470,20 +470,24 @@
+ # The program binary is assumed to be $(word 2,$^).
+ built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^))
+ ifneq (yes,$(build-shared))
+-built-program-cmd = $(built-program-file)
++built-program-real = $(built-program-file)
+ else
+ comma = ,
+ sysdep-library-path = \
+ $(subst $(empty) ,:,$(strip $(patsubst -Wl$(comma)-rpath-link=%, %,\
+ 				       $(filter -Wl$(comma)-rpath-link=%,\
+ 						$(sysdep-LDFLAGS)))))
+-define built-program-cmd
++define built-program-real
+ $(elf-objpfx)$(rtld-installed-name) \
+ 	--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
+ 	$(built-program-file)
+ endef
+ endif
+ 
++# If user set foo_FOR_BUILD, use that instead of actually running the program we just linked.
++built-program-override-name = $(notdir $(word 2,$^))_FOR_BUILD
++built-program-cmd = $(if $(findstring undefined,$(origin $(built-program-override-name))),$(built-program-real),$($(built-program-override-name)))
++
+ ifndef LD
+ LD := ld -X
+ endif
diff --git a/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch b/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch
new file mode 100644
index 00000000..a14e1d45
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch
@@ -0,0 +1,30 @@
+Fixes undefined symbol _fp_hw required by the ABI:
+readelf -s /opt/crosstool/i686-pc-linux-gnu/i686-unknown-linux-gnu/gcc-3.4.3-glibc-2.2.2/i686-unknown-linux-gnu/lib/crt1.o | grep fp_hw
+    29: 00000000     4 NOTYPE  GLOBAL DEFAULT  UND _fp_hw 
+Rumored to fix problems with icc, which gets upset at any symbol
+which is undefined, even if nobody cares about it.
+
+Revision 1.16, Thu Feb 22 19:57:34 2001 UTC (4 years, 2 months ago) by drepper
+Branch: MAIN
+CVS Tags: glibc-2_2_3
+Changes since 1.15: +1 -1 lines
+Diff to previous 1.15 (colored)
+
+(_fp_hw): Actually define label.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/elf/start.S,v
+retrieving revision 1.15
+retrieving revision 1.16
+diff -u -r1.15 -r1.16
+--- libc/sysdeps/i386/elf/start.S	2001/02/03 21:34:54	1.15
++++ libc/sysdeps/i386/elf/start.S	2001/02/22 19:57:34	1.16
+@@ -85,7 +85,7 @@
+    meaningless since we don't support machines < 80386.  */
+ 	.section .rodata
+ 	.globl _fp_hw
+-	.long 3
++_fp_hw:	.long 3
+ 	.size _fp_hw, 4
+ 
+ /* Define a symbol for the first piece of initialized data.  */
diff --git a/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch
new file mode 100644
index 00000000..1ed64806
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch
@@ -0,0 +1,26 @@
+Fixes 
+./stdio.texi:2491: First argument to cross-reference may not be empty.
+./stdio.texi:2492: First argument to cross-reference may not be empty.
+makeinfo: Removing output file `/home/dank/crosstool-0.25/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/manual/libc.info' due to errors; use --force to preserve.
+make[2]: *** [libc.info] Error 2
+
+Patch from glib-2.2; Line numbers adjusted.
+
+===================================================================
+RCS file: /cvs/glibc/libc/manual/stdio.texi,v
+retrieving revision 1.126
+retrieving revision 1.127
+diff -u -r1.126 -r1.127
+--- libc/manual/stdio.texi	2001/06/06 07:11:00
++++ libc/manual/stdio.texi	2001/07/31 18:57:00
+@@ -2487,8 +2487,8 @@
+ If you are trying to read input that doesn't match a single, fixed
+ pattern, you may be better off using a tool such as Flex to generate a
+ lexical scanner, or Bison to generate a parser, rather than using
+-@code{scanf}.  For more information about these tools, see @ref{, , ,
+-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , ,
++@code{scanf}.  For more information about these tools, see @ref{Top, , ,
++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , ,
+ bison.info, The Bison Reference Manual}.
+ 
+ @node Input Conversion Syntax
diff --git a/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch b/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch
new file mode 100644
index 00000000..8d9b4fac
--- /dev/null
+++ b/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch
@@ -0,0 +1,14 @@
+--- glibc-2.1.3/sunrpc/Makefile.orig	2004-05-12 12:26:58.000000000 -0700
++++ glibc-2.1.3/sunrpc/Makefile	2004-05-12 12:29:05.000000000 -0700
+@@ -123,9 +123,8 @@
+   $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ 	$(+link)
+ 
+-# Tell rpcgen where to find the C preprocessor.
+-rpcgen-cmd = $(built-program-cmd) -Y `$(CC) -print-file-name=cpp | \
+-				      sed "s|/cpp$$||"`
++# Don't tell rpcgen where to find the C preprocessor -- let it find it itself.
++rpcgen-cmd = $(built-program-cmd) 
+ 
+ # Install the rpc data base file.
+ $(inst_sysconfdir)/rpc: etc.rpc $(+force)
diff --git a/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch b/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch
new file mode 100644
index 00000000..7f93a4ff
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch
@@ -0,0 +1,117574 @@
+diff -Naur ../glibc-2.1.3/ChangeLog glibc-2.1.3/ChangeLog
+--- ../glibc-2.1.3/ChangeLog	2000-02-24 18:05:16.000000000 -0800
++++ glibc-2.1.3/ChangeLog	2000-02-29 13:15:05.000000000 -0800
+@@ -1,3 +1,16 @@
++2000-02-28  David S. Miller  <davem@redhat.com>
++
++	* sysdeps/unix/sysv/linux/sparc/getsysstats.c: New file.
++
++2000-02-24  Ulrich Drepper  <drepper@redhat.com>
++
++	* locale/C-ctype.c (_nl_C_LC_CTYPE): Move comma to correct place
++	for big endian machines.
++
++2000-02-24  Andreas Jaeger  <aj@suse.de>
++
++	* locale/programs/ld-ctype.c (ctype_output): Add missing &.
++
+ 2000-02-24  Ulrich Drepper  <drepper@cygnus.com>
+ 
+ 	* locale/C-ctype.c: Add table pointer for both endianesses.
+@@ -42,6 +55,10 @@
+ 	conditions so as not to clobber the final '\0' when there is only one
+ 	element in the vector.
+ 
++2000-02-23  Cristian Gafton  <gafton@redhat.com>
++
++	* locale/programs/ld-ctype.c (CTYPE_DATA): Make sure we keep the alignment
++
+ 2000-02-22  Ulrich Drepper  <drepper@redhat.com>
+ 
+ 	* libio/stdio.h: Define macros stdin, stdout, and stderr.
+@@ -230,6 +247,11 @@
+ 	Rebel-NetWinder to platform table so _ioperm platform lookup via
+ 	/proc/cpuinfo works on later version NetWinders.
+ 
++2000-02-14  Cristian Gafton  <gafton@redhat.com>
++
++	* timezone/aliases: New file
++	* timezone/Makefile (tzlinks): Add aliases
++
+ 2000-02-13  Ulrich Drepper  <drepper@redhat.com>
+ 
+ 	* sysdeps/i386/fpu/s_cosf.S: Domain of opcode is not large enough
+@@ -406,6 +428,12 @@
+ 
+ 	* sysdeps/unix/sysv/linux/arm/mmap64.S: Correct check for ENOSYS.
+ 
++2000-02-01  Cristian Gafton  <gafton@redhat.com>
++
++	* misc/syslog.c (closelog): reset LogType to SOCK_DGRAM
++	(openlog_internal): retry with SOCK_DGRAM if we are in SOCK_STREAM 
++	mode and we get a connection refused.
++
+ 2000-01-25  Ulrich Drepper  <drepper@cygnus.com>
+ 
+ 	* sysdeps/unix/sysv/linux/i386/Dist: Add sys/io.h.
+diff -Naur ../glibc-2.1.3/Makeconfig glibc-2.1.3/Makeconfig
+--- ../glibc-2.1.3/Makeconfig	1999-11-29 11:19:20.000000000 -0800
++++ glibc-2.1.3/Makeconfig	2000-01-10 14:11:06.000000000 -0800
+@@ -789,7 +789,8 @@
+ 	       $(patsubst $<,/dev/null,$^) > $@-tmp
+ 	mv -f $@-tmp $@
+ 
+-all-Depend-files = $(wildcard $(..)*/Depend)
++all-Depend-files = $(wildcard $(patsubst %,$(..)%/Depend,$(add-ons)))
++
+ $(common-objpfx)sysd-sorted: $(..)scripts/gen-sorted.awk $(all-Depend-files) \
+ 			     $(common-objpfx)sysd-dirs $(..)Makeconfig
+ 	{ { dirs='$(patsubst $(..)%/Depend,$(..)%,$(filter %/Depend,$^))';\
+diff -Naur ../glibc-2.1.3/Makefile.in glibc-2.1.3/Makefile.in
+--- ../glibc-2.1.3/Makefile.in	1998-02-26 06:51:55.000000000 -0800
++++ glibc-2.1.3/Makefile.in	1998-03-12 12:17:58.000000000 -0800
+@@ -1,4 +1,4 @@
+-# Generated from $Id: Makefile.in,v 1.6 1998/02/26 14:51:55 drepper Exp $.
++# Generated from $Id: Makefile.in,v 1.1.1.1 1998/03/12 20:17:58 gafton Exp $.
+ 
+ srcdir = @srcdir@
+ 
+diff -Naur ../glibc-2.1.3/README-alpha glibc-2.1.3/README-alpha
+--- ../glibc-2.1.3/README-alpha	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/README-alpha	1999-06-16 15:30:43.000000000 -0700
+@@ -0,0 +1,287 @@
++			 GNU libc SNAPSHOT SYSTEM
++			    (general info)
++			   Updated 1997-9-26
++
++WHAT ARE GNU libc SNAPSHOTS
++---------------------------
++
++Snapshots are an "image" of the main glibc development tree, captured at a
++particular random instant in time.  When you use the snapshots, you should be
++able to maintain a local copy of libc that is no more than one day older than
++the official source tree used by the libc maintainers.
++
++The primary purpose of providing snapshots is to widen the group of motivated
++developers that would like to help test, debug, and enhance glibc, by providing
++you with access to the "latest and greatest" source.  This has several
++advantages, and several disadvantages.
++
++    First the advantages:
++
++    o	Once we have a large base of motivated testers using the snapshots,
++	this should provide good coverage across all currently supported
++	glibc hosts and targets.  If a new bug is introduced in glibc due to
++	fixing another bug or ongoing development, it should become
++	obvious much more quickly and get fixed before the next general
++	net release.  This should help to reduce the chances of glibc being
++	released to the general public with a major bug that went unnoticed
++	during the release cycle testing because they are machine dependent.
++	We hope to greatly improve glibc's stability and reliability by
++	involving more people and more execution environments in the
++	prerelease testing.
++
++    o	With access to the latest source, any diffs that you send to fix
++	bugs or add new features should be much easier for the glibc team
++	to merge into the official source base (after suitable review
++	of course).  This encourages us to merge your changes quicker,
++	while they are still "fresh".
++
++    o	Once your diffs are merged, you can obtain a new copy of glibc
++	containing your changes almost immediately.  Thus you do not
++	have to maintain local copies of your changes for any longer
++	than it takes to get them merged into the official source base.
++	This encourages you to send in changes quicker.
++
++    And the disadvantages:
++
++    o	The snapshot you get will be largely untested and of unknown quality.
++	It may fail to configure or compile.  It may have serious bugs.
++	You should always keep a copy of the last known working version
++	before updating to the current snapshot, or at least be able to
++	regenerate a working version if the latest snapshot is unusable
++	in your environment for some reason.
++
++	If a production version of glibc has a bug and a snapshot has the fix,
++	and you care about stability, you should put only the fix for that
++	particular problem into your production version.  Of course, if you
++	are eager to test glibc, you can use the snapshot versions in your
++	daily work, but users who have not been consulted about whether they
++	feel like testing glibc should generally have something which is at
++	least as bug free as the last released version.
++
++    o	Providing timely response to your questions, bug reports, and
++	submitted patches will require the glibc development team to allocate
++	time from an already thin time budget.  Please try to help us make
++	this time as productive as possible.  See the section below about
++	how to submit changes.
++
++
++WHO SHOULD TRY THE SNAPSHOTS
++----------------------------
++
++Remember, these are snapshots not tested versions.  So if you use
++these versions you should be able to
++
++    o	make sure your system stays usable
++
++    o	locate and hopefully fix problems
++
++    o	to port glibc to a new target yourself
++
++You should not use the snapshots if
++
++    o	your system is needed in a production environment which needs
++	stability
++
++    o	you expect us to fix your problems since you somehow depend on them.
++	You must be willing to fix the problems yourself, we don't want to
++	see "I have problems, fix this" messages.
++
++
++HOW TO GET THE SNAPSHOTS
++------------------------
++
++At the moment we provide a full snapshot weekly (every sunday), so
++that users getting a snapshot for the first time, or updating after
++a long period of not updating, can get the latest version in a single
++operation.  Along with the full snapshot, we will provide incremental
++diffs on a nearly daily basis (whenever code changes).  Each daily
++diff will be relative to the source tree after applying all previous
++daily diffs.  The daily diffs are for people who have relatively low
++bandwidth ftp or uucp connections.
++
++The files will be available via anonymous ftp from alpha.gnu.org, in
++directory /gnu/libc and on linux.kernel.org in /pub/software/libs/glibc.  The
++directories should look something like:
++
++	libc-970921.tar.gz
++	libc-970917-970922.diff.gz
++	libc-970922-970925.diff.gz
++	.
++	.
++	.
++
++Please note that the snapshots on alpha.gnu.org and on
++linux.kernel.org are not always in sync. Patches to some files might
++appear a day a diff earlier or later on alpha than on kernel.
++Use always alpha or always kernel but don't mix them.
++
++There are sometimes additionally test releases of the add-ons available in
++these directories.  If a new version of an add-on is available it is normally
++required for the corresponding snapshot so always pay attention for these.
++
++Note that we provide GNU gzip compressed files only.  You can ftp gzip
++from ftp.gnu.org in directory pub/gnu.
++
++In some cases the dates for diffs and snapshots do not match like in the
++example above.  The full release is for 970921 but the patch is for
++970917-970922.  This only means that nothing changed between 970917 and 970922
++and that you have to use this patch on top of the 970921 snapshot since the
++patch is made on 970922.
++
++Also, as the gcc developers did with their gcc snapshot system, even though we
++will make the snapshots available on a publically accessible ftp area, we ask
++that recipients not widely publicise their availability.  The motivation for
++this request is not to hoard them, but to avoid the situation where the
++general glibc user base naively attempts to use the snapshots, has trouble with
++them, complains publically, and the reputation of glibc declines because of a
++perception of instability or lack of quality control.
++
++
++GLIBC TEST SUITE
++----------------
++
++A test suite is distributed as an integral part of the snapshots.  A simple
++"make check" in your build directory is sufficient to run the tests.  glibc
++should pass all tests and if any fails, please report it.  A failure might not
++originate from a bug in glibc but also from bugs in the tools, e.g. with gcc
++2.7.2.x the math tests fail some of the tests because of compiler bugs.
++
++Note that the test suite is still in its infancy.  The tests themselves only
++cover a small portion of libc features, and where tests do exist for a feature
++they are not exhaustive.  New tests are welcome.
++
++
++GETTING HELP, GLIBC DISCUSSIONS, etc
++------------------------------------
++
++People who want to help with glibc and who test out snapshots
++regularly should get on the libc-alpha@sourceware.cygnus.com mailing
++list by sending an email to libc-alpha-subscribe@sourceware.cygnus.com.
++This list is meant (as the name suggests) for the discussion of test
++releases and also reports for them.  People who are on this list are
++welcome to post questions of general interest.
++
++People who are not only willing to test the snapshots but instead
++really want to help developing glibc should contact
++libc-hacker-subscribe@sourceware.cygnus.com.org to be put on the developers
++mailing list.  This list is really only meant for developers.  No
++questions about installation problems or other simple topics are
++wanted nor will they be answered.
++
++Do *not* send any questions about the snapshots or patches specific to the
++snapshots to bug-glibc@gnu.org.  Nobody there will have any idea what
++you are talking about and it will just cause confusion.
++
++
++BUG REPORTS
++-----------
++
++Send bug reports directly to Ulrich Drepper <drepper@gnu.org>.  Please
++do *not* use the glibcbug script for reporting bugs in the snapshots.
++glibcbug should only be used for problems with the official released versions.
++We don't like bug reports in the bug database because otherwise the impression
++of instability or lack of quality control of glibc as a whole might manifest
++in people's mind.
++
++Note that since no testing is done on the snapshots, and snapshots may even be
++made when glibc is in an inconsistent state, it may not be unusual for an
++occasional snapshot to have a very obvious bug, such as failure to compile on
++*any* machine.  It is likely that such bugs will be fixed by the next
++snapshot, so it really isn't necessary to report them unless they persist for
++a couple of days.
++
++Missing files should always be reported, since they usually mean there is a
++problem with the snapshot-generating process and we won't know about them
++unless someone tells us.
++
++Bugs which are non-obvious, such as failure to compile on only a specific
++machine, a new machine dependent or obscure bug (particularly one not detected
++by the testsuite), etc should be reported when you discover them, or have a
++suggested patch to fix them.
++
++
++FORMAT FOR PATCHES
++------------------
++
++If you have a fix for a bug, or an enhancement to submit, send your patch to
++Ulrich Drepper <drepper@gnu.org>.  Here are some simple guidelines for
++submitting patches:
++
++    o	Use "unified diffs" for patches.  A typical command for generating
++	context diffs is "diff -ru glibc-old glibc-patched".
++
++    o	Use the "minimalist approach" for patches.  That is, each patch
++	should address only one particular bug, new feature, etc.  Do not
++	save up many unrelated changes and submit them all in one big
++	patch, since in general, the larger the patch the more difficult
++	it is for us to decide if the patch is either correct or
++	desirable.  And if we find something about the patch that needs
++	to be corrected before it can be installed, we would have to reject
++	the entire patch, which might contain changes which otherwise would
++	be accepted if submitted separately.
++
++    o	Submit a sample ChangeLog entry with your patch.  See the existing
++	glibc ChangeLog for examples of what a ChangeLog entry should look
++	like.  The emacs command ^X4A will create a ChangeLog entry header
++	for you.
++
++
++BUILDING SNAPSHOTS
++------------------
++
++The `best' way to build glibc is to use an extra directory, e.g.:
++tar xzf libc-970921.tar.gz
++mkdir build-glibc
++cd build-glibc
++../libc-970921/configure ...
++
++In this way you can easily clean up (since `make clean' doesn't work at
++the moment) and rebuild glibc.
++
++
++NECESSARY TOOLS
++---------------
++
++For the recommended versions of gcc, binutils, make, texinfo, gettext,
++autoconf and other tools which might be especially needed when using patches,
++please read the file INSTALL.
++
++
++HOW CAN YOU HELP
++----------------
++
++It helps already a lot if you just install glibc on your system and try to
++solve any problems.  You might want to look at the file `PROJECTS' and help
++with one of those projects, fix some bugs (see `BUGS' or the bug database),
++port to an unsupported platform, ...
++
++
++FURTHER DOCUMENTATION
++---------------------
++
++A lot of questions are answered in the FAQ.  The files `INSTALL', `README' and
++`NOTES' contain the most important documentation.  Furthermore glibc has its
++own 700+ pages info documentation, ...
++
++
++
++And finally a word of caution: The libc is one of the most fundamental parts
++of your system - and these snapshots are untested and come without any
++guarantee or warranty.  You might be lucky and everything works or you might
++crash your system.  If you install a glibc snapshot as primary library, you
++should have a backup somewhere.
++
++On many systems it is also a problem to replace the libc while the system is
++running.  In the worst case on broken OSes some systems crash.  On better
++systems you can move the old libc aside but removing it will cause problems
++since there are still processes using this libc image and so you might have to
++check the filesystem to get rid of the libc data.  One good alternative (which
++is also safer) is to use a chroot'ed environment.
++
++Thanks for your help and support.
++
++Thanks to Fred Fish from Cygnus for the original version of this text
++(for GDB).
++
++
++Ulrich Drepper
+diff -Naur ../glibc-2.1.3/README.template glibc-2.1.3/README.template
+--- ../glibc-2.1.3/README.template	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/README.template	1999-07-28 15:46:07.000000000 -0700
+@@ -0,0 +1,96 @@
++This directory contains the version VERSION release of the GNU C Library.
++Many bugs have been fixed since the last release.
++Some bugs surely remain.
++
++As of this release, the GNU C library is known to run on the following
++configurations:
++
++		*-*-gnu			GNU Hurd
++		i[3456]86-*-linux-gnu	Linux-2.x on Intel
++		m68k-*-linux-gnu	Linux-2.x on Motorola 680x0
++		alpha-*-linux-gnu	Linux-2.x on DEC Alpha
++		powerpc-*-linux-gnu     Linux and MkLinux on PowerPC systems
++		sparc-*-linux-gnu	Linux-2.x on SPARC
++		sparc64-*-linux-gnu	Linux-2.x on UltraSPARC
++		arm-*-none		ARM standalone systems
++		arm-*-linux		Linux-2.x on ARM
++		arm-*-linuxaout		Linux-2.x on ARM using a.out binaries
++
++
++Former releases of this library (version 1.09.1 and perhaps earlier
++versions) used to run on the following configurations:
++
++		alpha-dec-osf1
++		i[3456]86-*-bsd4.3
++		i[3456]86-*-isc2.2
++		i[3456]86-*-isc3
++		i[3456]86-*-sco3.2
++		i[3456]86-*-sco3.2v4
++		i[3456]86-*-sysv
++		i[3456]86-*-sysv4
++		i[3456]86-force_cpu386-none
++		i[3456]86-sequent-bsd
++		i960-nindy960-none
++		m68k-hp-bsd4.3
++		m68k-mvme135-none
++		m68k-mvme136-none
++		m68k-sony-newsos3
++		m68k-sony-newsos4
++		m68k-sun-sunos4
++		mips-dec-ultrix4
++		mips-sgi-irix4
++		sparc-sun-solaris2
++		sparc-sun-sunos4
++
++Since no one has volunteered to test and fix the above configurations,
++these are not supported at the moment.  It's expected that these don't
++work anymore.  Porting the library is not hard.  If you are interested
++in doing a port, please contact the glibc maintainers by sending
++electronic mail to <bug-glibc@gnu.org>.
++
++The GNU C library now includes Michael Glad's Ultra Fast Crypt, which
++provides the Unix `crypt' function, plus some other entry points.
++Because of the United States export restriction on DES
++implementations, we are distributing this code separately from the
++rest of the C library.  There is an extra distribution tar file just
++for crypt; it is called `glibc-crypt-VERSION.tar.gz'.  You can just
++unpack the crypt distribution along with the rest of the C library and
++build; you can also build the library without getting crypt.  Users
++outside the USA can get the crypt distribution via anonymous FTP from
++ftp.gwdg.de [134.76.11.100] in the directory pub/linux/glibc, or
++another archive site outside the USA.  Archive maintainers are
++encouraged to copy this distribution to their archives outside the
++USA.  Please get it from ftp.gwdg.de; transferring this distribution
++from ftp.gnu.org (or any other site in the USA) to a site outside the
++USA is in violation of US export laws.
++
++Beside the separate crypt tar file there are some more add-ons which can be
++used together with GNU libc.  They are designed in a way to ease the
++installation by integrating them in the libc source tree.  Simply get the
++add-ons you need and use the --enable-add-ons option of the `configure'
++script to tell where the add-ons are found.  Please read the FAQ file for
++more details.
++
++See the file INSTALL to find out how to configure, build, install, and port
++the GNU C library.  You might also consider reading the WWW pages for the
++GNU libc at http://www.gnu.org/software/libc/libc.html.
++
++The GNU C Library is completely documented by the Texinfo manual found
++in the `manual/' subdirectory.  The manual is still being updated and
++contains some known errors and omissions; we regret that we do not
++have the resources to work on the manual as much as we would like.
++Please send comments on the manual to <bug-glibc-manual@gnu.org>, and
++not to the library bug-reporting address.
++
++The file NOTES contains a description of the feature-test macros used
++in the GNU C library, explaining how you can tell the library what
++facilities you want it to make available.
++
++We prefer to get bug reports sent using the `glibcbug' shell script which
++is installed together with the rest of the GNU libc to <bugs@gnu.org>.
++Simply run this shell script and fill in the information.  Nevertheless
++you can still send bug reports to <bug-glibc@gnu.org> as normal electronic
++mails.
++
++The GNU C Library is free software.  See the file COPYING.LIB for copying
++conditions.
+diff -Naur ../glibc-2.1.3/Versions.def glibc-2.1.3/Versions.def
+--- ../glibc-2.1.3/Versions.def	1999-11-15 16:24:57.000000000 -0800
++++ glibc-2.1.3/Versions.def	1999-12-27 08:16:06.000000000 -0800
+@@ -31,6 +31,7 @@
+ libnsl {
+   GLIBC_2.0
+   GLIBC_2.1 GLIBC_2.0
++  GLIBC_2.1.2 GLIBC_2.1
+ }
+ libnss_compat {
+   GLIBC_2.0
+diff -Naur ../glibc-2.1.3/c_stubs/Banner glibc-2.1.3/c_stubs/Banner
+--- ../glibc-2.1.3/c_stubs/Banner	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/Banner	2000-02-25 16:35:04.000000000 -0800
+@@ -0,0 +1 @@
++The C stubs add-on version 2.1.2.
+diff -Naur ../glibc-2.1.3/c_stubs/COPYING.LIB glibc-2.1.3/c_stubs/COPYING.LIB
+--- ../glibc-2.1.3/c_stubs/COPYING.LIB	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/COPYING.LIB	2000-02-25 16:35:05.000000000 -0800
+@@ -0,0 +1,482 @@
++		  GNU LIBRARY GENERAL PUBLIC LICENSE
++		       Version 2, June 1991
++
++ Copyright (C) 1991 Free Software Foundation, Inc.
++ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++[This is the first released version of the library GPL.  It is
++ numbered 2 because it goes with version 2 of the ordinary GPL.]
++
++			    Preamble
++
++  The licenses for most software are designed to take away your
++freedom to share and change it.  By contrast, the GNU General Public
++Licenses are intended to guarantee your freedom to share and change
++free software--to make sure the software is free for all its users.
++
++  This license, the Library General Public License, applies to some
++specially designated Free Software Foundation software, and to any
++other libraries whose authors decide to use it.  You can use it for
++your libraries, too.
++
++  When we speak of free software, we are referring to freedom, not
++price.  Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++  To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if
++you distribute copies of the library, or if you modify it.
++
++  For example, if you distribute copies of the library, whether gratis
++or for a fee, you must give the recipients all the rights that we gave
++you.  You must make sure that they, too, receive or can get the source
++code.  If you link a program with the library, you must provide
++complete object files to the recipients so that they can relink them
++with the library, after making changes to the library and recompiling
++it.  And you must show them these terms so they know their rights.
++
++  Our method of protecting your rights has two steps: (1) copyright
++the library, and (2) offer you this license which gives you legal
++permission to copy, distribute and/or modify the library.
++
++  Also, for each distributor's protection, we want to make certain
++that everyone understands that there is no warranty for this free
++library.  If the library is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original
++version, so that any problems introduced by others will not reflect on
++the original authors' reputations.
++
++  Finally, any free program is threatened constantly by software
++patents.  We wish to avoid the danger that companies distributing free
++software will individually obtain patent licenses, thus in effect
++transforming the program into proprietary software.  To prevent this,
++we have made it clear that any patent must be licensed for everyone's
++free use or not licensed at all.
++
++  Most GNU software, including some libraries, is covered by the ordinary
++GNU General Public License, which was designed for utility programs.  This
++license, the GNU Library General Public License, applies to certain
++designated libraries.  This license is quite different from the ordinary
++one; be sure to read it in full, and don't assume that anything in it is
++the same as in the ordinary license.
++
++  The reason we have a separate public license for some libraries is that
++they blur the distinction we usually make between modifying or adding to a
++program and simply using it.  Linking a program with a library, without
++changing the library, is in some sense simply using the library, and is
++analogous to running a utility program or application program.  However, in
++a textual and legal sense, the linked executable is a combined work, a
++derivative of the original library, and the ordinary General Public License
++treats it as such.
++
++  Because of this blurred distinction, using the ordinary General
++Public License for libraries did not effectively promote software
++sharing, because most developers did not use the libraries.  We
++concluded that weaker conditions might promote sharing better.
++
++  However, unrestricted linking of non-free programs would deprive the
++users of those programs of all benefit from the free status of the
++libraries themselves.  This Library General Public License is intended to
++permit developers of non-free programs to use free libraries, while
++preserving your freedom as a user of such programs to change the free
++libraries that are incorporated in them.  (We have not seen how to achieve
++this as regards changes in header files, but we have achieved it as regards
++changes in the actual functions of the Library.)  The hope is that this
++will lead to faster development of free libraries.
++
++  The precise terms and conditions for copying, distribution and
++modification follow.  Pay close attention to the difference between a
++"work based on the library" and a "work that uses the library".  The
++former contains code derived from the library, while the latter only
++works together with the library.
++
++  Note that it is possible for a library to be covered by the ordinary
++General Public License rather than by this special one.
++
++		  GNU LIBRARY GENERAL PUBLIC LICENSE
++   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++  0. This License Agreement applies to any software library which
++contains a notice placed by the copyright holder or other authorized
++party saying it may be distributed under the terms of this Library
++General Public License (also called "this License").  Each licensee is
++addressed as "you".
++
++  A "library" means a collection of software functions and/or data
++prepared so as to be conveniently linked with application programs
++(which use some of those functions and data) to form executables.
++
++  The "Library", below, refers to any such software library or work
++which has been distributed under these terms.  A "work based on the
++Library" means either the Library or any derivative work under
++copyright law: that is to say, a work containing the Library or a
++portion of it, either verbatim or with modifications and/or translated
++straightforwardly into another language.  (Hereinafter, translation is
++included without limitation in the term "modification".)
++
++  "Source code" for a work means the preferred form of the work for
++making modifications to it.  For a library, complete source code means
++all the source code for all modules it contains, plus any associated
++interface definition files, plus the scripts used to control compilation
++and installation of the library.
++
++  Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope.  The act of
++running a program using the Library is not restricted, and output from
++such a program is covered only if its contents constitute a work based
++on the Library (independent of the use of the Library in a tool for
++writing it).  Whether that is true depends on what the Library does
++and what the program that uses the Library does.
++  
++  1. You may copy and distribute verbatim copies of the Library's
++complete source code as you receive it, in any medium, provided that
++you conspicuously and appropriately publish on each copy an
++appropriate copyright notice and disclaimer of warranty; keep intact
++all the notices that refer to this License and to the absence of any
++warranty; and distribute a copy of this License along with the
++Library.
++
++  You may charge a fee for the physical act of transferring a copy,
++and you may at your option offer warranty protection in exchange for a
++fee.
++
++  2. You may modify your copy or copies of the Library or any portion
++of it, thus forming a work based on the Library, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++    a) The modified work must itself be a software library.
++
++    b) You must cause the files modified to carry prominent notices
++    stating that you changed the files and the date of any change.
++
++    c) You must cause the whole of the work to be licensed at no
++    charge to all third parties under the terms of this License.
++
++    d) If a facility in the modified Library refers to a function or a
++    table of data to be supplied by an application program that uses
++    the facility, other than as an argument passed when the facility
++    is invoked, then you must make a good faith effort to ensure that,
++    in the event an application does not supply such function or
++    table, the facility still operates, and performs whatever part of
++    its purpose remains meaningful.
++
++    (For example, a function in a library to compute square roots has
++    a purpose that is entirely well-defined independent of the
++    application.  Therefore, Subsection 2d requires that any
++    application-supplied function or table used by this function must
++    be optional: if the application does not supply it, the square
++    root function must still compute square roots.)
++
++These requirements apply to the modified work as a whole.  If
++identifiable sections of that work are not derived from the Library,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works.  But when you
++distribute the same sections as part of a whole which is a work based
++on the Library, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote
++it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Library.
++
++In addition, mere aggregation of another work not based on the Library
++with the Library (or with a work based on the Library) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++  3. You may opt to apply the terms of the ordinary GNU General Public
++License instead of this License to a given copy of the Library.  To do
++this, you must alter all the notices that refer to this License, so
++that they refer to the ordinary GNU General Public License, version 2,
++instead of to this License.  (If a newer version than version 2 of the
++ordinary GNU General Public License has appeared, then you can specify
++that version instead if you wish.)  Do not make any other change in
++these notices.
++
++  Once this change is made in a given copy, it is irreversible for
++that copy, so the ordinary GNU General Public License applies to all
++subsequent copies and derivative works made from that copy.
++
++  This option is useful when you wish to copy part of the code of
++the Library into a program that is not a library.
++
++  4. You may copy and distribute the Library (or a portion or
++derivative of it, under Section 2) in object code or executable form
++under the terms of Sections 1 and 2 above provided that you accompany
++it with the complete corresponding machine-readable source code, which
++must be distributed under the terms of Sections 1 and 2 above on a
++medium customarily used for software interchange.
++
++  If distribution of object code is made by offering access to copy
++from a designated place, then offering equivalent access to copy the
++source code from the same place satisfies the requirement to
++distribute the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++  5. A program that contains no derivative of any portion of the
++Library, but is designed to work with the Library by being compiled or
++linked with it, is called a "work that uses the Library".  Such a
++work, in isolation, is not a derivative work of the Library, and
++therefore falls outside the scope of this License.
++
++  However, linking a "work that uses the Library" with the Library
++creates an executable that is a derivative of the Library (because it
++contains portions of the Library), rather than a "work that uses the
++library".  The executable is therefore covered by this License.
++Section 6 states terms for distribution of such executables.
++
++  When a "work that uses the Library" uses material from a header file
++that is part of the Library, the object code for the work may be a
++derivative work of the Library even though the source code is not.
++Whether this is true is especially significant if the work can be
++linked without the Library, or if the work is itself a library.  The
++threshold for this to be true is not precisely defined by law.
++
++  If such an object file uses only numerical parameters, data
++structure layouts and accessors, and small macros and small inline
++functions (ten lines or less in length), then the use of the object
++file is unrestricted, regardless of whether it is legally a derivative
++work.  (Executables containing this object code plus portions of the
++Library will still fall under Section 6.)
++
++  Otherwise, if the work is a derivative of the Library, you may
++distribute the object code for the work under the terms of Section 6.
++Any executables containing that work also fall under Section 6,
++whether or not they are linked directly with the Library itself.
++
++  6. As an exception to the Sections above, you may also compile or
++link a "work that uses the Library" with the Library to produce a
++work containing portions of the Library, and distribute that work
++under terms of your choice, provided that the terms permit
++modification of the work for the customer's own use and reverse
++engineering for debugging such modifications.
++
++  You must give prominent notice with each copy of the work that the
++Library is used in it and that the Library and its use are covered by
++this License.  You must supply a copy of this License.  If the work
++during execution displays copyright notices, you must include the
++copyright notice for the Library among them, as well as a reference
++directing the user to the copy of this License.  Also, you must do one
++of these things:
++
++    a) Accompany the work with the complete corresponding
++    machine-readable source code for the Library including whatever
++    changes were used in the work (which must be distributed under
++    Sections 1 and 2 above); and, if the work is an executable linked
++    with the Library, with the complete machine-readable "work that
++    uses the Library", as object code and/or source code, so that the
++    user can modify the Library and then relink to produce a modified
++    executable containing the modified Library.  (It is understood
++    that the user who changes the contents of definitions files in the
++    Library will not necessarily be able to recompile the application
++    to use the modified definitions.)
++
++    b) Accompany the work with a written offer, valid for at
++    least three years, to give the same user the materials
++    specified in Subsection 6a, above, for a charge no more
++    than the cost of performing this distribution.
++
++    c) If distribution of the work is made by offering access to copy
++    from a designated place, offer equivalent access to copy the above
++    specified materials from the same place.
++
++    d) Verify that the user has already received a copy of these
++    materials or that you have already sent this user a copy.
++
++  For an executable, the required form of the "work that uses the
++Library" must include any data and utility programs needed for
++reproducing the executable from it.  However, as a special exception,
++the source code distributed need not include anything that is normally
++distributed (in either source or binary form) with the major
++components (compiler, kernel, and so on) of the operating system on
++which the executable runs, unless that component itself accompanies
++the executable.
++
++  It may happen that this requirement contradicts the license
++restrictions of other proprietary libraries that do not normally
++accompany the operating system.  Such a contradiction means you cannot
++use both them and the Library together in an executable that you
++distribute.
++
++  7. You may place library facilities that are a work based on the
++Library side-by-side in a single library together with other library
++facilities not covered by this License, and distribute such a combined
++library, provided that the separate distribution of the work based on
++the Library and of the other library facilities is otherwise
++permitted, and provided that you do these two things:
++
++    a) Accompany the combined library with a copy of the same work
++    based on the Library, uncombined with any other library
++    facilities.  This must be distributed under the terms of the
++    Sections above.
++
++    b) Give prominent notice with the combined library of the fact
++    that part of it is a work based on the Library, and explaining
++    where to find the accompanying uncombined form of the same work.
++
++  8. You may not copy, modify, sublicense, link with, or distribute
++the Library except as expressly provided under this License.  Any
++attempt otherwise to copy, modify, sublicense, link with, or
++distribute the Library is void, and will automatically terminate your
++rights under this License.  However, parties who have received copies,
++or rights, from you under this License will not have their licenses
++terminated so long as such parties remain in full compliance.
++
++  9. You are not required to accept this License, since you have not
++signed it.  However, nothing else grants you permission to modify or
++distribute the Library or its derivative works.  These actions are
++prohibited by law if you do not accept this License.  Therefore, by
++modifying or distributing the Library (or any work based on the
++Library), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Library or works based on it.
++
++  10. Each time you redistribute the Library (or any work based on the
++Library), the recipient automatically receives a license from the
++original licensor to copy, distribute, link with or modify the Library
++subject to these terms and conditions.  You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++  11. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License.  If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Library at all.  For example, if a patent
++license would not permit royalty-free redistribution of the Library by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Library.
++
++If any portion of this section is held invalid or unenforceable under any
++particular circumstance, the balance of the section is intended to apply,
++and the section as a whole is intended to apply in other circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system which is
++implemented by public license practices.  Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++  12. If the distribution and/or use of the Library is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Library under this License may add
++an explicit geographical distribution limitation excluding those countries,
++so that distribution is permitted only in or among countries not thus
++excluded.  In such case, this License incorporates the limitation as if
++written in the body of this License.
++
++  13. The Free Software Foundation may publish revised and/or new
++versions of the Library General Public License from time to time.
++Such new versions will be similar in spirit to the present version,
++but may differ in detail to address new problems or concerns.
++
++Each version is given a distinguishing version number.  If the Library
++specifies a version number of this License which applies to it and
++"any later version", you have the option of following the terms and
++conditions either of that version or of any later version published by
++the Free Software Foundation.  If the Library does not specify a
++license version number, you may choose any version ever published by
++the Free Software Foundation.
++
++  14. If you wish to incorporate parts of the Library into other free
++programs whose distribution conditions are incompatible with these,
++write to the author to ask for permission.  For software which is
++copyrighted by the Free Software Foundation, write to the Free
++Software Foundation; we sometimes make exceptions for this.  Our
++decision will be guided by the two goals of preserving the free status
++of all derivatives of our free software and of promoting the sharing
++and reuse of software generally.
++
++			    NO WARRANTY
++
++  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
++WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
++EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
++OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
++KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
++LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
++THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
++
++  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
++WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
++AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
++FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
++CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
++LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
++RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
++FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
++SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
++DAMAGES.
++
++		     END OF TERMS AND CONDITIONS
++
++     Appendix: How to Apply These Terms to Your New Libraries
++
++  If you develop a new library, and you want it to be of the greatest
++possible use to the public, we recommend making it free software that
++everyone can redistribute and change.  You can do so by permitting
++redistribution under these terms (or, alternatively, under the terms of the
++ordinary General Public License).
++
++  To apply these terms, attach the following notices to the library.  It is
++safest to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least the
++"copyright" line and a pointer to where the full notice is found.
++
++    <one line to give the library's name and a brief idea of what it does.>
++    Copyright (C) <year>  <name of author>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License as published by the Free Software Foundation; either
++    version 2 of the License, or (at your option) any later version.
++
++    This library 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
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public
++    License along with this library; if not, write to the Free
++    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
++    MA 02111-1307, USA
++
++Also add information on how to contact you by electronic and paper mail.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the library, if
++necessary.  Here is a sample; alter the names:
++
++  Yoyodyne, Inc., hereby disclaims all copyright interest in the
++  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
++
++  <signature of Ty Coon>, 1 April 1990
++  Ty Coon, President of Vice
++
++That's all there is to it!
+diff -Naur ../glibc-2.1.3/c_stubs/ChangeLog glibc-2.1.3/c_stubs/ChangeLog
+--- ../glibc-2.1.3/c_stubs/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/ChangeLog	2000-02-27 11:35:23.000000000 -0800
+@@ -0,0 +1,32 @@
++2000-02-27  Cristian Gafton  <gafton@redhat.com>
++
++	* gconv_stubs.c: Return __gconv_OK for:
++	__gconv_transform_ascii_internal
++	__gconv_transform_ucs2little_internal
++	__gconv_transform_utf16_internal
++	__gconv_transform_utf8_internal
++	__gconv_transform_ucs2_internal
++
++2000-02-25  Cristian Gafton  <gafton@redhat.com>
++
++	* gconv_stubs.c: add __c_stubs_is_compiled_in so we can detect when
++	the library is linked in.
++
++Wed Dec  8 13:47:25 1999  Ivan Brunello <ivan.brunello@tiscalinet.it>
++
++	* Makefile (extra-objs): Changed stubs.o to gconv_stubs.o.
++
++Sun Dec  5 11:32:17 1999  H.J. Lu  <hjl@gnu.org>
++
++	* gconv_stubs.c: Renamed from stubs.c.
++	Support glibc 2.1.x.
++
++Mon Aug 23 16:42:05 1999  H.J. Lu  <hjl@gnu.org>
++
++	* Banner: New.
++	* COPYING.LIB: Likewise.
++	* Makefile: Likewise.
++	* README: Likewise.
++	* configure: Likewise.
++	* stubs.c: Likewise.
++	* test-stdio.c: Likewise.
+diff -Naur ../glibc-2.1.3/c_stubs/Makefile glibc-2.1.3/c_stubs/Makefile
+--- ../glibc-2.1.3/c_stubs/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/Makefile	2000-02-25 16:35:05.000000000 -0800
+@@ -0,0 +1,46 @@
++# Copyright (C) 1999 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# The GNU C Library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License as
++# published by the Free Software Foundation; either version 2 of the
++# License, or (at your option) any later version.
++
++# The GNU C Library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++#
++#	Sub-makefile for the C stub add-on library.
++#
++subdir	:= c_stubs
++
++tests-static := test-stdio
++tests := $(tests-static)
++
++libc_stubs-objs := gconv_stubs.o
++
++install-lib := libc_stubs.a
++non-lib.a := libc_stubs.a
++
++extra-objs := gconv_stubs.o libc_stubs.a
++
++include ../Makeconfig
++
++CPPFLAGS += -I../iconv
++
++include ../Rules
++
++$(objpfx)libc_stubs.a: $(addprefix $(objpfx), $(libc_stubs-objs))
++	-rm -f $@
++	$(LD) -r -o $@ $^
++
++lib: $(objpfx)libc_stubs.a
++
++$(objpfx)test-stdio: $(objpfx)libc_stubs.a
+diff -Naur ../glibc-2.1.3/c_stubs/README glibc-2.1.3/c_stubs/README
+--- ../glibc-2.1.3/c_stubs/README	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/README	2000-02-25 16:35:05.000000000 -0800
+@@ -0,0 +1,8 @@
++This is a stub add-on library for the GNU C library version 2.1.2 and
++above. It is used to create the smaller static binaries by stubbing
++out the gconv related functions. The resulting binaries may not have
++all the functionalities.
++
++H.J. Lu
++hjl@gnu.org
++12/05/1999
+diff -Naur ../glibc-2.1.3/c_stubs/configure glibc-2.1.3/c_stubs/configure
+--- ../glibc-2.1.3/c_stubs/configure	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/configure	2000-02-25 16:35:05.000000000 -0800
+@@ -0,0 +1,2 @@
++# This is only to keep the GNU C library configure mechanism happy.
++exit 0
+diff -Naur ../glibc-2.1.3/c_stubs/gconv_stubs.c glibc-2.1.3/c_stubs/gconv_stubs.c
+--- ../glibc-2.1.3/c_stubs/gconv_stubs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/gconv_stubs.c	2000-02-27 11:35:23.000000000 -0800
+@@ -0,0 +1,83 @@
++/* Provide gconv stub functions for the minimum static binaries.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <features.h>
++#include <gconv_int.h>
++
++/* hack for self identification */
++int __c_stubs_is_compiled_in;
++
++/* Don't drag in the dynamic linker. */
++void *__libc_stack_end;
++
++int
++__gconv_OK ()
++{
++#if __GLIBC__ > 2 || __GLIBC_MINOR__ > 1
++  return __GCONV_OK;
++#else
++  return GCONV_OK;
++#endif
++}
++
++int
++__gconv_NOCONV ()
++{
++#if __GLIBC__ > 2 || __GLIBC_MINOR__ > 1
++  return __GCONV_NOCONV;
++#else
++  return GCONV_NOCONV;
++#endif
++}
++
++strong_alias (__gconv_OK,
++	      __gconv_close_transform);
++
++strong_alias (__gconv_NOCONV,
++	      __gconv);
++strong_alias (__gconv_NOCONV,
++	      __gconv_find_transform);
++strong_alias (__gconv_NOCONV,
++	      __gconv_open);
++
++/* These transformations should not fail in normal conditions */
++strong_alias (__gconv_OK,
++	      __gconv_transform_ascii_internal);
++strong_alias (__gconv_OK,
++	      __gconv_transform_ucs2little_internal);
++strong_alias (__gconv_OK,
++	      __gconv_transform_utf16_internal);
++strong_alias (__gconv_OK,
++	      __gconv_transform_utf8_internal);
++strong_alias (__gconv_OK,
++	      __gconv_transform_ucs2_internal);
++
++/* We can assume no conversion for these ones */
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_ascii);
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_ucs2);
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_ucs2little);
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_ucs4);
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_utf16);
++strong_alias (__gconv_NOCONV,
++	      __gconv_transform_internal_utf8);
+diff -Naur ../glibc-2.1.3/c_stubs/test-stdio.c glibc-2.1.3/c_stubs/test-stdio.c
+--- ../glibc-2.1.3/c_stubs/test-stdio.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/c_stubs/test-stdio.c	2000-02-25 16:35:05.000000000 -0800
+@@ -0,0 +1,8 @@
++#include <stdio.h>
++
++int
++main ()
++{
++  printf ("Hello world\n");
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/config-name.in glibc-2.1.3/config-name.in
+--- ../glibc-2.1.3/config-name.in	1994-12-08 01:12:33.000000000 -0800
++++ glibc-2.1.3/config-name.in	1998-02-07 12:00:39.000000000 -0800
+@@ -1,5 +1,5 @@
+ /* @configure_input@ -*- C -*-
+-   Generated from $Id: config-name.in,v 1.1 1994/12/08 09:12:33 roland Exp $.
++   Generated from $Id: config-name.in,v 1.1.1.1 1998/02/07 20:00:39 gafton Exp $.
+ 
+    This is used only by the generic `uname' function for systems with no real
+    `uname' call.  If this data is not correct, it does not matter much.  */
+diff -Naur ../glibc-2.1.3/config.make.in glibc-2.1.3/config.make.in
+--- ../glibc-2.1.3/config.make.in	2000-02-11 15:49:41.000000000 -0800
++++ glibc-2.1.3/config.make.in	2000-02-14 12:05:50.000000000 -0800
+@@ -1,5 +1,5 @@
+ # @configure_input@
+-# From $Id: config.make.in,v 1.61.2.2 2000/02/11 20:45:02 drepper Exp $.
++# From $Id: config.make.in,v 1.1.1.2 2000/02/14 20:05:50 gafton Exp $.
+ # Don't edit this file.  Put configuration parameters in configparms instead.
+ 
+ version = @VERSION@
+diff -Naur ../glibc-2.1.3/db2/include/queue.h glibc-2.1.3/db2/include/queue.h
+--- ../glibc-2.1.3/db2/include/queue.h	1998-06-09 08:03:53.000000000 -0700
++++ glibc-2.1.3/db2/include/queue.h	1998-07-09 11:45:13.000000000 -0700
+@@ -1,4 +1,4 @@
+-/*	BSDI $Id: queue.h,v 1.3 1998/06/09 15:03:53 drepper Exp $	*/
++/*	BSDI $Id: queue.h,v 1.1.1.1 1998/07/09 18:45:13 gafton Exp $	*/
+ 
+ /*
+  * Copyright (c) 1991, 1993
+diff -Naur ../glibc-2.1.3/elf/rtld.c glibc-2.1.3/elf/rtld.c
+--- ../glibc-2.1.3/elf/rtld.c	2000-02-22 23:02:47.000000000 -0800
++++ glibc-2.1.3/elf/rtld.c	2000-02-23 14:48:17.000000000 -0800
+@@ -758,6 +758,60 @@
+       __munmap (file, file_size);
+     }
+ 
++
++  /*
++   * Modifications by Red Hat Software
++   *
++   * Deal with the broken binaries from the non-versioned ages of glibc.
++   * If a binary does not have version information enebled, we assume that
++   * it is a glibc 2.0 binary andwe load a compatibility library to try to
++   * overcome binary incompatibilities.
++   *			Blame: gafton@redhat.com
++   */
++#define LIB_NOVERSION "/lib/libNoVersion.so.1"
++  
++  if (_dl_loaded->l_info[DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL) {
++      struct link_map *new_map = NULL;
++      struct stat test_st;
++      int test_fd;
++      int can_load;
++      
++      HP_TIMING_NOW (start);
++	   
++/*       _dl_sysdep_message("Loading compatibility library... ", NULL); */
++
++      can_load = 1;
++      test_fd = __open (LIB_NOVERSION, O_RDONLY);
++      if (test_fd < 0) {
++	  can_load = 0;
++/* 	  _dl_sysdep_message(" Can't find " LIB_NOVERSION "\n",  NULL); */
++      } else {
++	  if (__fxstat (_STAT_VER, test_fd, &test_st) < 0 || test_st.st_size == 0) {
++	      can_load = 0;
++/* 	      _dl_sysdep_message(" Can't stat " LIB_NOVERSION "\n",  NULL); */
++	  }
++      }
++      
++      if (test_fd >= 0) /* open did no fail.. */
++	  __close(test_fd); /* avoid fd leaks */
++
++      if (can_load != 0) {
++	  new_map = _dl_map_object (_dl_loaded, LIB_NOVERSION,
++				    1, lt_library, 0);
++	  if (new_map->l_opencount == 1) {
++	      /* It is no duplicate.  */
++	      ++npreloads;
++/* 	      _dl_sysdep_message(" DONE\n", NULL); */
++	  } else {
++/* 	      _dl_sysdep_message(" FAILED\n", NULL); */
++	  }
++      }
++	  
++      HP_TIMING_NOW (stop);
++      HP_TIMING_DIFF (diff, start, stop);
++      HP_TIMING_ACCUM_NT (load_time, diff);
++  }
++      
+   if (npreloads != 0)
+     {
+       /* Set up PRELOADS with a vector of the preloaded libraries.  */
+diff -Naur ../glibc-2.1.3/glibc-2.1.spec glibc-2.1.3/glibc-2.1.spec
+--- ../glibc-2.1.3/glibc-2.1.spec	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-2.1.spec	2000-02-29 13:27:37.000000000 -0800
+@@ -0,0 +1,305 @@
++Summary: The GNU libc libraries.
++Name: glibc
++Version: 2.1.3
++Release: 15
++Copyright: LGPL
++Group: System Environment/Libraries
++Source: %{name}-%{version}.tar.gz
++# Other sources are available at:
++#   http://www.ozemail.com.au/~geoffk/glibc-crypt/glibc-crypt-2.1.tar.gz
++# In the source tarball the file diff-CYGNUS-to-REDHAT.patch contains all
++# diffs applied by Red Hat to the current CVS version of glibc
++Buildroot: /var/tmp/glibc-%{PACKAGE_VERSION}-root
++Obsoletes: zoneinfo, libc-static, libc-devel, libc-profile, libc-headers,
++Obsoletes:  linuxthreads, gencat, locale
++Autoreq: false
++%ifarch alpha
++Provides: ld.so.2
++%else
++%endif
++%ifarch sparc
++Obsoletes: libc
++%endif
++
++%description
++The glibc package contains standard libraries which are used by
++multiple programs on the system. In order to save disk space and
++memory, as well as to make upgrading easier, common system code is
++kept in one place and shared between programs. This particular package
++contains the most important sets of shared libraries: the standard C
++library and the standard math library. Without these two libraries, a
++Linux system will not function.  The glibc package also contains
++national language (locale) support and timezone databases.
++
++%package devel
++Summary: Header and object files for development using standard C libraries.
++Group: Development/Libraries
++Conflicts: texinfo < 3.11
++Prereq: /sbin/install-info
++Obsoletes: libc-debug, libc-headers, libc-devel, linuxthreads-devel
++Obsoletes: glibc-debug
++Prereq: kernel-headers
++Requires: kernel-headers >= 2.2.1
++Autoreq: true
++
++%description devel
++The glibc-devel package contains the header and object files necessary
++for developing programs which use the standard C libraries (which are
++used by nearly all programs).  If you are developing programs which
++will use the standard C libraries, your system needs to have these
++standard header and object files available in order to create the
++executables.
++
++Install glibc-devel if you are going to develop programs which will
++use the standard C libraries.
++
++%package profile
++Summary: The GNU libc libraries, including support for gprof profiling.
++Group: Development/Libraries
++Obsoletes: libc-profile
++Autoreq: true
++
++%description profile
++The glibc-profile package includes the GNU libc libraries and support
++for profiling using the gprof program.  Profiling is analyzing a
++program's functions to see how much CPU time they use and determining
++which functions are calling other functions during execution.  To use
++gprof to profile a program, your program needs to use the GNU libc
++libraries included in glibc-profile (instead of the standard GNU libc
++libraries included in the glibc package).
++
++If you are going to use the gprof program to profile a program, you'll
++need to install the glibc-profile program.
++
++%package -n nscd
++Summary: A Name Service Caching Daemon (nscd).
++Group: System Environment/Daemons
++Conflicts: kernel < 2.2.0
++Prereq: /sbin/chkconfig
++Autoreq: true
++
++%description -n nscd
++Nscd caches name service lookups and can dramatically improve
++performance with NIS+, and may help with DNS as well. Note that you
++can't use nscd with 2.0 kernels because of bugs in the kernel-side
++thread support. Unfortunately, nscd happens to hit these bugs
++particularly hard.
++
++Install nscd if you need a name service lookup caching daemon, and
++you're not using a version 2.0 kernel.
++
++%prep
++%setup -q
++ 
++%ifarch armv4l
++rm -rf glibc-compat
++%endif
++
++find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \;
++
++%build
++rm -rf build-$RPM_ARCH-linux
++mkdir build-$RPM_ARCH-linux ; cd build-$RPM_ARCH-linux
++%ifarch i586 i686
++BuildFlags="-mpentium -D__USE_STRING_INLINES -fstrict-aliasing -mcpu=%{_target_cpu}"
++%endif
++%ifarch sparcv9
++BuildFlags="-mv8 -mtune=ultrasparc"
++%endif
++CC=egcs CFLAGS="$BuildFlags -g -O3" ../configure --prefix=/usr \
++	--enable-add-ons=yes --without-cvs  \
++	%{_target_cpu}-redhat-linux
++make -r CFLAGS="$BuildFlags -g -O3" PARALLELMFLAGS=-s
++
++%install
++rm -rf $RPM_BUILD_ROOT
++mkdir -p $RPM_BUILD_ROOT
++make install_root=$RPM_BUILD_ROOT install -C build-$RPM_ARCH-linux
++cd build-$RPM_ARCH-linux && \
++    make install_root=$RPM_BUILD_ROOT install-locales -C ../localedata objdir=`pwd` && \
++    cd ..
++
++# compatibility hack: this locale has vanished from glibc, but some other
++# programs are still using it. Normally we would handle it in the %pre
++# section but with glibc that is simply not an option
++mkdir -p $RPM_BUILD_ROOT/usr/share/locale/ru_RU/LC_MESSAGES
++
++# Remove the files we don't want to distribute
++rm -f $RPM_BUILD_ROOT/usr/lib/libNoVersion*
++
++# the man pages for the linuxthreads require special attention
++make -C linuxthreads/man
++mkdir -p $RPM_BUILD_ROOT/usr/man/man3
++install -m 0644 linuxthreads/man/*.3thr $RPM_BUILD_ROOT/usr/man/man3
++gzip -9nvf $RPM_BUILD_ROOT/usr/man/man3/*
++
++gzip -9nvf $RPM_BUILD_ROOT/usr/info/libc*
++
++ln -sf libbsd-compat.a $RPM_BUILD_ROOT/usr/lib/libbsd.a
++
++install -m 644 redhat/nsswitch.conf $RPM_BUILD_ROOT/etc/nsswitch.conf
++
++# Take care of setuids
++# -- new security review sez that this shouldn't be needed anymore
++#chmod 755 $RPM_BUILD_ROOT/usr/libexec/pt_chown
++
++# This is for ncsd - in glibc 2.1
++install -m 644 nscd/nscd.conf $RPM_BUILD_ROOT/etc
++mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
++install -m 755 nscd/nscd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/nscd
++
++# The database support
++mkdir -p $RPM_BUILD_ROOT/var/db
++install -m 644 nss/db-Makefile $RPM_BUILD_ROOT/var/db/Makefile
++
++# Strip binaries
++strip $RPM_BUILD_ROOT/sbin/* || :
++strip $RPM_BUILD_ROOT/usr/bin/* || :
++strip $RPM_BUILD_ROOT/usr/sbin/* || :
++
++# BUILD THE FILE LIST
++find $RPM_BUILD_ROOT -type f -or -type l | 
++	sed -e 's|.*/etc|%config &|' > rpm.filelist.in
++for n in /usr/share /usr/include; do 
++    find ${RPM_BUILD_ROOT}${n} -type d | \
++	grep -v '^/usr/share$' | \
++	sed "s/^/%dir /" >> rpm.filelist.in
++done
++
++# primary filelist
++sed "s|$RPM_BUILD_ROOT||" < rpm.filelist.in | 
++	grep -v '/etc/localtime'  | \
++	grep -v '/etc/nsswitch.conf'  | \
++	sort > rpm.filelist
++
++grep '/usr/lib/lib.*_p\.a' < rpm.filelist > profile.filelist
++egrep "(/usr/include)|(/usr/info)" < rpm.filelist | 
++	grep -v /usr/info/dir > devel.filelist
++
++mv rpm.filelist rpm.filelist.full
++grep -v '/usr/lib/lib.*_p.a' rpm.filelist.full | 
++	egrep -v "(/usr/include)|(/usr/info)" > rpm.filelist
++
++grep '/usr/lib/lib.*\.a' < rpm.filelist >> devel.filelist
++grep '/usr/lib/.*\.o' < rpm.filelist >> devel.filelist
++grep '/usr/lib/lib.*\.so' < rpm.filelist >> devel.filelist
++grep '/usr/man/man' < rpm.filelist >> devel.filelist
++
++mv rpm.filelist rpm.filelist.full
++grep -v '/usr/lib/lib.*\.a' < rpm.filelist.full |
++	grep -v '/usr/lib/.*\.o' |
++	grep -v '/usr/lib/lib.*\.so'|
++	grep -v '/usr/man/man' | 
++	grep -v 'nscd' > rpm.filelist
++
++# /etc/localtime - we're proud of our timezone
++rm -f $RPM_BUILD_ROOT/etc/localtime
++cp -f $RPM_BUILD_ROOT/usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime
++#ln -sf ../usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime
++
++# the last bit: more documentation
++rm -rf documentation
++mkdir documentation
++cp linuxthreads/ChangeLog  documentation/ChangeLog.threads
++cp linuxthreads/Changes documentation/Changes.threads
++cp linuxthreads/README documentation/README.threads
++cp linuxthreads/FAQ.html documentation/FAQ-threads.html
++cp -r linuxthreads/Examples documentation/examples.threads
++cp crypt/README documentation/README.crypt
++cp db2/README documentation/README.db2
++cp db2/mutex/README documentation/README.db2.mutex
++cp timezone/README documentation/README.timezone
++cp ChangeLog* documentation
++gzip -9 documentation/ChangeLog*
++
++%post -p /sbin/ldconfig
++
++%postun -p /sbin/ldconfig
++
++%post devel
++/sbin/install-info /usr/info/libc.info.gz /usr/info/dir
++
++%pre devel
++# this used to be a link and it is causing nightmares now
++if [ -L /usr/include/scsi ] ; then
++    rm -f /usr/include/scsi
++fi
++
++%preun devel
++if [ "$1" = 0 ]; then
++    /sbin/install-info --delete /usr/info/libc.info.gz /usr/info/dir
++fi
++
++%post -n nscd
++/sbin/chkconfig --add nscd
++
++%preun -n nscd
++if [ $1 = 0 ] ; then
++    /sbin/chkconfig --del nscd
++fi
++
++%clean
++rm -rf "$RPM_BUILD_ROOT"
++rm -f *.filelist*
++
++%files -f rpm.filelist
++%defattr(-,root,root)
++%config(noreplace) /etc/localtime
++%config(noreplace) /etc/nsswitch.conf
++%doc README NEWS INSTALL FAQ BUGS NOTES PROJECTS
++%doc documentation/* README.template README.libm
++%doc login/README.utmpd hesiod/README.hesiod
++%dir /var/db
++
++%ifnarch sparcv9 i586 i686
++%files -f devel.filelist devel
++%defattr(-,root,root)
++
++%files -f profile.filelist profile
++%defattr(-,root,root)
++
++%files -n nscd
++%defattr(-,root,root)
++%config /etc/nscd.conf
++/etc/rc.d/init.d/nscd
++/usr/sbin/nscd
++%endif
++
++%define date    %(echo `LC_ALL="C" date +"%a %b %d %Y"`)
++
++%changelog
++* %{date} Cristian Gafton <gafton@redhat.com>
++- fix c_stubs add-on to work around various assert()s in glibc
++- add Davem's patch for _NPROCESSORS_ONLN on Sparc
++
++* Fri Feb 25 2000 Cristian Gafton <gafton@redhat.com>
++- add the c_stubs add-on
++- sparc patch from davem
++
++* Thu Feb 24 2000 Cristian Gafton <gafton@redhat.com>
++- fix locale problems on 64 bit arches
++
++* Tue Feb 22 2000 Cristian Gafton <gafton@redhat.com>
++- cygnus sync up for fixes to nscd
++
++* Thu Feb 17 2000 Cristian Gafton <gafton@redhat.com>
++- updated to include new China timezones
++- sync up with the locale changes from Cygnus
++
++* Tue Feb 01 2000 Cristian Gafton <gafton@redhat.com>
++- updated from cygnus branch
++- fix syslog so that it will continuously try to fallback from SOK_DGRAM to
++  SOCK_STREAM and backwards
++
++* Mon Jan 31 2000 Cristian Gafton <gafton@redhat.com>
++- update from cygnus branch
++- compress man pages for the linuxthreads stuff
++
++* Fri Jan 21 2000 Cristian Gafton <gafton@redhat.com>
++- add Jakub's patch so we back out even more
++
++* Thu Jan 20 2000 Cristian Gafton <gafton@redhat.com>
++- back out the setrlimit changes (well, sort of)
++
++* Mon Jan 03 2000 Cristian Gafton <gafton@redhat.com>
++- make release from CVS server directly now
+diff -Naur ../glibc-2.1.3/glibc-compat/.cvsignore glibc-2.1.3/glibc-compat/.cvsignore
+--- ../glibc-2.1.3/glibc-compat/.cvsignore	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/.cvsignore	2000-01-03 18:17:33.000000000 -0800
+@@ -0,0 +1 @@
++glibc-compat*.tar.gz
+diff -Naur ../glibc-2.1.3/glibc-compat/Banner glibc-2.1.3/glibc-compat/Banner
+--- ../glibc-2.1.3/glibc-compat/Banner	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/Banner	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1 @@
++Glibc-2.0 compatibility add-on by Cristian Gafton 
+diff -Naur ../glibc-2.1.3/glibc-compat/ChangeLog glibc-2.1.3/glibc-compat/ChangeLog
+--- ../glibc-2.1.3/glibc-compat/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/ChangeLog	2000-02-23 17:59:39.000000000 -0800
+@@ -0,0 +1,24 @@
++2000-02-23  Cristian Gafton  <gafton@redhat.com>
++
++	* stubs.c (__setfpucw): Avoid using _FPU_SETCW on platform that do not have it
++
++1999-07-08  Cristian Gafton  <gafton@redhat.com>
++
++	* stubs.c (__setfpucw): New function
++	* Makefile: Use -include, not include
++	(archive): New target.
++	
++
++1999-04-09  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++	* glibc-compat/Makefile: Add rules to link libnss_*.so.1 to libnss1_*.so.2.
++	
++1998-11-18  Cristian Gafton  <gafton@redhat.com>
++
++	* shlib-versions: added alpha versions
++
++	* Makefile (services): Added libnss_dns
++
++1998-11-16  Cristian Gafton  <gafton@redhat.com>
++
++	* makedist (archive): remove old tar file just in case
++
+diff -Naur ../glibc-2.1.3/glibc-compat/Depend glibc-2.1.3/glibc-compat/Depend
+--- ../glibc-2.1.3/glibc-compat/Depend	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/Depend	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,3 @@
++resolv
++nss
++nis
+diff -Naur ../glibc-2.1.3/glibc-compat/Makefile glibc-2.1.3/glibc-compat/Makefile
+--- ../glibc-2.1.3/glibc-compat/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/Makefile	2000-01-06 09:33:12.000000000 -0800
+@@ -0,0 +1,152 @@
++# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++
++# This is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License as
++# published by the Free Software Foundation; either version 2 of the
++# License, or (at your option) any later version.
++
++# The GNU C Library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++# $Id: Makefile,v 1.2 2000/01/06 17:33:12 gafton Exp $
++
++subdir	:= glibc-compat
++
++distribute		:= nss-nis.h
++
++# This is the trivial part which goes into libc itself.
++routines		=
++
++# These are the databases that go through nss dispatch.
++# Caution: if you add a database here, you must add its real name
++# in databases.def, too.
++databases		= proto service hosts network grp pwd rpc ethers \
++			  spwd netgrp alias
++
++# Specify rules for the nss_* modules.  We have some services.
++services		:= files nis compat dns db
++
++extra-libs		:= $(services:%=libnss1_%) libNoVersion
++# These libraries will be built in the `others' pass rather than
++# the `lib' pass, because they depend on libc.so being built already.
++extra-libs-others	= $(extra-libs)
++
++# The sources are found in the appropriate subdir.
++subdir-dirs = $(services:%=nss_%)
++vpath %.c $(subdir-dirs)
++
++libnss1_files-routines	:= $(addprefix files-,$(databases))
++libnss1_db-routines	:= $(addprefix db-,$(filter-out hosts network,$(databases)))
++libnss1_compat-routines	:= $(addprefix compat-,grp pwd spwd)
++libnss1_nis-routines	:= $(addprefix nis-,$(databases))
++libnss1_dns-routines	:= $(addprefix dns-, host network)
++
++libcompat-routines	:= $(addprefix old, fileops iofdopen iopopen stdfiles \
++					    iofclose  iofopen pclose tmpfile)
++libNoVersion-routines	:= stubs
++
++generated		+= $(filter-out db-alias.c db-netgrp.c, \
++					$(addsuffix .c,$(libnss1_db-routines)))
++
++libnss1_files-inhibit-o	= $(filter-out .os,$(object-suffixes))
++libnss1_db-inhibit-o	= $(filter-out .os,$(object-suffixes))
++libnss1_compat-inhibit-o = $(filter-out .os,$(object-suffixes))
++libnss1_nis-inhibit-o	= $(filter-out .os,$(object-suffixes))
++libnss1_dns-inhibit-o	= $(filter-out .os,$(object-suffixes))
++
++-include ../Rules
++
++# Force the soname to be libnss_*.so.1 for compatibility.
++LDFLAGS-nss1_files.so	= -Wl,-soname=lib$(libprefix)nss_files.so$($(@F)-version)
++LDFLAGS-nss1_db.so	= -Wl,-soname=lib$(libprefix)nss_db.so$($(@F)-version)
++LDFLAGS-nss1_nis.so	= -Wl,-soname=lib$(libprefix)nss_nis.so$($(@F)-version)
++LDFLAGS-nss1_compat.so	= -Wl,-soname=lib$(libprefix)nss_compat.so$($(@F)-version)
++LDFLAGS-nss1_dns.so	= -Wl,-soname=lib$(libprefix)nss_dns.so$($(@F)-version)
++
++-include ../Makeconfig
++
++ifeq (yes,$(build-shared))
++install-others	+= $(inst_slibdir)/libnss_files.so$(libnss1_files.so-version) \
++		   $(inst_slibdir)/libnss_db.so$(libnss1_db.so-version) \
++		   $(inst_slibdir)/libnss_nis.so$(libnss1_nis.so-version) \
++		   $(inst_slibdir)/libnss_compat.so$(libnss1_compat.so-version) \
++		   $(inst_slibdir)/libnss_dns.so$(libnss1_dns.so-version)
++endif
++
++$(inst_slibdir)/libnss_files.so$(libnss1_files.so-version): $(inst_slibdir)/libnss1_files-$(version).so $(+force)
++	rm -f $@
++	$(LN_S) $(<F) $@
++
++$(inst_slibdir)/libnss_db.so$(libnss1_db.so-version): $(inst_slibdir)/libnss1_db-$(version).so $(+force)
++	rm -f $@
++	$(LN_S) $(<F) $@
++
++$(inst_slibdir)/libnss_nis.so$(libnss1_nis.so-version): $(inst_slibdir)/libnss1_nis-$(version).so $(+force)
++	rm -f $@
++	$(LN_S) $(<F) $@
++
++$(inst_slibdir)/libnss_compat.so$(libnss1_compat.so-version): $(inst_slibdir)/libnss1_compat-$(version).so $(+force)
++	rm -f $@
++	$(LN_S) $(<F) $@
++
++$(inst_slibdir)/libnss_dns.so$(libnss1_dns.so-version): $(inst_slibdir)/libnss1_dns-$(version).so $(+force)
++	rm -f $@
++	$(LN_S) $(<F) $@
++
++
++$(objpfx)libnss1_db.so: $(common-objpfx)db/libdb1.so $(objpfx)libnss1_files.so
++
++$(libnss1_db-routines:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c
++	@rm -f $@.new
++	(echo '#define EXTERN_PARSER';\
++	 echo '#define GENERIC "../nss_db/db-XXX.c"';\
++	 echo '#include <$<>') > $@.new
++	mv -f $@.new $@
++
++$(objpfx)libnss1_compat.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \
++			   $(objpfx)libnss1_files.so
++$(objpfx)libnss1_nis.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \
++			$(objpfx)libnss1_files.so
++
++# The DNS NSS modules needs the resolver.
++#$(objpfx)libnss1_dns.so: $(filter-out $(common-objpfx)resolv/stamp.os, \
++#				$(wildcard $(common-objpfx)resolv/*.os)) \
++#			$(common-objpfx)libc.so
++$(objpfx)libnss1_dns.so: $(common-objpfx)resolv/libresolv.so $(common-objpfx)libc.so
++
++# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
++# This ensures they will load libc.so for needed symbols if loaded by
++# a statically-linked program that hasn't already loaded it.
++$(objpfx)libnss1_compat.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \
++                            $(objpfx)libnss1_files.so $(common-objpfx)libc.so
++$(objpfx)libnss1_db.so: $(common-objpfx)db2/libdb.so $(objpfx)libnss1_files.so\
++                        $(common-objpfx)libc.so
++$(objpfx)libnss1_dns.so: $(common-objpfx)resolv/libresolv.so \
++                         $(common-objpfx)libc.so
++$(objpfs)libnss1_files.so: $(common-objpfx)libc.so
++$(objpfx)libnss1_nis.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \
++                         $(objpfx)libnss1_files.so $(common-objpfx)libc.so
++
++
++#
++# This is needed to build the separate tarball
++#
++pkgNAME		= $(subdir)
++pkgVERSION	= 2.1.2
++pkgCVSTAG	= $(pkgNAME)_$(subst .,-,$(pkgVERSION))
++
++archive:
++	@rm -f *.tar.gz *~
++	cvs tag -F $(pkgCVSTAG) .
++	@rm -rf /tmp/$(pkgNAME)-$(pkgVERSION) /tmp/$(pkgNAME) $(pkgNAME)-$(pkgVERSION).tar.gz
++	@cd /tmp; cvs export -r$(pkgCVSTAG) $(pkgNAME)
++	@pkgDIR=$$PWD; cd /tmp; tar cvzf $$pkgDIR/$(pkgNAME)-$(pkgVERSION).tar.gz $(pkgNAME)
++	@rm -rf /tmp/$(pkgNAME)
++	@echo "The archive is in $(pkgNAME)-$(pkgVERSION).tar.gz"
+diff -Naur ../glibc-2.1.3/glibc-compat/Versions glibc-2.1.3/glibc-compat/Versions
+--- ../glibc-2.1.3/glibc-compat/Versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/Versions	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,106 @@
++libnss1_db {
++  GLIBC_2.0 {
++    _nss_db_endaliasent; _nss_db_endetherent; _nss_db_endgrent;
++    _nss_db_endnetgrent; _nss_db_endprotoent; _nss_db_endpwent;
++    _nss_db_endrpcent; _nss_db_endservent; _nss_db_endspent;
++    _nss_db_getaliasbyname_r; _nss_db_getaliasent_r; _nss_db_getetherent_r;
++    _nss_db_getgrent_r; _nss_db_getgrgid_r; _nss_db_getgrnam_r;
++    _nss_db_gethostton_r; _nss_db_getnetgrent_r; _nss_db_getntohost_r;
++    _nss_db_getprotobyname_r; _nss_db_getprotobynumber_r;
++    _nss_db_getprotoent_r; _nss_db_getpwent_r; _nss_db_getpwnam_r;
++    _nss_db_getpwuid_r; _nss_db_getrpcbyname_r; _nss_db_getrpcbynumber_r;
++    _nss_db_getrpcent_r; _nss_db_getservbyname_r; _nss_db_getservbyport_r;
++    _nss_db_getservent_r; _nss_db_getspent_r; _nss_db_getspnam_r;
++    _nss_db_setaliasent; _nss_db_setetherent; _nss_db_setgrent;
++    _nss_db_setnetgrent; _nss_db_setprotoent; _nss_db_setpwent;
++    _nss_db_setrpcent; _nss_db_setservent; _nss_db_setspent;
++  }
++}
++
++libnss1_dns {
++  GLIBC_2.0 {
++    _nss_dns_gethostbyaddr_r; _nss_dns_gethostbyname2_r;
++    _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r;
++    _nss_dns_getnetbyname_r;
++  }
++}
++
++libnss1_files {
++  GLIBC_2.0 {
++    _nss_files_setaliasent; _nss_files_endaliasent;
++    _nss_files_getaliasbyname_r; _nss_files_getaliasent_r;
++
++    _nss_files_setetherent; _nss_files_endetherent;
++    _nss_files_getetherent_r; _nss_files_parse_etherent;
++
++    _nss_files_setgrent; _nss_files_endgrent;
++    _nss_files_getgrent_r; _nss_files_getgrgid_r; _nss_files_getgrnam_r;
++
++    _nss_files_sethostent; _nss_files_endhostent;
++    _nss_files_gethostbyaddr_r; _nss_files_gethostbyname2_r; _nss_files_gethostbyname_r;
++     _nss_files_gethostent_r; _nss_files_gethostton_r;
++
++    _nss_files_setnetent; _nss_files_endnetent;
++    _nss_files_getnetbyaddr_r; _nss_files_getnetbyname_r;
++    _nss_files_getnetent_r; _nss_files_getntohost_r;
++    _nss_files_parse_netent;
++
++    _nss_files_setnetgrent; _nss_files_endnetgrent; _nss_files_getnetgrent_r;
++
++    _nss_files_setprotoent; _nss_files_endprotoent;
++    _nss_files_getprotobyname_r; _nss_files_getprotobynumber_r;
++    _nss_files_getprotoent_r;  _nss_files_parse_protoent;
++
++    _nss_files_setpwent; _nss_files_endpwent;
++    _nss_files_getpwent_r; _nss_files_getpwnam_r; _nss_files_getpwuid_r;
++
++    _nss_files_setrpcent; _nss_files_endrpcent;
++    _nss_files_getrpcbyname_r; _nss_files_getrpcbynumber_r;
++    _nss_files_getrpcent_r;
++    _nss_files_parse_rpcent;
++
++    _nss_files_setservent; _nss_files_endservent;
++    _nss_files_getservbyname_r; _nss_files_getservbyport_r;
++    _nss_files_getservent_r;
++    _nss_files_parse_servent;
++
++    _nss_files_setspent; _nss_files_endspent;
++    _nss_files_getspent_r; _nss_files_getspnam_r;
++
++    _nss_netgroup_parseline;
++  }
++}
++
++libnss1_compat {
++  GLIBC_2.0 {
++    _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent;
++    _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r;
++    _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r;
++    _nss_compat_getspent_r; _nss_compat_getspnam_r; _nss_compat_initgroups;
++    _nss_compat_setgrent; _nss_compat_setpwent; _nss_compat_setspent;
++  }
++}
++
++libnss1_nis {
++  GLIBC_2.0 {
++    _nss_nis_endaliasent; _nss_nis_endetherent; _nss_nis_endgrent;
++    _nss_nis_endhostent; _nss_nis_endnetent; _nss_nis_endnetgrent;
++    _nss_nis_endprotoent; _nss_nis_endpwent; _nss_nis_endrpcent;
++    _nss_nis_endservent; _nss_nis_endspent; _nss_nis_getaliasbyname_r;
++    _nss_nis_getaliasent_r; _nss_nis_getetherent_r; _nss_nis_getgrent_r;
++    _nss_nis_getgrgid_r; _nss_nis_getgrnam_r; _nss_nis_gethostbyaddr_r;
++    _nss_nis_gethostbyname2_r; _nss_nis_gethostbyname_r; _nss_nis_gethostent_r;
++    _nss_nis_gethostton_r; _nss_nis_getnetbyaddr_r; _nss_nis_getnetbyname_r;
++    _nss_nis_getnetent_r; _nss_nis_getnetgrent_r; _nss_nis_getntohost_r;
++    _nss_nis_getprotobyname_r; _nss_nis_getprotobynumber_r;
++    _nss_nis_getprotoent_r; _nss_nis_getpublickey; _nss_nis_getpwent_r;
++    _nss_nis_getpwnam_r; _nss_nis_getpwuid_r; _nss_nis_getrpcbyname_r;
++    _nss_nis_getrpcbynumber_r; _nss_nis_getrpcent_r; _nss_nis_getsecretkey;
++    _nss_nis_getservbyname_r; _nss_nis_getservbyport_r; _nss_nis_getservent_r;
++    _nss_nis_getspent_r; _nss_nis_getspnam_r; _nss_nis_initgroups;
++    _nss_nis_netname2user; _nss_nis_setaliasent; _nss_nis_setetherent;
++    _nss_nis_setgrent; _nss_nis_sethostent; _nss_nis_setnetent;
++    _nss_nis_setnetgrent; _nss_nis_setprotoent; _nss_nis_setpwent;
++    _nss_nis_setrpcent; _nss_nis_setservent; _nss_nis_setspent;
++  }
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/Versions.def glibc-2.1.3/glibc-compat/Versions.def
+--- ../glibc-2.1.3/glibc-compat/Versions.def	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/Versions.def	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,15 @@
++libnss1_files {
++  GLIBC_2.0
++}
++libnss1_db {
++  GLIBC_2.0
++}
++libnss1_dns {
++  GLIBC_2.0
++}
++libnss1_nis {
++  GLIBC_2.0
++}
++libnss1_compat {
++  GLIBC_2.0
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/configure glibc-2.1.3/glibc-compat/configure
+--- ../glibc-2.1.3/glibc-compat/configure	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/configure	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,28 @@
++#! /bin/sh
++#
++# We need a configure script only when compiling as part of GNU C library.
++# Here we have to generate one of the files we need while compiling.
++#
++# The only problem is that no users of the package might thing they have to
++# run configure themself and find it irritating when nothing happens.
++#
++# So we try here to find out whether we are called from the glibc configure
++# or by a user.  If the later is true show a gentle message.
++#
++saw_srcdir=no
++srcdir=
++saw_cache_file=no
++# We use a simple heuristic which might fail: if we see the argument the
++# glibc configure passes we assume it's glibc who calls us.
++for opt in $*; do
++  case $opt in
++    --srcdir=*) saw_srcdir=yes
++		srcdir=`echo "$opt" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
++    --cache-file=*) saw_cache_file=yes ;;
++    *) ;;
++  esac
++done
++
++echo "Configure stage for glibc 2.0 add-on"
++
++exit 0
+diff -Naur ../glibc-2.1.3/glibc-compat/nss-nis.h glibc-2.1.3/glibc-compat/nss-nis.h
+--- ../glibc-2.1.3/glibc-compat/nss-nis.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss-nis.h	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,58 @@
++/* Copyright (C) 1996 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef _NIS_NSS_NIS_H
++#define _NIS_NSS_NIS_H	1
++
++#include <rpcsvc/ypclnt.h>
++
++#include "nsswitch.h"
++
++
++/* Convert YP error number to NSS error number.  */
++static enum nss_status yperr2nss_tab[] =
++{
++  [YPERR_SUCCESS] = NSS_STATUS_SUCCESS,
++  [YPERR_BADARGS] = NSS_STATUS_UNAVAIL,
++  [YPERR_RPC]     = NSS_STATUS_UNAVAIL,
++  [YPERR_DOMAIN]  = NSS_STATUS_UNAVAIL,
++  [YPERR_MAP]     = NSS_STATUS_UNAVAIL,
++  [YPERR_KEY]     = NSS_STATUS_NOTFOUND,
++  [YPERR_YPERR]   = NSS_STATUS_UNAVAIL,
++  [YPERR_RESRC]   = NSS_STATUS_TRYAGAIN,
++  [YPERR_NOMORE]  = NSS_STATUS_NOTFOUND,
++  [YPERR_PMAP]    = NSS_STATUS_UNAVAIL,
++  [YPERR_YPBIND]  = NSS_STATUS_UNAVAIL,
++  [YPERR_YPSERV]  = NSS_STATUS_UNAVAIL,
++  [YPERR_NODOM]   = NSS_STATUS_UNAVAIL,
++  [YPERR_BADDB]   = NSS_STATUS_UNAVAIL,
++  [YPERR_VERS]    = NSS_STATUS_UNAVAIL,
++  [YPERR_ACCESS]  = NSS_STATUS_UNAVAIL,
++  [YPERR_BUSY]    = NSS_STATUS_TRYAGAIN
++};
++#define YPERR_COUNT (sizeof (yperr2nss_tab) / sizeof (yperr2nss_tab[0]))
++
++static inline enum nss_status
++yperr2nss (int errval)
++{
++  if ((unsigned int) errval > YPERR_COUNT)
++    return NSS_STATUS_UNAVAIL;
++  return yperr2nss_tab[errval];
++}
++
++#endif /* nis/nss-nis.h */
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c
+--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,769 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <errno.h>
++#include <fcntl.h>
++#include <nss.h>
++#include <grp.h>
++#include <ctype.h>
++#include <bits/libc-lock.h>
++#include <string.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++#include <nsswitch.h>
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME grent
++#define STRUCTURE group
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Structure for remembering -group members ... */
++#define BLACKLIST_INITIAL_SIZE 512
++#define BLACKLIST_INCREMENT 256
++struct blacklist_t
++  {
++    char *data;
++    int current;
++    int size;
++  };
++
++struct ent_t
++  {
++    bool_t nis;
++    bool_t nis_first;
++    char *oldkey;
++    int oldkeylen;
++    FILE *stream;
++    struct blacklist_t blacklist;
++};
++typedef struct ent_t ent_t;
++
++static ent_t ext_ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
++
++/* Protect global state against multiple changers.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Prototypes for local functions.  */
++static void blacklist_store_name (const char *, ent_t *);
++static int in_blacklist (const char *, int, ent_t *);
++
++static enum nss_status
++internal_setgrent (ent_t *ent)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  ent->nis = ent->nis_first = 0;
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  if (ent->stream == NULL)
++    {
++      ent->stream = fopen ("/etc/group", "r");
++
++      if (ent->stream == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl (fileno (ent->stream), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl (fileno (ent->stream), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      fclose (ent->stream);
++	      ent->stream = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++  else
++    rewind (ent->stream);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_compat_setgrent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_setgrent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++
++static enum nss_status
++internal_endgrent (ent_t *ent)
++{
++  if (ent->stream != NULL)
++    {
++      fclose (ent->stream);
++      ent->stream = NULL;
++    }
++
++  ent->nis = ent->nis_first = 0;
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_endgrent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_endgrent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++static enum nss_status
++getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
++		   size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain;
++  char *outkey, *outval;
++  int outkeylen, outvallen, parse_res;
++  char *p;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    {
++      ent->nis = 0;
++      return NSS_STATUS_NOTFOUND;
++    }
++
++  do
++    {
++      char *save_oldkey;
++      int save_oldlen;
++      bool_t save_nis_first;
++
++      if (ent->nis_first)
++	{
++	  if (yp_first (domain, "group.byname", &outkey, &outkeylen,
++			&outval, &outvallen) != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      return NSS_STATUS_UNAVAIL;
++	    }
++	  save_oldkey = ent->oldkey;
++	  save_oldlen = ent->oldkeylen;
++	  save_nis_first = TRUE;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	  ent->nis_first = FALSE;
++	}
++      else
++	{
++	  if (yp_next (domain, "group.byname", ent->oldkey, ent->oldkeylen,
++		       &outkey, &outkeylen, &outval, &outvallen)
++	      != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      return NSS_STATUS_NOTFOUND;
++	    }
++
++	  save_oldkey = ent->oldkey;
++	  save_oldlen = ent->oldkeylen;
++	  save_nis_first = FALSE;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	}
++
++      /* Copy the found data to our buffer  */
++      p = strncpy (buffer, outval, buflen);
++
++      /* ...and free the data.  */
++      free (outval);
++
++      while (isspace (*p))
++	++p;
++
++      if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1)
++	{
++	  free (ent->oldkey);
++	  ent->oldkey = save_oldkey;
++	  ent->oldkeylen = save_oldlen;
++	  ent->nis_first = save_nis_first;
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      else
++	{
++	  if (!save_nis_first)
++	    free (save_oldkey);
++	}
++
++      if (parse_res &&
++	  in_blacklist (result->gr_name, strlen (result->gr_name), ent))
++	parse_res = 0; /* if result->gr_name in blacklist,search next entry */
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* This function handle the +group entrys in /etc/group */
++static enum nss_status
++getgrnam_plusgroup (const char *name, struct group *result, char *buffer,
++		    size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  int parse_res;
++  char *domain, *outval, *p;
++  int outvallen;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++
++  if (yp_match (domain, "group.byname", name, strlen (name),
++		&outval, &outvallen) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  p = strncpy (buffer, outval,
++	       buflen < (size_t) outvallen ? buflen : (size_t) outvallen);
++  free (outval);
++  while (isspace (*p))
++    p++;
++  if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res)
++    /* We found the entry.  */
++    return NSS_STATUS_SUCCESS;
++  else
++    return NSS_STATUS_RETURN;
++}
++
++static enum nss_status
++getgrent_next_file (struct group *result, ent_t *ent,
++		    char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  while (1)
++    {
++      fpos_t pos;
++      int parse_res = 0;
++      char *p;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
++      /* Parse the line.  If it is invalid, loop to
++         get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_grent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      if (result->gr_name[0] != '+' && result->gr_name[0] != '-')
++	/* This is a real entry.  */
++	break;
++
++      /* -group */
++      if (result->gr_name[0] == '-' && result->gr_name[1] != '\0'
++	  && result->gr_name[1] != '@')
++	{
++	  blacklist_store_name (&result->gr_name[1], ent);
++	  continue;
++	}
++
++      /* +group */
++      if (result->gr_name[0] == '+' && result->gr_name[1] != '\0'
++	  && result->gr_name[1] != '@')
++	{
++          enum nss_status status;
++
++ 	  /* Store the group in the blacklist for the "+" at the end of
++	     /etc/group */
++	  blacklist_store_name (&result->gr_name[1], ent);
++	  status = getgrnam_plusgroup (&result->gr_name[1], result, buffer,
++				       buflen);
++          if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
++            break;
++          else
++            if (status == NSS_STATUS_RETURN /* We couldn't parse the entry */
++		|| status == NSS_STATUS_NOTFOUND) /* No group in NIS */
++              continue;
++            else
++	      {
++		if (status == NSS_STATUS_TRYAGAIN)
++		  /* The parser ran out of space.  */
++		  fsetpos (ent->stream, &pos);
++		return status;
++	      }
++	}
++
++      /* +:... */
++      if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
++	{
++	  ent->nis = TRUE;
++	  ent->nis_first = TRUE;
++
++	  return getgrent_next_nis (result, ent, buffer, buflen);
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++
++static enum nss_status
++internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer,
++		     size_t buflen)
++{
++  if (ent->nis)
++    {
++      return getgrent_next_nis (gr, ent, buffer, buflen);
++    }
++  else
++    return getgrent_next_file (gr, ent, buffer, buflen);
++}
++
++enum nss_status
++_nss_compat_getgrent_r (struct group *grp, char *buffer, size_t buflen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  /* Be prepared that the setgrent function was not called before.  */
++  if (ext_ent.stream == NULL)
++    status = internal_setgrent (&ext_ent);
++
++  if (status == NSS_STATUS_SUCCESS)
++    status = internal_getgrent_r (grp, &ext_ent, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++/* Searches in /etc/group and the NIS/NIS+ map for a special group */
++static enum nss_status
++internal_getgrnam_r (const char *name, struct group *result, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  while (1)
++    {
++      fpos_t pos;
++      int parse_res = 0;
++      char *p;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
++      /* Parse the line.  If it is invalid, loop to
++         get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_grent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* This is a real entry.  */
++      if (result->gr_name[0] != '+' && result->gr_name[0] != '-')
++	{
++	  if (strcmp (result->gr_name, name) == 0)
++	    return NSS_STATUS_SUCCESS;
++	  else
++	    continue;
++	}
++
++      /* -group */
++      if (result->gr_name[0] == '-' && result->gr_name[1] != '\0')
++	{
++	  if (strcmp (&result->gr_name[1], name) == 0)
++	    return NSS_STATUS_NOTFOUND;
++	  else
++	    continue;
++	}
++
++      /* +group */
++      if (result->gr_name[0] == '+' && result->gr_name[1] != '\0')
++	{
++	  if (strcmp (name, &result->gr_name[1]) == 0)
++	    {
++	      enum nss_status status;
++
++	      status = getgrnam_plusgroup (name, result, buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		/* We couldn't parse the entry */
++		continue;
++	      else
++		return status;
++	    }
++	}
++      /* +:... */
++      if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
++	{
++	  enum nss_status status;
++
++	  status = getgrnam_plusgroup (name, result, buffer, buflen);
++	  if (status == NSS_STATUS_RETURN)
++	    /* We couldn't parse the entry */
++	    continue;
++	  else
++	    return status;
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_getgrnam_r (const char *name, struct group *grp,
++			char *buffer, size_t buflen)
++{
++  ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
++  enum nss_status status;
++
++  if (name[0] == '-' || name[0] == '+')
++    return NSS_STATUS_NOTFOUND;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setgrent (&ent);
++
++  __libc_lock_unlock (lock);
++
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  status = internal_getgrnam_r (name, grp, &ent, buffer, buflen);
++
++  internal_endgrent (&ent);
++
++  return status;
++}
++
++/* This function handle the + entry in /etc/group */
++static enum nss_status
++getgrgid_plusgroup (gid_t gid, struct group *result, char *buffer,
++		    size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  int parse_res;
++  char buf[1024];
++  char *domain, *outval, *p;
++  int outvallen;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    return NSS_STATUS_TRYAGAIN;
++
++  snprintf (buf, sizeof (buf), "%d", gid);
++
++  if (yp_match (domain, "group.bygid", buf, strlen (buf),
++		&outval, &outvallen) != YPERR_SUCCESS)
++    return NSS_STATUS_TRYAGAIN;
++  p = strncpy (buffer, outval,
++	       buflen < (size_t) outvallen ? buflen : (size_t) outvallen);
++  free (outval);
++  while (isspace (*p))
++    p++;
++  if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res)
++    /* We found the entry.  */
++    return NSS_STATUS_SUCCESS;
++  else
++    return NSS_STATUS_RETURN;
++}
++
++/* Searches in /etc/group and the NIS/NIS+ map for a special group id */
++static enum nss_status
++internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  while (1)
++    {
++      fpos_t pos;
++      int parse_res = 0;
++      char *p;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
++      /* Parse the line.  If it is invalid, loop to
++         get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_grent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* This is a real entry.  */
++      if (result->gr_name[0] != '+' && result->gr_name[0] != '-')
++	{
++	  if (result->gr_gid == gid)
++	    return NSS_STATUS_SUCCESS;
++	  else
++	    continue;
++	}
++
++      /* -group */
++      if (result->gr_name[0] == '-' && result->gr_name[1] != '\0')
++	{
++          blacklist_store_name (&result->gr_name[1], ent);
++          continue;
++	}
++
++      /* +group */
++      if (result->gr_name[0] == '+' && result->gr_name[1] != '\0')
++	{
++	  enum nss_status status;
++
++	  /* Store the group in the blacklist for the "+" at the end of
++             /etc/group */
++          blacklist_store_name (&result->gr_name[1], ent);
++	  status = getgrnam_plusgroup (&result->gr_name[1], result, buffer,
++				      buflen);
++	  if (status == NSS_STATUS_SUCCESS && result->gr_gid == gid)
++	    break;
++	  else
++	    continue;
++	}
++      /* +:... */
++      if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
++	{
++	  enum nss_status status;
++
++	  status = getgrgid_plusgroup (gid, result, buffer, buflen);
++	  if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
++	    return NSS_STATUS_NOTFOUND;
++	  else
++	    return status;
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_getgrgid_r (gid_t gid, struct group *grp,
++			char *buffer, size_t buflen)
++{
++  ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}};
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setgrent (&ent);
++
++  __libc_lock_unlock (lock);
++
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  status = internal_getgrgid_r (gid, grp, &ent, buffer, buflen);
++
++  internal_endgrent (&ent);
++
++  return status;
++}
++
++
++/* Support routines for remembering -@netgroup and -user entries.
++   The names are stored in a single string with `|' as separator. */
++static void
++blacklist_store_name (const char *name, ent_t *ent)
++{
++  int namelen = strlen (name);
++  char *tmp;
++
++  /* first call, setup cache */
++  if (ent->blacklist.size == 0)
++    {
++      ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen);
++      ent->blacklist.data = malloc (ent->blacklist.size);
++      if (ent->blacklist.data == NULL)
++	return;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++      ent->blacklist.current = 1;
++    }
++  else
++    {
++      if (in_blacklist (name, namelen, ent))
++	return;			/* no duplicates */
++
++      if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size)
++	{
++	  ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen);
++	  tmp = realloc (ent->blacklist.data, ent->blacklist.size);
++	  if (tmp == NULL)
++	    {
++	      free (ent->blacklist.data);
++	      ent->blacklist.size = 0;
++	      return;
++	    }
++	  ent->blacklist.data = tmp;
++	}
++    }
++
++  tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name);
++  *tmp++ = '|';
++  *tmp = '\0';
++  ent->blacklist.current += namelen + 1;
++
++  return;
++}
++
++/* returns TRUE if ent->blacklist contains name, else FALSE */
++static bool_t
++in_blacklist (const char *name, int namelen, ent_t *ent)
++{
++  char buf[namelen + 3];
++  char *cp;
++
++  if (ent->blacklist.data == NULL)
++    return FALSE;
++
++  buf[0] = '|';
++  cp = stpcpy (&buf[1], name);
++  *cp++= '|';
++  *cp = '\0';
++  return strstr (ent->blacklist.data, buf) != NULL;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,1199 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <pwd.h>
++#include <errno.h>
++#include <ctype.h>
++#include <fcntl.h>
++#include <netdb.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++#include <nsswitch.h>
++
++#include "netgroup.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME pwent
++#define STRUCTURE passwd
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Structure for remembering -@netgroup and -user members ... */
++#define BLACKLIST_INITIAL_SIZE 512
++#define BLACKLIST_INCREMENT 256
++struct blacklist_t
++  {
++    char *data;
++    int current;
++    int size;
++  };
++
++struct ent_t
++  {
++    bool_t netgroup;
++    bool_t nis;
++    bool_t first;
++    char *oldkey;
++    int oldkeylen;
++    FILE *stream;
++    struct blacklist_t blacklist;
++    struct passwd pwd;
++    struct __netgrent netgrdata;
++  };
++typedef struct ent_t ent_t;
++
++static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
++			{NULL, NULL, 0, 0, NULL, NULL, NULL}};
++
++/* Protect global state against multiple changers.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Prototypes for local functions.  */
++static void blacklist_store_name (const char *, ent_t *);
++static int in_blacklist (const char *, int, ent_t *);
++
++static void
++give_pwd_free (struct passwd *pwd)
++{
++  if (pwd->pw_name != NULL)
++    free (pwd->pw_name);
++  if (pwd->pw_passwd != NULL)
++    free (pwd->pw_passwd);
++  if (pwd->pw_gecos != NULL)
++    free (pwd->pw_gecos);
++  if (pwd->pw_dir != NULL)
++    free (pwd->pw_dir);
++  if (pwd->pw_shell != NULL)
++    free (pwd->pw_shell);
++
++  memset (pwd, '\0', sizeof (struct passwd));
++}
++
++static size_t
++pwd_need_buflen (struct passwd *pwd)
++{
++  size_t len = 0;
++
++  if (pwd->pw_passwd != NULL)
++    len += strlen (pwd->pw_passwd) + 1;
++
++  if (pwd->pw_gecos != NULL)
++    len += strlen (pwd->pw_gecos) + 1;
++
++  if (pwd->pw_dir != NULL)
++    len += strlen (pwd->pw_dir) + 1;
++
++  if (pwd->pw_shell != NULL)
++    len += strlen (pwd->pw_shell) + 1;
++
++  return len;
++}
++
++static void
++copy_pwd_changes (struct passwd *dest, struct passwd *src,
++		  char *buffer, size_t buflen)
++{
++  if (src->pw_passwd != NULL && strlen (src->pw_passwd))
++    {
++      if (buffer == NULL)
++	dest->pw_passwd = strdup (src->pw_passwd);
++      else if (dest->pw_passwd &&
++	       strlen (dest->pw_passwd) >= strlen (src->pw_passwd))
++	strcpy (dest->pw_passwd, src->pw_passwd);
++      else
++	{
++	  dest->pw_passwd = buffer;
++	  strcpy (dest->pw_passwd, src->pw_passwd);
++	  buffer += strlen (dest->pw_passwd) + 1;
++	  buflen = buflen - (strlen (dest->pw_passwd) + 1);
++	}
++    }
++
++  if (src->pw_gecos != NULL && strlen (src->pw_gecos))
++    {
++      if (buffer == NULL)
++	dest->pw_gecos = strdup (src->pw_gecos);
++      else if (dest->pw_gecos &&
++	       strlen (dest->pw_gecos) >= strlen (src->pw_gecos))
++	strcpy (dest->pw_gecos, src->pw_gecos);
++      else
++	{
++	  dest->pw_gecos = buffer;
++	  strcpy (dest->pw_gecos, src->pw_gecos);
++	  buffer += strlen (dest->pw_gecos) + 1;
++	  buflen = buflen - (strlen (dest->pw_gecos) + 1);
++	}
++    }
++  if (src->pw_dir != NULL && strlen (src->pw_dir))
++    {
++      if (buffer == NULL)
++	dest->pw_dir = strdup (src->pw_dir);
++      else if (dest->pw_dir &&
++	       strlen (dest->pw_dir) >= strlen (src->pw_dir))
++	strcpy (dest->pw_dir, src->pw_dir);
++      else
++	{
++	  dest->pw_dir = buffer;
++	  strcpy (dest->pw_dir, src->pw_dir);
++	  buffer += strlen (dest->pw_dir) + 1;
++	  buflen = buflen - (strlen (dest->pw_dir) + 1);
++	}
++    }
++
++  if (src->pw_shell != NULL && strlen (src->pw_shell))
++    {
++      if (buffer == NULL)
++	dest->pw_shell = strdup (src->pw_shell);
++      else if (dest->pw_shell &&
++	       strlen (dest->pw_shell) >= strlen (src->pw_shell))
++	strcpy (dest->pw_shell, src->pw_shell);
++      else
++	{
++	  dest->pw_shell = buffer;
++	  strcpy (dest->pw_shell, src->pw_shell);
++	  buffer += strlen (dest->pw_shell) + 1;
++	  buflen = buflen - (strlen (dest->pw_shell) + 1);
++	}
++    }
++}
++
++static enum nss_status
++internal_setpwent (ent_t *ent)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  ent->nis = ent->first = ent->netgroup = 0;
++
++  /* If something was left over free it.  */
++  if (ent->netgroup)
++    __internal_endnetgrent (&ent->netgrdata);
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  if (ent->stream == NULL)
++    {
++      ent->stream = fopen ("/etc/passwd", "r");
++
++      if (ent->stream == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl (fileno (ent->stream), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl (fileno (ent->stream), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      fclose (ent->stream);
++	      ent->stream = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++  else
++    rewind (ent->stream);
++
++  give_pwd_free (&ent->pwd);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_compat_setpwent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_setpwent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++
++static enum nss_status
++internal_endpwent (ent_t *ent)
++{
++  if (ent->stream != NULL)
++    {
++      fclose (ent->stream);
++      ent->stream = NULL;
++    }
++
++  if (ent->netgroup)
++    __internal_endnetgrent (&ent->netgrdata);
++
++  ent->nis = ent->first = ent->netgroup = 0;
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  give_pwd_free (&ent->pwd);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_endpwent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_endpwent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++static enum nss_status
++getpwent_next_nis_netgr (const char *name, struct passwd *result, ent_t *ent,
++			 char *group, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *ypdomain, *host, *user, *domain, *outval, *p, *p2;
++  int status, outvallen;
++  size_t p2len;
++
++  if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS)
++    {
++      ent->netgroup = 0;
++      ent->first = 0;
++      give_pwd_free (&ent->pwd);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (ent->first == TRUE)
++    {
++      memset (&ent->netgrdata, 0, sizeof (struct __netgrent));
++      __internal_setnetgrent (group, &ent->netgrdata);
++      ent->first = FALSE;
++    }
++
++  while (1)
++    {
++      char *saved_cursor;
++      int parse_res;
++
++      saved_cursor = ent->netgrdata.cursor;
++      status = __internal_getnetgrent_r (&host, &user, &domain,
++					 &ent->netgrdata, buffer, buflen,
++					 &errno);
++      if (status != 1)
++	{
++	  __internal_endnetgrent (&ent->netgrdata);
++	  ent->netgroup = 0;
++	  give_pwd_free (&ent->pwd);
++	  return NSS_STATUS_RETURN;
++	}
++
++      if (user == NULL || user[0] == '-')
++	continue;
++
++      if (domain != NULL && strcmp (ypdomain, domain) != 0)
++	continue;
++
++      /* If name != NULL, we are called from getpwnam */
++      if (name != NULL)
++	if (strcmp (user, name) != 0)
++	  continue;
++
++      if (yp_match (ypdomain, "passwd.byname", user,
++		    strlen (user), &outval, &outvallen)
++	  != YPERR_SUCCESS)
++	continue;
++
++      p2len = pwd_need_buflen (&ent->pwd);
++      if (p2len > buflen)
++	{
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      p2 = buffer + (buflen - p2len);
++      buflen -= p2len;
++      p = strncpy (buffer, outval, buflen);
++      while (isspace (*p))
++	p++;
++      free (outval);
++      if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1)
++	{
++	  ent->netgrdata.cursor = saved_cursor;
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      if (parse_res)
++	{
++	  /* Store the User in the blacklist for the "+" at the end of
++	     /etc/passwd */
++	  blacklist_store_name (result->pw_name, ent);
++	  copy_pwd_changes (result, &ent->pwd, p2, p2len);
++	  break;
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer,
++		   size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain, *outkey, *outval, *p, *p2;
++  int outkeylen, outvallen, parse_res;
++  size_t p2len;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    {
++      ent->nis = 0;
++      give_pwd_free (&ent->pwd);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  p2len = pwd_need_buflen (&ent->pwd);
++  if (p2len > buflen)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  p2 = buffer + (buflen - p2len);
++  buflen -= p2len;
++  do
++    {
++      bool_t saved_first;
++      char *saved_oldkey;
++      int saved_oldlen;
++
++      if (ent->first)
++	{
++	  if (yp_first (domain, "passwd.byname", &outkey, &outkeylen,
++			&outval, &outvallen) != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      give_pwd_free (&ent->pwd);
++	      return NSS_STATUS_UNAVAIL;
++	    }
++
++	  saved_first = TRUE;
++	  saved_oldkey = ent->oldkey;
++	  saved_oldlen = ent->oldkeylen;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	  ent->first = FALSE;
++	}
++      else
++	{
++	  if (yp_next (domain, "passwd.byname", ent->oldkey, ent->oldkeylen,
++		       &outkey, &outkeylen, &outval, &outvallen)
++	      != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      give_pwd_free (&ent->pwd);
++	      return NSS_STATUS_NOTFOUND;
++	    }
++
++	  saved_first = FALSE;
++	  saved_oldkey = ent->oldkey;
++	  saved_oldlen = ent->oldkeylen;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	}
++
++      /* Copy the found data to our buffer  */
++      p = strncpy (buffer, outval, buflen);
++
++      /* ...and free the data.  */
++      free (outval);
++
++      while (isspace (*p))
++	++p;
++      if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1)
++	{
++	  free (ent->oldkey);
++	  ent->oldkey = saved_oldkey;
++	  ent->oldkeylen = saved_oldlen;
++	  ent->first = saved_first;
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      else
++	{
++	  if (!saved_first)
++	    free (saved_oldkey);
++	}
++      if (parse_res &&
++	  in_blacklist (result->pw_name, strlen (result->pw_name), ent))
++	parse_res = 0;
++    }
++  while (!parse_res);
++
++  copy_pwd_changes (result, &ent->pwd, p2, p2len);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* This function handle the +user entrys in /etc/passwd */
++static enum nss_status
++getpwnam_plususer (const char *name, struct passwd *result, char *buffer,
++		   size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  struct passwd pwd;
++  int parse_res;
++  char *p;
++  size_t plen;
++  char *domain, *outval, *ptr;
++  int outvallen;
++
++  memset (&pwd, '\0', sizeof (struct passwd));
++
++  copy_pwd_changes (&pwd, result, NULL, 0);
++
++  plen = pwd_need_buflen (&pwd);
++  if (plen > buflen)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  p = buffer + (buflen - plen);
++  buflen -= plen;
++
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++
++  if (yp_match (domain, "passwd.byname", name, strlen (name),
++		&outval, &outvallen) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ?
++		 buflen : (size_t) outvallen);
++  buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0';
++  free (outval);
++  while (isspace (*ptr))
++    ptr++;
++  if ((parse_res = _nss_files_parse_pwent (ptr, result, data, buflen))
++      == -1)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res > 0)
++    {
++      copy_pwd_changes (result, &pwd, p, plen);
++      give_pwd_free (&pwd);
++      /* We found the entry.  */
++      return NSS_STATUS_SUCCESS;
++    }
++  else
++    {
++      /* Give buffer the old len back */
++      buflen += plen;
++      give_pwd_free (&pwd);
++    }
++  return NSS_STATUS_RETURN;
++}
++
++/* get the next user from NIS+  (+ entry) */
++static enum nss_status
++getpwent_next_file (struct passwd *result, ent_t *ent,
++		    char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  while (1)
++    {
++      fpos_t pos;
++      char *p;
++      int parse_res;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++ 	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
++      /* Parse the line.  If it is invalid, loop to
++         get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_pwent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      if (result->pw_name[0] != '+' && result->pw_name[0] != '-')
++	/* This is a real entry.  */
++	break;
++
++      /* -@netgroup */
++      if (result->pw_name[0] == '-' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  char buf2[1024];
++	  char *user, *host, *domain;
++	  struct __netgrent netgrdata;
++
++	  bzero (&netgrdata, sizeof (struct __netgrent));
++	  __internal_setnetgrent (&result->pw_name[2], &netgrdata);
++	  while (__internal_getnetgrent_r (&host, &user, &domain,
++					   &netgrdata, buf2, sizeof (buf2),
++					   &errno))
++	    {
++	      if (user != NULL && user[0] != '-')
++		blacklist_store_name (user, ent);
++	    }
++	  __internal_endnetgrent (&netgrdata);
++	  continue;
++	}
++
++      /* +@netgroup */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  int status;
++
++	  ent->netgroup = TRUE;
++	  ent->first = TRUE;
++	  copy_pwd_changes (&ent->pwd, result, NULL, 0);
++
++	  status =  getpwent_next_nis_netgr (NULL, result, ent,
++					     &result->pw_name[2],
++					     buffer, buflen);
++	  if (status == NSS_STATUS_RETURN)
++	    continue;
++	  else
++	    return status;
++	}
++
++      /* -user */
++      if (result->pw_name[0] == '-' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++	  blacklist_store_name (&result->pw_name[1], ent);
++	  continue;
++	}
++
++      /* +user */
++      if (result->pw_name[0] == '+' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++	  enum nss_status status;
++
++	  /* Store the User in the blacklist for the "+" at the end of
++	     /etc/passwd */
++	  blacklist_store_name (&result->pw_name[1], ent);
++	  status = getpwnam_plususer (&result->pw_name[1], result, buffer,
++				      buflen);
++	  if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
++	    break;
++	  else
++	    if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
++	      continue;
++	    else
++	      return status;
++	}
++
++      /* +:... */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '\0')
++	{
++	  ent->nis = TRUE;
++	  ent->first = TRUE;
++	  copy_pwd_changes (&ent->pwd, result, NULL, 0);
++
++	  return getpwent_next_nis (result, ent, buffer, buflen);
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++
++/* get the next user from NIS (+ entry) */
++static enum nss_status
++internal_getpwent_r (struct passwd *pw, ent_t *ent, char *buffer,
++		     size_t buflen)
++{
++  if (ent->netgroup)
++    {
++      int status;
++
++      /* We are searching members in a netgroup */
++      /* Since this is not the first call, we don't need the group name */
++      status = getpwent_next_nis_netgr (NULL, pw, ent, NULL, buffer, buflen);
++      if (status == NSS_STATUS_RETURN)
++	return getpwent_next_file (pw, ent, buffer, buflen);
++      else
++	return status;
++    }
++  else
++    if (ent->nis)
++      {
++	return getpwent_next_nis (pw, ent, buffer, buflen);
++      }
++    else
++      return getpwent_next_file (pw, ent, buffer, buflen);
++}
++
++enum nss_status
++_nss_compat_getpwent_r (struct passwd *pwd, char *buffer, size_t buflen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  /* Be prepared that the setpwent function was not called before.  */
++  if (ext_ent.stream == NULL)
++    status = internal_setpwent (&ext_ent);
++
++  if (status == NSS_STATUS_SUCCESS)
++    status = internal_getpwent_r (pwd, &ext_ent, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user */
++static enum nss_status
++internal_getpwnam_r (const char *name, struct passwd *result, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++
++  while (1)
++    {
++      fpos_t pos;
++      char *p;
++      int parse_res;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
++	     /* Parse the line.  If it is invalid, loop to
++		get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_pwent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* This is a real entry.  */
++      if (result->pw_name[0] != '+' && result->pw_name[0] != '-')
++	{
++	  if (strcmp (result->pw_name, name) == 0)
++	    return NSS_STATUS_SUCCESS;
++	  else
++	    continue;
++	}
++
++      /* -@netgroup */
++      if (result->pw_name[0] == '-' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  char buf2[1024];
++	  char *user, *host, *domain;
++	  struct __netgrent netgrdata;
++
++	  bzero (&netgrdata, sizeof (struct __netgrent));
++	  __internal_setnetgrent (&result->pw_name[2], &netgrdata);
++	  while (__internal_getnetgrent_r (&host, &user, &domain,
++					   &netgrdata, buf2, sizeof (buf2),
++					   &errno))
++	    {
++	      if (user != NULL && user[0] != '-')
++		if (strcmp (user, name) == 0)
++		  return NSS_STATUS_NOTFOUND;
++	    }
++	  __internal_endnetgrent (&netgrdata);
++	  continue;
++	}
++
++      /* +@netgroup */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  char buf[strlen (result->pw_name)];
++	  int status;
++
++	  strcpy (buf, &result->pw_name[2]);
++	  ent->netgroup = TRUE;
++	  ent->first = TRUE;
++	  copy_pwd_changes (&ent->pwd, result, NULL, 0);
++
++	  do
++	    {
++	      status = getpwent_next_nis_netgr (name, result, ent, buf,
++						buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		continue;
++
++	      if (status == NSS_STATUS_SUCCESS &&
++		  strcmp (result->pw_name, name) == 0)
++		return NSS_STATUS_SUCCESS;
++	    } while (status == NSS_STATUS_SUCCESS);
++	  continue;
++	}
++
++      /* -user */
++      if (result->pw_name[0] == '-' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++	  if (strcmp (&result->pw_name[1], name) == 0)
++	    return NSS_STATUS_NOTFOUND;
++	  else
++	    continue;
++	}
++
++      /* +user */
++      if (result->pw_name[0] == '+' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++	  if (strcmp (name, &result->pw_name[1]) == 0)
++	    {
++	      enum nss_status status;
++
++	      status = getpwnam_plususer (name, result, buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		/* We couldn't parse the entry */
++		return NSS_STATUS_NOTFOUND;
++	      else
++		return status;
++	    }
++	}
++
++      /* +:... */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '\0')
++	{
++	  enum nss_status status;
++
++	  status = getpwnam_plususer (name, result, buffer, buflen);
++	  if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
++	    break;
++	  else
++	    if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
++	      return NSS_STATUS_NOTFOUND;
++	    else
++	      return status;
++	}
++    }
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_getpwnam_r (const char *name, struct passwd *pwd,
++			char *buffer, size_t buflen)
++{
++  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
++	       {NULL, NULL, 0, 0, NULL, NULL, NULL}};
++  enum nss_status status;
++
++  if (name[0] == '-' || name[0] == '+')
++    return NSS_STATUS_NOTFOUND;
++
++  status = internal_setpwent (&ent);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  status = internal_getpwnam_r (name, pwd, &ent, buffer, buflen);
++
++  internal_endpwent (&ent);
++
++  return status;
++}
++
++/* This function handle the + entry in /etc/passwd for getpwuid */
++static enum nss_status
++getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
++		   size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  struct passwd pwd;
++  int parse_res;
++  char *p;
++  size_t plen;
++  char buf[1024];
++  char *domain, *outval, *ptr;
++  int outvallen;
++
++  memset (&pwd, '\0', sizeof (struct passwd));
++
++  copy_pwd_changes (&pwd, result, NULL, 0);
++
++  plen = pwd_need_buflen (&pwd);
++  if (plen > buflen)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  p = buffer + (buflen - plen);
++  buflen -= plen;
++
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    return NSS_STATUS_TRYAGAIN;
++
++  sprintf (buf, "%d", uid);
++  if (yp_match (domain, "passwd.byuid", buf, strlen (buf),
++		&outval, &outvallen)
++      != YPERR_SUCCESS)
++    return NSS_STATUS_TRYAGAIN;
++  ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ?
++		 buflen : (size_t) outvallen);
++  buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0';
++  free (outval);
++  while (isspace (*ptr))
++    ptr++;
++  if ((parse_res = _nss_files_parse_pwent (ptr, result, data, buflen))
++      == -1)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res > 0)
++    {
++      copy_pwd_changes (result, &pwd, p, plen);
++      give_pwd_free (&pwd);
++      /* We found the entry.  */
++      return NSS_STATUS_SUCCESS;
++    }
++  else
++    {
++      /* Give buffer the old len back */
++      buflen += plen;
++      give_pwd_free (&pwd);
++    }
++  return NSS_STATUS_RETURN;
++}
++
++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user id */
++static enum nss_status
++internal_getpwuid_r (uid_t uid, struct passwd *result, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++
++  while (1)
++    {
++      fpos_t pos;
++      char *p;
++      int parse_res;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
++	     /* Parse the line.  If it is invalid, loop to
++		get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_pwent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* This is a real entry.  */
++      if (result->pw_name[0] != '+' && result->pw_name[0] != '-')
++	{
++	  if (result->pw_uid == uid)
++	    return NSS_STATUS_SUCCESS;
++	  else
++	    continue;
++	}
++
++      /* -@netgroup */
++      if (result->pw_name[0] == '-' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  char buf2[1024];
++	  char *user, *host, *domain;
++	  struct __netgrent netgrdata;
++
++	  bzero (&netgrdata, sizeof (struct __netgrent));
++	  __internal_setnetgrent (&result->pw_name[2], &netgrdata);
++	  while (__internal_getnetgrent_r (&host, &user, &domain,
++					   &netgrdata, buf2, sizeof (buf2),
++					   &errno))
++	    {
++              if (user != NULL && user[0] != '-')
++                blacklist_store_name (user, ent);
++	    }
++	  __internal_endnetgrent (&netgrdata);
++	  continue;
++	}
++
++      /* +@netgroup */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '@'
++	  && result->pw_name[2] != '\0')
++	{
++	  char buf[strlen (result->pw_name)];
++	  int status;
++
++	  strcpy (buf, &result->pw_name[2]);
++	  ent->netgroup = TRUE;
++	  ent->first = TRUE;
++	  copy_pwd_changes (&ent->pwd, result, NULL, 0);
++
++	  do
++	    {
++	      status = getpwent_next_nis_netgr (NULL, result, ent, buf,
++						  buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		continue;
++
++	      if (status == NSS_STATUS_SUCCESS && uid == result->pw_uid)
++		return NSS_STATUS_SUCCESS;
++	    } while (status == NSS_STATUS_SUCCESS);
++	  continue;
++	}
++
++      /* -user */
++      if (result->pw_name[0] == '-' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++          blacklist_store_name (&result->pw_name[1], ent);
++          continue;
++	}
++
++      /* +user */
++      if (result->pw_name[0] == '+' && result->pw_name[1] != '\0'
++	  && result->pw_name[1] != '@')
++	{
++	  enum nss_status status;
++
++	  /* Store the User in the blacklist for the "+" at the end of
++             /etc/passwd */
++          blacklist_store_name (&result->pw_name[1], ent);
++	  status = getpwnam_plususer (&result->pw_name[1], result, buffer,
++				      buflen);
++	  if (status == NSS_STATUS_SUCCESS && result->pw_uid == uid)
++	    break;
++	  else
++	    continue;
++	}
++
++      /* +:... */
++      if (result->pw_name[0] == '+' && result->pw_name[1] == '\0')
++	{
++	  enum nss_status status;
++
++	  status = getpwuid_plususer (uid, result, buffer, buflen);
++	  if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
++	    break;
++	  else
++	    if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
++	      return NSS_STATUS_NOTFOUND;
++	    else
++	      {
++		if (status == NSS_STATUS_TRYAGAIN)
++		  /* The parser ran out of space */
++		  fsetpos (ent->stream, &pos);
++		return status;
++	      }
++	}
++    }
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_getpwuid_r (uid_t uid, struct passwd *pwd,
++			char *buffer, size_t buflen)
++{
++  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
++	       {NULL, NULL, 0, 0, NULL, NULL, NULL}};
++  enum nss_status status;
++
++  status = internal_setpwent (&ent);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  status = internal_getpwuid_r (uid, pwd, &ent, buffer, buflen);
++
++  internal_endpwent (&ent);
++
++  return status;
++}
++
++
++/* Support routines for remembering -@netgroup and -user entries.
++   The names are stored in a single string with `|' as separator. */
++static void
++blacklist_store_name (const char *name, ent_t *ent)
++{
++  int namelen = strlen (name);
++  char *tmp;
++
++  /* first call, setup cache */
++  if (ent->blacklist.size == 0)
++    {
++      ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen);
++      ent->blacklist.data = malloc (ent->blacklist.size);
++      if (ent->blacklist.data == NULL)
++	return;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++      ent->blacklist.current = 1;
++    }
++  else
++    {
++      if (in_blacklist (name, namelen, ent))
++	return;			/* no duplicates */
++
++      if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size)
++	{
++	  ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen);
++	  tmp = realloc (ent->blacklist.data, ent->blacklist.size);
++	  if (tmp == NULL)
++	    {
++	      free (ent->blacklist.data);
++	      ent->blacklist.size = 0;
++	      return;
++	    }
++	  ent->blacklist.data = tmp;
++	}
++    }
++
++  tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name);
++  *tmp++ = '|';
++  *tmp = '\0';
++  ent->blacklist.current += namelen + 1;
++
++  return;
++}
++
++/* returns TRUE if ent->blacklist contains name, else FALSE */
++static bool_t
++in_blacklist (const char *name, int namelen, ent_t *ent)
++{
++  char buf[namelen + 3];
++  char *cp;
++
++  if (ent->blacklist.data == NULL)
++    return FALSE;
++
++  buf[0] = '|';
++  cp = stpcpy (&buf[1], name);
++  *cp++= '|';
++  *cp = '\0';
++  return strstr (ent->blacklist.data, buf) != NULL;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,915 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <errno.h>
++#include <ctype.h>
++#include <fcntl.h>
++#include <netdb.h>
++#include <shadow.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++#include <nsswitch.h>
++
++#include "netgroup.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME spent
++#define STRUCTURE spwd
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Structure for remembering -@netgroup and -user members ... */
++#define BLACKLIST_INITIAL_SIZE 512
++#define BLACKLIST_INCREMENT 256
++struct blacklist_t
++  {
++    char *data;
++    int current;
++    int size;
++  };
++
++struct ent_t
++  {
++    bool_t netgroup;
++    bool_t nis;
++    bool_t first;
++    char *oldkey;
++    int oldkeylen;
++    FILE *stream;
++    struct blacklist_t blacklist;
++    struct spwd pwd;
++    struct __netgrent netgrdata;
++  };
++typedef struct ent_t ent_t;
++
++static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
++			{NULL, NULL, 0, 0, 0, 0, 0, 0, 0}};
++
++/* Protect global state against multiple changers.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Prototypes for local functions.  */
++static void blacklist_store_name (const char *, ent_t *);
++static int in_blacklist (const char *, int, ent_t *);
++
++static void
++give_spwd_free (struct spwd *pwd)
++{
++  if (pwd->sp_namp != NULL)
++    free (pwd->sp_namp);
++  if (pwd->sp_pwdp != NULL)
++    free (pwd->sp_pwdp);
++
++  memset (pwd, '\0', sizeof (struct spwd));
++}
++
++static int
++spwd_need_buflen (struct spwd *pwd)
++{
++  int len = 0;
++
++  if (pwd->sp_pwdp != NULL)
++    len += strlen (pwd->sp_pwdp) + 1;
++
++  return len;
++}
++
++static void
++copy_spwd_changes (struct spwd *dest, struct spwd *src,
++		   char *buffer, size_t buflen)
++{
++  if (src->sp_pwdp != NULL && strlen (src->sp_pwdp))
++    {
++      if (buffer == NULL)
++	dest->sp_pwdp = strdup (src->sp_pwdp);
++      else if (dest->sp_pwdp &&
++	       strlen (dest->sp_pwdp) >= strlen (src->sp_pwdp))
++	strcpy (dest->sp_pwdp, src->sp_pwdp);
++      else
++	{
++	  dest->sp_pwdp = buffer;
++	  strcpy (dest->sp_pwdp, src->sp_pwdp);
++	  buffer += strlen (dest->sp_pwdp) + 1;
++	  buflen = buflen - (strlen (dest->sp_pwdp) + 1);
++	}
++    }
++  if (src->sp_lstchg != 0)
++    dest->sp_lstchg = src->sp_lstchg;
++  if (src->sp_min != 0)
++    dest->sp_min = src->sp_min;
++  if (src->sp_max != 0)
++    dest->sp_max = src->sp_max;
++  if (src->sp_warn != 0)
++    dest->sp_warn = src->sp_warn;
++  if (src->sp_inact != 0)
++    dest->sp_inact = src->sp_inact;
++  if (src->sp_expire != 0)
++    dest->sp_expire = src->sp_expire;
++  if (src->sp_flag != 0)
++    dest->sp_flag = src->sp_flag;
++}
++
++static enum nss_status
++internal_setspent (ent_t *ent)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  ent->nis = ent->first = ent->netgroup = 0;
++
++  /* If something was left over free it.  */
++  if (ent->netgroup)
++    __internal_endnetgrent (&ent->netgrdata);
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  if (ent->stream == NULL)
++    {
++      ent->stream = fopen ("/etc/shadow", "r");
++
++      if (ent->stream == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl (fileno (ent->stream), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl (fileno (ent->stream), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      fclose (ent->stream);
++	      ent->stream = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++  else
++    rewind (ent->stream);
++
++  give_spwd_free (&ent->pwd);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_compat_setspent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_setspent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++
++static enum nss_status
++internal_endspent (ent_t *ent)
++{
++  if (ent->stream != NULL)
++    {
++      fclose (ent->stream);
++      ent->stream = NULL;
++    }
++
++  if (ent->netgroup)
++    __internal_endnetgrent (&ent->netgrdata);
++
++  ent->nis = ent->first = ent->netgroup = 0;
++
++  if (ent->oldkey != NULL)
++    {
++      free (ent->oldkey);
++      ent->oldkey = NULL;
++      ent->oldkeylen = 0;
++    }
++
++  if (ent->blacklist.data != NULL)
++    {
++      ent->blacklist.current = 1;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++    }
++  else
++    ent->blacklist.current = 0;
++
++  give_spwd_free (&ent->pwd);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_endspent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_endspent (&ext_ent);
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++
++static enum nss_status
++getspent_next_nis_netgr (const char *name, struct spwd *result, ent_t *ent,
++			 char *group, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *ypdomain, *host, *user, *domain, *outval, *p, *p2;
++  int status, outvallen;
++  size_t p2len;
++
++  if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS)
++    {
++      ent->netgroup = 0;
++      ent->first = 0;
++      give_spwd_free (&ent->pwd);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (ent->first == TRUE)
++    {
++      bzero (&ent->netgrdata, sizeof (struct __netgrent));
++      __internal_setnetgrent (group, &ent->netgrdata);
++      ent->first = FALSE;
++    }
++
++  while (1)
++    {
++      char *saved_cursor;
++      int parse_res;
++
++      saved_cursor = ent->netgrdata.cursor;
++      status = __internal_getnetgrent_r (&host, &user, &domain,
++					 &ent->netgrdata, buffer, buflen,
++					 &errno);
++      if (status != 1)
++	{
++	  __internal_endnetgrent (&ent->netgrdata);
++	  ent->netgroup = 0;
++	  give_spwd_free (&ent->pwd);
++	  return NSS_STATUS_RETURN;
++	}
++
++      if (user == NULL || user[0] == '-')
++	continue;
++
++      if (domain != NULL && strcmp (ypdomain, domain) != 0)
++	continue;
++
++      /* If name != NULL, we are called from getpwnam */
++      if (name != NULL)
++	if (strcmp (user, name) != 0)
++	  continue;
++
++      if (yp_match (ypdomain, "shadow.byname", user,
++		    strlen (user), &outval, &outvallen)
++	  != YPERR_SUCCESS)
++	continue;
++
++      p2len = spwd_need_buflen (&ent->pwd);
++      if (p2len > buflen)
++	{
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      p2 = buffer + (buflen - p2len);
++      buflen -= p2len;
++      p = strncpy (buffer, outval, buflen);
++      while (isspace (*p))
++	p++;
++      free (outval);
++      if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1)
++	{
++	  ent->netgrdata.cursor = saved_cursor;
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      if (parse_res)
++	{
++	  /* Store the User in the blacklist for the "+" at the end of
++	     /etc/passwd */
++	  blacklist_store_name (result->sp_namp, ent);
++	  copy_spwd_changes (result, &ent->pwd, p2, p2len);
++	  break;
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++getspent_next_nis (struct spwd *result, ent_t *ent,
++		   char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain, *outkey, *outval, *p, *p2;
++  int outkeylen, outvallen, parse_res;
++  size_t p2len;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    {
++      ent->nis = 0;
++      give_spwd_free (&ent->pwd);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  p2len = spwd_need_buflen (&ent->pwd);
++  if (p2len > buflen)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  p2 = buffer + (buflen - p2len);
++  buflen -= p2len;
++  do
++    {
++      bool_t saved_first;
++      char *saved_oldkey;
++      int saved_oldlen;
++
++      if (ent->first)
++	{
++	  if (yp_first (domain, "shadow.byname", &outkey, &outkeylen,
++			&outval, &outvallen) != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      give_spwd_free (&ent->pwd);
++	      return NSS_STATUS_UNAVAIL;
++	    }
++	  saved_first = TRUE;
++	  saved_oldkey = ent->oldkey;
++	  saved_oldlen = ent->oldkeylen;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	  ent->first = FALSE;
++	}
++      else
++	{
++	  if (yp_next (domain, "shadow.byname", ent->oldkey, ent->oldkeylen,
++		       &outkey, &outkeylen, &outval, &outvallen)
++	      != YPERR_SUCCESS)
++	    {
++	      ent->nis = 0;
++	      give_spwd_free (&ent->pwd);
++	      return NSS_STATUS_NOTFOUND;
++	    }
++
++	  saved_first = FALSE;
++	  saved_oldkey = ent->oldkey;
++	  saved_oldlen = ent->oldkeylen;
++	  ent->oldkey = outkey;
++	  ent->oldkeylen = outkeylen;
++	}
++
++      /* Copy the found data to our buffer  */
++      p = strncpy (buffer, outval, buflen);
++
++      /* ...and free the data.  */
++      free (outval);
++
++      while (isspace (*p))
++	++p;
++      if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1)
++	{
++	  free (ent->oldkey);
++	  ent->oldkey = saved_oldkey;
++	  ent->oldkeylen = saved_oldlen;
++	  ent->first = saved_first;
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      else
++	{
++	  if (!saved_first)
++	    free (saved_oldkey);
++	}
++      if (parse_res &&
++          in_blacklist (result->sp_namp, strlen (result->sp_namp), ent))
++        parse_res = 0;
++    }
++  while (!parse_res);
++
++  copy_spwd_changes (result, &ent->pwd, p2, p2len);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* This function handle the +user entrys in /etc/shadow */
++static enum nss_status
++getspnam_plususer (const char *name, struct spwd *result, char *buffer,
++		   size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  struct spwd pwd;
++  int parse_res;
++  char *p;
++  size_t plen;
++  char *domain, *outval, *ptr;
++  int outvallen;
++
++
++  memset (&pwd, '\0', sizeof (struct spwd));
++
++  copy_spwd_changes (&pwd, result, NULL, 0);
++
++  plen = spwd_need_buflen (&pwd);
++  if (plen > buflen)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  p = buffer + (buflen - plen);
++  buflen -= plen;
++
++  if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++
++  if (yp_match (domain, "shadow.byname", name, strlen (name),
++		&outval, &outvallen) != YPERR_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ?
++		 buflen : (size_t) outvallen);
++  buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0';
++  free (outval);
++  while (isspace (*ptr))
++    ptr++;
++  if ((parse_res = _nss_files_parse_spent (ptr, result, data, buflen)) == -1)
++    {
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res)
++    {
++      copy_spwd_changes (result, &pwd, p, plen);
++      give_spwd_free (&pwd);
++      /* We found the entry.  */
++      return NSS_STATUS_SUCCESS;
++    }
++  else
++    {
++      /* Give buffer the old len back */
++      buflen += plen;
++      give_spwd_free (&pwd);
++    }
++  return NSS_STATUS_RETURN;
++}
++
++static enum nss_status
++getspent_next_file (struct spwd *result, ent_t *ent,
++		    char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  while (1)
++    {
++      fpos_t pos;
++      int parse_res = 0;
++      char *p;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#'	/* Ignore empty and comment lines.  */
++      /* Parse the line.  If it is invalid, loop to
++         get the next line of the file to parse.  */
++	     || !(parse_res = _nss_files_parse_spent (p, result, data,
++						      buflen)));
++
++      if (parse_res == -1)
++        {
++          /* The parser ran out of space.  */
++          fsetpos (ent->stream, &pos);
++          __set_errno (ERANGE);
++          return NSS_STATUS_TRYAGAIN;
++        }
++
++      if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-')
++	/* This is a real entry.  */
++	break;
++
++      /* -@netgroup */
++      if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@'
++	  && result->sp_namp[2] != '\0')
++	{
++          char buf2[1024];
++ 	  char *user, *host, *domain;
++          struct __netgrent netgrdata;
++
++          bzero (&netgrdata, sizeof (struct __netgrent));
++          __internal_setnetgrent (&result->sp_namp[2], &netgrdata);
++	  while (__internal_getnetgrent_r (&host, &user, &domain,
++					   &netgrdata, buf2, sizeof (buf2),
++					   &errno))
++	    {
++	      if (user != NULL && user[0] != '-')
++		blacklist_store_name (user, ent);
++	    }
++	  __internal_endnetgrent (&netgrdata);
++	  continue;
++	}
++
++      /* +@netgroup */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@'
++	  && result->sp_namp[2] != '\0')
++	{
++	  int status;
++
++	  ent->netgroup = TRUE;
++	  ent->first = TRUE;
++	  copy_spwd_changes (&ent->pwd, result, NULL, 0);
++
++	  status = getspent_next_nis_netgr (NULL, result, ent,
++					    &result->sp_namp[2],
++					    buffer, buflen);
++	  if (status == NSS_STATUS_RETURN)
++	    continue;
++	  else
++	    return status;
++	}
++
++      /* -user */
++      if (result->sp_namp[0] == '-' && result->sp_namp[1] != '\0'
++	  && result->sp_namp[1] != '@')
++	{
++	  blacklist_store_name (&result->sp_namp[1], ent);
++	  continue;
++	}
++
++      /* +user */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'
++	  && result->sp_namp[1] != '@')
++	{
++          enum nss_status status;
++
++	  /* Store the User in the blacklist for the "+" at the end of
++	     /etc/passwd */
++	  blacklist_store_name (&result->sp_namp[1], ent);
++          status = getspnam_plususer (&result->sp_namp[1], result, buffer,
++				      buflen);
++          if (status == NSS_STATUS_SUCCESS) /* We found the entry. */
++            break;
++          else
++            if (status == NSS_STATUS_RETURN /* We couldn't parse the entry */
++		|| status == NSS_STATUS_NOTFOUND) /* entry doesn't exist */
++              continue;
++            else
++	      {
++		if (status == NSS_STATUS_TRYAGAIN)
++		  fsetpos (ent->stream, &pos);
++		return status;
++	      }
++	}
++
++      /* +:... */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '\0')
++	{
++	  ent->nis = TRUE;
++	  ent->first = TRUE;
++	  copy_spwd_changes (&ent->pwd, result, NULL, 0);
++
++	  return getspent_next_nis (result, ent, buffer, buflen);
++	}
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++
++static enum nss_status
++internal_getspent_r (struct spwd *pw, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  if (ent->netgroup)
++    {
++      int status;
++
++      /* We are searching members in a netgroup */
++      /* Since this is not the first call, we don't need the group name */
++      status = getspent_next_nis_netgr (NULL, pw, ent, NULL, buffer, buflen);
++      if (status == NSS_STATUS_RETURN)
++	return getspent_next_file (pw, ent, buffer, buflen);
++      else
++	return status;
++    }
++  else
++    if (ent->nis)
++      {
++	return getspent_next_nis (pw, ent, buffer, buflen);
++      }
++    else
++      return getspent_next_file (pw, ent, buffer, buflen);
++}
++
++enum nss_status
++_nss_compat_getspent_r (struct spwd *pwd, char *buffer, size_t buflen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  if (ext_ent.stream == NULL)
++    status = internal_setspent (&ext_ent);
++
++  if (status == NSS_STATUS_SUCCESS)
++    status = internal_getspent_r (pwd, &ext_ent, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user */
++static enum nss_status
++internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++
++  while (1)
++    {
++      fpos_t pos;
++      char *p;
++      int parse_res;
++
++      do
++	{
++	  fgetpos (ent->stream, &pos);
++	  buffer[buflen - 1] = '\xff';
++	  p = fgets (buffer, buflen, ent->stream);
++	  if (p == NULL && feof (ent->stream))
++	    return NSS_STATUS_NOTFOUND;
++	  if (p == NULL || buffer[buflen - 1] != '\xff')
++	    {
++	      fsetpos (ent->stream, &pos);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  /* Terminate the line for any case.  */
++	  buffer[buflen - 1] = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*p))
++	    ++p;
++	}
++      while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines.  */
++	     /* Parse the line.  If it is invalid, loop to
++		get the next line of the file to parse.  */
++	     !(parse_res = _nss_files_parse_spent (p, result, data, buflen)));
++
++      if (parse_res == -1)
++	{
++	  /* The parser ran out of space.  */
++	  fsetpos (ent->stream, &pos);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* This is a real entry.  */
++      if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-')
++	{
++	  if (strcmp (result->sp_namp, name) == 0)
++	    return NSS_STATUS_SUCCESS;
++	  else
++	    continue;
++	}
++
++      /* -@netgroup */
++      if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@'
++	  && result->sp_namp[2] != '\0')
++	{
++	  char buf2[1024];
++	  char *user, *host, *domain;
++	  struct __netgrent netgrdata;
++
++	  bzero (&netgrdata, sizeof (struct __netgrent));
++	  __internal_setnetgrent (&result->sp_namp[2], &netgrdata);
++	  while (__internal_getnetgrent_r (&host, &user, &domain,
++					   &netgrdata, buf2, sizeof (buf2),
++					   &errno))
++	    {
++	      if (user != NULL && user[0] != '-')
++		if (strcmp (user, name) == 0)
++		  return NSS_STATUS_NOTFOUND;
++	    }
++	  __internal_endnetgrent (&netgrdata);
++	  continue;
++	}
++
++      /* +@netgroup */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@'
++	  && result->sp_namp[2] != '\0')
++	{
++	  char buf[strlen (result->sp_namp)];
++	  int status;
++
++	  strcpy (buf, &result->sp_namp[2]);
++	  ent->netgroup = TRUE;
++	  ent->first = TRUE;
++	  copy_spwd_changes (&ent->pwd, result, NULL, 0);
++
++	  do
++	    {
++	      status = getspent_next_nis_netgr (name, result, ent, buf,
++						  buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		continue;
++
++	      if (status == NSS_STATUS_SUCCESS &&
++		  strcmp (result->sp_namp, name) == 0)
++		return NSS_STATUS_SUCCESS;
++	    } while (status == NSS_STATUS_SUCCESS);
++	  continue;
++	}
++
++      /* -user */
++      if (result->sp_namp[0] == '-' && result->sp_namp[1] != '\0'
++	  && result->sp_namp[1] != '@')
++	{
++	  if (strcmp (&result->sp_namp[1], name) == 0)
++	    return NSS_STATUS_NOTFOUND;
++	  else
++	    continue;
++	}
++
++      /* +user */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'
++	  && result->sp_namp[1] != '@')
++	{
++	  if (strcmp (name, &result->sp_namp[1]) == 0)
++	    {
++	      enum nss_status status;
++
++	      status = getspnam_plususer (name, result, buffer, buflen);
++	      if (status == NSS_STATUS_RETURN)
++		/* We couldn't parse the entry */
++		return NSS_STATUS_NOTFOUND;
++	      else
++		return status;
++	    }
++	}
++
++      /* +:... */
++      if (result->sp_namp[0] == '+' && result->sp_namp[1] == '\0')
++	{
++	  enum nss_status status;
++
++	  status = getspnam_plususer (name, result, buffer, buflen);
++	  if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
++	    return NSS_STATUS_NOTFOUND;
++	  else
++	    return status;
++	}
++    }
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_compat_getspnam_r (const char *name, struct spwd *pwd,
++			char *buffer, size_t buflen)
++{
++  ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0},
++	       {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}};
++  enum nss_status status;
++
++  if (name[0] == '-' || name[0] == '+')
++    return NSS_STATUS_NOTFOUND;
++
++  status = internal_setspent (&ent);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  status = internal_getspnam_r (name, pwd, &ent, buffer, buflen);
++
++  internal_endspent (&ent);
++
++  return status;
++}
++
++/* Support routines for remembering -@netgroup and -user entries.
++   The names are stored in a single string with `|' as separator. */
++static void
++blacklist_store_name (const char *name, ent_t *ent)
++{
++  int namelen = strlen (name);
++  char *tmp;
++
++  /* first call, setup cache */
++  if (ent->blacklist.size == 0)
++    {
++      ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen);
++      ent->blacklist.data = malloc (ent->blacklist.size);
++      if (ent->blacklist.data == NULL)
++	return;
++      ent->blacklist.data[0] = '|';
++      ent->blacklist.data[1] = '\0';
++      ent->blacklist.current = 1;
++    }
++  else
++    {
++      if (in_blacklist (name, namelen, ent))
++	return;			/* no duplicates */
++
++      if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size)
++	{
++	  ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen);
++	  tmp = realloc (ent->blacklist.data, ent->blacklist.size);
++	  if (tmp == NULL)
++	    {
++	      free (ent->blacklist.data);
++	      ent->blacklist.size = 0;
++	      return;
++	    }
++	  ent->blacklist.data = tmp;
++	}
++    }
++
++  tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name);
++  *tmp++ = '|';
++  *tmp = '\0';
++  ent->blacklist.current += namelen + 1;
++
++  return;
++}
++
++/* Returns TRUE if ent->blacklist contains name, else FALSE.  */
++static bool_t
++in_blacklist (const char *name, int namelen, ent_t *ent)
++{
++  char buf[namelen + 3];
++  char *cp;
++
++  if (ent->blacklist.data == NULL)
++    return FALSE;
++
++  buf[0] = '|';
++  cp = stpcpy (&buf[1], name);
++  *cp++= '|';
++  *cp = '\0';
++  return strstr (ent->blacklist.data, buf) != NULL;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-XXX.c glibc-2.1.3/glibc-compat/nss_db/db-XXX.c
+--- ../glibc-2.1.3/glibc-compat/nss_db/db-XXX.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_db/db-XXX.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,288 @@
++/* Common code for DB-based databases in nss_db module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <db_185.h>
++#include <fcntl.h>
++#include <bits/libc-lock.h>
++#include "nsswitch.h"
++
++/* These symbols are defined by the including source file:
++
++   ENTNAME -- database name of the structure and functions (hostent, pwent).
++   STRUCTURE -- struct name, define only if not ENTNAME (passwd, group).
++   DATABASE -- database file name, ("hosts", "passwd")
++
++   NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
++*/
++
++#define ENTNAME_r	CONCAT(ENTNAME,_r)
++
++#include <paths.h>
++#define	DBFILE		_PATH_VARDB DATABASE ".db"
++
++#ifdef NEED_H_ERRNO
++#define H_ERRNO_PROTO	, int *herrnop
++#define H_ERRNO_ARG	, herrnop
++#define H_ERRNO_SET(val) (*herrnop = (val))
++#else
++#define H_ERRNO_PROTO
++#define H_ERRNO_ARG
++#define H_ERRNO_SET(val) ((void) 0)
++#endif
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Maintenance of the shared handle open on the database.  */
++
++static DB *db;
++static int keep_db;
++static unsigned int entidx;	/* Index for `getENTNAME'. */
++
++/* Open database file if not already opened.  */
++static enum nss_status
++internal_setent (int stayopen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  if (db == NULL)
++    {
++      db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL);
++
++      if (db == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl ((*db->fd) (db), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl ((*db->fd) (db), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      (*db->close) (db);
++	      db = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++
++  /* Remember STAYOPEN flag.  */
++  if (db != NULL)
++    keep_db |= stayopen;
++
++  return status;
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++CONCAT(_nss_db_set,ENTNAME) (int stayopen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setent (stayopen);
++
++  /* Reset the sequential index.  */
++  entidx = 0;
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++/* Close the database file.  */
++static void
++internal_endent (void)
++{
++  if (db != NULL)
++    {
++      (*db->close) (db);
++      db = NULL;
++    }
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++CONCAT(_nss_db_end,ENTNAME) (void)
++{
++  __libc_lock_lock (lock);
++
++  internal_endent ();
++
++  /* Reset STAYOPEN flag.  */
++  keep_db = 0;
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* Do a database lookup for KEY.  */
++static enum nss_status
++lookup (const DBT *key, struct STRUCTURE *result,
++	void *buffer, int buflen H_ERRNO_PROTO)
++{
++  char *p;
++  enum nss_status status;
++  int err;
++  DBT value;
++
++  /* Open the database.  */
++  status = internal_setent (keep_db);
++  if (status != NSS_STATUS_SUCCESS)
++    {
++      H_ERRNO_SET (NETDB_INTERNAL);
++      return status;
++    }
++
++  /* Succeed iff it matches a value that parses correctly.  */
++  err = (*db->get) (db, key, &value, 0);
++  if (err < 0)
++    {
++      H_ERRNO_SET (NETDB_INTERNAL);
++      status = NSS_STATUS_UNAVAIL;
++    }
++  else if (err != 0)
++    {
++      H_ERRNO_SET (HOST_NOT_FOUND);
++      status = NSS_STATUS_NOTFOUND;
++    }
++  else
++    {
++      /* Copy the result to a safe place.  */
++      p = (char *) memcpy (buffer, value.data, value.size);
++
++      /* Skip leading blanks.  */
++      while (isspace (*p))
++	++p;
++
++      err = parse_line (p, result, buffer, buflen);
++
++      if (err == 0)
++	{
++	  /* If the key begins with '0' we are trying to get the next
++	     entry.  We want to ignore unparsable lines in this case.  */
++	  if (((char *) key->data)[0] == '0')
++	    {
++	      /* Super magical return value.  We need to tell our caller
++		 that it should continue looping.  This value cannot
++		 happen in other cases.  */
++	      status = NSS_STATUS_RETURN;
++	    }
++	  else
++	    {
++	      H_ERRNO_SET (HOST_NOT_FOUND);
++	      status = NSS_STATUS_NOTFOUND;
++	    }
++	}
++      else if (err < 0)
++	{
++	  H_ERRNO_SET (NETDB_INTERNAL);
++	  status = NSS_STATUS_TRYAGAIN;
++	}
++      else
++	status = NSS_STATUS_SUCCESS;
++    }
++
++  if (! keep_db)
++    internal_endent ();
++
++  return status;
++}
++
++
++/* Macro for defining lookup functions for this DB-based database.
++
++   NAME is the name of the lookup; e.g. `pwnam'.
++
++   KEYPATTERN gives `printf' args to construct a key string;
++   e.g. `(".%s", name)'.
++
++   KEYSIZE gives the allocation size of a buffer to construct it in;
++   e.g. `1 + strlen (name)'.
++
++   PROTO describes the arguments for the lookup key;
++   e.g. `const char *name'.
++
++   BREAK_IF_MATCH is ignored, but used by ../nss_files/files-XXX.c.  */
++
++#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...)	      \
++enum nss_status								      \
++_nss_db_get##name##_r (proto,						      \
++		       struct STRUCTURE *result,			      \
++		       char *buffer, size_t buflen H_ERRNO_PROTO)	      \
++{									      \
++  DBT key;								      \
++  enum nss_status status;						      \
++  const size_t size = (keysize) + 1;					      \
++  key.data = __alloca (size);						      \
++  key.size = KEYPRINTF keypattern;					      \
++  __libc_lock_lock (lock);						      \
++  status = lookup (&key, result, buffer, buflen H_ERRNO_ARG);		      \
++  __libc_lock_unlock (lock);						      \
++  return status;							      \
++}
++
++#define KEYPRINTF(pattern, args...) snprintf (key.data, size, pattern ,##args)
++
++
++
++
++/* Return the next entry from the database file, doing locking.  */
++enum nss_status
++CONCAT(_nss_db_get,ENTNAME_r) (struct STRUCTURE *result,
++			       char *buffer, size_t buflen H_ERRNO_PROTO)
++{
++  /* Return next entry in host file.  */
++  enum nss_status status;
++  char buf[20];
++  DBT key;
++
++  __libc_lock_lock (lock);
++  /* Loop until we find a valid entry or hit EOF.  See above for the
++     special meaning of the status value.  */
++  do
++    {
++      key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
++      status = lookup (&key, result, buffer, buflen H_ERRNO_ARG);
++      if (status == NSS_STATUS_TRYAGAIN
++#ifdef NEED_H_ERRNO
++	  && *herrnop == NETDB_INTERNAL
++#endif
++	  && errno == ERANGE)
++	/* Give the user a chance to get the same entry with a larger
++	   buffer.  */
++	--entidx;
++    }
++  while (status == NSS_STATUS_RETURN);
++  __libc_lock_unlock (lock);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-alias.c glibc-2.1.3/glibc-compat/nss_db/db-alias.c
+--- ../glibc-2.1.3/glibc-compat/nss_db/db-alias.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_db/db-alias.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,255 @@
++/* Mail alias file parser in nss_db module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <aliases.h>
++#include <alloca.h>
++#include <ctype.h>
++#include <db_185.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <bits/libc-lock.h>
++#include <paths.h>
++#include <string.h>
++
++#include "nsswitch.h"
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Maintenance of the shared handle open on the database.  */
++
++static DB *db;
++static int keep_db;
++static unsigned int entidx;	/* Index for `getaliasent_r'. */
++
++/* Open database file if not already opened.  */
++static enum nss_status
++internal_setent (int stayopen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  if (db == NULL)
++    {
++      db = dbopen (_PATH_VARDB "aliases.db", O_RDONLY, 0, DB_BTREE, NULL);
++
++      if (db == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl ((*db->fd) (db), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl ((*db->fd) (db), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      (*db->close) (db);
++	      db = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++
++  /* Remember STAYOPEN flag.  */
++  if (db != NULL)
++    keep_db |= stayopen;
++
++  return status;
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++_nss_db_setaliasent (int stayopen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setent (stayopen);
++
++  /* Reset the sequential index.  */
++  entidx = 0;
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++/* Close the database file.  */
++static void
++internal_endent (void)
++{
++  if (db != NULL)
++    {
++      (*db->close) (db);
++      db = NULL;
++    }
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++_nss_db_endaliasent (void)
++{
++  __libc_lock_lock (lock);
++
++  internal_endent ();
++
++  /* Reset STAYOPEN flag.  */
++  keep_db = 0;
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* We provide the parse function here.  The parser in libnss_files
++   cannot be used.  The generation of the db file already resolved all
++   :include: statements so we simply have to parse the list and store
++   the result.  */
++static enum nss_status
++lookup (const DBT *key, struct aliasent *result, char *buffer,
++	    size_t buflen)
++{
++  enum nss_status status;
++  DBT value;
++
++  /* Open the database.  */
++  status = internal_setent (keep_db);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  if ((*db->get) (db, key, &value, 0) == 0)
++    {
++      const char *src = value.data;
++
++      result->alias_members_len = 0;
++
++      /* We now have to fill the BUFFER with all the information. */
++      if (buflen < key->size + 1)
++	{
++	no_more_room:
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      if (status == NSS_STATUS_SUCCESS)
++	{
++	  char *cp;
++	  size_t cnt;
++
++	  buffer = stpncpy (buffer, key->data, key->size) + 1;
++	  buflen -= key->size + 1;
++
++	  while (*src != '\0')
++	    {
++	      const char *end, *upto;
++	      while (isspace (*src))
++		++src;
++
++	      end = strchr (src, ',');
++	      if (end == NULL)
++		end = strchr (src, '\0');
++	      for (upto = end; upto > src && isspace (upto[-1]); --upto);
++
++	      if (upto != src)
++		{
++		  if ((upto - src) + __alignof__ (char *) > buflen)
++		    goto no_more_room;
++		  buffer = stpncpy (buffer, src, upto - src) + 1;
++		  buflen -= (upto - src) + __alignof (char *);
++		  ++result->alias_members_len;
++		}
++	      src = end + (*end != '\0');
++	    }
++
++	  /* Now prepare the return.  Provide string pointers for the
++	     currently selected aliases.  */
++
++	  /* Adjust the pointer so it is aligned for storing pointers.  */
++	  buffer += __alignof__ (char *) - 1;
++	  buffer -= ((buffer - (char *) 0) % __alignof__ (char *));
++	  result->alias_members = (char **) buffer;
++
++	  /* Compute addresses of alias entry strings.  */
++	  cp = result->alias_name;
++	  for (cnt = 0; cnt < result->alias_members_len; ++cnt)
++	    {
++	      cp = strchr (cp, '\0') + 1;
++	      result->alias_members[cnt] = cp;
++	    }
++
++	  status = (result->alias_members_len == 0
++		    ? NSS_STATUS_RETURN : NSS_STATUS_SUCCESS);
++	}
++    }
++  else
++    status = NSS_STATUS_NOTFOUND;
++
++  if (! keep_db)
++    internal_endent ();
++
++  return status;
++}
++
++enum nss_status
++_nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
++{
++  /* Return next entry in alias file.  */
++  enum nss_status status;
++  char buf[20];
++  DBT key;
++
++  __libc_lock_lock (lock);
++  key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
++  status = lookup (&key, result, buffer, buflen);
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_db_getaliasbyname_r (const char *name, struct aliasent *result,
++			  char *buffer, size_t buflen)
++{
++  DBT key;
++  enum nss_status status;
++
++  key.size = 1 + strlen (name);
++
++  key.data = __alloca (key.size);
++  ((char *) key.data)[0] = '.';
++  memcpy (&((char *) key.data)[1], name, key.size - 1);
++
++  __libc_lock_lock (lock);
++  status = lookup (&key, result, buffer, buflen);
++  __libc_lock_unlock (lock);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c
+--- ../glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,129 @@
++/* Netgroup file parser in nss_db modules.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <db_185.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <paths.h>
++#include "nsswitch.h"
++#include "netgroup.h"
++
++
++#define DBFILE		_PATH_VARDB "netgroup.db"
++
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Maintenance of the shared handle open on the database.  */
++static DB *db;
++static char *entry;
++static char *cursor;
++
++enum nss_status
++_nss_db_setnetgrent (const char *group)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  /* Make sure the data base file is open.  */
++  if (db == NULL)
++    {
++      db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL);
++
++      if (db == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl ((*db->fd) (db), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl ((*db->fd) (db), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      (*db->close) (db);
++	      db = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      DBT key = { data: (void *) group, size: strlen (group) };
++      DBT value;
++
++      if ((*db->get) (db, &key, &value, 0) != 0)
++	status = NSS_STATUS_NOTFOUND;
++      else
++	cursor = entry = value.data;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return status;
++
++}
++
++
++enum nss_status
++_nss_db_endnetgrent (void)
++{
++  __libc_lock_lock (lock);
++
++  if (db != NULL)
++    {
++      (*db->close) (db);
++      db = NULL;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++
++extern enum nss_status _nss_netgroup_parseline (char **cursor,
++						struct __netgrent *result,
++						char *buffer, int buflen);
++
++enum nss_status
++_nss_db_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = _nss_netgroup_parseline (&cursor, result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_dns/dns-host.c glibc-2.1.3/glibc-compat/nss_dns/dns-host.c
+--- ../glibc-2.1.3/glibc-compat/nss_dns/dns-host.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_dns/dns-host.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,602 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* Parts of this file are plain copies of the file `gethtnamadr.c' from
++   the bind package and it has the following copyright.  */
++
++/*
++ * ++Copyright++ 1985, 1988, 1993
++ * -
++ * Copyright (c) 1985, 1988, 1993
++ *    The Regents of the University of California.  All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ * 	This product includes software developed by the University of
++ * 	California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * -
++ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies, and that
++ * the name of Digital Equipment Corporation not be used in advertising or
++ * publicity pertaining to distribution of the document or software without
++ * specific, written prior permission.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
++ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
++ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
++ * SOFTWARE.
++ * -
++ * --Copyright--
++ */
++
++#include <ctype.h>
++#include <errno.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <stddef.h>
++#include <string.h>
++#include <sys/syslog.h>
++
++#include "nsswitch.h"
++
++/* Get implementation for some internal functions.  */
++#include "../resolv/mapv4v6addr.h"
++#include "../resolv/mapv4v6hostent.h"
++
++/* Maximum number of aliases we allow.  */
++#define MAX_NR_ALIASES	48
++#define MAX_NR_ADDRS	48
++
++#if PACKETSZ > 1024
++# define MAXPACKET	PACKETSZ
++#else
++# define MAXPACKET	1024
++#endif
++/* As per RFC 1034 and 1035 a host name cannot exceed 255 octets in length.  */
++#ifdef MAXHOSTNAMELEN
++# undef MAXHOSTNAMELEN
++#endif
++#define MAXHOSTNAMELEN 256
++
++static const char AskedForGot[] = "\
++gethostby*.getanswer: asked for \"%s\", got \"%s\"";
++
++
++/* We need this time later.  */
++typedef union querybuf
++{
++  HEADER hdr;
++  u_char buf[MAXPACKET];
++} querybuf;
++
++
++static enum nss_status getanswer_r (const querybuf *answer, int anslen,
++				    const char *qname, int qtype,
++				    struct hostent *result, char *buffer,
++				    size_t buflen, int *h_errnop);
++
++enum nss_status
++_nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
++			   char *buffer, size_t buflen, int *h_errnop)
++{
++  querybuf host_buffer;
++  int size, type, n;
++  const char *cp;
++
++  switch (af) {
++  case AF_INET:
++    size = INADDRSZ;
++    type = T_A;
++    break;
++  case AF_INET6:
++    size = IN6ADDRSZ;
++    type = T_AAAA;
++    break;
++  default:
++    *h_errnop = NETDB_INTERNAL;
++    __set_errno (EAFNOSUPPORT);
++    return NSS_STATUS_UNAVAIL;
++  }
++
++  result->h_addrtype = af;
++  result->h_length = size;
++
++  /*
++   * if there aren't any dots, it could be a user-level alias.
++   * this is also done in res_query() since we are not the only
++   * function that looks up host names.
++   */
++  if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
++    name = cp;
++
++  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
++  if (n < 0)
++    {
++      *h_errnop = h_errno;
++      return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
++
++  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
++		      h_errnop);
++}
++
++
++enum nss_status
++_nss_dns_gethostbyname_r (const char *name, struct hostent *result,
++			  char *buffer, size_t buflen, int *h_errnop)
++{
++  enum nss_status status = NSS_STATUS_NOTFOUND;
++
++  if (_res.options & RES_USE_INET6)
++    status = _nss_dns_gethostbyname2_r (name, AF_INET6, result, buffer,
++					buflen, h_errnop);
++  if (status == NSS_STATUS_NOTFOUND)
++    status = _nss_dns_gethostbyname2_r (name, AF_INET, result, buffer,
++					buflen, h_errnop);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_dns_gethostbyaddr_r (const char *addr, int len, int af,
++			  struct hostent *result, char *buffer, size_t buflen,
++			  int *h_errnop)
++{
++  static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
++  static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
++  const u_char *uaddr = (const u_char *)addr;
++  struct host_data
++  {
++    char *aliases[MAX_NR_ALIASES];
++    unsigned char host_addr[16];	/* IPv4 or IPv6 */
++    char *h_addr_ptrs[MAX_NR_ADDRS + 1];
++    char linebuffer[0];
++  } *host_data = (struct host_data *) buffer;
++  querybuf host_buffer;
++  char qbuf[MAXDNAME+1], *qp;
++  int size, n, status;
++
++  if (af == AF_INET6 && len == IN6ADDRSZ &&
++      (memcmp (uaddr, mapped, sizeof mapped) == 0
++       || memcmp (uaddr, tunnelled, sizeof tunnelled) == 0))
++    {
++      /* Unmap. */
++      addr += sizeof mapped;
++      uaddr += sizeof mapped;
++      af = AF_INET;
++      len = INADDRSZ;
++    }
++
++  switch (af)
++    {
++    case AF_INET:
++      size = INADDRSZ;
++      break;
++    case AF_INET6:
++      size = IN6ADDRSZ;
++      break;
++    default:
++      __set_errno (EAFNOSUPPORT);
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_UNAVAIL;
++    }
++  if (size != len)
++    {
++      __set_errno (EAFNOSUPPORT);
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  switch (af)
++    {
++    case AF_INET:
++      sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", (uaddr[3] & 0xff),
++	       (uaddr[2] & 0xff), (uaddr[1] & 0xff), (uaddr[0] & 0xff));
++      break;
++    case AF_INET6:
++      qp = qbuf;
++      for (n = IN6ADDRSZ - 1; n >= 0; n--)
++	qp += sprintf (qp, "%x.%x.", uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf);
++      strcpy(qp, "ip6.int");
++      break;
++    default:
++      /* Cannot happen.  */
++    }
++
++  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
++		 sizeof host_buffer);
++  if (n < 0)
++    {
++      *h_errnop = h_errno;
++      return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
++
++  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
++			h_errnop);
++  if (status != NSS_STATUS_SUCCESS)
++    {
++      *h_errnop = h_errno;
++      return status;
++    }
++
++#ifdef SUNSECURITY
++  This is not implemented because it is not possible to use the current
++  source from bind in a multi-threaded program.
++#endif
++
++  result->h_addrtype = af;
++  result->h_length = len;
++  memcpy (host_data->host_addr, addr, len);
++  host_data->h_addr_ptrs[0] = (char *) host_data->host_addr;
++  host_data->h_addr_ptrs[1] = NULL;
++  if (af == AF_INET && (_res.options & RES_USE_INET6))
++    {
++      map_v4v6_address ((char *) host_data->host_addr,
++			(char *) host_data->host_addr);
++      result->h_addrtype = AF_INET6;
++      result->h_length = IN6ADDRSZ;
++    }
++  *h_errnop = NETDB_SUCCESS;
++  return NSS_STATUS_SUCCESS;
++}
++
++
++static enum nss_status
++getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
++	     struct hostent *result, char *buffer, size_t buflen,
++	     int *h_errnop)
++{
++  struct host_data
++  {
++    char *aliases[MAX_NR_ALIASES];
++    unsigned char host_addr[16];	/* IPv4 or IPv6 */
++    char *h_addr_ptrs[MAX_NR_ADDRS + 1];
++    char linebuffer[0];
++  } *host_data = (struct host_data *) buffer;
++  int linebuflen = buflen - offsetof (struct host_data, linebuffer);
++  register const HEADER *hp;
++  const u_char *end_of_message, *cp;
++  int n, ancount, qdcount;
++  int haveanswer, had_error;
++  char *bp, **ap, **hap;
++  char tbuf[MAXDNAME];
++  const char *tname;
++  int (*name_ok) __P ((const char *));
++
++  tname = qname;
++  result->h_name = NULL;
++  end_of_message = answer->buf + anslen;
++  switch (qtype)
++    {
++    case T_A:
++    case T_AAAA:
++      name_ok = res_hnok;
++      break;
++    case T_PTR:
++      name_ok = res_dnok;
++      break;
++    default:
++      return NSS_STATUS_UNAVAIL;  /* XXX should be abort(); */
++    }
++
++  /*
++   * find first satisfactory answer
++   */
++  hp = &answer->hdr;
++  bp = host_data->linebuffer;
++  ancount = ntohs (hp->ancount);
++  qdcount = ntohs (hp->qdcount);
++  cp = answer->buf + HFIXEDSZ;
++  if (qdcount != 1)
++    {
++      *h_errnop = NO_RECOVERY;
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
++  if (n < 0 || (*name_ok) (bp) == 0)
++    {
++      *h_errnop = NO_RECOVERY;
++      return NSS_STATUS_UNAVAIL;
++    }
++  cp += n + QFIXEDSZ;
++
++  if (qtype == T_A || qtype == T_AAAA)
++    {
++      /* res_send() has already verified that the query name is the
++       * same as the one we sent; this just gets the expanded name
++       * (i.e., with the succeeding search-domain tacked on).
++       */
++      n = strlen (bp) + 1;             /* for the \0 */
++      if (n >= MAXHOSTNAMELEN)
++	{
++	  __set_h_errno (NO_RECOVERY);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      result->h_name = bp;
++      bp += n;
++      linebuflen -= n;
++      /* The qname can be abbreviated, but h_name is now absolute. */
++      qname = result->h_name;
++    }
++
++  ap = host_data->aliases;
++  *ap = NULL;
++  result->h_aliases = host_data->aliases;
++  hap = host_data->h_addr_ptrs;
++  *hap = NULL;
++  result->h_addr_list = host_data->h_addr_ptrs;
++  haveanswer = 0;
++  had_error = 0;
++
++  while (ancount-- > 0 && cp < end_of_message && had_error == 0)
++    {
++      int type, class;
++
++      n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
++      if (n < 0 || (*name_ok) (bp) == 0)
++	{
++	  ++had_error;
++	  continue;
++	}
++      cp += n;				/* name */
++      type = _getshort (cp);
++      cp += INT16SZ;			/* type */
++      class = _getshort(cp);
++      cp += INT16SZ + INT32SZ;		/* class, TTL */
++      n = _getshort(cp);
++      cp += INT16SZ;			/* len */
++      if (class != C_IN)
++	{
++	  /* XXX - debug? syslog? */
++	  cp += n;
++	  continue;			/* XXX - had_error++ ? */
++	}
++
++      if ((qtype ==T_A || qtype == T_AAAA) && type == T_CNAME)
++	{
++	  if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1])
++	    continue;
++	  n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
++	  if (n < 0 || (*name_ok) (tbuf) == 0)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  cp += n;
++	  /* Store alias.  */
++	  *ap++ = bp;
++	  n = strlen (bp) + 1;		/* For the \0.  */
++	  if (n >= MAXHOSTNAMELEN)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  bp += n;
++	  linebuflen -= n;
++	  /* Get canonical name.  */
++	  n = strlen (tbuf) + 1;	/* For the \0.  */
++	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  strcpy (bp, tbuf);		/* Cannot overflow.  */
++	  result->h_name = bp;
++	  bp += n;
++	  linebuflen -= n;
++	  continue;
++	}
++
++      if (qtype == T_PTR && type == T_CNAME)
++	{
++	  n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf);
++	  if (n < 0 || res_dnok (tbuf) == 0)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  cp += n;
++	  /* Get canonical name. */
++	  n = strlen (tbuf) + 1;   /* For the \0.  */
++	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  strcpy (bp, tbuf);		/* Cannot overflow.  */
++	  tname = bp;
++	  bp += n;
++	  linebuflen -= n;
++	  continue;
++	}
++      if (type != qtype)
++	{
++	  syslog (LOG_NOTICE | LOG_AUTH,
++	       "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"",
++		  qname, p_class (C_IN), p_type (qtype), p_type (type));
++	  cp += n;
++	  continue;			/* XXX - had_error++ ? */
++	}
++
++      switch (type)
++	{
++	case T_PTR:
++	  if (strcasecmp (tname, bp) != 0)
++	    {
++	      syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp);
++	      cp += n;
++	      continue;			/* XXX - had_error++ ? */
++	    }
++	  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
++	  if (n < 0 || res_hnok (bp) == 0)
++	    {
++	      ++had_error;
++	      break;
++	    }
++#if MULTI_PTRS_ARE_ALIASES
++	  cp += n;
++	  if (haveanswer == 0)
++	    result->h_name = bp;
++	  else if (ap < &host_data->aliases[MAXALIASES-1])
++	    *ap++ = bp;
++	  else
++	    n = -1;
++	  if (n != -1)
++	    {
++	      n = strlen (bp) + 1;	/* for the \0 */
++	      if (n >= MAXHOSTNAMELEN)
++		{
++		  ++had_error;
++		  break;
++		}
++	      bp += n;
++	      linebuflen -= n;
++	    }
++	  break;
++#else
++	  result->h_name = bp;
++	  if (_res.options & RES_USE_INET6)
++	    {
++	      n = strlen (bp) + 1;	/* for the \0 */
++	      if (n >= MAXHOSTNAMELEN)
++		{
++		  ++had_error;
++		  break;
++		}
++	      bp += n;
++	      linebuflen -= n;
++	      map_v4v6_hostent (result, &bp, &linebuflen);
++	    }
++	  *h_errnop = NETDB_SUCCESS;
++	  return NSS_STATUS_SUCCESS;
++#endif
++	case T_A:
++	case T_AAAA:
++	  if (strcasecmp (result->h_name, bp) != 0)
++	    {
++	      syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, result->h_name, bp);
++	      cp += n;
++	      continue;			/* XXX - had_error++ ? */
++	    }
++	  if (n != result->h_length)
++	    {
++	      cp += n;
++	      continue;
++	    }
++	  if (!haveanswer)
++	    {
++	      register int nn;
++
++	      result->h_name = bp;
++	      nn = strlen (bp) + 1;	/* for the \0 */
++	      bp += nn;
++	      linebuflen -= nn;
++	    }
++
++	  bp += sizeof (align) - ((u_long) bp % sizeof (align));
++
++	  if (n >= linebuflen)
++	    {
++	      ++had_error;
++	      continue;
++	    }
++	  if (hap >= &host_data->h_addr_ptrs[MAX_NR_ADDRS-1])
++	    {
++	      cp += n;
++	      continue;
++	    }
++	  memcpy (*hap++ = bp, cp, n);
++	  bp += n;
++	  cp += n;
++	  linebuflen -= n;
++	  break;
++	default:
++	  abort ();
++	}
++      if (had_error == 0)
++	++haveanswer;
++    }
++
++  if (haveanswer > 0)
++    {
++      *ap = NULL;
++      *hap = NULL;
++#if defined(RESOLVSORT)
++      /*
++       * Note: we sort even if host can take only one address
++       * in its return structures - should give it the "best"
++       * address in that case, not some random one
++       */
++      if (_res.nsort && haveanswer > 1 && qtype == T_A)
++	addrsort (host_data->h_addr_ptrs, haveanswer);
++#endif /*RESOLVSORT*/
++
++      if (result->h_name == NULL)
++	{
++	  n = strlen (qname) + 1;	/* For the \0.  */
++	  if (n > linebuflen || n >= MAXHOSTNAMELEN)
++	    goto no_recovery;
++	  strcpy (bp, qname);		/* Cannot overflow.  */
++	  result->h_name = bp;
++	  bp += n;
++	  linebuflen -= n;
++	}
++
++      if (_res.options & RES_USE_INET6)
++	map_v4v6_hostent (result, &bp, &linebuflen);
++      *h_errnop = NETDB_SUCCESS;
++      return NSS_STATUS_SUCCESS;
++    }
++ no_recovery:
++  *h_errnop = NO_RECOVERY;
++  return NSS_STATUS_TRYAGAIN;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_dns/dns-network.c glibc-2.1.3/glibc-compat/nss_dns/dns-network.c
+--- ../glibc-2.1.3/glibc-compat/nss_dns/dns-network.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_dns/dns-network.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,345 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* Parts of this file are plain copies of the file `getnetnamadr.c' from
++   the bind package and it has the following copyright.  */
++
++/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
++ *      Dep. Matematica Universidade de Coimbra, Portugal, Europe
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ */
++/*
++ * Copyright (c) 1983, 1993
++ *      The Regents of the University of California.  All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *      This product includes software developed by the University of
++ *      California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++#include <ctype.h>
++#include <errno.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "nsswitch.h"
++#include <arpa/inet.h>
++
++/* Maximum number of aliases we allow.  */
++#define MAX_NR_ALIASES	48
++
++
++#if PACKETSZ > 1024
++#define MAXPACKET       PACKETSZ
++#else
++#define MAXPACKET       1024
++#endif
++
++
++typedef enum
++{
++  BYADDR,
++  BYNAME
++} lookup_method;
++
++
++/* We need this time later.  */
++typedef union querybuf
++{
++  HEADER hdr;
++  u_char buf[MAXPACKET];
++} querybuf;
++
++
++/* Prototypes for local functions.  */
++static enum nss_status getanswer_r (const querybuf *answer, int anslen,
++				    struct netent *result, char *buffer,
++				    size_t buflen, lookup_method net_i);
++
++
++enum nss_status
++_nss_dns_getnetbyname_r (const char *name, struct netent *result,
++			 char *buffer, size_t buflen)
++{
++  /* Return entry for network with NAME.  */
++  querybuf net_buffer;
++  int anslen;
++  char *qbuf;
++
++  qbuf = strdupa (name);
++  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
++		       sizeof (querybuf));
++  if (anslen < 0)
++    /* Nothing found.  */
++    return (errno == ECONNREFUSED
++	    || errno == EPFNOSUPPORT
++	    || errno == EAFNOSUPPORT)
++      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++
++  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
++}
++
++
++enum nss_status
++_nss_dns_getnetbyaddr_r (long net, int type, struct netent *result,
++			 char *buffer, size_t buflen)
++{
++  /* Return entry for network with NAME.  */
++  enum nss_status status;
++  querybuf net_buffer;
++  unsigned int net_bytes[4];
++  char qbuf[MAXDNAME];
++  int cnt, anslen;
++  u_int32_t net2;
++
++  /* No net address lookup for IPv6 yet.  */
++  if (type != AF_INET)
++    return NSS_STATUS_UNAVAIL;
++
++  net2 = (u_int32_t) net;
++  for (cnt = 4; net2 != 0; net2 >>= 8)
++    net_bytes[--cnt] = net2 & 0xff;
++
++  switch (cnt)
++    {
++    case 3:
++      /* Class A network.  */
++      sprintf (qbuf, "0.0.0.%u.in-addr.arpa", net_bytes[3]);
++      break;
++    case 2:
++      /* Class B network.  */
++      sprintf (qbuf, "0.0.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2]);
++      break;
++    case 1:
++      /* Class C network.  */
++      sprintf (qbuf, "0.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
++	       net_bytes[1]);
++      break;
++    case 0:
++      /* Class D - E network.  */
++      sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
++	       net_bytes[1], net_bytes[0]);
++      break;
++    }
++
++  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
++		      sizeof (querybuf));
++  if (anslen < 0)
++    /* Nothing found.  */
++    return (errno == ECONNREFUSED
++	    || errno == EPFNOSUPPORT
++	    || errno == EAFNOSUPPORT)
++      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++
++  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      /* Strip trailing zeros.  */
++      unsigned int u_net = net;	/* Maybe net should be unsigned?  */
++
++      while ((u_net & 0xff) == 0 && u_net != 0)
++	u_net >>= 8;
++      result->n_net = u_net;
++    }
++
++  return status;
++}
++
++
++#undef offsetof
++#define offsetof(Type, Member) ((size_t) &((Type *) NULL)->Member)
++
++static enum nss_status
++getanswer_r (const querybuf *answer, int anslen, struct netent *result,
++	     char *buffer, size_t buflen, lookup_method net_i)
++{
++  /*
++   * Find first satisfactory answer
++   *
++   *      answer --> +------------+  ( MESSAGE )
++   *                 |   Header   |
++   *                 +------------+
++   *                 |  Question  | the question for the name server
++   *                 +------------+
++   *                 |   Answer   | RRs answering the question
++   *                 +------------+
++   *                 | Authority  | RRs pointing toward an authority
++   *                 | Additional | RRs holding additional information
++   *                 +------------+
++   */
++  struct net_data
++  {
++    char *aliases[MAX_NR_ALIASES];
++    char linebuffer[0];
++  } *net_data = (struct net_data *) buffer;
++  int linebuflen = buflen - offsetof (struct net_data, linebuffer);
++  const char *end_of_message = &answer->buf[anslen];
++  const HEADER *header_pointer = &answer->hdr;
++  /* #/records in the answer section.  */
++  int answer_count =  ntohs (header_pointer->ancount);
++  /* #/entries in the question section.  */
++  int question_count = ntohs (header_pointer->qdcount);
++  char *bp = net_data->linebuffer;
++  const char *cp = &answer->buf[HFIXEDSZ];
++  char **alias_pointer;
++  int have_answer;
++  char *ans;
++
++  if (question_count == 0)
++    {
++      /* FIXME: the Sun version uses for host name lookup an additional
++	 parameter for pointing to h_errno.  this is missing here.
++	 OSF/1 has a per-thread h_errno variable.  */
++      if (header_pointer->aa != 0)
++	{
++	  __set_h_errno (HOST_NOT_FOUND);
++	  return NSS_STATUS_NOTFOUND;
++	}
++      else
++	{
++	  __set_h_errno (TRY_AGAIN);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++    }
++
++  /* Skip the question part.  */
++  while (question_count-- > 0)
++    cp += __dn_skipname (cp, end_of_message) + QFIXEDSZ;
++
++  alias_pointer = result->n_aliases = &net_data->aliases[0];
++  *alias_pointer = NULL;
++  have_answer = 0;
++  ans = NULL;
++
++  while (--answer_count >= 0 && cp < end_of_message)
++    {
++      int n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
++      int type, class;
++
++      if (n < 0 || res_dnok (bp) == 0)
++	break;
++      cp += n;
++      ans = strdupa (bp);
++      GETSHORT (type, cp);
++      GETSHORT (class, cp);
++      cp += INT32SZ;		/* TTL */
++      GETSHORT (n, cp);
++
++      if (class == C_IN && type == T_PTR)
++	{
++	  n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
++	  if (n < 0 || !res_hnok (bp))
++	    {
++	      /* XXX What does this mean?  The original form from bind
++		 returns NULL. Incrementing cp has no effect in any case.
++		 What should I return here. ??? */
++	      cp += n;
++	      return NSS_STATUS_UNAVAIL;
++	    }
++	  cp += n;
++	  *alias_pointer++ = bp;
++	  bp += strlen (bp) + 1;
++	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
++	  ++have_answer;
++	}
++    }
++
++  if (have_answer)
++    {
++      char *tmp;
++      int len;
++      char *in, *cp, *rp, *wp;
++      int cnt, first_flag;
++
++      *alias_pointer = NULL;
++      switch (net_i)
++	{
++	case BYADDR:
++	  result->n_name = result->n_aliases[0];
++	  result->n_net = 0L;
++	  break;
++	case BYNAME:
++	  len = strlen (result->n_aliases[0]);
++	  tmp = (char *) alloca (len + 1);
++	  tmp[len] = 0;
++	  wp = &tmp[len - 1];
++
++	  rp = in = result->n_aliases[0];
++	  result->n_name = ans;
++
++	  first_flag = 1;
++	  for (cnt = 0; cnt < 4; ++cnt)
++	    {
++	      char *startp;
++
++	      startp = rp;
++	      while (*rp != '.')
++		++rp;
++	      if (rp - startp > 1 || *startp != '0' || !first_flag)
++		{
++		  first_flag = 0;
++		  if (cnt > 0)
++		    *wp-- = '.';
++		  cp = rp;
++		  while (cp > startp)
++		    *wp-- = *--cp;
++		}
++	      in = rp + 1;
++	    }
++
++	  result->n_net = inet_network (wp);
++	  break;
++	}
++
++      ++result->n_aliases;
++      return NSS_STATUS_SUCCESS;
++    }
++
++  __set_h_errno (TRY_AGAIN);
++  return NSS_STATUS_TRYAGAIN;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-XXX.c glibc-2.1.3/glibc-compat/nss_files/files-XXX.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-XXX.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-XXX.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,311 @@
++/* Common code for file-based databases in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stdio.h>
++#include <ctype.h>
++#include <fcntl.h>
++#include <assert.h>
++#include <errno.h>
++#include <bits/libc-lock.h>
++#include "nsswitch.h"
++
++/* These symbols are defined by the including source file:
++
++   ENTNAME -- database name of the structure and functions (hostent, pwent).
++   STRUCTURE -- struct name, define only if not ENTNAME (passwd, group).
++   DATABASE -- string of the database file's name ("hosts", "passwd").
++
++   NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
++
++   Also see files-parse.c.
++*/
++
++#define ENTNAME_r	CONCAT(ENTNAME,_r)
++
++#define DATAFILE	"/etc/" DATABASE
++
++#ifdef NEED_H_ERRNO
++# include <netdb.h>
++# define H_ERRNO_PROTO	, int *herrnop
++# define H_ERRNO_ARG	, herrnop
++# define H_ERRNO_SET(val) (*herrnop = (val))
++#else
++# define H_ERRNO_PROTO
++# define H_ERRNO_ARG
++# define H_ERRNO_SET(val) ((void) 0)
++#endif
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Maintenance of the shared stream open on the database file.  */
++
++static FILE *stream;
++static fpos_t position;
++static enum { none, getent, getby } last_use;
++static int keep_stream;
++
++/* Open database file if not already opened.  */
++static enum nss_status
++internal_setent (int stayopen)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  if (stream == NULL)
++    {
++      stream = fopen (DATAFILE, "r");
++
++      if (stream == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl (fileno (stream), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl (fileno (stream), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      fclose (stream);
++	      stream = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++  else
++    rewind (stream);
++
++  /* Remember STAYOPEN flag.  */
++  if (stream != NULL)
++    keep_stream |= stayopen;
++
++  return status;
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++CONCAT(_nss_files_set,ENTNAME) (int stayopen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setent (stayopen);
++
++  if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
++    {
++      fclose (stream);
++      stream = NULL;
++      status = NSS_STATUS_UNAVAIL;
++    }
++
++  last_use = getent;
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++/* Close the database file.  */
++static void
++internal_endent (void)
++{
++  if (stream != NULL)
++    {
++      fclose (stream);
++      stream = NULL;
++    }
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++CONCAT(_nss_files_end,ENTNAME) (void)
++{
++  __libc_lock_lock (lock);
++
++  internal_endent ();
++
++  /* Reset STAYOPEN flag.  */
++  keep_stream = 0;
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* Parsing the database file into `struct STRUCTURE' data structures.  */
++
++static enum nss_status
++internal_getent (struct STRUCTURE *result,
++		 char *buffer, int buflen H_ERRNO_PROTO)
++{
++  char *p;
++  struct parser_data *data = (void *) buffer;
++  int linebuflen = buffer + buflen - data->linebuffer;
++  int parse_result;
++
++  if (buflen < (int) sizeof *data + 1)
++    {
++      __set_errno (ERANGE);
++      H_ERRNO_SET (NETDB_INTERNAL);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  do
++    {
++      /* Terminate the line so that we can test for overflow.  */
++      data->linebuffer[linebuflen - 1] = '\xff';
++
++      p = fgets (data->linebuffer, linebuflen, stream);
++      if (p == NULL && feof (stream))
++	{
++	  /* End of file or read error.  */
++	  __set_errno (ENOENT);
++	  H_ERRNO_SET (HOST_NOT_FOUND);
++	  return NSS_STATUS_NOTFOUND;
++	}
++      else if (p == NULL || data->linebuffer[linebuflen - 1] != '\xff')
++	{
++	  /* The line is too long.  Give the user the opportunity to
++	     enlarge the buffer.  */
++	  __set_errno (ERANGE);
++	  H_ERRNO_SET (NETDB_INTERNAL);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      /* Skip leading blanks.  */
++      while (isspace (*p))
++	++p;
++    }
++  while (*p == '\0' || *p == '#' /* Ignore empty and comment lines.  */
++	 /* Parse the line.  If it is invalid, loop to get the next
++	    line of the file to parse.  */
++	 || ! (parse_result = parse_line (p, result, data, buflen)));
++
++  /* Filled in RESULT with the next entry from the database file.  */
++  return parse_result == -1 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_SUCCESS;
++}
++
++
++/* Return the next entry from the database file, doing locking.  */
++enum nss_status
++CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
++				  char *buffer, size_t buflen H_ERRNO_PROTO)
++{
++  /* Return next entry in host file.  */
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  /* Be prepared that the set*ent function was not called before.  */
++  if (stream == NULL)
++    {
++      status = internal_setent (0);
++
++      if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
++	{
++	  fclose (stream);
++	  stream = NULL;
++	  status = NSS_STATUS_UNAVAIL;
++	}
++    }
++
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      /* If the last use was not by the getent function we need the
++	 position the stream.  */
++      if (last_use != getent)
++	{
++	  if (fsetpos (stream, &position) < 0)
++	    status = NSS_STATUS_UNAVAIL;
++	  else
++	    last_use = getent;
++	}
++
++      if (status == NSS_STATUS_SUCCESS)
++	{
++	  status = internal_getent (result, buffer, buflen H_ERRNO_ARG);
++
++	  /* Remember this position if we were successful.  If the
++	     operation failed we give the user a chance to repeat the
++	     operation (perhaps the buffer was too small).  */
++	  if (status == NSS_STATUS_SUCCESS)
++	    fgetpos (stream, &position);
++	  else
++	    /* We must make sure we reposition the stream the next call.  */
++	    last_use = none;
++	}
++    }
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++/* Macro for defining lookup functions for this file-based database.
++
++   NAME is the name of the lookup; e.g. `hostbyname'.
++
++   KEYSIZE and KEYPATTERN are ignored here but used by ../nss_db/db-XXX.c.
++
++   PROTO describes the arguments for the lookup key;
++   e.g. `const char *hostname'.
++
++   BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result'
++   to the lookup key arguments and does `break;' if they match.  */
++
++#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...)	      \
++enum nss_status								      \
++_nss_files_get##name##_r (proto,					      \
++			  struct STRUCTURE *result,			      \
++			  char *buffer, size_t buflen H_ERRNO_PROTO)	      \
++{									      \
++  enum nss_status status;						      \
++									      \
++  __libc_lock_lock (lock);						      \
++									      \
++  /* Reset file pointer to beginning or open file.  */			      \
++  status = internal_setent (keep_stream);				      \
++									      \
++  if (status == NSS_STATUS_SUCCESS)					      \
++    {									      \
++      /* Tell getent function that we have repositioned the file pointer.  */ \
++      last_use = getby;							      \
++									      \
++      while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG))  \
++	     == NSS_STATUS_SUCCESS)					      \
++	{ break_if_match }						      \
++									      \
++      if (! keep_stream)						      \
++	internal_endent ();						      \
++    }									      \
++									      \
++  __libc_lock_unlock (lock);						      \
++									      \
++  return status;							      \
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-alias.c glibc-2.1.3/glibc-compat/nss_files/files-alias.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-alias.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-alias.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,451 @@
++/* Mail alias file parser in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <aliases.h>
++#include <ctype.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <bits/libc-lock.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++
++#include "nsswitch.h"
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++/* Maintenance of the shared stream open on the database file.  */
++
++static FILE *stream;
++static fpos_t position;
++static enum { none, getent, getby } last_use;
++
++
++static enum nss_status
++internal_setent (void)
++{
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  if (stream == NULL)
++    {
++      stream = fopen ("/etc/aliases", "r");
++
++      if (stream == NULL)
++	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++      else
++	{
++	  /* We have to make sure the file is  `closed on exec'.  */
++	  int result, flags;
++
++	  result = flags = fcntl (fileno (stream), F_GETFD, 0);
++	  if (result >= 0)
++	    {
++	      flags |= FD_CLOEXEC;
++	      result = fcntl (fileno (stream), F_SETFD, flags);
++	    }
++	  if (result < 0)
++	    {
++	      /* Something went wrong.  Close the stream and return a
++		 failure.  */
++	      fclose (stream);
++	      stream = NULL;
++	      status = NSS_STATUS_UNAVAIL;
++	    }
++	}
++    }
++  else
++    rewind (stream);
++
++  return status;
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++_nss_files_setaliasent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_setent ();
++
++  if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
++    {
++      fclose (stream);
++      stream = NULL;
++      status = NSS_STATUS_UNAVAIL;
++    }
++
++  last_use = getent;
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++/* Close the database file.  */
++static void
++internal_endent (void)
++{
++  if (stream != NULL)
++    {
++      fclose (stream);
++      stream = NULL;
++    }
++}
++
++
++/* Thread-safe, exported version of that.  */
++enum nss_status
++_nss_files_endaliasent (void)
++{
++  __libc_lock_lock (lock);
++
++  internal_endent ();
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++/* Parsing the database file into `struct aliasent' data structures.  */
++static enum nss_status
++get_next_alias (const char *match, struct aliasent *result,
++		char *buffer, size_t buflen)
++{
++  enum nss_status status = NSS_STATUS_NOTFOUND;
++  int ignore = 0;
++
++  result->alias_members_len = 0;
++
++  while (1)
++    {
++      /* Now we are ready to process the input.  We have to read a
++	 line and all its continuations and construct the array of
++	 string pointers.  This pointers and the names itself have to
++	 be placed in BUFFER.  */
++      char *first_unused = buffer;
++      size_t room_left = buflen - (buflen % __alignof__ (char *));
++      char *line;
++
++      /* Read the first line.  It must contain the alias name and
++	 possibly some alias names.  */
++      first_unused[room_left - 1] = '\xff';
++      line = fgets (first_unused, room_left, stream);
++      if (line == NULL && feof (stream))
++	/* Nothing to read.  */
++	break;
++      else if (line == NULL || first_unused[room_left - 1] != '\xff')
++	{
++	  /* The line is too long for our buffer.  */
++	no_more_room:
++	  __set_errno (ERANGE);
++	  status = NSS_STATUS_TRYAGAIN;
++	  break;
++	}
++      else
++	{
++	  char *cp;
++
++	  /* If we are in IGNORE mode and the first character in the
++	     line is a white space we ignore the line and start
++	     reading the next.  */
++	  if (ignore && isspace (*first_unused))
++	    continue;
++
++	  /* Terminate the line for any case.  */
++	  cp = strpbrk (first_unused, "#\n");
++	  if (cp != NULL)
++	    *cp = '\0';
++
++	  /* Skip leading blanks.  */
++	  while (isspace (*line))
++	    ++line;
++
++	  result->alias_name = first_unused;
++	  while (*line != '\0' && *line != ':')
++	    *first_unused++ = *line++;
++	  if (*line == '\0' || result->alias_name == first_unused)
++	    /* No valid name.  Ignore the line.  */
++	    continue;
++
++	  *first_unused++ = '\0';
++	  if (room_left < (size_t) (first_unused - result->alias_name))
++	    goto no_more_room;
++	  room_left -= first_unused - result->alias_name;
++	  ++line;
++
++	  /* When we search for a specific alias we can avoid all the
++	     difficult parts and compare now with the name we are
++	     looking for.  If it does not match we simply ignore all
++	     lines until the next line containing the start of a new
++	     alias is found.  */
++	  ignore = (match != NULL
++		    && __strcasecmp (result->alias_name, match) != 0);
++
++	  while (! ignore)
++	    {
++	      while (isspace (*line))
++		++line;
++
++	      cp = first_unused;
++	      while (*line != '\0' && *line != ',')
++		*first_unused++ = *line++;
++
++	      if (first_unused != cp)
++		{
++		  /* OK, we can have a regular entry or an include
++		     request.  */
++		  if (*line != '\0')
++		    ++line;
++		  *first_unused++ = '\0';
++
++		  if (strncmp (cp, ":include:", 9) != 0)
++		    {
++		      if (room_left < (first_unused - cp) + sizeof (char *))
++			goto no_more_room;
++		      room_left -= (first_unused - cp) + sizeof (char *);
++
++		      ++result->alias_members_len;
++		    }
++		  else
++		    {
++		      /* Oh well, we have to read the addressed file.  */
++		      FILE *listfile;
++		      char *old_line = NULL;
++
++		      first_unused = cp;
++
++		      listfile = fopen (&cp[9], "r");
++		      /* If the file does not exist we simply ignore
++			 the statement.  */
++		      if (listfile != NULL
++			  && (old_line = strdup (line)) != NULL)
++			{
++			  while (! feof (listfile))
++			    {
++			      first_unused[room_left - 1] = '\xff';
++			      line = fgets (first_unused, room_left, listfile);
++			      if (line == NULL && feof (listfile))
++				break;
++			      if (line == NULL
++				  || first_unused[room_left - 1] != '\xff')
++				{
++				  free (old_line);
++				  goto no_more_room;
++				}
++
++			      /* Parse the line.  */
++			      cp = strpbrk (line, "#\n");
++			      if (cp != NULL)
++				*cp = '\0';
++
++			      do
++				{
++				  while (isspace (*line))
++				    ++line;
++
++				  cp = first_unused;
++				  while (*line != '\0' && *line != ',')
++				    *first_unused++ = *line++;
++
++				  if (*line != '\0')
++				    ++line;
++
++				  if (first_unused != cp)
++				    {
++				      *first_unused++ = '\0';
++				      if (room_left < ((first_unused - cp)
++						       + __alignof__ (char *)))
++					{
++					  free (old_line);
++					  goto no_more_room;
++					}
++				      room_left -= ((first_unused - cp)
++						    + __alignof__ (char *));
++				      ++result->alias_members_len;
++				    }
++				}
++			      while (*line != '\0');
++			    }
++			  fclose (listfile);
++
++			  first_unused[room_left - 1] = '\0';
++			  strncpy (first_unused, old_line, room_left);
++
++			  if (old_line != NULL)
++			    free (old_line);
++
++			  if (first_unused[room_left - 1] != '\0')
++			    goto no_more_room;
++			}
++		    }
++		}
++
++	      if (*line == '\0')
++		{
++		  /* Get the next line.  But we must be careful.  We
++		     must not read the whole line at once since it
++		     might belong to the current alias.  Simply read
++		     the first character.  If it is a white space we
++		     have a continuation line.  Otherwise it is the
++		     beginning of a new alias and we can push back the
++		     just read character.  */
++		  int ch;
++
++		  ch = fgetc (stream);
++		  if (ch == EOF || ch == '\n' || !isspace (ch))
++		    {
++		      size_t cnt;
++
++		      /* Now prepare the return.  Provide string
++			 pointers for the currently selected aliases.  */
++		      if (ch != EOF)
++			ungetc (ch, stream);
++
++		      /* Adjust the pointer so it is aligned for
++			 storing pointers.  */
++		      first_unused += __alignof__ (char *) - 1;
++		      first_unused -= ((first_unused - (char *) 0)
++				       % __alignof__ (char *));
++		      result->alias_members = (char **) first_unused;
++
++		      /* Compute addresses of alias entry strings.  */
++		      cp = result->alias_name;
++		      for (cnt = 0; cnt < result->alias_members_len; ++cnt)
++			{
++			  cp = strchr (cp, '\0') + 1;
++			  result->alias_members[cnt] = cp;
++			}
++
++		      status = (result->alias_members_len == 0
++				? NSS_STATUS_RETURN : NSS_STATUS_SUCCESS);
++		      break;
++		    }
++
++		  /* The just read character is a white space and so
++		     can be ignored.  */
++		  first_unused[room_left - 1] = '\xff';
++		  line = fgets (first_unused, room_left, stream);
++		  if (line == NULL && feof (stream))
++		    break;
++		  if (line == NULL || first_unused[room_left - 1] != '\xff')
++		    goto no_more_room;
++		  cp = strpbrk (line, "#\n");
++		  if (cp != NULL)
++		    *cp = '\0';
++		}
++	    }
++	}
++
++      if (status != NSS_STATUS_NOTFOUND)
++	/* We read something.  In any case break here.  */
++	break;
++    }
++
++  return status;
++}
++
++
++enum nss_status
++_nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
++{
++  /* Return next entry in host file.  */
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  __libc_lock_lock (lock);
++
++  /* Be prepared that the set*ent function was not called before.  */
++  if (stream == NULL)
++    status = internal_setent ();
++
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      /* If the last use was not by the getent function we need the
++	 position the stream.  */
++      if (last_use != getent)
++	{
++	  if (fsetpos (stream, &position) < 0)
++	    status = NSS_STATUS_UNAVAIL;
++	  else
++	    last_use = getent;
++	}
++
++      if (status == NSS_STATUS_SUCCESS)
++	{
++	  result->alias_local = 1;
++
++	  /* Read lines until we get a definite result.  */
++	  do
++	    status = get_next_alias (NULL, result, buffer, buflen);
++	  while (status == NSS_STATUS_RETURN);
++
++	  /* If we successfully read an entry remember this position.  */
++	  if (status == NSS_STATUS_SUCCESS)
++	    fgetpos (stream, &position);
++	  else
++	    last_use = none;
++	}
++    }
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
++			     char *buffer, size_t buflen)
++{
++  /* Return next entry in host file.  */
++  enum nss_status status = NSS_STATUS_SUCCESS;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  __libc_lock_lock (lock);
++
++  /* Open the stream or rest it.  */
++  status = internal_setent ();
++  last_use = getby;
++
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      result->alias_local = 1;
++
++      /* Read lines until we get a definite result.  */
++      do
++	status = get_next_alias (name, result, buffer, buflen);
++      while (status == NSS_STATUS_RETURN);
++    }
++
++  internal_endent ();
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-ethers.c glibc-2.1.3/glibc-compat/nss_files/files-ethers.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-ethers.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-ethers.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,75 @@
++/* Copyright (C) 1996 Free Software Foundation, Inc.
++This file is part of the GNU C Library.
++
++The GNU C Library is free software; you can redistribute it and/or
++modify it under the terms of the GNU Library General Public License as
++published by the Free Software Foundation; either version 2 of the
++License, or (at your option) any later version.
++
++The GNU C Library 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
++Library General Public License for more details.
++
++You should have received a copy of the GNU Library General Public
++License along with the GNU C Library; see the file COPYING.LIB.  If
++not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++Boston, MA 02111-1307, USA.  */
++
++#include <string.h>
++#include <netinet/if_ether.h>
++
++/* Because the `ethers' lookup does not fit so well in the scheme so
++   we define a dummy struct here which helps us to use the available
++   functions.  */
++struct etherent
++{
++  const char *e_name;
++  struct ether_addr e_addr;
++};
++struct etherent_data {};
++
++#define ENTNAME		etherent
++#define DATABASE	"ethers"
++#include "files-parse.c"
++LINE_PARSER
++("#",
++ /* Read the ethernet address: 6 x 8bit hexadecimal number.  */
++ {
++   size_t cnt;
++
++   for (cnt = 0; cnt < 6; ++cnt)
++     {
++       unsigned int number;
++
++       if (cnt < 5)
++	 INT_FIELD (number, ISCOLON , 0, 16, (unsigned int))
++       else
++	 INT_FIELD (number, isspace, 0, 16, (unsigned int))
++
++       if (number > 0xff)
++	 return 0;
++       result->e_addr.ether_addr_octet[cnt] = number;
++     }
++ };
++ STRING_FIELD (result->e_name, isspace, 1);
++ )
++
++
++#include GENERIC
++
++DB_LOOKUP (hostton, 1 + strlen (name), (".%s", name),
++	   {
++	     if (strcmp (result->e_name, name) == 0)
++	       break;
++	   }, const char *name)
++
++DB_LOOKUP (ntohost, 18, ("=%x:%x:%x:%x:%x:%x",
++			 addr->ether_addr_octet[0], addr->ether_addr_octet[1],
++			 addr->ether_addr_octet[2], addr->ether_addr_octet[3],
++			 addr->ether_addr_octet[4], addr->ether_addr_octet[5]),
++	   {
++	     if (memcmp (&result->e_addr, addr,
++			 sizeof (struct ether_addr)) == 0)
++	       break;
++	   }, struct ether_addr *addr)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-grp.c glibc-2.1.3/glibc-compat/nss_files/files-grp.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-grp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-grp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,45 @@
++/* Group file parser in nss_files module.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <grp.h>
++
++#define STRUCTURE	group
++#define ENTNAME		grent
++#define DATABASE	"group"
++struct grent_data {};
++
++/* Our parser function is already defined in fgetgrent.c, so use that.
++   to parse lines from the database file.  */
++#define EXTERN_PARSER
++#include "files-parse.c"
++#include GENERIC
++
++DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name),
++	   {
++	     if (name[0] != '-' && name[0] != '+'
++		 && ! strcmp (name, result->gr_name))
++	       break;
++	   }, const char *name)
++
++DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid),
++	   {
++	     if (result->gr_gid == gid && result->gr_name[0] != '+'
++		 && result->gr_name[0] != '-')
++	       break;
++	   }, gid_t gid)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-hosts.c glibc-2.1.3/glibc-compat/nss_files/files-hosts.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-hosts.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-hosts.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,107 @@
++/* Hosts file parser in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <arpa/nameser.h>
++#include <netdb.h>
++#include <resolv.h>
++
++
++/* Get implementation for some internal functions.  */
++#include "../resolv/mapv4v6addr.h"
++
++
++#define ENTNAME		hostent
++#define DATABASE	"hosts"
++#define NEED_H_ERRNO
++
++#define ENTDATA hostent_data
++struct hostent_data
++  {
++    unsigned char host_addr[16]; /* IPv4 or IPv6 address.  */
++    char *h_addr_ptrs[2];	/* Points to that and null terminator.  */
++  };
++
++#define TRAILING_LIST_MEMBER		h_aliases
++#define TRAILING_LIST_SEPARATOR_P	isspace
++#include "files-parse.c"
++LINE_PARSER
++("#",
++ {
++   char *addr;
++
++   STRING_FIELD (addr, isspace, 1);
++
++   /* Parse address.  */
++   if (inet_pton (AF_INET, addr, entdata->host_addr) > 0)
++     {
++       if (_res.options & RES_USE_INET6)
++	 {
++	   map_v4v6_address ((char *) entdata->host_addr,
++			     (char *) entdata->host_addr);
++	   result->h_addrtype = AF_INET6;
++	   result->h_length = IN6ADDRSZ;
++	 }
++       else
++	 {
++	   result->h_addrtype = AF_INET;
++	   result->h_length = INADDRSZ;
++	 }
++     }
++   else if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
++     {
++       result->h_addrtype = AF_INET6;
++       result->h_length = IN6ADDRSZ;
++     }
++   else
++     /* Illegal address: ignore line.  */
++     return 0;
++
++   /* Store a pointer to the address in the expected form.  */
++   entdata->h_addr_ptrs[0] = entdata->host_addr;
++   entdata->h_addr_ptrs[1] = NULL;
++   result->h_addr_list = entdata->h_addr_ptrs;
++
++   STRING_FIELD (result->h_name, isspace, 1);
++ })
++
++#include "files-XXX.c"
++
++DB_LOOKUP (hostbyname, ,,
++	   {
++	     if (result->h_addrtype != ((_res.options & RES_USE_INET6)
++					? AF_INET6 : AF_INET))
++	       continue;
++	     LOOKUP_NAME_CASE (h_name, h_aliases)
++	   }, const char *name)
++
++DB_LOOKUP (hostbyname2, ,,
++	   {
++	     if (result->h_addrtype != af)
++	       continue;
++	     LOOKUP_NAME_CASE (h_name, h_aliases)
++	   }, const char *name, int af)
++
++DB_LOOKUP (hostbyaddr, ,,
++	   {
++	     if (result->h_addrtype == type && result->h_length == len &&
++		 ! memcmp (addr, result->h_addr_list[0], len))
++	       break;
++	   }, const char *addr, int len, int type)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,268 @@
++/* Netgroup file parser in nss_files modules.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <ctype.h>
++#include <errno.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include "nsswitch.h"
++#include "netgroup.h"
++
++#define DATAFILE	"/etc/netgroup"
++
++
++#define EXPAND(needed)							      \
++  do									      \
++    {									      \
++      size_t old_cursor = result->cursor - result->data;		      \
++									      \
++      result->data_size += 512 > 2 * needed ? 512 : 2 * needed;		      \
++      result->data = realloc (result->data, result->data_size);		      \
++									      \
++      if (result->data == NULL)						      \
++	{								      \
++	  status = NSS_STATUS_UNAVAIL;					      \
++	  goto the_end;							      \
++	}								      \
++      									      \
++      result->cursor = result->data + old_cursor;			      \
++    }									      \
++  while (0)
++
++
++enum nss_status
++_nss_files_setnetgrent (const char *group, struct __netgrent *result)
++{
++  FILE *fp;
++  enum nss_status status;
++
++  if (group[0] == '\0')
++    return NSS_STATUS_UNAVAIL;
++
++  /* Find the netgroups file and open it.  */
++  fp = fopen (DATAFILE, "r");
++  if (fp == NULL)
++    status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
++  else
++    {
++      /* Read the file line by line and try to find the description
++	 GROUP.  We must take care for long lines.  */
++      char *line = NULL;
++      size_t line_len = 0;
++      const ssize_t group_len = strlen (group);
++
++      status = NSS_STATUS_NOTFOUND;
++      result->cursor = result->data;
++
++      while (!feof (fp))
++	{
++	  ssize_t curlen = getline (&line, &line_len, fp);
++	  int found;
++
++	  if (curlen < 0)
++	    {
++	      status = NSS_STATUS_NOTFOUND;
++	      break;
++	    }
++
++	  found = (curlen > group_len && strncmp (line, group, group_len) == 0
++		   && isspace (line[group_len]));
++
++	  /* Read the whole line (including continuation) and store it
++	     if FOUND in nonzero.  Otherwise we don't need it.  */
++	  if (found)
++	    {
++	      /* Store the data from the first line.  */
++	      EXPAND (curlen - group_len);
++	      memcpy (result->cursor, &line[group_len + 1],
++		      curlen - group_len);
++	      result->cursor += (curlen - group_len) - 1;
++	    }
++
++	  while (line[curlen - 1] == '\n' && line[curlen - 2] == '\\')
++	    {
++	      /* Yes, we have a continuation line.  */
++	      if (found)
++		/* Remove these characters from the stored line.  */
++		result->cursor -= 2;
++
++	      /* Get next line.  */
++	      curlen = getline (&line, &line_len, fp);
++	      if (curlen <= 0)
++		break;
++
++	      if (found)
++		{
++		  /* Make sure we have enough room.  */
++		  EXPAND (1 + curlen + 1);
++
++		  /* Add separator in case next line starts immediately.  */
++		  *result->cursor++ = ' ';
++
++		  /* Copy new line.  */
++		  memcpy (result->cursor, line, curlen + 1);
++		  result->cursor += curlen;
++		}
++	    }
++
++	  if (found)
++	    {
++	      /* Now we have read the line.  */
++	      status = NSS_STATUS_SUCCESS;
++	      result->cursor = result->data;
++	      result->first = 1;
++	      break;
++	    }
++	}
++
++    the_end:
++      /* We don't need the file and the line buffer anymore.  */
++      free (line);
++      fclose (fp);
++    }
++
++  return status;
++}
++
++
++int
++_nss_files_endnetgrent (struct __netgrent *result)
++{
++  /* Free allocated memory for data if some is present.  */
++  if (result->data != NULL)
++    {
++      free (result->data);
++      result->data = NULL;
++      result->data_size = 0;
++      result->cursor = NULL;
++    }
++
++  return NSS_STATUS_SUCCESS;
++}
++
++
++enum nss_status
++_nss_netgroup_parseline (char **cursor, struct __netgrent *result,
++			 char *buffer, int buflen)
++{
++  enum nss_status status;
++  const char *host, *user, *domain;
++  char *cp = *cursor;
++
++  /* Some sanity checks.  */
++  if (cp == NULL)
++    return NSS_STATUS_NOTFOUND;
++
++  /* First skip leading spaces.  */
++  while (isspace (*cp))
++    ++cp;
++
++  if (*cp != '(')
++    {
++      /* We have a list of other netgroups.  */
++      char *name = cp;
++
++      while (*cp != '\0' && ! isspace (*cp))
++	++cp;
++
++      if (name != cp)
++	{
++	  /* It is another netgroup name.  */
++	  int last = *cp == '\0';
++
++	  result->type = group_val;
++	  result->val.group = name;
++	  *cp = '\0';
++	  if (! last)
++	    ++cp;
++	  *cursor = cp;
++	  result->first = 0;
++
++	  return NSS_STATUS_SUCCESS;
++	}
++
++      return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
++    }
++
++  /* Match host name.  */
++  host = ++cp;
++  while (*cp != ',')
++    if (*cp++ == '\0')
++      return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
++
++  /* Match user name.  */
++  user = ++cp;
++  while (*cp != ',')
++    if (*cp++ == '\0')
++      return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
++
++  /* Match domain name.  */
++  domain = ++cp;
++  while (*cp != ')')
++    if (*cp++ == '\0')
++      return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;
++  ++cp;
++
++
++  /* When we got here we have found an entry.  Before we can copy it
++     to the private buffer we have to make sure it is big enough.  */
++  if (cp - host > buflen)
++    {
++      __set_errno (ERANGE);
++      status = NSS_STATUS_UNAVAIL;
++    }
++  else
++    {
++      memcpy (buffer, host, cp - host);
++      result->type = triple_val;
++
++      buffer[(user - host) - 1] = '\0';
++      result->val.triple.host = *host == ',' ? NULL : buffer;
++
++      buffer[(domain - host) - 1] = '\0';
++      result->val.triple.user = *user == ',' ? NULL : buffer + (user - host);
++
++      buffer[(cp - host) - 1] = '\0';
++      result->val.triple.domain =
++	*domain == ')' ? NULL : buffer + (domain - host);
++
++      status = NSS_STATUS_SUCCESS;
++
++      /* Remember where we stopped reading.  */
++      *cursor = cp;
++
++      result->first = 0;
++    }
++
++  return status;
++}
++
++
++enum nss_status
++_nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen)
++{
++  enum nss_status status;
++
++  status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-network.c glibc-2.1.3/glibc-compat/nss_files/files-network.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-network.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-network.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,56 @@
++/* Networks file parser in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <netdb.h>
++
++#define ENTNAME		netent
++#define DATABASE	"networks"
++
++struct netent_data {};
++
++#define TRAILING_LIST_MEMBER		n_aliases
++#define TRAILING_LIST_SEPARATOR_P	isspace
++#include "files-parse.c"
++LINE_PARSER
++("#",
++ {
++   char *addr;
++
++   STRING_FIELD (result->n_name, isspace, 1);
++
++   STRING_FIELD (addr, isspace, 1);
++   result->n_net = inet_network (addr);
++   result->n_addrtype = AF_INET;
++
++ })
++
++#include "files-XXX.c"
++
++DB_LOOKUP (netbyname, ,,
++	   LOOKUP_NAME_CASE (n_name, n_aliases),
++	   const char *name)
++
++DB_LOOKUP (netbyaddr, ,,
++	   {
++	     if (result->n_addrtype == type && result->n_net == net)
++	       /* Bingo!  */
++	       break;
++	   }, unsigned long int net, int type)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-parse.c glibc-2.1.3/glibc-compat/nss_files/files-parse.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-parse.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-parse.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,251 @@
++/* Common code for file-based database parsers in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <stdlib.h>
++
++/* These symbols are defined by the including source file:
++
++   ENTNAME -- database name of the structure and functions (hostent, pwent).
++   STRUCTURE -- struct name, define only if not ENTNAME (passwd, group).
++   DATABASE -- string of the database file's name ("hosts", "passwd").
++
++   ENTDATA -- if defined, `struct ENTDATA' is used by the parser to store
++              things pointed to by the resultant `struct STRUCTURE'.
++
++   NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
++
++   Also see files-XXX.c.  */
++
++#define CONCAT(a,b) CONCAT1(a,b)
++#define CONCAT1(a,b) a##b
++
++#ifndef STRUCTURE
++# define STRUCTURE ENTNAME
++#endif
++
++
++struct parser_data
++  {
++#ifdef ENTDATA
++    struct ENTDATA entdata;
++# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata;
++#else
++# define ENTDATA_DECL(data)
++#endif
++    char linebuffer[0];
++  };
++
++#ifdef ENTDATA
++/* The function can't be exported, because the entdata structure
++   is defined only in files-foo.c.  */
++# define parser_stclass static inline
++#else
++/* Export the line parser function so it can be used in nss_db.  */
++# define parser_stclass /* Global */
++# define parse_line CONCAT(_nss_files_parse_,ENTNAME)
++#endif
++
++
++#ifdef EXTERN_PARSER
++
++/* The parser is defined in a different module.  */
++extern int parse_line (char *line, struct STRUCTURE *result,
++		       struct parser_data *data, size_t datalen);
++
++# define LINE_PARSER(EOLSET, BODY) /* Do nothing */
++
++#else
++
++/* Define a line parsing function.  */
++
++# define LINE_PARSER(EOLSET, BODY)					      \
++parser_stclass int							      \
++parse_line (char *line, struct STRUCTURE *result,			      \
++	    struct parser_data *data, size_t datalen)			      \
++{									      \
++  ENTDATA_DECL (data)							      \
++  char *p = strpbrk (line, EOLSET "\n");				      \
++  if (p != NULL)							      \
++    *p = '\0';								      \
++  BODY;									      \
++  TRAILING_LIST_PARSER;							      \
++  return 1;								      \
++}
++
++
++# define STRING_FIELD(variable, terminator_p, swallow)			      \
++  {									      \
++    variable = line;							      \
++    while (*line != '\0' && !terminator_p (*line))			      \
++      ++line;								      \
++    if (*line != '\0')							      \
++      {									      \
++	*line = '\0';							      \
++	do								      \
++	  ++line;							      \
++	while (swallow && terminator_p (*line));			      \
++      }									      \
++  }
++
++# define INT_FIELD(variable, terminator_p, swallow, base, convert)	      \
++  {									      \
++    char *endp;								      \
++    variable = convert (strtoul (line, &endp, base));			      \
++    if (endp == line)							      \
++      return 0;								      \
++    else if (terminator_p (*endp))					      \
++      do								      \
++	++endp;								      \
++      while (swallow && terminator_p (*endp));				      \
++    else if (*endp != '\0')						      \
++      return 0;								      \
++    line = endp;							      \
++  }
++
++# define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default)	      \
++  {									      \
++    char *endp;								      \
++    if (*line == '\0')							      \
++      /* We expect some more input, so don't allow the string to end here. */ \
++      return 0;								      \
++    variable = convert (strtoul (line, &endp, base));			      \
++    if (endp == line)							      \
++      variable = default;						      \
++    if (terminator_p (*endp))						      \
++      do								      \
++	++endp;								      \
++      while (swallow && terminator_p (*endp));				      \
++    else if (*endp != '\0')						      \
++      return 0;								      \
++    line = endp;							      \
++  }
++
++# define ISCOLON(c) ((c) == ':')
++
++
++# ifndef TRAILING_LIST_MEMBER
++#  define TRAILING_LIST_PARSER /* Nothing to do.  */
++# else
++
++#  define TRAILING_LIST_PARSER						      \
++{									      \
++  char **list = parse_list (line, data, datalen);			      \
++  if (list)								      \
++    result->TRAILING_LIST_MEMBER = list;				      \
++  else 									      \
++    return -1;		/* -1 indicates we ran out of space.  */	      \
++}
++
++static inline char **
++parse_list (char *line, struct parser_data *data, size_t datalen)
++{
++  char *eol, **list, **p;
++
++  if (line >= data->linebuffer && line < (char *) data + datalen)
++    /* Find the end of the line buffer, we will use the space in DATA after
++       it for storing the vector of pointers.  */
++    eol = strchr (line, '\0') + 1;
++  else
++    /* LINE does not point within DATA->linebuffer, so that space is
++       not being used for scratch space right now.  We can use all of
++       it for the pointer vector storage.  */
++    eol = data->linebuffer;
++  /* Adjust the pointer so it is aligned for storing pointers.  */
++  eol += __alignof__ (char *) - 1;
++  eol -= (eol - (char *) 0) % __alignof__ (char *);
++  /* We will start the storage here for the vector of pointers.  */
++  list = (char **) eol;
++
++  p = list;
++  while (1)
++    {
++      char *elt;
++
++      if ((size_t) ((char *) &p[1] - (char *) data) > datalen)
++	{
++	  /* We cannot fit another pointer in the buffer.  */
++	  __set_errno (ERANGE);
++	  return NULL;
++	}
++      if (*line == '\0')
++	break;
++
++      /* Skip leading white space.  This might not be portable but useful.  */
++      while (isspace (*line))
++	++line;
++
++      elt = line;
++      while (1)
++	{
++	  if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line))
++	    {
++	      /* End of the next entry.  */
++	      if (line > elt)
++		/* We really found some data.  */
++		*p++ = elt;
++
++	      /* Terminate string if necessary.  */
++	      if (*line != '\0')
++		*line++ = '\0';
++	      break;
++	    }
++	  ++line;
++	}
++    }
++  *p = NULL;
++
++  return list;
++}
++
++# endif	/* TRAILING_LIST_MEMBER */
++#endif	/* EXTERN_PARSER */
++
++
++#define LOOKUP_NAME(nameelt, aliaselt)					      \
++{									      \
++  char **ap;								      \
++  if (! strcmp (name, result->nameelt))					      \
++    break;								      \
++  for (ap = result->aliaselt; *ap; ++ap)				      \
++    if (! strcmp (name, *ap))						      \
++      break;								      \
++  if (*ap)								      \
++    break;								      \
++}
++
++#define LOOKUP_NAME_CASE(nameelt, aliaselt)				      \
++{									      \
++  char **ap;								      \
++  if (! __strcasecmp (name, result->nameelt))				      \
++    break;								      \
++  for (ap = result->aliaselt; *ap; ++ap)				      \
++    if (! __strcasecmp (name, *ap))					      \
++      break;								      \
++  if (*ap)								      \
++    break;								      \
++}
++
++
++/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead.  */
++#ifndef GENERIC
++# define GENERIC "files-XXX.c"
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-proto.c glibc-2.1.3/glibc-compat/nss_files/files-proto.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-proto.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-proto.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,47 @@
++/* Protocols file parser in nss_files module.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <netdb.h>
++
++
++#define ENTNAME		protoent
++#define DATABASE	"protocols"
++
++struct protoent_data {};
++
++#define TRAILING_LIST_MEMBER		p_aliases
++#define TRAILING_LIST_SEPARATOR_P	isspace
++#include "files-parse.c"
++LINE_PARSER
++("#",
++ STRING_FIELD (result->p_name, isspace, 1);
++ INT_FIELD (result->p_proto, isspace, 1, 10,);
++ )
++
++#include GENERIC
++
++DB_LOOKUP (protobyname, 1 + strlen (name), (".%s", name),
++	   LOOKUP_NAME (p_name, p_aliases),
++	   const char *name)
++
++DB_LOOKUP (protobynumber, 20, ("=%d", proto),
++	   {
++	     if (result->p_proto == proto)
++	       break;
++	   }, int proto)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-pwd.c glibc-2.1.3/glibc-compat/nss_files/files-pwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-pwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-pwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,45 @@
++/* User file parser in nss_files module.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <pwd.h>
++
++#define STRUCTURE	passwd
++#define ENTNAME		pwent
++#define DATABASE	"passwd"
++struct pwent_data {};
++
++/* Our parser function is already defined in fgetpwent_r.c, so use that
++   to parse lines from the database file.  */
++#define EXTERN_PARSER
++#include "files-parse.c"
++#include GENERIC
++
++DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name),
++	   {
++	     if (name[0] != '+' && name[0] != '-'
++		 && ! strcmp (name, result->pw_name))
++	       break;
++	   }, const char *name)
++
++DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid),
++	   {
++	     if (result->pw_uid == uid && result->pw_name[0] != '+'
++		 && result->pw_name[0] != '-')
++	       break;
++	   }, uid_t uid)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-rpc.c glibc-2.1.3/glibc-compat/nss_files/files-rpc.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-rpc.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-rpc.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,47 @@
++/* SunRPC program number file parser in nss_files module.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <rpc/netdb.h>
++
++
++#define ENTNAME		rpcent
++#define DATABASE	"rpc"
++
++struct rpcent_data {};
++
++#define TRAILING_LIST_MEMBER		r_aliases
++#define TRAILING_LIST_SEPARATOR_P	isspace
++#include "files-parse.c"
++LINE_PARSER
++("#",
++ STRING_FIELD (result->r_name, isspace, 1);
++ INT_FIELD (result->r_number, isspace, 1, 10,);
++ )
++
++#include GENERIC
++
++DB_LOOKUP (rpcbyname, 1 + strlen (name), (".%s", name),
++	   LOOKUP_NAME (r_name, r_aliases),
++	   const char *name)
++
++DB_LOOKUP (rpcbynumber, 20, ("=%d", number),
++	   {
++	     if (result->r_number == number)
++	       break;
++	   }, int number)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-service.c glibc-2.1.3/glibc-compat/nss_files/files-service.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-service.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-service.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,60 @@
++/* Services file parser in nss_files module.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <netinet/in.h>
++#include <netdb.h>
++
++
++#define ENTNAME		servent
++#define DATABASE	"services"
++
++struct servent_data {};
++
++#define TRAILING_LIST_MEMBER		s_aliases
++#define TRAILING_LIST_SEPARATOR_P	isspace
++#include "files-parse.c"
++#define ISSLASH(c) ((c) == '/')
++LINE_PARSER
++("#",
++ STRING_FIELD (result->s_name, isspace, 1);
++ INT_FIELD (result->s_port, ISSLASH, 10, 0, htons);
++ STRING_FIELD (result->s_proto, isspace, 1);
++ )
++
++#include GENERIC
++
++DB_LOOKUP (servbyname, 2 + strlen (name) + (proto ? strlen (proto) : 0),
++	   (".%s/%s", name, proto ?: ""),
++	   {
++	     /* Must match both protocol (if specified) and name.  */
++	     if (proto != NULL && strcmp (result->s_proto, proto))
++	       continue;
++	     LOOKUP_NAME (s_name, s_aliases)
++	   },
++	   const char *name, const char *proto)
++
++DB_LOOKUP (servbyport, 21 + (proto ? strlen (proto) : 0),
++	   ("=%d/%s", ntohs (port), proto ?: ""),
++	   {
++	     /* Must match both port and protocol.  */
++	     if (result->s_port == port
++		 && (proto == NULL
++		     || strcmp (result->s_proto, proto) == 0))
++	       break;
++	   }, int port, const char *proto)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-spwd.c glibc-2.1.3/glibc-compat/nss_files/files-spwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_files/files-spwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_files/files-spwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,38 @@
++/* User file parser in nss_files module.
++   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <shadow.h>
++
++#define STRUCTURE	spwd
++#define ENTNAME		spent
++#define DATABASE	"shadow"
++struct spent_data {};
++
++/* Our parser function is already defined in sgetspent_r.c, so use that
++   to parse lines from the database file.  */
++#define EXTERN_PARSER
++#include "files-parse.c"
++#include GENERIC
++
++DB_LOOKUP (spnam, 1 + strlen (name), (".%s", name),
++	   {
++	     if (name[0] != '+' && name[0] != '-'
++		 && ! strcmp (name, result->sp_namp))
++	       break;
++	   }, const char *name)
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,278 @@
++/* Copyright (C) 1996, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <aliases.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++static int
++_nss_nis_parse_aliasent (const char *key, char *alias, struct aliasent *result,
++			 char *buffer, size_t buflen)
++{
++  char *first_unused = buffer + strlen (alias) + 1;
++  size_t room_left =
++    buflen - (buflen % __alignof__ (char *)) - strlen (alias) - 2;
++  char *line;
++  char *cp;
++
++  result->alias_members_len = 0;
++  *first_unused = '\0';
++  first_unused++;
++  strcpy (first_unused, key);
++
++  if (first_unused[room_left - 1] != '\0')
++    {
++      /* The line is too long for our buffer.  */
++    no_more_room:
++      __set_errno (ERANGE);
++      return -1;
++    }
++
++  result->alias_name = first_unused;
++
++  /* Terminate the line for any case.  */
++  cp = strpbrk (alias, "#\n");
++  if (cp != NULL)
++    *cp = '\0';
++
++  first_unused += strlen (result->alias_name) + 1;
++  /* Adjust the pointer so it is aligned for
++     storing pointers.  */
++  first_unused += __alignof__ (char *) - 1;
++  first_unused -= ((first_unused - (char *) 0) % __alignof__ (char *));
++  result->alias_members = (char **) first_unused;
++
++  line = alias;
++
++  while (*line != '\0')
++    {
++      /* Skip leading blanks.  */
++      while (isspace (*line))
++	line++;
++
++      if (*line == '\0')
++	break;
++
++      if (room_left < sizeof (char *))
++	  goto no_more_room;
++      room_left -= sizeof (char *);
++      result->alias_members[result->alias_members_len] = line;
++
++      while (*line != '\0' && *line != ',')
++	line++;
++
++      if (line != result->alias_members[result->alias_members_len])
++	{
++	  *line = '\0';
++	  line++;
++	  result->alias_members_len++;
++	}
++    }
++  return result->alias_members_len == 0 ? 0 : 1;
++}
++
++enum nss_status
++_nss_nis_setaliasent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endaliasent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getaliasent_r (struct aliasent *alias, char *buffer,
++			    size_t buflen)
++{
++  char *domain;
++  char *result;
++  int len;
++  char *outkey;
++  int keylen;
++  char *p;
++  int parse_res;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  alias->alias_local = 0;
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "mail.aliases",
++				      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "mail.aliases", oldkey,
++				      oldkeylen, &outkey, &keylen,
++				      &result, &len));
++      if (retval != NSS_STATUS_SUCCESS)
++	{
++	  if (retval == NSS_STATUS_TRYAGAIN)
++            __set_errno (EAGAIN);
++          return retval;
++        }
++
++      if ((size_t) (len + 1) > buflen)
++        {
++	  free (result);
++          __set_errno (ERANGE);
++          return NSS_STATUS_TRYAGAIN;
++        }
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++      while (isspace (*p))
++        ++p;
++      free (result);
++
++      parse_res = _nss_nis_parse_aliasent (outkey, p, alias, buffer, buflen);
++      if (parse_res == -1)
++	{
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getaliasent_r (struct aliasent *alias, char *buffer, size_t buflen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getaliasent_r (alias, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias,
++			   char *buffer, size_t buflen)
++{
++  enum nss_status retval;
++  int parse_res;
++  char *domain;
++  char *result;
++  int len;
++  char *p;
++  size_t namlen = strlen (name);
++  char name2[namlen + 1];
++  int i;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  /* Convert name to lowercase.  */
++  for (i = 0; i < namlen; ++i)
++    name2[i] = tolower (name[i]);
++  name2[i] = '\0';
++
++  retval = yperr2nss (yp_match (domain, "mail.aliases", name, namlen,
++				&result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++	__set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  alias->alias_local = 0;
++  parse_res = _nss_nis_parse_aliasent (name, p, alias, buffer, buflen);
++  if (parse_res == -1)
++    return NSS_STATUS_TRYAGAIN;
++  else
++    if (parse_res == 0)
++      return NSS_STATUS_NOTFOUND;
++    else
++      return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,299 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++#include <netinet/if_ether.h>
++
++#include "nss-nis.h"
++
++/* Protect global state against multiple changers */
++__libc_lock_define_initialized (static, lock)
++
++struct ether
++{
++  const char *e_name;
++  struct ether_addr e_addr;
++};
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME etherent
++#define STRUCTURE ether
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++struct response
++{
++  char *val;
++  struct response *next;
++};
++
++static struct response *start = NULL;
++static struct response *next = NULL;
++
++static int
++saveit (int instatus, char *inkey, int inkeylen, char *inval,
++	int invallen, char *indata)
++{
++  if (instatus != YP_TRUE)
++    return instatus;
++
++  if (inkey && inkeylen > 0 && inval && invallen > 0)
++    {
++      if (start == NULL)
++	{
++	  start = malloc (sizeof (struct response));
++	  next = start;
++	}
++      else
++	{
++	  next->next = malloc (sizeof (struct response));
++	  next = next->next;
++	}
++      next->next = NULL;
++      next->val = malloc (invallen + 1);
++      strncpy (next->val, inval, invallen);
++      next->val[invallen] = '\0';
++    }
++
++  return 0;
++}
++
++enum nss_status
++internal_nis_setetherent (void)
++{
++  char *domainname;
++  struct ypall_callback ypcb;
++  enum nss_status status;
++
++  yp_get_default_domain (&domainname);
++
++  while (start != NULL)
++    {
++      if (start->val != NULL)
++	free (start->val);
++      next = start;
++      start = start->next;
++      free (next);
++    }
++  start = NULL;
++
++  ypcb.foreach = saveit;
++  ypcb.data = NULL;
++  status = yperr2nss (yp_all (domainname, "ethers.byname", &ypcb));
++  next = start;
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_setetherent (void)
++{
++  enum nss_status result;
++
++  __libc_lock_lock (lock);
++
++  result = internal_nis_setetherent ();
++
++  __libc_lock_unlock (lock);
++
++  return result;
++}
++
++enum nss_status
++_nss_nis_endetherent (void)
++{
++  __libc_lock_lock (lock);
++
++  while (start != NULL)
++    {
++      if (start->val != NULL)
++	free (start->val);
++      next = start;
++      start = start->next;
++      free (next);
++    }
++  start = NULL;
++  next = NULL;
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getetherent_r (struct ether *eth, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  int parse_res;
++
++  if (start == NULL)
++    internal_nis_setetherent ();
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      char *p;
++
++      if (next == NULL)
++	return NSS_STATUS_NOTFOUND;
++      p = strncpy (buffer, next->val, buflen);
++      next = next->next;
++
++      while (isspace (*p))
++        ++p;
++
++      parse_res = _nss_files_parse_etherent (p, eth, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getetherent_r (struct ether *result, char *buffer, size_t buflen)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getetherent_r (result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_gethostton_r (const char *name, struct ether *eth,
++		       char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  retval = yperr2nss (yp_match (domain, "ethers.byname", name,
++				strlen (name), &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_etherent (p, eth, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getntohost_r (struct ether_addr *addr, struct ether *eth,
++		       char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, nlen, parse_res;
++  char buf[33];
++
++  if (addr == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  nlen = sprintf (buf, "%x:%x:%x:%x:%x:%x",
++		  (int) addr->ether_addr_octet[0],
++		  (int) addr->ether_addr_octet[1],
++		  (int) addr->ether_addr_octet[2],
++		  (int) addr->ether_addr_octet[3],
++		  (int) addr->ether_addr_octet[4],
++		  (int) addr->ether_addr_octet[5]);
++
++  retval = yperr2nss (yp_match (domain, "ethers.byaddr", buf,
++				nlen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_etherent (p, eth, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,249 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <grp.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME grent
++#define STRUCTURE group
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Protect global state against multiple changers */
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++enum nss_status
++_nss_nis_setgrent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endgrent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getgrent_r (struct group *grp, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain, *result, *outkey;
++  int len, keylen, parse_res;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++      char *p;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "group.byname",
++                                      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "group.byname",
++                                      oldkey, oldkeylen,
++                                      &outkey, &keylen, &result, &len));
++
++      if (retval != NSS_STATUS_SUCCESS)
++        {
++          if (retval == NSS_STATUS_TRYAGAIN)
++            __set_errno (EAGAIN);
++          return retval;
++        }
++
++      if ((size_t) (len + 1) > buflen)
++        {
++          free (result);
++          __set_errno (ERANGE);
++          return NSS_STATUS_TRYAGAIN;
++        }
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++      while (isspace (*p))
++        ++p;
++      free (result);
++
++      parse_res = _nss_files_parse_grent (p, grp, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getgrent_r (struct group *result, char *buffer, size_t buflen)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getgrent_r (result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getgrnam_r (const char *name, struct group *grp,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  retval = yperr2nss (yp_match (domain, "group.byname", name,
++				strlen (name), &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_grent (p, grp, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getgrgid_r (gid_t gid, struct group *grp,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, nlen, parse_res;
++  char buf[32];
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  nlen = sprintf (buf, "%d", gid);
++
++  retval = yperr2nss (yp_match (domain, "group.bygid", buf,
++				nlen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_grent (p, grp, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,417 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <ctype.h>
++#include <netdb.h>
++#include <string.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <resolv.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get implementation for some internal functions. */
++#include "../../resolv/mapv4v6addr.h"
++#include "../../resolv/mapv4v6hostent.h"
++
++#define ENTNAME         hostent
++#define DATABASE        "hosts"
++#define NEED_H_ERRNO
++
++#define ENTDATA hostent_data
++struct hostent_data
++  {
++    unsigned char host_addr[16];	/* IPv4 or IPv6 address.  */
++    char *h_addr_ptrs[2];	/* Points to that and null terminator.  */
++  };
++
++#define TRAILING_LIST_MEMBER            h_aliases
++#define TRAILING_LIST_SEPARATOR_P       isspace
++#include "../nss_files/files-parse.c"
++LINE_PARSER
++("#",
++ {
++   char *addr;
++
++   STRING_FIELD (addr, isspace, 1);
++
++   /* Parse address.  */
++   if ((_res.options & RES_USE_INET6)
++       && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
++     {
++       result->h_addrtype = AF_INET6;
++       result->h_length = IN6ADDRSZ;
++     }
++   else
++     if (inet_pton (AF_INET, addr, entdata->host_addr) > 0)
++       {
++	 if (_res.options & RES_USE_INET6)
++	   {
++	     map_v4v6_address ((char *) entdata->host_addr,
++			       (char *) entdata->host_addr);
++	     result->h_addrtype = AF_INET6;
++	     result->h_length = IN6ADDRSZ;
++	   }
++	 else
++	   {
++	     result->h_addrtype = AF_INET;
++	     result->h_length = INADDRSZ;
++	   }
++       }
++     else
++       /* Illegal address: ignore line.  */
++       return 0;
++
++   /* Store a pointer to the address in the expected form.  */
++   entdata->h_addr_ptrs[0] = entdata->host_addr;
++   entdata->h_addr_ptrs[1] = NULL;
++   result->h_addr_list = entdata->h_addr_ptrs;
++
++   /* If we need the host entry in IPv6 form change it now.  */
++   if (_res.options & RES_USE_INET6)
++     {
++       char *bufptr = data->linebuffer;
++       size_t buflen = (char *) data + datalen - bufptr;
++       int ibuflen = buflen;	/* Use this for machines with size_t > int.  */
++       map_v4v6_hostent (result, &bufptr, &ibuflen);
++       buflen = ibuflen;
++     }
++
++   STRING_FIELD (result->h_name, isspace, 1);
++ }
++)
++
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++enum nss_status
++_nss_nis_sethostent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endhostent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_gethostent_r (struct hostent *host, char *buffer,
++			   size_t buflen, int *h_errnop)
++{
++  char *domain;
++  char *result;
++  int len, parse_res;
++  char *outkey;
++  int keylen;
++  struct parser_data *data = (void *) buffer;
++  size_t linebuflen = buffer + buflen - data->linebuffer;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  if (buflen < sizeof *data + 1)
++    {
++      __set_errno (ERANGE);
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++      char *p;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "hosts.byname",
++                                      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "hosts.byname",
++                                      oldkey, oldkeylen,
++                                      &outkey, &keylen, &result, &len));
++
++      if (retval != NSS_STATUS_SUCCESS)
++        {
++	  switch (retval)
++	    {
++	    case NSS_STATUS_TRYAGAIN:
++	      __set_errno (EAGAIN);
++	      *h_errnop = TRY_AGAIN;
++	      break;
++	    case NSS_STATUS_NOTFOUND:
++	      *h_errnop = HOST_NOT_FOUND;
++	      break;
++	    default:
++	      *h_errnop = NO_RECOVERY;
++	      break;
++	    }
++	  return retval;
++	}
++
++      if ((size_t) (len + 1) > linebuflen)
++        {
++          free (result);
++	  *h_errnop = NETDB_INTERNAL;
++          __set_errno (ERANGE);
++          return NSS_STATUS_TRYAGAIN;
++        }
++
++      p = strncpy (data->linebuffer, result, len);
++      data->linebuffer[len] = '\0';
++      while (isspace (*p))
++	++p;
++      free (result);
++
++      parse_res = parse_line (p, host, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++	{
++	  *h_errnop = NETDB_INTERNAL;;
++	  return NSS_STATUS_TRYAGAIN;
++	}
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  *h_errnop = NETDB_SUCCESS;
++  return NSS_STATUS_SUCCESS;
++}
++
++int
++_nss_nis_gethostent_r (struct hostent *host, char *buffer, size_t buflen,
++		       int *h_errnop)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_gethostent_r (host, buffer, buflen, h_errnop);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host,
++			  char *buffer, size_t buflen, int *h_errnop)
++{
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++  struct parser_data *data = (void *) buffer;
++  size_t linebuflen = buffer + buflen - data->linebuffer;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  if (buflen < sizeof *data + 1)
++    {
++      *h_errnop = NETDB_INTERNAL;
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  else
++    {
++      /* Convert name to lowercase.  */
++      size_t namelen = strlen (name);
++      char name2[namelen + 1];
++      int i;
++
++      for (i = 0; i < namelen; ++i)
++	name2[i] = tolower (name[i]);
++      name2[i] = '\0';
++
++      retval = yperr2nss (yp_match (domain, "hosts.byname", name2,
++				    namelen, &result, &len));
++
++    }
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++	{
++	  *h_errnop = TRY_AGAIN;
++	  __set_errno (EAGAIN);
++	}
++      if (retval == NSS_STATUS_NOTFOUND)
++	*h_errnop = HOST_NOT_FOUND;
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > linebuflen)
++    {
++      free (result);
++      *h_errnop = NETDB_INTERNAL;
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (data->linebuffer, result, len);
++  data->linebuffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = parse_line (p, host, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    {
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  if (parse_res == 0 || host->h_addrtype != af)
++    {
++      *h_errnop = HOST_NOT_FOUND;
++      return NSS_STATUS_NOTFOUND;
++    }
++
++  *h_errnop = NETDB_SUCCESS;
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_gethostbyname_r (const char *name, struct hostent *host,
++			  char *buffer, size_t buflen, int *h_errnop)
++{
++  if (_res.options & RES_USE_INET6)
++    {
++      enum nss_status status;
++
++      status = _nss_nis_gethostbyname2_r (name, AF_INET6, host, buffer, buflen,
++					  h_errnop);
++      if (status == NSS_STATUS_SUCCESS)
++	return status;
++    }
++
++  return _nss_nis_gethostbyname2_r (name, AF_INET, host, buffer, buflen,
++				    h_errnop);
++}
++
++enum nss_status
++_nss_nis_gethostbyaddr_r (char *addr, int addrlen, int type,
++			  struct hostent *host, char *buffer, size_t buflen,
++			  int *h_errnop)
++{
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++  char *buf;
++  struct parser_data *data = (void *) buffer;
++  size_t linebuflen = buffer + buflen - data->linebuffer;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  if (buflen < sizeof *data + 1)
++    {
++      __set_errno (ERANGE);
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  buf = inet_ntoa (*(struct in_addr *) addr);
++
++  retval = yperr2nss (yp_match (domain, "hosts.byaddr", buf,
++                                strlen (buf), &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++	{
++	  *h_errnop = TRY_AGAIN;
++	  __set_errno (EAGAIN);
++	}
++      if (retval == NSS_STATUS_NOTFOUND)
++	*h_errnop = HOST_NOT_FOUND;
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > linebuflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (data->linebuffer, result, len);
++  data->linebuffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = parse_line (p, host, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    {
++      *h_errnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++  else if (parse_res == 0)
++    {
++      *h_errnop = HOST_NOT_FOUND;
++      return NSS_STATUS_NOTFOUND;
++    }
++
++  *h_errnop = NETDB_SUCCESS;
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,128 @@
++/* Copyright (C) 1996 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <ctype.h>
++#include <errno.h>
++#include <bits/libc-lock.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <netgroup.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Locks the static variables in this file.  */
++__libc_lock_define_initialized (static, lock)
++
++static char *data = NULL;
++static size_t data_size = 0;
++static char *cursor = NULL;;
++
++extern enum nss_status
++_nss_netgroup_parseline (char **cursor, struct __netgrent *result,
++			 char *buffer, size_t buflen);
++
++enum nss_status
++_nss_nis_setnetgrent (char *group)
++{
++  char *domain;
++  char *result;
++  int len, group_len;
++  enum nss_status status;
++
++  status = NSS_STATUS_SUCCESS;
++
++  if (group[0] == '\0')
++    return NSS_STATUS_UNAVAIL;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  __libc_lock_lock (lock);
++
++  if (data != NULL)
++    {
++      free (data);
++      data = NULL;
++      data_size = 0;
++      cursor = NULL;
++    }
++
++  group_len = strlen (group);
++
++  status = yperr2nss (yp_match (domain, "netgroup", group, group_len,
++				&result, &len));
++  if (status == NSS_STATUS_SUCCESS)
++    {
++      if (len > 0)
++	{
++	  data = malloc (len + 1);
++	  data_size = len;
++	  cursor = strncpy (data, result, len + 1);
++	  data[len] = '\0';
++	  free (result);
++	}
++      else
++	status = NSS_STATUS_NOTFOUND;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++
++enum nss_status
++_nss_nis_endnetgrent (void)
++{
++  __libc_lock_lock (lock);
++
++  if (data != NULL)
++    {
++      free (data);
++      data = NULL;
++      data_size = 0;
++      cursor = NULL;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen)
++{
++  enum nss_status status;
++
++  if (cursor == NULL)
++    return NSS_STATUS_NOTFOUND;
++
++  __libc_lock_lock (lock);
++
++  status = _nss_netgroup_parseline (&cursor, result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-network.c glibc-2.1.3/glibc-compat/nss_nis/nis-network.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-network.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-network.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,318 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <netdb.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME netent
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++enum nss_status
++_nss_nis_setnetent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endnetent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
++			  int *herrnop)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain, *result, *outkey;
++  int len, keylen, parse_res;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++      char *p;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "networks.byname",
++                                      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "networks.byname",
++                                      oldkey, oldkeylen,
++                                      &outkey, &keylen, &result, &len));
++
++      if (retval != NSS_STATUS_SUCCESS)
++        {
++          if (retval == NSS_STATUS_TRYAGAIN)
++	    {
++	      *herrnop = NETDB_INTERNAL;
++	      __set_errno (EAGAIN);
++	    }
++          return retval;
++        }
++
++      if ((size_t) (len + 1) > buflen)
++        {
++          free (result);
++          __set_errno (ERANGE);
++	  *herrnop = NETDB_INTERNAL;
++          return NSS_STATUS_TRYAGAIN;
++        }
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++      while (isspace (*p))
++        ++p;
++      free (result);
++
++      parse_res = _nss_files_parse_netent (p, net, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++	{
++	  *herrnop = NETDB_INTERNAL;
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
++		      int *herrnop)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getnetent_r (net, buffer, buflen, herrnop);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getnetbyname_r (const char *name, struct netent *net,
++			 char *buffer, size_t buflen, int *herrnop)
++{
++  enum nss_status retval;
++  struct parser_data *data = (void *) buffer;
++  char *domain, *result, *p;
++  int len, parse_res;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      *herrnop = NETDB_INTERNAL;
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  if (buflen < sizeof *data + 1)
++    {
++      *herrnop = NETDB_INTERNAL;
++      __set_errno(ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++  else
++    {
++      /* Convert name to lowercase.  */
++      size_t namlen = strlen (name);
++      char name2[namlen + 1];
++      int i;
++
++      for (i = 0; i < namlen; ++i)
++	name2[i] = tolower (name[i]);
++      name2[i] = '\0';
++
++      retval = yperr2nss (yp_match (domain, "networks.byname", name2,
++				    namlen, &result, &len));
++    }
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++	{
++	  __set_errno (EAGAIN);
++	  *herrnop = NETDB_INTERNAL;
++	}
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      *herrnop = NETDB_INTERNAL;
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_netent (p, net, data, buflen);
++
++  if (parse_res <= 0)
++    {
++      *herrnop = NETDB_INTERNAL;
++      if (parse_res == -1 && errno == ERANGE)
++	return NSS_STATUS_TRYAGAIN;
++      else
++        return NSS_STATUS_NOTFOUND;
++    }
++  else
++    return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getnetbyaddr_r (unsigned long addr, int type, struct netent *net,
++			 char *buffer, size_t buflen, int *herrnop)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain;
++  char *result;
++  int len;
++  char buf[256];
++  int blen;
++  struct in_addr in;
++  char *p;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  in = inet_makeaddr (addr, 0);
++  strcpy (buf, inet_ntoa (in));
++  blen = strlen (buf);
++
++  while (1)
++    {
++      enum nss_status retval;
++      int parse_res;
++
++      retval = yperr2nss (yp_match (domain, "networks.byaddr", buf,
++				    strlen (buf), &result, &len));
++
++	if (retval != NSS_STATUS_SUCCESS)
++	  {
++	    if (retval == NSS_STATUS_NOTFOUND)
++	      {
++		if (buf[blen - 2] == '.' && buf[blen - 1] == '0')
++		  {
++		    /* Try again, but with trailing dot(s)
++		       removed (one by one) */
++		    buf[blen - 2] = '\0';
++		    blen -= 2;
++		    continue;
++		  }
++		else
++		  return NSS_STATUS_NOTFOUND;
++	      }
++	    else
++	      {
++		if (retval == NSS_STATUS_TRYAGAIN)
++		  __set_errno (EAGAIN);
++		return retval;
++	      }
++	  }
++
++      if ((size_t) (len + 1) > buflen)
++	{
++	  free (result);
++	  __set_errno (ERANGE);
++	  *herrnop = NETDB_INTERNAL;
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++        p = strncpy (buffer, result, len);
++	buffer[len] = '\0';
++	while (isspace (*p))
++	  ++p;
++	free (result);
++
++	parse_res = _nss_files_parse_netent (p, net, data, buflen);
++
++
++	if (parse_res <= 0)
++	  {
++	    *herrnop = NETDB_INTERNAL;
++	    if (parse_res == -1 && errno == ERANGE)
++	      return NSS_STATUS_TRYAGAIN;
++	    else
++	      return NSS_STATUS_NOTFOUND;
++	  }
++	else
++	  return NSS_STATUS_SUCCESS;
++    }
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,280 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <netdb.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME protoent
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++__libc_lock_define_initialized (static, lock)
++
++struct response
++{
++  char *val;
++  struct response *next;
++};
++
++static struct response *start = NULL;
++static struct response *next = NULL;
++
++static int
++saveit (int instatus, char *inkey, int inkeylen, char *inval,
++        int invallen, char *indata)
++{
++  if (instatus != YP_TRUE)
++    return instatus;
++
++  if (inkey && inkeylen > 0 && inval && invallen > 0)
++    {
++      if (start == NULL)
++        {
++          start = malloc (sizeof (struct response));
++          next = start;
++        }
++      else
++        {
++          next->next = malloc (sizeof (struct response));
++          next = next->next;
++        }
++      next->next = NULL;
++      next->val = malloc (invallen + 1);
++      strncpy (next->val, inval, invallen);
++      next->val[invallen] = '\0';
++    }
++
++  return 0;
++}
++
++enum nss_status
++internal_nis_setprotoent (void)
++{
++  char *domainname;
++  struct ypall_callback ypcb;
++  enum nss_status status;
++
++  yp_get_default_domain (&domainname);
++
++  while (start != NULL)
++    {
++      if (start->val != NULL)
++        free (start->val);
++      next = start;
++      start = start->next;
++      free (next);
++    }
++  start = NULL;
++
++  ypcb.foreach = saveit;
++  ypcb.data = NULL;
++  status = yperr2nss (yp_all (domainname, "protocols.bynumber", &ypcb));
++  next = start;
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_setprotoent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_setprotoent ();
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_endprotoent (void)
++{
++  __libc_lock_lock (lock);
++
++  while (start != NULL)
++    {
++      if (start->val != NULL)
++        free (start->val);
++      next = start;
++      start = start->next;
++      free (next);
++    }
++  start = NULL;
++  next = NULL;
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getprotoent_r (struct protoent *proto,
++			    char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  int parse_res;
++
++  if (start == NULL)
++    internal_nis_setprotoent ();
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      char *p;
++
++      if (next == NULL)
++        return NSS_STATUS_NOTFOUND;
++      p = strncpy (buffer, next->val, buflen);
++      next = next->next;
++
++      while (isspace (*p))
++        ++p;
++
++      parse_res = _nss_files_parse_protoent (p, proto, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getprotoent_r (struct protoent *proto, char *buffer, size_t buflen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getprotoent_r (proto, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getprotobyname_r (const char *name, struct protoent *proto,
++			   char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  retval = yperr2nss (yp_match (domain, "protocols.byname", name,
++                                strlen (name), &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_protoent (p, proto, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getprotobynumber_r (int number, struct protoent *proto,
++			     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, nlen, parse_res;
++  char buf[32];
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  nlen = sprintf (buf, "%d", number);
++
++  retval = yperr2nss (yp_match (domain, "protocols.bynumber", buf,
++                                nlen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_protoent (p, proto, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,407 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <pwd.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME pwent
++#define STRUCTURE passwd
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Protect global state against multiple changers */
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++enum nss_status
++_nss_nis_setpwent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endpwent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getpwent_r (struct passwd *pwd, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain;
++  int parse_res;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++      char *result, *outkey, *result2, *p;
++      int len, keylen, len2;
++      size_t namelen;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "passwd.byname",
++                                      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "passwd.byname",
++                                      oldkey, oldkeylen,
++                                      &outkey, &keylen, &result, &len));
++
++      if (retval != NSS_STATUS_SUCCESS)
++        {
++          if (retval == NSS_STATUS_TRYAGAIN)
++            __set_errno (EAGAIN);
++          return retval;
++        }
++
++      /* Check for adjunct style secret passwords.  They can be
++	 recognized by a password starting with "##".  */
++      p = strchr (result, ':');
++      if (p != NULL	/* This better should be true in all cases.  */
++	  && p[1] == '#' && p[2] == '#'
++	  && (namelen = p - result,
++	      yp_match (domain, "passwd.adjunct.byname", result, namelen,
++			&result2, &len2)) == YPERR_SUCCESS)
++	{
++	  /* We found a passwd.adjunct entry.  Merge encrypted
++	     password therein into original result.  */
++	  char *encrypted = strchr (result2, ':');
++	  char *endp, *tmp;
++	  size_t restlen;
++
++	  if (encrypted == NULL
++	      || (endp = strchr (++encrypted, ':')) == NULL
++	      || (p = strchr (p + 1, ':')) == NULL)
++	    {
++	      /* Invalid format of the entry.  This never should happen
++		 unless the data from which the NIS table is generated is
++		 wrong.  We simply ignore it.  */
++	      free (result2);
++	      goto non_adjunct;
++	    }
++
++	  restlen = len - (p - result);
++	  if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen)
++	    {
++	      free (result2);
++	      free (result);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  memcpy (buffer, result, namelen);
++	  tmp = buffer + namelen;
++	  *tmp++ = ':';
++	  memcpy (tmp, encrypted, endp - encrypted);
++	  tmp += endp - encrypted;
++	  memcpy (tmp, p, restlen + 1);
++	  p = buffer;
++
++	  free (result2);
++	}
++      else
++	{
++	non_adjunct:
++	  if ((size_t) (len + 1) > buflen)
++	    {
++	      free (result);
++	      __set_errno (ERANGE);
++	      return NSS_STATUS_TRYAGAIN;
++	    }
++
++	  p = strncpy (buffer, result, len);
++	  buffer[len] = '\0';
++	}
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++      while (isspace (*p))
++        ++p;
++      free (result);
++
++      parse_res = _nss_files_parse_pwent (p, pwd, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getpwent_r (struct passwd *result, char *buffer, size_t buflen)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getpwent_r (result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getpwnam_r (const char *name, struct passwd *pwd,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *result2, *p;
++  int len, len2, parse_res;
++  size_t namelen;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  namelen = strlen (name);
++
++  retval = yperr2nss (yp_match (domain, "passwd.byname", name,
++				namelen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  /* Check for adjunct style secret passwords.  They can be recognized
++     by a password starting with "##".  */
++  p = strchr (result, ':');
++  if (p != NULL	/* This better should be true in all cases.  */
++      && p[1] == '#' && p[2] == '#'
++      && (namelen = p - result,
++	  yp_match (domain, "passwd.adjunct.byname", name, namelen,
++		    &result2, &len2)) == YPERR_SUCCESS)
++    {
++      /* We found a passwd.adjunct entry.  Merge encrypted password
++	 therein into original result.  */
++      char *encrypted = strchr (result2, ':');
++      char *endp, *tmp;
++      size_t restlen;
++
++      if (encrypted == NULL
++	  || (endp = strchr (++encrypted, ':')) == NULL
++	  || (p = strchr (p + 1, ':')) == NULL)
++	{
++	  /* Invalid format of the entry.  This never should happen
++	     unless the data from which the NIS table is generated is
++	     wrong.  We simply ignore it.  */
++	  free (result2);
++	  goto non_adjunct;
++	}
++
++      restlen = len - (p - result);
++      if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen)
++	{
++	  free (result2);
++	  free (result);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      memcpy (buffer, name, namelen);
++      tmp = buffer + namelen;
++      *tmp++ = ':';
++      memcpy (tmp, encrypted, endp - encrypted);
++      tmp += endp - encrypted;
++      memcpy (tmp, p, restlen + 1);
++      p = buffer;
++
++      free (result2);
++    }
++  else
++    {
++    non_adjunct:
++      if ((size_t) (len + 1) > buflen)
++	{
++	  free (result);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++    }
++
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_pwent (p, pwd, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getpwuid_r (uid_t uid, struct passwd *pwd,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p, *result2;
++  int len, nlen, parse_res, len2;
++  char buf[32];
++  size_t namelen;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  nlen = sprintf (buf, "%d", uid);
++
++  retval = yperr2nss (yp_match (domain, "passwd.byuid", buf,
++				nlen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  /* Check for adjunct style secret passwords.  They can be recognized
++     by a password starting with "##".  */
++  p = strchr (result, ':');
++  if (p != NULL	/* This better should be true in all cases.  */
++      && p[1] == '#' && p[2] == '#'
++      && (namelen = p - result,
++	  yp_match (domain, "passwd.adjunct.byname", result, namelen,
++		    &result2, &len2)) == YPERR_SUCCESS)
++    {
++      /* We found a passwd.adjunct entry.  Merge encrypted password
++	 therein into original result.  */
++      char *encrypted = strchr (result2, ':');
++      char *endp, *tmp;
++      size_t restlen;
++
++      if (encrypted == NULL
++	  || (endp = strchr (++encrypted, ':')) == NULL
++	  || (p = strchr (p + 1, ':')) == NULL)
++	{
++	  /* Invalid format of the entry.  This never should happen
++	     unless the data from which the NIS table is generated is
++	     wrong.  We simply ignore it.  */
++	  free (result2);
++	  goto non_adjunct;
++	}
++
++      restlen = len - (p - result);
++      if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen)
++	{
++	  free (result2);
++	  free (result);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      memcpy (buffer, result, namelen);
++      tmp = buffer + namelen;
++      *tmp++ = ':';
++      memcpy (tmp, encrypted, endp - encrypted);
++      tmp += endp - encrypted;
++      memcpy (tmp, p, restlen + 1);
++      p = buffer;
++
++      free (result2);
++    }
++  else
++    {
++    non_adjunct:
++      if ((size_t) (len + 1) > buflen)
++	{
++	  free (result);
++	  __set_errno (ERANGE);
++	  return NSS_STATUS_TRYAGAIN;
++	}
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++    }
++
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_pwent (p, pwd, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,295 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <netdb.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME rpcent
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++__libc_lock_define_initialized (static, lock)
++
++struct response_t
++{
++  char *val;
++  struct response_t *next;
++};
++
++struct intern_t
++{
++  struct response_t *start;
++  struct response_t *next;
++};
++typedef struct intern_t intern_t;
++
++static intern_t intern = {NULL, NULL};
++
++static int
++saveit (int instatus, char *inkey, int inkeylen, char *inval,
++        int invallen, char *indata)
++{
++  intern_t *intern = (intern_t *)indata;
++
++  if (instatus != YP_TRUE)
++    return instatus;
++
++  if (inkey && inkeylen > 0 && inval && invallen > 0)
++    {
++      if (intern->start == NULL)
++        {
++          intern->start = malloc (sizeof (struct response_t));
++          intern->next = intern->start;
++        }
++      else
++        {
++          intern->next->next = malloc (sizeof (struct response_t));
++          intern->next = intern->next->next;
++        }
++      intern->next->next = NULL;
++      intern->next->val = malloc (invallen + 1);
++      strncpy (intern->next->val, inval, invallen);
++      intern->next->val[invallen] = '\0';
++    }
++
++  return 0;
++}
++
++static enum nss_status
++internal_nis_setrpcent (intern_t *intern)
++{
++  char *domainname;
++  struct ypall_callback ypcb;
++  enum nss_status status;
++
++  if (yp_get_default_domain (&domainname))
++    return NSS_STATUS_UNAVAIL;
++
++  while (intern->start != NULL)
++    {
++      if (intern->start->val != NULL)
++        free (intern->start->val);
++      intern->next = intern->start;
++      intern->start = intern->start->next;
++      free (intern->next);
++    }
++  intern->start = NULL;
++
++  ypcb.foreach = saveit;
++  ypcb.data = (char *)intern;
++  status = yperr2nss (yp_all(domainname, "rpc.bynumber", &ypcb));
++  intern->next = intern->start;
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_setrpcent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_setrpcent (&intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++static enum nss_status
++internal_nis_endrpcent (intern_t *intern)
++{
++  while (intern->start != NULL)
++    {
++      if (intern->start->val != NULL)
++        free (intern->start->val);
++      intern->next = intern->start;
++      intern->start = intern->start->next;
++      free (intern->next);
++    }
++  intern->start = NULL;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endrpcent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_endrpcent (&intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++static enum nss_status
++internal_nis_getrpcent_r (struct rpcent *rpc, char *buffer, size_t buflen,
++			  intern_t *data)
++{
++  struct parser_data *pdata = (void *) buffer;
++  int parse_res;
++  char *p;
++
++  if (data->start == NULL)
++    internal_nis_setrpcent (data);
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      if (data->next == NULL)
++        return NSS_STATUS_NOTFOUND;
++      p = strncpy (buffer, data->next->val, buflen);
++      data->next = data->next->next;
++      while (isspace (*p))
++        ++p;
++
++      parse_res = _nss_files_parse_rpcent (p, rpc, pdata, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++	return NSS_STATUS_TRYAGAIN;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getrpcent_r (struct rpcent *rpc, char *buffer, size_t buflen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getrpcent_r (rpc, buffer, buflen, &intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getrpcbyname_r (const char *name, struct rpcent *rpc,
++			 char *buffer, size_t buflen)
++{
++  intern_t data = {NULL, NULL};
++  enum nss_status status;
++  int found;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  status = internal_nis_setrpcent (&data);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  found = 0;
++  while (!found &&
++         ((status = internal_nis_getrpcent_r (rpc, buffer, buflen, &data))
++          == NSS_STATUS_SUCCESS))
++    {
++      if (strcmp (rpc->r_name, name) == 0)
++	found = 1;
++      else
++	{
++	  int i = 0;
++
++	  while (rpc->r_aliases[i] != NULL)
++	    {
++	      if (strcmp (rpc->r_aliases[i], name) == 0)
++		{
++		  found = 1;
++		  break;
++		}
++	      else
++		++i;
++	    }
++	}
++    }
++
++  internal_nis_endrpcent (&data);
++
++  if (!found && status == NSS_STATUS_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  else
++    return status;
++}
++
++enum nss_status
++_nss_nis_getrpcbynumber_r (int number, struct rpcent *rpc,
++			   char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, nlen, parse_res;
++  char buf[32];
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  nlen = sprintf (buf, "%d", number);
++
++  retval = yperr2nss (yp_match (domain, "rpc.bynumber", buf,
++				 nlen, &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++	__set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_rpcent (p, rpc, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-service.c glibc-2.1.3/glibc-compat/nss_nis/nis-service.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-service.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-service.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,280 @@
++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <netdb.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME servent
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++__libc_lock_define_initialized (static, lock)
++
++struct response_t
++{
++  char *val;
++  struct response_t *next;
++};
++
++struct intern_t
++{
++  struct response_t *start;
++  struct response_t *next;
++};
++typedef struct intern_t intern_t;
++
++static intern_t intern = { NULL, NULL };
++
++static int
++saveit (int instatus, char *inkey, int inkeylen, char *inval,
++        int invallen, char *indata)
++{
++  intern_t *intern = (intern_t *) indata;
++
++  if (instatus != YP_TRUE)
++    return instatus;
++
++  if (inkey && inkeylen > 0 && inval && invallen > 0)
++    {
++      if (intern->start == NULL)
++        {
++          intern->start = malloc (sizeof (struct response_t));
++          intern->next = intern->start;
++        }
++      else
++        {
++          intern->next->next = malloc (sizeof (struct response_t));
++          intern->next = intern->next->next;
++        }
++      intern->next->next = NULL;
++      intern->next->val = malloc (invallen + 1);
++      strncpy (intern->next->val, inval, invallen);
++      intern->next->val[invallen] = '\0';
++    }
++
++  return 0;
++}
++
++static enum nss_status
++internal_nis_setservent (intern_t *intern)
++{
++  char *domainname;
++  struct ypall_callback ypcb;
++  enum nss_status status;
++
++  if (yp_get_default_domain (&domainname))
++    return NSS_STATUS_UNAVAIL;
++
++  while (intern->start != NULL)
++    {
++      if (intern->start->val != NULL)
++        free (intern->start->val);
++      intern->next = intern->start;
++      intern->start = intern->start->next;
++      free (intern->next);
++    }
++  intern->start = NULL;
++
++  ypcb.foreach = saveit;
++  ypcb.data = (char *) intern;
++  status = yperr2nss (yp_all (domainname, "services.byname", &ypcb));
++  intern->next = intern->start;
++
++  return status;
++}
++enum nss_status
++_nss_nis_setservent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_setservent (&intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++static enum nss_status
++internal_nis_endservent (intern_t * intern)
++{
++  while (intern->start != NULL)
++    {
++      if (intern->start->val != NULL)
++        free (intern->start->val);
++      intern->next = intern->start;
++      intern->start = intern->start->next;
++      free (intern->next);
++    }
++  intern->start = NULL;
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endservent (void)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_endservent (&intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++static enum nss_status
++internal_nis_getservent_r (struct servent *serv, char *buffer,
++			   size_t buflen, intern_t *data)
++{
++  struct parser_data *pdata = (void *) buffer;
++  int parse_res;
++  char *p;
++
++  if (data->start == NULL)
++    internal_nis_setservent (data);
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      if (data->next == NULL)
++	return NSS_STATUS_NOTFOUND;
++      p = strncpy (buffer, data->next->val, buflen);
++      data->next = data->next->next;
++      while (isspace (*p))
++        ++p;
++
++      parse_res = _nss_files_parse_servent (p, serv, pdata, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getservent_r (struct servent *serv, char *buffer, size_t buflen)
++{
++  enum nss_status status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getservent_r (serv, buffer, buflen, &intern);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getservbyname_r (const char *name, char *protocol,
++			  struct servent *serv, char *buffer, size_t buflen)
++{
++  intern_t data = { NULL, NULL };
++  enum nss_status status;
++  int found;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  status = internal_nis_setservent (&data);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  found = 0;
++  while (!found &&
++         ((status = internal_nis_getservent_r (serv, buffer, buflen, &data))
++          == NSS_STATUS_SUCCESS))
++    {
++      if (protocol == NULL || strcmp (serv->s_proto, protocol) == 0)
++	{
++	  char **cp;
++
++	  if (strcmp (serv->s_name, name) == 0)
++	    found = 1;
++	  else
++	    for (cp = serv->s_aliases; *cp; cp++)
++	      if (strcmp (name, *cp) == 0)
++		found = 1;
++	}
++    }
++
++  internal_nis_endservent (&data);
++
++  if (!found && status == NSS_STATUS_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  else
++    return status;
++}
++
++enum nss_status
++_nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv,
++			  char *buffer, size_t buflen)
++{
++  intern_t data = { NULL, NULL };
++  enum nss_status status;
++  int found;
++
++  if (protocol == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  status = internal_nis_setservent (&data);
++  if (status != NSS_STATUS_SUCCESS)
++    return status;
++
++  found = 0;
++  while (!found &&
++         ((status = internal_nis_getservent_r (serv, buffer, buflen, &data))
++          == NSS_STATUS_SUCCESS))
++    {
++      if (htons (serv->s_port) == port)
++        {
++          if  (strcmp (serv->s_proto, protocol) == 0)
++            {
++              found = 1;
++            }
++        }
++    }
++
++  internal_nis_endservent (&data);
++
++  if (!found && status == NSS_STATUS_SUCCESS)
++    return NSS_STATUS_NOTFOUND;
++  else
++    return status;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c
+--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,201 @@
++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <nss.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++#include <shadow.h>
++#include <bits/libc-lock.h>
++#include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
++
++#include "nss-nis.h"
++
++/* Get the declaration of the parser function.  */
++#define ENTNAME spent
++#define STRUCTURE spwd
++#define EXTERN_PARSER
++#include "../nss_files/files-parse.c"
++
++/* Protect global state against multiple changers */
++__libc_lock_define_initialized (static, lock)
++
++static bool_t new_start = 1;
++static char *oldkey = NULL;
++static int oldkeylen = 0;
++
++enum nss_status
++_nss_nis_setspent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_endspent (void)
++{
++  __libc_lock_lock (lock);
++
++  new_start = 1;
++  if (oldkey != NULL)
++    {
++      free (oldkey);
++      oldkey = NULL;
++      oldkeylen = 0;
++    }
++
++  __libc_lock_unlock (lock);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++static enum nss_status
++internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  char *domain, *result, *outkey;
++  int len, keylen, parse_res;
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  /* Get the next entry until we found a correct one. */
++  do
++    {
++      enum nss_status retval;
++      char *p;
++
++      if (new_start)
++        retval = yperr2nss (yp_first (domain, "shadow.byname",
++                                      &outkey, &keylen, &result, &len));
++      else
++        retval = yperr2nss ( yp_next (domain, "shadow.byname",
++                                      oldkey, oldkeylen,
++                                      &outkey, &keylen, &result, &len));
++
++      if (retval != NSS_STATUS_SUCCESS)
++        {
++          if (retval == NSS_STATUS_TRYAGAIN)
++            __set_errno (EAGAIN);
++          return retval;
++        }
++
++      if ((size_t) (len + 1) > buflen)
++        {
++          free (result);
++          __set_errno (ERANGE);
++          return NSS_STATUS_TRYAGAIN;
++        }
++
++      p = strncpy (buffer, result, len);
++      buffer[len] = '\0';
++      while (isspace (*p))
++        ++p;
++      free (result);
++
++      parse_res = _nss_files_parse_spent (p, sp, data, buflen);
++      if (parse_res == -1 && errno == ERANGE)
++        return NSS_STATUS_TRYAGAIN;
++
++      free (oldkey);
++      oldkey = outkey;
++      oldkeylen = keylen;
++      new_start = 0;
++    }
++  while (!parse_res);
++
++  return NSS_STATUS_SUCCESS;
++}
++
++enum nss_status
++_nss_nis_getspent_r (struct spwd *result, char *buffer, size_t buflen)
++{
++  int status;
++
++  __libc_lock_lock (lock);
++
++  status = internal_nis_getspent_r (result, buffer, buflen);
++
++  __libc_lock_unlock (lock);
++
++  return status;
++}
++
++enum nss_status
++_nss_nis_getspnam_r (const char *name, struct spwd *sp,
++		     char *buffer, size_t buflen)
++{
++  struct parser_data *data = (void *) buffer;
++  enum nss_status retval;
++  char *domain, *result, *p;
++  int len, parse_res;
++
++  if (name == NULL)
++    {
++      __set_errno (EINVAL);
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  if (yp_get_default_domain (&domain))
++    return NSS_STATUS_UNAVAIL;
++
++  retval = yperr2nss (yp_match (domain, "shadow.byname", name,
++				strlen (name), &result, &len));
++
++  if (retval != NSS_STATUS_SUCCESS)
++    {
++      if (retval == NSS_STATUS_TRYAGAIN)
++        __set_errno (EAGAIN);
++      return retval;
++    }
++
++  if ((size_t) (len + 1) > buflen)
++    {
++      free (result);
++      __set_errno (ERANGE);
++      return NSS_STATUS_TRYAGAIN;
++    }
++
++  p = strncpy (buffer, result, len);
++  buffer[len] = '\0';
++  while (isspace (*p))
++    ++p;
++  free (result);
++
++  parse_res = _nss_files_parse_spent (p, sp, data, buflen);
++
++  if (parse_res == -1 && errno == ERANGE)
++    return NSS_STATUS_TRYAGAIN;
++  else if (parse_res == 0)
++    return NSS_STATUS_NOTFOUND;
++
++  return NSS_STATUS_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/glibc-compat/oldfileops.c glibc-2.1.3/glibc-compat/oldfileops.c
+--- ../glibc-2.1.3/glibc-compat/oldfileops.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldfileops.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,774 @@
++/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++   Written by Per Bothner <bothner@cygnus.com>.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++/* This is a compatibility file.  If we don't build the libc with
++   versioning don't compile this file.  */
++
++#ifndef _POSIX_SOURCE
++# define _POSIX_SOURCE
++#endif
++#define _IO_USE_OLD_IO_FILE
++#include "libioP.h"
++#include <fcntl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <string.h>
++#include <errno.h>
++#ifndef errno
++extern int errno;
++#endif
++#ifndef __set_errno
++# define __set_errno(Val) errno = (Val)
++#endif
++
++
++#ifdef _LIBC
++# define open(Name, Flags, Prot) __open (Name, Flags, Prot)
++# define close(FD) __close (FD)
++# define lseek(FD, Offset, Whence) __lseek (FD, Offset, Whence)
++# define read(FD, Buf, NBytes) __read (FD, Buf, NBytes)
++# define write(FD, Buf, NBytes) __write (FD, Buf, NBytes)
++#endif
++
++/* An fstream can be in at most one of put mode, get mode, or putback mode.
++   Putback mode is a variant of get mode.
++
++   In a filebuf, there is only one current position, instead of two
++   separate get and put pointers.  In get mode, the current position
++   is that of gptr(); in put mode that of pptr().
++
++   The position in the buffer that corresponds to the position
++   in external file system is normally _IO_read_end, except in putback
++   mode, when it is _IO_save_end.
++   If the field _fb._offset is >= 0, it gives the offset in
++   the file as a whole corresponding to eGptr(). (?)
++
++   PUT MODE:
++   If a filebuf is in put mode, then all of _IO_read_ptr, _IO_read_end,
++   and _IO_read_base are equal to each other.  These are usually equal
++   to _IO_buf_base, though not necessarily if we have switched from
++   get mode to put mode.  (The reason is to maintain the invariant
++   that _IO_read_end corresponds to the external file position.)
++   _IO_write_base is non-NULL and usually equal to _IO_base_base.
++   We also have _IO_write_end == _IO_buf_end, but only in fully buffered mode.
++   The un-flushed character are those between _IO_write_base and _IO_write_ptr.
++
++   GET MODE:
++   If a filebuf is in get or putback mode, eback() != egptr().
++   In get mode, the unread characters are between gptr() and egptr().
++   The OS file position corresponds to that of egptr().
++
++   PUTBACK MODE:
++   Putback mode is used to remember "excess" characters that have
++   been sputbackc'd in a separate putback buffer.
++   In putback mode, the get buffer points to the special putback buffer.
++   The unread characters are the characters between gptr() and egptr()
++   in the putback buffer, as well as the area between save_gptr()
++   and save_egptr(), which point into the original reserve buffer.
++   (The pointers save_gptr() and save_egptr() are the values
++   of gptr() and egptr() at the time putback mode was entered.)
++   The OS position corresponds to that of save_egptr().
++
++   LINE BUFFERED OUTPUT:
++   During line buffered output, _IO_write_base==base() && epptr()==base().
++   However, ptr() may be anywhere between base() and ebuf().
++   This forces a call to filebuf::overflow(int C) on every put.
++   If there is more space in the buffer, and C is not a '\n',
++   then C is inserted, and pptr() incremented.
++
++   UNBUFFERED STREAMS:
++   If a filebuf is unbuffered(), the _shortbuf[1] is used as the buffer.
++*/
++
++#define CLOSED_FILEBUF_FLAGS \
++  (_IO_IS_FILEBUF+_IO_NO_READS+_IO_NO_WRITES+_IO_TIED_PUT_GET)
++
++
++void
++_IO_old_file_init (fp)
++     _IO_FILE *fp;
++{
++  /* POSIX.1 allows another file handle to be used to change the position
++     of our file descriptor.  Hence we actually don't know the actual
++     position before we do the first fseek (and until a following fflush). */
++  fp->_old_offset = _IO_pos_BAD;
++  fp->_IO_file_flags |= CLOSED_FILEBUF_FLAGS;
++
++  _IO_link_in(fp);
++  fp->_vtable_offset = ((int) sizeof (struct _IO_FILE)
++			- (int) sizeof (struct _IO_FILE_complete));
++  fp->_fileno = -1;
++}
++
++int
++_IO_old_file_close_it (fp)
++     _IO_FILE *fp;
++{
++  int write_status, close_status;
++  if (!_IO_file_is_open (fp))
++    return EOF;
++
++  write_status = _IO_old_do_flush (fp);
++
++  _IO_unsave_markers(fp);
++
++  close_status = _IO_SYSCLOSE (fp);
++
++  /* Free buffer. */
++  _IO_setb (fp, NULL, NULL, 0);
++  _IO_setg (fp, NULL, NULL, NULL);
++  _IO_setp (fp, NULL, NULL);
++
++  _IO_un_link (fp);
++  fp->_flags = _IO_MAGIC|CLOSED_FILEBUF_FLAGS;
++  fp->_fileno = EOF;
++  fp->_old_offset = _IO_pos_BAD;
++
++  return close_status ? close_status : write_status;
++}
++
++void
++_IO_old_file_finish (fp, dummy)
++     _IO_FILE *fp;
++     int dummy;
++{
++  if (_IO_file_is_open (fp))
++    {
++      _IO_old_do_flush (fp);
++      if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
++	_IO_SYSCLOSE (fp);
++    }
++  _IO_default_finish (fp, 0);
++}
++
++_IO_FILE *
++_IO_old_file_fopen (fp, filename, mode)
++     _IO_FILE *fp;
++     const char *filename;
++     const char *mode;
++{
++  int oflags = 0, omode;
++  int read_write, fdesc;
++  int oprot = 0666;
++  if (_IO_file_is_open (fp))
++    return 0;
++  switch (*mode++)
++    {
++    case 'r':
++      omode = O_RDONLY;
++      read_write = _IO_NO_WRITES;
++      break;
++    case 'w':
++      omode = O_WRONLY;
++      oflags = O_CREAT|O_TRUNC;
++      read_write = _IO_NO_READS;
++      break;
++    case 'a':
++      omode = O_WRONLY;
++      oflags = O_CREAT|O_APPEND;
++      read_write = _IO_NO_READS|_IO_IS_APPENDING;
++      break;
++    default:
++      __set_errno (EINVAL);
++      return NULL;
++    }
++  if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
++    {
++      omode = O_RDWR;
++      read_write &= _IO_IS_APPENDING;
++    }
++  fdesc = open (filename, omode|oflags, oprot);
++  if (fdesc < 0)
++    return NULL;
++  fp->_fileno = fdesc;
++  _IO_mask_flags (fp, read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
++  if (read_write & _IO_IS_APPENDING)
++    if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_end, _IOS_INPUT|_IOS_OUTPUT)
++	== _IO_pos_BAD && errno != ESPIPE)
++      return NULL;
++  _IO_link_in (fp);
++  return fp;
++}
++
++_IO_FILE *
++_IO_old_file_attach (fp, fd)
++     _IO_FILE *fp;
++     int fd;
++{
++  if (_IO_file_is_open (fp))
++    return NULL;
++  fp->_fileno = fd;
++  fp->_flags &= ~(_IO_NO_READS+_IO_NO_WRITES);
++  fp->_flags |= _IO_DELETE_DONT_CLOSE;
++  /* Get the current position of the file. */
++  /* We have to do that since that may be junk. */
++  fp->_old_offset = _IO_pos_BAD;
++  if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT)
++      == _IO_pos_BAD && errno != ESPIPE)
++    return NULL;
++  return fp;
++}
++
++_IO_FILE *
++_IO_old_file_setbuf (fp, p, len)
++     _IO_FILE *fp;
++     char *p;
++     _IO_ssize_t len;
++{
++    if (_IO_default_setbuf (fp, p, len) == NULL)
++      return NULL;
++
++    fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end
++      = fp->_IO_buf_base;
++    _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
++
++    return fp;
++}
++
++static int old_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
++
++/* Write TO_DO bytes from DATA to FP.
++   Then mark FP as having empty buffers. */
++
++int
++_IO_old_do_write (fp, data, to_do)
++     _IO_FILE *fp;
++     const char *data;
++     _IO_size_t to_do;
++{
++  return (to_do == 0 || old_do_write (fp, data, to_do) == to_do)
++	 ? 0 : EOF;
++}
++
++static
++int
++old_do_write (fp, data, to_do)
++     _IO_FILE *fp;
++     const char *data;
++     _IO_size_t to_do;
++{
++  _IO_size_t count;
++  if (fp->_flags & _IO_IS_APPENDING)
++    /* On a system without a proper O_APPEND implementation,
++       you would need to sys_seek(0, SEEK_END) here, but is
++       is not needed nor desirable for Unix- or Posix-like systems.
++       Instead, just indicate that offset (before and after) is
++       unpredictable. */
++    fp->_old_offset = _IO_pos_BAD;
++  else if (fp->_IO_read_end != fp->_IO_write_base)
++    {
++      _IO_pos_t new_pos
++	= _IO_SYSSEEK (fp, fp->_IO_write_base - fp->_IO_read_end, 1);
++      if (new_pos == _IO_pos_BAD)
++	return 0;
++      fp->_old_offset = new_pos;
++    }
++  count = _IO_SYSWRITE (fp, data, to_do);
++  if (fp->_cur_column && count)
++    fp->_cur_column = _IO_adjust_column (fp->_cur_column - 1, data, count) + 1;
++  _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
++  fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_buf_base;
++  fp->_IO_write_end = ((fp->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED))
++		       ? fp->_IO_buf_base : fp->_IO_buf_end);
++  return count;
++}
++
++int
++_IO_old_file_underflow (fp)
++     _IO_FILE *fp;
++{
++  _IO_ssize_t count;
++#if 0
++  /* SysV does not make this test; take it out for compatibility */
++  if (fp->_flags & _IO_EOF_SEEN)
++    return (EOF);
++#endif
++
++  if (fp->_flags & _IO_NO_READS)
++    {
++      __set_errno (EBADF);
++      return EOF;
++    }
++  if (fp->_IO_read_ptr < fp->_IO_read_end)
++    return *(unsigned char *) fp->_IO_read_ptr;
++
++  if (fp->_IO_buf_base == NULL)
++    _IO_doallocbuf (fp);
++
++  /* Flush all line buffered files before reading. */
++  /* FIXME This can/should be moved to genops ?? */
++  if (fp->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED))
++    _IO_flush_all_linebuffered ();
++
++  _IO_switch_to_get_mode (fp);
++
++  /* This is very tricky. We have to adjust those
++     pointers before we call _IO_SYSREAD () since
++     we may longjump () out while waiting for
++     input. Those pointers may be screwed up. H.J. */
++  fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_buf_base;
++  fp->_IO_read_end = fp->_IO_buf_base;
++  fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end
++    = fp->_IO_buf_base;
++
++  count = _IO_SYSREAD (fp, fp->_IO_buf_base,
++		       fp->_IO_buf_end - fp->_IO_buf_base);
++  if (count <= 0)
++    {
++      if (count == 0)
++	fp->_flags |= _IO_EOF_SEEN;
++      else
++	fp->_flags |= _IO_ERR_SEEN, count = 0;
++  }
++  fp->_IO_read_end += count;
++  if (count == 0)
++    return EOF;
++  if (fp->_old_offset != _IO_pos_BAD)
++    _IO_pos_adjust (fp->_old_offset, count);
++  return *(unsigned char *) fp->_IO_read_ptr;
++}
++
++int
++_IO_old_file_overflow (f, ch)
++      _IO_FILE *f;
++      int ch;
++{
++  if (f->_flags & _IO_NO_WRITES) /* SET ERROR */
++    {
++      f->_flags |= _IO_ERR_SEEN;
++      __set_errno (EBADF);
++      return EOF;
++    }
++  /* If currently reading or no buffer allocated. */
++  if ((f->_flags & _IO_CURRENTLY_PUTTING) == 0)
++    {
++      /* Allocate a buffer if needed. */
++      if (f->_IO_write_base == 0)
++	{
++	  _IO_doallocbuf (f);
++	  _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base);
++	}
++      /* Otherwise must be currently reading.
++	 If _IO_read_ptr (and hence also _IO_read_end) is at the buffer end,
++	 logically slide the buffer forwards one block (by setting the
++	 read pointers to all point at the beginning of the block).  This
++	 makes room for subsequent output.
++	 Otherwise, set the read pointers to _IO_read_end (leaving that
++	 alone, so it can continue to correspond to the external position). */
++      if (f->_IO_read_ptr == f->_IO_buf_end)
++	f->_IO_read_end = f->_IO_read_ptr = f->_IO_buf_base;
++      f->_IO_write_ptr = f->_IO_read_ptr;
++      f->_IO_write_base = f->_IO_write_ptr;
++      f->_IO_write_end = f->_IO_buf_end;
++      f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end;
++
++      if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED))
++	f->_IO_write_end = f->_IO_write_ptr;
++      f->_flags |= _IO_CURRENTLY_PUTTING;
++    }
++  if (ch == EOF)
++    return _IO_old_do_flush (f);
++  if (f->_IO_write_ptr == f->_IO_buf_end ) /* Buffer is really full */
++    if (_IO_old_do_flush (f) == EOF)
++      return EOF;
++  *f->_IO_write_ptr++ = ch;
++  if ((f->_flags & _IO_UNBUFFERED)
++      || ((f->_flags & _IO_LINE_BUF) && ch == '\n'))
++    if (_IO_old_do_flush (f) == EOF)
++      return EOF;
++  return (unsigned char) ch;
++}
++
++int
++_IO_old_file_sync (fp)
++     _IO_FILE *fp;
++{
++  _IO_size_t delta;
++  int retval = 0;
++
++  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
++  _IO_flockfile (fp);
++  /*    char* ptr = cur_ptr(); */
++  if (fp->_IO_write_ptr > fp->_IO_write_base)
++    if (_IO_old_do_flush(fp)) return EOF;
++  delta = fp->_IO_read_ptr - fp->_IO_read_end;
++  if (delta != 0)
++    {
++#ifdef TODO
++      if (_IO_in_backup (fp))
++	delta -= eGptr () - Gbase ();
++#endif
++      _IO_off_t new_pos = _IO_SYSSEEK (fp, delta, 1);
++      if (new_pos != (_IO_off_t) EOF)
++	fp->_IO_read_end = fp->_IO_read_ptr;
++#ifdef ESPIPE
++      else if (errno == ESPIPE)
++	; /* Ignore error from unseekable devices. */
++#endif
++      else
++	retval = EOF;
++    }
++  if (retval != EOF)
++    fp->_old_offset = _IO_pos_BAD;
++  /* FIXME: Cleanup - can this be shared? */
++  /*    setg(base(), ptr, ptr); */
++  _IO_funlockfile (fp);
++  _IO_cleanup_region_end (0);
++  return retval;
++}
++
++_IO_fpos64_t
++_IO_old_file_seekoff (fp, offset, dir, mode)
++     _IO_FILE *fp;
++     _IO_off64_t offset;
++     int dir;
++     int mode;
++{
++  _IO_pos_t result;
++  _IO_off64_t delta, new_offset;
++  long count;
++  /* POSIX.1 8.2.3.7 says that after a call the fflush() the file
++     offset of the underlying file must be exact.  */
++  int must_be_exact = (fp->_IO_read_base == fp->_IO_read_end
++		       && fp->_IO_write_base == fp->_IO_write_ptr);
++
++  if (mode == 0)
++    dir = _IO_seek_cur, offset = 0; /* Don't move any pointers. */
++
++  /* Flush unwritten characters.
++     (This may do an unneeded write if we seek within the buffer.
++     But to be able to switch to reading, we would need to set
++     egptr to ptr.  That can't be done in the current design,
++     which assumes file_ptr() is eGptr.  Anyway, since we probably
++     end up flushing when we close(), it doesn't make much difference.)
++     FIXME: simulate mem-papped files. */
++
++  if (fp->_IO_write_ptr > fp->_IO_write_base || _IO_in_put_mode (fp))
++    if (_IO_switch_to_get_mode (fp))
++      return EOF;
++
++  if (fp->_IO_buf_base == NULL)
++    {
++      _IO_doallocbuf (fp);
++      _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
++      _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
++    }
++
++  switch (dir)
++    {
++    case _IO_seek_cur:
++      /* Adjust for read-ahead (bytes is buffer). */
++      offset -= fp->_IO_read_end - fp->_IO_read_ptr;
++      if (fp->_old_offset == _IO_pos_BAD)
++	goto dumb;
++      /* Make offset absolute, assuming current pointer is file_ptr(). */
++      offset += _IO_pos_as_off (fp->_old_offset);
++
++      dir = _IO_seek_set;
++      break;
++    case _IO_seek_set:
++      break;
++    case _IO_seek_end:
++      {
++	struct _G_stat64 st;
++	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))
++	  {
++	    offset += st.st_size;
++	    dir = _IO_seek_set;
++	  }
++	else
++	  goto dumb;
++      }
++    }
++  /* At this point, dir==_IO_seek_set. */
++
++  /* If destination is within current buffer, optimize: */
++  if (fp->_old_offset != _IO_pos_BAD && fp->_IO_read_base != NULL
++      && !_IO_in_backup (fp))
++    {
++      /* Offset relative to start of main get area. */
++      _IO_pos_t rel_offset = (offset - fp->_old_offset
++			      + (fp->_IO_read_end - fp->_IO_read_base));
++      if (rel_offset >= 0)
++	{
++#if 0
++	  if (_IO_in_backup (fp))
++	    _IO_switch_to_main_get_area (fp);
++#endif
++	  if (rel_offset <= fp->_IO_read_end - fp->_IO_read_base)
++	    {
++	      _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + rel_offset,
++			fp->_IO_read_end);
++	      _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
++	      goto resync;
++	    }
++#ifdef TODO
++	    /* If we have streammarkers, seek forward by reading ahead. */
++	    if (_IO_have_markers (fp))
++	      {
++		int to_skip = rel_offset
++		  - (fp->_IO_read_ptr - fp->_IO_read_base);
++		if (ignore (to_skip) != to_skip)
++		  goto dumb;
++		goto resync;
++	      }
++#endif
++	}
++#ifdef TODO
++      if (rel_offset < 0 && rel_offset >= Bbase () - Bptr ())
++	{
++	  if (!_IO_in_backup (fp))
++	    _IO_switch_to_backup_area (fp);
++	  gbump (fp->_IO_read_end + rel_offset - fp->_IO_read_ptr);
++	  goto resync;
++	}
++#endif
++    }
++
++#ifdef TODO
++  _IO_unsave_markers (fp);
++#endif
++
++  if (fp->_flags & _IO_NO_READS)
++    goto dumb;
++
++  /* Try to seek to a block boundary, to improve kernel page management. */
++  new_offset = offset & ~(fp->_IO_buf_end - fp->_IO_buf_base - 1);
++  delta = offset - new_offset;
++  if (delta > fp->_IO_buf_end - fp->_IO_buf_base)
++    {
++      new_offset = offset;
++      delta = 0;
++    }
++  result = _IO_SYSSEEK (fp, new_offset, 0);
++  if (result < 0)
++    return EOF;
++  if (delta == 0)
++    count = 0;
++  else
++    {
++      count = _IO_SYSREAD (fp, fp->_IO_buf_base,
++			   (must_be_exact
++			    ? delta : fp->_IO_buf_end - fp->_IO_buf_base));
++      if (count < delta)
++	{
++	  /* We weren't allowed to read, but try to seek the remainder. */
++	  offset = count == EOF ? delta : delta-count;
++	  dir = _IO_seek_cur;
++	  goto dumb;
++	}
++    }
++  _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + delta,
++	    fp->_IO_buf_base + count);
++  _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
++  fp->_old_offset = result + count;
++  _IO_mask_flags (fp, 0, _IO_EOF_SEEN);
++  return offset;
++ dumb:
++
++  _IO_unsave_markers (fp);
++  result = _IO_SYSSEEK (fp, offset, dir);
++  if (result != EOF)
++    {
++      _IO_mask_flags (fp, 0, _IO_EOF_SEEN);
++      fp->_old_offset = result;
++      _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
++      _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
++    }
++  return result;
++
++resync:
++  /* We need to do it since it is possible that the file offset in
++     the kernel may be changed behind our back. It may happen when
++     we fopen a file and then do a fork. One process may access the
++     the file and the kernel file offset will be changed. */
++  if (fp->_old_offset >= 0)
++    _IO_SYSSEEK (fp, fp->_old_offset, 0);
++
++  return offset;
++}
++
++_IO_ssize_t
++_IO_old_file_write (f, data, n)
++     _IO_FILE *f;
++     const void *data;
++     _IO_ssize_t n;
++{
++  _IO_ssize_t to_do = n;
++  while (to_do > 0)
++    {
++      _IO_ssize_t count = write (f->_fileno, data, to_do);
++      if (count == EOF)
++	{
++	  f->_flags |= _IO_ERR_SEEN;
++	  break;
++        }
++      to_do -= count;
++      data = (void *) ((char *) data + count);
++    }
++  n -= to_do;
++  if (f->_old_offset >= 0)
++    f->_old_offset += n;
++  return n;
++}
++
++_IO_size_t
++_IO_old_file_xsputn (f, data, n)
++     _IO_FILE *f;
++     const void *data;
++     _IO_size_t n;
++{
++  register const char *s = (char *) data;
++  _IO_size_t to_do = n;
++  int must_flush = 0;
++  _IO_size_t count;
++
++  if (n <= 0)
++    return 0;
++  /* This is an optimized implementation.
++     If the amount to be written straddles a block boundary
++     (or the filebuf is unbuffered), use sys_write directly. */
++
++  /* First figure out how much space is available in the buffer. */
++  count = f->_IO_write_end - f->_IO_write_ptr; /* Space available. */
++  if ((f->_flags & _IO_LINE_BUF) && (f->_flags & _IO_CURRENTLY_PUTTING))
++    {
++      count = f->_IO_buf_end - f->_IO_write_ptr;
++      if (count >= n)
++	{
++	  register const char *p;
++	  for (p = s + n; p > s; )
++	    {
++	      if (*--p == '\n')
++		{
++		  count = p - s + 1;
++		  must_flush = 1;
++		  break;
++		}
++	    }
++	}
++    }
++  /* Then fill the buffer. */
++  if (count > 0)
++    {
++      if (count > to_do)
++	count = to_do;
++      if (count > 20)
++	{
++	  memcpy (f->_IO_write_ptr, s, count);
++	  s += count;
++	}
++      else
++	{
++	  register char *p = f->_IO_write_ptr;
++	  register int i = (int) count;
++	  while (--i >= 0)
++	    *p++ = *s++;
++	}
++      f->_IO_write_ptr += count;
++      to_do -= count;
++    }
++  if (to_do + must_flush > 0)
++    {
++      _IO_size_t block_size, do_write;
++      /* Next flush the (full) buffer. */
++      if (__overflow (f, EOF) == EOF)
++	return n - to_do;
++
++      /* Try to maintain alignment: write a whole number of blocks.
++	 dont_write is what gets left over. */
++      block_size = f->_IO_buf_end - f->_IO_buf_base;
++      do_write = to_do - (block_size >= 128 ? to_do % block_size : 0);
++
++      if (do_write)
++        {
++	  count = old_do_write (f, s, do_write);
++	  to_do -= count;
++	  if (count < do_write)
++	    return n - to_do;
++        }
++
++      /* Now write out the remainder.  Normally, this will fit in the
++	 buffer, but it's somewhat messier for line-buffered files,
++	 so we let _IO_default_xsputn handle the general case. */
++      if (to_do)
++	to_do -= _IO_default_xsputn (f, s+do_write, to_do);
++    }
++  return n - to_do;
++}
++
++
++struct _IO_jump_t _IO_old_file_jumps =
++{
++  JUMP_INIT_DUMMY,
++  JUMP_INIT(finish, _IO_old_file_finish),
++  JUMP_INIT(overflow, _IO_old_file_overflow),
++  JUMP_INIT(underflow, _IO_old_file_underflow),
++  JUMP_INIT(uflow, _IO_default_uflow),
++  JUMP_INIT(pbackfail, _IO_default_pbackfail),
++  JUMP_INIT(xsputn, _IO_old_file_xsputn),
++  JUMP_INIT(xsgetn, _IO_default_xsgetn),
++  JUMP_INIT(seekoff, _IO_old_file_seekoff),
++  JUMP_INIT(seekpos, _IO_default_seekpos),
++  JUMP_INIT(setbuf, _IO_old_file_setbuf),
++  JUMP_INIT(sync, _IO_old_file_sync),
++  JUMP_INIT(doallocate, _IO_file_doallocate),
++  JUMP_INIT(read, _IO_file_read),
++  JUMP_INIT(write, _IO_old_file_write),
++  JUMP_INIT(seek, _IO_file_seek),
++  JUMP_INIT(close, _IO_file_close),
++  JUMP_INIT(stat, _IO_file_stat)
++};
++
++#ifdef SHARED
++symbol_version (_IO_old_do_write, _IO_do_write, GLIBC_2.0);
++symbol_version (_IO_old_file_attach, _IO_file_attach, GLIBC_2.0);
++symbol_version (_IO_old_file_close_it, _IO_file_close_it, GLIBC_2.0);
++symbol_version (_IO_old_file_finish, _IO_file_finish, GLIBC_2.0);
++symbol_version (_IO_old_file_fopen, _IO_file_fopen, GLIBC_2.0);
++symbol_version (_IO_old_file_init, _IO_file_init, GLIBC_2.0);
++symbol_version (_IO_old_file_setbuf, _IO_file_setbuf, GLIBC_2.0);
++symbol_version (_IO_old_file_sync, _IO_file_sync, GLIBC_2.0);
++symbol_version (_IO_old_file_overflow, _IO_file_overflow, GLIBC_2.0);
++symbol_version (_IO_old_file_seekoff, _IO_file_seekoff, GLIBC_2.0);
++symbol_version (_IO_old_file_underflow, _IO_file_underflow, GLIBC_2.0);
++symbol_version (_IO_old_file_write, _IO_file_write, GLIBC_2.0);
++symbol_version (_IO_old_file_xsputn, _IO_file_xsputn, GLIBC_2.0);
++#else
++strong_alias (_IO_old_do_write, _IO_do_write);
++strong_alias (_IO_old_file_attach, _IO_file_attach);
++strong_alias (_IO_old_file_close_it, _IO_file_close_it);
++strong_alias (_IO_old_file_finish, _IO_file_finish);
++strong_alias (_IO_old_file_fopen, _IO_file_fopen);
++strong_alias (_IO_old_file_init, _IO_file_init);
++strong_alias (_IO_old_file_setbuf, _IO_file_setbuf);
++strong_alias (_IO_old_file_sync, _IO_file_sync);
++strong_alias (_IO_old_file_overflow, _IO_file_overflow);
++strong_alias (_IO_old_file_seekoff, _IO_file_seekoff);
++strong_alias (_IO_old_file_underflow, _IO_file_underflow);
++strong_alias (_IO_old_file_write, _IO_file_write);
++strong_alias (_IO_old_file_xsputn, _IO_file_xsputn);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldiofclose.c glibc-2.1.3/glibc-compat/oldiofclose.c
+--- ../glibc-2.1.3/glibc-compat/oldiofclose.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldiofclose.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,60 @@
++/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++#define _IO_USE_OLD_IO_FILE
++#include "libioP.h"
++#ifdef __STDC__
++#include <stdlib.h>
++#endif
++
++int
++_IO_old_fclose (fp)
++     _IO_FILE *fp;
++{
++  int status;
++
++  CHECK_FILE(fp, EOF);
++
++  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
++  _IO_flockfile (fp);
++  if (fp->_IO_file_flags & _IO_IS_FILEBUF)
++    status = _IO_old_file_close_it (fp);
++  else
++    status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
++  _IO_FINISH (fp);
++  _IO_funlockfile (fp);
++  _IO_cleanup_region_end (0);
++  if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr)
++    {
++      fp->_IO_file_flags = 0;
++      free(fp);
++    }
++
++  return status;
++}
++
++strong_alias (_IO_old_fclose, __old_fclose)
++symbol_version (_IO_old_fclose, _IO_fclose, GLIBC_2.0);
++symbol_version (__old_fclose, fclose, GLIBC_2.0);
+diff -Naur ../glibc-2.1.3/glibc-compat/oldiofdopen.c glibc-2.1.3/glibc-compat/oldiofdopen.c
+--- ../glibc-2.1.3/glibc-compat/oldiofdopen.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldiofdopen.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,140 @@
++/* Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++#define _IO_USE_OLD_IO_FILE
++#ifdef __STDC__
++# include <stdlib.h>
++#endif
++#include "libioP.h"
++#include <fcntl.h>
++
++#ifndef _IO_fcntl
++# define _IO_fcntl __fcntl
++#endif
++
++_IO_FILE *
++_IO_old_fdopen (fd, mode)
++     int fd;
++     const char *mode;
++{
++  int read_write;
++  int posix_mode = 0;
++  struct locked_FILE
++  {
++    struct _IO_FILE_plus fp;
++#ifdef _IO_MTSAFE_IO
++    _IO_lock_t lock;
++#endif
++  } *new_f;
++  int fd_flags;
++
++  switch (*mode++)
++    {
++    case 'r':
++      read_write = _IO_NO_WRITES;
++      break;
++    case 'w':
++      read_write = _IO_NO_READS;
++      break;
++    case 'a':
++      posix_mode = O_APPEND;
++      read_write = _IO_NO_READS|_IO_IS_APPENDING;
++      break;
++    default:
++      MAYBE_SET_EINVAL;
++      return NULL;
++  }
++  if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
++    read_write &= _IO_IS_APPENDING;
++#ifdef F_GETFL
++  fd_flags = _IO_fcntl (fd, F_GETFL);
++#ifndef O_ACCMODE
++#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
++#endif
++  if (fd_flags == -1
++      || ((fd_flags & O_ACCMODE) == O_RDONLY && !(read_write & _IO_NO_WRITES))
++      || ((fd_flags & O_ACCMODE) == O_WRONLY && !(read_write & _IO_NO_READS)))
++    return NULL;
++
++  /* The May 93 draft of P1003.4/D14.1 (redesignated as 1003.1b)
++     [System Application Program Interface (API) Amendment 1:
++     Realtime Extensions], Rationale B.8.3.3
++     Open a Stream on a File Descriptor says:
++
++         Although not explicitly required by POSIX.1, a good
++         implementation of append ("a") mode would cause the
++         O_APPEND flag to be set.
++
++     (Historical implementations [such as Solaris2] do a one-time
++     seek in fdopen.)
++
++     However, we do not turn O_APPEND off if the mode is "w" (even
++     though that would seem consistent) because that would be more
++     likely to break historical programs.
++     */
++  if ((posix_mode & O_APPEND) && !(fd_flags & O_APPEND))
++    {
++#ifdef F_SETFL
++      if (_IO_fcntl (fd, F_SETFL, fd_flags | O_APPEND) == -1)
++#endif
++	return NULL;
++    }
++#endif
++
++  new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
++  if (new_f == NULL)
++    return NULL;
++#ifdef _IO_MTSAFE_IO
++  new_f->fp.file._lock = &new_f->lock;
++#endif
++  _IO_init (&new_f->fp.file, 0);
++  _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps;
++  _IO_old_file_init (&new_f->fp.file);
++#if  !_IO_UNIFIED_JUMPTABLES
++  new_f->fp.vtable = NULL;
++#endif
++  if (_IO_old_file_attach (&new_f->fp.file, fd) == NULL)
++    {
++      _IO_un_link (&new_f->fp.file);
++      free (new_f);
++      return NULL;
++    }
++  new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE;
++
++  new_f->fp.file._IO_file_flags =
++    _IO_mask_flags (&new_f->fp.file, read_write,
++		    _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
++
++  return (_IO_FILE *) &new_f->fp;
++}
++
++#ifdef SHARED
++strong_alias (_IO_old_fdopen, __old_fdopen)
++symbol_version (_IO_old_fdopen, _IO_fdopen, GLIBC_2.0);
++symbol_version (__old_fdopen, fdopen, GLIBC_2.0);
++#else
++strong_alias (_IO_old_fdopen, _IO_fdopen);
++strong_alias (__old_fdopen, fdopen);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldiofopen.c glibc-2.1.3/glibc-compat/oldiofopen.c
+--- ../glibc-2.1.3/glibc-compat/oldiofopen.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldiofopen.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,71 @@
++/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++#define _IO_USE_OLD_IO_FILE
++#include "libioP.h"
++#ifdef __STDC__
++#include <stdlib.h>
++#endif
++
++
++_IO_FILE *
++_IO_old_fopen (filename, mode)
++     const char *filename;
++     const char *mode;
++{
++  struct locked_FILE
++  {
++    struct _IO_FILE_plus fp;
++#ifdef _IO_MTSAFE_IO
++    _IO_lock_t lock;
++#endif
++  } *new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
++
++  if (new_f == NULL)
++    return NULL;
++#ifdef _IO_MTSAFE_IO
++  new_f->fp.file._lock = &new_f->lock;
++#endif
++  _IO_init (&new_f->fp.file, 0);
++  _IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps;
++  _IO_old_file_init (&new_f->fp.file);
++#if  !_IO_UNIFIED_JUMPTABLES
++  new_f->fp.vtable = NULL;
++#endif
++  if (_IO_old_file_fopen (&new_f->fp.file, filename, mode) != NULL)
++        return (_IO_FILE *) &new_f->fp;
++  _IO_un_link (&new_f->fp.file);
++  free (new_f);
++  return NULL;
++}
++
++#ifdef SHARED
++strong_alias (_IO_old_fopen, __old_fopen)
++symbol_version (_IO_old_fopen, _IO_fopen, GLIBC_2.0);
++symbol_version (__old_fopen, fopen, GLIBC_2.0);
++#else
++strong_alias (_IO_old_fopen, _IO_fopen);
++strong_alias (__old_fopen, fopen);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldiopopen.c glibc-2.1.3/glibc-compat/oldiopopen.c
+--- ../glibc-2.1.3/glibc-compat/oldiopopen.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldiopopen.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,289 @@
++/* Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++   Written by Per Bothner <bothner@cygnus.com>.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++#define _IO_USE_OLD_IO_FILE
++#ifndef _POSIX_SOURCE
++# define _POSIX_SOURCE
++#endif
++#include "libioP.h"
++#if _IO_HAVE_SYS_WAIT
++#include <signal.h>
++#include <unistd.h>
++#ifdef __STDC__
++#include <stdlib.h>
++#endif
++#ifdef _LIBC
++# include <unistd.h>
++#endif
++#include <sys/types.h>
++#include <sys/wait.h>
++
++#ifndef _IO_fork
++#ifdef _LIBC
++#define _IO_fork __vfork
++#else
++#define _IO_fork vfork /* defined in libiberty, if needed */
++#endif
++extern _IO_pid_t _IO_fork __P ((void));
++#endif
++
++#endif /* _IO_HAVE_SYS_WAIT */
++
++#ifndef _IO_pipe
++#ifdef _LIBC
++#define _IO_pipe __pipe
++#else
++#define _IO_pipe pipe
++#endif
++extern int _IO_pipe __P ((int des[2]));
++#endif
++
++#ifndef _IO_dup2
++#ifdef _LIBC
++#define _IO_dup2 __dup2
++#else
++#define _IO_dup2 dup2
++#endif
++extern int _IO_dup2 __P ((int fd, int fd2));
++#endif
++
++#ifndef _IO_waitpid
++#ifdef _LIBC
++#define _IO_waitpid __waitpid
++#else
++#define _IO_waitpid waitpid
++#endif
++#endif
++
++#ifndef _IO_execl
++#define _IO_execl execl
++#endif
++#ifndef _IO__exit
++#define _IO__exit _exit
++#endif
++
++#ifndef _IO_close
++#ifdef _LIBC
++#define _IO_close __close
++#else
++#define _IO_close close
++#endif
++#endif
++
++struct _IO_proc_file
++{
++  struct _IO_FILE_plus file;
++  /* Following fields must match those in class procbuf (procbuf.h) */
++  _IO_pid_t pid;
++  struct _IO_proc_file *next;
++};
++typedef struct _IO_proc_file _IO_proc_file;
++
++static struct _IO_proc_file *old_proc_file_chain = NULL;
++
++_IO_FILE *
++_IO_old_proc_open (fp, command, mode)
++     _IO_FILE *fp;
++     const char *command;
++     const char *mode;
++{
++#if _IO_HAVE_SYS_WAIT
++  volatile int read_or_write;
++  volatile int parent_end, child_end;
++  int pipe_fds[2];
++  _IO_pid_t child_pid;
++  if (_IO_file_is_open (fp))
++    return NULL;
++  if (_IO_pipe (pipe_fds) < 0)
++    return NULL;
++  if (mode[0] == 'r' && mode[1] == '\0')
++    {
++      parent_end = pipe_fds[0];
++      child_end = pipe_fds[1];
++      read_or_write = _IO_NO_WRITES;
++    }
++  else if (mode[0] == 'w' && mode[1] == '\0')
++    {
++      parent_end = pipe_fds[1];
++      child_end = pipe_fds[0];
++      read_or_write = _IO_NO_READS;
++    }
++  else
++    {
++      __set_errno (EINVAL);
++      return NULL;
++    }
++  ((_IO_proc_file *) fp)->pid = child_pid = _IO_fork ();
++  if (child_pid == 0)
++    {
++      int child_std_end = mode[0] == 'r' ? 1 : 0;
++      _IO_close (parent_end);
++      if (child_end != child_std_end)
++	{
++	  _IO_dup2 (child_end, child_std_end);
++	  _IO_close (child_end);
++	}
++      /* POSIX.2:  "popen() shall ensure that any streams from previous
++         popen() calls that remain open in the parent process are closed
++	 in the new child process." */
++      while (old_proc_file_chain)
++	{
++	  _IO_close (_IO_fileno ((_IO_FILE *) old_proc_file_chain));
++	  old_proc_file_chain = old_proc_file_chain->next;
++	}
++
++      _IO_execl ("/bin/sh", "sh", "-c", command, (char *) 0);
++      _IO__exit (127);
++    }
++  _IO_close (child_end);
++  if (child_pid < 0)
++    {
++      _IO_close (parent_end);
++      return NULL;
++    }
++  _IO_fileno (fp) = parent_end;
++
++  /* Link into old_proc_file_chain. */
++  ((_IO_proc_file *) fp)->next = old_proc_file_chain;
++  old_proc_file_chain = (_IO_proc_file *) fp;
++
++  _IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES);
++  return fp;
++#else /* !_IO_HAVE_SYS_WAIT */
++  return NULL;
++#endif
++}
++
++_IO_FILE *
++_IO_old_popen (command, mode)
++     const char *command;
++     const char *mode;
++{
++  struct locked_FILE
++  {
++    struct _IO_proc_file fpx;
++#ifdef _IO_MTSAFE_IO
++    _IO_lock_t lock;
++#endif
++  } *new_f;
++  _IO_FILE *fp;
++
++  new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
++  if (new_f == NULL)
++    return NULL;
++#ifdef _IO_MTSAFE_IO
++  new_f->fpx.file.file._lock = &new_f->lock;
++#endif
++  fp = &new_f->fpx.file.file;
++  _IO_init (fp, 0);
++  _IO_JUMPS (fp) = &_IO_old_proc_jumps;
++  _IO_old_file_init (fp);
++#if  !_IO_UNIFIED_JUMPTABLES
++  new_f->fpx.file.vtable = NULL;
++#endif
++  if (_IO_old_proc_open (fp, command, mode) != NULL)
++    return fp;
++  _IO_un_link (fp);
++  free (new_f);
++  return NULL;
++}
++
++int
++_IO_old_proc_close (fp)
++     _IO_FILE *fp;
++{
++  /* This is not name-space clean. FIXME! */
++#if _IO_HAVE_SYS_WAIT
++  int wstatus;
++  _IO_proc_file **ptr = &old_proc_file_chain;
++  _IO_pid_t wait_pid;
++  int status = -1;
++
++  /* Unlink from old_proc_file_chain. */
++  for ( ; *ptr != NULL; ptr = &(*ptr)->next)
++    {
++      if (*ptr == (_IO_proc_file *) fp)
++	{
++	  *ptr = (*ptr)->next;
++	  status = 0;
++	  break;
++	}
++    }
++
++  if (status < 0 || _IO_close (_IO_fileno(fp)) < 0)
++    return -1;
++  /* POSIX.2 Rationale:  "Some historical implementations either block
++     or ignore the signals SIGINT, SIGQUIT, and SIGHUP while waiting
++     for the child process to terminate.  Since this behavior is not
++     described in POSIX.2, such implementations are not conforming." */
++  do
++    {
++      wait_pid = _IO_waitpid (((_IO_proc_file *) fp)->pid, &wstatus, 0);
++    }
++  while (wait_pid == -1 && errno == EINTR);
++  if (wait_pid == -1)
++    return -1;
++  return wstatus;
++#else /* !_IO_HAVE_SYS_WAIT */
++  return -1;
++#endif
++}
++
++struct _IO_jump_t _IO_old_proc_jumps = {
++  JUMP_INIT_DUMMY,
++  JUMP_INIT(finish, _IO_old_file_finish),
++  JUMP_INIT(overflow, _IO_old_file_overflow),
++  JUMP_INIT(underflow, _IO_old_file_underflow),
++  JUMP_INIT(uflow, _IO_default_uflow),
++  JUMP_INIT(pbackfail, _IO_default_pbackfail),
++  JUMP_INIT(xsputn, _IO_old_file_xsputn),
++  JUMP_INIT(xsgetn, _IO_default_xsgetn),
++  JUMP_INIT(seekoff, _IO_old_file_seekoff),
++  JUMP_INIT(seekpos, _IO_default_seekpos),
++  JUMP_INIT(setbuf, _IO_old_file_setbuf),
++  JUMP_INIT(sync, _IO_old_file_sync),
++  JUMP_INIT(doallocate, _IO_file_doallocate),
++  JUMP_INIT(read, _IO_file_read),
++  JUMP_INIT(write, _IO_old_file_write),
++  JUMP_INIT(seek, _IO_file_seek),
++  JUMP_INIT(close, _IO_old_proc_close),
++  JUMP_INIT(stat, _IO_file_stat),
++  JUMP_INIT(showmanyc, _IO_default_showmanyc),
++  JUMP_INIT(imbue, _IO_default_imbue)
++};
++
++#ifdef SHARED
++strong_alias (_IO_old_popen, __old_popen)
++symbol_version (_IO_old_popen, _IO_popen, GLIBC_2.0);
++symbol_version (__old_popen, popen, GLIBC_2.0);
++symbol_version (_IO_old_proc_open, _IO_proc_open, GLIBC_2.0);
++symbol_version (_IO_old_proc_close, _IO_proc_close, GLIBC_2.0);
++#else
++strong_alias (_IO_old_popen, _IO_popen);
++strong_alias (__old_popen, popen);
++strong_alias (_IO_old_proc_open, _IO_proc_open);
++strong_alias (_IO_old_proc_close, _IO_proc_close);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldpclose.c glibc-2.1.3/glibc-compat/oldpclose.c
+--- ../glibc-2.1.3/glibc-compat/oldpclose.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldpclose.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,48 @@
++/* Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++#define _IO_USE_OLD_IO_FILE
++#include "libioP.h"
++#include "stdio.h"
++#include <errno.h>
++
++int
++__old_pclose (fp)
++     FILE *fp;
++{
++#if 0
++  /* Does not actually test that stream was created by popen(). Instead,
++     it depends on the filebuf::sys_close() virtual to Do The Right Thing. */
++  if (fp is not a proc_file)
++    return -1;
++#endif
++  return _IO_old_fclose (fp);
++}
++
++#ifdef SHARED
++symbol_version (__old_pclose, pclose, GLIBC_2.0);
++#else
++strong_alias (__old_pclose, pclose);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldstdfiles.c glibc-2.1.3/glibc-compat/oldstdfiles.c
+--- ../glibc-2.1.3/glibc-compat/oldstdfiles.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldstdfiles.c	2000-01-03 17:07:07.000000000 -0800
+@@ -0,0 +1,97 @@
++/* Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU IO Library.
++
++   This library 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 library 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 library; see the file COPYING.  If not, write to
++   the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
++   MA 02111-1307, USA.
++
++   As a special exception, if you link this library with files
++   compiled with a GNU compiler to produce an executable, this does
++   not cause the resulting executable to be covered by the GNU General
++   Public License.  This exception does not however invalidate any
++   other reasons why the executable file might be covered by the GNU
++   General Public License.  */
++
++
++/* This file provides definitions of _IO_stdin, _IO_stdout, and _IO_stderr
++   for C code.  Compare stdstreams.cc.
++   (The difference is that here the vtable field is set to 0,
++   so the objects defined are not valid C++ objects.  On the other
++   hand, we don't need a C++ compiler to build this file.) */
++
++#define _IO_USE_OLD_IO_FILE
++#include "libioP.h"
++
++#ifdef _IO_MTSAFE_IO
++#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
++  static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
++  struct _IO_FILE_plus NAME \
++    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
++#else
++#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \
++  struct _IO_FILE_plus NAME \
++    = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
++#endif
++
++DEF_STDFILE(_IO_stdin_, 0, 0, _IO_NO_WRITES);
++DEF_STDFILE(_IO_stdout_, 1, &_IO_stdin_.file, _IO_NO_READS);
++DEF_STDFILE(_IO_stderr_, 2, &_IO_stdout_.file,
++	    _IO_NO_READS+_IO_UNBUFFERED);
++
++#if defined __GNUC__ && __GNUC__ >= 2
++
++#include <stdio.h>
++
++extern const int _IO_stdin_used;
++weak_extern (_IO_stdin_used);
++
++#undef stdin
++#undef stdout
++#undef stderr
++
++extern FILE *stdin;
++extern FILE *stdout;
++extern FILE *stderr;
++
++#ifdef SHARED
++extern
++#endif
++FILE *_IO_list_all;
++
++static void _IO_check_libio __P ((void)) __attribute__ ((constructor));
++
++/* This function determines which shared C library the application
++   was linked against. We then set up the stdin/stdout/stderr and
++   _IO_list_all accordingly. */
++
++static void
++_IO_check_libio ()
++{
++#ifdef SHARED
++  if (&_IO_stdin_used == NULL)
++#endif
++    {
++      /* We are using the old one. */
++      _IO_stdin = stdin = &_IO_stdin_.file;
++      _IO_stdout = stdout = &_IO_stdout_.file;
++      _IO_stderr = stderr = _IO_list_all = &_IO_stderr_.file;
++      _IO_stdin->_vtable_offset = _IO_stdout->_vtable_offset =
++	_IO_stderr->_vtable_offset = stdin->_vtable_offset =
++	stdout->_vtable_offset = stderr->_vtable_offset =
++	((int) sizeof (struct _IO_FILE)
++	 - (int) sizeof (struct _IO_FILE_complete));
++    }
++}
++
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/oldtmpfile.c glibc-2.1.3/glibc-compat/oldtmpfile.c
+--- ../glibc-2.1.3/glibc-compat/oldtmpfile.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/oldtmpfile.c	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,55 @@
++/* Copyright (C) 1991, 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#define _IO_USE_OLD_IO_FILE
++#include <stdio.h>
++#include <unistd.h>
++#include <iolibio.h>
++
++/* This returns a new stream opened on a temporary file (generated
++   by tmpnam).  The file is opened with mode "w+b" (binary read/write).
++   If we couldn't generate a unique filename or the file couldn't
++   be opened, NULL is returned.  */
++FILE *
++__old_tmpfile (void)
++{
++  char buf[FILENAME_MAX];
++  int fd;
++  FILE *f;
++
++  if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0))
++    return NULL;
++  fd = __gen_tempname (buf, 1, 0);
++  if (fd < 0)
++    return NULL;
++
++  /* Note that this relies on the Unix semantics that
++     a file is not really removed until it is closed.  */
++  (void) remove (buf);
++
++  if ((f = _IO_old_fdopen (fd, "w+b")) == NULL)
++    __close (fd);
++
++  return f;
++}
++
++#ifdef SHARED
++symbol_version (__old_tmpfile, tmpfile, GLIBC_2.0);
++#else
++strong_alias (__old_tmpfile, tmpfile);
++#endif
+diff -Naur ../glibc-2.1.3/glibc-compat/rpcsvc/yp.h glibc-2.1.3/glibc-compat/rpcsvc/yp.h
+--- ../glibc-2.1.3/glibc-compat/rpcsvc/yp.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/rpcsvc/yp.h	2000-01-03 18:17:33.000000000 -0800
+@@ -0,0 +1,621 @@
++/*
++ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
++ * unrestricted use provided that this legend is included on all tape
++ * media and as a part of the software program in whole or part.  Users
++ * may copy or modify Sun RPC without charge, but are not authorized
++ * to license or distribute it to anyone else except as part of a product or
++ * program developed by the user.
++ *
++ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
++ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
++ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
++ *
++ * Sun RPC is provided with no support and without any obligation on the
++ * part of Sun Microsystems, Inc. to assist in its use, correction,
++ * modification or enhancement.
++ *
++ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
++ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
++ * OR ANY PART THEREOF.
++ *
++ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
++ * or profits or other special, indirect and consequential damages, even if
++ * Sun has been advised of the possibility of such damages.
++ *
++ * Sun Microsystems, Inc.
++ * 2550 Garcia Avenue
++ * Mountain View, California  94043
++ */
++
++#ifndef __RPCSVC_YP_H__
++#define __RPCSVC_YP_H__
++
++#include <rpc/rpc.h>
++
++#define YPMAXRECORD 1024
++#define YPMAXDOMAIN 64
++#define YPMAXMAP 64
++#define YPMAXPEER 64
++
++enum ypstat {
++	YP_TRUE = 1,
++	YP_NOMORE = 2,
++	YP_FALSE = 0,
++	YP_NOMAP = -1,
++	YP_NODOM = -2,
++	YP_NOKEY = -3,
++	YP_BADOP = -4,
++	YP_BADDB = -5,
++	YP_YPERR = -6,
++	YP_BADARGS = -7,
++	YP_VERS = -8,
++};
++typedef enum ypstat ypstat;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypstat(XDR *, ypstat*);
++#elif __STDC__
++extern  bool_t xdr_ypstat(XDR *, ypstat*);
++#else /* Old Style C */
++bool_t xdr_ypstat();
++#endif /* Old Style C */
++
++
++enum ypxfrstat {
++	YPXFR_SUCC = 1,
++	YPXFR_AGE = 2,
++	YPXFR_NOMAP = -1,
++	YPXFR_NODOM = -2,
++	YPXFR_RSRC = -3,
++	YPXFR_RPC = -4,
++	YPXFR_MADDR = -5,
++	YPXFR_YPERR = -6,
++	YPXFR_BADARGS = -7,
++	YPXFR_DBM = -8,
++	YPXFR_FILE = -9,
++	YPXFR_SKEW = -10,
++	YPXFR_CLEAR = -11,
++	YPXFR_FORCE = -12,
++	YPXFR_XFRERR = -13,
++	YPXFR_REFUSED = -14,
++};
++typedef enum ypxfrstat ypxfrstat;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypxfrstat(XDR *, ypxfrstat*);
++#elif __STDC__
++extern  bool_t xdr_ypxfrstat(XDR *, ypxfrstat*);
++#else /* Old Style C */
++bool_t xdr_ypxfrstat();
++#endif /* Old Style C */
++
++
++typedef char *domainname;
++#ifdef __cplusplus
++extern "C" bool_t xdr_domainname(XDR *, domainname*);
++#elif __STDC__
++extern  bool_t xdr_domainname(XDR *, domainname*);
++#else /* Old Style C */
++bool_t xdr_domainname();
++#endif /* Old Style C */
++
++
++typedef char *mapname;
++#ifdef __cplusplus
++extern "C" bool_t xdr_mapname(XDR *, mapname*);
++#elif __STDC__
++extern  bool_t xdr_mapname(XDR *, mapname*);
++#else /* Old Style C */
++bool_t xdr_mapname();
++#endif /* Old Style C */
++
++
++typedef char *peername;
++#ifdef __cplusplus
++extern "C" bool_t xdr_peername(XDR *, peername*);
++#elif __STDC__
++extern  bool_t xdr_peername(XDR *, peername*);
++#else /* Old Style C */
++bool_t xdr_peername();
++#endif /* Old Style C */
++
++
++typedef struct {
++	u_int keydat_len;
++	char *keydat_val;
++} keydat;
++#ifdef __cplusplus
++extern "C" bool_t xdr_keydat(XDR *, keydat*);
++#elif __STDC__
++extern  bool_t xdr_keydat(XDR *, keydat*);
++#else /* Old Style C */
++bool_t xdr_keydat();
++#endif /* Old Style C */
++
++
++typedef struct {
++	u_int valdat_len;
++	char *valdat_val;
++} valdat;
++#ifdef __cplusplus
++extern "C" bool_t xdr_valdat(XDR *, valdat*);
++#elif __STDC__
++extern  bool_t xdr_valdat(XDR *, valdat*);
++#else /* Old Style C */
++bool_t xdr_valdat();
++#endif /* Old Style C */
++
++
++struct ypmap_parms {
++	domainname domain;
++	mapname map;
++	u_int ordernum;
++	peername peer;
++};
++typedef struct ypmap_parms ypmap_parms;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypmap_parms(XDR *, ypmap_parms*);
++#elif __STDC__
++extern  bool_t xdr_ypmap_parms(XDR *, ypmap_parms*);
++#else /* Old Style C */
++bool_t xdr_ypmap_parms();
++#endif /* Old Style C */
++
++
++struct ypreq_key {
++	domainname domain;
++	mapname map;
++	keydat key;
++};
++typedef struct ypreq_key ypreq_key;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypreq_key(XDR *, ypreq_key*);
++#elif __STDC__
++extern  bool_t xdr_ypreq_key(XDR *, ypreq_key*);
++#else /* Old Style C */
++bool_t xdr_ypreq_key();
++#endif /* Old Style C */
++
++
++struct ypreq_nokey {
++	domainname domain;
++	mapname map;
++};
++typedef struct ypreq_nokey ypreq_nokey;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypreq_nokey(XDR *, ypreq_nokey*);
++#elif __STDC__
++extern  bool_t xdr_ypreq_nokey(XDR *, ypreq_nokey*);
++#else /* Old Style C */
++bool_t xdr_ypreq_nokey();
++#endif /* Old Style C */
++
++
++struct ypreq_xfr {
++	ypmap_parms map_parms;
++	u_int transid;
++	u_int prog;
++	u_int port;
++};
++typedef struct ypreq_xfr ypreq_xfr;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypreq_xfr(XDR *, ypreq_xfr*);
++#elif __STDC__
++extern  bool_t xdr_ypreq_xfr(XDR *, ypreq_xfr*);
++#else /* Old Style C */
++bool_t xdr_ypreq_xfr();
++#endif /* Old Style C */
++
++
++struct ypresp_val {
++	ypstat stat;
++	valdat val;
++};
++typedef struct ypresp_val ypresp_val;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_val(XDR *, ypresp_val*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_val(XDR *, ypresp_val*);
++#else /* Old Style C */
++bool_t xdr_ypresp_val();
++#endif /* Old Style C */
++
++
++struct ypresp_key_val {
++	ypstat stat;
++#ifdef STUPID_SUN_BUG
++	/* This is the form as distributed by Sun.  But even the Sun NIS
++	   servers expect the values in the other order.  So their
++	   implementation somehow must change the order internally.  We
++	   don't want to follow this bad example since the user should be
++	   able to use rpcgen on this file.  */
++	keydat key;
++	valdat val;
++#else
++	valdat val;
++	keydat key;
++#endif
++};
++typedef struct ypresp_key_val ypresp_key_val;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_key_val(XDR *, ypresp_key_val*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_key_val(XDR *, ypresp_key_val*);
++#else /* Old Style C */
++bool_t xdr_ypresp_key_val();
++#endif /* Old Style C */
++
++
++struct ypresp_master {
++	ypstat stat;
++	peername peer;
++};
++typedef struct ypresp_master ypresp_master;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_master(XDR *, ypresp_master*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_master(XDR *, ypresp_master*);
++#else /* Old Style C */
++bool_t xdr_ypresp_master();
++#endif /* Old Style C */
++
++
++struct ypresp_order {
++	ypstat stat;
++	u_int ordernum;
++};
++typedef struct ypresp_order ypresp_order;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_order(XDR *, ypresp_order*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_order(XDR *, ypresp_order*);
++#else /* Old Style C */
++bool_t xdr_ypresp_order();
++#endif /* Old Style C */
++
++
++struct ypresp_all {
++	bool_t more;
++	union {
++		ypresp_key_val val;
++	} ypresp_all_u;
++};
++typedef struct ypresp_all ypresp_all;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_all(XDR *, ypresp_all*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_all(XDR *, ypresp_all*);
++#else /* Old Style C */
++bool_t xdr_ypresp_all();
++#endif /* Old Style C */
++
++
++struct ypresp_xfr {
++	u_int transid;
++	ypxfrstat xfrstat;
++};
++typedef struct ypresp_xfr ypresp_xfr;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_xfr(XDR *, ypresp_xfr*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_xfr(XDR *, ypresp_xfr*);
++#else /* Old Style C */
++bool_t xdr_ypresp_xfr();
++#endif /* Old Style C */
++
++
++struct ypmaplist {
++	mapname map;
++	struct ypmaplist *next;
++};
++typedef struct ypmaplist ypmaplist;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypmaplist(XDR *, ypmaplist*);
++#elif __STDC__
++extern  bool_t xdr_ypmaplist(XDR *, ypmaplist*);
++#else /* Old Style C */
++bool_t xdr_ypmaplist();
++#endif /* Old Style C */
++
++
++struct ypresp_maplist {
++	ypstat stat;
++	ypmaplist *maps;
++};
++typedef struct ypresp_maplist ypresp_maplist;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypresp_maplist(XDR *, ypresp_maplist*);
++#elif __STDC__
++extern  bool_t xdr_ypresp_maplist(XDR *, ypresp_maplist*);
++#else /* Old Style C */
++bool_t xdr_ypresp_maplist();
++#endif /* Old Style C */
++
++
++enum yppush_status {
++	YPPUSH_SUCC = 1,
++	YPPUSH_AGE = 2,
++	YPPUSH_NOMAP = -1,
++	YPPUSH_NODOM = -2,
++	YPPUSH_RSRC = -3,
++	YPPUSH_RPC = -4,
++	YPPUSH_MADDR = -5,
++	YPPUSH_YPERR = -6,
++	YPPUSH_BADARGS = -7,
++	YPPUSH_DBM = -8,
++	YPPUSH_FILE = -9,
++	YPPUSH_SKEW = -10,
++	YPPUSH_CLEAR = -11,
++	YPPUSH_FORCE = -12,
++	YPPUSH_XFRERR = -13,
++	YPPUSH_REFUSED = -14,
++};
++typedef enum yppush_status yppush_status;
++#ifdef __cplusplus
++extern "C" bool_t xdr_yppush_status(XDR *, yppush_status*);
++#elif __STDC__
++extern  bool_t xdr_yppush_status(XDR *, yppush_status*);
++#else /* Old Style C */
++bool_t xdr_yppush_status();
++#endif /* Old Style C */
++
++
++struct yppushresp_xfr {
++	u_int transid;
++	yppush_status status;
++};
++typedef struct yppushresp_xfr yppushresp_xfr;
++#ifdef __cplusplus
++extern "C" bool_t xdr_yppushresp_xfr(XDR *, yppushresp_xfr*);
++#elif __STDC__
++extern  bool_t xdr_yppushresp_xfr(XDR *, yppushresp_xfr*);
++#else /* Old Style C */
++bool_t xdr_yppushresp_xfr();
++#endif /* Old Style C */
++
++
++enum ypbind_resptype {
++	YPBIND_SUCC_VAL = 1,
++	YPBIND_FAIL_VAL = 2,
++};
++typedef enum ypbind_resptype ypbind_resptype;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypbind_resptype(XDR *, ypbind_resptype*);
++#elif __STDC__
++extern  bool_t xdr_ypbind_resptype(XDR *, ypbind_resptype*);
++#else /* Old Style C */
++bool_t xdr_ypbind_resptype();
++#endif /* Old Style C */
++
++
++struct ypbind_binding {
++	char ypbind_binding_addr[4];
++	char ypbind_binding_port[2];
++};
++typedef struct ypbind_binding ypbind_binding;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypbind_binding(XDR *, ypbind_binding*);
++#elif __STDC__
++extern  bool_t xdr_ypbind_binding(XDR *, ypbind_binding*);
++#else /* Old Style C */
++bool_t xdr_ypbind_binding();
++#endif /* Old Style C */
++
++
++struct ypbind_resp {
++	ypbind_resptype ypbind_status;
++	union {
++		u_int ypbind_error;
++		ypbind_binding ypbind_bindinfo;
++	} ypbind_resp_u;
++};
++typedef struct ypbind_resp ypbind_resp;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypbind_resp(XDR *, ypbind_resp*);
++#elif __STDC__
++extern  bool_t xdr_ypbind_resp(XDR *, ypbind_resp*);
++#else /* Old Style C */
++bool_t xdr_ypbind_resp();
++#endif /* Old Style C */
++
++#define YPBIND_ERR_ERR 1
++#define YPBIND_ERR_NOSERV 2
++#define YPBIND_ERR_RESC 3
++
++struct ypbind_setdom {
++	domainname ypsetdom_domain;
++	ypbind_binding ypsetdom_binding;
++	u_int ypsetdom_vers;
++};
++typedef struct ypbind_setdom ypbind_setdom;
++#ifdef __cplusplus
++extern "C" bool_t xdr_ypbind_setdom(XDR *, ypbind_setdom*);
++#elif __STDC__
++extern  bool_t xdr_ypbind_setdom(XDR *, ypbind_setdom*);
++#else /* Old Style C */
++bool_t xdr_ypbind_setdom();
++#endif /* Old Style C */
++
++
++#define YPPROG ((u_long)100004)
++#define YPVERS ((u_long)2)
++
++#ifdef __cplusplus
++#define YPPROC_NULL ((u_long)0)
++extern "C" void * ypproc_null_2(void *, CLIENT *);
++extern "C" void * ypproc_null_2_svc(void *, struct svc_req *);
++#define YPPROC_DOMAIN ((u_long)1)
++extern "C" bool_t * ypproc_domain_2(domainname *, CLIENT *);
++extern "C" bool_t * ypproc_domain_2_svc(domainname *, struct svc_req *);
++#define YPPROC_DOMAIN_NONACK ((u_long)2)
++extern "C" bool_t * ypproc_domain_nonack_2(domainname *, CLIENT *);
++extern "C" bool_t * ypproc_domain_nonack_2_svc(domainname *, struct svc_req *);
++#define YPPROC_MATCH ((u_long)3)
++extern "C" ypresp_val * ypproc_match_2(ypreq_key *, CLIENT *);
++extern "C" ypresp_val * ypproc_match_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_FIRST ((u_long)4)
++extern "C" ypresp_key_val * ypproc_first_2(ypreq_key *, CLIENT *);
++extern "C" ypresp_key_val * ypproc_first_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_NEXT ((u_long)5)
++extern "C" ypresp_key_val * ypproc_next_2(ypreq_key *, CLIENT *);
++extern "C" ypresp_key_val * ypproc_next_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_XFR ((u_long)6)
++extern "C" ypresp_xfr * ypproc_xfr_2(ypreq_xfr *, CLIENT *);
++extern "C" ypresp_xfr * ypproc_xfr_2_svc(ypreq_xfr *, struct svc_req *);
++#define YPPROC_CLEAR ((u_long)7)
++extern "C" void * ypproc_clear_2(void *, CLIENT *);
++extern "C" void * ypproc_clear_2_svc(void *, struct svc_req *);
++#define YPPROC_ALL ((u_long)8)
++extern "C" ypresp_all * ypproc_all_2(ypreq_nokey *, CLIENT *);
++extern "C" ypresp_all * ypproc_all_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_MASTER ((u_long)9)
++extern "C" ypresp_master * ypproc_master_2(ypreq_nokey *, CLIENT *);
++extern "C" ypresp_master * ypproc_master_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_ORDER ((u_long)10)
++extern "C" ypresp_order * ypproc_order_2(ypreq_nokey *, CLIENT *);
++extern "C" ypresp_order * ypproc_order_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_MAPLIST ((u_long)11)
++extern "C" ypresp_maplist * ypproc_maplist_2(domainname *, CLIENT *);
++extern "C" ypresp_maplist * ypproc_maplist_2_svc(domainname *, struct svc_req *);
++
++#elif __STDC__
++#define YPPROC_NULL ((u_long)0)
++extern  void * ypproc_null_2(void *, CLIENT *);
++extern  void * ypproc_null_2_svc(void *, struct svc_req *);
++#define YPPROC_DOMAIN ((u_long)1)
++extern  bool_t * ypproc_domain_2(domainname *, CLIENT *);
++extern  bool_t * ypproc_domain_2_svc(domainname *, struct svc_req *);
++#define YPPROC_DOMAIN_NONACK ((u_long)2)
++extern  bool_t * ypproc_domain_nonack_2(domainname *, CLIENT *);
++extern  bool_t * ypproc_domain_nonack_2_svc(domainname *, struct svc_req *);
++#define YPPROC_MATCH ((u_long)3)
++extern  ypresp_val * ypproc_match_2(ypreq_key *, CLIENT *);
++extern  ypresp_val * ypproc_match_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_FIRST ((u_long)4)
++extern  ypresp_key_val * ypproc_first_2(ypreq_key *, CLIENT *);
++extern  ypresp_key_val * ypproc_first_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_NEXT ((u_long)5)
++extern  ypresp_key_val * ypproc_next_2(ypreq_key *, CLIENT *);
++extern  ypresp_key_val * ypproc_next_2_svc(ypreq_key *, struct svc_req *);
++#define YPPROC_XFR ((u_long)6)
++extern  ypresp_xfr * ypproc_xfr_2(ypreq_xfr *, CLIENT *);
++extern  ypresp_xfr * ypproc_xfr_2_svc(ypreq_xfr *, struct svc_req *);
++#define YPPROC_CLEAR ((u_long)7)
++extern  void * ypproc_clear_2(void *, CLIENT *);
++extern  void * ypproc_clear_2_svc(void *, struct svc_req *);
++#define YPPROC_ALL ((u_long)8)
++extern  ypresp_all * ypproc_all_2(ypreq_nokey *, CLIENT *);
++extern  ypresp_all * ypproc_all_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_MASTER ((u_long)9)
++extern  ypresp_master * ypproc_master_2(ypreq_nokey *, CLIENT *);
++extern  ypresp_master * ypproc_master_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_ORDER ((u_long)10)
++extern  ypresp_order * ypproc_order_2(ypreq_nokey *, CLIENT *);
++extern  ypresp_order * ypproc_order_2_svc(ypreq_nokey *, struct svc_req *);
++#define YPPROC_MAPLIST ((u_long)11)
++extern  ypresp_maplist * ypproc_maplist_2(domainname *, CLIENT *);
++extern  ypresp_maplist * ypproc_maplist_2_svc(domainname *, struct svc_req *);
++
++#else /* Old Style C */
++#define YPPROC_NULL ((u_long)0)
++extern  void * ypproc_null_2();
++extern  void * ypproc_null_2_svc();
++#define YPPROC_DOMAIN ((u_long)1)
++extern  bool_t * ypproc_domain_2();
++extern  bool_t * ypproc_domain_2_svc();
++#define YPPROC_DOMAIN_NONACK ((u_long)2)
++extern  bool_t * ypproc_domain_nonack_2();
++extern  bool_t * ypproc_domain_nonack_2_svc();
++#define YPPROC_MATCH ((u_long)3)
++extern  ypresp_val * ypproc_match_2();
++extern  ypresp_val * ypproc_match_2_svc();
++#define YPPROC_FIRST ((u_long)4)
++extern  ypresp_key_val * ypproc_first_2();
++extern  ypresp_key_val * ypproc_first_2_svc();
++#define YPPROC_NEXT ((u_long)5)
++extern  ypresp_key_val * ypproc_next_2();
++extern  ypresp_key_val * ypproc_next_2_svc();
++#define YPPROC_XFR ((u_long)6)
++extern  ypresp_xfr * ypproc_xfr_2();
++extern  ypresp_xfr * ypproc_xfr_2_svc();
++#define YPPROC_CLEAR ((u_long)7)
++extern  void * ypproc_clear_2();
++extern  void * ypproc_clear_2_svc();
++#define YPPROC_ALL ((u_long)8)
++extern  ypresp_all * ypproc_all_2();
++extern  ypresp_all * ypproc_all_2_svc();
++#define YPPROC_MASTER ((u_long)9)
++extern  ypresp_master * ypproc_master_2();
++extern  ypresp_master * ypproc_master_2_svc();
++#define YPPROC_ORDER ((u_long)10)
++extern  ypresp_order * ypproc_order_2();
++extern  ypresp_order * ypproc_order_2_svc();
++#define YPPROC_MAPLIST ((u_long)11)
++extern  ypresp_maplist * ypproc_maplist_2();
++extern  ypresp_maplist * ypproc_maplist_2_svc();
++#endif /* Old Style C */
++
++#define YPPUSH_XFRRESPPROG ((u_long)0x40000000)
++#define YPPUSH_XFRRESPVERS ((u_long)1)
++
++#ifdef __cplusplus
++#define YPPUSHPROC_NULL ((u_long)0)
++extern "C" void * yppushproc_null_1(void *, CLIENT *);
++extern "C" void * yppushproc_null_1_svc(void *, struct svc_req *);
++#define YPPUSHPROC_XFRRESP ((u_long)1)
++extern "C" void * yppushproc_xfrresp_1(yppushresp_xfr *, CLIENT *);
++extern "C" void * yppushproc_xfrresp_1_svc(yppushresp_xfr *, struct svc_req *);
++
++#elif __STDC__
++#define YPPUSHPROC_NULL ((u_long)0)
++extern  void * yppushproc_null_1(void *, CLIENT *);
++extern  void * yppushproc_null_1_svc(void *, struct svc_req *);
++#define YPPUSHPROC_XFRRESP ((u_long)1)
++extern  void * yppushproc_xfrresp_1(yppushresp_xfr *, CLIENT *);
++extern  void * yppushproc_xfrresp_1_svc(yppushresp_xfr *, struct svc_req *);
++
++#else /* Old Style C */
++#define YPPUSHPROC_NULL ((u_long)0)
++extern  void * yppushproc_null_1();
++extern  void * yppushproc_null_1_svc();
++#define YPPUSHPROC_XFRRESP ((u_long)1)
++extern  void * yppushproc_xfrresp_1();
++extern  void * yppushproc_xfrresp_1_svc();
++#endif /* Old Style C */
++
++#define YPBINDPROG ((u_long)100007)
++#define YPBINDVERS ((u_long)2)
++
++#ifdef __cplusplus
++#define YPBINDPROC_NULL ((u_long)0)
++extern "C" void * ypbindproc_null_2(void *, CLIENT *);
++extern "C" void * ypbindproc_null_2_svc(void *, struct svc_req *);
++#define YPBINDPROC_DOMAIN ((u_long)1)
++extern "C" ypbind_resp * ypbindproc_domain_2(domainname *, CLIENT *);
++extern "C" ypbind_resp * ypbindproc_domain_2_svc(domainname *, struct svc_req *);
++#define YPBINDPROC_SETDOM ((u_long)2)
++extern "C" void * ypbindproc_setdom_2(ypbind_setdom *, CLIENT *);
++extern "C" void * ypbindproc_setdom_2_svc(ypbind_setdom *, struct svc_req *);
++
++#elif __STDC__
++#define YPBINDPROC_NULL ((u_long)0)
++extern  void * ypbindproc_null_2(void *, CLIENT *);
++extern  void * ypbindproc_null_2_svc(void *, struct svc_req *);
++#define YPBINDPROC_DOMAIN ((u_long)1)
++extern  ypbind_resp * ypbindproc_domain_2(domainname *, CLIENT *);
++extern  ypbind_resp * ypbindproc_domain_2_svc(domainname *, struct svc_req *);
++#define YPBINDPROC_SETDOM ((u_long)2)
++extern  void * ypbindproc_setdom_2(ypbind_setdom *, CLIENT *);
++extern  void * ypbindproc_setdom_2_svc(ypbind_setdom *, struct svc_req *);
++
++#else /* Old Style C */
++#define YPBINDPROC_NULL ((u_long)0)
++extern  void * ypbindproc_null_2();
++extern  void * ypbindproc_null_2_svc();
++#define YPBINDPROC_DOMAIN ((u_long)1)
++extern  ypbind_resp * ypbindproc_domain_2();
++extern  ypbind_resp * ypbindproc_domain_2_svc();
++#define YPBINDPROC_SETDOM ((u_long)2)
++extern  void * ypbindproc_setdom_2();
++extern  void * ypbindproc_setdom_2_svc();
++#endif /* Old Style C */
++
++#endif /* !__RPCSVC_YP_H__ */
+diff -Naur ../glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h
+--- ../glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h	2000-01-03 18:17:33.000000000 -0800
+@@ -0,0 +1,90 @@
++/*
++** Copyright (c) 1996 Thorsten Kukuk, Germany
++**
++** This library is free software; you can redistribute it and/or
++** modify it under the terms of the GNU Library General Public
++** License as published by the Free Software Foundation; either
++** version 2 of the License, or (at your option) any later version.
++**
++** This library 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
++** Library General Public License for more details.
++**
++** You should have received a copy of the GNU Library General Public
++** License along with this library; if not, write to the Free
++** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++**
++** Author: Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
++**
++*/
++
++#ifndef	__RPCSVC_YPCLNT_H__
++#define	__RPCSVC_YPCLNT_H__
++
++#include <features.h>
++
++/* some defines */
++#define YPERR_SUCCESS 0                 /* There is no error */
++#define	YPERR_BADARGS 1			/* Args to function are bad */
++#define	YPERR_RPC 2			/* RPC failure */
++#define	YPERR_DOMAIN 3			/* Can't bind to a server with this domain */
++#define	YPERR_MAP 4			/* No such map in server's domain */
++#define	YPERR_KEY 5			/* No such key in map */
++#define	YPERR_YPERR 6			/* Internal yp server or client error */
++#define	YPERR_RESRC 7			/* Local resource allocation failure */
++#define	YPERR_NOMORE 8			/* No more records in map database */
++#define	YPERR_PMAP 9			/* Can't communicate with portmapper */
++#define	YPERR_YPBIND 10			/* Can't communicate with ypbind */
++#define	YPERR_YPSERV 11			/* Can't communicate with ypserv */
++#define	YPERR_NODOM 12			/* Local domain name not set */
++#define	YPERR_BADDB 13			/* yp data base is bad */
++#define	YPERR_VERS 14			/* YP version mismatch */
++#define	YPERR_ACCESS 15			/* Access violation */
++#define	YPERR_BUSY 16			/* Database is busy */
++
++/* Types of update operations */
++#define	YPOP_CHANGE 1			/* change, do not add */
++#define	YPOP_INSERT 2			/* add, do not change */
++#define	YPOP_DELETE 3			/* delete this entry */
++#define	YPOP_STORE  4			/* add, or change */
++
++__BEGIN_DECLS
++
++/* struct ypall_callback * is the arg which must be passed to yp_all */
++struct ypall_callback
++  {
++    int (*foreach) __P ((int __status, char *__key, int __keylen,
++			 char *__val, int __vallen, char *__data));
++    char *data;
++  };
++
++/* External NIS client function references. */
++extern int yp_bind __P ((__const char *));
++extern void yp_unbind __P ((__const char *));
++extern int yp_get_default_domain __P ((char **));
++extern int yp_match __P ((__const char *, __const char *, __const char *,
++			  __const int, char **, int *));
++extern int yp_first __P ((__const char *, __const char *, char **,
++			  int *, char **, int *));
++extern int yp_next __P ((__const char *, __const char *, __const char *,
++			 __const int, char **, int *, char **, int *));
++extern int yp_master __P ((__const char *, __const char *, char **));
++extern int yp_order __P ((__const char *, __const char *, unsigned int *));
++extern int yp_all __P ((__const char *, __const char *,
++			__const struct ypall_callback *));
++extern __const char *yperr_string __P ((__const int));
++extern __const char *ypbinderr_string __P ((__const int));
++extern int ypprot_err __P ((__const int));
++extern int yp_update __P ((char *, char *, unsigned,  char *,
++			   int, char *, int));
++#if 0
++extern int yp_maplist __P ((__const char *, struct ypmaplist **));
++#endif
++
++/* Exist only under BSD and Linux systems */
++extern int __yp_check __P ((char **));
++
++__END_DECLS
++
++#endif	/* __RPCSVC_YPCLNT_H__ */
+diff -Naur ../glibc-2.1.3/glibc-compat/shlib-versions glibc-2.1.3/glibc-compat/shlib-versions
+--- ../glibc-2.1.3/glibc-compat/shlib-versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/shlib-versions	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,19 @@
++# Interface revision of the compat nss_* modules.
++#
++# This must match NSS_SHLIB_REVISION in nss/nsswitch.h, 
++# which determines the library names used for service
++# names given in /etc/nsswitch.conf.
++alpha-.*-linux.*	libnss1_files=1.1
++alpha-.*-linux.*	libnss1_dns=1.1
++alpha-.*-linux.*	libnss1_db=1.1
++alpha-.*-linux.*	libnss1_compat=1.1
++alpha-.*-linux.*	libnss1_nis=1.1
++.*-.*-.*		libnss1_files=1
++.*-.*-.*		libnss1_db=1
++.*-.*-.*		libnss1_dns=1
++.*-.*-.*		libnss1_compat=1
++.*-.*-.*		libnss1_nis=1
++
++# The libNoVersion revision number
++.*-.*-.*		libNoVersion=1
++
+diff -Naur ../glibc-2.1.3/glibc-compat/stubs.c glibc-2.1.3/glibc-compat/stubs.c
+--- ../glibc-2.1.3/glibc-compat/stubs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/glibc-compat/stubs.c	2000-02-23 17:59:39.000000000 -0800
+@@ -0,0 +1,54 @@
++/*
++ * STAT stuff that breaks Applix
++ */
++
++#include <sys/stat.h>
++
++/* 1 of 3: _xstat */
++int
++_xstat (int vers, const char *name, struct stat *buf)
++{
++    return __xstat (vers, name, buf);
++}
++
++/* 2 of 3: _fxstat */
++int
++_fxstat (int vers, int fd, struct stat *buf)
++{
++    return __fxstat (vers, fd, buf);
++}
++
++/* 3 of 3: _lxstat */
++int
++_lxstat (int vers, const char *name, struct stat *buf)
++{
++    return __lxstat (vers, name, buf);
++}
++
++
++/*
++ * __setjmp stuff that breaks again Applix
++ */
++#include <setjmp.h>
++
++int __setjmp(jmp_buf env)
++{
++    return _setjmp(env);
++}
++
++
++/*
++ * __setfpucw break several math packages that ahve not heard of
++ * the standard _FPU_SETCW() way of setting the control word for the FPU
++ */
++#include <fpu_control.h>
++void __setfpucw(fpu_control_t cw)
++{
++
++#if defined(_FPU_SETCW)
++    _FPU_SETCW(cw);
++#endif /* _FPU_SETCW */
++
++    /* others are a no-op. Why doesn't alpha has something like this? */
++}
++
+diff -Naur ../glibc-2.1.3/hesiod/hesiod.c glibc-2.1.3/hesiod/hesiod.c
+--- ../glibc-2.1.3/hesiod/hesiod.c	1998-05-25 01:40:13.000000000 -0700
++++ glibc-2.1.3/hesiod/hesiod.c	1998-07-09 11:46:28.000000000 -0700
+@@ -41,7 +41,7 @@
+  * it uses res_send() and accesses _res.
+  */
+ 
+-static const char rcsid[] = "$Id: hesiod.c,v 1.5 1998/05/25 08:40:13 drepper Exp $";
++static const char rcsid[] = "$Id: hesiod.c,v 1.1.1.1 1998/07/09 18:46:28 gafton Exp $";
+ 
+ #include <sys/types.h>
+ #include <netinet/in.h>
+diff -Naur ../glibc-2.1.3/hesiod/hesiod.h glibc-2.1.3/hesiod/hesiod.h
+--- ../glibc-2.1.3/hesiod/hesiod.h	1997-09-15 17:16:33.000000000 -0700
++++ glibc-2.1.3/hesiod/hesiod.h	1998-02-07 12:04:52.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $Id: hesiod.h,v 1.1 1997/09/16 00:16:33 drepper Exp $ */
++/* $Id: hesiod.h,v 1.1.1.1 1998/02/07 20:04:52 gafton Exp $ */
+ 
+ /*
+  * Copyright (c) 1996 by Internet Software Consortium.
+diff -Naur ../glibc-2.1.3/hesiod/hesiod_p.h glibc-2.1.3/hesiod/hesiod_p.h
+--- ../glibc-2.1.3/hesiod/hesiod_p.h	1997-09-15 17:16:33.000000000 -0700
++++ glibc-2.1.3/hesiod/hesiod_p.h	1998-02-07 12:04:52.000000000 -0800
+@@ -16,7 +16,7 @@
+  */
+ 
+ /*
+- * $Id: hesiod_p.h,v 1.1 1997/09/16 00:16:33 drepper Exp $
++ * $Id: hesiod_p.h,v 1.1.1.1 1998/02/07 20:04:52 gafton Exp $
+  */
+ 
+ /*
+diff -Naur ../glibc-2.1.3/hurd/hurdmalloc.c glibc-2.1.3/hurd/hurdmalloc.c
+--- ../glibc-2.1.3/hurd/hurdmalloc.c	1996-12-19 17:32:01.000000000 -0800
++++ glibc-2.1.3/hurd/hurdmalloc.c	1998-02-07 12:05:05.000000000 -0800
+@@ -37,6 +37,9 @@
+ /*
+  * HISTORY
+  * $Log: hurdmalloc.c,v $
++ * Revision 1.1.1.1  1998/02/07 20:05:05  gafton
++ * import from sourceware
++ *
+  * Revision 1.13  1996/12/20 01:32:01  drepper
+  * Update from main archive 961219
+  *
+diff -Naur ../glibc-2.1.3/include/nlist.h glibc-2.1.3/include/nlist.h
+--- ../glibc-2.1.3/include/nlist.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/include/nlist.h	1998-02-07 12:07:02.000000000 -0800
+@@ -0,0 +1 @@
++#include <misc/nlist.h>
+diff -Naur ../glibc-2.1.3/linuxthreads/Banner glibc-2.1.3/linuxthreads/Banner
+--- ../glibc-2.1.3/linuxthreads/Banner	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Banner	1998-08-28 03:07:16.000000000 -0700
+@@ -0,0 +1 @@
++linuxthreads-0.8 by Xavier Leroy
+diff -Naur ../glibc-2.1.3/linuxthreads/ChangeLog glibc-2.1.3/linuxthreads/ChangeLog
+--- ../glibc-2.1.3/linuxthreads/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/ChangeLog	2000-02-23 13:17:31.000000000 -0800
+@@ -0,0 +1,1257 @@
++2000-02-22  Ulrich Drepper  <drepper@redhat.com>
++
++	* semaphore.h (SEM_FAILED): Use 0 not NULL.
++
++2000-02-14  Ulrich Drepper  <drepper@redhat.com>
++
++	* condvar.c (pthread_cond_timedwait_relative_old): Tight loop with
++	nanosleep does not work either.  Get absolute time inside the
++	loop.
++	(pthread_cond_timedwait_relative_new): Likewise.
++	Patch by Kaz Kylheku <kaz@ashi.footprints.net>.
++
++2000-02-13  Ulrich Drepper  <drepper@redhat.com>
++
++	* condvar.c (pthread_cond_timedwait_relative_old): Undo last patch
++	but keep the code around.  A bug in the kernel prevent us from
++	using the code.
++	(pthread_cond_timedwait_relative_new): Likewise.
++	(PR libc/1597 and libc/1598).
++
++2000-02-01  Kaz Kylheku  <kaz@ashi.footprints.net>
++
++	* condvar.c (pthread_cond_timedwait_relative_old): Do tight
++	loop around nanosleep calls instead of around most of the function
++	(pthread_cond_timedwait_relative_new): Likewise.
++	body.  Got rid of backwards goto and one local.
++
++2000-01-31  Ulrich Drepper  <drepper@redhat.com>
++
++	* condvar.c (pthread_cond_timedwait_relative_old): Recompute time
++	before every nanosleep call to account for time spent in the rest
++	of the function.
++	(pthread_cond_timedwait_relative_new): Likewise.
++	Patch by khendricks@ivey.uwo.ca (PR libc/1564).
++
++2000-01-29  Ulrich Drepper  <drepper@redhat.com>
++
++	* condvar.c (pthread_cond_timedwait_relative_old): Get remaining time
++	from nanosleep call so that in case we restart we only wait for the
++	remaining time.
++	(pthread_cond_timedwait_relative_new): Likewise.
++	Patch by khendricks@ivey.uwo.ca (PR libc/1561).
++
++2000-01-18  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_allocate_stack): Compute guard page address
++	correctly.  Patch by HJ Lu.
++
++2000-01-12  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h (pthread_readlock_info): New structure.
++	(_pthread_descr_struct): Add p_readlock_list, p_readlock_free, and
++	p_untracked_readlock_count.
++	* pthread.c (__pthread_initial_thread, pthread_manager_thread):
++	Add initializers for new fields.
++	* manager.c (pthread_free): Free read/write lock lists.
++	* queue.h (queue_is_empty): New function.
++	* rwlock.c: Implement requirements about when readers should get
++	locks assigned.
++	* sysdeps/pthread/pthread.h
++	(PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP): New definition.
++	* sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_rwlock_t):
++	Define this name as well.
++	Patches by Kaz Kylheku <kaz@ashi.footprints.net>.
++
++2000-01-06  Andreas Jaeger  <aj@suse.de>
++
++	* pthread.c: Remove extra initializer.
++
++2000-01-05  Ulrich Drepper  <drepper@cygnus.com>
++
++	* pthread.c (__pthread_initial_thread, pthread_manager_thread):
++	Adjust initializers for struct _pthread_descr_struct change.
++	* internals.h (struct _pthread_descr_struct): Move new elements to
++	the end.
++
++2000-01-03  Kaz Kylheku  <kaz@ashi.footprints.net>
++
++	Redesigned how cancellation unblocks a thread from internal
++	cancellation points (sem_wait, pthread_join,
++	pthread_cond_{wait,timedwait}).
++	Cancellation won't eat a signal in any of these functions
++	(*required* by POSIX and Single Unix Spec!).
++	* condvar.c: Spontaneous wakeup on pthread_cond_timedwait won't eat a
++	simultaneous condition variable signal (not required by POSIX
++	or Single Unix Spec, but nice).
++	* spinlock.c: __pthread_lock queues back any received restarts
++	that don't belong to it instead of assuming ownership of lock
++	upon any restart; fastlock can no longer be acquired by two threads
++	simultaneously.
++	* restart.h: Restarts queue even on kernels that don't have
++	queued real time signals (2.0, early 2.1), thanks to atomic counter,
++	avoiding a rare race condition in pthread_cond_timedwait.
++
++1999-12-28  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/alpha/pt-machine.h:  Move stack_pointer definition to the
++	beginning.
++
++	* manager.c (__pthread_start): Add one more cast to assignment of
++	arg to prevent warning on 64bit machines.
++
++1999-12-21  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_handle_create): Set p_pid of new thread
++	before calling the callback function to report a new thread.
++
++1999-12-20  Andreas Jaeger  <aj@suse.de>
++
++	* pthread.c (pthread_initialize): Move getrlimit call after
++	setting of errno.
++
++1999-12-01  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/i386/pt-machine.h: Move stack_pointer definition to the
++	beginning.
++	* sysdeps/i386/i686/pt-machine.h: Likewise.
++	Patches by Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>.
++
++1999-11-23  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_start_thread_event): Initialize p_pid already
++	here.
++
++1999-11-22  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h: Add prototype for __pthread_manager_event.
++	* manager.c (__pthread_manager_event): New function.
++	(pthread_start_thread_event): Correct computation of self.
++	Use INIT_THREAD_SELF.
++	* pthread.c (__pthread_manager_thread): Initialize p_lock.
++	(__pthread_initialize_manager): Respect event flags also for creation
++	of the manager thread.
++
++1999-11-08  Ulrich Drepper  <drepper@cygnus.com>
++
++	* pthread.c (__pthread_initialize_manager): Initialize
++	__pthread_manager_thread.p_tid.
++
++1999-11-02  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h: Declare __pthread_last_event.
++	* manager.c: Define __pthread_last_event.
++	(pthread_handle_create): Set __pthread_last_event.
++	(pthread_exited): Likewise.
++	* join.c (pthread_exit): Likewise.
++
++	* Makefile (libpthread-routines): Add events.
++	* events.c: New file.
++	* internals.h: Protect against multiple inclusion.
++	Include thread_dbP.h header.
++	(struct _pthread_descr_struct): Add new fields p_report_events and
++	p_eventbuf.
++	Declare event reporting functions.
++	* join.c (pthread_exit): Signal event if this is wanted.
++	* manager.c (__pthread_threads_events): New variable.
++	(pthread_handle_create): Take new parameters with event information.
++	Signal TD_CREATE event if wanted.
++	(__pthread_manager): Adjust pthread_handle_create call.
++	(pthread_start_thread_event): New function.  Block until manager is
++	finished and then call pthread_start_thread.
++	(pthread_exited): Signal TD_REAP event if wanted.
++
++1999-10-26  Ulrich Drepper  <drepper@cygnus.com>
++
++	* restart.h (suspend_with_cancellation): Rewrite as a macro.
++
++	* condvar.c (pthread_cond_timedwait_relative): Don't mark as inline.
++
++1999-10-21  Xavier Leroy  <Xavier.Leroy@inria.fr>
++
++	* linuxthreads/pthread.c: For i386, wrap pthread_handle_sigrestart
++	and pthread_handle_sigcancel with functions that restore
++	%gs from the signal context.  For each signal handling function,
++	two wrappers are required, one for a non-RT signal and one for
++	a RT signal.
++	* linuxthreads/signal.c: For i386, add code to restore %gs
++	from the signal context in pthread_sighandler and
++	pthread_sighandler_rt.
++
++1999-10-09  Andreas Jaeger  <aj@suse.de>
++
++	* internals.h: Add __new_sem_post to get prototype in
++	manager.c; include semaphore.h for needed types.
++
++1999-10-08  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (__pthread_manager) [REQ_POST]: Use __new_sem_post
++	directly instead of calling sem_post which should not be necessary
++	but is faster and might help in some case to work around problems.
++
++1999-09-25  Ulrich Drepper  <drepper@cygnus.com>
++
++	* condvar.c (pthread_cond_timedwait_relative): Never return with
++	EINTR.  Patch by Andreas Schwab.
++
++1999-09-19  Ulrich Drepper  <drepper@cygnus.com>
++
++	* signals.c (sigaction): Correct last patch.  Don't select
++	pthread_sighandler_rt based on the signal number but instead of
++	the SA_SIGINFO flag.
++
++1999-09-23  Ulrich Drepper  <drepper@cygnus.com>
++
++	* specific.c: Move definitions of struct pthread_key_struct and
++	destr_function to ...
++	* internals.h: ...here.
++
++1999-09-03  Andreas Schwab  <schwab@suse.de>
++
++	* ptfork.c (__fork): Renamed from fork and use __libc_fork.  Add
++	fork as weak alias.
++	(__vfork): New function, alias vfork.
++	* Versions: Export __fork, vfork, and __vfork in libpthread.
++
++1999-08-23  Andreas Schwab  <schwab@suse.de>
++
++	* signals.c (pthread_sighandler): Add SIGCONTEXT_EXTRA_ARGS to
++	call to signal handler.
++
++1999-08-20  Ulrich Drepper  <drepper@cygnus.com>
++
++	* pthread.c (__pthread_reset_main_thread): Undo last change.
++	(__pthread_kill_other_threads_np): Reset signal handlers for the
++	signals we used in the thread implementation here.
++
++1999-08-19  Ulrich Drepper  <drepper@cygnus.com>
++
++	* pthread.c (__pthread_reset_main_thread): Reset signal handlers
++	for the signals we used in the thread implementation [PR libc/1234].
++
++	* Versions: Export __pthread_kill_other_threads_np from libpthread
++	for GLIBC_2.1.2.
++
++	* signals.c: Pass sigcontext through wrapper to the user function.
++
++1999-08-01  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Versions [ld.so] (GLIBC_2.0): Export __libc_internal_tsd_get and
++	__libc_internal_tsd_set.
++
++1999-07-29  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* manager.c: Remove inclusion of <linux/tasks.h> since it's not
++	needed anymore.
++
++1999-07-16  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* internals.h: Align _pthread_descr_struct to 32 bytes.
++	Reported by Tim Hockin <thockin@cobaltnet.com>, close PR libc/1206.
++
++1999-07-09  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_handle_create): Free mmap region after stack
++	if clone failed.  Patch by Kaz Kylheku <kaz@ashi.FootPrints.net>.
++
++1999-07-09  Cristian Gafton  <gafton@redhat.com>
++
++	* Makefile (libpthread-routines): Add oldsemaphore routine.
++	* Versions: Add sem_destroy, sem_getvalue, sem_init, sem_post,
++	sem_trywait, and sem_wait to GLIBC_2.1.
++	* oldsemaphore.c: New file.
++	* semaphore.c: Add default_symbol_versions for the changed functions.
++	(__new_sem_init): Rename from sem_init.
++	(__new_sem_post): Rename from sem_post.
++	(__new_sem_wait): Rename from sem_wait.
++	(__new_sem_trywait): Rename from sem_trywait.
++	(__new_sem_getvalue): Rename from sem_getvalue.
++	(__new_sem_destroy): Rename from sem_destroy.
++
++1999-06-23  Robey Pointer  <robey@netscape.com>
++
++	* internals.h: Added p_nextlock entry to separate queueing for a
++	lock from queueing for a CV (sometimes a thread queues on a lock
++	to serialize removing itself from a CV queue).
++	* pthread.c: Added p_nextlock to initializers.
++	* spinlock.c: Changed to use p_nextlock instead of p_nextwaiting.
++
++1999-05-23  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* man/pthread_cond_init.man: Correct example.
++	Reported by Tomas Berndtsson <tomas@nocrew.org>.
++
++	* linuxthreads.texi (Condition Variables): Likewise.
++
++1999-05-18  Jakub Jelinek  <jj@ultra.linux.cz>
++
++	* sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): Use
++	casx not cas, also successful casx returns the old value in rd
++	and not the new value.
++
++1999-05-16  Xavier Leroy  <Xavier.Leroy@inria.fr>
++
++	* manager.c: If pthread_create() is given a NULL attribute
++	and the thread manager runs with a realtime policy, set the
++	scheduling policy of the newly created thread back to SCHED_OTHER.
++	* manager.c: If the PTHREAD_INHERIT_SCHED attribute is given,
++	initialize the schedpolicy field of new_thread->p_start_args
++	to that of the calling thread.
++
++1999-04-29  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): cas
++	instruction does not allow memory element to use offset.
++
++1999-04-28  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_allocate_stack): Optimize initialization of new
++	thread descriptor.
++
++	* sysdeps/pthread/bits/libc-lock.h (__libc_lock_define_initialized):
++	Don't use initializer since it is all zeroes.
++	(__libc_once_define): Likewise.
++
++1999-04-16  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* sysdeps/arm/Implies: Removed since cmpxchg/no-cmpxchg
++	doesn't exist anymore.
++	* sysdeps/i386/Implies: Likewise.
++	* sysdeps/m68k/Implies: Likewise.
++	* sysdeps/mips/Implies: Likewise.
++	* sysdeps/powerpc/Implies: Likewise.
++	* sysdeps/sparc/sparc32/Implies: Likewise.
++	* sysdeps/sparc/sparc64/Implies: Likewise.
++
++1999-04-15  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/alpha/bits/semaphore.h: Removed.
++	* sysdeps/powerpc/bits/semaphore.h: Removed.
++	* sysdeps/pthread/cmpxchg/bits/semaphore.h: Removed.
++	* sysdeps/pthread/no-cmpxchg/bits/semaphore.h: Removed.
++	* Makefile (headers): Remove bits/semaphore.h.
++
++	* semaphore.h: Define _pthread_descr if necessary.
++	Don't include limits.h.  Define SEM_VALUE_MAX directly.
++	Define SEM_FAILED.
++	(sem_t): Protect element names with leading __.
++	Add declarations for sem_close, sem_open, and sem_unlink.
++	* semaphore.c: Adjust all functions for new element names.
++	Define sem_close, sem_open, and sem_unlink.
++	* Versions (libthread): Add sem_close, sem_open, and sem_unlink for
++	GLIBC_2.1.1.
++	* sysdeps/pthread/bits/pthreadtypes.h: Define _pthread_descr only if
++	necessary.
++
++1999-03-16  H.J. Lu  <hjl@gnu.org>
++
++	* specific.c (pthread_key_delete): Check th->p_terminated to see
++	if the thread is running.
++
++	* Versions (__libc_internal_tsd_get, __libc_internal_tsd_set):
++	Added to GLIBC_2.0 for libc.so.
++
++1999-02-12  H.J. Lu  <hjl@gnu.org>
++
++	* Versions (__libc_current_sigrtmin, __libc_current_sigrtmax,
++	__libc_allocate_rtsig): Added to GLIBC_2.1.
++
++	* internals.h (DEFAULT_SIG_RESTART): Removed.
++	(DEFAULT_SIG_CANCEL): Removed.
++
++	* pthread.c (init_rtsigs, __libc_current_sigrtmin,
++	__libc_current_sigrtmax, __libc_allocate_rtsig): New functions.
++	(__pthread_sig_restart, __pthread_sig_cancel,
++	__pthread_sig_debug): Initialized.
++	(pthread_initialize): Call init_rtsigs () to initialize
++	real-time signals.
++
++1999-02-03  H.J. Lu  <hjl@gnu.org>
++
++	* manager.c (__pthread_manager): Do block __pthread_sig_debug.
++	Don't restart the thread which sent REQ_DEBUG.
++	(pthread_start_thread): Check if __pthread_sig_debug > 0
++	before debugging.
++
++	* pthread.c (__pthread_initialize_manager): Suspend ourself
++	after sending __pthread_sig_debug to gdb instead of
++	__pthread_sig_cancel.
++
++1999-01-24  H.J. Lu  <hjl@gnu.org>
++
++	* manager.c (__pthread_manager): Delete __pthread_sig_debug
++	from mask if __pthread_sig_debug > 0.
++	(pthread_handle_create): Increment __pthread_handles_num.
++
++	* manager.c (pthread_handle_create): Don't pass CLONE_PTRACE to clone.
++	* pthread.c (__pthread_initialize_manager): Likewise.
++
++	* pthread.c (pthread_initialize): Use __libc_allocate_rtsig (1)
++	instead of __libc_allocate_rtsig (2).
++	(__pthread_initialize_manager): Send __pthread_sig_debug to gdb
++	instead of __pthread_sig_cancel.
++	(pthread_handle_sigdebug): Fix comments.
++
++1999-01-21  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_allocate_stack): Set
++	__pthread_nonstandard_stacks if user-specified stack is used.
++
++1999-01-16  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _LFS_ASYNCHRONOUS_IO,
++	_LFS_LARGEFILE, _LFS64_LARGEFILE, and _LFS64_STDIO from Unix98.
++
++1999-01-07  Xavier Leroy  <Xavier.Leroy@inria.fr>
++
++	* pthread.c: Use a third signal __pthread_sig_debug distinct
++	from __pthread_sig_cancel to notify gdb when a thread is
++	created
++	* manager.c: Likewise.
++	* internals.h: Likewise.
++	* signals.c: The implementation of sigwait(s) assumed that
++	all signals in s have signal handlers already attached.
++	This is not required by the standard, so make it work
++	also if some of the signals have no handlers.
++
++1999-01-05  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>
++
++	* linuxthreads.texi: Remove pointers from first @node.  Move old
++	@node spec inside comment.
++
++1998-12-31  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/bits/stdio-lock.h: Define _IO_lock_lock and
++	_IO_lock_unlock.
++
++1998-12-29  Ulrich Drepper  <drepper@cygnus.com>
++
++	* semaphore.c (sem_trywait): Don't forget to unlock the semaphore
++	lock.  Patch by Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>.
++
++1998-12-21  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c: Threads now send __pthread_sig_cancel on termination.
++	Change clone call and signal masks.
++	* thread.c (pthread_handle_sigrestart): Remove special code for
++	manager.
++	(pthread_handle_sigcancel): In manager thread call
++	__pthread_manager_sighandler.
++	* sysdeps/i386/pt-machine.h (__compare_and_swap): Add memory clobber.
++	* sysdeps/i386/i686/pt-machine.h: Likewise.
++	Patches by Xavier Leroy.
++
++1998-12-14  Ulrich Drepper  <drepper@cygnus.com>
++
++	* spinlock.c (__pthread_unlock): Don't crash if called for an
++	untaken mutex.  Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>.
++
++	* Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce
++	overall runtime.
++
++1998-12-13  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Examples/ex3.c: Wait until all threads are started before
++	searching for the number to avoid race condition on very fast
++	systems.
++
++1998-12-08  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* sysdeps/pthread/pthread.h: Remove __pthread_setcanceltype
++	declaration since it's not needed.
++
++	* sysdeps/pthread/pthread.h: Move internal functions to ...
++	* internals.h: ...here.
++
++1998-12-02  H.J. Lu  <hjl@gnu.org>
++
++	* pthread.c (__pthread_sig_restart): Initiliaze to 0 if
++	SIGRTMIN is defined.
++	(__pthread_sig_cancel): Likewise.
++
++1998-12-01  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* wrapsyscall.c: Include <sys/mman.h> for msync,
++	<stdlib.h> for system and <termios.h> for tcdrain prototype.
++	Correct msync declaration.
++
++1998-11-29  Roland McGrath  <roland@baalperazim.frob.com>
++
++	* sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_define, __libc_tsd_get,
++	__libc_tsd_set): New macros for new interface.
++	* no-tsd.c: New file, provide uninitialized defns of
++	__libc_internal_tsd_get and __libc_internal_tsd_set.
++	* Makefile (routines): Add no-tsd.
++
++1998-10-12  Roland McGrath  <roland@baalperazim.frob.com>
++
++	* internals.h: Include <bits/libc-tsd.h>, not <bits/libc-lock.h>.
++	* sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
++	__libc_internal_tsd_set): Move decls to ...
++	* sysdeps/pthread/bits/libc-tsd.h: New file for __libc_internal_tsd_*
++	declarations.
++
++	* sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
++	__libc_internal_tsd_set): Make these pointers to functions, not
++	functions; remove #pragma weak decls for them.
++	* specific.c (__libc_internal_tsd_get, __libc_internal_tsd_set):
++	Define static functions and initialized pointers to them.
++
++1998-11-18  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Makefile (CFLAGS-mutex.c): Define as -D__NO_WEAK_PTHREAD_ALIASES.
++	(CFLAGS-specific.c): Likewise.
++	(CFLAGS-pthread.c): Likewise.
++	(CFLAGS-ptfork.c): Likewise.
++	(CFLAGS-cancel.c): Likewise.
++	* sysdeps/pthread/bits/libc-lock.h: Don't mark __pthread_* functions
++	as weak references if __NO_WEAK_PTHREAD_ALIASES is defined.
++
++	* mutex.c (pthread_mutex_init): Define as strong symbol.
++	(pthread_mutex_destroy): Likewise.
++	(pthread_mutex_trylock): Likewise.
++	(pthread_mutex_lock): Likewise.
++	(pthread_mutex_unlock): Likewise.
++	(pthread_mutexattr_init): Likewise.
++	(pthread_mutexattr_destroy): Likewise.
++	(pthread_once): Likewise.
++	* ptfork.c (pthread_atfork): Likewise.
++	* specific.c (pthread_key_create): Likewise.
++	(pthread_setspecific): Likewise.
++	(pthread_getspecific): Likewise.
++
++1998-11-15  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>
++
++	* linuxthreads.texi: Fix punctuation after xref.
++
++1998-11-10  H.J. Lu  <hjl@gnu.org>
++
++	* sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine NR_OPEN
++	if it is defined in <linux/limits.h>.
++
++1998-10-29 14:28  Ulrich Drepper  <drepper@cygnus.com>
++
++	* spinlock.h (__pthread_trylock): Define inline.
++	(__pthread_lock): Add extra parameter to declaration.  Declare
++	using internal_function.
++	(__pthread_unlock): Declare using internal_function.
++	* spinlock.c (__pthread_lock): Add new parameter.  Use it instead
++	of local variable self.  Avoid recomputing self.  Define using
++	internal_function.
++	(__pthread_trylock): Remove.
++	(__pthread_unlock): Define using internal_function.
++	* cancel.c: Adjust for __pthread_lock interface change.  Use already
++	computed self value is possible.
++	* condvar.c: Likewise.
++	* join.c: Likewise.
++	* manager.c: Likewise.
++	* mutex.c: Likewise.
++	* pthread.c: Likewise.
++	* rwlock.c: Likewise.
++	* semaphore.c: Likewise.
++	* signals.c: Likewise.
++
++1998-10-27 13:46  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/pthread.h (struct _pthread_cleanup_buffer): Prepend
++	__ to field names of the struct.
++	* sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_fastlock):
++	Likewise.
++	(pthread_attr_t): Likewise.
++	(pthread_cond_t): Likewise.
++	(pthread_condattr_t): Likewise.
++	(pthread_mutex_t): Likewise.
++	(pthread_mutexattr_t): Likewise.
++	(pthread_rwlock_t): Likewise.
++	(pthread_rwlockattr_t): Likewise.
++	* attr.c: Adjust for pthread.h and pthreadtypes.h change.
++	* cancel.c: Likewise.
++	* condvar.c: Likewise.
++	* manager.c: Likewise.
++	* mutex.c: Likewise.
++	* pthread.c: Likewise.
++	* ptlongjmp.c: Likewise.
++	* rwlock.c: Likewise.
++	* spinlock.c: Likewise.
++
++1998-10-09  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/i386/pt-machine.h (get_eflags, set_eflags): Mark these
++	also with PT_EI.
++
++	* sysdeps/i386/i686/pt-machine.h: Remove unused inline
++	definitions.
++
++	* Makefile (libpthread-routines): Add pt-machine.
++	* pt-machine.c: New file.
++	* sysdeps/alpha/pt-machine.h: Define PT_EI as extern inline is not
++	yet defined.  Use PT_EI in extern inline definitions.
++	* sysdeps/arm/pt-machine.h: Likewise.
++	* sysdeps/i386/pt-machine.h: Likewise.
++	* sysdeps/i386/i686/pt-machine.h: Likewise.
++	* sysdeps/m68k/pt-machine.h: Likewise.
++	* sysdeps/mips/pt-machine.h: Likewise.
++	* sysdeps/powerpc/pt-machine.h: Likewise.
++	* sysdeps/sparc/sparc32/pt-machine.h: Likewise.
++	* sysdeps/sparc/sparc64/pt-machine.h: Likewise.
++
++1998-10-02  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* semaphore.h: Include <sys/types.h> so that _pthread_descr
++	is declared.
++
++1998-09-15  David S. Miller  <davem@pierdol.cobaltmicro.com>
++
++	* sysdeps/sparc/sparc32/pt-machine.h (INIT_THREAD_SELF): Add nr
++	argument.
++	* sysdeps/sparc/sparc64/pt-machine.h (INIT_THREAD_SELF): Likewise.
++
++1998-09-12 14:24 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>
++
++	* linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h: Add
++	multiple inclusion guard.
++
++1998-09-02 11:08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* signals.c (sigaction): Check that sig is less than NSIG to avoid
++	array index overflow.
++
++1998-09-06 10:56  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/semaphore.h: New file.
++
++1998-09-06 09:08  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/bits/libc-lock.h (enum __libc_tsd_key_t): Add
++	_LIBC_TSD_KEY_DL_ERROR.
++
++1998-08-31  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/i386/i686/pt-machine.h (testandset): Add memory clobber.
++	* sysdeps/i386/pt-machine.h: Likewise.
++	Suggested by Roland McGrath.
++
++1998-08-28 13:58  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h: Also define THREAD_GETMEM_NC and THREAD_SETMEM_NC to
++	access thread data with non-constant offsets.
++	* specific.c: Use THREAD_GETMEM_NC and THREAD_SETMEM_NC where
++	necessary.
++
++	* sysdeps/i386/useldt.h: Fix typo.  Add THREAD_GETMEM_NC and
++	THREAD_SETMEM_NC definitions.
++
++	* sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM_NC and
++	THREAD_SETMEM_NC.
++	* sysdeps/sparc/sparc64/pt-machine.h: Likewise.
++
++1998-08-26 15:46  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h: Define THREAD_GETMEM and THREAD_SETMEM to default if
++	not already defined.
++	(struct _pthread_descr_struct): Add p_self and p_nr field.
++	* manager.c (__pthread_handles): Define second element to point
++	to manager thread.
++	(__pthread_handles_num): Initialize to 2.
++	(__pthread_manager): Use INIT_THREAD_SELF with two arguments.
++	(pthread_start_thread): Likewise.
++	(pthread_handle_create): Start search for free slot at entry 2.
++	Initialize new fields p_self and p_nr.
++	Call __clone with CLONE_PTRACE if available.
++	(pthread_free): Call FREE_THREAD_SELF if available.
++	* pthread.c (__pthread_initial_thread): Initialize new fields.
++	(__pthread_manager_thread): Likewise.
++	(__pthread_initialize_manager): Call __clone with CLONE_PTRACE.
++
++	* cancel.c: Use THREAD_GETMEM and THREAD_SETMEM to access the
++	elements of the thread descriptor.
++	* condvar.c: Likewise.
++	* errno.c: Likewise.
++	* join.c: Likewise.
++	* manager.c: Likewise.
++	* pthread.c: Likewise.
++	* ptlongjmp.c: Likewise.
++	* semaphore.c: Likewise.
++	* signals.c: Likewise.
++	* specific.c: Likewise.
++	* spinlock.c: Likewise.
++
++	* sysdeps/alpha/pt-machine.h (INIT_THREAD_SELF): Add extra parameter.
++
++	* sysdeps/i386/useldt.h: New file.
++	* sysdeps/i386/i686/pt-machine.h: Show how to use this file.
++
++	* sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM and
++	THREAD_SETMEM using __thread_self.
++	* sysdeps/sparc/sparc64/pt-machine.h: Likewise.
++
++1998-08-24  Geoff Keating  <geoffk@ozemail.com.au>
++
++	* spinlock.c (__pthread_lock): Reset p_nextwaiting to NULL if it
++	turned out that we didn't need to queue after all.
++
++1998-08-22  Geoff Keating  <geoffk@ozemail.com.au>
++
++	* sysdeps/powerpc/pt-machine.h: Remove testandset, it's not used
++	and wastes space; correct types.
++
++1998-08-08 11:18  H.J. Lu  <hjl@gnu.org>
++
++	* signals.c (sigaction): Handle NULL argument.
++
++1998-08-04  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/unix/sysv/linux/bits/sigthread.h: Use __sigset_t instead
++	of sigset_t.
++
++1998-08-02  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* Makefile (linuxthreads-version): Extract correct number from
++	Banner.
++
++1998-07-29  Xavier Leroy  <Xavier.Leroy@inria.fr>
++
++	* Banner: Bump version number to 0.8
++	* FAQ.html: Many updates, in particular w.r.t. debugging.
++	* manager.c: Support for non-default stacksize for
++	LinuxThreads-allocated stacks;
++	don't use guard pages for stacks with default size, rely on
++	rlimit(RLIMIT_STACK) instead (it's cheaper).
++	* attr.c: Likewise.
++	* cancel.c: Use __pthread_sig_cancel and __pthread_sig_restart
++	everywhere instead of PTHREAD_SIG_CANCEL and PTHREAD_SIG_RESTART.
++	* condvar.c: Likewise.
++	* internals.h: Likewise.
++	* restart.h: Likewise.
++	* signals.c: Likewise.
++	* pthread.c: Likewise; set rlimit(RLIMIT_STACK) as we need it.
++
++1998-07-23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* weaks.c: Define pthread_mutexattr_[sg]ettype instead of
++	__pthread_mutexattr_[sg]ettype.  Add more weak aliases.
++	* Versions: Put __pthread_mutexattr_settype under version
++	GLIBC_2.0.  Don't export __pthread_mutexattr_setkind_np and
++	__pthread_mutexattr_gettype.
++
++1998-07-23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* sysdeps/pthread/bits/libc-lock.h: Make
++	__pthread_mutexattr_settype weak.  Don't make
++	__pthread_mutexattr_setkind_np weak.
++
++1998-07-16 10:52  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_handle_create): Check whether sched_setscheduler
++	call can succeed here.
++
++	* mutex.c: Define __pthread_mutexattr_settype and make
++	__pthread_mutexattr_setkind_np an alias.
++	Likewise for __pthread_mutexattr_gettype.
++
++1998-07-15 11:00 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>
++
++	* attr.c (pthread_attr_setschedpolicy): Don't check whether caller
++	is root.
++
++1998-07-14 19:38  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end.
++
++1998-07-11  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* Examples/ex6.c: Include <unistd.h> for usleep.
++
++1998-06-13 11:04  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* Examples/ex4.c (main): Use exit, not pthread_exit.
++
++1998-07-09 13:39  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Versions: Add __pthread_mutexattr_gettype and
++	__pthread_mutexattr_settype.
++	* lockfile.c: Use __pthread_mutexattr_settype instead of
++	__pthread_mutexattr_setkind_np.
++	* mutex.c: Define __pthread_mutexattr_gettype and
++	__pthread_mutexattr_settype.
++	* weak.c: Likewise.
++	* sysdeps/pthread/pthread.h: Declare __pthread_mutexattr_gettype and
++	__pthread_mutexattr_settype.
++	* sysdeps/pthread/bits/libc-lock.h (__libc_lock_init_recursive):
++	Use __pthread_mutexattr_settype.
++
++1998-07-08 22:26  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Versions: Add pthread_mutexattr_gettype, pthread_mutexattr_settype.
++	* mutex.c: Define weak alias pthread_mutexattr_gettype and
++	pthread_mutexattr_settype.
++	* sysdeps/pthread/pthread.h: Declare these functions.
++	Move pthread_sigmask and pthread_kill declaration in separate header.
++	* sysdeps/unix/sysv/linux/bits/sigthread.h: New file.
++
++1998-07-07 15:20  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Makefile: Add rules to compile and run tests.
++	* Examples/ex1.c: Little changes to fix warnings.
++	* Examples/ex2.c: Likewise.
++	* Examples/ex3.c: Likewise.
++	* Examples/ex4.c: Likewise.
++	* Examples/ex5.c: Likewise.
++	* Examples/ex6.c: New file.
++
++1998-07-05 11:54  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Versions: Add pthread_attr_init to GLIBC_2.1 version in libc.
++
++1998-07-01  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* attr.c: Include <string.h>.
++
++1998-06-30 11:47  Ulrich Drepper  <drepper@cygnus.com>
++
++	* attr.c: Include errno.h.  Use memcpy to copy sched_param.
++	* internals.h: Include limits.h.
++	* manager.c: Use memcpy to copy sched_param.
++	* ptfork.c: Include errno.h.
++	* pthread.c: Likewise.
++	* semaphore.c: Likewise.
++	* specific.c: Likewise.
++	* spinlock.h: Likewise.
++	* sysdeps/pthread/pthread.h: Include only allowed headers.  Move
++	type definition to ...
++	* sysdeps/pthread/bits/pthreadtypes.h: ...here.  New file.
++
++1998-06-29 12:34  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/pthread.h: Use __PMT not __P for function pointers.
++
++	* sysdeps/pthread/pthread.h: Define various PTHREAD_* symbols also
++	as macros as demanded in POSIX.1, Annex C.
++
++1998-06-29 12:29  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h (struct pthread_request): For free use pthread_t
++	instead of pthread_descr.
++	* join.c (pthread_join): Pass thread_id, not th to manager.
++	(pthread_detach): Likewise.
++	* manager.c (__pthread_manager): Except thread ID in FREE_REQ case.
++	(pthread_exited): Remove detached queue code.
++	(pthread_handle_free): Expect thread ID parameter and use it to
++	validate the thread decsriptor.  Don't use detached queue.
++	Patches by Xavier Leroy.
++
++1998-06-27  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* libpthread.map: Export accept, longjmp, sigaction, siglongjmp,
++	_IO_flockfile, _IO_ftrylockfile, _IO_funlockfile,
++	__pthread_atfork, __pthread_key_create, __pthread_once.
++	* internals.h: Doc fix.
++	* pthread.c (__pthread_initialize): Define again.
++
++1998-06-26  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_exited): If thread is not detached put it on
++	special list.
++	(pthread_handle_free): If thread is not on list with living threads
++	search on list with detached threads.
++
++	* sysdeps/pthread/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Correct
++	for new definition of pthread_rwlock_t.
++
++	* spinlock.c: Correct test whether to compile
++	__pthread_compare_and_swap or not.
++
++1998-06-25 19:27  Ulrich Drepper  <drepper@cygnus.com>
++
++	* attr.c: Finish user stack support.  Change locking code to be safe
++	in situations with different priorities.
++	* cancel.c: Likewise.
++	* condvar.c: Likewise.
++	* internals.h: Likewise.
++	* join.c: Likewise.
++	* manager.c: Likewise.
++	* mutex.c: Likewise.
++	* pthread.c: Likewise.
++	* ptlongjmp.c: Likewise.
++	* queue.h: Likewise.
++	* rwlock.c: Likewise.
++	* semaphore.c: Likewise.
++	* semaphore.h: Likewise.
++	* signals.c: Likewise.
++	* spinlock.c: Likewise.
++	* spinlock.h: Likewise.
++	* sysdeps/pthread/pthread.h: Likewise.
++	Patches by Xavier Leroy.
++
++	* sysdeps/i386/i686/pt-machine.h: New file.
++
++1998-06-25  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/pthread.h: Make [sg]et_stacksize and
++	[sg]et_stackaddr prototypes always available.
++
++	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
++	_POSIX_THREAD_ATTR_STACKSIZE and _POSIX_THREAD_ATTR_STACKADDR.
++
++1998-06-24  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_free): Undo patch from 980430.
++	Reported by David Wragg <dpw@doc.ic.ac.uk>.
++
++1998-06-09 15:07  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c: Define __pthread_manager_adjust_prio and use it to
++	increase priority when needed.
++	* internals.h: Add prototype for __pthread_manager_adjust_prio.
++	* mutex.c: Optimize mutexes to wake up only one thread.
++	* pthread.c: Move PID of manager for global variable in structure
++	element.
++	Patches by Xavier Leroy.
++
++1998-06-07 13:47  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/pthread/bits/libc-lock.h: Optimize cleanup handlers a bit.
++
++1998-06-03  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
++
++	* attr.c: Correct typo.
++
++1998-05-01  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_free): Unmap guard before the stack.
++	Patch by Matthias Urlichs.
++
++1998-04-30  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c (pthread_free): Detect already free child.
++	Patch by Xavier Leroy, reported by Matthias Urlichs.
++
++1998-04-23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* Makefile (linuxthreads-version): Renamed back from
++	libpthread-version.
++
++1998-04-21  Ulrich Drepper  <drepper@cygnus.com>
++
++	* ptlongjmp.c: Add prototypes for __libc_siglongjmp and
++	__libc_longjmp.
++
++1998-04-20 14:55  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Makefile (libpthread-routines): Add ptlongjmp and spinlock.
++	* internals.h: Add definitions for new spinlock implementation.
++	* ptlongjmp.c: New file.
++	* spinlock.c: New file.
++	* spinlock.h (acquire): Don't reschedule using __sched_yield, use
++	new function __pthread_acquire to prevent deadlocks with thread
++	with different priorities.
++	Patches by Xavier Leroy <Xavier.Leroy@inria.fr>.
++
++1998-03-16  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* manager.c (__pthread_manager): Reduce first argument to select
++	to include just the needed file descriptor.
++
++1998-03-17 00:06  Ulrich Drepper  <drepper@cygnus.com>
++
++	* manager.c: Fix last patch which caused core dumps.
++
++	* pthread.c: Correctly handle missing SIGRTMIN.
++
++1998-03-15  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* libpthread.map: Add __libc_internal_tsd_get and
++	__libc_internal_tsd_set.  Add missing cancelable functions. Export
++	libc internal versions of the cancelable functions.
++
++1998-03-13 16:51  Ulrich Drepper  <drepper@cygnus.com>
++
++	* weaks.c: Define pthread_attr_init as GLIBC_2.0 and GLIBC_2.1.
++
++1998-03-13 00:46  Ulrich Drepper  <drepper@cygnus.com>
++
++	* attr.c: Implement pthread_attr_[gs]etguardsize,
++	pthread_attr_[gs]setstackaddr, pthread_attr_[gs]etstacksize.
++	Change pthread_attr_init to have two interfaces.
++	* internals.h (struct _pthread_descr_struct): Add new fields for
++	above functions.
++	* libpthread.map: Add names in GLIBC_2.1 section.
++	* manager.c (pthread_handle_create): Implement guardsize and
++	user stack.
++	(pthread_free): Likewise.
++	* pthread.c (pthread_create): Add new interface for changed
++	pthread_attr_t.
++	* sysdeps/pthread/pthread.h: Add prototypes for new functions.
++	* sysdeps/unix/sysv/linux/bits/local_lim.h: Add definition of
++	PTHREAD_STACK_MIN.
++
++1998-03-11 00:42  Wolfram Gloger  <wmglo@dent.med.uni-muenchen.de>
++
++	* manager.c: Enable resetting of the thread scheduling policy
++	to SCHED_OTHER when the parent thread has a different one.
++
++1998-02-01 13:51  Ulrich Drepper  <drepper@cygnus.com>
++
++	* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define
++	_POSIX_ASYNCHRONOUS_IO.
++
++	* sysdeps/pthread/pthread.h: Define bits for Unix98 variants of
++	mutexes.
++	* mutex.c: Implement new mutex types.
++
++	* internals.h: Include <signal.h>.
++
++	* libpthread.map: Add __erno_location and __h_errno_location.
++
++	* errno.c: Return pointer to variable actually in use.  This might
++	not be the one in the thread structure.
++	* internals.h (struct _pthread_descr_struct): Add new fields p_errnop
++	and p_h_errnop.
++	* manager.c (__pthread_manager): Set p_errnop and p_h_errnop member
++	of manager thread structure.
++	(pthread_handle_create): Set p_errnop and p_h_errnop members for new
++	thread.
++	* pthread.c: Adapt initializer for thread structures.
++	(__pthread_initial_thread): Set p_errnop and p_h_errnop member.
++	(__pthread_reset_main_thread): Reset p_errnop and p_h_errnop of
++	current thread to global variables.
++
++1998-01-31 17:27  Ulrich Drepper  <drepper@cygnus.com>
++
++	* rwlock.c: New file.
++	* Makefile (libpthread-routines): Add rwlock.
++	* sysdeps/pthread/pthread.h: Define data structures and declare
++	functions.
++	* libpthread.map: Add new functions.
++
++1997-12-18 13:50  Philip Blundell  <pb@nexus.co.uk>
++
++	* sysdeps/arm/pt-machine.h: New file; add ARM support.
++	* sysdeps/arm/Implies: likewise.
++	* README: Document it.
++
++1997-12-13  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* signals.c: Remove unneeded initializer for sigwaited, saving a
++	warning.
++
++1997-04-11 01:18  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* semaphore.c (sem_init): Set sem_spinlock only if available.
++
++1997-12-04 01:48  Ulrich Drepper  <drepper@cygnus.com>
++
++	* mutex.c: Implement PTHREAD_MUTEX_CHECKERROR.
++	* sysdeps/pthread/pthread.h: Define PTHREAD_MUTEX_CHECKERROR.
++
++	* Makefile: Update from LinuxThreads 0.7.
++	* internals.h. Likewise.
++	* manager.c: Likewise.
++	* mutex.c: Likewise.
++	* pthread.c: Likewise.
++	* signals.c: Likewise.
++	* specific.c: Likewise.
++	* Examples/ex3.c: Likewise.
++
++1997-11-20 18:13  Ulrich Drepper  <drepper@cygnus.com>
++
++	* pthread.c (__pthread_reset_main_thread): Close pipe only if still
++	open.
++
++1997-10-29 05:38  Ulrich Drepper  <drepper@cygnus.com>
++
++	* wrapsyscall.c: Add socket functions which are also cancelation
++	points.
++
++1997-10-19 21:40  Wolfram Gloger  <wg@wolfram.dent.med.uni-muenchen.de>
++
++	* specific.c (__libc_internal_tsd_set, __libc_internal_tsd_get):
++	New functions for fast thread specific data within libc.
++
++	* internals.h: Add new array p_libc_specific to struct
++	_pthread_descr_struct.
++
++	* sysdeps/pthread/bits/libc-lock.h: Declare new functions.
++
++1997-10-13 05:39  Ulrich Drepper  <drepper@cygnus.com>
++
++	* semaphore.h: Add __BEGIN_DECLS/__END_DECLS.
++	Reported by Ralf Corsepius <corsepiu@faw.uni-ulm.de>.
++
++1997-08-29 03:05  Ulrich Drepper  <drepper@cygnus.com>
++
++	* internals.h (struct _pthread_descr_struct): Add definitions for
++	two-level specific key handling.
++	* manager.c (pthread_handle_create): Initialize specific memory array.
++	* specific.c: Implement two-level key handling.
++	* weaks.c: Don't provide dummy key handling.
++	* sysdeps/pthread/bits/libc-lock.h: Typedef __libc_lock_t (no #define).
++	Add definition of __libc_key_t.
++	* sysdeps/unix/sysv/linux/bits/local_lim.h: Define PTHREAD_KEYS_MAX
++	as 1024.
++	Add definition of _POSIX_THREAD_DESTRUCTOR_ITERATIONS and
++	PTHREAD_DESTRUCTOR_ITERATIONS.
++
++	* manager.c (pthread_handle_create): Compare mmap result with
++	MAP_FAILED.
++
++	* ptfork.c: Rename to __pthread_atfork and make old name a weak alias.
++	* sysdeps/pthread/bits/pthread.h: Add prototype for __pthread_atfork.
++
++1997-08-22 19:04  Richard Henderson  <rth@cygnus.com>
++
++	sysdeps/sparc -> sysdeps/sparc/sparc32
++	sysdeps/sparc64 -> sysdeps/sparc/sparc64
++
++	* internals.h: Change definition of THREAD_SELF to be an expression,
++	not a statement that did a return.
++	* sysdeps/alpha/pt-machine.h (THREAD_SELF): Update accordingly.
++	* sysdeps/sparc/sparc32/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF):
++	Follow Solaris and use a "system reserved" register (%g6) to hold
++	the thread descriptor.
++	* sysdeps/sparc/sparc64/pt-machine.h: Likewise.
++
++1997-08-03 00:09  Ulrich Drepper  <drepper@cygnus.com>
++
++	* mutex.c: Correct pthread_once.  Patch by Xavier Leroy.
++	* sysdeps/pthread/pthread.h: Add prototype for __pthread_once.
++	* sysdeps/pthread/bits/pthread.h: Add macros for __libc_once.
++
++	* semaphore.c: Include spinlock.h only when needed.
++
++	* specific.c (__pthread_setsepcific, __pthread_getspecific): Reject
++	keys for entries not in use.
++
++	* weaks.c: Implement key handling functions for real.
++
++1997-06-29  01:04  Richard Henderson  <richard@gnu.ai.mit.edu>
++
++	Initial sparc64-linux support:
++	* linuxthreads/sysdeps/sparc64/Implies: New file.
++	* linuxthreads/sysdeps/sparc64/pt-machine.h: Likewise.
++
++1997-06-29 00:48  Ulrich Drepper  <drepper@cygnus.com>
++
++	* semaphore.c: Include spinlock.h at correct place.
++	Patch by HJ Lu.
++
++1997-06-13 10:06  Richard Henderson  <rth@tamu.edu>
++
++	The Great Bit File Move:
++	* sysdeps/alpha/semaphorebits.h: -> .../bits/semaphore.h.
++	* sysdeps/powerpc/semaphorebits.h: Likewise.
++	* sysdeps/pthread/cmpxchg/semaphorebits.h: Likewise.
++	* sysdeps/pthread/no-cmpxchg/semaphorebits.h: Likewise.
++	* sysdeps/pthread/libc-lock.h: -> bits/
++	* sysdeps/pthread/stdio-lock.h: Likewise.
++	* sysdeps/unix/sysv/linux/local_lim.h: Likewise.
++	* sysdeps/unix/sysv/linux/posix_opt.h: Likewise.
++	* semaphore.h: Likewise.
++	* sysdeps/pthread/pthread.h: Likewise.
++
++	* lockfile.c: <foo.h> -> <bits/foo.h>.
++	* semaphore.h: Likewise.
++
++	* Makefile: (headers): foo.h -> bits/foo.h.
++	* sysdeps/pthread/Makefile: Likewise.
++
++1997-04-11 01:18  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
++
++	* semaphore.c (sem_init): Set sem_spinlock only if available.
++
++	* sysdeps/m68k/pt-machine.h (testandset, __compare_and_swap): Fix
++	asm constraints.
++
++1997-04-09 03:00  Ulrich Drepper  <drepper@cygnus.com>
++
++	Update from LinuxThreads 0.6.
++
++	* attr.c (pthread_attr_getdetachstate): Use __sched_get_priority_max
++	and __sched_get_priority_min instead of names without `__'.
++
++	* manager.c: Rewrite large parts to implement opaque pthread_t.
++
++	* cancel.c: Adapt for opaque pthread_t type.
++	* condvar.c: Likewise.
++	* errno.c: Likewise.
++	* join.c: Likewise.
++	* mutex.c: Likewise.
++	* pthread.c: Likewise.
++	* signals.c: Likewise.
++	* specific.c: Likewise.
++	* restart.h: Likewise.
++	* queue.h: Likewise.
++	* Examples/ex3.c: Likewise.
++	* Examples/ex4.c: Likewise.
++	* sysdeps/pthread/pthread.h: Likewise.
++
++	* pthread.c: Accumulate time for all threads in thread manager.
++
++	* semaphore.c: Implement fallback implementation for architectures
++	sometimes missing compare-exchange operations.
++
++	* cancel.c (pthread_cancel): Validate handle argument.
++	* join.c (pthread_join): Likewise.
++	(pthread_detach): Likewise.
++	* signals.c (pthread_kill): Likewise.
++
++	* spinlock.h (acquire): Use __sched_yield not sched_yield.
++
++	* queue.h (enqueue): Enqueue thread according to priority.
++
++	* internals.c (struct pthread_start_args): New struct for passing
++	args to cloning function.
++	(struct _pthread): Rename to _pthread_descr_struct and adapt for
++	opaque pthread_t.
++
++	* Examples/Makefile (clean): Pass -f option to rm.
++
++	* sysdeps/i386/pt-machine.h: Add check for compare-exchange instruction
++	and define TEST_FOR_COMPARE_AND_SWAP.
++	* sysdeps/i386/i486/pt-machine.h: Removed.
++
++	* sysdeps/unix/sysv/linux/local_lim.h (PTHREAD_THREADS_MAX): Increase
++	to 1024.
++
++1997-04-04 16:38  Ulrich Drepper  <drepper@cygnus.com>
++
++	* restart.h (suspend): Clear p_signal before suspending.
++	(suspend_with_cancellation): Likewise.
++	Patch by Xavier Leroy <Xavier.Leroy@inria.fr>.
++
++	* weaks.c: Make __pthread_key_create return 1.
++	* sysdeps/pthread/libc-lock.h: Define __libc_key_create,
++	__libc_getspecific, __libc_setspecific, and __libc_key_t.
++	* sysdeps/pthread/stdio-lock.h: Don't care for implementation not
++	using libio.
++
++1997-03-19 15:13  Miguel de Icaza  <miguel@nuclecu.unam.mx>
++
++	* sysdeps/sparc/pt-machine (RELEASE): Fix.
++
++1997-03-01 07:55  Geoff Keating  <geoffk@ozemail.com.au>
++
++	* sysdeps/powerpc/Implies: Added.
++	* sysdeps/powerpc/pt-machine.h: Added.
++	* sysdeps/powerpc/semaphorebits.h: Added.
++
++1997-01-22 01:22  Ulrich Drepper  <drepper@cygnus.com>
++
++	* linuxtheads/pthread.c (__pthread_initial_thread): Correct
++	initializer.
++	(__pthread_manager_thread): Likewise.
++	Reported by Andreas Jaeger.
++
++1997-01-18 22:15  Richard Henderson  <rth@tamu.edu>
++
++	Since sigset_t no longer fits in a register, we can't pass in the
++	thread's initial mask so easily.  Take this opportunity to simplify
++	the clone implementation by only accepting a single void* argument.
++
++	* linuxthreads/manager.c (__pthread_manager): Put thread vitals
++	in the thread struct instead of as arguments through clone.
++	(pthread_start_thread): Look for them there.
++	* linuxthreads/internals.h (struct _pthread): Add p_initial_fn,
++	p_initial_fn_arg, p_initial_mask.  Fix __pthread_manager proto.
++	* linuxthreads/pthread.c (pthread_initialize_manager): Revise
++	clone invocation.
+diff -Naur ../glibc-2.1.3/linuxthreads/Changes glibc-2.1.3/linuxthreads/Changes
+--- ../glibc-2.1.3/linuxthreads/Changes	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Changes	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,73 @@
++Release 0.7:
++- Destructors for thread-specific data now conform to the POSIX semantics
++  (call destructors again if non-NULL TSD remains after a round of
++   destruction).
++- Implemented thread-specific data as a sparse array, allows more TSD keys
++  and smaller thread descriptors (Ulrich Drepper).
++- Added "error checking" mutexes.
++- Protect against multiple sigwait() on the same signals.
++- Simplified implementation of semaphores when compare_and_swap is 
++  not available.
++- Fixed bug in fork() where stdin was closed if fork() was called before
++  the first pthread_create().
++- Fixed bug in the gethostby*_r functions (bad result if null bytes
++  in addresses).
++- Typos in manual pages corrected.
++- First cut at a PowerPC port (not working yet, runs into problems
++  with gcc and with the C library).
++
++Release 0.6:
++- Validation of thread identifiers: no more crashes when operating on
++  a thread that has exited (based on Pavel Krauz's ideas).
++- Added fallback implementation of semaphores for the 386 and the
++  Sparc. 
++- Fixed a bug in signal handling causing false restarts of suspended
++  threads.
++- Fixed a bug in realtime scheduling causing all threads to have
++  default scheduling on Ix86 with libc5.
++- With realtime scheduling, unlocking a mutex now restarts the
++  highest priority thread waiting on the mutex, not the
++  first-suspended thread (Richard Neitzel).
++- Timing a process now returns cumulative times for all threads, not
++  just times for the initial thread (suggested by Wolfram Gloger).
++- Cleaned up name space (internal defs prefixed by __, weak aliases
++  for non-portable extensions).
++- MIPS port (contributed by Ralf Baechle).
++
++Release 0.5:
++- Signal-safe semaphores a la POSIX 1003.1b added.
++- Locking bug in pthread_mutex_trylock over recursive mutexes fixed.
++- Race conditions in thread cancellation fixed.
++- Sparc port (contributed by Miguel de Icaza).
++- Support for getpwnam_r and getpwuid_r.
++- Added pthread_kill_other_threads_np to be used in conjunction with
++  exec*().
++
++Release 0.4:
++- Manual pages for all functions.
++- Synchronization bug causing accumulation of zombie processes fixed.
++- Race condition in pthread_cond_timedwait fixed.
++- Recursive mutexes are back by popular demand.
++- Partial support for realtime scheduling (initiated by Richard Neitzel).
++- pthread.h cleaned up a lot: now C++ compatible, added missing "const" 
++  qualifiers, added short documentation, put to GNU libc standards
++  for name space pollution (Ulrich Drepper).
++- Motorola 68k port (contributed by Andreas Schwab).
++- Interaction with fork(2) cleaned up a lot.
++
++Release 0.3:
++- Thread creation and reclaimation now performed by a centralized
++  "thread manager" thread.
++- Removed recursive mutexes to make regular mutexes more efficient.
++- Now available as a shared library (contributed by Richard Henderson).
++- Alpha port (contributed by Richard Henderson).
++- Fixed many small discrepancies with Posix 1003.1c.
++- Put under the LGPL instead of the GPL.
++
++Release 0.2:
++- Reentrant libc functions (adapted from libc 5.3.9 by Peeter Joot)
++- pthread_cond_wait did not reacquire the mutex correctly on return
++- More efficient pthread_cond_broadcast
++
++Release 0.1:
++- First public release
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/Makefile glibc-2.1.3/linuxthreads/Examples/Makefile
+--- ../glibc-2.1.3/linuxthreads/Examples/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/Makefile	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,15 @@
++CC=gcc
++CFLAGS=-g -O -Wall -I.. -D_REENTRANT
++LIBPTHREAD=../libpthread.a
++
++PROGS=ex1 ex2 ex3 ex4 ex5 proxy
++
++all: $(PROGS)
++
++.c:
++	$(CC) $(CFLAGS) -o $* $*.c $(LIBPTHREAD)
++
++$(PROGS):
++
++clean:
++	rm -f $(PROGS)
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex1.c glibc-2.1.3/linuxthreads/Examples/ex1.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex1.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex1.c	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,35 @@
++/* Creates two threads, one printing 10000 "a"s, the other printing
++   10000 "b"s.
++   Illustrates: thread creation, thread joining. */
++
++#include <stddef.h>
++#include <stdio.h>
++#include <unistd.h>
++#include "pthread.h"
++
++void * process(void * arg)
++{
++  int i;
++  fprintf(stderr, "Starting process %s\n", (char *) arg);
++  for (i = 0; i < 10000; i++) {
++    write(1, (char *) arg, 1);
++  }
++  return NULL;
++}
++
++int main(void)
++{
++  int retcode;
++  pthread_t th_a, th_b;
++  void * retval;
++
++  retcode = pthread_create(&th_a, NULL, process, (void *) "a");
++  if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode);
++  retcode = pthread_create(&th_b, NULL, process, (void *) "b");
++  if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode);
++  retcode = pthread_join(th_a, &retval);
++  if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode);
++  retcode = pthread_join(th_b, &retval);
++  if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode);
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex2.c glibc-2.1.3/linuxthreads/Examples/ex2.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex2.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex2.c	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,113 @@
++/* The classic producer-consumer example.
++   Illustrates mutexes and conditions.
++   All integers between 0 and 9999 should be printed exactly twice,
++   once to the right of the arrow and once to the left. */
++
++#include <stdio.h>
++#include "pthread.h"
++
++#define BUFFER_SIZE 16
++
++/* Circular buffer of integers. */
++
++struct prodcons {
++  int buffer[BUFFER_SIZE];      /* the actual data */
++  pthread_mutex_t lock;         /* mutex ensuring exclusive access to buffer */
++  int readpos, writepos;        /* positions for reading and writing */
++  pthread_cond_t notempty;      /* signaled when buffer is not empty */
++  pthread_cond_t notfull;       /* signaled when buffer is not full */
++};
++
++/* Initialize a buffer */
++
++void init(struct prodcons * b)
++{
++  pthread_mutex_init(&b->lock, NULL);
++  pthread_cond_init(&b->notempty, NULL);
++  pthread_cond_init(&b->notfull, NULL);
++  b->readpos = 0;
++  b->writepos = 0;
++}
++
++/* Store an integer in the buffer */
++
++void put(struct prodcons * b, int data)
++{
++  pthread_mutex_lock(&b->lock);
++  /* Wait until buffer is not full */
++  while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
++    pthread_cond_wait(&b->notfull, &b->lock);
++    /* pthread_cond_wait reacquired b->lock before returning */
++  }
++  /* Write the data and advance write pointer */
++  b->buffer[b->writepos] = data;
++  b->writepos++;
++  if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
++  /* Signal that the buffer is now not empty */
++  pthread_cond_signal(&b->notempty);
++  pthread_mutex_unlock(&b->lock);
++}
++
++/* Read and remove an integer from the buffer */
++
++int get(struct prodcons * b)
++{
++  int data;
++  pthread_mutex_lock(&b->lock);
++  /* Wait until buffer is not empty */
++  while (b->writepos == b->readpos) {
++    pthread_cond_wait(&b->notempty, &b->lock);
++  }
++  /* Read the data and advance read pointer */
++  data = b->buffer[b->readpos];
++  b->readpos++;
++  if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
++  /* Signal that the buffer is now not full */
++  pthread_cond_signal(&b->notfull);
++  pthread_mutex_unlock(&b->lock);
++  return data;
++}
++
++/* A test program: one thread inserts integers from 1 to 10000,
++   the other reads them and prints them. */
++
++#define OVER (-1)
++
++struct prodcons buffer;
++
++void * producer(void * data)
++{
++  int n;
++  for (n = 0; n < 10000; n++) {
++    printf("%d --->\n", n);
++    put(&buffer, n);
++  }
++  put(&buffer, OVER);
++  return NULL;
++}
++
++void * consumer(void * data)
++{
++  int d;
++  while (1) {
++    d = get(&buffer);
++    if (d == OVER) break;
++    printf("---> %d\n", d);
++  }
++  return NULL;
++}
++
++int main(void)
++{
++  pthread_t th_a, th_b;
++  void * retval;
++
++  init(&buffer);
++  /* Create the threads */
++  pthread_create(&th_a, NULL, producer, 0);
++  pthread_create(&th_b, NULL, consumer, 0);
++  /* Wait until producer and consumer finish. */
++  pthread_join(th_a, &retval);
++  pthread_join(th_b, &retval);
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex3.c glibc-2.1.3/linuxthreads/Examples/ex3.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex3.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex3.c	1998-12-14 08:09:39.000000000 -0800
+@@ -0,0 +1,152 @@
++/* Multi-thread searching.
++   Illustrates: thread cancellation, cleanup handlers. */
++
++#include <errno.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <sys/types.h>
++#include <pthread.h>
++
++/* Defines the number of searching threads */
++#define NUM_THREADS 5
++
++/* Function prototypes */
++void *search(void *);
++void print_it(void *);
++
++/* Global variables */
++pthread_t threads[NUM_THREADS];
++pthread_mutex_t lock;
++int tries;
++volatile int started;
++
++int main(int argc, char ** argv)
++{
++  int i;
++  int pid;
++
++  /* create a number to search for */
++  pid = getpid();
++  printf("Searching for the number = %d...\n", pid);
++
++  /* Initialize the mutex lock */
++  pthread_mutex_init(&lock, NULL);
++
++  /* Create the searching threads */
++  for (started=0; started<NUM_THREADS; started++)
++    pthread_create(&threads[started], NULL, search, (void *)pid);
++
++  /* Wait for (join) all the searching threads */
++  for (i=0; i<NUM_THREADS; i++)
++    pthread_join(threads[i], NULL);
++
++  printf("It took %d tries to find the number.\n", tries);
++
++  /* Exit the program */
++  return 0;
++}
++
++/* This is the cleanup function that is called
++   when the threads are cancelled */
++
++void print_it(void *arg)
++{
++  int *try = (int *) arg;
++  pthread_t tid;
++
++  /* Get the calling thread's ID */
++  tid = pthread_self();
++
++  /* Print where the thread was in its search when it was cancelled */
++  printf("Thread %lx was canceled on its %d try.\n", tid, *try);
++}
++
++/* This is the search routine that is executed in each thread */
++
++void *search(void *arg)
++{
++  int num = (int) arg;
++  int i, j, ntries;
++  pthread_t tid;
++
++  /* get the calling thread ID */
++  tid = pthread_self();
++
++  /* use the thread ID to set the seed for the random number generator */
++  /* Since srand and rand are not thread-safe, serialize with lock */
++
++  /* Try to lock the mutex lock --
++     if locked, check to see if the thread has been cancelled
++     if not locked then continue */
++  while (pthread_mutex_trylock(&lock) == EBUSY)
++    pthread_testcancel();
++
++  srand((int)tid);
++  i = rand() & 0xFFFFFF;
++  pthread_mutex_unlock(&lock);
++  ntries = 0;
++
++  /* Set the cancellation parameters --
++     - Enable thread cancellation
++     - Defer the action of the cancellation */
++
++  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
++  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
++
++  while (started < NUM_THREADS)
++    sched_yield ();
++
++  /* Push the cleanup routine (print_it) onto the thread
++     cleanup stack.  This routine will be called when the
++     thread is cancelled.  Also note that the pthread_cleanup_push
++     call must have a matching pthread_cleanup_pop call.  The
++     push and pop calls MUST be at the same lexical level
++     within the code */
++
++  /* Pass address of `ntries' since the current value of `ntries' is not
++     the one we want to use in the cleanup function */
++
++  pthread_cleanup_push(print_it, (void *)&ntries);
++
++  /* Loop forever */
++  while (1) {
++    i = (i + 1) & 0xFFFFFF;
++    ntries++;
++
++    /* Does the random number match the target number? */
++    if (num == i) {
++      /* Try to lock the mutex lock --
++         if locked, check to see if the thread has been cancelled
++         if not locked then continue */
++      while (pthread_mutex_trylock(&lock) == EBUSY)
++        pthread_testcancel();
++
++      /* Set the global variable for the number of tries */
++      tries = ntries;
++      printf("Thread %lx found the number!\n", tid);
++
++      /* Cancel all the other threads */
++      for (j=0; j<NUM_THREADS; j++)
++        if (threads[j] != tid) pthread_cancel(threads[j]);
++
++      /* Break out of the while loop */
++      break;
++    }
++
++    /* Every 100 tries check to see if the thread has been cancelled. */
++    if (ntries % 100 == 0) {
++      pthread_testcancel();
++    }
++  }
++
++  /* The only way we can get here is when the thread breaks out
++     of the while loop.  In this case the thread that makes it here
++     has found the number we are looking for and does not need to run
++     the thread cleanup function.  This is why the pthread_cleanup_pop
++     function is called with a 0 argument; this will pop the cleanup
++     function off the stack without executing it */
++
++  pthread_cleanup_pop(0);
++  return((void *)0);
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex4.c glibc-2.1.3/linuxthreads/Examples/ex4.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex4.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex4.c	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,107 @@
++/* Making a library function that uses static variables thread-safe.
++   Illustrates: thread-specific data, pthread_once(). */
++
++#include <stddef.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <pthread.h>
++
++/* This is a typical example of a library function that uses
++   static variables to accumulate results between calls.
++   Here, it just returns the concatenation of all string arguments
++   that were given to it. */
++
++#if 0
++
++char * str_accumulate(char * s)
++{
++  static char accu[1024] = { 0 };
++  strcat(accu, s);
++  return accu;
++}
++
++#endif
++
++/* Of course, this cannot be used in a multi-threaded program
++   because all threads store "accu" at the same location.
++   So, we'll use thread-specific data to have a different "accu"
++   for each thread. */
++
++/* Key identifying the thread-specific data */
++static pthread_key_t str_key;
++/* "Once" variable ensuring that the key for str_alloc will be allocated
++   exactly once. */
++static pthread_once_t str_alloc_key_once = PTHREAD_ONCE_INIT;
++
++/* Forward functions */
++static void str_alloc_key(void);
++static void str_alloc_destroy_accu(void * accu);
++
++/* Thread-safe version of str_accumulate */
++
++char * str_accumulate(const char * s)
++{
++  char * accu;
++
++  /* Make sure the key is allocated */
++  pthread_once(&str_alloc_key_once, str_alloc_key);
++  /* Get the thread-specific data associated with the key */
++  accu = (char *) pthread_getspecific(str_key);
++  /* It's initially NULL, meaning that we must allocate the buffer first. */
++  if (accu == NULL) {
++    accu = malloc(1024);
++    if (accu == NULL) return NULL;
++    accu[0] = 0;
++    /* Store the buffer pointer in the thread-specific data. */
++    pthread_setspecific(str_key, (void *) accu);
++    printf("Thread %lx: allocating buffer at %p\n", pthread_self(), accu);
++  }
++  /* Now we can use accu just as in the non thread-safe code. */
++  strcat(accu, s);
++  return accu;
++}
++
++/* Function to allocate the key for str_alloc thread-specific data. */
++
++static void str_alloc_key(void)
++{
++  pthread_key_create(&str_key, str_alloc_destroy_accu);
++  printf("Thread %lx: allocated key %d\n", pthread_self(), str_key);
++}
++
++/* Function to free the buffer when the thread exits. */
++/* Called only when the thread-specific data is not NULL. */
++
++static void str_alloc_destroy_accu(void * accu)
++{
++  printf("Thread %lx: freeing buffer at %p\n", pthread_self(), accu);
++  free(accu);
++}
++
++/* Test program */
++
++void * process(void * arg)
++{
++  char * res;
++  res = str_accumulate("Result of ");
++  res = str_accumulate((char *) arg);
++  res = str_accumulate(" thread");
++  printf("Thread %lx: \"%s\"\n", pthread_self(), res);
++  return NULL;
++}
++
++int main(int argc, char ** argv)
++{
++  char * res;
++  pthread_t th1, th2;
++
++  res = str_accumulate("Result of ");
++  pthread_create(&th1, NULL, process, (void *) "first");
++  pthread_create(&th2, NULL, process, (void *) "second");
++  res = str_accumulate("initial thread");
++  printf("Thread %lx: \"%s\"\n", pthread_self(), res);
++  pthread_join(th1, NULL);
++  pthread_join(th2, NULL);
++  exit(0);
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex5.c glibc-2.1.3/linuxthreads/Examples/ex5.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex5.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex5.c	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,102 @@
++/* The classic producer-consumer example, implemented with semaphores.
++   All integers between 0 and 9999 should be printed exactly twice,
++   once to the right of the arrow and once to the left. */
++
++#include <stdio.h>
++#include "pthread.h"
++#include "semaphore.h"
++
++#define BUFFER_SIZE 16
++
++/* Circular buffer of integers. */
++
++struct prodcons {
++  int buffer[BUFFER_SIZE];      /* the actual data */
++  int readpos, writepos;        /* positions for reading and writing */
++  sem_t sem_read;               /* number of elements available for reading */
++  sem_t sem_write;              /* number of locations available for writing */
++};
++
++/* Initialize a buffer */
++
++void init(struct prodcons * b)
++{
++  sem_init(&b->sem_write, 0, BUFFER_SIZE - 1);
++  sem_init(&b->sem_read, 0, 0);
++  b->readpos = 0;
++  b->writepos = 0;
++}
++
++/* Store an integer in the buffer */
++
++void put(struct prodcons * b, int data)
++{
++  /* Wait until buffer is not full */
++  sem_wait(&b->sem_write);
++  /* Write the data and advance write pointer */
++  b->buffer[b->writepos] = data;
++  b->writepos++;
++  if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
++  /* Signal that the buffer contains one more element for reading */
++  sem_post(&b->sem_read);
++}
++
++/* Read and remove an integer from the buffer */
++
++int get(struct prodcons * b)
++{
++  int data;
++  /* Wait until buffer is not empty */
++  sem_wait(&b->sem_read);
++  /* Read the data and advance read pointer */
++  data = b->buffer[b->readpos];
++  b->readpos++;
++  if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
++  /* Signal that the buffer has now one more location for writing */
++  sem_post(&b->sem_write);
++  return data;
++}
++
++/* A test program: one thread inserts integers from 1 to 10000,
++   the other reads them and prints them. */
++
++#define OVER (-1)
++
++struct prodcons buffer;
++
++void * producer(void * data)
++{
++  int n;
++  for (n = 0; n < 10000; n++) {
++    printf("%d --->\n", n);
++    put(&buffer, n);
++  }
++  put(&buffer, OVER);
++  return NULL;
++}
++
++void * consumer(void * data)
++{
++  int d;
++  while (1) {
++    d = get(&buffer);
++    if (d == OVER) break;
++    printf("---> %d\n", d);
++  }
++  return NULL;
++}
++
++int main(void)
++{
++  pthread_t th_a, th_b;
++  void * retval;
++
++  init(&buffer);
++  /* Create the threads */
++  pthread_create(&th_a, NULL, producer, 0);
++  pthread_create(&th_b, NULL, consumer, 0);
++  /* Wait until producer and consumer finish. */
++  pthread_join(th_a, &retval);
++  pthread_join(th_b, &retval);
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex6.c glibc-2.1.3/linuxthreads/Examples/ex6.c
+--- ../glibc-2.1.3/linuxthreads/Examples/ex6.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Examples/ex6.c	1998-12-14 14:24:16.000000000 -0800
+@@ -0,0 +1,41 @@
++#include <errno.h>
++#include <stdio.h>
++#include <string.h>
++#include <pthread.h>
++#include <unistd.h>
++
++void *
++test_thread (void *v_param)
++{
++  return NULL;
++}
++
++int
++main (void)
++{
++  unsigned long count;
++
++  setvbuf (stdout, NULL, _IONBF, 0);
++
++  for (count = 0; count < 2000; ++count)
++    {
++      pthread_t thread;
++      int status;
++
++      status = pthread_create (&thread, NULL, test_thread, NULL);
++      if (status != 0)
++	{
++	  printf ("status = %d, count = %lu: %s\n", status, count,
++		  strerror (errno));
++	  return 1;
++	}
++      else
++	{
++	  printf ("count = %lu\n", count);
++	}
++      /* pthread_detach (thread); */
++      pthread_join (thread, NULL);
++      usleep (10);
++    }
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/FAQ.html glibc-2.1.3/linuxthreads/FAQ.html
+--- ../glibc-2.1.3/linuxthreads/FAQ.html	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/FAQ.html	2000-02-01 14:11:26.000000000 -0800
+@@ -0,0 +1,1039 @@
++<HTML>
++<HEAD>
++<TITLE>LinuxThreads Frequently Asked Questions</TITLE>
++</HEAD>
++<BODY>
++<H1 ALIGN=center>LinuxThreads Frequently Asked Questions <BR>
++                 (with answers)</H1>
++<H2 ALIGN=center>[For LinuxThreads version 0.8]</H2>
++
++<HR><P>
++
++<A HREF="#A">A. The big picture</A><BR>
++<A HREF="#B">B. Getting more information</A><BR>
++<A HREF="#C">C. Issues related to the C library</A><BR>
++<A HREF="#D">D. Problems, weird behaviors, potential bugs</A><BR>
++<A HREF="#E">E. Missing functions, wrong types, etc</A><BR>
++<A HREF="#F">F. C++ issues</A><BR>
++<A HREF="#G">G. Debugging LinuxThreads programs</A><BR>
++<A HREF="#H">H. Compiling multithreaded code; errno madness</A><BR>
++<A HREF="#I">I. X-Windows and other libraries</A><BR>
++<A HREF="#J">J. Signals and threads</A><BR>
++<A HREF="#K">K. Internals of LinuxThreads</A><P>
++
++<HR>
++<P>
++
++<H2><A NAME="A">A. The big picture</A></H2>
++
++<H4><A NAME="A.1">A.1: What is LinuxThreads?</A></H4>
++
++LinuxThreads is a Linux library for multi-threaded programming.
++It implements the Posix 1003.1c API (Application Programming
++Interface) for threads.  It runs on any Linux system with kernel 2.0.0
++or more recent, and a suitable C library (see section <A HREF="C">C</A>).
++<P>
++
++<H4><A NAME="A.2">A.2: What are threads?</A></H4>
++
++A thread is a sequential flow of control through a program.
++Multi-threaded programming is, thus, a form of parallel programming
++where several threads of control are executing concurrently in the
++program.  All threads execute in the same memory space, and can
++therefore work concurrently on shared data.<P>
++
++Multi-threaded programming differs from Unix-style multi-processing in
++that all threads share the same memory space (and a few other system
++resources, such as file descriptors), instead of running in their own
++memory space as is the case with Unix processes.<P>
++
++Threads are useful for two reasons.  First, they allow a program to
++exploit multi-processor machines: the threads can run in parallel on
++several processors, allowing a single program to divide its work
++between several processors, thus running faster than a single-threaded
++program, which runs on only one processor at a time.  Second, some
++programs are best expressed as several threads of control that
++communicate together, rather than as one big monolithic sequential
++program.  Examples include server programs, overlapping asynchronous
++I/O, and graphical user interfaces.<P>
++
++<H4><A NAME="A.3">A.3: What is POSIX 1003.1c?</A></H4>
++
++It's an API for multi-threaded programming standardized by IEEE as
++part of the POSIX standards.  Most Unix vendors have endorsed the
++POSIX 1003.1c standard.  Implementations of the 1003.1c API are
++already available under Sun Solaris 2.5, Digital Unix 4.0,
++Silicon Graphics IRIX 6, and should soon be available from other
++vendors such as IBM and HP.  More generally, the 1003.1c API is
++replacing relatively quickly the proprietary threads library that were
++developed previously under Unix, such as Mach cthreads, Solaris
++threads, and IRIX sprocs.  Thus, multithreaded programs using the
++1003.1c API are likely to run unchanged on a wide variety of Unix
++platforms.<P>
++
++<H4><A NAME="A.4">A.4: What is the status of LinuxThreads?</A></H4>
++
++LinuxThreads implements almost all of Posix 1003.1c, as well as a few
++extensions.  The only part of LinuxThreads that does not conform yet
++to Posix is signal handling (see section <A HREF="#J">J</A>).  Apart
++from the signal stuff, all the Posix 1003.1c base functionality,
++as well as a number of optional extensions, are provided and conform
++to the standard (to the best of my knowledge).
++The signal stuff is hard to get right, at least without special kernel
++support, and while I'm definitely looking at ways to implement the
++Posix behavior for signals, this might take a long time before it's
++completed.<P>
++
++<H4><A NAME="A.5">A.5: How stable is LinuxThreads?</A></H4>
++
++The basic functionality (thread creation and termination, mutexes,
++conditions, semaphores) is very stable.  Several industrial-strength
++programs, such as the AOL multithreaded Web server, use LinuxThreads
++and seem quite happy about it.  There used to be some rough edges in
++the LinuxThreads / C library interface with libc 5, but glibc 2
++fixes all of those problems and is now the standard C library on major
++Linux distributions (see section <A HREF="#C">C</A>). <P>
++
++<HR>
++<P>
++
++<H2><A NAME="B">B.  Getting more information</A></H2>
++
++<H4><A NAME="B.1">B.1: What are good books and other sources of
++information on POSIX threads?</A></H4>
++
++The FAQ for comp.programming.threads lists several books:
++<A HREF="http://www.serpentine.com/~bos/threads-faq/">http://www.serpentine.com/~bos/threads-faq/</A>.<P>
++
++There are also some online tutorials. Follow the links from the
++LinuxThreads web page:
++<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads">http://pauillac.inria.fr/~xleroy/linuxthreads</A>.<P>
++
++<H4><A NAME="B.2">B.2: I'd like to be informed of future developments on
++LinuxThreads. Is there a mailing list for this purpose?</A></H4>
++
++I post LinuxThreads-related announcements on the newsgroup
++<A HREF="news:comp.os.linux.announce">comp.os.linux.announce</A>,
++and also on the mailing list
++<code>linux-threads@magenet.com</code>.
++You can subscribe to the latter by writing
++<A HREF="mailto:majordomo@magenet.com">majordomo@magenet.com</A>.<P>
++
++<H4><A NAME="B.3">B.3: What are good places for discussing
++LinuxThreads?</A></H4>
++
++For questions about programming with POSIX threads in general, use
++the newsgroup
++<A HREF="news:comp.programming.threads">comp.programming.threads</A>.
++Be sure you read the
++<A HREF="http://www.serpentine.com/~bos/threads-faq/">FAQ</A>
++for this group before you post.<P>
++
++For Linux-specific questions, use
++<A
++HREF="news:comp.os.linux.development.apps">comp.os.linux.development.apps</A>
++and <A
++HREF="news:comp.os.linux.development.kernel">comp.os.linux.development.kernel</A>.
++The latter is especially appropriate for questions relative to the
++interface between the kernel and LinuxThreads.<P>
++
++<H4><A NAME="B.4">B.4: How should I report a possible bug in
++LinuxThreads?</A></H4>
++
++If you're using glibc 2, the best way by far is to use the
++<code>glibcbug</code> script to mail a bug report to the glibc
++maintainers. <P>
++
++If you're using an older libc, or don't have the <code>glibcbug</code>
++script on your machine, then e-mail me directly
++(<code>Xavier.Leroy@inria.fr</code>).  <P>
++
++In both cases, before sending the bug report, make sure that it is not 
++addressed already in this FAQ.  Also, try to send a short program that
++reproduces the weird behavior you observed. <P>
++
++<H4><A NAME="B.5">B.5: I'd like to read the POSIX 1003.1c standard. Is
++it available online?</A></H4>
++
++Unfortunately, no.  POSIX standards are copyrighted by IEEE, and
++IEEE does not distribute them freely.  You can buy paper copies from
++IEEE, but the price is fairly high ($120 or so). If you disagree with
++this policy and you're an IEEE member, be sure to let them know.<P>
++
++On the other hand, you probably don't want to read the standard.  It's
++very hard to read, written in standard-ese, and targeted to
++implementors who already know threads inside-out.  A good book on
++POSIX threads provides the same information in a much more readable form.
++I can personally recommend Dave Butenhof's book, <CITE>Programming
++with POSIX threads</CITE> (Addison-Wesley). Butenhof was part of the
++POSIX committee and also designed the Digital Unix implementations of
++POSIX threads, and it shows.<P>
++
++Another good source of information is the X/Open Group Single Unix
++specification which is available both
++<A HREF="http://www.rdg.opengroup.org/onlinepubs/7908799/index.html">on-line</A>
++and as a
++<A HREF="http://www.UNIX-systems.org/gosolo2/">book and CD/ROM</A>.
++That specification includes pretty much all the POSIX standards,
++including 1003.1c, with some extensions and clarifications.<P>
++
++<HR>
++<P>
++
++<H2><A NAME="C">C.  Issues related to the C library</A></H2>
++
++<H4><A NAME="C.1">C.1: Which version of the C library should I use
++with LinuxThreads?</A></H4>
++
++The best choice by far is glibc 2, a.k.a. libc 6.  It offers very good
++support for multi-threading, and LinuxThreads has been closely
++integrated with glibc 2.  The glibc 2 distribution contains the
++sources of a specially adapted version of LinuxThreads.<P>
++
++glibc 2 comes preinstalled as the default C library on several Linux
++distributions, such as RedHat 5 and up, and Debian 2.
++Those distributions include the version of LinuxThreads matching
++glibc 2.<P>
++
++<H4><A NAME="C.2">C.2: My system has libc 5 preinstalled, not glibc
++2.  Can I still use LinuxThreads?</H4>
++
++Yes, but you're likely to run into some problems, as libc 5 only
++offers minimal support for threads and contains some bugs that affect
++multithreaded programs. <P>
++
++The versions of libc 5 that work best with LinuxThreads are
++libc 5.2.18 on the one hand, and libc 5.4.12 or later on the other hand.
++Avoid 5.3.12 and 5.4.7: these have problems with the per-thread errno
++variable. <P>
++
++<H4><A NAME="C.3">C.3: So, should I switch to glibc 2, or stay with a
++recent libc 5?</A></H4>
++
++I'd recommend you switch to glibc 2.  Even for single-threaded
++programs, glibc 2 is more solid and more standard-conformant than libc
++5.  And the shortcomings of libc 5 almost preclude any serious
++multi-threaded programming.<P>
++
++Switching an already installed
++system from libc 5 to glibc 2 is not completely straightforward.
++See the <A HREF="http://sunsite.unc.edu/LDP/HOWTO/Glibc2-HOWTO.html">Glibc2
++HOWTO</A> for more information.  Much easier is (re-)installing a
++Linux distribution based on glibc 2, such as RedHat 6.<P>
++
++<H4><A NAME="C.4">C.4: Where can I find glibc 2 and the version of
++LinuxThreads that goes with it?</A></H4>
++
++On <code>prep.ai.mit.edu</code> and its many, many mirrors around the world.
++See <A
++HREF="http://www.gnu.org/order/ftp.html">http://www.gnu.org/order/ftp.html</A>
++for a list of mirrors.<P>
++
++<H4><A NAME="C.5">C.5: Where can I find libc 5 and the version of
++LinuxThreads that goes with it?</A></H4>
++
++For libc 5, see <A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/GCC/"><code>ftp://sunsite.unc.edu/pub/Linux/devel/GCC/</code></A>.<P>
++
++For the libc 5 version of LinuxThreads, see
++<A HREF="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/">ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/</A>.<P>
++
++<H4><A NAME="C.6">C.6: How can I recompile the glibc 2 version of the
++LinuxThreads sources?</A></H4>
++
++You must transfer the whole glibc sources, then drop the LinuxThreads
++sources in the <code>linuxthreads/</code> subdirectory, then recompile
++glibc as a whole.  There are now too many inter-dependencies between
++LinuxThreads and glibc 2 to allow separate re-compilation of LinuxThreads.
++<P>
++
++<H4><A NAME="C.7">C.7: What is the correspondence between LinuxThreads 
++version numbers, libc version numbers, and RedHat version
++numbers?</A></H4>
++
++Here is a summary. (Information on Linux distributions other than
++RedHat are welcome.)<P>
++
++<TABLE>
++<TR><TD>LinuxThreads </TD> <TD>C library</TD> <TD>RedHat</TD></TR>
++<TR><TD>0.7, 0.71 (for libc 5)</TD> <TD>libc 5.x</TD> <TD>RH 4.2</TD></TR>
++<TR><TD>0.7, 0.71 (for glibc 2)</TD> <TD>glibc 2.0.x</TD> <TD>RH 5.x</TD></TR>
++<TR><TD>0.8</TD> <TD>glibc 2.1.1</TD> <TD>RH 6.0</TD></TR>
++<TR><TD>0.8</TD> <TD>glibc 2.1.2</TD> <TD>not yet released</TD></TR>
++</TABLE>
++<P>
++
++<HR>
++<P>
++
++<H2><A NAME="D">D. Problems, weird behaviors, potential bugs</A></H2>
++
++<H4><A NAME="D.1">D.1: When I compile LinuxThreads, I run into problems in
++file <code>libc_r/dirent.c</code></A></H4>
++
++You probably mean:
++<PRE>
++        libc_r/dirent.c:94: structure has no member named `dd_lock'
++</PRE>
++I haven't actually seen this problem, but several users reported it.
++My understanding is that something is wrong in the include files of
++your Linux installation (<code>/usr/include/*</code>). Make sure
++you're using a supported version of the libc 5 library. (See question <A
++HREF="#C.2">C.2</A>).<P>
++
++<H4><A NAME="D.2">D.2: When I compile LinuxThreads, I run into problems with
++<CODE>/usr/include/sched.h</CODE>: there are several occurrences of
++<CODE>_p</CODE> that the C compiler does not understand</A></H4>
++
++Yes, <CODE>/usr/include/sched.h</CODE> that comes with libc 5.3.12 is broken.
++Replace it with the <code>sched.h</code> file contained in the
++LinuxThreads distribution.  But really you should not be using libc
++5.3.12 with LinuxThreads! (See question <A HREF="#C.2">C.1</A>.)<P>
++
++<H4><A NAME="D.3">D.3: My program does <CODE>fdopen()</CODE> on a file
++descriptor opened on a pipe.  When I link it with LinuxThreads,
++<CODE>fdopen()</CODE> always returns NULL!</A></H4>
++
++You're using one of the buggy versions of libc (5.3.12, 5.4.7., etc).
++See question <A HREF="#C.1">C.1</A> above.<P>
++
++<H4><A NAME="D.4">D.4: My program creates a lot of threads, and after
++a while <CODE>pthread_create()</CODE> no longer returns!</A></H4>
++
++This is known bug in the version of LinuxThreads that comes with glibc
++2.1.1.  An upgrade to 2.1.2 is recommended. <P>
++
++<H4><A NAME="D.5">D.5: When I'm running a program that creates N
++threads, <code>top</code> or <code>ps</code>
++display N+2 processes that are running my program. What do all these
++processes correspond to?</A></H4>
++
++Due to the general "one process per thread" model, there's one process
++for the initial thread and N processes for the threads it created
++using <CODE>pthread_create</CODE>.  That leaves one process
++unaccounted for.  That extra process corresponds to the "thread
++manager" thread, a thread created internally by LinuxThreads to handle
++thread creation and thread termination.  This extra thread is asleep
++most of the time.
++
++<H4><A NAME="D.6">D.6: Scheduling seems to be very unfair when there
++is strong contention on a mutex: instead of giving the mutex to each
++thread in turn, it seems that it's almost always the same thread that
++gets the mutex. Isn't this completely broken behavior?</A></H4>
++
++That behavior has mostly disappeared in recent releases of
++LinuxThreads (version 0.8 and up).  It was fairly common in older
++releases, though.
++
++What happens in LinuxThreads 0.7 and before is the following: when a
++thread unlocks a mutex, all other threads that were waiting on the
++mutex are sent a signal which makes them runnable.  However, the
++kernel scheduler may or may not restart them immediately.  If the
++thread that unlocked the mutex tries to lock it again immediately
++afterwards, it is likely that it will succeed, because the threads
++haven't yet restarted.  This results in an apparently very unfair
++behavior, when the same thread repeatedly locks and unlocks the mutex,
++while other threads can't lock the mutex.<P>
++
++In LinuxThreads 0.8 and up, <code>pthread_unlock</code> restarts only
++one waiting thread, and pre-assign the mutex to that thread.  Hence,
++if the thread that unlocked the mutex tries to lock it again
++immediately, it will block until other waiting threads have had a
++chance to lock and unlock the mutex.  This results in much fairer
++scheduling.<P>
++
++Notice however that even the old "unfair" behavior is perfectly
++acceptable with respect to the POSIX standard: for the default
++scheduling policy, POSIX makes no guarantees of fairness, such as "the
++thread waiting for the mutex for the longest time always acquires it
++first".  Properly written multithreaded code avoids that kind of heavy
++contention on mutexes, and does not run into fairness problems.  If
++you need scheduling guarantees, you should consider using the
++real-time scheduling policies <code>SCHED_RR</code> and
++<code>SCHED_FIFO</code>, which have precisely defined scheduling
++behaviors. <P>
++
++<H4><A NAME="D.7">D.7: I have a simple test program with two threads
++that do nothing but <CODE>printf()</CODE> in tight loops, and from the
++printout it seems that only one thread is running, the other doesn't
++print anything!</A></H4>
++
++Again, this behavior is characteristic of old releases of LinuxThreads
++(0.7 and before); more recent versions (0.8 and up) should not exhibit
++this behavior.<P>
++
++The reason for this behavior is explained in
++question <A HREF="#D.6">D.6</A> above: <CODE>printf()</CODE> performs
++locking on <CODE>stdout</CODE>, and thus your two threads contend very
++heavily for the mutex associated with <CODE>stdout</CODE>.  But if you
++do some real work between two calls to <CODE>printf()</CODE>, you'll
++see that scheduling becomes much smoother.<P>
++
++<H4><A NAME="D.8">D.8: I've looked at <code>&lt;pthread.h&gt;</code>
++and there seems to be a gross error in the <code>pthread_cleanup_push</code>
++macro: it opens a block with <code>{</code> but does not close it!
++Surely you forgot a <code>}</code> at the end of the macro, right?
++</A></H4>
++
++Nope.  That's the way it should be.  The closing brace is provided by
++the <code>pthread_cleanup_pop</code> macro.  The POSIX standard
++requires <code>pthread_cleanup_push</code> and
++<code>pthread_cleanup_pop</code> to be used in matching pairs, at the
++same level of brace nesting.  This allows
++<code>pthread_cleanup_push</code> to open a block in order to
++stack-allocate some data structure, and
++<code>pthread_cleanup_pop</code> to close that block.  It's ugly, but
++it's the standard way of implementing cleanup handlers.<P>
++
++<H4><A NAME="D.9">D.9: I tried to use real-time threads and my program
++loops like crazy and freezes the whole machine!</A></H4>
++
++Versions of LinuxThreads prior to 0.8 are susceptible to ``livelocks''
++(one thread loops, consuming 100% of the CPU time) in conjunction with
++real-time scheduling.  Since real-time threads and processes have
++higher priority than normal Linux processes, all other processes on
++the machine, including the shell, the X server, etc, cannot run and
++the machine appears frozen.<P>
++
++The problem is fixed in LinuxThreads 0.8.<P>
++
++<H4><A NAME="D.10">D.10: My application needs to create thousands of
++threads, or maybe even more.  Can I do this with
++LinuxThreads?</A></H4>
++
++No.  You're going to run into several hard limits:
++<UL>
++<LI>Each thread, from the kernel's standpoint, is one process.  Stock
++Linux kernels are limited to at most 512 processes for the super-user,
++and half this number for regular users.  This can be changed by
++changing <code>NR_TASKS</code> in <code>include/linux/tasks.h</code>
++and recompiling the kernel.  On the x86 processors at least,
++architectural constraints seem to limit <code>NR_TASKS</code> to 4090
++at most.
++<LI>LinuxThreads contains a table of all active threads.  This table
++has room for 1024 threads at most.  To increase this limit, you must
++change <code>PTHREAD_THREADS_MAX</code> in the LinuxThreads sources
++and recompile.
++<LI>By default, each thread reserves 2M of virtual memory space for
++its stack.  This space is just reserved; actual memory is allocated
++for the stack on demand.  But still, on a 32-bit processor, the total
++virtual memory space available for the stacks is on the order of 1G,
++meaning that more than 500 threads will have a hard time fitting in.
++You can overcome this limitation by moving to a 64-bit platform, or by
++allocating smaller stacks yourself using the <code>setstackaddr</code>
++attribute.
++<LI>Finally, the Linux kernel contains many algorithms that run in
++time proportional to the number of process table entries.  Increasing
++this number drastically will slow down the kernel operations
++noticeably.
++</UL>
++(Other POSIX threads libraries have similar limitations, by the way.)
++For all those reasons, you'd better restructure your application so
++that it doesn't need more than, say, 100 threads.  For instance,
++in the case of a multithreaded server, instead of creating a new
++thread for each connection, maintain a fixed-size pool of worker
++threads that pick incoming connection requests from a queue.<P>
++
++<HR>
++<P>
++
++<H2><A NAME="E">E. Missing functions, wrong types, etc</A></H2>
++
++<H4><A NAME="E.1">E.1: Where is <CODE>pthread_yield()</CODE> ? How
++comes LinuxThreads does not implement it?</A></H4>
++
++Because it's not part of the (final) POSIX 1003.1c standard.
++Several drafts of the standard contained <CODE>pthread_yield()</CODE>,
++but then the POSIX guys discovered it was redundant with
++<CODE>sched_yield()</CODE> and dropped it.  So, just use
++<CODE>sched_yield()</CODE> instead.
++
++<H4><A NAME="E.2">E.2: I've found some type errors in
++<code>&lt;pthread.h&gt;</code>.
++For instance, the second argument to <CODE>pthread_create()</CODE>
++should be a <CODE>pthread_attr_t</CODE>, not a
++<CODE>pthread_attr_t *</CODE>. Also, didn't you forget to declare
++<CODE>pthread_attr_default</CODE>?</A></H4>
++
++No, I didn't.  What you're describing is draft 4 of the POSIX
++standard, which is used in OSF DCE threads.  LinuxThreads conforms to the
++final standard.  Even though the functions have the same names as in
++draft 4 and DCE, their calling conventions are slightly different.  In
++particular, attributes are passed by reference, not by value, and
++default attributes are denoted by the NULL pointer.  Since draft 4/DCE
++will eventually disappear, you'd better port your program to use the
++standard interface.<P>
++
++<H4><A NAME="E.3">E.3: I'm porting an application from Solaris and I
++have to rename all thread functions from <code>thr_blah</code> to
++<CODE>pthread_blah</CODE>.  This is very annoying.  Why did you change
++all the function names?</A></H4>
++
++POSIX did it.  The <code>thr_*</code> functions correspond to Solaris
++threads, an older thread interface that you'll find only under
++Solaris.  The <CODE>pthread_*</CODE> functions correspond to POSIX
++threads, an international standard available for many, many platforms.
++Even Solaris 2.5 and later support the POSIX threads interface.  So,
++do yourself a favor and rewrite your code to use POSIX threads: this
++way, it will run unchanged under Linux, Solaris, and quite a lot of
++other platforms.<P>
++
++<H4><A NAME="E.4">E.4: How can I suspend and resume a thread from
++another thread? Solaris has the <CODE>thr_suspend()</CODE> and
++<CODE>thr_resume()</CODE> functions to do that; why don't you?</A></H4>
++
++The POSIX standard provides <B>no</B> mechanism by which a thread A can
++suspend the execution of another thread B, without cooperation from B.
++The only way to implement a suspend/restart mechanism is to have B
++check periodically some global variable for a suspend request
++and then suspend itself on a condition variable, which another thread
++can signal later to restart B.<P>
++
++Notice that <CODE>thr_suspend()</CODE> is inherently dangerous and
++prone to race conditions.  For one thing, there is no control on where
++the target thread stops: it can very well be stopped in the middle of
++a critical section, while holding mutexes.  Also, there is no
++guarantee on when the target thread will actually stop.  For these
++reasons, you'd be much better off using mutexes and conditions
++instead.  The only situations that really require the ability to
++suspend a thread are debuggers and some kind of garbage collectors.<P>
++
++If you really must suspend a thread in LinuxThreads, you can send it a
++<CODE>SIGSTOP</CODE> signal with <CODE>pthread_kill</CODE>. Send
++<CODE>SIGCONT</CODE> for restarting it.
++Beware, this is specific to LinuxThreads and entirely non-portable.
++Indeed, a truly conforming POSIX threads implementation will stop all
++threads when one thread receives the <CODE>SIGSTOP</CODE> signal!
++One day, LinuxThreads will implement that behavior, and the
++non-portable hack with <CODE>SIGSTOP</CODE> won't work anymore.<P>
++
++<H4><A NAME="E.5">E.5: Does LinuxThreads implement
++<CODE>pthread_attr_setstacksize()</CODE> and
++<CODE>pthread_attr_setstackaddr()</CODE>?</A></H4>
++
++These optional functions are provided in recent versions of
++LinuxThreads (0.8 and up).  Earlier releases did not provide these
++optional components of the POSIX standard.<P>
++
++Even if <CODE>pthread_attr_setstacksize()</CODE> and
++<CODE>pthread_attr_setstackaddr()</CODE> are now provided, we still
++recommend that you do not use them unless you really have strong
++reasons for doing so.  The default stack allocation strategy for
++LinuxThreads is nearly optimal: stacks start small (4k) and
++automatically grow on demand to a fairly large limit (2M).
++Moreover, there is no portable way to estimate the stack requirements
++of a thread, so setting the stack size yourself makes your program
++less reliable and non-portable.<P>
++
++<H4><A NAME="E.6">E.6: LinuxThreads does not support the
++<CODE>PTHREAD_SCOPE_PROCESS</CODE> value of the "contentionscope"
++attribute.  Why? </A></H4>
++
++With a "one-to-one" model, as in LinuxThreads (one kernel execution
++context per thread), there is only one scheduler for all processes and
++all threads on the system.  So, there is no way to obtain the behavior of
++<CODE>PTHREAD_SCOPE_PROCESS</CODE>.
++
++<H4><A NAME="E.7">E.7: LinuxThreads does not implement process-shared
++mutexes, conditions, and semaphores. Why?</A></H4>
++
++This is another optional component of the POSIX standard.  Portable
++applications should test <CODE>_POSIX_THREAD_PROCESS_SHARED</CODE>
++before using this facility.
++<P>
++The goal of this extension is to allow different processes (with
++different address spaces) to synchronize through mutexes, conditions
++or semaphores allocated in shared memory (either SVR4 shared memory
++segments or <CODE>mmap()</CODE>ed files).
++<P>
++The reason why this does not work in LinuxThreads is that mutexes,
++conditions, and semaphores are not self-contained: their waiting
++queues contain pointers to linked lists of thread descriptors, and
++these pointers are meaningful only in one address space.
++<P>
++Matt Messier and I spent a significant amount of time trying to design a
++suitable mechanism for sharing waiting queues between processes.  We
++came up with several solutions that combined two of the following
++three desirable features, but none that combines all three:
++<UL>
++<LI>allow sharing between processes having different UIDs
++<LI>supports cancellation
++<LI>supports <CODE>pthread_cond_timedwait</CODE>
++</UL>
++We concluded that kernel support is required to share mutexes,
++conditions and semaphores between processes.  That's one place where
++Linus Torvalds's intuition that "all we need in the kernel is
++<CODE>clone()</CODE>" fails.
++<P>
++Until suitable kernel support is available, you'd better use
++traditional interprocess communications to synchronize different
++processes: System V semaphores and message queues, or pipes, or sockets.
++<P>
++
++<HR>
++<P>
++
++<H2><A NAME="F">F. C++ issues</A></H2>
++
++<H4><A NAME="F.1">F.1: Are there C++ wrappers for LinuxThreads?</A></H4>
++
++Douglas Schmidt's ACE library contains, among a lot of other
++things, C++ wrappers for LinuxThreads and quite a number of other
++thread libraries.  Check out
++<A HREF="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</A><P>
++
++<H4><A NAME="F.2">F.2: I'm trying to use LinuxThreads from a C++
++program, and the compiler complains about the third argument to
++<CODE>pthread_create()</CODE> !</A></H4>
++
++You're probably trying to pass a class member function or some
++other C++ thing as third argument to <CODE>pthread_create()</CODE>.
++Recall that <CODE>pthread_create()</CODE> is a C function, and it must
++be passed a C function as third argument.<P>
++
++<H4><A NAME="F.3">F.3: I'm trying to use LinuxThreads in conjunction
++with libg++, and I'm having all sorts of trouble.</A></H4>
++
++>From what I understand, thread support in libg++ is completely broken,
++especially with respect to locking of iostreams.  H.J.Lu wrote:
++<BLOCKQUOTE>
++If you want to use thread, I can only suggest egcs and glibc. You
++can find egcs at
++<A HREF="http://www.cygnus.com/egcs">http://www.cygnus.com/egcs</A>.
++egcs has libsdtc++, which is MT safe under glibc 2. If you really
++want to use the libg++, I have a libg++ add-on for egcs.
++</BLOCKQUOTE>
++<HR>
++<P>
++
++<H2><A NAME="G">G. Debugging LinuxThreads programs</A></H2>
++
++<H4><A NAME="G.1">G.1: Can I debug LinuxThreads program using gdb?</A></H4>
++
++Yes, but not with the stock gdb 4.17.  You need a specially patched
++version of gdb 4.17 developed by Eric Paire and colleages at The Open
++Group, Grenoble.  The patches against gdb 4.17 are available at
++<A HREF="http://www.gr.opengroup.org/java/jdk/linux/debug.htm"><code>http://www.gr.opengroup.org/java/jdk/linux/debug.htm</code></A>.
++Precompiled binaries of the patched gdb are available in RedHat's RPM
++format at <A
++HREF="http://odin.appliedtheory.com/"><code>http://odin.appliedtheory.com/</code></A>.<P>
++
++Some Linux distributions provide an already-patched version of gdb;
++others don't.  For instance, the gdb in RedHat 5.2 is thread-aware,
++but apparently not the one in RedHat 6.0.  Just ask (politely) the
++makers of your Linux distributions to please make sure that they apply
++the correct patches to gdb.<P>
++
++<H4><A NAME="G.2">G.2: Does it work with post-mortem debugging?</A></H4>
++
++Not very well.  Generally, the core file does not correspond to the
++thread that crashed.  The reason is that the kernel will not dump core
++for a process that shares its memory with other processes, such as the
++other threads of your program.  So, the thread that crashes silently
++disappears without generating a core file.  Then, all other threads of
++your program die on the same signal that killed the crashing thread.
++(This is required behavior according to the POSIX standard.)  The last
++one that dies is no longer sharing its memory with anyone else, so the
++kernel generates a core file for that thread.  Unfortunately, that's
++not the thread you are interested in.
++
++<H4><A NAME="G.3">G.3: Any other ways to debug multithreaded programs, then?</A></H4>
++
++Assertions and <CODE>printf()</CODE> are your best friends.  Try to debug
++sequential parts in a single-threaded program first.  Then, put
++<CODE>printf()</CODE> statements all over the place to get execution traces.
++Also, check invariants often with the <CODE>assert()</CODE> macro.  In truth,
++there is no other effective way (save for a full formal proof of your
++program) to track down concurrency bugs.  Debuggers are not really
++effective for subtle concurrency problems, because they disrupt
++program execution too much.<P>
++
++<HR>
++<P>
++
++<H2><A NAME="H">H. Compiling multithreaded code; errno madness</A></H2>
++
++<H4><A NAME="H.1">H.1: You say all multithreaded code must be compiled
++with <CODE>_REENTRANT</CODE> defined. What difference does it make?</A></H4>
++
++It affects include files in three ways:
++<UL>
++<LI> The include files define prototypes for the reentrant variants of
++some of the standard library functions,
++e.g. <CODE>gethostbyname_r()</CODE> as a reentrant equivalent to
++<CODE>gethostbyname()</CODE>.<P>
++
++<LI> If <CODE>_REENTRANT</CODE> is defined, some
++<code>&lt;stdio.h&gt;</code> functions are no longer defined as macros,
++e.g. <CODE>getc()</CODE> and <CODE>putc()</CODE>. In a multithreaded
++program, stdio functions require additional locking, which the macros
++don't perform, so we must call functions instead.<P>
++
++<LI> More importantly, <code>&lt;errno.h&gt;</code> redefines errno when
++<CODE>_REENTRANT</CODE> is
++defined, so that errno refers to the thread-specific errno location
++rather than the global errno variable.  This is achieved by the
++following <code>#define</code> in <code>&lt;errno.h&gt;</code>:
++<PRE>
++        #define errno (*(__errno_location()))
++</PRE>
++which causes each reference to errno to call the
++<CODE>__errno_location()</CODE> function for obtaining the location
++where error codes are stored.  libc provides a default definition of
++<CODE>__errno_location()</CODE> that always returns
++<code>&errno</code> (the address of the global errno variable). Thus,
++for programs not linked with LinuxThreads, defining
++<CODE>_REENTRANT</CODE> makes no difference w.r.t. errno processing.
++But LinuxThreads redefines <CODE>__errno_location()</CODE> to return a
++location in the thread descriptor reserved for holding the current
++value of errno for the calling thread.  Thus, each thread operates on
++a different errno location.
++</UL>
++<P>
++
++<H4><A NAME="H.2">H.2: Why is it so important that each thread has its
++own errno variable? </A></H4>
++
++If all threads were to store error codes in the same, global errno
++variable, then the value of errno after a system call or library
++function returns would be unpredictable:  between the time a system
++call stores its error code in the global errno and your code inspects
++errno to see which error occurred, another thread might have stored
++another error code in the same errno location. <P>
++
++<H4><A NAME="H.3">H.3: What happens if I link LinuxThreads with code
++not compiled with <CODE>-D_REENTRANT</CODE>?</A></H4>
++
++Lots of trouble.  If the code uses <CODE>getc()</CODE> or
++<CODE>putc()</CODE>, it will perform I/O without proper interlocking
++of the stdio buffers; this can cause lost output, duplicate output, or
++just crash other stdio functions.  If the code consults errno, it will
++get back the wrong error code.  The following code fragment is a
++typical example:
++<PRE>
++        do {
++          r = read(fd, buf, n);
++          if (r == -1) {
++            if (errno == EINTR)   /* an error we can handle */
++              continue;
++            else {                /* other errors are fatal */
++              perror("read failed");
++              exit(100);
++            }
++          }
++        } while (...);
++</PRE>
++Assume this code is not compiled with <CODE>-D_REENTRANT</CODE>, and
++linked with LinuxThreads.  At run-time, <CODE>read()</CODE> is
++interrupted.  Since the C library was compiled with
++<CODE>-D_REENTRANT</CODE>, <CODE>read()</CODE> stores its error code
++in the location pointed to by <CODE>__errno_location()</CODE>, which
++is the thread-local errno variable.  Then, the code above sees that
++<CODE>read()</CODE> returns -1 and looks up errno.  Since
++<CODE>_REENTRANT</CODE> is not defined, the reference to errno
++accesses the global errno variable, which is most likely 0.  Hence the
++code concludes that it cannot handle the error and stops.<P>
++
++<H4><A NAME="H.4">H.4: With LinuxThreads, I can no longer use the signals
++<code>SIGUSR1</code> and <code>SIGUSR2</code> in my programs! Why? </A></H4>
++
++The short answer is: because the Linux kernel you're using does not
++support realtime signals.  <P>
++
++LinuxThreads needs two signals for its internal operation.
++One is used to suspend and restart threads blocked on mutex, condition
++or semaphore operations.  The other is used for thread
++cancellation.<P>
++
++On ``old'' kernels (2.0 and early 2.1 kernels), there are only 32
++signals available and the kernel reserves all of them but two:
++<code>SIGUSR1</code> and <code>SIGUSR2</code>.  So, LinuxThreads has
++no choice but use those two signals.<P>
++
++On recent kernels (2.2 and up), more than 32 signals are provided in
++the form of realtime signals. When run on one of those kernels,
++LinuxThreads uses two reserved realtime signals for its internal
++operation, thus leaving <code>SIGUSR1</code> and <code>SIGUSR2</code>
++free for user code.  (This works only with glibc, not with libc 5.) <P>
++
++<H4><A NAME="H.5">H.5: Is the stack of one thread visible from the
++other threads?  Can I pass a pointer into my stack to other threads?
++</A></H4>
++
++Yes, you can -- if you're very careful.  The stacks are indeed visible
++from all threads in the system.  Some non-POSIX thread libraries seem
++to map the stacks for all threads at the same virtual addresses and
++change the memory mapping when they switch from one thread to
++another.  But this is not the case for LinuxThreads, as it would make
++context switching between threads more expensive, and at any rate
++might not conform to the POSIX standard.<P>
++
++So, you can take the address of an "auto" variable and pass it to
++other threads via shared data structures.  However, you need to make
++absolutely sure that the function doing this will not return as long
++as other threads need to access this address.  It's the usual mistake
++of returning the address of an "auto" variable, only made much worse
++because of concurrency.  It's much, much safer to systematically
++heap-allocate all shared data structures. <P>
++
++<HR>
++<P>
++
++<H2><A NAME="I">I.  X-Windows and other libraries</A></H2>
++
++<H4><A NAME="I.1">I.1: My program uses both Xlib and LinuxThreads.
++It stops very early with an "Xlib: unknown 0 error" message.  What
++does this mean? </A></H4>
++
++That's a prime example of the errno problem described in question <A
++HREF="#H.2">H.2</A>.  The binaries for Xlib you're using have not been
++compiled with <CODE>-D_REENTRANT</CODE>.  It happens Xlib contains a
++piece of code very much like the one in question <A
++HREF="#H.2">H.2</A>.  So, your Xlib fetches the error code from the
++wrong errno location and concludes that an error it cannot handle
++occurred.<P>
++
++<H4><A NAME="I.2">I.2: So, what can I do to build a multithreaded X
++Windows client? </A></H4>
++
++The best solution is to use X libraries that have been compiled with
++multithreading options set.  Linux distributions that come with glibc
++2 as the main C library generally provide thread-safe X libraries.
++At least, that seems to be the case for RedHat 5 and later.<P>
++
++You can try to recompile yourself the X libraries with multithreading
++options set.  They contain optional support for multithreading; it's
++just that the binaries provided by your Linux distribution were built
++without this support.  See the file <code>README.Xfree3.3</code> in
++the LinuxThreads distribution for patches and info on how to compile
++thread-safe X libraries from the Xfree3.3 distribution.  The Xfree3.3
++sources are readily available in most Linux distributions, e.g. as a
++source RPM for RedHat.  Be warned, however, that X Windows is a huge
++system, and recompiling even just the libraries takes a lot of time
++and disk space.<P>
++
++Another, less involving solution is to call X functions only from the
++main thread of your program.  Even if all threads have their own errno
++location, the main thread uses the global errno variable for its errno
++location.  Thus, code not compiled with <code>-D_REENTRANT</code>
++still "sees" the right error values if it executes in the main thread
++only. <P>
++
++<H4><A NAME="I.2">This is a lot of work. Don't you have precompiled
++thread-safe X libraries that you could distribute?</A></H4>
++
++No, I don't.  Sorry.  But consider installing a Linux distribution
++that comes with thread-safe X libraries, such as RedHat 6.<P>
++
++<H4><A NAME="I.3">I.3: Can I use library FOO in a multithreaded
++program?</A></H4>
++
++Most libraries cannot be used "as is" in a multithreaded program.
++For one thing, they are not necessarily thread-safe: calling
++simultaneously two functions of the library from two threads might not
++work, due to internal use of global variables and the like.  Second,
++the libraries must have been compiled with <CODE>-D_REENTRANT</CODE> to avoid
++the errno problems explained in question <A HREF="#H.2">H.2</A>.
++<P>
++
++<H4><A NAME="I.4">I.4: What if I make sure that only one thread calls
++functions in these libraries?</A></H4>
++
++This avoids problems with the library not being thread-safe.  But
++you're still vulnerable to errno problems.  At the very least, a
++recompile of the library with <CODE>-D_REENTRANT</CODE> is needed.
++<P>
++
++<H4><A NAME="I.5">I.5: What if I make sure that only the main thread
++calls functions in these libraries?</A></H4>
++
++That might actually work.  As explained in question <A HREF="#I.1">I.1</A>,
++the main thread uses the global errno variable, and can therefore
++execute code not compiled with <CODE>-D_REENTRANT</CODE>.<P>
++
++<H4><A NAME="I.6">I.6: SVGAlib doesn't work with LinuxThreads.  Why?
++</A></H4>
++
++Because both LinuxThreads and SVGAlib use the signals
++<code>SIGUSR1</code> and <code>SIGUSR2</code>.  See question <A
++HREF="#H.4">H.4</A>.
++<P>
++
++
++<HR>
++<P>
++
++<H2><A NAME="J">J.  Signals and threads</A></H2>
++
++<H4><A NAME="J.1">J.1: When it comes to signals, what is shared
++between threads and what isn't?</A></H4>
++
++Signal handlers are shared between all threads: when a thread calls
++<CODE>sigaction()</CODE>, it sets how the signal is handled not only
++for itself, but for all other threads in the program as well.<P>
++
++On the other hand, signal masks are per-thread: each thread chooses
++which signals it blocks independently of others.  At thread creation
++time, the newly created thread inherits the signal mask of the thread
++calling <CODE>pthread_create()</CODE>.  But afterwards, the new thread
++can modify its signal mask independently of its creator thread.<P>
++
++<H4><A NAME="J.2">J.2: When I send a <CODE>SIGKILL</CODE> to a
++particular thread using <CODE>pthread_kill</CODE>, all my threads are
++killed!</A></H4>
++
++That's how it should be.  The POSIX standard mandates that all threads
++should terminate when the process (i.e. the collection of all threads
++running the program) receives a signal whose effect is to
++terminate the process (such as <CODE>SIGKILL</CODE> or <CODE>SIGINT</CODE>
++when no handler is installed on that signal).  This behavior makes a
++lot of sense: when you type "ctrl-C" at the keyboard, or when a thread
++crashes on a division by zero or a segmentation fault, you really want
++all threads to stop immediately, not just the one that caused the
++segmentation violation or that got the <CODE>SIGINT</CODE> signal.
++(This assumes default behavior for those signals; see question
++<A HREF="#J.3">J.3</A> if you install handlers for those signals.)<P>
++
++If you're trying to terminate a thread without bringing the whole
++process down, use <code>pthread_cancel()</code>.<P>
++
++<H4><A NAME="J.3">J.3: I've installed a handler on a signal.  Which
++thread executes the handler when the signal is received?</A></H4>
++
++If the signal is generated by a thread during its execution (e.g. a
++thread executes a division by zero and thus generates a
++<CODE>SIGFPE</CODE> signal), then the handler is executed by that
++thread.  This also applies to signals generated by
++<CODE>raise()</CODE>.<P>
++
++If the signal is sent to a particular thread using
++<CODE>pthread_kill()</CODE>, then that thread executes the handler.<P>
++
++If the signal is sent via <CODE>kill()</CODE> or the tty interface
++(e.g. by pressing ctrl-C), then the POSIX specs say that the handler
++is executed by any thread in the process that does not currently block
++the signal.  In other terms, POSIX considers that the signal is sent
++to the process (the collection of all threads) as a whole, and any
++thread that is not blocking this signal can then handle it.<P>
++
++The latter case is where LinuxThreads departs from the POSIX specs.
++In LinuxThreads, there is no real notion of ``the process as a whole'':
++in the kernel, each thread is really a distinct process with a
++distinct PID, and signals sent to the PID of a thread can only be
++handled by that thread.  As long as no thread is blocking the signal,
++the behavior conforms to the standard: one (unspecified) thread of the
++program handles the signal.  But if the thread to which PID the signal
++is sent blocks the signal, and some other thread does not block the
++signal, then LinuxThreads will simply queue in
++that thread and execute the handler only when that thread unblocks
++the signal, instead of executing the handler immediately in the other
++thread that does not block the signal.<P>
++
++This is to be viewed as a LinuxThreads bug, but I currently don't see
++any way to implement the POSIX behavior without kernel support.<P>
++
++<H4><A NAME="J.3">J.3: How shall I go about mixing signals and threads
++in my program? </A></H4>
++
++The less you mix them, the better.  Notice that all
++<CODE>pthread_*</CODE> functions are not async-signal safe, meaning
++that you should not call them from signal handlers.  This
++recommendation is not to be taken lightly: your program can deadlock
++if you call a <CODE>pthread_*</CODE> function from a signal handler!
++<P>
++
++The only sensible things you can do from a signal handler is set a
++global flag, or call <CODE>sem_post</CODE> on a semaphore, to record
++the delivery of the signal.  The remainder of the program can then
++either poll the global flag, or use <CODE>sem_wait()</CODE> and
++<CODE>sem_trywait()</CODE> on the semaphore.<P>
++
++Another option is to do nothing in the signal handler, and dedicate
++one thread (preferably the initial thread) to wait synchronously for
++signals, using <CODE>sigwait()</CODE>, and send messages to the other
++threads accordingly.
++
++<H4><A NAME="J.4">J.4: When one thread is blocked in
++<CODE>sigwait()</CODE>, other threads no longer receive the signals
++<CODE>sigwait()</CODE> is waiting for!  What happens? </A></H4>
++
++It's an unfortunate consequence of how LinuxThreads implements
++<CODE>sigwait()</CODE>.  Basically, it installs signal handlers on all
++signals waited for, in order to record which signal was received.
++Since signal handlers are shared with the other threads, this
++temporarily deactivates any signal handlers you might have previously
++installed on these signals.<P>
++
++Though surprising, this behavior actually seems to conform to the
++POSIX standard.  According to POSIX, <CODE>sigwait()</CODE> is
++guaranteed to work as expected only if all other threads in the
++program block the signals waited for (otherwise, the signals could be
++delivered to other threads than the one doing <CODE>sigwait()</CODE>,
++which would make <CODE>sigwait()</CODE> useless).  In this particular
++case, the problem described in this question does not appear.<P>
++
++One day, <CODE>sigwait()</CODE> will be implemented in the kernel,
++along with others POSIX 1003.1b extensions, and <CODE>sigwait()</CODE>
++will have a more natural behavior (as well as better performances).<P>
++
++<HR>
++<P>
++
++<H2><A NAME="K">K.  Internals of LinuxThreads</A></H2>
++
++<H4><A NAME="K.1">K.1: What is the implementation model for
++LinuxThreads?</A></H4>
++
++LinuxThreads follows the so-called "one-to-one" model: each thread is
++actually a separate process in the kernel.  The kernel scheduler takes
++care of scheduling the threads, just like it schedules regular
++processes.  The threads are created with the Linux
++<code>clone()</code> system call, which is a generalization of
++<code>fork()</code> allowing the new process to share the memory
++space, file descriptors, and signal handlers of the parent.<P>
++
++Advantages of the "one-to-one" model include:
++<UL>
++<LI> minimal overhead on CPU-intensive multiprocessing (with
++about one thread per processor);
++<LI> minimal overhead on I/O operations;
++<LI> a simple and robust implementation (the kernel scheduler does
++most of the hard work for us).
++</UL>
++The main disadvantage is more expensive context switches on mutex and
++condition operations, which must go through the kernel.  This is
++mitigated by the fact that context switches in the Linux kernel are
++pretty efficient.<P>
++
++<H4><A NAME="K.2">K.2: Have you considered other implementation
++models?</A></H4>
++
++There are basically two other models.  The "many-to-one" model
++relies on a user-level scheduler that context-switches between the
++threads entirely in user code; viewed from the kernel, there is only
++one process running.  This model is completely out of the question for
++me, since it does not take advantage of multiprocessors, and require
++unholy magic to handle blocking I/O operations properly.  There are
++several user-level thread libraries available for Linux, but I found
++all of them deficient in functionality, performance, and/or robustness.
++<P>
++
++The "many-to-many" model combines both kernel-level and user-level
++scheduling: several kernel-level threads run concurrently, each
++executing a user-level scheduler that selects between user threads.
++Most commercial Unix systems (Solaris, Digital Unix, IRIX) implement
++POSIX threads this way.  This model combines the advantages of both
++the "many-to-one" and the "one-to-one" model, and is attractive
++because it avoids the worst-case behaviors of both models --
++especially on kernels where context switches are expensive, such as
++Digital Unix.  Unfortunately, it is pretty complex to implement, and
++requires kernel support which Linux does not provide.  Linus Torvalds
++and other Linux kernel developers have always been pushing the
++"one-to-one" model in the name of overall simplicity, and are doing a
++pretty good job of making kernel-level context switches between
++threads efficient.  LinuxThreads is just following the general
++direction they set.<P>
++
++<HR>
++<ADDRESS>Xavier.Leroy@inria.fr</ADDRESS>
++</BODY>
++</HTML>
+diff -Naur ../glibc-2.1.3/linuxthreads/LICENSE glibc-2.1.3/linuxthreads/LICENSE
+--- ../glibc-2.1.3/linuxthreads/LICENSE	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/LICENSE	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,501 @@
++GNU LIBRARY GENERAL PUBLIC LICENSE
++**********************************
++
++                         Version 2, June 1991
++
++     Copyright (C) 1991 Free Software Foundation, Inc.
++     59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
++     
++     Everyone is permitted to copy and distribute verbatim copies
++     of this license document, but changing it is not allowed.
++     
++     [This is the first released version of the library GPL.  It is
++      numbered 2 because it goes with version 2 of the ordinary GPL.]
++
++Preamble
++========
++
++   The licenses for most software are designed to take away your
++freedom to share and change it.  By contrast, the GNU General Public
++Licenses are intended to guarantee your freedom to share and change
++free software--to make sure the software is free for all its users.
++
++   This license, the Library General Public License, applies to some
++specially designated Free Software Foundation software, and to any
++other libraries whose authors decide to use it.  You can use it for
++your libraries, too.
++
++   When we speak of free software, we are referring to freedom, not
++price.  Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it in
++new free programs; and that you know you can do these things.
++
++   To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the library, or if you modify it.
++
++   For example, if you distribute copies of the library, whether gratis
++or for a fee, you must give the recipients all the rights that we gave
++you.  You must make sure that they, too, receive or can get the source
++code.  If you link a program with the library, you must provide
++complete object files to the recipients so that they can relink them
++with the library, after making changes to the library and recompiling
++it.  And you must show them these terms so they know their rights.
++
++   Our method of protecting your rights has two steps: (1) copyright
++the library, and (2) offer you this license which gives you legal
++permission to copy, distribute and/or modify the library.
++
++   Also, for each distributor's protection, we want to make certain
++that everyone understands that there is no warranty for this free
++library.  If the library is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original
++version, so that any problems introduced by others will not reflect on
++the original authors' reputations.
++
++   Finally, any free program is threatened constantly by software
++patents.  We wish to avoid the danger that companies distributing free
++software will individually obtain patent licenses, thus in effect
++transforming the program into proprietary software.  To prevent this,
++we have made it clear that any patent must be licensed for everyone's
++free use or not licensed at all.
++
++   Most GNU software, including some libraries, is covered by the
++ordinary GNU General Public License, which was designed for utility
++programs.  This license, the GNU Library General Public License,
++applies to certain designated libraries.  This license is quite
++different from the ordinary one; be sure to read it in full, and don't
++assume that anything in it is the same as in the ordinary license.
++
++   The reason we have a separate public license for some libraries is
++that they blur the distinction we usually make between modifying or
++adding to a program and simply using it.  Linking a program with a
++library, without changing the library, is in some sense simply using
++the library, and is analogous to running a utility program or
++application program.  However, in a textual and legal sense, the linked
++executable is a combined work, a derivative of the original library,
++and the ordinary General Public License treats it as such.
++
++   Because of this blurred distinction, using the ordinary General
++Public License for libraries did not effectively promote software
++sharing, because most developers did not use the libraries.  We
++concluded that weaker conditions might promote sharing better.
++
++   However, unrestricted linking of non-free programs would deprive the
++users of those programs of all benefit from the free status of the
++libraries themselves.  This Library General Public License is intended
++to permit developers of non-free programs to use free libraries, while
++preserving your freedom as a user of such programs to change the free
++libraries that are incorporated in them.  (We have not seen how to
++achieve this as regards changes in header files, but we have achieved
++it as regards changes in the actual functions of the Library.)  The
++hope is that this will lead to faster development of free libraries.
++
++   The precise terms and conditions for copying, distribution and
++modification follow.  Pay close attention to the difference between a
++"work based on the library" and a "work that uses the library".  The
++former contains code derived from the library, while the latter only
++works together with the library.
++
++   Note that it is possible for a library to be covered by the ordinary
++General Public License rather than by this special one.
++
++    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++  0. This License Agreement applies to any software library which
++     contains a notice placed by the copyright holder or other
++     authorized party saying it may be distributed under the terms of
++     this Library General Public License (also called "this License").
++     Each licensee is addressed as "you".
++
++     A "library" means a collection of software functions and/or data
++     prepared so as to be conveniently linked with application programs
++     (which use some of those functions and data) to form executables.
++
++     The "Library", below, refers to any such software library or work
++     which has been distributed under these terms.  A "work based on the
++     Library" means either the Library or any derivative work under
++     copyright law: that is to say, a work containing the Library or a
++     portion of it, either verbatim or with modifications and/or
++     translated straightforwardly into another language.  (Hereinafter,
++     translation is included without limitation in the term
++     "modification".)
++
++     "Source code" for a work means the preferred form of the work for
++     making modifications to it.  For a library, complete source code
++     means all the source code for all modules it contains, plus any
++     associated interface definition files, plus the scripts used to
++     control compilation and installation of the library.
++
++     Activities other than copying, distribution and modification are
++     not covered by this License; they are outside its scope.  The act
++     of running a program using the Library is not restricted, and
++     output from such a program is covered only if its contents
++     constitute a work based on the Library (independent of the use of
++     the Library in a tool for writing it).  Whether that is true
++     depends on what the Library does and what the program that uses
++     the Library does.
++
++  1. You may copy and distribute verbatim copies of the Library's
++     complete source code as you receive it, in any medium, provided
++     that you conspicuously and appropriately publish on each copy an
++     appropriate copyright notice and disclaimer of warranty; keep
++     intact all the notices that refer to this License and to the
++     absence of any warranty; and distribute a copy of this License
++     along with the Library.
++
++     You may charge a fee for the physical act of transferring a copy,
++     and you may at your option offer warranty protection in exchange
++     for a fee.
++
++  2. You may modify your copy or copies of the Library or any portion
++     of it, thus forming a work based on the Library, and copy and
++     distribute such modifications or work under the terms of Section 1
++     above, provided that you also meet all of these conditions:
++
++       a. The modified work must itself be a software library.
++
++       b. You must cause the files modified to carry prominent notices
++          stating that you changed the files and the date of any change.
++
++       c. You must cause the whole of the work to be licensed at no
++          charge to all third parties under the terms of this License.
++
++       d. If a facility in the modified Library refers to a function or
++          a table of data to be supplied by an application program that
++          uses the facility, other than as an argument passed when the
++          facility is invoked, then you must make a good faith effort
++          to ensure that, in the event an application does not supply
++          such function or table, the facility still operates, and
++          performs whatever part of its purpose remains meaningful.
++
++          (For example, a function in a library to compute square roots
++          has a purpose that is entirely well-defined independent of the
++          application.  Therefore, Subsection 2d requires that any
++          application-supplied function or table used by this function
++          must be optional: if the application does not supply it, the
++          square root function must still compute square roots.)
++
++     These requirements apply to the modified work as a whole.  If
++     identifiable sections of that work are not derived from the
++     Library, and can be reasonably considered independent and separate
++     works in themselves, then this License, and its terms, do not
++     apply to those sections when you distribute them as separate
++     works.  But when you distribute the same sections as part of a
++     whole which is a work based on the Library, the distribution of
++     the whole must be on the terms of this License, whose permissions
++     for other licensees extend to the entire whole, and thus to each
++     and every part regardless of who wrote it.
++
++     Thus, it is not the intent of this section to claim rights or
++     contest your rights to work written entirely by you; rather, the
++     intent is to exercise the right to control the distribution of
++     derivative or collective works based on the Library.
++
++     In addition, mere aggregation of another work not based on the
++     Library with the Library (or with a work based on the Library) on
++     a volume of a storage or distribution medium does not bring the
++     other work under the scope of this License.
++
++  3. You may opt to apply the terms of the ordinary GNU General Public
++     License instead of this License to a given copy of the Library.
++     To do this, you must alter all the notices that refer to this
++     License, so that they refer to the ordinary GNU General Public
++     License, version 2, instead of to this License.  (If a newer
++     version than version 2 of the ordinary GNU General Public License
++     has appeared, then you can specify that version instead if you
++     wish.)  Do not make any other change in these notices.
++
++     Once this change is made in a given copy, it is irreversible for
++     that copy, so the ordinary GNU General Public License applies to
++     all subsequent copies and derivative works made from that copy.
++
++     This option is useful when you wish to copy part of the code of
++     the Library into a program that is not a library.
++
++  4. You may copy and distribute the Library (or a portion or
++     derivative of it, under Section 2) in object code or executable
++     form under the terms of Sections 1 and 2 above provided that you
++     accompany it with the complete corresponding machine-readable
++     source code, which must be distributed under the terms of Sections
++     1 and 2 above on a medium customarily used for software
++     interchange.
++
++     If distribution of object code is made by offering access to copy
++     from a designated place, then offering equivalent access to copy
++     the source code from the same place satisfies the requirement to
++     distribute the source code, even though third parties are not
++     compelled to copy the source along with the object code.
++
++  5. A program that contains no derivative of any portion of the
++     Library, but is designed to work with the Library by being
++     compiled or linked with it, is called a "work that uses the
++     Library".  Such a work, in isolation, is not a derivative work of
++     the Library, and therefore falls outside the scope of this License.
++
++     However, linking a "work that uses the Library" with the Library
++     creates an executable that is a derivative of the Library (because
++     it contains portions of the Library), rather than a "work that
++     uses the library".  The executable is therefore covered by this
++     License.  Section 6 states terms for distribution of such
++     executables.
++
++     When a "work that uses the Library" uses material from a header
++     file that is part of the Library, the object code for the work may
++     be a derivative work of the Library even though the source code is
++     not.  Whether this is true is especially significant if the work
++     can be linked without the Library, or if the work is itself a
++     library.  The threshold for this to be true is not precisely
++     defined by law.
++
++     If such an object file uses only numerical parameters, data
++     structure layouts and accessors, and small macros and small inline
++     functions (ten lines or less in length), then the use of the object
++     file is unrestricted, regardless of whether it is legally a
++     derivative work.  (Executables containing this object code plus
++     portions of the Library will still fall under Section 6.)
++
++     Otherwise, if the work is a derivative of the Library, you may
++     distribute the object code for the work under the terms of Section
++     6.  Any executables containing that work also fall under Section 6,
++     whether or not they are linked directly with the Library itself.
++
++  6. As an exception to the Sections above, you may also compile or
++     link a "work that uses the Library" with the Library to produce a
++     work containing portions of the Library, and distribute that work
++     under terms of your choice, provided that the terms permit
++     modification of the work for the customer's own use and reverse
++     engineering for debugging such modifications.
++
++     You must give prominent notice with each copy of the work that the
++     Library is used in it and that the Library and its use are covered
++     by this License.  You must supply a copy of this License.  If the
++     work during execution displays copyright notices, you must include
++     the copyright notice for the Library among them, as well as a
++     reference directing the user to the copy of this License.  Also,
++     you must do one of these things:
++
++       a. Accompany the work with the complete corresponding
++          machine-readable source code for the Library including
++          whatever changes were used in the work (which must be
++          distributed under Sections 1 and 2 above); and, if the work
++          is an executable linked with the Library, with the complete
++          machine-readable "work that uses the Library", as object code
++          and/or source code, so that the user can modify the Library
++          and then relink to produce a modified executable containing
++          the modified Library.  (It is understood that the user who
++          changes the contents of definitions files in the Library will
++          not necessarily be able to recompile the application to use
++          the modified definitions.)
++
++       b. Accompany the work with a written offer, valid for at least
++          three years, to give the same user the materials specified in
++          Subsection 6a, above, for a charge no more than the cost of
++          performing this distribution.
++
++       c. If distribution of the work is made by offering access to copy
++          from a designated place, offer equivalent access to copy the
++          above specified materials from the same place.
++
++       d. Verify that the user has already received a copy of these
++          materials or that you have already sent this user a copy.
++
++     For an executable, the required form of the "work that uses the
++     Library" must include any data and utility programs needed for
++     reproducing the executable from it.  However, as a special
++     exception, the source code distributed need not include anything
++     that is normally distributed (in either source or binary form)
++     with the major components (compiler, kernel, and so on) of the
++     operating system on which the executable runs, unless that
++     component itself accompanies the executable.
++
++     It may happen that this requirement contradicts the license
++     restrictions of other proprietary libraries that do not normally
++     accompany the operating system.  Such a contradiction means you
++     cannot use both them and the Library together in an executable
++     that you distribute.
++
++  7. You may place library facilities that are a work based on the
++     Library side-by-side in a single library together with other
++     library facilities not covered by this License, and distribute
++     such a combined library, provided that the separate distribution
++     of the work based on the Library and of the other library
++     facilities is otherwise permitted, and provided that you do these
++     two things:
++
++       a. Accompany the combined library with a copy of the same work
++          based on the Library, uncombined with any other library
++          facilities.  This must be distributed under the terms of the
++          Sections above.
++
++       b. Give prominent notice with the combined library of the fact
++          that part of it is a work based on the Library, and explaining
++          where to find the accompanying uncombined form of the same
++          work.
++
++  8. You may not copy, modify, sublicense, link with, or distribute the
++     Library except as expressly provided under this License.  Any
++     attempt otherwise to copy, modify, sublicense, link with, or
++     distribute the Library is void, and will automatically terminate
++     your rights under this License.  However, parties who have
++     received copies, or rights, from you under this License will not
++     have their licenses terminated so long as such parties remain in
++     full compliance.
++
++  9. You are not required to accept this License, since you have not
++     signed it.  However, nothing else grants you permission to modify
++     or distribute the Library or its derivative works.  These actions
++     are prohibited by law if you do not accept this License.
++     Therefore, by modifying or distributing the Library (or any work
++     based on the Library), you indicate your acceptance of this
++     License to do so, and all its terms and conditions for copying,
++     distributing or modifying the Library or works based on it.
++
++ 10. Each time you redistribute the Library (or any work based on the
++     Library), the recipient automatically receives a license from the
++     original licensor to copy, distribute, link with or modify the
++     Library subject to these terms and conditions.  You may not impose
++     any further restrictions on the recipients' exercise of the rights
++     granted herein.  You are not responsible for enforcing compliance
++     by third parties to this License.
++
++ 11. If, as a consequence of a court judgment or allegation of patent
++     infringement or for any other reason (not limited to patent
++     issues), conditions are imposed on you (whether by court order,
++     agreement or otherwise) that contradict the conditions of this
++     License, they do not excuse you from the conditions of this
++     License.  If you cannot distribute so as to satisfy simultaneously
++     your obligations under this License and any other pertinent
++     obligations, then as a consequence you may not distribute the
++     Library at all.  For example, if a patent license would not permit
++     royalty-free redistribution of the Library by all those who
++     receive copies directly or indirectly through you, then the only
++     way you could satisfy both it and this License would be to refrain
++     entirely from distribution of the Library.
++
++     If any portion of this section is held invalid or unenforceable
++     under any particular circumstance, the balance of the section is
++     intended to apply, and the section as a whole is intended to apply
++     in other circumstances.
++
++     It is not the purpose of this section to induce you to infringe any
++     patents or other property right claims or to contest validity of
++     any such claims; this section has the sole purpose of protecting
++     the integrity of the free software distribution system which is
++     implemented by public license practices.  Many people have made
++     generous contributions to the wide range of software distributed
++     through that system in reliance on consistent application of that
++     system; it is up to the author/donor to decide if he or she is
++     willing to distribute software through any other system and a
++     licensee cannot impose that choice.
++
++     This section is intended to make thoroughly clear what is believed
++     to be a consequence of the rest of this License.
++
++ 12. If the distribution and/or use of the Library is restricted in
++     certain countries either by patents or by copyrighted interfaces,
++     the original copyright holder who places the Library under this
++     License may add an explicit geographical distribution limitation
++     excluding those countries, so that distribution is permitted only
++     in or among countries not thus excluded.  In such case, this
++     License incorporates the limitation as if written in the body of
++     this License.
++
++ 13. The Free Software Foundation may publish revised and/or new
++     versions of the Library General Public License from time to time.
++     Such new versions will be similar in spirit to the present version,
++     but may differ in detail to address new problems or concerns.
++
++     Each version is given a distinguishing version number.  If the
++     Library specifies a version number of this License which applies
++     to it and "any later version", you have the option of following
++     the terms and conditions either of that version or of any later
++     version published by the Free Software Foundation.  If the Library
++     does not specify a license version number, you may choose any
++     version ever published by the Free Software Foundation.
++
++ 14. If you wish to incorporate parts of the Library into other free
++     programs whose distribution conditions are incompatible with these,
++     write to the author to ask for permission.  For software which is
++     copyrighted by the Free Software Foundation, write to the Free
++     Software Foundation; we sometimes make exceptions for this.  Our
++     decision will be guided by the two goals of preserving the free
++     status of all derivatives of our free software and of promoting
++     the sharing and reuse of software generally.
++
++                                NO WARRANTY
++
++ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
++     WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
++     LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
++     HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
++     WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
++     NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
++     FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
++     QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU.  SHOULD THE
++     LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
++     SERVICING, REPAIR OR CORRECTION.
++
++ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
++     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
++     MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
++     LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
++     INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
++     INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
++     DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
++     OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
++     OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
++     ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
++
++                      END OF TERMS AND CONDITIONS
++
++How to Apply These Terms to Your New Libraries
++==============================================
++
++   If you develop a new library, and you want it to be of the greatest
++possible use to the public, we recommend making it free software that
++everyone can redistribute and change.  You can do so by permitting
++redistribution under these terms (or, alternatively, under the terms of
++the ordinary General Public License).
++
++   To apply these terms, attach the following notices to the library.
++It is safest to attach them to the start of each source file to most
++effectively convey the exclusion of warranty; and each file should have
++at least the "copyright" line and a pointer to where the full notice is
++found.
++
++     ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
++     Copyright (C) YEAR  NAME OF AUTHOR
++     
++     This library is free software; you can redistribute it and/or modify it
++     under the terms of the GNU Library General Public License as published
++     by the Free Software Foundation; either version 2 of the License, or (at
++     your option) any later version.
++     
++     This library 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
++     Library General Public License for more details.
++     
++     You should have received a copy of the GNU General Public License along
++     with this program; if not, write to the Free Software Foundation, Inc.,
++     59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++
++   Also add information on how to contact you by electronic and paper
++mail.
++
++   You should also get your employer (if you work as a programmer) or
++your school, if any, to sign a "copyright disclaimer" for the library,
++if necessary.  Here is a sample; alter the names:
++
++     Yoyodyne, Inc., hereby disclaims all copyright interest in the library
++     `Frob' (a library for tweaking knobs) written by James Random Hacker.
++     
++     SIGNATURE OF TY COON, 1 April 1990
++     Ty Coon, President of Vice
++
++   That's all there is to it!
++
+diff -Naur ../glibc-2.1.3/linuxthreads/Makefile glibc-2.1.3/linuxthreads/Makefile
+--- ../glibc-2.1.3/linuxthreads/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Makefile	1999-12-07 08:50:23.000000000 -0800
+@@ -0,0 +1,68 @@
++# Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# The GNU C Library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License as
++# published by the Free Software Foundation; either version 2 of the
++# License, or (at your option) any later version.
++
++# The GNU C Library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++#
++#	Sub-makefile for linuxthreads portion of the library.
++#
++subdir	:= linuxthreads
++
++linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
++				    Banner)
++
++headers := pthread.h semaphore.h
++distribute := internals.h queue.h restart.h spinlock.h
++
++routines := weaks no-tsd
++
++extra-libs := libpthread
++extra-libs-others := $(extra-libs)
++
++libpthread-routines := attr cancel condvar join manager mutex ptfork \
++		       ptlongjmp pthread signals specific errno lockfile \
++		       semaphore spinlock wrapsyscall rwlock pt-machine \
++		       oldsemaphore events
++
++vpath %.c Examples
++tests = ex1 ex2 ex3 ex4 ex5 ex6
++
++include ../Rules
++
++CFLAGS-mutex.c += -D__NO_WEAK_PTHREAD_ALIASES
++CFLAGS-specific.c += -D__NO_WEAK_PTHREAD_ALIASES
++CFLAGS-pthread.c += -D__NO_WEAK_PTHREAD_ALIASES
++CFLAGS-ptfork.c += -D__NO_WEAK_PTHREAD_ALIASES
++CFLAGS-cancel.c += -D__NO_WEAK_PTHREAD_ALIASES
++
++# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
++# This ensures they will load libc.so for needed symbols if loaded by
++# a statically-linked program that hasn't already loaded it.
++$(objpfx)libpthread.so: $(common-objpfx)libc.so
++
++# Make sure we link with the thread library.
++ifeq ($(build-shared),yes)
++libpthread = $(objpfx)libpthread.so
++else
++libpthread = $(objpfx)libpthread.a
++endif
++
++$(objpfx)ex1: $(libpthread)
++$(objpfx)ex2: $(libpthread)
++$(objpfx)ex3: $(libpthread)
++$(objpfx)ex4: $(libpthread)
++$(objpfx)ex5: $(libpthread)
++$(objpfx)ex6: $(libpthread)
+diff -Naur ../glibc-2.1.3/linuxthreads/README glibc-2.1.3/linuxthreads/README
+--- ../glibc-2.1.3/linuxthreads/README	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/README	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,166 @@
++        Linuxthreads - POSIX 1003.1c kernel threads for Linux
++
++      Copyright 1996, 1997 Xavier Leroy (Xavier.Leroy@inria.fr)
++
++
++DESCRIPTION:
++
++This is release 0.7 (late beta) of LinuxThreads, a BiCapitalized
++implementation of the Posix 1003.1c "pthread" interface for Linux.
++
++LinuxThreads provides kernel-level threads: each thread is a separate
++Unix process, sharing its address space with the other threads through
++the new system call clone(). Scheduling between threads is handled by
++the kernel scheduler, just like scheduling between Unix processes.
++
++
++REQUIREMENTS:
++
++- Linux version 2.0 and up (requires the new clone() system call
++  and the new realtime scheduler).
++
++- For Intel platforms: libc 5.2.18 or later is required.
++  5.2.18 or 5.4.12 or later are recommended;
++  5.3.12 and 5.4.7 have problems (see the FAQ.html file for more info).
++
++- Also supports glibc 2 (a.k.a. libc 6), which actually comes with
++  a specially-adapted version of this library.
++
++- Currently supports Intel, Alpha, Sparc, Motorola 68k, ARM and MIPS
++  platforms.
++
++- Multiprocessors are supported.
++
++
++INSTALLATION:
++
++- Edit the Makefile, set the variables in the "Configuration" section.
++
++- Do "make".
++
++- Do "make install".
++
++
++USING LINUXTHREADS:
++
++        gcc -D_REENTRANT ... -lpthread
++
++A complete set of manual pages is included. Also see the subdirectory
++Examples/ for some sample programs.
++
++
++STATUS:
++
++- All functions in the Posix 1003.1c base interface implemented.
++  Also supports priority scheduling.
++
++- For users of libc 5 (H.J.Lu's libc), a number of C library functions
++  are reimplemented or wrapped to make them thread-safe, including:
++  * malloc functions
++  * stdio functions (define _REENTRANT before including <stdio.h>)
++  * per-thread errno variable (define _REENTRANT before including <errno.h>)
++  * directory reading functions (opendir(), etc)
++  * sleep()
++  * gmtime(), localtime()
++
++  New library functions provided:
++  * flockfile(), funlockfile(), ftrylockfile()
++  * reentrant versions of network database functions (gethostbyname_r(), etc)
++    and password functions (getpwnam_r(), etc).
++
++- libc 6 (glibc 2) provides much better thread support than libc 5,
++  and comes with a specially-adapted version of LinuxThreads.
++  For serious multithreaded programming, you should consider switching
++  to glibc 2. It is available from ftp.gnu.org:/pub/gnu and its mirrors.
++
++
++WARNING:
++
++Many existing libraries are not compatible with LinuxThreads,
++either because they are not inherently thread-safe, or because they
++have not been compiled with the -D_REENTRANT.  For more info, see the
++FAQ.html file in this directory.
++
++A prime example of the latter is Xlib. If you link it with
++LinuxThreads, you'll probably get an "unknown 0 error" very
++early. This is just a consequence of the Xlib binaries using the
++global variable "errno" to fetch error codes, while LinuxThreads and
++the C library use the per-thread "errno" location.
++
++See the file README.Xfree3.3 for info on how to compile the Xfree 3.3
++libraries to make them compatible with LinuxThreads.
++
++
++KNOWN BUGS AND LIMITATIONS:
++
++- Threads share pretty much everything they should share according
++  to the standard: memory space, file descriptors, signal handlers,
++  current working directory, etc. One thing that they do not share
++  is their pid's and parent pid's. According to the standard, they
++  should have the same, but that's one thing we cannot achieve
++  in this implementation (until the CLONE_PID flag to clone() becomes
++  usable).
++
++- The current implementation uses the two signals SIGUSR1 and SIGUSR2,
++  so user-level code cannot employ them. Ideally, there should be two
++  signals reserved for this library. One signal is used for restarting
++  threads blocked on mutexes or conditions; the other is for thread
++  cancellation.
++
++  *** This is not anymore true when the application runs on a kernel
++      newer than approximately 2.1.60.
++
++- The stacks for the threads are allocated high in the memory space,
++  below the stack of the initial process, and spaced 2M apart.
++  Stacks are allocated with the "grow on demand" flag, so they don't
++  use much virtual space initially (4k, currently), but can grow
++  up to 2M if needed.
++
++  Reserving such a large address space for each thread means that,
++  on a 32-bit architecture, no more than about 1000 threads can
++  coexist (assuming a 2Gb address space for user processes),
++  but this is reasonable, since each thread uses up one entry in the
++  kernel's process table, which is usually limited to 512 processes.
++
++  Another potential problem of the "grow on demand" scheme is that
++  nothing prevents the user from mmap'ing something in the 2M address
++  window reserved for a thread stack, possibly causing later extensions of
++  that stack to fail. Mapping at fixed addresses should be avoided
++  when using this library.
++
++- Signal handling does not fully conform to the Posix standard,
++  due to the fact that threads are here distinct processes that can be
++  sent signals individually, so there's no notion of sending a signal
++  to "the" process (the collection of all threads).
++  More precisely, here is a summary of the standard requirements
++  and how they are met by the implementation:
++
++  1- Synchronous signals (generated by the thread execution, e.g. SIGFPE)
++     are delivered to the thread that raised them.
++     (OK.)
++
++  2- A fatal asynchronous signal terminates all threads in the process.
++     (OK. The thread manager notices when a thread dies on a signal
++      and kills all other threads with the same signal.)
++
++  3- An asynchronous signal will be delivered to one of the threads
++     of the program which does not block the signal (it is unspecified
++     which).
++     (No, the signal is delivered to the thread it's been sent to,
++      based on the pid of the thread. If that thread is currently
++      blocking the signal, the signal remains pending.)
++
++  4- The signal will be delivered to at most one thread.
++     (OK, except for signals generated from the terminal or sent to
++      the process group, which will be delivered to all threads.)
++
++- The current implementation of the MIPS support assumes a MIPS ISA II
++  processor or better.  These processors support atomic operations by
++  ll/sc instructions.  Older R2000/R3000 series processors are not
++  supported yet; support for these will have higher overhead.
++
++- The current implementation of the ARM support assumes that the SWP
++  (atomic swap register with memory) instruction is available.  This is
++  the case for all processors except for the ARM1 and ARM2.  On StrongARM,
++  the SWP instruction does not bypass the cache, so multi-processor support
++  will be more troublesome.
+diff -Naur ../glibc-2.1.3/linuxthreads/README.Xfree3.2 glibc-2.1.3/linuxthreads/README.Xfree3.2
+--- ../glibc-2.1.3/linuxthreads/README.Xfree3.2	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/README.Xfree3.2	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,352 @@
++This file describes how to make a threaded X11R6.
++
++You need the source-code of XFree-3.2. I used the sources of X11R6.1
++(files: xc-1.tar.gz xc-2.tar.gz xc-3.tar.gz) and the patches to
++XFree-3.2 (files: README.X11.patch R6.1pl1-3.2.diff.gz cfont32.tgz).
++
++Untar the xc-?.tar.gz files in a directory called XF3.2 and apply
++the XFree-3.2 patches as described in README.X11.patch or use the
++whole XFree86 source.
++
++Now apply the thread patch with
++
++patch -p0 < XF3.2.xc.diff
++
++Go to the XF3.2/xc directory and make the whole thing:
++nice make World >& world.log &
++tail -f world.log
++
++Wait a few hours or interrupt the process after the shared libs
++are made. The shared libs are:
++
++XF3.2/xc/lib/ICE/libICE.so.6.0*
++XF3.2/xc/lib/PEX5/libPEX5.so.6.0*
++XF3.2/xc/lib/SM/libSM.so.6.0*
++XF3.2/xc/lib/X11/libX11.so.6.1*
++XF3.2/xc/lib/XIE/libXIE.so.6.0*
++XF3.2/xc/lib/XThrStub/libXThrStub.so.6.0*
++XF3.2/xc/lib/Xaw/libXaw.so.6.1*
++XF3.2/xc/lib/Xext/libXext.so.6.1*
++XF3.2/xc/lib/Xi/libXi.so.6.0*
++XF3.2/xc/lib/Xmu/libXmu.so.6.0*
++XF3.2/xc/lib/Xt/libXt.so.6.0*
++XF3.2/xc/lib/Xtst/libXtst.so.6.1*
++
++(The Program dga didn't compile, but I have not check out why.)
++
++Now you can copy the resulting libs   
++
++cp XF3.2/xc/lib/*/*.so.?.? /usr/X11R6/lib/
++
++and create some links
++
++cd /usr/X11R6/lib/
++ln -s libXThrStub.so.6.0 libXThrStub.so.6
++ln -s libXThrStub.so.6 libXThrStub.so
++
++or use make install (not tested, and needs new configuration).
++
++It is possible with the libXThrSub to compile X11 programs without linking
++libpthread to them and not necessary to recompile already installed
++unthreaded X11 programs, because libXThrSub keeps the dynamic linker quit.
++On the other hand you can link libpthread to a X11 program to use threads.
++
++I used linux 2.0.23 and libc 5.4.7 .
++
++Hans-Helmut B�hmann     hans@expmech.ing.tu-bs.de
++
++----------------------------------------------------------------------------
++
++XF3.2.xc.diff:
++-----------------------------------------------------------------------------
++diff -u --recursive XF3.2.orig/xc/config/cf/linux.cf XF3.2/xc/config/cf/linux.cf
++--- XF3.2.orig/xc/config/cf/linux.cf	Sun Nov 10 17:05:30 1996
+++++ XF3.2/xc/config/cf/linux.cf	Sun Nov 10 16:30:55 1996
++@@ -61,6 +61,14 @@
++ #define HasSnprintf		YES
++ #endif
++ 
+++#define HasPosixThreads         YES
+++#define ThreadedX               YES
+++#define BuildThreadStubLibrary	YES
+++#define NeedUIThrStubs		YES
+++#define HasThreadSafeAPI        NO
+++#define SystemMTDefines         -D_REENTRANT
+++#define ThreadsLibraries        -lpthread
+++
++ #define AvoidNullMakeCommand	YES
++ #define StripInstalledPrograms	YES
++ #define CompressAllFonts	YES
++@@ -158,7 +166,7 @@
++ #define LdPostLib		/* Never needed */
++ 
++ #ifdef i386Architecture
++-#define OptimizedCDebugFlags	DefaultGcc2i386Opt -m486
+++#define OptimizedCDebugFlags	DefaultGcc2i386Opt -m486 -pipe
++ #define StandardDefines		-Dlinux -D__i386__ -D_POSIX_SOURCE \
++ 				-D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE
++ #define XawI18nDefines		-DUSE_XWCHAR_STRING -DUSE_XMBTOWC
++diff -u --recursive XF3.2.orig/xc/config/cf/lnxLib.tmpl XF3.2/xc/config/cf/lnxLib.tmpl
++--- XF3.2.orig/xc/config/cf/lnxLib.tmpl	Sun Nov 10 17:05:30 1996
+++++ XF3.2/xc/config/cf/lnxLib.tmpl	Sat Nov  9 14:52:39 1996
++@@ -19,7 +19,7 @@
++ 
++ #define CplusplusLibC
++ 
++-#define SharedX11Reqs
+++#define SharedX11Reqs  	-L$(BUILDLIBDIR) -lXThrStub 
++ #define SharedOldXReqs	$(LDPRELIB) $(XLIBONLY)
++ #define SharedXtReqs	$(LDPRELIB) $(XLIBONLY) $(SMLIB) $(ICELIB)
++ #define SharedXawReqs	$(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
++diff -u --recursive XF3.2.orig/xc/include/Xthreads.h XF3.2/xc/include/Xthreads.h
++--- XF3.2.orig/xc/include/Xthreads.h	Thu Dec  7 02:19:09 1995
+++++ XF3.2/xc/include/Xthreads.h	Sat Nov  9 01:04:55 1996
++@@ -229,12 +229,12 @@
++ #define xcondition_wait(c,m) pthread_cond_wait(c,m)
++ #define xcondition_signal(c) pthread_cond_signal(c)
++ #define xcondition_broadcast(c) pthread_cond_broadcast(c)
++-#ifdef _DECTHREADS_
+++#if defined(_DECTHREADS_) || defined(linux)
++ static xthread_t _X_no_thread_id;
++ #define xthread_have_id(id) !pthread_equal(id, _X_no_thread_id)
++ #define xthread_clear_id(id) id = _X_no_thread_id
++ #define xthread_equal(id1,id2) pthread_equal(id1, id2)
++-#endif /* _DECTHREADS_ */
+++#endif /* _DECTHREADS_ || linux */
++ #if _CMA_VENDOR_ == _CMA__IBM
++ #ifdef DEBUG			/* too much of a hack to enable normally */
++ /* see also cma__obj_set_name() */
++diff -u --recursive XF3.2.orig/xc/lib/X11/util/makekeys.c XF3.2/xc/lib/X11/util/makekeys.c
++--- XF3.2.orig/xc/lib/X11/util/makekeys.c	Mon Apr 18 02:22:22 1994
+++++ XF3.2/xc/lib/X11/util/makekeys.c	Sat Nov  9 00:44:14 1996
++@@ -73,7 +73,7 @@
++     register char c;
++     int first;
++     int best_max_rehash;
++-    int best_z;
+++    int best_z = 0;
++     int num_found;
++     KeySym val;
++ 
++diff -u --recursive XF3.2.orig/xc/lib/XThrStub/Imakefile XF3.2/xc/lib/XThrStub/Imakefile
++--- XF3.2.orig/xc/lib/XThrStub/Imakefile	Sun Nov 10 17:08:12 1996
+++++ XF3.2/xc/lib/XThrStub/Imakefile	Sat Nov  9 19:04:51 1996
++@@ -25,7 +25,7 @@
++       DEFINES = $(ALLOC_DEFINES)
++      INCLUDES = 
++          SRCS = $(STUBSRCS)
++-         OBJS = $(STUBOBJS
+++         OBJS = $(STUBOBJS)
++      LINTLIBS = $(LINTXLIB)
++ 
++ #include <Library.tmpl>
++diff -u --recursive XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c XF3.2/xc/lib/XThrStub/UIThrStubs.c
++--- XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c	Sun Nov 10 17:08:12 1996
+++++ XF3.2/xc/lib/XThrStub/UIThrStubs.c	Sun Nov 10 15:14:55 1996
++@@ -37,16 +37,43 @@
++  * specificies the thread library on the link line.
++  */
++ 
+++#if defined(linux)
+++#include <pthread.h>
+++#else
++ #include <thread.h>
++ #include <synch.h>
+++#endif
++ 
+++#if defined(linux)
+++static pthread_t no_thread_id;
+++#endif /* defined(linux) */
+++
+++#if defined(linux)
+++#pragma weak pthread_self = _Xthr_self_stub_
+++pthread_t 
+++_Xthr_self_stub_()
+++{
+++    return(no_thread_id);
+++}
+++#else /* defined(linux) */
++ #pragma weak thr_self = _Xthr_self_stub_
++ thread_t 
++ _Xthr_self_stub_()
++ {
++     return((thread_t)0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_mutex_init = _Xmutex_init_stub_
+++int 
+++_Xmutex_init_stub_(m, a)
+++    pthread_mutex_t *m;
+++    __const pthread_mutexattr_t *a;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak mutex_init = _Xmutex_init_stub_
++ int 
++ _Xmutex_init_stub_(m, t, a)
++@@ -56,7 +83,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_mutex_destroy = _Xmutex_destroy_stub_
+++int
+++_Xmutex_destroy_stub_(m)
+++    pthread_mutex_t *m;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak mutex_destroy = _Xmutex_destroy_stub_
++ int
++ _Xmutex_destroy_stub_(m)
++@@ -64,7 +101,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_mutex_lock = _Xmutex_lock_stub_
+++int
+++_Xmutex_lock_stub_(m)
+++    pthread_mutex_t *m;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak mutex_lock = _Xmutex_lock_stub_
++ int
++ _Xmutex_lock_stub_(m)
++@@ -72,7 +119,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_mutex_unlock = _Xmutex_unlock_stub_
+++int
+++_Xmutex_unlock_stub_(m)
+++    pthread_mutex_t *m;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak mutex_unlock = _Xmutex_unlock_stub_
++ int
++ _Xmutex_unlock_stub_(m)
++@@ -80,7 +137,18 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak  pthread_cond_init = _Xcond_init_stub_
+++int 
+++_Xcond_init_stub_(c, a)
+++    pthread_cond_t *c;
+++    __const pthread_condattr_t *a;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak cond_init = _Xcond_init_stub_
++ int 
++ _Xcond_init_stub_(c, t, a)
++@@ -90,7 +158,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_cond_destroy = _Xcond_destroy_stub_
+++int
+++_Xcond_destroy_stub_(c)
+++    pthread_cond_t *c;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak cond_destroy = _Xcond_destroy_stub_
++ int
++ _Xcond_destroy_stub_(c)
++@@ -98,7 +176,18 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_cond_wait = _Xcond_wait_stub_
+++int
+++_Xcond_wait_stub_(c,m)
+++    pthread_cond_t *c;
+++    pthread_mutex_t *m;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak cond_wait = _Xcond_wait_stub_
++ int
++ _Xcond_wait_stub_(c,m)
++@@ -107,7 +196,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_cond_signal = _Xcond_signal_stub_
+++int
+++_Xcond_signal_stub_(c)
+++    pthread_cond_t *c;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak cond_signal = _Xcond_signal_stub_
++ int
++ _Xcond_signal_stub_(c)
++@@ -115,7 +214,17 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
++ 
+++#if defined(linux)
+++#pragma weak pthread_cond_broadcast = _Xcond_broadcast_stub_
+++int
+++_Xcond_broadcast_stub_(c)
+++    pthread_cond_t *c;
+++{
+++    return(0);
+++}
+++#else /* defined(linux) */
++ #pragma weak cond_broadcast = _Xcond_broadcast_stub_
++ int
++ _Xcond_broadcast_stub_(c)
++@@ -123,3 +232,15 @@
++ {
++     return(0);
++ }
+++#endif /* defined(linux) */
+++
+++#if defined(linux)
+++#pragma weak pthread_equal = _Xthr_equal_stub_
+++int
+++_Xthr_equal_stub_(t1, t2)
+++    pthread_t t1;
+++    pthread_t t2;
+++{
+++    return(1);
+++}
+++#endif /* defined(linux) */
++-------------------------------------------------------------------------
+diff -Naur ../glibc-2.1.3/linuxthreads/Versions glibc-2.1.3/linuxthreads/Versions
+--- ../glibc-2.1.3/linuxthreads/Versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/Versions	1999-09-07 01:05:19.000000000 -0700
+@@ -0,0 +1,121 @@
++libc {
++  GLIBC_2.0 {
++    pthread_attr_destroy; pthread_attr_getdetachstate;
++    pthread_attr_getinheritsched; pthread_attr_getschedparam;
++    pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init;
++    pthread_attr_setdetachstate; pthread_attr_setinheritsched;
++    pthread_attr_setschedparam; pthread_attr_setschedpolicy;
++    pthread_attr_setscope; pthread_cond_broadcast; pthread_cond_destroy;
++    pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
++    pthread_condattr_destroy; pthread_condattr_init; pthread_equal;
++    pthread_exit; pthread_getschedparam; pthread_mutex_destroy;
++    pthread_mutex_init; pthread_mutex_lock; pthread_mutex_unlock;
++    pthread_mutexattr_getkind_np; pthread_mutexattr_setkind_np;
++    pthread_self; pthread_setcancelstate; pthread_setcanceltype;
++    pthread_setschedparam;
++
++    # Internal libc interface to libpthread
++    __libc_internal_tsd_get; __libc_internal_tsd_set;
++  }
++  GLIBC_2.1 {
++    pthread_attr_init;
++  }
++}
++
++ld.so {
++  GLIBC_2.0 {
++    # Internal libc interface to libpthread
++    __libc_internal_tsd_get; __libc_internal_tsd_set;
++  }
++}
++
++libpthread {
++  GLIBC_2.0 {
++    # Hidden entry point (through macros).
++    _pthread_cleanup_pop; _pthread_cleanup_pop_restore; _pthread_cleanup_push;
++    _pthread_cleanup_push_defer;
++
++    # Internal libc interface to libpthread
++    __libc_internal_tsd_get; __libc_internal_tsd_set;
++
++    # Overwritten libc functions.
++    accept; close; connect; fcntl; fork; fsync; longjmp; lseek; msync;
++    nanosleep; open; pause; raise; read; recv; recvfrom; recvmsg; send;
++    sendmsg; sendto; sigaction; siglongjmp; system; tcdrain; wait;
++    waitpid; write;
++    __close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
++    __write;
++    _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;
++    vfork; __fork;
++
++    # POSIX.1c extensions to libc.
++    flockfile; funlockfile; ftrylockfile;
++
++    # Non-standard POSIX1.x functions.
++    pthread_kill_other_threads_np; pthread_mutexattr_getkind_np;
++    pthread_mutexattr_setkind_np;
++
++    # Real POSIX.1c functions.
++    pthread_atfork; pthread_attr_destroy; pthread_attr_getdetachstate;
++    pthread_attr_getinheritsched; pthread_attr_getschedparam;
++    pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init;
++    pthread_attr_setdetachstate; pthread_attr_setinheritsched;
++    pthread_attr_setschedparam; pthread_attr_setschedpolicy;
++    pthread_attr_setscope; pthread_cancel; pthread_cond_broadcast;
++    pthread_cond_destroy; pthread_cond_init; pthread_cond_signal;
++    pthread_cond_timedwait; pthread_cond_wait; pthread_condattr_destroy;
++    pthread_condattr_init; pthread_create; pthread_detach; pthread_equal;
++    pthread_exit; pthread_getschedparam; pthread_getspecific; pthread_join;
++    pthread_key_create; pthread_key_delete; pthread_kill;
++    pthread_mutex_destroy; pthread_mutex_init; pthread_mutex_lock;
++    pthread_mutex_trylock; pthread_mutex_unlock; pthread_mutexattr_destroy;
++    pthread_mutexattr_init; pthread_once; pthread_self; pthread_setcancelstate;
++    pthread_setcanceltype; pthread_setschedparam; pthread_setspecific;
++    pthread_sigmask; pthread_testcancel;
++
++    sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
++    sigwait;
++
++    # Protected names for functions used in other shared objects.
++    __pthread_atfork; __pthread_initialize; __pthread_getspecific;
++    __pthread_key_create; __pthread_mutex_destroy; __pthread_mutex_init;
++    __pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock;
++    __pthread_mutexattr_destroy; __pthread_mutexattr_init;
++    __pthread_mutexattr_settype; __pthread_once; __pthread_setspecific;
++
++    # The error functions.
++    __errno_location; __h_errno_location;
++  }
++  GLIBC_2.1 {
++    # Functions with changed interface.
++    pthread_attr_init; pthread_create;
++
++    # Unix98 extensions.
++    pthread_rwlock_init; pthread_rwlock_destroy; pthread_rwlock_rdlock;
++    pthread_rwlock_tryrdlock; pthread_rwlock_wrlock; pthread_rwlock_trywrlock;
++    pthread_rwlock_unlock; pthread_rwlockattr_init; pthread_rwlockattr_destroy;
++    pthread_rwlockattr_getpshared; pthread_rwlockattr_setpshared;
++    pthread_rwlockattr_getkind_np; pthread_rwlockattr_setkind_np;
++
++    pthread_attr_getguardsize; pthread_attr_setguardsize;
++    pthread_attr_getstackaddr; pthread_attr_setstackaddr;
++    pthread_attr_getstacksize; pthread_attr_setstacksize;
++
++    pthread_getconcurrency; pthread_setconcurrency;
++
++    pthread_mutexattr_gettype; pthread_mutexattr_settype;
++
++    sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;
++
++    # helper functions
++    __libc_current_sigrtmin; __libc_current_sigrtmax;
++    __libc_allocate_rtsig;
++  }
++  GLIBC_2.1.1 {
++    sem_close; sem_open; sem_unlink;
++  }
++  GLIBC_2.1.2 {
++    __pthread_kill_other_threads_np;
++    __vfork;
++  }
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/attr.c glibc-2.1.3/linuxthreads/attr.c
+--- ../glibc-2.1.3/linuxthreads/attr.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/attr.c	1998-10-28 08:30:49.000000000 -0800
+@@ -0,0 +1,199 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Handling of thread attributes */
++
++#include <errno.h>
++#include <string.h>
++#include <unistd.h>
++#include <sys/param.h>
++#include "pthread.h"
++#include "internals.h"
++
++int __pthread_attr_init_2_1(pthread_attr_t *attr)
++{
++  size_t ps = __getpagesize ();
++
++  attr->__detachstate = PTHREAD_CREATE_JOINABLE;
++  attr->__schedpolicy = SCHED_OTHER;
++  attr->__schedparam.sched_priority = 0;
++  attr->__inheritsched = PTHREAD_EXPLICIT_SCHED;
++  attr->__scope = PTHREAD_SCOPE_SYSTEM;
++  attr->__guardsize = ps;
++  attr->__stackaddr = NULL;
++  attr->__stackaddr_set = 0;
++  attr->__stacksize = STACK_SIZE - ps;
++  return 0;
++}
++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
++default_symbol_version (__pthread_attr_init_2_1, pthread_attr_init, GLIBC_2.1);
++
++int __pthread_attr_init_2_0(pthread_attr_t *attr)
++{
++  attr->__detachstate = PTHREAD_CREATE_JOINABLE;
++  attr->__schedpolicy = SCHED_OTHER;
++  attr->__schedparam.sched_priority = 0;
++  attr->__inheritsched = PTHREAD_EXPLICIT_SCHED;
++  attr->__scope = PTHREAD_SCOPE_SYSTEM;
++  return 0;
++}
++symbol_version (__pthread_attr_init_2_0, pthread_attr_init, GLIBC_2.0);
++#else
++strong_alias (__pthread_attr_init_2_1, pthread_attr_init)
++#endif
++
++int pthread_attr_destroy(pthread_attr_t *attr)
++{
++  return 0;
++}
++
++int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
++{
++  if (detachstate < PTHREAD_CREATE_JOINABLE ||
++      detachstate > PTHREAD_CREATE_DETACHED)
++    return EINVAL;
++  attr->__detachstate = detachstate;
++  return 0;
++}
++
++int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
++{
++  *detachstate = attr->__detachstate;
++  return 0;
++}
++
++int pthread_attr_setschedparam(pthread_attr_t *attr,
++                               const struct sched_param *param)
++{
++  int max_prio = __sched_get_priority_max(attr->__schedpolicy);
++  int min_prio = __sched_get_priority_min(attr->__schedpolicy);
++
++  if (param->sched_priority < min_prio || param->sched_priority > max_prio)
++    return EINVAL;
++  memcpy (&attr->__schedparam, param, sizeof (struct sched_param));
++  return 0;
++}
++
++int pthread_attr_getschedparam(const pthread_attr_t *attr,
++                               struct sched_param *param)
++{
++  memcpy (param, &attr->__schedparam, sizeof (struct sched_param));
++  return 0;
++}
++
++int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
++{
++  if (policy != SCHED_OTHER && policy != SCHED_FIFO && policy != SCHED_RR)
++    return EINVAL;
++  attr->__schedpolicy = policy;
++  return 0;
++}
++
++int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
++{
++  *policy = attr->__schedpolicy;
++  return 0;
++}
++
++int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
++{
++  if (inherit != PTHREAD_INHERIT_SCHED && inherit != PTHREAD_EXPLICIT_SCHED)
++    return EINVAL;
++  attr->__inheritsched = inherit;
++  return 0;
++}
++
++int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit)
++{
++  *inherit = attr->__inheritsched;
++  return 0;
++}
++
++int pthread_attr_setscope(pthread_attr_t *attr, int scope)
++{
++  switch (scope) {
++  case PTHREAD_SCOPE_SYSTEM:
++    attr->__scope = scope;
++    return 0;
++  case PTHREAD_SCOPE_PROCESS:
++    return ENOTSUP;
++  default:
++    return EINVAL;
++  }
++}
++
++int pthread_attr_getscope(const pthread_attr_t *attr, int *scope)
++{
++  *scope = attr->__scope;
++  return 0;
++}
++
++int __pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize)
++{
++  size_t ps = __getpagesize ();
++
++  /* First round up the guard size.  */
++  guardsize = roundup (guardsize, ps);
++
++  /* The guard size must not be larger than the stack itself */
++  if (guardsize >= attr->__stacksize) return EINVAL;
++
++  attr->__guardsize = guardsize;
++
++  return 0;
++}
++weak_alias (__pthread_attr_setguardsize, pthread_attr_setguardsize)
++
++int __pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize)
++{
++  *guardsize = attr->__guardsize;
++  return 0;
++}
++weak_alias (__pthread_attr_getguardsize, pthread_attr_getguardsize)
++
++int __pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr)
++{
++  attr->__stackaddr = stackaddr;
++  attr->__stackaddr_set = 1;
++  return 0;
++}
++weak_alias (__pthread_attr_setstackaddr, pthread_attr_setstackaddr)
++
++int __pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr)
++{
++  /* XXX This function has a stupid definition.  The standard specifies
++     no error value but what is if no stack address was set?  We simply
++     return the value we have in the member.  */
++  *stackaddr = attr->__stackaddr;
++  return 0;
++}
++weak_alias (__pthread_attr_getstackaddr, pthread_attr_getstackaddr)
++
++int __pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
++{
++  /* We don't accept value smaller than PTHREAD_STACK_MIN.  */
++  if (stacksize < PTHREAD_STACK_MIN)
++    return EINVAL;
++
++  attr->__stacksize = stacksize;
++  return 0;
++}
++weak_alias (__pthread_attr_setstacksize, pthread_attr_setstacksize)
++
++int __pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize)
++{
++  *stacksize = attr->__stacksize;
++  return 0;
++}
++weak_alias (__pthread_attr_getstacksize, pthread_attr_getstacksize)
+diff -Naur ../glibc-2.1.3/linuxthreads/cancel.c glibc-2.1.3/linuxthreads/cancel.c
+--- ../glibc-2.1.3/linuxthreads/cancel.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/cancel.c	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,171 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Thread cancellation */
++
++#include <errno.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++
++int pthread_setcancelstate(int state, int * oldstate)
++{
++  pthread_descr self = thread_self();
++  if (state < PTHREAD_CANCEL_ENABLE || state > PTHREAD_CANCEL_DISABLE)
++    return EINVAL;
++  if (oldstate != NULL) *oldstate = THREAD_GETMEM(self, p_cancelstate);
++  THREAD_SETMEM(self, p_cancelstate, state);
++  if (THREAD_GETMEM(self, p_canceled) &&
++      THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
++      THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
++    pthread_exit(PTHREAD_CANCELED);
++  return 0;
++}
++
++int pthread_setcanceltype(int type, int * oldtype)
++{
++  pthread_descr self = thread_self();
++  if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS)
++    return EINVAL;
++  if (oldtype != NULL) *oldtype = THREAD_GETMEM(self, p_canceltype);
++  THREAD_SETMEM(self, p_canceltype, type);
++  if (THREAD_GETMEM(self, p_canceled) &&
++      THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
++      THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
++    pthread_exit(PTHREAD_CANCELED);
++  return 0;
++}
++
++int pthread_cancel(pthread_t thread)
++{
++  pthread_handle handle = thread_handle(thread);
++  int pid;
++  int dorestart = 0;
++  pthread_descr th;
++  pthread_extricate_if *pextricate;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, thread)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++
++  th = handle->h_descr;
++
++  if (th->p_canceled) {
++    __pthread_unlock(&handle->h_lock);
++    return 0;
++  }
++
++  pextricate = th->p_extricate;
++  th->p_canceled = 1;
++  pid = th->p_pid;
++
++  /* If the thread has registered an extrication interface, then
++     invoke the interface. If it returns 1, then we succeeded in
++     dequeuing the thread from whatever waiting object it was enqueued
++     with. In that case, it is our responsibility to wake it up. 
++     And also to set the p_woken_by_cancel flag so the woken thread
++     can tell that it was woken by cancellation. */
++
++  if (pextricate != NULL) {
++    dorestart = pextricate->pu_extricate_func(pextricate->pu_object, th);
++    th->p_woken_by_cancel = dorestart;
++  }
++
++  __pthread_unlock(&handle->h_lock);
++
++  /* If the thread has suspended or is about to, then we unblock it by
++     issuing a restart, instead of a cancel signal. Otherwise we send
++     the cancel signal to unblock the thread from a cancellation point,
++     or to initiate asynchronous cancellation. The restart is needed so
++     we have proper accounting of restarts; suspend decrements the thread's
++     resume count, and restart() increments it.  This also means that suspend's
++     handling of the cancel signal is obsolete. */
++
++  if (dorestart)
++    restart(th);
++  else 
++    kill(pid, __pthread_sig_cancel);
++
++  return 0;
++}
++
++void pthread_testcancel(void)
++{
++  pthread_descr self = thread_self();
++  if (THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)
++    pthread_exit(PTHREAD_CANCELED);
++}
++
++void _pthread_cleanup_push(struct _pthread_cleanup_buffer * buffer,
++			   void (*routine)(void *), void * arg)
++{
++  pthread_descr self = thread_self();
++  buffer->__routine = routine;
++  buffer->__arg = arg;
++  buffer->__prev = THREAD_GETMEM(self, p_cleanup);
++  THREAD_SETMEM(self, p_cleanup, buffer);
++}
++
++void _pthread_cleanup_pop(struct _pthread_cleanup_buffer * buffer,
++			  int execute)
++{
++  pthread_descr self = thread_self();
++  if (execute) buffer->__routine(buffer->__arg);
++  THREAD_SETMEM(self, p_cleanup, buffer->__prev);
++}
++
++void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer * buffer,
++				 void (*routine)(void *), void * arg)
++{
++  pthread_descr self = thread_self();
++  buffer->__routine = routine;
++  buffer->__arg = arg;
++  buffer->__canceltype = THREAD_GETMEM(self, p_canceltype);
++  buffer->__prev = THREAD_GETMEM(self, p_cleanup);
++  THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED);
++  THREAD_SETMEM(self, p_cleanup, buffer);
++}
++
++void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer * buffer,
++				  int execute)
++{
++  pthread_descr self = thread_self();
++  if (execute) buffer->__routine(buffer->__arg);
++  THREAD_SETMEM(self, p_cleanup, buffer->__prev);
++  THREAD_SETMEM(self, p_canceltype, buffer->__canceltype);
++  if (THREAD_GETMEM(self, p_canceled) &&
++      THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE &&
++      THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
++    pthread_exit(PTHREAD_CANCELED);
++}
++
++void __pthread_perform_cleanup(void)
++{
++  pthread_descr self = thread_self();
++  struct _pthread_cleanup_buffer * c;
++  for (c = THREAD_GETMEM(self, p_cleanup); c != NULL; c = c->__prev)
++    c->__routine(c->__arg);
++}
++
++#ifndef PIC
++/* We need a hook to force the cancelation wrappers to be linked in when
++   static libpthread is used.  */
++extern const int __pthread_provide_wrappers;
++static const int * const __pthread_require_wrappers =
++  &__pthread_provide_wrappers;
++#endif
+diff -Naur ../glibc-2.1.3/linuxthreads/condvar.c glibc-2.1.3/linuxthreads/condvar.c
+--- ../glibc-2.1.3/linuxthreads/condvar.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/condvar.c	2000-02-16 17:44:56.000000000 -0800
+@@ -0,0 +1,417 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/* and Pavel Krauz (krauz@fsid.cvut.cz).                                */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Condition variables */
++
++#include <errno.h>
++#include <sched.h>
++#include <stddef.h>
++#include <sys/time.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "queue.h"
++#include "restart.h"
++
++static int pthread_cond_timedwait_relative_old(pthread_cond_t *,
++    pthread_mutex_t *, const struct timespec *);
++
++static int pthread_cond_timedwait_relative_new(pthread_cond_t *,
++    pthread_mutex_t *, const struct timespec *);
++
++static int (*pthread_cond_tw_rel)(pthread_cond_t *, pthread_mutex_t *,
++    const struct timespec *) = pthread_cond_timedwait_relative_old;
++
++/* initialize this module */
++void __pthread_init_condvar(int rt_sig_available)
++{
++  if (rt_sig_available)
++    pthread_cond_tw_rel = pthread_cond_timedwait_relative_new;
++}
++
++int pthread_cond_init(pthread_cond_t *cond,
++                      const pthread_condattr_t *cond_attr)
++{
++  __pthread_init_lock(&cond->__c_lock);
++  cond->__c_waiting = NULL;
++  return 0;
++}
++
++int pthread_cond_destroy(pthread_cond_t *cond)
++{
++  if (cond->__c_waiting != NULL) return EBUSY;
++  return 0;
++}
++
++/* Function called by pthread_cancel to remove the thread from
++   waiting on a condition variable queue. */
++
++static int cond_extricate_func(void *obj, pthread_descr th)
++{
++  volatile pthread_descr self = thread_self();
++  pthread_cond_t *cond = obj;
++  int did_remove = 0;
++
++  __pthread_lock(&cond->__c_lock, self);
++  did_remove = remove_from_queue(&cond->__c_waiting, th);
++  __pthread_unlock(&cond->__c_lock);
++
++  return did_remove;
++}
++
++int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
++{
++  volatile pthread_descr self = thread_self();
++  pthread_extricate_if extr;
++  int already_canceled = 0;
++
++  /* Set up extrication interface */
++  extr.pu_object = cond;
++  extr.pu_extricate_func = cond_extricate_func;
++
++  /* Register extrication interface */
++  __pthread_set_own_extricate_if(self, &extr);
++
++  /* Atomically enqueue thread for waiting, but only if it is not
++     canceled. If the thread is canceled, then it will fall through the
++     suspend call below, and then call pthread_exit without
++     having to worry about whether it is still on the condition variable queue.
++     This depends on pthread_cancel setting p_canceled before calling the
++     extricate function. */
++
++  __pthread_lock(&cond->__c_lock, self);
++  if (!(THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
++    enqueue(&cond->__c_waiting, self);
++  else
++    already_canceled = 1;
++  __pthread_unlock(&cond->__c_lock);
++
++  if (already_canceled) {
++    __pthread_set_own_extricate_if(self, 0);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_unlock(mutex);
++
++  suspend(self);
++  __pthread_set_own_extricate_if(self, 0);
++
++  /* Check for cancellation again, to provide correct cancellation
++     point behavior */
++
++  if (THREAD_GETMEM(self, p_woken_by_cancel)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++    THREAD_SETMEM(self, p_woken_by_cancel, 0);
++    pthread_mutex_lock(mutex);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_lock(mutex);
++  return 0;
++}
++
++/* The following function is used on kernels that don't have rt signals.
++   SIGUSR1 is used as the restart signal. The different code is needed
++   because that ordinary signal does not queue. */
++
++static int
++pthread_cond_timedwait_relative_old(pthread_cond_t *cond,
++				pthread_mutex_t *mutex,
++				const struct timespec * abstime)
++{
++  volatile pthread_descr self = thread_self();
++  sigset_t unblock, initial_mask;
++  int already_canceled = 0;
++  int was_signalled = 0;
++  sigjmp_buf jmpbuf;
++  pthread_extricate_if extr;
++
++  /* Set up extrication interface */
++  extr.pu_object = cond;
++  extr.pu_extricate_func = cond_extricate_func;
++
++  /* Register extrication interface */
++  __pthread_set_own_extricate_if(self, &extr);
++
++  /* Enqueue to wait on the condition and check for cancellation. */
++  __pthread_lock(&cond->__c_lock, self);
++  if (!(THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
++    enqueue(&cond->__c_waiting, self);
++  else
++    already_canceled = 1;
++  __pthread_unlock(&cond->__c_lock);
++
++  if (already_canceled) {
++    __pthread_set_own_extricate_if(self, 0);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_unlock(mutex);
++
++  if (atomic_decrement(&self->p_resume_count) == 0) {
++    /* Set up a longjmp handler for the restart signal, unblock
++       the signal and sleep. */
++
++    if (sigsetjmp(jmpbuf, 1) == 0) {
++      THREAD_SETMEM(self, p_signal_jmp, &jmpbuf);
++      THREAD_SETMEM(self, p_signal, 0);
++      /* Unblock the restart signal */
++      sigemptyset(&unblock);
++      sigaddset(&unblock, __pthread_sig_restart);
++      sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask);
++
++      while (1) {
++	struct timeval now;
++	struct timespec reltime;
++
++	/* Compute a time offset relative to now.  */
++	__gettimeofday (&now, NULL);
++	reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000;
++	reltime.tv_sec = abstime->tv_sec - now.tv_sec;
++	if (reltime.tv_nsec < 0) {
++	  reltime.tv_nsec += 1000000000;
++	  reltime.tv_sec -= 1;
++	}
++
++	/* Sleep for the required duration. If woken by a signal, resume waiting
++	   as required by Single Unix Specification.  */
++	if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0)
++	  break;
++      }
++
++      /* Block the restart signal again */
++      sigprocmask(SIG_SETMASK, &initial_mask, NULL);
++      was_signalled = 0;
++    } else {
++      was_signalled = 1;
++    }
++    THREAD_SETMEM(self, p_signal_jmp, NULL);
++  }
++
++  /* Now was_signalled is true if we exited the above code
++     due to the delivery of a restart signal.  In that case,
++     we know we have been dequeued and resumed and that the
++     resume count is balanced.  Otherwise, there are some
++     cases to consider. First, try to bump up the resume count
++     back to zero. If it goes to 1, it means restart() was
++     invoked on this thread. The signal must be consumed
++     and the count bumped down and everything is cool.
++     Otherwise, no restart was delivered yet, so we remove
++     the thread from the queue. If this succeeds, it's a clear
++     case of timeout. If we fail to remove from the queue, then we
++     must wait for a restart. */
++
++  if (!was_signalled) {
++    if (atomic_increment(&self->p_resume_count) != -1) {
++      __pthread_wait_for_restart_signal(self);
++      atomic_decrement(&self->p_resume_count); /* should be zero now! */
++    } else {
++      int was_on_queue;
++      __pthread_lock(&cond->__c_lock, self);
++      was_on_queue = remove_from_queue(&cond->__c_waiting, self);
++      __pthread_unlock(&cond->__c_lock);
++
++      if (was_on_queue) {
++	__pthread_set_own_extricate_if(self, 0);
++	pthread_mutex_lock(mutex);
++	return ETIMEDOUT;
++      }
++
++      suspend(self);
++    }
++  }
++
++  __pthread_set_own_extricate_if(self, 0);
++
++  /* The remaining logic is the same as in other cancellable waits,
++     such as pthread_join sem_wait or pthread_cond wait. */
++
++  if (THREAD_GETMEM(self, p_woken_by_cancel)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++    THREAD_SETMEM(self, p_woken_by_cancel, 0);
++    pthread_mutex_lock(mutex);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_lock(mutex);
++  return 0;
++}
++
++/* The following function is used on new (late 2.1 and 2.2 and higher) kernels
++   that have rt signals which queue. */
++
++static int
++pthread_cond_timedwait_relative_new(pthread_cond_t *cond,
++				pthread_mutex_t *mutex,
++				const struct timespec * abstime)
++{
++  volatile pthread_descr self = thread_self();
++  sigset_t unblock, initial_mask;
++  int already_canceled = 0;
++  int was_signalled = 0;
++  sigjmp_buf jmpbuf;
++  pthread_extricate_if extr;
++
++  /* Set up extrication interface */
++  extr.pu_object = cond;
++  extr.pu_extricate_func = cond_extricate_func;
++
++  /* Register extrication interface */
++  __pthread_set_own_extricate_if(self, &extr);
++
++  /* Enqueue to wait on the condition and check for cancellation. */
++  __pthread_lock(&cond->__c_lock, self);
++  if (!(THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
++    enqueue(&cond->__c_waiting, self);
++  else
++    already_canceled = 1;
++  __pthread_unlock(&cond->__c_lock);
++
++  if (already_canceled) {
++    __pthread_set_own_extricate_if(self, 0);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_unlock(mutex);
++
++  /* Set up a longjmp handler for the restart signal, unblock
++     the signal and sleep. */
++
++  if (sigsetjmp(jmpbuf, 1) == 0) {
++    THREAD_SETMEM(self, p_signal_jmp, &jmpbuf);
++    THREAD_SETMEM(self, p_signal, 0);
++    /* Unblock the restart signal */
++    sigemptyset(&unblock);
++    sigaddset(&unblock, __pthread_sig_restart);
++    sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask);
++
++    while (1) {
++	struct timeval now;
++	struct timespec reltime;
++
++	/* Compute a time offset relative to now.  */
++	__gettimeofday (&now, NULL);
++	reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000;
++	reltime.tv_sec = abstime->tv_sec - now.tv_sec;
++	if (reltime.tv_nsec < 0) {
++	  reltime.tv_nsec += 1000000000;
++	  reltime.tv_sec -= 1;
++	}
++
++	/* Sleep for the required duration. If woken by a signal,
++	   resume waiting as required by Single Unix Specification.  */
++	if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0)
++	  break;
++      }
++
++    /* Block the restart signal again */
++    sigprocmask(SIG_SETMASK, &initial_mask, NULL);
++    was_signalled = 0;
++  } else {
++    was_signalled = 1;
++  }
++  THREAD_SETMEM(self, p_signal_jmp, NULL);
++
++  /* Now was_signalled is true if we exited the above code
++     due to the delivery of a restart signal.  In that case,
++     everything is cool. We have been removed from the queue
++     by the other thread, and consumed its signal.
++
++     Otherwise we this thread woke up spontaneously, or due to a signal other
++     than restart. The next thing to do is to try to remove the thread
++     from the queue. This may fail due to a race against another thread
++     trying to do the same. In the failed case, we know we were signalled,
++     and we may also have to consume a restart signal. */
++
++  if (!was_signalled) {
++    int was_on_queue;
++
++    /* __pthread_lock will queue back any spurious restarts that
++       may happen to it. */
++
++    __pthread_lock(&cond->__c_lock, self);
++    was_on_queue = remove_from_queue(&cond->__c_waiting, self);
++    __pthread_unlock(&cond->__c_lock);
++
++    if (was_on_queue) {
++      __pthread_set_own_extricate_if(self, 0);
++      pthread_mutex_lock(mutex);
++      return ETIMEDOUT;
++    }
++
++    /* Eat the outstanding restart() from the signaller */
++    suspend(self);
++  }
++
++  __pthread_set_own_extricate_if(self, 0);
++
++  /* The remaining logic is the same as in other cancellable waits,
++     such as pthread_join sem_wait or pthread_cond wait. */
++
++  if (THREAD_GETMEM(self, p_woken_by_cancel)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++    THREAD_SETMEM(self, p_woken_by_cancel, 0);
++    pthread_mutex_lock(mutex);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++
++  pthread_mutex_lock(mutex);
++  return 0;
++}
++
++int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
++                           const struct timespec * abstime)
++{
++  /* Indirect call through pointer! */
++  return pthread_cond_tw_rel(cond, mutex, abstime);
++}
++
++int pthread_cond_signal(pthread_cond_t *cond)
++{
++  pthread_descr th;
++
++  __pthread_lock(&cond->__c_lock, NULL);
++  th = dequeue(&cond->__c_waiting);
++  __pthread_unlock(&cond->__c_lock);
++  if (th != NULL) restart(th);
++  return 0;
++}
++
++int pthread_cond_broadcast(pthread_cond_t *cond)
++{
++  pthread_descr tosignal, th;
++
++  __pthread_lock(&cond->__c_lock, NULL);
++  /* Copy the current state of the waiting queue and empty it */
++  tosignal = cond->__c_waiting;
++  cond->__c_waiting = NULL;
++  __pthread_unlock(&cond->__c_lock);
++  /* Now signal each process in the queue */
++  while ((th = dequeue(&tosignal)) != NULL) restart(th);
++  return 0;
++}
++
++int pthread_condattr_init(pthread_condattr_t *attr)
++{
++  return 0;
++}
++
++int pthread_condattr_destroy(pthread_condattr_t *attr)
++{
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/configure glibc-2.1.3/linuxthreads/configure
+--- ../glibc-2.1.3/linuxthreads/configure	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/configure	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,5 @@
++# This is only to keep the GNU C library configure mechanism happy.
++#
++# Perhaps some day we need a real configuration script for different
++# kernel versions or so.
++exit 0
+diff -Naur ../glibc-2.1.3/linuxthreads/errno.c glibc-2.1.3/linuxthreads/errno.c
+--- ../glibc-2.1.3/linuxthreads/errno.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/errno.c	1998-08-28 03:07:17.000000000 -0700
+@@ -0,0 +1,32 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Define the location of errno for the remainder of the C library */
++
++#include <errno.h>
++#include <netdb.h>
++#include "pthread.h"
++#include "internals.h"
++
++int * __errno_location()
++{
++  pthread_descr self = thread_self();
++  return THREAD_GETMEM (self, p_errnop);
++}
++
++int * __h_errno_location()
++{
++  pthread_descr self = thread_self();
++  return THREAD_GETMEM (self, p_h_errnop);
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/events.c glibc-2.1.3/linuxthreads/events.c
+--- ../glibc-2.1.3/linuxthreads/events.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/events.c	1999-11-09 22:56:11.000000000 -0800
+@@ -0,0 +1,35 @@
++/* Event functions used while debugging.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* The functions contained here do nothing, they just return.  */
++
++void
++__linuxthreads_create_event (void)
++{
++}
++
++void
++__linuxthreads_death_event (void)
++{
++}
++
++void
++__linuxthreads_reap_event (void)
++{
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/internals.h glibc-2.1.3/linuxthreads/internals.h
+--- ../glibc-2.1.3/linuxthreads/internals.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/internals.h	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,444 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#ifndef _INTERNALS_H
++#define _INTERNALS_H   1
++
++/* Internal data structures */
++
++/* Includes */
++
++#include <bits/libc-tsd.h> /* for _LIBC_TSD_KEY_N */
++#include <limits.h>
++#include <setjmp.h>
++#include <signal.h>
++#include <unistd.h>
++#include <sys/types.h>
++#include "pt-machine.h"
++#include "semaphore.h"
++#include "../linuxthreads_db/thread_dbP.h"
++
++#ifndef THREAD_GETMEM
++# define THREAD_GETMEM(descr, member) descr->member
++#endif
++#ifndef THREAD_GETMEM_NC
++# define THREAD_GETMEM_NC(descr, member) descr->member
++#endif
++#ifndef THREAD_SETMEM
++# define THREAD_SETMEM(descr, member, value) descr->member = (value)
++#endif
++#ifndef THREAD_SETMEM_NC
++# define THREAD_SETMEM_NC(descr, member, value) descr->member = (value)
++#endif
++
++/* Arguments passed to thread creation routine */
++
++struct pthread_start_args {
++  void * (*start_routine)(void *); /* function to run */
++  void * arg;                   /* its argument */
++  sigset_t mask;                /* initial signal mask for thread */
++  int schedpolicy;              /* initial scheduling policy (if any) */
++  struct sched_param schedparam; /* initial scheduling parameters (if any) */
++};
++
++
++/* We keep thread specific data in a special data structure, a two-level
++   array.  The top-level array contains pointers to dynamically allocated
++   arrays of a certain number of data pointers.  So we can implement a
++   sparse array.  Each dynamic second-level array has
++	PTHREAD_KEY_2NDLEVEL_SIZE
++   entries.  This value shouldn't be too large.  */
++#define PTHREAD_KEY_2NDLEVEL_SIZE	32
++
++/* We need to address PTHREAD_KEYS_MAX key with PTHREAD_KEY_2NDLEVEL_SIZE
++   keys in each subarray.  */
++#define PTHREAD_KEY_1STLEVEL_SIZE \
++  ((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1) \
++   / PTHREAD_KEY_2NDLEVEL_SIZE)
++
++typedef void (*destr_function)(void *);
++
++struct pthread_key_struct {
++  int in_use;                   /* already allocated? */
++  destr_function destr;         /* destruction routine */
++};
++
++
++#define PTHREAD_START_ARGS_INITIALIZER { NULL, NULL, {{0, }}, 0, { 0 } }
++
++/* The type of thread descriptors */
++
++typedef struct _pthread_descr_struct * pthread_descr;
++
++/* Callback interface for removing the thread from waiting on an
++   object if it is cancelled while waiting or about to wait.
++   This hold a pointer to the object, and a pointer to a function
++   which ``extricates'' the thread from its enqueued state.
++   The function takes two arguments: pointer to the wait object,
++   and a pointer to the thread. It returns 1 if an extrication
++   actually occured, and hence the thread must also be signalled.
++   It returns 0 if the thread had already been extricated. */
++
++typedef struct _pthread_extricate_struct {
++    void *pu_object;
++    int (*pu_extricate_func)(void *, pthread_descr);
++} pthread_extricate_if;
++
++/* Atomic counter made possible by compare_and_swap */
++
++struct pthread_atomic {
++  long p_count;
++  int p_spinlock;
++};
++
++/* Context info for read write locks. The pthread_rwlock_info structure
++   is information about a lock that has been read-locked by the thread
++   in whose list this structure appears. The pthread_rwlock_context
++   is embedded in the thread context and contains a pointer to the
++   head of the list of lock info structures, as well as a count of
++   read locks that are untracked, because no info structure could be
++   allocated for them. */
++
++struct _pthread_rwlock_t;
++
++typedef struct _pthread_rwlock_info {
++  struct _pthread_rwlock_info *pr_next;
++  struct _pthread_rwlock_t *pr_lock;
++  int pr_lock_count;
++} pthread_readlock_info;
++
++struct _pthread_descr_struct {
++  pthread_descr p_nextlive, p_prevlive;
++                                /* Double chaining of active threads */
++  pthread_descr p_nextwaiting;  /* Next element in the queue holding the thr */
++  pthread_descr p_nextlock;	/* can be on a queue and waiting on a lock */
++  pthread_t p_tid;              /* Thread identifier */
++  int p_pid;                    /* PID of Unix process */
++  int p_priority;               /* Thread priority (== 0 if not realtime) */
++  struct _pthread_fastlock * p_lock; /* Spinlock for synchronized accesses */
++  int p_signal;                 /* last signal received */
++  sigjmp_buf * p_signal_jmp;    /* where to siglongjmp on a signal or NULL */
++  sigjmp_buf * p_cancel_jmp;    /* where to siglongjmp on a cancel or NULL */
++  char p_terminated;            /* true if terminated e.g. by pthread_exit */
++  char p_detached;              /* true if detached */
++  char p_exited;                /* true if the assoc. process terminated */
++  void * p_retval;              /* placeholder for return value */
++  int p_retcode;                /* placeholder for return code */
++  pthread_descr p_joining;      /* thread joining on that thread or NULL */
++  struct _pthread_cleanup_buffer * p_cleanup; /* cleanup functions */
++  char p_cancelstate;           /* cancellation state */
++  char p_canceltype;            /* cancellation type (deferred/async) */
++  char p_canceled;              /* cancellation request pending */
++  int * p_errnop;               /* pointer to used errno variable */
++  int p_errno;                  /* error returned by last system call */
++  int * p_h_errnop;             /* pointer to used h_errno variable */
++  int p_h_errno;                /* error returned by last netdb function */
++  char * p_in_sighandler;       /* stack address of sighandler, or NULL */
++  char p_sigwaiting;            /* true if a sigwait() is in progress */
++  struct pthread_start_args p_start_args; /* arguments for thread creation */
++  void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */
++  void * p_libc_specific[_LIBC_TSD_KEY_N]; /* thread-specific data for libc */
++  int p_userstack;		/* nonzero if the user provided the stack */
++  void *p_guardaddr;		/* address of guard area or NULL */
++  size_t p_guardsize;		/* size of guard area */
++  pthread_descr p_self;		/* Pointer to this structure */
++  int p_nr;                     /* Index of descriptor in __pthread_handles */
++  int p_report_events;         /* Nonzero if events must be reported.  */
++  td_eventbuf_t p_eventbuf;     /* Data for event.  */
++  struct pthread_atomic p_resume_count; /* number of times restart() was
++					   called on thread */
++  char p_woken_by_cancel;       /* cancellation performed wakeup */
++  pthread_extricate_if *p_extricate; /* See above */
++  pthread_readlock_info *p_readlock_list;  /* List of readlock info structs */
++  pthread_readlock_info *p_readlock_free;  /* Free list of structs */
++  int p_untracked_readlock_count;	/* Readlocks not tracked by list */
++  /* New elements must be added at the end.  */
++} __attribute__ ((aligned(32))); /* We need to align the structure so that
++				    doubles are aligned properly.  This is 8
++				    bytes on MIPS and 16 bytes on MIPS64.
++				    32 bytes might give better cache
++				    utilization.  */
++
++/* The type of thread handles. */
++
++typedef struct pthread_handle_struct * pthread_handle;
++
++struct pthread_handle_struct {
++  struct _pthread_fastlock h_lock; /* Fast lock for sychronized access */
++  pthread_descr h_descr;        /* Thread descriptor or NULL if invalid */
++  char * h_bottom;              /* Lowest address in the stack thread */
++};
++
++/* The type of messages sent to the thread manager thread */
++
++struct pthread_request {
++  pthread_descr req_thread;     /* Thread doing the request */
++  enum {                        /* Request kind */
++    REQ_CREATE, REQ_FREE, REQ_PROCESS_EXIT, REQ_MAIN_THREAD_EXIT,
++    REQ_POST, REQ_DEBUG
++  } req_kind;
++  union {                       /* Arguments for request */
++    struct {                    /* For REQ_CREATE: */
++      const pthread_attr_t * attr; /* thread attributes */
++      void * (*fn)(void *);     /*   start function */
++      void * arg;               /*   argument to start function */
++      sigset_t mask;            /*   signal mask */
++    } create;
++    struct {                    /* For REQ_FREE: */
++      pthread_t thread_id;      /*   identifier of thread to free */
++    } free;
++    struct {                    /* For REQ_PROCESS_EXIT: */
++      int code;                 /*   exit status */
++    } exit;
++    void * post;                /* For REQ_POST: the semaphore */
++  } req_args;
++};
++
++
++/* Signals used for suspend/restart and for cancellation notification.  */
++
++extern int __pthread_sig_restart;
++extern int __pthread_sig_cancel;
++
++/* Signal used for interfacing with gdb */
++
++extern int __pthread_sig_debug;
++
++/* Global array of thread handles, used for validating a thread id
++   and retrieving the corresponding thread descriptor. Also used for
++   mapping the available stack segments. */
++
++extern struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];
++
++/* Descriptor of the initial thread */
++
++extern struct _pthread_descr_struct __pthread_initial_thread;
++
++/* Descriptor of the manager thread */
++
++extern struct _pthread_descr_struct __pthread_manager_thread;
++
++/* Descriptor of the main thread */
++
++extern pthread_descr __pthread_main_thread;
++
++/* Limit between the stack of the initial thread (above) and the
++   stacks of other threads (below). Aligned on a STACK_SIZE boundary.
++   Initially 0, meaning that the current thread is (by definition)
++   the initial thread. */
++
++extern char *__pthread_initial_thread_bos;
++
++/* Indicate whether at least one thread has a user-defined stack (if 1),
++   or all threads have stacks supplied by LinuxThreads (if 0). */
++
++extern int __pthread_nonstandard_stacks;
++
++/* File descriptor for sending requests to the thread manager.
++   Initially -1, meaning that __pthread_initialize_manager must be called. */
++
++extern int __pthread_manager_request;
++
++/* Other end of the pipe for sending requests to the thread manager. */
++
++extern int __pthread_manager_reader;
++
++/* Limits of the thread manager stack. */
++
++extern char *__pthread_manager_thread_bos;
++extern char *__pthread_manager_thread_tos;
++
++/* Pending request for a process-wide exit */
++
++extern int __pthread_exit_requested, __pthread_exit_code;
++
++/* Set to 1 by gdb if we're debugging */
++
++extern volatile int __pthread_threads_debug;
++
++/* Globally enabled events.  */
++extern volatile td_thr_events_t __pthread_threads_events;
++
++/* Pointer to descriptor of thread with last event.  */
++extern volatile pthread_descr __pthread_last_event;
++
++/* Return the handle corresponding to a thread id */
++
++static inline pthread_handle thread_handle(pthread_t id)
++{
++  return &__pthread_handles[id % PTHREAD_THREADS_MAX];
++}
++
++/* Validate a thread handle. Must have acquired h->h_spinlock before. */
++
++static inline int invalid_handle(pthread_handle h, pthread_t id)
++{
++  return h->h_descr == NULL || h->h_descr->p_tid != id;
++}
++
++/* Fill in defaults left unspecified by pt-machine.h.  */
++
++/* The page size we can get from the system.  This should likely not be
++   changed by the machine file but, you never know.  */
++#ifndef PAGE_SIZE
++#define PAGE_SIZE  (sysconf (_SC_PAGE_SIZE))
++#endif
++
++/* The max size of the thread stack segments.  If the default
++   THREAD_SELF implementation is used, this must be a power of two and
++   a multiple of PAGE_SIZE.  */
++#ifndef STACK_SIZE
++#define STACK_SIZE  (2 * 1024 * 1024)
++#endif
++
++/* The initial size of the thread stack.  Must be a multiple of PAGE_SIZE.  */
++#ifndef INITIAL_STACK_SIZE
++#define INITIAL_STACK_SIZE  (4 * PAGE_SIZE)
++#endif
++
++/* Size of the thread manager stack. The "- 32" avoids wasting space
++   with some malloc() implementations. */
++#ifndef THREAD_MANAGER_STACK_SIZE
++#define THREAD_MANAGER_STACK_SIZE  (2 * PAGE_SIZE - 32)
++#endif
++
++/* The base of the "array" of thread stacks.  The array will grow down from
++   here.  Defaults to the calculated bottom of the initial application
++   stack.  */
++#ifndef THREAD_STACK_START_ADDRESS
++#define THREAD_STACK_START_ADDRESS  __pthread_initial_thread_bos
++#endif
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#ifndef CURRENT_STACK_FRAME
++#define CURRENT_STACK_FRAME  ({ char __csf; &__csf; })
++#endif
++
++/* Recover thread descriptor for the current thread */
++
++extern pthread_descr __pthread_find_self (void) __attribute__ ((const));
++
++static inline pthread_descr thread_self (void) __attribute__ ((const));
++static inline pthread_descr thread_self (void)
++{
++#ifdef THREAD_SELF
++  return THREAD_SELF;
++#else
++  char *sp = CURRENT_STACK_FRAME;
++  if (sp >= __pthread_initial_thread_bos)
++    return &__pthread_initial_thread;
++  else if (sp >= __pthread_manager_thread_bos
++	   && sp < __pthread_manager_thread_tos)
++    return &__pthread_manager_thread;
++  else if (__pthread_nonstandard_stacks)
++    return __pthread_find_self();
++  else
++    return (pthread_descr)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1;
++#endif
++}
++
++/* Max number of times we must spin on a spinlock calling sched_yield().
++   After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */
++
++#ifndef MAX_SPIN_COUNT
++#define MAX_SPIN_COUNT 50
++#endif
++
++/* Duration of sleep (in nanoseconds) when we can't acquire a spinlock
++   after MAX_SPIN_COUNT iterations of sched_yield().
++   With the 2.0 and 2.1 kernels, this MUST BE > 2ms.
++   (Otherwise the kernel does busy-waiting for realtime threads,
++    giving other threads no chance to run.) */
++
++#ifndef SPIN_SLEEP_DURATION
++#define SPIN_SLEEP_DURATION 2000001
++#endif
++
++/* Debugging */
++
++#ifdef DEBUG
++#include <assert.h>
++#define ASSERT assert
++#define MSG __pthread_message
++#else
++#define ASSERT(x)
++#define MSG(msg,arg...)
++#endif
++
++/* Internal global functions */
++
++void __pthread_destroy_specifics(void);
++void __pthread_perform_cleanup(void);
++int __pthread_initialize_manager(void);
++void __pthread_message(char * fmt, ...);
++int __pthread_manager(void *reqfd);
++int __pthread_manager_event(void *reqfd);
++void __pthread_manager_sighandler(int sig);
++void __pthread_reset_main_thread(void);
++void __fresetlockfiles(void);
++void __pthread_manager_adjust_prio(int thread_prio);
++void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif);
++
++extern int __pthread_attr_setguardsize __P ((pthread_attr_t *__attr,
++					     size_t __guardsize));
++extern int __pthread_attr_getguardsize __P ((__const pthread_attr_t *__attr,
++					     size_t *__guardsize));
++extern int __pthread_attr_setstackaddr __P ((pthread_attr_t *__attr,
++					     void *__stackaddr));
++extern int __pthread_attr_getstackaddr __P ((__const pthread_attr_t *__attr,
++					     void **__stackaddr));
++extern int __pthread_attr_setstacksize __P ((pthread_attr_t *__attr,
++					     size_t __stacksize));
++extern int __pthread_attr_getstacksize __P ((__const pthread_attr_t *__attr,
++					     size_t *__stacksize));
++extern int __pthread_getconcurrency __P ((void));
++extern int __pthread_setconcurrency __P ((int __level));
++extern int __pthread_mutexattr_gettype __P ((__const pthread_mutexattr_t *__attr,
++					     int *__kind));
++extern void __pthread_kill_other_threads_np __P ((void));
++
++void __pthread_restart_old(pthread_descr th);
++void __pthread_suspend_old(pthread_descr self);
++
++void __pthread_restart_new(pthread_descr th);
++void __pthread_suspend_new(pthread_descr self);
++
++void __pthread_wait_for_restart_signal(pthread_descr self);
++
++void __pthread_init_condvar(int rt_sig_available);
++
++/* Global pointers to old or new suspend functions */
++
++extern void (*__pthread_restart)(pthread_descr);
++extern void (*__pthread_suspend)(pthread_descr);
++
++/* Prototypes for the function without cancelation support when the
++   normal version has it.  */
++extern int __libc_close (int fd);
++extern int __libc_nanosleep (const struct timespec *requested_time,
++			     struct timespec *remaining);
++extern ssize_t __libc_read (int fd, void *buf, size_t count);
++extern pid_t __libc_waitpid (pid_t pid, int *stat_loc, int options);
++extern ssize_t __libc_write (int fd, const void *buf, size_t count);
++
++/* Prototypes for some of the new semaphore functions.  */
++extern int __new_sem_post (sem_t * sem);
++
++/* The functions called the signal events.  */
++extern void __linuxthreads_create_event (void);
++extern void __linuxthreads_death_event (void);
++extern void __linuxthreads_reap_event (void);
++
++#endif /* internals.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/join.c glibc-2.1.3/linuxthreads/join.c
+--- ../glibc-2.1.3/linuxthreads/join.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/join.c	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,207 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Thread termination and joining */
++
++#include <errno.h>
++#include <sched.h>
++#include <unistd.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++
++void pthread_exit(void * retval)
++{
++  pthread_descr self = thread_self();
++  pthread_descr joining;
++  struct pthread_request request;
++
++  /* Reset the cancellation flag to avoid looping if the cleanup handlers
++     contain cancellation points */
++  THREAD_SETMEM(self, p_canceled, 0);
++  /* Call cleanup functions and destroy the thread-specific data */
++  __pthread_perform_cleanup();
++  __pthread_destroy_specifics();
++  /* Store return value */
++  __pthread_lock(THREAD_GETMEM(self, p_lock), self);
++  THREAD_SETMEM(self, p_retval, retval);
++  /* Say that we've terminated */
++  THREAD_SETMEM(self, p_terminated, 1);
++  /* See whether we have to signal the death.  */
++  if (THREAD_GETMEM(self, p_report_events))
++    {
++      /* See whether TD_DEATH is in any of the mask.  */
++      int idx = __td_eventword (TD_DEATH);
++      uint32_t mask = __td_eventmask (TD_DEATH);
++
++      if ((mask & (__pthread_threads_events.event_bits[idx]
++		   | THREAD_GETMEM(self,
++				   p_eventbuf.eventmask).event_bits[idx]))
++	  != 0)
++	{
++	  /* Yep, we have to signal the death.  */
++	  THREAD_SETMEM(self, p_eventbuf.eventnum, TD_DEATH);
++	  THREAD_SETMEM(self, p_eventbuf.eventdata, self);
++	  __pthread_last_event = self;
++
++	  /* Now call the function to signal the event.  */
++	  __linuxthreads_death_event();
++	}
++    }
++  /* See if someone is joining on us */
++  joining = THREAD_GETMEM(self, p_joining);
++  __pthread_unlock(THREAD_GETMEM(self, p_lock));
++  /* Restart joining thread if any */
++  if (joining != NULL) restart(joining);
++  /* If this is the initial thread, block until all threads have terminated.
++     If another thread calls exit, we'll be terminated from our signal
++     handler. */
++  if (self == __pthread_main_thread && __pthread_manager_request >= 0) {
++    request.req_thread = self;
++    request.req_kind = REQ_MAIN_THREAD_EXIT;
++    __libc_write(__pthread_manager_request, (char *)&request, sizeof(request));
++    suspend(self);
++  }
++  /* Exit the process (but don't flush stdio streams, and don't run
++     atexit functions). */
++  _exit(0);
++}
++
++/* Function called by pthread_cancel to remove the thread from
++   waiting on a condition variable queue. */
++
++static int join_extricate_func(void *obj, pthread_descr th)
++{
++  volatile pthread_descr self = thread_self();
++  pthread_handle handle = obj;
++  pthread_descr jo;
++  int did_remove = 0;
++
++  __pthread_lock(&handle->h_lock, self);
++  jo = handle->h_descr;
++  did_remove = jo->p_joining != NULL;
++  jo->p_joining = NULL;
++  __pthread_unlock(&handle->h_lock);
++
++  return did_remove;
++}
++
++int pthread_join(pthread_t thread_id, void ** thread_return)
++{
++  volatile pthread_descr self = thread_self();
++  struct pthread_request request;
++  pthread_handle handle = thread_handle(thread_id);
++  pthread_descr th;
++  pthread_extricate_if extr;
++  int already_canceled = 0;
++
++  /* Set up extrication interface */
++  extr.pu_object = handle;
++  extr.pu_extricate_func = join_extricate_func;
++
++  __pthread_lock(&handle->h_lock, self);
++  if (invalid_handle(handle, thread_id)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++  th = handle->h_descr;
++  if (th == self) {
++    __pthread_unlock(&handle->h_lock);
++    return EDEADLK;
++  }
++  /* If detached or already joined, error */
++  if (th->p_detached || th->p_joining != NULL) {
++    __pthread_unlock(&handle->h_lock);
++    return EINVAL;
++  }
++  /* If not terminated yet, suspend ourselves. */
++  if (! th->p_terminated) {
++    /* Register extrication interface */
++    __pthread_set_own_extricate_if(self, &extr); 
++    if (!(THREAD_GETMEM(self, p_canceled)
++	&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
++      th->p_joining = self;
++    else
++      already_canceled = 1;
++    __pthread_unlock(&handle->h_lock);
++
++    if (already_canceled) {
++      __pthread_set_own_extricate_if(self, 0); 
++      pthread_exit(PTHREAD_CANCELED);
++    }
++
++    suspend(self);
++    /* Deregister extrication interface */
++    __pthread_set_own_extricate_if(self, 0); 
++
++    /* This is a cancellation point */
++    if (THREAD_GETMEM(self, p_woken_by_cancel)
++	&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++      THREAD_SETMEM(self, p_woken_by_cancel, 0);
++      pthread_exit(PTHREAD_CANCELED);
++    }
++    __pthread_lock(&handle->h_lock, self);
++  }
++  /* Get return value */
++  if (thread_return != NULL) *thread_return = th->p_retval;
++  __pthread_unlock(&handle->h_lock);
++  /* Send notification to thread manager */
++  if (__pthread_manager_request >= 0) {
++    request.req_thread = self;
++    request.req_kind = REQ_FREE;
++    request.req_args.free.thread_id = thread_id;
++    __libc_write(__pthread_manager_request,
++		 (char *) &request, sizeof(request));
++  }
++  return 0;
++}
++
++int pthread_detach(pthread_t thread_id)
++{
++  int terminated;
++  struct pthread_request request;
++  pthread_handle handle = thread_handle(thread_id);
++  pthread_descr th;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, thread_id)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++  th = handle->h_descr;
++  /* If already detached, error */
++  if (th->p_detached) {
++    __pthread_unlock(&handle->h_lock);
++    return EINVAL;
++  }
++  /* If already joining, don't do anything. */
++  if (th->p_joining != NULL) {
++    __pthread_unlock(&handle->h_lock);
++    return 0;
++  }
++  /* Mark as detached */
++  th->p_detached = 1;
++  terminated = th->p_terminated;
++  __pthread_unlock(&handle->h_lock);
++  /* If already terminated, notify thread manager to reclaim resources */
++  if (terminated && __pthread_manager_request >= 0) {
++    request.req_thread = thread_self();
++    request.req_kind = REQ_FREE;
++    request.req_args.free.thread_id = thread_id;
++    __libc_write(__pthread_manager_request,
++		 (char *) &request, sizeof(request));
++  }
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/linuxthreads.texi glibc-2.1.3/linuxthreads/linuxthreads.texi
+--- ../glibc-2.1.3/linuxthreads/linuxthreads.texi	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/linuxthreads.texi	1999-06-16 15:34:04.000000000 -0700
+@@ -0,0 +1,1428 @@
++@node POSIX Threads
++@c @node POSIX Threads, , Top, Top
++@chapter POSIX Threads
++@c %MENU% The standard threads library
++
++@c This chapter needs more work bigtime. -zw
++
++This chapter describes the pthreads (POSIX threads) library.  This
++library provides support functions for multithreaded programs: thread
++primitives, synchronization objects, and so forth.  It also implements
++POSIX 1003.1b semaphores (not to be confused with System V semaphores).
++
++The threads operations (@samp{pthread_*}) do not use @var{errno}.
++Instead they return an error code directly.  The semaphore operations do
++use @var{errno}.
++
++@menu
++* Basic Thread Operations::     Creating, terminating, and waiting for threads.
++* Thread Attributes::           Tuning thread scheduling.
++* Cancellation::                Stopping a thread before it's done.
++* Cleanup Handlers::            Deallocating resources when a thread is
++                                  cancelled.
++* Mutexes::                     One way to synchronize threads.
++* Condition Variables::         Another way.
++* POSIX Semaphores::            And a third way.
++* Thread-Specific Data::        Variables with different values in
++                                  different threads.
++* Threads and Signal Handling:: Why you should avoid mixing the two, and
++                                  how to do it if you must.
++* Miscellaneous Thread Functions:: A grab bag of utility routines.
++@end menu
++
++@node Basic Thread Operations
++@section Basic Thread Operations
++
++These functions are the thread equivalents of @code{fork}, @code{exit},
++and @code{wait}.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_create (pthread_t * @var{thread}, pthread_attr_t * @var{attr}, void * (*@var{start_routine})(void *), void * @var{arg})
++@code{pthread_create} creates a new thread of control that executes
++concurrently with the calling thread. The new thread calls the
++function @var{start_routine}, passing it @var{arg} as first argument. The
++new thread terminates either explicitly, by calling @code{pthread_exit},
++or implicitly, by returning from the @var{start_routine} function. The
++latter case is equivalent to calling @code{pthread_exit} with the result
++returned by @var{start_routine} as exit code.
++
++The @var{attr} argument specifies thread attributes to be applied to the
++new thread. @xref{Thread Attributes}, for details. The @var{attr}
++argument can also be @code{NULL}, in which case default attributes are
++used: the created thread is joinable (not detached) and has an ordinary
++(not realtime) scheduling policy.
++
++On success, the identifier of the newly created thread is stored in the
++location pointed by the @var{thread} argument, and a 0 is returned. On
++error, a non-zero error code is returned.
++
++This function may return the following errors:
++@table @code
++@item EAGAIN
++Not enough system resources to create a process for the new thread,
++or more than @code{PTHREAD_THREADS_MAX} threads are already active.
++@end table
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun void pthread_exit (void *@var{retval})
++@code{pthread_exit} terminates the execution of the calling thread.  All
++cleanup handlers (@pxref{Cleanup Handlers}) that have been set for the
++calling thread with @code{pthread_cleanup_push} are executed in reverse
++order (the most recently pushed handler is executed first). Finalization
++functions for thread-specific data are then called for all keys that
++have non-@code{NULL} values associated with them in the calling thread
++(@pxref{Thread-Specific Data}).  Finally, execution of the calling
++thread is stopped.
++
++The @var{retval} argument is the return value of the thread. It can be
++retrieved from another thread using @code{pthread_join}.
++
++The @code{pthread_exit} function never returns.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cancel (pthread_t @var{thread})
++
++@code{pthread_cancel} sends a cancellation request to the thread denoted
++by the @var{thread} argument.  If there is no such thread,
++@code{pthread_cancel} fails and returns @code{ESRCH}.  Otherwise it
++returns 0. @xref{Cancellation}, for details.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_join (pthread_t @var{th}, void **thread_@var{return})
++@code{pthread_join} suspends the execution of the calling thread until
++the thread identified by @var{th} terminates, either by calling
++@code{pthread_exit} or by being cancelled.
++
++If @var{thread_return} is not @code{NULL}, the return value of @var{th}
++is stored in the location pointed to by @var{thread_return}.  The return
++value of @var{th} is either the argument it gave to @code{pthread_exit},
++or @code{PTHREAD_CANCELED} if @var{th} was cancelled.
++
++The joined thread @code{th} must be in the joinable state: it must not
++have been detached using @code{pthread_detach} or the
++@code{PTHREAD_CREATE_DETACHED} attribute to @code{pthread_create}.
++
++When a joinable thread terminates, its memory resources (thread
++descriptor and stack) are not deallocated until another thread performs
++@code{pthread_join} on it. Therefore, @code{pthread_join} must be called
++once for each joinable thread created to avoid memory leaks.
++
++At most one thread can wait for the termination of a given
++thread. Calling @code{pthread_join} on a thread @var{th} on which
++another thread is already waiting for termination returns an error.
++
++@code{pthread_join} is a cancellation point. If a thread is canceled
++while suspended in @code{pthread_join}, the thread execution resumes
++immediately and the cancellation is executed without waiting for the
++@var{th} thread to terminate. If cancellation occurs during
++@code{pthread_join}, the @var{th} thread remains not joined.
++
++On success, the return value of @var{th} is stored in the location
++pointed to by @var{thread_return}, and 0 is returned. On error, one of
++the following values is returned:
++@table @code
++@item ESRCH
++No thread could be found corresponding to that specified by @var{th}.
++@item EINVAL
++The @var{th} thread has been detached, or another thread is already
++waiting on termination of @var{th}.
++@item EDEADLK
++The @var{th} argument refers to the calling thread.
++@end table
++@end deftypefun
++
++@node Thread Attributes
++@section Thread Attributes
++
++@comment pthread.h
++@comment POSIX
++
++Threads have a number of attributes that may be set at creation time.
++This is done by filling a thread attribute object @var{attr} of type
++@code{pthread_attr_t}, then passing it as second argument to
++@code{pthread_create}. Passing @code{NULL} is equivalent to passing a
++thread attribute object with all attributes set to their default values.
++
++Attribute objects are consulted only when creating a new thread.  The
++same attribute object can be used for creating several threads.
++Modifying an attribute object after a call to @code{pthread_create} does
++not change the attributes of the thread previously created.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_attr_init (pthread_attr_t *@var{attr})
++@code{pthread_attr_init} initializes the thread attribute object
++@var{attr} and fills it with default values for the attributes. (The
++default values are listed below for each attribute.)
++
++Each attribute @var{attrname} (see below for a list of all attributes)
++can be individually set using the function
++@code{pthread_attr_set@var{attrname}} and retrieved using the function
++@code{pthread_attr_get@var{attrname}}.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_attr_destroy (pthread_attr_t *@var{attr})
++@code{pthread_attr_destroy} destroys the attribute object pointed to by
++@var{attr} releasing any resources associated with it.  @var{attr} is
++left in an undefined state, and you must not use it again in a call to
++any pthreads function until it has been reinitialized.
++@end deftypefun
++
++@findex pthread_attr_setinheritsched
++@findex pthread_attr_setschedparam
++@findex pthread_attr_setschedpolicy
++@findex pthread_attr_setscope
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_attr_set@var{attr} (pthread_attr_t *@var{obj}, int @var{value})
++Set attribute @var{attr} to @var{value} in the attribute object pointed
++to by @var{obj}.  See below for a list of possible attributes and the
++values they can take.
++
++On success, these functions return 0.  If @var{value} is not meaningful
++for the @var{attr} being modified, they will return the error code
++@code{EINVAL}.  Some of the functions have other failure modes; see
++below.
++@end deftypefun
++
++@findex pthread_attr_getinheritsched
++@findex pthread_attr_getschedparam
++@findex pthread_attr_getschedpolicy
++@findex pthread_attr_getscope
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_attr_get@var{attr} (const pthread_attr_t *@var{obj}, int *@var{value})
++Store the current setting of @var{attr} in @var{obj} into the variable
++pointed to by @var{value}.
++
++These functions always return 0.
++@end deftypefun
++
++The following thread attributes are supported:
++@table @samp
++@item detachstate
++Choose whether the thread is created in the joinable state (value
++@code{PTHREAD_CREATE_JOINABLE}) or in the detached state
++(@code{PTHREAD_CREATE_DETACHED}).  The default is
++@code{PTHREAD_CREATE_JOINABLE}.
++
++In the joinable state, another thread can synchronize on the thread
++termination and recover its termination code using @code{pthread_join},
++but some of the thread resources are kept allocated after the thread
++terminates, and reclaimed only when another thread performs
++@code{pthread_join} on that thread.
++
++In the detached state, the thread resources are immediately freed when
++it terminates, but @code{pthread_join} cannot be used to synchronize on
++the thread termination.
++
++A thread created in the joinable state can later be put in the detached
++thread using @code{pthread_detach}.
++
++@item schedpolicy
++Select the scheduling policy for the thread: one of @code{SCHED_OTHER}
++(regular, non-realtime scheduling), @code{SCHED_RR} (realtime,
++round-robin) or @code{SCHED_FIFO} (realtime, first-in first-out).
++The default is @code{SCHED_OTHER}.
++@c Not doc'd in our manual: FIXME.
++@c See @code{sched_setpolicy} for more information on scheduling policies.
++
++The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
++are available only to processes with superuser privileges.
++@code{pthread_attr_setschedparam} will fail and return @code{ENOTSUP} if
++you try to set a realtime policy when you are unprivileged.
++
++The scheduling policy of a thread can be changed after creation with
++@code{pthread_setschedparam}.
++
++@item schedparam
++Change the scheduling parameter (the scheduling priority)
++for the thread.  The default is 0.
++
++This attribute is not significant if the scheduling policy is
++@code{SCHED_OTHER}; it only matters for the realtime policies
++@code{SCHED_RR} and @code{SCHED_FIFO}.
++
++The scheduling priority of a thread can be changed after creation with
++@code{pthread_setschedparam}.
++
++@item inheritsched
++Choose whether the scheduling policy and scheduling parameter for the
++newly created thread are determined by the values of the
++@var{schedpolicy} and @var{schedparam} attributes (value
++@code{PTHREAD_EXPLICIT_SCHED}) or are inherited from the parent thread
++(value @code{PTHREAD_INHERIT_SCHED}).  The default is
++@code{PTHREAD_EXPLICIT_SCHED}.
++
++@item scope
++Choose the scheduling contention scope for the created thread.  The
++default is @code{PTHREAD_SCOPE_SYSTEM}, meaning that the threads contend
++for CPU time with all processes running on the machine. In particular,
++thread priorities are interpreted relative to the priorities of all
++other processes on the machine. The other possibility,
++@code{PTHREAD_SCOPE_PROCESS}, means that scheduling contention occurs
++only between the threads of the running process: thread priorities are
++interpreted relative to the priorities of the other threads of the
++process, regardless of the priorities of other processes.
++
++@code{PTHREAD_SCOPE_PROCESS} is not supported in LinuxThreads.  If you
++try to set the scope to this value @code{pthread_attr_setscope} will
++fail and return @code{ENOTSUP}.
++@end table
++
++@node Cancellation
++@section Cancellation
++
++Cancellation is the mechanism by which a thread can terminate the
++execution of another thread. More precisely, a thread can send a
++cancellation request to another thread. Depending on its settings, the
++target thread can then either ignore the request, honor it immediately,
++or defer it till it reaches a cancellation point.  When threads are
++first created by @code{pthread_create}, they always defer cancellation
++requests.
++
++When a thread eventually honors a cancellation request, it behaves as if
++@code{pthread_exit(PTHREAD_CANCELED)} was called.  All cleanup handlers
++are executed in reverse order, finalization functions for
++thread-specific data are called, and finally the thread stops executing.
++If the cancelled thread was joinable, the return value
++@code{PTHREAD_CANCELED} is provided to whichever thread calls
++@var{pthread_join} on it. See @code{pthread_exit} for more information.
++
++Cancellation points are the points where the thread checks for pending
++cancellation requests and performs them.  The POSIX threads functions
++@code{pthread_join}, @code{pthread_cond_wait},
++@code{pthread_cond_timedwait}, @code{pthread_testcancel},
++@code{sem_wait}, and @code{sigwait} are cancellation points.  In
++addition, these system calls are cancellation points:
++
++@multitable @columnfractions .33 .33 .33
++@item @t{accept}	@tab @t{open}		@tab @t{sendmsg}
++@item @t{close}		@tab @t{pause}		@tab @t{sendto}
++@item @t{connect}	@tab @t{read}		@tab @t{system}
++@item @t{fcntl}		@tab @t{recv}		@tab @t{tcdrain}
++@item @t{fsync}		@tab @t{recvfrom}	@tab @t{wait}
++@item @t{lseek}		@tab @t{recvmsg}	@tab @t{waitpid}
++@item @t{msync}		@tab @t{send}		@tab @t{write}
++@item @t{nanosleep}
++@end multitable
++
++@noindent
++All library functions that call these functions (such as
++@code{printf}) are also cancellation points.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_setcancelstate (int @var{state}, int *@var{oldstate})
++@code{pthread_setcancelstate} changes the cancellation state for the
++calling thread -- that is, whether cancellation requests are ignored or
++not. The @var{state} argument is the new cancellation state: either
++@code{PTHREAD_CANCEL_ENABLE} to enable cancellation, or
++@code{PTHREAD_CANCEL_DISABLE} to disable cancellation (cancellation
++requests are ignored).
++
++If @var{oldstate} is not @code{NULL}, the previous cancellation state is
++stored in the location pointed to by @var{oldstate}, and can thus be
++restored later by another call to @code{pthread_setcancelstate}.
++
++If the @var{state} argument is not @code{PTHREAD_CANCEL_ENABLE} or
++@code{PTHREAD_CANCEL_DISABLE}, @code{pthread_setcancelstate} fails and
++returns @code{EINVAL}.  Otherwise it returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_setcanceltype (int @var{type}, int *@var{oldtype})
++@code{pthread_setcanceltype} changes the type of responses to
++cancellation requests for the calling thread: asynchronous (immediate)
++or deferred.  The @var{type} argument is the new cancellation type:
++either @code{PTHREAD_CANCEL_ASYNCHRONOUS} to cancel the calling thread
++as soon as the cancellation request is received, or
++@code{PTHREAD_CANCEL_DEFERRED} to keep the cancellation request pending
++until the next cancellation point. If @var{oldtype} is not @code{NULL},
++the previous cancellation state is stored in the location pointed to by
++@var{oldtype}, and can thus be restored later by another call to
++@code{pthread_setcanceltype}.
++
++If the @var{type} argument is not @code{PTHREAD_CANCEL_DEFERRED} or
++@code{PTHREAD_CANCEL_ASYNCHRONOUS}, @code{pthread_setcanceltype} fails
++and returns @code{EINVAL}.  Otherwise it returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun void pthread_testcancel (@var{void})
++@code{pthread_testcancel} does nothing except testing for pending
++cancellation and executing it. Its purpose is to introduce explicit
++checks for cancellation in long sequences of code that do not call
++cancellation point functions otherwise.
++@end deftypefun
++
++@node Cleanup Handlers
++@section Cleanup Handlers
++
++Cleanup handlers are functions that get called when a thread terminates,
++either by calling @code{pthread_exit} or because of
++cancellation. Cleanup handlers are installed and removed following a
++stack-like discipline.
++
++The purpose of cleanup handlers is to free the resources that a thread
++may hold at the time it terminates. In particular, if a thread exits or
++is cancelled while it owns a locked mutex, the mutex will remain locked
++forever and prevent other threads from executing normally. The best way
++to avoid this is, just before locking the mutex, to install a cleanup
++handler whose effect is to unlock the mutex. Cleanup handlers can be
++used similarly to free blocks allocated with @code{malloc} or close file
++descriptors on thread termination.
++
++Here is how to lock a mutex @var{mut} in such a way that it will be
++unlocked if the thread is canceled while @var{mut} is locked:
++
++@smallexample
++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_mutex_unlock(&mut);
++pthread_cleanup_pop(0);
++@end smallexample
++
++Equivalently, the last two lines can be replaced by
++
++@smallexample
++pthread_cleanup_pop(1);
++@end smallexample
++
++Notice that the code above is safe only in deferred cancellation mode
++(see @code{pthread_setcanceltype}). In asynchronous cancellation mode, a
++cancellation can occur between @code{pthread_cleanup_push} and
++@code{pthread_mutex_lock}, or between @code{pthread_mutex_unlock} and
++@code{pthread_cleanup_pop}, resulting in both cases in the thread trying
++to unlock a mutex not locked by the current thread. This is the main
++reason why asynchronous cancellation is difficult to use.
++
++If the code above must also work in asynchronous cancellation mode,
++then it must switch to deferred mode for locking and unlocking the
++mutex:
++
++@smallexample
++pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_cleanup_pop(1);
++pthread_setcanceltype(oldtype, NULL);
++@end smallexample
++
++The code above can be rewritten in a more compact and efficient way,
++using the non-portable functions @code{pthread_cleanup_push_defer_np}
++and @code{pthread_cleanup_pop_restore_np}:
++
++@smallexample
++pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_cleanup_pop_restore_np(1);
++@end smallexample
++
++@comment pthread.h
++@comment POSIX
++@deftypefun void pthread_cleanup_push (void (*@var{routine}) (void *), void *@var{arg})
++
++@code{pthread_cleanup_push} installs the @var{routine} function with
++argument @var{arg} as a cleanup handler. From this point on to the
++matching @code{pthread_cleanup_pop}, the function @var{routine} will be
++called with arguments @var{arg} when the thread terminates, either
++through @code{pthread_exit} or by cancellation. If several cleanup
++handlers are active at that point, they are called in LIFO order: the
++most recently installed handler is called first.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun void pthread_cleanup_pop (int @var{execute})
++@code{pthread_cleanup_pop} removes the most recently installed cleanup
++handler. If the @var{execute} argument is not 0, it also executes the
++handler, by calling the @var{routine} function with arguments
++@var{arg}. If the @var{execute} argument is 0, the handler is only
++removed but not executed.
++@end deftypefun
++
++Matching pairs of @code{pthread_cleanup_push} and
++@code{pthread_cleanup_pop} must occur in the same function, at the same
++level of block nesting.  Actually, @code{pthread_cleanup_push} and
++@code{pthread_cleanup_pop} are macros, and the expansion of
++@code{pthread_cleanup_push} introduces an open brace @code{@{} with the
++matching closing brace @code{@}} being introduced by the expansion of the
++matching @code{pthread_cleanup_pop}.
++
++@comment pthread.h
++@comment GNU
++@deftypefun void pthread_cleanup_push_defer_np (void (*@var{routine}) (void *), void *@var{arg})
++@code{pthread_cleanup_push_defer_np} is a non-portable extension that
++combines @code{pthread_cleanup_push} and @code{pthread_setcanceltype}.
++It pushes a cleanup handler just as @code{pthread_cleanup_push} does,
++but also saves the current cancellation type and sets it to deferred
++cancellation. This ensures that the cleanup mechanism is effective even
++if the thread was initially in asynchronous cancellation mode.
++@end deftypefun
++
++@comment pthread.h
++@comment GNU
++@deftypefun void pthread_cleanup_pop_restore_np (int @var{execute})
++@code{pthread_cleanup_pop_restore_np} pops a cleanup handler introduced
++by @code{pthread_cleanup_push_defer_np}, and restores the cancellation
++type to its value at the time @code{pthread_cleanup_push_defer_np} was
++called.
++@end deftypefun
++
++@code{pthread_cleanup_push_defer_np} and
++@code{pthread_cleanup_pop_restore_np} must occur in matching pairs, at
++the same level of block nesting.
++
++The sequence
++
++@smallexample
++pthread_cleanup_push_defer_np(routine, arg);
++...
++pthread_cleanup_pop_defer_np(execute);
++@end smallexample
++
++@noindent
++is functionally equivalent to (but more compact and efficient than)
++
++@smallexample
++@{
++  int oldtype;
++  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
++  pthread_cleanup_push(routine, arg);
++  ...
++  pthread_cleanup_pop(execute);
++  pthread_setcanceltype(oldtype, NULL);
++@}
++@end smallexample
++
++
++@node Mutexes
++@section Mutexes
++
++A mutex is a MUTual EXclusion device, and is useful for protecting
++shared data structures from concurrent modifications, and implementing
++critical sections and monitors.
++
++A mutex has two possible states: unlocked (not owned by any thread),
++and locked (owned by one thread). A mutex can never be owned by two
++different threads simultaneously. A thread attempting to lock a mutex
++that is already locked by another thread is suspended until the owning
++thread unlocks the mutex first.
++
++None of the mutex functions is a cancellation point, not even
++@code{pthread_mutex_lock}, in spite of the fact that it can suspend a
++thread for arbitrary durations. This way, the status of mutexes at
++cancellation points is predictable, allowing cancellation handlers to
++unlock precisely those mutexes that need to be unlocked before the
++thread stops executing. Consequently, threads using deferred
++cancellation should never hold a mutex for extended periods of time.
++
++It is not safe to call mutex functions from a signal handler.  In
++particular, calling @code{pthread_mutex_lock} or
++@code{pthread_mutex_unlock} from a signal handler may deadlock the
++calling thread.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutex_init (pthread_mutex_t *@var{mutex}, const pthread_mutexattr_t *@var{mutexattr})
++
++@code{pthread_mutex_init} initializes the mutex object pointed to by
++@var{mutex} according to the mutex attributes specified in @var{mutexattr}.
++If @var{mutexattr} is @code{NULL}, default attributes are used instead.
++
++The LinuxThreads implementation supports only one mutex attribute,
++the @var{mutex kind}, which is either ``fast'', ``recursive'', or
++``error checking''. The kind of a mutex determines whether
++it can be locked again by a thread that already owns it.
++The default kind is ``fast''.
++
++Variables of type @code{pthread_mutex_t} can also be initialized
++statically, using the constants @code{PTHREAD_MUTEX_INITIALIZER} (for
++fast mutexes), @code{PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} (for
++recursive mutexes), and @code{PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP}
++(for error checking mutexes).
++
++@code{pthread_mutex_init} always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutex_lock (pthread_mutex_t *mutex))
++@code{pthread_mutex_lock} locks the given mutex. If the mutex is
++currently unlocked, it becomes locked and owned by the calling thread,
++and @code{pthread_mutex_lock} returns immediately. If the mutex is
++already locked by another thread, @code{pthread_mutex_lock} suspends the
++calling thread until the mutex is unlocked.
++
++If the mutex is already locked by the calling thread, the behavior of
++@code{pthread_mutex_lock} depends on the kind of the mutex. If the mutex
++is of the ``fast'' kind, the calling thread is suspended.  It will
++remain suspended forever, because no other thread can unlock the mutex.
++If  the mutex is of the ``error checking'' kind, @code{pthread_mutex_lock}
++returns immediately with the error code @code{EDEADLK}.  If the mutex is
++of the ``recursive'' kind, @code{pthread_mutex_lock} succeeds and
++returns immediately, recording the number of times the calling thread
++has locked the mutex. An equal number of @code{pthread_mutex_unlock}
++operations must be performed before the mutex returns to the unlocked
++state.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutex_trylock (pthread_mutex_t *@var{mutex})
++@code{pthread_mutex_trylock} behaves identically to
++@code{pthread_mutex_lock}, except that it does not block the calling
++thread if the mutex is already locked by another thread (or by the
++calling thread in the case of a ``fast'' mutex). Instead,
++@code{pthread_mutex_trylock} returns immediately with the error code
++@code{EBUSY}.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutex_unlock (pthread_mutex_t *@var{mutex})
++@code{pthread_mutex_unlock} unlocks the given mutex. The mutex is
++assumed to be locked and owned by the calling thread on entrance to
++@code{pthread_mutex_unlock}. If the mutex is of the ``fast'' kind,
++@code{pthread_mutex_unlock} always returns it to the unlocked state. If
++it is of the ``recursive'' kind, it decrements the locking count of the
++mutex (number of @code{pthread_mutex_lock} operations performed on it by
++the calling thread), and only when this count reaches zero is the mutex
++actually unlocked.
++
++On ``error checking'' mutexes, @code{pthread_mutex_unlock} actually
++checks at run-time that the mutex is locked on entrance, and that it was
++locked by the same thread that is now calling
++@code{pthread_mutex_unlock}.  If these conditions are not met,
++@code{pthread_mutex_unlock} returns @code{EPERM}, and the mutex remains
++unchanged.  ``Fast'' and ``recursive'' mutexes perform no such checks,
++thus allowing a locked mutex to be unlocked by a thread other than its
++owner. This is non-portable behavior and must not be relied upon.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutex_destroy (pthread_mutex_t *@var{mutex})
++@code{pthread_mutex_destroy} destroys a mutex object, freeing the
++resources it might hold. The mutex must be unlocked on entrance. In the
++LinuxThreads implementation, no resources are associated with mutex
++objects, thus @code{pthread_mutex_destroy} actually does nothing except
++checking that the mutex is unlocked.
++
++If the mutex is locked by some thread, @code{pthread_mutex_destroy}
++returns @code{EBUSY}.  Otherwise it returns 0.
++@end deftypefun
++
++If any of the above functions (except @code{pthread_mutex_init})
++is applied to an uninitialized mutex, they will simply return
++@code{EINVAL} and do nothing.
++
++A shared global variable @var{x} can be protected by a mutex as follows:
++
++@smallexample
++int x;
++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
++@end smallexample
++
++All accesses and modifications to @var{x} should be bracketed by calls to
++@code{pthread_mutex_lock} and @code{pthread_mutex_unlock} as follows:
++
++@smallexample
++pthread_mutex_lock(&mut);
++/* operate on x */
++pthread_mutex_unlock(&mut);
++@end smallexample
++
++Mutex attributes can be specified at mutex creation time, by passing a
++mutex attribute object as second argument to @code{pthread_mutex_init}.
++Passing @code{NULL} is equivalent to passing a mutex attribute object
++with all attributes set to their default values.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutexattr_init (pthread_mutexattr_t *@var{attr})
++@code{pthread_mutexattr_init} initializes the mutex attribute object
++@var{attr} and fills it with default values for the attributes.
++
++This function always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_mutexattr_destroy (pthread_mutexattr_t *@var{attr})
++@code{pthread_mutexattr_destroy} destroys a mutex attribute object,
++which must not be reused until it is
++reinitialized. @code{pthread_mutexattr_destroy} does nothing in the
++LinuxThreads implementation.
++
++This function always returns 0.
++@end deftypefun
++
++LinuxThreads supports only one mutex attribute: the mutex kind, which is
++either @code{PTHREAD_MUTEX_FAST_NP} for ``fast'' mutexes,
++@code{PTHREAD_MUTEX_RECURSIVE_NP} for ``recursive'' mutexes, or
++@code{PTHREAD_MUTEX_ERRORCHECK_NP} for ``error checking'' mutexes.  As
++the @code{NP} suffix indicates, this is a non-portable extension to the
++POSIX standard and should not be employed in portable programs.
++
++The mutex kind determines what happens if a thread attempts to lock a
++mutex it already owns with @code{pthread_mutex_lock}. If the mutex is of
++the ``fast'' kind, @code{pthread_mutex_lock} simply suspends the calling
++thread forever.  If the mutex is of the ``error checking'' kind,
++@code{pthread_mutex_lock} returns immediately with the error code
++@code{EDEADLK}.  If the mutex is of the ``recursive'' kind, the call to
++@code{pthread_mutex_lock} returns immediately with a success return
++code. The number of times the thread owning the mutex has locked it is
++recorded in the mutex. The owning thread must call
++@code{pthread_mutex_unlock} the same number of times before the mutex
++returns to the unlocked state.
++
++The default mutex kind is ``fast'', that is, @code{PTHREAD_MUTEX_FAST_NP}.
++
++@comment pthread.h
++@comment GNU
++@deftypefun int pthread_mutexattr_setkind_np (pthread_mutexattr_t *@var{attr}, int @var{kind})
++@code{pthread_mutexattr_setkind_np} sets the mutex kind attribute in
++@var{attr} to the value specified by @var{kind}.
++
++If @var{kind} is not @code{PTHREAD_MUTEX_FAST_NP},
++@code{PTHREAD_MUTEX_RECURSIVE_NP}, or
++@code{PTHREAD_MUTEX_ERRORCHECK_NP}, this function will return
++@code{EINVAL} and leave @var{attr} unchanged.
++@end deftypefun
++
++@comment pthread.h
++@comment GNU
++@deftypefun int pthread_mutexattr_getkind_np (const pthread_mutexattr_t *@var{attr}, int *@var{kind})
++@code{pthread_mutexattr_getkind_np} retrieves the current value of the
++mutex kind attribute in @var{attr} and stores it in the location pointed
++to by @var{kind}.
++
++This function always returns 0.
++@end deftypefun
++
++@node Condition Variables
++@section Condition Variables
++
++A condition (short for ``condition variable'') is a synchronization
++device that allows threads to suspend execution until some predicate on
++shared data is satisfied. The basic operations on conditions are: signal
++the condition (when the predicate becomes true), and wait for the
++condition, suspending the thread execution until another thread signals
++the condition.
++
++A condition variable must always be associated with a mutex, to avoid
++the race condition where a thread prepares to wait on a condition
++variable and another thread signals the condition just before the first
++thread actually waits on it.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_init (pthread_cond_t *@var{cond}, pthread_condattr_t *cond_@var{attr})
++
++@code{pthread_cond_init} initializes the condition variable @var{cond},
++using the condition attributes specified in @var{cond_attr}, or default
++attributes if @var{cond_attr} is @code{NULL}. The LinuxThreads
++implementation supports no attributes for conditions, hence the
++@var{cond_attr} parameter is actually ignored.
++
++Variables of type @code{pthread_cond_t} can also be initialized
++statically, using the constant @code{PTHREAD_COND_INITIALIZER}.
++
++This function always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_signal (pthread_cond_t *@var{cond})
++@code{pthread_cond_signal} restarts one of the threads that are waiting
++on the condition variable @var{cond}. If no threads are waiting on
++@var{cond}, nothing happens. If several threads are waiting on
++@var{cond}, exactly one is restarted, but it is not specified which.
++
++This function always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_broadcast (pthread_cond_t *@var{cond})
++@code{pthread_cond_broadcast} restarts all the threads that are waiting
++on the condition variable @var{cond}. Nothing happens if no threads are
++waiting on @var{cond}.
++
++This function always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_wait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex})
++@code{pthread_cond_wait} atomically unlocks the @var{mutex} (as per
++@code{pthread_unlock_mutex}) and waits for the condition variable
++@var{cond} to be signaled. The thread execution is suspended and does
++not consume any CPU time until the condition variable is signaled. The
++@var{mutex} must be locked by the calling thread on entrance to
++@code{pthread_cond_wait}. Before returning to the calling thread,
++@code{pthread_cond_wait} re-acquires @var{mutex} (as per
++@code{pthread_lock_mutex}).
++
++Unlocking the mutex and suspending on the condition variable is done
++atomically. Thus, if all threads always acquire the mutex before
++signaling the condition, this guarantees that the condition cannot be
++signaled (and thus ignored) between the time a thread locks the mutex
++and the time it waits on the condition variable.
++
++This function always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_timedwait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime})
++@code{pthread_cond_timedwait} atomically unlocks @var{mutex} and waits
++on @var{cond}, as @code{pthread_cond_wait} does, but it also bounds the
++duration of the wait. If @var{cond} has not been signaled before time
++@var{abstime}, the mutex @var{mutex} is re-acquired and
++@code{pthread_cond_timedwait} returns the error code @code{ETIMEDOUT}.
++The wait can also be interrupted by a signal; in that case
++@code{pthread_cond_timedwait} returns @code{EINTR}.
++
++The @var{abstime} parameter specifies an absolute time, with the same
++origin as @code{time} and @code{gettimeofday}: an @var{abstime} of 0
++corresponds to 00:00:00 GMT, January 1, 1970.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_cond_destroy (pthread_cond_t *@var{cond})
++@code{pthread_cond_destroy} destroys the condition variable @var{cond},
++freeing the resources it might hold.  If any threads are waiting on the
++condition variable, @code{pthread_cond_destroy} leaves @var{cond}
++untouched and returns @code{EBUSY}.  Otherwise it returns 0, and
++@var{cond} must not be used again until it is reinitialized.
++
++In the LinuxThreads implementation, no resources are associated with
++condition variables, so @code{pthread_cond_destroy} actually does
++nothing.
++@end deftypefun
++
++@code{pthread_cond_wait} and @code{pthread_cond_timedwait} are
++cancellation points. If a thread is cancelled while suspended in one of
++these functions, the thread immediately resumes execution, relocks the
++mutex specified by  @var{mutex}, and finally executes the cancellation.
++Consequently, cleanup handlers are assured that @var{mutex} is locked
++when they are called.
++
++It is not safe to call the condition variable functions from a signal
++handler. In particular, calling @code{pthread_cond_signal} or
++@code{pthread_cond_broadcast} from a signal handler may deadlock the
++calling thread.
++
++Consider two shared variables @var{x} and @var{y}, protected by the
++mutex @var{mut}, and a condition variable @var{cond} that is to be
++signaled whenever @var{x} becomes greater than @var{y}.
++
++@smallexample
++int x,y;
++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
++pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
++@end smallexample
++
++Waiting until @var{x} is greater than @var{y} is performed as follows:
++
++@smallexample
++pthread_mutex_lock(&mut);
++while (x <= y) @{
++        pthread_cond_wait(&cond, &mut);
++@}
++/* operate on x and y */
++pthread_mutex_unlock(&mut);
++@end smallexample
++
++Modifications on @var{x} and @var{y} that may cause @var{x} to become greater than
++@var{y} should signal the condition if needed:
++
++@smallexample
++pthread_mutex_lock(&mut);
++/* modify x and y */
++if (x > y) pthread_cond_broadcast(&cond);
++pthread_mutex_unlock(&mut);
++@end smallexample
++
++If it can be proved that at most one waiting thread needs to be waken
++up (for instance, if there are only two threads communicating through
++@var{x} and @var{y}), @code{pthread_cond_signal} can be used as a slightly more
++efficient alternative to @code{pthread_cond_broadcast}. In doubt, use
++@code{pthread_cond_broadcast}.
++
++To wait for @var{x} to becomes greater than @var{y} with a timeout of 5
++seconds, do:
++
++@smallexample
++struct timeval now;
++struct timespec timeout;
++int retcode;
++
++pthread_mutex_lock(&mut);
++gettimeofday(&now);
++timeout.tv_sec = now.tv_sec + 5;
++timeout.tv_nsec = now.tv_usec * 1000;
++retcode = 0;
++while (x <= y && retcode != ETIMEDOUT) @{
++        retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
++@}
++if (retcode == ETIMEDOUT) @{
++        /* timeout occurred */
++@} else @{
++        /* operate on x and y */
++@}
++pthread_mutex_unlock(&mut);
++@end smallexample
++
++Condition attributes can be specified at condition creation time, by
++passing a condition attribute object as second argument to
++@code{pthread_cond_init}.  Passing @code{NULL} is equivalent to passing
++a condition attribute object with all attributes set to their default
++values.
++
++The LinuxThreads implementation supports no attributes for
++conditions. The functions on condition attributes are included only for
++compliance with the POSIX standard.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_condattr_init (pthread_condattr_t *@var{attr})
++@deftypefunx int pthread_condattr_destroy (pthread_condattr_t *@var{attr})
++@code{pthread_condattr_init} initializes the condition attribute object
++@var{attr} and fills it with default values for the attributes.
++@code{pthread_condattr_destroy} destroys the condition attribute object
++@var{attr}.
++
++Both functions do nothing in the LinuxThreads implementation.
++
++@code{pthread_condattr_init} and @code{pthread_condattr_destroy} always
++return 0.
++@end deftypefun
++
++@node POSIX Semaphores
++@section POSIX Semaphores
++
++@vindex SEM_VALUE_MAX
++Semaphores are counters for resources shared between threads. The
++basic operations on semaphores are: increment the counter atomically,
++and wait until the counter is non-null and decrement it atomically.
++
++Semaphores have a maximum value past which they cannot be incremented.
++The macro @code{SEM_VALUE_MAX} is defined to be this maximum value.  In
++the GNU C library, @code{SEM_VALUE_MAX} is equal to @code{INT_MAX}
++(@pxref{Range of Type}), but it may be much smaller on other systems.
++
++The pthreads library implements POSIX 1003.1b semaphores.  These should
++not be confused with System V semaphores (@code{ipc}, @code{semctl} and
++@code{semop}).
++@c !!! SysV IPC is not doc'd at all in our manual
++
++All the semaphore functions and macros are defined in @file{semaphore.h}.
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value})
++@code{sem_init} initializes the semaphore object pointed to by
++@var{sem}. The count associated with the semaphore is set initially to
++@var{value}. The @var{pshared} argument indicates whether the semaphore
++is local to the current process (@var{pshared} is zero) or is to be
++shared between several processes (@var{pshared} is not zero).
++
++On success @code{sem_init} returns 0.  On failure it returns -1 and sets
++@var{errno} to one of the following values:
++
++@table @code
++@item EINVAL
++@var{value} exceeds the maximal counter value @code{SEM_VALUE_MAX}
++
++@item ENOSYS
++@var{pshared} is not zero.  LinuxThreads currently does not support
++process-shared semaphores.  (This will eventually change.)
++@end table
++@end deftypefun
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_destroy (sem_t * @var{sem})
++@code{sem_destroy} destroys a semaphore object, freeing the resources it
++might hold.  If any threads are waiting on the semaphore when
++@code{sem_destroy} is called, it fails and sets @var{errno} to
++@code{EBUSY}.
++
++In the LinuxThreads implementation, no resources are associated with
++semaphore objects, thus @code{sem_destroy} actually does nothing except
++checking that no thread is waiting on the semaphore.  This will change
++when process-shared semaphores are implemented.
++@end deftypefun
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_wait (sem_t * @var{sem})
++@code{sem_wait} suspends the calling thread until the semaphore pointed
++to by @var{sem} has non-zero count. It then atomically decreases the
++semaphore count.
++
++@code{sem_wait} is a cancellation point.  It always returns 0.
++@end deftypefun
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_trywait (sem_t * @var{sem})
++@code{sem_trywait} is a non-blocking variant of @code{sem_wait}. If the
++semaphore pointed to by @var{sem} has non-zero count, the count is
++atomically decreased and @code{sem_trywait} immediately returns 0.  If
++the semaphore count is zero, @code{sem_trywait} immediately returns -1
++and sets errno to @code{EAGAIN}.
++@end deftypefun
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_post (sem_t * @var{sem})
++@code{sem_post} atomically increases the count of the semaphore pointed to
++by @var{sem}. This function never blocks.
++
++@c !!! This para appears not to agree with the code.
++On processors supporting atomic compare-and-swap (Intel 486, Pentium and
++later, Alpha, PowerPC, MIPS II, Motorola 68k, Ultrasparc), the
++@code{sem_post} function is can safely be called from signal handlers.
++This is the only thread synchronization function provided by POSIX
++threads that is async-signal safe.  On the Intel 386 and earlier Sparc
++chips, the current LinuxThreads implementation of @code{sem_post} is not
++async-signal safe, because the hardware does not support the required
++atomic operations.
++
++@code{sem_post} always succeeds and returns 0, unless the semaphore
++count would exceed @code{SEM_VALUE_MAX} after being incremented.  In
++that case @code{sem_post} returns -1 and sets @var{errno} to
++@code{EINVAL}.  The semaphore count is left unchanged.
++@end deftypefun
++
++@comment semaphore.h
++@comment POSIX
++@deftypefun int sem_getvalue (sem_t * @var{sem}, int * @var{sval})
++@code{sem_getvalue} stores in the location pointed to by @var{sval} the
++current count of the semaphore @var{sem}.  It always returns 0.
++@end deftypefun
++
++@node Thread-Specific Data
++@section Thread-Specific Data
++
++Programs often need global or static variables that have different
++values in different threads. Since threads share one memory space, this
++cannot be achieved with regular variables. Thread-specific data is the
++POSIX threads answer to this need.
++
++Each thread possesses a private memory block, the thread-specific data
++area, or TSD area for short. This area is indexed by TSD keys. The TSD
++area associates values of type @code{void *} to TSD keys. TSD keys are
++common to all threads, but the value associated with a given TSD key can
++be different in each thread.
++
++For concreteness, the TSD areas can be viewed as arrays of @code{void *}
++pointers, TSD keys as integer indices into these arrays, and the value
++of a TSD key as the value of the corresponding array element in the
++calling thread.
++
++When a thread is created, its TSD area initially associates @code{NULL}
++with all keys.
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_key_create (pthread_key_t *@var{key}, void (*destr_function) (void *))
++@code{pthread_key_create} allocates a new TSD key. The key is stored in
++the location pointed to by @var{key}. There is a limit of
++@code{PTHREAD_KEYS_MAX} on the number of keys allocated at a given
++time. The value initially associated with the returned key is
++@code{NULL} in all currently executing threads.
++
++The @var{destr_function} argument, if not @code{NULL}, specifies a
++destructor function associated with the key. When a thread terminates
++via @code{pthread_exit} or by cancellation, @var{destr_function} is
++called on the value associated with the key in that thread. The
++@var{destr_function} is not called if a key is deleted with
++@code{pthread_key_delete} or a value is changed with
++@code{pthread_setspecific}.  The order in which destructor functions are
++called at thread termination time is unspecified.
++
++Before the destructor function is called, the @code{NULL} value is
++associated with the key in the current thread.  A destructor function
++might, however, re-associate non-@code{NULL} values to that key or some
++other key.  To deal with this, if after all the destructors have been
++called for all non-@code{NULL} values, there are still some
++non-@code{NULL} values with associated destructors, then the process is
++repeated.  The LinuxThreads implementation stops the process after
++@code{PTHREAD_DESTRUCTOR_ITERATIONS} iterations, even if some
++non-@code{NULL} values with associated descriptors remain.  Other
++implementations may loop indefinitely.
++
++@code{pthread_key_create} returns 0 unless @code{PTHREAD_KEYS_MAX} keys
++have already been allocated, in which case it fails and returns
++@code{EAGAIN}.
++@end deftypefun
++
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_key_delete (pthread_key_t @var{key})
++@code{pthread_key_delete} deallocates a TSD key. It does not check
++whether non-@code{NULL} values are associated with that key in the
++currently executing threads, nor call the destructor function associated
++with the key.
++
++If there is no such key @var{key}, it returns @code{EINVAL}.  Otherwise
++it returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_setspecific (pthread_key_t @var{key}, const void *@var{pointer})
++@code{pthread_setspecific} changes the value associated with @var{key}
++in the calling thread, storing the given @var{pointer} instead.
++
++If there is no such key @var{key}, it returns @code{EINVAL}.  Otherwise
++it returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun {void *} pthread_getspecific (pthread_key_t @var{key})
++@code{pthread_getspecific} returns the value currently associated with
++@var{key} in the calling thread.
++
++If there is no such key @var{key}, it returns @code{NULL}.
++@end deftypefun
++
++The following code fragment allocates a thread-specific array of 100
++characters, with automatic reclaimation at thread exit:
++
++@smallexample
++/* Key for the thread-specific buffer */
++static pthread_key_t buffer_key;
++
++/* Once-only initialisation of the key */
++static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
++
++/* Allocate the thread-specific buffer */
++void buffer_alloc(void)
++@{
++  pthread_once(&buffer_key_once, buffer_key_alloc);
++  pthread_setspecific(buffer_key, malloc(100));
++@}
++
++/* Return the thread-specific buffer */
++char * get_buffer(void)
++@{
++  return (char *) pthread_getspecific(buffer_key);
++@}
++
++/* Allocate the key */
++static void buffer_key_alloc()
++@{
++  pthread_key_create(&buffer_key, buffer_destroy);
++@}
++
++/* Free the thread-specific buffer */
++static void buffer_destroy(void * buf)
++@{
++  free(buf);
++@}
++@end smallexample
++
++@node Threads and Signal Handling
++@section Threads and Signal Handling
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_sigmask (int @var{how}, const sigset_t *@var{newmask}, sigset_t *@var{oldmask})
++@code{pthread_sigmask} changes the signal mask for the calling thread as
++described by the @var{how} and @var{newmask} arguments. If @var{oldmask}
++is not @code{NULL}, the previous signal mask is stored in the location
++pointed to by @var{oldmask}.
++
++The meaning of the @var{how} and @var{newmask} arguments is the same as
++for @code{sigprocmask}. If @var{how} is @code{SIG_SETMASK}, the signal
++mask is set to @var{newmask}. If @var{how} is @code{SIG_BLOCK}, the
++signals specified to @var{newmask} are added to the current signal mask.
++If @var{how} is @code{SIG_UNBLOCK}, the signals specified to
++@var{newmask} are removed from the current signal mask.
++
++Recall that signal masks are set on a per-thread basis, but signal
++actions and signal handlers, as set with @code{sigaction}, are shared
++between all threads.
++
++The @code{pthread_sigmask} function returns 0 on success, and one of the
++following error codes on error:
++@table @code
++@item EINVAL
++@var{how} is not one of @code{SIG_SETMASK}, @code{SIG_BLOCK}, or @code{SIG_UNBLOCK}
++
++@item EFAULT
++@var{newmask} or @var{oldmask} point to invalid addresses
++@end table
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_kill (pthread_t @var{thread}, int @var{signo})
++@code{pthread_kill} sends signal number @var{signo} to the thread
++@var{thread}.  The signal is delivered and handled as described in
++@ref{Signal Handling}.
++
++@code{pthread_kill} returns 0 on success, one of the following error codes
++on error:
++@table @code
++@item EINVAL
++@var{signo} is not a valid signal number
++
++@item ESRCH
++The thread @var{thread} does not exist (e.g. it has already terminated)
++@end table
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int sigwait (const sigset_t *@var{set}, int *@var{sig})
++@code{sigwait} suspends the calling thread until one of the signals in
++@var{set} is delivered to the calling thread. It then stores the number
++of the signal received in the location pointed to by @var{sig} and
++returns. The signals in @var{set} must be blocked and not ignored on
++entrance to @code{sigwait}. If the delivered signal has a signal handler
++function attached, that function is @emph{not} called.
++
++@code{sigwait} is a cancellation point.  It always returns 0.
++@end deftypefun
++
++For @code{sigwait} to work reliably, the signals being waited for must be
++blocked in all threads, not only in the calling thread, since
++otherwise the POSIX semantics for signal delivery do not guarantee
++that it's the thread doing the @code{sigwait} that will receive the signal.
++The best way to achieve this is block those signals before any threads
++are created, and never unblock them in the program other than by
++calling @code{sigwait}.
++
++Signal handling in LinuxThreads departs significantly from the POSIX
++standard. According to the standard, ``asynchronous'' (external) signals
++are addressed to the whole process (the collection of all threads),
++which then delivers them to one particular thread. The thread that
++actually receives the signal is any thread that does not currently block
++the signal.
++
++In LinuxThreads, each thread is actually a kernel process with its own
++PID, so external signals are always directed to one particular thread.
++If, for instance, another thread is blocked in @code{sigwait} on that
++signal, it will not be restarted.
++
++The LinuxThreads implementation of @code{sigwait} installs dummy signal
++handlers for the signals in @var{set} for the duration of the
++wait. Since signal handlers are shared between all threads, other
++threads must not attach their own signal handlers to these signals, or
++alternatively they should all block these signals (which is recommended
++anyway).
++
++@node Miscellaneous Thread Functions
++@section Miscellaneous Thread Functions
++
++@comment pthread.h
++@comment POSIX
++@deftypefun {pthread_t} pthread_self (@var{void})
++@code{pthread_self} returns the thread identifier for the calling thread.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_equal (pthread_t thread1, pthread_t thread2)
++@code{pthread_equal} determines if two thread identifiers refer to the same
++thread.
++
++A non-zero value is returned if @var{thread1} and @var{thread2} refer to
++the same thread. Otherwise, 0 is returned.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_detach (pthread_t @var{th})
++@code{pthread_detach} puts the thread @var{th} in the detached
++state. This guarantees that the memory resources consumed by @var{th}
++will be freed immediately when @var{th} terminates. However, this
++prevents other threads from synchronizing on the termination of @var{th}
++using @code{pthread_join}.
++
++A thread can be created initially in the detached state, using the
++@code{detachstate} attribute to @code{pthread_create}. In contrast,
++@code{pthread_detach} applies to threads created in the joinable state,
++and which need to be put in the detached state later.
++
++After @code{pthread_detach} completes, subsequent attempts to perform
++@code{pthread_join} on @var{th} will fail. If another thread is already
++joining the thread @var{th} at the time @code{pthread_detach} is called,
++@code{pthread_detach} does nothing and leaves @var{th} in the joinable
++state.
++
++On success, 0 is returned. On error, one of the following codes is
++returned:
++@table @code
++@item ESRCH
++No thread could be found corresponding to that specified by @var{th}
++@item EINVAL
++The thread @var{th} is already in the detached state
++@end table
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_atfork (void (*@var{prepare})(void), void (*@var{parent})(void), void (*@var{child})(void))
++
++@code{pthread_atfork} registers handler functions to be called just
++before and just after a new process is created with @code{fork}. The
++@var{prepare} handler will be called from the parent process, just
++before the new process is created. The @var{parent} handler will be
++called from the parent process, just before @code{fork} returns. The
++@var{child} handler will be called from the child process, just before
++@code{fork} returns.
++
++@code{pthread_atfork} returns 0 on success and a non-zero error code on
++error.
++
++One or more of the three handlers @var{prepare}, @var{parent} and
++@var{child} can be given as @code{NULL}, meaning that no handler needs
++to be called at the corresponding point.
++
++@code{pthread_atfork} can be called several times to install several
++sets of handlers. At @code{fork} time, the @var{prepare} handlers are
++called in LIFO order (last added with @code{pthread_atfork}, first
++called before @code{fork}), while the @var{parent} and @var{child}
++handlers are called in FIFO order (first added, first called).
++
++If there is insufficient memory available to register the handlers,
++@code{pthread_atfork} fails and returns @code{ENOMEM}.  Otherwise it
++returns 0.
++@end deftypefun
++
++To understand the purpose of @code{pthread_atfork}, recall that
++@code{fork} duplicates the whole memory space, including mutexes in
++their current locking state, but only the calling thread: other threads
++are not running in the child process. Thus, if a mutex is locked by a
++thread other than the thread calling @code{fork}, that mutex will remain
++locked forever in the child process, possibly blocking the execution of
++the child process. To avoid this, install handlers with
++@code{pthread_atfork} as follows: the @var{prepare} handler locks the
++global mutexes (in locking order), and the @var{parent} and @var{child}
++handlers unlock them (in reverse order). Alternatively, @var{prepare}
++and @var{parent} can be set to @code{NULL} and @var{child} to a function
++that calls @code{pthread_mutex_init} on the global mutexes.
++
++@comment pthread.h
++@comment GNU
++@deftypefun void pthread_kill_other_threads_np (@var{void})
++@code{pthread_kill_other_threads_np} is a non-portable LinuxThreads extension.
++It causes all threads in the program to terminate immediately, except
++the calling thread which proceeds normally. It is intended to be
++called just before a thread calls one of the @code{exec} functions,
++e.g. @code{execve}.
++
++Termination of the other threads is not performed through
++@code{pthread_cancel} and completely bypasses the cancellation
++mechanism. Hence, the current settings for cancellation state and
++cancellation type are ignored, and the cleanup handlers are not
++executed in the terminated threads.
++
++According to POSIX 1003.1c, a successful @code{exec*} in one of the
++threads should automatically terminate all other threads in the program.
++This behavior is not yet implemented in LinuxThreads.  Calling
++@code{pthread_kill_other_threads_np} before @code{exec*} achieves much
++of the same behavior, except that if @code{exec*} ultimately fails, then
++all other threads are already killed.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_once (pthread_once_t *once_@var{control}, void (*@var{init_routine}) (void))
++
++The purpose of @code{pthread_once} is to ensure that a piece of
++initialization code is executed at most once. The @var{once_control}
++argument points to a static or extern variable statically initialized
++to @code{PTHREAD_ONCE_INIT}.
++
++The first time @code{pthread_once} is called with a given
++@var{once_control} argument, it calls @var{init_routine} with no
++argument and changes the value of the @var{once_control} variable to
++record that initialization has been performed. Subsequent calls to
++@code{pthread_once} with the same @code{once_control} argument do
++nothing.
++
++@code{pthread_once} always returns 0.
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_setschedparam (pthread_t target_@var{thread}, int @var{policy}, const struct sched_param *@var{param})
++
++@code{pthread_setschedparam} sets the scheduling parameters for the
++thread @var{target_thread} as indicated by @var{policy} and
++@var{param}. @var{policy} can be either @code{SCHED_OTHER} (regular,
++non-realtime scheduling), @code{SCHED_RR} (realtime, round-robin) or
++@code{SCHED_FIFO} (realtime, first-in first-out). @var{param} specifies
++the scheduling priority for the two realtime policies.  See
++@code{sched_setpolicy} for more information on scheduling policies.
++
++The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO}
++are available only to processes with superuser privileges.
++
++On success, @code{pthread_setschedparam} returns 0.  On error it returns
++one of the following codes:
++@table @code
++@item EINVAL
++@var{policy} is not one of @code{SCHED_OTHER}, @code{SCHED_RR},
++@code{SCHED_FIFO}, or the priority value specified by @var{param} is not
++valid for the specified policy
++
++@item EPERM
++Realtime scheduling was requested but the calling process does not have
++sufficient privileges.
++
++@item ESRCH
++The @var{target_thread} is invalid or has already terminated
++
++@item EFAULT
++@var{param} points outside the process memory space
++@end table
++@end deftypefun
++
++@comment pthread.h
++@comment POSIX
++@deftypefun int pthread_getschedparam (pthread_t target_@var{thread}, int *@var{policy}, struct sched_param *@var{param})
++
++@code{pthread_getschedparam} retrieves the scheduling policy and
++scheduling parameters for the thread @var{target_thread} and stores them
++in the locations pointed to by @var{policy} and @var{param},
++respectively.
++
++@code{pthread_getschedparam} returns 0 on success, or one of the
++following error codes on failure:
++@table @code
++@item ESRCH
++The @var{target_thread} is invalid or has already terminated.
++
++@item EFAULT
++@var{policy} or @var{param} point outside the process memory space.
++
++@end table
++@end deftypefun
+diff -Naur ../glibc-2.1.3/linuxthreads/lockfile.c glibc-2.1.3/linuxthreads/lockfile.c
+--- ../glibc-2.1.3/linuxthreads/lockfile.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/lockfile.c	1999-12-27 08:10:10.000000000 -0800
+@@ -0,0 +1,88 @@
++/* lockfile - Handle locking and unlocking of stream.
++   Copyright (C) 1996, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <bits/libc-lock.h>
++#include <stdio.h>
++#include <pthread.h>
++
++#ifdef USE_IN_LIBIO
++#include "../libio/libioP.h"
++#endif
++
++void
++__flockfile (FILE *stream)
++{
++#ifdef USE_IN_LIBIO
++  __pthread_mutex_lock (stream->_lock);
++#else
++#endif
++}
++#ifdef USE_IN_LIBIO
++#undef _IO_flockfile
++strong_alias (__flockfile, _IO_flockfile)
++#endif
++weak_alias (__flockfile, flockfile);
++
++
++void
++__funlockfile (FILE *stream)
++{
++#ifdef USE_IN_LIBIO
++  __pthread_mutex_unlock (stream->_lock);
++#else
++#endif
++}
++#ifdef USE_IN_LIBIO
++#undef _IO_funlockfile
++strong_alias (__funlockfile, _IO_funlockfile)
++#endif
++weak_alias (__funlockfile, funlockfile);
++
++
++int
++__ftrylockfile (FILE *stream)
++{
++#ifdef USE_IN_LIBIO
++  return __pthread_mutex_trylock (stream->_lock);
++#else
++#endif
++}
++#ifdef USE_IN_LIBIO
++strong_alias (__ftrylockfile, _IO_ftrylockfile)
++#endif
++weak_alias (__ftrylockfile, ftrylockfile);
++
++
++void
++__fresetlockfiles (void)
++{
++#ifdef USE_IN_LIBIO
++  _IO_FILE *fp;
++  pthread_mutexattr_t attr;
++
++  __pthread_mutexattr_init (&attr);
++  __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE_NP);
++
++  for (fp = _IO_list_all; fp != NULL; fp = fp->_chain)
++      if (fp->_lock)
++	  __pthread_mutex_init (fp->_lock, &attr);
++
++  __pthread_mutexattr_destroy (&attr);
++#endif
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/man/Makefile glibc-2.1.3/linuxthreads/man/Makefile
+--- ../glibc-2.1.3/linuxthreads/man/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/Makefile	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,31 @@
++SOURCES=pthread_atfork.man pthread_attr_init.man pthread_cancel.man \
++  pthread_cleanup_push.man pthread_cond_init.man \
++  pthread_condattr_init.man pthread_create.man pthread_detach.man \
++  pthread_equal.man pthread_exit.man pthread_join.man \
++  pthread_key_create.man pthread_mutex_init.man \
++  pthread_mutexattr_init.man pthread_once.man pthread_self.man \
++  pthread_setschedparam.man pthread_sigmask.man sem_init.man \
++  pthread_kill_other_threads_np.man
++
++MANPAGES=$(SOURCES:.man=.3thr)
++
++PREPRO=perl troffprepro
++
++MANDIR=/usr/man/man3
++
++all: $(MANPAGES)
++
++.SUFFIXES: .man .3thr
++
++.man.3thr:
++	$(PREPRO) $*.man $*.3thr
++
++$(MANPAGES): troffprepro
++
++clean:
++	rm -f *.3thr
++	rm -f *~
++
++install:
++	install *.3thr $(MANDIR)
++	@echo "*** Remember to run /usr/sbin/makewhatis `dirname $(MANDIR)` at some point"
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_atfork.man glibc-2.1.3/linuxthreads/man/pthread_atfork.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_atfork.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_atfork.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,58 @@
++.TH PTHREAD_ATFORK 3 LinuxThreads
++
++.SH NAME
++pthread_atfork \- register handlers to be called at fork(2) time
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
++
++.SH DESCRIPTION
++
++!pthread_atfork! registers handler functions to be called just before
++and just after a new process is created with !fork!(2). The |prepare|
++handler will be called from the parent process, just before the new
++process is created. The |parent| handler will be called from the parent
++process, just before !fork!(2) returns. The |child| handler will be
++called from the child process, just before !fork!(2) returns.
++
++One or several of the three handlers |prepare|, |parent| and |child|
++can be given as !NULL!, meaning that no handler needs to be called at
++the corresponding point.
++
++!pthread_atfork! can be called several times to install several sets
++of handlers. At !fork!(2) time, the |prepare| handlers are called in
++LIFO order (last added with !pthread_atfork!, first called before !fork!),
++while the |parent| and |child| handlers are called in FIFO order
++(first added, first called).
++
++To understand the purpose of !pthread_atfork!, recall that !fork!(2)
++duplicates the whole memory space, including mutexes in their current
++locking state, but only the calling thread: other threads are not
++running in the child process. Thus, if a mutex is locked by a thread
++other than the thread calling !fork!, that mutex will remain locked
++forever in the child process, possibly blocking the execution of the
++child process. To avoid this, install handlers with !pthread_atfork!
++as follows: the |prepare| handler locks the global mutexes (in locking
++order), and the |parent| and |child| handlers unlock them (in
++reverse order). Alternatively, |prepare| and |parent| can be set to
++!NULL! and |child| to a function that calls !pthread_mutex_init! on
++the global mutexes.
++
++.SH "RETURN VALUE"
++
++!pthread_atfork! returns 0 on success and a non-zero error code on error.
++
++.SH ERRORS
++.TP
++!ENOMEM!
++insufficient memory available to register the handlers.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!fork!(2),
++!pthread_mutex_lock!(3),
++!pthread_mutex_unlock!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_attr_init.man glibc-2.1.3/linuxthreads/man/pthread_attr_init.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_attr_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_attr_init.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,221 @@
++.TH PTHREAD_ATTR_INIT 3 LinuxThreads
++
++.XREF pthread_attr_destroy
++.XREF pthread_attr_setdetachstate
++.XREF pthread_attr_getdetachstate
++.XREF pthread_attr_setschedparam
++.XREF pthread_attr_getschedparam
++.XREF pthread_attr_setschedpolicy
++.XREF pthread_attr_getschedpolicy
++.XREF pthread_attr_setinheritsched
++.XREF pthread_attr_getinheritsched
++.XREF pthread_attr_setscope
++.XREF pthread_attr_getscope
++
++.SH NAME
++pthread_attr_init, pthread_attr_destroy, pthread_attr_setdetachstate, pthread_attr_getdetachstate, pthread_attr_setschedparam, pthread_attr_getschedparam, pthread_attr_setschedpolicy, pthread_attr_getschedpolicy, pthread_attr_setinheritsched, pthread_attr_getinheritsched, pthread_attr_setscope, pthread_attr_getscope \- thread creation attributes
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_attr_init(pthread_attr_t *attr);
++
++int pthread_attr_destroy(pthread_attr_t *attr);
++
++int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
++
++int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
++
++int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
++
++int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
++
++int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
++
++int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
++
++int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
++
++int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
++
++int pthread_attr_setscope(pthread_attr_t *attr, int scope);
++
++int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
++
++.SH DESCRIPTION
++
++Setting attributes for threads is achieved by filling a
++thread attribute object |attr| of type !pthread_attr_t!, then passing it as
++second argument to !pthread_create!(3). Passing !NULL! is equivalent to
++passing a thread attribute object with all attributes set to their
++default values.
++
++!pthread_attr_init! initializes the thread attribute object |attr| and
++fills it with default values for the attributes. (The default values
++are listed below for each attribute.)
++
++Each attribute |attrname| (see below for a list of all attributes) can
++be individually set using the function !pthread_attr_set!|attrname|
++and retrieved using the function !pthread_attr_get!|attrname|.
++
++!pthread_attr_destroy! destroys a thread attribute object, which
++must not be reused until it is reinitialized. !pthread_attr_destroy!
++does nothing in the LinuxThreads implementation. 
++
++Attribute objects are consulted only when creating a new thread. The
++same attribute object can be used for creating several
++threads. Modifying an attribute object after a call to
++!pthread_create! does not change the attributes of the thread
++previously created.
++
++The following thread attributes are supported:
++
++.SS detachstate
++
++Control whether the thread is created in the joinable state (value
++!PTHREAD_CREATE_JOINABLE!) or in the detached state
++(!PTHREAD_CREATE_DETACHED!). 
++
++Default value: !PTHREAD_CREATE_JOINABLE!.
++
++In the joinable state, another thread can synchronize on the thread
++termination and recover its termination code using !pthread_join!(3),
++but some of the thread resources are kept allocated after the thread
++terminates, and reclaimed only when another thread performs
++!pthread_join!(3) on that thread.
++
++In the detached state, the thread resources are immediately freed when
++it terminates, but !pthread_join!(3) cannot be used to synchronize on
++the thread termination.
++
++A thread created in the joinable state can later be put in the
++detached thread using !pthread_detach!(3).
++
++.SS schedpolicy
++
++Select the scheduling policy for the thread: one of
++!SCHED_OTHER! (regular, non-realtime scheduling),
++!SCHED_RR! (realtime, round-robin) or
++!SCHED_FIFO! (realtime, first-in first-out). See
++!sched_setpolicy!(2) for more information on scheduling policies.
++
++Default value: !SCHED_OTHER!.
++
++The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are
++available only to processes with superuser privileges.
++
++The scheduling policy of a thread can be changed after creation with
++!pthread_setschedparam!(3).
++
++.SS schedparam
++
++Contain the scheduling parameters (essentially, the scheduling
++priority) for the thread. See !sched_setparam!(2) for more information
++on scheduling parameters. 
++
++Default value: priority is 0.
++
++This attribute is not significant if the scheduling policy is !SCHED_OTHER!;
++it only matters for the realtime policies !SCHED_RR! and !SCHED_FIFO!.
++
++The scheduling priority of a thread can be changed after creation with
++!pthread_setschedparam!(3).
++
++.SS inheritsched
++
++Indicate whether the scheduling policy and scheduling parameters for
++the newly created thread are determined by the values of the
++|schedpolicy| and |schedparam| attributes (value
++!PTHREAD_EXPLICIT_SCHED!) or are inherited from the parent thread
++(value !PTHREAD_INHERIT_SCHED!).
++
++Default value: !PTHREAD_EXPLICIT_SCHED!.
++
++.SS scope
++
++Define the scheduling contention scope for the created thread.  The
++only value supported in the LinuxThreads implementation is
++!PTHREAD_SCOPE_SYSTEM!, meaning that the threads contend for CPU time
++with all processes running on the machine. In particular, thread
++priorities are interpreted relative to the priorities of all other
++processes on the machine. The other value specified by the standard,
++!PTHREAD_SCOPE_PROCESS!, means that scheduling contention occurs only
++between the threads of the running process: thread priorities are
++interpreted relative to the priorities of the other threads of the
++process, regardless of the priorities of other processes.
++!PTHREAD_SCOPE_PROCESS! is not supported in LinuxThreads.
++
++Default value: !PTHREAD_SCOPE_SYSTEM!.
++
++.SH "RETURN VALUE"
++
++All functions return 0 on success and a non-zero error code on error.
++On success, the !pthread_attr_get!|attrname| functions also store the
++current value of the attribute |attrname| in the location pointed to
++by their second argument.
++
++.SH ERRORS
++
++The !pthread_attr_setdetachstate! function returns the following error
++codes on error:
++.RS
++.TP
++!EINVAL!
++the specified |detachstate| is not one of !PTHREAD_CREATE_JOINABLE! or
++!PTHREAD_CREATE_DETACHED!.
++.RE
++
++The !pthread_attr_setschedparam! function returns the following error
++codes on error:
++.RS
++.TP
++!EINVAL!
++the priority specified in |param| is outside the range of allowed
++priorities for the scheduling policy currently in |attr|
++(1 to 99 for !SCHED_FIFO! and !SCHED_RR!; 0 for !SCHED_OTHER!).
++.RE
++
++The !pthread_attr_setschedpolicy! function returns the following error
++codes on error:
++.RS
++.TP
++!EINVAL!
++the specified |policy| is not one of !SCHED_OTHER!, !SCHED_FIFO!, or
++!SCHED_RR!.
++
++.TP
++!ENOTSUP!
++|policy| is !SCHED_FIFO! or !SCHED_RR!, and the effective user of the
++calling process is not super-user.
++.RE
++
++The !pthread_attr_setinheritsched! function returns the following error
++codes on error:
++.RS
++.TP
++!EINVAL!
++the specified |inherit| is not one of !PTHREAD_INHERIT_SCHED! or
++!PTHREAD_EXPLICIT_SCHED!.
++.RE
++
++The !pthread_attr_setscope! function returns the following error
++codes on error:
++.RS
++.TP
++!EINVAL!
++the specified |scope| is not one of !PTHREAD_SCOPE_SYSTEM! or
++!PTHREAD_SCOPE_PROCESS!.
++
++.TP
++!ENOTSUP!
++the specified |scope| is !PTHREAD_SCOPE_PROCESS! (not supported).
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_create!(3),
++!pthread_join!(3),
++!pthread_detach!(3),
++!pthread_setschedparam!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cancel.man glibc-2.1.3/linuxthreads/man/pthread_cancel.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_cancel.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_cancel.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,155 @@
++.TH PTHREAD_CANCEL 3 LinuxThreads
++
++.XREF pthread_setcancelstate
++.XREF pthread_setcanceltype
++.XREF pthread_testcancel
++
++.SH NAME
++pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel \- thread cancellation
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_cancel(pthread_t thread);
++
++int pthread_setcancelstate(int state, int *oldstate);
++
++int pthread_setcanceltype(int type, int *oldtype);
++
++void pthread_testcancel(void);
++
++.SH DESCRIPTION
++
++Cancellation is the mechanism by which a thread can terminate the
++execution of another thread. More precisely, a thread can send a
++cancellation request to another thread. Depending on its settings, the
++target thread can then either ignore the request, honor it
++immediately, or defer it till it reaches a cancellation point.
++
++When a thread eventually honors a cancellation request, it performs as
++if !pthread_exit(PTHREAD_CANCELED)! has been called at that point:
++all cleanup handlers are executed in reverse order, finalization
++functions for thread-specific data are called, and finally the thread
++stops executing with the return value !PTHREAD_CANCELED!. See
++!pthread_exit!(3) for more information.
++
++!pthread_cancel! sends a cancellation request to the thread denoted
++by the |thread| argument.
++
++!pthread_setcancelstate! changes the cancellation state for the
++calling thread -- that is, whether cancellation requests are ignored
++or not. The |state| argument is the new cancellation state: either
++!PTHREAD_CANCEL_ENABLE! to enable cancellation, or
++!PTHREAD_CANCEL_DISABLE! to disable cancellation (cancellation
++requests are ignored). If |oldstate| is not !NULL!, the previous
++cancellation state is stored in the location pointed to by |oldstate|,
++and can thus be restored later by another call to
++!pthread_setcancelstate!.
++
++!pthread_setcanceltype! changes the type of responses to cancellation
++requests for the calling thread: asynchronous (immediate) or deferred.
++The |type| argument is the new cancellation type: either
++!PTHREAD_CANCEL_ASYNCHRONOUS! to cancel the calling thread as soon as
++the cancellation request is received, or !PTHREAD_CANCEL_DEFERRED! to
++keep the cancellation request pending until the next cancellation
++point. If |oldtype| is not !NULL!, the previous
++cancellation state is stored in the location pointed to by |oldtype|,
++and can thus be restored later by another call to
++!pthread_setcanceltype!.
++
++Threads are always created by !pthread_create!(3) with cancellation
++enabled and deferred. That is, the initial cancellation state is
++!PTHREAD_CANCEL_ENABLE! and the initial type is
++!PTHREAD_CANCEL_DEFERRED!.
++
++Cancellation points are those points in the program execution where a
++test for pending cancellation requests is performed and cancellation
++is executed if positive. The following POSIX threads functions
++are cancellation points:
++
++!pthread_join!(3)
++.br
++!pthread_cond_wait!(3)
++.br
++!pthread_cond_timedwait!(3)
++.br
++!pthread_testcancel!(3)
++.br
++!sem_wait!(3)
++.br
++!sigwait!(3)
++
++All other POSIX threads functions are guaranteed not to be
++cancellation points. That is, they never perform cancellation in
++deferred cancellation mode.
++
++!pthread_testcancel! does nothing except testing for pending
++cancellation and executing it. Its purpose is to introduce explicit
++checks for cancellation in long sequences of code that do not call
++cancellation point functions otherwise.
++
++.SH "RETURN VALUE"
++
++!pthread_cancel!, !pthread_setcancelstate! and
++!pthread_setcanceltype! return 0 on success and a non-zero error code
++on error.
++
++.SH ERRORS
++!pthread_cancel! returns the following error code on error:
++.RS
++.TP
++!ESRCH!
++no thread could be found corresponding to that specified by the |thread| ID.
++.RE
++
++!pthread_setcancelstate! returns the following error code on error:
++.RS
++.TP
++!EINVAL!
++the |state| argument is not !PTHREAD_CANCEL_ENABLE! nor
++!PTHREAD_CANCEL_DISABLE!
++.RE
++
++!pthread_setcanceltype! returns the following error code on error:
++.RS
++.TP
++!EINVAL!
++the |type| argument is not !PTHREAD_CANCEL_DEFERRED! nor
++!PTHREAD_CANCEL_ASYNCHRONOUS!
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_exit!(3),
++!pthread_cleanup_push!(3),
++!pthread_cleanup_pop!(3).
++
++.SH BUGS
++
++POSIX specifies that a number of system calls (basically, all
++system calls that may block, such as !read!(2), !write!(2), !wait!(2),
++etc.) and library functions that may call these system calls (e.g.
++!fprintf!(3)) are cancellation points.  LinuxThreads is not yet
++integrated enough with the C library to implement this, and thus none
++of the C library functions is a cancellation point.
++
++For system calls at least, there is a workaround. Cancellation
++requests are transmitted to the target thread by sending it a
++signal. That signal will interrupt all blocking system calls, causing
++them to return immediately with the !EINTR! error. So, checking for
++cancellation during a !read! system call, for instance, can be
++achieved as follows:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_testcancel();
++retcode = read(fd, buffer, length);
++pthread_testcancel();
++.ft
++.LP
++.RE
++.fi
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,194 @@
++.TH PTHREAD_CLEANUP 3 LinuxThreads
++
++.XREF pthread_cleanup_pop
++.XREF pthread_cleanup_push_defer_np
++.XREF pthread_cleanup_pop_restore_np
++
++.SH NAME
++pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np \- install and remove cleanup handlers
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++void pthread_cleanup_push(void (*routine) (void *), void *arg);
++
++void pthread_cleanup_pop(int execute);
++
++void pthread_cleanup_push_defer_np(void (*routine) (void *), void *arg);
++
++void pthread_cleanup_pop_restore_np(int execute);
++
++.SH DESCRIPTION
++
++Cleanup handlers are functions that get called when a thread
++terminates, either by calling !pthread_exit!(3) or because of
++cancellation. Cleanup handlers are installed and removed following a
++stack-like discipline.
++
++The purpose of cleanup handlers is to free the resources that a thread
++may hold at the time it terminates. In particular, if a thread
++exits or is cancelled while it owns a locked mutex, the mutex will
++remain locked forever and prevent other threads from executing
++normally. The best way to avoid this is, just before locking the
++mutex, to install a cleanup handler whose effect is to unlock the
++mutex. Cleanup handlers can be used similarly to free blocks allocated
++with !malloc!(3) or close file descriptors on thread termination.
++
++!pthread_cleanup_push! installs the |routine| function with argument
++|arg| as a cleanup handler. From this point on to the matching
++!pthread_cleanup_pop!, the function |routine| will be called with
++arguments |arg| when the thread terminates, either through !pthread_exit!(3)
++or by cancellation. If several cleanup handlers are active at that
++point, they are called in LIFO order: the most recently installed
++handler is called first.
++
++!pthread_cleanup_pop! removes the most recently installed cleanup
++handler. If the |execute| argument is not 0, it also executes the
++handler, by calling the |routine| function with arguments |arg|. If
++the |execute| argument is 0, the handler is only removed but not
++executed.
++
++Matching pairs of !pthread_cleanup_push! and !pthread_cleanup_pop!
++must occur in the same function, at the same level of block nesting.
++Actually, !pthread_cleanup_push! and !pthread_cleanup_pop! are macros,
++and the expansion of !pthread_cleanup_push! introduces an open brace !{!
++with the matching closing brace !}! being introduced by the expansion
++of the matching !pthread_cleanup_pop!.
++
++!pthread_cleanup_push_defer_np! is a non-portable extension that
++combines !pthread_cleanup_push! and !pthread_setcanceltype!(3).
++It pushes a cleanup handler just as !pthread_cleanup_push! does, but
++also saves the current cancellation type and sets it to deferred
++cancellation. This ensures that the cleanup mechanism is effective
++even if the thread was initially in asynchronous cancellation mode.
++
++!pthread_cleanup_pop_restore_np! pops a cleanup handler introduced by
++!pthread_cleanup_push_defer_np!, and restores the cancellation type to
++its value at the time !pthread_cleanup_push_defer_np! was called.
++
++!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!
++must occur in matching pairs, at the same level of block nesting.
++
++The following sequence
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_cleanup_push_defer_np(routine, arg);
++...
++pthread_cleanup_pop_defer_np(execute);
++.ft
++.LP
++.RE
++.fi
++
++is functionally equivalent to (but more compact and more efficient than)
++
++.RS
++.ft 3
++.nf
++.sp
++{ int oldtype;
++  pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
++  pthread_cleanup_push(routine, arg);
++  ...
++  pthread_cleanup_pop(execute);
++  pthread_setcanceltype(oldtype, NULL);
++}
++.ft
++.LP
++.RE
++.fi
++
++.SH "RETURN VALUE"
++
++None.
++
++.SH ERRORS
++
++None.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_exit!(3),
++!pthread_cancel!(3),
++!pthread_setcanceltype!(3).
++
++.SH EXAMPLE
++
++Here is how to lock a mutex |mut| in such a way that it will be
++unlocked if the thread is canceled while |mut| is locked:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_mutex_unlock(&mut);
++pthread_cleanup_pop(0);
++.ft
++.LP
++.RE
++.fi
++
++Equivalently, the last two lines can be replaced by
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_cleanup_pop(1);
++.ft
++.LP
++.RE
++.fi
++
++Notice that the code above is safe only in deferred cancellation mode
++(see !pthread_setcanceltype!(3)). In asynchronous cancellation mode,
++a cancellation can occur between !pthread_cleanup_push! and
++!pthread_mutex_lock!, or between !pthread_mutex_unlock! and
++!pthread_cleanup_pop!, resulting in both cases in the thread trying to
++unlock a mutex not locked by the current thread. This is the main
++reason why asynchronous cancellation is difficult to use.
++
++If the code above must also work in asynchronous cancellation mode,
++then it must switch to deferred mode for locking and unlocking the
++mutex:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_cleanup_pop(1);
++pthread_setcanceltype(oldtype, NULL);
++.ft
++.LP
++.RE
++.fi
++
++The code above can be rewritten in a more compact and more
++efficient way, using the non-portable functions
++!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_cleanup_push_restore_np(pthread_mutex_unlock, (void *) &mut);
++pthread_mutex_lock(&mut);
++/* do some work */
++pthread_cleanup_pop_restore_np(1);
++.ft
++.LP
++.RE
++.fi
++
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cond_init.man glibc-2.1.3/linuxthreads/man/pthread_cond_init.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_cond_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_cond_init.man	1999-06-16 15:34:07.000000000 -0700
+@@ -0,0 +1,234 @@
++.TH PTHREAD_COND 3 LinuxThreads
++
++.XREF pthread_cond_signal
++.XREF pthread_cond_broadcast
++.XREF pthread_cond_wait
++.XREF pthread_cond_timedwait
++.XREF pthread_cond_destroy
++
++.SH NAME
++pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait \- operations on conditions
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
++
++int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
++
++int pthread_cond_signal(pthread_cond_t *cond);
++
++int pthread_cond_broadcast(pthread_cond_t *cond);
++
++int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
++
++int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
++
++int pthread_cond_destroy(pthread_cond_t *cond);
++
++.SH DESCRIPTION
++
++A condition (short for ``condition variable'') is a synchronization
++device that allows threads to suspend execution and relinquish the
++processors until some predicate on shared data is satisfied. The basic
++operations on conditions are: signal the condition (when the
++predicate becomes true), and wait for the condition, suspending the
++thread execution until another thread signals the condition.
++
++A condition variable must always be associated with a mutex, to avoid
++the race condition where a thread prepares to wait on a condition
++variable and another thread signals the condition just before the
++first thread actually waits on it.
++
++!pthread_cond_init! initializes the condition variable |cond|, using the
++condition attributes specified in |cond_attr|, or default attributes
++if |cond_attr| is !NULL!. The LinuxThreads implementation supports no
++attributes for conditions, hence the |cond_attr| parameter is actually
++ignored.
++
++Variables of type !pthread_cond_t! can also be initialized
++statically, using the constant !PTHREAD_COND_INITIALIZER!.
++
++!pthread_cond_signal! restarts one of the threads that are waiting on
++the condition variable |cond|. If no threads are waiting on |cond|,
++nothing happens. If several threads are waiting on |cond|, exactly one
++is restarted, but it is not specified which.
++
++!pthread_cond_broadcast! restarts all the threads that are waiting on
++the condition variable |cond|. Nothing happens if no threads are
++waiting on |cond|.
++
++!pthread_cond_wait! atomically unlocks the |mutex| (as per
++!pthread_unlock_mutex!) and waits for the condition variable |cond| to
++be signaled. The thread execution is suspended and does not consume
++any CPU time until the condition variable is signaled. The |mutex|
++must be locked by the calling thread on entrance to
++!pthread_cond_wait!. Before returning to the calling thread,
++!pthread_cond_wait! re-acquires |mutex| (as per !pthread_lock_mutex!).
++
++Unlocking the mutex and suspending on the condition variable is done
++atomically. Thus, if all threads always acquire the mutex before
++signaling the condition, this guarantees that the condition cannot be
++signaled (and thus ignored) between the time a thread locks the mutex
++and the time it waits on the condition variable.
++
++!pthread_cond_timedwait! atomically unlocks |mutex| and waits on
++|cond|, as !pthread_cond_wait! does, but it also bounds the duration
++of the wait. If |cond| has not been signaled within the amount of time
++specified by |abstime|, the mutex |mutex| is re-acquired and
++!pthread_cond_timedwait! returns the error !ETIMEDOUT!.
++The |abstime| parameter specifies an absolute time, with the same
++origin as !time!(2) and !gettimeofday!(2): an |abstime| of 0
++corresponds to 00:00:00 GMT, January 1, 1970.
++
++!pthread_cond_destroy! destroys a condition variable, freeing the
++resources it might hold. No threads must be waiting on the condition
++variable on entrance to !pthread_cond_destroy!. In the LinuxThreads
++implementation, no resources are associated with condition variables,
++thus !pthread_cond_destroy! actually does nothing except checking that
++the condition has no waiting threads.
++
++.SH CANCELLATION
++
++!pthread_cond_wait! and !pthread_cond_timedwait! are cancellation
++points. If a thread is cancelled while suspended in one of these
++functions, the thread immediately resumes execution, then locks again
++the |mutex| argument to !pthread_cond_wait! and
++!pthread_cond_timedwait!, and finally executes the cancellation.
++Consequently, cleanup handlers are assured that |mutex| is locked when
++they are called.
++
++.SH "ASYNC-SIGNAL SAFETY"
++
++The condition functions are not async-signal safe, and should not be
++called from a signal handler. In particular, calling
++!pthread_cond_signal! or !pthread_cond_broadcast! from a signal
++handler may deadlock the calling thread.
++
++.SH "RETURN VALUE"
++
++All condition variable functions return 0 on success and a non-zero
++error code on error.
++
++.SH ERRORS
++
++!pthread_cond_init!, !pthread_cond_signal!, !pthread_cond_broadcast!,
++and !pthread_cond_wait! never return an error code.
++
++The !pthread_cond_timedwait! function returns the following error codes
++on error:
++.RS
++.TP
++!ETIMEDOUT!
++the condition variable was not signaled until the timeout specified by
++|abstime|
++
++.TP
++!EINTR!
++!pthread_cond_timedwait! was interrupted by a signal
++.RE
++
++The !pthread_cond_destroy! function returns the following error code
++on error:
++.RS
++.TP
++!EBUSY!
++some threads are currently waiting on |cond|.
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_condattr_init!(3),
++!pthread_mutex_lock!(3),
++!pthread_mutex_unlock!(3),
++!gettimeofday!(2),
++!nanosleep!(2).
++
++.SH EXAMPLE
++
++Consider two shared variables |x| and |y|, protected by the mutex |mut|,
++and a condition variable |cond| that is to be signaled whenever |x|
++becomes greater than |y|.
++
++.RS
++.ft 3
++.nf
++.sp
++int x,y;
++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
++pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
++.ft
++.LP
++.RE
++.fi
++
++Waiting until |x| is greater than |y| is performed as follows:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_mutex_lock(&mut);
++while (x <= y) {
++        pthread_cond_wait(&cond, &mut);
++}
++/* operate on x and y */
++pthread_mutex_unlock(&mut);
++.ft
++.LP
++.RE
++.fi
++
++Modifications on |x| and |y| that may cause |x| to become greater than
++|y| should signal the condition if needed:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_mutex_lock(&mut);
++/* modify x and y */
++if (x > y) pthread_cond_broadcast(&cond);
++pthread_mutex_unlock(&mut);
++.ft
++.LP
++.RE
++.fi
++
++If it can be proved that at most one waiting thread needs to be waken
++up (for instance, if there are only two threads communicating through
++|x| and |y|), !pthread_cond_signal! can be used as a slightly more
++efficient alternative to !pthread_cond_broadcast!. In doubt, use
++!pthread_cond_broadcast!.
++
++To wait for |x| to becomes greater than |y| with a timeout of 5
++seconds, do:
++
++.RS
++.ft 3
++.nf
++.sp
++struct timeval now;
++struct timespec timeout;
++int retcode;
++
++pthread_mutex_lock(&mut);
++gettimeofday(&now);
++timeout.tv_sec = now.tv_sec + 5;
++timeout.tv_nsec = now.tv_usec * 1000;
++retcode = 0;
++while (x <= y && retcode != ETIMEDOUT) {
++        retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
++}
++if (retcode == ETIMEDOUT) {
++        /* timeout occurred */
++} else {
++        /* operate on x and y */
++}
++pthread_mutex_unlock(&mut);
++.ft
++.LP
++.RE
++.fi
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,39 @@
++.TH PTHREAD_CONDATTR 3 LinuxThreads
++
++.XREF pthread_condattr_destroy
++
++.SH NAME
++pthread_condattr_init, pthread_condattr_destroy \- condition creation attributes
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_condattr_init(pthread_condattr_t *attr);
++
++int pthread_condattr_destroy(pthread_condattr_t *attr);
++
++.SH DESCRIPTION
++
++Condition attributes can be specified at condition creation time, by passing a
++condition attribute object as second argument to !pthread_cond_init!(3).
++Passing !NULL! is equivalent to passing a condition attribute object with
++all attributes set to their default values.
++
++The LinuxThreads implementation supports no attributes for
++conditions. The functions on condition attributes are included only
++for compliance with the POSIX standard.
++
++!pthread_condattr_init! initializes the condition attribute object
++|attr| and fills it with default values for the attributes.
++!pthread_condattr_destroy! destroys a condition attribute object,
++which must not be reused until it is reinitialized. Both functions do
++nothing in the LinuxThreads implementation.
++
++.SH "RETURN VALUE"
++!pthread_condattr_init! and !pthread_condattr_destroy! always return 0.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_cond_init!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_create.man glibc-2.1.3/linuxthreads/man/pthread_create.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_create.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_create.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,46 @@
++.TH PTHREAD_CREATE 3 LinuxThreads
++
++.SH NAME
++pthread_create \- create a new thread
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);
++
++.SH DESCRIPTION
++!pthread_create! creates a new thread of control that executes
++concurrently with the calling thread. The new thread applies the
++function |start_routine| passing it |arg| as first argument. The new
++thread terminates either explicitly, by calling !pthread_exit!(3),
++or implicitly, by returning from the |start_routine| function. The
++latter case is equivalent to calling !pthread_exit!(3) with the result
++returned by |start_routine| as exit code.
++
++The |attr| argument specifies thread attributes to be applied to the
++new thread. See !pthread_attr_init!(3) for a complete list of thread
++attributes. The |attr| argument can also be !NULL!, in which case
++default attributes are used: the created thread is joinable (not
++detached) and has default (non real-time) scheduling policy.
++
++.SH "RETURN VALUE"
++On success, the identifier of the newly created thread is stored in
++the location pointed by the |thread| argument, and a 0 is returned. On
++error, a non-zero error code is returned.
++
++.SH ERRORS
++.TP
++!EAGAIN!
++not enough system resources to create a process for the new thread.
++.TP
++!EAGAIN!
++more than !PTHREAD_THREADS_MAX! threads are already active.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_exit!(3),
++!pthread_join!(3),
++!pthread_detach!(3),
++!pthread_attr_init!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_detach.man glibc-2.1.3/linuxthreads/man/pthread_detach.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_detach.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_detach.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,44 @@
++.TH PTHREAD_DETACH 3 LinuxThreads
++
++.SH NAME
++pthread_detach \- put a running thread in the detached state
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_detach(pthread_t th);
++
++.SH DESCRIPTION
++!pthread_detach! put the thread |th| in the detached state. This
++guarantees that the memory resources consumed by |th| will be freed
++immediately when |th| terminates. However, this prevents other threads
++from synchronizing on the termination of |th| using !pthread_join!.
++
++A thread can be created initially in the detached state, using the
++!detachstate! attribute to !pthread_create!(3). In contrast,
++!pthread_detach! applies to threads created in the joinable state, and
++which need to be put in the detached state later.
++
++After !pthread_detach! completes, subsequent attempts to perform
++!pthread_join! on |th| will fail. If another thread is already joining
++the thread |th| at the time !pthread_detach! is called,
++!pthread_detach! does nothing and leaves |th| in the joinable state.
++
++.SH "RETURN VALUE"
++On success, 0 is returned. On error, a non-zero error code is returned.
++
++.SH ERRORS
++.TP
++!ESRCH!
++No thread could be found corresponding to that specified by |th|
++.TP
++!EINVAL!
++the thread |th| is already in the detached state
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_create!(3),
++!pthread_join!(3),
++!pthread_attr_setdetachstate!(3).
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_equal.man glibc-2.1.3/linuxthreads/man/pthread_equal.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_equal.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_equal.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,23 @@
++.TH PTHREAD_EQUAL 3 LinuxThreads
++
++.SH NAME
++pthread_equal \- compare two thread identifiers
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_equal(pthread_t thread1, pthread_t thread2);
++
++.SH DESCRIPTION
++!pthread_equal! determines if two thread identifiers refer to the same
++thread.
++
++.SH "RETURN VALUE"
++A non-zero value is returned if |thread1| and |thread2| refer to the
++same thread. Otherwise, 0 is returned.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_self!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_exit.man glibc-2.1.3/linuxthreads/man/pthread_exit.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_exit.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_exit.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,32 @@
++.TH PTHREAD_EXIT 3 LinuxThreads
++
++.SH NAME
++pthread_exit \- terminate the calling thread
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++void pthread_exit(void *retval);
++
++.SH DESCRIPTION
++!pthread_exit! terminates the execution of the calling thread.
++All cleanup handlers that have been set for the calling thread with
++!pthread_cleanup_push!(3) are executed in reverse order (the most
++recently pushed handler is executed first). Finalization functions for
++thread-specific data are then called for all keys that have non-!NULL!
++values associated with them in the calling thread (see
++!pthread_key_create!(3)). Finally, execution of the calling thread is
++stopped.
++
++The |retval| argument is the return value of the thread. It can be
++consulted from another thread using !pthread_join!(3).
++
++.SH "RETURN VALUE"
++The !pthread_exit! function never returns.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_create!(3),
++!pthread_join!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_join.man glibc-2.1.3/linuxthreads/man/pthread_join.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_join.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_join.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,70 @@
++.TH PTHREAD_JOIN 3 LinuxThreads
++
++.SH NAME
++pthread_join \- wait for termination of another thread
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_join(pthread_t th, void **thread_return);
++
++.SH DESCRIPTION
++!pthread_join! suspends the execution of the calling thread until the
++thread identified by |th| terminates, either by calling !pthread_exit!(3)
++or by being cancelled.
++
++If |thread_return| is not !NULL!, the return value of |th| is stored
++in the location pointed to by |thread_return|.  The return value of
++|th| is either the argument it gave to !pthread_exit!(3), or
++!PTHREAD_CANCELED! if |th| was cancelled.
++
++The joined thread !th! must be in the joinable state: it must not have
++been detached using !pthread_detach!(3) or the
++!PTHREAD_CREATE_DETACHED! attribute to !pthread_create!(3).
++
++When a joinable thread terminates, its memory resources (thread
++descriptor and stack) are not deallocated until another thread
++performs !pthread_join! on it. Therefore, !pthread_join! must be
++called once for each joinable thread created to avoid memory leaks.
++
++At most one thread can wait for the termination of a given
++thread. Calling !pthread_join! on a thread |th| on which another
++thread is already waiting for termination returns an error.
++
++.SH CANCELLATION
++
++!pthread_join! is a cancellation point. If a thread is canceled while
++suspended in !pthread_join!, the thread execution resumes immediately
++and the cancellation is executed without waiting for the |th| thread
++to terminate. If cancellation occurs during !pthread_join!, the |th|
++thread remains not joined.
++
++.SH "RETURN VALUE"
++On success, the return value of |th| is stored in the location pointed
++to by |thread_return|, and 0 is returned. On error, a non-zero error
++code is returned.
++
++.SH ERRORS
++.TP
++!ESRCH!
++No thread could be found corresponding to that specified by |th|.
++.TP
++!EINVAL!
++The |th| thread has been detached.
++.TP
++!EINVAL!
++Another thread is already waiting on termination of |th|.
++.TP
++!EDEADLK!
++The |th| argument refers to the calling thread.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_exit!(3),
++!pthread_detach!(3),
++!pthread_create!(3),
++!pthread_attr_setdetachstate!(3),
++!pthread_cleanup_push!(3),
++!pthread_key_create!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_key_create.man glibc-2.1.3/linuxthreads/man/pthread_key_create.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_key_create.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_key_create.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,151 @@
++.TH PTHREAD_SPECIFIC 3 LinuxThreads
++
++.SH NAME
++pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- management of thread-specific data
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));
++
++int pthread_key_delete(pthread_key_t key);
++
++int pthread_setspecific(pthread_key_t key, const void *pointer);
++
++void * pthread_getspecific(pthread_key_t key);
++
++.SH DESCRIPTION
++
++Programs often need global or static variables that have different
++values in different threads. Since threads share one memory space,
++this cannot be achieved with regular variables. Thread-specific data
++is the POSIX threads answer to this need.
++
++Each thread possesses a private memory block, the thread-specific data
++area, or TSD area for short. This area is indexed by TSD keys. The TSD
++area associates values of type !void *! to TSD keys. TSD keys are
++common to all threads, but the value associated with a given TSD key
++can be different in each thread.
++
++For concreteness, the TSD areas can be viewed as arrays of !void *!
++pointers, TSD keys as integer indices into these arrays, and the value
++of a TSD key as the value of the corresponding array element in the
++calling thread.
++
++When a thread is created, its TSD area initially associates !NULL!
++with all keys.
++
++!pthread_key_create! allocates a new TSD key. The key is stored in the
++location pointed to by |key|. There is a limit of !PTHREAD_KEYS_MAX!
++on the number of keys allocated at a given time. The value initially
++associated with the returned key is !NULL! in all currently executing
++threads.
++
++The |destr_function| argument, if not !NULL!, specifies a destructor
++function associated with the key. When a thread terminates via
++!pthread_exit! or by cancellation, |destr_function| is called with
++arguments the value associated with the key in that thread. The
++|destr_function| is not called if that value is !NULL!. The order in
++which destructor functions are called at thread termination time is
++unspecified.
++
++Before the destructor function is called, the !NULL! value is
++associated with the key in the current thread.  A destructor function
++might, however, re-associate non-!NULL! values to that key or some
++other key.  To deal with this, if after all the destructors have been
++called for all non-!NULL! values, there are still some non-!NULL!
++values with associated destructors, then the process is repeated.  The
++LinuxThreads implementation stops the process after
++!PTHREAD_DESTRUCTOR_ITERATIONS! iterations, even if some non-!NULL!
++values with associated descriptors remain.  Other implementations may
++loop indefinitely.
++
++!pthread_key_delete! deallocates a TSD key. It does not check whether
++non-!NULL! values are associated with that key in the currently
++executing threads, nor call the destructor function associated with
++the key.
++
++!pthread_setspecific! changes the value associated with |key| in the
++calling thread, storing the given |pointer| instead.
++
++!pthread_getspecific! returns the value currently associated with
++|key| in the calling thread.
++
++.SH "RETURN VALUE"
++
++!pthread_key_create!, !pthread_key_delete!, and !pthread_setspecific!
++return 0 on success and a non-zero error code on failure. If
++successful, !pthread_key_create! stores the newly allocated key in the
++location pointed to by its |key| argument.
++
++!pthread_getspecific! returns the value associated with |key| on
++success, and !NULL! on error.
++
++.SH ERRORS
++!pthread_key_create! returns the following error code on error:
++.RS
++.TP
++!EAGAIN!
++!PTHREAD_KEYS_MAX! keys are already allocated
++.RE
++
++!pthread_key_delete! and !pthread_setspecific! return the following
++error code on error:
++.RS
++.TP
++!EINVAL!
++|key| is not a valid, allocated TSD key
++.RE
++
++!pthread_getspecific! returns !NULL! if |key| is not a valid,
++allocated TSD key.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++pthread_create(3), pthread_exit(3), pthread_testcancel(3).
++
++.SH EXAMPLE
++
++The following code fragment allocates a thread-specific array of 100
++characters, with automatic reclaimation at thread exit:
++
++.RS
++.ft 3
++.nf
++.sp
++/* Key for the thread-specific buffer */
++static pthread_key_t buffer_key;
++
++/* Once-only initialisation of the key */
++static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
++
++/* Allocate the thread-specific buffer */
++void buffer_alloc(void)
++{
++  pthread_once(&buffer_key_once, buffer_key_alloc);
++  pthread_setspecific(buffer_key, malloc(100));
++}
++
++/* Return the thread-specific buffer */
++char * get_buffer(void)
++{
++  return (char *) pthread_getspecific(buffer_key);
++}
++
++/* Allocate the key */
++static void buffer_key_alloc()
++{
++  pthread_key_create(&buffer_key, buffer_destroy);
++}
++
++/* Free the thread-specific buffer */
++static void buffer_destroy(void * buf)
++{
++  free(buf);
++}
++.ft
++.LP
++.RE
++.fi
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,40 @@
++.TH PTHREAD_KILL_OTHER_THREADS_NP 3 LinuxThreads
++
++.SH NAME
++pthread_kill_other_threads_np \- terminate all threads in program except calling thread
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++void pthread_kill_other_threads_np(void);
++
++.SH DESCRIPTION
++!pthread_kill_other_threads_np! is a non-portable LinuxThreads extension.
++It causes all threads in the program to terminate immediately, except
++the calling thread which proceeds normally. It is intended to be
++called just before a thread calls one of the !exec! functions,
++e.g. !execve!(2).
++
++Termination of the other threads is not performed through
++!pthread_cancel!(3) and completely bypasses the cancellation
++mechanism. Hence, the current settings for cancellation state and
++cancellation type are ignored, and the cleanup handlers are not
++executed in the terminated threads.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!execve!(2),
++!pthread_setcancelstate!(3),
++!pthread_setcanceltype!(3),
++!pthread_cancel!(3).
++
++.SH BUGS
++
++According to POSIX 1003.1c, a successful !exec*! in one of the threads
++should terminate automatically all other threads in the program.
++This behavior is not yet implemented in LinuxThreads.
++Calling !pthread_kill_other_threads_np! before !exec*! achieves much
++of the same behavior, except that if !exec*! ultimately fails, then
++all other threads are already killed.
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,213 @@
++.TH PTHREAD_MUTEX 3 LinuxThreads
++
++.XREF pthread_mutex_lock
++.XREF pthread_mutex_unlock
++.XREF pthread_mutex_trylock
++.XREF pthread_mutex_destroy
++
++.SH NAME
++pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy \- operations on mutexes
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
++
++pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
++
++pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
++
++int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
++
++int pthread_mutex_lock(pthread_mutex_t *mutex));
++
++int pthread_mutex_trylock(pthread_mutex_t *mutex);
++
++int pthread_mutex_unlock(pthread_mutex_t *mutex);
++
++int pthread_mutex_destroy(pthread_mutex_t *mutex);
++
++.SH DESCRIPTION
++A mutex is a MUTual EXclusion device, and is useful for protecting
++shared data structures from concurrent modifications, and implementing
++critical sections and monitors.
++
++A mutex has two possible states: unlocked (not owned by any thread),
++and locked (owned by one thread). A mutex can never be owned by two
++different threads simultaneously. A thread attempting to lock a mutex
++that is already locked by another thread is suspended until the owning
++thread unlocks the mutex first.
++
++!pthread_mutex_init! initializes the mutex object pointed to by
++|mutex| according to the mutex attributes specified in |mutexattr|.
++If |mutexattr| is !NULL!, default attributes are used instead.
++
++The LinuxThreads implementation supports only one mutex attributes,
++the |mutex kind|, which is either ``fast'', ``recursive'', or
++``error checking''. The kind of a mutex determines whether
++it can be locked again by a thread that already owns it.
++The default kind is ``fast''. See !pthread_mutexattr_init!(3) for more
++information on mutex attributes.
++
++Variables of type !pthread_mutex_t! can also be initialized
++statically, using the constants !PTHREAD_MUTEX_INITIALIZER! (for fast
++mutexes), !PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP! (for recursive
++mutexes), and !PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP! (for error checking
++mutexes).
++
++!pthread_mutex_lock! locks the given mutex. If the mutex is currently
++unlocked, it becomes locked and owned by the calling thread, and
++!pthread_mutex_lock! returns immediately. If the mutex is already
++locked by another thread, !pthread_mutex_lock! suspends the calling
++thread until the mutex is unlocked.
++
++If the mutex is already locked by the calling thread, the behavior of
++!pthread_mutex_lock! depends on the kind of the mutex. If the mutex is
++of the ``fast'' kind, the calling thread is suspended until the mutex
++is unlocked, thus effectively causing the calling thread to
++deadlock. If the mutex is of the ``error checking'' kind,
++!pthread_mutex_lock! returns immediately with the error code !EDEADLK!.
++If the mutex is of the ``recursive'' kind, !pthread_mutex_lock!
++succeeds and returns immediately, recording the number of times the
++calling thread has locked the mutex. An equal number of
++!pthread_mutex_unlock! operations must be performed before the mutex
++returns to the unlocked state.
++
++!pthread_mutex_trylock! behaves identically to !pthread_mutex_lock!,
++except that it does not block the calling thread if the mutex is
++already locked by another thread (or by the calling thread in the case
++of a ``fast'' mutex). Instead, !pthread_mutex_trylock! returns
++immediately with the error code !EBUSY!.
++
++!pthread_mutex_unlock! unlocks the given mutex. The mutex is assumed
++to be locked and owned by the calling thread on entrance to
++!pthread_mutex_unlock!. If the mutex is of the ``fast'' kind,
++!pthread_mutex_unlock! always returns it to the unlocked state. If it
++is of the ``recursive'' kind, it decrements the locking count of the
++mutex (number of !pthread_mutex_lock! operations performed on it by
++the calling thread), and only when this count reaches zero is the
++mutex actually unlocked.
++
++On ``error checking'' mutexes, !pthread_mutex_unlock! actually checks
++at run-time that the mutex is locked on entrance, and that it was
++locked by the same thread that is now calling !pthread_mutex_unlock!.
++If these conditions are not met, an error code is returned and the
++mutex remains unchanged.  ``Fast'' and ``recursive'' mutexes perform
++no such checks, thus allowing a locked mutex to be unlocked by a
++thread other than its owner. This is non-portable behavior and must
++not be relied upon.
++
++!pthread_mutex_destroy! destroys a mutex object, freeing the resources
++it might hold. The mutex must be unlocked on entrance. In the
++LinuxThreads implementation, no resources are associated with mutex
++objects, thus !pthread_mutex_destroy! actually does nothing except
++checking that the mutex is unlocked.
++
++.SH CANCELLATION
++
++None of the mutex functions is a cancellation point, not even
++!pthread_mutex_lock!, in spite of the fact that it can suspend a
++thread for arbitrary durations. This way, the status of mutexes at
++cancellation points is predictable, allowing cancellation handlers to
++unlock precisely those mutexes that need to be unlocked before the
++thread stops executing. Consequently, threads using deferred
++cancellation should never hold a mutex for extended periods of time.
++
++.SH "ASYNC-SIGNAL SAFETY"
++
++The mutex functions are not async-signal safe. What this means is that
++they should not be called from a signal handler. In particular,
++calling !pthread_mutex_lock! or !pthread_mutex_unlock! from a signal
++handler may deadlock the calling thread.
++
++.SH "RETURN VALUE"
++
++!pthread_mutex_init! always returns 0. The other mutex functions
++return 0 on success and a non-zero error code on error.
++
++.SH ERRORS
++
++The !pthread_mutex_lock! function returns the following error code
++on error:
++.RS
++.TP
++!EINVAL!
++the mutex has not been properly initialized.
++
++.TP
++!EDEADLK!
++the mutex is already locked by the calling thread
++(``error checking'' mutexes only).
++.RE
++
++The !pthread_mutex_trylock! function returns the following error codes
++on error:
++.RS
++.TP
++!EBUSY!
++the mutex could not be acquired because it was currently locked.
++
++.TP
++!EINVAL!
++the mutex has not been properly initialized.
++.RE
++
++The !pthread_mutex_unlock! function returns the following error code
++on error:
++.RS
++.TP
++!EINVAL!
++the mutex has not been properly initialized.
++
++.TP
++!EPERM!
++the calling thread does not own the mutex (``error checking'' mutexes only).
++.RE
++
++The !pthread_mutex_destroy! function returns the following error code
++on error:
++.RS
++.TP
++!EBUSY!
++the mutex is currently locked.
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_mutexattr_init!(3),
++!pthread_mutexattr_setkind_np!(3),
++!pthread_cancel!(3).
++
++.SH EXAMPLE
++
++A shared global variable |x| can be protected by a mutex as follows:
++
++.RS
++.ft 3
++.nf
++.sp
++int x;
++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
++.ft
++.LP
++.RE
++.fi
++
++All accesses and modifications to |x| should be bracketed by calls to
++!pthread_mutex_lock! and !pthread_mutex_unlock! as follows:
++
++.RS
++.ft 3
++.nf
++.sp
++pthread_mutex_lock(&mut);
++/* operate on x */
++pthread_mutex_unlock(&mut);
++.ft
++.LP
++.RE
++.fi
++
++
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,84 @@
++.TH PTHREAD_MUTEXATTR 3 LinuxThreads
++
++.XREF pthread_mutexattr_destroy
++.XREF pthread_mutexattr_setkind_np
++.XREF pthread_mutexattr_getkind_np
++
++.SH NAME
++pthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_setkind_np, pthread_mutexattr_getkind_np \- mutex creation attributes
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_mutexattr_init(pthread_mutexattr_t *attr);
++
++int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
++
++int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
++
++int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind);
++
++.SH DESCRIPTION
++
++Mutex attributes can be specified at mutex creation time, by passing a
++mutex attribute object as second argument to !pthread_mutex_init!(3).
++Passing !NULL! is equivalent to passing a mutex attribute object with
++all attributes set to their default values.
++
++!pthread_mutexattr_init! initializes the mutex attribute object |attr|
++and fills it with default values for the attributes.
++
++!pthread_mutexattr_destroy! destroys a mutex attribute object, which
++must not be reused until it is reinitialized. !pthread_mutexattr_destroy!
++does nothing in the LinuxThreads implementation. 
++
++LinuxThreads supports only one mutex attribute: the mutex kind, which
++is either !PTHREAD_MUTEX_FAST_NP! for ``fast'' mutexes,
++!PTHREAD_MUTEX_RECURSIVE_NP! for ``recursive'' mutexes,
++or !PTHREAD_MUTEX_ERRORCHECK_NP! for ``error checking'' mutexes.
++As the !NP! suffix indicates, this is a non-portable extension to the
++POSIX standard and should not be employed in portable programs.
++
++The mutex kind determines what happens if a thread attempts to lock a
++mutex it already owns with !pthread_mutex_lock!(3). If the mutex is of
++the ``fast'' kind, !pthread_mutex_lock!(3) simply suspends the calling
++thread forever.  If the mutex is of the ``error checking'' kind,
++!pthread_mutex_lock!(3) returns immediately with the error code
++!EDEADLK!.  If the mutex is of the ``recursive'' kind, the call to
++!pthread_mutex_lock!(3) returns immediately with a success return
++code. The number of times the thread owning the mutex has locked it is
++recorded in the mutex. The owning thread must call
++!pthread_mutex_unlock!(3) the same number of times before the mutex
++returns to the unlocked state.
++
++The default mutex kind is ``fast'', that is, !PTHREAD_MUTEX_FAST_NP!.
++
++!pthread_mutexattr_setkind_np! sets the mutex kind attribute in |attr|
++to the value specified by |kind|.
++
++!pthread_mutexattr_getkind_np! retrieves the current value of the
++mutex kind attribute in |attr| and stores it in the location pointed
++to by |kind|.
++
++.SH "RETURN VALUE"
++!pthread_mutexattr_init!, !pthread_mutexattr_destroy! and
++!pthread_mutexattr_getkind_np! always return 0.
++
++!pthread_mutexattr_setkind_np! returns 0 on success and a non-zero
++error code on error.
++
++.SH ERRORS
++
++On error, !pthread_mutexattr_setkind_np! returns the following error code:
++.TP
++!EINVAL!
++|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP!
++nor !PTHREAD_MUTEX_ERRORCHECK_NP!
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_mutex_init!(3),
++!pthread_mutex_lock!(3),
++!pthread_mutex_unlock!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_once.man glibc-2.1.3/linuxthreads/man/pthread_once.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_once.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_once.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,34 @@
++.TH PTHREAD_ONCE 3 LinuxThreads
++
++.SH NAME
++pthread_once \- once-only initialization
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++pthread_once_t once_control = PTHREAD_ONCE_INIT;
++
++int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));
++
++.SH DESCRIPTION
++
++The purpose of !pthread_once! is to ensure that a piece of
++initialization code is executed at most once. The |once_control|
++argument points to a static or extern variable statically initialized
++to !PTHREAD_ONCE_INIT!.
++
++The first time !pthread_once! is called with a given |once_control|
++argument, it calls |init_routine| with no argument and changes the
++value of the |once_control| variable to record that initialization has
++been performed. Subsequent calls to !pthread_once! with the same
++!once_control! argument do nothing. 
++
++.SH "RETURN VALUE"
++!pthread_once! always returns 0.
++
++.SH ERRORS
++None.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_self.man glibc-2.1.3/linuxthreads/man/pthread_self.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_self.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_self.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,23 @@
++.TH PTHREAD_SELF 3 LinuxThreads
++
++.SH NAME
++pthread_self \- return identifier of current thread
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++pthread_t pthread_self(void);
++
++.SH DESCRIPTION
++!pthread_self! return the thread identifier for the calling thread.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_equal!(3),
++!pthread_join!(3),
++!pthread_detach!(3),
++!pthread_setschedparam!(3),
++!pthread_getschedparam!(3).
++
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,79 @@
++.TH PTHREAD_SETSCHEDPARAM 3 LinuxThreads
++
++.XREF pthread_getschedparam
++
++.SH NAME
++pthread_setschedparam, pthread_getschedparam \- control thread scheduling parameters
++
++.SH SYNOPSIS
++#include <pthread.h>
++
++int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param);
++
++int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_param *param);
++
++.SH DESCRIPTION
++
++!pthread_setschedparam! sets the scheduling parameters for the thread
++|target_thread| as indicated by |policy| and |param|. |policy| can be
++either !SCHED_OTHER! (regular, non-realtime scheduling), !SCHED_RR!
++(realtime, round-robin) or !SCHED_FIFO! (realtime, first-in
++first-out). |param| specifies the scheduling priority for the two
++realtime policies.  See !sched_setpolicy!(2) for more information on
++scheduling policies.
++
++The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are
++available only to processes with superuser privileges.
++
++!pthread_getschedparam! retrieves the scheduling policy and scheduling
++parameters for the thread |target_thread| and store them in the
++locations pointed to by |policy| and |param|, respectively.
++
++.SH "RETURN VALUE"
++!pthread_setschedparam! and !pthread_getschedparam! return 0 on
++success and a non-zero error code on error.
++
++.SH ERRORS
++On error, !pthread_setschedparam! returns the following error codes:
++.RS
++.TP
++!EINVAL!
++|policy| is not one of !SCHED_OTHER!, !SCHED_RR!, !SCHED_FIFO!
++
++.TP
++!EINVAL!
++the priority value specified by |param| is not valid for the specified policy
++
++.TP
++!EPERM!
++the calling process does not have superuser permissions
++
++.TP
++!ESRCH!
++the |target_thread| is invalid or has already terminated
++
++.TP
++!EFAULT!
++|param| points outside the process memory space
++.RE
++
++On error, !pthread_getschedparam! returns the following error codes:
++.RS
++.TP
++!ESRCH!
++the |target_thread| is invalid or has already terminated
++
++.TP
++!EFAULT!
++|policy| or |param| point outside the process memory space
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!sched_setscheduler!(2),
++!sched_getscheduler!(2),
++!sched_getparam!(2),
++!pthread_attr_setschedpolicy!(3),
++!pthread_attr_setschedparam!(3).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_sigmask.man glibc-2.1.3/linuxthreads/man/pthread_sigmask.man
+--- ../glibc-2.1.3/linuxthreads/man/pthread_sigmask.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/pthread_sigmask.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,123 @@
++.TH PTHREAD_SIGNAL 3 LinuxThreads
++
++.XREF pthread_kill
++.XREF sigwait
++
++.SH NAME
++pthread_sigmask, pthread_kill, sigwait \- handling of signals in threads
++
++.SH SYNOPSIS
++#include <pthread.h>
++.br
++#include <signal.h>
++
++int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);
++
++int pthread_kill(pthread_t thread, int signo);
++
++int sigwait(const sigset_t *set, int *sig);
++
++.SH DESCRIPTION
++
++!pthread_sigmask! changes the signal mask for the calling thread as
++described by the |how| and |newmask| arguments. If |oldmask| is not
++!NULL!, the previous signal mask is stored in the location pointed to
++by |oldmask|. 
++
++The meaning of the |how| and |newmask| arguments is the same as for
++!sigprocmask!(2). If |how| is !SIG_SETMASK!, the signal mask is set to
++|newmask|. If |how| is !SIG_BLOCK!, the signals specified to |newmask|
++are added to the current signal mask.  If |how| is !SIG_UNBLOCK!, the
++signals specified to |newmask| are removed from the current signal
++mask.
++
++Recall that signal masks are set on a per-thread basis, but signal
++actions and signal handlers, as set with !sigaction!(2), are shared
++between all threads.
++
++!pthread_kill! send signal number |signo| to the thread
++|thread|. The signal is delivered and handled as described in
++!kill!(2).
++
++!sigwait! suspends the calling thread until one of the signals
++in |set| is delivered to the calling thread. It then stores the number
++of the signal received in the location pointed to by |sig| and
++returns. The signals in |set| must be blocked and not ignored on
++entrance to !sigwait!. If the delivered signal has a signal handler
++function attached, that function is |not| called.
++
++.SH CANCELLATION
++
++!sigwait! is a cancellation point.
++
++.SH "RETURN VALUE"
++
++On success, 0 is returned. On failure, a non-zero error code is returned.
++
++.SH ERRORS
++
++The !pthread_sigmask! function returns the following error codes
++on error:
++.RS
++.TP
++!EINVAL!
++|how| is not one of !SIG_SETMASK!, !SIG_BLOCK!, or !SIG_UNBLOCK!
++
++.TP
++!EFAULT!
++|newmask| or |oldmask| point to invalid addresses
++.RE
++
++The !pthread_kill! function returns the following error codes
++on error:
++.RS
++.TP
++!EINVAL!
++|signo| is not a valid signal number
++
++.TP
++!ESRCH!
++the thread |thread| does not exist (e.g. it has already terminated)
++.RE
++
++The !sigwait! function never returns an error.
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!sigprocmask!(2),
++!kill!(2),
++!sigaction!(2),
++!sigsuspend!(2).
++
++.SH NOTES
++
++For !sigwait! to work reliably, the signals being waited for must be
++blocked in all threads, not only in the calling thread, since
++otherwise the POSIX semantics for signal delivery do not guarantee
++that it's the thread doing the !sigwait! that will receive the signal.
++The best way to achieve this is block those signals before any threads
++are created, and never unblock them in the program other than by
++calling !sigwait!.
++
++.SH BUGS
++
++Signal handling in LinuxThreads departs significantly from the POSIX
++standard. According to the standard, ``asynchronous'' (external)
++signals are addressed to the whole process (the collection of all
++threads), which then delivers them to one particular thread. The
++thread that actually receives the signal is any thread that does
++not currently block the signal.
++
++In LinuxThreads, each thread is actually a kernel process with its own
++PID, so external signals are always directed to one particular thread.
++If, for instance, another thread is blocked in !sigwait! on that
++signal, it will not be restarted.
++
++The LinuxThreads implementation of !sigwait! installs dummy signal
++handlers for the signals in |set| for the duration of the wait. Since
++signal handlers are shared between all threads, other threads must not
++attach their own signal handlers to these signals, or alternatively
++they should all block these signals (which is recommended anyway --
++see the Notes section).
+diff -Naur ../glibc-2.1.3/linuxthreads/man/sem_init.man glibc-2.1.3/linuxthreads/man/sem_init.man
+--- ../glibc-2.1.3/linuxthreads/man/sem_init.man	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/sem_init.man	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,132 @@
++.TH SEMAPHORES 3 LinuxThreads
++
++.XREF sem_wait
++.XREF sem_trywait
++.XREF sem_post
++.XREF sem_getvalue
++.XREF sem_destroy
++
++.SH NAME
++sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, sem_destroy \- operations on semaphores
++
++.SH SYNOPSIS
++#include <semaphore.h>
++
++int sem_init(sem_t *sem, int pshared, unsigned int value);
++
++int sem_wait(sem_t * sem);
++
++int sem_trywait(sem_t * sem);
++
++int sem_post(sem_t * sem);
++
++int sem_getvalue(sem_t * sem, int * sval);
++
++int sem_destroy(sem_t * sem);
++
++.SH DESCRIPTION
++This manual page documents POSIX 1003.1b semaphores, not to be
++confused with SystemV semaphores as described in !ipc!(5), !semctl!(2)
++and !semop!(2).
++
++Semaphores are counters for resources shared between threads. The
++basic operations on semaphores are: increment the counter atomically,
++and wait until the counter is non-null and decrement it atomically.
++
++!sem_init! initializes the semaphore object pointed to by |sem|. The
++count associated with the semaphore is set initially to |value|. The
++|pshared| argument indicates whether the semaphore is local to the
++current process (|pshared| is zero) or is to be shared between several
++processes (|pshared| is not zero). LinuxThreads currently does not
++support process-shared semaphores, thus !sem_init! always returns with
++error !ENOSYS! if |pshared| is not zero.
++
++!sem_wait! suspends the calling thread until the semaphore pointed to
++by |sem| has non-zero count. It then atomically decreases the
++semaphore count.
++
++!sem_trywait! is a non-blocking variant of !sem_wait!. If the
++semaphore pointed to by |sem| has non-zero count, the count is
++atomically decreased and !sem_trywait! immediately returns 0.
++If the semaphore count is zero, !sem_trywait! immediately returns with
++error !EAGAIN!.
++
++!sem_post! atomically increases the count of the semaphore pointed to
++by |sem|. This function never blocks and can safely be used in
++asynchronous signal handlers.
++
++!sem_getvalue! stores in the location pointed to by |sval| the current
++count of the semaphore |sem|.
++
++!sem_destroy! destroys a semaphore object, freeing the resources it
++might hold. No threads should be waiting on the semaphore at the time
++!sem_destroy! is called. In the LinuxThreads implementation, no
++resources are associated with semaphore objects, thus !sem_destroy!
++actually does nothing except checking that no thread is waiting on the
++semaphore.
++
++.SH CANCELLATION
++
++!sem_wait! is a cancellation point.
++
++.SH "ASYNC-SIGNAL SAFETY"
++
++On processors supporting atomic compare-and-swap (Intel 486, Pentium
++and later, Alpha, PowerPC, MIPS II, Motorola 68k), the !sem_post!
++function is async-signal safe and can therefore be
++called from signal handlers. This is the only thread synchronization
++function provided by POSIX threads that is async-signal safe.
++
++On the Intel 386 and the Sparc, the current LinuxThreads
++implementation of !sem_post! is not async-signal safe by lack of the
++required atomic operations.
++
++.SH "RETURN VALUE"
++
++The !sem_wait! and !sem_getvalue! functions always return 0.
++All other semaphore functions return 0 on success and -1 on error, in
++addition to writing an error code in !errno!.
++
++.SH ERRORS
++
++The !sem_init! function sets !errno! to the following codes on error:
++.RS
++.TP
++!EINVAL!
++|value| exceeds the maximal counter value !SEM_VALUE_MAX!
++.TP
++!ENOSYS!
++|pshared| is not zero
++.RE
++
++The !sem_trywait! function sets !errno! to the following error code on error:
++.RS
++.TP
++!EAGAIN!
++the semaphore count is currently 0
++.RE
++
++The !sem_post! function sets !errno! to the following error code on error:
++.RS
++.TP
++!ERANGE!
++after incrementation, the semaphore value would exceed !SEM_VALUE_MAX!
++(the semaphore count is left unchanged in this case)
++.RE
++
++The !sem_destroy! function sets !errno! to the following error code on error:
++.RS
++.TP
++!EBUSY!
++some threads are currently blocked waiting on the semaphore.
++.RE
++
++.SH AUTHOR
++Xavier Leroy <Xavier.Leroy@inria.fr>
++
++.SH "SEE ALSO"
++!pthread_mutex_init!(3),
++!pthread_cond_init!(3),
++!pthread_cancel!(3),
++!ipc!(5).
++
+diff -Naur ../glibc-2.1.3/linuxthreads/man/troffprepro glibc-2.1.3/linuxthreads/man/troffprepro
+--- ../glibc-2.1.3/linuxthreads/man/troffprepro	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/man/troffprepro	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,68 @@
++#!/usr/local/bin/perl
++
++$insynopsis = 0;
++
++open(INPUT, $ARGV[0]) || die("cannot open $ARGV[0]");
++open(OUTPUT, "> $ARGV[1]") || die("cannot create $ARGV[1]");
++
++select(OUTPUT);
++
++line:
++while(<INPUT>) {
++  if (/^\.XREF (.*)$/) {
++    $xref = $1;
++    $_ = $ARGV[1];
++    m/^.*\.(([1-8]).*)$/;
++    $suffix = $1;
++    $extension = $2;
++    open(XREF, "> $xref.$suffix");
++    print XREF ".so man$extension/$ARGV[1]\n";
++    close(XREF);
++    next line;
++  }
++  if (/^\.SH/) {
++    $insynopsis = /SYNOPSIS/;
++    print $_;
++    next;
++  }
++  if ($insynopsis) {
++    if (/^#/) {
++      print ".B ", $_;
++    }
++    elsif (/^[a-z]/) {    
++      chop;
++#      if (m/^([a-zA-Z][a-zA-Z0-9_]*\s+[a-zA-Z][a-zA-Z0-9_]*)\(/) {
++#          print ".B \"", $1, "\"\n";
++#          $_ = '(' . $';
++#      }
++#      s/([a-zA-Z][a-zA-Z0-9_]*)(\s*[,()=])/" \1 "\2/g;
++      s/([ *])([a-zA-Z][a-zA-Z0-9_]*)(\s*[,)=])/\1" \2 "\3/g;
++      print ".BI \"", $_, "\"\n";
++    }
++    else {
++      print $_;
++    }
++    next;
++  }
++  chop;
++  s/!([^!]+)!\|([^|]+)\|([^\s]*)\s*/\n.BI "\1" "\2\3"\n/g;
++  s/([!|])([^!|]+)\1([^\s]*)\s*/do subst($1,$2,$3)/eg;
++  s/^\n+//;
++  s/\n+$//;
++  s/\n\n+/\n/g;
++  print $_, "\n";
++}
++
++close(INPUT);
++close(OUTPUT);
++
++sub subst {
++  local ($a, $b, $c) = @_;
++  if ($c) {
++    "\n" . ($a eq "!" ? ".BR " : ".IR ") . "\"$b\" $c\n"
++  } else {
++    "\n" . ($a eq "!" ? ".B " : ".I ") . "\"$b\"\n"
++  }
++}
++
++  
+diff -Naur ../glibc-2.1.3/linuxthreads/manager.c glibc-2.1.3/linuxthreads/manager.c
+--- ../glibc-2.1.3/linuxthreads/manager.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/manager.c	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,699 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* The "thread manager" thread: manages creation and termination of threads */
++
++#include <errno.h>
++#include <sched.h>
++#include <stddef.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <sys/poll.h>		/* for poll */
++#include <sys/mman.h>           /* for mmap */
++#include <sys/param.h>
++#include <sys/time.h>
++#include <sys/wait.h>           /* for waitpid macros */
++
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++#include "semaphore.h"
++
++/* Array of active threads. Entry 0 is reserved for the initial thread. */
++struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
++{ { LOCK_INITIALIZER, &__pthread_initial_thread, 0},
++  { LOCK_INITIALIZER, &__pthread_manager_thread, 0}, /* All NULLs */ };
++
++/* For debugging purposes put the maximum number of threads in a variable.  */
++const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;
++
++/* Indicate whether at least one thread has a user-defined stack (if 1),
++   or if all threads have stacks supplied by LinuxThreads (if 0). */
++int __pthread_nonstandard_stacks;
++
++/* Number of active entries in __pthread_handles (used by gdb) */
++volatile int __pthread_handles_num = 2;
++
++/* Whether to use debugger additional actions for thread creation
++   (set to 1 by gdb) */
++volatile int __pthread_threads_debug;
++
++/* Globally enabled events.  */
++volatile td_thr_events_t __pthread_threads_events;
++
++/* Pointer to thread descriptor with last event.  */
++volatile pthread_descr __pthread_last_event;
++
++/* Mapping from stack segment to thread descriptor. */
++/* Stack segment numbers are also indices into the __pthread_handles array. */
++/* Stack segment number 0 is reserved for the initial thread. */
++
++static inline pthread_descr thread_segment(int seg)
++{
++  return (pthread_descr)(THREAD_STACK_START_ADDRESS - (seg - 1) * STACK_SIZE)
++         - 1;
++}
++
++/* Flag set in signal handler to record child termination */
++
++static volatile int terminated_children = 0;
++
++/* Flag set when the initial thread is blocked on pthread_exit waiting
++   for all other threads to terminate */
++
++static int main_thread_exiting = 0;
++
++/* Counter used to generate unique thread identifier.
++   Thread identifier is pthread_threads_counter + segment. */
++
++static pthread_t pthread_threads_counter = 0;
++
++/* Forward declarations */
++
++static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
++                                 void * (*start_routine)(void *), void *arg,
++                                 sigset_t *mask, int father_pid,
++				 int report_events,
++				 td_thr_events_t *event_maskp);
++static void pthread_handle_free(pthread_t th_id);
++static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode);
++static void pthread_reap_children(void);
++static void pthread_kill_all_threads(int sig, int main_thread_also);
++
++/* The server thread managing requests for thread creation and termination */
++
++int __pthread_manager(void *arg)
++{
++  int reqfd = (int) (long int) arg;
++  struct pollfd ufd;
++  sigset_t mask;
++  int n;
++  struct pthread_request request;
++
++  /* If we have special thread_self processing, initialize it.  */
++#ifdef INIT_THREAD_SELF
++  INIT_THREAD_SELF(&__pthread_manager_thread, 1);
++#endif
++  /* Set the error variable.  */
++  __pthread_manager_thread.p_errnop = &__pthread_manager_thread.p_errno;
++  __pthread_manager_thread.p_h_errnop = &__pthread_manager_thread.p_h_errno;
++  /* Block all signals except __pthread_sig_cancel and SIGTRAP */
++  sigfillset(&mask);
++  sigdelset(&mask, __pthread_sig_cancel); /* for thread termination */
++  sigdelset(&mask, SIGTRAP);            /* for debugging purposes */
++  sigprocmask(SIG_SETMASK, &mask, NULL);
++  /* Raise our priority to match that of main thread */
++  __pthread_manager_adjust_prio(__pthread_main_thread->p_priority);
++  /* Synchronize debugging of the thread manager */
++  n = __libc_read(reqfd, (char *)&request, sizeof(request));
++  ASSERT(n == sizeof(request) && request.req_kind == REQ_DEBUG);
++  ufd.fd = reqfd;
++  ufd.events = POLLIN;
++  /* Enter server loop */
++  while(1) {
++    n = __poll(&ufd, 1, 2000);
++
++    /* Check for termination of the main thread */
++    if (getppid() == 1) {
++      pthread_kill_all_threads(SIGKILL, 0);
++      _exit(0);
++    }
++    /* Check for dead children */
++    if (terminated_children) {
++      terminated_children = 0;
++      pthread_reap_children();
++    }
++    /* Read and execute request */
++    if (n == 1 && (ufd.revents & POLLIN)) {
++      n = __libc_read(reqfd, (char *)&request, sizeof(request));
++      ASSERT(n == sizeof(request));
++      switch(request.req_kind) {
++      case REQ_CREATE:
++        request.req_thread->p_retcode =
++          pthread_handle_create((pthread_t *) &request.req_thread->p_retval,
++                                request.req_args.create.attr,
++                                request.req_args.create.fn,
++                                request.req_args.create.arg,
++                                &request.req_args.create.mask,
++                                request.req_thread->p_pid,
++				request.req_thread->p_report_events,
++				&request.req_thread->p_eventbuf.eventmask);
++        restart(request.req_thread);
++        break;
++      case REQ_FREE:
++	pthread_handle_free(request.req_args.free.thread_id);
++        break;
++      case REQ_PROCESS_EXIT:
++        pthread_handle_exit(request.req_thread,
++                            request.req_args.exit.code);
++        break;
++      case REQ_MAIN_THREAD_EXIT:
++        main_thread_exiting = 1;
++        if (__pthread_main_thread->p_nextlive == __pthread_main_thread) {
++          restart(__pthread_main_thread);
++          return 0;
++        }
++        break;
++      case REQ_POST:
++        __new_sem_post(request.req_args.post);
++        break;
++      case REQ_DEBUG:
++	/* Make gdb aware of new thread and gdb will restart the
++	   new thread when it is ready to handle the new thread. */
++	if (__pthread_threads_debug && __pthread_sig_debug > 0)
++	  raise(__pthread_sig_debug);
++        break;
++      }
++    }
++  }
++}
++
++int __pthread_manager_event(void *arg)
++{
++  /* If we have special thread_self processing, initialize it.  */
++#ifdef INIT_THREAD_SELF
++  INIT_THREAD_SELF(&__pthread_manager_thread, 1);
++#endif
++
++  /* Get the lock the manager will free once all is correctly set up.  */
++  __pthread_lock (THREAD_GETMEM((&__pthread_manager_thread), p_lock), NULL);
++  /* Free it immediately.  */
++  __pthread_unlock (THREAD_GETMEM((&__pthread_manager_thread), p_lock));
++
++  return __pthread_manager(arg);
++}
++
++/* Process creation */
++
++static int pthread_start_thread(void *arg)
++{
++  pthread_descr self = (pthread_descr) arg;
++  struct pthread_request request;
++  void * outcome;
++  /* Initialize special thread_self processing, if any.  */
++#ifdef INIT_THREAD_SELF
++  INIT_THREAD_SELF(self, self->p_nr);
++#endif
++  /* Make sure our pid field is initialized, just in case we get there
++     before our father has initialized it. */
++  THREAD_SETMEM(self, p_pid, __getpid());
++  /* Initial signal mask is that of the creating thread. (Otherwise,
++     we'd just inherit the mask of the thread manager.) */
++  sigprocmask(SIG_SETMASK, &self->p_start_args.mask, NULL);
++  /* Set the scheduling policy and priority for the new thread, if needed */
++  if (THREAD_GETMEM(self, p_start_args.schedpolicy) >= 0)
++    /* Explicit scheduling attributes were provided: apply them */
++    __sched_setscheduler(THREAD_GETMEM(self, p_pid),
++			 THREAD_GETMEM(self, p_start_args.schedpolicy),
++                         &self->p_start_args.schedparam);
++  else if (__pthread_manager_thread.p_priority > 0)
++    /* Default scheduling required, but thread manager runs in realtime
++       scheduling: switch new thread to SCHED_OTHER policy */
++    {
++      struct sched_param default_params;
++      default_params.sched_priority = 0;
++      __sched_setscheduler(THREAD_GETMEM(self, p_pid),
++                           SCHED_OTHER, &default_params);
++    }
++  /* Make gdb aware of new thread */
++  if (__pthread_threads_debug && __pthread_sig_debug > 0) {
++    request.req_thread = self;
++    request.req_kind = REQ_DEBUG;
++    __libc_write(__pthread_manager_request,
++                 (char *) &request, sizeof(request));
++    suspend(self);
++  }
++  /* Run the thread code */
++  outcome = self->p_start_args.start_routine(THREAD_GETMEM(self,
++							   p_start_args.arg));
++  /* Exit with the given return value */
++  pthread_exit(outcome);
++  return 0;
++}
++
++static int pthread_start_thread_event(void *arg)
++{
++  pthread_descr self = (pthread_descr) arg;
++
++#ifdef INIT_THREAD_SELF
++  INIT_THREAD_SELF(self, self->p_nr);
++#endif
++  /* Make sure our pid field is initialized, just in case we get there
++     before our father has initialized it. */
++  THREAD_SETMEM(self, p_pid, __getpid());
++  /* Get the lock the manager will free once all is correctly set up.  */
++  __pthread_lock (THREAD_GETMEM(self, p_lock), NULL);
++  /* Free it immediately.  */
++  __pthread_unlock (THREAD_GETMEM(self, p_lock));
++
++  /* Continue with the real function.  */
++  return pthread_start_thread (arg);
++}
++
++static int pthread_allocate_stack(const pthread_attr_t *attr,
++                                  pthread_descr default_new_thread,
++                                  int pagesize,
++                                  pthread_descr * out_new_thread,
++                                  char ** out_new_thread_bottom,
++                                  char ** out_guardaddr,
++                                  size_t * out_guardsize)
++{
++  pthread_descr new_thread;
++  char * new_thread_bottom;
++  char * guardaddr;
++  size_t stacksize, guardsize;
++
++  if (attr != NULL && attr->__stackaddr_set)
++    {
++      /* The user provided a stack. */
++      new_thread =
++        (pthread_descr) ((long)(attr->__stackaddr) & -sizeof(void *)) - 1;
++      new_thread_bottom = (char *) attr->__stackaddr - attr->__stacksize;
++      guardaddr = NULL;
++      guardsize = 0;
++      __pthread_nonstandard_stacks = 1;
++    }
++  else
++    {
++      stacksize = STACK_SIZE - pagesize;
++      if (attr != NULL)
++        stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize));
++      /* Allocate space for stack and thread descriptor at default address */
++      new_thread = default_new_thread;
++      new_thread_bottom = (char *) (new_thread + 1) - stacksize;
++      if (mmap((caddr_t)((char *)(new_thread + 1) - INITIAL_STACK_SIZE),
++               INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
++               MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN,
++               -1, 0) == MAP_FAILED)
++        /* Bad luck, this segment is already mapped. */
++        return -1;
++      /* We manage to get a stack.  Now see whether we need a guard
++         and allocate it if necessary.  Notice that the default
++         attributes (stack_size = STACK_SIZE - pagesize) do not need
++	 a guard page, since the RLIMIT_STACK soft limit prevents stacks
++	 from running into one another. */
++      if (stacksize == STACK_SIZE - pagesize)
++        {
++          /* We don't need a guard page. */
++          guardaddr = NULL;
++          guardsize = 0;
++        }
++      else
++        {
++          /* Put a bad page at the bottom of the stack */
++          guardsize = attr->__guardsize;
++          guardaddr = (void *)new_thread_bottom - guardsize;
++          if (mmap ((caddr_t) guardaddr, guardsize, 0, MAP_FIXED, -1, 0)
++              == MAP_FAILED)
++            {
++              /* We don't make this an error.  */
++              guardaddr = NULL;
++              guardsize = 0;
++            }
++        }
++    }
++  /* Clear the thread data structure.  */
++  memset (new_thread, '\0', sizeof (*new_thread));
++  *out_new_thread = new_thread;
++  *out_new_thread_bottom = new_thread_bottom;
++  *out_guardaddr = guardaddr;
++  *out_guardsize = guardsize;
++  return 0;
++}
++
++static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
++				 void * (*start_routine)(void *), void *arg,
++				 sigset_t * mask, int father_pid,
++				 int report_events,
++				 td_thr_events_t *event_maskp)
++{
++  size_t sseg;
++  int pid;
++  pthread_descr new_thread;
++  char * new_thread_bottom;
++  pthread_t new_thread_id;
++  char *guardaddr = NULL;
++  size_t guardsize = 0;
++  int pagesize = __getpagesize();
++
++  /* First check whether we have to change the policy and if yes, whether
++     we can  do this.  Normally this should be done by examining the
++     return value of the __sched_setscheduler call in pthread_start_thread
++     but this is hard to implement.  FIXME  */
++  if (attr != NULL && attr->__schedpolicy != SCHED_OTHER && geteuid () != 0)
++    return EPERM;
++  /* Find a free segment for the thread, and allocate a stack if needed */
++  for (sseg = 2; ; sseg++)
++    {
++      if (sseg >= PTHREAD_THREADS_MAX)
++	return EAGAIN;
++      if (__pthread_handles[sseg].h_descr != NULL)
++	continue;
++      if (pthread_allocate_stack(attr, thread_segment(sseg), pagesize,
++                                 &new_thread, &new_thread_bottom,
++                                 &guardaddr, &guardsize) == 0)
++        break;
++    }
++  __pthread_handles_num++;
++  /* Allocate new thread identifier */
++  pthread_threads_counter += PTHREAD_THREADS_MAX;
++  new_thread_id = sseg + pthread_threads_counter;
++  /* Initialize the thread descriptor.  Elements which have to be
++     initialized to zero already have this value.  */
++  new_thread->p_tid = new_thread_id;
++  new_thread->p_lock = &(__pthread_handles[sseg].h_lock);
++  new_thread->p_cancelstate = PTHREAD_CANCEL_ENABLE;
++  new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED;
++  new_thread->p_errnop = &new_thread->p_errno;
++  new_thread->p_h_errnop = &new_thread->p_h_errno;
++  new_thread->p_guardaddr = guardaddr;
++  new_thread->p_guardsize = guardsize;
++  new_thread->p_self = new_thread;
++  new_thread->p_nr = sseg;
++  /* Initialize the thread handle */
++  __pthread_init_lock(&__pthread_handles[sseg].h_lock);
++  __pthread_handles[sseg].h_descr = new_thread;
++  __pthread_handles[sseg].h_bottom = new_thread_bottom;
++  /* Determine scheduling parameters for the thread */
++  new_thread->p_start_args.schedpolicy = -1;
++  if (attr != NULL) {
++    new_thread->p_detached = attr->__detachstate;
++    new_thread->p_userstack = attr->__stackaddr_set;
++
++    switch(attr->__inheritsched) {
++    case PTHREAD_EXPLICIT_SCHED:
++      new_thread->p_start_args.schedpolicy = attr->__schedpolicy;
++      memcpy (&new_thread->p_start_args.schedparam, &attr->__schedparam,
++	      sizeof (struct sched_param));
++      break;
++    case PTHREAD_INHERIT_SCHED:
++      new_thread->p_start_args.schedpolicy = __sched_getscheduler(father_pid);
++      __sched_getparam(father_pid, &new_thread->p_start_args.schedparam);
++      break;
++    }
++    new_thread->p_priority =
++      new_thread->p_start_args.schedparam.sched_priority;
++  }
++  /* Finish setting up arguments to pthread_start_thread */
++  new_thread->p_start_args.start_routine = start_routine;
++  new_thread->p_start_args.arg = arg;
++  new_thread->p_start_args.mask = *mask;
++  /* Raise priority of thread manager if needed */
++  __pthread_manager_adjust_prio(new_thread->p_priority);
++  /* Do the cloning.  We have to use two different functions depending
++     on whether we are debugging or not.  */
++  pid = 0;     /* Note that the thread never can have PID zero.  */
++  if (report_events)
++    {
++      /* See whether the TD_CREATE event bit is set in any of the
++         masks.  */
++      int idx = __td_eventword (TD_CREATE);
++      uint32_t mask = __td_eventmask (TD_CREATE);
++
++      if ((mask & (__pthread_threads_events.event_bits[idx]
++		   | event_maskp->event_bits[idx])) != 0)
++	{
++	  /* Lock the mutex the child will use now so that it will stop.  */
++	  __pthread_lock(new_thread->p_lock, NULL);
++
++	  /* We have to report this event.  */
++	  pid = __clone(pthread_start_thread_event, (void **) new_thread,
++		        CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
++		        __pthread_sig_cancel, new_thread);
++	  if (pid != -1)
++	    {
++	      /* Now fill in the information about the new thread in
++	         the newly created thread's data structure.  We cannot let
++	         the new thread do this since we don't know whether it was
++	         already scheduled when we send the event.  */
++	      new_thread->p_eventbuf.eventdata = new_thread;
++	      new_thread->p_eventbuf.eventnum = TD_CREATE;
++	      __pthread_last_event = new_thread;
++
++	      /* We have to set the PID here since the callback function
++		 in the debug library will need it and we cannot guarantee
++		 the child got scheduled before the debugger.  */
++	      new_thread->p_pid = pid;
++
++	      /* Now call the function which signals the event.  */
++	      __linuxthreads_create_event ();
++
++	      /* Now restart the thread.  */
++	      __pthread_unlock(new_thread->p_lock);
++	    }
++	}
++    }
++  if (pid == 0)
++    pid = __clone(pthread_start_thread, (void **) new_thread,
++		  CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
++		  __pthread_sig_cancel, new_thread);
++  /* Check if cloning succeeded */
++  if (pid == -1) {
++    /* Free the stack if we allocated it */
++    if (attr == NULL || !attr->__stackaddr_set)
++      {
++	if (new_thread->p_guardsize != 0)
++	  munmap(new_thread->p_guardaddr, new_thread->p_guardsize);
++	munmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
++	       INITIAL_STACK_SIZE);
++      }
++    __pthread_handles[sseg].h_descr = NULL;
++    __pthread_handles[sseg].h_bottom = NULL;
++    __pthread_handles_num--;
++    return errno;
++  }
++  /* Insert new thread in doubly linked list of active threads */
++  new_thread->p_prevlive = __pthread_main_thread;
++  new_thread->p_nextlive = __pthread_main_thread->p_nextlive;
++  __pthread_main_thread->p_nextlive->p_prevlive = new_thread;
++  __pthread_main_thread->p_nextlive = new_thread;
++  /* Set pid field of the new thread, in case we get there before the
++     child starts. */
++  new_thread->p_pid = pid;
++  /* We're all set */
++  *thread = new_thread_id;
++  return 0;
++}
++
++
++/* Try to free the resources of a thread when requested by pthread_join
++   or pthread_detach on a terminated thread. */
++
++static void pthread_free(pthread_descr th)
++{
++  pthread_handle handle;
++  pthread_readlock_info *iter, *next;
++
++  ASSERT(th->p_exited);
++  /* Make the handle invalid */
++  handle =  thread_handle(th->p_tid);
++  __pthread_lock(&handle->h_lock, NULL);
++  handle->h_descr = NULL;
++  handle->h_bottom = (char *)(-1L);
++  __pthread_unlock(&handle->h_lock);
++#ifdef FREE_THREAD_SELF
++  FREE_THREAD_SELF(th, th->p_nr);
++#endif
++  /* One fewer threads in __pthread_handles */
++  __pthread_handles_num--;
++
++  /* Destroy read lock list, and list of free read lock structures.
++     If the former is not empty, it means the thread exited while
++     holding read locks! */
++
++  for (iter = th->p_readlock_list; iter != NULL; iter = next)
++    {
++      next = iter->pr_next;
++      free(iter);
++    }
++
++  for (iter = th->p_readlock_free; iter != NULL; iter = next)
++    {
++      next = iter->pr_next;
++      free(iter);
++    }
++
++  /* If initial thread, nothing to free */
++  if (th == &__pthread_initial_thread) return;
++  if (!th->p_userstack)
++    {
++      /* Free the stack and thread descriptor area */
++      if (th->p_guardsize != 0)
++	munmap(th->p_guardaddr, th->p_guardsize);
++      munmap((caddr_t) ((char *)(th+1) - STACK_SIZE), STACK_SIZE);
++    }
++}
++
++/* Handle threads that have exited */
++
++static void pthread_exited(pid_t pid)
++{
++  pthread_descr th;
++  int detached;
++  /* Find thread with that pid */
++  for (th = __pthread_main_thread->p_nextlive;
++       th != __pthread_main_thread;
++       th = th->p_nextlive) {
++    if (th->p_pid == pid) {
++      /* Remove thread from list of active threads */
++      th->p_nextlive->p_prevlive = th->p_prevlive;
++      th->p_prevlive->p_nextlive = th->p_nextlive;
++      /* Mark thread as exited, and if detached, free its resources */
++      __pthread_lock(th->p_lock, NULL);
++      th->p_exited = 1;
++      /* If we have to signal this event do it now.  */
++      if (th->p_report_events)
++	{
++	  /* See whether TD_DEATH is in any of the mask.  */
++	  int idx = __td_eventword (TD_REAP);
++	  uint32_t mask = __td_eventmask (TD_REAP);
++
++	  if ((mask & (__pthread_threads_events.event_bits[idx]
++		       | th->p_eventbuf.eventmask.event_bits[idx])) != 0)
++	    {
++	      /* Yep, we have to signal the death.  */
++	      th->p_eventbuf.eventnum = TD_DEATH;
++	      th->p_eventbuf.eventdata = th;
++	      __pthread_last_event = th;
++
++	      /* Now call the function to signal the event.  */
++	      __linuxthreads_reap_event();
++	    }
++	}
++      detached = th->p_detached;
++      __pthread_unlock(th->p_lock);
++      if (detached)
++	pthread_free(th);
++      break;
++    }
++  }
++  /* If all threads have exited and the main thread is pending on a
++     pthread_exit, wake up the main thread and terminate ourselves. */
++  if (main_thread_exiting &&
++      __pthread_main_thread->p_nextlive == __pthread_main_thread) {
++    restart(__pthread_main_thread);
++    _exit(0);
++  }
++}
++
++static void pthread_reap_children(void)
++{
++  pid_t pid;
++  int status;
++
++  while ((pid = __libc_waitpid(-1, &status, WNOHANG | __WCLONE)) > 0) {
++    pthread_exited(pid);
++    if (WIFSIGNALED(status)) {
++      /* If a thread died due to a signal, send the same signal to
++         all other threads, including the main thread. */
++      pthread_kill_all_threads(WTERMSIG(status), 1);
++      _exit(0);
++    }
++  }
++}
++
++/* Try to free the resources of a thread when requested by pthread_join
++   or pthread_detach on a terminated thread. */
++
++static void pthread_handle_free(pthread_t th_id)
++{
++  pthread_handle handle = thread_handle(th_id);
++  pthread_descr th;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, th_id)) {
++    /* pthread_reap_children has deallocated the thread already,
++       nothing needs to be done */
++    __pthread_unlock(&handle->h_lock);
++    return;
++  }
++  th = handle->h_descr;
++  if (th->p_exited) {
++    __pthread_unlock(&handle->h_lock);
++    pthread_free(th);
++  } else {
++    /* The Unix process of the thread is still running.
++       Mark the thread as detached so that the thread manager will
++       deallocate its resources when the Unix process exits. */
++    th->p_detached = 1;
++    __pthread_unlock(&handle->h_lock);
++  }
++}
++
++/* Send a signal to all running threads */
++
++static void pthread_kill_all_threads(int sig, int main_thread_also)
++{
++  pthread_descr th;
++  for (th = __pthread_main_thread->p_nextlive;
++       th != __pthread_main_thread;
++       th = th->p_nextlive) {
++    kill(th->p_pid, sig);
++  }
++  if (main_thread_also) {
++    kill(__pthread_main_thread->p_pid, sig);
++  }
++}
++
++/* Process-wide exit() */
++
++static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode)
++{
++  pthread_descr th;
++  __pthread_exit_requested = 1;
++  __pthread_exit_code = exitcode;
++  /* Send the CANCEL signal to all running threads, including the main
++     thread, but excluding the thread from which the exit request originated
++     (that thread must complete the exit, e.g. calling atexit functions
++     and flushing stdio buffers). */
++  for (th = issuing_thread->p_nextlive;
++       th != issuing_thread;
++       th = th->p_nextlive) {
++    kill(th->p_pid, __pthread_sig_cancel);
++  }
++  /* Now, wait for all these threads, so that they don't become zombies
++     and their times are properly added to the thread manager's times. */
++  for (th = issuing_thread->p_nextlive;
++       th != issuing_thread;
++       th = th->p_nextlive) {
++    waitpid(th->p_pid, NULL, __WCLONE);
++  }
++  restart(issuing_thread);
++  _exit(0);
++}
++
++/* Handler for __pthread_sig_cancel in thread manager thread */
++
++void __pthread_manager_sighandler(int sig)
++{
++  terminated_children = 1;
++}
++
++/* Adjust priority of thread manager so that it always run at a priority
++   higher than all threads */
++
++void __pthread_manager_adjust_prio(int thread_prio)
++{
++  struct sched_param param;
++
++  if (thread_prio <= __pthread_manager_thread.p_priority) return;
++  param.sched_priority =
++    thread_prio < __sched_get_priority_max(SCHED_FIFO)
++    ? thread_prio + 1 : thread_prio;
++  __sched_setscheduler(__pthread_manager_thread.p_pid, SCHED_FIFO, &param);
++  __pthread_manager_thread.p_priority = thread_prio;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/mutex.c glibc-2.1.3/linuxthreads/mutex.c
+--- ../glibc-2.1.3/linuxthreads/mutex.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/mutex.c	1998-11-19 09:03:45.000000000 -0800
+@@ -0,0 +1,199 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Mutexes */
++
++#include <errno.h>
++#include <sched.h>
++#include <stddef.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "queue.h"
++#include "restart.h"
++
++int __pthread_mutex_init(pthread_mutex_t * mutex,
++                       const pthread_mutexattr_t * mutex_attr)
++{
++  __pthread_init_lock(&mutex->__m_lock);
++  mutex->__m_kind =
++    mutex_attr == NULL ? PTHREAD_MUTEX_FAST_NP : mutex_attr->__mutexkind;
++  mutex->__m_count = 0;
++  mutex->__m_owner = NULL;
++  return 0;
++}
++strong_alias (__pthread_mutex_init, pthread_mutex_init)
++
++int __pthread_mutex_destroy(pthread_mutex_t * mutex)
++{
++  if (mutex->__m_lock.__status != 0) return EBUSY;
++  return 0;
++}
++strong_alias (__pthread_mutex_destroy, pthread_mutex_destroy)
++
++int __pthread_mutex_trylock(pthread_mutex_t * mutex)
++{
++  pthread_descr self;
++  int retcode;
++
++  switch(mutex->__m_kind) {
++  case PTHREAD_MUTEX_FAST_NP:
++    retcode = __pthread_trylock(&mutex->__m_lock);
++    return retcode;
++  case PTHREAD_MUTEX_RECURSIVE_NP:
++    self = thread_self();
++    if (mutex->__m_owner == self) {
++      mutex->__m_count++;
++      return 0;
++    }
++    retcode = __pthread_trylock(&mutex->__m_lock);
++    if (retcode == 0) {
++      mutex->__m_owner = self;
++      mutex->__m_count = 0;
++    }
++    return retcode;
++  case PTHREAD_MUTEX_ERRORCHECK_NP:
++    retcode = __pthread_trylock(&mutex->__m_lock);
++    if (retcode == 0) {
++      mutex->__m_owner = thread_self();
++    }
++    return retcode;
++  default:
++    return EINVAL;
++  }
++}
++strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock)
++
++int __pthread_mutex_lock(pthread_mutex_t * mutex)
++{
++  pthread_descr self;
++
++  switch(mutex->__m_kind) {
++  case PTHREAD_MUTEX_FAST_NP:
++    __pthread_lock(&mutex->__m_lock, NULL);
++    return 0;
++  case PTHREAD_MUTEX_RECURSIVE_NP:
++    self = thread_self();
++    if (mutex->__m_owner == self) {
++      mutex->__m_count++;
++      return 0;
++    }
++    __pthread_lock(&mutex->__m_lock, self);
++    mutex->__m_owner = self;
++    mutex->__m_count = 0;
++    return 0;
++  case PTHREAD_MUTEX_ERRORCHECK_NP:
++    self = thread_self();
++    if (mutex->__m_owner == self) return EDEADLK;
++    __pthread_lock(&mutex->__m_lock, self);
++    mutex->__m_owner = self;
++    return 0;
++  default:
++    return EINVAL;
++  }
++}
++strong_alias (__pthread_mutex_lock, pthread_mutex_lock)
++
++int __pthread_mutex_unlock(pthread_mutex_t * mutex)
++{
++  switch (mutex->__m_kind) {
++  case PTHREAD_MUTEX_FAST_NP:
++    __pthread_unlock(&mutex->__m_lock);
++    return 0;
++  case PTHREAD_MUTEX_RECURSIVE_NP:
++    if (mutex->__m_count > 0) {
++      mutex->__m_count--;
++      return 0;
++    }
++    mutex->__m_owner = NULL;
++    __pthread_unlock(&mutex->__m_lock);
++    return 0;
++  case PTHREAD_MUTEX_ERRORCHECK_NP:
++    if (mutex->__m_owner != thread_self() || mutex->__m_lock.__status == 0)
++      return EPERM;
++    mutex->__m_owner = NULL;
++    __pthread_unlock(&mutex->__m_lock);
++    return 0;
++  default:
++    return EINVAL;
++  }
++}
++strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock)
++
++int __pthread_mutexattr_init(pthread_mutexattr_t *attr)
++{
++  attr->__mutexkind = PTHREAD_MUTEX_FAST_NP;
++  return 0;
++}
++strong_alias (__pthread_mutexattr_init, pthread_mutexattr_init)
++
++int __pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
++{
++  return 0;
++}
++strong_alias (__pthread_mutexattr_destroy, pthread_mutexattr_destroy)
++
++int __pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind)
++{
++  if (kind != PTHREAD_MUTEX_FAST_NP
++      && kind != PTHREAD_MUTEX_RECURSIVE_NP
++      && kind != PTHREAD_MUTEX_ERRORCHECK_NP)
++    return EINVAL;
++  attr->__mutexkind = kind;
++  return 0;
++}
++weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype)
++strong_alias ( __pthread_mutexattr_settype, __pthread_mutexattr_setkind_np)
++weak_alias (__pthread_mutexattr_setkind_np, pthread_mutexattr_setkind_np)
++
++int __pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind)
++{
++  *kind = attr->__mutexkind;
++  return 0;
++}
++weak_alias (__pthread_mutexattr_gettype, pthread_mutexattr_gettype)
++strong_alias (__pthread_mutexattr_gettype, __pthread_mutexattr_getkind_np)
++weak_alias (__pthread_mutexattr_getkind_np, pthread_mutexattr_getkind_np)
++
++/* Once-only execution */
++
++static pthread_mutex_t once_masterlock = PTHREAD_MUTEX_INITIALIZER;
++static pthread_cond_t once_finished = PTHREAD_COND_INITIALIZER;
++
++enum { NEVER = 0, IN_PROGRESS = 1, DONE = 2 };
++
++int __pthread_once(pthread_once_t * once_control, void (*init_routine)(void))
++{
++  /* Test without locking first for speed */
++  if (*once_control == DONE) return 0;
++  /* Lock and test again */
++  pthread_mutex_lock(&once_masterlock);
++  /* If init_routine is being called from another routine, wait until
++     it completes. */
++  while (*once_control == IN_PROGRESS) {
++    pthread_cond_wait(&once_finished, &once_masterlock);
++  }
++  /* Here *once_control is stable and either NEVER or DONE. */
++  if (*once_control == NEVER) {
++    *once_control = IN_PROGRESS;
++    pthread_mutex_unlock(&once_masterlock);
++    init_routine();
++    pthread_mutex_lock(&once_masterlock);
++    *once_control = DONE;
++    pthread_cond_broadcast(&once_finished);
++  }
++  pthread_mutex_unlock(&once_masterlock);
++  return 0;
++}
++strong_alias (__pthread_once, pthread_once)
+diff -Naur ../glibc-2.1.3/linuxthreads/no-tsd.c glibc-2.1.3/linuxthreads/no-tsd.c
+--- ../glibc-2.1.3/linuxthreads/no-tsd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/no-tsd.c	1999-06-30 08:55:08.000000000 -0700
+@@ -0,0 +1,33 @@
++/* libc-internal interface for thread-specific data.
++   Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <bits/libc-tsd.h>
++
++/* This file provides uinitialized (common) definitions for the
++   hooks used internally by libc to access thread-specific data.
++
++   When -lpthread is used, it provides initialized definitions for these
++   variables (in specific.c), which override these uninitialized definitions.
++
++   If -lpthread is not used, these uninitialized variables default to zero,
++   which the __libc_tsd_* macros check for.   */
++
++void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
++int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
++				     __const void *));
+diff -Naur ../glibc-2.1.3/linuxthreads/oldsemaphore.c glibc-2.1.3/linuxthreads/oldsemaphore.c
+--- ../glibc-2.1.3/linuxthreads/oldsemaphore.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/oldsemaphore.c	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,235 @@
++/*
++ * This file contains the old semaphore code that we need to
++ * preserve for glibc-2.0 backwards compatibility. Port to glibc 2.1
++ * done by Cristian Gafton.
++ */
++
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Semaphores a la POSIX 1003.1b */
++
++#include <errno.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++#include "queue.h"
++
++typedef struct {
++    long int sem_status;
++    int sem_spinlock;
++} old_sem_t;
++
++/* Maximum value the semaphore can have.  */
++#define SEM_VALUE_MAX   ((int) ((~0u) >> 1))
++
++static inline int sem_compare_and_swap(old_sem_t *sem, long oldval, long newval)
++{
++    return compare_and_swap(&sem->sem_status, oldval, newval, &sem->sem_spinlock);
++}
++
++/* The state of a semaphore is represented by a long int encoding
++   either the semaphore count if >= 0 and no thread is waiting on it,
++   or the head of the list of threads waiting for the semaphore.
++   To distinguish the two cases, we encode the semaphore count N
++   as 2N+1, so that it has the lowest bit set.
++
++   A sequence of sem_wait operations on a semaphore initialized to N
++   result in the following successive states:
++     2N+1, 2N-1, ..., 3, 1, &first_waiting_thread, &second_waiting_thread, ...
++*/
++
++static void sem_restart_list(pthread_descr waiting);
++
++int __old_sem_init(old_sem_t *sem, int pshared, unsigned int value)
++{
++    if (value > SEM_VALUE_MAX) {
++	errno = EINVAL;
++	return -1;
++    }
++    if (pshared) {
++	errno = ENOSYS;
++	return -1;
++    }
++  sem->sem_spinlock = 0;
++  sem->sem_status = ((long)value << 1) + 1;
++  return 0;
++}
++
++/* Function called by pthread_cancel to remove the thread from
++   waiting inside __old_sem_wait. Here we simply unconditionally
++   indicate that the thread is to be woken, by returning 1. */
++
++static int old_sem_extricate_func(void *obj, pthread_descr th)
++{
++    return 1;
++}
++
++int __old_sem_wait(old_sem_t * sem)
++{
++    long oldstatus, newstatus;
++    volatile pthread_descr self = thread_self();
++    pthread_descr * th;
++    pthread_extricate_if extr;
++
++    /* Set up extrication interface */
++    extr.pu_object = 0;
++    extr.pu_extricate_func = old_sem_extricate_func;
++
++    while (1) {
++	/* Register extrication interface */
++	__pthread_set_own_extricate_if(self, &extr); 
++	do {
++            oldstatus = sem->sem_status;
++            if ((oldstatus & 1) && (oldstatus != 1))
++		newstatus = oldstatus - 2;
++            else {
++		newstatus = (long) self;
++		self->p_nextwaiting = (pthread_descr) oldstatus;
++	    }
++	}
++	while (! sem_compare_and_swap(sem, oldstatus, newstatus));
++	if (newstatus & 1) {
++	    /* We got the semaphore. */
++	  __pthread_set_own_extricate_if(self, 0); 
++	    return 0;
++	}
++	/* Wait for sem_post or cancellation */
++	suspend(self);
++	__pthread_set_own_extricate_if(self, 0); 
++
++	/* This is a cancellation point */
++	if (self->p_canceled && self->p_cancelstate == PTHREAD_CANCEL_ENABLE) {
++	    /* Remove ourselves from the waiting list if we're still on it */
++	    /* First check if we're at the head of the list. */
++            do {
++		oldstatus = sem->sem_status;
++		if (oldstatus != (long) self) break;
++		newstatus = (long) self->p_nextwaiting;
++	    }
++            while (! sem_compare_and_swap(sem, oldstatus, newstatus));
++            /* Now, check if we're somewhere in the list.
++	       There's a race condition with sem_post here, but it does not matter:
++	       the net result is that at the time pthread_exit is called,
++	       self is no longer reachable from sem->sem_status. */
++            if (oldstatus != (long) self && (oldstatus & 1) == 0) {
++		for (th = &(((pthread_descr) oldstatus)->p_nextwaiting);
++		     *th != NULL && *th != (pthread_descr) 1;
++		     th = &((*th)->p_nextwaiting)) {
++		    if (*th == self) {
++			*th = self->p_nextwaiting;
++			break;
++		    }
++		}
++	    }
++            pthread_exit(PTHREAD_CANCELED);
++	}
++    }
++}
++
++int __old_sem_trywait(old_sem_t * sem)
++{
++  long oldstatus, newstatus;
++
++  do {
++    oldstatus = sem->sem_status;
++    if ((oldstatus & 1) == 0 || (oldstatus == 1)) {
++      errno = EAGAIN;
++      return -1;
++    }
++    newstatus = oldstatus - 2;
++  }
++  while (! sem_compare_and_swap(sem, oldstatus, newstatus));
++  return 0;
++}
++
++int __old_sem_post(old_sem_t * sem)
++{
++  long oldstatus, newstatus;
++
++  do {
++    oldstatus = sem->sem_status;
++    if ((oldstatus & 1) == 0)
++      newstatus = 3;
++    else {
++      if (oldstatus >= SEM_VALUE_MAX) {
++        /* Overflow */
++        errno = ERANGE;
++        return -1;
++      }
++      newstatus = oldstatus + 2;
++    }
++  }
++  while (! sem_compare_and_swap(sem, oldstatus, newstatus));
++  if ((oldstatus & 1) == 0)
++    sem_restart_list((pthread_descr) oldstatus);
++  return 0;
++}
++
++int __old_sem_getvalue(old_sem_t * sem, int * sval)
++{
++  long status = sem->sem_status;
++  if (status & 1)
++    *sval = (int)((unsigned long) status >> 1);
++  else
++    *sval = 0;
++  return 0;
++}
++
++int __old_sem_destroy(old_sem_t * sem)
++{
++  if ((sem->sem_status & 1) == 0) {
++    errno = EBUSY;
++    return -1;
++  }
++  return 0;
++}
++
++/* Auxiliary function for restarting all threads on a waiting list,
++   in priority order. */
++
++static void sem_restart_list(pthread_descr waiting)
++{
++  pthread_descr th, towake, *p;
++
++  /* Sort list of waiting threads by decreasing priority (insertion sort) */
++  towake = NULL;
++  while (waiting != (pthread_descr) 1) {
++    th = waiting;
++    waiting = waiting->p_nextwaiting;
++    p = &towake;
++    while (*p != NULL && th->p_priority < (*p)->p_priority)
++      p = &((*p)->p_nextwaiting);
++    th->p_nextwaiting = *p;
++    *p = th;
++  }
++  /* Wake up threads in priority order */
++  while (towake != NULL) {
++    th = towake;
++    towake = towake->p_nextwaiting;
++    th->p_nextwaiting = NULL;
++    restart(th);
++  }
++}
++
++#if defined PIC && DO_VERSIONING
++symbol_version (__old_sem_init, sem_init, GLIBC_2.0);
++symbol_version (__old_sem_wait, sem_wait, GLIBC_2.0);
++symbol_version (__old_sem_trywait, sem_trywait, GLIBC_2.0);
++symbol_version (__old_sem_post, sem_post, GLIBC_2.0);
++symbol_version (__old_sem_getvalue, sem_getvalue, GLIBC_2.0);
++symbol_version (__old_sem_destroy, sem_destroy, GLIBC_2.0);
++#endif
++
+diff -Naur ../glibc-2.1.3/linuxthreads/pt-machine.c glibc-2.1.3/linuxthreads/pt-machine.c
+--- ../glibc-2.1.3/linuxthreads/pt-machine.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/pt-machine.c	1998-10-09 04:19:05.000000000 -0700
+@@ -0,0 +1,22 @@
++/* "Instantiation of machine-dependent pthreads inline functions.
++   Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#define PT_EI
++
++#include <pt-machine.h>
+diff -Naur ../glibc-2.1.3/linuxthreads/ptfork.c glibc-2.1.3/linuxthreads/ptfork.c
+--- ../glibc-2.1.3/linuxthreads/ptfork.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/ptfork.c	1999-09-07 01:05:20.000000000 -0700
+@@ -0,0 +1,105 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* The "atfork" stuff */
++
++#include <errno.h>
++#include <stddef.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include "pthread.h"
++#include "internals.h"
++
++struct handler_list {
++  void (*handler)(void);
++  struct handler_list * next;
++};
++
++static pthread_mutex_t pthread_atfork_lock = PTHREAD_MUTEX_INITIALIZER;
++static struct handler_list * pthread_atfork_prepare = NULL;
++static struct handler_list * pthread_atfork_parent = NULL;
++static struct handler_list * pthread_atfork_child = NULL;
++
++static void pthread_insert_list(struct handler_list ** list,
++                                void (*handler)(void),
++                                struct handler_list * newlist,
++                                int at_end)
++{
++  if (handler == NULL) return;
++  if (at_end) {
++    while(*list != NULL) list = &((*list)->next);
++  }
++  newlist->handler = handler;
++  newlist->next = *list;
++  *list = newlist;
++}
++
++struct handler_list_block {
++  struct handler_list prepare, parent, child;
++};
++
++int __pthread_atfork(void (*prepare)(void),
++		     void (*parent)(void),
++		     void (*child)(void))
++{
++  struct handler_list_block * block =
++    (struct handler_list_block *) malloc(sizeof(struct handler_list_block));
++  if (block == NULL) return ENOMEM;
++  pthread_mutex_lock(&pthread_atfork_lock);
++  /* "prepare" handlers are called in LIFO */
++  pthread_insert_list(&pthread_atfork_prepare, prepare, &block->prepare, 0);
++  /* "parent" handlers are called in FIFO */
++  pthread_insert_list(&pthread_atfork_parent, parent, &block->parent, 1);
++  /* "child" handlers are called in FIFO */
++  pthread_insert_list(&pthread_atfork_child, child, &block->child, 1);
++  pthread_mutex_unlock(&pthread_atfork_lock);
++  return 0;
++}
++strong_alias (__pthread_atfork, pthread_atfork)
++
++static inline void pthread_call_handlers(struct handler_list * list)
++{
++  for (/*nothing*/; list != NULL; list = list->next) (list->handler)();
++}
++
++extern int __libc_fork(void);
++
++pid_t __fork(void)
++{
++  pid_t pid;
++  struct handler_list * prepare, * child, * parent;
++
++  pthread_mutex_lock(&pthread_atfork_lock);
++  prepare = pthread_atfork_prepare;
++  child = pthread_atfork_child;
++  parent = pthread_atfork_parent;
++  pthread_mutex_unlock(&pthread_atfork_lock);
++  pthread_call_handlers(prepare);
++  pid = __libc_fork();
++  if (pid == 0) {
++    __pthread_reset_main_thread();
++    __fresetlockfiles();
++    pthread_call_handlers(child);
++  } else {
++    pthread_call_handlers(parent);
++  }
++  return pid;
++}
++weak_alias (__fork, fork);
++
++pid_t __vfork(void)
++{
++  return __fork();
++}
++weak_alias (__vfork, vfork);
+diff -Naur ../glibc-2.1.3/linuxthreads/pthread.c glibc-2.1.3/linuxthreads/pthread.c
+--- ../glibc-2.1.3/linuxthreads/pthread.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/pthread.c	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,840 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Thread creation, initialization, and basic low-level routines */
++
++#include <errno.h>
++#include <stddef.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <sys/wait.h>
++#include <sys/resource.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++
++/* Descriptor of the initial thread */
++
++struct _pthread_descr_struct __pthread_initial_thread = {
++  &__pthread_initial_thread,  /* pthread_descr p_nextlive */
++  &__pthread_initial_thread,  /* pthread_descr p_prevlive */
++  NULL,                       /* pthread_descr p_nextwaiting */
++  NULL,			      /* pthread_descr p_nextlock */
++  PTHREAD_THREADS_MAX,        /* pthread_t p_tid */
++  0,                          /* int p_pid */
++  0,                          /* int p_priority */
++  &__pthread_handles[0].h_lock, /* struct _pthread_fastlock * p_lock */
++  0,                          /* int p_signal */
++  NULL,                       /* sigjmp_buf * p_signal_buf */
++  NULL,                       /* sigjmp_buf * p_cancel_buf */
++  0,                          /* char p_terminated */
++  0,                          /* char p_detached */
++  0,                          /* char p_exited */
++  NULL,                       /* void * p_retval */
++  0,                          /* int p_retval */
++  NULL,                       /* pthread_descr p_joining */
++  NULL,                       /* struct _pthread_cleanup_buffer * p_cleanup */
++  0,                          /* char p_cancelstate */
++  0,                          /* char p_canceltype */
++  0,                          /* char p_canceled */
++  NULL,                       /* int *p_errnop */
++  0,                          /* int p_errno */
++  NULL,                       /* int *p_h_errnop */
++  0,                          /* int p_h_errno */
++  NULL,                       /* char * p_in_sighandler */
++  0,                          /* char p_sigwaiting */
++  PTHREAD_START_ARGS_INITIALIZER, /* struct pthread_start_args p_start_args */
++  {NULL},                     /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */
++  {NULL},                     /* void * p_libc_specific[_LIBC_TSD_KEY_N] */
++  0,                          /* int p_userstack */
++  NULL,                       /* void * p_guardaddr */
++  0,                          /* size_t p_guardsize */
++  &__pthread_initial_thread,  /* pthread_descr p_self */
++  0,                          /* Always index 0 */
++  0,                          /* int p_report_events */
++  {{{0, }}, 0, NULL},         /* td_eventbuf_t p_eventbuf */
++  ATOMIC_INITIALIZER,         /* struct pthread_atomic p_resume_count */
++  0,                          /* char p_woken_by_cancel */
++  NULL,                       /* struct pthread_extricate_if *p_extricate */
++  NULL,	                      /* pthread_readlock_info *p_readlock_list; */
++  NULL,                       /* pthread_readlock_info *p_readlock_free; */
++  0                           /* int p_untracked_readlock_count; */
++};
++
++/* Descriptor of the manager thread; none of this is used but the error
++   variables, the p_pid and p_priority fields,
++   and the address for identification.  */
++
++struct _pthread_descr_struct __pthread_manager_thread = {
++  NULL,                       /* pthread_descr p_nextlive */
++  NULL,                       /* pthread_descr p_prevlive */
++  NULL,                       /* pthread_descr p_nextwaiting */
++  NULL,			      /* pthread_descr p_nextlock */
++  0,                          /* int p_tid */
++  0,                          /* int p_pid */
++  0,                          /* int p_priority */
++  &__pthread_handles[1].h_lock, /* struct _pthread_fastlock * p_lock */
++  0,                          /* int p_signal */
++  NULL,                       /* sigjmp_buf * p_signal_buf */
++  NULL,                       /* sigjmp_buf * p_cancel_buf */
++  0,                          /* char p_terminated */
++  0,                          /* char p_detached */
++  0,                          /* char p_exited */
++  NULL,                       /* void * p_retval */
++  0,                          /* int p_retval */
++  NULL,                       /* pthread_descr p_joining */
++  NULL,                       /* struct _pthread_cleanup_buffer * p_cleanup */
++  0,                          /* char p_cancelstate */
++  0,                          /* char p_canceltype */
++  0,                          /* char p_canceled */
++  &__pthread_manager_thread.p_errno, /* int *p_errnop */
++  0,                          /* int p_errno */
++  NULL,                       /* int *p_h_errnop */
++  0,                          /* int p_h_errno */
++  NULL,                       /* char * p_in_sighandler */
++  0,                          /* char p_sigwaiting */
++  PTHREAD_START_ARGS_INITIALIZER, /* struct pthread_start_args p_start_args */
++  {NULL},                     /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */
++  {NULL},                     /* void * p_libc_specific[_LIBC_TSD_KEY_N] */
++  0,                          /* int p_userstack */
++  NULL,                       /* void * p_guardaddr */
++  0,                          /* size_t p_guardsize */
++  &__pthread_manager_thread,  /* pthread_descr p_self */
++  1,                          /* Always index 1 */
++  0,                          /* int p_report_events */
++  {{{0, }}, 0, NULL},         /* td_eventbuf_t p_eventbuf */
++  ATOMIC_INITIALIZER,         /* struct pthread_atomic p_resume_count */
++  0,                          /* char p_woken_by_cancel */
++  NULL,                       /* struct pthread_extricate_if *p_extricate */
++  NULL,	                      /* pthread_readlock_info *p_readlock_list; */
++  NULL,                       /* pthread_readlock_info *p_readlock_free; */
++  0                           /* int p_untracked_readlock_count; */
++};
++
++/* Pointer to the main thread (the father of the thread manager thread) */
++/* Originally, this is the initial thread, but this changes after fork() */
++
++pthread_descr __pthread_main_thread = &__pthread_initial_thread;
++
++/* Limit between the stack of the initial thread (above) and the
++   stacks of other threads (below). Aligned on a STACK_SIZE boundary. */
++
++char *__pthread_initial_thread_bos = NULL;
++
++/* File descriptor for sending requests to the thread manager. */
++/* Initially -1, meaning that the thread manager is not running. */
++
++int __pthread_manager_request = -1;
++
++/* Other end of the pipe for sending requests to the thread manager. */
++
++int __pthread_manager_reader;
++
++/* Limits of the thread manager stack */
++
++char *__pthread_manager_thread_bos = NULL;
++char *__pthread_manager_thread_tos = NULL;
++
++/* For process-wide exit() */
++
++int __pthread_exit_requested = 0;
++int __pthread_exit_code = 0;
++
++/* Pointers that select new or old suspend/resume functions
++   based on availability of rt signals. */
++
++void (*__pthread_restart)(pthread_descr) = __pthread_restart_old;
++void (*__pthread_suspend)(pthread_descr) = __pthread_suspend_old;
++
++/* Communicate relevant LinuxThreads constants to gdb */
++
++const int __pthread_threads_max = PTHREAD_THREADS_MAX;
++const int __pthread_sizeof_handle = sizeof(struct pthread_handle_struct);
++const int __pthread_offsetof_descr = offsetof(struct pthread_handle_struct,
++                                              h_descr);
++const int __pthread_offsetof_pid = offsetof(struct _pthread_descr_struct,
++                                            p_pid);
++
++/* These variables are used by the setup code.  */
++extern int _errno;
++extern int _h_errno;
++
++/* Forward declarations */
++
++static void pthread_exit_process(int retcode, void *arg);
++#ifndef __i386__
++static void pthread_handle_sigcancel(int sig);
++static void pthread_handle_sigrestart(int sig);
++#else
++static void pthread_handle_sigcancel(int sig, struct sigcontext ctx);
++static void pthread_handle_sigrestart(int sig, struct sigcontext ctx);
++#endif
++static void pthread_handle_sigdebug(int sig);
++
++/* Signal numbers used for the communication.
++   In these variables we keep track of the used variables.  If the
++   platform does not support any real-time signals we will define the
++   values to some unreasonable value which will signal failing of all
++   the functions below.  */
++#ifndef __SIGRTMIN
++static int current_rtmin = -1;
++static int current_rtmax = -1;
++int __pthread_sig_restart = SIGUSR1;
++int __pthread_sig_cancel = SIGUSR2;
++int __pthread_sig_debug = 0;
++#else
++static int current_rtmin;
++static int current_rtmax;
++
++#if __SIGRTMAX - __SIGRTMIN >= 3
++int __pthread_sig_restart = __SIGRTMIN;
++int __pthread_sig_cancel = __SIGRTMIN + 1;
++int __pthread_sig_debug = __SIGRTMIN + 2;
++#else
++int __pthread_sig_restart = SIGUSR1;
++int __pthread_sig_cancel = SIGUSR2;
++int __pthread_sig_debug = 0;
++#endif
++
++static int rtsigs_initialized;
++
++#include "testrtsig.h"
++
++static void
++init_rtsigs (void)
++{
++  if (!kernel_has_rtsig ())
++    {
++      current_rtmin = -1;
++      current_rtmax = -1;
++#if __SIGRTMAX - __SIGRTMIN >= 3
++      __pthread_sig_restart = SIGUSR1;
++      __pthread_sig_cancel = SIGUSR2;
++      __pthread_sig_debug = 0;
++#endif
++      __pthread_init_condvar(0);
++    }
++  else
++    {
++#if __SIGRTMAX - __SIGRTMIN >= 3
++      current_rtmin = __SIGRTMIN + 3;
++      __pthread_restart = __pthread_restart_new;
++      __pthread_suspend = __pthread_wait_for_restart_signal;
++      __pthread_init_condvar(1);
++#else
++      current_rtmin = __SIGRTMIN;
++      __pthread_init_condvar(0);
++#endif
++
++      current_rtmax = __SIGRTMAX;
++    }
++
++  rtsigs_initialized = 1;
++}
++#endif
++
++/* Return number of available real-time signal with highest priority.  */
++int
++__libc_current_sigrtmin (void)
++{
++#ifdef __SIGRTMIN
++  if (!rtsigs_initialized)
++    init_rtsigs ();
++#endif
++  return current_rtmin;
++}
++
++/* Return number of available real-time signal with lowest priority.  */
++int
++__libc_current_sigrtmax (void)
++{
++#ifdef __SIGRTMIN
++  if (!rtsigs_initialized)
++    init_rtsigs ();
++#endif
++  return current_rtmax;
++}
++
++/* Allocate real-time signal with highest/lowest available
++   priority.  Please note that we don't use a lock since we assume
++   this function to be called at program start.  */
++int
++__libc_allocate_rtsig (int high)
++{
++#ifndef __SIGRTMIN
++  return -1;
++#else
++  if (!rtsigs_initialized)
++    init_rtsigs ();
++  if (current_rtmin == -1 || current_rtmin > current_rtmax)
++    /* We don't have anymore signal available.  */
++    return -1;
++
++  return high ? current_rtmin++ : current_rtmax--;
++#endif
++}
++
++/* Initialize the pthread library.
++   Initialization is split in two functions:
++   - a constructor function that blocks the __pthread_sig_restart signal
++     (must do this very early, since the program could capture the signal
++      mask with e.g. sigsetjmp before creating the first thread);
++   - a regular function called from pthread_create when needed. */
++
++static void pthread_initialize(void) __attribute__((constructor));
++
++static void pthread_initialize(void)
++{
++  struct sigaction sa;
++  sigset_t mask;
++  struct rlimit limit;
++  int max_stack;
++
++  /* If already done (e.g. by a constructor called earlier!), bail out */
++  if (__pthread_initial_thread_bos != NULL) return;
++#ifdef TEST_FOR_COMPARE_AND_SWAP
++  /* Test if compare-and-swap is available */
++  __pthread_has_cas = compare_and_swap_is_available();
++#endif
++  /* For the initial stack, reserve at least STACK_SIZE bytes of stack
++     below the current stack address, and align that on a
++     STACK_SIZE boundary. */
++  __pthread_initial_thread_bos =
++    (char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
++  /* Update the descriptor for the initial thread. */
++  __pthread_initial_thread.p_pid = __getpid();
++  /* If we have special thread_self processing, initialize that for the
++     main thread now.  */
++#ifdef INIT_THREAD_SELF
++  INIT_THREAD_SELF(&__pthread_initial_thread, 0);
++#endif
++  /* The errno/h_errno variable of the main thread are the global ones.  */
++  __pthread_initial_thread.p_errnop = &_errno;
++  __pthread_initial_thread.p_h_errnop = &_h_errno;
++  /* Play with the stack size limit to make sure that no stack ever grows
++     beyond STACK_SIZE minus two pages (one page for the thread descriptor
++     immediately beyond, and one page to act as a guard page). */
++  getrlimit(RLIMIT_STACK, &limit);
++  max_stack = STACK_SIZE - 2 * __getpagesize();
++  if (limit.rlim_cur > max_stack) {
++    limit.rlim_cur = max_stack;
++    setrlimit(RLIMIT_STACK, &limit);
++  }
++#ifdef __SIGRTMIN
++  /* Initialize real-time signals. */
++  init_rtsigs ();
++#endif
++  /* Setup signal handlers for the initial thread.
++     Since signal handlers are shared between threads, these settings
++     will be inherited by all other threads. */
++#ifndef __i386__
++  sa.sa_handler = pthread_handle_sigrestart;
++#else
++  sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart;
++#endif
++  sigemptyset(&sa.sa_mask);
++  sa.sa_flags = 0;
++  __sigaction(__pthread_sig_restart, &sa, NULL);
++#ifndef __i386__
++  sa.sa_handler = pthread_handle_sigcancel;
++#else
++  sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel;
++#endif
++  sa.sa_flags = 0;
++  __sigaction(__pthread_sig_cancel, &sa, NULL);
++  if (__pthread_sig_debug > 0) {
++    sa.sa_handler = pthread_handle_sigdebug;
++    sigemptyset(&sa.sa_mask);
++    sa.sa_flags = 0;
++    __sigaction(__pthread_sig_debug, &sa, NULL);
++  }
++  /* Initially, block __pthread_sig_restart. Will be unblocked on demand. */
++  sigemptyset(&mask);
++  sigaddset(&mask, __pthread_sig_restart);
++  sigprocmask(SIG_BLOCK, &mask, NULL);
++  /* Register an exit function to kill all other threads. */
++  /* Do it early so that user-registered atexit functions are called
++     before pthread_exit_process. */
++  __on_exit(pthread_exit_process, NULL);
++}
++
++void __pthread_initialize(void)
++{
++  pthread_initialize();
++}
++
++int __pthread_initialize_manager(void)
++{
++  int manager_pipe[2];
++  int pid;
++  struct pthread_request request;
++
++  /* If basic initialization not done yet (e.g. we're called from a
++     constructor run before our constructor), do it now */
++  if (__pthread_initial_thread_bos == NULL) pthread_initialize();
++  /* Setup stack for thread manager */
++  __pthread_manager_thread_bos = malloc(THREAD_MANAGER_STACK_SIZE);
++  if (__pthread_manager_thread_bos == NULL) return -1;
++  __pthread_manager_thread_tos =
++    __pthread_manager_thread_bos + THREAD_MANAGER_STACK_SIZE;
++  /* Setup pipe to communicate with thread manager */
++  if (pipe(manager_pipe) == -1) {
++    free(__pthread_manager_thread_bos);
++    return -1;
++  }
++  /* Start the thread manager */
++  pid = 0;
++  if (__pthread_initial_thread.p_report_events)
++    {
++      /* It's a bit more complicated.  We have to report the creation of
++	 the manager thread.  */
++      int idx = __td_eventword (TD_CREATE);
++      uint32_t mask = __td_eventmask (TD_CREATE);
++
++      if ((mask & (__pthread_threads_events.event_bits[idx]
++		   | __pthread_initial_thread.p_eventbuf.eventmask.event_bits[idx]))
++	  != 0)
++	{
++	  pid = __clone(__pthread_manager_event,
++			(void **) __pthread_manager_thread_tos,
++			CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
++			(void *)(long)manager_pipe[0]);
++
++	  if (pid != -1)
++	    {
++	      /* Now fill in the information about the new thread in
++	         the newly created thread's data structure.  We cannot let
++	         the new thread do this since we don't know whether it was
++	         already scheduled when we send the event.  */
++	      __pthread_manager_thread.p_eventbuf.eventdata =
++		&__pthread_manager_thread;
++	      __pthread_manager_thread.p_eventbuf.eventnum = TD_CREATE;
++	      __pthread_last_event = &__pthread_manager_thread;
++	      __pthread_manager_thread.p_tid = 2* PTHREAD_THREADS_MAX + 1;
++	      __pthread_manager_thread.p_pid = pid;
++
++	      /* Now call the function which signals the event.  */
++	      __linuxthreads_create_event ();
++
++	      /* Now restart the thread.  */
++	      __pthread_unlock(__pthread_manager_thread.p_lock);
++	    }
++	}
++    }
++
++  if (pid == 0)
++    pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos,
++		  CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
++		  (void *)(long)manager_pipe[0]);
++  if (pid == -1) {
++    free(__pthread_manager_thread_bos);
++    __libc_close(manager_pipe[0]);
++    __libc_close(manager_pipe[1]);
++    return -1;
++  }
++  __pthread_manager_request = manager_pipe[1]; /* writing end */
++  __pthread_manager_reader = manager_pipe[0]; /* reading end */
++  __pthread_manager_thread.p_tid = 2* PTHREAD_THREADS_MAX + 1;
++  __pthread_manager_thread.p_pid = pid;
++  /* Make gdb aware of new thread manager */
++  if (__pthread_threads_debug && __pthread_sig_debug > 0)
++    {
++      raise(__pthread_sig_debug);
++      /* We suspend ourself and gdb will wake us up when it is
++	 ready to handle us. */
++      __pthread_wait_for_restart_signal(thread_self());
++    }
++  /* Synchronize debugging of the thread manager */
++  request.req_kind = REQ_DEBUG;
++  __libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
++  return 0;
++}
++
++/* Thread creation */
++
++int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr,
++			 void * (*start_routine)(void *), void *arg)
++{
++  pthread_descr self = thread_self();
++  struct pthread_request request;
++  if (__pthread_manager_request < 0) {
++    if (__pthread_initialize_manager() < 0) return EAGAIN;
++  }
++  request.req_thread = self;
++  request.req_kind = REQ_CREATE;
++  request.req_args.create.attr = attr;
++  request.req_args.create.fn = start_routine;
++  request.req_args.create.arg = arg;
++  sigprocmask(SIG_SETMASK, (const sigset_t *) NULL,
++              &request.req_args.create.mask);
++  __libc_write(__pthread_manager_request, (char *) &request, sizeof(request));
++  suspend(self);
++  if (THREAD_GETMEM(self, p_retcode) == 0)
++    *thread = (pthread_t) THREAD_GETMEM(self, p_retval);
++  return THREAD_GETMEM(self, p_retcode);
++}
++
++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
++default_symbol_version (__pthread_create_2_1, pthread_create, GLIBC_2.1);
++
++int __pthread_create_2_0(pthread_t *thread, const pthread_attr_t *attr,
++			 void * (*start_routine)(void *), void *arg)
++{
++  /* The ATTR attribute is not really of type `pthread_attr_t *'.  It has
++     the old size and access to the new members might crash the program.
++     We convert the struct now.  */
++  pthread_attr_t new_attr;
++
++  if (attr != NULL)
++    {
++      size_t ps = __getpagesize ();
++
++      memcpy (&new_attr, attr,
++	      (size_t) &(((pthread_attr_t*)NULL)->__guardsize));
++      new_attr.__guardsize = ps;
++      new_attr.__stackaddr_set = 0;
++      new_attr.__stackaddr = NULL;
++      new_attr.__stacksize = STACK_SIZE - ps;
++      attr = &new_attr;
++    }
++  return __pthread_create_2_1 (thread, attr, start_routine, arg);
++}
++symbol_version (__pthread_create_2_0, pthread_create, GLIBC_2.0);
++#else
++strong_alias (__pthread_create_2_1, pthread_create)
++#endif
++
++/* Simple operations on thread identifiers */
++
++pthread_t pthread_self(void)
++{
++  pthread_descr self = thread_self();
++  return THREAD_GETMEM(self, p_tid);
++}
++
++int pthread_equal(pthread_t thread1, pthread_t thread2)
++{
++  return thread1 == thread2;
++}
++
++/* Helper function for thread_self in the case of user-provided stacks */
++
++#ifndef THREAD_SELF
++
++pthread_descr __pthread_find_self()
++{
++  char * sp = CURRENT_STACK_FRAME;
++  pthread_handle h;
++
++  /* __pthread_handles[0] is the initial thread, __pthread_handles[1] is
++     the manager threads handled specially in thread_self(), so start at 2 */
++  h = __pthread_handles + 2;
++  while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom)) h++;
++  return h->h_descr;
++}
++
++#endif
++
++/* Thread scheduling */
++
++int pthread_setschedparam(pthread_t thread, int policy,
++                          const struct sched_param *param)
++{
++  pthread_handle handle = thread_handle(thread);
++  pthread_descr th;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, thread)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++  th = handle->h_descr;
++  if (__sched_setscheduler(th->p_pid, policy, param) == -1) {
++    __pthread_unlock(&handle->h_lock);
++    return errno;
++  }
++  th->p_priority = policy == SCHED_OTHER ? 0 : param->sched_priority;
++  __pthread_unlock(&handle->h_lock);
++  if (__pthread_manager_request >= 0)
++    __pthread_manager_adjust_prio(th->p_priority);
++  return 0;
++}
++
++int pthread_getschedparam(pthread_t thread, int *policy,
++                          struct sched_param *param)
++{
++  pthread_handle handle = thread_handle(thread);
++  int pid, pol;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, thread)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++  pid = handle->h_descr->p_pid;
++  __pthread_unlock(&handle->h_lock);
++  pol = __sched_getscheduler(pid);
++  if (pol == -1) return errno;
++  if (__sched_getparam(pid, param) == -1) return errno;
++  *policy = pol;
++  return 0;
++}
++
++/* Process-wide exit() request */
++
++static void pthread_exit_process(int retcode, void *arg)
++{
++  struct pthread_request request;
++  pthread_descr self = thread_self();
++
++  if (__pthread_manager_request >= 0) {
++    request.req_thread = self;
++    request.req_kind = REQ_PROCESS_EXIT;
++    request.req_args.exit.code = retcode;
++    __libc_write(__pthread_manager_request,
++		 (char *) &request, sizeof(request));
++    suspend(self);
++    /* Main thread should accumulate times for thread manager and its
++       children, so that timings for main thread account for all threads. */
++    if (self == __pthread_main_thread)
++      waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
++  }
++}
++
++/* The handler for the RESTART signal just records the signal received
++   in the thread descriptor, and optionally performs a siglongjmp
++   (for pthread_cond_timedwait). */
++
++#ifndef __i386__
++static void pthread_handle_sigrestart(int sig)
++{
++  pthread_descr self = thread_self();
++#else
++static void pthread_handle_sigrestart(int sig, struct sigcontext ctx)
++{
++  pthread_descr self;
++  asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
++  self = thread_self();
++#endif
++  THREAD_SETMEM(self, p_signal, sig);
++  if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
++    siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
++}
++
++/* The handler for the CANCEL signal checks for cancellation
++   (in asynchronous mode), for process-wide exit and exec requests.
++   For the thread manager thread, redirect the signal to
++   __pthread_manager_sighandler. */
++
++#ifndef __i386__
++static void pthread_handle_sigcancel(int sig)
++{
++  pthread_descr self = thread_self();
++  sigjmp_buf * jmpbuf;
++#else
++static void pthread_handle_sigcancel(int sig, struct sigcontext ctx)
++{
++  pthread_descr self;
++  sigjmp_buf * jmpbuf;
++  asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
++  self = thread_self();
++#endif
++
++  if (self == &__pthread_manager_thread)
++    {
++      __pthread_manager_sighandler(sig);
++      return;
++    }
++  if (__pthread_exit_requested) {
++    /* Main thread should accumulate times for thread manager and its
++       children, so that timings for main thread account for all threads. */
++    if (self == __pthread_main_thread)
++      waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
++    _exit(__pthread_exit_code);
++  }
++  if (THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++    if (THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS)
++      pthread_exit(PTHREAD_CANCELED);
++    jmpbuf = THREAD_GETMEM(self, p_cancel_jmp);
++    if (jmpbuf != NULL) {
++      THREAD_SETMEM(self, p_cancel_jmp, NULL);
++      siglongjmp(*jmpbuf, 1);
++    }
++  }
++}
++
++/* Handler for the DEBUG signal.
++   The debugging strategy is as follows:
++   On reception of a REQ_DEBUG request (sent by new threads created to
++   the thread manager under debugging mode), the thread manager throws
++   __pthread_sig_debug to itself. The debugger (if active) intercepts
++   this signal, takes into account new threads and continue execution
++   of the thread manager by propagating the signal because it doesn't
++   know what it is specifically done for. In the current implementation,
++   the thread manager simply discards it. */
++
++static void pthread_handle_sigdebug(int sig)
++{
++  /* Nothing */
++}
++
++/* Reset the state of the thread machinery after a fork().
++   Close the pipe used for requests and set the main thread to the forked
++   thread.
++   Notice that we can't free the stack segments, as the forked thread
++   may hold pointers into them. */
++
++void __pthread_reset_main_thread()
++{
++  pthread_descr self = thread_self();
++
++  if (__pthread_manager_request != -1) {
++    /* Free the thread manager stack */
++    free(__pthread_manager_thread_bos);
++    __pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL;
++    /* Close the two ends of the pipe */
++    __libc_close(__pthread_manager_request);
++    __libc_close(__pthread_manager_reader);
++    __pthread_manager_request = __pthread_manager_reader = -1;
++  }
++
++  /* Update the pid of the main thread */
++  THREAD_SETMEM(self, p_pid, __getpid());
++  /* Make the forked thread the main thread */
++  __pthread_main_thread = self;
++  THREAD_SETMEM(self, p_nextlive, self);
++  THREAD_SETMEM(self, p_prevlive, self);
++  /* Now this thread modifies the global variables.  */
++  THREAD_SETMEM(self, p_errnop, &_errno);
++  THREAD_SETMEM(self, p_h_errnop, &_h_errno);
++}
++
++/* Process-wide exec() request */
++
++void __pthread_kill_other_threads_np(void)
++{
++  struct sigaction sa;
++  /* Terminate all other threads and thread manager */
++  pthread_exit_process(0, NULL);
++  /* Make current thread the main thread in case the calling thread
++     changes its mind, does not exec(), and creates new threads instead. */
++  __pthread_reset_main_thread();
++  /* Reset the signal handlers behaviour for the signals the
++     implementation uses since this would be passed to the new
++     process.  */
++  sigemptyset(&sa.sa_mask);
++  sa.sa_flags = 0;
++  sa.sa_handler = SIG_DFL;
++  __sigaction(__pthread_sig_restart, &sa, NULL);
++  __sigaction(__pthread_sig_cancel, &sa, NULL);
++  if (__pthread_sig_debug > 0)
++    __sigaction(__pthread_sig_debug, &sa, NULL);
++}
++weak_alias (__pthread_kill_other_threads_np, pthread_kill_other_threads_np)
++
++/* Concurrency symbol level.  */
++static int current_level;
++
++int __pthread_setconcurrency(int level)
++{
++  /* We don't do anything unless we have found a useful interpretation.  */
++  current_level = level;
++  return 0;
++}
++weak_alias (__pthread_setconcurrency, pthread_setconcurrency)
++
++int __pthread_getconcurrency(void)
++{
++  return current_level;
++}
++weak_alias (__pthread_getconcurrency, pthread_getconcurrency)
++
++void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif)
++{
++  __pthread_lock(self->p_lock, self);
++  THREAD_SETMEM(self, p_extricate, peif);
++  __pthread_unlock(self->p_lock);
++}
++
++/* Primitives for controlling thread execution */
++
++void __pthread_wait_for_restart_signal(pthread_descr self)
++{
++  sigset_t mask;
++
++  sigprocmask(SIG_SETMASK, NULL, &mask); /* Get current signal mask */
++  sigdelset(&mask, __pthread_sig_restart); /* Unblock the restart signal */
++  do {
++    self->p_signal = 0;
++    sigsuspend(&mask);                   /* Wait for signal */
++  } while (self->p_signal !=__pthread_sig_restart );
++}
++
++/* The _old variants are for 2.0 and early 2.1 kernels which don't have RT signals.
++   On these kernels, we use SIGUSR1 and SIGUSR2 for restart and cancellation.
++   Since the restart signal does not queue, we use an atomic counter to create
++   queuing semantics. This is needed to resolve a rare race condition in
++   pthread_cond_timedwait_relative. */
++
++void __pthread_restart_old(pthread_descr th)
++{
++  if (atomic_increment(&th->p_resume_count) == -1)
++    kill(th->p_pid, __pthread_sig_restart);
++}
++
++void __pthread_suspend_old(pthread_descr self)
++{
++  if (atomic_decrement(&self->p_resume_count) <= 0)
++    __pthread_wait_for_restart_signal(self);
++}
++
++void __pthread_restart_new(pthread_descr th)
++{
++    kill(th->p_pid, __pthread_sig_restart);
++}
++
++/* There is no __pthread_suspend_new because it would just
++   be a wasteful wrapper for __pthread_wait_for_restart_signal */
++
++/* Debugging aid */
++
++#ifdef DEBUG
++#include <stdarg.h>
++
++void __pthread_message(char * fmt, ...)
++{
++  char buffer[1024];
++  va_list args;
++  sprintf(buffer, "%05d : ", __getpid());
++  va_start(args, fmt);
++  vsnprintf(buffer + 8, sizeof(buffer) - 8, fmt, args);
++  va_end(args);
++  __libc_write(2, buffer, strlen(buffer));
++}
++
++#endif
++
++
++#ifndef PIC
++/* We need a hook to force the cancelation wrappers to be linked in when
++   static libpthread is used.  */
++extern const int __pthread_provide_wrappers;
++static const int *const __pthread_require_wrappers =
++  &__pthread_provide_wrappers;
++#endif
+diff -Naur ../glibc-2.1.3/linuxthreads/ptlongjmp.c glibc-2.1.3/linuxthreads/ptlongjmp.c
+--- ../glibc-2.1.3/linuxthreads/ptlongjmp.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/ptlongjmp.c	1998-10-28 08:30:49.000000000 -0800
+@@ -0,0 +1,55 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Redefine siglongjmp and longjmp so that they interact correctly
++   with cleanup handlers */
++
++#include <setjmp.h>
++#include "pthread.h"
++#include "internals.h"
++
++/* These functions are not declared anywhere since they shouldn't be
++   used at another place but here.  */
++extern void __libc_siglongjmp (sigjmp_buf env, int val)
++     __attribute__ ((noreturn));
++extern void __libc_longjmp (sigjmp_buf env, int val)
++     __attribute__ ((noreturn));
++
++
++static void pthread_cleanup_upto(__jmp_buf target)
++{
++  pthread_descr self = thread_self();
++  struct _pthread_cleanup_buffer * c;
++
++  for (c = THREAD_GETMEM(self, p_cleanup);
++       c != NULL && _JMPBUF_UNWINDS(target, c);
++       c = c->__prev)
++    c->__routine(c->__arg);
++  THREAD_SETMEM(self, p_cleanup, c);
++  if (THREAD_GETMEM(self, p_in_sighandler)
++      && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler)))
++    THREAD_SETMEM(self, p_in_sighandler, NULL);
++}
++
++void siglongjmp(sigjmp_buf env, int val)
++{
++  pthread_cleanup_upto(env->__jmpbuf);
++  __libc_siglongjmp(env, val);
++}
++
++void longjmp(jmp_buf env, int val)
++{
++  pthread_cleanup_upto(env->__jmpbuf);
++  __libc_longjmp(env, val);
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/queue.h glibc-2.1.3/linuxthreads/queue.h
+--- ../glibc-2.1.3/linuxthreads/queue.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/queue.h	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,61 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Waiting queues */
++
++/* Waiting queues are represented by lists of thread descriptors
++   linked through their p_nextwaiting field.  The lists are kept
++   sorted by decreasing priority, and then decreasing waiting time. */
++
++static inline void enqueue(pthread_descr * q, pthread_descr th)
++{
++  int prio = th->p_priority;
++  ASSERT(th->p_nextwaiting == NULL);
++  for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
++    if (prio > (*q)->p_priority) {
++      th->p_nextwaiting = *q;
++      *q = th;
++      return;
++    }
++  }
++  *q = th;
++}
++
++static inline pthread_descr dequeue(pthread_descr * q)
++{
++  pthread_descr th;
++  th = *q;
++  if (th != NULL) {
++    *q = th->p_nextwaiting;
++    th->p_nextwaiting = NULL;
++  }
++  return th;
++}
++
++static inline int remove_from_queue(pthread_descr * q, pthread_descr th)
++{
++  for (; *q != NULL; q = &((*q)->p_nextwaiting)) {
++    if (*q == th) {
++      *q = th->p_nextwaiting;
++      th->p_nextwaiting = NULL;
++      return 1;
++    }
++  }
++  return 0;
++}
++
++static inline int queue_is_empty(pthread_descr * q)
++{
++    return *q == NULL;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/restart.h glibc-2.1.3/linuxthreads/restart.h
+--- ../glibc-2.1.3/linuxthreads/restart.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/restart.h	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,27 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#include <signal.h>
++
++/* Primitives for controlling thread execution */
++
++static inline void restart(pthread_descr th)
++{
++  __pthread_restart(th); /* see pthread.c */ 
++}
++
++static inline void suspend(pthread_descr self)
++{
++  __pthread_suspend(self); /* see pthread.c */
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/rwlock.c glibc-2.1.3/linuxthreads/rwlock.c
+--- ../glibc-2.1.3/linuxthreads/rwlock.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/rwlock.c	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,486 @@
++/* Read-write lock implementation.
++   Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Xavier Leroy <Xavier.Leroy@inria.fr>
++   and Ulrich Drepper <drepper@cygnus.com>, 1998.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <errno.h>
++#include <pthread.h>
++#include <stdlib.h>
++#include "internals.h"
++#include "queue.h"
++#include "spinlock.h"
++#include "restart.h"
++
++/*
++ * Check whether the calling thread already owns one or more read locks on the
++ * specified lock. If so, return a pointer to the read lock info structure
++ * corresponding to that lock.
++ */
++
++static pthread_readlock_info *
++rwlock_is_in_list(pthread_descr self, pthread_rwlock_t *rwlock)
++{
++  pthread_readlock_info *info;
++
++  for (info = self->p_readlock_list; info != NULL; info = info->pr_next)
++    {
++      if (info->pr_lock == rwlock)
++	return info;
++    }
++
++  return NULL;
++}
++
++/*
++ * Add a new lock to the thread's list of locks for which it has a read lock.
++ * A new info node must be allocated for this, which is taken from the thread's
++ * free list, or by calling malloc. If malloc fails, a null pointer is
++ * returned. Otherwise the lock info structure is initialized and pushed
++ * onto the thread's list.
++ */
++
++static pthread_readlock_info *
++rwlock_add_to_list(pthread_descr self, pthread_rwlock_t *rwlock)
++{
++  pthread_readlock_info *info = self->p_readlock_free;
++
++  if (info != NULL) 
++    self->p_readlock_free = info->pr_next;
++  else
++    info = malloc(sizeof *info);
++
++  if (info == NULL)
++    return NULL;
++
++  info->pr_lock_count = 1;
++  info->pr_lock = rwlock;
++  info->pr_next = self->p_readlock_list;
++  self->p_readlock_list = info;
++
++  return info;
++}
++
++/*
++ * If the thread owns a read lock over the given pthread_rwlock_t,
++ * and this read lock is tracked in the thread's lock list,
++ * this function returns a pointer to the info node in that list.
++ * It also decrements the lock count within that node, and if
++ * it reaches zero, it removes the node from the list.
++ * If nothing is found, it returns a null pointer.
++ */
++
++static pthread_readlock_info *
++rwlock_remove_from_list(pthread_descr self, pthread_rwlock_t *rwlock)
++{
++  pthread_readlock_info **pinfo;
++
++  for (pinfo = &self->p_readlock_list; *pinfo != NULL; pinfo = &(*pinfo)->pr_next)
++    {
++      if ((*pinfo)->pr_lock == rwlock)
++	{
++	  pthread_readlock_info *info = *pinfo;
++	  if (--info->pr_lock_count == 0)
++	    *pinfo = info->pr_next;
++	  return info;
++	}
++    }
++  
++  return NULL;
++}
++
++/*
++ * This function checks whether the conditions are right to place a read lock.
++ * It returns 1 if so, otherwise zero. The rwlock's internal lock must be
++ * locked upon entry.
++ */
++
++static int
++rwlock_can_rdlock(pthread_rwlock_t *rwlock, int have_lock_already)
++{
++  /* Can't readlock; it is write locked. */
++  if (rwlock->__rw_writer != NULL)
++    return 0;
++
++  /* Lock prefers readers; get it. */
++  if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP)
++    return 1;
++
++  /* Lock prefers writers, but none are waiting. */
++  if (queue_is_empty(&rwlock->__rw_write_waiting))
++    return 1;
++
++  /* Writers are waiting, but this thread already has a read lock */
++  if (have_lock_already)
++    return 1;
++
++  /* Writers are waiting, and this is a new lock */
++  return 0;
++}
++
++/*
++ * This function helps support brain-damaged recursive read locking
++ * semantics required by Unix 98, while maintaining write priority.
++ * This basically determines whether this thread already holds a read lock
++ * already. It returns 1 if so, otherwise it returns 0.  
++ *
++ * If the thread has any ``untracked read locks'' then it just assumes
++ * that this lock is among them, just to be safe, and returns 1.
++ *
++ * Also, if it finds the thread's lock in the list, it sets the pointer
++ * referenced by pexisting to refer to the list entry.
++ *
++ * If the thread has no untracked locks, and the lock is not found
++ * in its list, then it is added to the list. If this fails,
++ * then *pout_of_mem is set to 1.
++ */
++
++static int
++rwlock_have_already(pthread_descr *pself, pthread_rwlock_t *rwlock,
++    pthread_readlock_info **pexisting, int *pout_of_mem)
++{
++  pthread_readlock_info *existing = NULL;
++  int out_of_mem = 0, have_lock_already = 0;
++  pthread_descr self = *pself;
++
++  if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)
++    {
++      if (!self)
++	self = thread_self();
++
++      existing = rwlock_is_in_list(self, rwlock);
++
++      if (existing != NULL || self->p_untracked_readlock_count > 0)
++	have_lock_already = 1;
++      else
++	{
++	  existing = rwlock_add_to_list(self, rwlock);
++	  if (existing == NULL)
++	    out_of_mem = 1;
++	}
++    }
++
++  *pout_of_mem = out_of_mem;
++  *pexisting = existing;
++  *pself = self;
++
++  return have_lock_already;
++}
++
++int
++pthread_rwlock_init (pthread_rwlock_t *rwlock,
++		     const pthread_rwlockattr_t *attr)
++{
++  __pthread_init_lock(&rwlock->__rw_lock);
++  rwlock->__rw_readers = 0;
++  rwlock->__rw_writer = NULL;
++  rwlock->__rw_read_waiting = NULL;
++  rwlock->__rw_write_waiting = NULL;
++
++  if (attr == NULL)
++    {
++      rwlock->__rw_kind = PTHREAD_RWLOCK_DEFAULT_NP;
++      rwlock->__rw_pshared = PTHREAD_PROCESS_PRIVATE;
++    }
++  else
++    {
++      rwlock->__rw_kind = attr->__lockkind;
++      rwlock->__rw_pshared = attr->__pshared;
++    }
++
++  return 0;
++}
++
++
++int
++pthread_rwlock_destroy (pthread_rwlock_t *rwlock)
++{
++  int readers;
++  _pthread_descr writer;
++
++  __pthread_lock (&rwlock->__rw_lock, NULL);
++  readers = rwlock->__rw_readers;
++  writer = rwlock->__rw_writer;
++  __pthread_unlock (&rwlock->__rw_lock);
++
++  if (readers > 0 || writer != NULL)
++    return EBUSY;
++
++  return 0;
++}
++
++int
++pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
++{
++  pthread_descr self = NULL;
++  pthread_readlock_info *existing;
++  int out_of_mem, have_lock_already;
++
++  have_lock_already = rwlock_have_already(&self, rwlock,
++      &existing, &out_of_mem);
++
++  for (;;)
++    {
++      if (self == NULL)
++	self = thread_self ();
++
++      __pthread_lock (&rwlock->__rw_lock, self);
++
++      if (rwlock_can_rdlock(rwlock, have_lock_already))
++	break;
++
++      enqueue (&rwlock->__rw_read_waiting, self);
++      __pthread_unlock (&rwlock->__rw_lock);
++      suspend (self); /* This is not a cancellation point */
++    }
++
++  ++rwlock->__rw_readers;
++  __pthread_unlock (&rwlock->__rw_lock);
++
++  if (have_lock_already || out_of_mem)
++    {
++      if (existing != NULL)
++	existing->pr_lock_count++;
++      else
++	self->p_untracked_readlock_count++;
++    }
++  
++  return 0;
++}
++
++int
++pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
++{
++  pthread_descr self = thread_self();
++  pthread_readlock_info *existing;
++  int out_of_mem, have_lock_already;
++  int retval = EBUSY;
++
++  have_lock_already = rwlock_have_already(&self, rwlock,
++      &existing, &out_of_mem);
++
++  __pthread_lock (&rwlock->__rw_lock, self);
++
++  /* 0 is passed to here instead of have_lock_already.
++     This is to meet Single Unix Spec requirements: 
++     if writers are waiting, pthread_rwlock_tryrdlock
++     does not acquire a read lock, even if the caller has
++     one or more read locks already. */
++
++  if (rwlock_can_rdlock(rwlock, 0))
++    {
++      ++rwlock->__rw_readers;
++      retval = 0;
++    }
++
++  __pthread_unlock (&rwlock->__rw_lock);
++
++  if (retval == 0)
++    {
++      if (have_lock_already || out_of_mem)
++	{
++	  if (existing != NULL)
++	    existing->pr_lock_count++;
++	  else
++	    self->p_untracked_readlock_count++;
++	}
++    }
++  
++  return retval;
++}
++
++
++int
++pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
++{
++  pthread_descr self = thread_self ();
++
++  while(1)
++    {
++      __pthread_lock (&rwlock->__rw_lock, self);
++      if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL)
++	{
++	  rwlock->__rw_writer = self;
++	  __pthread_unlock (&rwlock->__rw_lock);
++	  return 0;
++	}
++
++      /* Suspend ourselves, then try again */
++      enqueue (&rwlock->__rw_write_waiting, self);
++      __pthread_unlock (&rwlock->__rw_lock);
++      suspend (self); /* This is not a cancellation point */
++    }
++}
++
++
++int
++pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
++{
++  int result = EBUSY;
++
++  __pthread_lock (&rwlock->__rw_lock, NULL);
++  if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL)
++    {
++      rwlock->__rw_writer = thread_self ();
++      result = 0;
++    }
++  __pthread_unlock (&rwlock->__rw_lock);
++
++  return result;
++}
++
++
++int
++pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
++{
++  pthread_descr torestart;
++  pthread_descr th;
++
++  __pthread_lock (&rwlock->__rw_lock, NULL);
++  if (rwlock->__rw_writer != NULL)
++    {
++      /* Unlocking a write lock.  */
++      if (rwlock->__rw_writer != thread_self ())
++	{
++	  __pthread_unlock (&rwlock->__rw_lock);
++	  return EPERM;
++	}
++      rwlock->__rw_writer = NULL;
++
++      if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP
++	  || (th = dequeue (&rwlock->__rw_write_waiting)) == NULL)
++	{
++	  /* Restart all waiting readers.  */
++	  torestart = rwlock->__rw_read_waiting;
++	  rwlock->__rw_read_waiting = NULL;
++	  __pthread_unlock (&rwlock->__rw_lock);
++	  while ((th = dequeue (&torestart)) != NULL)
++	    restart (th);
++	}
++      else
++	{
++	  /* Restart one waiting writer.  */
++	  __pthread_unlock (&rwlock->__rw_lock);
++	  restart (th);
++	}
++    }
++  else
++    {
++      /* Unlocking a read lock.  */
++      if (rwlock->__rw_readers == 0)
++	{
++	  __pthread_unlock (&rwlock->__rw_lock);
++	  return EPERM;
++	}
++
++      --rwlock->__rw_readers;
++      if (rwlock->__rw_readers == 0)
++	/* Restart one waiting writer, if any.  */
++	th = dequeue (&rwlock->__rw_write_waiting);
++      else
++	th = NULL;
++
++      __pthread_unlock (&rwlock->__rw_lock);
++      if (th != NULL)
++	restart (th);
++
++      /* Recursive lock fixup */
++
++      if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP)
++	{
++	  pthread_descr self = thread_self();
++	  pthread_readlock_info *victim = rwlock_remove_from_list(self, rwlock);
++
++	  if (victim != NULL)
++	    {
++	      if (victim->pr_lock_count == 0)
++		{
++		  victim->pr_next = self->p_readlock_free;
++		  self->p_readlock_free = victim;
++		}
++	    }
++	  else
++	    {
++	      if (self->p_untracked_readlock_count > 0)
++		self->p_untracked_readlock_count--;
++	    }
++	}
++    }
++
++  return 0;
++}
++
++
++
++int
++pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
++{
++  attr->__lockkind = 0;
++  attr->__pshared = 0;
++
++  return 0;
++}
++
++
++int
++pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr)
++{
++  return 0;
++}
++
++
++int
++pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared)
++{
++  *pshared = attr->__pshared;
++  return 0;
++}
++
++
++int
++pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared)
++{
++  if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
++    return EINVAL;
++
++  attr->__pshared = pshared;
++
++  return 0;
++}
++
++
++int
++pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *attr, int *pref)
++{
++  *pref = attr->__lockkind;
++  return 0;
++}
++
++
++int
++pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr, int pref)
++{
++  if (pref != PTHREAD_RWLOCK_PREFER_READER_NP
++      && pref != PTHREAD_RWLOCK_PREFER_WRITER_NP
++      && pref != PTHREAD_RWLOCK_DEFAULT_NP)
++    return EINVAL;
++
++  attr->__lockkind = pref;
++
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/semaphore.c glibc-2.1.3/linuxthreads/semaphore.c
+--- ../glibc-2.1.3/linuxthreads/semaphore.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/semaphore.c	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,209 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Semaphores a la POSIX 1003.1b */
++
++#include <errno.h>
++#include "pthread.h"
++#include "semaphore.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++#include "queue.h"
++
++int __new_sem_init(sem_t *sem, int pshared, unsigned int value)
++{
++  if (value > SEM_VALUE_MAX) {
++    errno = EINVAL;
++    return -1;
++  }
++  if (pshared) {
++    errno = ENOSYS;
++    return -1;
++  }
++  __pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock);
++  sem->__sem_value = value;
++  sem->__sem_waiting = NULL;
++  return 0;
++}
++
++/* Function called by pthread_cancel to remove the thread from
++   waiting inside __new_sem_wait. */
++
++static int new_sem_extricate_func(void *obj, pthread_descr th)
++{
++  volatile pthread_descr self = thread_self();
++  sem_t *sem = obj;
++  int did_remove = 0;
++
++  __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
++  did_remove = remove_from_queue(&sem->__sem_waiting, th);
++  __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++
++  return did_remove;
++}
++
++int __new_sem_wait(sem_t * sem)
++{
++  volatile pthread_descr self = thread_self();
++  pthread_extricate_if extr;
++  int already_canceled = 0;
++
++  /* Set up extrication interface */
++  extr.pu_object = sem;
++  extr.pu_extricate_func = new_sem_extricate_func;
++
++  __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
++  if (sem->__sem_value > 0) {
++    sem->__sem_value--;
++    __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++    return 0;
++  }
++  /* Register extrication interface */
++  __pthread_set_own_extricate_if(self, &extr); 
++  /* Enqueue only if not already cancelled. */
++  if (!(THREAD_GETMEM(self, p_canceled)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE))
++    enqueue(&sem->__sem_waiting, self);
++  else
++    already_canceled = 1;
++  __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++
++  if (already_canceled) {
++    __pthread_set_own_extricate_if(self, 0); 
++    pthread_exit(PTHREAD_CANCELED);
++  } 
++
++  /* Wait for sem_post or cancellation, or fall through if already canceled */
++  suspend(self);
++  __pthread_set_own_extricate_if(self, 0); 
++
++  /* Terminate only if the wakeup came from cancellation. */
++  /* Otherwise ignore cancellation because we got the semaphore. */
++
++  if (THREAD_GETMEM(self, p_woken_by_cancel)
++      && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
++    THREAD_SETMEM(self, p_woken_by_cancel, 0);
++    pthread_exit(PTHREAD_CANCELED);
++  }
++  /* We got the semaphore */
++  return 0;
++}
++
++int __new_sem_trywait(sem_t * sem)
++{
++  int retval;
++
++  __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL);
++  if (sem->__sem_value == 0) {
++    errno = EAGAIN;
++    retval = -1;
++  } else {
++    sem->__sem_value--;
++    retval = 0;
++  }
++  __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++  return retval;
++}
++
++int __new_sem_post(sem_t * sem)
++{
++  pthread_descr self = thread_self();
++  pthread_descr th;
++  struct pthread_request request;
++
++  if (THREAD_GETMEM(self, p_in_sighandler) == NULL) {
++    __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
++    if (sem->__sem_waiting == NULL) {
++      if (sem->__sem_value >= SEM_VALUE_MAX) {
++        /* Overflow */
++        errno = ERANGE;
++        __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++        return -1;
++      }
++      sem->__sem_value++;
++      __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++    } else {
++      th = dequeue(&sem->__sem_waiting);
++      __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
++      restart(th);
++    }
++  } else {
++    /* If we're in signal handler, delegate post operation to
++       the thread manager. */
++    if (__pthread_manager_request < 0) {
++      if (__pthread_initialize_manager() < 0) {
++        errno = EAGAIN;
++        return -1;
++      }
++    }
++    request.req_kind = REQ_POST;
++    request.req_args.post = sem;
++    __libc_write(__pthread_manager_request,
++                 (char *) &request, sizeof(request));
++  }
++  return 0;
++}
++
++int __new_sem_getvalue(sem_t * sem, int * sval)
++{
++  *sval = sem->__sem_value;
++  return 0;
++}
++
++int __new_sem_destroy(sem_t * sem)
++{
++  if (sem->__sem_waiting != NULL) {
++    __set_errno (EBUSY);
++    return -1;
++  }
++  return 0;
++}
++
++sem_t *sem_open(const char *name, int oflag, ...)
++{
++  __set_errno (ENOSYS);
++  return SEM_FAILED;
++}
++
++int sem_close(sem_t *sem)
++{
++  __set_errno (ENOSYS);
++  return -1;
++}
++
++int sem_unlink(const char *name)
++{
++  __set_errno (ENOSYS);
++  return -1;
++}
++
++#if defined PIC && DO_VERSIONING
++default_symbol_version (__new_sem_init, sem_init, GLIBC_2.1);
++default_symbol_version (__new_sem_wait, sem_wait, GLIBC_2.1);
++default_symbol_version (__new_sem_trywait, sem_trywait, GLIBC_2.1);
++default_symbol_version (__new_sem_post, sem_post, GLIBC_2.1);
++default_symbol_version (__new_sem_getvalue, sem_getvalue, GLIBC_2.1);
++default_symbol_version (__new_sem_destroy, sem_destroy, GLIBC_2.1);
++#else
++# ifdef weak_alias
++weak_alias (__new_sem_init, sem_init)
++weak_alias (__new_sem_wait, sem_wait)
++weak_alias (__new_sem_trywait, sem_trywait)
++weak_alias (__new_sem_post, sem_post)
++weak_alias (__new_sem_getvalue, sem_getvalue)
++weak_alias (__new_sem_destroy, sem_destroy)
++# endif
++#endif
++    
+diff -Naur ../glibc-2.1.3/linuxthreads/semaphore.h glibc-2.1.3/linuxthreads/semaphore.h
+--- ../glibc-2.1.3/linuxthreads/semaphore.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/semaphore.h	2000-02-23 13:17:31.000000000 -0800
+@@ -0,0 +1,80 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#ifndef _SEMAPHORE_H
++#define _SEMAPHORE_H    1
++
++#include <features.h>
++#include <sys/types.h>
++
++#ifndef _PTHREAD_DESCR_DEFINED
++/* Thread descriptors.  Needed for `sem_t' definition.  */
++typedef struct _pthread_descr_struct *_pthread_descr;
++# define _PTHREAD_DESCR_DEFINED
++#endif
++
++/* System specific semaphore definition.  */
++typedef struct
++{
++  struct
++  {
++    long int status;
++    int spinlock;
++  } __sem_lock;
++  int __sem_value;
++  _pthread_descr __sem_waiting;
++} sem_t;
++
++
++
++/* Value returned if `sem_open' failed.  */
++#define SEM_FAILED	((sem_t *) 0)
++
++/* Maximum value the semaphore can have.  */
++#define SEM_VALUE_MAX 	((int) ((~0u) >> 1))
++
++
++__BEGIN_DECLS
++
++/* Initialize semaphore object SEM to VALUE.  If PSHARED then share it
++   with other processes.  */
++extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
++
++/* Free resources associated with semaphore object SEM.  */
++extern int sem_destroy __P ((sem_t *__sem));
++
++/* Open a named semaphore NAME with open flaot OFLAG.  */
++extern sem_t *sem_open __P ((__const char *__name, int __oflag, ...));
++
++/* Close descriptor for named semaphore SEM.  */
++extern int sem_close __P ((sem_t *__sem));
++
++/* Remove named semaphore NAME.  */
++extern int sem_unlink __P ((__const char *__name));
++
++/* Wait for SEM being posted.  */
++extern int sem_wait __P ((sem_t *__sem));
++
++/* Test whether SEM is posted.  */
++extern int sem_trywait __P ((sem_t *__sem));
++
++/* Post SEM.  */
++extern int sem_post __P ((sem_t *__sem));
++
++/* Get current value of SEM and store it in *SVAL.  */
++extern int sem_getvalue __P ((sem_t *__sem, int *__sval));
++
++__END_DECLS
++
++#endif  /* semaphore.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/shlib-versions glibc-2.1.3/linuxthreads/shlib-versions
+--- ../glibc-2.1.3/linuxthreads/shlib-versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/shlib-versions	1998-08-28 03:07:18.000000000 -0700
+@@ -0,0 +1,2 @@
++# Xavier Leroy's Linux clone based thread library.
++.*-.*-linux.*		libpthread=0
+diff -Naur ../glibc-2.1.3/linuxthreads/signals.c glibc-2.1.3/linuxthreads/signals.c
+--- ../glibc-2.1.3/linuxthreads/signals.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/signals.c	1999-09-28 08:29:01.000000000 -0700
+@@ -0,0 +1,233 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Handling of signals */
++
++#include <errno.h>
++#include <signal.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include <ucontext.h>
++#include <sigcontextinfo.h>
++
++int pthread_sigmask(int how, const sigset_t * newmask, sigset_t * oldmask)
++{
++  sigset_t mask;
++
++  if (newmask != NULL) {
++    mask = *newmask;
++    /* Don't allow __pthread_sig_restart to be unmasked.
++       Don't allow __pthread_sig_cancel to be masked. */
++    switch(how) {
++    case SIG_SETMASK:
++      sigaddset(&mask, __pthread_sig_restart);
++      sigdelset(&mask, __pthread_sig_cancel);
++      break;
++    case SIG_BLOCK:
++      sigdelset(&mask, __pthread_sig_cancel);
++      break;
++    case SIG_UNBLOCK:
++      sigdelset(&mask, __pthread_sig_restart);
++      break;
++    }
++    newmask = &mask;
++  }
++  if (sigprocmask(how, newmask, oldmask) == -1)
++    return errno;
++  else
++    return 0;
++}
++
++int pthread_kill(pthread_t thread, int signo)
++{
++  pthread_handle handle = thread_handle(thread);
++  int pid;
++
++  __pthread_lock(&handle->h_lock, NULL);
++  if (invalid_handle(handle, thread)) {
++    __pthread_unlock(&handle->h_lock);
++    return ESRCH;
++  }
++  pid = handle->h_descr->p_pid;
++  __pthread_unlock(&handle->h_lock);
++  if (kill(pid, signo) == -1)
++    return errno;
++  else
++    return 0;
++}
++
++/* User-provided signal handlers */
++typedef void (*arch_sighandler_t) __PMT ((int, SIGCONTEXT));
++static union
++{
++  arch_sighandler_t old;
++  void (*rt) (int, struct siginfo *, struct ucontext *);
++} sighandler[NSIG];
++
++/* The wrapper around user-provided signal handlers */
++static void pthread_sighandler(int signo, SIGCONTEXT ctx)
++{
++  pthread_descr self = thread_self();
++  char * in_sighandler;
++  /* If we're in a sigwait operation, just record the signal received
++     and return without calling the user's handler */
++  if (THREAD_GETMEM(self, p_sigwaiting)) {
++    THREAD_SETMEM(self, p_sigwaiting, 0);
++    THREAD_SETMEM(self, p_signal, signo);
++    return;
++  }
++  /* Record that we're in a signal handler and call the user's
++     handler function */
++  in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
++  if (in_sighandler == NULL)
++    THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
++  sighandler[signo].old(signo, SIGCONTEXT_EXTRA_ARGS ctx);
++  if (in_sighandler == NULL)
++    THREAD_SETMEM(self, p_in_sighandler, NULL);
++}
++
++/* The same, this time for real-time signals.  */
++static void pthread_sighandler_rt(int signo, struct siginfo *si,
++				  struct ucontext *uc)
++{
++  pthread_descr self = thread_self();
++  char * in_sighandler;
++  /* If we're in a sigwait operation, just record the signal received
++     and return without calling the user's handler */
++  if (THREAD_GETMEM(self, p_sigwaiting)) {
++    THREAD_SETMEM(self, p_sigwaiting, 0);
++    THREAD_SETMEM(self, p_signal, signo);
++    return;
++  }
++  /* Record that we're in a signal handler and call the user's
++     handler function */
++  in_sighandler = THREAD_GETMEM(self, p_in_sighandler);
++  if (in_sighandler == NULL)
++    THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME);
++  sighandler[signo].rt(signo, si, uc);
++  if (in_sighandler == NULL)
++    THREAD_SETMEM(self, p_in_sighandler, NULL);
++}
++
++/* The wrapper around sigaction.  Install our own signal handler
++   around the signal. */
++int sigaction(int sig, const struct sigaction * act,
++              struct sigaction * oact)
++{
++  struct sigaction newact;
++  struct sigaction *newactp;
++
++  if (sig == __pthread_sig_restart ||
++      sig == __pthread_sig_cancel ||
++      (sig == __pthread_sig_debug && __pthread_sig_debug > 0))
++    return EINVAL;
++  if (act)
++    {
++      newact = *act;
++      if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL
++	  && sig > 0 && sig < NSIG)
++	{
++	  if (act->sa_flags & SA_SIGINFO)
++	    newact.sa_handler = (__sighandler_t) pthread_sighandler_rt;
++	  else
++	    newact.sa_handler = (__sighandler_t) pthread_sighandler;
++	}
++      newactp = &newact;
++    }
++  else
++    newactp = NULL;
++  if (__sigaction(sig, newactp, oact) == -1)
++    return -1;
++  if (sig > 0 && sig < NSIG)
++    {
++      if (oact != NULL)
++	oact->sa_handler = (__sighandler_t) sighandler[sig].old;
++      if (act)
++	/* For the assignment is does not matter whether it's a normal
++	   or real-time signal.  */
++	sighandler[sig].old = (arch_sighandler_t) act->sa_handler;
++    }
++  return 0;
++}
++
++/* A signal handler that does nothing */
++static void pthread_null_sighandler(int sig) { }
++
++/* sigwait -- synchronously wait for a signal */
++int sigwait(const sigset_t * set, int * sig)
++{
++  volatile pthread_descr self = thread_self();
++  sigset_t mask;
++  int s;
++  sigjmp_buf jmpbuf;
++  struct sigaction sa;
++
++  /* Get ready to block all signals except those in set
++     and the cancellation signal.
++     Also check that handlers are installed on all signals in set,
++     and if not, install our dummy handler.  This is conformant to
++     POSIX: "The effect of sigwait() on the signal actions for the
++     signals in set is unspecified." */
++  sigfillset(&mask);
++  sigdelset(&mask, __pthread_sig_cancel);
++  for (s = 1; s <= NSIG; s++) {
++    if (sigismember(set, s) &&
++        s != __pthread_sig_restart &&
++        s != __pthread_sig_cancel &&
++        s != __pthread_sig_debug) {
++      sigdelset(&mask, s);
++      if (sighandler[s].old == NULL ||
++	  sighandler[s].old == (arch_sighandler_t) SIG_DFL ||
++	  sighandler[s].old == (arch_sighandler_t) SIG_IGN) {
++        sa.sa_handler = pthread_null_sighandler;
++        sigemptyset(&sa.sa_mask);
++        sa.sa_flags = 0;
++        sigaction(s, &sa, NULL);
++      }
++    }
++  }
++  /* Test for cancellation */
++  if (sigsetjmp(jmpbuf, 1) == 0) {
++    THREAD_SETMEM(self, p_cancel_jmp, &jmpbuf);
++    if (! (THREAD_GETMEM(self, p_canceled)
++	   && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) {
++      /* Reset the signal count */
++      THREAD_SETMEM(self, p_signal, 0);
++      /* Say we're in sigwait */
++      THREAD_SETMEM(self, p_sigwaiting, 1);
++      /* Unblock the signals and wait for them */
++      sigsuspend(&mask);
++    }
++  }
++  THREAD_SETMEM(self, p_cancel_jmp, NULL);
++  /* The signals are now reblocked.  Check for cancellation */
++  pthread_testcancel();
++  /* We should have self->p_signal != 0 and equal to the signal received */
++  *sig = THREAD_GETMEM(self, p_signal);
++  return 0;
++}
++
++/* Redefine raise() to send signal to calling thread only,
++   as per POSIX 1003.1c */
++int raise (int sig)
++{
++  int retcode = pthread_kill(pthread_self(), sig);
++  if (retcode == 0)
++    return 0;
++  else {
++    errno = retcode;
++    return -1;
++  }
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/specific.c glibc-2.1.3/linuxthreads/specific.c
+--- ../glibc-2.1.3/linuxthreads/specific.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/specific.c	1999-09-28 08:29:01.000000000 -0700
+@@ -0,0 +1,177 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Thread-specific data */
++
++#include <errno.h>
++#include <stddef.h>
++#include <stdlib.h>
++#include "pthread.h"
++#include "internals.h"
++
++/* Table of keys. */
++
++static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] =
++  { { 0, NULL } };
++
++/* Mutex to protect access to pthread_keys */
++
++static pthread_mutex_t pthread_keys_mutex = PTHREAD_MUTEX_INITIALIZER;
++
++/* Create a new key */
++
++int __pthread_key_create(pthread_key_t * key, destr_function destr)
++{
++  int i;
++
++  pthread_mutex_lock(&pthread_keys_mutex);
++  for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
++    if (! pthread_keys[i].in_use) {
++      /* Mark key in use */
++      pthread_keys[i].in_use = 1;
++      pthread_keys[i].destr = destr;
++      pthread_mutex_unlock(&pthread_keys_mutex);
++      *key = i;
++      return 0;
++    }
++  }
++  pthread_mutex_unlock(&pthread_keys_mutex);
++  return EAGAIN;
++}
++strong_alias (__pthread_key_create, pthread_key_create)
++
++/* Delete a key */
++
++int pthread_key_delete(pthread_key_t key)
++{
++  pthread_descr self = thread_self();
++  pthread_descr th;
++  unsigned int idx1st, idx2nd;
++
++  pthread_mutex_lock(&pthread_keys_mutex);
++  if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use) {
++    pthread_mutex_unlock(&pthread_keys_mutex);
++    return EINVAL;
++  }
++  pthread_keys[key].in_use = 0;
++  pthread_keys[key].destr = NULL;
++  /* Set the value of the key to NULL in all running threads, so
++     that if the key is reallocated later by pthread_key_create, its
++     associated values will be NULL in all threads. */
++  idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
++  idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
++  th = self;
++  do {
++    /* If the thread already is terminated don't modify the memory.  */
++    if (!th->p_terminated && th->p_specific[idx1st] != NULL)
++      th->p_specific[idx1st][idx2nd] = NULL;
++    th = th->p_nextlive;
++  } while (th != self);
++  pthread_mutex_unlock(&pthread_keys_mutex);
++  return 0;
++}
++
++/* Set the value of a key */
++
++int __pthread_setspecific(pthread_key_t key, const void * pointer)
++{
++  pthread_descr self = thread_self();
++  unsigned int idx1st, idx2nd;
++
++  if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use)
++    return EINVAL;
++  idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
++  idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
++  if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL) {
++    void *newp = calloc(PTHREAD_KEY_2NDLEVEL_SIZE, sizeof (void *));
++    if (newp == NULL)
++      return ENOMEM;
++    THREAD_SETMEM_NC(self, p_specific[idx1st], newp);
++  }
++  THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd] = (void *) pointer;
++  return 0;
++}
++strong_alias (__pthread_setspecific, pthread_setspecific)
++
++/* Get the value of a key */
++
++void * __pthread_getspecific(pthread_key_t key)
++{
++  pthread_descr self = thread_self();
++  unsigned int idx1st, idx2nd;
++
++  if (key >= PTHREAD_KEYS_MAX)
++    return NULL;
++  idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
++  idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
++  if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL
++      || !pthread_keys[key].in_use)
++    return NULL;
++  return THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd];
++}
++strong_alias (__pthread_getspecific, pthread_getspecific)
++
++/* Call the destruction routines on all keys */
++
++void __pthread_destroy_specifics()
++{
++  pthread_descr self = thread_self();
++  int i, j, round, found_nonzero;
++  destr_function destr;
++  void * data;
++
++  for (round = 0, found_nonzero = 1;
++       found_nonzero && round < PTHREAD_DESTRUCTOR_ITERATIONS;
++       round++) {
++    found_nonzero = 0;
++    for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++)
++      if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL)
++        for (j = 0; j < PTHREAD_KEY_2NDLEVEL_SIZE; j++) {
++          destr = pthread_keys[i * PTHREAD_KEY_2NDLEVEL_SIZE + j].destr;
++          data = THREAD_GETMEM_NC(self, p_specific[i])[j];
++          if (destr != NULL && data != NULL) {
++            THREAD_GETMEM_NC(self, p_specific[i])[j] = NULL;
++            destr(data);
++            found_nonzero = 1;
++          }
++        }
++  }
++  for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) {
++    if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL)
++      free(THREAD_GETMEM_NC(self, p_specific[i]));
++  }
++}
++
++/* Thread-specific data for libc. */
++
++static int
++libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer)
++{
++  pthread_descr self = thread_self();
++
++  THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer);
++  return 0;
++}
++int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer)
++     = libc_internal_tsd_set;
++
++static void *
++libc_internal_tsd_get(enum __libc_tsd_key_t key)
++{
++  pthread_descr self = thread_self();
++
++  return THREAD_GETMEM_NC(self, p_libc_specific[key]);
++}
++void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key)
++     = libc_internal_tsd_get;
+diff -Naur ../glibc-2.1.3/linuxthreads/spinlock.c glibc-2.1.3/linuxthreads/spinlock.c
+--- ../glibc-2.1.3/linuxthreads/spinlock.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/spinlock.c	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,195 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++/* Internal locks */
++
++#include <errno.h>
++#include <sched.h>
++#include <time.h>
++#include "pthread.h"
++#include "internals.h"
++#include "spinlock.h"
++#include "restart.h"
++
++/* The status field of a fastlock has the following meaning:
++     0: fastlock is free
++     1: fastlock is taken, no thread is waiting on it
++  ADDR: fastlock is taken, ADDR is address of thread descriptor for
++        first waiting thread, other waiting threads are linked via
++        their p_nextlock field.
++   The waiting list is not sorted by priority order.
++   Actually, we always insert at top of list (sole insertion mode
++   that can be performed without locking).
++   For __pthread_unlock, we perform a linear search in the list
++   to find the highest-priority, oldest waiting thread.
++   This is safe because there are no concurrent __pthread_unlock
++   operations -- only the thread that locked the mutex can unlock it. */
++
++void internal_function __pthread_lock(struct _pthread_fastlock * lock,
++				      pthread_descr self)
++{
++  long oldstatus, newstatus;
++  int spurious_wakeup_count = 0;
++
++  do {
++    oldstatus = lock->__status;
++    if (oldstatus == 0) {
++      newstatus = 1;
++    } else {
++      if (self == NULL)
++	self = thread_self();
++      newstatus = (long) self;
++    }
++    if (self != NULL) {
++      ASSERT(self->p_nextlock == NULL);
++      THREAD_SETMEM(self, p_nextlock, (pthread_descr) oldstatus);
++    }
++  } while(! compare_and_swap(&lock->__status, oldstatus, newstatus,
++                             &lock->__spinlock));
++
++  /* Suspend with guard against spurious wakeup. 
++     This can happen in pthread_cond_timedwait_relative, when the thread
++     wakes up due to timeout and is still on the condvar queue, and then
++     locks the queue to remove itself. At that point it may still be on the
++     queue, and may be resumed by a condition signal. */
++
++  if (oldstatus != 0) {
++    for (;;) {
++      suspend(self);
++      if (self->p_nextlock != NULL) {
++	/* Count resumes that don't belong to us. */
++	spurious_wakeup_count++;
++	continue;
++      }
++      break;
++    }
++  }
++
++  /* Put back any resumes we caught that don't belong to us. */
++  while (spurious_wakeup_count--)
++    restart(self);
++}
++
++void internal_function __pthread_unlock(struct _pthread_fastlock * lock)
++{
++  long oldstatus;
++  pthread_descr thr, * ptr, * maxptr;
++  int maxprio;
++
++again:
++  oldstatus = lock->__status;
++  if (oldstatus == 0 || oldstatus == 1) {
++    /* No threads are waiting for this lock.  Please note that we also
++       enter this case if the lock is not taken at all.  If this wouldn't
++       be done here we would crash further down.  */
++    if (! compare_and_swap(&lock->__status, oldstatus, 0, &lock->__spinlock))
++      goto again;
++    return;
++  }
++  /* Find thread in waiting queue with maximal priority */
++  ptr = (pthread_descr *) &lock->__status;
++  thr = (pthread_descr) oldstatus;
++  maxprio = 0;
++  maxptr = ptr;
++  while (thr != (pthread_descr) 1) {
++    if (thr->p_priority >= maxprio) {
++      maxptr = ptr;
++      maxprio = thr->p_priority;
++    }
++    ptr = &(thr->p_nextlock);
++    thr = *ptr;
++  }
++  /* Remove max prio thread from waiting list. */
++  if (maxptr == (pthread_descr *) &lock->__status) {
++    /* If max prio thread is at head, remove it with compare-and-swap
++       to guard against concurrent lock operation */
++    thr = (pthread_descr) oldstatus;
++    if (! compare_and_swap(&lock->__status,
++                           oldstatus, (long)(thr->p_nextlock),
++                           &lock->__spinlock))
++      goto again;
++  } else {
++    /* No risk of concurrent access, remove max prio thread normally */
++    thr = *maxptr;
++    *maxptr = thr->p_nextlock;
++  }
++  /* Wake up the selected waiting thread */
++  thr->p_nextlock = NULL;
++  restart(thr);
++}
++
++/* Compare-and-swap emulation with a spinlock */
++
++#ifdef TEST_FOR_COMPARE_AND_SWAP
++int __pthread_has_cas = 0;
++#endif
++
++#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP
++
++static void __pthread_acquire(int * spinlock);
++
++int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
++                               int * spinlock)
++{
++  int res;
++  if (testandset(spinlock)) __pthread_acquire(spinlock);
++  if (*ptr == oldval) {
++    *ptr = newval; res = 1;
++  } else {
++    res = 0;
++  }
++  *spinlock = 0;
++  return res;
++}
++
++/* This function is called if the inlined test-and-set
++   in __pthread_compare_and_swap() failed */
++
++/* The retry strategy is as follows:
++   - We test and set the spinlock MAX_SPIN_COUNT times, calling
++     sched_yield() each time.  This gives ample opportunity for other
++     threads with priority >= our priority to make progress and
++     release the spinlock.
++   - If a thread with priority < our priority owns the spinlock,
++     calling sched_yield() repeatedly is useless, since we're preventing
++     the owning thread from making progress and releasing the spinlock.
++     So, after MAX_SPIN_LOCK attemps, we suspend the calling thread
++     using nanosleep().  This again should give time to the owning thread
++     for releasing the spinlock.
++     Notice that the nanosleep() interval must not be too small,
++     since the kernel does busy-waiting for short intervals in a realtime
++     process (!).  The smallest duration that guarantees thread
++     suspension is currently 2ms.
++   - When nanosleep() returns, we try again, doing MAX_SPIN_COUNT
++     sched_yield(), then sleeping again if needed. */
++
++static void __pthread_acquire(int * spinlock)
++{
++  int cnt = 0;
++  struct timespec tm;
++
++  while (testandset(spinlock)) {
++    if (cnt < MAX_SPIN_COUNT) {
++      sched_yield();
++      cnt++;
++    } else {
++      tm.tv_sec = 0;
++      tm.tv_nsec = SPIN_SLEEP_DURATION;
++      nanosleep(&tm, NULL);
++      cnt = 0;
++    }
++  }
++}
++
++#endif
+diff -Naur ../glibc-2.1.3/linuxthreads/spinlock.h glibc-2.1.3/linuxthreads/spinlock.h
+--- ../glibc-2.1.3/linuxthreads/spinlock.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/spinlock.h	2000-01-06 15:40:57.000000000 -0800
+@@ -0,0 +1,102 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#if defined(TEST_FOR_COMPARE_AND_SWAP)
++
++extern int __pthread_has_cas;
++extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
++                                      int * spinlock);
++
++static inline int compare_and_swap(long * ptr, long oldval, long newval,
++                                   int * spinlock)
++{
++  if (__builtin_expect (__pthread_has_cas, 1))
++    return __compare_and_swap(ptr, oldval, newval);
++  else
++    return __pthread_compare_and_swap(ptr, oldval, newval, spinlock);
++}
++
++#elif defined(HAS_COMPARE_AND_SWAP)
++
++static inline int compare_and_swap(long * ptr, long oldval, long newval,
++                                   int * spinlock)
++{
++  return __compare_and_swap(ptr, oldval, newval);
++}
++
++#else
++
++extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval,
++                                      int * spinlock);
++
++static inline int compare_and_swap(long * ptr, long oldval, long newval,
++                                   int * spinlock)
++{
++  return __pthread_compare_and_swap(ptr, oldval, newval, spinlock);
++}
++
++#endif
++
++/* Internal locks */
++
++extern void internal_function __pthread_lock(struct _pthread_fastlock * lock,
++					     pthread_descr self);
++extern void internal_function __pthread_unlock(struct _pthread_fastlock *lock);
++
++static inline void __pthread_init_lock(struct _pthread_fastlock * lock)
++{
++  lock->__status = 0;
++  lock->__spinlock = 0;
++}
++
++static inline int __pthread_trylock (struct _pthread_fastlock * lock)
++{
++  long oldstatus;
++
++  do {
++    oldstatus = lock->__status;
++    if (oldstatus != 0) return EBUSY;
++  } while(! compare_and_swap(&lock->__status, 0, 1, &lock->__spinlock));
++  return 0;
++}
++
++#define LOCK_INITIALIZER {0, 0}
++
++/* Operations on pthread_atomic, which is defined in internals.h */
++
++static inline long atomic_increment(struct pthread_atomic *pa)
++{
++    long oldval;
++
++    do {
++	oldval = pa->p_count;
++    } while (!compare_and_swap(&pa->p_count, oldval, oldval + 1, &pa->p_spinlock));
++
++    return oldval;
++}
++
++
++static inline long atomic_decrement(struct pthread_atomic *pa)
++{
++    long oldval;
++
++    do {
++	oldval = pa->p_count;
++    } while (!compare_and_swap(&pa->p_count, oldval, oldval - 1, &pa->p_spinlock));
++
++    return oldval;
++}
++
++#define ATOMIC_INITIALIZER { 0, 0 }
++
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h	2000-01-03 16:06:52.000000000 -0800
+@@ -0,0 +1,108 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   Alpha version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc.,  59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++#include <asm/pal.h>
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char *stack_pointer __asm__("$30");
++
++
++/* Spinlock implementation; required.  */
++PT_EI long int
++testandset (int *spinlock)
++{
++  long int ret, temp;
++
++  __asm__ __volatile__(
++	"/* Inline spinlock test & set */\n"
++	"1:\t"
++	"ldl_l %0,%3\n\t"
++	"bne %0,2f\n\t"
++	"or $31,1,%1\n\t"
++	"stl_c %1,%2\n\t"
++	"beq %1,1b\n"
++	"2:\tmb\n"
++	"/* End spinlock test & set */"
++	: "=&r"(ret), "=&r"(temp), "=m"(*spinlock)
++	: "m"(*spinlock)
++        : "memory");
++
++  return ret;
++}
++
++/* Spinlock release; default is just set to zero.  */
++#define RELEASE(spinlock) \
++  __asm__ __volatile__("mb" : : : "memory"); \
++  *spinlock = 0
++
++
++/* Begin allocating thread stacks at this address.  Default is to allocate
++   them just below the initial program stack.  */
++#define THREAD_STACK_START_ADDRESS  0x40000000000
++
++
++/* Return the thread descriptor for the current thread.  */
++#define THREAD_SELF \
++({									      \
++  register pthread_descr __self __asm__("$0");				      \
++  __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq) : "$0");	      \
++  __self;								      \
++})
++
++/* Initialize the thread-unique value.  */
++#define INIT_THREAD_SELF(descr, nr) \
++{									      \
++  register pthread_descr __self __asm__("$16") = (descr);		      \
++  __asm__ __volatile__ ("call_pal %1" : : "r"(__self), "i"(PAL_wruniq));      \
++}
++
++
++/* Compare-and-swap for semaphores. */
++
++#define HAS_COMPARE_AND_SWAP
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  long int ret;
++
++  __asm__ __volatile__ (
++	"/* Inline compare & swap */\n"
++	"1:\t"
++	"ldq_l %0,%4\n\t"
++	"cmpeq %0,%2,%0\n\t"
++	"beq %0,2f\n\t"
++	"mov %3,%0\n\t"
++	"stq_c %0,%1\n\t"
++	"beq %0,1b\n\t"
++	"2:\tmb\n"
++	"/* End compare & swap */"
++	: "=&r"(ret), "=m"(*p)
++	: "r"(oldval), "r"(newval), "m"(*p));
++
++  return ret;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h	1998-10-09 11:34:00.000000000 -0700
+@@ -0,0 +1,48 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   ARM version.
++   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Philip Blundell <philb@gnu.org>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++
++/* This will not work on ARM1 or ARM2 because SWP is lacking on those
++   machines.  Unfortunately we have no way to detect this at compile
++   time; let's hope nobody tries to use one.  */
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  register unsigned int ret;
++
++  __asm__ __volatile__("swp %0, %1, [%2]"
++		       : "=r"(ret)
++		       : "0"(1), "r"(spinlock));
++
++  return ret;
++}
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("sp");
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h	1999-12-07 08:50:25.000000000 -0800
+@@ -0,0 +1,67 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   i686 version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("%esp");
++
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  int ret;
++
++  __asm__ __volatile__ (
++	"xchgl %0, %1"
++	: "=r"(ret), "=m"(*spinlock)
++	: "0"(1), "m"(*spinlock)
++	: "memory");
++
++  return ret;
++}
++
++
++/* Compare-and-swap for semaphores.  It's always available on i686.  */
++#define HAS_COMPARE_AND_SWAP
++
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  char ret;
++  long int readval;
++
++  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
++			: "=q" (ret), "=m" (*p), "=a" (readval)
++			: "r" (newval), "m" (*p), "a" (oldval)
++			: "memory");
++  return ret;
++}
++
++
++/* Use the LDT implementation only if the kernel is fixed.  */
++//#include "../useldt.h"
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h	1999-12-07 08:50:25.000000000 -0800
+@@ -0,0 +1,99 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   i386 version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("%esp");
++
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  int ret;
++
++  __asm__ __volatile__(
++       "xchgl %0, %1"
++       : "=r"(ret), "=m"(*spinlock)
++       : "0"(1), "m"(*spinlock)
++       : "memory");
++
++  return ret;
++}
++
++
++/* Compare-and-swap for semaphores.
++   Available on the 486 and above, but not on the 386.
++   We test dynamically whether it's available or not. */
++
++#define HAS_COMPARE_AND_SWAP
++#define TEST_FOR_COMPARE_AND_SWAP
++
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  char ret;
++  long int readval;
++
++  __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
++			: "=q" (ret), "=m" (*p), "=a" (readval)
++			: "r" (newval), "m" (*p), "a" (oldval)
++			: "memory");
++  return ret;
++}
++
++
++PT_EI int
++get_eflags (void)
++{
++  int res;
++  __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : );
++  return res;
++}
++
++
++PT_EI void
++set_eflags (int newflags)
++{
++  __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
++}
++
++
++PT_EI int
++compare_and_swap_is_available (void)
++{
++  int oldflags = get_eflags ();
++  int changed;
++  /* Flip AC bit in EFLAGS.  */
++  set_eflags (oldflags ^ 0x40000);
++  /* See if bit changed.  */
++  changed = (get_eflags () ^ oldflags) & 0x40000;
++  /* Restore EFLAGS.  */
++  set_eflags (oldflags);
++  /* If the AC flag did not change, it's a 386 and it lacks cmpxchg.
++     Otherwise, it's a 486 or above and it has cmpxchg.  */
++  return changed != 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h	1998-08-31 11:34:00.000000000 -0700
+@@ -0,0 +1,170 @@
++/* Special definitions for ix86 machine using segment register based
++   thread descriptor.
++   Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>	/* For offsetof.  */
++
++
++/* We don't want to include the kernel header.  So duplicate the
++   information.  */
++
++/* Structure passed on `modify_ldt' call.  */
++struct modify_ldt_ldt_s
++{
++  unsigned int entry_number;
++  unsigned long int base_addr;
++  unsigned int limit;
++  unsigned int seg_32bit:1;
++  unsigned int contents:2;
++  unsigned int read_exec_only:1;
++  unsigned int limit_in_pages:1;
++  unsigned int seg_not_present:1;
++  unsigned int useable:1;
++  unsigned int empty:25;
++};
++
++/* System call to set LDT entry.  */
++extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
++
++
++/* Return the thread descriptor for the current thread.
++
++   The contained asm must *not* be marked volatile since otherwise
++   assignments like
++	pthread_descr self = thread_self();
++   do not get optimized away.  */
++#define THREAD_SELF \
++({									      \
++  register pthread_descr __self;					      \
++  __asm__ ("movl %%gs:%c1,%0" : "=r" (__self)				      \
++	   : "i" (offsetof (struct _pthread_descr_struct, p_self)));	      \
++  __self;								      \
++})
++
++/* Initialize the thread-unique value.  */
++#define INIT_THREAD_SELF(descr, nr) \
++{									      \
++  struct modify_ldt_ldt_s ldt_entry =					      \
++    { nr, (unsigned long int) descr, sizeof (*descr), 1, 0, 0, 0, 0, 1, 0 };  \
++  if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0)		      \
++    abort ();								      \
++  __asm__ __volatile__ ("movw %w0, %%gs" : : "r" (nr * 8 + 7));		      \
++}
++
++/* Free resources associated with thread descriptor.  */
++#define FREE_THREAD_SELF(descr, nr) \
++{									      \
++  struct modify_ldt_ldt_s ldt_entry =					      \
++    { nr, 0, 0, 0, 0, 1, 0, 1, 0, 0 };					      \
++  __asm__ __volatile__ ("movw %w0,%%gs" : : "r" (0));			      \
++  __modify_ldt (1, &ldt_entry, sizeof (ldt_entry));			      \
++}
++
++/* Read member of the thread descriptor directly.  */
++#define THREAD_GETMEM(descr, member) \
++({									      \
++  __typeof__ (descr->member) __value;					      \
++  if (sizeof (__value) == 1)						      \
++    __asm__ __volatile__ ("movb %%gs:%P2,%b0"				      \
++			  : "=r" (__value)				      \
++			  : "0" (0),					      \
++			    "i" (offsetof (struct _pthread_descr_struct,      \
++					   member)));			      \
++  else									      \
++    {									      \
++      if (sizeof (__value) != 4)					      \
++	/* There should not be any value with a size other than 1 or 4.  */   \
++	abort ();							      \
++									      \
++      __asm__ __volatile__ ("movl %%gs:%P1,%0"				      \
++			    : "=r" (__value)				      \
++			    : "i" (offsetof (struct _pthread_descr_struct,    \
++					     member)));			      \
++    }									      \
++  __value;								      \
++})
++
++/* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
++#define THREAD_GETMEM_NC(descr, member) \
++({									      \
++  __typeof__ (descr->member) __value;					      \
++  if (sizeof (__value) == 1)						      \
++    __asm__ __volatile__ ("movb %%gs:(%2),%b0"				      \
++			  : "=r" (__value)				      \
++			  : "0" (0),					      \
++			    "r" (offsetof (struct _pthread_descr_struct,      \
++					   member)));			      \
++  else									      \
++    {									      \
++      if (sizeof (__value) != 4)					      \
++	/* There should not be any value with a size other than 1 or 4.  */   \
++	abort ();							      \
++									      \
++      __asm__ __volatile__ ("movl %%gs:(%1),%0"				      \
++			    : "=r" (__value)				      \
++			    : "r" (offsetof (struct _pthread_descr_struct,    \
++					     member)));			      \
++    }									      \
++  __value;								      \
++})
++
++/* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
++#define THREAD_SETMEM(descr, member, value) \
++({									      \
++  __typeof__ (descr->member) __value = (value);				      \
++  if (sizeof (__value) == 1)						      \
++    __asm__ __volatile__ ("movb %0,%%gs:%P1" :				      \
++			  : "r" (__value),				      \
++			    "i" (offsetof (struct _pthread_descr_struct,      \
++					   member)));			      \
++  else									      \
++    {									      \
++      if (sizeof (__value) != 4)					      \
++	/* There should not be any value with a size other than 1 or 4.  */   \
++	abort ();							      \
++									      \
++      __asm__ __volatile__ ("movl %0,%%gs:%P1" :			      \
++			    : "r" (__value),				      \
++			      "i" (offsetof (struct _pthread_descr_struct,    \
++					     member)));			      \
++    }									      \
++})
++
++/* Set member of the thread descriptor directly.  */
++#define THREAD_SETMEM_NC(descr, member, value) \
++({									      \
++  __typeof__ (descr->member) __value = (value);				      \
++  if (sizeof (__value) == 1)						      \
++    __asm__ __volatile__ ("movb %0,%%gs:(%1)" :				      \
++			  : "r" (__value),				      \
++			    "r" (offsetof (struct _pthread_descr_struct,      \
++					   member)));			      \
++  else									      \
++    {									      \
++      if (sizeof (__value) != 4)					      \
++	/* There should not be any value with a size other than 1 or 4.  */   \
++	abort ();							      \
++									      \
++      __asm__ __volatile__ ("movl %0,%%gs:(%1)" :			      \
++			    : "r" (__value),				      \
++			      "r" (offsetof (struct _pthread_descr_struct,    \
++					     member)));			      \
++    }									      \
++})
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h	1998-10-09 11:34:04.000000000 -0700
+@@ -0,0 +1,62 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   m68k version.
++   Copyright (C) 1996, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If
++   not, write to the Free Software Foundation, Inc.,
++   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  char ret;
++
++  __asm__ __volatile__("tas %1; sne %0"
++       : "=dm"(ret), "=m"(*spinlock)
++       : "m"(*spinlock)
++       : "cc");
++
++  return ret;
++}
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("%sp");
++
++
++/* Compare-and-swap for semaphores. */
++
++#define HAS_COMPARE_AND_SWAP
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  char ret;
++  long int readval;
++
++  __asm__ __volatile__ ("casl %2, %3, %1; seq %0"
++			: "=dm" (ret), "=m" (*p), "=d" (readval)
++			: "d" (newval), "m" (*p), "2" (oldval));
++
++  return ret;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h	1998-10-09 11:34:05.000000000 -0700
+@@ -0,0 +1,90 @@
++/* Machine-dependent pthreads configuration and inline functions.
++
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>.
++   Based on the Alpha version by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If
++   not, write to the Free Software Foundation, Inc.,
++   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++
++   TODO: This version makes use of MIPS ISA 2 features.  It won't
++   work on ISA 1.  These machines will have to take the overhead of
++   a sysmips(MIPS_ATOMIC_SET, ...) syscall which isn't implemented
++   yet correctly.  There is however a better solution for R3000
++   uniprocessor machines possible.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++
++/* Spinlock implementation; required.  */
++PT_EI long int
++testandset (int *spinlock)
++{
++  long int ret, temp;
++
++  __asm__ __volatile__(
++	"# Inline spinlock test & set\n\t"
++	".set\tmips2\n"
++	"1:\tll\t%0,%3\n\t"
++	"bnez\t%0,2f\n\t"
++	".set\tnoreorder\n\t"
++	"li\t%1,1\n\t"
++	".set\treorder\n\t"
++	"sc\t%1,%2\n\t"
++	"beqz\t%1,1b\n"
++	"2:\t.set\tmips0\n\t"
++	"/* End spinlock test & set */"
++	: "=&r"(ret), "=&r" (temp), "=m"(*spinlock)
++	: "m"(*spinlock)
++	: "memory");
++
++  return ret;
++}
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("$29");
++
++
++/* Compare-and-swap for semaphores. */
++
++#define HAS_COMPARE_AND_SWAP
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  long ret;
++
++  __asm__ __volatile__ (
++	"/* Inline compare & swap */\n\t"
++	".set\tmips2\n"
++	"1:\tll\t%0,%4\n\t"
++	".set\tnoreorder\n\t"
++	"bne\t%0,%2,2f\n\t"
++	"move\t%0,%3\n\t"
++	".set\treorder\n\t"
++	"sc\t%0,%1\n\t"
++	"beqz\t%0,1b\n"
++	"2:\t.set\tmips0\n\t"
++	"/* End compare & swap */"
++	: "=&r"(ret), "=m"(*p)
++	: "r"(oldval), "r"(newval), "m"(*p));
++
++  return ret;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h	1998-10-09 11:34:06.000000000 -0700
+@@ -0,0 +1,69 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   powerpc version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If
++   not, write to the Free Software Foundation, Inc.,
++   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
++
++/* These routines are from Appendix G of the 'PowerPC 601 RISC Microprocessor
++   User's Manual', by IBM and Motorola.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++/* For multiprocessor systems, we want to ensure all memory accesses
++   are completed before we reset a lock.  */
++#if 0
++/* on non multiprocessor systems, you can just: */
++#define sync() /* nothing */
++#else
++#define sync() __asm__ __volatile__ ("sync")
++#endif
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__ ("r1");
++
++/* Compare-and-swap for semaphores. */
++/* note that test-and-set(x) is the same as compare-and-swap(x, 0, 1) */
++
++#define HAS_COMPARE_AND_SWAP
++#if BROKEN_PPC_ASM_CR0
++static
++#else
++PT_EI
++#endif
++int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  int ret;
++
++  sync();
++  __asm__ __volatile__(
++		       "0:    lwarx %0,0,%1 ;"
++		       "      xor. %0,%3,%0;"
++		       "      bne 1f;"
++		       "      stwcx. %2,0,%1;"
++		       "      bne- 0b;"
++		       "1:    "
++	: "=&r"(ret)
++	: "r"(p), "r"(newval), "r"(oldval)
++	: "cr0", "memory");
++  sync();
++  return ret == 0;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile	1998-08-28 03:07:20.000000000 -0700
+@@ -0,0 +1,3 @@
++ifeq ($(subdir),libio)
++sysdep_headers += bits/stdio-lock.h
++endif
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs	1999-11-09 23:02:08.000000000 -0800
+@@ -0,0 +1 @@
++linuxthreads_db
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h	1999-05-07 07:34:29.000000000 -0700
+@@ -0,0 +1,214 @@
++/* libc-internal interface for mutex locks.  LinuxThreads version.
++   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef _BITS_LIBC_LOCK_H
++#define _BITS_LIBC_LOCK_H 1
++
++#include <pthread.h>
++
++/* Mutex type.  */
++#ifdef _LIBC
++typedef pthread_mutex_t __libc_lock_t;
++#else
++typedef struct __libc_lock_opaque__ __libc_lock_t;
++#endif
++
++/* Type for key to thread-specific data.  */
++typedef pthread_key_t __libc_key_t;
++
++/* Define a lock variable NAME with storage class CLASS.  The lock must be
++   initialized with __libc_lock_init before it can be used (or define it
++   with __libc_lock_define_initialized, below).  Use `extern' for CLASS to
++   declare a lock defined in another module.  In public structure
++   definitions you must use a pointer to the lock structure (i.e., NAME
++   begins with a `*'), because its storage size will not be known outside
++   of libc.  */
++#define __libc_lock_define(CLASS,NAME) \
++  CLASS __libc_lock_t NAME;
++
++/* Define an initialized lock variable NAME with storage class CLASS.
++
++   For the C library we take a deeper look at the initializer.  For this
++   implementation all fields are initialized to zero.  Therefore we
++   don't initialize the variable which allows putting it into the BSS
++   section.  */
++#define __libc_lock_define_initialized(CLASS,NAME) \
++  CLASS __libc_lock_t NAME;
++
++/* Define an initialized recursive lock variable NAME with storage
++   class CLASS.  */
++#define __libc_lock_define_initialized_recursive(CLASS,NAME) \
++  CLASS __libc_lock_t NAME = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
++
++/* Initialize the named lock variable, leaving it in a consistent, unlocked
++   state.  */
++#define __libc_lock_init(NAME) \
++  (__pthread_mutex_init != NULL ? __pthread_mutex_init (&(NAME), NULL) : 0);
++
++/* Same as last but this time we initialize a recursive mutex.  */
++#define __libc_lock_init_recursive(NAME) \
++  do {									      \
++    if (__pthread_mutex_init != NULL)					      \
++      {									      \
++	pthread_mutexattr_t __attr;					      \
++	__pthread_mutexattr_init (&__attr);				      \
++	__pthread_mutexattr_settype (&__attr, PTHREAD_MUTEX_RECURSIVE_NP); \
++	__pthread_mutex_init (&(NAME), &__attr);			      \
++	__pthread_mutexattr_destroy (&__attr);				      \
++      }									      \
++  } while (0);
++
++/* Finalize the named lock variable, which must be locked.  It cannot be
++   used again until __libc_lock_init is called again on it.  This must be
++   called on a lock variable before the containing storage is reused.  */
++#define __libc_lock_fini(NAME) \
++  (__pthread_mutex_destroy != NULL ? __pthread_mutex_destroy (&(NAME)) : 0);
++
++/* Finalize recursive named lock.  */
++#define __libc_lock_fini_recursive(NAME) __libc_lock_fini (NAME)
++
++/* Lock the named lock variable.  */
++#define __libc_lock_lock(NAME) \
++  (__pthread_mutex_lock != NULL ? __pthread_mutex_lock (&(NAME)) : 0);
++
++/* Lock the recursive named lock variable.  */
++#define __libc_lock_lock_recursive(NAME) __libc_lock_lock (NAME)
++
++/* Try to lock the named lock variable.  */
++#define __libc_lock_trylock(NAME) \
++  (__pthread_mutex_trylock != NULL ? __pthread_mutex_trylock (&(NAME)) : 0)
++
++/* Try to lock the recursive named lock variable.  */
++#define __libc_lock_trylock_recursive(NAME) __libc_lock_trylock (NAME)
++
++/* Unlock the named lock variable.  */
++#define __libc_lock_unlock(NAME) \
++  (__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (&(NAME)) : 0);
++
++/* Unlock the recursive named lock variable.  */
++#define __libc_lock_unlock_recursive(NAME) __libc_lock_unlock (NAME)
++
++
++/* Define once control variable.  */
++#if PTHREAD_ONCE_INIT == 0
++/* Special case for static variables where we can avoid the initialization
++   if it is zero.  */
++# define __libc_once_define(CLASS, NAME) \
++  CLASS pthread_once_t NAME
++#else
++# define __libc_once_define(CLASS, NAME) \
++  CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT
++#endif
++
++/* Call handler iff the first call.  */
++#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \
++  do {									      \
++    if (__pthread_once != NULL)						      \
++      __pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION));		      \
++    else if ((ONCE_CONTROL) == 0) {					      \
++      INIT_FUNCTION ();							      \
++      (ONCE_CONTROL) = 1;						      \
++    }									      \
++  } while (0)
++
++
++/* Start critical region with cleanup.  */
++#define __libc_cleanup_region_start(FCT, ARG) \
++  { struct _pthread_cleanup_buffer _buffer;				      \
++    int _avail = _pthread_cleanup_push_defer != NULL;			      \
++    if (_avail) {							      \
++      _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG));		      \
++    }
++
++/* End critical region with cleanup.  */
++#define __libc_cleanup_region_end(DOIT) \
++    if (_avail) {							      \
++      _pthread_cleanup_pop_restore (&_buffer, (DOIT));			      \
++    }									      \
++  }
++
++/* Sometimes we have to exit the block in the middle.  */
++#define __libc_cleanup_end(DOIT) \
++    if (_avail) {							      \
++      _pthread_cleanup_pop_restore (&_buffer, (DOIT));			      \
++    }
++
++/* Create thread-specific key.  */
++#define __libc_key_create(KEY, DESTRUCTOR) \
++  (__pthread_key_create != NULL ? __pthread_key_create (KEY, DESTRUCTOR) : 1)
++
++/* Get thread-specific data.  */
++#define __libc_getspecific(KEY) \
++  (__pthread_getspecific != NULL ? __pthread_getspecific (KEY) : NULL)
++
++/* Set thread-specific data.  */
++#define __libc_setspecific(KEY, VALUE) \
++  (__pthread_setspecific != NULL ? __pthread_setspecific (KEY, VALUE) : 0)
++
++
++/* Register handlers to execute before and after `fork'.  */
++#define __libc_atfork(PREPARE, PARENT, CHILD) \
++  (__pthread_atfork != NULL ? __pthread_atfork (PREPARE, PARENT, CHILD) : 0)
++
++
++/* Make the pthread functions weak so that we can elide them from
++   single-threaded processes.  */
++#ifndef __NO_WEAK_PTHREAD_ALIASES
++# ifdef weak_extern
++weak_extern (__pthread_mutex_init)
++weak_extern (__pthread_mutex_destroy)
++weak_extern (__pthread_mutex_lock)
++weak_extern (__pthread_mutex_trylock)
++weak_extern (__pthread_mutex_unlock)
++weak_extern (__pthread_mutexattr_init)
++weak_extern (__pthread_mutexattr_destroy)
++weak_extern (__pthread_mutexattr_settype)
++weak_extern (__pthread_key_create)
++weak_extern (__pthread_setspecific)
++weak_extern (__pthread_getspecific)
++weak_extern (__pthread_once)
++weak_extern (__pthread_initialize)
++weak_extern (__pthread_atfork)
++weak_extern (_pthread_cleanup_push_defer)
++weak_extern (_pthread_cleanup_pop_restore)
++# else
++#  pragma weak __pthread_mutex_init
++#  pragma weak __pthread_mutex_destroy
++#  pragma weak __pthread_mutex_lock
++#  pragma weak __pthread_mutex_trylock
++#  pragma weak __pthread_mutex_unlock
++#  pragma weak __pthread_mutexattr_init
++#  pragma weak __pthread_mutexattr_destroy
++#  pragma weak __pthread_mutexattr_settype
++#  pragma weak __pthread_key_create
++#  pragma weak __pthread_setspecific
++#  pragma weak __pthread_getspecific
++#  pragma weak __pthread_once
++#  pragma weak __pthread_initialize
++#  pragma weak __pthread_atfork
++#  pragma weak _pthread_cleanup_push_defer
++#  pragma weak _pthread_cleanup_pop_restore
++# endif
++#endif
++
++/* We need portable names for some functions.  E.g., when they are
++   used as argument to __libc_cleanup_region_start.  */
++#define __libc_mutex_unlock __pthread_mutex_unlock
++
++#endif	/* bits/libc-lock.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h	1998-11-30 06:18:52.000000000 -0800
+@@ -0,0 +1,43 @@
++/* libc-internal interface for thread-specific data.  LinuxThreads version.
++   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef _BITS_LIBC_TSD_H
++#define _BITS_LIBC_TSD_H 1
++
++
++/* Fast thread-specific data internal to libc.  */
++enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
++			_LIBC_TSD_KEY_DL_ERROR,
++			_LIBC_TSD_KEY_N };
++
++extern void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
++extern int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
++					    __const void *));
++
++#define __libc_tsd_define(CLASS, KEY)	CLASS void *__libc_tsd_##KEY##_data;
++#define __libc_tsd_get(KEY) \
++  (__libc_internal_tsd_get != NULL \
++   ? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \
++   : __libc_tsd_##KEY##_data)
++#define __libc_tsd_set(KEY, VALUE) \
++  (__libc_internal_tsd_set != NULL \
++   ? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \
++   : ((__libc_tsd_##KEY##_data = (VALUE)), 0))
++
++#endif	/* bits/libc-tsd.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,122 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#if !defined _BITS_TYPES_H && !defined _PTHREAD_H
++# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead."
++#endif
++
++#ifndef _BITS_PTHREADTYPES_H
++#define _BITS_PTHREADTYPES_H	1
++
++#define __need_schedparam
++#include <bits/sched.h>
++
++/* Fast locks (not abstract because mutexes and conditions aren't abstract). */
++struct _pthread_fastlock
++{
++  long int __status;            /* "Free" or "taken" or head of waiting list */
++  int __spinlock;               /* For compare-and-swap emulation */
++};
++
++#ifndef _PTHREAD_DESCR_DEFINED
++/* Thread descriptors */
++typedef struct _pthread_descr_struct *_pthread_descr;
++# define _PTHREAD_DESCR_DEFINED
++#endif
++
++
++/* Attributes for threads.  */
++typedef struct
++{
++  int __detachstate;
++  int __schedpolicy;
++  struct __sched_param __schedparam;
++  int __inheritsched;
++  int __scope;
++  size_t __guardsize;
++  int __stackaddr_set;
++  void *__stackaddr;
++  size_t __stacksize;
++} pthread_attr_t;
++
++
++/* Conditions (not abstract because of PTHREAD_COND_INITIALIZER */
++typedef struct
++{
++  struct _pthread_fastlock __c_lock; /* Protect against concurrent access */
++  _pthread_descr __c_waiting;        /* Threads waiting on this condition */
++} pthread_cond_t;
++
++
++/* Attribute for conditionally variables.  */
++typedef struct
++{
++  int __dummy;
++} pthread_condattr_t;
++
++/* Keys for thread-specific data */
++typedef unsigned int pthread_key_t;
++
++
++/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER).  */
++/* (The layout is unnatural to maintain binary compatibility
++    with earlier releases of LinuxThreads.) */
++typedef struct
++{
++  int __m_reserved;               /* Reserved for future use */
++  int __m_count;                  /* Depth of recursive locking */
++  _pthread_descr __m_owner;       /* Owner thread (if recursive or errcheck) */
++  int __m_kind;                   /* Mutex kind: fast, recursive or errcheck */
++  struct _pthread_fastlock __m_lock; /* Underlying fast lock */
++} pthread_mutex_t;
++
++
++/* Attribute for mutex.  */
++typedef struct
++{
++  int __mutexkind;
++} pthread_mutexattr_t;
++
++
++/* Once-only execution */
++typedef int pthread_once_t;
++
++
++#ifdef __USE_UNIX98
++/* Read-write locks.  */
++typedef struct _pthread_rwlock_t
++{
++  struct _pthread_fastlock __rw_lock; /* Lock to guarantee mutual exclusion */
++  int __rw_readers;                   /* Number of readers */
++  _pthread_descr __rw_writer;         /* Identity of writer, or NULL if none */
++  _pthread_descr __rw_read_waiting;   /* Threads waiting for reading */
++  _pthread_descr __rw_write_waiting;  /* Threads waiting for writing */
++  int __rw_kind;                      /* Reader/Writer preference selection */
++  int __rw_pshared;                   /* Shared between processes or not */
++} pthread_rwlock_t;
++
++
++/* Attribute for read-write locks.  */
++typedef struct
++{
++  int __lockkind;
++  int __pshared;
++} pthread_rwlockattr_t;
++#endif
++
++
++/* Thread identifiers */
++typedef unsigned long int pthread_t;
++
++#endif	/* bits/pthreadtypes.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h	1999-01-04 07:42:03.000000000 -0800
+@@ -0,0 +1,39 @@
++/* Thread package specific definitions of stream lock type.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <pthread.h>
++
++typedef pthread_mutex_t _IO_lock_t;
++
++/* We need recursive (counting) mutexes.  */
++#define _IO_lock_initializer PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
++
++
++#define _IO_cleanup_region_start(_fct, _fp) \
++     __libc_cleanup_region_start (_fct, _fp)
++#define _IO_cleanup_region_end(_doit) \
++     __libc_cleanup_region_end (_doit)
++#define _IO_lock_init(_name) \
++     __libc_lock_init_recursive (_name)
++#define _IO_lock_fini(_name) \
++     __libc_lock_fini_recursive (_name)
++#define _IO_lock_lock(_name) \
++     __libc_lock_lock (_name)
++#define _IO_lock_unlock(_name) \
++     __libc_lock_unlock (_name)
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h	2000-01-20 18:32:38.000000000 -0800
+@@ -0,0 +1,552 @@
++/* Linuxthreads - a simple clone()-based implementation of Posix        */
++/* threads for Linux.                                                   */
++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr)              */
++/*                                                                      */
++/* This program is free software; you can redistribute it and/or        */
++/* modify it under the terms of the GNU Library General Public License  */
++/* as published by the Free Software Foundation; either version 2       */
++/* of the License, 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 Library General Public License for more details.                 */
++
++#ifndef _PTHREAD_H
++#define _PTHREAD_H	1
++
++#include <features.h>
++
++#include <sched.h>
++#include <time.h>
++
++#define __need_sigset_t
++#include <signal.h>
++#include <bits/pthreadtypes.h>
++
++
++__BEGIN_DECLS
++
++/* Initializers.  */
++
++#define PTHREAD_MUTEX_INITIALIZER \
++  {0, 0, 0, PTHREAD_MUTEX_FAST_NP, {0, 0}}
++#ifdef __USE_GNU
++# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
++  {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, {0, 0}}
++#endif
++
++#define PTHREAD_COND_INITIALIZER {{0, 0}, 0}
++
++#ifdef __USE_UNIX98
++# define PTHREAD_RWLOCK_INITIALIZER \
++  { {0, 0}, 0, NULL, NULL, NULL,					      \
++    PTHREAD_RWLOCK_DEFAULT_NP, PTHREAD_PROCESS_PRIVATE }
++#endif
++
++/* Values for attributes.  */
++
++enum
++{
++  PTHREAD_CREATE_JOINABLE,
++#define PTHREAD_CREATE_JOINABLE	PTHREAD_CREATE_JOINABLE
++  PTHREAD_CREATE_DETACHED
++#define PTHREAD_CREATE_DETACHED	PTHREAD_CREATE_DETACHED
++};
++
++enum
++{
++  PTHREAD_INHERIT_SCHED,
++#define PTHREAD_INHERIT_SCHED	PTHREAD_INHERIT_SCHED
++  PTHREAD_EXPLICIT_SCHED
++#define PTHREAD_EXPLICIT_SCHED	PTHREAD_EXPLICIT_SCHED
++};
++
++enum
++{
++  PTHREAD_SCOPE_SYSTEM,
++#define PTHREAD_SCOPE_SYSTEM	PTHREAD_SCOPE_SYSTEM
++  PTHREAD_SCOPE_PROCESS
++#define PTHREAD_SCOPE_PROCESS	PTHREAD_SCOPE_PROCESS
++};
++
++enum
++{
++  PTHREAD_MUTEX_FAST_NP,
++  PTHREAD_MUTEX_RECURSIVE_NP,
++  PTHREAD_MUTEX_ERRORCHECK_NP
++#ifdef __USE_UNIX98
++  ,
++  PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP,
++  PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
++  PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
++  PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
++#endif
++};
++
++enum
++{
++  PTHREAD_PROCESS_PRIVATE,
++#define PTHREAD_PROCESS_PRIVATE	PTHREAD_PROCESS_PRIVATE
++  PTHREAD_PROCESS_SHARED
++#define PTHREAD_PROCESS_SHARED	PTHREAD_PROCESS_SHARED
++};
++
++#ifdef __USE_UNIX98
++enum
++{
++  PTHREAD_RWLOCK_PREFER_READER_NP,
++  PTHREAD_RWLOCK_PREFER_WRITER_NP,
++  PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
++  PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP
++};
++#endif	/* Unix98 */
++
++#define PTHREAD_ONCE_INIT 0
++
++/* Cleanup buffers */
++
++struct _pthread_cleanup_buffer
++{
++  void (*__routine) __PMT ((void *));	  /* Function to call.  */
++  void *__arg;				  /* Its argument.  */
++  int __canceltype;			  /* Saved cancellation type. */
++  struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions.  */
++};
++
++/* Cancellation */
++
++enum
++{
++  PTHREAD_CANCEL_ENABLE,
++#define PTHREAD_CANCEL_ENABLE	PTHREAD_CANCEL_ENABLE
++  PTHREAD_CANCEL_DISABLE
++#define PTHREAD_CANCEL_DISABLE	PTHREAD_CANCEL_DISABLE
++};
++enum
++{
++  PTHREAD_CANCEL_DEFERRED,
++#define PTHREAD_CANCEL_DEFERRED	PTHREAD_CANCEL_DEFERRED
++  PTHREAD_CANCEL_ASYNCHRONOUS
++#define PTHREAD_CANCEL_ASYNCHRONOUS	PTHREAD_CANCEL_ASYNCHRONOUS
++};
++#define PTHREAD_CANCELED ((void *) -1)
++
++
++/* Function for handling threads.  */
++
++/* Create a thread with given attributes ATTR (or default attributes
++   if ATTR is NULL), and call function START_ROUTINE with given
++   arguments ARG.  */
++extern int pthread_create __P ((pthread_t *__thread,
++				__const pthread_attr_t *__attr,
++				void *(*__start_routine) (void *),
++				void *__arg));
++
++/* Obtain the identifier of the current thread.  */
++extern pthread_t pthread_self __P ((void));
++
++/* Compare two thread identifiers.  */
++extern int pthread_equal __P ((pthread_t __thread1, pthread_t __thread2));
++
++/* Terminate calling thread.  */
++extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
++
++/* Make calling thread wait for termination of the thread TH.  The
++   exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN
++   is not NULL.  */
++extern int pthread_join __P ((pthread_t __th, void **__thread_return));
++
++/* Indicate that the thread TH is never to be joined with PTHREAD_JOIN.
++   The resources of TH will therefore be freed immediately when it
++   terminates, instead of waiting for another thread to perform PTHREAD_JOIN
++   on it. */
++extern int pthread_detach __P ((pthread_t __th));
++
++
++/* Functions for handling attributes.  */
++
++/* Initialize thread attribute *ATTR with default attributes
++   (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER,
++    no user-provided stack).  */
++extern int pthread_attr_init __P ((pthread_attr_t *__attr));
++
++/* Destroy thread attribute *ATTR.  */
++extern int pthread_attr_destroy __P ((pthread_attr_t *__attr));
++
++/* Set the `detachstate' attribute in *ATTR according to DETACHSTATE.  */
++extern int pthread_attr_setdetachstate __P ((pthread_attr_t *__attr,
++					     int __detachstate));
++
++/* Return in *DETACHSTATE the `detachstate' attribute in *ATTR.  */
++extern int pthread_attr_getdetachstate __P ((__const pthread_attr_t *__attr,
++					     int *__detachstate));
++
++/* Set scheduling parameters (priority, etc) in *ATTR according to PARAM.  */
++extern int pthread_attr_setschedparam __P ((pthread_attr_t *__attr,
++				        __const struct sched_param *__param));
++
++/* Return in *PARAM the scheduling parameters of *ATTR.  */
++extern int pthread_attr_getschedparam __P ((__const pthread_attr_t *__attr,
++					    struct sched_param *__param));
++
++/* Set scheduling policy in *ATTR according to POLICY.  */
++extern int pthread_attr_setschedpolicy __P ((pthread_attr_t *__attr,
++					     int __policy));
++
++/* Return in *POLICY the scheduling policy of *ATTR.  */
++extern int pthread_attr_getschedpolicy __P ((__const pthread_attr_t *__attr,
++					     int *__policy));
++
++/* Set scheduling inheritance mode in *ATTR according to INHERIT.  */
++extern int pthread_attr_setinheritsched __P ((pthread_attr_t *__attr,
++					      int __inherit));
++
++/* Return in *INHERIT the scheduling inheritance mode of *ATTR.  */
++extern int pthread_attr_getinheritsched __P ((__const pthread_attr_t *__attr,
++					      int *__inherit));
++
++/* Set scheduling contention scope in *ATTR according to SCOPE.  */
++extern int pthread_attr_setscope __P ((pthread_attr_t *__attr, int __scope));
++
++/* Return in *SCOPE the scheduling contention scope of *ATTR.  */
++extern int pthread_attr_getscope __P ((__const pthread_attr_t *__attr,
++				       int *__scope));
++
++#ifdef __USE_UNIX98
++/* Set the size of the guard area at the bottom of the thread.  */
++extern int pthread_attr_setguardsize __P ((pthread_attr_t *__attr,
++					   size_t __guardsize));
++
++/* Get the size of the guard area at the bottom of the thread.  */
++extern int pthread_attr_getguardsize __P ((__const pthread_attr_t *__attr,
++					   size_t *__guardsize));
++#endif
++
++/* Set the starting address of the stack of the thread to be created.
++   Depending on whether the stack grows up or doen the value must either
++   be higher or lower than all the address in the memory block.  The
++   minimal size of the block must be PTHREAD_STACK_SIZE.  */
++extern int pthread_attr_setstackaddr __P ((pthread_attr_t *__attr,
++					   void *__stackaddr));
++
++/* Return the previously set address for the stack.  */
++extern int pthread_attr_getstackaddr __P ((__const pthread_attr_t *__attr,
++					   void **__stackaddr));
++
++/* Add information about the minimum stack size needed for the thread
++   to be started.  This size must never be less than PTHREAD_STACK_SIZE
++   and must also not exceed the system limits.  */
++extern int pthread_attr_setstacksize __P ((pthread_attr_t *__attr,
++					   size_t __stacksize));
++
++/* Return the currently used minimal stack size.  */
++extern int pthread_attr_getstacksize __P ((__const pthread_attr_t *__attr,
++					   size_t *__stacksize));
++
++/* Functions for scheduling control. */
++
++/* Set the scheduling parameters for TARGET_THREAD according to POLICY
++   and *PARAM. */
++extern int pthread_setschedparam __P ((pthread_t __target_thread, int __policy,
++				       __const struct sched_param *__param));
++
++/* Return in *POLICY and *PARAM the scheduling parameters for TARGET_THREAD. */
++extern int pthread_getschedparam __P ((pthread_t __target_thread,
++				       int *__policy,
++				       struct sched_param *__param));
++
++#ifdef __USE_UNIX98
++/* Determine  level of concurrency.  */
++extern int pthread_getconcurrency __P ((void));
++
++/* Set new concurrency level to LEVEL.  */
++extern int pthread_setconcurrency __P ((int __level));
++#endif
++
++/* Functions for mutex handling. */
++
++/* Initialize MUTEX using attributes in *MUTEX_ATTR, or use the
++   default values if later is NULL.  */
++extern int __pthread_mutex_init __P ((pthread_mutex_t *__mutex,
++				   __const pthread_mutexattr_t *__mutex_attr));
++extern int pthread_mutex_init __P ((pthread_mutex_t *__mutex,
++				   __const pthread_mutexattr_t *__mutex_attr));
++
++/* Destroy MUTEX.  */
++extern int __pthread_mutex_destroy __P ((pthread_mutex_t *__mutex));
++extern int pthread_mutex_destroy __P ((pthread_mutex_t *__mutex));
++
++/* Try to lock MUTEX.  */
++extern int __pthread_mutex_trylock __P ((pthread_mutex_t *__mutex));
++extern int pthread_mutex_trylock __P ((pthread_mutex_t *__mutex));
++
++/* Wait until lock for MUTEX becomes available and lock it.  */
++extern int __pthread_mutex_lock __P ((pthread_mutex_t *__mutex));
++extern int pthread_mutex_lock __P ((pthread_mutex_t *__mutex));
++
++/* Unlock MUTEX.  */
++extern int __pthread_mutex_unlock __P ((pthread_mutex_t *__mutex));
++extern int pthread_mutex_unlock __P ((pthread_mutex_t *__mutex));
++
++
++/* Functions for handling mutex attributes.  */
++
++/* Initialize mutex attribute object ATTR with default attributes
++   (kind is PTHREAD_MUTEX_FAST_NP).  */
++extern int __pthread_mutexattr_init __P ((pthread_mutexattr_t *__attr));
++extern int pthread_mutexattr_init __P ((pthread_mutexattr_t *__attr));
++
++/* Destroy mutex attribute object ATTR.  */
++extern int __pthread_mutexattr_destroy __P ((pthread_mutexattr_t *__attr));
++extern int pthread_mutexattr_destroy __P ((pthread_mutexattr_t *__attr));
++
++#ifdef __USE_UNIX98
++/* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
++   PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
++   PTHREAD_MUTEX_DEFAULT).  */
++extern int __pthread_mutexattr_settype __P ((pthread_mutexattr_t *__attr,
++					     int __kind));
++extern int pthread_mutexattr_settype __P ((pthread_mutexattr_t *__attr,
++					   int __kind));
++
++/* Return in *KIND the mutex kind attribute in *ATTR. */
++extern int pthread_mutexattr_gettype __P ((__const pthread_mutexattr_t *__attr,
++					   int *__kind));
++#endif
++
++
++/* Functions for handling conditional variables.  */
++
++/* Initialize condition variable COND using attributes ATTR, or use
++   the default values if later is NULL.  */
++extern int pthread_cond_init __P ((pthread_cond_t *__cond,
++				   __const pthread_condattr_t *__cond_attr));
++
++/* Destroy condition variable COND.  */
++extern int pthread_cond_destroy __P ((pthread_cond_t *__cond));
++
++/* Wake up one thread waiting for condition variable COND.  */
++extern int pthread_cond_signal __P ((pthread_cond_t *__cond));
++
++/* Wake up all threads waiting for condition variables COND.  */
++extern int pthread_cond_broadcast __P ((pthread_cond_t *__cond));
++
++/* Wait for condition variable COND to be signaled or broadcast.
++   MUTEX is assumed to be locked before.  */
++extern int pthread_cond_wait __P ((pthread_cond_t *__cond,
++				   pthread_mutex_t *__mutex));
++
++/* Wait for condition variable COND to be signaled or broadcast until
++   ABSTIME.  MUTEX is assumed to be locked before.  ABSTIME is an
++   absolute time specification; zero is the beginning of the epoch
++   (00:00:00 GMT, January 1, 1970). */
++extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,
++					pthread_mutex_t *__mutex,
++					__const struct timespec *__abstime));
++
++/* Functions for handling condition variable attributes.  */
++
++/* Initialize condition variable attribute ATTR.  */
++extern int pthread_condattr_init __P ((pthread_condattr_t *__attr));
++
++/* Destroy condition variable attribute ATTR.  */
++extern int pthread_condattr_destroy __P ((pthread_condattr_t *__attr));
++
++
++#ifdef __USE_UNIX98
++/* Functions for handling read-write locks.  */
++
++/* Initialize read-write lock RWLOCK using attributes ATTR, or use
++   the default values if later is NULL.  */
++extern int pthread_rwlock_init __P ((pthread_rwlock_t *__rwlock,
++				     __const pthread_rwlockattr_t *__attr));
++
++/* Destroy read-write lock RWLOCK.  */
++extern int pthread_rwlock_destroy __P ((pthread_rwlock_t *__rwlock));
++
++/* Acquire read lock for RWLOCK.  */
++extern int pthread_rwlock_rdlock __P ((pthread_rwlock_t *__rwlock));
++
++/* Try to acquire read lock for RWLOCK.  */
++extern int pthread_rwlock_tryrdlock __P ((pthread_rwlock_t *__rwlock));
++
++/* Acquire write lock for RWLOCK.  */
++extern int pthread_rwlock_wrlock __P ((pthread_rwlock_t *__rwlock));
++
++/* Try to acquire writelock for RWLOCK.  */
++extern int pthread_rwlock_trywrlock __P ((pthread_rwlock_t *__rwlock));
++
++/* Unlock RWLOCK.  */
++extern int pthread_rwlock_unlock __P ((pthread_rwlock_t *__rwlock));
++
++
++/* Functions for handling read-write lock attributes.  */
++
++/* Initialize attribute object ATTR with default values.  */
++extern int pthread_rwlockattr_init __P ((pthread_rwlockattr_t *__attr));
++
++/* Destroy attribute object ATTR.  */
++extern int pthread_rwlockattr_destroy __P ((pthread_rwlockattr_t *__attr));
++
++/* Return current setting of process-shared attribute of ATTR in PSHARED.  */
++extern int pthread_rwlockattr_getpshared __P ((__const
++					       pthread_rwlockattr_t *__attr,
++					       int *__pshared));
++
++/* Set process-shared attribute of ATTR to PSHARED.  */
++extern int pthread_rwlockattr_setpshared __P ((pthread_rwlockattr_t *__attr,
++					       int __pshared));
++
++/* Return current setting of reader/writer preference.  */
++extern int pthread_rwlockattr_getkind_np __P ((__const
++					       pthread_rwlockattr_t *__attr,
++					       int *__pref));
++
++/* Set reader/write preference.  */
++extern int pthread_rwlockattr_setkind_np __P ((pthread_rwlockattr_t *__attr,
++					       int __pref));
++#endif
++
++
++/* Functions for handling thread-specific data */
++
++/* Create a key value identifying a location in the thread-specific data
++   area.  Each thread maintains a distinct thread-specific data area.
++   DESTR_FUNCTION, if non-NULL, is called with
++   the value associated to that key when the key is destroyed.
++   DESTR_FUNCTION is not called if the value associated is NULL
++   when the key is destroyed. */
++extern int __pthread_key_create __P ((pthread_key_t *__key,
++				      void (*__destr_function) (void *)));
++extern int pthread_key_create __P ((pthread_key_t *__key,
++				    void (*__destr_function) (void *)));
++
++/* Destroy KEY.  */
++extern int pthread_key_delete __P ((pthread_key_t __key));
++
++/* Store POINTER in the thread-specific data slot identified by KEY. */
++extern int __pthread_setspecific __P ((pthread_key_t __key,
++				       __const void *__pointer));
++extern int pthread_setspecific __P ((pthread_key_t __key,
++				     __const void *__pointer));
++
++/* Return current value of the thread-specific data slot identified by KEY.  */
++extern void *__pthread_getspecific __P ((pthread_key_t __key));
++extern void *pthread_getspecific __P ((pthread_key_t __key));
++
++
++/* Functions for handling initialization */
++
++/* Guarantee that the initialization function INIT_ROUTINE will be called
++   only once, even if pthread_once is executed several times with the
++   same ONCE_CONTROL argument. ONCE_CONTROL must point to a static or
++   extern variable initialized to PTHREAD_ONCE_INIT. */
++extern int __pthread_once __P ((pthread_once_t *__once_control,
++				void (*__init_routine) (void)));
++extern int pthread_once __P ((pthread_once_t *__once_control,
++			      void (*__init_routine) (void)));
++
++
++/* Functions for handling cancellation. */
++
++/* Set cancelability state of current thread to STATE, returning old
++   state in *OLDSTATE if OLDSTATE is not NULL.  */
++extern int pthread_setcancelstate __P ((int __state, int *__oldstate));
++
++/* Set cancellation state of current thread to TYPE, returning the old
++   type in *OLDTYPE if OLDTYPE is not NULL.  */
++extern int pthread_setcanceltype __P ((int __type, int *__oldtype));
++
++/* Cancel THREAD immediately or at the next possibility.  */
++extern int pthread_cancel __P ((pthread_t __thread));
++
++/* Test for pending cancellation for the current thread and terminate
++   the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
++   cancelled. */
++extern void pthread_testcancel __P ((void));
++
++
++/* Install a cleanup handler: ROUTINE will be called with arguments ARG
++   when the thread is cancelled or calls pthread_exit.  ROUTINE will also
++   be called with arguments ARG when the matching pthread_cleanup_pop
++   is executed with non-zero EXECUTE argument.
++   pthread_cleanup_push and pthread_cleanup_pop are macros and must always
++   be used in matching pairs at the same nesting level of braces. */
++
++#define pthread_cleanup_push(routine,arg)				      \
++  { struct _pthread_cleanup_buffer _buffer;				      \
++    _pthread_cleanup_push (&_buffer, (routine), (arg));
++
++extern void _pthread_cleanup_push __P ((struct _pthread_cleanup_buffer *__buffer,
++					void (*__routine) (void *),
++					void *__arg));
++
++/* Remove a cleanup handler installed by the matching pthread_cleanup_push.
++   If EXECUTE is non-zero, the handler function is called. */
++
++#define pthread_cleanup_pop(execute)					      \
++    _pthread_cleanup_pop (&_buffer, (execute)); }
++
++extern void _pthread_cleanup_pop __P ((struct _pthread_cleanup_buffer *__buffer,
++				       int __execute));
++
++/* Install a cleanup handler as pthread_cleanup_push does, but also
++   saves the current cancellation type and set it to deferred cancellation. */
++
++#ifdef __USE_GNU
++# define pthread_cleanup_push_defer_np(routine,arg)			      \
++  { struct _pthread_cleanup_buffer _buffer;				      \
++    _pthread_cleanup_push_defer (&_buffer, (routine), (arg));
++
++extern void _pthread_cleanup_push_defer __P ((struct _pthread_cleanup_buffer *__buffer,
++					      void (*__routine) (void *),
++					      void *__arg));
++
++/* Remove a cleanup handler as pthread_cleanup_pop does, but also
++   restores the cancellation type that was in effect when the matching
++   pthread_cleanup_push_defer was called. */
++
++# define pthread_cleanup_pop_restore_np(execute)			      \
++  _pthread_cleanup_pop_restore (&_buffer, (execute)); }
++
++extern void _pthread_cleanup_pop_restore __P ((struct _pthread_cleanup_buffer *__buffer,
++					       int __execute));
++#endif
++
++/* Functions for handling signals. */
++#include <bits/sigthread.h>
++
++
++/* Functions for handling process creation and process execution. */
++
++/* Install handlers to be called when a new process is created with FORK.
++   The PREPARE handler is called in the parent process just before performing
++   FORK. The PARENT handler is called in the parent process just after FORK.
++   The CHILD handler is called in the child process.  Each of the three
++   handlers can be NULL, meaning that no handler needs to be called at that
++   point.
++   PTHREAD_ATFORK can be called several times, in which case the PREPARE
++   handlers are called in LIFO order (last added with PTHREAD_ATFORK,
++   first called before FORK), and the PARENT and CHILD handlers are called
++   in FIFO (first added, first called). */
++
++extern int __pthread_atfork __P ((void (*__prepare) (void),
++				  void (*__parent) (void),
++				  void (*__child) (void)));
++extern int pthread_atfork __P ((void (*__prepare) (void),
++				void (*__parent) (void),
++				void (*__child) (void)));
++
++/* Terminate all threads in the program except the calling process.
++   Should be called just before invoking one of the exec*() functions. */
++
++extern void pthread_kill_other_threads_np __P ((void));
++
++
++/* This function is called to initialize the pthread library. */
++extern void __pthread_initialize __P ((void));
++
++__END_DECLS
++
++#endif	/* pthread.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h	1998-09-10 21:32:08.000000000 -0700
+@@ -0,0 +1 @@
++#include <linuxthreads/semaphore.h>
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h	1998-10-09 11:34:08.000000000 -0700
+@@ -0,0 +1,66 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   sparc version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  int ret;
++
++  __asm__ __volatile__("ldstub %1,%0"
++	: "=r"(ret), "=m"(*spinlock)
++	: "m"(*spinlock));
++
++  return ret;
++}
++
++
++/* Spinlock release; default is just set to zero.  */
++#define RELEASE(spinlock) \
++  __asm__ __volatile__("stbar; stb %1,%0" : "=m"(*(spinlock)) : "r"(0));
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char * stack_pointer __asm__("%sp");
++
++
++/* Registers %g6 and %g7 are reserved by the ABI for "system use".  It
++   happens that Solaris uses %g6 for the thread pointer -- we do the same.  */
++struct _pthread_descr_struct;
++register struct _pthread_descr_struct *__thread_self __asm__("%g6");
++
++/* Return the thread descriptor for the current thread.  */
++#define THREAD_SELF  __thread_self
++
++/* Initialize the thread-unique value.  */
++#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr))
++
++/* Access to data in the thread descriptor is easy.  */
++#define THREAD_GETMEM(descr, member) __thread_self->member
++#define THREAD_GETMEM_NC(descr, member) __thread_self->member
++#define THREAD_SETMEM(descr, member, value) __thread_self->member = (value)
++#define THREAD_SETMEM_NC(descr, member, value) __thread_self->member = (value)
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h	1999-06-16 15:34:10.000000000 -0700
+@@ -0,0 +1,77 @@
++/* Machine-dependent pthreads configuration and inline functions.
++   Sparc v9 version.
++   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Richard Henderson <rth@tamu.edu>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If
++   not, write to the Free Software Foundation, Inc.,
++   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
++
++#ifndef PT_EI
++# define PT_EI extern inline
++#endif
++
++
++/* Spinlock implementation; required.  */
++PT_EI int
++testandset (int *spinlock)
++{
++  int ret;
++
++  __asm__ __volatile__("ldstub %1,%0"
++	: "=r"(ret), "=m"(*spinlock) : "m"(*spinlock));
++
++  return ret;
++}
++
++
++/* Get some notion of the current stack.  Need not be exactly the top
++   of the stack, just something somewhere in the current frame.  */
++#define CURRENT_STACK_FRAME  stack_pointer
++register char *stack_pointer __asm__ ("%sp");
++
++
++/* Registers %g6 and %g7 are reserved by the ABI for "system use".  It
++   happens that Solaris uses %g6 for the thread pointer -- we do the same.  */
++struct _pthread_descr_struct;
++register struct _pthread_descr_struct *__thread_self __asm__("%g6");
++
++/* Return the thread descriptor for the current thread.  */
++#define THREAD_SELF  __thread_self
++
++/* Initialize the thread-unique value.  */
++#define INIT_THREAD_SELF(descr, nr)  (__thread_self = (descr))
++
++
++/* Compare-and-swap for semaphores. */
++
++#define HAS_COMPARE_AND_SWAP
++PT_EI int
++__compare_and_swap (long int *p, long int oldval, long int newval)
++{
++  long int readval;
++
++  __asm__ __volatile__ ("casx	[%4], %2, %0"
++			: "=r"(readval), "=m"(*p)
++			: "r"(oldval), "m"(*p), "r"(p), "0"(newval));
++
++  return readval == oldval;
++}
++
++/* Access to data in the thread descriptor is easy.  */
++#define THREAD_GETMEM(descr, member) __thread_self->member
++#define THREAD_GETMEM_NC(descr, member) __thread_self->member
++#define THREAD_SETMEM(descr, member, value) __thread_self->member = (value)
++#define THREAD_SETMEM_NC(descr, member, value) __thread_self->member = (value)
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies
+--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies	1998-08-28 03:07:20.000000000 -0700
+@@ -0,0 +1 @@
++pthread
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h	1998-11-13 10:10:46.000000000 -0800
+@@ -0,0 +1,55 @@
++/* Minimum guaranteed maximum values for system limits.  Linux version.
++   Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* The kernel header pollutes the namespace with the NR_OPEN symbol.
++   Remove this after including the header if necessary.  */
++#ifndef NR_OPEN
++# define __undef_NR_OPEN
++#endif
++
++/* The kernel sources contain a file with all the needed information.  */
++#include <linux/limits.h>
++
++/* Have to remove NR_OPEN?  */
++#ifdef __undef_NR_OPEN
++# undef NR_OPEN
++# undef __undef_NR_OPEN
++#endif
++
++/* The number of data keys per process.  */
++#define _POSIX_THREAD_KEYS_MAX	128
++/* This is the value this implementation supports.  */
++#define PTHREAD_KEYS_MAX	1024
++
++/* Controlling the iterations of destructors for thread-specific data.  */
++#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS	4
++/* Number of iterations this implementation does.  */
++#define PTHREAD_DESTRUCTOR_ITERATIONS	_POSIX_THREAD_DESTRUCTOR_ITERATIONS
++
++/* The number of threads per process.  */
++#define _POSIX_THREAD_THREADS_MAX	64
++/* This is the value this implementation supports.  */
++#define PTHREAD_THREADS_MAX	1024
++
++/* Maximum amount by which a process can descrease its asynchronous I/O
++   priority level.  */
++#define AIO_PRIO_DELTA_MAX	20
++
++/* Minimum size for a thread.  We are free to choose a reasonable value.  */
++#define PTHREAD_STACK_MIN	16384
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h	1999-01-18 13:32:42.000000000 -0800
+@@ -0,0 +1,110 @@
++/* Define POSIX options for Linux.
++   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef	_POSIX_OPT_H
++#define	_POSIX_OPT_H	1
++
++/* Job control is supported.  */
++#define	_POSIX_JOB_CONTROL	1
++
++/* Processes have a saved set-user-ID and a saved set-group-ID.  */
++#define	_POSIX_SAVED_IDS	1
++
++/* Priority scheduling is supported.  */
++#define	_POSIX_PRIORITY_SCHEDULING	1
++
++/* Synchronizing file data is supported.  */
++#define	_POSIX_SYNCHRONIZED_IO	1
++
++/* The fsync function is present.  */
++#define	_POSIX_FSYNC	1
++
++/* Mapping of files to memory is supported.  */
++#define	_POSIX_MAPPED_FILES	1
++
++/* Locking of all memory is supported.  */
++#define	_POSIX_MEMLOCK	1
++
++/* Locking of ranges of memory is supported.  */
++#define	_POSIX_MEMLOCK_RANGE	1
++
++/* Setting of memory protections is supported.  */
++#define	_POSIX_MEMORY_PROTECTION	1
++
++/* Implementation supports `poll' function.  */
++#define	_POSIX_POLL	1
++
++/* Implementation supports `select' and `pselect' functions.  */
++#define	_POSIX_SELECT	1
++
++/* Only root can change owner of file.  */
++#define	_POSIX_CHOWN_RESTRICTED	1
++
++/* `c_cc' member of 'struct termios' structure can be disabled by
++   using the value _POSIX_VDISABLE.  */
++#define	_POSIX_VDISABLE	'\0'
++
++/* Filenames are not silently truncated.  */
++#define	_POSIX_NO_TRUNC	1
++
++/* X/Open realtime support is available.  */
++#define _XOPEN_REALTIME	1
++
++/* X/Open realtime thread support is available.  */
++#define _XOPEN_REALTIME_THREADS	1
++
++/* XPG4.2 shared memory is supported.  */
++#define	_XOPEN_SHM	1
++
++/* Tell we have POSIX threads.  */
++#define _POSIX_THREADS	1
++
++/* We have the reentrant functions described in POSIX.  */
++#define _POSIX_REENTRANT_FUNCTIONS      1
++#define _POSIX_THREAD_SAFE_FUNCTIONS	1
++
++/* We provide priority scheduling for threads.  */
++#define	_POSIX_THREAD_PRIORITY_SCHEDULING	1
++
++/* We support user-defined stack sizes.  */
++#define _POSIX_THREAD_ATTR_STACKSIZE	1
++
++/* We support user-defined stacks.  */
++#define _POSIX_THREAD_ATTR_STACKADDR	1
++
++/* We support POSIX.1b semaphores, but only the non-shared form for now.  */
++/*#define _POSIX_SEMAPHORES	1	XXX We are not quite there now.  */
++
++/* Real-time signals are supported.  */
++#define _POSIX_REALTIME_SIGNALS	1
++
++/* We support asynchronous I/O.  */
++#define _POSIX_ASYNCHRONOUS_IO	1
++/* Alternative name for Unix98.  */
++#define _LFS_ASYNCHRONOUS_IO	1
++
++/* The LFS support in asynchronous I/O is also available.  */
++#define _LFS64_ASYNCHRONOUS_IO	1
++
++/* The rest of the LFS is also available.  */
++#define _LFS_LARGEFILE		1
++#define _LFS64_LARGEFILE	1
++#define _LFS64_STDIO		1
++
++#endif /* posix_opt.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h
+--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	1998-09-13 09:25:31.000000000 -0700
+@@ -0,0 +1,37 @@
++/* Signal handling function for threaded programs.
++   Copyright (C) 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef _BITS_SIGTHREAD_H 
++#define _BITS_SIGTHREAD_H	1
++
++#if !defined _SIGNAL_H && !defined _PTHREAD_H
++# error "Never include this file directly.  Use <pthread.h> instead"
++#endif
++
++/* Functions for handling signals. */
++
++/* Modify the signal mask for the calling thread.  The arguments have
++   the same meaning as for sigprocmask(2). */
++extern int pthread_sigmask __P ((int __how, __const __sigset_t *__newmask,
++				 __sigset_t *__oldmask));
++
++/* Send signal SIGNO to the given thread. */
++extern int pthread_kill __P ((pthread_t __thread, int __signo));
++
++#endif	/* bits/sigthread.h */
+diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure
+--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure	1998-08-28 03:07:20.000000000 -0700
+@@ -0,0 +1,3 @@
++# Local configure fragment for sysdeps/unix/sysv/linux.
++
++DEFINES="$DEFINES -D_LIBC_REENTRANT"
+diff -Naur ../glibc-2.1.3/linuxthreads/weaks.c glibc-2.1.3/linuxthreads/weaks.c
+--- ../glibc-2.1.3/linuxthreads/weaks.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/weaks.c	1998-08-28 03:07:19.000000000 -0700
+@@ -0,0 +1,117 @@
++/* The weak pthread functions for Linux.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <errno.h>
++#include <limits.h>
++#include <stdlib.h>
++
++extern int __pthread_return_0 __P ((void));
++extern int __pthread_return_1 __P ((void));
++extern void __pthread_return_void __P ((void));
++
++/* Those are pthread functions which return 0 if successful. */
++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
++weak_alias (__pthread_return_0, __libc_pthread_attr_init_2_0)
++symbol_version (__libc_pthread_attr_init_2_0, pthread_attr_init, GLIBC_2.0);
++weak_alias (__pthread_return_0, __libc_pthread_attr_init_2_1)
++default_symbol_version (__libc_pthread_attr_init_2_1, pthread_attr_init,
++			GLIBC_2.1);
++#else
++weak_alias (__pthread_return_0, pthread_attr_init)
++#endif
++weak_alias (__pthread_return_0, pthread_attr_destroy)
++weak_alias (__pthread_return_0, pthread_attr_setdetachstate)
++weak_alias (__pthread_return_0, pthread_attr_getdetachstate)
++weak_alias (__pthread_return_0, pthread_attr_setschedparam)
++weak_alias (__pthread_return_0, pthread_attr_getschedparam)
++weak_alias (__pthread_return_0, pthread_attr_setschedpolicy)
++weak_alias (__pthread_return_0, pthread_attr_getschedpolicy)
++weak_alias (__pthread_return_0, pthread_attr_setinheritsched)
++weak_alias (__pthread_return_0, pthread_attr_getinheritsched)
++weak_alias (__pthread_return_0, pthread_attr_setscope)
++weak_alias (__pthread_return_0, pthread_attr_getscope)
++weak_alias (__pthread_return_0, pthread_attr_setstackaddr)
++weak_alias (__pthread_return_0, pthread_attr_getstackaddr)
++weak_alias (__pthread_return_0, pthread_attr_setstacksize)
++weak_alias (__pthread_return_0, pthread_attr_getstacksize)
++weak_alias (__pthread_return_0, pthread_mutex_init)
++weak_alias (__pthread_return_0, pthread_mutex_destroy)
++weak_alias (__pthread_return_0, pthread_mutex_lock)
++weak_alias (__pthread_return_0, pthread_mutex_trylock)
++weak_alias (__pthread_return_0, pthread_mutex_unlock)
++weak_alias (__pthread_return_0, pthread_mutexattr_init)
++weak_alias (__pthread_return_0, pthread_mutexattr_destroy)
++weak_alias (__pthread_return_0, pthread_mutexattr_settype)
++weak_alias (__pthread_return_0, pthread_mutexattr_gettype)
++weak_alias (__pthread_return_0, pthread_condattr_init)
++weak_alias (__pthread_return_0, pthread_condattr_destroy)
++weak_alias (__pthread_return_0, pthread_setschedparam)
++weak_alias (__pthread_return_0, pthread_getschedparam)
++weak_alias (__pthread_return_0, pthread_getcancelstate)
++weak_alias (__pthread_return_0, pthread_setcancelstate)
++weak_alias (__pthread_return_0, pthread_setcanceltype)
++weak_alias (__pthread_return_0, pthread_setconcurrency)
++weak_alias (__pthread_return_0, pthread_getconcurrency)
++weak_alias (__pthread_return_0, pthread_self)
++weak_alias (__pthread_return_0, pthread_cond_init)
++weak_alias (__pthread_return_0, pthread_cond_destroy)
++weak_alias (__pthread_return_0, pthread_cond_wait)
++weak_alias (__pthread_return_0, pthread_cond_timedwait)
++weak_alias (__pthread_return_0, pthread_cond_signal)
++weak_alias (__pthread_return_0, pthread_cond_broadcast)
++weak_alias (__pthread_return_0, pthread_rwlock_init)
++weak_alias (__pthread_return_0, pthread_rwlock_destroy)
++weak_alias (__pthread_return_0, pthread_rwlock_rdlock)
++weak_alias (__pthread_return_0, pthread_rwlock_wrlock)
++weak_alias (__pthread_return_0, pthread_rwlock_tryrdlock)
++weak_alias (__pthread_return_0, pthread_rwlock_trywrlock)
++weak_alias (__pthread_return_0, pthread_rwlock_unlock)
++weak_alias (__pthread_return_0, pthread_rwlockattr_init)
++weak_alias (__pthread_return_0, pthread_rwlockattr_destroy)
++weak_alias (__pthread_return_0, pthread_rwlockattr_setpshared)
++weak_alias (__pthread_return_0, pthread_rwlockattr_getpshared)
++
++
++/* Those are pthread functions which return 1 if successful. */
++weak_alias (__pthread_return_1, pthread_equal)
++
++/* pthread_exit () is a special case. */
++void
++weak_function
++pthread_exit (void *retval)
++{
++  exit (EXIT_SUCCESS);
++}
++
++int
++__pthread_return_0 (void)
++{
++  return 0;
++}
++
++int
++__pthread_return_1 (void)
++{
++  return 1;
++}
++
++void
++__pthread_return_void (void)
++{
++}
+diff -Naur ../glibc-2.1.3/linuxthreads/wrapsyscall.c glibc-2.1.3/linuxthreads/wrapsyscall.c
+--- ../glibc-2.1.3/linuxthreads/wrapsyscall.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads/wrapsyscall.c	1998-12-02 11:03:25.000000000 -0800
+@@ -0,0 +1,186 @@
++/* Wrapper arpund system calls to provide cancelation points.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <fcntl.h>
++#include <sys/mman.h>
++#include <pthread.h>
++#include <unistd.h>
++#include <stdarg.h>
++#include <stddef.h>
++#include <stdlib.h>
++#include <termios.h>
++#include <sys/resource.h>
++#include <sys/wait.h>
++#include <sys/socket.h>
++
++
++#ifndef PIC
++/* We need a hook to force this file to be linked in when static
++   libpthread is used.  */
++const int __pthread_provide_wrappers = 0;
++#endif
++
++
++#define CANCELABLE_SYSCALL(res_type, name, param_list, params) \
++res_type __libc_##name param_list;					      \
++res_type								      \
++name param_list								      \
++{									      \
++  res_type result;							      \
++  int oldtype;								      \
++  pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);	      \
++  result = __libc_##name params;					      \
++  pthread_setcanceltype (oldtype, NULL);				      \
++  return result;							      \
++}
++
++#define CANCELABLE_SYSCALL_VA(res_type, name, param_list, params, last_arg) \
++res_type __libc_##name param_list;					      \
++res_type								      \
++name param_list								      \
++{									      \
++  res_type result;							      \
++  int oldtype;								      \
++  va_list ap;								      \
++  pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);	      \
++  va_start (ap, last_arg);						      \
++  result = __libc_##name params;					      \
++  va_end (ap);								      \
++  pthread_setcanceltype (oldtype, NULL);				      \
++  return result;							      \
++}
++
++
++/* close(2).  */
++CANCELABLE_SYSCALL (int, close, (int fd), (fd))
++strong_alias (close, __close)
++
++
++/* fcntl(2).  */
++CANCELABLE_SYSCALL_VA (int, fcntl, (int fd, int cmd, ...),
++		       (fd, cmd, va_arg (ap, long int)), cmd)
++strong_alias (fcntl, __fcntl)
++
++
++/* fsync(2).  */
++CANCELABLE_SYSCALL (int, fsync, (int fd), (fd))
++
++
++/* lseek(2).  */
++CANCELABLE_SYSCALL (off_t, lseek, (int fd, off_t offset, int whence),
++		    (fd, offset, whence))
++strong_alias (lseek, __lseek)
++
++
++/* msync(2).  */
++CANCELABLE_SYSCALL (int, msync, (__ptr_t addr, size_t length, int flags),
++		    (addr, length, flags))
++
++
++/* nanosleep(2).  */
++CANCELABLE_SYSCALL (int, nanosleep, (const struct timespec *requested_time,
++				     struct timespec *remaining),
++		    (requested_time, remaining))
++
++
++/* open(2).  */
++CANCELABLE_SYSCALL_VA (int, open, (const char *pathname, int flags, ...),
++		       (pathname, flags, va_arg (ap, mode_t)), flags)
++strong_alias (open, __open)
++
++
++/* pause(2).  */
++CANCELABLE_SYSCALL (int, pause, (void), ())
++
++
++/* read(2).  */
++CANCELABLE_SYSCALL (ssize_t, read, (int fd, void *buf, size_t count),
++		    (fd, buf, count))
++strong_alias (read, __read)
++
++
++/* system(3).  */
++CANCELABLE_SYSCALL (int, system, (const char *line), (line))
++
++
++/* tcdrain(2).  */
++CANCELABLE_SYSCALL (int, tcdrain, (int fd), (fd))
++
++
++/* wait(2).  */
++CANCELABLE_SYSCALL (__pid_t, wait, (__WAIT_STATUS_DEFN stat_loc), (stat_loc))
++strong_alias (wait, __wait)
++
++
++/* waitpid(2).  */
++CANCELABLE_SYSCALL (__pid_t, waitpid, (__pid_t pid, int *stat_loc,
++				       int options),
++		    (pid, stat_loc, options))
++
++
++/* write(2).  */
++CANCELABLE_SYSCALL (ssize_t, write, (int fd, const void *buf, size_t n),
++		    (fd, buf, n))
++strong_alias (write, __write)
++
++
++/* The following system calls are thread cancellation points specified
++   in XNS.  */
++
++/* accept(2).  */
++CANCELABLE_SYSCALL (int, accept, (int fd, __SOCKADDR_ARG addr,
++				  socklen_t *addr_len),
++		    (fd, addr, addr_len))
++
++/* connect(2).  */
++CANCELABLE_SYSCALL (int, connect, (int fd, __CONST_SOCKADDR_ARG addr,
++				     socklen_t len),
++		    (fd, addr, len))
++strong_alias (connect, __connect)
++
++/* recv(2).  */
++CANCELABLE_SYSCALL (int, recv, (int fd, __ptr_t buf, size_t n, int flags),
++		    (fd, buf, n, flags))
++
++/* recvfrom(2).  */
++CANCELABLE_SYSCALL (int, recvfrom, (int fd, __ptr_t buf, size_t n, int flags,
++				    __SOCKADDR_ARG addr, socklen_t *addr_len),
++		    (fd, buf, n, flags, addr, addr_len))
++
++/* recvmsg(2).  */
++CANCELABLE_SYSCALL (int, recvmsg, (int fd, struct msghdr *message, int flags),
++		    (fd, message, flags))
++
++/* send(2).  */
++CANCELABLE_SYSCALL (int, send, (int fd, const __ptr_t buf, size_t n,
++				int flags),
++		    (fd, buf, n, flags))
++strong_alias (send, __send)
++
++/* sendmsg(2).  */
++CANCELABLE_SYSCALL (int, sendmsg, (int fd, const struct msghdr *message,
++				   int flags),
++		    (fd, message, flags))
++
++/* sendto(2).  */
++CANCELABLE_SYSCALL (int, sendto, (int fd, const __ptr_t buf, size_t n,
++				  int flags, __CONST_SOCKADDR_ARG addr,
++				  socklen_t addr_len),
++		    (fd, buf, n, flags, addr, addr_len))
+diff -Naur ../glibc-2.1.3/linuxthreads_db/Banner glibc-2.1.3/linuxthreads_db/Banner
+--- ../glibc-2.1.3/linuxthreads_db/Banner	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/Banner	1999-11-12 10:51:03.000000000 -0800
+@@ -0,0 +1 @@
++libthread_db work sponsored by Alpha Processor Inc
+diff -Naur ../glibc-2.1.3/linuxthreads_db/ChangeLog glibc-2.1.3/linuxthreads_db/ChangeLog
+--- ../glibc-2.1.3/linuxthreads_db/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/ChangeLog	2000-01-20 18:16:37.000000000 -0800
+@@ -0,0 +1,208 @@
++2000-01-19  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_thr_getgregs.c: Correct size parameter of memset call.
++
++1999-12-02  Ulrich Drepper  <drepper@cygnus.com>
++
++	* proc_service.h: Fix typoes in last added declaractions.
++
++1999-12-01  Ulrich Drepper  <drepper@cygnus.com>
++
++	* proc_service.h: Add ps_pstop, ps_pcontinue, ps_lstop, and
++	ps_lcontinue prototypes.
++
++1999-11-23  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Makefile: Correct dependency for shared object.
++
++1999-11-22  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_map_lwp2thr.c: Add missing brace in comparison.
++
++	* thread_dbP.h (LOG): Only print message if __td_debug is nonzero.
++	* td_init.c: Add __td_debug.
++
++1999-11-12  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_thr_iter.c: Start copying list of descriptors from right
++	position in target process.
++
++	* td_ta_thr_iter.c: Fix loop starting point over all but main and
++	manager thread.
++
++	* td_ta_thr_iter.c: Read descriptors for main and manager thread
++	special since after this we can assume that no new threads will be
++	created anymore (at least in the gdb implementation).
++
++	* Makefile: Define version correctly.
++
++1999-11-10  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_map_lwp2thr.c: If p_pid field is zero, this is before the
++	thread library is initialized and we get the PID from the
++	debugger.
++
++1999-11-08  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_thr_get_info.c: Make sure ti_lid is never zero.
++
++	* proc_service.h: Add ps_getpid prototype.
++
++1999-11-03  Ulrich Drepper  <drepper@cygnus.com>
++
++	* thread_dbP.h (ta_ok): New function.
++	* td_ta_new.c: Add new handle to list.
++	* td_ta_delete.c: Remove handle from list.
++	* td_ta_clear_event.c: Use ta_ok to check for correct ta parameter.
++	* td_ta_enable_stats.c: Likewise.
++	* td_ta_event_addr.c: Likewise.
++	* td_ta_event_getmsg.c: Likewise.
++	* td_ta_get_nthreads.c: Likewise.
++	* td_ta_get_ph.c: Likewise.
++	* td_ta_get_stats.c: Likewise.
++	* td_ta_map_id2thr.c: Likewise.
++	* td_ta_map_lwp2thr.c: Likewise.
++	* td_ta_reset_stats.c: Likewise.
++	* td_ta_set_event.c: Likewise.
++	* td_ta_setconcurrency.c: Likewise.
++	* td_ta_thr_iter.c: Likewise.
++
++	* td_ta_tsd_iter.c: Optimize memory retrieving.
++
++	* Versions: New file.
++
++	* td_thr_get_info.c (td_thr_get_info): Initialize ti_traceme.
++
++1999-11-02  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_thr_iter.c (td_ta_thr_iter): Optimize a bit.  Read all
++	handles at once.
++
++	* thread_dbP.h (struct th_thragent): Add pthread_handle_num.
++	* td_ta_new.c: Initialize pthread_handle_num.
++	* td_ta_event_getmsg.c: If last event was already reported search
++	for another unreported event.
++
++	* td_thr_get_info.c (td_thr_get_info): Initialize ti_events.
++
++	* Makefile (libthread_db-routines): Add td_ta_set_event,
++	td_ta_event_getmsg, and td_ta_clear_event.
++	* td_ta_clear_event.c: New file.
++	* td_ta_event_getmsg.c: New file.
++	* td_ta_new.c: Get address of __pthread_last_event in target.
++	* td_ta_set_event.c: Don't overwrite old mask, set additional bits.
++	* td_thr_set_event.c: Likewise.
++	* td_thr_clear_event.c: Implement.
++	* thread_db.h: Declare td_ta_clear_event and td_ta_event_getmsg.
++	* thread_dbP.h (struct td_thragent): Add pthread_last_event.
++
++	* td_ta_new.c: Don't test for __pthread_threads_debug.  Get address
++	of __pthread_threads_events and fail if this is not possible.
++	* td_ta_event_addr.c: Implement.
++	* td_thr_event_enable.c: Implement.
++	* td_thr_event_getmsg.c: Implement.
++	* td_thr_set_event.c: Implement.
++	* td_ta_set_event.c: New file.
++	* thread_db.h (td_eventbuf_t): Define.
++	Declare td_ta_set_event.
++	* thread_dbP.h (struct td_thragent): Add pthread_threads_eventsp.
++
++	* td_thr_getfpregs.c: For terminated threads return empty structure.
++	* td_thr_getgregs.c: Likewise.
++	* td_thr_setfpregs.c: Likewise.
++	* td_thr_setgregs.c: Likewise.
++
++1999-11-01  Ulrich Drepper  <drepper@cygnus.com>
++
++	* thread_db.h: Shuffle types around to make things work for gdb.
++	* thread_dbP.h: Include proc_service.h before thread_db.h.
++
++	* thread_db.h: It's TD_NOLIBTHREAD, not TD_LIBTHREAD.
++	* td_ta_new.c: Likewise.
++
++1999-10-14  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_new.c: p_startfct does not exist anymore.
++
++	* td_thr_get_info.c: Always initialize start function.
++
++	* td_ta_thr_iter.c: Don't return threads which exited (but are not
++	joined).
++
++	* td_thr_validate.c: Don't skip manager thread.
++
++1999-10-13  Ulrich Drepper  <drepper@cygnus.com>
++
++	* td_ta_thr_iter.c: Use size of descriptor from *TA.
++	Don't return manager thread before it's actually running.
++	Actually use state parameter to distingusih at least a few states.
++
++	* td_thr_get_info.c: Handle manager thread special.  Fill in ti_lid,
++	ti_state, and ti_startfunc fields.
++
++1999-10-12  Andreas Jaeger  <aj@suse.de>
++
++	* thread_dbP.h: Include <string.h> for strlen declaration.  Remove
++	__libc_write prototype since this is already declared in
++	linuxthreads/internals.h.
++
++1999-10-11  Ulrich Drepper  <drepper@cygnus.com>
++
++	* thread_db.h: Fix comment for ti_type.
++
++	* td_thr_get_info.c: Initialize ti_type field.
++
++	* td_ta_thr_iter.c: Also report the manager thread.
++
++1999-10-08  Andreas Jaeger  <aj@suse.de>
++
++	* thread_db.h: Fix typos in comments.
++
++	* td_ta_get_nthreads.c (td_ta_get_nthreads): Don't hardcode
++	libpthread library name, get it from <gnu/lib-names.h> instead.
++	* td_ta_new.c (td_ta_new): Likewise.
++
++1999-10-08  Ulrich Drepper  <drepper@cygnus.com>
++
++	* shlib-versions: New file.
++
++1999-10-07  Ulrich Drepper  <drepper@cygnus.com>
++
++	* Makefile: New file.
++	* proc_service.h: New file.
++	* td_init.c: New file.
++	* td_log.c: New file.
++	* td_ta_delete.c: New file.
++	* td_ta_enable_stats.c: New file.
++	* td_ta_event_addr.c: New file.
++	* td_ta_get_nthreads.c: New file.
++	* td_ta_get_ph.c: New file.
++	* td_ta_get_stats.c: New file.
++	* td_ta_map_id2thr.c: New file.
++	* td_ta_map_lwp2thr.c: New file.
++	* td_ta_new.c: New file.
++	* td_ta_reset_stats.c: New file.
++	* td_ta_setconcurrency.c: New file.
++	* td_ta_thr_iter.c: New file.
++	* td_ta_tsd_iter.c: New file.
++	* td_thr_clear_event.c: New file.
++	* td_thr_dbresume.c: New file.
++	* td_thr_dbsuspend.c: New file.
++	* td_thr_event_enable.c: New file.
++	* td_thr_event_getmsg.c: New file.
++	* td_thr_get_info.c: New file.
++	* td_thr_getfpregs.c: New file.
++	* td_thr_getgregs.c: New file.
++	* td_thr_getxregs.c: New file.
++	* td_thr_getxregsize.c: New file.
++	* td_thr_set_event.c: New file.
++	* td_thr_setfpregs.c: New file.
++	* td_thr_setgregs.c: New file.
++	* td_thr_setprio.c: New file.
++	* td_thr_setsigpending.c: New file.
++	* td_thr_setxregs.c: New file.
++	* td_thr_sigsetmask.c: New file.
++	* td_thr_tsd.c: New file.
++	* td_thr_validate.c: New file.
++	* thread_db.h: New file.
++	* thread_dbP.h: New file.
+diff -Naur ../glibc-2.1.3/linuxthreads_db/Makefile glibc-2.1.3/linuxthreads_db/Makefile
+--- ../glibc-2.1.3/linuxthreads_db/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/Makefile	1999-11-23 09:46:56.000000000 -0800
+@@ -0,0 +1,51 @@
++# Copyright (C) 1999 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# The GNU C Library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License as
++# published by the Free Software Foundation; either version 2 of the
++# License, or (at your option) any later version.
++
++# The GNU C Library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++# Makefile for linuxthreads debug library subdirectory of GNU C Library.
++
++subdir		:= linuxthreads_db
++
++linuxthreads_db-version = 1.0
++
++extra-libs = libthread_db
++extra-libs-others := $(extra-libs)
++
++headers		= thread_db.h
++libthread_db-routines = td_init td_log td_ta_delete td_ta_get_nthreads      \
++			td_ta_get_ph td_ta_map_id2thr td_ta_map_lwp2thr     \
++			td_ta_new td_ta_thr_iter td_ta_tsd_iter		    \
++			td_thr_get_info td_thr_getfpregs td_thr_getgregs    \
++			td_thr_getxregs td_thr_getxregsize td_thr_setfpregs \
++			td_thr_setgregs td_thr_setprio td_thr_setsigpending \
++			td_thr_setxregs td_thr_sigsetmask td_thr_tsd	    \
++			td_thr_validate td_thr_dbsuspend td_thr_dbresume    \
++			td_ta_setconcurrency td_ta_enable_stats		    \
++			td_ta_reset_stats td_ta_get_stats td_ta_event_addr  \
++			td_thr_event_enable td_thr_set_event 		    \
++			td_thr_clear_event td_thr_event_getmsg		    \
++			td_ta_set_event td_ta_event_getmsg		    \
++			td_ta_clear_event
++
++libthread_db-inhibit-o = $(filter-out .os,$(object-suffixes))
++
++include ../Rules
++
++# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
++# This ensures they will load libc.so for needed symbols if loaded by
++# a statically-linked program that hasn't already loaded it.
++$(objpfx)libthread_db.so: $(common-objpfx)libc.so
+diff -Naur ../glibc-2.1.3/linuxthreads_db/Versions glibc-2.1.3/linuxthreads_db/Versions
+--- ../glibc-2.1.3/linuxthreads_db/Versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/Versions	1999-11-09 23:03:06.000000000 -0800
+@@ -0,0 +1,15 @@
++libthread_db {
++  GLIBC_2.1.3 {
++    # t*
++    td_init; td_log; td_ta_clear_event; td_ta_delete; td_ta_enable_stats;
++    td_ta_event_addr; td_ta_event_getmsg; td_ta_get_nthreads; td_ta_get_ph;
++    td_ta_get_stats; td_ta_map_id2thr; td_ta_map_lwp2thr; td_ta_new;
++    td_ta_reset_stats; td_ta_set_event; td_ta_setconcurrency;
++    td_ta_thr_iter; td_ta_tsd_iter; td_thr_clear_event; td_thr_dbresume;
++    td_thr_dbsuspend; td_thr_event_enable; td_thr_event_getmsg;
++    td_thr_get_info; td_thr_getfpregs; td_thr_getgregs; td_thr_getxregs;
++    td_thr_getxregsize; td_thr_set_event; td_thr_setfpregs; td_thr_setgregs;
++    td_thr_setprio; td_thr_setsigpending; td_thr_setxregs; td_thr_sigsetmask;
++    td_thr_tsd; td_thr_validate;
++  }
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/proc_service.h glibc-2.1.3/linuxthreads_db/proc_service.h
+--- ../glibc-2.1.3/linuxthreads_db/proc_service.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/proc_service.h	1999-12-02 00:07:56.000000000 -0800
+@@ -0,0 +1,70 @@
++/* Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* The definitions in this file must correspond to those in the debugger.  */
++#include <sys/procfs.h>
++
++typedef enum
++{
++  PS_OK,          /* generic "call succeeded" */
++  PS_ERR,         /* generic. */
++  PS_BADPID,      /* bad process handle */
++  PS_BADLID,      /* bad lwp identifier */
++  PS_BADADDR,     /* bad address */
++  PS_NOSYM,       /* p_lookup() could not find given symbol */
++        PS_NOFREGS
++  /*
++   * FPU register set not available for given
++   * lwp
++   */
++}       ps_err_e;
++
++
++struct ps_prochandle;		/* user defined. */
++
++
++extern ps_err_e ps_pdread(struct ps_prochandle *,
++                        psaddr_t, void *, size_t);
++extern ps_err_e ps_pdwrite(struct ps_prochandle *,
++                        psaddr_t, const void *, size_t);
++extern ps_err_e ps_ptread(struct ps_prochandle *,
++                        psaddr_t, void *, size_t);
++extern ps_err_e ps_ptwrite(struct ps_prochandle *,
++                        psaddr_t, const void *, size_t);
++
++extern ps_err_e ps_pglobal_lookup(struct ps_prochandle *,
++        const char *object_name, const char *sym_name, psaddr_t *sym_addr);
++
++
++extern ps_err_e ps_lgetregs(struct ps_prochandle *,
++                        lwpid_t, prgregset_t);
++extern ps_err_e ps_lsetregs(struct ps_prochandle *,
++                        lwpid_t, const prgregset_t);
++extern ps_err_e ps_lgetfpregs(struct ps_prochandle *,
++                        lwpid_t, prfpregset_t *);
++extern ps_err_e ps_lsetfpregs(struct ps_prochandle *,
++                        lwpid_t, const prfpregset_t *);
++
++extern pid_t ps_getpid (struct ps_prochandle *);
++
++
++extern ps_err_e ps_pstop (const struct ps_prochandle *);
++extern ps_err_e ps_pcontinue (const struct ps_prochandle *);
++
++extern ps_err_e ps_lstop (const struct ps_prochandle *, lwpid_t);
++extern ps_err_e ps_lcontinue (const struct ps_prochandle *, lwpid_t);
+diff -Naur ../glibc-2.1.3/linuxthreads_db/shlib-versions glibc-2.1.3/linuxthreads_db/shlib-versions
+--- ../glibc-2.1.3/linuxthreads_db/shlib-versions	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/shlib-versions	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,2 @@
++# The thread debug library
++.*-.*-linux.*		libthread_db=1
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_init.c glibc-2.1.3/linuxthreads_db/td_init.c
+--- ../glibc-2.1.3/linuxthreads_db/td_init.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_init.c	1999-11-22 12:50:11.000000000 -0800
+@@ -0,0 +1,32 @@
++/* Initialization function of thread debugger support library.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++int __td_debug;
++
++
++td_err_e
++td_init (void)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_log.c glibc-2.1.3/linuxthreads_db/td_log.c
+--- ../glibc-2.1.3/linuxthreads_db/td_log.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_log.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,32 @@
++/* Noop, left for historical reasons.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_log (void)
++{
++  /* This interface is deprecated in the Sun interface.  We provide it
++     for compatibility but don't do anyhting ourself.  We might in
++     future do some logging if this seems reasonable.  */
++  LOG (__FUNCTION__);
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,53 @@
++/* Globally disable events.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_clear_event (ta, event)
++     const td_thragent_t *ta;
++     td_thr_events_t *event;
++{
++  td_thr_events_t old_event;
++  int i;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdread (ta->ph, ta->pthread_threads_eventsp,
++		 &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Remove the set bits in.  */
++  for (i = 0; i < TD_EVENTSIZE; ++i)
++    old_event.event_bits[i] &= ~event->event_bits[i];
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp,
++		  &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_delete.c glibc-2.1.3/linuxthreads_db/td_ta_delete.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_delete.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_delete.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,58 @@
++/* Detach to target process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stdlib.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_delete (td_thragent_t *ta)
++{
++  LOG (__FUNCTION__);
++
++  /* Safety check.  */
++  if (ta == NULL || __td_agent_list == NULL)
++    return TD_BADTA;
++
++  /* Remove the handle from the list.  */
++  if (ta == __td_agent_list->ta)
++    /* It's the first element of the list.  */
++    __td_agent_list = __td_agent_list->next;
++  else
++    {
++      /* We have to search for it.  */
++      struct agent_list *runp = __td_agent_list;
++
++      while (runp->next != NULL && runp->next->ta != ta)
++	runp = runp->next;
++
++      if (runp->next == NULL)
++	/* It's not a valid decriptor since it is not in the list.  */
++	return TD_BADTA;
++
++      runp->next = runp->next->next;
++    }
++
++  /* The handle was allocated in `td_ta_new'.  */
++  free (ta);
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,35 @@
++/* Enable collection of statistics for process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_enable_stats (const td_thragent_t *ta, int enable)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,75 @@
++/* Get event address.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <gnu/lib-names.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_event_addr (const td_thragent_t *ta, td_event_e event, td_notify_t *addr)
++{
++  td_err_e res = TD_NOEVENT;
++  const char *symbol = NULL;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  switch (event)
++    {
++    case TD_CREATE:
++      symbol = "__linuxthreads_create_event";
++      break;
++
++    case TD_DEATH:
++      symbol = "__linuxthreads_death_event";
++      break;
++
++    case TD_REAP:
++      symbol = "__linuxthreads_reap_event";
++      break;
++
++    default:
++      /* Event cannot be handled.  */
++      break;
++    }
++
++  /* Now get the address.  */
++  if (symbol != NULL)
++    {
++      psaddr_t taddr;
++
++      if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, symbol, &taddr) == PS_OK)
++	{
++	  /* Success, we got the address.  */
++	  addr->type = NOTIFY_BPT;
++	  addr->u.bptaddr = taddr;
++
++	  res = TD_OK;
++	}
++      else
++	res = TD_ERR;
++    }
++
++  return res;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,128 @@
++/* Retrieve event.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++#include <string.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_event_getmsg (const td_thragent_t *ta, td_event_msg_t *msg)
++{
++  /* XXX I cannot think of another way but using a static variable.  */
++  static td_thrhandle_t th;
++  td_eventbuf_t event;
++  psaddr_t addr;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Get the pointer to the thread descriptor with the last event.  */
++  if (ps_pdread (ta->ph, ta->pthread_last_event,
++		 &addr, sizeof (void *)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* If the pointer is NULL no event occurred.  */
++  if (addr == 0)
++    return TD_NOMSG;
++
++  /* Read the even structure from the target.  */
++  if (ps_pdread (ta->ph,
++		 ((char *) addr
++		  + offsetof (struct _pthread_descr_struct, p_eventbuf)),
++		 &event, sizeof (td_eventbuf_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Check whether an event occurred.  */
++  if (event.eventnum == TD_EVENT_NONE)
++    {
++      /* Oh well, this means the last event was already read.  So
++	 we have to look for any other event.  */
++      struct pthread_handle_struct handles[ta->pthread_threads_max];
++      int num;
++      int i;
++
++      /* Read the number of currently active threads.  */
++      if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int))
++	  != PS_OK)
++	return TD_ERR;	/* XXX Other error value?  */
++
++      /* Now read the handles.  */
++      if (ps_pdread (ta->ph, ta->handles, handles,
++		     ta->pthread_threads_max * sizeof (handles[0])) != PS_OK)
++	return TD_ERR;	/* XXX Other error value?  */
++
++      for (i = 0; i < ta->pthread_threads_max && num > 0; ++i)
++	{
++	  if (handles[i].h_descr == NULL)
++	    /* No entry here.  */
++	    continue;
++
++	  /* First count this active thread.  */
++	  --num;
++
++	  if (handles[i].h_descr == addr)
++	    /* We already handled this.  */
++	    continue;
++
++	  /* Read the event data for this thread.  */
++	  if (ps_pdread (ta->ph,
++			 ((char *) handles[i].h_descr
++			  + offsetof (struct _pthread_descr_struct,
++				      p_eventbuf)),
++			 &event, sizeof (td_eventbuf_t)) != PS_OK)
++	    return TD_ERR;
++
++	  if (event.eventnum != TD_EVENT_NONE)
++	    {
++	      /* We found a thread with an unreported event.  */
++	      addr = handles[i].h_descr;
++	      break;
++	    }
++	}
++
++      /* If we haven't found any other event signal this to the user.  */
++      if (event.eventnum == TD_EVENT_NONE)
++	return TD_NOMSG;
++    }
++
++  /* Generate the thread descriptor.  */
++  th.th_ta_p = (td_thragent_t *) ta;
++  th.th_unique = addr;
++
++  /* Fill the user's data structure.  */
++  msg->event = event.eventnum;
++  msg->th_p = &th;
++  msg->msg.data = (uintptr_t) event.eventdata;
++
++  /* And clear the event message in the target.  */
++  memset (&event, '\0', sizeof (td_eventbuf_t));
++  if (ps_pdwrite (ta->ph,
++		  ((char *) addr
++		   + offsetof (struct _pthread_descr_struct, p_eventbuf)),
++		  &event, sizeof (td_eventbuf_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,44 @@
++/* Get the number of threads in the process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++#include <gnu/lib-names.h>
++
++td_err_e
++td_ta_get_nthreads (const td_thragent_t *ta, int *np)
++{
++  psaddr_t addr;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Access the variable `__pthread_handles_num'.  */
++  if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, "__pthread_handles_num",
++		         &addr) != PS_OK)
++     return TD_ERR;	/* XXX Other error value?  */
++
++  if (ps_pdread (ta->ph, addr, np, sizeof (int)) != PS_OK)
++     return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,36 @@
++/* Get external process handle.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
++{
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  *ph = ta->ph;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,35 @@
++/* Retrieve statistics for process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,63 @@
++/* Map thread ID to thread handle.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
++{
++  struct pthread_handle_struct phc;
++  struct _pthread_descr_struct pds;
++  int pthread_threads_max;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Make the following expression a bit smaller.  */
++  pthread_threads_max = ta->pthread_threads_max;
++
++  /* We can compute the entry in the handle array we want.  */
++  if (ps_pdread (ta->ph, ta->handles + pt % pthread_threads_max, &phc,
++		 sizeof (struct pthread_handle_struct)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Test whether this entry is in use.  */
++  if (phc.h_descr == NULL)
++    return TD_BADTH;
++
++  /* Next test: get the descriptor to see whether this is not an old
++     thread handle.  */
++  if (ps_pdread (ta->ph, phc.h_descr, &pds,
++		 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  if (pds.p_tid != pt)
++    return TD_BADTH;
++
++  /* Create the `td_thrhandle_t' object.  */
++  th->th_ta_p = (td_thragent_t *) ta;
++  th->th_unique = phc.h_descr;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c	1999-11-22 18:24:56.000000000 -0800
+@@ -0,0 +1,81 @@
++/* Which thread is running on an lwp?
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th)
++{
++  int pthread_threads_max = ta->pthread_threads_max;
++  size_t sizeof_descr = ta->sizeof_descr;
++  struct pthread_handle_struct phc[pthread_threads_max];
++  size_t cnt;
++#ifdef ALL_THREADS_STOPPED
++  int num;
++#else
++# define num 1
++#endif
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Read all the descriptors.  */
++  if (ps_pdread (ta->ph, ta->handles, phc,
++		 sizeof (struct pthread_handle_struct) * pthread_threads_max)
++      != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++#ifdef ALL_THREADS_STOPPED
++  /* Read the number of currently active threads.  */
++  if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++#endif
++
++  /* Get the entries one after the other and find out whether the ID
++     matches.  */
++  for (cnt = 0; cnt < pthread_threads_max && num > 0; ++cnt)
++    if (phc[cnt].h_descr != NULL)
++      {
++	struct _pthread_descr_struct pds;
++
++#ifdef ALL_THREADS_STOPPED
++	/* First count this active thread.  */
++	--num;
++#endif
++
++	if (ps_pdread (ta->ph, phc[cnt].h_descr, &pds, sizeof_descr) != PS_OK)
++	  return TD_ERR;	/* XXX Other error value?  */
++
++	if ((pds.p_pid ?: ps_getpid (ta->ph)) == lwpid)
++	  {
++	    /* Found it.  Now fill in the `td_thrhandle_t' object.  */
++	    th->th_ta_p = (td_thragent_t *) ta;
++	    th->th_unique = phc[cnt].h_descr;
++
++	    return TD_OK;
++	  }
++    }
++
++  return TD_NOLWP;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_new.c glibc-2.1.3/linuxthreads_db/td_ta_new.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_new.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_new.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,154 @@
++/* Attach to target process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++#include <stdlib.h>
++#include <gnu/lib-names.h>
++
++#include "thread_dbP.h"
++
++
++/* Datatype for the list of known thread agents.  Normally there will
++   be exactly one so we don't spend much though on making it fast.  */
++struct agent_list *__td_agent_list;
++
++
++td_err_e
++td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
++{
++  psaddr_t addr;
++  struct agent_list *elemp;
++
++  LOG (__FUNCTION__);
++
++  /* Get the global event mask.  This is one of the variables which
++     are new in the thread library to enable debugging.  If it is
++     not available we cannot debug.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__pthread_threads_events", &addr) != PS_OK)
++    return TD_NOLIBTHREAD;
++
++  /* Fill in the appropriate information.  */
++  *ta = (td_thragent_t *) malloc (sizeof (td_thragent_t));
++  if (*ta == NULL)
++    return TD_MALLOC;
++
++  /* Store the proc handle which we will pass to the callback functions
++     back into the debugger.  */
++  (*ta)->ph = ps;
++
++  /* Remember the address.  */
++  (*ta)->pthread_threads_eventsp = (td_thr_events_t *) addr;
++
++  /* Get the pointer to the variable pointing to the thread descriptor
++     with the last event.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__pthread_last_event",
++			 &(*ta)->pthread_last_event) != PS_OK)
++    {
++    free_return:
++      free (*ta);
++      return TD_ERR;
++    }
++
++  /* Get the pointer to the variable containing the number of active
++     threads.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__pthread_handles_num",
++			 &(*ta)->pthread_handles_num) != PS_OK)
++    goto free_return;
++
++  /* See whether the library contains the necessary symbols.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "__pthread_handles",
++		         &addr) != PS_OK)
++    goto free_return;
++
++  (*ta)->handles = (struct pthread_handle_struct *) addr;
++
++
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "pthread_keys",
++		         &addr) != PS_OK)
++    goto free_return;
++
++  /* Cast to the right type.  */
++  (*ta)->keys = (struct pthread_key_struct *) addr;
++
++  /* Find out about the maximum number of threads.  Old implementations
++     don't provide this information.  In this case we assume that the
++     debug  library is compiled with the same values.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__linuxthreads_pthread_threads_max", &addr) != PS_OK)
++    (*ta)->pthread_threads_max = PTHREAD_THREADS_MAX;
++  else
++    {
++      if (ps_pdread (ps, addr, &(*ta)->pthread_threads_max, sizeof (int))
++	  != PS_OK)
++	goto free_return;
++    }
++
++  /* Similar for the maximum number of thread local data keys.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__linuxthreads_pthread_keys_max", &addr) != PS_OK)
++    (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
++  else
++    {
++      if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int))
++	  != PS_OK)
++	goto free_return;
++    }
++
++  /* And for the size of the second level arrays for the keys.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__linuxthreads_pthread_sizeof_descr", &addr)
++      != PS_OK)
++    (*ta)->sizeof_descr = sizeof (struct _pthread_descr_struct);
++  else
++    {
++      if (ps_pdread (ps, addr, &(*ta)->sizeof_descr, sizeof (int)) != PS_OK)
++	goto free_return;
++    }
++
++  /* Similar for the maximum number of thread local data keys.  */
++  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
++			 "__linuxthreads_pthread_keys_max", &addr) != PS_OK)
++    (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
++  else
++    {
++      if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int))
++	  != PS_OK)
++	goto free_return;
++    }
++
++  /* Now add the new agent descriptor to the list.  */
++  elemp = (struct agent_list *) malloc (sizeof (struct agent_list));
++  if (elemp == NULL)
++    {
++      /* Argh, now that everything else worked...  */
++      free (*ta);
++      return TD_MALLOC;
++    }
++
++  /* We don't care for thread-safety here.  */
++  elemp->ta = *ta;
++  elemp->next = __td_agent_list;
++  __td_agent_list = elemp;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,35 @@
++/* Reset statistics.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_reset_stats (const td_thragent_t *ta)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_set_event.c glibc-2.1.3/linuxthreads_db/td_ta_set_event.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_set_event.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_set_event.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,53 @@
++/* Globally enable events.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_set_event (ta, event)
++     const td_thragent_t *ta;
++     td_thr_events_t *event;
++{
++  td_thr_events_t old_event;
++  int i;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdread (ta->ph, ta->pthread_threads_eventsp,
++		 &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Or the new bits in.  */
++  for (i = 0; i < TD_EVENTSIZE; ++i)
++    old_event.event_bits[i] |= event->event_bits[i];
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp,
++		  &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,35 @@
++/* Set suggested concurrency level for process.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_setconcurrency (const td_thragent_t *ta, int level)
++{
++  /* This is something LinuxThreads does not support.  */
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  return TD_NOCAPAB;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c	1999-11-12 15:26:24.000000000 -0800
+@@ -0,0 +1,142 @@
++/* Iterate over a process's threads.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++static int
++handle_descr (const td_thragent_t *ta, td_thr_iter_f *callback,
++	      void *cbdata_p, td_thr_state_e state, int ti_pri,
++	      size_t cnt, pthread_descr descr)
++{
++  struct _pthread_descr_struct pds;
++  size_t sizeof_descr = ta->sizeof_descr;
++  td_thrhandle_t th;
++
++  if (ps_pdread (ta->ph, descr, &pds, sizeof_descr) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* The manager thread must be handled special.  The descriptor
++     exists but the thread only gets created when the first
++     `pthread_create' call is issued.  A clear indication that this
++     happened is when the p_pid field is non-zero.  */
++  if (cnt == 1 && pds.p_pid == 0)
++    return TD_OK;
++
++  /* Now test whether this thread matches the specified
++     conditions.  */
++
++  /* Only if the priority level is as high or higher.  */
++  if (pds.p_priority < ti_pri)
++    return TD_OK;
++
++  /* Test the state.
++     XXX This is incomplete.  */
++  if (state != TD_THR_ANY_STATE)
++    return TD_OK;
++
++  /* XXX For now we ignore threads which are not running anymore.
++     The reason is that gdb tries to get the registers and fails.
++     In future we should have a special mode of the thread library
++     in which we keep the process around until the actual join
++     operation happened.  */
++  if (pds.p_exited != 0)
++    return TD_OK;
++
++  /* Yep, it matches.  Call the callback function.  */
++  th.th_ta_p = (td_thragent_t *) ta;
++  th.th_unique = descr;
++  if (callback (&th, cbdata_p) != 0)
++    return TD_DBERR;
++
++  /* All done successfully.  */
++  return TD_OK;
++}
++
++
++td_err_e
++td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback,
++		void *cbdata_p, td_thr_state_e state, int ti_pri,
++		sigset_t *ti_sigmask_p, unsigned int ti_user_flags)
++{
++  int pthread_threads_max;
++  struct pthread_handle_struct *phc;
++  td_err_e result = TD_OK;
++  int cnt;
++#ifdef ALL_THREADS_STOPPED
++  int num;
++#else
++# define num 1
++#endif
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  pthread_threads_max = ta->pthread_threads_max;
++  phc = (struct pthread_handle_struct *) alloca (sizeof (phc[0])
++						 * pthread_threads_max);
++
++  /* First read only the main thread and manager thread information.  */
++  if (ps_pdread (ta->ph, ta->handles, phc,
++		 sizeof (struct pthread_handle_struct) * 2) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Now handle these descriptors.  */
++  result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 0,
++			 phc[0].h_descr);
++  if (result != TD_OK)
++    return result;
++  result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 1,
++			 phc[1].h_descr);
++  if (result != TD_OK)
++    return result;
++
++  /* Read all the descriptors.  */
++  if (ps_pdread (ta->ph, ta->handles + 2, &phc[2],
++		 (sizeof (struct pthread_handle_struct)
++		  * (pthread_threads_max - 2))) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++#ifdef ALL_THREADS_STOPPED
++  /* Read the number of currently active threads.  */
++  if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++#endif
++
++  /* Now get all descriptors, one after the other.  */
++  for (cnt = 2; cnt < pthread_threads_max && num > 0; ++cnt)
++    if (phc[cnt].h_descr != NULL)
++      {
++#ifdef ALL_THREADS_STOPPED
++	/* First count this active thread.  */
++	--num;
++#endif
++
++	result = handle_descr (ta, callback, cbdata_p, state, ti_pri, cnt,
++			       phc[cnt].h_descr);
++	if (result != TD_OK)
++	  break;
++      }
++
++  return result;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c
+--- ../glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,55 @@
++/* Iterate over a process's thread-specific data.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_ta_tsd_iter (const td_thragent_t *ta, td_key_iter_f *callback,
++		void *cbdata_p)
++{
++  struct pthread_key_struct *keys;
++  int pthread_keys_max;
++  int cnt;
++
++  LOG (__FUNCTION__);
++
++  /* Test whether the TA parameter is ok.  */
++  if (! ta_ok (ta))
++    return TD_BADTA;
++
++  pthread_keys_max = ta->pthread_keys_max;
++  keys = (struct pthread_key_struct *) alloca (sizeof (keys[0])
++					       * pthread_keys_max);
++
++  /* Read all the information about the keys.  */
++  if (ps_pdread (ta->ph, ta->keys, keys,
++		 sizeof (keys[0]) * pthread_keys_max) != PS_OK)
++	return TD_ERR;	/* XXX Other error value?  */
++
++  /* Now get all descriptors, one after the other.  */
++  for (cnt = 0; cnt < pthread_keys_max; ++cnt)
++    if (keys[cnt].in_use
++	/* Return with an error if the callback returns a nonzero value.  */
++	&& callback (cnt, keys[cnt].destr, cbdata_p) != 0)
++      return TD_DBERR;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,57 @@
++/* Disable specific event for thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_clear_event (th, event)
++     const td_thrhandle_t *th;
++     td_thr_events_t *event;
++{
++  td_thr_events_t old_event;
++  int i;
++
++  LOG (__FUNCTION__);
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdread (th->th_ta_p->ph,
++		 ((char *) th->th_unique
++		  + offsetof (struct _pthread_descr_struct,
++			      p_eventbuf.eventmask)),
++		 &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Remove the set bits in.  */
++  for (i = 0; i < TD_EVENTSIZE; ++i)
++    old_event.event_bits[i] &= ~event->event_bits[i];
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdwrite (th->th_ta_p->ph,
++		  ((char *) th->th_unique
++		   + offsetof (struct _pthread_descr_struct,
++			       p_eventbuf.eventmask)),
++		  &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Resume execution of given thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_dbresume (const td_thrhandle_t *th)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_NOCAPAB;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Suspend execution of given thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_dbsuspend (const td_thrhandle_t *th)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_NOCAPAB;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,41 @@
++/* Enable event process-wide.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_event_enable (th, onoff)
++     const td_thrhandle_t *th;
++     int onoff;
++{
++  LOG (__FUNCTION__);
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdwrite (th->th_ta_p->ph,
++		  ((char *) th->th_unique
++		   + offsetof (struct _pthread_descr_struct, p_report_events)),
++		  &onoff, sizeof (int)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,60 @@
++/* Retrieve event.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++#include <string.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_event_getmsg (const td_thrhandle_t *th, td_event_msg_t *msg)
++{
++  td_eventbuf_t event;
++
++  LOG (__FUNCTION__);
++
++  /* Read the even structure from the target.  */
++  if (ps_pdread (th->th_ta_p->ph,
++		 ((char *) th->th_unique
++		  + offsetof (struct _pthread_descr_struct, p_eventbuf)),
++		 &event, sizeof (td_eventbuf_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Check whether an event occurred.  */
++  if (event.eventnum == TD_EVENT_NONE)
++    /* Nothing.  */
++    return TD_NOMSG;
++
++  /* Fill the user's data structure.  */
++  msg->event = event.eventnum;
++  msg->th_p = th;
++  msg->msg.data = (uintptr_t) event.eventdata;
++
++  /* And clear the event message in the target.  */
++  memset (&event, '\0', sizeof (td_eventbuf_t));
++  if (ps_pdwrite (th->th_ta_p->ph,
++		  ((char *) th->th_unique
++		   + offsetof (struct _pthread_descr_struct, p_eventbuf)),
++		  &event, sizeof (td_eventbuf_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_get_info.c glibc-2.1.3/linuxthreads_db/td_thr_get_info.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_get_info.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_get_info.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,75 @@
++/* Get thread information.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++#include <string.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop)
++{
++  struct _pthread_descr_struct pds;
++
++  LOG (__FUNCTION__);
++
++  /* Get the thread descriptor.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++		 th->th_ta_p->sizeof_descr) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Fill in information.  Clear first to provide reproducable
++     results for the fields we do not fill in.  */
++  memset (infop, '\0', sizeof (td_thrinfo_t));
++
++  /* We have to handle the manager thread special since the thread
++     descriptor in older versions is not fully initialized.  */
++  if (pds.p_nr == 1)
++    {
++      infop->ti_tid = th->th_ta_p->pthread_threads_max * 2 + 1;
++      infop->ti_type = TD_THR_SYSTEM;
++      infop->ti_state = TD_THR_RUN;
++    }
++  else
++    {
++      infop->ti_tid = pds.p_tid;
++      infop->ti_tls = (char *) pds.p_specific;
++      infop->ti_pri = pds.p_priority;
++      infop->ti_type = TD_THR_USER;
++
++      if (pds.p_exited)
++	/* This should not happen.  */
++	infop->ti_state = TD_THR_ZOMBIE;
++      else
++	/* XXX For now there is no way to get more information.  */
++	infop->ti_state = TD_THR_RUN;
++    }
++
++  /* Initialization which are the same in both cases.  */
++  infop->ti_lid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph);
++  infop->ti_ta_p = th->th_ta_p;
++  infop->ti_startfunc = pds.p_start_args.start_routine;
++  memcpy (&infop->ti_events, &pds.p_eventbuf.eventmask,
++	  sizeof (td_thr_events_t));
++  infop->ti_traceme = pds.p_report_events != 0;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,44 @@
++/* Get a thread's floating-point register set.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset)
++{
++  struct _pthread_descr_struct pds;
++
++  LOG (__FUNCTION__);
++
++  /* We have to get the state and the PID for this thread.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++		 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;
++
++  /* If the thread already terminated we return all zeroes.  */
++  if (pds.p_terminated)
++    memset (regset, '\0', sizeof (*regset));
++  /* Otherwise get the register content through the callback.  */
++  else if (ps_lgetfpregs (th->th_ta_p->ph, pds.p_pid, regset) != PS_OK)
++    return TD_ERR;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c	2000-01-20 18:16:37.000000000 -0800
+@@ -0,0 +1,44 @@
++/* Get a thread's general register set.
++   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_getgregs (const td_thrhandle_t *th, prgregset_t gregs)
++{
++  struct _pthread_descr_struct pds;
++
++  LOG (__FUNCTION__);
++
++  /* We have to get the state and the PID for this thread.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++		 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;
++
++  /* If the thread already terminated we return all zeroes.  */
++  if (pds.p_terminated)
++    memset (gregs, '\0', sizeof (prgregset_t));
++  /* Otherwise get the register content through the callback.  */
++  else if (ps_lgetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
++    return TD_ERR;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Get a thread's extra state register set.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
++{
++  /* XXX This might be platform specific.  */
++  LOG (__FUNCTION__);
++  return TD_NOXREGS;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Get the size of the extra state register set for this architecture.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
++{
++  /* XXX This might be platform specific.  */
++  LOG (__FUNCTION__);
++  return TD_NOXREGS;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_set_event.c glibc-2.1.3/linuxthreads_db/td_thr_set_event.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_set_event.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_set_event.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,57 @@
++/* Enable specific event for thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_set_event (th, event)
++     const td_thrhandle_t *th;
++     td_thr_events_t *event;
++{
++  td_thr_events_t old_event;
++  int i;
++
++  LOG (__FUNCTION__);
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdread (th->th_ta_p->ph,
++		 ((char *) th->th_unique
++		  + offsetof (struct _pthread_descr_struct,
++			      p_eventbuf.eventmask)),
++		 &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Or the new bits in.  */
++  for (i = 0; i < TD_EVENTSIZE; ++i)
++    old_event.event_bits[i] |= event->event_bits[i];
++
++  /* Write the new value into the thread data structure.  */
++  if (ps_pdwrite (th->th_ta_p->ph,
++		  ((char *) th->th_unique
++		   + offsetof (struct _pthread_descr_struct,
++			       p_eventbuf.eventmask)),
++		  &old_event, sizeof (td_thrhandle_t)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,42 @@
++/* Set a thread's floating-point register set.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs)
++{
++  struct _pthread_descr_struct pds;
++
++  LOG (__FUNCTION__);
++
++  /* We have to get the state and the PID for this thread.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++                 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;
++
++  /* Only set the registers if the thread hasn't yet terminated.  */
++  if (pds.p_terminated == 0
++      && ps_lsetfpregs (th->th_ta_p->ph, pds.p_pid, fpregs) != PS_OK)
++    return TD_ERR;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,42 @@
++/* Set a thread's general register set.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs)
++{
++  struct _pthread_descr_struct pds;
++
++  LOG (__FUNCTION__);
++
++  /* We have to get the state and the PID for this thread.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++                 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;
++
++  /* Only set the registers if the thread hasn't yet terminated.  */
++  if (pds.p_terminated == 0
++      && ps_lsetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK)
++    return TD_ERR;
++
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setprio.c glibc-2.1.3/linuxthreads_db/td_thr_setprio.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_setprio.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_setprio.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Set a thread's priority.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_setprio (const td_thrhandle_t *th, int prio)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,31 @@
++/* Raise a signal for a thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_setsigpending (const td_thrhandle_t *th, unsigned char n,
++		      const sigset_t *ss)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Set a thread's extra state register set.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
++{
++  /* XXX This might have to be platform specific.  */
++  LOG (__FUNCTION__);
++  return TD_NOXREGS;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,30 @@
++/* Set a thread's signal mask.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
++{
++  /* XXX We have to figure out what has to be done.  */
++  LOG (__FUNCTION__);
++  return TD_OK;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_tsd.c glibc-2.1.3/linuxthreads_db/td_thr_tsd.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_tsd.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_tsd.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,76 @@
++/* Get a thread-specific data pointer for a thread.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_tsd (const td_thrhandle_t *th, const thread_key_t tk, void **data)
++{
++  struct _pthread_descr_struct pds;
++  struct pthread_key_struct *keys = th->th_ta_p->keys;
++  struct pthread_key_struct key;
++  int pthread_keys_max = th->th_ta_p->pthread_keys_max;
++  int pthread_key_2ndlevel_size = th->th_ta_p->pthread_key_2ndlevel_size;
++  unsigned int idx1st;
++  unsigned int idx2nd;
++  void *p;
++
++  LOG (__FUNCTION__);
++
++  /* Get the thread descriptor.  */
++  if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
++		 sizeof (struct _pthread_descr_struct)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Check correct value of key.  */
++  if (tk >= pthread_keys_max)
++    return TD_BADKEY;
++
++  /* Get the key entry.  */
++  if (ps_pdread (th->th_ta_p->ph, keys, &key,
++		 sizeof (struct pthread_key_struct)) != PS_OK)
++    return TD_ERR;	/* XXX Other error value?  */
++
++  /* Fail if this key is not at all used.  */
++  if (! key.in_use)
++    return TD_BADKEY;
++
++  /* Compute the indeces.  */
++  idx1st = tk / pthread_key_2ndlevel_size;
++  idx2nd = tk % pthread_key_2ndlevel_size;
++
++  /* Check the pointer to the second level array.  */
++  if (pds.p_specific[idx1st] == NULL)
++    return TD_NOTSD;
++
++  /* Now get the real key.
++     XXX I don't know whether it's correct but there is currently no
++     easy way to determine whether a key was never set or the value
++     is NULL.  We return an error whenever the value is NULL.  */
++  if (ps_pdread (th->th_ta_p->ph, &pds.p_specific[idx1st][idx2nd], &p,
++		 sizeof (void *)) != PS_OK)
++    return TD_ERR;
++
++  if (p != NULL)
++    *data = p;
++
++  return p != NULL ? TD_OK : TD_NOTSD;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_validate.c glibc-2.1.3/linuxthreads_db/td_thr_validate.c
+--- ../glibc-2.1.3/linuxthreads_db/td_thr_validate.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/td_thr_validate.c	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,51 @@
++/* Validate a thread handle.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include "thread_dbP.h"
++
++
++td_err_e
++td_thr_validate (const td_thrhandle_t *th)
++{
++  struct pthread_handle_struct *handles = th->th_ta_p->handles;
++  int pthread_threads_max = th->th_ta_p->pthread_threads_max;
++  int cnt;
++
++  LOG (__FUNCTION__);
++
++  /* Now get all descriptors, one after the other.  */
++  for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
++    {
++      struct pthread_handle_struct phc;
++
++      if (ps_pdread (th->th_ta_p->ph, handles, &phc,
++		     sizeof (struct pthread_handle_struct)) != PS_OK)
++	return TD_ERR;	/* XXX Other error value?  */
++
++      if (phc.h_descr != NULL && phc.h_descr == th->th_unique)
++	{
++	  /* XXX There should be another test using the TID but this is
++	     currently not available.  */
++	  return TD_OK;
++	}
++    }
++
++  return TD_ERR;
++}
+diff -Naur ../glibc-2.1.3/linuxthreads_db/thread_db.h glibc-2.1.3/linuxthreads_db/thread_db.h
+--- ../glibc-2.1.3/linuxthreads_db/thread_db.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/thread_db.h	1999-11-09 21:05:07.000000000 -0800
+@@ -0,0 +1,436 @@
++/* Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef _THREAD_DB_H
++#define _THREAD_DB_H	1
++
++/* This is the debugger interface for the LinuxThreads library.  It is
++   modelled closely after the interface with same names in Solaris with
++   the goal to share the same code in the debugger.  */
++#include <pthread.h>
++#include <stdint.h>
++#include <sys/types.h>
++#include <sys/procfs.h>
++
++
++/* Error codes of the library.  */
++typedef enum
++{
++  TD_OK,	  /* No error.  */
++  TD_ERR,	  /* No further specified error.  */
++  TD_NOTHR,	  /* No matching thread found.  */
++  TD_NOSV,	  /* No matching synchronization handle found.  */
++  TD_NOLWP,	  /* No matching light-weighted process found.  */
++  TD_BADPH,	  /* Invalid process handle.  */
++  TD_BADTH,	  /* Invalid thread handle.  */
++  TD_BADSH,	  /* Invalid synchronization handle.  */
++  TD_BADTA,	  /* Invalid thread agent.  */
++  TD_BADKEY,	  /* Invalid key.  */
++  TD_NOMSG,	  /* No event available.  */
++  TD_NOFPREGS,	  /* No floating-point register content available.  */
++  TD_NOLIBTHREAD, /* Application not linked with thread library.  */
++  TD_NOEVENT,	  /* Requested event is not supported.  */
++  TD_NOCAPAB,	  /* Capability not available.  */
++  TD_DBERR,	  /* Internal debug library error.  */
++  TD_NOAPLIC,	  /* Operation is not applicable.  */
++  TD_NOTSD,	  /* No thread-specific data available.  */
++  TD_MALLOC,	  /* Out of memory.  */
++  TD_PARTIALREG,  /* Not entire register set was read or written.  */
++  TD_NOXREGS	  /* X register set not available for given thread.  */
++} td_err_e;
++
++
++/* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
++   select threads regardless of state in td_ta_thr_iter().  */
++typedef enum
++{
++  TD_THR_ANY_STATE,
++  TD_THR_UNKNOWN,
++  TD_THR_STOPPED,
++  TD_THR_RUN,
++  TD_THR_ACTIVE,
++  TD_THR_ZOMBIE,
++  TD_THR_SLEEP,
++  TD_THR_STOPPED_ASLEEP
++} td_thr_state_e;
++
++/* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
++   to select threads regardless of type in td_ta_thr_iter().  */
++typedef enum
++{
++  TD_THR_ANY_TYPE,
++  TD_THR_USER,
++  TD_THR_SYSTEM
++} td_thr_type_e;
++
++
++/* Types of the debugging library.  */
++
++/* Handle for a process.  This type is opaque.  */
++typedef struct td_thragent td_thragent_t;
++
++/* The actual thread handle type.  This is also opaque.  */
++typedef struct td_thrhandle
++{
++  td_thragent_t *th_ta_p;
++  psaddr_t th_unique;
++} td_thrhandle_t;
++
++
++/* Flags for `td_ta_thr_iter'.  */
++#define TD_THR_ANY_USER_FLAGS	0xffffffff
++#define TD_THR_LOWEST_PRIORITY	-20
++#define TD_SIGNO_MASK		NULL
++
++
++#define TD_EVENTSIZE	2
++#define BT_UISHIFT	5 /* log base 2 of BT_NBIPUI, to extract word index */
++#define BT_NBIPUI	(1 << BT_UISHIFT)       /* n bits per uint */
++#define BT_UIMASK	(BT_NBIPUI - 1)         /* to extract bit index */
++
++/* Bitmask of enabled events. */
++typedef struct td_thr_events
++{
++  uint32_t event_bits[TD_EVENTSIZE];
++} td_thr_events_t;
++
++/* Event set manipulation macros. */
++#define __td_eventmask(n) \
++  (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
++#define __td_eventword(n) \
++  ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
++
++#define td_event_emptyset(setp) \
++  do {									      \
++    int __i;								      \
++    for (__i = TD_EVENTSIZE; __i > 0; --__i)				      \
++      (setp)->event_bits[__i - 1] = 0;					      \
++  } while (0)
++
++#define td_event_fillset(setp) \
++  do {									      \
++    int __i;								      \
++    for (__i = TD_EVENTSIZE; __i > 0; --__i)				      \
++      (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);		      \
++  } while (0)
++
++#define td_event_addset(setp, n) \
++  (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
++#define td_event_delset(setp, n) \
++  (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
++#define td_eventismember(setp, n) \
++  (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
++#if TD_EVENTSIZE == 2
++# define td_eventisempty(setp) \
++  (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
++#else
++# error "td_eventisempty must be changed to match TD_EVENTSIZE"
++#endif
++
++/* Events reportable by the thread implementation.  */
++typedef enum
++{
++  TD_ALL_EVENTS,		 /* Pseudo-event number.  */
++  TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
++  TD_READY,			 /* Is executable now. */
++  TD_SLEEP,			 /* Blocked in a synchronization obj.  */
++  TD_SWITCHTO,			 /* Now assigned to a process.  */
++  TD_SWITCHFROM,		 /* Not anymore assigned to a process.  */
++  TD_LOCK_TRY,			 /* Trying to get an unavailable lock.  */
++  TD_CATCHSIG,			 /* Signal posted to the thread.  */
++  TD_IDLE,			 /* Process getting idle.  */
++  TD_CREATE,			 /* New thread created.  */
++  TD_DEATH,			 /* Thread terminated.  */
++  TD_PREEMPT,			 /* Preempted.  */
++  TD_PRI_INHERIT,		 /* Inherited elevated priority.  */
++  TD_REAP,			 /* Reaped.  */
++  TD_CONCURRENCY,		 /* Number of processes changing.  */
++  TD_TIMEOUT,			 /* Conditional variable wait timed out.  */
++  TD_MIN_EVENT_NUM = TD_READY,
++  TD_MAX_EVENT_NUM = TD_TIMEOUT,
++  TD_EVENTS_ENABLE = 31		/* Event reporting enabled.  */
++} td_event_e;
++
++/* Values representing the different ways events are reported.  */
++typedef enum
++{
++  NOTIFY_BPT,			/* User must insert breakpoint at u.bptaddr. */
++  NOTIFY_AUTOBPT,		/* Breakpoint at u.bptaddr is automatically
++				   inserted.  */
++  NOTIFY_SYSCALL		/* System call u.syscallno will be invoked.  */
++} td_notify_e;
++
++/* Description how event type is reported.  */
++typedef struct td_notify
++{
++  td_notify_e type;		/* Way the event is reported.  */
++  union
++  {
++    psaddr_t bptaddr;		/* Address of breakpoint.  */
++    int syscallno;		/* Number of system call used.  */
++  } u;
++} td_notify_t;
++
++/* Structure used to report event.  */
++typedef struct td_event_msg
++{
++  td_event_e event;		/* Event type being reported.  */
++  const td_thrhandle_t *th_p;	/* Thread reporting the event.  */
++  union
++  {
++# if 0
++    td_synchandle_t *sh;	/* Handle of synchronization object.  */
++#endif
++    uintptr_t data;		/* Event specific data.  */
++  } msg;
++} td_event_msg_t;
++
++/* Structure containing event data available in each thread structure.  */
++typedef struct
++{
++  td_thr_events_t eventmask;	/* Mask of enabled events.  */
++  td_event_e eventnum;		/* Number of last event.  */
++  void *eventdata;		/* Data associated with event.  */
++} td_eventbuf_t;
++
++
++/* Gathered statistics about the process.  */
++typedef struct td_ta_stats
++{
++  int nthreads;       		/* Total number of threads in use.  */
++  int r_concurrency;		/* Concurrency level requested by user.  */
++  int nrunnable_num;		/* Average runnable threads, numerator.  */
++  int nrunnable_den;		/* Average runnable threads, denominator.  */
++  int a_concurrency_num;	/* Achieved concurrency level, numerator.  */
++  int a_concurrency_den;	/* Achieved concurrency level, denominator.  */
++  int nlwps_num;		/* Average number of processes in use,
++				   numerator.  */
++  int nlwps_den;		/* Average number of processes in use,
++				   denominator.  */
++  int nidle_num;		/* Average number of idling processes,
++				   numerator.  */
++  int nidle_den;		/* Average number of idling processes,
++				   denominator.  */
++} td_ta_stats_t;
++
++
++/* Since Sun's library is based on Solaris threads we have to define a few
++   types to map them to POSIX threads.  */
++typedef pthread_t thread_t;
++typedef pthread_key_t thread_key_t;
++
++
++/* Callback for iteration over threads.  */
++typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
++
++/* Callback for iteration over thread local data.  */
++typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
++
++
++
++/* Forward declaration.  This has to be defined by the user.  */
++struct ps_prochandle;
++
++
++/* Information about the thread.  */
++typedef struct td_thrinfo
++{
++  td_thragent_t *ti_ta_p;		/* Process handle.  */
++  unsigned int ti_user_flags;		/* Unused.  */
++  thread_t ti_tid;			/* Thread ID returned by
++					   pthread_create().  */
++  char *ti_tls;				/* Pointer to thread-local data.  */
++  psaddr_t ti_startfunc;		/* Start function passed to
++					   pthread_create().  */
++  psaddr_t ti_stkbase;			/* Base of thread's stack.  */
++  long int ti_stksize;			/* Size of thread's stack.  */
++  psaddr_t ti_ro_area;			/* Unused.  */
++  int ti_ro_size;			/* Unused.  */
++  td_thr_state_e ti_state;		/* Thread state.  */
++  unsigned char ti_db_suspended;	/* Nonzero if suspended by debugger. */
++  td_thr_type_e ti_type;		/* Type of the thread (system vs
++					   user thread).  */
++  intptr_t ti_pc;			/* Unused.  */
++  intptr_t ti_sp;			/* Unused.  */
++  short int ti_flags;			/* Unused.  */
++  int ti_pri;				/* Thread priority.  */
++  lwpid_t ti_lid;			/* Unused.  */
++  sigset_t ti_sigmask;			/* Signal mask.  */
++  unsigned char ti_traceme;		/* Nonzero if event reporting
++					   enabled.  */
++  unsigned char ti_preemptflag;		/* Unused.  */
++  unsigned char ti_pirecflag;		/* Unused.  */
++  sigset_t ti_pending;			/* Set of pending signals.  */
++  td_thr_events_t ti_events;		/* Set of enabled events.  */
++} td_thrinfo_t;
++
++
++
++/* Prototypes for exported library functions.  */
++
++/* Initialize the thread debug support library.  */
++extern td_err_e td_init (void);
++
++/* Historical relict.  Should not be used anymore.  */
++extern td_err_e td_log (void);
++
++/* Generate new thread debug library handle for process PS.  */
++extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
++
++/* Free resources allocated for TA.  */
++extern td_err_e td_ta_delete (td_thragent_t *__ta);
++
++/* Get number of currently running threads in process associated with TA.  */
++extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
++
++/* Return process handle passed in `td_ta_new' for process associated with
++   TA.  */
++extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
++			      struct ps_prochandle **__ph);
++
++/* Map thread library handle PT to thread debug library handle for process
++   associated with TA and store result in *TH.  */
++extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
++				  td_thrhandle_t *__th);
++
++/* Map process ID LWPID to thread debug library handle for process
++   associated with TA and store result in *TH.  */
++extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
++				   td_thrhandle_t *__th);
++
++
++/* Call for each thread in a process associated with TA the callback function
++   CALLBACK.  */
++extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
++				td_thr_iter_f *__callback, void *__cbdata_p,
++				td_thr_state_e __state, int __ti_pri,
++				sigset_t *__ti_sigmask_p,
++				unsigned int __ti_user_flags);
++
++/* Call for each defined thread local data entry the callback function KI.  */
++extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
++				void *__p);
++
++
++/* Get event address for EVENT.  */
++extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
++				  td_event_e __event, td_notify_t *__ptr);
++
++/* Enable EVENT in global mask.  */
++extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
++				 td_thr_events_t *__event);
++
++/* Disable EVENT in global mask.  */
++extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
++				   td_thr_events_t *__event);
++
++/* Return information about last event.  */
++extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
++				    td_event_msg_t *msg);
++
++
++/* Set suggested concurrency level for process associated with TA.  */
++extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
++
++
++/* Enable collecting statistics for process associated with TA.  */
++extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
++
++/* Reset statistics.  */
++extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
++
++/* Retrieve statistics from process associated with TA.  */
++extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
++				 td_ta_stats_t *__statsp);
++
++
++/* Validate that TH is a thread handle.  */
++extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
++
++/* Return information about thread TH.  */
++extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
++				 td_thrinfo_t *__infop);
++
++/* Retrieve floating-point register contents of process running thread TH.  */
++extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
++				  prfpregset_t *__regset);
++
++/* Retrieve general register contents of process running thread TH.  */
++extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
++				 prgregset_t __gregs);
++
++/* Retrieve extended register contents of process running thread TH.  */
++extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
++
++/* Get size of extended register set of process running thread TH.  */
++extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
++
++/* Set floating-point register contents of process running thread TH.  */
++extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
++				  const prfpregset_t *__fpregs);
++
++/* Set general register contents of process running thread TH.  */
++extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
++				 prgregset_t __gregs);
++
++/* Set extended register contents of process running thread TH.  */
++extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
++				 const void *__addr);
++
++
++/* Enable reporting for EVENT for thread TH.  */
++extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
++
++/* Enable EVENT for thread TH.  */
++extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
++				  td_thr_events_t *__event);
++
++/* Disable EVENT for thread TH.  */
++extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
++				    td_thr_events_t *__event);
++
++/* Get event message for thread TH.  */
++extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
++				     td_event_msg_t *__msg);
++
++
++/* Set priority of thread TH.  */
++extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
++
++
++/* Set pending signals for thread TH.  */
++extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
++				      unsigned char __n, const sigset_t *__ss);
++
++/* Set signal mask for thread TH.  */
++extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
++				   const sigset_t *__ss);
++
++
++/* Return thread local data associated with key TK in thread TH.  */
++extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
++			    const thread_key_t __tk, void **__data);
++
++
++/* Suspend execution of thread TH.  */
++extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
++
++/* Resume execution of thread TH.  */
++extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
++
++#endif	/* thread_db.h */
+diff -Naur ../glibc-2.1.3/linuxthreads_db/thread_dbP.h glibc-2.1.3/linuxthreads_db/thread_dbP.h
+--- ../glibc-2.1.3/linuxthreads_db/thread_dbP.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/linuxthreads_db/thread_dbP.h	1999-11-22 12:50:45.000000000 -0800
+@@ -0,0 +1,83 @@
++/* Private header for thread debug library.  */
++#ifndef _THREAD_DBP_H
++#define _THREAD_DBP_H	1
++
++#include <string.h>
++#include "proc_service.h"
++#include "thread_db.h"
++#include "../linuxthreads/internals.h"
++
++
++/* Comment out the following for less verbose output.  */
++#ifndef NDEBUG
++# define LOG(c) if (__td_debug) __libc_write (2, c "\n", strlen (c "\n"))
++extern int __td_debug;
++#else
++# define LOG(c)
++#endif
++
++
++/* Handle for a process.  This type is opaque.  */
++struct td_thragent
++{
++  /* Delivered by the debugger and we have to pass it back in the
++     proc callbacks.  */
++  struct ps_prochandle *ph;
++
++  /* Some cached information.  */
++
++  /* Address of the `__pthread_handles' array.  */
++  struct pthread_handle_struct *handles;
++
++  /* Address of the `pthread_kyes' array.  */
++  struct pthread_key_struct *keys;
++
++  /* Maximum number of threads.  */
++  int pthread_threads_max;
++
++  /* Maximum number of thread-local data keys.  */
++  int pthread_keys_max;
++
++  /* Size of 2nd level array for thread-local data keys.  */
++  int pthread_key_2ndlevel_size;
++
++  /* Sizeof struct _pthread_descr_struct.  */
++  int sizeof_descr;
++
++  /* Pointer to the `__pthread_threads_events' variable in the target.  */
++  psaddr_t pthread_threads_eventsp;
++
++  /* Pointer to the `__pthread_last_event' variable in the target.  */
++  psaddr_t pthread_last_event;
++
++  /* Pointer to the `__pthread_handles_num' variable.  */
++  psaddr_t pthread_handles_num;
++};
++
++
++/* Type used internally to keep track of thread agent descriptors.  */
++struct agent_list
++{
++  td_thragent_t *ta;
++  struct agent_list *next;
++};
++
++/* List of all known descriptors.  */
++extern struct agent_list *__td_agent_list;
++
++/* Function used to test for correct thread agent pointer.  */
++static inline int
++ta_ok (const td_thragent_t *ta)
++{
++  struct agent_list *runp = __td_agent_list;
++
++  if (ta == NULL)
++    return 0;
++
++  while (runp != NULL && runp->ta != ta)
++    runp = runp->next;
++
++  return runp != NULL;
++}
++
++#endif /* thread_dbP.h */
+diff -Naur ../glibc-2.1.3/locale/C-ctype.c glibc-2.1.3/locale/C-ctype.c
+--- ../glibc-2.1.3/locale/C-ctype.c	2000-02-24 14:48:02.000000000 -0800
++++ glibc-2.1.3/locale/C-ctype.c	2000-02-25 15:43:32.000000000 -0800
+@@ -376,7 +376,7 @@
+     { string: NULL },
+     { string: (const char *) (_nl_C_LC_CTYPE_tolower + 128) }
+ #if BYTE_ORDER == BIG_ENDIAN
+-    { string: NULL },
++    , { string: NULL }
+ #endif
+   }
+ };
+diff -Naur ../glibc-2.1.3/locale/programs/ld-ctype.c glibc-2.1.3/locale/programs/ld-ctype.c
+--- ../glibc-2.1.3/locale/programs/ld-ctype.c	2000-02-24 11:19:02.000000000 -0800
++++ glibc-2.1.3/locale/programs/ld-ctype.c	2000-02-24 11:32:16.000000000 -0800
+@@ -493,12 +493,19 @@
+       if (elem < _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE))
+ 	switch (elem)
+ 	  {
+-#define CTYPE_DATA(name, base, len)					      \
+-	  case _NL_ITEM_INDEX (name):					      \
+-	    iov[2 + elem + offset].iov_base = (base);			      \
+-	    iov[2 + elem + offset].iov_len = (len);			      \
+-	    if (elem + 1 < nelems)					      \
+-	      idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len;     \
++#define CTYPE_DATA(name, base, len)					      		\
++	  case _NL_ITEM_INDEX (name):					      		\
++	    if ( (len) % 4 == 0) {					      		\
++		iov[2 + elem + offset].iov_base = (base); 		      		\
++		iov[2 + elem + offset].iov_len = (len);			      		\
++	    } else {							      		\
++		iov[2 + elem + offset].iov_base = alloca (((len) + 3) & ~3);		\
++		memset (mempcpy (iov[2 + elem + offset].iov_base, (base), (len)),	\
++			'\0', 4 - ((len) & 3));						\
++		iov[2 + elem + offset].iov_len = ((len) + 3) & ~3;			\
++	    }										\
++	    if (elem + 1 < nelems)					      		\
++	      idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len;     		\
+ 	    break
+ 
+ 	  CTYPE_DATA (_NL_CTYPE_CLASS,
+diff -Naur ../glibc-2.1.3/localedata/Makefile glibc-2.1.3/localedata/Makefile
+--- ../glibc-2.1.3/localedata/Makefile	1999-06-18 19:05:36.000000000 -0700
++++ glibc-2.1.3/localedata/Makefile	2000-02-23 17:10:51.000000000 -0800
+@@ -90,6 +90,7 @@
+ install-locales:
+ 	while read locale charset; do \
+ 	   case $$locale in \#*) continue;; esac; \
++	   set -x ; \
+ 	   $(LOCALEDEF) -i locales/`echo $$locale | sed 's/\([^.]*\).*/\1/'` \
+ 			-c -f charmaps/$$charset \
+ 			-u repertoiremaps/mnemonic.ds \
+diff -Naur ../glibc-2.1.3/mach/err_boot.sub glibc-2.1.3/mach/err_boot.sub
+--- ../glibc-2.1.3/mach/err_boot.sub	1992-10-06 11:29:52.000000000 -0700
++++ glibc-2.1.3/mach/err_boot.sub	1998-02-07 12:15:20.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_boot.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:20  gafton
++ * import from sourceware
++ *
+  * Revision 1.1  1992/10/06 18:29:52  roland
+  * entered into RCS
+  *
+diff -Naur ../glibc-2.1.3/mach/err_ipc.sub glibc-2.1.3/mach/err_ipc.sub
+--- ../glibc-2.1.3/mach/err_ipc.sub	1992-10-06 11:29:52.000000000 -0700
++++ glibc-2.1.3/mach/err_ipc.sub	1998-02-07 12:15:20.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_ipc.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:20  gafton
++ * import from sourceware
++ *
+  * Revision 1.1  1992/10/06 18:29:52  roland
+  * entered into RCS
+  *
+diff -Naur ../glibc-2.1.3/mach/err_kern.sub glibc-2.1.3/mach/err_kern.sub
+--- ../glibc-2.1.3/mach/err_kern.sub	1996-12-19 17:32:34.000000000 -0800
++++ glibc-2.1.3/mach/err_kern.sub	1998-02-07 12:15:21.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_kern.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:21  gafton
++ * import from sourceware
++ *
+  * Revision 1.5  1996/12/20 01:32:34  drepper
+  * Update from main archive 961219
+  *
+diff -Naur ../glibc-2.1.3/mach/err_mach.sub glibc-2.1.3/mach/err_mach.sub
+--- ../glibc-2.1.3/mach/err_mach.sub	1992-10-06 11:29:52.000000000 -0700
++++ glibc-2.1.3/mach/err_mach.sub	1998-02-07 12:15:21.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_mach.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:21  gafton
++ * import from sourceware
++ *
+  * Revision 1.1  1992/10/06 18:29:52  roland
+  * entered into RCS
+  *
+diff -Naur ../glibc-2.1.3/mach/err_server.sub glibc-2.1.3/mach/err_server.sub
+--- ../glibc-2.1.3/mach/err_server.sub	1992-10-06 11:29:53.000000000 -0700
++++ glibc-2.1.3/mach/err_server.sub	1998-02-07 12:15:22.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_server.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:22  gafton
++ * import from sourceware
++ *
+  * Revision 1.1  1992/10/06 18:29:53  roland
+  * entered into RCS
+  *
+diff -Naur ../glibc-2.1.3/mach/err_us.sub glibc-2.1.3/mach/err_us.sub
+--- ../glibc-2.1.3/mach/err_us.sub	1993-11-23 13:14:05.000000000 -0800
++++ glibc-2.1.3/mach/err_us.sub	1998-02-07 12:15:22.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: err_us.sub,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:22  gafton
++ * import from sourceware
++ *
+  * Revision 1.2  1993/11/23 21:14:05  mib
+  * entered into RCS
+  *
+diff -Naur ../glibc-2.1.3/mach/error_compat.c glibc-2.1.3/mach/error_compat.c
+--- ../glibc-2.1.3/mach/error_compat.c	1997-03-16 09:41:36.000000000 -0800
++++ glibc-2.1.3/mach/error_compat.c	1998-02-07 12:15:22.000000000 -0800
+@@ -26,6 +26,9 @@
+ 
+ /* This file was broken out from:
+ 	$Log: error_compat.c,v $
++	Revision 1.1.1.1  1998/02/07 20:15:22  gafton
++	import from sourceware
++	
+ 	Revision 1.2  1997/03/16 17:41:36  drepper
+ 	(__mach_error_map_compat): Give full prototype.
+ 	
+diff -Naur ../glibc-2.1.3/mach/errorlib.h glibc-2.1.3/mach/errorlib.h
+--- ../glibc-2.1.3/mach/errorlib.h	1995-03-10 15:57:44.000000000 -0800
++++ glibc-2.1.3/mach/errorlib.h	1998-02-07 12:15:23.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: errorlib.h,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:23  gafton
++ * import from sourceware
++ *
+  * Revision 1.5  1995/03/10 23:57:44  roland
+  * (errors): Use const for decl.
+  *
+diff -Naur ../glibc-2.1.3/mach/errstring.c glibc-2.1.3/mach/errstring.c
+--- ../glibc-2.1.3/mach/errstring.c	1997-03-16 09:41:48.000000000 -0800
++++ glibc-2.1.3/mach/errstring.c	1998-02-07 12:15:23.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: errstring.c,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:23  gafton
++ * import from sourceware
++ *
+  * Revision 1.2  1997/03/16 17:41:48  drepper
+  * (mach_error_string_int): Give full prototype.
+  *
+diff -Naur ../glibc-2.1.3/mach/mach/error.h glibc-2.1.3/mach/mach/error.h
+--- ../glibc-2.1.3/mach/mach/error.h	1997-03-16 09:43:08.000000000 -0800
++++ glibc-2.1.3/mach/mach/error.h	1998-02-07 12:15:28.000000000 -0800
+@@ -27,6 +27,9 @@
+ /*
+  * HISTORY
+  * $Log: error.h,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:28  gafton
++ * import from sourceware
++ *
+  * Revision 1.3  1997/03/16 17:43:08  drepper
+  * (mach_error_fn_t): Comment out declaration; it appears to be entirely
+  * unused dead code.
+diff -Naur ../glibc-2.1.3/mach/mach_error.c glibc-2.1.3/mach/mach_error.c
+--- ../glibc-2.1.3/mach/mach_error.c	1997-03-16 09:42:02.000000000 -0800
++++ glibc-2.1.3/mach/mach_error.c	1998-02-07 12:15:25.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: mach_error.c,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:25  gafton
++ * import from sourceware
++ *
+  * Revision 1.2  1997/03/16 17:42:02  drepper
+  * (mach_error_string_int): Give full prototype.
+  *
+diff -Naur ../glibc-2.1.3/mach/mach_error.h glibc-2.1.3/mach/mach_error.h
+--- ../glibc-2.1.3/mach/mach_error.h	1997-03-16 09:42:25.000000000 -0800
++++ glibc-2.1.3/mach/mach_error.h	1998-02-07 12:15:25.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: mach_error.h,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:25  gafton
++ * import from sourceware
++ *
+  * Revision 1.3  1997/03/16 17:42:25  drepper
+  * (mach_error_string, mach_error, mach_error_type): Always provide
+  * prototypes.
+diff -Naur ../glibc-2.1.3/mach/msg-destroy.c glibc-2.1.3/mach/msg-destroy.c
+--- ../glibc-2.1.3/mach/msg-destroy.c	1997-06-20 18:40:07.000000000 -0700
++++ glibc-2.1.3/mach/msg-destroy.c	1998-02-07 12:15:26.000000000 -0800
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: msg-destroy.c,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:26  gafton
++ * import from sourceware
++ *
+  * Revision 1.5  1997/06/21 01:40:07  drepper
+  * More 64bit changes.
+  *
+diff -Naur ../glibc-2.1.3/mach/msgserver.c glibc-2.1.3/mach/msgserver.c
+--- ../glibc-2.1.3/mach/msgserver.c	1996-12-19 17:32:35.000000000 -0800
++++ glibc-2.1.3/mach/msgserver.c	1998-02-07 12:15:26.000000000 -0800
+@@ -49,6 +49,9 @@
+ /*
+  * HISTORY
+  * $Log: msgserver.c,v $
++ * Revision 1.1.1.1  1998/02/07 20:15:26  gafton
++ * import from sourceware
++ *
+  * Revision 1.5  1996/12/20 01:32:35  drepper
+  * Update from main archive 961219
+  *
+diff -Naur ../glibc-2.1.3/malloc/malloc.c glibc-2.1.3/malloc/malloc.c
+--- ../glibc-2.1.3/malloc/malloc.c	2000-02-22 23:02:55.000000000 -0800
++++ glibc-2.1.3/malloc/malloc.c	2000-02-21 21:29:32.000000000 -0800
+@@ -19,7 +19,7 @@
+    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
+ 
+-/* $Id: malloc.c,v 1.40.2.9 2000/02/22 04:48:48 drepper Exp $
++/* $Id: malloc.c,v 1.1.1.2 2000/02/22 05:29:32 gafton Exp $
+ 
+   This work is mainly derived from malloc-2.6.4 by Doug Lea
+   <dl@cs.oswego.edu>, which is available from:
+diff -Naur ../glibc-2.1.3/malloc/thread-m.h glibc-2.1.3/malloc/thread-m.h
+--- ../glibc-2.1.3/malloc/thread-m.h	1999-12-10 10:28:54.000000000 -0800
++++ glibc-2.1.3/malloc/thread-m.h	1999-12-20 11:55:50.000000000 -0800
+@@ -19,7 +19,7 @@
+    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
+ 
+-/* $Id: thread-m.h,v 1.10.2.1 1999/12/10 05:29:37 drepper Exp $
++/* $Id: thread-m.h,v 1.1.1.1 1999/12/20 19:55:50 gafton Exp $
+    One out of _LIBC, USE_PTHREADS, USE_THR or USE_SPROC should be
+    defined, otherwise the token NO_THREADS and dummy implementations
+    of the macros will be defined.  */
+diff -Naur ../glibc-2.1.3/manual/.cvsignore glibc-2.1.3/manual/.cvsignore
+--- ../glibc-2.1.3/manual/.cvsignore	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/manual/.cvsignore	2000-02-18 16:05:53.000000000 -0800
+@@ -0,0 +1,9 @@
++libc.info-*
++*.c.*
++dir-add.info
++top-menu.texi
++chapters.texi
++libc.info
++summary.texi
++stamp-summary
++texis
+diff -Naur ../glibc-2.1.3/manual/add.c.texi glibc-2.1.3/manual/add.c.texi
+--- ../glibc-2.1.3/manual/add.c.texi	1999-07-18 18:01:09.000000000 -0700
++++ glibc-2.1.3/manual/add.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,30 +0,0 @@
+-#include <stdarg.h>
+-#include <stdio.h>
+-
+-int
+-add_em_up (int count,...)
+-@{
+-  va_list ap;
+-  int i, sum;
+-
+-  va_start (ap, count);         /* @r{Initialize the argument list.} */
+-
+-  sum = 0;
+-  for (i = 0; i < count; i++)
+-    sum += va_arg (ap, int);    /* @r{Get the next argument value.} */
+-
+-  va_end (ap);                  /* @r{Clean up.} */
+-  return sum;
+-@}
+-
+-int
+-main (void)
+-@{
+-  /* @r{This call prints 16.} */
+-  printf ("%d\n", add_em_up (3, 5, 5, 6));
+-
+-  /* @r{This call prints 55.} */
+-  printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/argp-ex1.c.texi glibc-2.1.3/manual/argp-ex1.c.texi
+--- ../glibc-2.1.3/manual/argp-ex1.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/argp-ex1.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,14 +0,0 @@
+-/* @r{Argp example #1 -- a minimal program using argp} */
+-
+-/* @r{This is (probably) the smallest possible program that
+-   uses argp.  It won't do much except give an error
+-   messages and exit when there are any arguments, and print
+-   a (rather pointless) messages for --help.} */
+-
+-#include <argp.h>
+-
+-int main (int argc, char **argv)
+-@{
+-  argp_parse (0, argc, argv, 0, 0, 0);
+-  exit (0);
+-@}
+diff -Naur ../glibc-2.1.3/manual/argp-ex2.c.texi glibc-2.1.3/manual/argp-ex2.c.texi
+--- ../glibc-2.1.3/manual/argp-ex2.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/argp-ex2.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,44 +0,0 @@
+-/* @r{Argp example #2 -- a pretty minimal program using argp} */
+-
+-/* @r{This program doesn't use any options or arguments, but uses
+-   argp to be compliant with the GNU standard command line
+-   format.
+-
+-   In addition to making sure no arguments are given, and
+-   implementing a --help option, this example will have a
+-   --version option, and will put the given documentation string
+-   and bug address in the --help output, as per GNU standards.
+-
+-   The variable ARGP contains the argument parser specification;
+-   adding fields to this structure is the way most parameters are
+-   passed to argp_parse (the first three fields are usually used,
+-   but not in this small program).  There are also two global
+-   variables that argp knows about defined here,
+-   ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are
+-   global variables becuase they will almost always be constant
+-   for a given program, even if it uses different argument
+-   parsers for various tasks).} */
+-
+-#include <argp.h>
+-
+-const char *argp_program_version =
+-  "argp-ex2 1.0";
+-const char *argp_program_bug_address =
+-  "<bug-gnu-utils@@gnu.org>";
+-
+-/* @r{Program documentation.} */
+-static char doc[] =
+-  "Argp example #2 -- a pretty minimal program using argp";
+-
+-/* @r{Our argpument parser.  The @code{options}, @code{parser}, and
+-   @code{args_doc} fields are zero because we have neither options or
+-   arguments; @code{doc} and @code{argp_program_bug_address} will be
+-   used in the output for @samp{--help}, and the @samp{--version}
+-   option will print out @code{argp_program_version}.} */
+-static struct argp argp = @{ 0, 0, 0, doc @};
+-
+-int main (int argc, char **argv)
+-@{
+-  argp_parse (&argp, argc, argv, 0, 0, 0);
+-  exit (0);
+-@}
+diff -Naur ../glibc-2.1.3/manual/argp-ex3.c.texi glibc-2.1.3/manual/argp-ex3.c.texi
+--- ../glibc-2.1.3/manual/argp-ex3.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/argp-ex3.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,152 +0,0 @@
+-/* @r{Argp example #3 -- a program with options and arguments using argp} */
+-
+-/* @r{This program uses the same features as example 2, and uses options and
+-   arguments.
+-
+-   We now use the first four fields in ARGP, so here's a description of them:
+-     OPTIONS  -- A pointer to a vector of struct argp_option (see below)
+-     PARSER   -- A function to parse a single option, called by argp
+-     ARGS_DOC -- A string describing how the non-option arguments should look
+-     DOC      -- A descriptive string about this program; if it contains a
+-                 vertical tab character (\v), the part after it will be
+-                 printed *following* the options
+-
+-   The function PARSER takes the following arguments:
+-     KEY  -- An integer specifying which option this is (taken
+-             from the KEY field in each struct argp_option), or
+-             a special key specifying something else; the only
+-             special keys we use here are ARGP_KEY_ARG, meaning
+-             a non-option argument, and ARGP_KEY_END, meaning
+-             that all argumens have been parsed
+-     ARG  -- For an option KEY, the string value of its
+-             argument, or NULL if it has none
+-     STATE-- A pointer to a struct argp_state, containing
+-             various useful information about the parsing state; used here
+-             are the INPUT field, which reflects the INPUT argument to
+-             argp_parse, and the ARG_NUM field, which is the number of the
+-             current non-option argument being parsed
+-   It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the
+-   given KEY wasn't recognized, or an errno value indicating some other
+-   error.
+-
+-   Note that in this example, main uses a structure to communicate with the
+-   parse_opt function, a pointer to which it passes in the INPUT argument to
+-   argp_parse.  Of course, it's also possible to use global variables
+-   instead, but this is somewhat more flexible.
+-
+-   The OPTIONS field contains a pointer to a vector of struct argp_option's;
+-   that structure has the following fields (if you assign your option
+-   structures using array initialization like this example, unspecified
+-   fields will be defaulted to 0, and need not be specified):
+-     NAME   -- The name of this option's long option (may be zero)
+-     KEY    -- The KEY to pass to the PARSER function when parsing this option,
+-               *and* the name of this option's short option, if it is a
+-               printable ascii character
+-     ARG    -- The name of this option's argument, if any
+-     FLAGS  -- Flags describing this option; some of them are:
+-                 OPTION_ARG_OPTIONAL -- The argument to this option is optional
+-                 OPTION_ALIAS        -- This option is an alias for the
+-                                        previous option
+-                 OPTION_HIDDEN       -- Don't show this option in --help output
+-     DOC    -- A documentation string for this option, shown in --help output
+-
+-   An options vector should be terminated by an option with all fields zero.} */
+-
+-#include <argp.h>
+-
+-const char *argp_program_version =
+-  "argp-ex3 1.0";
+-const char *argp_program_bug_address =
+-  "<bug-gnu-utils@@gnu.org>";
+-
+-/* @r{Program documentation.} */
+-static char doc[] =
+-  "Argp example #3 -- a program with options and arguments using argp";
+-
+-/* @r{A description of the arguments we accept.} */
+-static char args_doc[] = "ARG1 ARG2";
+-
+-/* @r{The options we understand.} */
+-static struct argp_option options[] = @{
+-  @{"verbose",  'v', 0,      0,  "Produce verbose output" @},
+-  @{"quiet",    'q', 0,      0,  "Don't produce any output" @},
+-  @{"silent",   's', 0,      OPTION_ALIAS @},
+-  @{"output",   'o', "FILE", 0,
+-   "Output to FILE instead of standard output" @},
+-  @{ 0 @}
+-@};
+-
+-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */
+-struct arguments
+-@{
+-  char *args[2];                /* @r{@var{arg1} & @var{arg2}} */
+-  int silent, verbose;
+-  char *output_file;
+-@};
+-
+-/* @r{Parse a single option.} */
+-static error_t
+-parse_opt (int key, char *arg, struct argp_state *state)
+-@{
+-  /* @r{Get the @var{input} argument from @code{argp_parse}, which we
+-     know is a pointer to our arguments structure.} */
+-  struct arguments *arguments = state->input;
+-
+-  switch (key)
+-    @{
+-    case 'q': case 's':
+-      arguments->silent = 1;
+-      break;
+-    case 'v':
+-      arguments->verbose = 1;
+-      break;
+-    case 'o':
+-      arguments->output_file = arg;
+-      break;
+-
+-    case ARGP_KEY_ARG:
+-      if (state->arg_num >= 2)
+-        /* @r{Too many arguments.} */
+-        argp_usage (state);
+-
+-      arguments->args[state->arg_num] = arg;
+-
+-      break;
+-
+-    case ARGP_KEY_END:
+-      if (state->arg_num < 2)
+-        /* @r{Not enough arguments.} */
+-        argp_usage (state);
+-      break;
+-
+-    default:
+-      return ARGP_ERR_UNKNOWN;
+-    @}
+-  return 0;
+-@}
+-
+-/* @r{Our argp parser.} */
+-static struct argp argp = @{ options, parse_opt, args_doc, doc @};
+-
+-int main (int argc, char **argv)
+-@{
+-  struct arguments arguments;
+-
+-  /* @r{Default values.} */
+-  arguments.silent = 0;
+-  arguments.verbose = 0;
+-  arguments.output_file = "-";
+-
+-  /* @r{Parse our arguments; every option seen by @code{parse_opt} will
+-     be reflected in @code{arguments}.} */
+-  argp_parse (&argp, argc, argv, 0, 0, &arguments);
+-
+-  printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
+-          "VERBOSE = %s\nSILENT = %s\n",
+-          arguments.args[0], arguments.args[1],
+-          arguments.output_file,
+-          arguments.verbose ? "yes" : "no",
+-          arguments.silent ? "yes" : "no");
+-
+-  exit (0);
+-@}
+diff -Naur ../glibc-2.1.3/manual/argp-ex4.c.texi glibc-2.1.3/manual/argp-ex4.c.texi
+--- ../glibc-2.1.3/manual/argp-ex4.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/argp-ex4.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,167 +0,0 @@
+-/* @r{Argp example #4 -- a program with somewhat more complicated options} */
+-
+-/* @r{This program uses the same features as example 3, but has more
+-   options, and somewhat more structure in the -help output.  It
+-   also shows how you can `steal' the remainder of the input
+-   arguments past a certain point, for programs that accept a
+-   list of items.  It also shows the special argp KEY value
+-   ARGP_KEY_NO_ARGS, which is only given if no non-option
+-   arguments were supplied to the program.
+-
+-   For structuring the help output, two features are used,
+-   *headers* which are entries in the options vector with the
+-   first four fields being zero, and a two part documentation
+-   string (in the variable DOC), which allows documentation both
+-   before and after the options; the two parts of DOC are
+-   separated by a vertical-tab character ('\v', or '\013').  By
+-   convention, the documentation before the options is just a
+-   short string saying what the program does, and that afterwards
+-   is longer, describing the behavior in more detail.  All
+-   documentation strings are automatically filled for output,
+-   although newlines may be included to force a line break at a
+-   particular point.  All documenation strings are also passed to
+-   the `gettext' function, for possible translation into the
+-   current locale.} */
+-
+-#include <stdlib.h>
+-#include <error.h>
+-#include <argp.h>
+-
+-const char *argp_program_version =
+-  "argp-ex4 1.0";
+-const char *argp_program_bug_address =
+-  "<bug-gnu-utils@@prep.ai.mit.edu>";
+-
+-/* @r{Program documentation.} */
+-static char doc[] =
+-  "Argp example #4 -- a program with somewhat more complicated\
+-options\
+-\vThis part of the documentation comes *after* the options;\
+- note that the text is automatically filled, but it's possible\
+- to force a line-break, e.g.\n<-- here.";
+-
+-/* @r{A description of the arguments we accept.} */
+-static char args_doc[] = "ARG1 [STRING...]";
+-
+-/* @r{Keys for options without short-options.} */
+-#define OPT_ABORT  1            /* @r{--abort} */
+-
+-/* @r{The options we understand.} */
+-static struct argp_option options[] = @{
+-  @{"verbose",  'v', 0,       0, "Produce verbose output" @},
+-  @{"quiet",    'q', 0,       0, "Don't produce any output" @},
+-  @{"silent",   's', 0,       OPTION_ALIAS @},
+-  @{"output",   'o', "FILE",  0,
+-   "Output to FILE instead of standard output" @},
+-
+-  @{0,0,0,0, "The following options should be grouped together:" @},
+-  @{"repeat",   'r', "COUNT", OPTION_ARG_OPTIONAL,
+-   "Repeat the output COUNT (default 10) times"@},
+-  @{"abort",    OPT_ABORT, 0, 0, "Abort before showing any output"@},
+-
+-  @{ 0 @}
+-@};
+-
+-/* @r{Used by @code{main} to communicate with @code{parse_opt}.} */
+-struct arguments
+-@{
+-  char *arg1;                   /* @r{@var{arg1}} */
+-  char **strings;               /* @r{[@var{string}@dots{}]} */
+-  int silent, verbose, abort;   /* @r{@samp{-s}, @samp{-v}, @samp{--abort}} */
+-  char *output_file;            /* @r{@var{file} arg to @samp{--output}} */
+-  int repeat_count;             /* @r{@var{count} arg to @samp{--repeat}} */
+-@};
+-
+-/* @r{Parse a single option.} */
+-static error_t
+-parse_opt (int key, char *arg, struct argp_state *state)
+-@{
+-  /* @r{Get the @code{input} argument from @code{argp_parse}, which we
+-     know is a pointer to our arguments structure.} */
+-  struct arguments *arguments = state->input;
+-
+-  switch (key)
+-    @{
+-    case 'q': case 's':
+-      arguments->silent = 1;
+-      break;
+-    case 'v':
+-      arguments->verbose = 1;
+-      break;
+-    case 'o':
+-      arguments->output_file = arg;
+-      break;
+-    case 'r':
+-      arguments->repeat_count = arg ? atoi (arg) : 10;
+-      break;
+-    case OPT_ABORT:
+-      arguments->abort = 1;
+-      break;
+-
+-    case ARGP_KEY_NO_ARGS:
+-      argp_usage (state);
+-
+-    case ARGP_KEY_ARG:
+-      /* @r{Here we know that @code{state->arg_num == 0}, since we
+-         force argument parsing to end before any more arguments can
+-         get here.} */
+-      arguments->arg1 = arg;
+-
+-      /* @r{Now we consume all the rest of the arguments.
+-         @code{state->next} is the index in @code{state->argv} of the
+-         next argument to be parsed, which is the first @var{string}
+-         we're interested in, so we can just use
+-         @code{&state->argv[state->next]} as the value for
+-         arguments->strings.
+-
+-         @emph{In addition}, by setting @code{state->next} to the end
+-         of the arguments, we can force argp to stop parsing here and
+-         return.} */
+-      arguments->strings = &state->argv[state->next];
+-      state->next = state->argc;
+-
+-      break;
+-
+-    default:
+-      return ARGP_ERR_UNKNOWN;
+-    @}
+-  return 0;
+-@}
+-
+-/* @r{Our argp parser.} */
+-static struct argp argp = @{ options, parse_opt, args_doc, doc @};
+-
+-int main (int argc, char **argv)
+-@{
+-  int i, j;
+-  struct arguments arguments;
+-
+-  /* @r{Default values.} */
+-  arguments.silent = 0;
+-  arguments.verbose = 0;
+-  arguments.output_file = "-";
+-  arguments.repeat_count = 1;
+-  arguments.abort = 0;
+-
+-  /* @r{Parse our arguments; every option seen by @code{parse_opt} will be
+-     reflected in @code{arguments}.} */
+-  argp_parse (&argp, argc, argv, 0, 0, &arguments);
+-
+-  if (arguments.abort)
+-    error (10, 0, "ABORTED");
+-
+-  for (i = 0; i < arguments.repeat_count; i++)
+-    @{
+-      printf ("ARG1 = %s\n", arguments.arg1);
+-      printf ("STRINGS = ");
+-      for (j = 0; arguments.strings[j]; j++)
+-        printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
+-      printf ("\n");
+-      printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
+-              arguments.output_file,
+-              arguments.verbose ? "yes" : "no",
+-              arguments.silent ? "yes" : "no");
+-    @}
+-
+-  exit (0);
+-@}
+diff -Naur ../glibc-2.1.3/manual/atexit.c.texi glibc-2.1.3/manual/atexit.c.texi
+--- ../glibc-2.1.3/manual/atexit.c.texi	1999-07-18 18:01:09.000000000 -0700
++++ glibc-2.1.3/manual/atexit.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,15 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-void 
+-bye (void)
+-@{
+-  puts ("Goodbye, cruel world....");
+-@}
+-
+-int
+-main (void)
+-@{
+-  atexit (bye);
+-  exit (EXIT_SUCCESS);
+-@}
+diff -Naur ../glibc-2.1.3/manual/db.c.texi glibc-2.1.3/manual/db.c.texi
+--- ../glibc-2.1.3/manual/db.c.texi	1999-07-18 18:01:09.000000000 -0700
++++ glibc-2.1.3/manual/db.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,52 +0,0 @@
+-#include <grp.h>
+-#include <pwd.h>
+-#include <sys/types.h>
+-#include <unistd.h>
+-#include <stdlib.h>
+-
+-int
+-main (void)
+-@{
+-  uid_t me;
+-  struct passwd *my_passwd;
+-  struct group *my_group;
+-  char **members;
+-
+-  /* @r{Get information about the user ID.} */
+-  me = getuid ();
+-  my_passwd = getpwuid (me);
+-  if (!my_passwd)
+-    @{
+-      printf ("Couldn't find out about user %d.\n", (int) me);
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Print the information.} */
+-  printf ("I am %s.\n", my_passwd->pw_gecos);
+-  printf ("My login name is %s.\n", my_passwd->pw_name);
+-  printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
+-  printf ("My home directory is %s.\n", my_passwd->pw_dir);
+-  printf ("My default shell is %s.\n", my_passwd->pw_shell);
+-
+-  /* @r{Get information about the default group ID.} */
+-  my_group = getgrgid (my_passwd->pw_gid);
+-  if (!my_group)
+-    @{
+-      printf ("Couldn't find out about group %d.\n",
+-              (int) my_passwd->pw_gid);
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Print the information.} */
+-  printf ("My default group is %s (%d).\n",
+-          my_group->gr_name, (int) (my_passwd->pw_gid));
+-  printf ("The members of this group are:\n");
+-  members = my_group->gr_mem;
+-  while (*members)
+-    @{
+-      printf ("  %s\n", *(members));
+-      members++;
+-    @}
+-
+-  return EXIT_SUCCESS;
+-@}
+diff -Naur ../glibc-2.1.3/manual/dir glibc-2.1.3/manual/dir
+--- ../glibc-2.1.3/manual/dir	1997-06-19 11:22:50.000000000 -0700
++++ glibc-2.1.3/manual/dir	1998-02-07 12:16:10.000000000 -0800
+@@ -1,4 +1,4 @@
+-$Id: dir,v 2.1 1997/06/19 18:22:50 drepper Exp $
++$Id: dir,v 1.1.1.1 1998/02/07 20:16:10 gafton Exp $
+ This is the file .../info/dir, which contains the topmost node of the
+ Info hierarchy.  The first time you invoke Info you start off
+ looking at that node, which is (dir)Top.
+diff -Naur ../glibc-2.1.3/manual/dir-add.info glibc-2.1.3/manual/dir-add.info
+--- ../glibc-2.1.3/manual/dir-add.info	2000-01-05 19:18:18.000000000 -0800
++++ glibc-2.1.3/manual/dir-add.info	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1502 +0,0 @@
+-INFO-DIR-SECTION GNU C library functions
+-START-INFO-DIR-ENTRY
+-* (*gconv_end_fct): (libc)glibc iconv Implementation.
+-* (*gconv_fct): (libc)glibc iconv Implementation.
+-* (*gconv_init_fct): (libc)glibc iconv Implementation.
+-* AF_INET6: (libc)Internet Namespace.
+-* ALTWERASE: (libc)Local Modes.
+-* ARGP_ERR_UNKNOWN: (libc)Argp Parser Functions.
+-* ARG_MAX: (libc)General Limits.
+-* BC_BASE_MAX: (libc)Utility Limits.
+-* BC_DIM_MAX: (libc)Utility Limits.
+-* BC_SCALE_MAX: (libc)Utility Limits.
+-* BC_STRING_MAX: (libc)Utility Limits.
+-* BRKINT: (libc)Input Modes.
+-* BUFSIZ: (libc)Controlling Buffering.
+-* CCTS_OFLOW: (libc)Control Modes.
+-* CHILD_MAX: (libc)General Limits.
+-* CIGNORE: (libc)Control Modes.
+-* CLK_TCK: (libc)Basic CPU Time.
+-* CLOCAL: (libc)Control Modes.
+-* CLOCKS_PER_SEC: (libc)Basic CPU Time.
+-* COLL_WEIGHTS_MAX: (libc)Utility Limits.
+-* CREAD: (libc)Control Modes.
+-* CRTS_IFLOW: (libc)Control Modes.
+-* CS5: (libc)Control Modes.
+-* CS6: (libc)Control Modes.
+-* CS7: (libc)Control Modes.
+-* CS8: (libc)Control Modes.
+-* CSIZE: (libc)Control Modes.
+-* CSTOPB: (libc)Control Modes.
+-* DES_FAILED: (libc)DES Encryption.
+-* DTTOIF: (libc)Directory Entries.
+-* E2BIG: (libc)Error Codes.
+-* EACCES: (libc)Error Codes.
+-* EADDRINUSE: (libc)Error Codes.
+-* EADDRNOTAVAIL: (libc)Error Codes.
+-* EADV: (libc)Error Codes.
+-* EAFNOSUPPORT: (libc)Error Codes.
+-* EAGAIN: (libc)Error Codes.
+-* EALREADY: (libc)Error Codes.
+-* EAUTH: (libc)Error Codes.
+-* EBACKGROUND: (libc)Error Codes.
+-* EBADE: (libc)Error Codes.
+-* EBADF: (libc)Error Codes.
+-* EBADFD: (libc)Error Codes.
+-* EBADMSG: (libc)Error Codes.
+-* EBADR: (libc)Error Codes.
+-* EBADRPC: (libc)Error Codes.
+-* EBADRQC: (libc)Error Codes.
+-* EBADSLT: (libc)Error Codes.
+-* EBFONT: (libc)Error Codes.
+-* EBUSY: (libc)Error Codes.
+-* ECHILD: (libc)Error Codes.
+-* ECHO: (libc)Local Modes.
+-* ECHOCTL: (libc)Local Modes.
+-* ECHOE: (libc)Local Modes.
+-* ECHOK: (libc)Local Modes.
+-* ECHOKE: (libc)Local Modes.
+-* ECHONL: (libc)Local Modes.
+-* ECHOPRT: (libc)Local Modes.
+-* ECHRNG: (libc)Error Codes.
+-* ECOMM: (libc)Error Codes.
+-* ECONNABORTED: (libc)Error Codes.
+-* ECONNREFUSED: (libc)Error Codes.
+-* ECONNRESET: (libc)Error Codes.
+-* ED: (libc)Error Codes.
+-* EDEADLK: (libc)Error Codes.
+-* EDEADLOCK: (libc)Error Codes.
+-* EDESTADDRREQ: (libc)Error Codes.
+-* EDIED: (libc)Error Codes.
+-* EDOM: (libc)Error Codes.
+-* EDOTDOT: (libc)Error Codes.
+-* EDQUOT: (libc)Error Codes.
+-* EEXIST: (libc)Error Codes.
+-* EFAULT: (libc)Error Codes.
+-* EFBIG: (libc)Error Codes.
+-* EFTYPE: (libc)Error Codes.
+-* EGRATUITOUS: (libc)Error Codes.
+-* EGREGIOUS: (libc)Error Codes.
+-* EHOSTDOWN: (libc)Error Codes.
+-* EHOSTUNREACH: (libc)Error Codes.
+-* EIDRM: (libc)Error Codes.
+-* EIEIO: (libc)Error Codes.
+-* EILSEQ: (libc)Error Codes.
+-* EINPROGRESS: (libc)Error Codes.
+-* EINTR: (libc)Error Codes.
+-* EINVAL: (libc)Error Codes.
+-* EIO: (libc)Error Codes.
+-* EISCONN: (libc)Error Codes.
+-* EISDIR: (libc)Error Codes.
+-* EISNAM: (libc)Error Codes.
+-* EL2HLT: (libc)Error Codes.
+-* EL2NSYNC: (libc)Error Codes.
+-* EL3HLT: (libc)Error Codes.
+-* EL3RST: (libc)Error Codes.
+-* ELIBACC: (libc)Error Codes.
+-* ELIBBAD: (libc)Error Codes.
+-* ELIBEXEC: (libc)Error Codes.
+-* ELIBMAX: (libc)Error Codes.
+-* ELIBSCN: (libc)Error Codes.
+-* ELNRNG: (libc)Error Codes.
+-* ELOOP: (libc)Error Codes.
+-* EMEDIUMTYPE: (libc)Error Codes.
+-* EMFILE: (libc)Error Codes.
+-* EMLINK: (libc)Error Codes.
+-* EMSGSIZE: (libc)Error Codes.
+-* EMULTIHOP: (libc)Error Codes.
+-* ENAMETOOLONG: (libc)Error Codes.
+-* ENAVAIL: (libc)Error Codes.
+-* ENEEDAUTH: (libc)Error Codes.
+-* ENETDOWN: (libc)Error Codes.
+-* ENETRESET: (libc)Error Codes.
+-* ENETUNREACH: (libc)Error Codes.
+-* ENFILE: (libc)Error Codes.
+-* ENOANO: (libc)Error Codes.
+-* ENOBUFS: (libc)Error Codes.
+-* ENOCSI: (libc)Error Codes.
+-* ENODATA: (libc)Error Codes.
+-* ENODEV: (libc)Error Codes.
+-* ENOENT: (libc)Error Codes.
+-* ENOEXEC: (libc)Error Codes.
+-* ENOLCK: (libc)Error Codes.
+-* ENOLINK: (libc)Error Codes.
+-* ENOMEDIUM: (libc)Error Codes.
+-* ENOMEM: (libc)Error Codes.
+-* ENOMSG: (libc)Error Codes.
+-* ENONET: (libc)Error Codes.
+-* ENOPKG: (libc)Error Codes.
+-* ENOPROTOOPT: (libc)Error Codes.
+-* ENOSPC: (libc)Error Codes.
+-* ENOSR: (libc)Error Codes.
+-* ENOSTR: (libc)Error Codes.
+-* ENOSYS: (libc)Error Codes.
+-* ENOTBLK: (libc)Error Codes.
+-* ENOTCONN: (libc)Error Codes.
+-* ENOTDIR: (libc)Error Codes.
+-* ENOTEMPTY: (libc)Error Codes.
+-* ENOTNAM: (libc)Error Codes.
+-* ENOTSOCK: (libc)Error Codes.
+-* ENOTSUP: (libc)Error Codes.
+-* ENOTTY: (libc)Error Codes.
+-* ENOTUNIQ: (libc)Error Codes.
+-* ENXIO: (libc)Error Codes.
+-* EOF: (libc)EOF and Errors.
+-* EOPNOTSUPP: (libc)Error Codes.
+-* EOVERFLOW: (libc)Error Codes.
+-* EPERM: (libc)Error Codes.
+-* EPFNOSUPPORT: (libc)Error Codes.
+-* EPIPE: (libc)Error Codes.
+-* EPROCLIM: (libc)Error Codes.
+-* EPROCUNAVAIL: (libc)Error Codes.
+-* EPROGMISMATCH: (libc)Error Codes.
+-* EPROGUNAVAIL: (libc)Error Codes.
+-* EPROTO: (libc)Error Codes.
+-* EPROTONOSUPPORT: (libc)Error Codes.
+-* EPROTOTYPE: (libc)Error Codes.
+-* EQUIV_CLASS_MAX: (libc)Utility Limits.
+-* ERANGE: (libc)Error Codes.
+-* EREMCHG: (libc)Error Codes.
+-* EREMOTE: (libc)Error Codes.
+-* EREMOTEIO: (libc)Error Codes.
+-* ERESTART: (libc)Error Codes.
+-* EROFS: (libc)Error Codes.
+-* ERPCMISMATCH: (libc)Error Codes.
+-* ESHUTDOWN: (libc)Error Codes.
+-* ESOCKTNOSUPPORT: (libc)Error Codes.
+-* ESPIPE: (libc)Error Codes.
+-* ESRCH: (libc)Error Codes.
+-* ESRMNT: (libc)Error Codes.
+-* ESTALE: (libc)Error Codes.
+-* ESTRPIPE: (libc)Error Codes.
+-* ETIME: (libc)Error Codes.
+-* ETIMEDOUT: (libc)Error Codes.
+-* ETOOMANYREFS: (libc)Error Codes.
+-* ETXTBSY: (libc)Error Codes.
+-* EUCLEAN: (libc)Error Codes.
+-* EUNATCH: (libc)Error Codes.
+-* EUSERS: (libc)Error Codes.
+-* EWOULDBLOCK: (libc)Error Codes.
+-* EXDEV: (libc)Error Codes.
+-* EXFULL: (libc)Error Codes.
+-* EXIT_FAILURE: (libc)Exit Status.
+-* EXIT_SUCCESS: (libc)Exit Status.
+-* EXPR_NEST_MAX: (libc)Utility Limits.
+-* FD_CLOEXEC: (libc)Descriptor Flags.
+-* FD_CLR: (libc)Waiting for I/O.
+-* FD_ISSET: (libc)Waiting for I/O.
+-* FD_SET: (libc)Waiting for I/O.
+-* FD_SETSIZE: (libc)Waiting for I/O.
+-* FD_ZERO: (libc)Waiting for I/O.
+-* FILENAME_MAX: (libc)Limits for Files.
+-* FLUSHO: (libc)Local Modes.
+-* FOPEN_MAX: (libc)Opening Streams.
+-* FP_ILOGB0: (libc)Exponents and Logarithms.
+-* FP_ILOGBNAN: (libc)Exponents and Logarithms.
+-* F_DUPFD: (libc)Duplicating Descriptors.
+-* F_GETFD: (libc)Descriptor Flags.
+-* F_GETFL: (libc)Getting File Status Flags.
+-* F_GETLK: (libc)File Locks.
+-* F_GETOWN: (libc)Interrupt Input.
+-* F_OK: (libc)Testing File Access.
+-* F_SETFD: (libc)Descriptor Flags.
+-* F_SETFL: (libc)Getting File Status Flags.
+-* F_SETLK: (libc)File Locks.
+-* F_SETLKW: (libc)File Locks.
+-* F_SETOWN: (libc)Interrupt Input.
+-* HUGE_VAL: (libc)Math Error Reporting.
+-* HUGE_VALF: (libc)Math Error Reporting.
+-* HUGE_VALL: (libc)Math Error Reporting.
+-* HUPCL: (libc)Control Modes.
+-* I: (libc)Complex Numbers.
+-* ICANON: (libc)Local Modes.
+-* ICRNL: (libc)Input Modes.
+-* IEXTEN: (libc)Local Modes.
+-* IFNAMSIZ: (libc)Interface Naming.
+-* IFTODT: (libc)Directory Entries.
+-* IGNBRK: (libc)Input Modes.
+-* IGNCR: (libc)Input Modes.
+-* IGNPAR: (libc)Input Modes.
+-* IMAXBEL: (libc)Input Modes.
+-* INADDR_ANY: (libc)Host Address Data Type.
+-* INADDR_BROADCAST: (libc)Host Address Data Type.
+-* INADDR_LOOPBACK: (libc)Host Address Data Type.
+-* INADDR_NONE: (libc)Host Address Data Type.
+-* INFINITY: (libc)Infinity and NaN.
+-* INLCR: (libc)Input Modes.
+-* INPCK: (libc)Input Modes.
+-* IPPORT_RESERVED: (libc)Ports.
+-* IPPORT_USERRESERVED: (libc)Ports.
+-* ISIG: (libc)Local Modes.
+-* ISTRIP: (libc)Input Modes.
+-* IXANY: (libc)Input Modes.
+-* IXOFF: (libc)Input Modes.
+-* IXON: (libc)Input Modes.
+-* LINE_MAX: (libc)Utility Limits.
+-* LINK_MAX: (libc)Limits for Files.
+-* L_ctermid: (libc)Identifying the Terminal.
+-* L_cuserid: (libc)Who Logged In.
+-* L_tmpnam: (libc)Temporary Files.
+-* MAXNAMLEN: (libc)Limits for Files.
+-* MAX_CANON: (libc)Limits for Files.
+-* MAX_INPUT: (libc)Limits for Files.
+-* MB_CUR_MAX: (libc)Selecting the Conversion.
+-* MB_LEN_MAX: (libc)Selecting the Conversion.
+-* MDMBUF: (libc)Control Modes.
+-* MSG_DONTROUTE: (libc)Socket Data Options.
+-* MSG_OOB: (libc)Socket Data Options.
+-* MSG_PEEK: (libc)Socket Data Options.
+-* NAME_MAX: (libc)Limits for Files.
+-* NAN: (libc)Infinity and NaN.
+-* NCCS: (libc)Mode Data Types.
+-* NGROUPS_MAX: (libc)General Limits.
+-* NOFLSH: (libc)Local Modes.
+-* NOKERNINFO: (libc)Local Modes.
+-* NSIG: (libc)Standard Signals.
+-* NULL: (libc)Null Pointer Constant.
+-* ONLCR: (libc)Output Modes.
+-* ONOEOT: (libc)Output Modes.
+-* OPEN_MAX: (libc)General Limits.
+-* OPOST: (libc)Output Modes.
+-* OXTABS: (libc)Output Modes.
+-* O_ACCMODE: (libc)Access Modes.
+-* O_APPEND: (libc)Operating Modes.
+-* O_ASYNC: (libc)Operating Modes.
+-* O_CREAT: (libc)Open-time Flags.
+-* O_EXCL: (libc)Open-time Flags.
+-* O_EXEC: (libc)Access Modes.
+-* O_EXLOCK: (libc)Open-time Flags.
+-* O_FSYNC: (libc)Operating Modes.
+-* O_IGNORE_CTTY: (libc)Open-time Flags.
+-* O_NDELAY: (libc)Operating Modes.
+-* O_NOATIME: (libc)Operating Modes.
+-* O_NOCTTY: (libc)Open-time Flags.
+-* O_NOLINK: (libc)Open-time Flags.
+-* O_NONBLOCK: (libc)Open-time Flags.
+-* O_NONBLOCK: (libc)Operating Modes.
+-* O_NOTRANS: (libc)Open-time Flags.
+-* O_RDONLY: (libc)Access Modes.
+-* O_RDWR: (libc)Access Modes.
+-* O_READ: (libc)Access Modes.
+-* O_SHLOCK: (libc)Open-time Flags.
+-* O_SYNC: (libc)Operating Modes.
+-* O_TRUNC: (libc)Open-time Flags.
+-* O_WRITE: (libc)Access Modes.
+-* O_WRONLY: (libc)Access Modes.
+-* PARENB: (libc)Control Modes.
+-* PARMRK: (libc)Input Modes.
+-* PARODD: (libc)Control Modes.
+-* PATH_MAX: (libc)Limits for Files.
+-* PA_FLAG_MASK: (libc)Parsing a Template String.
+-* PENDIN: (libc)Local Modes.
+-* PF_FILE: (libc)Local Namespace Details.
+-* PF_INET: (libc)Internet Namespace.
+-* PF_LOCAL: (libc)Local Namespace Details.
+-* PF_UNIX: (libc)Local Namespace Details.
+-* PIPE_BUF: (libc)Limits for Files.
+-* P_tmpdir: (libc)Temporary Files.
+-* RAND_MAX: (libc)ISO Random.
+-* RE_DUP_MAX: (libc)General Limits.
+-* RLIM_INFINITY: (libc)Limits on Resources.
+-* R_OK: (libc)Testing File Access.
+-* SA_NOCLDSTOP: (libc)Flags for Sigaction.
+-* SA_ONSTACK: (libc)Flags for Sigaction.
+-* SA_RESTART: (libc)Flags for Sigaction.
+-* SEEK_CUR: (libc)File Positioning.
+-* SEEK_END: (libc)File Positioning.
+-* SEEK_SET: (libc)File Positioning.
+-* SIGABRT: (libc)Program Error Signals.
+-* SIGALRM: (libc)Alarm Signals.
+-* SIGBUS: (libc)Program Error Signals.
+-* SIGCHLD: (libc)Job Control Signals.
+-* SIGCLD: (libc)Job Control Signals.
+-* SIGCONT: (libc)Job Control Signals.
+-* SIGEMT: (libc)Program Error Signals.
+-* SIGFPE: (libc)Program Error Signals.
+-* SIGHUP: (libc)Termination Signals.
+-* SIGILL: (libc)Program Error Signals.
+-* SIGINFO: (libc)Miscellaneous Signals.
+-* SIGINT: (libc)Termination Signals.
+-* SIGIO: (libc)Asynchronous I/O Signals.
+-* SIGIOT: (libc)Program Error Signals.
+-* SIGKILL: (libc)Termination Signals.
+-* SIGLOST: (libc)Operation Error Signals.
+-* SIGPIPE: (libc)Operation Error Signals.
+-* SIGPOLL: (libc)Asynchronous I/O Signals.
+-* SIGPROF: (libc)Alarm Signals.
+-* SIGQUIT: (libc)Termination Signals.
+-* SIGSEGV: (libc)Program Error Signals.
+-* SIGSTOP: (libc)Job Control Signals.
+-* SIGSYS: (libc)Program Error Signals.
+-* SIGTERM: (libc)Termination Signals.
+-* SIGTRAP: (libc)Program Error Signals.
+-* SIGTSTP: (libc)Job Control Signals.
+-* SIGTTIN: (libc)Job Control Signals.
+-* SIGTTOU: (libc)Job Control Signals.
+-* SIGURG: (libc)Asynchronous I/O Signals.
+-* SIGUSR1: (libc)Miscellaneous Signals.
+-* SIGUSR2: (libc)Miscellaneous Signals.
+-* SIGVTALRM: (libc)Alarm Signals.
+-* SIGWINCH: (libc)Miscellaneous Signals.
+-* SIGXCPU: (libc)Operation Error Signals.
+-* SIGXFSZ: (libc)Operation Error Signals.
+-* SIG_ERR: (libc)Basic Signal Handling.
+-* SOCK_DGRAM: (libc)Communication Styles.
+-* SOCK_RAW: (libc)Communication Styles.
+-* SOCK_RDM: (libc)Communication Styles.
+-* SOCK_SEQPACKET: (libc)Communication Styles.
+-* SOCK_STREAM: (libc)Communication Styles.
+-* SOL_SOCKET: (libc)Socket-Level Options.
+-* SSIZE_MAX: (libc)General Limits.
+-* STREAM_MAX: (libc)General Limits.
+-* SUN_LEN: (libc)Local Namespace Details.
+-* SV_INTERRUPT: (libc)BSD Handler.
+-* SV_ONSTACK: (libc)BSD Handler.
+-* SV_RESETHAND: (libc)BSD Handler.
+-* S_IFMT: (libc)Testing File Type.
+-* S_ISBLK: (libc)Testing File Type.
+-* S_ISCHR: (libc)Testing File Type.
+-* S_ISDIR: (libc)Testing File Type.
+-* S_ISFIFO: (libc)Testing File Type.
+-* S_ISLNK: (libc)Testing File Type.
+-* S_ISREG: (libc)Testing File Type.
+-* S_ISSOCK: (libc)Testing File Type.
+-* TMP_MAX: (libc)Temporary Files.
+-* TOSTOP: (libc)Local Modes.
+-* TZNAME_MAX: (libc)General Limits.
+-* VDISCARD: (libc)Other Special.
+-* VDSUSP: (libc)Signal Characters.
+-* VEOF: (libc)Editing Characters.
+-* VEOL2: (libc)Editing Characters.
+-* VEOL: (libc)Editing Characters.
+-* VERASE: (libc)Editing Characters.
+-* VINTR: (libc)Signal Characters.
+-* VKILL: (libc)Editing Characters.
+-* VLNEXT: (libc)Other Special.
+-* VMIN: (libc)Noncanonical Input.
+-* VQUIT: (libc)Signal Characters.
+-* VREPRINT: (libc)Editing Characters.
+-* VSTART: (libc)Start/Stop Characters.
+-* VSTATUS: (libc)Other Special.
+-* VSTOP: (libc)Start/Stop Characters.
+-* VSUSP: (libc)Signal Characters.
+-* VTIME: (libc)Noncanonical Input.
+-* VWERASE: (libc)Editing Characters.
+-* WCHAR_MAX: (libc)Extended Char Intro.
+-* WCHAR_MIN: (libc)Extended Char Intro.
+-* WCOREDUMP: (libc)Process Completion Status.
+-* WEOF: (libc)Extended Char Intro.
+-* WEXITSTATUS: (libc)Process Completion Status.
+-* WIFEXITED: (libc)Process Completion Status.
+-* WIFSIGNALED: (libc)Process Completion Status.
+-* WIFSTOPPED: (libc)Process Completion Status.
+-* WSTOPSIG: (libc)Process Completion Status.
+-* WTERMSIG: (libc)Process Completion Status.
+-* W_OK: (libc)Testing File Access.
+-* X_OK: (libc)Testing File Access.
+-* _Complex_I: (libc)Complex Numbers.
+-* _Exit: (libc)Termination Internals.
+-* _IOFBF: (libc)Controlling Buffering.
+-* _IOLBF: (libc)Controlling Buffering.
+-* _IONBF: (libc)Controlling Buffering.
+-* _Imaginary_I: (libc)Complex Numbers.
+-* _PATH_UTMP: (libc)Manipulating the Database.
+-* _PATH_WTMP: (libc)Manipulating the Database.
+-* _POSIX2_C_DEV: (libc)System Options.
+-* _POSIX2_C_VERSION: (libc)Version Supported.
+-* _POSIX2_FORT_DEV: (libc)System Options.
+-* _POSIX2_FORT_RUN: (libc)System Options.
+-* _POSIX2_LOCALEDEF: (libc)System Options.
+-* _POSIX2_SW_DEV: (libc)System Options.
+-* _POSIX_CHOWN_RESTRICTED: (libc)Options for Files.
+-* _POSIX_JOB_CONTROL: (libc)System Options.
+-* _POSIX_NO_TRUNC: (libc)Options for Files.
+-* _POSIX_SAVED_IDS: (libc)System Options.
+-* _POSIX_VDISABLE: (libc)Options for Files.
+-* _POSIX_VERSION: (libc)Version Supported.
+-* __va_copy: (libc)Argument Macros.
+-* _exit: (libc)Termination Internals.
+-* _tolower: (libc)Case Conversion.
+-* _toupper: (libc)Case Conversion.
+-* a64l: (libc)Encode Binary Data.
+-* abort: (libc)Aborting a Program.
+-* abs: (libc)Absolute Value.
+-* accept: (libc)Accepting Connections.
+-* access: (libc)Testing File Access.
+-* acos: (libc)Inverse Trig Functions.
+-* acosf: (libc)Inverse Trig Functions.
+-* acosh: (libc)Hyperbolic Functions.
+-* acoshf: (libc)Hyperbolic Functions.
+-* acoshl: (libc)Hyperbolic Functions.
+-* acosl: (libc)Inverse Trig Functions.
+-* addmntent: (libc)Filesystem handling.
+-* addseverity: (libc)Adding Severity Classes.
+-* adjtime: (libc)High-Resolution Calendar.
+-* aio_cancel64: (libc)Cancel AIO Operations.
+-* aio_cancel: (libc)Cancel AIO Operations.
+-* aio_error64: (libc)Status of AIO Operations.
+-* aio_error: (libc)Status of AIO Operations.
+-* aio_fsync64: (libc)Synchronizing AIO Operations.
+-* aio_fsync: (libc)Synchronizing AIO Operations.
+-* aio_init: (libc)Configuration of AIO.
+-* aio_read64: (libc)Asynchronous Reads/Writes.
+-* aio_read: (libc)Asynchronous Reads/Writes.
+-* aio_return64: (libc)Status of AIO Operations.
+-* aio_return: (libc)Status of AIO Operations.
+-* aio_suspend64: (libc)Synchronizing AIO Operations.
+-* aio_suspend: (libc)Synchronizing AIO Operations.
+-* aio_write64: (libc)Asynchronous Reads/Writes.
+-* aio_write: (libc)Asynchronous Reads/Writes.
+-* alarm: (libc)Setting an Alarm.
+-* alloca: (libc)Variable Size Automatic.
+-* alphasort64: (libc)Scanning Directory Content.
+-* alphasort: (libc)Scanning Directory Content.
+-* argp_error: (libc)Argp Helper Functions.
+-* argp_failure: (libc)Argp Helper Functions.
+-* argp_help: (libc)Argp Help.
+-* argp_parse: (libc)Argp.
+-* argp_state_help: (libc)Argp Helper Functions.
+-* argp_usage: (libc)Argp Helper Functions.
+-* argz_add: (libc)Argz Functions.
+-* argz_add_sep: (libc)Argz Functions.
+-* argz_append: (libc)Argz Functions.
+-* argz_count: (libc)Argz Functions.
+-* argz_create: (libc)Argz Functions.
+-* argz_create_sep: (libc)Argz Functions.
+-* argz_delete: (libc)Argz Functions.
+-* argz_extract: (libc)Argz Functions.
+-* argz_insert: (libc)Argz Functions.
+-* argz_next: (libc)Argz Functions.
+-* argz_replace: (libc)Argz Functions.
+-* argz_stringify: (libc)Argz Functions.
+-* asctime: (libc)Formatting Date and Time.
+-* asctime_r: (libc)Formatting Date and Time.
+-* asin: (libc)Inverse Trig Functions.
+-* asinf: (libc)Inverse Trig Functions.
+-* asinh: (libc)Hyperbolic Functions.
+-* asinhf: (libc)Hyperbolic Functions.
+-* asinhl: (libc)Hyperbolic Functions.
+-* asinl: (libc)Inverse Trig Functions.
+-* asprintf: (libc)Dynamic Output.
+-* assert: (libc)Consistency Checking.
+-* assert_perror: (libc)Consistency Checking.
+-* atan2: (libc)Inverse Trig Functions.
+-* atan2f: (libc)Inverse Trig Functions.
+-* atan2l: (libc)Inverse Trig Functions.
+-* atan: (libc)Inverse Trig Functions.
+-* atanf: (libc)Inverse Trig Functions.
+-* atanh: (libc)Hyperbolic Functions.
+-* atanhf: (libc)Hyperbolic Functions.
+-* atanhl: (libc)Hyperbolic Functions.
+-* atanl: (libc)Inverse Trig Functions.
+-* atexit: (libc)Cleanups on Exit.
+-* atof: (libc)Parsing of Floats.
+-* atoi: (libc)Parsing of Integers.
+-* atol: (libc)Parsing of Integers.
+-* atoll: (libc)Parsing of Integers.
+-* bcmp: (libc)String/Array Comparison.
+-* bcopy: (libc)Copying and Concatenation.
+-* bind: (libc)Setting Address.
+-* bindtextdomain: (libc)Locating gettext catalog.
+-* bsearch: (libc)Array Search Function.
+-* btowc: (libc)Converting a Character.
+-* bzero: (libc)Copying and Concatenation.
+-* cabs: (libc)Absolute Value.
+-* cabsf: (libc)Absolute Value.
+-* cabsl: (libc)Absolute Value.
+-* cacos: (libc)Inverse Trig Functions.
+-* cacosf: (libc)Inverse Trig Functions.
+-* cacosh: (libc)Hyperbolic Functions.
+-* cacoshf: (libc)Hyperbolic Functions.
+-* cacoshl: (libc)Hyperbolic Functions.
+-* cacosl: (libc)Inverse Trig Functions.
+-* calloc: (libc)Allocating Cleared Space.
+-* carg: (libc)Operations on Complex.
+-* cargf: (libc)Operations on Complex.
+-* cargl: (libc)Operations on Complex.
+-* casin: (libc)Inverse Trig Functions.
+-* casinf: (libc)Inverse Trig Functions.
+-* casinh: (libc)Hyperbolic Functions.
+-* casinhf: (libc)Hyperbolic Functions.
+-* casinhl: (libc)Hyperbolic Functions.
+-* casinl: (libc)Inverse Trig Functions.
+-* catan: (libc)Inverse Trig Functions.
+-* catanf: (libc)Inverse Trig Functions.
+-* catanh: (libc)Hyperbolic Functions.
+-* catanhf: (libc)Hyperbolic Functions.
+-* catanhl: (libc)Hyperbolic Functions.
+-* catanl: (libc)Inverse Trig Functions.
+-* catclose: (libc)The catgets Functions.
+-* catgets: (libc)The catgets Functions.
+-* catopen: (libc)The catgets Functions.
+-* cbc_crypt: (libc)DES Encryption.
+-* cbrt: (libc)Exponents and Logarithms.
+-* cbrtf: (libc)Exponents and Logarithms.
+-* cbrtl: (libc)Exponents and Logarithms.
+-* ccos: (libc)Trig Functions.
+-* ccosf: (libc)Trig Functions.
+-* ccosh: (libc)Hyperbolic Functions.
+-* ccoshf: (libc)Hyperbolic Functions.
+-* ccoshl: (libc)Hyperbolic Functions.
+-* ccosl: (libc)Trig Functions.
+-* ceil: (libc)Rounding Functions.
+-* ceilf: (libc)Rounding Functions.
+-* ceill: (libc)Rounding Functions.
+-* cexp: (libc)Exponents and Logarithms.
+-* cexpf: (libc)Exponents and Logarithms.
+-* cexpl: (libc)Exponents and Logarithms.
+-* cfgetispeed: (libc)Line Speed.
+-* cfgetospeed: (libc)Line Speed.
+-* cfmakeraw: (libc)Noncanonical Input.
+-* cfree: (libc)Freeing after Malloc.
+-* cfsetispeed: (libc)Line Speed.
+-* cfsetospeed: (libc)Line Speed.
+-* cfsetspeed: (libc)Line Speed.
+-* chdir: (libc)Working Directory.
+-* chmod: (libc)Setting Permissions.
+-* chown: (libc)File Owner.
+-* cimag: (libc)Operations on Complex.
+-* cimagf: (libc)Operations on Complex.
+-* cimagl: (libc)Operations on Complex.
+-* clearenv: (libc)Environment Access.
+-* clearerr: (libc)EOF and Errors.
+-* clock: (libc)Basic CPU Time.
+-* clog10: (libc)Exponents and Logarithms.
+-* clog10f: (libc)Exponents and Logarithms.
+-* clog10l: (libc)Exponents and Logarithms.
+-* clog: (libc)Exponents and Logarithms.
+-* clogf: (libc)Exponents and Logarithms.
+-* clogl: (libc)Exponents and Logarithms.
+-* close: (libc)Opening and Closing Files.
+-* closedir: (libc)Reading/Closing Directory.
+-* confstr: (libc)String Parameters.
+-* conj: (libc)Operations on Complex.
+-* conjf: (libc)Operations on Complex.
+-* conjl: (libc)Operations on Complex.
+-* connect: (libc)Connecting.
+-* copysign: (libc)FP Bit Twiddling.
+-* copysignf: (libc)FP Bit Twiddling.
+-* copysignl: (libc)FP Bit Twiddling.
+-* cos: (libc)Trig Functions.
+-* cosf: (libc)Trig Functions.
+-* cosh: (libc)Hyperbolic Functions.
+-* coshf: (libc)Hyperbolic Functions.
+-* coshl: (libc)Hyperbolic Functions.
+-* cosl: (libc)Trig Functions.
+-* cpow: (libc)Exponents and Logarithms.
+-* cpowf: (libc)Exponents and Logarithms.
+-* cpowl: (libc)Exponents and Logarithms.
+-* cproj: (libc)Operations on Complex.
+-* cprojf: (libc)Operations on Complex.
+-* cprojl: (libc)Operations on Complex.
+-* creal: (libc)Operations on Complex.
+-* crealf: (libc)Operations on Complex.
+-* creall: (libc)Operations on Complex.
+-* creat64: (libc)Opening and Closing Files.
+-* creat: (libc)Opening and Closing Files.
+-* crypt: (libc)crypt.
+-* crypt_r: (libc)crypt.
+-* csin: (libc)Trig Functions.
+-* csinf: (libc)Trig Functions.
+-* csinh: (libc)Hyperbolic Functions.
+-* csinhf: (libc)Hyperbolic Functions.
+-* csinhl: (libc)Hyperbolic Functions.
+-* csinl: (libc)Trig Functions.
+-* csqrt: (libc)Exponents and Logarithms.
+-* csqrtf: (libc)Exponents and Logarithms.
+-* csqrtl: (libc)Exponents and Logarithms.
+-* ctan: (libc)Trig Functions.
+-* ctanf: (libc)Trig Functions.
+-* ctanh: (libc)Hyperbolic Functions.
+-* ctanhf: (libc)Hyperbolic Functions.
+-* ctanhl: (libc)Hyperbolic Functions.
+-* ctanl: (libc)Trig Functions.
+-* ctermid: (libc)Identifying the Terminal.
+-* ctime: (libc)Formatting Date and Time.
+-* ctime_r: (libc)Formatting Date and Time.
+-* cuserid: (libc)Who Logged In.
+-* dcgettext: (libc)Translation with gettext.
+-* des_setparity: (libc)DES Encryption.
+-* dgettext: (libc)Translation with gettext.
+-* difftime: (libc)Simple Calendar Time.
+-* div: (libc)Integer Division.
+-* drand48: (libc)SVID Random.
+-* drand48_r: (libc)SVID Random.
+-* drem: (libc)Remainder Functions.
+-* dremf: (libc)Remainder Functions.
+-* dreml: (libc)Remainder Functions.
+-* dup2: (libc)Duplicating Descriptors.
+-* dup: (libc)Duplicating Descriptors.
+-* ecb_crypt: (libc)DES Encryption.
+-* ecvt: (libc)System V Number Conversion.
+-* ecvt_r: (libc)System V Number Conversion.
+-* encrypt: (libc)DES Encryption.
+-* encrypt_r: (libc)DES Encryption.
+-* endfsent: (libc)Filesystem handling.
+-* endgrent: (libc)Scanning All Groups.
+-* endhostent: (libc)Host Names.
+-* endmntent: (libc)Filesystem handling.
+-* endnetent: (libc)Networks Database.
+-* endnetgrent: (libc)Lookup Netgroup.
+-* endprotoent: (libc)Protocols Database.
+-* endpwent: (libc)Scanning All Users.
+-* endservent: (libc)Services Database.
+-* endutent: (libc)Manipulating the Database.
+-* endutxent: (libc)XPG Functions.
+-* envz_add: (libc)Envz Functions.
+-* envz_entry: (libc)Envz Functions.
+-* envz_get: (libc)Envz Functions.
+-* envz_merge: (libc)Envz Functions.
+-* envz_strip: (libc)Envz Functions.
+-* erand48: (libc)SVID Random.
+-* erand48_r: (libc)SVID Random.
+-* erf: (libc)Special Functions.
+-* erfc: (libc)Special Functions.
+-* erfcf: (libc)Special Functions.
+-* erfcl: (libc)Special Functions.
+-* erff: (libc)Special Functions.
+-* erfl: (libc)Special Functions.
+-* errno: (libc)Checking for Errors.
+-* execl: (libc)Executing a File.
+-* execle: (libc)Executing a File.
+-* execlp: (libc)Executing a File.
+-* execv: (libc)Executing a File.
+-* execve: (libc)Executing a File.
+-* execvp: (libc)Executing a File.
+-* exit: (libc)Normal Termination.
+-* exp10: (libc)Exponents and Logarithms.
+-* exp10f: (libc)Exponents and Logarithms.
+-* exp10l: (libc)Exponents and Logarithms.
+-* exp2: (libc)Exponents and Logarithms.
+-* exp2f: (libc)Exponents and Logarithms.
+-* exp2l: (libc)Exponents and Logarithms.
+-* exp: (libc)Exponents and Logarithms.
+-* expf: (libc)Exponents and Logarithms.
+-* expl: (libc)Exponents and Logarithms.
+-* expm1: (libc)Exponents and Logarithms.
+-* expm1f: (libc)Exponents and Logarithms.
+-* expm1l: (libc)Exponents and Logarithms.
+-* fabs: (libc)Absolute Value.
+-* fabsf: (libc)Absolute Value.
+-* fabsl: (libc)Absolute Value.
+-* fchmod: (libc)Setting Permissions.
+-* fchown: (libc)File Owner.
+-* fclean: (libc)Cleaning Streams.
+-* fclose: (libc)Closing Streams.
+-* fcloseall: (libc)Closing Streams.
+-* fcntl: (libc)Control Operations.
+-* fcvt: (libc)System V Number Conversion.
+-* fcvt_r: (libc)System V Number Conversion.
+-* fdatasync: (libc)Synchronizing I/O.
+-* fdim: (libc)Misc FP Arithmetic.
+-* fdimf: (libc)Misc FP Arithmetic.
+-* fdiml: (libc)Misc FP Arithmetic.
+-* fdopen: (libc)Descriptors and Streams.
+-* feclearexcept: (libc)Status bit operations.
+-* fegetenv: (libc)Control Functions.
+-* fegetexceptflag: (libc)Status bit operations.
+-* fegetround: (libc)Rounding.
+-* feholdexcept: (libc)Control Functions.
+-* feof: (libc)EOF and Errors.
+-* ferror: (libc)EOF and Errors.
+-* fesetenv: (libc)Control Functions.
+-* fesetexceptflag: (libc)Status bit operations.
+-* fesetround: (libc)Rounding.
+-* fetestexcept: (libc)Status bit operations.
+-* feupdateenv: (libc)Control Functions.
+-* fflush: (libc)Flushing Buffers.
+-* fgetc: (libc)Character Input.
+-* fgetgrent: (libc)Scanning All Groups.
+-* fgetgrent_r: (libc)Scanning All Groups.
+-* fgetpos64: (libc)Portable Positioning.
+-* fgetpos: (libc)Portable Positioning.
+-* fgetpwent: (libc)Scanning All Users.
+-* fgetpwent_r: (libc)Scanning All Users.
+-* fgets: (libc)Line Input.
+-* fileno: (libc)Descriptors and Streams.
+-* finite: (libc)Floating Point Classes.
+-* finitef: (libc)Floating Point Classes.
+-* finitel: (libc)Floating Point Classes.
+-* floor: (libc)Rounding Functions.
+-* floorf: (libc)Rounding Functions.
+-* floorl: (libc)Rounding Functions.
+-* fma: (libc)Misc FP Arithmetic.
+-* fmaf: (libc)Misc FP Arithmetic.
+-* fmal: (libc)Misc FP Arithmetic.
+-* fmax: (libc)Misc FP Arithmetic.
+-* fmaxf: (libc)Misc FP Arithmetic.
+-* fmaxl: (libc)Misc FP Arithmetic.
+-* fmemopen: (libc)String Streams.
+-* fmin: (libc)Misc FP Arithmetic.
+-* fminf: (libc)Misc FP Arithmetic.
+-* fminl: (libc)Misc FP Arithmetic.
+-* fmod: (libc)Remainder Functions.
+-* fmodf: (libc)Remainder Functions.
+-* fmodl: (libc)Remainder Functions.
+-* fmtmsg: (libc)Printing Formatted Messages.
+-* fnmatch: (libc)Wildcard Matching.
+-* fopen64: (libc)Opening Streams.
+-* fopen: (libc)Opening Streams.
+-* fopencookie: (libc)Streams and Cookies.
+-* fork: (libc)Creating a Process.
+-* forkpty: (libc)Pseudo-Terminal Pairs.
+-* fpathconf: (libc)Pathconf.
+-* fpclassify: (libc)Floating Point Classes.
+-* fprintf: (libc)Formatted Output Functions.
+-* fputc: (libc)Simple Output.
+-* fputs: (libc)Simple Output.
+-* fread: (libc)Block Input/Output.
+-* free: (libc)Freeing after Malloc.
+-* freopen64: (libc)Opening Streams.
+-* freopen: (libc)Opening Streams.
+-* frexp: (libc)Normalization Functions.
+-* frexpf: (libc)Normalization Functions.
+-* frexpl: (libc)Normalization Functions.
+-* fscanf: (libc)Formatted Input Functions.
+-* fseek: (libc)File Positioning.
+-* fseeko64: (libc)File Positioning.
+-* fseeko: (libc)File Positioning.
+-* fsetpos64: (libc)Portable Positioning.
+-* fsetpos: (libc)Portable Positioning.
+-* fstat64: (libc)Reading Attributes.
+-* fstat: (libc)Reading Attributes.
+-* fsync: (libc)Synchronizing I/O.
+-* ftell: (libc)File Positioning.
+-* ftello64: (libc)File Positioning.
+-* ftello: (libc)File Positioning.
+-* ftruncate64: (libc)Truncating Files.
+-* ftruncate: (libc)File Size.
+-* ftruncate: (libc)Truncating Files.
+-* ftw64: (libc)Working on Directory Trees.
+-* ftw: (libc)Working on Directory Trees.
+-* fwrite: (libc)Block Input/Output.
+-* gamma: (libc)Special Functions.
+-* gammaf: (libc)Special Functions.
+-* gammal: (libc)Special Functions.
+-* gcvt: (libc)System V Number Conversion.
+-* getc: (libc)Character Input.
+-* getchar: (libc)Character Input.
+-* getcwd: (libc)Working Directory.
+-* getdate: (libc)General Time String Parsing.
+-* getdate_r: (libc)General Time String Parsing.
+-* getdelim: (libc)Line Input.
+-* getegid: (libc)Reading Persona.
+-* getenv: (libc)Environment Access.
+-* geteuid: (libc)Reading Persona.
+-* getfsent: (libc)Filesystem handling.
+-* getfsfile: (libc)Filesystem handling.
+-* getfsspec: (libc)Filesystem handling.
+-* getgid: (libc)Reading Persona.
+-* getgrent: (libc)Scanning All Groups.
+-* getgrent_r: (libc)Scanning All Groups.
+-* getgrgid: (libc)Lookup Group.
+-* getgrgid_r: (libc)Lookup Group.
+-* getgrnam: (libc)Lookup Group.
+-* getgrnam_r: (libc)Lookup Group.
+-* getgroups: (libc)Reading Persona.
+-* gethostbyaddr: (libc)Host Names.
+-* gethostbyaddr_r: (libc)Host Names.
+-* gethostbyname2: (libc)Host Names.
+-* gethostbyname2_r: (libc)Host Names.
+-* gethostbyname: (libc)Host Names.
+-* gethostbyname_r: (libc)Host Names.
+-* gethostent: (libc)Host Names.
+-* gethostid: (libc)Host Identification.
+-* gethostname: (libc)Host Identification.
+-* getitimer: (libc)Setting an Alarm.
+-* getline: (libc)Line Input.
+-* getlogin: (libc)Who Logged In.
+-* getmntent: (libc)Filesystem handling.
+-* getmntent_r: (libc)Filesystem handling.
+-* getnetbyaddr: (libc)Networks Database.
+-* getnetbyname: (libc)Networks Database.
+-* getnetent: (libc)Networks Database.
+-* getnetgrent: (libc)Lookup Netgroup.
+-* getnetgrent_r: (libc)Lookup Netgroup.
+-* getopt: (libc)Using Getopt.
+-* getopt_long: (libc)Getopt Long Options.
+-* getpass: (libc)getpass.
+-* getpeername: (libc)Who is Connected.
+-* getpgid: (libc)Process Group Functions.
+-* getpgrp: (libc)Process Group Functions.
+-* getpgrp: (libc)Process Group Functions.
+-* getpid: (libc)Process Identification.
+-* getppid: (libc)Process Identification.
+-* getpriority: (libc)Priority.
+-* getprotobyname: (libc)Protocols Database.
+-* getprotobynumber: (libc)Protocols Database.
+-* getprotoent: (libc)Protocols Database.
+-* getpt: (libc)Allocation.
+-* getpwent: (libc)Scanning All Users.
+-* getpwent_r: (libc)Scanning All Users.
+-* getpwnam: (libc)Lookup User.
+-* getpwnam_r: (libc)Lookup User.
+-* getpwuid: (libc)Lookup User.
+-* getpwuid_r: (libc)Lookup User.
+-* getrlimit64: (libc)Limits on Resources.
+-* getrlimit: (libc)Limits on Resources.
+-* getrusage: (libc)Resource Usage.
+-* gets: (libc)Line Input.
+-* getservbyname: (libc)Services Database.
+-* getservbyport: (libc)Services Database.
+-* getservent: (libc)Services Database.
+-* getsid: (libc)Process Group Functions.
+-* getsockname: (libc)Reading Address.
+-* getsockopt: (libc)Socket Option Functions.
+-* getsubopt: (libc)Suboptions.
+-* gettext: (libc)Translation with gettext.
+-* gettimeofday: (libc)High-Resolution Calendar.
+-* getuid: (libc)Reading Persona.
+-* getumask: (libc)Setting Permissions.
+-* getutent: (libc)Manipulating the Database.
+-* getutent_r: (libc)Manipulating the Database.
+-* getutid: (libc)Manipulating the Database.
+-* getutid_r: (libc)Manipulating the Database.
+-* getutline: (libc)Manipulating the Database.
+-* getutline_r: (libc)Manipulating the Database.
+-* getutxent: (libc)XPG Functions.
+-* getutxid: (libc)XPG Functions.
+-* getutxline: (libc)XPG Functions.
+-* getw: (libc)Character Input.
+-* getwd: (libc)Working Directory.
+-* glob: (libc)Calling Glob.
+-* globfree: (libc)More Flags for Globbing.
+-* gmtime: (libc)Broken-down Time.
+-* gmtime_r: (libc)Broken-down Time.
+-* grantpt: (libc)Allocation.
+-* gsignal: (libc)Signaling Yourself.
+-* hasmntopt: (libc)Filesystem handling.
+-* hcreate: (libc)Hash Search Function.
+-* hcreate_r: (libc)Hash Search Function.
+-* hdestroy: (libc)Hash Search Function.
+-* hdestroy_r: (libc)Hash Search Function.
+-* hsearch: (libc)Hash Search Function.
+-* hsearch_r: (libc)Hash Search Function.
+-* htonl: (libc)Byte Order.
+-* htons: (libc)Byte Order.
+-* hypot: (libc)Exponents and Logarithms.
+-* hypotf: (libc)Exponents and Logarithms.
+-* hypotl: (libc)Exponents and Logarithms.
+-* iconv: (libc)Generic Conversion Interface.
+-* iconv_close: (libc)Generic Conversion Interface.
+-* iconv_open: (libc)Generic Conversion Interface.
+-* if_freenameindex: (libc)Interface Naming.
+-* if_indextoname: (libc)Interface Naming.
+-* if_nameindex: (libc)Interface Naming.
+-* if_nametoindex: (libc)Interface Naming.
+-* ilogb: (libc)Exponents and Logarithms.
+-* ilogbf: (libc)Exponents and Logarithms.
+-* ilogbl: (libc)Exponents and Logarithms.
+-* imaxabs: (libc)Absolute Value.
+-* imaxdiv: (libc)Integer Division.
+-* in6addr_any: (libc)Host Address Data Type.
+-* in6addr_loopback: (libc)Host Address Data Type.
+-* index: (libc)Search Functions.
+-* inet_addr: (libc)Host Address Functions.
+-* inet_aton: (libc)Host Address Functions.
+-* inet_lnaof: (libc)Host Address Functions.
+-* inet_makeaddr: (libc)Host Address Functions.
+-* inet_netof: (libc)Host Address Functions.
+-* inet_network: (libc)Host Address Functions.
+-* inet_ntoa: (libc)Host Address Functions.
+-* inet_ntop: (libc)Host Address Functions.
+-* inet_pton: (libc)Host Address Functions.
+-* infnan: (libc)Floating Point Classes.
+-* initgroups: (libc)Setting Groups.
+-* initstate: (libc)BSD Random.
+-* innetgr: (libc)Netgroup Membership.
+-* ioctl: (libc)IOCTLs.
+-* isalnum: (libc)Classification of Characters.
+-* isalpha: (libc)Classification of Characters.
+-* isascii: (libc)Classification of Characters.
+-* isatty: (libc)Is It a Terminal.
+-* isblank: (libc)Classification of Characters.
+-* iscntrl: (libc)Classification of Characters.
+-* isdigit: (libc)Classification of Characters.
+-* isfinite: (libc)Floating Point Classes.
+-* isgraph: (libc)Classification of Characters.
+-* isgreater: (libc)FP Comparison Functions.
+-* isgreaterequal: (libc)FP Comparison Functions.
+-* isinf: (libc)Floating Point Classes.
+-* isinff: (libc)Floating Point Classes.
+-* isinfl: (libc)Floating Point Classes.
+-* isless: (libc)FP Comparison Functions.
+-* islessequal: (libc)FP Comparison Functions.
+-* islessgreater: (libc)FP Comparison Functions.
+-* islower: (libc)Classification of Characters.
+-* isnan: (libc)Floating Point Classes.
+-* isnan: (libc)Floating Point Classes.
+-* isnanf: (libc)Floating Point Classes.
+-* isnanl: (libc)Floating Point Classes.
+-* isnormal: (libc)Floating Point Classes.
+-* isprint: (libc)Classification of Characters.
+-* ispunct: (libc)Classification of Characters.
+-* isspace: (libc)Classification of Characters.
+-* isunordered: (libc)FP Comparison Functions.
+-* isupper: (libc)Classification of Characters.
+-* iswalnum: (libc)Classification of Wide Characters.
+-* iswalpha: (libc)Classification of Wide Characters.
+-* iswblank: (libc)Classification of Wide Characters.
+-* iswcntrl: (libc)Classification of Wide Characters.
+-* iswctype: (libc)Classification of Wide Characters.
+-* iswdigit: (libc)Classification of Wide Characters.
+-* iswgraph: (libc)Classification of Wide Characters.
+-* iswlower: (libc)Classification of Wide Characters.
+-* iswprint: (libc)Classification of Wide Characters.
+-* iswpunct: (libc)Classification of Wide Characters.
+-* iswspace: (libc)Classification of Wide Characters.
+-* iswupper: (libc)Classification of Wide Characters.
+-* iswxdigit: (libc)Classification of Wide Characters.
+-* isxdigit: (libc)Classification of Characters.
+-* j0: (libc)Special Functions.
+-* j0f: (libc)Special Functions.
+-* j0l: (libc)Special Functions.
+-* j1: (libc)Special Functions.
+-* j1f: (libc)Special Functions.
+-* j1l: (libc)Special Functions.
+-* jn: (libc)Special Functions.
+-* jnf: (libc)Special Functions.
+-* jnl: (libc)Special Functions.
+-* jrand48: (libc)SVID Random.
+-* jrand48_r: (libc)SVID Random.
+-* kill: (libc)Signaling Another Process.
+-* killpg: (libc)Signaling Another Process.
+-* l64a: (libc)Encode Binary Data.
+-* labs: (libc)Absolute Value.
+-* lcong48: (libc)SVID Random.
+-* lcong48_r: (libc)SVID Random.
+-* ldexp: (libc)Normalization Functions.
+-* ldexpf: (libc)Normalization Functions.
+-* ldexpl: (libc)Normalization Functions.
+-* ldiv: (libc)Integer Division.
+-* lfind: (libc)Array Search Function.
+-* lgamma: (libc)Special Functions.
+-* lgamma_r: (libc)Special Functions.
+-* lgammaf: (libc)Special Functions.
+-* lgammaf_r: (libc)Special Functions.
+-* lgammal: (libc)Special Functions.
+-* lgammal_r: (libc)Special Functions.
+-* link: (libc)Hard Links.
+-* lio_listio64: (libc)Asynchronous Reads/Writes.
+-* lio_listio: (libc)Asynchronous Reads/Writes.
+-* listen: (libc)Listening.
+-* llabs: (libc)Absolute Value.
+-* lldiv: (libc)Integer Division.
+-* llrint: (libc)Rounding Functions.
+-* llrintf: (libc)Rounding Functions.
+-* llrintl: (libc)Rounding Functions.
+-* llround: (libc)Rounding Functions.
+-* llroundf: (libc)Rounding Functions.
+-* llroundl: (libc)Rounding Functions.
+-* localeconv: (libc)The Lame Way to Locale Data.
+-* localtime: (libc)Broken-down Time.
+-* localtime_r: (libc)Broken-down Time.
+-* log10: (libc)Exponents and Logarithms.
+-* log10f: (libc)Exponents and Logarithms.
+-* log10l: (libc)Exponents and Logarithms.
+-* log1p: (libc)Exponents and Logarithms.
+-* log1pf: (libc)Exponents and Logarithms.
+-* log1pl: (libc)Exponents and Logarithms.
+-* log2: (libc)Exponents and Logarithms.
+-* log2f: (libc)Exponents and Logarithms.
+-* log2l: (libc)Exponents and Logarithms.
+-* log: (libc)Exponents and Logarithms.
+-* logb: (libc)Exponents and Logarithms.
+-* logb: (libc)Normalization Functions.
+-* logbf: (libc)Exponents and Logarithms.
+-* logbf: (libc)Normalization Functions.
+-* logbl: (libc)Exponents and Logarithms.
+-* logbl: (libc)Normalization Functions.
+-* logf: (libc)Exponents and Logarithms.
+-* login: (libc)Logging In and Out.
+-* login_tty: (libc)Logging In and Out.
+-* logl: (libc)Exponents and Logarithms.
+-* logout: (libc)Logging In and Out.
+-* logwtmp: (libc)Logging In and Out.
+-* longjmp: (libc)Non-Local Details.
+-* lrand48: (libc)SVID Random.
+-* lrand48_r: (libc)SVID Random.
+-* lrint: (libc)Rounding Functions.
+-* lrintf: (libc)Rounding Functions.
+-* lrintl: (libc)Rounding Functions.
+-* lround: (libc)Rounding Functions.
+-* lroundf: (libc)Rounding Functions.
+-* lroundl: (libc)Rounding Functions.
+-* lsearch: (libc)Array Search Function.
+-* lseek64: (libc)File Position Primitive.
+-* lseek: (libc)File Position Primitive.
+-* lstat64: (libc)Reading Attributes.
+-* lstat: (libc)Reading Attributes.
+-* mallinfo: (libc)Statistics of Malloc.
+-* malloc: (libc)Basic Allocation.
+-* mallopt: (libc)Malloc Tunable Parameters.
+-* mblen: (libc)Non-reentrant Character Conversion.
+-* mbrlen: (libc)Converting a Character.
+-* mbrtowc: (libc)Converting a Character.
+-* mbsinit: (libc)Keeping the state.
+-* mbsnrtowcs: (libc)Converting Strings.
+-* mbsrtowcs: (libc)Converting Strings.
+-* mbstowcs: (libc)Non-reentrant String Conversion.
+-* mbtowc: (libc)Non-reentrant Character Conversion.
+-* mcheck: (libc)Heap Consistency Checking.
+-* memalign: (libc)Aligned Memory Blocks.
+-* memccpy: (libc)Copying and Concatenation.
+-* memchr: (libc)Search Functions.
+-* memcmp: (libc)String/Array Comparison.
+-* memcpy: (libc)Copying and Concatenation.
+-* memmem: (libc)Search Functions.
+-* memmove: (libc)Copying and Concatenation.
+-* mempcpy: (libc)Copying and Concatenation.
+-* memset: (libc)Copying and Concatenation.
+-* mkdir: (libc)Creating Directories.
+-* mkfifo: (libc)FIFO Special Files.
+-* mknod: (libc)Making Special Files.
+-* mkstemp: (libc)Temporary Files.
+-* mktemp: (libc)Temporary Files.
+-* mktime: (libc)Broken-down Time.
+-* mmap: (libc)Memory-mapped I/O.
+-* modf: (libc)Rounding Functions.
+-* modff: (libc)Rounding Functions.
+-* modfl: (libc)Rounding Functions.
+-* mprobe: (libc)Heap Consistency Checking.
+-* mrand48: (libc)SVID Random.
+-* mrand48_r: (libc)SVID Random.
+-* mremap: (libc)Memory-mapped I/O.
+-* msync: (libc)Memory-mapped I/O.
+-* mtrace: (libc)Tracing malloc.
+-* munmap: (libc)Memory-mapped I/O.
+-* muntrace: (libc)Tracing malloc.
+-* nan: (libc)FP Bit Twiddling.
+-* nanf: (libc)FP Bit Twiddling.
+-* nanl: (libc)FP Bit Twiddling.
+-* nanosleep: (libc)Sleeping.
+-* nearbyint: (libc)Rounding Functions.
+-* nearbyintf: (libc)Rounding Functions.
+-* nearbyintl: (libc)Rounding Functions.
+-* nextafter: (libc)FP Bit Twiddling.
+-* nextafterf: (libc)FP Bit Twiddling.
+-* nextafterl: (libc)FP Bit Twiddling.
+-* nexttoward: (libc)FP Bit Twiddling.
+-* nexttowardf: (libc)FP Bit Twiddling.
+-* nexttowardl: (libc)FP Bit Twiddling.
+-* nftw64: (libc)Working on Directory Trees.
+-* nftw: (libc)Working on Directory Trees.
+-* nice: (libc)Priority.
+-* nl_langinfo: (libc)The Elegant and Fast Way.
+-* nrand48: (libc)SVID Random.
+-* nrand48_r: (libc)SVID Random.
+-* ntohl: (libc)Byte Order.
+-* ntohs: (libc)Byte Order.
+-* ntp_adjtime: (libc)Precision Time.
+-* ntp_gettime: (libc)Precision Time.
+-* obstack_1grow: (libc)Growing Objects.
+-* obstack_1grow_fast: (libc)Extra Fast Growing.
+-* obstack_alignment_mask: (libc)Obstacks Data Alignment.
+-* obstack_alloc: (libc)Allocation in an Obstack.
+-* obstack_base: (libc)Status of an Obstack.
+-* obstack_blank: (libc)Growing Objects.
+-* obstack_blank_fast: (libc)Extra Fast Growing.
+-* obstack_chunk_size: (libc)Obstack Chunks.
+-* obstack_copy0: (libc)Allocation in an Obstack.
+-* obstack_copy: (libc)Allocation in an Obstack.
+-* obstack_finish: (libc)Growing Objects.
+-* obstack_free: (libc)Freeing Obstack Objects.
+-* obstack_grow0: (libc)Growing Objects.
+-* obstack_grow: (libc)Growing Objects.
+-* obstack_init: (libc)Preparing for Obstacks.
+-* obstack_int_grow: (libc)Growing Objects.
+-* obstack_int_grow_fast: (libc)Extra Fast Growing.
+-* obstack_next_free: (libc)Status of an Obstack.
+-* obstack_object_size: (libc)Growing Objects.
+-* obstack_object_size: (libc)Status of an Obstack.
+-* obstack_printf: (libc)Dynamic Output.
+-* obstack_ptr_grow: (libc)Growing Objects.
+-* obstack_ptr_grow_fast: (libc)Extra Fast Growing.
+-* obstack_room: (libc)Extra Fast Growing.
+-* obstack_vprintf: (libc)Variable Arguments Output.
+-* offsetof: (libc)Structure Measurement.
+-* on_exit: (libc)Cleanups on Exit.
+-* open64: (libc)Opening and Closing Files.
+-* open: (libc)Opening and Closing Files.
+-* open_memstream: (libc)String Streams.
+-* open_obstack_stream: (libc)Obstack Streams.
+-* opendir: (libc)Opening a Directory.
+-* openpty: (libc)Pseudo-Terminal Pairs.
+-* parse_printf_format: (libc)Parsing a Template String.
+-* pathconf: (libc)Pathconf.
+-* pause: (libc)Using Pause.
+-* pclose: (libc)Pipe to a Subprocess.
+-* perror: (libc)Error Messages.
+-* pipe: (libc)Creating a Pipe.
+-* popen: (libc)Pipe to a Subprocess.
+-* pow10: (libc)Exponents and Logarithms.
+-* pow10f: (libc)Exponents and Logarithms.
+-* pow10l: (libc)Exponents and Logarithms.
+-* pow: (libc)Exponents and Logarithms.
+-* powf: (libc)Exponents and Logarithms.
+-* powl: (libc)Exponents and Logarithms.
+-* pread64: (libc)I/O Primitives.
+-* pread: (libc)I/O Primitives.
+-* printf: (libc)Formatted Output Functions.
+-* printf_size: (libc)Predefined Printf Handlers.
+-* printf_size_info: (libc)Predefined Printf Handlers.
+-* psignal: (libc)Signal Messages.
+-* pthread_atfork: (libc)Miscellaneous Thread Functions.
+-* pthread_attr_destroy: (libc)Thread Attributes.
+-* pthread_attr_get@var{attr}: (libc)Thread Attributes.
+-* pthread_attr_init: (libc)Thread Attributes.
+-* pthread_attr_set@var{attr}: (libc)Thread Attributes.
+-* pthread_cancel: (libc)Basic Thread Operations.
+-* pthread_cleanup_pop: (libc)Cleanup Handlers.
+-* pthread_cleanup_pop_restore_np: (libc)Cleanup Handlers.
+-* pthread_cleanup_push: (libc)Cleanup Handlers.
+-* pthread_cleanup_push_defer_np: (libc)Cleanup Handlers.
+-* pthread_cond_broadcast: (libc)Condition Variables.
+-* pthread_cond_destroy: (libc)Condition Variables.
+-* pthread_cond_init: (libc)Condition Variables.
+-* pthread_cond_signal: (libc)Condition Variables.
+-* pthread_cond_timedwait: (libc)Condition Variables.
+-* pthread_cond_wait: (libc)Condition Variables.
+-* pthread_condattr_destroy: (libc)Condition Variables.
+-* pthread_condattr_init: (libc)Condition Variables.
+-* pthread_create: (libc)Basic Thread Operations.
+-* pthread_detach: (libc)Miscellaneous Thread Functions.
+-* pthread_equal: (libc)Miscellaneous Thread Functions.
+-* pthread_exit: (libc)Basic Thread Operations.
+-* pthread_getschedparam: (libc)Miscellaneous Thread Functions.
+-* pthread_getspecific: (libc)Thread-Specific Data.
+-* pthread_join: (libc)Basic Thread Operations.
+-* pthread_key_create: (libc)Thread-Specific Data.
+-* pthread_key_delete: (libc)Thread-Specific Data.
+-* pthread_kill: (libc)Threads and Signal Handling.
+-* pthread_kill_other_threads_np: (libc)Miscellaneous Thread Functions.
+-* pthread_mutex_destroy: (libc)Mutexes.
+-* pthread_mutex_init: (libc)Mutexes.
+-* pthread_mutex_lock: (libc)Mutexes.
+-* pthread_mutex_trylock: (libc)Mutexes.
+-* pthread_mutex_unlock: (libc)Mutexes.
+-* pthread_mutexattr_destroy: (libc)Mutexes.
+-* pthread_mutexattr_getkind_np: (libc)Mutexes.
+-* pthread_mutexattr_init: (libc)Mutexes.
+-* pthread_mutexattr_setkind_np: (libc)Mutexes.
+-* pthread_once: (libc)Miscellaneous Thread Functions.
+-* pthread_self: (libc)Miscellaneous Thread Functions.
+-* pthread_setcancelstate: (libc)Cancellation.
+-* pthread_setcanceltype: (libc)Cancellation.
+-* pthread_setschedparam: (libc)Miscellaneous Thread Functions.
+-* pthread_setspecific: (libc)Thread-Specific Data.
+-* pthread_sigmask: (libc)Threads and Signal Handling.
+-* pthread_testcancel: (libc)Cancellation.
+-* ptsname: (libc)Allocation.
+-* ptsname_r: (libc)Allocation.
+-* putc: (libc)Simple Output.
+-* putchar: (libc)Simple Output.
+-* putenv: (libc)Environment Access.
+-* putpwent: (libc)Writing a User Entry.
+-* puts: (libc)Simple Output.
+-* pututline: (libc)Manipulating the Database.
+-* pututxline: (libc)XPG Functions.
+-* putw: (libc)Simple Output.
+-* pwrite64: (libc)I/O Primitives.
+-* pwrite: (libc)I/O Primitives.
+-* qecvt: (libc)System V Number Conversion.
+-* qecvt_r: (libc)System V Number Conversion.
+-* qfcvt: (libc)System V Number Conversion.
+-* qfcvt_r: (libc)System V Number Conversion.
+-* qgcvt: (libc)System V Number Conversion.
+-* qsort: (libc)Array Sort Function.
+-* raise: (libc)Signaling Yourself.
+-* rand: (libc)ISO Random.
+-* rand_r: (libc)ISO Random.
+-* random: (libc)BSD Random.
+-* read: (libc)I/O Primitives.
+-* readdir: (libc)Reading/Closing Directory.
+-* readdir_r: (libc)Reading/Closing Directory.
+-* readlink: (libc)Symbolic Links.
+-* readv: (libc)Scatter-Gather.
+-* realloc: (libc)Changing Block Size.
+-* recv: (libc)Receiving Data.
+-* recvfrom: (libc)Receiving Datagrams.
+-* recvmsg: (libc)Receiving Datagrams.
+-* regcomp: (libc)POSIX Regexp Compilation.
+-* regerror: (libc)Regexp Cleanup.
+-* regexec: (libc)Matching POSIX Regexps.
+-* regfree: (libc)Regexp Cleanup.
+-* register_printf_function: (libc)Registering New Conversions.
+-* remainder: (libc)Remainder Functions.
+-* remainderf: (libc)Remainder Functions.
+-* remainderl: (libc)Remainder Functions.
+-* remove: (libc)Deleting Files.
+-* rename: (libc)Renaming Files.
+-* rewind: (libc)File Positioning.
+-* rewinddir: (libc)Random Access Directory.
+-* rindex: (libc)Search Functions.
+-* rint: (libc)Rounding Functions.
+-* rintf: (libc)Rounding Functions.
+-* rintl: (libc)Rounding Functions.
+-* rmdir: (libc)Deleting Files.
+-* round: (libc)Rounding Functions.
+-* roundf: (libc)Rounding Functions.
+-* roundl: (libc)Rounding Functions.
+-* scalb: (libc)Normalization Functions.
+-* scalbf: (libc)Normalization Functions.
+-* scalbl: (libc)Normalization Functions.
+-* scalbln: (libc)Normalization Functions.
+-* scalblnf: (libc)Normalization Functions.
+-* scalblnl: (libc)Normalization Functions.
+-* scalbn: (libc)Normalization Functions.
+-* scalbnf: (libc)Normalization Functions.
+-* scalbnl: (libc)Normalization Functions.
+-* scandir64: (libc)Scanning Directory Content.
+-* scandir: (libc)Scanning Directory Content.
+-* scanf: (libc)Formatted Input Functions.
+-* seed48: (libc)SVID Random.
+-* seed48_r: (libc)SVID Random.
+-* seekdir: (libc)Random Access Directory.
+-* select: (libc)Waiting for I/O.
+-* sem_destroy: (libc)POSIX Semaphores.
+-* sem_getvalue: (libc)POSIX Semaphores.
+-* sem_init: (libc)POSIX Semaphores.
+-* sem_post: (libc)POSIX Semaphores.
+-* sem_trywait: (libc)POSIX Semaphores.
+-* sem_wait: (libc)POSIX Semaphores.
+-* send: (libc)Sending Data.
+-* sendmsg: (libc)Receiving Datagrams.
+-* sendto: (libc)Sending Datagrams.
+-* setbuf: (libc)Controlling Buffering.
+-* setbuffer: (libc)Controlling Buffering.
+-* setegid: (libc)Setting Groups.
+-* setenv: (libc)Environment Access.
+-* seteuid: (libc)Setting User ID.
+-* setfsent: (libc)Filesystem handling.
+-* setgid: (libc)Setting Groups.
+-* setgrent: (libc)Scanning All Groups.
+-* setgroups: (libc)Setting Groups.
+-* sethostent: (libc)Host Names.
+-* sethostid: (libc)Host Identification.
+-* sethostname: (libc)Host Identification.
+-* setitimer: (libc)Setting an Alarm.
+-* setjmp: (libc)Non-Local Details.
+-* setkey: (libc)DES Encryption.
+-* setkey_r: (libc)DES Encryption.
+-* setlinebuf: (libc)Controlling Buffering.
+-* setlocale: (libc)Setting the Locale.
+-* setmntent: (libc)Filesystem handling.
+-* setnetent: (libc)Networks Database.
+-* setnetgrent: (libc)Lookup Netgroup.
+-* setpgid: (libc)Process Group Functions.
+-* setpgrp: (libc)Process Group Functions.
+-* setpriority: (libc)Priority.
+-* setprotoent: (libc)Protocols Database.
+-* setpwent: (libc)Scanning All Users.
+-* setregid: (libc)Setting Groups.
+-* setreuid: (libc)Setting User ID.
+-* setrlimit64: (libc)Limits on Resources.
+-* setrlimit: (libc)Limits on Resources.
+-* setservent: (libc)Services Database.
+-* setsid: (libc)Process Group Functions.
+-* setsockopt: (libc)Socket Option Functions.
+-* setstate: (libc)BSD Random.
+-* settimeofday: (libc)High-Resolution Calendar.
+-* setuid: (libc)Setting User ID.
+-* setutent: (libc)Manipulating the Database.
+-* setutxent: (libc)XPG Functions.
+-* setvbuf: (libc)Controlling Buffering.
+-* shutdown: (libc)Closing a Socket.
+-* sigaction: (libc)Advanced Signal Handling.
+-* sigaddset: (libc)Signal Sets.
+-* sigaltstack: (libc)Signal Stack.
+-* sigblock: (libc)Blocking in BSD.
+-* sigdelset: (libc)Signal Sets.
+-* sigemptyset: (libc)Signal Sets.
+-* sigfillset: (libc)Signal Sets.
+-* siginterrupt: (libc)BSD Handler.
+-* sigismember: (libc)Signal Sets.
+-* siglongjmp: (libc)Non-Local Exits and Signals.
+-* sigmask: (libc)Blocking in BSD.
+-* signal: (libc)Basic Signal Handling.
+-* signbit: (libc)FP Bit Twiddling.
+-* significand: (libc)Normalization Functions.
+-* significandf: (libc)Normalization Functions.
+-* significandl: (libc)Normalization Functions.
+-* sigpause: (libc)Blocking in BSD.
+-* sigpending: (libc)Checking for Pending Signals.
+-* sigprocmask: (libc)Process Signal Mask.
+-* sigsetjmp: (libc)Non-Local Exits and Signals.
+-* sigsetmask: (libc)Blocking in BSD.
+-* sigstack: (libc)Signal Stack.
+-* sigsuspend: (libc)Sigsuspend.
+-* sigvec: (libc)BSD Handler.
+-* sigwait: (libc)Threads and Signal Handling.
+-* sin: (libc)Trig Functions.
+-* sincos: (libc)Trig Functions.
+-* sincosf: (libc)Trig Functions.
+-* sincosl: (libc)Trig Functions.
+-* sinf: (libc)Trig Functions.
+-* sinh: (libc)Hyperbolic Functions.
+-* sinhf: (libc)Hyperbolic Functions.
+-* sinhl: (libc)Hyperbolic Functions.
+-* sinl: (libc)Trig Functions.
+-* sleep: (libc)Sleeping.
+-* snprintf: (libc)Formatted Output Functions.
+-* socket: (libc)Creating a Socket.
+-* socketpair: (libc)Socket Pairs.
+-* sprintf: (libc)Formatted Output Functions.
+-* sqrt: (libc)Exponents and Logarithms.
+-* sqrtf: (libc)Exponents and Logarithms.
+-* sqrtl: (libc)Exponents and Logarithms.
+-* srand48: (libc)SVID Random.
+-* srand48_r: (libc)SVID Random.
+-* srand: (libc)ISO Random.
+-* srandom: (libc)BSD Random.
+-* sscanf: (libc)Formatted Input Functions.
+-* ssignal: (libc)Basic Signal Handling.
+-* stat64: (libc)Reading Attributes.
+-* stat: (libc)Reading Attributes.
+-* stpcpy: (libc)Copying and Concatenation.
+-* stpncpy: (libc)Copying and Concatenation.
+-* strcasecmp: (libc)String/Array Comparison.
+-* strcat: (libc)Copying and Concatenation.
+-* strchr: (libc)Search Functions.
+-* strcmp: (libc)String/Array Comparison.
+-* strcoll: (libc)Collation Functions.
+-* strcpy: (libc)Copying and Concatenation.
+-* strcspn: (libc)Search Functions.
+-* strdup: (libc)Copying and Concatenation.
+-* strdupa: (libc)Copying and Concatenation.
+-* strerror: (libc)Error Messages.
+-* strerror_r: (libc)Error Messages.
+-* strfmon: (libc)Formatting Numbers.
+-* strftime: (libc)Formatting Date and Time.
+-* strlen: (libc)String Length.
+-* strncasecmp: (libc)String/Array Comparison.
+-* strncat: (libc)Copying and Concatenation.
+-* strncmp: (libc)String/Array Comparison.
+-* strncpy: (libc)Copying and Concatenation.
+-* strndup: (libc)Copying and Concatenation.
+-* strndupa: (libc)Copying and Concatenation.
+-* strnlen: (libc)String Length.
+-* strpbrk: (libc)Search Functions.
+-* strptime: (libc)Low-Level Time String Parsing.
+-* strrchr: (libc)Search Functions.
+-* strsep: (libc)Finding Tokens in a String.
+-* strsignal: (libc)Signal Messages.
+-* strspn: (libc)Search Functions.
+-* strstr: (libc)Search Functions.
+-* strtod: (libc)Parsing of Floats.
+-* strtof: (libc)Parsing of Floats.
+-* strtok: (libc)Finding Tokens in a String.
+-* strtok_r: (libc)Finding Tokens in a String.
+-* strtol: (libc)Parsing of Integers.
+-* strtold: (libc)Parsing of Floats.
+-* strtoll: (libc)Parsing of Integers.
+-* strtoq: (libc)Parsing of Integers.
+-* strtoul: (libc)Parsing of Integers.
+-* strtoull: (libc)Parsing of Integers.
+-* strtouq: (libc)Parsing of Integers.
+-* strverscmp: (libc)String/Array Comparison.
+-* strxfrm: (libc)Collation Functions.
+-* symlink: (libc)Symbolic Links.
+-* sync: (libc)Synchronizing I/O.
+-* sysconf: (libc)Sysconf Definition.
+-* system: (libc)Running a Command.
+-* sysv_signal: (libc)Basic Signal Handling.
+-* tan: (libc)Trig Functions.
+-* tanf: (libc)Trig Functions.
+-* tanh: (libc)Hyperbolic Functions.
+-* tanhf: (libc)Hyperbolic Functions.
+-* tanhl: (libc)Hyperbolic Functions.
+-* tanl: (libc)Trig Functions.
+-* tcdrain: (libc)Line Control.
+-* tcflow: (libc)Line Control.
+-* tcflush: (libc)Line Control.
+-* tcgetattr: (libc)Mode Functions.
+-* tcgetpgrp: (libc)Terminal Access Functions.
+-* tcgetsid: (libc)Terminal Access Functions.
+-* tcsendbreak: (libc)Line Control.
+-* tcsetattr: (libc)Mode Functions.
+-* tcsetpgrp: (libc)Terminal Access Functions.
+-* tdelete: (libc)Tree Search Function.
+-* tdestroy: (libc)Tree Search Function.
+-* telldir: (libc)Random Access Directory.
+-* tempnam: (libc)Temporary Files.
+-* textdomain: (libc)Locating gettext catalog.
+-* tfind: (libc)Tree Search Function.
+-* tgamma: (libc)Special Functions.
+-* tgammaf: (libc)Special Functions.
+-* tgammal: (libc)Special Functions.
+-* time: (libc)Simple Calendar Time.
+-* times: (libc)Detailed CPU Time.
+-* tmpfile64: (libc)Temporary Files.
+-* tmpfile: (libc)Temporary Files.
+-* tmpnam: (libc)Temporary Files.
+-* tmpnam_r: (libc)Temporary Files.
+-* toascii: (libc)Case Conversion.
+-* tolower: (libc)Case Conversion.
+-* toupper: (libc)Case Conversion.
+-* towctrans: (libc)Wide Character Case Conversion.
+-* towlower: (libc)Wide Character Case Conversion.
+-* towupper: (libc)Wide Character Case Conversion.
+-* trunc: (libc)Rounding Functions.
+-* truncate64: (libc)Truncating Files.
+-* truncate: (libc)File Size.
+-* truncate: (libc)Truncating Files.
+-* truncf: (libc)Rounding Functions.
+-* truncl: (libc)Rounding Functions.
+-* tsearch: (libc)Tree Search Function.
+-* ttyname: (libc)Is It a Terminal.
+-* ttyname_r: (libc)Is It a Terminal.
+-* twalk: (libc)Tree Search Function.
+-* tzset: (libc)Time Zone Functions.
+-* umask: (libc)Setting Permissions.
+-* uname: (libc)Hardware/Software Type ID.
+-* ungetc: (libc)How Unread.
+-* unlink: (libc)Deleting Files.
+-* unlockpt: (libc)Allocation.
+-* unsetenv: (libc)Environment Access.
+-* updwtmp: (libc)Manipulating the Database.
+-* utime: (libc)File Times.
+-* utimes: (libc)File Times.
+-* utmpname: (libc)Manipulating the Database.
+-* va_arg: (libc)Argument Macros.
+-* va_end: (libc)Argument Macros.
+-* va_start: (libc)Argument Macros.
+-* va_start: (libc)Old Varargs.
+-* valloc: (libc)Aligned Memory Blocks.
+-* vasprintf: (libc)Variable Arguments Output.
+-* versionsort64: (libc)Scanning Directory Content.
+-* versionsort: (libc)Scanning Directory Content.
+-* vfork: (libc)Creating a Process.
+-* vfprintf: (libc)Variable Arguments Output.
+-* vfscanf: (libc)Variable Arguments Input.
+-* vprintf: (libc)Variable Arguments Output.
+-* vscanf: (libc)Variable Arguments Input.
+-* vsnprintf: (libc)Variable Arguments Output.
+-* vsprintf: (libc)Variable Arguments Output.
+-* vsscanf: (libc)Variable Arguments Input.
+-* wait3: (libc)BSD Wait Functions.
+-* wait4: (libc)Process Completion.
+-* wait: (libc)Process Completion.
+-* waitpid: (libc)Process Completion.
+-* wcrtomb: (libc)Converting a Character.
+-* wcsnrtombs: (libc)Converting Strings.
+-* wcsrtombs: (libc)Converting Strings.
+-* wcstombs: (libc)Non-reentrant String Conversion.
+-* wctob: (libc)Converting a Character.
+-* wctomb: (libc)Non-reentrant Character Conversion.
+-* wctrans: (libc)Wide Character Case Conversion.
+-* wctype: (libc)Classification of Wide Characters.
+-* wordexp: (libc)Calling Wordexp.
+-* wordfree: (libc)Calling Wordexp.
+-* write: (libc)I/O Primitives.
+-* writev: (libc)Scatter-Gather.
+-* y0: (libc)Special Functions.
+-* y0f: (libc)Special Functions.
+-* y0l: (libc)Special Functions.
+-* y1: (libc)Special Functions.
+-* y1f: (libc)Special Functions.
+-* y1l: (libc)Special Functions.
+-* yn: (libc)Special Functions.
+-* ynf: (libc)Special Functions.
+-* ynl: (libc)Special Functions.
+-END-INFO-DIR-ENTRY
+diff -Naur ../glibc-2.1.3/manual/dir.c.texi glibc-2.1.3/manual/dir.c.texi
+--- ../glibc-2.1.3/manual/dir.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/dir.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,25 +0,0 @@
+-@group
+-#include <stddef.h>
+-#include <stdio.h>
+-#include <sys/types.h>
+-#include <dirent.h>
+-@end group
+-
+-int
+-main (void)
+-@{
+-  DIR *dp;
+-  struct dirent *ep;
+-
+-  dp = opendir ("./");
+-  if (dp != NULL)
+-    @{
+-      while (ep = readdir (dp))
+-        puts (ep->d_name);
+-      (void) closedir (dp);
+-    @}
+-  else
+-    puts ("Couldn't open the directory.");
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/dir2.c.texi glibc-2.1.3/manual/dir2.c.texi
+--- ../glibc-2.1.3/manual/dir2.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/dir2.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,29 +0,0 @@
+-@group
+-#include <stdio.h>
+-#include <dirent.h>
+-@end group
+-
+-static int
+-one (struct dirent *unused)
+-@{
+-  return 1;
+-@}
+-
+-int
+-main (void)
+-@{
+-  struct dirent **eps;
+-  int n;
+-
+-  n = scandir ("./", &eps, one, alphasort);
+-  if (n >= 0)
+-    @{
+-      int cnt;
+-      for (cnt = 0; cnt < n; ++cnt)
+-        puts (eps[cnt]->d_name);
+-    @}
+-  else
+-    perror ("Couldn't open the directory");
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/filecli.c.texi glibc-2.1.3/manual/filecli.c.texi
+--- ../glibc-2.1.3/manual/filecli.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/filecli.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,54 +0,0 @@
+-#include <stdio.h>
+-#include <errno.h>
+-#include <unistd.h>
+-#include <stdlib.h>
+-#include <sys/socket.h>
+-#include <sys/un.h>
+-
+-#define SERVER  "/tmp/serversocket"
+-#define CLIENT  "/tmp/mysocket"
+-#define MAXMSG  512
+-#define MESSAGE "Yow!!! Are we having fun yet?!?"
+-
+-int
+-main (void)
+-@{
+-  extern int make_named_socket (const char *name);
+-  int sock;
+-  char message[MAXMSG];
+-  struct sockaddr_un name;
+-  size_t size;
+-  int nbytes;
+-
+-  /* @r{Make the socket.} */
+-  sock = make_named_socket (CLIENT);
+-
+-  /* @r{Initialize the server socket address.} */
+-  name.sun_family = AF_LOCAL;
+-  strcpy (name.sun_path, SERVER);
+-  size = strlen (name.sun_path) + sizeof (name.sun_family);
+-
+-  /* @r{Send the datagram.} */
+-  nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
+-                   (struct sockaddr *) & name, size);
+-  if (nbytes < 0)
+-    @{
+-      perror ("sendto (client)");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Wait for a reply.} */
+-  nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
+-  if (nbytes < 0)
+-    @{
+-      perror ("recfrom (client)");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Print a diagnostic message.} */
+-  fprintf (stderr, "Client: got message: %s\n", message);
+-
+-  /* @r{Clean up.} */
+-  remove (CLIENT);
+-  close (sock);
+-@}
+diff -Naur ../glibc-2.1.3/manual/filesrv.c.texi glibc-2.1.3/manual/filesrv.c.texi
+--- ../glibc-2.1.3/manual/filesrv.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/filesrv.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,48 +0,0 @@
+-#include <stdio.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-#include <sys/socket.h>
+-#include <sys/un.h>
+-
+-#define SERVER  "/tmp/serversocket"
+-#define MAXMSG  512
+-
+-int
+-main (void)
+-@{
+-  int sock;
+-  char message[MAXMSG];
+-  struct sockaddr_un name;
+-  size_t size;
+-  int nbytes;
+-
+-  /* @r{Remove the filename first, it's ok if the call fails} */
+-  unlink (SERVER);
+-
+-  /* @r{Make the socket, then loop endlessly.} */
+-  sock = make_named_socket (SERVER);
+-  while (1)
+-    @{
+-      /* @r{Wait for a datagram.} */
+-      size = sizeof (name);
+-      nbytes = recvfrom (sock, message, MAXMSG, 0,
+-                         (struct sockaddr *) & name, &size);
+-      if (nbytes < 0)
+-        @{
+-          perror ("recfrom (server)");
+-          exit (EXIT_FAILURE);
+-        @}
+-
+-      /* @r{Give a diagnostic message.} */
+-      fprintf (stderr, "Server: got message: %s\n", message);
+-
+-      /* @r{Bounce the message back to the sender.} */
+-      nbytes = sendto (sock, message, nbytes, 0,
+-                       (struct sockaddr *) & name, size);
+-      if (nbytes < 0)
+-        @{
+-          perror ("sendto (server)");
+-          exit (EXIT_FAILURE);
+-        @}
+-    @}
+-@}
+diff -Naur ../glibc-2.1.3/manual/fmtmsgexpl.c.texi glibc-2.1.3/manual/fmtmsgexpl.c.texi
+--- ../glibc-2.1.3/manual/fmtmsgexpl.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/fmtmsgexpl.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,12 +0,0 @@
+-#include <fmtmsg.h>
+-
+-int
+-main (void)
+-@{
+-  addseverity (5, "NOTE2");
+-  fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2");
+-  fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual",
+-          "UX:cat:001");
+-  fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag");
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/inetcli.c.texi glibc-2.1.3/manual/inetcli.c.texi
+--- ../glibc-2.1.3/manual/inetcli.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/inetcli.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,59 +0,0 @@
+-#include <stdio.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-#include <unistd.h>
+-#include <sys/types.h>
+-#include <sys/socket.h>
+-#include <netinet/in.h>
+-#include <netdb.h>
+-
+-#define PORT            5555
+-#define MESSAGE         "Yow!!! Are we having fun yet?!?"
+-#define SERVERHOST      "mescaline.gnu.org"
+-
+-void 
+-write_to_server (int filedes)
+-@{
+-  int nbytes;
+-
+-  nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
+-  if (nbytes < 0)
+-    @{
+-      perror ("write");
+-      exit (EXIT_FAILURE);
+-    @}
+-@}
+-
+-
+-int
+-main (void)
+-@{
+-  extern void init_sockaddr (struct sockaddr_in *name,
+-                             const char *hostname,
+-                             uint16_t port);
+-  int sock;
+-  struct sockaddr_in servername;
+-
+-  /* @r{Create the socket.} */
+-  sock = socket (PF_INET, SOCK_STREAM, 0);
+-  if (sock < 0)
+-    @{
+-      perror ("socket (client)");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Connect to the server.} */
+-  init_sockaddr (&servername, SERVERHOST, PORT);
+-  if (0 > connect (sock,
+-                   (struct sockaddr *) &servername,
+-                   sizeof (servername)))
+-    @{
+-      perror ("connect (client)");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Send data to the server.} */
+-  write_to_server (sock);
+-  close (sock);
+-  exit (EXIT_SUCCESS);
+-@}
+diff -Naur ../glibc-2.1.3/manual/inetsrv.c.texi glibc-2.1.3/manual/inetsrv.c.texi
+--- ../glibc-2.1.3/manual/inetsrv.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/inetsrv.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,103 +0,0 @@
+-#include <stdio.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-#include <unistd.h>
+-#include <sys/types.h>
+-#include <sys/socket.h>
+-#include <netinet/in.h>
+-#include <netdb.h>
+-
+-#define PORT    5555
+-#define MAXMSG  512
+-
+-int
+-read_from_client (int filedes)
+-@{
+-  char buffer[MAXMSG];
+-  int nbytes;
+-
+-  nbytes = read (filedes, buffer, MAXMSG);
+-  if (nbytes < 0)
+-    @{
+-      /* @r{Read error.} */
+-      perror ("read");
+-      exit (EXIT_FAILURE);
+-    @}
+-  else if (nbytes == 0)
+-    /* @r{End-of-file.} */
+-    return -1;
+-  else
+-    @{
+-      /* @r{Data read.} */
+-      fprintf (stderr, "Server: got message: `%s'\n", buffer);
+-      return 0;
+-    @}
+-@}
+-
+-int
+-main (void)
+-@{
+-  extern int make_socket (uint16_t port);
+-  int sock;
+-  fd_set active_fd_set, read_fd_set;
+-  int i;
+-  struct sockaddr_in clientname;
+-  size_t size;
+-
+-  /* @r{Create the socket and set it up to accept connections.} */
+-  sock = make_socket (PORT);
+-  if (listen (sock, 1) < 0)
+-    @{
+-      perror ("listen");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Initialize the set of active sockets.} */
+-  FD_ZERO (&active_fd_set);
+-  FD_SET (sock, &active_fd_set);
+-
+-  while (1)
+-    @{
+-      /* @r{Block until input arrives on one or more active sockets.} */
+-      read_fd_set = active_fd_set;
+-      if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
+-        @{
+-          perror ("select");
+-          exit (EXIT_FAILURE);
+-        @}
+-
+-      /* @r{Service all the sockets with input pending.} */
+-      for (i = 0; i < FD_SETSIZE; ++i)
+-        if (FD_ISSET (i, &read_fd_set))
+-          @{
+-            if (i == sock)
+-              @{
+-                /* @r{Connection request on original socket.} */
+-                int new;
+-                size = sizeof (clientname);
+-                new = accept (sock,
+-                              (struct sockaddr *) &clientname,
+-                              &size);
+-                if (new < 0)
+-                  @{
+-                    perror ("accept");
+-                    exit (EXIT_FAILURE);
+-                  @}
+-                fprintf (stderr,
+-                         "Server: connect from host %s, port %hd.\n",
+-                         inet_ntoa (clientname.sin_addr),
+-                         ntohs (clientname.sin_port));
+-                FD_SET (new, &active_fd_set);
+-              @}
+-            else
+-              @{
+-                /* @r{Data arriving on an already-connected socket.} */
+-                if (read_from_client (i) < 0)
+-                  @{
+-                    close (i);
+-                    FD_CLR (i, &active_fd_set);
+-                  @}
+-              @}
+-          @}
+-    @}
+-@}
+diff -Naur ../glibc-2.1.3/manual/isockad.c.texi glibc-2.1.3/manual/isockad.c.texi
+--- ../glibc-2.1.3/manual/isockad.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/isockad.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,23 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <sys/socket.h>
+-#include <netinet/in.h>
+-#include <netdb.h>
+-
+-void 
+-init_sockaddr (struct sockaddr_in *name,
+-               const char *hostname,
+-               uint16_t port)
+-@{
+-  struct hostent *hostinfo;
+-
+-  name->sin_family = AF_INET;
+-  name->sin_port = htons (port);
+-  hostinfo = gethostbyname (hostname);
+-  if (hostinfo == NULL) 
+-    @{
+-      fprintf (stderr, "Unknown host %s.\n", hostname);
+-      exit (EXIT_FAILURE);
+-    @}
+-  name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
+-@}
+diff -Naur ../glibc-2.1.3/manual/libc.cp glibc-2.1.3/manual/libc.cp
+--- ../glibc-2.1.3/manual/libc.cp	2000-01-05 19:19:29.000000000 -0800
++++ glibc-2.1.3/manual/libc.cp	1969-12-31 16:00:00.000000000 -0800
+@@ -1,939 +0,0 @@
+-\entry{library}{1}{library}
+-\entry{standards}{1}{standards}
+-\entry{ISO C}{2}{ISO C}
+-\entry{POSIX}{2}{POSIX}
+-\entry{POSIX.1}{2}{POSIX.1}
+-\entry{IEEE Std 1003.1}{2}{IEEE Std 1003.1}
+-\entry{ISO/IEC 9945-1}{2}{ISO/IEC 9945-1}
+-\entry{POSIX.2}{2}{POSIX.2}
+-\entry{IEEE Std 1003.2}{2}{IEEE Std 1003.2}
+-\entry{ISO/IEC 9945-2}{2}{ISO/IEC 9945-2}
+-\entry{BSD Unix}{3}{BSD Unix}
+-\entry{4.n BSD Unix}{3}{4.\var {n} BSD Unix}
+-\entry{Berkeley Unix}{3}{Berkeley Unix}
+-\entry{SunOS}{3}{SunOS}
+-\entry{Unix, Berkeley}{3}{Unix, Berkeley}
+-\entry{SVID}{3}{SVID}
+-\entry{System V Unix}{3}{System V Unix}
+-\entry{Unix, System V}{3}{Unix, System V}
+-\entry{header files}{4}{header files}
+-\entry{definition (compared to declaration)}{4}{definition (compared to declaration)}
+-\entry{declaration (compared to definition)}{4}{declaration (compared to definition)}
+-\entry{shadowing functions with macros}{5}{shadowing functions with macros}
+-\entry{removing macros that shadow functions}{5}{removing macros that shadow functions}
+-\entry{undefining macros that shadow functions}{5}{undefining macros that shadow functions}
+-\entry{reserved names}{5}{reserved names}
+-\entry{name space}{5}{name space}
+-\entry{feature test macros}{7}{feature test macros}
+-\entry{BSD compatibility library.}{8}{BSD compatibility library.}
+-\entry{error reporting}{15}{error reporting}
+-\entry{reporting errors}{15}{reporting errors}
+-\entry{error codes}{15}{error codes}
+-\entry{status codes}{15}{status codes}
+-\entry{program name}{28}{program name}
+-\entry{name of running program}{28}{name of running program}
+-\entry{memory allocation}{31}{memory allocation}
+-\entry{storage allocation}{31}{storage allocation}
+-\entry{dynamic allocation}{31}{dynamic allocation}
+-\entry{static allocation}{31}{static allocation}
+-\entry{automatic allocation}{31}{automatic allocation}
+-\entry{unconstrained storage allocation}{32}{unconstrained storage allocation}
+-\entry{malloc function}{32}{\code {malloc} function}
+-\entry{heap, dynamic allocation from}{32}{heap, dynamic allocation from}
+-\entry{allocation of memory with malloc}{32}{allocation of memory with \code {malloc}}
+-\entry{freeing memory allocated with malloc}{34}{freeing memory allocated with \code {malloc}}
+-\entry{heap, freeing memory from}{34}{heap, freeing memory from}
+-\entry{changing the size of a block (malloc)}{34}{changing the size of a block (\code {malloc})}
+-\entry{efficiency and malloc}{36}{efficiency and \code {malloc}}
+-\entry{page boundary}{36}{page boundary}
+-\entry{alignment (with malloc)}{36}{alignment (with \code {malloc})}
+-\entry{heap consistency checking}{37}{heap consistency checking}
+-\entry{consistency checking, of heap}{37}{consistency checking, of heap}
+-\entry{allocation hooks, for malloc}{39}{allocation hooks, for \code {malloc}}
+-\entry{allocation statistics}{41}{allocation statistics}
+-\entry{allocation debugging}{43}{allocation debugging}
+-\entry{malloc debugger}{43}{malloc debugger}
+-\entry{obstacks}{47}{obstacks}
+-\entry{allocation (obstacks)}{48}{allocation (obstacks)}
+-\entry{freeing (obstacks)}{50}{freeing (obstacks)}
+-\entry{macros}{50}{macros}
+-\entry{growing objects (in obstacks)}{51}{growing objects (in obstacks)}
+-\entry{changing the size of a block (obstacks)}{51}{changing the size of a block (obstacks)}
+-\entry{shrinking objects}{52}{shrinking objects}
+-\entry{efficiency and obstacks}{52}{efficiency and obstacks}
+-\entry{obstack status}{54}{obstack status}
+-\entry{status of obstack}{54}{status of obstack}
+-\entry{alignment (in obstacks)}{55}{alignment (in obstacks)}
+-\entry{efficiency of chunks}{55}{efficiency of chunks}
+-\entry{chunks}{55}{chunks}
+-\entry{automatic freeing}{57}{automatic freeing}
+-\entry{alloca function}{57}{\code {alloca} function}
+-\entry{automatic storage with variable size}{57}{automatic storage with variable size}
+-\entry{longjmp}{58}{longjmp}
+-\entry{alloca disadvantages}{59}{\code {alloca} disadvantages}
+-\entry{disadvantages of alloca}{59}{disadvantages of \code {alloca}}
+-\entry{variable-sized arrays}{59}{variable-sized arrays}
+-\entry{character testing}{61}{character testing}
+-\entry{classification of characters}{61}{classification of characters}
+-\entry{predicates on characters}{61}{predicates on characters}
+-\entry{character predicates}{61}{character predicates}
+-\entry{lower-case character}{61}{lower-case character}
+-\entry{upper-case character}{61}{upper-case character}
+-\entry{alphabetic character}{61}{alphabetic character}
+-\entry{digit character}{62}{digit character}
+-\entry{decimal digit character}{62}{decimal digit character}
+-\entry{alphanumeric character}{62}{alphanumeric character}
+-\entry{hexadecimal digit character}{62}{hexadecimal digit character}
+-\entry{punctuation character}{62}{punctuation character}
+-\entry{whitespace character}{62}{whitespace character}
+-\entry{blank character}{62}{blank character}
+-\entry{graphic character}{62}{graphic character}
+-\entry{printing character}{62}{printing character}
+-\entry{control character}{62}{control character}
+-\entry{ASCII character}{63}{ASCII character}
+-\entry{character case conversion}{63}{character case conversion}
+-\entry{case conversion of characters}{63}{case conversion of characters}
+-\entry{converting case of characters}{63}{converting case of characters}
+-\entry{alphanumeric character}{64}{alphanumeric character}
+-\entry{alphabetic character}{65}{alphabetic character}
+-\entry{control character}{65}{control character}
+-\entry{digit character}{65}{digit character}
+-\entry{graphic character}{65}{graphic character}
+-\entry{lower-case character}{66}{lower-case character}
+-\entry{printing character}{66}{printing character}
+-\entry{punctuation character}{66}{punctuation character}
+-\entry{whitespace character}{66}{whitespace character}
+-\entry{upper-case character}{67}{upper-case character}
+-\entry{hexadecimal digit character}{67}{hexadecimal digit character}
+-\entry{blank character}{67}{blank character}
+-\entry{string, representation of}{71}{string, representation of}
+-\entry{string}{71}{string}
+-\entry{null character}{71}{null character}
+-\entry{string literal}{71}{string literal}
+-\entry{length of string}{71}{length of string}
+-\entry{allocation size of string}{71}{allocation size of string}
+-\entry{size of string}{71}{size of string}
+-\entry{string length}{71}{string length}
+-\entry{string allocation}{71}{string allocation}
+-\entry{copying strings and arrays}{73}{copying strings and arrays}
+-\entry{string copy functions}{73}{string copy functions}
+-\entry{array copy functions}{73}{array copy functions}
+-\entry{concatenating strings}{73}{concatenating strings}
+-\entry{string concatenation functions}{73}{string concatenation functions}
+-\entry{{\_}{\_}va{\_}copy}{77}{__va_copy}
+-\entry{va{\_}copy}{77}{va_copy}
+-\entry{comparing strings and arrays}{80}{comparing strings and arrays}
+-\entry{string comparison functions}{80}{string comparison functions}
+-\entry{array comparison functions}{80}{array comparison functions}
+-\entry{predicates on strings}{80}{predicates on strings}
+-\entry{predicates on arrays}{80}{predicates on arrays}
+-\entry{collating strings}{83}{collating strings}
+-\entry{string collation functions}{83}{string collation functions}
+-\entry{converting string to collation order}{84}{converting string to collation order}
+-\entry{search functions (for strings)}{86}{search functions (for strings)}
+-\entry{string search functions}{86}{string search functions}
+-\entry{tokenizing strings}{88}{tokenizing strings}
+-\entry{breaking a string into tokens}{88}{breaking a string into tokens}
+-\entry{parsing tokens from a string}{88}{parsing tokens from a string}
+-\entry{argz vectors (string vectors)}{93}{argz vectors (string vectors)}
+-\entry{string vectors, null-character separated}{93}{string vectors, null-character separated}
+-\entry{argument vectors, null-character separated}{93}{argument vectors, null-character separated}
+-\entry{envz vectors (environment vectors)}{93}{envz vectors (environment vectors)}
+-\entry{environment vectors, null-character separated}{93}{environment vectors, null-character separated}
+-\entry{internal representation}{97}{internal representation}
+-\entry{wide character}{97}{wide character}
+-\entry{Unicode}{97}{Unicode}
+-\entry{ISO 10646}{97}{ISO 10646}
+-\entry{UCS2}{97}{UCS2}
+-\entry{UCS4}{97}{UCS4}
+-\entry{multibyte character}{99}{multibyte character}
+-\entry{EBCDIC}{99}{EBCDIC}
+-\entry{ISO 2022}{99}{ISO 2022}
+-\entry{EUC}{99}{EUC}
+-\entry{SJIS}{99}{SJIS}
+-\entry{ISO 6937}{100}{ISO 6937}
+-\entry{UTF-8}{100}{UTF-8}
+-\entry{UTF-7}{100}{UTF-7}
+-\entry{stateful}{102}{stateful}
+-\entry{shift state}{102}{shift state}
+-\entry{stateful}{105}{stateful}
+-\entry{stateful}{110}{stateful}
+-\entry{stateful}{121}{stateful}
+-\entry{stateful}{124}{stateful}
+-\entry{triangulation}{126}{triangulation}
+-\entry{ISO-2022-JP}{127}{ISO-2022-JP}
+-\entry{EUC-JP}{127}{EUC-JP}
+-\entry{stateful}{135}{stateful}
+-\entry{internationalization}{141}{internationalization}
+-\entry{locales}{141}{locales}
+-\entry{combining locales}{142}{combining locales}
+-\entry{categories for locales}{142}{categories for locales}
+-\entry{locale categories}{142}{locale categories}
+-\entry{changing the locale}{143}{changing the locale}
+-\entry{locale, changing}{143}{locale, changing}
+-\entry{monetary value formatting}{146}{monetary value formatting}
+-\entry{numeric value formatting}{146}{numeric value formatting}
+-\entry{decimal-point separator}{146}{decimal-point separator}
+-\entry{grouping of digits}{146}{grouping of digits}
+-\entry{currency symbols}{147}{currency symbols}
+-\entry{NLSPATH environment variable}{160}{NLSPATH environment variable}
+-\entry{LC{\_}ALL environment variable}{161}{LC_ALL environment variable}
+-\entry{LC{\_}MESSAGES environment variable}{161}{LC_MESSAGES environment variable}
+-\entry{LANG environment variable}{161}{LANG environment variable}
+-\entry{gencat}{164}{gencat}
+-\entry{Comparison Function}{177}{Comparison Function}
+-\entry{search function (for arrays)}{177}{search function (for arrays)}
+-\entry{binary search function (for arrays)}{177}{binary search function (for arrays)}
+-\entry{array search function}{177}{array search function}
+-\entry{sort function (for arrays)}{178}{sort function (for arrays)}
+-\entry{quick sort function (for arrays)}{178}{quick sort function (for arrays)}
+-\entry{array sort function}{178}{array sort function}
+-\entry{stable sorting}{178}{stable sorting}
+-\entry{Kermit the frog}{181}{Kermit the frog}
+-\entry{globbing}{188}{globbing}
+-\entry{word expansion}{198}{word expansion}
+-\entry{expansion of shell words}{198}{expansion of shell words}
+-\entry{tilde expansion}{199}{tilde expansion}
+-\entry{variable substitution}{199}{variable substitution}
+-\entry{substitution of variables and commands}{199}{substitution of variables and commands}
+-\entry{command substitution}{199}{command substitution}
+-\entry{arithmetic expansion}{199}{arithmetic expansion}
+-\entry{field splitting}{199}{field splitting}
+-\entry{wildcard expansion}{199}{wildcard expansion}
+-\entry{quote removal}{199}{quote removal}
+-\entry{removal of quotes}{199}{removal of quotes}
+-\entry{opening a file}{205}{opening a file}
+-\entry{file position}{206}{file position}
+-\entry{sequential-access files}{206}{sequential-access files}
+-\entry{random-access files}{206}{random-access files}
+-\entry{append-access files}{207}{append-access files}
+-\entry{file name}{207}{file name}
+-\entry{directory}{207}{directory}
+-\entry{link}{207}{link}
+-\entry{directory entry}{207}{directory entry}
+-\entry{file name component}{207}{file name component}
+-\entry{file name resolution}{208}{file name resolution}
+-\entry{root directory}{208}{root directory}
+-\entry{absolute file name}{208}{absolute file name}
+-\entry{relative file name}{208}{relative file name}
+-\entry{parent directory}{208}{parent directory}
+-\entry{file name errors}{208}{file name errors}
+-\entry{usual file name errors}{208}{usual file name errors}
+-\entry{file pointer}{211}{file pointer}
+-\entry{standard streams}{211}{standard streams}
+-\entry{streams, standard}{211}{streams, standard}
+-\entry{standard input stream}{211}{standard input stream}
+-\entry{standard output stream}{211}{standard output stream}
+-\entry{standard error stream}{212}{standard error stream}
+-\entry{opening a stream}{212}{opening a stream}
+-\entry{closing a stream}{214}{closing a stream}
+-\entry{writing to a stream, by characters}{215}{writing to a stream, by characters}
+-\entry{reading from a stream, by characters}{216}{reading from a stream, by characters}
+-\entry{peeking at input}{219}{peeking at input}
+-\entry{unreading characters}{219}{unreading characters}
+-\entry{pushing input back}{219}{pushing input back}
+-\entry{binary I/O to a stream}{221}{binary I/O to a stream}
+-\entry{block I/O to a stream}{221}{block I/O to a stream}
+-\entry{reading from a stream, by blocks}{221}{reading from a stream, by blocks}
+-\entry{writing to a stream, by blocks}{221}{writing to a stream, by blocks}
+-\entry{format string, for printf}{221}{format string, for \code {printf}}
+-\entry{template, for printf}{221}{template, for \code {printf}}
+-\entry{formatted output to a stream}{221}{formatted output to a stream}
+-\entry{writing to a stream, formatted}{221}{writing to a stream, formatted}
+-\entry{conversion specifications (printf)}{222}{conversion specifications (\code {printf})}
+-\entry{flag character (printf)}{223}{flag character (\code {printf})}
+-\entry{minimum field width (printf)}{223}{minimum field width (\code {printf})}
+-\entry{precision (printf)}{223}{precision (\code {printf})}
+-\entry{type modifier character (printf)}{224}{type modifier character (\code {printf})}
+-\entry{output conversions, for printf}{224}{output conversions, for \code {printf}}
+-\entry{parsing a template string}{234}{parsing a template string}
+-\entry{customizing printf}{237}{customizing \code {printf}}
+-\entry{defining new printf conversions}{237}{defining new \code {printf} conversions}
+-\entry{extending printf}{237}{extending \code {printf}}
+-\entry{formatted input from a stream}{242}{formatted input from a stream}
+-\entry{reading from a stream, formatted}{242}{reading from a stream, formatted}
+-\entry{format string, for scanf}{242}{format string, for \code {scanf}}
+-\entry{template, for scanf}{242}{template, for \code {scanf}}
+-\entry{conversion specifications (scanf)}{243}{conversion specifications (\code {scanf})}
+-\entry{matching failure, in scanf}{243}{matching failure, in \code {scanf}}
+-\entry{flag character (scanf)}{244}{flag character (\code {scanf})}
+-\entry{maximum field width (scanf)}{244}{maximum field width (\code {scanf})}
+-\entry{type modifier character (scanf)}{244}{type modifier character (\code {scanf})}
+-\entry{input conversions, for scanf}{244}{input conversions, for \code {scanf}}
+-\entry{end of file, on a stream}{250}{end of file, on a stream}
+-\entry{text stream}{251}{text stream}
+-\entry{binary stream}{251}{binary stream}
+-\entry{lines (in a text file)}{251}{lines (in a text file)}
+-\entry{file positioning on a stream}{252}{file positioning on a stream}
+-\entry{positioning a stream}{252}{positioning a stream}
+-\entry{seeking on a stream}{252}{seeking on a stream}
+-\entry{buffering of streams}{256}{buffering of streams}
+-\entry{unbuffered stream}{256}{unbuffered stream}
+-\entry{line buffered stream}{257}{line buffered stream}
+-\entry{fully buffered stream}{257}{fully buffered stream}
+-\entry{flushing a stream}{257}{flushing a stream}
+-\entry{buffering, controlling}{257}{buffering, controlling}
+-\entry{stream, for I/O to a string}{259}{stream, for I/O to a string}
+-\entry{string stream}{259}{string stream}
+-\entry{custom streams}{262}{custom streams}
+-\entry{programming your own streams}{262}{programming your own streams}
+-\entry{cookie, for custom stream}{262}{cookie, for custom stream}
+-\entry{hook functions (of custom streams)}{263}{hook functions (of custom streams)}
+-\entry{formatted messages}{264}{formatted messages}
+-\entry{severity class}{266}{severity class}
+-\entry{severity class}{267}{severity class}
+-\entry{opening a file descriptor}{271}{opening a file descriptor}
+-\entry{closing a file descriptor}{271}{closing a file descriptor}
+-\entry{reading from a file descriptor}{275}{reading from a file descriptor}
+-\entry{end-of-file, on a file descriptor}{275}{end-of-file, on a file descriptor}
+-\entry{writing to a file descriptor}{277}{writing to a file descriptor}
+-\entry{file positioning on a file descriptor}{279}{file positioning on a file descriptor}
+-\entry{positioning a file descriptor}{279}{positioning a file descriptor}
+-\entry{seeking on a file descriptor}{279}{seeking on a file descriptor}
+-\entry{sparse files}{280}{sparse files}
+-\entry{holes in files}{280}{holes in files}
+-\entry{streams, and file descriptors}{282}{streams, and file descriptors}
+-\entry{converting file descriptor to stream}{282}{converting file descriptor to stream}
+-\entry{extracting file descriptor from stream}{282}{extracting file descriptor from stream}
+-\entry{standard file descriptors}{283}{standard file descriptors}
+-\entry{file descriptors, standard}{283}{file descriptors, standard}
+-\entry{standard input file descriptor}{283}{standard input file descriptor}
+-\entry{standard output file descriptor}{283}{standard output file descriptor}
+-\entry{standard error file descriptor}{283}{standard error file descriptor}
+-\entry{channels}{283}{channels}
+-\entry{streams and descriptors}{283}{streams and descriptors}
+-\entry{descriptors and streams}{283}{descriptors and streams}
+-\entry{mixing descriptors and streams}{283}{mixing descriptors and streams}
+-\entry{linked channels}{283}{linked channels}
+-\entry{cleaning up a stream}{283}{cleaning up a stream}
+-\entry{independent channels}{284}{independent channels}
+-\entry{scatter-gather}{285}{scatter-gather}
+-\entry{waiting for input or output}{289}{waiting for input or output}
+-\entry{multiplexing input}{289}{multiplexing input}
+-\entry{input from multiple files}{289}{input from multiple files}
+-\entry{file descriptor sets, for select}{289}{file descriptor sets, for \code {select}}
+-\entry{synchronizing}{292}{synchronizing}
+-\entry{synchronizing}{301}{synchronizing}
+-\entry{control operations on files}{305}{control operations on files}
+-\entry{fcntl function}{305}{\code {fcntl} function}
+-\entry{duplicating file descriptors}{306}{duplicating file descriptors}
+-\entry{redirecting input and output}{306}{redirecting input and output}
+-\entry{file descriptor flags}{307}{file descriptor flags}
+-\entry{close-on-exec (file descriptor flag)}{308}{close-on-exec (file descriptor flag)}
+-\entry{file status flags}{309}{file status flags}
+-\entry{file name translation flags}{310}{file name translation flags}
+-\entry{flags, file name translation}{310}{flags, file name translation}
+-\entry{open-time action flags}{310}{open-time action flags}
+-\entry{flags, open-time action}{310}{flags, open-time action}
+-\entry{create on open (file status flag)}{310}{create on open (file status flag)}
+-\entry{non-blocking open}{310}{non-blocking open}
+-\entry{controlling terminal, setting}{311}{controlling terminal, setting}
+-\entry{symbolic link, opening}{311}{symbolic link, opening}
+-\entry{file locks}{314}{file locks}
+-\entry{record locking}{314}{record locking}
+-\entry{exclusive lock}{314}{exclusive lock}
+-\entry{write lock}{314}{write lock}
+-\entry{shared lock}{314}{shared lock}
+-\entry{read lock}{314}{read lock}
+-\entry{interrupt-driven input}{317}{interrupt-driven input}
+-\entry{generic i/o control operations}{318}{generic i/o control operations}
+-\entry{IOCTLs}{318}{IOCTLs}
+-\entry{current working directory}{319}{current working directory}
+-\entry{working directory}{319}{working directory}
+-\entry{change working directory}{319}{change working directory}
+-\entry{accessing directories}{320}{accessing directories}
+-\entry{reading from a directory}{320}{reading from a directory}
+-\entry{directories, accessing}{320}{directories, accessing}
+-\entry{directory stream}{320}{directory stream}
+-\entry{directory hierarchy}{327}{directory hierarchy}
+-\entry{hierarchy, directory}{327}{hierarchy, directory}
+-\entry{tree, directory}{327}{tree, directory}
+-\entry{hard link}{331}{hard link}
+-\entry{link, hard}{331}{link, hard}
+-\entry{multiple names for one file}{331}{multiple names for one file}
+-\entry{file names, multiple}{331}{file names, multiple}
+-\entry{soft link}{332}{soft link}
+-\entry{link, soft}{332}{link, soft}
+-\entry{symbolic link}{332}{symbolic link}
+-\entry{link, symbolic}{332}{link, symbolic}
+-\entry{deleting a file}{333}{deleting a file}
+-\entry{removing a file}{333}{removing a file}
+-\entry{unlinking a file}{333}{unlinking a file}
+-\entry{directories, deleting}{334}{directories, deleting}
+-\entry{deleting a directory}{334}{deleting a directory}
+-\entry{renaming a file}{334}{renaming a file}
+-\entry{creating a directory}{335}{creating a directory}
+-\entry{directories, creating}{335}{directories, creating}
+-\entry{status of a file}{336}{status of a file}
+-\entry{attributes of a file}{336}{attributes of a file}
+-\entry{file attributes}{336}{file attributes}
+-\entry{inode number}{339}{inode number}
+-\entry{file owner}{343}{file owner}
+-\entry{owner of a file}{343}{owner of a file}
+-\entry{group owner of a file}{343}{group owner of a file}
+-\entry{file permission bits}{344}{file permission bits}
+-\entry{sticky bit}{345}{sticky bit}
+-\entry{permission to access a file}{346}{permission to access a file}
+-\entry{access permission for a file}{346}{access permission for a file}
+-\entry{file access permission}{346}{file access permission}
+-\entry{file creation mask}{346}{file creation mask}
+-\entry{umask}{346}{umask}
+-\entry{testing access permission}{348}{testing access permission}
+-\entry{access, testing for}{348}{access, testing for}
+-\entry{setuid programs and file access}{348}{setuid programs and file access}
+-\entry{file access time}{349}{file access time}
+-\entry{file modification time}{349}{file modification time}
+-\entry{file attribute modification time}{349}{file attribute modification time}
+-\entry{creating special files}{352}{creating special files}
+-\entry{special files}{352}{special files}
+-\entry{TMPDIR environment variable}{355}{TMPDIR environment variable}
+-\entry{pipe}{357}{pipe}
+-\entry{FIFO special file}{357}{FIFO special file}
+-\entry{creating a pipe}{357}{creating a pipe}
+-\entry{opening a pipe}{357}{opening a pipe}
+-\entry{interprocess communication, with pipes}{357}{interprocess communication, with pipes}
+-\entry{creating a pipe to a subprocess}{359}{creating a pipe to a subprocess}
+-\entry{pipe to a subprocess}{359}{pipe to a subprocess}
+-\entry{filtering i/o through subprocess}{359}{filtering i/o through subprocess}
+-\entry{creating a FIFO special file}{360}{creating a FIFO special file}
+-\entry{interprocess communication, with FIFO}{360}{interprocess communication, with FIFO}
+-\entry{socket}{363}{socket}
+-\entry{interprocess communication, with sockets}{363}{interprocess communication, with sockets}
+-\entry{communication style (of a socket)}{363}{communication style (of a socket)}
+-\entry{style of communication (of a socket)}{363}{style of communication (of a socket)}
+-\entry{packet}{363}{packet}
+-\entry{byte stream}{363}{byte stream}
+-\entry{stream (sockets)}{363}{stream (sockets)}
+-\entry{loss of data on sockets}{363}{loss of data on sockets}
+-\entry{data loss on sockets}{363}{data loss on sockets}
+-\entry{namespace (of socket)}{363}{namespace (of socket)}
+-\entry{domain (of socket)}{363}{domain (of socket)}
+-\entry{socket namespace}{363}{socket namespace}
+-\entry{socket domain}{363}{socket domain}
+-\entry{network protocol}{363}{network protocol}
+-\entry{protocol (of socket)}{363}{protocol (of socket)}
+-\entry{socket protocol}{363}{socket protocol}
+-\entry{protocol family}{363}{protocol family}
+-\entry{address of socket}{365}{address of socket}
+-\entry{name of socket}{365}{name of socket}
+-\entry{binding a socket address}{365}{binding a socket address}
+-\entry{socket address (name) binding}{365}{socket address (name) binding}
+-\entry{local namespace, for sockets}{369}{local namespace, for sockets}
+-\entry{Internet namespace, for sockets}{371}{Internet namespace, for sockets}
+-\entry{host address, Internet}{373}{host address, Internet}
+-\entry{Internet host address}{373}{Internet host address}
+-\entry{network number}{373}{network number}
+-\entry{local network address number}{373}{local network address number}
+-\entry{standard dot notation, for Internet addresses}{373}{standard dot notation, for Internet addresses}
+-\entry{dot notation, for Internet addresses}{373}{dot notation, for Internet addresses}
+-\entry{hosts database}{377}{hosts database}
+-\entry{converting host name to address}{377}{converting host name to address}
+-\entry{converting host address to name}{377}{converting host address to name}
+-\entry{port number}{381}{port number}
+-\entry{services database}{381}{services database}
+-\entry{converting service name to port number}{381}{converting service name to port number}
+-\entry{converting port number to service name}{381}{converting port number to service name}
+-\entry{byte order conversion, for socket}{382}{byte order conversion, for socket}
+-\entry{converting byte order}{382}{converting byte order}
+-\entry{big-endian}{382}{big-endian}
+-\entry{little-endian}{382}{little-endian}
+-\entry{network byte order}{382}{network byte order}
+-\entry{protocols database}{383}{protocols database}
+-\entry{TCP (Internet protocol)}{383}{TCP (Internet protocol)}
+-\entry{creating a socket}{386}{creating a socket}
+-\entry{socket, creating}{386}{socket, creating}
+-\entry{opening a socket}{386}{opening a socket}
+-\entry{socket, closing}{387}{socket, closing}
+-\entry{closing a socket}{387}{closing a socket}
+-\entry{shutting down a socket}{387}{shutting down a socket}
+-\entry{socket shutdown}{387}{socket shutdown}
+-\entry{creating a socket pair}{387}{creating a socket pair}
+-\entry{socket pair}{387}{socket pair}
+-\entry{opening a socket pair}{387}{opening a socket pair}
+-\entry{connection}{388}{connection}
+-\entry{client}{388}{client}
+-\entry{server}{388}{server}
+-\entry{connecting a socket}{388}{connecting a socket}
+-\entry{socket, connecting}{388}{socket, connecting}
+-\entry{socket, initiating a connection}{388}{socket, initiating a connection}
+-\entry{socket, client actions}{388}{socket, client actions}
+-\entry{listening (sockets)}{390}{listening (sockets)}
+-\entry{sockets, server actions}{390}{sockets, server actions}
+-\entry{sockets, listening}{390}{sockets, listening}
+-\entry{sockets, accepting connections}{390}{sockets, accepting connections}
+-\entry{accepting connections}{390}{accepting connections}
+-\entry{reading from a socket}{392}{reading from a socket}
+-\entry{writing to a socket}{392}{writing to a socket}
+-\entry{out-of-band data}{398}{out-of-band data}
+-\entry{high-priority data}{398}{high-priority data}
+-\entry{urgent socket condition}{398}{urgent socket condition}
+-\entry{datagram socket}{401}{datagram socket}
+-\entry{sending a datagram}{401}{sending a datagram}
+-\entry{transmitting datagrams}{401}{transmitting datagrams}
+-\entry{datagrams, transmitting}{401}{datagrams, transmitting}
+-\entry{receiving datagrams}{401}{receiving datagrams}
+-\entry{socket options}{406}{socket options}
+-\entry{level, for socket options}{406}{level, for socket options}
+-\entry{socket option level}{406}{socket option level}
+-\entry{networks database}{408}{networks database}
+-\entry{converting network number to network name}{408}{converting network number to network name}
+-\entry{converting network name to network number}{408}{converting network name to network number}
+-\entry{terminal identification}{411}{terminal identification}
+-\entry{identifying terminals}{411}{identifying terminals}
+-\entry{terminal input queue}{412}{terminal input queue}
+-\entry{typeahead buffer}{412}{typeahead buffer}
+-\entry{terminal output queue}{412}{terminal output queue}
+-\entry{canonical input processing}{412}{canonical input processing}
+-\entry{noncanonical input processing}{412}{noncanonical input processing}
+-\entry{terminal mode data types}{413}{terminal mode data types}
+-\entry{terminal mode functions}{414}{terminal mode functions}
+-\entry{parity checking}{416}{parity checking}
+-\entry{break condition, detecting}{417}{break condition, detecting}
+-\entry{modem status lines}{419}{modem status lines}
+-\entry{carrier detect}{419}{carrier detect}
+-\entry{modem disconnect}{419}{modem disconnect}
+-\entry{echo of terminal input}{421}{echo of terminal input}
+-\entry{interactive signals, from terminal}{422}{interactive signals, from terminal}
+-\entry{line speed}{423}{line speed}
+-\entry{baud rate}{423}{baud rate}
+-\entry{terminal line speed}{423}{terminal line speed}
+-\entry{terminal line speed}{423}{terminal line speed}
+-\entry{EOF character}{425}{EOF character}
+-\entry{EOL character}{425}{EOL character}
+-\entry{EOL2 character}{425}{EOL2 character}
+-\entry{ERASE character}{426}{ERASE character}
+-\entry{WERASE character}{426}{WERASE character}
+-\entry{KILL character}{426}{KILL character}
+-\entry{REPRINT character}{426}{REPRINT character}
+-\entry{INTR character}{427}{INTR character}
+-\entry{interrupt character}{427}{interrupt character}
+-\entry{QUIT character}{427}{QUIT character}
+-\entry{SUSP character}{427}{SUSP character}
+-\entry{suspend character}{427}{suspend character}
+-\entry{DSUSP character}{427}{DSUSP character}
+-\entry{delayed suspend character}{427}{delayed suspend character}
+-\entry{START character}{428}{START character}
+-\entry{STOP character}{428}{STOP character}
+-\entry{LNEXT character}{428}{LNEXT character}
+-\entry{DISCARD character}{428}{DISCARD character}
+-\entry{STATUS character}{429}{STATUS character}
+-\entry{MIN termios slot}{429}{MIN termios slot}
+-\entry{TIME termios slot}{429}{TIME termios slot}
+-\entry{terminal line control functions}{430}{terminal line control functions}
+-\entry{break condition, generating}{430}{break condition, generating}
+-\entry{flushing terminal output queue}{431}{flushing terminal output queue}
+-\entry{terminal output queue, flushing}{431}{terminal output queue, flushing}
+-\entry{clearing terminal input queue}{431}{clearing terminal input queue}
+-\entry{terminal input queue, clearing}{431}{terminal input queue, clearing}
+-\entry{flow control, terminal}{432}{flow control, terminal}
+-\entry{terminal flow control}{432}{terminal flow control}
+-\entry{pseudo-terminals}{434}{pseudo-terminals}
+-\entry{allocating pseudo-terminals}{434}{allocating pseudo-terminals}
+-\entry{opening a pseudo-terminal pair}{436}{opening a pseudo-terminal pair}
+-\entry{constants}{439}{constants}
+-\entry{mathematical constants}{439}{mathematical constants}
+-\entry{trigonometric functions}{440}{trigonometric functions}
+-\entry{pi (trigonometric constant)}{440}{pi (trigonometric constant)}
+-\entry{complex trigonometric functions}{441}{complex trigonometric functions}
+-\entry{inverse trigonometric functions}{442}{inverse trigonometric functions}
+-\entry{inverse complex trigonometric functions}{442}{inverse complex trigonometric functions}
+-\entry{exponentiation functions}{443}{exponentiation functions}
+-\entry{power functions}{443}{power functions}
+-\entry{logarithm functions}{443}{logarithm functions}
+-\entry{square root function}{445}{square root function}
+-\entry{cube root function}{445}{cube root function}
+-\entry{complex exponentiation functions}{446}{complex exponentiation functions}
+-\entry{complex logarithm functions}{446}{complex logarithm functions}
+-\entry{hyperbolic functions}{447}{hyperbolic functions}
+-\entry{hyperbolic functions}{447}{hyperbolic functions}
+-\entry{inverse hyperbolic functions}{448}{inverse hyperbolic functions}
+-\entry{inverse complex hyperbolic functions}{448}{inverse complex hyperbolic functions}
+-\entry{special functions}{449}{special functions}
+-\entry{Bessel functions}{449}{Bessel functions}
+-\entry{gamma function}{449}{gamma function}
+-\entry{random numbers}{451}{random numbers}
+-\entry{pseudo-random numbers}{451}{pseudo-random numbers}
+-\entry{seed (for random numbers)}{451}{seed (for random numbers)}
+-\entry{Optimization}{457}{Optimization}
+-\entry{floating point}{459}{floating point}
+-\entry{IEEE 754}{459}{IEEE 754}
+-\entry{IEEE floating point}{459}{IEEE floating point}
+-\entry{floating-point classes}{459}{floating-point classes}
+-\entry{classes, floating-point}{459}{classes, floating-point}
+-\entry{exception}{461}{exception}
+-\entry{signal}{461}{signal}
+-\entry{zero divide}{461}{zero divide}
+-\entry{division by zero}{461}{division by zero}
+-\entry{inexact exception}{461}{inexact exception}
+-\entry{invalid exception}{461}{invalid exception}
+-\entry{overflow exception}{461}{overflow exception}
+-\entry{underflow exception}{461}{underflow exception}
+-\entry{infinity}{463}{infinity}
+-\entry{not a number}{463}{not a number}
+-\entry{NaN}{463}{NaN}
+-\entry{errors, mathematical}{465}{errors, mathematical}
+-\entry{domain error}{465}{domain error}
+-\entry{range error}{465}{range error}
+-\entry{absolute value functions}{468}{absolute value functions}
+-\entry{normalization functions (floating-point)}{469}{normalization functions (floating-point)}
+-\entry{converting floats to integers}{471}{converting floats to integers}
+-\entry{FP arithmetic}{473}{FP arithmetic}
+-\entry{NaN}{474}{NaN}
+-\entry{unordered comparison}{474}{unordered comparison}
+-\entry{minimum}{475}{minimum}
+-\entry{maximum}{475}{maximum}
+-\entry{positive difference}{475}{positive difference}
+-\entry{multiply-add}{475}{multiply-add}
+-\entry{butterfly}{476}{butterfly}
+-\entry{complex numbers}{476}{complex numbers}
+-\entry{project complex numbers}{477}{project complex numbers}
+-\entry{conjugate complex numbers}{477}{conjugate complex numbers}
+-\entry{decompose complex numbers}{477}{decompose complex numbers}
+-\entry{integer division functions}{478}{integer division functions}
+-\entry{parsing numbers (in formatted input)}{479}{parsing numbers (in formatted input)}
+-\entry{converting strings to numbers}{479}{converting strings to numbers}
+-\entry{number syntax, parsing}{479}{number syntax, parsing}
+-\entry{syntax, for reading numbers}{479}{syntax, for reading numbers}
+-\entry{parsing numbers and locales}{481}{parsing numbers and locales}
+-\entry{locales, parsing numbers and}{481}{locales, parsing numbers and}
+-\entry{gcvt{\_}r}{485}{gcvt_r}
+-\entry{CPU time}{487}{CPU time}
+-\entry{processor time}{487}{processor time}
+-\entry{clock ticks}{487}{clock ticks}
+-\entry{ticks, clock}{487}{ticks, clock}
+-\entry{time, elapsed CPU}{487}{time, elapsed CPU}
+-\entry{Gregorian calendar}{489}{Gregorian calendar}
+-\entry{time, calendar}{489}{time, calendar}
+-\entry{date and time}{489}{date and time}
+-\entry{calendar time}{489}{calendar time}
+-\entry{high-resolution time}{489}{high-resolution time}
+-\entry{local time}{489}{local time}
+-\entry{broken-down time}{489}{broken-down time}
+-\entry{epoch}{489}{epoch}
+-\entry{broken-down time}{492}{broken-down time}
+-\entry{calendar time and broken-down time}{492}{calendar time and broken-down time}
+-\entry{leap second}{492}{leap second}
+-\entry{Daylight Saving Time}{493}{Daylight Saving Time}
+-\entry{summer time}{493}{summer time}
+-\entry{time zone}{507}{time zone}
+-\entry{time zone database}{509}{time zone database}
+-\entry{time, high precision}{511}{time, high precision}
+-\entry{setting an alarm}{513}{setting an alarm}
+-\entry{interval timer, setting}{513}{interval timer, setting}
+-\entry{alarms, setting}{513}{alarms, setting}
+-\entry{timers, setting}{513}{timers, setting}
+-\entry{real-time timer}{513}{real-time timer}
+-\entry{timer, real-time}{513}{timer, real-time}
+-\entry{virtual timer}{513}{virtual timer}
+-\entry{timer, virtual}{513}{timer, virtual}
+-\entry{profiling timer}{513}{profiling timer}
+-\entry{timer, profiling}{513}{timer, profiling}
+-\entry{resource limits}{518}{resource limits}
+-\entry{limits on resource usage}{518}{limits on resource usage}
+-\entry{usage limits}{518}{usage limits}
+-\entry{soft limit}{519}{soft limit}
+-\entry{hard limit}{520}{hard limit}
+-\entry{process priority}{521}{process priority}
+-\entry{priority of a process}{521}{priority of a process}
+-\entry{non-local exits}{523}{non-local exits}
+-\entry{long jumps}{523}{long jumps}
+-\entry{signal}{527}{signal}
+-\entry{generation of signals}{528}{generation of signals}
+-\entry{delivery of signals}{528}{delivery of signals}
+-\entry{pending signals}{528}{pending signals}
+-\entry{blocked signals}{528}{blocked signals}
+-\entry{specified action (for a signal)}{528}{specified action (for a signal)}
+-\entry{default action (for a signal)}{528}{default action (for a signal)}
+-\entry{signal action}{528}{signal action}
+-\entry{catching signals}{528}{catching signals}
+-\entry{signal names}{529}{signal names}
+-\entry{names of signals}{529}{names of signals}
+-\entry{signal number}{529}{signal number}
+-\entry{program error signals}{529}{program error signals}
+-\entry{exception}{530}{exception}
+-\entry{floating-point exception}{530}{floating-point exception}
+-\entry{illegal instruction}{531}{illegal instruction}
+-\entry{segmentation violation}{531}{segmentation violation}
+-\entry{bus error}{531}{bus error}
+-\entry{abort signal}{532}{abort signal}
+-\entry{program termination signals}{532}{program termination signals}
+-\entry{termination signal}{532}{termination signal}
+-\entry{interrupt signal}{532}{interrupt signal}
+-\entry{quit signal}{533}{quit signal}
+-\entry{quit signal}{533}{quit signal}
+-\entry{kill signal}{533}{kill signal}
+-\entry{hangup signal}{533}{hangup signal}
+-\entry{alarm signal}{534}{alarm signal}
+-\entry{virtual time alarm signal}{534}{virtual time alarm signal}
+-\entry{profiling alarm signal}{534}{profiling alarm signal}
+-\entry{input available signal}{534}{input available signal}
+-\entry{output possible signal}{534}{output possible signal}
+-\entry{urgent data signal}{534}{urgent data signal}
+-\entry{job control signals}{534}{job control signals}
+-\entry{child process signal}{534}{child process signal}
+-\entry{continue signal}{535}{continue signal}
+-\entry{stop signal}{535}{stop signal}
+-\entry{interactive stop signal}{535}{interactive stop signal}
+-\entry{terminal input signal}{535}{terminal input signal}
+-\entry{terminal output signal}{536}{terminal output signal}
+-\entry{pipe signal}{536}{pipe signal}
+-\entry{broken pipe signal}{536}{broken pipe signal}
+-\entry{lost resource signal}{536}{lost resource signal}
+-\entry{user signals}{537}{user signals}
+-\entry{signal messages}{537}{signal messages}
+-\entry{signal actions}{538}{signal actions}
+-\entry{establishing a handler}{538}{establishing a handler}
+-\entry{signal function}{538}{\code {signal} function}
+-\entry{default action for a signal}{539}{default action for a signal}
+-\entry{ignore action for a signal}{539}{ignore action for a signal}
+-\entry{sigaction function}{540}{\code {sigaction} function}
+-\entry{signal flags}{543}{signal flags}
+-\entry{flags for sigaction}{543}{flags for \code {sigaction}}
+-\entry{sigaction flags}{543}{\code {sigaction} flags}
+-\entry{initial signal actions}{544}{initial signal actions}
+-\entry{signal handler function}{544}{signal handler function}
+-\entry{non-local exit, from signal handler}{547}{non-local exit, from signal handler}
+-\entry{race conditions, relating to signals}{548}{race conditions, relating to signals}
+-\entry{handling multiple signals}{549}{handling multiple signals}
+-\entry{successive signals}{549}{successive signals}
+-\entry{merging of signals}{549}{merging of signals}
+-\entry{restrictions on signal handler functions}{551}{restrictions on signal handler functions}
+-\entry{volatile declarations}{552}{\code {volatile} declarations}
+-\entry{reentrant functions}{552}{reentrant functions}
+-\entry{EINTR, and restarting interrupted primitives}{556}{EINTR, and restarting interrupted primitives}
+-\entry{restarting interrupted primitives}{556}{restarting interrupted primitives}
+-\entry{interrupting primitives}{556}{interrupting primitives}
+-\entry{primitives, interrupting}{556}{primitives, interrupting}
+-\entry{sending signals}{556}{sending signals}
+-\entry{raising signals}{556}{raising signals}
+-\entry{signals, generating}{556}{signals, generating}
+-\entry{killing a process}{557}{killing a process}
+-\entry{interprocess communication, with signals}{559}{interprocess communication, with signals}
+-\entry{blocking signals}{560}{blocking signals}
+-\entry{signal set}{561}{signal set}
+-\entry{signal mask}{562}{signal mask}
+-\entry{process signal mask}{562}{process signal mask}
+-\entry{blocking signals, in a handler}{564}{blocking signals, in a handler}
+-\entry{pending signals, checking for}{565}{pending signals, checking for}
+-\entry{blocked signals, checking for}{565}{blocked signals, checking for}
+-\entry{checking for pending signals}{565}{checking for pending signals}
+-\entry{timing error in signal handling}{567}{timing error in signal handling}
+-\entry{waiting for a signal}{567}{waiting for a signal}
+-\entry{pause function}{567}{\code {pause} function}
+-\entry{process}{575}{process}
+-\entry{program arguments}{575}{program arguments}
+-\entry{command line arguments}{575}{command line arguments}
+-\entry{arguments, to program}{575}{arguments, to program}
+-\entry{program startup}{575}{program startup}
+-\entry{startup of program}{575}{startup of program}
+-\entry{invocation of program}{575}{invocation of program}
+-\entry{main function}{575}{\code {main} function}
+-\entry{argc (program argument count)}{575}{argc (program argument count)}
+-\entry{argv (program argument vector)}{575}{argv (program argument vector)}
+-\entry{program argument syntax}{575}{program argument syntax}
+-\entry{syntax, for program arguments}{575}{syntax, for program arguments}
+-\entry{command argument syntax}{575}{command argument syntax}
+-\entry{long-named options}{576}{long-named options}
+-\entry{program arguments, parsing}{576}{program arguments, parsing}
+-\entry{command arguments, parsing}{576}{command arguments, parsing}
+-\entry{parsing program arguments}{576}{parsing program arguments}
+-\entry{argp (program argument parser)}{584}{argp (program argument parser)}
+-\entry{argument parsing with argp}{584}{argument parsing with argp}
+-\entry{option parsing with argp}{584}{option parsing with argp}
+-\entry{argp parser functions}{588}{argp parser functions}
+-\entry{usage messages, in argp}{591}{usage messages, in argp}
+-\entry{syntax error messages, in argp}{591}{syntax error messages, in argp}
+-\entry{error messages, in argp}{591}{error messages, in argp}
+-\entry{ARGP{\_}HELP{\_}FMT environment variable}{606}{ARGP_HELP_FMT environment variable}
+-\entry{environment variable}{609}{environment variable}
+-\entry{environment}{610}{environment}
+-\entry{environment access}{610}{environment access}
+-\entry{environment representation}{610}{environment representation}
+-\entry{standard environment variables}{611}{standard environment variables}
+-\entry{HOME environment variable}{612}{\code {HOME} environment variable}
+-\entry{home directory}{612}{home directory}
+-\entry{LOGNAME environment variable}{612}{\code {LOGNAME} environment variable}
+-\entry{PATH environment variable}{612}{\code {PATH} environment variable}
+-\entry{TERM environment variable}{612}{\code {TERM} environment variable}
+-\entry{TZ environment variable}{612}{\code {TZ} environment variable}
+-\entry{LANG environment variable}{612}{\code {LANG} environment variable}
+-\entry{LC{\_}ALL environment variable}{613}{\code {LC_ALL} environment variable}
+-\entry{LC{\_}COLLATE environment variable}{613}{\code {LC_COLLATE} environment variable}
+-\entry{LC{\_}CTYPE environment variable}{613}{\code {LC_CTYPE} environment variable}
+-\entry{LC{\_}MESSAGES environment variable}{613}{\code {LC_MESSAGES} environment variable}
+-\entry{LC{\_}MONETARY environment variable}{613}{\code {LC_MONETARY} environment variable}
+-\entry{LC{\_}NUMERIC environment variable}{613}{\code {LC_NUMERIC} environment variable}
+-\entry{LC{\_}TIME environment variable}{613}{\code {LC_TIME} environment variable}
+-\entry{NLSPATH environment variable}{613}{\code {NLSPATH} environment variable}
+-\entry{{\_}POSIX{\_}OPTION{\_}ORDER environment variable.}{613}{\code {_POSIX_OPTION_ORDER} environment variable.}
+-\entry{program termination}{613}{program termination}
+-\entry{process termination}{613}{process termination}
+-\entry{exit status value}{613}{exit status value}
+-\entry{exit status}{614}{exit status}
+-\entry{aborting a program}{616}{aborting a program}
+-\entry{process}{619}{process}
+-\entry{child process}{619}{child process}
+-\entry{parent process}{619}{parent process}
+-\entry{running a command}{619}{running a command}
+-\entry{process ID}{620}{process ID}
+-\entry{process lifetime}{620}{process lifetime}
+-\entry{creating a process}{620}{creating a process}
+-\entry{forking a process}{620}{forking a process}
+-\entry{child process}{620}{child process}
+-\entry{parent process}{620}{parent process}
+-\entry{process image}{620}{process image}
+-\entry{executing a file}{622}{executing a file}
+-\entry{exec functions}{622}{\code {exec} functions}
+-\entry{process completion}{624}{process completion}
+-\entry{waiting for completion of child process}{624}{waiting for completion of child process}
+-\entry{testing exit status of child process}{624}{testing exit status of child process}
+-\entry{process groups}{631}{process groups}
+-\entry{job control}{631}{job control}
+-\entry{job}{631}{job}
+-\entry{session}{631}{session}
+-\entry{shell}{631}{shell}
+-\entry{session}{631}{session}
+-\entry{session leader}{631}{session leader}
+-\entry{controlling terminal}{631}{controlling terminal}
+-\entry{foreground job}{631}{foreground job}
+-\entry{background job}{631}{background job}
+-\entry{stopped job}{632}{stopped job}
+-\entry{job control is optional}{632}{job control is optional}
+-\entry{controlling process}{632}{controlling process}
+-\entry{controlling terminal, access to}{632}{controlling terminal, access to}
+-\entry{SIGTTIN, from background job}{632}{\code {SIGTTIN}, from background job}
+-\entry{SIGTTOU, from background job}{633}{\code {SIGTTOU}, from background job}
+-\entry{orphaned process group}{633}{orphaned process group}
+-\entry{job control, enabling}{635}{job control, enabling}
+-\entry{subshell}{635}{subshell}
+-\entry{job control, enabling}{635}{job control, enabling}
+-\entry{launching jobs}{637}{launching jobs}
+-\entry{process group leader}{637}{process group leader}
+-\entry{process group ID}{637}{process group ID}
+-\entry{race conditions, relating to job control}{637}{race conditions, relating to job control}
+-\entry{foreground job, launching}{640}{foreground job, launching}
+-\entry{background job, launching}{641}{background job, launching}
+-\entry{stopped jobs, detecting}{641}{stopped jobs, detecting}
+-\entry{terminated jobs, detecting}{641}{terminated jobs, detecting}
+-\entry{SIGCHLD, handling of}{642}{\code {SIGCHLD}, handling of}
+-\entry{stopped jobs, continuing}{644}{stopped jobs, continuing}
+-\entry{process group functions}{646}{process group functions}
+-\entry{job control functions}{646}{job control functions}
+-\entry{controlling terminal, determining}{646}{controlling terminal, determining}
+-\entry{BSD compatibility library}{647}{BSD compatibility library}
+-\entry{Name Service Switch}{651}{Name Service Switch}
+-\entry{NSS}{651}{NSS}
+-\entry{databases}{651}{databases}
+-\entry{ethers}{651}{ethers}
+-\entry{group}{651}{group}
+-\entry{hosts}{651}{hosts}
+-\entry{netgroup}{651}{netgroup}
+-\entry{networks}{651}{networks}
+-\entry{protocols}{651}{protocols}
+-\entry{passwd}{651}{passwd}
+-\entry{rpc}{651}{rpc}
+-\entry{services}{651}{services}
+-\entry{shadow}{651}{shadow}
+-\entry{/etc/nsswitch.conf}{652}{\file {/etc/nsswitch.conf}}
+-\entry{nsswitch.conf}{652}{\file {nsswitch.conf}}
+-\entry{DNS server unavailable}{653}{DNS server unavailable}
+-\entry{nisplus, and completeness}{653}{nisplus, and completeness}
+-\entry{nisplus, and booting}{653}{nisplus, and booting}
+-\entry{bootstrapping, and services}{653}{bootstrapping, and services}
+-\entry{default value, and NSS}{654}{default value, and NSS}
+-\entry{optimizing NSS}{654}{optimizing NSS}
+-\entry{reentrant NSS functions}{655}{reentrant NSS functions}
+-\entry{login name}{661}{login name}
+-\entry{user name}{661}{user name}
+-\entry{user ID}{661}{user ID}
+-\entry{group name}{661}{group name}
+-\entry{group ID}{661}{group ID}
+-\entry{persona}{661}{persona}
+-\entry{effective user ID}{661}{effective user ID}
+-\entry{effective group ID}{661}{effective group ID}
+-\entry{supplementary group IDs}{661}{supplementary group IDs}
+-\entry{real user ID}{661}{real user ID}
+-\entry{real group ID}{661}{real group ID}
+-\entry{setuid programs}{662}{\code {setuid} programs}
+-\entry{saved set-user-ID}{662}{saved set-user-ID}
+-\entry{saved set-group-ID}{662}{saved set-group-ID}
+-\entry{{\_}POSIX{\_}SAVED{\_}IDS}{662}{\code {_POSIX_SAVED_IDS}}
+-\entry{login name, determining}{670}{login name, determining}
+-\entry{user ID, determining}{670}{user ID, determining}
+-\entry{user accounting database}{671}{user accounting database}
+-\entry{user database}{678}{user database}
+-\entry{password database}{678}{password database}
+-\entry{converting user ID to user name}{679}{converting user ID to user name}
+-\entry{converting user name to user ID}{679}{converting user name to user ID}
+-\entry{scanning the user list}{680}{scanning the user list}
+-\entry{group database}{681}{group database}
+-\entry{converting group name to group ID}{682}{converting group name to group ID}
+-\entry{converting group ID to group name}{682}{converting group ID to group name}
+-\entry{scanning the group list}{683}{scanning the group list}
+-\entry{Netgroup}{685}{Netgroup}
+-\entry{POSIX capacity limits}{697}{POSIX capacity limits}
+-\entry{limits, POSIX}{697}{limits, POSIX}
+-\entry{capacity limits, POSIX}{697}{capacity limits, POSIX}
+-\entry{limits, program argument size}{697}{limits, program argument size}
+-\entry{limits, number of processes}{697}{limits, number of processes}
+-\entry{limits, number of open files}{697}{limits, number of open files}
+-\entry{limits, time zone name length}{697}{limits, time zone name length}
+-\entry{limits, number of supplementary group IDs}{698}{limits, number of supplementary group IDs}
+-\entry{POSIX optional features}{698}{POSIX optional features}
+-\entry{optional POSIX features}{698}{optional POSIX features}
+-\entry{limits, link count of files}{709}{limits, link count of files}
+-\entry{limits, terminal input queue}{709}{limits, terminal input queue}
+-\entry{limits, file name length}{709}{limits, file name length}
+-\entry{limits, pipe buffer size}{710}{limits, pipe buffer size}
+-\entry{consistency checking}{743}{consistency checking}
+-\entry{impossible events}{743}{impossible events}
+-\entry{assertions}{743}{assertions}
+-\entry{variable number of arguments}{744}{variable number of arguments}
+-\entry{variadic functions}{744}{variadic functions}
+-\entry{optional arguments}{744}{optional arguments}
+-\entry{function prototypes (variadic)}{745}{function prototypes (variadic)}
+-\entry{prototypes for variadic functions}{745}{prototypes for variadic functions}
+-\entry{variadic function prototypes}{745}{variadic function prototypes}
+-\entry{variadic function argument access}{746}{variadic function argument access}
+-\entry{arguments (variadic functions)}{746}{arguments (variadic functions)}
+-\entry{number of arguments passed}{747}{number of arguments passed}
+-\entry{how many arguments}{747}{how many arguments}
+-\entry{arguments, how many}{747}{arguments, how many}
+-\entry{variadic functions, calling}{747}{variadic functions, calling}
+-\entry{calling variadic functions}{747}{calling variadic functions}
+-\entry{declaring variadic functions}{747}{declaring variadic functions}
+-\entry{default argument promotions}{747}{default argument promotions}
+-\entry{argument promotion}{747}{argument promotion}
+-\entry{null pointer constant}{750}{null pointer constant}
+-\entry{integer type width}{752}{integer type width}
+-\entry{width of integer type}{752}{width of integer type}
+-\entry{type measurements, integer}{752}{type measurements, integer}
+-\entry{integer type range}{752}{integer type range}
+-\entry{range of integer type}{752}{range of integer type}
+-\entry{limits, integer types}{752}{limits, integer types}
+-\entry{floating type measurements}{754}{floating type measurements}
+-\entry{measurements of floating types}{754}{measurements of floating types}
+-\entry{type measurements, floating}{754}{type measurements, floating}
+-\entry{limits, floating types}{754}{limits, floating types}
+-\entry{sign (of floating point number)}{754}{sign (of floating point number)}
+-\entry{base (of floating point number)}{754}{base (of floating point number)}
+-\entry{radix (of floating point number)}{754}{radix (of floating point number)}
+-\entry{exponent (of floating point number)}{754}{exponent (of floating point number)}
+-\entry{bias (of floating point number exponent)}{754}{bias (of floating point number exponent)}
+-\entry{mantissa (of floating point number)}{754}{mantissa (of floating point number)}
+-\entry{significand (of floating point number)}{754}{significand (of floating point number)}
+-\entry{precision (of floating point number)}{754}{precision (of floating point number)}
+-\entry{hidden bit (of floating point number mantissa)}{754}{hidden bit (of floating point number mantissa)}
+-\entry{normalized floating point number}{755}{normalized floating point number}
+-\entry{IEEE floating point representation}{758}{IEEE floating point representation}
+-\entry{floating point, IEEE}{758}{floating point, IEEE}
+-\entry{configuring}{857}{configuring}
+-\entry{compiling}{857}{compiling}
+-\entry{installing}{859}{installing}
+-\entry{installation tools}{860}{installation tools}
+-\entry{tools, for installing library}{860}{tools, for installing library}
+-\entry{configurations, all supported}{861}{configurations, all supported}
+-\entry{upgrading from libc5}{862}{upgrading from libc5}
+-\entry{kernel header files}{862}{kernel header files}
+-\entry{reporting bugs}{863}{reporting bugs}
+-\entry{bugs, reporting}{863}{bugs, reporting}
+diff -Naur ../glibc-2.1.3/manual/libc.cps glibc-2.1.3/manual/libc.cps
+--- ../glibc-2.1.3/manual/libc.cps	2000-01-05 19:19:03.000000000 -0800
++++ glibc-2.1.3/manual/libc.cps	1969-12-31 16:00:00.000000000 -0800
+@@ -1,935 +0,0 @@
+-\initial {/}
+-\entry {\file {/etc/nsswitch.conf}}{652}
+-\initial {{\_}}
+-\entry {__va_copy}{77}
+-\entry {\code {_POSIX_OPTION_ORDER} environment variable.}{613}
+-\entry {\code {_POSIX_SAVED_IDS}}{662}
+-\initial {4}
+-\entry {4.\var {n} BSD Unix}{3}
+-\initial {A}
+-\entry {abort signal}{532}
+-\entry {aborting a program}{616}
+-\entry {absolute file name}{208}
+-\entry {absolute value functions}{468}
+-\entry {accepting connections}{390}
+-\entry {access permission for a file}{346}
+-\entry {access, testing for}{348}
+-\entry {accessing directories}{320}
+-\entry {address of socket}{365}
+-\entry {alarm signal}{534}
+-\entry {alarms, setting}{513}
+-\entry {alignment (in obstacks)}{55}
+-\entry {alignment (with \code {malloc})}{36}
+-\entry {\code {alloca} disadvantages}{59}
+-\entry {\code {alloca} function}{57}
+-\entry {allocating pseudo-terminals}{434}
+-\entry {allocation (obstacks)}{48}
+-\entry {allocation debugging}{43}
+-\entry {allocation hooks, for \code {malloc}}{39}
+-\entry {allocation of memory with \code {malloc}}{32}
+-\entry {allocation size of string}{71}
+-\entry {allocation statistics}{41}
+-\entry {alphabetic character}{61, 65}
+-\entry {alphanumeric character}{62, 64}
+-\entry {append-access files}{207}
+-\entry {argc (program argument count)}{575}
+-\entry {argp (program argument parser)}{584}
+-\entry {argp parser functions}{588}
+-\entry {ARGP_HELP_FMT environment variable}{606}
+-\entry {argument parsing with argp}{584}
+-\entry {argument promotion}{747}
+-\entry {argument vectors, null-character separated}{93}
+-\entry {arguments (variadic functions)}{746}
+-\entry {arguments, how many}{747}
+-\entry {arguments, to program}{575}
+-\entry {argv (program argument vector)}{575}
+-\entry {argz vectors (string vectors)}{93}
+-\entry {arithmetic expansion}{199}
+-\entry {array comparison functions}{80}
+-\entry {array copy functions}{73}
+-\entry {array search function}{177}
+-\entry {array sort function}{178}
+-\entry {ASCII character}{63}
+-\entry {assertions}{743}
+-\entry {attributes of a file}{336}
+-\entry {automatic allocation}{31}
+-\entry {automatic freeing}{57}
+-\entry {automatic storage with variable size}{57}
+-\initial {B}
+-\entry {background job}{631}
+-\entry {background job, launching}{641}
+-\entry {base (of floating point number)}{754}
+-\entry {baud rate}{423}
+-\entry {Berkeley Unix}{3}
+-\entry {Bessel functions}{449}
+-\entry {bias (of floating point number exponent)}{754}
+-\entry {big-endian}{382}
+-\entry {binary I/O to a stream}{221}
+-\entry {binary search function (for arrays)}{177}
+-\entry {binary stream}{251}
+-\entry {binding a socket address}{365}
+-\entry {blank character}{62, 67}
+-\entry {block I/O to a stream}{221}
+-\entry {blocked signals}{528}
+-\entry {blocked signals, checking for}{565}
+-\entry {blocking signals}{560}
+-\entry {blocking signals, in a handler}{564}
+-\entry {bootstrapping, and services}{653}
+-\entry {break condition, detecting}{417}
+-\entry {break condition, generating}{430}
+-\entry {breaking a string into tokens}{88}
+-\entry {broken pipe signal}{536}
+-\entry {broken-down time}{489, 492}
+-\entry {BSD compatibility library}{647}
+-\entry {BSD compatibility library.}{8}
+-\entry {BSD Unix}{3}
+-\entry {buffering of streams}{256}
+-\entry {buffering, controlling}{257}
+-\entry {bugs, reporting}{863}
+-\entry {bus error}{531}
+-\entry {butterfly}{476}
+-\entry {byte order conversion, for socket}{382}
+-\entry {byte stream}{363}
+-\initial {C}
+-\entry {calendar time}{489}
+-\entry {calendar time and broken-down time}{492}
+-\entry {calling variadic functions}{747}
+-\entry {canonical input processing}{412}
+-\entry {capacity limits, POSIX}{697}
+-\entry {carrier detect}{419}
+-\entry {case conversion of characters}{63}
+-\entry {catching signals}{528}
+-\entry {categories for locales}{142}
+-\entry {change working directory}{319}
+-\entry {changing the locale}{143}
+-\entry {changing the size of a block (\code {malloc})}{34}
+-\entry {changing the size of a block (obstacks)}{51}
+-\entry {channels}{283}
+-\entry {character case conversion}{63}
+-\entry {character predicates}{61}
+-\entry {character testing}{61}
+-\entry {checking for pending signals}{565}
+-\entry {child process}{619, 620}
+-\entry {child process signal}{534}
+-\entry {chunks}{55}
+-\entry {classes, floating-point}{459}
+-\entry {classification of characters}{61}
+-\entry {cleaning up a stream}{283}
+-\entry {clearing terminal input queue}{431}
+-\entry {client}{388}
+-\entry {clock ticks}{487}
+-\entry {close-on-exec (file descriptor flag)}{308}
+-\entry {closing a file descriptor}{271}
+-\entry {closing a socket}{387}
+-\entry {closing a stream}{214}
+-\entry {collating strings}{83}
+-\entry {combining locales}{142}
+-\entry {command argument syntax}{575}
+-\entry {command arguments, parsing}{576}
+-\entry {command line arguments}{575}
+-\entry {command substitution}{199}
+-\entry {communication style (of a socket)}{363}
+-\entry {comparing strings and arrays}{80}
+-\entry {Comparison Function}{177}
+-\entry {compiling}{857}
+-\entry {complex exponentiation functions}{446}
+-\entry {complex logarithm functions}{446}
+-\entry {complex numbers}{476}
+-\entry {complex trigonometric functions}{441}
+-\entry {concatenating strings}{73}
+-\entry {configurations, all supported}{861}
+-\entry {configuring}{857}
+-\entry {conjugate complex numbers}{477}
+-\entry {connecting a socket}{388}
+-\entry {connection}{388}
+-\entry {consistency checking}{743}
+-\entry {consistency checking, of heap}{37}
+-\entry {constants}{439}
+-\entry {continue signal}{535}
+-\entry {control character}{62, 65}
+-\entry {control operations on files}{305}
+-\entry {controlling process}{632}
+-\entry {controlling terminal}{631}
+-\entry {controlling terminal, access to}{632}
+-\entry {controlling terminal, determining}{646}
+-\entry {controlling terminal, setting}{311}
+-\entry {conversion specifications (\code {printf})}{222}
+-\entry {conversion specifications (\code {scanf})}{243}
+-\entry {converting byte order}{382}
+-\entry {converting case of characters}{63}
+-\entry {converting file descriptor to stream}{282}
+-\entry {converting floats to integers}{471}
+-\entry {converting group ID to group name}{682}
+-\entry {converting group name to group ID}{682}
+-\entry {converting host address to name}{377}
+-\entry {converting host name to address}{377}
+-\entry {converting network name to network number}{408}
+-\entry {converting network number to network name}{408}
+-\entry {converting port number to service name}{381}
+-\entry {converting service name to port number}{381}
+-\entry {converting string to collation order}{84}
+-\entry {converting strings to numbers}{479}
+-\entry {converting user ID to user name}{679}
+-\entry {converting user name to user ID}{679}
+-\entry {cookie, for custom stream}{262}
+-\entry {copying strings and arrays}{73}
+-\entry {CPU time}{487}
+-\entry {create on open (file status flag)}{310}
+-\entry {creating a directory}{335}
+-\entry {creating a FIFO special file}{360}
+-\entry {creating a pipe}{357}
+-\entry {creating a pipe to a subprocess}{359}
+-\entry {creating a process}{620}
+-\entry {creating a socket}{386}
+-\entry {creating a socket pair}{387}
+-\entry {creating special files}{352}
+-\entry {cube root function}{445}
+-\entry {currency symbols}{147}
+-\entry {current working directory}{319}
+-\entry {custom streams}{262}
+-\entry {customizing \code {printf}}{237}
+-\initial {D}
+-\entry {data loss on sockets}{363}
+-\entry {databases}{651}
+-\entry {datagram socket}{401}
+-\entry {datagrams, transmitting}{401}
+-\entry {date and time}{489}
+-\entry {Daylight Saving Time}{493}
+-\entry {decimal digit character}{62}
+-\entry {decimal-point separator}{146}
+-\entry {declaration (compared to definition)}{4}
+-\entry {declaring variadic functions}{747}
+-\entry {decompose complex numbers}{477}
+-\entry {default action (for a signal)}{528}
+-\entry {default action for a signal}{539}
+-\entry {default argument promotions}{747}
+-\entry {default value, and NSS}{654}
+-\entry {defining new \code {printf} conversions}{237}
+-\entry {definition (compared to declaration)}{4}
+-\entry {delayed suspend character}{427}
+-\entry {deleting a directory}{334}
+-\entry {deleting a file}{333}
+-\entry {delivery of signals}{528}
+-\entry {descriptors and streams}{283}
+-\entry {digit character}{62, 65}
+-\entry {directories, accessing}{320}
+-\entry {directories, creating}{335}
+-\entry {directories, deleting}{334}
+-\entry {directory}{207}
+-\entry {directory entry}{207}
+-\entry {directory hierarchy}{327}
+-\entry {directory stream}{320}
+-\entry {disadvantages of \code {alloca}}{59}
+-\entry {DISCARD character}{428}
+-\entry {division by zero}{461}
+-\entry {DNS server unavailable}{653}
+-\entry {domain (of socket)}{363}
+-\entry {domain error}{465}
+-\entry {dot notation, for Internet addresses}{373}
+-\entry {DSUSP character}{427}
+-\entry {duplicating file descriptors}{306}
+-\entry {dynamic allocation}{31}
+-\initial {E}
+-\entry {EBCDIC}{99}
+-\entry {echo of terminal input}{421}
+-\entry {effective group ID}{661}
+-\entry {effective user ID}{661}
+-\entry {efficiency and \code {malloc}}{36}
+-\entry {efficiency and obstacks}{52}
+-\entry {efficiency of chunks}{55}
+-\entry {EINTR, and restarting interrupted primitives}{556}
+-\entry {end of file, on a stream}{250}
+-\entry {end-of-file, on a file descriptor}{275}
+-\entry {environment}{610}
+-\entry {environment access}{610}
+-\entry {environment representation}{610}
+-\entry {environment variable}{609}
+-\entry {environment vectors, null-character separated}{93}
+-\entry {envz vectors (environment vectors)}{93}
+-\entry {EOF character}{425}
+-\entry {EOL character}{425}
+-\entry {EOL2 character}{425}
+-\entry {epoch}{489}
+-\entry {ERASE character}{426}
+-\entry {error codes}{15}
+-\entry {error messages, in argp}{591}
+-\entry {error reporting}{15}
+-\entry {errors, mathematical}{465}
+-\entry {establishing a handler}{538}
+-\entry {ethers}{651}
+-\entry {EUC}{99}
+-\entry {EUC-JP}{127}
+-\entry {exception}{461, 530}
+-\entry {exclusive lock}{314}
+-\entry {\code {exec} functions}{622}
+-\entry {executing a file}{622}
+-\entry {exit status}{614}
+-\entry {exit status value}{613}
+-\entry {expansion of shell words}{198}
+-\entry {exponent (of floating point number)}{754}
+-\entry {exponentiation functions}{443}
+-\entry {extending \code {printf}}{237}
+-\entry {extracting file descriptor from stream}{282}
+-\initial {F}
+-\entry {\code {fcntl} function}{305}
+-\entry {feature test macros}{7}
+-\entry {field splitting}{199}
+-\entry {FIFO special file}{357}
+-\entry {file access permission}{346}
+-\entry {file access time}{349}
+-\entry {file attribute modification time}{349}
+-\entry {file attributes}{336}
+-\entry {file creation mask}{346}
+-\entry {file descriptor flags}{307}
+-\entry {file descriptor sets, for \code {select}}{289}
+-\entry {file descriptors, standard}{283}
+-\entry {file locks}{314}
+-\entry {file modification time}{349}
+-\entry {file name}{207}
+-\entry {file name component}{207}
+-\entry {file name errors}{208}
+-\entry {file name resolution}{208}
+-\entry {file name translation flags}{310}
+-\entry {file names, multiple}{331}
+-\entry {file owner}{343}
+-\entry {file permission bits}{344}
+-\entry {file pointer}{211}
+-\entry {file position}{206}
+-\entry {file positioning on a file descriptor}{279}
+-\entry {file positioning on a stream}{252}
+-\entry {file status flags}{309}
+-\entry {filtering i/o through subprocess}{359}
+-\entry {flag character (\code {printf})}{223}
+-\entry {flag character (\code {scanf})}{244}
+-\entry {flags for \code {sigaction}}{543}
+-\entry {flags, file name translation}{310}
+-\entry {flags, open-time action}{310}
+-\entry {floating point}{459}
+-\entry {floating point, IEEE}{758}
+-\entry {floating type measurements}{754}
+-\entry {floating-point classes}{459}
+-\entry {floating-point exception}{530}
+-\entry {flow control, terminal}{432}
+-\entry {flushing a stream}{257}
+-\entry {flushing terminal output queue}{431}
+-\entry {foreground job}{631}
+-\entry {foreground job, launching}{640}
+-\entry {forking a process}{620}
+-\entry {format string, for \code {printf}}{221}
+-\entry {format string, for \code {scanf}}{242}
+-\entry {formatted input from a stream}{242}
+-\entry {formatted messages}{264}
+-\entry {formatted output to a stream}{221}
+-\entry {FP arithmetic}{473}
+-\entry {freeing (obstacks)}{50}
+-\entry {freeing memory allocated with \code {malloc}}{34}
+-\entry {fully buffered stream}{257}
+-\entry {function prototypes (variadic)}{745}
+-\initial {G}
+-\entry {gamma function}{449}
+-\entry {gcvt_r}{485}
+-\entry {gencat}{164}
+-\entry {generation of signals}{528}
+-\entry {generic i/o control operations}{318}
+-\entry {globbing}{188}
+-\entry {graphic character}{62, 65}
+-\entry {Gregorian calendar}{489}
+-\entry {group}{651}
+-\entry {group database}{681}
+-\entry {group ID}{661}
+-\entry {group name}{661}
+-\entry {group owner of a file}{343}
+-\entry {grouping of digits}{146}
+-\entry {growing objects (in obstacks)}{51}
+-\initial {H}
+-\entry {handling multiple signals}{549}
+-\entry {hangup signal}{533}
+-\entry {hard limit}{520}
+-\entry {hard link}{331}
+-\entry {header files}{4}
+-\entry {heap consistency checking}{37}
+-\entry {heap, dynamic allocation from}{32}
+-\entry {heap, freeing memory from}{34}
+-\entry {hexadecimal digit character}{62, 67}
+-\entry {hidden bit (of floating point number mantissa)}{754}
+-\entry {hierarchy, directory}{327}
+-\entry {high-priority data}{398}
+-\entry {high-resolution time}{489}
+-\entry {holes in files}{280}
+-\entry {home directory}{612}
+-\entry {\code {HOME} environment variable}{612}
+-\entry {hook functions (of custom streams)}{263}
+-\entry {host address, Internet}{373}
+-\entry {hosts}{651}
+-\entry {hosts database}{377}
+-\entry {how many arguments}{747}
+-\entry {hyperbolic functions}{447}
+-\initial {I}
+-\entry {identifying terminals}{411}
+-\entry {IEEE 754}{459}
+-\entry {IEEE floating point}{459}
+-\entry {IEEE floating point representation}{758}
+-\entry {IEEE Std 1003.1}{2}
+-\entry {IEEE Std 1003.2}{2}
+-\entry {ignore action for a signal}{539}
+-\entry {illegal instruction}{531}
+-\entry {impossible events}{743}
+-\entry {independent channels}{284}
+-\entry {inexact exception}{461}
+-\entry {infinity}{463}
+-\entry {initial signal actions}{544}
+-\entry {inode number}{339}
+-\entry {input available signal}{534}
+-\entry {input conversions, for \code {scanf}}{244}
+-\entry {input from multiple files}{289}
+-\entry {installation tools}{860}
+-\entry {installing}{859}
+-\entry {integer division functions}{478}
+-\entry {integer type range}{752}
+-\entry {integer type width}{752}
+-\entry {interactive signals, from terminal}{422}
+-\entry {interactive stop signal}{535}
+-\entry {internal representation}{97}
+-\entry {internationalization}{141}
+-\entry {Internet host address}{373}
+-\entry {Internet namespace, for sockets}{371}
+-\entry {interprocess communication, with FIFO}{360}
+-\entry {interprocess communication, with pipes}{357}
+-\entry {interprocess communication, with signals}{559}
+-\entry {interprocess communication, with sockets}{363}
+-\entry {interrupt character}{427}
+-\entry {interrupt signal}{532}
+-\entry {interrupt-driven input}{317}
+-\entry {interrupting primitives}{556}
+-\entry {interval timer, setting}{513}
+-\entry {INTR character}{427}
+-\entry {invalid exception}{461}
+-\entry {inverse complex hyperbolic functions}{448}
+-\entry {inverse complex trigonometric functions}{442}
+-\entry {inverse hyperbolic functions}{448}
+-\entry {inverse trigonometric functions}{442}
+-\entry {invocation of program}{575}
+-\entry {IOCTLs}{318}
+-\entry {ISO 10646}{97}
+-\entry {ISO 2022}{99}
+-\entry {ISO 6937}{100}
+-\entry {ISO C}{2}
+-\entry {ISO-2022-JP}{127}
+-\entry {ISO/IEC 9945-1}{2}
+-\entry {ISO/IEC 9945-2}{2}
+-\initial {J}
+-\entry {job}{631}
+-\entry {job control}{631}
+-\entry {job control functions}{646}
+-\entry {job control is optional}{632}
+-\entry {job control signals}{534}
+-\entry {job control, enabling}{635}
+-\initial {K}
+-\entry {Kermit the frog}{181}
+-\entry {kernel header files}{862}
+-\entry {KILL character}{426}
+-\entry {kill signal}{533}
+-\entry {killing a process}{557}
+-\initial {L}
+-\entry {LANG environment variable}{161}
+-\entry {\code {LANG} environment variable}{612}
+-\entry {launching jobs}{637}
+-\entry {LC_ALL environment variable}{161}
+-\entry {\code {LC_ALL} environment variable}{613}
+-\entry {\code {LC_COLLATE} environment variable}{613}
+-\entry {\code {LC_CTYPE} environment variable}{613}
+-\entry {LC_MESSAGES environment variable}{161}
+-\entry {\code {LC_MESSAGES} environment variable}{613}
+-\entry {\code {LC_MONETARY} environment variable}{613}
+-\entry {\code {LC_NUMERIC} environment variable}{613}
+-\entry {\code {LC_TIME} environment variable}{613}
+-\entry {leap second}{492}
+-\entry {length of string}{71}
+-\entry {level, for socket options}{406}
+-\entry {library}{1}
+-\entry {limits on resource usage}{518}
+-\entry {limits, file name length}{709}
+-\entry {limits, floating types}{754}
+-\entry {limits, integer types}{752}
+-\entry {limits, link count of files}{709}
+-\entry {limits, number of open files}{697}
+-\entry {limits, number of processes}{697}
+-\entry {limits, number of supplementary group IDs}{698}
+-\entry {limits, pipe buffer size}{710}
+-\entry {limits, POSIX}{697}
+-\entry {limits, program argument size}{697}
+-\entry {limits, terminal input queue}{709}
+-\entry {limits, time zone name length}{697}
+-\entry {line buffered stream}{257}
+-\entry {line speed}{423}
+-\entry {lines (in a text file)}{251}
+-\entry {link}{207}
+-\entry {link, hard}{331}
+-\entry {link, soft}{332}
+-\entry {link, symbolic}{332}
+-\entry {linked channels}{283}
+-\entry {listening (sockets)}{390}
+-\entry {little-endian}{382}
+-\entry {LNEXT character}{428}
+-\entry {local namespace, for sockets}{369}
+-\entry {local network address number}{373}
+-\entry {local time}{489}
+-\entry {locale categories}{142}
+-\entry {locale, changing}{143}
+-\entry {locales}{141}
+-\entry {locales, parsing numbers and}{481}
+-\entry {logarithm functions}{443}
+-\entry {login name}{661}
+-\entry {login name, determining}{670}
+-\entry {\code {LOGNAME} environment variable}{612}
+-\entry {long jumps}{523}
+-\entry {long-named options}{576}
+-\entry {longjmp}{58}
+-\entry {loss of data on sockets}{363}
+-\entry {lost resource signal}{536}
+-\entry {lower-case character}{61, 66}
+-\initial {M}
+-\entry {macros}{50}
+-\entry {\code {main} function}{575}
+-\entry {malloc debugger}{43}
+-\entry {\code {malloc} function}{32}
+-\entry {mantissa (of floating point number)}{754}
+-\entry {matching failure, in \code {scanf}}{243}
+-\entry {mathematical constants}{439}
+-\entry {maximum}{475}
+-\entry {maximum field width (\code {scanf})}{244}
+-\entry {measurements of floating types}{754}
+-\entry {memory allocation}{31}
+-\entry {merging of signals}{549}
+-\entry {MIN termios slot}{429}
+-\entry {minimum}{475}
+-\entry {minimum field width (\code {printf})}{223}
+-\entry {mixing descriptors and streams}{283}
+-\entry {modem disconnect}{419}
+-\entry {modem status lines}{419}
+-\entry {monetary value formatting}{146}
+-\entry {multibyte character}{99}
+-\entry {multiple names for one file}{331}
+-\entry {multiplexing input}{289}
+-\entry {multiply-add}{475}
+-\initial {N}
+-\entry {name of running program}{28}
+-\entry {name of socket}{365}
+-\entry {Name Service Switch}{651}
+-\entry {name space}{5}
+-\entry {names of signals}{529}
+-\entry {namespace (of socket)}{363}
+-\entry {NaN}{463, 474}
+-\entry {netgroup}{651}
+-\entry {Netgroup}{685}
+-\entry {network byte order}{382}
+-\entry {network number}{373}
+-\entry {network protocol}{363}
+-\entry {networks}{651}
+-\entry {networks database}{408}
+-\entry {nisplus, and booting}{653}
+-\entry {nisplus, and completeness}{653}
+-\entry {NLSPATH environment variable}{160}
+-\entry {\code {NLSPATH} environment variable}{613}
+-\entry {non-blocking open}{310}
+-\entry {non-local exit, from signal handler}{547}
+-\entry {non-local exits}{523}
+-\entry {noncanonical input processing}{412}
+-\entry {normalization functions (floating-point)}{469}
+-\entry {normalized floating point number}{755}
+-\entry {not a number}{463}
+-\entry {NSS}{651}
+-\entry {\file {nsswitch.conf}}{652}
+-\entry {null character}{71}
+-\entry {null pointer constant}{750}
+-\entry {number of arguments passed}{747}
+-\entry {number syntax, parsing}{479}
+-\entry {numeric value formatting}{146}
+-\initial {O}
+-\entry {obstack status}{54}
+-\entry {obstacks}{47}
+-\entry {open-time action flags}{310}
+-\entry {opening a file}{205}
+-\entry {opening a file descriptor}{271}
+-\entry {opening a pipe}{357}
+-\entry {opening a pseudo-terminal pair}{436}
+-\entry {opening a socket}{386}
+-\entry {opening a socket pair}{387}
+-\entry {opening a stream}{212}
+-\entry {Optimization}{457}
+-\entry {optimizing NSS}{654}
+-\entry {option parsing with argp}{584}
+-\entry {optional arguments}{744}
+-\entry {optional POSIX features}{698}
+-\entry {orphaned process group}{633}
+-\entry {out-of-band data}{398}
+-\entry {output conversions, for \code {printf}}{224}
+-\entry {output possible signal}{534}
+-\entry {overflow exception}{461}
+-\entry {owner of a file}{343}
+-\initial {P}
+-\entry {packet}{363}
+-\entry {page boundary}{36}
+-\entry {parent directory}{208}
+-\entry {parent process}{619, 620}
+-\entry {parity checking}{416}
+-\entry {parsing a template string}{234}
+-\entry {parsing numbers (in formatted input)}{479}
+-\entry {parsing numbers and locales}{481}
+-\entry {parsing program arguments}{576}
+-\entry {parsing tokens from a string}{88}
+-\entry {passwd}{651}
+-\entry {password database}{678}
+-\entry {\code {PATH} environment variable}{612}
+-\entry {\code {pause} function}{567}
+-\entry {peeking at input}{219}
+-\entry {pending signals}{528}
+-\entry {pending signals, checking for}{565}
+-\entry {permission to access a file}{346}
+-\entry {persona}{661}
+-\entry {pi (trigonometric constant)}{440}
+-\entry {pipe}{357}
+-\entry {pipe signal}{536}
+-\entry {pipe to a subprocess}{359}
+-\entry {port number}{381}
+-\entry {positioning a file descriptor}{279}
+-\entry {positioning a stream}{252}
+-\entry {positive difference}{475}
+-\entry {POSIX}{2}
+-\entry {POSIX capacity limits}{697}
+-\entry {POSIX optional features}{698}
+-\entry {POSIX.1}{2}
+-\entry {POSIX.2}{2}
+-\entry {power functions}{443}
+-\entry {precision (of floating point number)}{754}
+-\entry {precision (\code {printf})}{223}
+-\entry {predicates on arrays}{80}
+-\entry {predicates on characters}{61}
+-\entry {predicates on strings}{80}
+-\entry {primitives, interrupting}{556}
+-\entry {printing character}{62, 66}
+-\entry {priority of a process}{521}
+-\entry {process}{575, 619}
+-\entry {process completion}{624}
+-\entry {process group functions}{646}
+-\entry {process group ID}{637}
+-\entry {process group leader}{637}
+-\entry {process groups}{631}
+-\entry {process ID}{620}
+-\entry {process image}{620}
+-\entry {process lifetime}{620}
+-\entry {process priority}{521}
+-\entry {process signal mask}{562}
+-\entry {process termination}{613}
+-\entry {processor time}{487}
+-\entry {profiling alarm signal}{534}
+-\entry {profiling timer}{513}
+-\entry {program argument syntax}{575}
+-\entry {program arguments}{575}
+-\entry {program arguments, parsing}{576}
+-\entry {program error signals}{529}
+-\entry {program name}{28}
+-\entry {program startup}{575}
+-\entry {program termination}{613}
+-\entry {program termination signals}{532}
+-\entry {programming your own streams}{262}
+-\entry {project complex numbers}{477}
+-\entry {protocol (of socket)}{363}
+-\entry {protocol family}{363}
+-\entry {protocols}{651}
+-\entry {protocols database}{383}
+-\entry {prototypes for variadic functions}{745}
+-\entry {pseudo-random numbers}{451}
+-\entry {pseudo-terminals}{434}
+-\entry {punctuation character}{62, 66}
+-\entry {pushing input back}{219}
+-\initial {Q}
+-\entry {quick sort function (for arrays)}{178}
+-\entry {QUIT character}{427}
+-\entry {quit signal}{533}
+-\entry {quote removal}{199}
+-\initial {R}
+-\entry {race conditions, relating to job control}{637}
+-\entry {race conditions, relating to signals}{548}
+-\entry {radix (of floating point number)}{754}
+-\entry {raising signals}{556}
+-\entry {random numbers}{451}
+-\entry {random-access files}{206}
+-\entry {range error}{465}
+-\entry {range of integer type}{752}
+-\entry {read lock}{314}
+-\entry {reading from a directory}{320}
+-\entry {reading from a file descriptor}{275}
+-\entry {reading from a socket}{392}
+-\entry {reading from a stream, by blocks}{221}
+-\entry {reading from a stream, by characters}{216}
+-\entry {reading from a stream, formatted}{242}
+-\entry {real group ID}{661}
+-\entry {real user ID}{661}
+-\entry {real-time timer}{513}
+-\entry {receiving datagrams}{401}
+-\entry {record locking}{314}
+-\entry {redirecting input and output}{306}
+-\entry {reentrant functions}{552}
+-\entry {reentrant NSS functions}{655}
+-\entry {relative file name}{208}
+-\entry {removal of quotes}{199}
+-\entry {removing a file}{333}
+-\entry {removing macros that shadow functions}{5}
+-\entry {renaming a file}{334}
+-\entry {reporting bugs}{863}
+-\entry {reporting errors}{15}
+-\entry {REPRINT character}{426}
+-\entry {reserved names}{5}
+-\entry {resource limits}{518}
+-\entry {restarting interrupted primitives}{556}
+-\entry {restrictions on signal handler functions}{551}
+-\entry {root directory}{208}
+-\entry {rpc}{651}
+-\entry {running a command}{619}
+-\initial {S}
+-\entry {saved set-group-ID}{662}
+-\entry {saved set-user-ID}{662}
+-\entry {scanning the group list}{683}
+-\entry {scanning the user list}{680}
+-\entry {scatter-gather}{285}
+-\entry {search function (for arrays)}{177}
+-\entry {search functions (for strings)}{86}
+-\entry {seed (for random numbers)}{451}
+-\entry {seeking on a file descriptor}{279}
+-\entry {seeking on a stream}{252}
+-\entry {segmentation violation}{531}
+-\entry {sending a datagram}{401}
+-\entry {sending signals}{556}
+-\entry {sequential-access files}{206}
+-\entry {server}{388}
+-\entry {services}{651}
+-\entry {services database}{381}
+-\entry {session}{631}
+-\entry {session leader}{631}
+-\entry {setting an alarm}{513}
+-\entry {\code {setuid} programs}{662}
+-\entry {setuid programs and file access}{348}
+-\entry {severity class}{266, 267}
+-\entry {shadow}{651}
+-\entry {shadowing functions with macros}{5}
+-\entry {shared lock}{314}
+-\entry {shell}{631}
+-\entry {shift state}{102}
+-\entry {shrinking objects}{52}
+-\entry {shutting down a socket}{387}
+-\entry {\code {sigaction} flags}{543}
+-\entry {\code {sigaction} function}{540}
+-\entry {\code {SIGCHLD}, handling of}{642}
+-\entry {sign (of floating point number)}{754}
+-\entry {signal}{461, 527}
+-\entry {signal action}{528}
+-\entry {signal actions}{538}
+-\entry {signal flags}{543}
+-\entry {\code {signal} function}{538}
+-\entry {signal handler function}{544}
+-\entry {signal mask}{562}
+-\entry {signal messages}{537}
+-\entry {signal names}{529}
+-\entry {signal number}{529}
+-\entry {signal set}{561}
+-\entry {signals, generating}{556}
+-\entry {significand (of floating point number)}{754}
+-\entry {\code {SIGTTIN}, from background job}{632}
+-\entry {\code {SIGTTOU}, from background job}{633}
+-\entry {size of string}{71}
+-\entry {SJIS}{99}
+-\entry {socket}{363}
+-\entry {socket address (name) binding}{365}
+-\entry {socket domain}{363}
+-\entry {socket namespace}{363}
+-\entry {socket option level}{406}
+-\entry {socket options}{406}
+-\entry {socket pair}{387}
+-\entry {socket protocol}{363}
+-\entry {socket shutdown}{387}
+-\entry {socket, client actions}{388}
+-\entry {socket, closing}{387}
+-\entry {socket, connecting}{388}
+-\entry {socket, creating}{386}
+-\entry {socket, initiating a connection}{388}
+-\entry {sockets, accepting connections}{390}
+-\entry {sockets, listening}{390}
+-\entry {sockets, server actions}{390}
+-\entry {soft limit}{519}
+-\entry {soft link}{332}
+-\entry {sort function (for arrays)}{178}
+-\entry {sparse files}{280}
+-\entry {special files}{352}
+-\entry {special functions}{449}
+-\entry {specified action (for a signal)}{528}
+-\entry {square root function}{445}
+-\entry {stable sorting}{178}
+-\entry {standard dot notation, for Internet addresses}{373}
+-\entry {standard environment variables}{611}
+-\entry {standard error file descriptor}{283}
+-\entry {standard error stream}{212}
+-\entry {standard file descriptors}{283}
+-\entry {standard input file descriptor}{283}
+-\entry {standard input stream}{211}
+-\entry {standard output file descriptor}{283}
+-\entry {standard output stream}{211}
+-\entry {standard streams}{211}
+-\entry {standards}{1}
+-\entry {START character}{428}
+-\entry {startup of program}{575}
+-\entry {stateful}{102, 105, 110, 121, 124, 135}
+-\entry {static allocation}{31}
+-\entry {STATUS character}{429}
+-\entry {status codes}{15}
+-\entry {status of a file}{336}
+-\entry {status of obstack}{54}
+-\entry {sticky bit}{345}
+-\entry {STOP character}{428}
+-\entry {stop signal}{535}
+-\entry {stopped job}{632}
+-\entry {stopped jobs, continuing}{644}
+-\entry {stopped jobs, detecting}{641}
+-\entry {storage allocation}{31}
+-\entry {stream (sockets)}{363}
+-\entry {stream, for I/O to a string}{259}
+-\entry {streams and descriptors}{283}
+-\entry {streams, and file descriptors}{282}
+-\entry {streams, standard}{211}
+-\entry {string}{71}
+-\entry {string allocation}{71}
+-\entry {string collation functions}{83}
+-\entry {string comparison functions}{80}
+-\entry {string concatenation functions}{73}
+-\entry {string copy functions}{73}
+-\entry {string length}{71}
+-\entry {string literal}{71}
+-\entry {string search functions}{86}
+-\entry {string stream}{259}
+-\entry {string vectors, null-character separated}{93}
+-\entry {string, representation of}{71}
+-\entry {style of communication (of a socket)}{363}
+-\entry {subshell}{635}
+-\entry {substitution of variables and commands}{199}
+-\entry {successive signals}{549}
+-\entry {summer time}{493}
+-\entry {SunOS}{3}
+-\entry {supplementary group IDs}{661}
+-\entry {SUSP character}{427}
+-\entry {suspend character}{427}
+-\entry {SVID}{3}
+-\entry {symbolic link}{332}
+-\entry {symbolic link, opening}{311}
+-\entry {synchronizing}{292, 301}
+-\entry {syntax error messages, in argp}{591}
+-\entry {syntax, for program arguments}{575}
+-\entry {syntax, for reading numbers}{479}
+-\entry {System V Unix}{3}
+-\initial {T}
+-\entry {TCP (Internet protocol)}{383}
+-\entry {template, for \code {printf}}{221}
+-\entry {template, for \code {scanf}}{242}
+-\entry {\code {TERM} environment variable}{612}
+-\entry {terminal flow control}{432}
+-\entry {terminal identification}{411}
+-\entry {terminal input queue}{412}
+-\entry {terminal input queue, clearing}{431}
+-\entry {terminal input signal}{535}
+-\entry {terminal line control functions}{430}
+-\entry {terminal line speed}{423}
+-\entry {terminal mode data types}{413}
+-\entry {terminal mode functions}{414}
+-\entry {terminal output queue}{412}
+-\entry {terminal output queue, flushing}{431}
+-\entry {terminal output signal}{536}
+-\entry {terminated jobs, detecting}{641}
+-\entry {termination signal}{532}
+-\entry {testing access permission}{348}
+-\entry {testing exit status of child process}{624}
+-\entry {text stream}{251}
+-\entry {ticks, clock}{487}
+-\entry {tilde expansion}{199}
+-\entry {TIME termios slot}{429}
+-\entry {time zone}{507}
+-\entry {time zone database}{509}
+-\entry {time, calendar}{489}
+-\entry {time, elapsed CPU}{487}
+-\entry {time, high precision}{511}
+-\entry {timer, profiling}{513}
+-\entry {timer, real-time}{513}
+-\entry {timer, virtual}{513}
+-\entry {timers, setting}{513}
+-\entry {timing error in signal handling}{567}
+-\entry {TMPDIR environment variable}{355}
+-\entry {tokenizing strings}{88}
+-\entry {tools, for installing library}{860}
+-\entry {transmitting datagrams}{401}
+-\entry {tree, directory}{327}
+-\entry {triangulation}{126}
+-\entry {trigonometric functions}{440}
+-\entry {type measurements, floating}{754}
+-\entry {type measurements, integer}{752}
+-\entry {type modifier character (\code {printf})}{224}
+-\entry {type modifier character (\code {scanf})}{244}
+-\entry {typeahead buffer}{412}
+-\entry {\code {TZ} environment variable}{612}
+-\initial {U}
+-\entry {UCS2}{97}
+-\entry {UCS4}{97}
+-\entry {umask}{346}
+-\entry {unbuffered stream}{256}
+-\entry {unconstrained storage allocation}{32}
+-\entry {undefining macros that shadow functions}{5}
+-\entry {underflow exception}{461}
+-\entry {Unicode}{97}
+-\entry {Unix, Berkeley}{3}
+-\entry {Unix, System V}{3}
+-\entry {unlinking a file}{333}
+-\entry {unordered comparison}{474}
+-\entry {unreading characters}{219}
+-\entry {upgrading from libc5}{862}
+-\entry {upper-case character}{61, 67}
+-\entry {urgent data signal}{534}
+-\entry {urgent socket condition}{398}
+-\entry {usage limits}{518}
+-\entry {usage messages, in argp}{591}
+-\entry {user accounting database}{671}
+-\entry {user database}{678}
+-\entry {user ID}{661}
+-\entry {user ID, determining}{670}
+-\entry {user name}{661}
+-\entry {user signals}{537}
+-\entry {usual file name errors}{208}
+-\entry {UTF-7}{100}
+-\entry {UTF-8}{100}
+-\initial {V}
+-\entry {va_copy}{77}
+-\entry {variable number of arguments}{744}
+-\entry {variable substitution}{199}
+-\entry {variable-sized arrays}{59}
+-\entry {variadic function argument access}{746}
+-\entry {variadic function prototypes}{745}
+-\entry {variadic functions}{744}
+-\entry {variadic functions, calling}{747}
+-\entry {virtual time alarm signal}{534}
+-\entry {virtual timer}{513}
+-\entry {\code {volatile} declarations}{552}
+-\initial {W}
+-\entry {waiting for a signal}{567}
+-\entry {waiting for completion of child process}{624}
+-\entry {waiting for input or output}{289}
+-\entry {WERASE character}{426}
+-\entry {whitespace character}{62, 66}
+-\entry {wide character}{97}
+-\entry {width of integer type}{752}
+-\entry {wildcard expansion}{199}
+-\entry {word expansion}{198}
+-\entry {working directory}{319}
+-\entry {write lock}{314}
+-\entry {writing to a file descriptor}{277}
+-\entry {writing to a socket}{392}
+-\entry {writing to a stream, by blocks}{221}
+-\entry {writing to a stream, by characters}{215}
+-\entry {writing to a stream, formatted}{221}
+-\initial {Z}
+-\entry {zero divide}{461}
+diff -Naur ../glibc-2.1.3/manual/libc.fn glibc-2.1.3/manual/libc.fn
+--- ../glibc-2.1.3/manual/libc.fn	2000-01-05 19:19:29.000000000 -0800
++++ glibc-2.1.3/manual/libc.fn	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1142 +0,0 @@
+-\entry{strerror}{27}{\code {strerror}}
+-\entry{strerror{\_}r}{27}{\code {strerror_r}}
+-\entry{perror}{27}{\code {perror}}
+-\entry{malloc}{32}{\code {malloc}}
+-\entry{free}{34}{\code {free}}
+-\entry{cfree}{34}{\code {cfree}}
+-\entry{realloc}{35}{\code {realloc}}
+-\entry{calloc}{35}{\code {calloc}}
+-\entry{memalign}{36}{\code {memalign}}
+-\entry{valloc}{36}{\code {valloc}}
+-\entry{mallopt}{37}{\code {mallopt}}
+-\entry{mcheck}{37}{\code {mcheck}}
+-\entry{mprobe}{38}{\code {mprobe}}
+-\entry{mallinfo}{42}{\code {mallinfo}}
+-\entry{mtrace}{43}{\code {mtrace}}
+-\entry{muntrace}{43}{\code {muntrace}}
+-\entry{obstack{\_}chunk{\_}alloc}{47}{\code {obstack_chunk_alloc}}
+-\entry{obstack{\_}chunk{\_}free}{47}{\code {obstack_chunk_free}}
+-\entry{obstack{\_}init}{48}{\code {obstack_init}}
+-\entry{obstack{\_}alloc}{49}{\code {obstack_alloc}}
+-\entry{obstack{\_}copy}{49}{\code {obstack_copy}}
+-\entry{obstack{\_}copy0}{49}{\code {obstack_copy0}}
+-\entry{obstack{\_}free}{50}{\code {obstack_free}}
+-\entry{obstack{\_}blank}{51}{\code {obstack_blank}}
+-\entry{obstack{\_}grow}{51}{\code {obstack_grow}}
+-\entry{obstack{\_}grow0}{51}{\code {obstack_grow0}}
+-\entry{obstack{\_}1grow}{51}{\code {obstack_1grow}}
+-\entry{obstack{\_}ptr{\_}grow}{52}{\code {obstack_ptr_grow}}
+-\entry{obstack{\_}int{\_}grow}{52}{\code {obstack_int_grow}}
+-\entry{obstack{\_}finish}{52}{\code {obstack_finish}}
+-\entry{obstack{\_}object{\_}size}{52}{\code {obstack_object_size}}
+-\entry{obstack{\_}room}{53}{\code {obstack_room}}
+-\entry{obstack{\_}1grow{\_}fast}{53}{\code {obstack_1grow_fast}}
+-\entry{obstack{\_}ptr{\_}grow{\_}fast}{53}{\code {obstack_ptr_grow_fast}}
+-\entry{obstack{\_}int{\_}grow{\_}fast}{53}{\code {obstack_int_grow_fast}}
+-\entry{obstack{\_}blank{\_}fast}{53}{\code {obstack_blank_fast}}
+-\entry{obstack{\_}base}{54}{\code {obstack_base}}
+-\entry{obstack{\_}next{\_}free}{54}{\code {obstack_next_free}}
+-\entry{obstack{\_}object{\_}size}{54}{\code {obstack_object_size}}
+-\entry{obstack{\_}alignment{\_}mask}{55}{\code {obstack_alignment_mask}}
+-\entry{obstack{\_}chunk{\_}size}{56}{\code {obstack_chunk_size}}
+-\entry{alloca}{57}{\code {alloca}}
+-\entry{islower}{61}{\code {islower}}
+-\entry{isupper}{61}{\code {isupper}}
+-\entry{isalpha}{61}{\code {isalpha}}
+-\entry{isdigit}{62}{\code {isdigit}}
+-\entry{isalnum}{62}{\code {isalnum}}
+-\entry{isxdigit}{62}{\code {isxdigit}}
+-\entry{ispunct}{62}{\code {ispunct}}
+-\entry{isspace}{62}{\code {isspace}}
+-\entry{isblank}{62}{\code {isblank}}
+-\entry{isgraph}{62}{\code {isgraph}}
+-\entry{isprint}{62}{\code {isprint}}
+-\entry{iscntrl}{63}{\code {iscntrl}}
+-\entry{isascii}{63}{\code {isascii}}
+-\entry{tolower}{63}{\code {tolower}}
+-\entry{toupper}{63}{\code {toupper}}
+-\entry{toascii}{63}{\code {toascii}}
+-\entry{{\_}tolower}{63}{\code {_tolower}}
+-\entry{{\_}toupper}{63}{\code {_toupper}}
+-\entry{wctype}{64}{\code {wctype}}
+-\entry{iswctype}{64}{\code {iswctype}}
+-\entry{iswalnum}{65}{\code {iswalnum}}
+-\entry{iswalpha}{65}{\code {iswalpha}}
+-\entry{iswcntrl}{65}{\code {iswcntrl}}
+-\entry{iswdigit}{65}{\code {iswdigit}}
+-\entry{iswgraph}{66}{\code {iswgraph}}
+-\entry{iswlower}{66}{\code {iswlower}}
+-\entry{iswprint}{66}{\code {iswprint}}
+-\entry{iswpunct}{66}{\code {iswpunct}}
+-\entry{iswspace}{66}{\code {iswspace}}
+-\entry{iswupper}{67}{\code {iswupper}}
+-\entry{iswxdigit}{67}{\code {iswxdigit}}
+-\entry{iswblank}{67}{\code {iswblank}}
+-\entry{wctrans}{68}{\code {wctrans}}
+-\entry{towctrans}{69}{\code {towctrans}}
+-\entry{towlower}{69}{\code {towlower}}
+-\entry{towupper}{69}{\code {towupper}}
+-\entry{strlen}{72}{\code {strlen}}
+-\entry{strnlen}{73}{\code {strnlen}}
+-\entry{memcpy}{74}{\code {memcpy}}
+-\entry{mempcpy}{74}{\code {mempcpy}}
+-\entry{memmove}{74}{\code {memmove}}
+-\entry{memccpy}{74}{\code {memccpy}}
+-\entry{memset}{74}{\code {memset}}
+-\entry{strcpy}{74}{\code {strcpy}}
+-\entry{strncpy}{75}{\code {strncpy}}
+-\entry{strdup}{75}{\code {strdup}}
+-\entry{strndup}{75}{\code {strndup}}
+-\entry{stpcpy}{75}{\code {stpcpy}}
+-\entry{stpncpy}{76}{\code {stpncpy}}
+-\entry{strdupa}{76}{\code {strdupa}}
+-\entry{strndupa}{77}{\code {strndupa}}
+-\entry{strcat}{77}{\code {strcat}}
+-\entry{strncat}{79}{\code {strncat}}
+-\entry{bcopy}{80}{\code {bcopy}}
+-\entry{bzero}{80}{\code {bzero}}
+-\entry{memcmp}{81}{\code {memcmp}}
+-\entry{strcmp}{81}{\code {strcmp}}
+-\entry{strcasecmp}{81}{\code {strcasecmp}}
+-\entry{strncasecmp}{82}{\code {strncasecmp}}
+-\entry{strncmp}{82}{\code {strncmp}}
+-\entry{strverscmp}{82}{\code {strverscmp}}
+-\entry{bcmp}{83}{\code {bcmp}}
+-\entry{strcoll}{84}{\code {strcoll}}
+-\entry{strxfrm}{84}{\code {strxfrm}}
+-\entry{memchr}{86}{\code {memchr}}
+-\entry{strchr}{86}{\code {strchr}}
+-\entry{index}{87}{\code {index}}
+-\entry{strrchr}{87}{\code {strrchr}}
+-\entry{rindex}{87}{\code {rindex}}
+-\entry{strstr}{87}{\code {strstr}}
+-\entry{memmem}{88}{\code {memmem}}
+-\entry{strspn}{88}{\code {strspn}}
+-\entry{strcspn}{88}{\code {strcspn}}
+-\entry{strpbrk}{88}{\code {strpbrk}}
+-\entry{strtok}{88}{\code {strtok}}
+-\entry{strtok{\_}r}{90}{\code {strtok_r}}
+-\entry{strsep}{90}{\code {strsep}}
+-\entry{l64a}{91}{\code {l64a}}
+-\entry{a64l}{92}{\code {a64l}}
+-\entry{argz{\_}create}{93}{\code {argz_create}}
+-\entry{argz{\_}create{\_}sep}{93}{\code {argz_create_sep}}
+-\entry{argz{\_}count}{93}{\code {argz_count}}
+-\entry{argz{\_}extract}{94}{\code {argz_extract}}
+-\entry{argz{\_}stringify}{94}{\code {argz_stringify}}
+-\entry{argz{\_}add}{94}{\code {argz_add}}
+-\entry{argz{\_}add{\_}sep}{94}{\code {argz_add_sep}}
+-\entry{argz{\_}append}{94}{\code {argz_append}}
+-\entry{argz{\_}delete}{94}{\code {argz_delete}}
+-\entry{argz{\_}insert}{94}{\code {argz_insert}}
+-\entry{argz{\_}next}{95}{\code {argz_next}}
+-\entry{argz{\_}replace}{95}{\code {argz_replace}}
+-\entry{envz{\_}entry}{95}{\code {envz_entry}}
+-\entry{envz{\_}get}{96}{\code {envz_get}}
+-\entry{envz{\_}add}{96}{\code {envz_add}}
+-\entry{envz{\_}merge}{96}{\code {envz_merge}}
+-\entry{envz{\_}strip}{96}{\code {envz_strip}}
+-\entry{mbsinit}{103}{\code {mbsinit}}
+-\entry{btowc}{104}{\code {btowc}}
+-\entry{wctob}{105}{\code {wctob}}
+-\entry{mbrtowc}{105}{\code {mbrtowc}}
+-\entry{mbrlen}{106}{\code {mbrlen}}
+-\entry{wcrtomb}{107}{\code {wcrtomb}}
+-\entry{mbsrtowcs}{110}{\code {mbsrtowcs}}
+-\entry{wcsrtombs}{111}{\code {wcsrtombs}}
+-\entry{mbsnrtowcs}{112}{\code {mbsnrtowcs}}
+-\entry{wcsnrtombs}{112}{\code {wcsnrtombs}}
+-\entry{mbtowc}{115}{\code {mbtowc}}
+-\entry{wctomb}{115}{\code {wctomb}}
+-\entry{mblen}{116}{\code {mblen}}
+-\entry{mbstowcs}{116}{\code {mbstowcs}}
+-\entry{wcstombs}{117}{\code {wcstombs}}
+-\entry{iconv{\_}open}{119}{\code {iconv_open}}
+-\entry{iconv{\_}close}{120}{\code {iconv_close}}
+-\entry{iconv}{121}{\code {iconv}}
+-\entry{setlocale}{143}{\code {setlocale}}
+-\entry{localeconv}{146}{\code {localeconv}}
+-\entry{nl{\_}langinfo}{150}{\code {nl_langinfo}}
+-\entry{strfmon}{155}{\code {strfmon}}
+-\entry{catopen}{159}{\code {catopen}}
+-\entry{catgets}{162}{\code {catgets}}
+-\entry{catclose}{162}{\code {catclose}}
+-\entry{gettext}{169}{\code {gettext}}
+-\entry{dgettext}{170}{\code {dgettext}}
+-\entry{dcgettext}{170}{\code {dcgettext}}
+-\entry{textdomain}{172}{\code {textdomain}}
+-\entry{bindtextdomain}{172}{\code {bindtextdomain}}
+-\entry{lfind}{177}{\code {lfind}}
+-\entry{lsearch}{178}{\code {lsearch}}
+-\entry{bsearch}{178}{\code {bsearch}}
+-\entry{qsort}{178}{\code {qsort}}
+-\entry{hcreate}{182}{\code {hcreate}}
+-\entry{hdestroy}{182}{\code {hdestroy}}
+-\entry{hsearch}{183}{\code {hsearch}}
+-\entry{hcreate{\_}r}{183}{\code {hcreate_r}}
+-\entry{hdestroy{\_}r}{183}{\code {hdestroy_r}}
+-\entry{hsearch{\_}r}{184}{\code {hsearch_r}}
+-\entry{tsearch}{184}{\code {tsearch}}
+-\entry{tfind}{185}{\code {tfind}}
+-\entry{tdelete}{185}{\code {tdelete}}
+-\entry{tdestroy}{185}{\code {tdestroy}}
+-\entry{twalk}{186}{\code {twalk}}
+-\entry{fnmatch}{187}{\code {fnmatch}}
+-\entry{glob}{189}{\code {glob}}
+-\entry{globfree}{193}{\code {globfree}}
+-\entry{regcomp}{194}{\code {regcomp}}
+-\entry{regexec}{195}{\code {regexec}}
+-\entry{regfree}{198}{\code {regfree}}
+-\entry{regerror}{198}{\code {regerror}}
+-\entry{wordexp}{200}{\code {wordexp}}
+-\entry{wordfree}{200}{\code {wordfree}}
+-\entry{fopen}{212}{\code {fopen}}
+-\entry{fopen64}{213}{\code {fopen64}}
+-\entry{freopen}{214}{\code {freopen}}
+-\entry{freopen64}{214}{\code {freopen64}}
+-\entry{fclose}{214}{\code {fclose}}
+-\entry{fcloseall}{215}{\code {fcloseall}}
+-\entry{fputc}{215}{\code {fputc}}
+-\entry{putc}{215}{\code {putc}}
+-\entry{putchar}{216}{\code {putchar}}
+-\entry{fputs}{216}{\code {fputs}}
+-\entry{puts}{216}{\code {puts}}
+-\entry{putw}{216}{\code {putw}}
+-\entry{fgetc}{216}{\code {fgetc}}
+-\entry{getc}{217}{\code {getc}}
+-\entry{getchar}{217}{\code {getchar}}
+-\entry{getw}{217}{\code {getw}}
+-\entry{getline}{218}{\code {getline}}
+-\entry{getdelim}{218}{\code {getdelim}}
+-\entry{fgets}{218}{\code {fgets}}
+-\entry{gets}{219}{\code {gets}}
+-\entry{ungetc}{220}{\code {ungetc}}
+-\entry{fread}{221}{\code {fread}}
+-\entry{fwrite}{221}{\code {fwrite}}
+-\entry{printf}{230}{\code {printf}}
+-\entry{fprintf}{230}{\code {fprintf}}
+-\entry{sprintf}{230}{\code {sprintf}}
+-\entry{snprintf}{230}{\code {snprintf}}
+-\entry{asprintf}{231}{\code {asprintf}}
+-\entry{obstack{\_}printf}{231}{\code {obstack_printf}}
+-\entry{vprintf}{232}{\code {vprintf}}
+-\entry{vfprintf}{233}{\code {vfprintf}}
+-\entry{vsprintf}{233}{\code {vsprintf}}
+-\entry{vsnprintf}{233}{\code {vsnprintf}}
+-\entry{vasprintf}{233}{\code {vasprintf}}
+-\entry{obstack{\_}vprintf}{233}{\code {obstack_vprintf}}
+-\entry{parse{\_}printf{\_}format}{234}{\code {parse_printf_format}}
+-\entry{register{\_}printf{\_}function}{237}{\code {register_printf_function}}
+-\entry{printf{\_}size}{241}{\code {printf_size}}
+-\entry{printf{\_}size{\_}info}{242}{\code {printf_size_info}}
+-\entry{scanf}{249}{\code {scanf}}
+-\entry{fscanf}{249}{\code {fscanf}}
+-\entry{sscanf}{249}{\code {sscanf}}
+-\entry{vscanf}{250}{\code {vscanf}}
+-\entry{vfscanf}{250}{\code {vfscanf}}
+-\entry{vsscanf}{250}{\code {vsscanf}}
+-\entry{clearerr}{250}{\code {clearerr}}
+-\entry{feof}{251}{\code {feof}}
+-\entry{ferror}{251}{\code {ferror}}
+-\entry{ftell}{252}{\code {ftell}}
+-\entry{ftello}{252}{\code {ftello}}
+-\entry{ftello64}{252}{\code {ftello64}}
+-\entry{fseek}{253}{\code {fseek}}
+-\entry{fseeko}{253}{\code {fseeko}}
+-\entry{fseeko64}{253}{\code {fseeko64}}
+-\entry{rewind}{254}{\code {rewind}}
+-\entry{fgetpos}{255}{\code {fgetpos}}
+-\entry{fgetpos64}{255}{\code {fgetpos64}}
+-\entry{fsetpos}{256}{\code {fsetpos}}
+-\entry{fsetpos64}{256}{\code {fsetpos64}}
+-\entry{fflush}{257}{\code {fflush}}
+-\entry{setvbuf}{258}{\code {setvbuf}}
+-\entry{setbuf}{259}{\code {setbuf}}
+-\entry{setbuffer}{259}{\code {setbuffer}}
+-\entry{setlinebuf}{259}{\code {setlinebuf}}
+-\entry{fmemopen}{259}{\code {fmemopen}}
+-\entry{open{\_}memstream}{260}{\code {open_memstream}}
+-\entry{open{\_}obstack{\_}stream}{261}{\code {open_obstack_stream}}
+-\entry{fopencookie}{263}{\code {fopencookie}}
+-\entry{fmtmsg}{265}{\code {fmtmsg}}
+-\entry{addseverity}{267}{\code {addseverity}}
+-\entry{open}{271}{\code {open}}
+-\entry{open64}{272}{\code {open64}}
+-\entry{creat}{272}{\code {creat}}
+-\entry{creat64}{273}{\code {creat64}}
+-\entry{close}{273}{\code {close}}
+-\entry{truncate}{274}{\code {truncate}}
+-\entry{truncate64}{274}{\code {truncate64}}
+-\entry{ftruncate}{274}{\code {ftruncate}}
+-\entry{ftruncate64}{275}{\code {ftruncate64}}
+-\entry{read}{275}{\code {read}}
+-\entry{pread}{276}{\code {pread}}
+-\entry{pread64}{277}{\code {pread64}}
+-\entry{write}{277}{\code {write}}
+-\entry{pwrite}{279}{\code {pwrite}}
+-\entry{pwrite64}{279}{\code {pwrite64}}
+-\entry{lseek}{280}{\code {lseek}}
+-\entry{lseek64}{281}{\code {lseek64}}
+-\entry{fdopen}{282}{\code {fdopen}}
+-\entry{fileno}{283}{\code {fileno}}
+-\entry{fclean}{284}{\code {fclean}}
+-\entry{readv}{285}{\code {readv}}
+-\entry{writev}{285}{\code {writev}}
+-\entry{mmap}{286}{\code {mmap}}
+-\entry{munmap}{288}{\code {munmap}}
+-\entry{msync}{288}{\code {msync}}
+-\entry{mremap}{288}{\code {mremap}}
+-\entry{FD{\_}ZERO}{290}{\code {FD_ZERO}}
+-\entry{FD{\_}SET}{290}{\code {FD_SET}}
+-\entry{FD{\_}CLR}{290}{\code {FD_CLR}}
+-\entry{FD{\_}ISSET}{290}{\code {FD_ISSET}}
+-\entry{select}{290}{\code {select}}
+-\entry{sync}{292}{\code {sync}}
+-\entry{fsync}{292}{\code {fsync}}
+-\entry{fdatasync}{293}{\code {fdatasync}}
+-\entry{aio{\_}read}{296}{\code {aio_read}}
+-\entry{aio{\_}read64}{297}{\code {aio_read64}}
+-\entry{aio{\_}write}{297}{\code {aio_write}}
+-\entry{aio{\_}write64}{298}{\code {aio_write64}}
+-\entry{lio{\_}listio}{298}{\code {lio_listio}}
+-\entry{lio{\_}listio64}{299}{\code {lio_listio64}}
+-\entry{aio{\_}error}{300}{\code {aio_error}}
+-\entry{aio{\_}error64}{300}{\code {aio_error64}}
+-\entry{aio{\_}return}{300}{\code {aio_return}}
+-\entry{aio{\_}return64}{301}{\code {aio_return64}}
+-\entry{aio{\_}fsync}{301}{\code {aio_fsync}}
+-\entry{aio{\_}fsync64}{302}{\code {aio_fsync64}}
+-\entry{aio{\_}suspend}{302}{\code {aio_suspend}}
+-\entry{aio{\_}suspend64}{303}{\code {aio_suspend64}}
+-\entry{aio{\_}cancel}{303}{\code {aio_cancel}}
+-\entry{aio{\_}cancel64}{304}{\code {aio_cancel64}}
+-\entry{aio{\_}init}{304}{\code {aio_init}}
+-\entry{fcntl}{305}{\code {fcntl}}
+-\entry{dup}{306}{\code {dup}}
+-\entry{dup2}{306}{\code {dup2}}
+-\entry{ioctl}{318}{\code {ioctl}}
+-\entry{getcwd}{319}{\code {getcwd}}
+-\entry{getwd}{320}{\code {getwd}}
+-\entry{chdir}{320}{\code {chdir}}
+-\entry{IFTODT}{321}{\code {IFTODT}}
+-\entry{DTTOIF}{322}{\code {DTTOIF}}
+-\entry{opendir}{322}{\code {opendir}}
+-\entry{readdir}{323}{\code {readdir}}
+-\entry{readdir{\_}r}{323}{\code {readdir_r}}
+-\entry{closedir}{323}{\code {closedir}}
+-\entry{rewinddir}{324}{\code {rewinddir}}
+-\entry{telldir}{324}{\code {telldir}}
+-\entry{seekdir}{324}{\code {seekdir}}
+-\entry{scandir}{325}{\code {scandir}}
+-\entry{alphasort}{325}{\code {alphasort}}
+-\entry{versionsort}{325}{\code {versionsort}}
+-\entry{scandir64}{325}{\code {scandir64}}
+-\entry{alphasort64}{326}{\code {alphasort64}}
+-\entry{versionsort64}{326}{\code {versionsort64}}
+-\entry{ftw}{329}{\code {ftw}}
+-\entry{ftw64}{329}{\code {ftw64}}
+-\entry{nftw}{329}{\code {nftw}}
+-\entry{nftw64}{330}{\code {nftw64}}
+-\entry{link}{331}{\code {link}}
+-\entry{symlink}{332}{\code {symlink}}
+-\entry{readlink}{332}{\code {readlink}}
+-\entry{unlink}{333}{\code {unlink}}
+-\entry{rmdir}{334}{\code {rmdir}}
+-\entry{remove}{334}{\code {remove}}
+-\entry{rename}{334}{\code {rename}}
+-\entry{mkdir}{335}{\code {mkdir}}
+-\entry{stat}{340}{\code {stat}}
+-\entry{stat64}{340}{\code {stat64}}
+-\entry{fstat}{341}{\code {fstat}}
+-\entry{fstat64}{341}{\code {fstat64}}
+-\entry{lstat}{341}{\code {lstat}}
+-\entry{lstat64}{341}{\code {lstat64}}
+-\entry{S{\_}ISDIR}{342}{\code {S_ISDIR}}
+-\entry{S{\_}ISCHR}{342}{\code {S_ISCHR}}
+-\entry{S{\_}ISBLK}{342}{\code {S_ISBLK}}
+-\entry{S{\_}ISREG}{342}{\code {S_ISREG}}
+-\entry{S{\_}ISFIFO}{342}{\code {S_ISFIFO}}
+-\entry{S{\_}ISLNK}{342}{\code {S_ISLNK}}
+-\entry{S{\_}ISSOCK}{342}{\code {S_ISSOCK}}
+-\entry{chown}{343}{\code {chown}}
+-\entry{fchown}{344}{\code {fchown}}
+-\entry{chmod}{346}{\code {chmod}}
+-\entry{umask}{347}{\code {umask}}
+-\entry{getumask}{347}{\code {getumask}}
+-\entry{chmod}{347}{\code {chmod}}
+-\entry{fchmod}{347}{\code {fchmod}}
+-\entry{access}{348}{\code {access}}
+-\entry{utime}{350}{\code {utime}}
+-\entry{utimes}{350}{\code {utimes}}
+-\entry{truncate}{351}{\code {truncate}}
+-\entry{ftruncate}{351}{\code {ftruncate}}
+-\entry{mknod}{352}{\code {mknod}}
+-\entry{tmpfile}{353}{\code {tmpfile}}
+-\entry{tmpfile64}{353}{\code {tmpfile64}}
+-\entry{tmpnam}{354}{\code {tmpnam}}
+-\entry{tmpnam{\_}r}{354}{\code {tmpnam_r}}
+-\entry{tempnam}{354}{\code {tempnam}}
+-\entry{mktemp}{355}{\code {mktemp}}
+-\entry{mkstemp}{355}{\code {mkstemp}}
+-\entry{pipe}{357}{\code {pipe}}
+-\entry{popen}{359}{\code {popen}}
+-\entry{pclose}{359}{\code {pclose}}
+-\entry{mkfifo}{360}{\code {mkfifo}}
+-\entry{bind}{367}{\code {bind}}
+-\entry{getsockname}{367}{\code {getsockname}}
+-\entry{if{\_}nametoindex}{368}{\code {if_nametoindex}}
+-\entry{if{\_}indextoname}{368}{\code {if_indextoname}}
+-\entry{if{\_}nameindex}{368}{\code {if_nameindex}}
+-\entry{if{\_}freenameindex}{369}{\code {if_freenameindex}}
+-\entry{SUN{\_}LEN}{370}{\code {SUN_LEN}}
+-\entry{inet{\_}aton}{376}{\code {inet_aton}}
+-\entry{inet{\_}addr}{376}{\code {inet_addr}}
+-\entry{inet{\_}network}{376}{\code {inet_network}}
+-\entry{inet{\_}ntoa}{376}{\code {inet_ntoa}}
+-\entry{inet{\_}makeaddr}{376}{\code {inet_makeaddr}}
+-\entry{inet{\_}lnaof}{376}{\code {inet_lnaof}}
+-\entry{inet{\_}netof}{377}{\code {inet_netof}}
+-\entry{inet{\_}pton}{377}{\code {inet_pton}}
+-\entry{inet{\_}ntop}{377}{\code {inet_ntop}}
+-\entry{gethostbyname}{378}{\code {gethostbyname}}
+-\entry{gethostbyname2}{378}{\code {gethostbyname2}}
+-\entry{gethostbyaddr}{378}{\code {gethostbyaddr}}
+-\entry{gethostbyname{\_}r}{379}{\code {gethostbyname_r}}
+-\entry{gethostbyname2{\_}r}{380}{\code {gethostbyname2_r}}
+-\entry{gethostbyaddr{\_}r}{380}{\code {gethostbyaddr_r}}
+-\entry{sethostent}{380}{\code {sethostent}}
+-\entry{gethostent}{380}{\code {gethostent}}
+-\entry{endhostent}{380}{\code {endhostent}}
+-\entry{getservbyname}{382}{\code {getservbyname}}
+-\entry{getservbyport}{382}{\code {getservbyport}}
+-\entry{setservent}{382}{\code {setservent}}
+-\entry{getservent}{382}{\code {getservent}}
+-\entry{endservent}{382}{\code {endservent}}
+-\entry{htons}{383}{\code {htons}}
+-\entry{ntohs}{383}{\code {ntohs}}
+-\entry{htonl}{383}{\code {htonl}}
+-\entry{ntohl}{383}{\code {ntohl}}
+-\entry{getprotobyname}{384}{\code {getprotobyname}}
+-\entry{getprotobynumber}{384}{\code {getprotobynumber}}
+-\entry{setprotoent}{384}{\code {setprotoent}}
+-\entry{getprotoent}{384}{\code {getprotoent}}
+-\entry{endprotoent}{385}{\code {endprotoent}}
+-\entry{socket}{386}{\code {socket}}
+-\entry{shutdown}{387}{\code {shutdown}}
+-\entry{socketpair}{388}{\code {socketpair}}
+-\entry{connect}{389}{\code {connect}}
+-\entry{listen}{390}{\code {listen}}
+-\entry{accept}{391}{\code {accept}}
+-\entry{getpeername}{391}{\code {getpeername}}
+-\entry{send}{392}{\code {send}}
+-\entry{recv}{393}{\code {recv}}
+-\entry{sendto}{401}{\code {sendto}}
+-\entry{recvfrom}{401}{\code {recvfrom}}
+-\entry{getsockopt}{406}{\code {getsockopt}}
+-\entry{setsockopt}{407}{\code {setsockopt}}
+-\entry{getnetbyname}{409}{\code {getnetbyname}}
+-\entry{getnetbyaddr}{409}{\code {getnetbyaddr}}
+-\entry{setnetent}{409}{\code {setnetent}}
+-\entry{getnetent}{409}{\code {getnetent}}
+-\entry{endnetent}{409}{\code {endnetent}}
+-\entry{isatty}{411}{\code {isatty}}
+-\entry{ttyname}{411}{\code {ttyname}}
+-\entry{ttyname{\_}r}{411}{\code {ttyname_r}}
+-\entry{tcgetattr}{414}{\code {tcgetattr}}
+-\entry{tcsetattr}{414}{\code {tcsetattr}}
+-\entry{cfgetospeed}{424}{\code {cfgetospeed}}
+-\entry{cfgetispeed}{424}{\code {cfgetispeed}}
+-\entry{cfsetospeed}{424}{\code {cfsetospeed}}
+-\entry{cfsetispeed}{424}{\code {cfsetispeed}}
+-\entry{cfsetspeed}{424}{\code {cfsetspeed}}
+-\entry{cfmakeraw}{430}{\code {cfmakeraw}}
+-\entry{tcsendbreak}{431}{\code {tcsendbreak}}
+-\entry{tcdrain}{431}{\code {tcdrain}}
+-\entry{tcflush}{431}{\code {tcflush}}
+-\entry{tcflow}{432}{\code {tcflow}}
+-\entry{getpt}{434}{\code {getpt}}
+-\entry{grantpt}{434}{\code {grantpt}}
+-\entry{unlockpt}{435}{\code {unlockpt}}
+-\entry{ptsname}{435}{\code {ptsname}}
+-\entry{ptsname{\_}r}{435}{\code {ptsname_r}}
+-\entry{openpty}{436}{\code {openpty}}
+-\entry{forkpty}{437}{\code {forkpty}}
+-\entry{sin}{440}{\code {sin}}
+-\entry{sinf}{440}{\code {sinf}}
+-\entry{sinl}{440}{\code {sinl}}
+-\entry{cos}{440}{\code {cos}}
+-\entry{cosf}{440}{\code {cosf}}
+-\entry{cosl}{440}{\code {cosl}}
+-\entry{tan}{440}{\code {tan}}
+-\entry{tanf}{440}{\code {tanf}}
+-\entry{tanl}{440}{\code {tanl}}
+-\entry{sincos}{441}{\code {sincos}}
+-\entry{sincosf}{441}{\code {sincosf}}
+-\entry{sincosl}{441}{\code {sincosl}}
+-\entry{csin}{441}{\code {csin}}
+-\entry{csinf}{441}{\code {csinf}}
+-\entry{csinl}{441}{\code {csinl}}
+-\entry{ccos}{441}{\code {ccos}}
+-\entry{ccosf}{441}{\code {ccosf}}
+-\entry{ccosl}{441}{\code {ccosl}}
+-\entry{ctan}{441}{\code {ctan}}
+-\entry{ctanf}{441}{\code {ctanf}}
+-\entry{ctanl}{441}{\code {ctanl}}
+-\entry{asin}{442}{\code {asin}}
+-\entry{asinf}{442}{\code {asinf}}
+-\entry{asinl}{442}{\code {asinl}}
+-\entry{acos}{442}{\code {acos}}
+-\entry{acosf}{442}{\code {acosf}}
+-\entry{acosl}{442}{\code {acosl}}
+-\entry{atan}{442}{\code {atan}}
+-\entry{atanf}{442}{\code {atanf}}
+-\entry{atanl}{442}{\code {atanl}}
+-\entry{atan2}{442}{\code {atan2}}
+-\entry{atan2f}{442}{\code {atan2f}}
+-\entry{atan2l}{442}{\code {atan2l}}
+-\entry{casin}{443}{\code {casin}}
+-\entry{casinf}{443}{\code {casinf}}
+-\entry{casinl}{443}{\code {casinl}}
+-\entry{cacos}{443}{\code {cacos}}
+-\entry{cacosf}{443}{\code {cacosf}}
+-\entry{cacosl}{443}{\code {cacosl}}
+-\entry{catan}{443}{\code {catan}}
+-\entry{catanf}{443}{\code {catanf}}
+-\entry{catanl}{443}{\code {catanl}}
+-\entry{exp}{443}{\code {exp}}
+-\entry{expf}{443}{\code {expf}}
+-\entry{expl}{443}{\code {expl}}
+-\entry{exp2}{443}{\code {exp2}}
+-\entry{exp2f}{443}{\code {exp2f}}
+-\entry{exp2l}{443}{\code {exp2l}}
+-\entry{exp10}{443}{\code {exp10}}
+-\entry{exp10f}{443}{\code {exp10f}}
+-\entry{exp10l}{443}{\code {exp10l}}
+-\entry{pow10}{443}{\code {pow10}}
+-\entry{pow10f}{443}{\code {pow10f}}
+-\entry{pow10l}{443}{\code {pow10l}}
+-\entry{log}{444}{\code {log}}
+-\entry{logf}{444}{\code {logf}}
+-\entry{logl}{444}{\code {logl}}
+-\entry{log10}{444}{\code {log10}}
+-\entry{log10f}{444}{\code {log10f}}
+-\entry{log10l}{444}{\code {log10l}}
+-\entry{log2}{444}{\code {log2}}
+-\entry{log2f}{444}{\code {log2f}}
+-\entry{log2l}{444}{\code {log2l}}
+-\entry{logb}{444}{\code {logb}}
+-\entry{logbf}{444}{\code {logbf}}
+-\entry{logbl}{444}{\code {logbl}}
+-\entry{ilogb}{444}{\code {ilogb}}
+-\entry{ilogbf}{444}{\code {ilogbf}}
+-\entry{ilogbl}{444}{\code {ilogbl}}
+-\entry{pow}{445}{\code {pow}}
+-\entry{powf}{445}{\code {powf}}
+-\entry{powl}{445}{\code {powl}}
+-\entry{sqrt}{445}{\code {sqrt}}
+-\entry{sqrtf}{445}{\code {sqrtf}}
+-\entry{sqrtl}{445}{\code {sqrtl}}
+-\entry{cbrt}{445}{\code {cbrt}}
+-\entry{cbrtf}{445}{\code {cbrtf}}
+-\entry{cbrtl}{445}{\code {cbrtl}}
+-\entry{hypot}{445}{\code {hypot}}
+-\entry{hypotf}{445}{\code {hypotf}}
+-\entry{hypotl}{445}{\code {hypotl}}
+-\entry{expm1}{446}{\code {expm1}}
+-\entry{expm1f}{446}{\code {expm1f}}
+-\entry{expm1l}{446}{\code {expm1l}}
+-\entry{log1p}{446}{\code {log1p}}
+-\entry{log1pf}{446}{\code {log1pf}}
+-\entry{log1pl}{446}{\code {log1pl}}
+-\entry{cexp}{446}{\code {cexp}}
+-\entry{cexpf}{446}{\code {cexpf}}
+-\entry{cexpl}{446}{\code {cexpl}}
+-\entry{clog}{446}{\code {clog}}
+-\entry{clogf}{446}{\code {clogf}}
+-\entry{clogl}{446}{\code {clogl}}
+-\entry{clog10}{446}{\code {clog10}}
+-\entry{clog10f}{446}{\code {clog10f}}
+-\entry{clog10l}{446}{\code {clog10l}}
+-\entry{csqrt}{447}{\code {csqrt}}
+-\entry{csqrtf}{447}{\code {csqrtf}}
+-\entry{csqrtl}{447}{\code {csqrtl}}
+-\entry{cpow}{447}{\code {cpow}}
+-\entry{cpowf}{447}{\code {cpowf}}
+-\entry{cpowl}{447}{\code {cpowl}}
+-\entry{sinh}{447}{\code {sinh}}
+-\entry{sinhf}{447}{\code {sinhf}}
+-\entry{sinhl}{447}{\code {sinhl}}
+-\entry{cosh}{447}{\code {cosh}}
+-\entry{coshf}{447}{\code {coshf}}
+-\entry{coshl}{447}{\code {coshl}}
+-\entry{tanh}{447}{\code {tanh}}
+-\entry{tanhf}{447}{\code {tanhf}}
+-\entry{tanhl}{447}{\code {tanhl}}
+-\entry{csinh}{447}{\code {csinh}}
+-\entry{csinhf}{447}{\code {csinhf}}
+-\entry{csinhl}{447}{\code {csinhl}}
+-\entry{ccosh}{448}{\code {ccosh}}
+-\entry{ccoshf}{448}{\code {ccoshf}}
+-\entry{ccoshl}{448}{\code {ccoshl}}
+-\entry{ctanh}{448}{\code {ctanh}}
+-\entry{ctanhf}{448}{\code {ctanhf}}
+-\entry{ctanhl}{448}{\code {ctanhl}}
+-\entry{asinh}{448}{\code {asinh}}
+-\entry{asinhf}{448}{\code {asinhf}}
+-\entry{asinhl}{448}{\code {asinhl}}
+-\entry{acosh}{448}{\code {acosh}}
+-\entry{acoshf}{448}{\code {acoshf}}
+-\entry{acoshl}{448}{\code {acoshl}}
+-\entry{atanh}{448}{\code {atanh}}
+-\entry{atanhf}{448}{\code {atanhf}}
+-\entry{atanhl}{448}{\code {atanhl}}
+-\entry{casinh}{448}{\code {casinh}}
+-\entry{casinhf}{448}{\code {casinhf}}
+-\entry{casinhl}{448}{\code {casinhl}}
+-\entry{cacosh}{448}{\code {cacosh}}
+-\entry{cacoshf}{448}{\code {cacoshf}}
+-\entry{cacoshl}{448}{\code {cacoshl}}
+-\entry{catanh}{449}{\code {catanh}}
+-\entry{catanhf}{449}{\code {catanhf}}
+-\entry{catanhl}{449}{\code {catanhl}}
+-\entry{erf}{449}{\code {erf}}
+-\entry{erff}{449}{\code {erff}}
+-\entry{erfl}{449}{\code {erfl}}
+-\entry{erfc}{449}{\code {erfc}}
+-\entry{erfcf}{449}{\code {erfcf}}
+-\entry{erfcl}{449}{\code {erfcl}}
+-\entry{lgamma}{449}{\code {lgamma}}
+-\entry{lgammaf}{449}{\code {lgammaf}}
+-\entry{lgammal}{449}{\code {lgammal}}
+-\entry{lgamma{\_}r}{450}{\code {lgamma_r}}
+-\entry{lgammaf{\_}r}{450}{\code {lgammaf_r}}
+-\entry{lgammal{\_}r}{450}{\code {lgammal_r}}
+-\entry{gamma}{450}{\code {gamma}}
+-\entry{gammaf}{450}{\code {gammaf}}
+-\entry{gammal}{450}{\code {gammal}}
+-\entry{tgamma}{450}{\code {tgamma}}
+-\entry{tgammaf}{450}{\code {tgammaf}}
+-\entry{tgammal}{450}{\code {tgammal}}
+-\entry{j0}{450}{\code {j0}}
+-\entry{j0f}{450}{\code {j0f}}
+-\entry{j0l}{450}{\code {j0l}}
+-\entry{j1}{450}{\code {j1}}
+-\entry{j1f}{450}{\code {j1f}}
+-\entry{j1l}{450}{\code {j1l}}
+-\entry{jn}{450}{\code {jn}}
+-\entry{jnf}{450}{\code {jnf}}
+-\entry{jnl}{450}{\code {jnl}}
+-\entry{y0}{450}{\code {y0}}
+-\entry{y0f}{450}{\code {y0f}}
+-\entry{y0l}{450}{\code {y0l}}
+-\entry{y1}{451}{\code {y1}}
+-\entry{y1f}{451}{\code {y1f}}
+-\entry{y1l}{451}{\code {y1l}}
+-\entry{yn}{451}{\code {yn}}
+-\entry{ynf}{451}{\code {ynf}}
+-\entry{ynl}{451}{\code {ynl}}
+-\entry{rand}{452}{\code {rand}}
+-\entry{srand}{452}{\code {srand}}
+-\entry{rand{\_}r}{452}{\code {rand_r}}
+-\entry{random}{452}{\code {random}}
+-\entry{srandom}{452}{\code {srandom}}
+-\entry{initstate}{453}{\code {initstate}}
+-\entry{setstate}{453}{\code {setstate}}
+-\entry{drand48}{453}{\code {drand48}}
+-\entry{erand48}{454}{\code {erand48}}
+-\entry{lrand48}{454}{\code {lrand48}}
+-\entry{nrand48}{454}{\code {nrand48}}
+-\entry{mrand48}{454}{\code {mrand48}}
+-\entry{jrand48}{454}{\code {jrand48}}
+-\entry{srand48}{454}{\code {srand48}}
+-\entry{seed48}{455}{\code {seed48}}
+-\entry{lcong48}{455}{\code {lcong48}}
+-\entry{drand48{\_}r}{455}{\code {drand48_r}}
+-\entry{erand48{\_}r}{456}{\code {erand48_r}}
+-\entry{lrand48{\_}r}{456}{\code {lrand48_r}}
+-\entry{nrand48{\_}r}{456}{\code {nrand48_r}}
+-\entry{mrand48{\_}r}{456}{\code {mrand48_r}}
+-\entry{jrand48{\_}r}{456}{\code {jrand48_r}}
+-\entry{srand48{\_}r}{457}{\code {srand48_r}}
+-\entry{seed48{\_}r}{457}{\code {seed48_r}}
+-\entry{lcong48{\_}r}{457}{\code {lcong48_r}}
+-\entry{fpclassify}{459}{\code {fpclassify}}
+-\entry{isfinite}{460}{\code {isfinite}}
+-\entry{isnormal}{460}{\code {isnormal}}
+-\entry{isnan}{460}{\code {isnan}}
+-\entry{isinf}{460}{\code {isinf}}
+-\entry{isinff}{460}{\code {isinff}}
+-\entry{isinfl}{460}{\code {isinfl}}
+-\entry{isnan}{460}{\code {isnan}}
+-\entry{isnanf}{460}{\code {isnanf}}
+-\entry{isnanl}{460}{\code {isnanl}}
+-\entry{finite}{461}{\code {finite}}
+-\entry{finitef}{461}{\code {finitef}}
+-\entry{finitel}{461}{\code {finitel}}
+-\entry{infnan}{461}{\code {infnan}}
+-\entry{matherr}{461}{\code {matherr}}
+-\entry{feclearexcept}{464}{\code {feclearexcept}}
+-\entry{fetestexcept}{464}{\code {fetestexcept}}
+-\entry{fegetexceptflag}{465}{\code {fegetexceptflag}}
+-\entry{fesetexceptflag}{465}{\code {fesetexceptflag}}
+-\entry{fegetround}{467}{\code {fegetround}}
+-\entry{fesetround}{467}{\code {fesetround}}
+-\entry{fegetenv}{468}{\code {fegetenv}}
+-\entry{feholdexcept}{468}{\code {feholdexcept}}
+-\entry{fesetenv}{468}{\code {fesetenv}}
+-\entry{feupdateenv}{468}{\code {feupdateenv}}
+-\entry{abs}{469}{\code {abs}}
+-\entry{labs}{469}{\code {labs}}
+-\entry{llabs}{469}{\code {llabs}}
+-\entry{imaxabs}{469}{\code {imaxabs}}
+-\entry{fabs}{469}{\code {fabs}}
+-\entry{fabsf}{469}{\code {fabsf}}
+-\entry{fabsl}{469}{\code {fabsl}}
+-\entry{cabs}{469}{\code {cabs}}
+-\entry{cabsf}{469}{\code {cabsf}}
+-\entry{cabsl}{469}{\code {cabsl}}
+-\entry{frexp}{469}{\code {frexp}}
+-\entry{frexpf}{469}{\code {frexpf}}
+-\entry{frexpl}{469}{\code {frexpl}}
+-\entry{ldexp}{470}{\code {ldexp}}
+-\entry{ldexpf}{470}{\code {ldexpf}}
+-\entry{ldexpl}{470}{\code {ldexpl}}
+-\entry{logb}{470}{\code {logb}}
+-\entry{logbf}{470}{\code {logbf}}
+-\entry{logbl}{470}{\code {logbl}}
+-\entry{scalb}{470}{\code {scalb}}
+-\entry{scalbf}{470}{\code {scalbf}}
+-\entry{scalbl}{470}{\code {scalbl}}
+-\entry{scalbn}{470}{\code {scalbn}}
+-\entry{scalbnf}{470}{\code {scalbnf}}
+-\entry{scalbnl}{470}{\code {scalbnl}}
+-\entry{scalbln}{470}{\code {scalbln}}
+-\entry{scalblnf}{470}{\code {scalblnf}}
+-\entry{scalblnl}{470}{\code {scalblnl}}
+-\entry{significand}{470}{\code {significand}}
+-\entry{significandf}{470}{\code {significandf}}
+-\entry{significandl}{470}{\code {significandl}}
+-\entry{ceil}{471}{\code {ceil}}
+-\entry{ceilf}{471}{\code {ceilf}}
+-\entry{ceill}{471}{\code {ceill}}
+-\entry{floor}{471}{\code {floor}}
+-\entry{floorf}{471}{\code {floorf}}
+-\entry{floorl}{471}{\code {floorl}}
+-\entry{trunc}{471}{\code {trunc}}
+-\entry{truncf}{471}{\code {truncf}}
+-\entry{truncl}{471}{\code {truncl}}
+-\entry{rint}{471}{\code {rint}}
+-\entry{rintf}{471}{\code {rintf}}
+-\entry{rintl}{471}{\code {rintl}}
+-\entry{nearbyint}{471}{\code {nearbyint}}
+-\entry{nearbyintf}{471}{\code {nearbyintf}}
+-\entry{nearbyintl}{471}{\code {nearbyintl}}
+-\entry{round}{472}{\code {round}}
+-\entry{roundf}{472}{\code {roundf}}
+-\entry{roundl}{472}{\code {roundl}}
+-\entry{lrint}{472}{\code {lrint}}
+-\entry{lrintf}{472}{\code {lrintf}}
+-\entry{lrintl}{472}{\code {lrintl}}
+-\entry{llrint}{472}{\code {llrint}}
+-\entry{llrintf}{472}{\code {llrintf}}
+-\entry{llrintl}{472}{\code {llrintl}}
+-\entry{lround}{472}{\code {lround}}
+-\entry{lroundf}{472}{\code {lroundf}}
+-\entry{lroundl}{472}{\code {lroundl}}
+-\entry{llround}{472}{\code {llround}}
+-\entry{llroundf}{472}{\code {llroundf}}
+-\entry{llroundl}{472}{\code {llroundl}}
+-\entry{modf}{472}{\code {modf}}
+-\entry{modff}{472}{\code {modff}}
+-\entry{modfl}{472}{\code {modfl}}
+-\entry{fmod}{472}{\code {fmod}}
+-\entry{fmodf}{473}{\code {fmodf}}
+-\entry{fmodl}{473}{\code {fmodl}}
+-\entry{drem}{473}{\code {drem}}
+-\entry{dremf}{473}{\code {dremf}}
+-\entry{dreml}{473}{\code {dreml}}
+-\entry{remainder}{473}{\code {remainder}}
+-\entry{remainderf}{473}{\code {remainderf}}
+-\entry{remainderl}{473}{\code {remainderl}}
+-\entry{copysign}{473}{\code {copysign}}
+-\entry{copysignf}{473}{\code {copysignf}}
+-\entry{copysignl}{473}{\code {copysignl}}
+-\entry{signbit}{474}{\code {signbit}}
+-\entry{nextafter}{474}{\code {nextafter}}
+-\entry{nextafterf}{474}{\code {nextafterf}}
+-\entry{nextafterl}{474}{\code {nextafterl}}
+-\entry{nexttoward}{474}{\code {nexttoward}}
+-\entry{nexttowardf}{474}{\code {nexttowardf}}
+-\entry{nexttowardl}{474}{\code {nexttowardl}}
+-\entry{nan}{474}{\code {nan}}
+-\entry{nanf}{474}{\code {nanf}}
+-\entry{nanl}{474}{\code {nanl}}
+-\entry{isgreater}{475}{\code {isgreater}}
+-\entry{isgreaterequal}{475}{\code {isgreaterequal}}
+-\entry{isless}{475}{\code {isless}}
+-\entry{islessequal}{475}{\code {islessequal}}
+-\entry{islessgreater}{475}{\code {islessgreater}}
+-\entry{isunordered}{475}{\code {isunordered}}
+-\entry{fmin}{475}{\code {fmin}}
+-\entry{fminf}{475}{\code {fminf}}
+-\entry{fminl}{475}{\code {fminl}}
+-\entry{fmax}{476}{\code {fmax}}
+-\entry{fmaxf}{476}{\code {fmaxf}}
+-\entry{fmaxl}{476}{\code {fmaxl}}
+-\entry{fdim}{476}{\code {fdim}}
+-\entry{fdimf}{476}{\code {fdimf}}
+-\entry{fdiml}{476}{\code {fdiml}}
+-\entry{fma}{476}{\code {fma}}
+-\entry{fmaf}{476}{\code {fmaf}}
+-\entry{fmal}{476}{\code {fmal}}
+-\entry{creal}{477}{\code {creal}}
+-\entry{crealf}{477}{\code {crealf}}
+-\entry{creall}{477}{\code {creall}}
+-\entry{cimag}{477}{\code {cimag}}
+-\entry{cimagf}{477}{\code {cimagf}}
+-\entry{cimagl}{477}{\code {cimagl}}
+-\entry{conj}{477}{\code {conj}}
+-\entry{conjf}{477}{\code {conjf}}
+-\entry{conjl}{477}{\code {conjl}}
+-\entry{carg}{477}{\code {carg}}
+-\entry{cargf}{477}{\code {cargf}}
+-\entry{cargl}{477}{\code {cargl}}
+-\entry{cproj}{478}{\code {cproj}}
+-\entry{cprojf}{478}{\code {cprojf}}
+-\entry{cprojl}{478}{\code {cprojl}}
+-\entry{div}{478}{\code {div}}
+-\entry{ldiv}{479}{\code {ldiv}}
+-\entry{lldiv}{479}{\code {lldiv}}
+-\entry{imaxdiv}{479}{\code {imaxdiv}}
+-\entry{strtol}{480}{\code {strtol}}
+-\entry{strtoul}{480}{\code {strtoul}}
+-\entry{strtoll}{481}{\code {strtoll}}
+-\entry{strtoq}{481}{\code {strtoq}}
+-\entry{strtoull}{481}{\code {strtoull}}
+-\entry{strtouq}{481}{\code {strtouq}}
+-\entry{atol}{481}{\code {atol}}
+-\entry{atoi}{481}{\code {atoi}}
+-\entry{atoll}{481}{\code {atoll}}
+-\entry{strtol{\_}l}{481}{\code {strtol_l}}
+-\entry{strtoul{\_}l}{481}{\code {strtoul_l}}
+-\entry{strtoll{\_}l}{481}{\code {strtoll_l}}
+-\entry{strtoull{\_}l}{481}{\code {strtoull_l}}
+-\entry{strtod}{482}{\code {strtod}}
+-\entry{strtof}{483}{\code {strtof}}
+-\entry{strtold}{483}{\code {strtold}}
+-\entry{atof}{483}{\code {atof}}
+-\entry{ecvt}{484}{\code {ecvt}}
+-\entry{fcvt}{484}{\code {fcvt}}
+-\entry{gcvt}{484}{\code {gcvt}}
+-\entry{qecvt}{484}{\code {qecvt}}
+-\entry{qfcvt}{484}{\code {qfcvt}}
+-\entry{qgcvt}{485}{\code {qgcvt}}
+-\entry{ecvt{\_}r}{485}{\code {ecvt_r}}
+-\entry{fcvt{\_}r}{485}{\code {fcvt_r}}
+-\entry{qecvt{\_}r}{485}{\code {qecvt_r}}
+-\entry{qfcvt{\_}r}{485}{\code {qfcvt_r}}
+-\entry{clock}{488}{\code {clock}}
+-\entry{times}{489}{\code {times}}
+-\entry{difftime}{490}{\code {difftime}}
+-\entry{time}{490}{\code {time}}
+-\entry{gettimeofday}{491}{\code {gettimeofday}}
+-\entry{settimeofday}{491}{\code {settimeofday}}
+-\entry{adjtime}{492}{\code {adjtime}}
+-\entry{localtime}{493}{\code {localtime}}
+-\entry{localtime{\_}r}{494}{\code {localtime_r}}
+-\entry{gmtime}{494}{\code {gmtime}}
+-\entry{gmtime{\_}r}{494}{\code {gmtime_r}}
+-\entry{mktime}{494}{\code {mktime}}
+-\entry{asctime}{495}{\code {asctime}}
+-\entry{asctime{\_}r}{495}{\code {asctime_r}}
+-\entry{ctime}{495}{\code {ctime}}
+-\entry{ctime{\_}r}{495}{\code {ctime_r}}
+-\entry{strftime}{495}{\code {strftime}}
+-\entry{strptime}{500}{\code {strptime}}
+-\entry{getdate}{505}{\code {getdate}}
+-\entry{getdate{\_}r}{507}{\code {getdate_r}}
+-\entry{tzset}{509}{\code {tzset}}
+-\entry{ntp{\_}gettime}{511}{\code {ntp_gettime}}
+-\entry{ntp{\_}adjtime}{513}{\code {ntp_adjtime}}
+-\entry{setitimer}{514}{\code {setitimer}}
+-\entry{getitimer}{514}{\code {getitimer}}
+-\entry{ITIMER{\_}REAL}{514}{\code {ITIMER_REAL}}
+-\entry{ITIMER{\_}VIRTUAL}{514}{\code {ITIMER_VIRTUAL}}
+-\entry{ITIMER{\_}PROF}{515}{\code {ITIMER_PROF}}
+-\entry{alarm}{515}{\code {alarm}}
+-\entry{sleep}{515}{\code {sleep}}
+-\entry{nanosleep}{516}{\code {nanosleep}}
+-\entry{getrusage}{517}{\code {getrusage}}
+-\entry{getrlimit}{519}{\code {getrlimit}}
+-\entry{getrlimit64}{519}{\code {getrlimit64}}
+-\entry{setrlimit}{519}{\code {setrlimit}}
+-\entry{setrlimit64}{519}{\code {setrlimit64}}
+-\entry{getpriority}{521}{\code {getpriority}}
+-\entry{setpriority}{522}{\code {setpriority}}
+-\entry{nice}{522}{\code {nice}}
+-\entry{setjmp}{524}{\code {setjmp}}
+-\entry{longjmp}{525}{\code {longjmp}}
+-\entry{sigsetjmp}{526}{\code {sigsetjmp}}
+-\entry{siglongjmp}{526}{\code {siglongjmp}}
+-\entry{strsignal}{537}{\code {strsignal}}
+-\entry{psignal}{538}{\code {psignal}}
+-\entry{signal}{538}{\code {signal}}
+-\entry{sysv{\_}signal}{540}{\code {sysv_signal}}
+-\entry{ssignal}{540}{\code {ssignal}}
+-\entry{sigaction}{541}{\code {sigaction}}
+-\entry{TEMP{\_}FAILURE{\_}RETRY}{555}{\code {TEMP_FAILURE_RETRY}}
+-\entry{raise}{556}{\code {raise}}
+-\entry{gsignal}{556}{\code {gsignal}}
+-\entry{kill}{557}{\code {kill}}
+-\entry{killpg}{558}{\code {killpg}}
+-\entry{sigemptyset}{562}{\code {sigemptyset}}
+-\entry{sigfillset}{562}{\code {sigfillset}}
+-\entry{sigaddset}{562}{\code {sigaddset}}
+-\entry{sigdelset}{562}{\code {sigdelset}}
+-\entry{sigismember}{562}{\code {sigismember}}
+-\entry{sigprocmask}{562}{\code {sigprocmask}}
+-\entry{sigpending}{565}{\code {sigpending}}
+-\entry{pause}{567}{\code {pause}}
+-\entry{sigsuspend}{569}{\code {sigsuspend}}
+-\entry{sigaltstack}{571}{\code {sigaltstack}}
+-\entry{sigstack}{571}{\code {sigstack}}
+-\entry{sigvec}{573}{\code {sigvec}}
+-\entry{siginterrupt}{573}{\code {siginterrupt}}
+-\entry{sigmask}{573}{\code {sigmask}}
+-\entry{sigblock}{573}{\code {sigblock}}
+-\entry{sigsetmask}{573}{\code {sigsetmask}}
+-\entry{sigpause}{573}{\code {sigpause}}
+-\entry{main}{575}{\code {main}}
+-\entry{getopt}{577}{\code {getopt}}
+-\entry{getopt{\_}long}{581}{\code {getopt_long}}
+-\entry{argp{\_}parse}{584}{\code {argp_parse}}
+-\entry{argp{\_}usage}{591}{\code {argp_usage}}
+-\entry{argp{\_}error}{591}{\code {argp_error}}
+-\entry{argp{\_}failure}{591}{\code {argp_failure}}
+-\entry{argp{\_}state{\_}help}{592}{\code {argp_state_help}}
+-\entry{argp{\_}help}{596}{\code {argp_help}}
+-\entry{getsubopt}{607}{\code {getsubopt}}
+-\entry{getenv}{610}{\code {getenv}}
+-\entry{putenv}{610}{\code {putenv}}
+-\entry{setenv}{610}{\code {setenv}}
+-\entry{unsetenv}{611}{\code {unsetenv}}
+-\entry{clearenv}{611}{\code {clearenv}}
+-\entry{exit}{614}{\code {exit}}
+-\entry{atexit}{615}{\code {atexit}}
+-\entry{on{\_}exit}{615}{\code {on_exit}}
+-\entry{abort}{616}{\code {abort}}
+-\entry{{\_}exit}{616}{\code {_exit}}
+-\entry{{\_}Exit}{616}{\code {_Exit}}
+-\entry{system}{619}{\code {system}}
+-\entry{getpid}{620}{\code {getpid}}
+-\entry{getppid}{620}{\code {getppid}}
+-\entry{fork}{621}{\code {fork}}
+-\entry{vfork}{621}{\code {vfork}}
+-\entry{execv}{622}{\code {execv}}
+-\entry{execl}{622}{\code {execl}}
+-\entry{execve}{622}{\code {execve}}
+-\entry{execle}{622}{\code {execle}}
+-\entry{execvp}{623}{\code {execvp}}
+-\entry{execlp}{623}{\code {execlp}}
+-\entry{waitpid}{624}{\code {waitpid}}
+-\entry{wait}{626}{\code {wait}}
+-\entry{wait4}{626}{\code {wait4}}
+-\entry{WIFEXITED}{627}{\code {WIFEXITED}}
+-\entry{WEXITSTATUS}{627}{\code {WEXITSTATUS}}
+-\entry{WIFSIGNALED}{627}{\code {WIFSIGNALED}}
+-\entry{WTERMSIG}{627}{\code {WTERMSIG}}
+-\entry{WCOREDUMP}{627}{\code {WCOREDUMP}}
+-\entry{WIFSTOPPED}{627}{\code {WIFSTOPPED}}
+-\entry{WSTOPSIG}{627}{\code {WSTOPSIG}}
+-\entry{wait3}{628}{\code {wait3}}
+-\entry{ctermid}{646}{\code {ctermid}}
+-\entry{setsid}{647}{\code {setsid}}
+-\entry{getsid}{647}{\code {getsid}}
+-\entry{getpgrp}{647}{\code {getpgrp}}
+-\entry{getpgrp}{647}{\code {getpgrp}}
+-\entry{getpgid}{647}{\code {getpgid}}
+-\entry{setpgid}{648}{\code {setpgid}}
+-\entry{setpgrp}{648}{\code {setpgrp}}
+-\entry{tcgetpgrp}{648}{\code {tcgetpgrp}}
+-\entry{tcsetpgrp}{649}{\code {tcsetpgrp}}
+-\entry{tcgetsid}{649}{\code {tcgetsid}}
+-\entry{success}{653}{\code {success}}
+-\entry{notfound}{653}{\code {notfound}}
+-\entry{unavail}{653}{\code {unavail}}
+-\entry{tryagain}{653}{\code {tryagain}}
+-\entry{NSS{\_}STATUS{\_}TRYAGAIN}{656}{\code {NSS_STATUS_TRYAGAIN}}
+-\entry{NSS{\_}STATUS{\_}UNAVAIL}{656}{\code {NSS_STATUS_UNAVAIL}}
+-\entry{NSS{\_}STATUS{\_}NOTFOUND}{656}{\code {NSS_STATUS_NOTFOUND}}
+-\entry{NSS{\_}STATUS{\_}SUCCESS}{656}{\code {NSS_STATUS_SUCCESS}}
+-\entry{getuid}{663}{\code {getuid}}
+-\entry{getgid}{663}{\code {getgid}}
+-\entry{geteuid}{663}{\code {geteuid}}
+-\entry{getegid}{663}{\code {getegid}}
+-\entry{getgroups}{663}{\code {getgroups}}
+-\entry{seteuid}{664}{\code {seteuid}}
+-\entry{setuid}{664}{\code {setuid}}
+-\entry{setreuid}{665}{\code {setreuid}}
+-\entry{setegid}{665}{\code {setegid}}
+-\entry{setgid}{665}{\code {setgid}}
+-\entry{setregid}{665}{\code {setregid}}
+-\entry{setgroups}{666}{\code {setgroups}}
+-\entry{initgroups}{666}{\code {initgroups}}
+-\entry{getlogin}{670}{\code {getlogin}}
+-\entry{cuserid}{670}{\code {cuserid}}
+-\entry{setutent}{673}{\code {setutent}}
+-\entry{getutent}{673}{\code {getutent}}
+-\entry{endutent}{673}{\code {endutent}}
+-\entry{getutid}{673}{\code {getutid}}
+-\entry{getutline}{674}{\code {getutline}}
+-\entry{pututline}{674}{\code {pututline}}
+-\entry{getutent{\_}r}{674}{\code {getutent_r}}
+-\entry{getutid{\_}r}{674}{\code {getutid_r}}
+-\entry{getutline{\_}r}{675}{\code {getutline_r}}
+-\entry{utmpname}{675}{\code {utmpname}}
+-\entry{updwtmp}{675}{\code {updwtmp}}
+-\entry{setutxent}{677}{\code {setutxent}}
+-\entry{getutxent}{677}{\code {getutxent}}
+-\entry{endutxent}{677}{\code {endutxent}}
+-\entry{getutxid}{677}{\code {getutxid}}
+-\entry{getutxline}{677}{\code {getutxline}}
+-\entry{pututxline}{677}{\code {pututxline}}
+-\entry{login{\_}tty}{678}{\code {login_tty}}
+-\entry{login}{678}{\code {login}}
+-\entry{logout}{678}{\code {logout}}
+-\entry{logwtmp}{678}{\code {logwtmp}}
+-\entry{getpwuid}{679}{\code {getpwuid}}
+-\entry{getpwuid{\_}r}{679}{\code {getpwuid_r}}
+-\entry{getpwnam}{680}{\code {getpwnam}}
+-\entry{getpwnam{\_}r}{680}{\code {getpwnam_r}}
+-\entry{fgetpwent}{680}{\code {fgetpwent}}
+-\entry{fgetpwent{\_}r}{680}{\code {fgetpwent_r}}
+-\entry{setpwent}{681}{\code {setpwent}}
+-\entry{getpwent}{681}{\code {getpwent}}
+-\entry{getpwent{\_}r}{681}{\code {getpwent_r}}
+-\entry{endpwent}{681}{\code {endpwent}}
+-\entry{putpwent}{681}{\code {putpwent}}
+-\entry{getgrgid}{682}{\code {getgrgid}}
+-\entry{getgrgid{\_}r}{682}{\code {getgrgid_r}}
+-\entry{getgrnam}{682}{\code {getgrnam}}
+-\entry{getgrnam{\_}r}{683}{\code {getgrnam_r}}
+-\entry{fgetgrent}{683}{\code {fgetgrent}}
+-\entry{fgetgrent{\_}r}{683}{\code {fgetgrent_r}}
+-\entry{setgrent}{683}{\code {setgrent}}
+-\entry{getgrent}{683}{\code {getgrent}}
+-\entry{getgrent{\_}r}{684}{\code {getgrent_r}}
+-\entry{endgrent}{684}{\code {endgrent}}
+-\entry{setnetgrent}{686}{\code {setnetgrent}}
+-\entry{getnetgrent}{686}{\code {getnetgrent}}
+-\entry{getnetgrent{\_}r}{686}{\code {getnetgrent_r}}
+-\entry{endnetgrent}{687}{\code {endnetgrent}}
+-\entry{innetgr}{687}{\code {innetgr}}
+-\entry{gethostname}{689}{\code {gethostname}}
+-\entry{sethostname}{689}{\code {sethostname}}
+-\entry{gethostid}{689}{\code {gethostid}}
+-\entry{sethostid}{690}{\code {sethostid}}
+-\entry{uname}{691}{\code {uname}}
+-\entry{setfsent}{692}{\code {setfsent}}
+-\entry{endfsent}{693}{\code {endfsent}}
+-\entry{getfsent}{693}{\code {getfsent}}
+-\entry{getfsspec}{693}{\code {getfsspec}}
+-\entry{getfsfile}{693}{\code {getfsfile}}
+-\entry{setmntent}{695}{\code {setmntent}}
+-\entry{endmntent}{695}{\code {endmntent}}
+-\entry{getmntent}{695}{\code {getmntent}}
+-\entry{getmntent{\_}r}{696}{\code {getmntent_r}}
+-\entry{addmntent}{696}{\code {addmntent}}
+-\entry{hasmntopt}{696}{\code {hasmntopt}}
+-\entry{sysconf}{700}{\code {sysconf}}
+-\entry{pathconf}{712}{\code {pathconf}}
+-\entry{fpathconf}{712}{\code {fpathconf}}
+-\entry{confstr}{715}{\code {confstr}}
+-\entry{getpass}{718}{\code {getpass}}
+-\entry{crypt}{718}{\code {crypt}}
+-\entry{crypt{\_}r}{720}{\code {crypt_r}}
+-\entry{setkey}{721}{\code {setkey}}
+-\entry{encrypt}{721}{\code {encrypt}}
+-\entry{setkey{\_}r}{721}{\code {setkey_r}}
+-\entry{encrypt{\_}r}{721}{\code {encrypt_r}}
+-\entry{ecb{\_}crypt}{721}{\code {ecb_crypt}}
+-\entry{DES{\_}ENCRYPT}{721}{\code {DES_ENCRYPT}}
+-\entry{DES{\_}DECRYPT}{721}{\code {DES_DECRYPT}}
+-\entry{DES{\_}HW}{722}{\code {DES_HW}}
+-\entry{DES{\_}SW}{722}{\code {DES_SW}}
+-\entry{DESERR{\_}NONE}{722}{\code {DESERR_NONE}}
+-\entry{DESERR{\_}NOHWDEVICE}{722}{\code {DESERR_NOHWDEVICE}}
+-\entry{DESERR{\_}HWERROR}{722}{\code {DESERR_HWERROR}}
+-\entry{DESERR{\_}BADPARAM}{722}{\code {DESERR_BADPARAM}}
+-\entry{DES{\_}FAILED}{722}{\code {DES_FAILED}}
+-\entry{cbc{\_}crypt}{722}{\code {cbc_crypt}}
+-\entry{des{\_}setparity}{722}{\code {des_setparity}}
+-\entry{pthread{\_}create}{723}{\code {pthread_create}}
+-\entry{pthread{\_}exit}{723}{\code {pthread_exit}}
+-\entry{pthread{\_}cancel}{724}{\code {pthread_cancel}}
+-\entry{pthread{\_}join}{724}{\code {pthread_join}}
+-\entry{pthread{\_}attr{\_}init}{724}{\code {pthread_attr_init}}
+-\entry{pthread{\_}attr{\_}destroy}{725}{\code {pthread_attr_destroy}}
+-\entry{pthread{\_}attr{\_}setinheritsched}{725}{\code {pthread_attr_setinheritsched}}
+-\entry{pthread{\_}attr{\_}setschedparam}{725}{\code {pthread_attr_setschedparam}}
+-\entry{pthread{\_}attr{\_}setschedpolicy}{725}{\code {pthread_attr_setschedpolicy}}
+-\entry{pthread{\_}attr{\_}setscope}{725}{\code {pthread_attr_setscope}}
+-\entry{pthread{\_}attr{\_}setattr}{725}{\code {pthread_attr_set\var {attr}}}
+-\entry{pthread{\_}attr{\_}getinheritsched}{725}{\code {pthread_attr_getinheritsched}}
+-\entry{pthread{\_}attr{\_}getschedparam}{725}{\code {pthread_attr_getschedparam}}
+-\entry{pthread{\_}attr{\_}getschedpolicy}{725}{\code {pthread_attr_getschedpolicy}}
+-\entry{pthread{\_}attr{\_}getscope}{725}{\code {pthread_attr_getscope}}
+-\entry{pthread{\_}attr{\_}getattr}{725}{\code {pthread_attr_get\var {attr}}}
+-\entry{pthread{\_}setcancelstate}{727}{\code {pthread_setcancelstate}}
+-\entry{pthread{\_}setcanceltype}{727}{\code {pthread_setcanceltype}}
+-\entry{pthread{\_}testcancel}{727}{\code {pthread_testcancel}}
+-\entry{pthread{\_}cleanup{\_}push}{728}{\code {pthread_cleanup_push}}
+-\entry{pthread{\_}cleanup{\_}pop}{728}{\code {pthread_cleanup_pop}}
+-\entry{pthread{\_}cleanup{\_}push{\_}defer{\_}np}{729}{\code {pthread_cleanup_push_defer_np}}
+-\entry{pthread{\_}cleanup{\_}pop{\_}restore{\_}np}{729}{\code {pthread_cleanup_pop_restore_np}}
+-\entry{pthread{\_}mutex{\_}init}{730}{\code {pthread_mutex_init}}
+-\entry{pthread{\_}mutex{\_}lock}{730}{\code {pthread_mutex_lock}}
+-\entry{pthread{\_}mutex{\_}trylock}{730}{\code {pthread_mutex_trylock}}
+-\entry{pthread{\_}mutex{\_}unlock}{730}{\code {pthread_mutex_unlock}}
+-\entry{pthread{\_}mutex{\_}destroy}{731}{\code {pthread_mutex_destroy}}
+-\entry{pthread{\_}mutexattr{\_}init}{731}{\code {pthread_mutexattr_init}}
+-\entry{pthread{\_}mutexattr{\_}destroy}{731}{\code {pthread_mutexattr_destroy}}
+-\entry{pthread{\_}mutexattr{\_}setkind{\_}np}{732}{\code {pthread_mutexattr_setkind_np}}
+-\entry{pthread{\_}mutexattr{\_}getkind{\_}np}{732}{\code {pthread_mutexattr_getkind_np}}
+-\entry{pthread{\_}cond{\_}init}{732}{\code {pthread_cond_init}}
+-\entry{pthread{\_}cond{\_}signal}{733}{\code {pthread_cond_signal}}
+-\entry{pthread{\_}cond{\_}broadcast}{733}{\code {pthread_cond_broadcast}}
+-\entry{pthread{\_}cond{\_}wait}{733}{\code {pthread_cond_wait}}
+-\entry{pthread{\_}cond{\_}timedwait}{733}{\code {pthread_cond_timedwait}}
+-\entry{pthread{\_}cond{\_}destroy}{733}{\code {pthread_cond_destroy}}
+-\entry{pthread{\_}condattr{\_}init}{735}{\code {pthread_condattr_init}}
+-\entry{pthread{\_}condattr{\_}destroy}{735}{\code {pthread_condattr_destroy}}
+-\entry{sem{\_}init}{735}{\code {sem_init}}
+-\entry{sem{\_}destroy}{735}{\code {sem_destroy}}
+-\entry{sem{\_}wait}{736}{\code {sem_wait}}
+-\entry{sem{\_}trywait}{736}{\code {sem_trywait}}
+-\entry{sem{\_}post}{736}{\code {sem_post}}
+-\entry{sem{\_}getvalue}{736}{\code {sem_getvalue}}
+-\entry{pthread{\_}key{\_}create}{737}{\code {pthread_key_create}}
+-\entry{pthread{\_}key{\_}delete}{737}{\code {pthread_key_delete}}
+-\entry{pthread{\_}setspecific}{737}{\code {pthread_setspecific}}
+-\entry{pthread{\_}getspecific}{737}{\code {pthread_getspecific}}
+-\entry{pthread{\_}sigmask}{738}{\code {pthread_sigmask}}
+-\entry{pthread{\_}kill}{739}{\code {pthread_kill}}
+-\entry{sigwait}{739}{\code {sigwait}}
+-\entry{pthread{\_}self}{739}{\code {pthread_self}}
+-\entry{pthread{\_}equal}{739}{\code {pthread_equal}}
+-\entry{pthread{\_}detach}{740}{\code {pthread_detach}}
+-\entry{pthread{\_}atfork}{740}{\code {pthread_atfork}}
+-\entry{pthread{\_}kill{\_}other{\_}threads{\_}np}{740}{\code {pthread_kill_other_threads_np}}
+-\entry{pthread{\_}once}{741}{\code {pthread_once}}
+-\entry{pthread{\_}setschedparam}{741}{\code {pthread_setschedparam}}
+-\entry{pthread{\_}getschedparam}{741}{\code {pthread_getschedparam}}
+-\entry{assert}{743}{\code {assert}}
+-\entry{assert{\_}perror}{744}{\code {assert_perror}}
+-\entry{va{\_}start}{748}{\code {va_start}}
+-\entry{va{\_}arg}{748}{\code {va_arg}}
+-\entry{va{\_}end}{748}{\code {va_end}}
+-\entry{{\_}{\_}va{\_}copy}{748}{\code {__va_copy}}
+-\entry{va{\_}alist}{750}{\code {va_alist}}
+-\entry{va{\_}dcl}{750}{\code {va_dcl}}
+-\entry{va{\_}start}{750}{\code {va_start}}
+-\entry{offsetof}{759}{\code {offsetof}}
+diff -Naur ../glibc-2.1.3/manual/libc.fns glibc-2.1.3/manual/libc.fns
+--- ../glibc-2.1.3/manual/libc.fns	2000-01-05 19:19:03.000000000 -0800
++++ glibc-2.1.3/manual/libc.fns	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1157 +0,0 @@
+-\initial {{\_}}
+-\entry {\code {__va_copy}}{748}
+-\entry {\code {_exit}}{616}
+-\entry {\code {_Exit}}{616}
+-\entry {\code {_tolower}}{63}
+-\entry {\code {_toupper}}{63}
+-\initial {A}
+-\entry {\code {a64l}}{92}
+-\entry {\code {abort}}{616}
+-\entry {\code {abs}}{469}
+-\entry {\code {accept}}{391}
+-\entry {\code {access}}{348}
+-\entry {\code {acos}}{442}
+-\entry {\code {acosf}}{442}
+-\entry {\code {acosh}}{448}
+-\entry {\code {acoshf}}{448}
+-\entry {\code {acoshl}}{448}
+-\entry {\code {acosl}}{442}
+-\entry {\code {addmntent}}{696}
+-\entry {\code {addseverity}}{267}
+-\entry {\code {adjtime}}{492}
+-\entry {\code {aio_cancel}}{303}
+-\entry {\code {aio_cancel64}}{304}
+-\entry {\code {aio_error}}{300}
+-\entry {\code {aio_error64}}{300}
+-\entry {\code {aio_fsync}}{301}
+-\entry {\code {aio_fsync64}}{302}
+-\entry {\code {aio_init}}{304}
+-\entry {\code {aio_read}}{296}
+-\entry {\code {aio_read64}}{297}
+-\entry {\code {aio_return}}{300}
+-\entry {\code {aio_return64}}{301}
+-\entry {\code {aio_suspend}}{302}
+-\entry {\code {aio_suspend64}}{303}
+-\entry {\code {aio_write}}{297}
+-\entry {\code {aio_write64}}{298}
+-\entry {\code {alarm}}{515}
+-\entry {\code {alloca}}{57}
+-\entry {\code {alphasort}}{325}
+-\entry {\code {alphasort64}}{326}
+-\entry {\code {argp_error}}{591}
+-\entry {\code {argp_failure}}{591}
+-\entry {\code {argp_help}}{596}
+-\entry {\code {argp_parse}}{584}
+-\entry {\code {argp_state_help}}{592}
+-\entry {\code {argp_usage}}{591}
+-\entry {\code {argz_add}}{94}
+-\entry {\code {argz_add_sep}}{94}
+-\entry {\code {argz_append}}{94}
+-\entry {\code {argz_count}}{93}
+-\entry {\code {argz_create}}{93}
+-\entry {\code {argz_create_sep}}{93}
+-\entry {\code {argz_delete}}{94}
+-\entry {\code {argz_extract}}{94}
+-\entry {\code {argz_insert}}{94}
+-\entry {\code {argz_next}}{95}
+-\entry {\code {argz_replace}}{95}
+-\entry {\code {argz_stringify}}{94}
+-\entry {\code {asctime}}{495}
+-\entry {\code {asctime_r}}{495}
+-\entry {\code {asin}}{442}
+-\entry {\code {asinf}}{442}
+-\entry {\code {asinh}}{448}
+-\entry {\code {asinhf}}{448}
+-\entry {\code {asinhl}}{448}
+-\entry {\code {asinl}}{442}
+-\entry {\code {asprintf}}{231}
+-\entry {\code {assert}}{743}
+-\entry {\code {assert_perror}}{744}
+-\entry {\code {atan}}{442}
+-\entry {\code {atan2}}{442}
+-\entry {\code {atan2f}}{442}
+-\entry {\code {atan2l}}{442}
+-\entry {\code {atanf}}{442}
+-\entry {\code {atanh}}{448}
+-\entry {\code {atanhf}}{448}
+-\entry {\code {atanhl}}{448}
+-\entry {\code {atanl}}{442}
+-\entry {\code {atexit}}{615}
+-\entry {\code {atof}}{483}
+-\entry {\code {atoi}}{481}
+-\entry {\code {atol}}{481}
+-\entry {\code {atoll}}{481}
+-\initial {B}
+-\entry {\code {bcmp}}{83}
+-\entry {\code {bcopy}}{80}
+-\entry {\code {bind}}{367}
+-\entry {\code {bindtextdomain}}{172}
+-\entry {\code {bsearch}}{178}
+-\entry {\code {btowc}}{104}
+-\entry {\code {bzero}}{80}
+-\initial {C}
+-\entry {\code {cabs}}{469}
+-\entry {\code {cabsf}}{469}
+-\entry {\code {cabsl}}{469}
+-\entry {\code {cacos}}{443}
+-\entry {\code {cacosf}}{443}
+-\entry {\code {cacosh}}{448}
+-\entry {\code {cacoshf}}{448}
+-\entry {\code {cacoshl}}{448}
+-\entry {\code {cacosl}}{443}
+-\entry {\code {calloc}}{35}
+-\entry {\code {carg}}{477}
+-\entry {\code {cargf}}{477}
+-\entry {\code {cargl}}{477}
+-\entry {\code {casin}}{443}
+-\entry {\code {casinf}}{443}
+-\entry {\code {casinh}}{448}
+-\entry {\code {casinhf}}{448}
+-\entry {\code {casinhl}}{448}
+-\entry {\code {casinl}}{443}
+-\entry {\code {catan}}{443}
+-\entry {\code {catanf}}{443}
+-\entry {\code {catanh}}{449}
+-\entry {\code {catanhf}}{449}
+-\entry {\code {catanhl}}{449}
+-\entry {\code {catanl}}{443}
+-\entry {\code {catclose}}{162}
+-\entry {\code {catgets}}{162}
+-\entry {\code {catopen}}{159}
+-\entry {\code {cbc_crypt}}{722}
+-\entry {\code {cbrt}}{445}
+-\entry {\code {cbrtf}}{445}
+-\entry {\code {cbrtl}}{445}
+-\entry {\code {ccos}}{441}
+-\entry {\code {ccosf}}{441}
+-\entry {\code {ccosh}}{448}
+-\entry {\code {ccoshf}}{448}
+-\entry {\code {ccoshl}}{448}
+-\entry {\code {ccosl}}{441}
+-\entry {\code {ceil}}{471}
+-\entry {\code {ceilf}}{471}
+-\entry {\code {ceill}}{471}
+-\entry {\code {cexp}}{446}
+-\entry {\code {cexpf}}{446}
+-\entry {\code {cexpl}}{446}
+-\entry {\code {cfgetispeed}}{424}
+-\entry {\code {cfgetospeed}}{424}
+-\entry {\code {cfmakeraw}}{430}
+-\entry {\code {cfree}}{34}
+-\entry {\code {cfsetispeed}}{424}
+-\entry {\code {cfsetospeed}}{424}
+-\entry {\code {cfsetspeed}}{424}
+-\entry {\code {chdir}}{320}
+-\entry {\code {chmod}}{346, 347}
+-\entry {\code {chown}}{343}
+-\entry {\code {cimag}}{477}
+-\entry {\code {cimagf}}{477}
+-\entry {\code {cimagl}}{477}
+-\entry {\code {clearenv}}{611}
+-\entry {\code {clearerr}}{250}
+-\entry {\code {clock}}{488}
+-\entry {\code {clog}}{446}
+-\entry {\code {clog10}}{446}
+-\entry {\code {clog10f}}{446}
+-\entry {\code {clog10l}}{446}
+-\entry {\code {clogf}}{446}
+-\entry {\code {clogl}}{446}
+-\entry {\code {close}}{273}
+-\entry {\code {closedir}}{323}
+-\entry {\code {confstr}}{715}
+-\entry {\code {conj}}{477}
+-\entry {\code {conjf}}{477}
+-\entry {\code {conjl}}{477}
+-\entry {\code {connect}}{389}
+-\entry {\code {copysign}}{473}
+-\entry {\code {copysignf}}{473}
+-\entry {\code {copysignl}}{473}
+-\entry {\code {cos}}{440}
+-\entry {\code {cosf}}{440}
+-\entry {\code {cosh}}{447}
+-\entry {\code {coshf}}{447}
+-\entry {\code {coshl}}{447}
+-\entry {\code {cosl}}{440}
+-\entry {\code {cpow}}{447}
+-\entry {\code {cpowf}}{447}
+-\entry {\code {cpowl}}{447}
+-\entry {\code {cproj}}{478}
+-\entry {\code {cprojf}}{478}
+-\entry {\code {cprojl}}{478}
+-\entry {\code {creal}}{477}
+-\entry {\code {crealf}}{477}
+-\entry {\code {creall}}{477}
+-\entry {\code {creat}}{272}
+-\entry {\code {creat64}}{273}
+-\entry {\code {crypt}}{718}
+-\entry {\code {crypt_r}}{720}
+-\entry {\code {csin}}{441}
+-\entry {\code {csinf}}{441}
+-\entry {\code {csinh}}{447}
+-\entry {\code {csinhf}}{447}
+-\entry {\code {csinhl}}{447}
+-\entry {\code {csinl}}{441}
+-\entry {\code {csqrt}}{447}
+-\entry {\code {csqrtf}}{447}
+-\entry {\code {csqrtl}}{447}
+-\entry {\code {ctan}}{441}
+-\entry {\code {ctanf}}{441}
+-\entry {\code {ctanh}}{448}
+-\entry {\code {ctanhf}}{448}
+-\entry {\code {ctanhl}}{448}
+-\entry {\code {ctanl}}{441}
+-\entry {\code {ctermid}}{646}
+-\entry {\code {ctime}}{495}
+-\entry {\code {ctime_r}}{495}
+-\entry {\code {cuserid}}{670}
+-\initial {D}
+-\entry {\code {dcgettext}}{170}
+-\entry {\code {DES_DECRYPT}}{721}
+-\entry {\code {DES_ENCRYPT}}{721}
+-\entry {\code {DES_FAILED}}{722}
+-\entry {\code {DES_HW}}{722}
+-\entry {\code {des_setparity}}{722}
+-\entry {\code {DES_SW}}{722}
+-\entry {\code {DESERR_BADPARAM}}{722}
+-\entry {\code {DESERR_HWERROR}}{722}
+-\entry {\code {DESERR_NOHWDEVICE}}{722}
+-\entry {\code {DESERR_NONE}}{722}
+-\entry {\code {dgettext}}{170}
+-\entry {\code {difftime}}{490}
+-\entry {\code {div}}{478}
+-\entry {\code {drand48}}{453}
+-\entry {\code {drand48_r}}{455}
+-\entry {\code {drem}}{473}
+-\entry {\code {dremf}}{473}
+-\entry {\code {dreml}}{473}
+-\entry {\code {DTTOIF}}{322}
+-\entry {\code {dup}}{306}
+-\entry {\code {dup2}}{306}
+-\initial {E}
+-\entry {\code {ecb_crypt}}{721}
+-\entry {\code {ecvt}}{484}
+-\entry {\code {ecvt_r}}{485}
+-\entry {\code {encrypt}}{721}
+-\entry {\code {encrypt_r}}{721}
+-\entry {\code {endfsent}}{693}
+-\entry {\code {endgrent}}{684}
+-\entry {\code {endhostent}}{380}
+-\entry {\code {endmntent}}{695}
+-\entry {\code {endnetent}}{409}
+-\entry {\code {endnetgrent}}{687}
+-\entry {\code {endprotoent}}{385}
+-\entry {\code {endpwent}}{681}
+-\entry {\code {endservent}}{382}
+-\entry {\code {endutent}}{673}
+-\entry {\code {endutxent}}{677}
+-\entry {\code {envz_add}}{96}
+-\entry {\code {envz_entry}}{95}
+-\entry {\code {envz_get}}{96}
+-\entry {\code {envz_merge}}{96}
+-\entry {\code {envz_strip}}{96}
+-\entry {\code {erand48}}{454}
+-\entry {\code {erand48_r}}{456}
+-\entry {\code {erf}}{449}
+-\entry {\code {erfc}}{449}
+-\entry {\code {erfcf}}{449}
+-\entry {\code {erfcl}}{449}
+-\entry {\code {erff}}{449}
+-\entry {\code {erfl}}{449}
+-\entry {\code {execl}}{622}
+-\entry {\code {execle}}{622}
+-\entry {\code {execlp}}{623}
+-\entry {\code {execv}}{622}
+-\entry {\code {execve}}{622}
+-\entry {\code {execvp}}{623}
+-\entry {\code {exit}}{614}
+-\entry {\code {exp}}{443}
+-\entry {\code {exp10}}{443}
+-\entry {\code {exp10f}}{443}
+-\entry {\code {exp10l}}{443}
+-\entry {\code {exp2}}{443}
+-\entry {\code {exp2f}}{443}
+-\entry {\code {exp2l}}{443}
+-\entry {\code {expf}}{443}
+-\entry {\code {expl}}{443}
+-\entry {\code {expm1}}{446}
+-\entry {\code {expm1f}}{446}
+-\entry {\code {expm1l}}{446}
+-\initial {F}
+-\entry {\code {fabs}}{469}
+-\entry {\code {fabsf}}{469}
+-\entry {\code {fabsl}}{469}
+-\entry {\code {fchmod}}{347}
+-\entry {\code {fchown}}{344}
+-\entry {\code {fclean}}{284}
+-\entry {\code {fclose}}{214}
+-\entry {\code {fcloseall}}{215}
+-\entry {\code {fcntl}}{305}
+-\entry {\code {fcvt}}{484}
+-\entry {\code {fcvt_r}}{485}
+-\entry {\code {FD_CLR}}{290}
+-\entry {\code {FD_ISSET}}{290}
+-\entry {\code {FD_SET}}{290}
+-\entry {\code {FD_ZERO}}{290}
+-\entry {\code {fdatasync}}{293}
+-\entry {\code {fdim}}{476}
+-\entry {\code {fdimf}}{476}
+-\entry {\code {fdiml}}{476}
+-\entry {\code {fdopen}}{282}
+-\entry {\code {feclearexcept}}{464}
+-\entry {\code {fegetenv}}{468}
+-\entry {\code {fegetexceptflag}}{465}
+-\entry {\code {fegetround}}{467}
+-\entry {\code {feholdexcept}}{468}
+-\entry {\code {feof}}{251}
+-\entry {\code {ferror}}{251}
+-\entry {\code {fesetenv}}{468}
+-\entry {\code {fesetexceptflag}}{465}
+-\entry {\code {fesetround}}{467}
+-\entry {\code {fetestexcept}}{464}
+-\entry {\code {feupdateenv}}{468}
+-\entry {\code {fflush}}{257}
+-\entry {\code {fgetc}}{216}
+-\entry {\code {fgetgrent}}{683}
+-\entry {\code {fgetgrent_r}}{683}
+-\entry {\code {fgetpos}}{255}
+-\entry {\code {fgetpos64}}{255}
+-\entry {\code {fgetpwent}}{680}
+-\entry {\code {fgetpwent_r}}{680}
+-\entry {\code {fgets}}{218}
+-\entry {\code {fileno}}{283}
+-\entry {\code {finite}}{461}
+-\entry {\code {finitef}}{461}
+-\entry {\code {finitel}}{461}
+-\entry {\code {floor}}{471}
+-\entry {\code {floorf}}{471}
+-\entry {\code {floorl}}{471}
+-\entry {\code {fma}}{476}
+-\entry {\code {fmaf}}{476}
+-\entry {\code {fmal}}{476}
+-\entry {\code {fmax}}{476}
+-\entry {\code {fmaxf}}{476}
+-\entry {\code {fmaxl}}{476}
+-\entry {\code {fmemopen}}{259}
+-\entry {\code {fmin}}{475}
+-\entry {\code {fminf}}{475}
+-\entry {\code {fminl}}{475}
+-\entry {\code {fmod}}{472}
+-\entry {\code {fmodf}}{473}
+-\entry {\code {fmodl}}{473}
+-\entry {\code {fmtmsg}}{265}
+-\entry {\code {fnmatch}}{187}
+-\entry {\code {fopen}}{212}
+-\entry {\code {fopen64}}{213}
+-\entry {\code {fopencookie}}{263}
+-\entry {\code {fork}}{621}
+-\entry {\code {forkpty}}{437}
+-\entry {\code {fpathconf}}{712}
+-\entry {\code {fpclassify}}{459}
+-\entry {\code {fprintf}}{230}
+-\entry {\code {fputc}}{215}
+-\entry {\code {fputs}}{216}
+-\entry {\code {fread}}{221}
+-\entry {\code {free}}{34}
+-\entry {\code {freopen}}{214}
+-\entry {\code {freopen64}}{214}
+-\entry {\code {frexp}}{469}
+-\entry {\code {frexpf}}{469}
+-\entry {\code {frexpl}}{469}
+-\entry {\code {fscanf}}{249}
+-\entry {\code {fseek}}{253}
+-\entry {\code {fseeko}}{253}
+-\entry {\code {fseeko64}}{253}
+-\entry {\code {fsetpos}}{256}
+-\entry {\code {fsetpos64}}{256}
+-\entry {\code {fstat}}{341}
+-\entry {\code {fstat64}}{341}
+-\entry {\code {fsync}}{292}
+-\entry {\code {ftell}}{252}
+-\entry {\code {ftello}}{252}
+-\entry {\code {ftello64}}{252}
+-\entry {\code {ftruncate}}{274, 351}
+-\entry {\code {ftruncate64}}{275}
+-\entry {\code {ftw}}{329}
+-\entry {\code {ftw64}}{329}
+-\entry {\code {fwrite}}{221}
+-\initial {G}
+-\entry {\code {gamma}}{450}
+-\entry {\code {gammaf}}{450}
+-\entry {\code {gammal}}{450}
+-\entry {\code {gcvt}}{484}
+-\entry {\code {getc}}{217}
+-\entry {\code {getchar}}{217}
+-\entry {\code {getcwd}}{319}
+-\entry {\code {getdate}}{505}
+-\entry {\code {getdate_r}}{507}
+-\entry {\code {getdelim}}{218}
+-\entry {\code {getegid}}{663}
+-\entry {\code {getenv}}{610}
+-\entry {\code {geteuid}}{663}
+-\entry {\code {getfsent}}{693}
+-\entry {\code {getfsfile}}{693}
+-\entry {\code {getfsspec}}{693}
+-\entry {\code {getgid}}{663}
+-\entry {\code {getgrent}}{683}
+-\entry {\code {getgrent_r}}{684}
+-\entry {\code {getgrgid}}{682}
+-\entry {\code {getgrgid_r}}{682}
+-\entry {\code {getgrnam}}{682}
+-\entry {\code {getgrnam_r}}{683}
+-\entry {\code {getgroups}}{663}
+-\entry {\code {gethostbyaddr}}{378}
+-\entry {\code {gethostbyaddr_r}}{380}
+-\entry {\code {gethostbyname}}{378}
+-\entry {\code {gethostbyname_r}}{379}
+-\entry {\code {gethostbyname2}}{378}
+-\entry {\code {gethostbyname2_r}}{380}
+-\entry {\code {gethostent}}{380}
+-\entry {\code {gethostid}}{689}
+-\entry {\code {gethostname}}{689}
+-\entry {\code {getitimer}}{514}
+-\entry {\code {getline}}{218}
+-\entry {\code {getlogin}}{670}
+-\entry {\code {getmntent}}{695}
+-\entry {\code {getmntent_r}}{696}
+-\entry {\code {getnetbyaddr}}{409}
+-\entry {\code {getnetbyname}}{409}
+-\entry {\code {getnetent}}{409}
+-\entry {\code {getnetgrent}}{686}
+-\entry {\code {getnetgrent_r}}{686}
+-\entry {\code {getopt}}{577}
+-\entry {\code {getopt_long}}{581}
+-\entry {\code {getpass}}{718}
+-\entry {\code {getpeername}}{391}
+-\entry {\code {getpgid}}{647}
+-\entry {\code {getpgrp}}{647}
+-\entry {\code {getpid}}{620}
+-\entry {\code {getppid}}{620}
+-\entry {\code {getpriority}}{521}
+-\entry {\code {getprotobyname}}{384}
+-\entry {\code {getprotobynumber}}{384}
+-\entry {\code {getprotoent}}{384}
+-\entry {\code {getpt}}{434}
+-\entry {\code {getpwent}}{681}
+-\entry {\code {getpwent_r}}{681}
+-\entry {\code {getpwnam}}{680}
+-\entry {\code {getpwnam_r}}{680}
+-\entry {\code {getpwuid}}{679}
+-\entry {\code {getpwuid_r}}{679}
+-\entry {\code {getrlimit}}{519}
+-\entry {\code {getrlimit64}}{519}
+-\entry {\code {getrusage}}{517}
+-\entry {\code {gets}}{219}
+-\entry {\code {getservbyname}}{382}
+-\entry {\code {getservbyport}}{382}
+-\entry {\code {getservent}}{382}
+-\entry {\code {getsid}}{647}
+-\entry {\code {getsockname}}{367}
+-\entry {\code {getsockopt}}{406}
+-\entry {\code {getsubopt}}{607}
+-\entry {\code {gettext}}{169}
+-\entry {\code {gettimeofday}}{491}
+-\entry {\code {getuid}}{663}
+-\entry {\code {getumask}}{347}
+-\entry {\code {getutent}}{673}
+-\entry {\code {getutent_r}}{674}
+-\entry {\code {getutid}}{673}
+-\entry {\code {getutid_r}}{674}
+-\entry {\code {getutline}}{674}
+-\entry {\code {getutline_r}}{675}
+-\entry {\code {getutxent}}{677}
+-\entry {\code {getutxid}}{677}
+-\entry {\code {getutxline}}{677}
+-\entry {\code {getw}}{217}
+-\entry {\code {getwd}}{320}
+-\entry {\code {glob}}{189}
+-\entry {\code {globfree}}{193}
+-\entry {\code {gmtime}}{494}
+-\entry {\code {gmtime_r}}{494}
+-\entry {\code {grantpt}}{434}
+-\entry {\code {gsignal}}{556}
+-\initial {H}
+-\entry {\code {hasmntopt}}{696}
+-\entry {\code {hcreate}}{182}
+-\entry {\code {hcreate_r}}{183}
+-\entry {\code {hdestroy}}{182}
+-\entry {\code {hdestroy_r}}{183}
+-\entry {\code {hsearch}}{183}
+-\entry {\code {hsearch_r}}{184}
+-\entry {\code {htonl}}{383}
+-\entry {\code {htons}}{383}
+-\entry {\code {hypot}}{445}
+-\entry {\code {hypotf}}{445}
+-\entry {\code {hypotl}}{445}
+-\initial {I}
+-\entry {\code {iconv}}{121}
+-\entry {\code {iconv_close}}{120}
+-\entry {\code {iconv_open}}{119}
+-\entry {\code {if_freenameindex}}{369}
+-\entry {\code {if_indextoname}}{368}
+-\entry {\code {if_nameindex}}{368}
+-\entry {\code {if_nametoindex}}{368}
+-\entry {\code {IFTODT}}{321}
+-\entry {\code {ilogb}}{444}
+-\entry {\code {ilogbf}}{444}
+-\entry {\code {ilogbl}}{444}
+-\entry {\code {imaxabs}}{469}
+-\entry {\code {imaxdiv}}{479}
+-\entry {\code {index}}{87}
+-\entry {\code {inet_addr}}{376}
+-\entry {\code {inet_aton}}{376}
+-\entry {\code {inet_lnaof}}{376}
+-\entry {\code {inet_makeaddr}}{376}
+-\entry {\code {inet_netof}}{377}
+-\entry {\code {inet_network}}{376}
+-\entry {\code {inet_ntoa}}{376}
+-\entry {\code {inet_ntop}}{377}
+-\entry {\code {inet_pton}}{377}
+-\entry {\code {infnan}}{461}
+-\entry {\code {initgroups}}{666}
+-\entry {\code {initstate}}{453}
+-\entry {\code {innetgr}}{687}
+-\entry {\code {ioctl}}{318}
+-\entry {\code {isalnum}}{62}
+-\entry {\code {isalpha}}{61}
+-\entry {\code {isascii}}{63}
+-\entry {\code {isatty}}{411}
+-\entry {\code {isblank}}{62}
+-\entry {\code {iscntrl}}{63}
+-\entry {\code {isdigit}}{62}
+-\entry {\code {isfinite}}{460}
+-\entry {\code {isgraph}}{62}
+-\entry {\code {isgreater}}{475}
+-\entry {\code {isgreaterequal}}{475}
+-\entry {\code {isinf}}{460}
+-\entry {\code {isinff}}{460}
+-\entry {\code {isinfl}}{460}
+-\entry {\code {isless}}{475}
+-\entry {\code {islessequal}}{475}
+-\entry {\code {islessgreater}}{475}
+-\entry {\code {islower}}{61}
+-\entry {\code {isnan}}{460}
+-\entry {\code {isnanf}}{460}
+-\entry {\code {isnanl}}{460}
+-\entry {\code {isnormal}}{460}
+-\entry {\code {isprint}}{62}
+-\entry {\code {ispunct}}{62}
+-\entry {\code {isspace}}{62}
+-\entry {\code {isunordered}}{475}
+-\entry {\code {isupper}}{61}
+-\entry {\code {iswalnum}}{65}
+-\entry {\code {iswalpha}}{65}
+-\entry {\code {iswblank}}{67}
+-\entry {\code {iswcntrl}}{65}
+-\entry {\code {iswctype}}{64}
+-\entry {\code {iswdigit}}{65}
+-\entry {\code {iswgraph}}{66}
+-\entry {\code {iswlower}}{66}
+-\entry {\code {iswprint}}{66}
+-\entry {\code {iswpunct}}{66}
+-\entry {\code {iswspace}}{66}
+-\entry {\code {iswupper}}{67}
+-\entry {\code {iswxdigit}}{67}
+-\entry {\code {isxdigit}}{62}
+-\entry {\code {ITIMER_PROF}}{515}
+-\entry {\code {ITIMER_REAL}}{514}
+-\entry {\code {ITIMER_VIRTUAL}}{514}
+-\initial {J}
+-\entry {\code {j0}}{450}
+-\entry {\code {j0f}}{450}
+-\entry {\code {j0l}}{450}
+-\entry {\code {j1}}{450}
+-\entry {\code {j1f}}{450}
+-\entry {\code {j1l}}{450}
+-\entry {\code {jn}}{450}
+-\entry {\code {jnf}}{450}
+-\entry {\code {jnl}}{450}
+-\entry {\code {jrand48}}{454}
+-\entry {\code {jrand48_r}}{456}
+-\initial {K}
+-\entry {\code {kill}}{557}
+-\entry {\code {killpg}}{558}
+-\initial {L}
+-\entry {\code {l64a}}{91}
+-\entry {\code {labs}}{469}
+-\entry {\code {lcong48}}{455}
+-\entry {\code {lcong48_r}}{457}
+-\entry {\code {ldexp}}{470}
+-\entry {\code {ldexpf}}{470}
+-\entry {\code {ldexpl}}{470}
+-\entry {\code {ldiv}}{479}
+-\entry {\code {lfind}}{177}
+-\entry {\code {lgamma}}{449}
+-\entry {\code {lgamma_r}}{450}
+-\entry {\code {lgammaf}}{449}
+-\entry {\code {lgammaf_r}}{450}
+-\entry {\code {lgammal}}{449}
+-\entry {\code {lgammal_r}}{450}
+-\entry {\code {link}}{331}
+-\entry {\code {lio_listio}}{298}
+-\entry {\code {lio_listio64}}{299}
+-\entry {\code {listen}}{390}
+-\entry {\code {llabs}}{469}
+-\entry {\code {lldiv}}{479}
+-\entry {\code {llrint}}{472}
+-\entry {\code {llrintf}}{472}
+-\entry {\code {llrintl}}{472}
+-\entry {\code {llround}}{472}
+-\entry {\code {llroundf}}{472}
+-\entry {\code {llroundl}}{472}
+-\entry {\code {localeconv}}{146}
+-\entry {\code {localtime}}{493}
+-\entry {\code {localtime_r}}{494}
+-\entry {\code {log}}{444}
+-\entry {\code {log10}}{444}
+-\entry {\code {log10f}}{444}
+-\entry {\code {log10l}}{444}
+-\entry {\code {log1p}}{446}
+-\entry {\code {log1pf}}{446}
+-\entry {\code {log1pl}}{446}
+-\entry {\code {log2}}{444}
+-\entry {\code {log2f}}{444}
+-\entry {\code {log2l}}{444}
+-\entry {\code {logb}}{444, 470}
+-\entry {\code {logbf}}{444, 470}
+-\entry {\code {logbl}}{444, 470}
+-\entry {\code {logf}}{444}
+-\entry {\code {login}}{678}
+-\entry {\code {login_tty}}{678}
+-\entry {\code {logl}}{444}
+-\entry {\code {logout}}{678}
+-\entry {\code {logwtmp}}{678}
+-\entry {\code {longjmp}}{525}
+-\entry {\code {lrand48}}{454}
+-\entry {\code {lrand48_r}}{456}
+-\entry {\code {lrint}}{472}
+-\entry {\code {lrintf}}{472}
+-\entry {\code {lrintl}}{472}
+-\entry {\code {lround}}{472}
+-\entry {\code {lroundf}}{472}
+-\entry {\code {lroundl}}{472}
+-\entry {\code {lsearch}}{178}
+-\entry {\code {lseek}}{280}
+-\entry {\code {lseek64}}{281}
+-\entry {\code {lstat}}{341}
+-\entry {\code {lstat64}}{341}
+-\initial {M}
+-\entry {\code {main}}{575}
+-\entry {\code {mallinfo}}{42}
+-\entry {\code {malloc}}{32}
+-\entry {\code {mallopt}}{37}
+-\entry {\code {matherr}}{461}
+-\entry {\code {mblen}}{116}
+-\entry {\code {mbrlen}}{106}
+-\entry {\code {mbrtowc}}{105}
+-\entry {\code {mbsinit}}{103}
+-\entry {\code {mbsnrtowcs}}{112}
+-\entry {\code {mbsrtowcs}}{110}
+-\entry {\code {mbstowcs}}{116}
+-\entry {\code {mbtowc}}{115}
+-\entry {\code {mcheck}}{37}
+-\entry {\code {memalign}}{36}
+-\entry {\code {memccpy}}{74}
+-\entry {\code {memchr}}{86}
+-\entry {\code {memcmp}}{81}
+-\entry {\code {memcpy}}{74}
+-\entry {\code {memmem}}{88}
+-\entry {\code {memmove}}{74}
+-\entry {\code {mempcpy}}{74}
+-\entry {\code {memset}}{74}
+-\entry {\code {mkdir}}{335}
+-\entry {\code {mkfifo}}{360}
+-\entry {\code {mknod}}{352}
+-\entry {\code {mkstemp}}{355}
+-\entry {\code {mktemp}}{355}
+-\entry {\code {mktime}}{494}
+-\entry {\code {mmap}}{286}
+-\entry {\code {modf}}{472}
+-\entry {\code {modff}}{472}
+-\entry {\code {modfl}}{472}
+-\entry {\code {mprobe}}{38}
+-\entry {\code {mrand48}}{454}
+-\entry {\code {mrand48_r}}{456}
+-\entry {\code {mremap}}{288}
+-\entry {\code {msync}}{288}
+-\entry {\code {mtrace}}{43}
+-\entry {\code {munmap}}{288}
+-\entry {\code {muntrace}}{43}
+-\initial {N}
+-\entry {\code {nan}}{474}
+-\entry {\code {nanf}}{474}
+-\entry {\code {nanl}}{474}
+-\entry {\code {nanosleep}}{516}
+-\entry {\code {nearbyint}}{471}
+-\entry {\code {nearbyintf}}{471}
+-\entry {\code {nearbyintl}}{471}
+-\entry {\code {nextafter}}{474}
+-\entry {\code {nextafterf}}{474}
+-\entry {\code {nextafterl}}{474}
+-\entry {\code {nexttoward}}{474}
+-\entry {\code {nexttowardf}}{474}
+-\entry {\code {nexttowardl}}{474}
+-\entry {\code {nftw}}{329}
+-\entry {\code {nftw64}}{330}
+-\entry {\code {nice}}{522}
+-\entry {\code {nl_langinfo}}{150}
+-\entry {\code {notfound}}{653}
+-\entry {\code {nrand48}}{454}
+-\entry {\code {nrand48_r}}{456}
+-\entry {\code {NSS_STATUS_NOTFOUND}}{656}
+-\entry {\code {NSS_STATUS_SUCCESS}}{656}
+-\entry {\code {NSS_STATUS_TRYAGAIN}}{656}
+-\entry {\code {NSS_STATUS_UNAVAIL}}{656}
+-\entry {\code {ntohl}}{383}
+-\entry {\code {ntohs}}{383}
+-\entry {\code {ntp_adjtime}}{513}
+-\entry {\code {ntp_gettime}}{511}
+-\initial {O}
+-\entry {\code {obstack_1grow}}{51}
+-\entry {\code {obstack_1grow_fast}}{53}
+-\entry {\code {obstack_alignment_mask}}{55}
+-\entry {\code {obstack_alloc}}{49}
+-\entry {\code {obstack_base}}{54}
+-\entry {\code {obstack_blank}}{51}
+-\entry {\code {obstack_blank_fast}}{53}
+-\entry {\code {obstack_chunk_alloc}}{47}
+-\entry {\code {obstack_chunk_free}}{47}
+-\entry {\code {obstack_chunk_size}}{56}
+-\entry {\code {obstack_copy}}{49}
+-\entry {\code {obstack_copy0}}{49}
+-\entry {\code {obstack_finish}}{52}
+-\entry {\code {obstack_free}}{50}
+-\entry {\code {obstack_grow}}{51}
+-\entry {\code {obstack_grow0}}{51}
+-\entry {\code {obstack_init}}{48}
+-\entry {\code {obstack_int_grow}}{52}
+-\entry {\code {obstack_int_grow_fast}}{53}
+-\entry {\code {obstack_next_free}}{54}
+-\entry {\code {obstack_object_size}}{52, 54}
+-\entry {\code {obstack_printf}}{231}
+-\entry {\code {obstack_ptr_grow}}{52}
+-\entry {\code {obstack_ptr_grow_fast}}{53}
+-\entry {\code {obstack_room}}{53}
+-\entry {\code {obstack_vprintf}}{233}
+-\entry {\code {offsetof}}{759}
+-\entry {\code {on_exit}}{615}
+-\entry {\code {open}}{271}
+-\entry {\code {open_memstream}}{260}
+-\entry {\code {open_obstack_stream}}{261}
+-\entry {\code {open64}}{272}
+-\entry {\code {opendir}}{322}
+-\entry {\code {openpty}}{436}
+-\initial {P}
+-\entry {\code {parse_printf_format}}{234}
+-\entry {\code {pathconf}}{712}
+-\entry {\code {pause}}{567}
+-\entry {\code {pclose}}{359}
+-\entry {\code {perror}}{27}
+-\entry {\code {pipe}}{357}
+-\entry {\code {popen}}{359}
+-\entry {\code {pow}}{445}
+-\entry {\code {pow10}}{443}
+-\entry {\code {pow10f}}{443}
+-\entry {\code {pow10l}}{443}
+-\entry {\code {powf}}{445}
+-\entry {\code {powl}}{445}
+-\entry {\code {pread}}{276}
+-\entry {\code {pread64}}{277}
+-\entry {\code {printf}}{230}
+-\entry {\code {printf_size}}{241}
+-\entry {\code {printf_size_info}}{242}
+-\entry {\code {psignal}}{538}
+-\entry {\code {pthread_atfork}}{740}
+-\entry {\code {pthread_attr_destroy}}{725}
+-\entry {\code {pthread_attr_get\var {attr}}}{725}
+-\entry {\code {pthread_attr_getinheritsched}}{725}
+-\entry {\code {pthread_attr_getschedparam}}{725}
+-\entry {\code {pthread_attr_getschedpolicy}}{725}
+-\entry {\code {pthread_attr_getscope}}{725}
+-\entry {\code {pthread_attr_init}}{724}
+-\entry {\code {pthread_attr_set\var {attr}}}{725}
+-\entry {\code {pthread_attr_setinheritsched}}{725}
+-\entry {\code {pthread_attr_setschedparam}}{725}
+-\entry {\code {pthread_attr_setschedpolicy}}{725}
+-\entry {\code {pthread_attr_setscope}}{725}
+-\entry {\code {pthread_cancel}}{724}
+-\entry {\code {pthread_cleanup_pop}}{728}
+-\entry {\code {pthread_cleanup_pop_restore_np}}{729}
+-\entry {\code {pthread_cleanup_push}}{728}
+-\entry {\code {pthread_cleanup_push_defer_np}}{729}
+-\entry {\code {pthread_cond_broadcast}}{733}
+-\entry {\code {pthread_cond_destroy}}{733}
+-\entry {\code {pthread_cond_init}}{732}
+-\entry {\code {pthread_cond_signal}}{733}
+-\entry {\code {pthread_cond_timedwait}}{733}
+-\entry {\code {pthread_cond_wait}}{733}
+-\entry {\code {pthread_condattr_destroy}}{735}
+-\entry {\code {pthread_condattr_init}}{735}
+-\entry {\code {pthread_create}}{723}
+-\entry {\code {pthread_detach}}{740}
+-\entry {\code {pthread_equal}}{739}
+-\entry {\code {pthread_exit}}{723}
+-\entry {\code {pthread_getschedparam}}{741}
+-\entry {\code {pthread_getspecific}}{737}
+-\entry {\code {pthread_join}}{724}
+-\entry {\code {pthread_key_create}}{737}
+-\entry {\code {pthread_key_delete}}{737}
+-\entry {\code {pthread_kill}}{739}
+-\entry {\code {pthread_kill_other_threads_np}}{740}
+-\entry {\code {pthread_mutex_destroy}}{731}
+-\entry {\code {pthread_mutex_init}}{730}
+-\entry {\code {pthread_mutex_lock}}{730}
+-\entry {\code {pthread_mutex_trylock}}{730}
+-\entry {\code {pthread_mutex_unlock}}{730}
+-\entry {\code {pthread_mutexattr_destroy}}{731}
+-\entry {\code {pthread_mutexattr_getkind_np}}{732}
+-\entry {\code {pthread_mutexattr_init}}{731}
+-\entry {\code {pthread_mutexattr_setkind_np}}{732}
+-\entry {\code {pthread_once}}{741}
+-\entry {\code {pthread_self}}{739}
+-\entry {\code {pthread_setcancelstate}}{727}
+-\entry {\code {pthread_setcanceltype}}{727}
+-\entry {\code {pthread_setschedparam}}{741}
+-\entry {\code {pthread_setspecific}}{737}
+-\entry {\code {pthread_sigmask}}{738}
+-\entry {\code {pthread_testcancel}}{727}
+-\entry {\code {ptsname}}{435}
+-\entry {\code {ptsname_r}}{435}
+-\entry {\code {putc}}{215}
+-\entry {\code {putchar}}{216}
+-\entry {\code {putenv}}{610}
+-\entry {\code {putpwent}}{681}
+-\entry {\code {puts}}{216}
+-\entry {\code {pututline}}{674}
+-\entry {\code {pututxline}}{677}
+-\entry {\code {putw}}{216}
+-\entry {\code {pwrite}}{279}
+-\entry {\code {pwrite64}}{279}
+-\initial {Q}
+-\entry {\code {qecvt}}{484}
+-\entry {\code {qecvt_r}}{485}
+-\entry {\code {qfcvt}}{484}
+-\entry {\code {qfcvt_r}}{485}
+-\entry {\code {qgcvt}}{485}
+-\entry {\code {qsort}}{178}
+-\initial {R}
+-\entry {\code {raise}}{556}
+-\entry {\code {rand}}{452}
+-\entry {\code {rand_r}}{452}
+-\entry {\code {random}}{452}
+-\entry {\code {read}}{275}
+-\entry {\code {readdir}}{323}
+-\entry {\code {readdir_r}}{323}
+-\entry {\code {readlink}}{332}
+-\entry {\code {readv}}{285}
+-\entry {\code {realloc}}{35}
+-\entry {\code {recv}}{393}
+-\entry {\code {recvfrom}}{401}
+-\entry {\code {regcomp}}{194}
+-\entry {\code {regerror}}{198}
+-\entry {\code {regexec}}{195}
+-\entry {\code {regfree}}{198}
+-\entry {\code {register_printf_function}}{237}
+-\entry {\code {remainder}}{473}
+-\entry {\code {remainderf}}{473}
+-\entry {\code {remainderl}}{473}
+-\entry {\code {remove}}{334}
+-\entry {\code {rename}}{334}
+-\entry {\code {rewind}}{254}
+-\entry {\code {rewinddir}}{324}
+-\entry {\code {rindex}}{87}
+-\entry {\code {rint}}{471}
+-\entry {\code {rintf}}{471}
+-\entry {\code {rintl}}{471}
+-\entry {\code {rmdir}}{334}
+-\entry {\code {round}}{472}
+-\entry {\code {roundf}}{472}
+-\entry {\code {roundl}}{472}
+-\initial {S}
+-\entry {\code {S_ISBLK}}{342}
+-\entry {\code {S_ISCHR}}{342}
+-\entry {\code {S_ISDIR}}{342}
+-\entry {\code {S_ISFIFO}}{342}
+-\entry {\code {S_ISLNK}}{342}
+-\entry {\code {S_ISREG}}{342}
+-\entry {\code {S_ISSOCK}}{342}
+-\entry {\code {scalb}}{470}
+-\entry {\code {scalbf}}{470}
+-\entry {\code {scalbl}}{470}
+-\entry {\code {scalbln}}{470}
+-\entry {\code {scalblnf}}{470}
+-\entry {\code {scalblnl}}{470}
+-\entry {\code {scalbn}}{470}
+-\entry {\code {scalbnf}}{470}
+-\entry {\code {scalbnl}}{470}
+-\entry {\code {scandir}}{325}
+-\entry {\code {scandir64}}{325}
+-\entry {\code {scanf}}{249}
+-\entry {\code {seed48}}{455}
+-\entry {\code {seed48_r}}{457}
+-\entry {\code {seekdir}}{324}
+-\entry {\code {select}}{290}
+-\entry {\code {sem_destroy}}{735}
+-\entry {\code {sem_getvalue}}{736}
+-\entry {\code {sem_init}}{735}
+-\entry {\code {sem_post}}{736}
+-\entry {\code {sem_trywait}}{736}
+-\entry {\code {sem_wait}}{736}
+-\entry {\code {send}}{392}
+-\entry {\code {sendto}}{401}
+-\entry {\code {setbuf}}{259}
+-\entry {\code {setbuffer}}{259}
+-\entry {\code {setegid}}{665}
+-\entry {\code {setenv}}{610}
+-\entry {\code {seteuid}}{664}
+-\entry {\code {setfsent}}{692}
+-\entry {\code {setgid}}{665}
+-\entry {\code {setgrent}}{683}
+-\entry {\code {setgroups}}{666}
+-\entry {\code {sethostent}}{380}
+-\entry {\code {sethostid}}{690}
+-\entry {\code {sethostname}}{689}
+-\entry {\code {setitimer}}{514}
+-\entry {\code {setjmp}}{524}
+-\entry {\code {setkey}}{721}
+-\entry {\code {setkey_r}}{721}
+-\entry {\code {setlinebuf}}{259}
+-\entry {\code {setlocale}}{143}
+-\entry {\code {setmntent}}{695}
+-\entry {\code {setnetent}}{409}
+-\entry {\code {setnetgrent}}{686}
+-\entry {\code {setpgid}}{648}
+-\entry {\code {setpgrp}}{648}
+-\entry {\code {setpriority}}{522}
+-\entry {\code {setprotoent}}{384}
+-\entry {\code {setpwent}}{681}
+-\entry {\code {setregid}}{665}
+-\entry {\code {setreuid}}{665}
+-\entry {\code {setrlimit}}{519}
+-\entry {\code {setrlimit64}}{519}
+-\entry {\code {setservent}}{382}
+-\entry {\code {setsid}}{647}
+-\entry {\code {setsockopt}}{407}
+-\entry {\code {setstate}}{453}
+-\entry {\code {settimeofday}}{491}
+-\entry {\code {setuid}}{664}
+-\entry {\code {setutent}}{673}
+-\entry {\code {setutxent}}{677}
+-\entry {\code {setvbuf}}{258}
+-\entry {\code {shutdown}}{387}
+-\entry {\code {sigaction}}{541}
+-\entry {\code {sigaddset}}{562}
+-\entry {\code {sigaltstack}}{571}
+-\entry {\code {sigblock}}{573}
+-\entry {\code {sigdelset}}{562}
+-\entry {\code {sigemptyset}}{562}
+-\entry {\code {sigfillset}}{562}
+-\entry {\code {siginterrupt}}{573}
+-\entry {\code {sigismember}}{562}
+-\entry {\code {siglongjmp}}{526}
+-\entry {\code {sigmask}}{573}
+-\entry {\code {signal}}{538}
+-\entry {\code {signbit}}{474}
+-\entry {\code {significand}}{470}
+-\entry {\code {significandf}}{470}
+-\entry {\code {significandl}}{470}
+-\entry {\code {sigpause}}{573}
+-\entry {\code {sigpending}}{565}
+-\entry {\code {sigprocmask}}{562}
+-\entry {\code {sigsetjmp}}{526}
+-\entry {\code {sigsetmask}}{573}
+-\entry {\code {sigstack}}{571}
+-\entry {\code {sigsuspend}}{569}
+-\entry {\code {sigvec}}{573}
+-\entry {\code {sigwait}}{739}
+-\entry {\code {sin}}{440}
+-\entry {\code {sincos}}{441}
+-\entry {\code {sincosf}}{441}
+-\entry {\code {sincosl}}{441}
+-\entry {\code {sinf}}{440}
+-\entry {\code {sinh}}{447}
+-\entry {\code {sinhf}}{447}
+-\entry {\code {sinhl}}{447}
+-\entry {\code {sinl}}{440}
+-\entry {\code {sleep}}{515}
+-\entry {\code {snprintf}}{230}
+-\entry {\code {socket}}{386}
+-\entry {\code {socketpair}}{388}
+-\entry {\code {sprintf}}{230}
+-\entry {\code {sqrt}}{445}
+-\entry {\code {sqrtf}}{445}
+-\entry {\code {sqrtl}}{445}
+-\entry {\code {srand}}{452}
+-\entry {\code {srand48}}{454}
+-\entry {\code {srand48_r}}{457}
+-\entry {\code {srandom}}{452}
+-\entry {\code {sscanf}}{249}
+-\entry {\code {ssignal}}{540}
+-\entry {\code {stat}}{340}
+-\entry {\code {stat64}}{340}
+-\entry {\code {stpcpy}}{75}
+-\entry {\code {stpncpy}}{76}
+-\entry {\code {strcasecmp}}{81}
+-\entry {\code {strcat}}{77}
+-\entry {\code {strchr}}{86}
+-\entry {\code {strcmp}}{81}
+-\entry {\code {strcoll}}{84}
+-\entry {\code {strcpy}}{74}
+-\entry {\code {strcspn}}{88}
+-\entry {\code {strdup}}{75}
+-\entry {\code {strdupa}}{76}
+-\entry {\code {strerror}}{27}
+-\entry {\code {strerror_r}}{27}
+-\entry {\code {strfmon}}{155}
+-\entry {\code {strftime}}{495}
+-\entry {\code {strlen}}{72}
+-\entry {\code {strncasecmp}}{82}
+-\entry {\code {strncat}}{79}
+-\entry {\code {strncmp}}{82}
+-\entry {\code {strncpy}}{75}
+-\entry {\code {strndup}}{75}
+-\entry {\code {strndupa}}{77}
+-\entry {\code {strnlen}}{73}
+-\entry {\code {strpbrk}}{88}
+-\entry {\code {strptime}}{500}
+-\entry {\code {strrchr}}{87}
+-\entry {\code {strsep}}{90}
+-\entry {\code {strsignal}}{537}
+-\entry {\code {strspn}}{88}
+-\entry {\code {strstr}}{87}
+-\entry {\code {strtod}}{482}
+-\entry {\code {strtof}}{483}
+-\entry {\code {strtok}}{88}
+-\entry {\code {strtok_r}}{90}
+-\entry {\code {strtol}}{480}
+-\entry {\code {strtol_l}}{481}
+-\entry {\code {strtold}}{483}
+-\entry {\code {strtoll}}{481}
+-\entry {\code {strtoll_l}}{481}
+-\entry {\code {strtoq}}{481}
+-\entry {\code {strtoul}}{480}
+-\entry {\code {strtoul_l}}{481}
+-\entry {\code {strtoull}}{481}
+-\entry {\code {strtoull_l}}{481}
+-\entry {\code {strtouq}}{481}
+-\entry {\code {strverscmp}}{82}
+-\entry {\code {strxfrm}}{84}
+-\entry {\code {success}}{653}
+-\entry {\code {SUN_LEN}}{370}
+-\entry {\code {symlink}}{332}
+-\entry {\code {sync}}{292}
+-\entry {\code {sysconf}}{700}
+-\entry {\code {system}}{619}
+-\entry {\code {sysv_signal}}{540}
+-\initial {T}
+-\entry {\code {tan}}{440}
+-\entry {\code {tanf}}{440}
+-\entry {\code {tanh}}{447}
+-\entry {\code {tanhf}}{447}
+-\entry {\code {tanhl}}{447}
+-\entry {\code {tanl}}{440}
+-\entry {\code {tcdrain}}{431}
+-\entry {\code {tcflow}}{432}
+-\entry {\code {tcflush}}{431}
+-\entry {\code {tcgetattr}}{414}
+-\entry {\code {tcgetpgrp}}{648}
+-\entry {\code {tcgetsid}}{649}
+-\entry {\code {tcsendbreak}}{431}
+-\entry {\code {tcsetattr}}{414}
+-\entry {\code {tcsetpgrp}}{649}
+-\entry {\code {tdelete}}{185}
+-\entry {\code {tdestroy}}{185}
+-\entry {\code {telldir}}{324}
+-\entry {\code {TEMP_FAILURE_RETRY}}{555}
+-\entry {\code {tempnam}}{354}
+-\entry {\code {textdomain}}{172}
+-\entry {\code {tfind}}{185}
+-\entry {\code {tgamma}}{450}
+-\entry {\code {tgammaf}}{450}
+-\entry {\code {tgammal}}{450}
+-\entry {\code {time}}{490}
+-\entry {\code {times}}{489}
+-\entry {\code {tmpfile}}{353}
+-\entry {\code {tmpfile64}}{353}
+-\entry {\code {tmpnam}}{354}
+-\entry {\code {tmpnam_r}}{354}
+-\entry {\code {toascii}}{63}
+-\entry {\code {tolower}}{63}
+-\entry {\code {toupper}}{63}
+-\entry {\code {towctrans}}{69}
+-\entry {\code {towlower}}{69}
+-\entry {\code {towupper}}{69}
+-\entry {\code {trunc}}{471}
+-\entry {\code {truncate}}{274, 351}
+-\entry {\code {truncate64}}{274}
+-\entry {\code {truncf}}{471}
+-\entry {\code {truncl}}{471}
+-\entry {\code {tryagain}}{653}
+-\entry {\code {tsearch}}{184}
+-\entry {\code {ttyname}}{411}
+-\entry {\code {ttyname_r}}{411}
+-\entry {\code {twalk}}{186}
+-\entry {\code {tzset}}{509}
+-\initial {U}
+-\entry {\code {umask}}{347}
+-\entry {\code {uname}}{691}
+-\entry {\code {unavail}}{653}
+-\entry {\code {ungetc}}{220}
+-\entry {\code {unlink}}{333}
+-\entry {\code {unlockpt}}{435}
+-\entry {\code {unsetenv}}{611}
+-\entry {\code {updwtmp}}{675}
+-\entry {\code {utime}}{350}
+-\entry {\code {utimes}}{350}
+-\entry {\code {utmpname}}{675}
+-\initial {V}
+-\entry {\code {va_alist}}{750}
+-\entry {\code {va_arg}}{748}
+-\entry {\code {va_dcl}}{750}
+-\entry {\code {va_end}}{748}
+-\entry {\code {va_start}}{748, 750}
+-\entry {\code {valloc}}{36}
+-\entry {\code {vasprintf}}{233}
+-\entry {\code {versionsort}}{325}
+-\entry {\code {versionsort64}}{326}
+-\entry {\code {vfork}}{621}
+-\entry {\code {vfprintf}}{233}
+-\entry {\code {vfscanf}}{250}
+-\entry {\code {vprintf}}{232}
+-\entry {\code {vscanf}}{250}
+-\entry {\code {vsnprintf}}{233}
+-\entry {\code {vsprintf}}{233}
+-\entry {\code {vsscanf}}{250}
+-\initial {W}
+-\entry {\code {wait}}{626}
+-\entry {\code {wait3}}{628}
+-\entry {\code {wait4}}{626}
+-\entry {\code {waitpid}}{624}
+-\entry {\code {WCOREDUMP}}{627}
+-\entry {\code {wcrtomb}}{107}
+-\entry {\code {wcsnrtombs}}{112}
+-\entry {\code {wcsrtombs}}{111}
+-\entry {\code {wcstombs}}{117}
+-\entry {\code {wctob}}{105}
+-\entry {\code {wctomb}}{115}
+-\entry {\code {wctrans}}{68}
+-\entry {\code {wctype}}{64}
+-\entry {\code {WEXITSTATUS}}{627}
+-\entry {\code {WIFEXITED}}{627}
+-\entry {\code {WIFSIGNALED}}{627}
+-\entry {\code {WIFSTOPPED}}{627}
+-\entry {\code {wordexp}}{200}
+-\entry {\code {wordfree}}{200}
+-\entry {\code {write}}{277}
+-\entry {\code {writev}}{285}
+-\entry {\code {WSTOPSIG}}{627}
+-\entry {\code {WTERMSIG}}{627}
+-\initial {Y}
+-\entry {\code {y0}}{450}
+-\entry {\code {y0f}}{450}
+-\entry {\code {y0l}}{450}
+-\entry {\code {y1}}{451}
+-\entry {\code {y1f}}{451}
+-\entry {\code {y1l}}{451}
+-\entry {\code {yn}}{451}
+-\entry {\code {ynf}}{451}
+-\entry {\code {ynl}}{451}
+diff -Naur ../glibc-2.1.3/manual/libc.info glibc-2.1.3/manual/libc.info
+--- ../glibc-2.1.3/manual/libc.info	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info	1969-12-31 16:00:00.000000000 -0800
+@@ -1,752 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-Indirect:
+-libc.info-1: 1298
+-libc.info-2: 57716
+-libc.info-3: 102744
+-libc.info-4: 151031
+-libc.info-5: 199987
+-libc.info-6: 249921
+-libc.info-7: 292606
+-libc.info-8: 339721
+-libc.info-9: 378119
+-libc.info-10: 424741
+-libc.info-11: 468204
+-libc.info-12: 510493
+-libc.info-13: 559332
+-libc.info-14: 606451
+-libc.info-15: 654088
+-libc.info-16: 701144
+-libc.info-17: 750430
+-libc.info-18: 795650
+-libc.info-19: 844918
+-libc.info-20: 894777
+-libc.info-21: 944407
+-libc.info-22: 992882
+-libc.info-23: 1042803
+-libc.info-24: 1090005
+-libc.info-25: 1138647
+-libc.info-26: 1185928
+-libc.info-27: 1232876
+-libc.info-28: 1281524
+-libc.info-29: 1329861
+-libc.info-30: 1374966
+-libc.info-31: 1420048
+-libc.info-32: 1469028
+-libc.info-33: 1518430
+-libc.info-34: 1565374
+-libc.info-35: 1614949
+-libc.info-36: 1663505
+-libc.info-37: 1707438
+-libc.info-38: 1756967
+-libc.info-39: 1806436
+-libc.info-40: 1855417
+-libc.info-41: 1898314
+-libc.info-42: 1942337
+-libc.info-43: 1989010
+-libc.info-44: 2037813
+-libc.info-45: 2050944
+-libc.info-46: 2234131
+-libc.info-47: 2277750
+-libc.info-48: 2322225
+-libc.info-49: 2379317
+-libc.info-50: 2386726
+-libc.info-51: 2457367
+-libc.info-52: 2508837
+-
+-Tag Table:
+-(Indirect)
+-Node: Top1298
+-Node: Introduction57716
+-Node: Getting Started59065
+-Node: Standards and Portability60525
+-Node: ISO C61973
+-Node: POSIX63490
+-Node: Berkeley Unix65231
+-Node: SVID65999
+-Node: XPG67000
+-Node: Using the Library67941
+-Node: Header Files68664
+-Node: Macro Definitions72616
+-Node: Reserved Names74961
+-Node: Feature Test Macros79644
+-Node: Roadmap to the Manual90385
+-Node: Error Reporting97601
+-Node: Checking for Errors98529
+-Node: Error Codes102744
+-Node: Error Messages121761
+-Node: Memory Allocation127458
+-Node: Memory Concepts128350
+-Node: Dynamic Allocation and C129620
+-Node: Unconstrained Allocation131704
+-Node: Basic Allocation133155
+-Node: Malloc Examples134859
+-Node: Freeing after Malloc136810
+-Node: Changing Block Size138626
+-Node: Allocating Cleared Space141229
+-Node: Efficiency and Malloc142237
+-Node: Aligned Memory Blocks143327
+-Node: Malloc Tunable Parameters144707
+-Node: Heap Consistency Checking146370
+-Node: Hooks for Malloc151031
+-Node: Statistics of Malloc155620
+-Node: Summary of Malloc157553
+-Node: Allocation Debugging159677
+-Node: Tracing malloc160821
+-Node: Using the Memory Debugger162677
+-Node: Tips for the Memory Debugger164557
+-Node: Interpreting the traces165892
+-Node: Obstacks169485
+-Node: Creating Obstacks171099
+-Node: Preparing for Obstacks172998
+-Node: Allocation in an Obstack175745
+-Node: Freeing Obstack Objects178153
+-Node: Obstack Functions179489
+-Node: Growing Objects181719
+-Node: Extra Fast Growing185966
+-Node: Status of an Obstack189585
+-Node: Obstacks Data Alignment191004
+-Node: Obstack Chunks192690
+-Node: Summary of Obstacks195046
+-Node: Variable Size Automatic198460
+-Node: Alloca Example199987
+-Node: Advantages of Alloca201104
+-Node: Disadvantages of Alloca202996
+-Node: GNU C Variable-Size Arrays203741
+-Node: Character Handling204899
+-Node: Classification of Characters206365
+-Node: Case Conversion210209
+-Node: Classification of Wide Characters212099
+-Node: Using Wide Char Classes219833
+-Node: Wide Character Case Conversion222191
+-Node: String and Array Utilities224957
+-Node: Representation of Strings226904
+-Node: String/Array Conventions229845
+-Node: String Length231677
+-Node: Copying and Concatenation233667
+-Node: String/Array Comparison249921
+-Node: Collation Functions257337
+-Node: Search Functions264333
+-Node: Finding Tokens in a String269779
+-Node: Encode Binary Data276580
+-Node: Argz and Envz Vectors281238
+-Node: Argz Functions281838
+-Node: Envz Functions288393
+-Node: Character Set Handling291443
+-Node: Extended Char Intro292606
+-Node: Charset Function Overview304759
+-Node: Restartable multibyte conversion305773
+-Node: Selecting the Conversion307885
+-Node: Keeping the state310301
+-Node: Converting a Character313530
+-Node: Converting Strings329668
+-Node: Multibyte Conversion Example339721
+-Node: Non-reentrant Conversion342707
+-Node: Non-reentrant Character Conversion344342
+-Node: Non-reentrant String Conversion349044
+-Node: Shift State352039
+-Node: Generic Charset Conversion354702
+-Node: Generic Conversion Interface357830
+-Node: iconv Examples367685
+-Node: Other iconv Implementations372786
+-Node: glibc iconv Implementation378119
+-Node: Locales417363
+-Node: Effects of Locale418963
+-Node: Choosing Locale420898
+-Node: Locale Categories422276
+-Node: Setting the Locale424741
+-Node: Standard Locales429033
+-Node: Locale Information430326
+-Node: The Lame Way to Locale Data432086
+-Node: General Numeric434052
+-Node: Currency Symbol436983
+-Node: Sign of Money Amount441602
+-Node: The Elegant and Fast Way443915
+-Node: Formatting Numbers455142
+-Node: Message Translation464860
+-Node: Message catalogs a la X/Open466906
+-Node: The catgets Functions468204
+-Node: The message catalog files477313
+-Node: The gencat program484269
+-Node: Common Usage487408
+-Node: The Uniforum approach494531
+-Node: Message catalogs with gettext496025
+-Node: Translation with gettext496723
+-Node: Locating gettext catalog503629
+-Node: Using gettextized software510493
+-Node: Helper programs for gettext518829
+-Node: Searching and Sorting520591
+-Node: Comparison Functions521506
+-Node: Array Search Function522724
+-Node: Array Sort Function526068
+-Node: Search/Sort Example528040
+-Node: Hash Search Function531519
+-Node: Tree Search Function539117
+-Node: Pattern Matching545900
+-Node: Wildcard Matching546702
+-Node: Globbing549580
+-Node: Calling Glob550444
+-Node: Flags for Globbing555802
+-Node: More Flags for Globbing559332
+-Node: Regular Expressions565288
+-Node: POSIX Regexp Compilation566272
+-Node: Flags for POSIX Regexps570387
+-Node: Matching POSIX Regexps571294
+-Node: Regexp Subexpressions573455
+-Node: Subexpression Complications575509
+-Node: Regexp Cleanup577872
+-Node: Word Expansion580198
+-Node: Expansion Stages581553
+-Node: Calling Wordexp583046
+-Node: Flags for Wordexp587009
+-Node: Wordexp Example588962
+-Node: Tilde Expansion590758
+-Node: Variable Substitution591830
+-Node: I/O Overview595945
+-Node: I/O Concepts597458
+-Node: Streams and File Descriptors598603
+-Node: File Position601694
+-Node: File Names603828
+-Node: Directories604714
+-Node: File Name Resolution606451
+-Node: File Name Errors609380
+-Node: File Name Portability610920
+-Node: I/O on Streams612912
+-Node: Streams614935
+-Node: Standard Streams616276
+-Node: Opening Streams617942
+-Node: Closing Streams625469
+-Node: Simple Output628006
+-Node: Character Input630342
+-Node: Line Input633451
+-Node: Unreading638439
+-Node: Unreading Idea639248
+-Node: How Unread640074
+-Node: Block Input/Output642572
+-Node: Formatted Output644801
+-Node: Formatted Output Basics646568
+-Node: Output Conversion Syntax649061
+-Node: Table of Output Conversions654088
+-Node: Integer Conversions656887
+-Node: Floating-Point Conversions662228
+-Node: Other Output Conversions668023
+-Node: Formatted Output Functions671183
+-Node: Dynamic Output675325
+-Node: Variable Arguments Output676962
+-Node: Parsing a Template String682496
+-Node: Example of Parsing686323
+-Node: Customizing Printf688611
+-Node: Registering New Conversions690530
+-Node: Conversion Specifier Options692521
+-Node: Defining the Output Handler696274
+-Node: Printf Extension Example698741
+-Node: Predefined Printf Handlers701144
+-Node: Formatted Input704789
+-Node: Formatted Input Basics705868
+-Node: Input Conversion Syntax708548
+-Node: Table of Input Conversions711911
+-Node: Numeric Input Conversions714208
+-Node: String Input Conversions718452
+-Node: Dynamic String Input722545
+-Node: Other Input Conversions723735
+-Node: Formatted Input Functions725387
+-Node: Variable Arguments Input726953
+-Node: EOF and Errors728588
+-Node: Binary Streams730808
+-Node: File Positioning733332
+-Node: Portable Positioning740445
+-Node: Stream Buffering745986
+-Node: Buffering Concepts747571
+-Node: Flushing Buffers748934
+-Node: Controlling Buffering750430
+-Node: Other Kinds of Streams754865
+-Node: String Streams756154
+-Node: Obstack Streams760292
+-Node: Custom Streams762343
+-Node: Streams and Cookies762996
+-Node: Hook Functions766066
+-Node: Formatted Messages768452
+-Node: Printing Formatted Messages769117
+-Node: Adding Severity Classes775561
+-Node: Example777154
+-Node: Low-Level I/O780379
+-Node: Opening and Closing Files783453
+-Node: Truncating Files791434
+-Node: I/O Primitives795650
+-Node: File Position Primitive809767
+-Node: Descriptors and Streams817073
+-Node: Stream/Descriptor Precautions819491
+-Node: Linked Channels820697
+-Node: Independent Channels821925
+-Node: Cleaning Streams823828
+-Node: Scatter-Gather826031
+-Node: Memory-mapped I/O828620
+-Node: Waiting for I/O837175
+-Node: Synchronizing I/O844918
+-Node: Asynchronous I/O848390
+-Node: Asynchronous Reads/Writes856454
+-Node: Status of AIO Operations868913
+-Node: Synchronizing AIO Operations872478
+-Node: Cancel AIO Operations878869
+-Node: Configuration of AIO882330
+-Node: Control Operations884426
+-Node: Duplicating Descriptors887115
+-Node: Descriptor Flags891375
+-Node: File Status Flags894777
+-Node: Access Modes896231
+-Node: Open-time Flags898520
+-Node: Operating Modes903237
+-Node: Getting File Status Flags906003
+-Node: File Locks908610
+-Node: Interrupt Input917507
+-Node: IOCTLs919939
+-Node: File System Interface922015
+-Node: Working Directory923544
+-Node: Accessing Directories927267
+-Node: Directory Entries928692
+-Node: Opening a Directory931534
+-Node: Reading/Closing Directory933226
+-Node: Simple Directory Lister936279
+-Node: Random Access Directory937298
+-Node: Scanning Directory Content938800
+-Node: Simple Directory Lister Mark II943286
+-Node: Working on Directory Trees944407
+-Node: Hard Links956252
+-Node: Symbolic Links959046
+-Node: Deleting Files962812
+-Node: Renaming Files965742
+-Node: Creating Directories969369
+-Node: File Attributes971117
+-Node: Attribute Meanings972667
+-Node: Reading Attributes981888
+-Node: Testing File Type985972
+-Node: File Owner989189
+-Node: Permission Bits992882
+-Node: Access Permission998199
+-Node: Setting Permissions999349
+-Node: Testing File Access1004596
+-Node: File Times1008239
+-Node: File Size1012770
+-Node: Making Special Files1016909
+-Node: Temporary Files1018586
+-Node: Pipes and FIFOs1026473
+-Node: Creating a Pipe1028056
+-Node: Pipe to a Subprocess1031209
+-Node: FIFO Special Files1034049
+-Node: Pipe Atomicity1035622
+-Node: Sockets1036506
+-Node: Socket Concepts1038553
+-Node: Communication Styles1042803
+-Node: Socket Addresses1044655
+-Node: Address Formats1046694
+-Node: Setting Address1049662
+-Node: Reading Address1051385
+-Node: Interface Naming1053146
+-Node: Local Namespace1055554
+-Node: Local Namespace Concepts1056214
+-Node: Local Namespace Details1057821
+-Node: Local Socket Example1059768
+-Node: Internet Namespace1061193
+-Node: Internet Address Formats1063425
+-Node: Host Addresses1065580
+-Node: Abstract Host Addresses1066762
+-Node: Host Address Data Type1071287
+-Node: Host Address Functions1074411
+-Node: Host Names1078774
+-Node: Ports1087967
+-Node: Services Database1090005
+-Node: Byte Order1092829
+-Node: Protocols Database1095149
+-Node: Inet Example1098690
+-Node: Misc Namespaces1100700
+-Node: Open/Close Sockets1101450
+-Node: Creating a Socket1101948
+-Node: Closing a Socket1103624
+-Node: Socket Pairs1105154
+-Node: Connections1107166
+-Node: Connecting1108260
+-Node: Listening1111099
+-Node: Accepting Connections1113185
+-Node: Who is Connected1116324
+-Node: Transferring Data1117423
+-Node: Sending Data1118533
+-Node: Receiving Data1121061
+-Node: Socket Data Options1122805
+-Node: Byte Stream Example1123668
+-Node: Server Example1125725
+-Node: Out-of-Band Data1129742
+-Node: Datagrams1135677
+-Node: Sending Datagrams1136707
+-Node: Receiving Datagrams1138647
+-Node: Datagram Example1140733
+-Node: Example Receiver1142748
+-Node: Inetd1145316
+-Node: Inetd Servers1146124
+-Node: Configuring Inetd1147367
+-Node: Socket Options1150041
+-Node: Socket Option Functions1150749
+-Node: Socket-Level Options1152314
+-Node: Networks Database1155943
+-Node: Low-Level Terminal Interface1158828
+-Node: Is It a Terminal1160226
+-Node: I/O Queues1162129
+-Node: Canonical or Not1164087
+-Node: Terminal Modes1165934
+-Node: Mode Data Types1167210
+-Node: Mode Functions1169038
+-Node: Setting Modes1172970
+-Node: Input Modes1174958
+-Node: Output Modes1180225
+-Node: Control Modes1181838
+-Node: Local Modes1185928
+-Node: Line Speed1192242
+-Node: Special Characters1196419
+-Node: Editing Characters1198333
+-Node: Signal Characters1202674
+-Node: Start/Stop Characters1205543
+-Node: Other Special1207414
+-Node: Noncanonical Input1209228
+-Node: Line Control1214041
+-Node: Noncanon Example1218753
+-Node: Pseudo-Terminals1220973
+-Node: Allocation1221885
+-Node: Pseudo-Terminal Pairs1226676
+-Node: Mathematics1229195
+-Node: Mathematical Constants1230868
+-Node: Trig Functions1232876
+-Node: Inverse Trig Functions1236612
+-Node: Exponents and Logarithms1240416
+-Node: Hyperbolic Functions1248606
+-Node: Special Functions1252646
+-Node: Pseudo-Random Numbers1257155
+-Node: ISO Random1259386
+-Node: BSD Random1261318
+-Node: SVID Random1263499
+-Node: FP Function Optimizations1276673
+-Node: Arithmetic1278593
+-Node: Floating Point Numbers1279807
+-Node: Floating Point Classes1281524
+-Node: Floating Point Errors1285923
+-Node: FP Exceptions1286420
+-Node: Infinity and NaN1290781
+-Node: Status bit operations1293856
+-Node: Math Error Reporting1297118
+-Node: Rounding1299444
+-Node: Control Functions1303033
+-Node: Arithmetic Functions1306263
+-Node: Absolute Value1307131
+-Node: Normalization Functions1309123
+-Node: Rounding Functions1313197
+-Node: Remainder Functions1317442
+-Node: FP Bit Twiddling1319586
+-Node: FP Comparison Functions1322699
+-Node: Misc FP Arithmetic1325413
+-Node: Complex Numbers1328155
+-Node: Operations on Complex1329861
+-Node: Integer Division1332204
+-Node: Parsing of Numbers1335761
+-Node: Parsing of Integers1336448
+-Node: Parsing of Floats1343367
+-Node: System V Number Conversion1347034
+-Node: Date and Time1352350
+-Node: Processor Time1353591
+-Node: Basic CPU Time1354349
+-Node: Detailed CPU Time1356604
+-Node: Calendar Time1359069
+-Node: Simple Calendar Time1360787
+-Node: High-Resolution Calendar1362544
+-Node: Broken-down Time1368264
+-Node: Formatting Date and Time1374966
+-Node: Parsing Date and Time1388408
+-Node: Low-Level Time String Parsing1389243
+-Node: General Time String Parsing1402603
+-Node: TZ Variable1410035
+-Node: Time Zone Functions1416088
+-Node: Time Functions Example1418933
+-Node: Precision Time1420048
+-Node: Setting an Alarm1426515
+-Node: Sleeping1431743
+-Node: Resource Usage1435987
+-Node: Limits on Resources1439498
+-Node: Priority1446161
+-Node: Non-Local Exits1449422
+-Node: Non-Local Intro1450041
+-Node: Non-Local Details1453768
+-Node: Non-Local Exits and Signals1456844
+-Node: Signal Handling1458315
+-Node: Concepts of Signals1460350
+-Node: Kinds of Signals1460914
+-Node: Signal Generation1462311
+-Node: Delivery of Signal1464578
+-Node: Standard Signals1467435
+-Node: Program Error Signals1469028
+-Node: Termination Signals1476486
+-Node: Alarm Signals1480324
+-Node: Asynchronous I/O Signals1481564
+-Node: Job Control Signals1482755
+-Node: Operation Error Signals1487358
+-Node: Miscellaneous Signals1489297
+-Node: Signal Messages1490992
+-Node: Signal Actions1492878
+-Node: Basic Signal Handling1493823
+-Node: Advanced Signal Handling1499892
+-Node: Signal and Sigaction1502848
+-Node: Sigaction Function Example1504600
+-Node: Flags for Sigaction1506916
+-Node: Initial Signal Actions1509294
+-Node: Defining Handlers1510677
+-Node: Handler Returns1512862
+-Node: Termination in Handler1514912
+-Node: Longjmp in Handler1516335
+-Node: Signals in Handler1518430
+-Node: Merged Signals1520550
+-Node: Nonreentrancy1526260
+-Node: Atomic Data Access1531678
+-Node: Non-atomic Example1532714
+-Node: Atomic Types1534485
+-Node: Atomic Usage1535493
+-Node: Interrupted Primitives1536963
+-Node: Generating Signals1540263
+-Node: Signaling Yourself1540856
+-Node: Signaling Another Process1542834
+-Node: Permission for kill1546210
+-Node: Kill Example1548006
+-Node: Blocking Signals1550350
+-Node: Why Block1552122
+-Node: Signal Sets1553659
+-Node: Process Signal Mask1556685
+-Node: Testing for Delivery1559693
+-Node: Blocking for Handler1560943
+-Node: Checking for Pending Signals1563362
+-Node: Remembering a Signal1565374
+-Node: Waiting for a Signal1568923
+-Node: Using Pause1569468
+-Node: Pause Problems1571092
+-Node: Sigsuspend1572816
+-Node: Signal Stack1575526
+-Node: BSD Signal Handling1580863
+-Node: BSD Handler1582137
+-Node: Blocking in BSD1584571
+-Node: Process Startup1586025
+-Node: Program Arguments1587060
+-Node: Argument Syntax1589058
+-Node: Parsing Program Arguments1591735
+-Node: Getopt1592840
+-Node: Using Getopt1593478
+-Node: Example of Getopt1596859
+-Node: Getopt Long Options1599583
+-Node: Getopt Long Option Example1603685
+-Node: Argp1606556
+-Node: Argp Global Variables1609812
+-Node: Argp Parsers1611832
+-Node: Argp Option Vectors1614949
+-Node: Argp Option Flags1618186
+-Node: Argp Parser Functions1620204
+-Node: Argp Special Keys1622907
+-Node: Argp Helper Functions1627998
+-Node: Argp Parsing State1631059
+-Node: Argp Children1634580
+-Node: Argp Flags1636641
+-Node: Argp Help Filtering1638958
+-Node: Argp Help Filter Keys1640175
+-Node: Argp Help1641049
+-Node: Argp Help Flags1642238
+-Node: Argp Examples1644534
+-Node: Argp Example 11645004
+-Node: Argp Example 21645808
+-Node: Argp Example 31648753
+-Node: Argp Example 41655801
+-Node: Argp User Customization1663505
+-Node: Suboptions1665118
+-Node: Suboptions Example1667060
+-Node: Environment Variables1669163
+-Node: Environment Access1671036
+-Node: Standard Environment1675277
+-Node: Program Termination1679453
+-Node: Normal Termination1680672
+-Node: Exit Status1681898
+-Node: Cleanups on Exit1684919
+-Node: Aborting a Program1686736
+-Node: Termination Internals1687635
+-Node: Processes1689756
+-Node: Running a Command1691779
+-Node: Process Creation Concepts1693846
+-Node: Process Identification1695856
+-Node: Creating a Process1696780
+-Node: Executing a File1700403
+-Node: Process Completion1707438
+-Node: Process Completion Status1713704
+-Node: BSD Wait Functions1715348
+-Node: Process Creation Example1717216
+-Node: Job Control1719466
+-Node: Concepts of Job Control1720746
+-Node: Job Control is Optional1724103
+-Node: Controlling Terminal1725153
+-Node: Access to the Terminal1726060
+-Node: Orphaned Process Groups1727664
+-Node: Implementing a Shell1728656
+-Node: Data Structures1729539
+-Node: Initializing the Shell1732182
+-Node: Launching Jobs1735918
+-Node: Foreground and Background1743371
+-Node: Stopped and Terminated Jobs1746480
+-Node: Continuing Stopped Jobs1751662
+-Node: Missing Pieces1753289
+-Node: Functions for Job Control1754913
+-Node: Identifying the Terminal1755393
+-Node: Process Group Functions1756967
+-Node: Terminal Access Functions1761978
+-Node: Name Service Switch1765452
+-Node: NSS Basics1766783
+-Node: NSS Configuration File1768379
+-Node: Services in the NSS configuration1770077
+-Node: Actions in the NSS configuration1771358
+-Node: Notes on NSS Configuration File1774519
+-Node: NSS Module Internals1776396
+-Node: NSS Module Names1777092
+-Node: NSS Modules Interface1779467
+-Node: Extending NSS1784266
+-Node: Adding another Service to NSS1785197
+-Node: NSS Module Function Internals1787423
+-Node: Users and Groups1792330
+-Node: User and Group IDs1794942
+-Node: Process Persona1795850
+-Node: Why Change Persona1797535
+-Node: How Change Persona1799416
+-Node: Reading Persona1801303
+-Node: Setting User ID1803573
+-Node: Setting Groups1806436
+-Node: Enable/Disable Setuid1810538
+-Node: Setuid Program Example1812572
+-Node: Tips for Setuid1816026
+-Node: Who Logged In1818543
+-Node: User Accounting Database1820924
+-Node: Manipulating the Database1822108
+-Node: XPG Functions1834434
+-Node: Logging In and Out1838097
+-Node: User Database1840213
+-Node: User Data Structure1840875
+-Node: Lookup User1842132
+-Node: Scanning All Users1844695
+-Node: Writing a User Entry1847649
+-Node: Group Database1848548
+-Node: Group Data Structure1849124
+-Node: Lookup Group1849887
+-Node: Scanning All Groups1852387
+-Node: Database Example1855417
+-Node: Netgroup Database1857614
+-Node: Netgroup Data1858025
+-Node: Lookup Netgroup1859542
+-Node: Netgroup Membership1862954
+-Node: System Information1864284
+-Node: Host Identification1864948
+-Node: Hardware/Software Type ID1868167
+-Node: Filesystem handling1870894
+-Node: System Configuration1886625
+-Node: General Limits1888198
+-Node: System Options1891837
+-Node: Version Supported1895169
+-Node: Sysconf1897006
+-Node: Sysconf Definition1897642
+-Node: Constants for Sysconf1898314
+-Node: Examples of Sysconf1910834
+-Node: Minimums1911827
+-Node: Limits for Files1914538
+-Node: Options for Files1917540
+-Node: File Minimums1919829
+-Node: Pathconf1921608
+-Node: Utility Limits1924562
+-Node: Utility Minimums1926492
+-Node: String Parameters1928244
+-Node: Cryptographic Functions1932152
+-Node: Legal Problems1934274
+-Node: getpass1936419
+-Node: crypt1937323
+-Node: DES Encryption1942337
+-Node: POSIX Threads1948750
+-Node: Basic Thread Operations1950127
+-Node: Thread Attributes1954713
+-Node: Cancellation1960007
+-Node: Cleanup Handlers1964059
+-Node: Mutexes1969197
+-Node: Condition Variables1977752
+-Node: POSIX Semaphores1985128
+-Node: Thread-Specific Data1989010
+-Node: Threads and Signal Handling1993643
+-Node: Miscellaneous Thread Functions1997347
+-Node: Language Features2004706
+-Node: Consistency Checking2005630
+-Node: Variadic Functions2010268
+-Node: Why Variadic2011340
+-Node: How Variadic2013305
+-Node: Variadic Prototypes2014594
+-Node: Receiving Arguments2015752
+-Node: How Many Arguments2018466
+-Node: Calling Variadics2020137
+-Node: Argument Macros2022274
+-Node: Variadic Example2025044
+-Node: Old Varargs2026196
+-Node: Null Pointer Constant2027871
+-Node: Important Data Types2028956
+-Node: Data Type Measurements2031522
+-Node: Width of Type2032379
+-Node: Range of Type2033285
+-Node: Floating Type Macros2036553
+-Node: Floating Point Concepts2037813
+-Node: Floating Point Parameters2041548
+-Node: IEEE Floating Point2048496
+-Node: Structure Measurement2050249
+-Node: Library Summary2050944
+-Node: Installation2234131
+-Node: Configuring and compiling2236199
+-Node: Running make install2243896
+-Node: Tools for Compilation2247584
+-Node: Supported Configurations2251078
+-Node: Linux2253073
+-Node: Reporting Bugs2255216
+-Node: Maintenance2258061
+-Node: Source Layout2258444
+-Node: Porting2262377
+-Node: Hierarchy Conventions2270678
+-Node: Porting to Unix2275735
+-Node: Contributors2277750
+-Node: Copying2295328
+-Node: Concept Index2322225
+-Node: Type Index2379317
+-Node: Function Index2386726
+-Node: Variable Index2457367
+-Node: File Index2508837
+-
+-End Tag Table
+diff -Naur ../glibc-2.1.3/manual/libc.info-1 glibc-2.1.3/manual/libc.info-1
+--- ../glibc-2.1.3/manual/libc.info-1	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-1	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1258 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
+-
+-Main Menu
+-*********
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta of the GNU C Library.
+-
+-* Menu:
+-
+-* Introduction::                 Purpose of the GNU C Library.
+-* Error Reporting::              How library functions report errors.
+-* Memory Allocation::            Allocating memory dynamically and
+-                                   manipulating it via pointers.
+-* Character Handling::           Character testing and conversion functions.
+-* String and Array Utilities::   Utilities for copying and comparing strings
+-                                   and arrays.
+-* Character Set Handling::       Support for extended character sets.
+-* Locales::                      The country and language can affect the
+-                                   behavior of library functions.
+-* Message Translation::          How to make the program speak the user's
+-                                   language.
+-* Searching and Sorting::        General searching and sorting functions.
+-* Pattern Matching::             Matching shell "globs" and regular
+-                                   expressions.
+-* I/O Overview::                 Introduction to the I/O facilities.
+-* I/O on Streams::               High-level, portable I/O facilities.
+-* Low-Level I/O::                Low-level, less portable I/O.
+-* File System Interface::        Functions for manipulating files.
+-* Pipes and FIFOs::              A simple interprocess communication
+-                                   mechanism.
+-* Sockets::                      A more complicated IPC mechanism, with
+-                                   networking support.
+-* Low-Level Terminal Interface:: How to change the characteristics of a
+-                                   terminal device.
+-* Mathematics::                  Math functions, useful constants, random
+-                                   numbers.
+-* Arithmetic::                   Low level arithmetic functions.
+-* Date and Time::                Functions for getting the date and time and
+-                                   formatting them nicely.
+-* Non-Local Exits::              Jumping out of nested function calls.
+-* Signal Handling::              How to send, block, and handle signals.
+-* Process Startup::              Writing the beginning and end of your
+-                                   program.
+-* Processes::                    How to create processes and run other
+-                                   programs.
+-* Job Control::                  All about process groups and sessions.
+-* Name Service Switch::          Accessing system databases.
+-* Users and Groups::             How users are identified and classified.
+-* System Information::           Getting information about the hardware and
+-                                   operating system.
+-* System Configuration::         Parameters describing operating system
+-                                   limits.
+-
+-Add-ons
+-
+-* Cryptographic Functions::      DES encryption and password handling.
+-* POSIX Threads::                The standard threads library.
+-
+-Appendices
+-
+-* Language Features::            C language features provided by the library.
+-* Library Summary::              A summary showing the syntax, header file,
+-                                   and derivation of each library feature.
+-* Installation::                 How to install the GNU C library.
+-* Maintenance::                  How to enhance and port the GNU C Library.
+-* Contributors::                 Who wrote what parts of the GNU C library.
+-* Copying::                      The GNU Library General Public License says
+-                                  how you can copy and share the GNU C Library.
+-
+-Indices
+-
+-* Concept Index::                Index of concepts and names.
+-* Type Index::                   Index of types and type qualifiers.
+-* Function Index::               Index of functions and function-like macros.
+-* Variable Index::               Index of variables and variable-like macros.
+-* File Index::                   Index of programs and files.
+-
+- -- The Detailed Node Listing --
+-
+-Introduction
+-
+-* Getting Started::             What this manual is for and how to use it.
+-* Standards and Portability::   Standards and sources upon which the GNU
+-                                 C library is based.
+-* Using the Library::           Some practical uses for the library.
+-* Roadmap to the Manual::       Overview of the remaining chapters in
+-                                 this manual.
+-
+-Standards and Portability
+-
+-* ISO C::                       The international standard for the C
+-                                 programming language.
+-* POSIX::                       The ISO/IEC 9945 (aka IEEE 1003) standards
+-                                 for operating systems.
+-* Berkeley Unix::               BSD and SunOS.
+-* SVID::                        The System V Interface Description.
+-* XPG::                         The X/Open Portability Guide.
+-
+-Using the Library
+-
+-* Header Files::                How to include the header files in your
+-                                 programs.
+-* Macro Definitions::           Some functions in the library may really
+-                                 be implemented as macros.
+-* Reserved Names::              The C standard reserves some names for
+-                                 the library, and some for users.
+-* Feature Test Macros::         How to control what names are defined.
+-
+-Error Reporting
+-
+-* Checking for Errors::         How errors are reported by library functions.
+-* Error Codes::                 Error code macros; all of these expand
+-                                 into integer constant values.
+-* Error Messages::              Mapping error codes onto error messages.
+-
+-Memory Allocation
+-
+-* Memory Concepts::             An introduction to concepts and terminology.
+-* Dynamic Allocation and C::    How to get different kinds of allocation in C.
+-* Unconstrained Allocation::    The `malloc' facility allows fully general
+-		 		 dynamic allocation.
+-* Allocation Debugging::        Finding memory leaks and not freed memory.
+-* Obstacks::                    Obstacks are less general than malloc
+-				 but more efficient and convenient.
+-* Variable Size Automatic::     Allocation of variable-sized blocks
+-				 of automatic storage that are freed when the
+-				 calling function returns.
+-
+-Unconstrained Allocation
+-
+-* Basic Allocation::            Simple use of `malloc'.
+-* Malloc Examples::             Examples of `malloc'.  `xmalloc'.
+-* Freeing after Malloc::        Use `free' to free a block you
+-				 got with `malloc'.
+-* Changing Block Size::         Use `realloc' to make a block
+-				 bigger or smaller.
+-* Allocating Cleared Space::    Use `calloc' to allocate a
+-				 block and clear it.
+-* Efficiency and Malloc::       Efficiency considerations in use of
+-				 these functions.
+-* Aligned Memory Blocks::       Allocating specially aligned memory:
+-				 `memalign' and `valloc'.
+-* Malloc Tunable Parameters::   Use `mallopt' to adjust allocation
+-                                 parameters.
+-* Heap Consistency Checking::   Automatic checking for errors.
+-* Hooks for Malloc::            You can use these hooks for debugging
+-				 programs that use `malloc'.
+-* Statistics of Malloc::        Getting information about how much
+-				 memory your program is using.
+-* Summary of Malloc::           Summary of `malloc' and related functions.
+-
+-Allocation Debugging
+-
+-* Tracing malloc::               How to install the tracing functionality.
+-* Using the Memory Debugger::    Example programs excerpts.
+-* Tips for the Memory Debugger:: Some more or less clever ideas.
+-* Interpreting the traces::      What do all these lines mean?
+-
+-Obstacks
+-
+-* Creating Obstacks::		How to declare an obstack in your program.
+-* Preparing for Obstacks::	Preparations needed before you can
+-				 use obstacks.
+-* Allocation in an Obstack::    Allocating objects in an obstack.
+-* Freeing Obstack Objects::     Freeing objects in an obstack.
+-* Obstack Functions::		The obstack functions are both
+-				 functions and macros.
+-* Growing Objects::             Making an object bigger by stages.
+-* Extra Fast Growing::		Extra-high-efficiency (though more
+-				 complicated) growing objects.
+-* Status of an Obstack::        Inquiries about the status of an obstack.
+-* Obstacks Data Alignment::     Controlling alignment of objects in obstacks.
+-* Obstack Chunks::              How obstacks obtain and release chunks;
+-				 efficiency considerations.
+-* Summary of Obstacks::
+-
+-Variable Size Automatic
+-
+-* Alloca Example::              Example of using `alloca'.
+-* Advantages of Alloca::        Reasons to use `alloca'.
+-* Disadvantages of Alloca::     Reasons to avoid `alloca'.
+-* GNU C Variable-Size Arrays::  Only in GNU C, here is an alternative
+-				 method of allocating dynamically and
+-				 freeing automatically.
+-
+-Character Handling
+-
+-* Classification of Characters::       Testing whether characters are
+-			                letters, digits, punctuation, etc.
+-
+-* Case Conversion::                    Case mapping, and the like.
+-* Classification of Wide Characters::  Character class determination for
+-                                        wide characters.
+-* Using Wide Char Classes::            Notes on using the wide character
+-                                        classes.
+-* Wide Character Case Conversion::     Mapping of wide characters.
+-
+-String and Array Utilities
+-
+-* Representation of Strings::   Introduction to basic concepts.
+-* String/Array Conventions::    Whether to use a string function or an
+-				 arbitrary array function.
+-* String Length::               Determining the length of a string.
+-* Copying and Concatenation::   Functions to copy the contents of strings
+-				 and arrays.
+-* String/Array Comparison::     Functions for byte-wise and character-wise
+-				 comparison.
+-* Collation Functions::         Functions for collating strings.
+-* Search Functions::            Searching for a specific element or substring.
+-* Finding Tokens in a String::  Splitting a string into tokens by looking
+-				 for delimiters.
+-* Encode Binary Data::          Encoding and Decoding of Binary Data.
+-* Argz and Envz Vectors::       Null-separated string vectors.
+-
+-Argz and Envz Vectors
+-
+-* Argz Functions::              Operations on argz vectors.
+-* Envz Functions::              Additional operations on environment vectors.
+-
+-Character Set Handling
+-
+-* Extended Char Intro::              Introduction to Extended Characters.
+-* Charset Function Overview::        Overview about Character Handling
+-                                      Functions.
+-* Restartable multibyte conversion:: Restartable multibyte conversion
+-                                      Functions.
+-* Non-reentrant Conversion::         Non-reentrant Conversion Function.
+-* Generic Charset Conversion::       Generic Charset Conversion.
+-
+-Restartable multibyte conversion
+-
+-* Selecting the Conversion::     Selecting the conversion and its properties.
+-* Keeping the state::            Representing the state of the conversion.
+-* Converting a Character::       Converting Single Characters.
+-* Converting Strings::           Converting Multibyte and Wide Character
+-                                  Strings.
+-* Multibyte Conversion Example:: A Complete Multibyte Conversion Example.
+-
+-Non-reentrant Conversion
+-
+-* Non-reentrant Character Conversion::  Non-reentrant Conversion of Single
+-                                         Characters.
+-* Non-reentrant String Conversion::     Non-reentrant Conversion of Strings.
+-* Shift State::                         States in Non-reentrant Functions.
+-
+-Generic Charset Conversion
+-
+-* Generic Conversion Interface::    Generic Character Set Conversion Interface.
+-* iconv Examples::                  A complete `iconv' example.
+-* Other iconv Implementations::     Some Details about other `iconv'
+-                                     Implementations.
+-* glibc iconv Implementation::      The `iconv' Implementation in the GNU C
+-                                     library.
+-
+-Locales
+-
+-* Effects of Locale::           Actions affected by the choice of
+-                                 locale.
+-* Choosing Locale::             How the user specifies a locale.
+-* Locale Categories::           Different purposes for which you can
+-                                 select a locale.
+-* Setting the Locale::          How a program specifies the locale
+-                                 with library functions.
+-* Standard Locales::            Locale names available on all systems.
+-* Locale Information::          How to access the information for the locale.
+-* Formatting Numbers::          A dedicated function to format numbers.
+-
+-Locale Information
+-
+-* The Lame Way to Locale Data::   ISO C's `localeconv'.
+-* The Elegant and Fast Way::      X/Open's `nl_langinfo'.
+-
+-The Lame Way to Locale Data
+-
+-* General Numeric::             Parameters for formatting numbers and
+-                                 currency amounts.
+-* Currency Symbol::             How to print the symbol that identifies an
+-                                 amount of money (e.g. `$').
+-* Sign of Money Amount::        How to print the (positive or negative) sign
+-                                 for a monetary amount, if one exists.
+-
+-Message Translation
+-
+-* Message catalogs a la X/Open::  The `catgets' family of functions.
+-* The Uniforum approach::         The `gettext' family of functions.
+-
+-Message catalogs a la X/Open
+-
+-* The catgets Functions::      The `catgets' function family.
+-* The message catalog files::  Format of the message catalog files.
+-* The gencat program::         How to generate message catalogs files which
+-                                can be used by the functions.
+-* Common Usage::               How to use the `catgets' interface.
+-
+-The Uniforum approach
+-
+-* Message catalogs with gettext::  The `gettext' family of functions.
+-* Helper programs for gettext::    Programs to handle message catalogs
+-                                    for `gettext'.
+-
+-Message catalogs with gettext
+-
+-* Translation with gettext::    What has to be done to translate a message.
+-* Locating gettext catalog::    How to determine which catalog to be used.
+-* Using gettextized software::  The possibilities of the user to influence
+-                                 the way `gettext' works.
+-
+-Searching and Sorting
+-
+-* Comparison Functions::        Defining how to compare two objects.
+-				 Since the sort and search facilities
+-                                 are general, you have to specify the
+-                                 ordering.
+-* Array Search Function::       The `bsearch' function.
+-* Array Sort Function::         The `qsort' function.
+-* Search/Sort Example::         An example program.
+-* Hash Search Function::        The `hsearch' function.
+-* Tree Search Function::        The `tsearch' function.
+-
+-Pattern Matching
+-
+-* Wildcard Matching::    Matching a wildcard pattern against a single string.
+-* Globbing::             Finding the files that match a wildcard pattern.
+-* Regular Expressions::  Matching regular expressions against strings.
+-* Word Expansion::       Expanding shell variables, nested commands,
+-			    arithmetic, and wildcards.
+-			    This is what the shell does with shell commands.
+-
+-Globbing
+-
+-* Calling Glob::             Basic use of `glob'.
+-* Flags for Globbing::       Flags that enable various options in `glob'.
+-* More Flags for Globbing::  GNU specific extensions to `glob'.
+-
+-Regular Expressions
+-
+-* POSIX Regexp Compilation::    Using `regcomp' to prepare to match.
+-* Flags for POSIX Regexps::     Syntax variations for `regcomp'.
+-* Matching POSIX Regexps::      Using `regexec' to match the compiled
+-				   pattern that you get from `regcomp'.
+-* Regexp Subexpressions::       Finding which parts of the string were matched.
+-* Subexpression Complications:: Find points of which parts were matched.
+-* Regexp Cleanup::		Freeing storage; reporting errors.
+-
+-Word Expansion
+-
+-* Expansion Stages::            What word expansion does to a string.
+-* Calling Wordexp::             How to call `wordexp'.
+-* Flags for Wordexp::           Options you can enable in `wordexp'.
+-* Wordexp Example::             A sample program that does word expansion.
+-* Tilde Expansion::             Details of how tilde expansion works.
+-* Variable Substitution::       Different types of variable substitution.
+-
+-I/O Overview
+-
+-* I/O Concepts::       Some basic information and terminology.
+-* File Names::         How to refer to a file.
+-
+-I/O Concepts
+-
+-* Streams and File Descriptors::    The GNU Library provides two ways
+-			             to access the contents of files.
+-* File Position::                   The number of bytes from the
+-                                     beginning of the file.
+-
+-File Names
+-
+-* Directories::                 Directories contain entries for files.
+-* File Name Resolution::        A file name specifies how to look up a file.
+-* File Name Errors::            Error conditions relating to file names.
+-* File Name Portability::       File name portability and syntax issues.
+-
+-I/O on Streams
+-
+-* Streams::                     About the data type representing a stream.
+-* Standard Streams::            Streams to the standard input and output
+-                                 devices are created for you.
+-* Opening Streams::             How to create a stream to talk to a file.
+-* Closing Streams::             Close a stream when you are finished with it.
+-* Simple Output::               Unformatted output by characters and lines.
+-* Character Input::             Unformatted input by characters and words.
+-* Line Input::                  Reading a line or a record from a stream.
+-* Unreading::                   Peeking ahead/pushing back input just read.
+-* Block Input/Output::          Input and output operations on blocks of data.
+-* Formatted Output::            `printf' and related functions.
+-* Customizing Printf::          You can define new conversion specifiers for
+-                                 `printf' and friends.
+-* Formatted Input::             `scanf' and related functions.
+-* EOF and Errors::              How you can tell if an I/O error happens.
+-* Binary Streams::              Some systems distinguish between text files
+-                                 and binary files.
+-* File Positioning::            About random-access streams.
+-* Portable Positioning::        Random access on peculiar ISO C systems.
+-* Stream Buffering::            How to control buffering of streams.
+-* Other Kinds of Streams::      Streams that do not necessarily correspond
+-                                 to an open file.
+-* Formatted Messages::          Print strictly formatted messages.
+-
+-Unreading
+-
+-* Unreading Idea::              An explanation of unreading with pictures.
+-* How Unread::                  How to call `ungetc' to do unreading.
+-
+-Formatted Output
+-
+-* Formatted Output Basics::     Some examples to get you started.
+-* Output Conversion Syntax::    General syntax of conversion
+-                                 specifications.
+-* Table of Output Conversions:: Summary of output conversions and
+-                                 what they do.
+-* Integer Conversions::         Details about formatting of integers.
+-* Floating-Point Conversions::  Details about formatting of
+-                                 floating-point numbers.
+-* Other Output Conversions::    Details about formatting of strings,
+-                                 characters, pointers, and the like.
+-* Formatted Output Functions::  Descriptions of the actual functions.
+-* Dynamic Output::		Functions that allocate memory for the output.
+-* Variable Arguments Output::   `vprintf' and friends.
+-* Parsing a Template String::   What kinds of args does a given template
+-                                 call for?
+-* Example of Parsing::          Sample program using `parse_printf_format'.
+-
+-Customizing Printf
+-
+-* Registering New Conversions::         Using `register_printf_function'
+-                                         to register a new output conversion.
+-* Conversion Specifier Options::        The handler must be able to get
+-                                         the options specified in the
+-                                         template when it is called.
+-* Defining the Output Handler::         Defining the handler and arginfo
+-                                         functions that are passed as arguments
+-                                         to `register_printf_function'.
+-* Printf Extension Example::            How to define a `printf'
+-                                         handler function.
+-* Predefined Printf Handlers::          Predefined `printf' handlers.
+-
+-Formatted Input
+-
+-* Formatted Input Basics::      Some basics to get you started.
+-* Input Conversion Syntax::     Syntax of conversion specifications.
+-* Table of Input Conversions::  Summary of input conversions and what they do.
+-* Numeric Input Conversions::   Details of conversions for reading numbers.
+-* String Input Conversions::    Details of conversions for reading strings.
+-* Dynamic String Input::	String conversions that `malloc' the buffer.
+-* Other Input Conversions::     Details of miscellaneous other conversions.
+-* Formatted Input Functions::   Descriptions of the actual functions.
+-* Variable Arguments Input::    `vscanf' and friends.
+-
+-Stream Buffering
+-
+-* Buffering Concepts::          Terminology is defined here.
+-* Flushing Buffers::            How to ensure that output buffers are flushed.
+-* Controlling Buffering::       How to specify what kind of buffering to use.
+-
+-Other Kinds of Streams
+-
+-* String Streams::              Streams that get data from or put data in
+-                                 a string or memory buffer.
+-* Obstack Streams::		Streams that store data in an obstack.
+-* Custom Streams::              Defining your own streams with an arbitrary
+-                                 input data source and/or output data sink.
+-
+-Custom Streams
+-
+-* Streams and Cookies::         The "cookie" records where to fetch or
+-                                 store data that is read or written.
+-* Hook Functions::              How you should define the four "hook
+-                                 functions" that a custom stream needs.
+-
+-Formatted Messages
+-
+-* Printing Formatted Messages::   The `fmtmsg' function.
+-* Adding Severity Classes::       Add more severity classes.
+-* Example::                       How to use `fmtmsg' and `addseverity'.
+-
+-Low-Level I/O
+-
+-* Opening and Closing Files::           How to open and close file
+-                                         descriptors.
+-* Truncating Files::                    Change the size of a file.
+-* I/O Primitives::                      Reading and writing data.
+-* File Position Primitive::             Setting a descriptor's file
+-                                         position.
+-* Descriptors and Streams::             Converting descriptor to stream
+-                                         or vice-versa.
+-* Stream/Descriptor Precautions::       Precautions needed if you use both
+-                                         descriptors and streams.
+-* Scatter-Gather::                      Fast I/O to discontinous buffers.
+-* Memory-mapped I/O::                   Using files like memory.
+-* Waiting for I/O::                     How to check for input or output
+-					 on multiple file descriptors.
+-* Synchronizing I/O::                   Making sure all I/O actions completed.
+-* Asynchronous I/O::                    Perform I/O in parallel.
+-* Control Operations::                  Various other operations on file
+-					 descriptors.
+-* Duplicating Descriptors::             Fcntl commands for duplicating
+-                                         file descriptors.
+-* Descriptor Flags::                    Fcntl commands for manipulating
+-                                         flags associated with file
+-                                         descriptors.
+-* File Status Flags::                   Fcntl commands for manipulating
+-                                         flags associated with open files.
+-* File Locks::                          Fcntl commands for implementing
+-                                         file locking.
+-* Interrupt Input::                     Getting an asynchronous signal when
+-                                         input arrives.
+-* IOCTLs::                              Generic I/O Control operations.
+-
+-Stream/Descriptor Precautions
+-
+-* Linked Channels::	   Dealing with channels sharing a file position.
+-* Independent Channels::   Dealing with separately opened, unlinked channels.
+-* Cleaning Streams::	   Cleaning a stream makes it safe to use
+-                            another channel.
+-
+-Asynchronous I/O
+-
+-* Asynchronous Reads/Writes::    Asynchronous Read and Write Operations.
+-* Status of AIO Operations::     Getting the Status of AIO Operations.
+-* Synchronizing AIO Operations:: Getting into a consistent state.
+-* Cancel AIO Operations::        Cancelation of AIO Operations.
+-* Configuration of AIO::         How to optimize the AIO implementation.
+-
+-File Status Flags
+-
+-* Access Modes::                Whether the descriptor can read or write.
+-* Open-time Flags::             Details of `open'.
+-* Operating Modes::             Special modes to control I/O operations.
+-* Getting File Status Flags::   Fetching and changing these flags.
+-
+-File System Interface
+-
+-* Working Directory::           This is used to resolve relative
+-				 file names.
+-* Accessing Directories::       Finding out what files a directory
+-				 contains.
+-* Working on Directory Trees::  Apply actions to all files or a selectable
+-                                 subset of a directory hierarchy.
+-* Hard Links::                  Adding alternate names to a file.
+-* Symbolic Links::              A file that "points to" a file name.
+-* Deleting Files::              How to delete a file, and what that means.
+-* Renaming Files::              Changing a file's name.
+-* Creating Directories::        A system call just for creating a directory.
+-* File Attributes::             Attributes of individual files.
+-* Making Special Files::        How to create special files.
+-* Temporary Files::             Naming and creating temporary files.
+-
+-Accessing Directories
+-
+-* Directory Entries::           Format of one directory entry.
+-* Opening a Directory::         How to open a directory stream.
+-* Reading/Closing Directory::   How to read directory entries from the stream.
+-* Simple Directory Lister::     A very simple directory listing program.
+-* Random Access Directory::     Rereading part of the directory
+-                                 already read with the same stream.
+-* Scanning Directory Content::  Get entries for user selected subset of
+-                                 contents in given directory.
+-* Simple Directory Lister Mark II::  Revised version of the program.
+-
+-File Attributes
+-
+-* Attribute Meanings::          The names of the file attributes,
+-                                 and what their values mean.
+-* Reading Attributes::          How to read the attributes of a file.
+-* Testing File Type::           Distinguishing ordinary files,
+-                                 directories, links...
+-* File Owner::                  How ownership for new files is determined,
+-			         and how to change it.
+-* Permission Bits::             How information about a file's access
+-                                 mode is stored.
+-* Access Permission::           How the system decides who can access a file.
+-* Setting Permissions::         How permissions for new files are assigned,
+-			         and how to change them.
+-* Testing File Access::         How to find out if your process can
+-                                 access a file.
+-* File Times::                  About the time attributes of a file.
+-* File Size::			Manually changing the size of a file.
+-
+-Pipes and FIFOs
+-
+-* Creating a Pipe::             Making a pipe with the `pipe' function.
+-* Pipe to a Subprocess::        Using a pipe to communicate with a
+-				 child process.
+-* FIFO Special Files::          Making a FIFO special file.
+-* Pipe Atomicity::		When pipe (or FIFO) I/O is atomic.
+-
+-Sockets
+-
+-* Socket Concepts::	Basic concepts you need to know about.
+-* Communication Styles::Stream communication, datagrams, and other styles.
+-* Socket Addresses::	How socket names ("addresses") work.
+-* Interface Naming::	Identifying specific network interfaces.
+-* Local Namespace::	Details about the local namespace.
+-* Internet Namespace::	Details about the Internet namespace.
+-* Misc Namespaces::	Other namespaces not documented fully here.
+-* Open/Close Sockets::  Creating sockets and destroying them.
+-* Connections::		Operations on sockets with connection state.
+-* Datagrams::		Operations on datagram sockets.
+-* Inetd::		Inetd is a daemon that starts servers on request.
+-			   The most convenient way to write a server
+-			   is to make it work with Inetd.
+-* Socket Options::	Miscellaneous low-level socket options.
+-* Networks Database::   Accessing the database of network names.
+-
+-Socket Addresses
+-
+-* Address Formats::		About `struct sockaddr'.
+-* Setting Address::		Binding an address to a socket.
+-* Reading Address::		Reading the address of a socket.
+-
+-Local Namespace
+-
+-* Concepts: Local Namespace Concepts. What you need to understand.
+-* Details: Local Namespace Details.   Address format, symbolic names, etc.
+-* Example: Local Socket Example.      Example of creating a socket.
+-
+-Internet Namespace
+-
+-* Internet Address Formats::    How socket addresses are specified in the
+-                                 Internet namespace.
+-* Host Addresses::	        All about host addresses of internet host.
+-* Protocols Database::		Referring to protocols by name.
+-* Ports::			Internet port numbers.
+-* Services Database::           Ports may have symbolic names.
+-* Byte Order::		        Different hosts may use different byte
+-                                 ordering conventions; you need to
+-                                 canonicalize host address and port number.
+-* Inet Example::	        Putting it all together.
+-
+-Host Addresses
+-
+-* Abstract Host Addresses::	What a host number consists of.
+-* Data type: Host Address Data Type.	Data type for a host number.
+-* Functions: Host Address Functions.	Functions to operate on them.
+-* Names: Host Names.		Translating host names to host numbers.
+-
+-Open/Close Sockets
+-
+-* Creating a Socket::           How to open a socket.
+-* Closing a Socket::            How to close a socket.
+-* Socket Pairs::                These are created like pipes.
+-
+-Connections
+-
+-* Connecting::    	     What the client program must do.
+-* Listening::		     How a server program waits for requests.
+-* Accepting Connections::    What the server does when it gets a request.
+-* Who is Connected::	     Getting the address of the
+-				other side of a connection.
+-* Transferring Data::        How to send and receive data.
+-* Byte Stream Example::	     An example program: a client for communicating
+-			      over a byte stream socket in the Internet namespace.
+-* Server Example::	     A corresponding server program.
+-* Out-of-Band Data::         This is an advanced feature.
+-
+-Transferring Data
+-
+-* Sending Data::		Sending data with `send'.
+-* Receiving Data::		Reading data with `recv'.
+-* Socket Data Options::		Using `send' and `recv'.
+-
+-Datagrams
+-
+-* Sending Datagrams::    Sending packets on a datagram socket.
+-* Receiving Datagrams::  Receiving packets on a datagram socket.
+-* Datagram Example::     An example program: packets sent over a
+-                           datagram socket in the local namespace.
+-* Example Receiver::	 Another program, that receives those packets.
+-
+-Inetd
+-
+-* Inetd Servers::
+-* Configuring Inetd::
+-
+-Socket Options
+-
+-* Socket Option Functions::     The basic functions for setting and getting
+-                                 socket options.
+-* Socket-Level Options::        Details of the options at the socket level.
+-
+-Low-Level Terminal Interface
+-
+-* Is It a Terminal::            How to determine if a file is a terminal
+-			         device, and what its name is.
+-* I/O Queues::                  About flow control and typeahead.
+-* Canonical or Not::            Two basic styles of input processing.
+-* Terminal Modes::              How to examine and modify flags controlling
+-			         details of terminal I/O: echoing,
+-                                 signals, editing.
+-* Line Control::                Sending break sequences, clearing
+-                                 terminal buffers ...
+-* Noncanon Example::            How to read single characters without echo.
+-* Pseudo-Terminals::            How to open a pseudo-terminal.
+-
+-Terminal Modes
+-
+-* Mode Data Types::             The data type `struct termios' and
+-                                 related types.
+-* Mode Functions::              Functions to read and set the terminal
+-                                 attributes.
+-* Setting Modes::               The right way to set terminal attributes
+-                                 reliably.
+-* Input Modes::                 Flags controlling low-level input handling.
+-* Output Modes::                Flags controlling low-level output handling.
+-* Control Modes::               Flags controlling serial port behavior.
+-* Local Modes::                 Flags controlling high-level input handling.
+-* Line Speed::                  How to read and set the terminal line speed.
+-* Special Characters::          Characters that have special effects,
+-			         and how to change them.
+-* Noncanonical Input::          Controlling how long to wait for input.
+-
+-Special Characters
+-
+-* Editing Characters::          Special characters that terminate lines and
+-                                  delete text, and other editing functions.
+-* Signal Characters::           Special characters that send or raise signals
+-                                  to or for certain classes of processes.
+-* Start/Stop Characters::       Special characters that suspend or resume
+-                                  suspended output.
+-* Other Special::		Other special characters for BSD systems:
+-				  they can discard output, and print status.
+-
+-Pseudo-Terminals
+-
+-* Allocation::             Allocating a pseudo terminal.
+-* Pseudo-Terminal Pairs::  How to open both sides of a
+-                            pseudo-terminal in a single operation.
+-
+-Mathematics
+-
+-* Mathematical Constants::      Precise numeric values for often-used
+-                                 constants.
+-* Trig Functions::              Sine, cosine, tangent, and friends.
+-* Inverse Trig Functions::      Arcsine, arccosine, etc.
+-* Exponents and Logarithms::    Also pow and sqrt.
+-* Hyperbolic Functions::        sinh, cosh, tanh, etc.
+-* Special Functions::           Bessel, gamma, erf.
+-* Pseudo-Random Numbers::       Functions for generating pseudo-random
+-				 numbers.
+-* FP Function Optimizations::   Fast code or small code.
+-
+-Pseudo-Random Numbers
+-
+-* ISO Random::                  `rand' and friends.
+-* BSD Random::                  `random' and friends.
+-* SVID Random::                 `drand48' and friends.
+-
+-Arithmetic
+-
+-* Floating Point Numbers::      Basic concepts.  IEEE 754.
+-* Floating Point Classes::      The five kinds of floating-point number.
+-* Floating Point Errors::       When something goes wrong in a calculation.
+-* Rounding::                    Controlling how results are rounded.
+-* Control Functions::           Saving and restoring the FPU's state.
+-* Arithmetic Functions::        Fundamental operations provided by the library.
+-* Complex Numbers::             The types.  Writing complex constants.
+-* Operations on Complex::       Projection, conjugation, decomposition.
+-* Integer Division::            Integer division with guaranteed rounding.
+-* Parsing of Numbers::          Converting strings to numbers.
+-* System V Number Conversion::  An archaic way to convert numbers to strings.
+-
+-Floating Point Errors
+-
+-* FP Exceptions::               IEEE 754 math exceptions and how to detect them.
+-* Infinity and NaN::            Special values returned by calculations.
+-* Status bit operations::       Checking for exceptions after the fact.
+-* Math Error Reporting::        How the math functions report errors.
+-
+-Arithmetic Functions
+-
+-* Absolute Value::              Absolute values of integers and floats.
+-* Normalization Functions::     Extracting exponents and putting them back.
+-* Rounding Functions::          Rounding floats to integers.
+-* Remainder Functions::         Remainders on division, precisely defined.
+-* FP Bit Twiddling::            Sign bit adjustment.  Adding epsilon.
+-* FP Comparison Functions::     Comparisons without risk of exceptions.
+-* Misc FP Arithmetic::          Max, min, positive difference, multiply-add.
+-
+-Parsing of Numbers
+-
+-* Parsing of Integers::         Functions for conversion of integer values.
+-* Parsing of Floats::           Functions for conversion of floating-point
+-				 values.
+-
+-Date and Time
+-
+-* Processor Time::              Measures processor time used by a program.
+-* Calendar Time::               Manipulation of "real" dates and times.
+-* Precision Time::              Manipulation and monitoring of high accuracy
+-                                  time.
+-* Setting an Alarm::            Sending a signal after a specified time.
+-* Sleeping::                    Waiting for a period of time.
+-* Resource Usage::		Measuring various resources used.
+-* Limits on Resources::		Specifying limits on resource usage.
+-* Priority::			Reading or setting process run priority.
+-
+-Processor Time
+-
+-* Basic CPU Time::              The `clock' function.
+-* Detailed CPU Time::           The `times' function.
+-
+-Calendar Time
+-
+-* Simple Calendar Time::        Facilities for manipulating calendar time.
+-* High-Resolution Calendar::    A time representation with greater precision.
+-* Broken-down Time::            Facilities for manipulating local time.
+-* Formatting Date and Time::    Converting times to strings.
+-* Parsing Date and Time::       Convert textual time and date information back
+-                                 into broken-down time values.
+-* TZ Variable::                 How users specify the time zone.
+-* Time Zone Functions::         Functions to examine or specify the time zone.
+-* Time Functions Example::      An example program showing use of some of
+-				 the time functions.
+-
+-Parsing Date and Time
+-
+-* Low-Level Time String Parsing::  Interpret string according to given format.
+-* General Time String Parsing::    User-friendly function to parse data and
+-                                    time strings.
+-
+-Non-Local Exits
+-
+-* Intro: Non-Local Intro.        When and how to use these facilities.
+-* Details: Non-Local Details.   Functions for nonlocal exits.
+-* Non-Local Exits and Signals::  Portability issues.
+-
+-Signal Handling
+-
+-* Concepts of Signals::         Introduction to the signal facilities.
+-* Standard Signals::            Particular kinds of signals with
+-                                 standard names and meanings.
+-* Signal Actions::              Specifying what happens when a
+-                                 particular signal is delivered.
+-* Defining Handlers::           How to write a signal handler function.
+-* Interrupted Primitives::	Signal handlers affect use of `open',
+-				 `read', `write' and other functions.
+-* Generating Signals::          How to send a signal to a process.
+-* Blocking Signals::            Making the system hold signals temporarily.
+-* Waiting for a Signal::        Suspending your program until a signal
+-                                 arrives.
+-* Signal Stack::                Using a Separate Signal Stack.
+-* BSD Signal Handling::         Additional functions for backward
+-			         compatibility with BSD.
+-
+-Concepts of Signals
+-
+-* Kinds of Signals::            Some examples of what can cause a signal.
+-* Signal Generation::           Concepts of why and how signals occur.
+-* Delivery of Signal::          Concepts of what a signal does to the
+-                                 process.
+-
+-Standard Signals
+-
+-* Program Error Signals::       Used to report serious program errors.
+-* Termination Signals::         Used to interrupt and/or terminate the
+-                                 program.
+-* Alarm Signals::               Used to indicate expiration of timers.
+-* Asynchronous I/O Signals::    Used to indicate input is available.
+-* Job Control Signals::         Signals used to support job control.
+-* Operation Error Signals::     Used to report operational system errors.
+-* Miscellaneous Signals::       Miscellaneous Signals.
+-* Signal Messages::             Printing a message describing a signal.
+-
+-Signal Actions
+-
+-* Basic Signal Handling::       The simple `signal' function.
+-* Advanced Signal Handling::    The more powerful `sigaction' function.
+-* Signal and Sigaction::        How those two functions interact.
+-* Sigaction Function Example::  An example of using the sigaction function.
+-* Flags for Sigaction::         Specifying options for signal handling.
+-* Initial Signal Actions::      How programs inherit signal actions.
+-
+-Defining Handlers
+-
+-* Handler Returns::             Handlers that return normally, and what
+-                                 this means.
+-* Termination in Handler::      How handler functions terminate a program.
+-* Longjmp in Handler::          Nonlocal transfer of control out of a
+-                                 signal handler.
+-* Signals in Handler::          What happens when signals arrive while
+-                                 the handler is already occupied.
+-* Merged Signals::		When a second signal arrives before the
+-				 first is handled.
+-* Nonreentrancy::               Do not call any functions unless you know they
+-                                 are reentrant with respect to signals.
+-* Atomic Data Access::          A single handler can run in the middle of
+-                                 reading or writing a single object.
+-
+-Atomic Data Access
+-
+-* Non-atomic Example::		A program illustrating interrupted access.
+-* Types: Atomic Types.		Data types that guarantee no interruption.
+-* Usage: Atomic Usage.		Proving that interruption is harmless.
+-
+-Generating Signals
+-
+-* Signaling Yourself::          A process can send a signal to itself.
+-* Signaling Another Process::   Send a signal to another process.
+-* Permission for kill::         Permission for using `kill'.
+-* Kill Example::                Using `kill' for Communication.
+-
+-Blocking Signals
+-
+-* Why Block::                           The purpose of blocking signals.
+-* Signal Sets::                         How to specify which signals to
+-                                         block.
+-* Process Signal Mask::                 Blocking delivery of signals to your
+-				         process during normal execution.
+-* Testing for Delivery::                Blocking to Test for Delivery of
+-                                         a Signal.
+-* Blocking for Handler::                Blocking additional signals while a
+-				         handler is being run.
+-* Checking for Pending Signals::        Checking for Pending Signals
+-* Remembering a Signal::                How you can get almost the same
+-                                         effect as blocking a signal, by
+-                                         handling it and setting a flag
+-                                         to be tested later.
+-
+-Waiting for a Signal
+-
+-* Using Pause::                 The simple way, using `pause'.
+-* Pause Problems::              Why the simple way is often not very good.
+-* Sigsuspend::                  Reliably waiting for a specific signal.
+-
+-BSD Signal Handling
+-
+-* BSD Handler::                 BSD Function to Establish a Handler.
+-* Blocking in BSD::             BSD Functions for Blocking Signals.
+-
+-Process Startup
+-
+-* Program Arguments::           Parsing your program's command-line arguments.
+-* Environment Variables::       How to access parameters inherited from
+-				 a parent process.
+-* Program Termination::         How to cause a process to terminate and
+-				 return status information to its parent.
+-
+-Program Arguments
+-
+-* Argument Syntax::             By convention, options start with a hyphen.
+-* Parsing Program Arguments::   Ways to parse program options and arguments.
+-
+-Parsing Program Arguments
+-
+-* Getopt::                      Parsing program options using `getopt'.
+-* Argp::                        Parsing program options using `argp_parse'.
+-* Suboptions::                  Some programs need more detailed options.
+-* Suboptions Example::          This shows how it could be done for `mount'.
+-
+-Environment Variables
+-
+-* Environment Access::          How to get and set the values of
+-				 environment variables.
+-* Standard Environment::        These environment variables have
+-                		 standard interpretations.
+-
+-Program Termination
+-
+-* Normal Termination::          If a program calls `exit', a
+-                                 process terminates normally.
+-* Exit Status::                 The `exit status' provides information
+-                                 about why the process terminated.
+-* Cleanups on Exit::            A process can run its own cleanup
+-                                 functions upon normal termination.
+-* Aborting a Program::          The `abort' function causes
+-                                 abnormal program termination.
+-* Termination Internals::       What happens when a process terminates.
+-
+-Processes
+-
+-* Running a Command::           The easy way to run another program.
+-* Process Creation Concepts::   An overview of the hard way to do it.
+-* Process Identification::      How to get the process ID of a process.
+-* Creating a Process::          How to fork a child process.
+-* Executing a File::            How to make a process execute another program.
+-* Process Completion::          How to tell when a child process has completed.
+-* Process Completion Status::   How to interpret the status value
+-                                 returned from a child process.
+-* BSD Wait Functions::  	More functions, for backward compatibility.
+-* Process Creation Example::    A complete example program.
+-
+-Job Control
+-
+-* Concepts of Job Control::     Jobs can be controlled by a shell.
+-* Job Control is Optional::     Not all POSIX systems support job control.
+-* Controlling Terminal::        How a process gets its controlling terminal.
+-* Access to the Terminal::      How processes share the controlling terminal.
+-* Orphaned Process Groups::     Jobs left after the user logs out.
+-* Implementing a Shell::        What a shell must do to implement job control.
+-* Functions for Job Control::   Functions to control process groups.
+-
+-Implementing a Shell
+-
+-* Data Structures::             Introduction to the sample shell.
+-* Initializing the Shell::      What the shell must do to take
+-				 responsibility for job control.
+-* Launching Jobs::              Creating jobs to execute commands.
+-* Foreground and Background::   Putting a job in foreground of background.
+-* Stopped and Terminated Jobs::  Reporting job status.
+-* Continuing Stopped Jobs::     How to continue a stopped job in
+-				 the foreground or background.
+-* Missing Pieces::              Other parts of the shell.
+-
+-Functions for Job Control
+-
+-* Identifying the Terminal::    Determining the controlling terminal's name.
+-* Process Group Functions::     Functions for manipulating process groups.
+-* Terminal Access Functions::   Functions for controlling terminal access.
+-
+-Name Service Switch
+-
+-* NSS Basics::                  What is this NSS good for.
+-* NSS Configuration File::      Configuring NSS.
+-* NSS Module Internals::        How does it work internally.
+-* Extending NSS::               What to do to add services or databases.
+-
+-NSS Configuration File
+-
+-* Services in the NSS configuration::  Service names in the NSS configuration.
+-* Actions in the NSS configuration::  React appropriately to the lookup result.
+-* Notes on NSS Configuration File::  Things to take care about while
+-                                     configuring NSS.
+-
+-NSS Module Internals
+-
+-* NSS Module Names::            Construction of the interface function of
+-                                the NSS modules.
+-* NSS Modules Interface::       Programming interface in the NSS module
+-                                functions.
+-
+-Extending NSS
+-
+-* Adding another Service to NSS::  What is to do to add a new service.
+-* NSS Module Function Internals::  Guidelines for writing new NSS
+-                                        service functions.
+-
+-Users and Groups
+-
+-* User and Group IDs::          Each user has a unique numeric ID;
+-				 likewise for groups.
+-* Process Persona::             The user IDs and group IDs of a process.
+-* Why Change Persona::          Why a program might need to change
+-				 its user and/or group IDs.
+-* How Change Persona::          Changing the user and group IDs.
+-* Reading Persona::             How to examine the user and group IDs.
+-
+-* Setting User ID::             Functions for setting the user ID.
+-* Setting Groups::              Functions for setting the group IDs.
+-
+-* Enable/Disable Setuid::       Turning setuid access on and off.
+-* Setuid Program Example::      The pertinent parts of one sample program.
+-* Tips for Setuid::             How to avoid granting unlimited access.
+-
+-* Who Logged In::               Getting the name of the user who logged in,
+-				 or of the real user ID of the current process.
+-
+-* User Accounting Database::    Keeping information about users and various
+-                                 actions in databases.
+-
+-* User Database::               Functions and data structures for
+-                        	 accessing the user database.
+-* Group Database::              Functions and data structures for
+-                        	 accessing the group database.
+-* Database Example::            Example program showing the use of database
+-				 inquiry functions.
+-* Netgroup Database::           Functions for accessing the netgroup database.
+-
+-User Accounting Database
+-
+-* Manipulating the Database::   Scanning and modifying the user
+-                                 accounting database.
+-* XPG Functions::               A standardized way for doing the same thing.
+-* Logging In and Out::          Functions from BSD that modify the user
+-                                 accounting database.
+-
+-User Database
+-
+-* User Data Structure::         What each user record contains.
+-* Lookup User::                 How to look for a particular user.
+-* Scanning All Users::          Scanning the list of all users, one by one.
+-* Writing a User Entry::        How a program can rewrite a user's record.
+-
+-Group Database
+-
+-* Group Data Structure::        What each group record contains.
+-* Lookup Group::                How to look for a particular group.
+-* Scanning All Groups::         Scanning the list of all groups.
+-
+-Netgroup Database
+-
+-* Netgroup Data::                  Data in the Netgroup database and where
+-                                   it comes from.
+-* Lookup Netgroup::                How to look for a particular netgroup.
+-* Netgroup Membership::            How to test for netgroup membership.
+-
+-System Information
+-
+-* Host Identification::         Determining the name of the machine.
+-* Hardware/Software Type ID::   Determining the hardware type of the
+-                                 machine and what operating system it is
+-                                 running.
+-* Filesystem handling::         Which is mounted and/or available?
+-
+-System Configuration
+-
+-* General Limits::           Constants and functions that describe
+-				various process-related limits that have
+-				one uniform value for any given machine.
+-* System Options::           Optional POSIX features.
+-* Version Supported::        Version numbers of POSIX.1 and POSIX.2.
+-* Sysconf::                  Getting specific configuration values
+-                                of general limits and system options.
+-* Minimums::                 Minimum values for general limits.
+-
+-* Limits for Files::         Size limitations that pertain to individual files.
+-                                These can vary between file systems
+-                                or even from file to file.
+-* Options for Files::        Optional features that some files may support.
+-* File Minimums::            Minimum values for file limits.
+-* Pathconf::                 Getting the limit values for a particular file.
+-
+-* Utility Limits::           Capacity limits of some POSIX.2 utility programs.
+-* Utility Minimums::         Minimum allowable values of those limits.
+-
+-* String Parameters::        Getting the default search path.
+-
+-Sysconf
+-
+-* Sysconf Definition::        Detailed specifications of `sysconf'.
+-* Constants for Sysconf::     The list of parameters `sysconf' can read.
+-* Examples of Sysconf::       How to use `sysconf' and the parameter
+-				 macros properly together.
+-
+-Cryptographic Functions
+-
+-* Legal Problems::              This software can get you locked up, or worse.
+-* getpass::                     Prompting the user for a password.
+-* crypt::                       A one-way function for UNIX passwords.
+-* DES Encryption::              Routines for DES encryption.
+-
+-POSIX Threads
+-
+-* Basic Thread Operations::     Creating, terminating, and waiting for threads.
+-* Thread Attributes::           Tuning thread scheduling.
+-* Cancellation::                Stopping a thread before it's done.
+-* Cleanup Handlers::            Deallocating resources when a thread is
+-                                  cancelled.
+-* Mutexes::                     One way to synchronize threads.
+-* Condition Variables::         Another way.
+-* POSIX Semaphores::            And a third way.
+-* Thread-Specific Data::        Variables with different values in
+-                                  different threads.
+-* Threads and Signal Handling:: Why you should avoid mixing the two, and
+-                                  how to do it if you must.
+-* Miscellaneous Thread Functions:: A grab bag of utility routines.
+-
+-Language Features
+-
+-* Consistency Checking::        Using `assert' to abort if
+-				 something "impossible" happens.
+-* Variadic Functions::          Defining functions with varying numbers
+-                                 of args.
+-* Null Pointer Constant::       The macro `NULL'.
+-* Important Data Types::        Data types for object sizes.
+-* Data Type Measurements::      Parameters of data type representations.
+-
+-Variadic Functions
+-
+-* Why Variadic::                Reasons for making functions take
+-                                 variable arguments.
+-* How Variadic::                How to define and call variadic functions.
+-* Variadic Example::            A complete example.
+-
+-How Variadic
+-
+-* Variadic Prototypes::  How to make a prototype for a function
+-			  with variable arguments.
+-* Receiving Arguments::  Steps you must follow to access the
+-			  optional argument values.
+-* How Many Arguments::   How to decide whether there are more arguments.
+-* Calling Variadics::    Things you need to know about calling
+-			  variable arguments functions.
+-* Argument Macros::      Detailed specification of the macros
+-        		  for accessing variable arguments.
+-* Old Varargs::		 The pre-ISO way of defining variadic functions.
+-
+-Data Type Measurements
+-
+-* Width of Type::           How many bits does an integer type hold?
+-* Range of Type::           What are the largest and smallest values
+-			     that an integer type can hold?
+-* Floating Type Macros::    Parameters that measure the floating point types.
+-* Structure Measurement::   Getting measurements on structure types.
+-
+-Floating Type Macros
+-
+-* Floating Point Concepts::     Definitions of terminology.
+-* Floating Point Parameters::   Details of specific macros.
+-* IEEE Floating Point::         The measurements for one common
+-                                 representation.
+-
+-Installation
+-
+-* Configuring and compiling::   How to compile and test GNU libc.
+-* Running make install::        How to install it once you've got it compiled.
+-* Tools for Compilation::       You'll need these first.
+-* Supported Configurations::    What it runs on, what it doesn't.
+-* Linux::                       Specific advice for Linux systems.
+-* Reporting Bugs::              So they'll get fixed.
+-
+-Maintenance
+-
+-* Source Layout::         How to add new functions or header files
+-                             to the GNU C library.
+-* Porting::               How to port the GNU C library to
+-                             a new machine or operating system.
+-
+-Porting
+-
+-* Hierarchy Conventions::       The layout of the `sysdeps' hierarchy.
+-* Porting to Unix::             Porting the library to an average
+-                                   Unix-like system.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-10 glibc-2.1.3/manual/libc.info-10
+--- ../glibc-2.1.3/manual/libc.info-10	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-10	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1071 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Setting the Locale,  Next: Standard Locales,  Prev: Locale Categories,  Up: Locales
+-
+-How Programs Set the Locale
+-===========================
+-
+-   A C program inherits its locale environment variables when it starts
+-up.  This happens automatically.  However, these variables do not
+-automatically control the locale used by the library functions, because
+-ISO C says that all programs start by default in the standard `C'
+-locale.  To use the locales specified by the environment, you must call
+-`setlocale'.  Call it as follows:
+-
+-     setlocale (LC_ALL, "");
+-
+-to select a locale based on the user choice of the appropriate
+-environment variables.
+-
+-   You can also use `setlocale' to specify a particular locale, for
+-general use or for a specific category.
+-
+-   The symbols in this section are defined in the header file
+-`locale.h'.
+-
+- - Function: char * setlocale (int CATEGORY, const char *LOCALE)
+-     The function `setlocale' sets the current locale for category
+-     CATEGORY to LOCALE.
+-
+-     If CATEGORY is `LC_ALL', this specifies the locale for all
+-     purposes.  The other possible values of CATEGORY specify an
+-     individual purpose (*note Locale Categories::.).
+-
+-     You can also use this function to find out the current locale by
+-     passing a null pointer as the LOCALE argument.  In this case,
+-     `setlocale' returns a string that is the name of the locale
+-     currently selected for category CATEGORY.
+-
+-     The string returned by `setlocale' can be overwritten by subsequent
+-     calls, so you should make a copy of the string (*note Copying and
+-     Concatenation::.) if you want to save it past any further calls to
+-     `setlocale'.  (The standard library is guaranteed never to call
+-     `setlocale' itself.)
+-
+-     You should not modify the string returned by `setlocale'.  It
+-     might be the same string that was passed as an argument in a
+-     previous call to `setlocale'.
+-
+-     When you read the current locale for category `LC_ALL', the value
+-     encodes the entire combination of selected locales for all
+-     categories.  In this case, the value is not just a single locale
+-     name.  In fact, we don't make any promises about what it looks
+-     like.  But if you specify the same "locale name" with `LC_ALL' in
+-     a subsequent call to `setlocale', it restores the same combination
+-     of locale selections.
+-
+-     To ensure to be able to use the string encoding the currently
+-     selected locale at a later time one has to make a copy of the
+-     string.  It is not guaranteed that the return value stays valid
+-     all the time.
+-
+-     When the LOCALE argument is not a null pointer, the string returned
+-     by `setlocale' reflects the newly modified locale.
+-
+-     If you specify an empty string for LOCALE, this means to read the
+-     appropriate environment variable and use its value to select the
+-     locale for CATEGORY.
+-
+-     If a nonempty string is given for LOCALE the locale with this name
+-     is used, if this is possible.
+-
+-     If you specify an invalid locale name, `setlocale' returns a null
+-     pointer and leaves the current locale unchanged.
+-
+-   Here is an example showing how you might use `setlocale' to
+-temporarily switch to a new locale.
+-
+-     #include <stddef.h>
+-     #include <locale.h>
+-     #include <stdlib.h>
+-     #include <string.h>
+-     
+-     void
+-     with_other_locale (char *new_locale,
+-                        void (*subroutine) (int),
+-                        int argument)
+-     {
+-       char *old_locale, *saved_locale;
+-     
+-       /* Get the name of the current locale.  */
+-       old_locale = setlocale (LC_ALL, NULL);
+-     
+-       /* Copy the name so it won't be clobbered by `setlocale'. */
+-       saved_locale = strdup (old_locale);
+-       if (saved_locale == NULL)
+-         fatal ("Out of memory");
+-     
+-       /* Now change the locale and do some stuff with it. */
+-       setlocale (LC_ALL, new_locale);
+-       (*subroutine) (argument);
+-     
+-       /* Restore the original locale. */
+-       setlocale (LC_ALL, saved_locale);
+-       free (saved_locale);
+-     }
+-
+-   *Portability Note:* Some ISO C systems may define additional locale
+-categories and future versions of the library will do so.  For
+-portability, assume that any symbol beginning with `LC_' might be
+-defined in `locale.h'.
+-
+-
+-File: libc.info,  Node: Standard Locales,  Next: Locale Information,  Prev: Setting the Locale,  Up: Locales
+-
+-Standard Locales
+-================
+-
+-   The only locale names you can count on finding on all operating
+-systems are these three standard ones:
+-
+-`"C"'
+-     This is the standard C locale.  The attributes and behavior it
+-     provides are specified in the ISO C standard.  When your program
+-     starts up, it initially uses this locale by default.
+-
+-`"POSIX"'
+-     This is the standard POSIX locale.  Currently, it is an alias for
+-     the standard C locale.
+-
+-`""'
+-     The empty name says to select a locale based on environment
+-     variables.  *Note Locale Categories::.
+-
+-   Defining and installing named locales is normally a responsibility of
+-the system administrator at your site (or the person who installed the
+-GNU C library).  It is also possible for the user to create private
+-locales.  All this will be discussed later when describing the tool to
+-do so XXX.
+-
+-   If your program needs to use something other than the `C' locale, it
+-will be more portable if you use whatever locale the user specifies
+-with the environment, rather than trying to specify some non-standard
+-locale explicitly by name.  Remember, different machines might have
+-different sets of locales installed.
+-
+-
+-File: libc.info,  Node: Locale Information,  Next: Formatting Numbers,  Prev: Standard Locales,  Up: Locales
+-
+-Accessing the Locale Information
+-================================
+-
+-   There are several ways to access the locale information.  The
+-simplest way is to let the C library itself do the work.  Several of the
+-functions in this library access implicitly the locale data and use
+-what information is available in the currently selected locale.  This is
+-how the locale model is meant to work normally.
+-
+-   As an example take the `strftime' function which is meant to nicely
+-format date and time information (*note Formatting Date and Time::.).
+-Part of the standard information contained in the `LC_TIME' category
+-are, e.g., the names of the months.  Instead of requiring the
+-programmer to take care of providing the translations the `strftime'
+-function does this all by itself.  When using `%A' in the format string
+-this will be replaced by the appropriate weekday name of the locale
+-currently selected for `LC_TIME'.  This is the easy part and wherever
+-possible functions do things automatically as in this case.
+-
+-   But there are quite often situations when there is simply no
+-functions to perform the task or it is simply not possible to do the
+-work automatically.  For these cases it is necessary to access the
+-information in the locale directly.  To do this the C library provides
+-two functions: `localeconv' and `nl_langinfo'.  The former is part of
+-ISO C and therefore portable, but has a brain-damaged interface.  The
+-second is part of the Unix interface and is portable in as far as the
+-system follows the Unix standards.
+-
+-* Menu:
+-
+-* The Lame Way to Locale Data::   ISO C's `localeconv'.
+-* The Elegant and Fast Way::      X/Open's `nl_langinfo'.
+-
+-
+-File: libc.info,  Node: The Lame Way to Locale Data,  Next: The Elegant and Fast Way,  Up: Locale Information
+-
+-`localeconv': It is portable but ...
+-------------------------------------
+-
+-   Together with the `setlocale' function the ISO C people invented
+-`localeconv' function.  It is a masterpiece of misdesign.  It is
+-expensive to use, it is not extendable, and is not generally usable as
+-it provides access only to the `LC_MONETARY' and `LC_NUMERIC' related
+-information.  If it is applicable for a certain situation it should
+-nevertheless be used since it is very portable.  In general it is
+-better to use the function `strfmon' which can be used to format
+-monetary amounts correctly according to the selected locale by
+-implicitly using this information.
+-
+- - Function: struct lconv * localeconv (void)
+-     The `localeconv' function returns a pointer to a structure whose
+-     components contain information about how numeric and monetary
+-     values should be formatted in the current locale.
+-
+-     You should not modify the structure or its contents.  The
+-     structure might be overwritten by subsequent calls to
+-     `localeconv', or by calls to `setlocale', but no other function in
+-     the library overwrites this value.
+-
+- - Data Type: struct lconv
+-     This is the data type of the value returned by `localeconv'.  Its
+-     elements are described in the following subsections.
+-
+-   If a member of the structure `struct lconv' has type `char', and the
+-value is `CHAR_MAX', it means that the current locale has no value for
+-that parameter.
+-
+-* Menu:
+-
+-* General Numeric::             Parameters for formatting numbers and
+-                                 currency amounts.
+-* Currency Symbol::             How to print the symbol that identifies an
+-                                 amount of money (e.g. `$').
+-* Sign of Money Amount::        How to print the (positive or negative) sign
+-                                 for a monetary amount, if one exists.
+-
+-
+-File: libc.info,  Node: General Numeric,  Next: Currency Symbol,  Up: The Lame Way to Locale Data
+-
+-Generic Numeric Formatting Parameters
+-.....................................
+-
+-   These are the standard members of `struct lconv'; there may be
+-others.
+-
+-`char *decimal_point'
+-`char *mon_decimal_point'
+-     These are the decimal-point separators used in formatting
+-     non-monetary and monetary quantities, respectively.  In the `C'
+-     locale, the value of `decimal_point' is `"."', and the value of
+-     `mon_decimal_point' is `""'.
+-
+-`char *thousands_sep'
+-`char *mon_thousands_sep'
+-     These are the separators used to delimit groups of digits to the
+-     left of the decimal point in formatting non-monetary and monetary
+-     quantities, respectively.  In the `C' locale, both members have a
+-     value of `""' (the empty string).
+-
+-`char *grouping'
+-`char *mon_grouping'
+-     These are strings that specify how to group the digits to the left
+-     of the decimal point.  `grouping' applies to non-monetary
+-     quantities and `mon_grouping' applies to monetary quantities.  Use
+-     either `thousands_sep' or `mon_thousands_sep' to separate the digit
+-     groups.
+-
+-     Each string is made up of decimal numbers separated by semicolons.
+-     Successive numbers (from left to right) give the sizes of
+-     successive groups (from right to left, starting at the decimal
+-     point).  The last number in the string is used over and over for
+-     all the remaining groups.
+-
+-     If the last integer is `-1', it means that there is no more
+-     grouping--or, put another way, any remaining digits form one large
+-     group without separators.
+-
+-     For example, if `grouping' is `"4;3;2"', the correct grouping for
+-     the number `123456787654321' is `12', `34', `56', `78', `765',
+-     `4321'.  This uses a group of 4 digits at the end, preceded by a
+-     group of 3 digits, preceded by groups of 2 digits (as many as
+-     needed).  With a separator of `,', the number would be printed as
+-     `12,34,56,78,765,4321'.
+-
+-     A value of `"3"' indicates repeated groups of three digits, as
+-     normally used in the U.S.
+-
+-     In the standard `C' locale, both `grouping' and `mon_grouping'
+-     have a value of `""'.  This value specifies no grouping at all.
+-
+-`char int_frac_digits'
+-`char frac_digits'
+-     These are small integers indicating how many fractional digits (to
+-     the right of the decimal point) should be displayed in a monetary
+-     value in international and local formats, respectively.  (Most
+-     often, both members have the same value.)
+-
+-     In the standard `C' locale, both of these members have the value
+-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+-     what to do when you find this the value; we recommend printing no
+-     fractional digits.  (This locale also specifies the empty string
+-     for `mon_decimal_point', so printing any fractional digits would be
+-     confusing!)
+-
+-
+-File: libc.info,  Node: Currency Symbol,  Next: Sign of Money Amount,  Prev: General Numeric,  Up: The Lame Way to Locale Data
+-
+-Printing the Currency Symbol
+-............................
+-
+-   These members of the `struct lconv' structure specify how to print
+-the symbol to identify a monetary value--the international analog of
+-`$' for US dollars.
+-
+-   Each country has two standard currency symbols.  The "local currency
+-symbol" is used commonly within the country, while the "international
+-currency symbol" is used internationally to refer to that country's
+-currency when it is necessary to indicate the country unambiguously.
+-
+-   For example, many countries use the dollar as their monetary unit,
+-and when dealing with international currencies it's important to specify
+-that one is dealing with (say) Canadian dollars instead of U.S. dollars
+-or Australian dollars.  But when the context is known to be Canada,
+-there is no need to make this explicit--dollar amounts are implicitly
+-assumed to be in Canadian dollars.
+-
+-`char *currency_symbol'
+-     The local currency symbol for the selected locale.
+-
+-     In the standard `C' locale, this member has a value of `""' (the
+-     empty string), meaning "unspecified".  The ISO standard doesn't
+-     say what to do when you find this value; we recommend you simply
+-     print the empty string as you would print any other string found
+-     in the appropriate member.
+-
+-`char *int_curr_symbol'
+-     The international currency symbol for the selected locale.
+-
+-     The value of `int_curr_symbol' should normally consist of a
+-     three-letter abbreviation determined by the international standard
+-     `ISO 4217 Codes for the Representation of Currency and Funds',
+-     followed by a one-character separator (often a space).
+-
+-     In the standard `C' locale, this member has a value of `""' (the
+-     empty string), meaning "unspecified".  We recommend you simply
+-     print the empty string as you would print any other string found
+-     in the appropriate member.
+-
+-`char p_cs_precedes'
+-`char n_cs_precedes'
+-     These members are `1' if the `currency_symbol' string should
+-     precede the value of a monetary amount, or `0' if the string should
+-     follow the value.  The `p_cs_precedes' member applies to positive
+-     amounts (or zero), and the `n_cs_precedes' member applies to
+-     negative amounts.
+-
+-     In the standard `C' locale, both of these members have a value of
+-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+-     what to do when you find this value, but we recommend printing the
+-     currency symbol before the amount.  That's right for most
+-     countries.  In other words, treat all nonzero values alike in
+-     these members.
+-
+-     The POSIX standard says that these two members apply to the
+-     `int_curr_symbol' as well as the `currency_symbol'.  The ISO C
+-     standard seems to imply that they should apply only to the
+-     `currency_symbol'--so the `int_curr_symbol' should always precede
+-     the amount.
+-
+-     We can only guess which of these (if either) matches the usual
+-     conventions for printing international currency symbols.  Our
+-     guess is that they should always precede the amount.  If we find
+-     out a reliable answer, we will put it here.
+-
+-`char p_sep_by_space'
+-`char n_sep_by_space'
+-     These members are `1' if a space should appear between the
+-     `currency_symbol' string and the amount, or `0' if no space should
+-     appear.  The `p_sep_by_space' member applies to positive amounts
+-     (or zero), and the `n_sep_by_space' member applies to negative
+-     amounts.
+-
+-     In the standard `C' locale, both of these members have a value of
+-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+-     what you should do when you find this value; we suggest you treat
+-     it as one (print a space).  In other words, treat all nonzero
+-     values alike in these members.
+-
+-     These members apply only to `currency_symbol'.  When you use
+-     `int_curr_symbol', you never print an additional space, because
+-     `int_curr_symbol' itself contains the appropriate separator.
+-
+-     The POSIX standard says that these two members apply to the
+-     `int_curr_symbol' as well as the `currency_symbol'.  But an
+-     example in the ISO C standard clearly implies that they should
+-     apply only to the `currency_symbol'--that the `int_curr_symbol'
+-     contains any appropriate separator, so you should never print an
+-     additional space.
+-
+-     Based on what we know now, we recommend you ignore these members
+-     when printing international currency symbols, and print no extra
+-     space.
+-
+-
+-File: libc.info,  Node: Sign of Money Amount,  Prev: Currency Symbol,  Up: The Lame Way to Locale Data
+-
+-Printing the Sign of an Amount of Money
+-.......................................
+-
+-   These members of the `struct lconv' structure specify how to print
+-the sign (if any) in a monetary value.
+-
+-`char *positive_sign'
+-`char *negative_sign'
+-     These are strings used to indicate positive (or zero) and negative
+-     (respectively) monetary quantities.
+-
+-     In the standard `C' locale, both of these members have a value of
+-     `""' (the empty string), meaning "unspecified".
+-
+-     The ISO standard doesn't say what to do when you find this value;
+-     we recommend printing `positive_sign' as you find it, even if it is
+-     empty.  For a negative value, print `negative_sign' as you find it
+-     unless both it and `positive_sign' are empty, in which case print
+-     `-' instead.  (Failing to indicate the sign at all seems rather
+-     unreasonable.)
+-
+-`char p_sign_posn'
+-`char n_sign_posn'
+-     These members have values that are small integers indicating how to
+-     position the sign for nonnegative and negative monetary quantities,
+-     respectively.  (The string used by the sign is what was specified
+-     with `positive_sign' or `negative_sign'.)  The possible values are
+-     as follows:
+-
+-    `0'
+-          The currency symbol and quantity should be surrounded by
+-          parentheses.
+-
+-    `1'
+-          Print the sign string before the quantity and currency symbol.
+-
+-    `2'
+-          Print the sign string after the quantity and currency symbol.
+-
+-    `3'
+-          Print the sign string right before the currency symbol.
+-
+-    `4'
+-          Print the sign string right after the currency symbol.
+-
+-    `CHAR_MAX'
+-          "Unspecified".  Both members have this value in the standard
+-          `C' locale.
+-
+-     The ISO standard doesn't say what you should do when the value is
+-     `CHAR_MAX'.  We recommend you print the sign after the currency
+-     symbol.
+-
+-   It is not clear whether you should let these members apply to the
+-international currency format or not.  POSIX says you should, but
+-intuition plus the examples in the ISO C standard suggest you should
+-not.  We hope that someone who knows well the conventions for formatting
+-monetary quantities will tell us what we should recommend.
+-
+-
+-File: libc.info,  Node: The Elegant and Fast Way,  Prev: The Lame Way to Locale Data,  Up: Locale Information
+-
+-Pinpoint Access to Locale Data
+-------------------------------
+-
+-   When writing the X/Open Portability Guide the authors realized that
+-the `localeconv' function is not enough to provide reasonable access to
+-the locale information.  The information which was meant to be available
+-in the locale (as later specified in the POSIX.1 standard) requires more
+-possibilities to access it.  Therefore the `nl_langinfo' function was
+-introduced.
+-
+- - Function: char * nl_langinfo (nl_item ITEM)
+-     The `nl_langinfo' function can be used to access individual
+-     elements of the locale categories.  I.e., unlike the `localeconv'
+-     function which always returns all the information `nl_langinfo'
+-     lets the caller select what information is necessary.  This is very
+-     fast and it is no problem to call this function multiple times.
+-
+-     The second advantage is that not only the numeric and monetary
+-     formatting information is available.  Also the information of the
+-     `LC_TIME' and `LC_MESSAGES' categories is available.
+-
+-     The type `nl_type' is defined in `nl_types.h'.  The argument ITEM
+-     is a numeric values which must be one of the values defined in the
+-     header `langinfo.h'.  The X/Open standard defines the following
+-     values:
+-
+-    `ABDAY_1'
+-    `ABDAY_2'
+-    `ABDAY_3'
+-    `ABDAY_4'
+-    `ABDAY_5'
+-    `ABDAY_6'
+-    `ABDAY_7'
+-          `nl_langinfo' returns the abbreviated weekday name.  `ABDAY_1'
+-          corresponds to Sunday.
+-
+-    `DAY_1'
+-    `DAY_2'
+-    `DAY_3'
+-    `DAY_4'
+-    `DAY_5'
+-    `DAY_6'
+-    `DAY_7'
+-          Similar to `ABDAY_1' etc, but here the return value is the
+-          unabbreviated weekday name.
+-
+-    `ABMON_1'
+-    `ABMON_2'
+-    `ABMON_3'
+-    `ABMON_4'
+-    `ABMON_5'
+-    `ABMON_6'
+-    `ABMON_7'
+-    `ABMON_8'
+-    `ABMON_9'
+-    `ABMON_10'
+-    `ABMON_11'
+-    `ABMON_12'
+-          The return value is abbreviated name for the month names.
+-          `ABMON_1' corresponds to January.
+-
+-    `MON_1'
+-    `MON_2'
+-    `MON_3'
+-    `MON_4'
+-    `MON_5'
+-    `MON_6'
+-    `MON_7'
+-    `MON_8'
+-    `MON_9'
+-    `MON_10'
+-    `MON_11'
+-    `MON_12'
+-          Similar to `ABMON_1' etc but here the month names are not
+-          abbreviated.  Here the first value `MON_1' also corresponds
+-          to January.
+-
+-    `AM_STR'
+-    `PM_STR'
+-          The return values are strings which can be used in the time
+-          representation which uses to American 1 to 12 hours plus
+-          am/pm representation.
+-
+-          Please note that in locales which do not know this time
+-          representation these strings actually might be empty and
+-          therefore the am/pm format cannot be used at all.
+-
+-    `D_T_FMT'
+-          The return value can be used as a format string for
+-          `strftime' to represent time and date in a locale specific
+-          way.
+-
+-    `D_FMT'
+-          The return value can be used as a format string for
+-          `strftime' to represent a date in a locale specific way.
+-
+-    `T_FMT'
+-          The return value can be used as a format string for
+-          `strftime' to represent time in a locale specific way.
+-
+-    `T_FMT_AMPM'
+-          The return value can be used as a format string for
+-          `strftime' to represent time using the American-style am/pm
+-          format.
+-
+-          Please note that if the am/pm format does not make any sense
+-          for the selected locale the returned value might be the same
+-          as the one for `T_FMT'.
+-
+-    `ERA'
+-          The return value is value representing the eras of time used
+-          in the current locale.
+-
+-          Most locales do not define this value.  An example for a
+-          locale which does define this value is the Japanese.  Here
+-          the traditional data representation is based on the eras
+-          measured by the reigns of the emperors.
+-
+-          Normally it should not be necessary to use this value
+-          directly.  Using the `E' modifier for its formats the
+-          `strftime' functions can be made to use this information.
+-          The format of the returned string is not specified and
+-          therefore one should not generalize the knowledge about the
+-          representation on one system.
+-
+-    `ERA_YEAR'
+-          The return value describes the name years for the eras of
+-          this locale.  As for `ERA' it should not be necessary to use
+-          this value directly.
+-
+-    `ERA_D_T_FMT'
+-          This return value can be used as a format string for
+-          `strftime' to represent time and date using the era
+-          representation in a locale specific way.
+-
+-    `ERA_D_FMT'
+-          This return value can be used as a format string for
+-          `strftime' to represent a date using the era representation
+-          in a locale specific way.
+-
+-    `ERA_T_FMT'
+-          This return value can be used as a format string for
+-          `strftime' to represent time using the era representation in
+-          a locale specific way.
+-
+-    `ALT_DIGITS'
+-          The return value is a representation of up to 100 values used
+-          to represent the values 0 to 99.  As for `ERA' this value is
+-          not intended to be used directly, but instead indirectly
+-          through the `strftime' function.  When the modifier `O' is
+-          used for format which would use numerals to represent hours,
+-          minutes, seconds, weekdays, months, or weeks the appropriate
+-          value for this locale values is used instead of the number.
+-
+-    `INT_CURR_SYMBOL'
+-          This value is the same as returned by `localeconv' in the
+-          `int_curr_symbol' element of the `struct lconv'.
+-
+-    `CURRENCY_SYMBOL'
+-    `CRNCYSTR'
+-          This value is the same as returned by `localeconv' in the
+-          `currency_symbol' element of the `struct lconv'.
+-
+-          `CRNCYSTR' is a deprecated alias, still required by Unix98.
+-
+-    `MON_DECIMAL_POINT'
+-          This value is the same as returned by `localeconv' in the
+-          `mon_decimal_point' element of the `struct lconv'.
+-
+-    `MON_THOUSANDS_SEP'
+-          This value is the same as returned by `localeconv' in the
+-          `mon_thousands_sep' element of the `struct lconv'.
+-
+-    `MON_GROUPING'
+-          This value is the same as returned by `localeconv' in the
+-          `mon_grouping' element of the `struct lconv'.
+-
+-    `POSITIVE_SIGN'
+-          This value is the same as returned by `localeconv' in the
+-          `positive_sign' element of the `struct lconv'.
+-
+-    `NEGATIVE_SIGN'
+-          This value is the same as returned by `localeconv' in the
+-          `negative_sign' element of the `struct lconv'.
+-
+-    `INT_FRAC_DIGITS'
+-          This value is the same as returned by `localeconv' in the
+-          `int_frac_digits' element of the `struct lconv'.
+-
+-    `FRAC_DIGITS'
+-          This value is the same as returned by `localeconv' in the
+-          `frac_digits' element of the `struct lconv'.
+-
+-    `P_CS_PRECEDES'
+-          This value is the same as returned by `localeconv' in the
+-          `p_cs_precedes' element of the `struct lconv'.
+-
+-    `P_SEP_BY_SPACE'
+-          This value is the same as returned by `localeconv' in the
+-          `p_sep_by_space' element of the `struct lconv'.
+-
+-    `N_CS_PRECEDES'
+-          This value is the same as returned by `localeconv' in the
+-          `n_cs_precedes' element of the `struct lconv'.
+-
+-    `N_SEP_BY_SPACE'
+-          This value is the same as returned by `localeconv' in the
+-          `n_sep_by_space' element of the `struct lconv'.
+-
+-    `P_SIGN_POSN'
+-          This value is the same as returned by `localeconv' in the
+-          `p_sign_posn' element of the `struct lconv'.
+-
+-    `N_SIGN_POSN'
+-          This value is the same as returned by `localeconv' in the
+-          `n_sign_posn' element of the `struct lconv'.
+-
+-    `DECIMAL_POINT'
+-    `RADIXCHAR'
+-          This value is the same as returned by `localeconv' in the
+-          `decimal_point' element of the `struct lconv'.
+-
+-          The name `RADIXCHAR' is a deprecated alias still used in
+-          Unix98.
+-
+-    `THOUSANDS_SEP'
+-    `THOUSEP'
+-          This value is the same as returned by `localeconv' in the
+-          `thousands_sep' element of the `struct lconv'.
+-
+-          The name `THOUSEP' is a deprecated alias still used in Unix98.
+-
+-    `GROUPING'
+-          This value is the same as returned by `localeconv' in the
+-          `grouping' element of the `struct lconv'.
+-
+-    `YESEXPR'
+-          The return value is a regular expression which can be used
+-          with the `regex' function to recognize a positive response to
+-          a yes/no question.
+-
+-    `NOEXPR'
+-          The return value is a regular expression which can be used
+-          with the `regex' function to recognize a negative response to
+-          a yes/no question.
+-
+-    `YESSTR'
+-          The return value is a locale specific translation of the
+-          positive response to a yes/no question.
+-
+-          Using this value is deprecated since it is a very special
+-          case of message translation and this better can be handled
+-          using the message translation functions (*note Message
+-          Translation::.).
+-
+-    `NOSTR'
+-          The return value is a locale specific translation of the
+-          negative response to a yes/no question.  What is said for
+-          `YESSTR' is also true here.
+-
+-     The file `langinfo.h' defines a lot more symbols but none of them
+-     is official.  Using them is completely unportable and the format
+-     of the return values might change.  Therefore it is highly
+-     requested to not use them in any situation.
+-
+-     Please note that the return value for any valid argument can be
+-     used for in all situations (with the possible exception of the
+-     am/pm time format related values).  If the user has not selected
+-     any locale for the appropriate category `nl_langinfo' returns the
+-     information from the `"C"' locale.  It is therefore possible to
+-     use this function as shown in the example below.
+-
+-     If the argument ITEM is not valid the global variable ERRNO is set
+-     to `EINVAL' and a `NULL' pointer is returned.
+-
+-   An example for the use of `nl_langinfo' is a function which has to
+-print a given date and time in the locale specific way.  At first one
+-might think the since `strftime' internally uses the locale information
+-writing something like the following is enough:
+-
+-     size_t
+-     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
+-     {
+-       return strftime (s, len, "%X %D", tp);
+-     }
+-
+-   The format contains no weekday or month names and therefore is
+-internationally usable.  Wrong!  The output produced is something like
+-`"hh:mm:ss MM/DD/YY"'.  This format is only recognizable in the USA.
+-Other countries use different formats.  Therefore the function should
+-be rewritten like this:
+-
+-     size_t
+-     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
+-     {
+-       return strftime (s, len, nl_langinfo (D_T_FMT), tp);
+-     }
+-
+-   Now the date and time format which is explicitly selected for the
+-locale in place when the program runs is used.  If the user selects the
+-locale correctly there should never be a misunderstanding over the time
+-and date format.
+-
+-
+-File: libc.info,  Node: Formatting Numbers,  Prev: Locale Information,  Up: Locales
+-
+-A dedicated function to format numbers
+-======================================
+-
+-   We have seen that the structure returned by `localeconv' as well as
+-the values given to `nl_langinfo' allow to retrieve the various pieces
+-of locale specific information to format numbers and monetary amounts.
+-But we have also seen that the rules underlying this information are
+-quite complex.
+-
+-   Therefore the X/Open standards introduce a function which uses this
+-information from the locale and so makes it is for the user to format
+-numbers according to these rules.
+-
+- - Function: ssize_t strfmon (char *S, size_t MAXSIZE, const char
+-          *FORMAT, ...)
+-     The `strfmon' function is similar to the `strftime' function in
+-     that it takes a description of a buffer (with size), a format
+-     string and values to write into a buffer a textual representation
+-     of the values according to the format string.  As for `strftime'
+-     the function also returns the number of bytes written into the
+-     buffer.
+-
+-     There are two difference: `strfmon' can take more than one argument
+-     and of course the format specification is different.  The format
+-     string consists as for `strftime' of normal text which is simply
+-     printed and format specifiers, which here are also introduced
+-     using `%'.  Following the `%' the function allows similar to
+-     `printf' a sequence of flags and other specifications before the
+-     format character:
+-
+-        * Immediately following the `%' there can be one or more of the
+-          following flags:
+-         `=F'
+-               The single byte character F is used for this field as
+-               the numeric fill character.  By default this character
+-               is a space character.  Filling with this character is
+-               only performed if a left precision is specified.  It is
+-               not just to fill to the given field width.
+-
+-         `^'
+-               The number is printed without grouping the digits using
+-               the rules of the current locale.  By default grouping is
+-               enabled.
+-
+-         `+', `('
+-               At most one of these flags must be used.  They select
+-               which format to represent the sign of currency amount is
+-               used.  By default and if `+' is used the locale
+-               equivalent to +/- is used.  If `(' is used negative
+-               amounts are enclosed in parentheses.  The exact format
+-               is determined by the values of the `LC_MONETARY'
+-               category of the locale selected at program runtime.
+-
+-         `!'
+-               The output will not contain the currency symbol.
+-
+-         `-'
+-               The output will be formatted right-justified instead
+-               left-justified if the output does not fill the entire
+-               field width.
+-
+-     The next part of a specification is an, again optional,
+-     specification of the field width.  The width is given by digits
+-     following the flags.  If no width is specified it is assumed to be
+-     0.  The width value is used after it is determined how much space
+-     the printed result needs.  If it does not require fewer characters
+-     than specified by the width value nothing happens.  Otherwise the
+-     output is extended to use as many characters as the width says by
+-     filling with spaces.  At which side depends on whether the `-'
+-     flag was given or not.  If it was given, the spaces are added at
+-     the right, making the output right-justified and vice versa.
+-
+-     So far the format looks familiar as it is similar to `printf' or
+-     `strftime' formats.  But the next two fields introduce something
+-     new.  The first one, if available, is introduced by a `#' character
+-     which is followed by a decimal digit string.  The value of the
+-     digit string specifies the width the formatted digits left to the
+-     radix character.  This does *not* include the grouping character
+-     needed if the `^' flag is not given.  If the space needed to print
+-     the number does not fill the whole width the field is padded at
+-     the left side with the fill character which can be selected using
+-     the `=' flag and which by default is a space.  For example, if the
+-     field width is selected as 6 and the number is 123, the fill
+-     character is `*' the result will be `***123'.
+-
+-     The next field is introduced by a `.' (period) and consists of
+-     another decimal digit string.  Its value describes the number of
+-     characters printed after the radix character.  The default is
+-     selected from the current locale (`frac_digits',
+-     `int_frac_digits', see *note General Numeric::.).  If the exact
+-     representation needs more digits than those specified by the field
+-     width the displayed value is rounded.  In case the number of
+-     fractional digits is selected to be zero, no radix character is
+-     printed.
+-
+-     As a GNU extension the `strfmon' implementation in the GNU libc
+-     allows as the next field an optional `L' as a format modifier.  If
+-     this modifier is given the argument is expected to be a `long
+-     double' instead of a `double' value.
+-
+-     Finally as the last component of the format there must come a
+-     format specifying.  There are three specifiers defined:
+-
+-    `i'
+-          The argument is formatted according to the locale's rules to
+-          format an international currency value.
+-
+-    `n'
+-          The argument is formatted according to the locale's rules to
+-          format an national currency value.
+-
+-    `%'
+-          Creates a `%' in the output.  There must be no flag, width
+-          specifier or modifier given, only `%%' is allowed.
+-
+-     As it is done for `printf', the function reads the format string
+-     from left to right and uses the values passed to the function
+-     following the format string.  The values are expected to be either
+-     of type `double' or `long double', depending on the presence of the
+-     modifier `L'.  The result is stored in the buffer pointed to by S.
+-     At most MAXSIZE characters are stored.
+-
+-     The return value of the function is the number of characters
+-     stored in S, including the terminating NUL byte.  If the number of
+-     characters stored would exceed MAXSIZE the function returns -1 and
+-     the content of the buffer S is unspecified.  In this case `errno'
+-     is set to `E2BIG'.
+-
+-   A few examples should make it clear how to use this function.  It is
+-assumed that all the following pieces of code are executed in a program
+-which uses the locale valid for the USA (`en_US').  The simplest form
+-of the format is this:
+-
+-     strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678);
+-
+-The output produced is
+-     "@$123.45@-$567.89@$12,345.68@"
+-
+-   We can notice several things here.  First, the width for all formats
+-is different.  We have not specified a width in the format string and so
+-this is no wonder.  Second, the third number is printed using thousands
+-separators.  The thousands separator for the `en_US' locale is a comma.
+-Beside this the number is rounded.  The .678 are rounded to .68 since
+-the format does not specify a precision and the default value in the
+-locale is 2.  A last thing is that the national currency symbol is
+-printed since `%n' was used, not `i'.  The next example shows how we
+-can align the output.
+-
+-     strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678);
+-
+-The output this time is:
+-
+-     "@    $123.45@   -$567.89@ $12,345.68@"
+-
+-   Two things stand out.  First, all fields have the same width (eleven
+-characters) since this is the width given in the format and since no
+-number required more characters to be printed.  The second important
+-point is that the fill character is not used.  This is correct since the
+-white space was not used to fill the space specified by the right
+-precision, but instead it is used to fill to the given width.  The
+-difference becomes obvious if we now add a right width specification.
+-
+-     strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@",
+-              123.45, -567.89, 12345.678);
+-
+-The output is
+-
+-     "@ $***123.45@-$***567.89@ $12,456.68@"
+-
+-   Here we can see that all the currency symbols are now aligned and the
+-space between the currency sign and the number is filled with the
+-selected fill character.  Please note that although the right precision
+-is selected to be 5 and 123.45 has three characters right of the radix
+-character, the space is filled with three asterisks.  This is correct
+-since as explained above, the right precision does not count the
+-characters used for the thousands separators in.  One last example
+-should explain the remaining functionality.
+-
+-     strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@",
+-              123.45, -567.89, 12345.678);
+-
+-This rather complex format string produces the following output:
+-
+-     "@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @"
+-
+-   The most noticeable change is the use of the alternative style to
+-represent negative numbers.  In financial circles it is often done using
+-parentheses and this is what the `(' flag selected.  The fill character
+-is now `0'.  Please note that this `0' character is not regarded as a
+-numeric zero and therefore the first and second number are not printed
+-using a thousands separator.  Since we use in the format the specifier
+-`i' instead of `n' now the international form of the currency symbol is
+-used.  This is a four letter string, in this case `"USD "'.  The last
+-point is that since the left precision is selected to be three the
+-first and second number are printed with an extra zero at the end and
+-the third number is printed unrounded.
+-
+-
+-File: libc.info,  Node: Message Translation,  Next: Searching and Sorting,  Prev: Locales,  Up: Top
+-
+-Message Translation
+-*******************
+-
+-   The program's interface with the human should be designed in a way to
+-ease the human the task.  One of the possibilities is to use messages in
+-whatever language the user prefers.
+-
+-   Printing messages in different languages can be implemented in
+-different ways.  One could add all the different languages in the
+-source code and add among the variants every time a message has to be
+-printed.  This is certainly no good solution since extending the set of
+-languages is difficult (the code must be changed) and the code itself
+-can become really big with dozens of message sets.
+-
+-   A better solution is to keep the message sets for each language are
+-kept in separate files which are loaded at runtime depending on the
+-language selection of the user.
+-
+-   The GNU C Library provides two different sets of functions to support
+-message translation.  The problem is that neither of the interfaces is
+-officially defined by the POSIX standard.  The `catgets' family of
+-functions is defined in the X/Open standard but this is derived from
+-industry decisions and therefore not necessarily based on reasonable
+-decisions.
+-
+-   As mentioned above the message catalog handling provides easy
+-extendibility by using external data files which contain the message
+-translations.  I.e., these files contain for each of the messages used
+-in the program a translation for the appropriate language.  So the tasks
+-of the message handling functions are
+-
+-   * locate the external data file with the appropriate translations.
+-
+-   * load the data and make it possible to address the messages
+-
+-   * map a given key to the translated message
+-
+-   The two approaches mainly differ in the implementation of this last
+-step.  The design decisions made for this influences the whole rest.
+-
+-* Menu:
+-
+-* Message catalogs a la X/Open::  The `catgets' family of functions.
+-* The Uniforum approach::         The `gettext' family of functions.
+-
+-
+-File: libc.info,  Node: Message catalogs a la X/Open,  Next: The Uniforum approach,  Up: Message Translation
+-
+-X/Open Message Catalog Handling
+-===============================
+-
+-   The `catgets' functions are based on the simple scheme:
+-
+-     Associate every message to translate in the source code with a
+-     unique identifier.  To retrieve a message from a catalog file
+-     solely the identifier is used.
+-
+-   This means for the author of the program that s/he will have to make
+-sure the meaning of the identifier in the program code and in the
+-message catalogs are always the same.
+-
+-   Before a message can be translated the catalog file must be located.
+-The user of the program must be able to guide the responsible function
+-to find whatever catalog the user wants.  This is separated from what
+-the programmer had in mind.
+-
+-   All the types, constants and functions for the `catgets' functions
+-are defined/declared in the `nl_types.h' header file.
+-
+-* Menu:
+-
+-* The catgets Functions::      The `catgets' function family.
+-* The message catalog files::  Format of the message catalog files.
+-* The gencat program::         How to generate message catalogs files which
+-                                can be used by the functions.
+-* Common Usage::               How to use the `catgets' interface.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-11 glibc-2.1.3/manual/libc.info-11
+--- ../glibc-2.1.3/manual/libc.info-11	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-11	1969-12-31 16:00:00.000000000 -0800
+@@ -1,949 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: The catgets Functions,  Next: The message catalog files,  Up: Message catalogs a la X/Open
+-
+-The `catgets' function family
+------------------------------
+-
+- - Function: nl_catd catopen (const char *CAT_NAME, int FLAG)
+-     The `catgets' function tries to locate the message data file names
+-     CAT_NAME and loads it when found.  The return value is of an
+-     opaque type and can be used in calls to the other functions to
+-     refer to this loaded catalog.
+-
+-     The return value is `(nl_catd) -1' in case the function failed and
+-     no catalog was loaded.  The global variable ERRNO contains a code
+-     for the error causing the failure.  But even if the function call
+-     succeeded this does not mean that all messages can be translated.
+-
+-     Locating the catalog file must happen in a way which lets the user
+-     of the program influence the decision.  It is up to the user to
+-     decide about the language to use and sometimes it is useful to use
+-     alternate catalog files.  All this can be specified by the user by
+-     setting some environment variables.
+-
+-     The first problem is to find out where all the message catalogs are
+-     stored.  Every program could have its own place to keep all the
+-     different files but usually the catalog files are grouped by
+-     languages and the catalogs for all programs are kept in the same
+-     place.
+-
+-     To tell the `catopen' function where the catalog for the program
+-     can be found the user can set the environment variable `NLSPATH' to
+-     a value which describes her/his choice.  Since this value must be
+-     usable for different languages and locales it cannot be a simple
+-     string.  Instead it is a format string (similar to `printf''s).
+-     An example is
+-
+-          /usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N
+-
+-     First one can see that more than one directory can be specified
+-     (with the usual syntax of separating them by colons).  The next
+-     things to observe are the format string, `%L' and `%N' in this
+-     case.  The `catopen' function knows about several of them and the
+-     replacement for all of them is of course different.
+-
+-    `%N'
+-          This format element is substituted with the name of the
+-          catalog file.  This is the value of the CAT_NAME argument
+-          given to `catgets'.
+-
+-    `%L'
+-          This format element is substituted with the name of the
+-          currently selected locale for translating messages.  How this
+-          is determined is explained below.
+-
+-    `%l'
+-          (This is the lowercase ell.) This format element is
+-          substituted with the language element of the locale name.
+-          The string describing the selected locale is expected to have
+-          the form `LANG[_TERR[.CODESET]]' and this format uses the
+-          first part LANG.
+-
+-    `%t'
+-          This format element is substituted by the territory part TERR
+-          of the name of the currently selected locale.  See the
+-          explanation of the format above.
+-
+-    `%c'
+-          This format element is substituted by the codeset part
+-          CODESET of the name of the currently selected locale.  See
+-          the explanation of the format above.
+-
+-    `%%'
+-          Since `%' is used in a meta character there must be a way to
+-          express the `%' character in the result itself.  Using `%%'
+-          does this just like it works for `printf'.
+-
+-     Using `NLSPATH' allows to specify arbitrary directories to be
+-     searched for message catalogs while still allowing different
+-     languages to be used.  If the `NLSPATH' environment variable is
+-     not set the default value is
+-
+-          PREFIX/share/locale/%L/%N:PREFIX/share/locale/%L/LC_MESSAGES/%N
+-
+-     where PREFIX is given to `configure' while installing the GNU C
+-     Library (this value is in many cases `/usr' or the empty string).
+-
+-     The remaining problem is to decide which must be used.  The value
+-     decides about the substitution of the format elements mentioned
+-     above.  First of all the user can specify a path in the message
+-     catalog name (i.e., the name contains a slash character).  In this
+-     situation the `NLSPATH' environment variable is not used.  The
+-     catalog must exist as specified in the program, perhaps relative
+-     to the current working directory.  This situation in not desirable
+-     and catalogs names never should be written this way.  Beside this,
+-     this behaviour is not portable to all other platforms providing
+-     the `catgets' interface.
+-
+-     Otherwise the values of environment variables from the standard
+-     environment are examined (*note Standard Environment::.).  Which
+-     variables are examined is decided by the FLAG parameter of
+-     `catopen'.  If the value is `NL_CAT_LOCALE' (which is defined in
+-     `nl_types.h') then the `catopen' function examines the environment
+-     variable `LC_ALL', `LC_MESSAGES', and `LANG' in this order.  The
+-     first variable which is set in the current environment will be
+-     used.
+-
+-     If FLAG is zero only the `LANG' environment variable is examined.
+-     This is a left-over from the early days of this function where the
+-     other environment variable were not known.
+-
+-     In any case the environment variable should have a value of the
+-     form `LANG[_TERR[.CODESET]]' as explained above.  If no
+-     environment variable is set the `"C"' locale is used which
+-     prevents any translation.
+-
+-     The return value of the function is in any case a valid string.
+-     Either it is a translation from a message catalog or it is the
+-     same as the STRING parameter.  So a piece of code to decide
+-     whether a translation actually happened must look like this:
+-
+-          {
+-            char *trans = catgets (desc, set, msg, input_string);
+-            if (trans == input_string)
+-              {
+-                /* Something went wrong.  */
+-              }
+-          }
+-
+-     When an error occured the global variable ERRNO is set to
+-
+-    EBADF
+-          The catalog does not exist.
+-
+-    ENOMSG
+-          The set/message ttuple does not name an existing element in
+-          the message catalog.
+-
+-     While it sometimes can be useful to test for errors programs
+-     normally will avoid any test.  If the translation is not available
+-     it is no big problem if the original, untranslated message is
+-     printed.  Either the user understands this as well or s/he will
+-     look for the reason why the messages are not translated.
+-
+-   Please note that the currently selected locale does not depend on a
+-call to the `setlocale' function.  It is not necessary that the locale
+-data files for this locale exist and calling `setlocale' succeeds.  The
+-`catopen' function directly reads the values of the environment
+-variables.
+-
+- - Function: char * catgets (nl_catd CATALOG_DESC, int SET, int
+-          MESSAGE, const char *STRING)
+-     The function `catgets' has to be used to access the massage catalog
+-     previously opened using the `catopen' function.  The CATALOG_DESC
+-     parameter must be a value previously returned by `catopen'.
+-
+-     The next two parameters, SET and MESSAGE, reflect the internal
+-     organization of the message catalog files.  This will be explained
+-     in detail below.  For now it is interesting to know that a catalog
+-     can consists of several set and the messages in each thread are
+-     individually numbered using numbers.  Neither the set number nor
+-     the message number must be consecutive.  They can be arbitrarily
+-     chosen.  But each message (unless equal to another one) must have
+-     its own unique pair of set and message number.
+-
+-     Since it is not guaranteed that the message catalog for the
+-     language selected by the user exists the last parameter STRING
+-     helps to handle this case gracefully.  If no matching string can
+-     be found STRING is returned.  This means for the programmer that
+-
+-        * the STRING parameters should contain reasonable text (this
+-          also helps to understand the program seems otherwise there
+-          would be no hint on the string which is expected to be
+-          returned.
+-
+-        * all STRING arguments should be written in the same language.
+-
+-   It is somewhat uncomfortable to write a program using the `catgets'
+-functions if no supporting functionality is available.  Since each
+-set/message number tuple must be unique the programmer must keep lists
+-of the messages at the same time the code is written.  And the work
+-between several people working on the same project must be coordinated.
+-We will see some how these problems can be relaxed a bit (*note Common
+-Usage::.).
+-
+- - Function: int catclose (nl_catd CATALOG_DESC)
+-     The `catclose' function can be used to free the resources
+-     associated with a message catalog which previously was opened by a
+-     call to `catopen'.  If the resources can be successfully freed the
+-     function returns `0'.  Otherwise it return `-1' and the global
+-     variable ERRNO is set.  Errors can occur if the catalog descriptor
+-     CATALOG_DESC is not valid in which case ERRNO is set to `EBADF'.
+-
+-
+-File: libc.info,  Node: The message catalog files,  Next: The gencat program,  Prev: The catgets Functions,  Up: Message catalogs a la X/Open
+-
+-Format of the message catalog files
+------------------------------------
+-
+-   The only reasonable way the translate all the messages of a function
+-and store the result in a message catalog file which can be read by the
+-`catopen' function is to write all the message text to the translator
+-and let her/him translate them all.  I.e., we must have a file with
+-entries which associate the set/message tuple with a specific
+-translation.  This file format is specified in the X/Open standard and
+-is as follows:
+-
+-   * Lines containing only whitespace characters or empty lines are
+-     ignored.
+-
+-   * Lines which contain as the first non-whitespace character a `$'
+-     followed by a whitespace character are comment and are also
+-     ignored.
+-
+-   * If a line contains as the first non-whitespace characters the
+-     sequence `$set' followed by a whitespace character an additional
+-     argument is required to follow.  This argument can either be:
+-
+-        - a number.  In this case the value of this number determines
+-          the set to which the following messages are added.
+-
+-        - an identifier consisting of alphanumeric characters plus the
+-          underscore character.  In this case the set get automatically
+-          a number assigned.  This value is one added to the largest
+-          set number which so far appeared.
+-
+-          How to use the symbolic names is explained in section *Note
+-          Common Usage::.
+-
+-          It is an error if a symbol name appears more than once.  All
+-          following messages are placed in a set with this number.
+-
+-   * If a line contains as the first non-whitespace characters the
+-     sequence `$delset' followed by a whitespace character an
+-     additional argument is required to follow.  This argument can
+-     either be:
+-
+-        - a number.  In this case the value of this number determines
+-          the set which will be deleted.
+-
+-        - an identifier consisting of alphanumeric characters plus the
+-          underscore character.  This symbolic identifier must match a
+-          name for a set which previously was defined.  It is an error
+-          if the name is unknown.
+-
+-     In both cases all messages in the specified set will be removed.
+-     They will not appear in the output.  But if this set is later
+-     again selected with a `$set' command again messages could be added
+-     and these messages will appear in the output.
+-
+-   * If a line contains after leading whitespaces the sequence
+-     `$quote', the quoting character used for this input file is
+-     changed to the first non-whitespace character following the
+-     `$quote'.  If no non-whitespace character is present before the
+-     line ends quoting is disable.
+-
+-     By default no quoting character is used.  In this mode strings are
+-     terminated with the first unescaped line break.  If there is a
+-     `$quote' sequence present newline need not be escaped.  Instead a
+-     string is terminated with the first unescaped appearance of the
+-     quote character.
+-
+-     A common usage of this feature would be to set the quote character
+-     to `"'.  Then any appearance of the `"' in the strings must be
+-     escaped using the backslash (i.e., `\"' must be written).
+-
+-   * Any other line must start with a number or an alphanumeric
+-     identifier (with the underscore character included).  The
+-     following characters (starting at the first non-whitespace
+-     character) will form the string which gets associated with the
+-     currently selected set and the message number represented by the
+-     number and identifier respectively.
+-
+-     If the start of the line is a number the message number is
+-     obvious.  It is an error if the same message number already
+-     appeared for this set.
+-
+-     If the leading token was an identifier the message number gets
+-     automatically assigned.  The value is the current maximum messages
+-     number for this set plus one.  It is an error if the identifier was
+-     already used for a message in this set.  It is ok to reuse the
+-     identifier for a message in another thread.  How to use the
+-     symbolic identifiers will be explained below (*note Common
+-     Usage::.).  There is one limitation with the identifier: it must
+-     not be `Set'.  The reason will be explained below.
+-
+-     Please note that you must use a quoting character if a message
+-     contains leading whitespace.  Since one cannot guarantee this
+-     never happens it is probably a good idea to always use quoting.
+-
+-     The text of the messages can contain escape characters.  The usual
+-     bunch of characters known from the ISO C language are recognized
+-     (`\n', `\t', `\v', `\b', `\r', `\f', `\\', and `\NNN', where NNN
+-     is the octal coding of a character code).
+-
+-   *Important:* The handling of identifiers instead of numbers for the
+-set and messages is a GNU extension.  Systems strictly following the
+-X/Open specification do not have this feature.  An example for a message
+-catalog file is this:
+-
+-     $ This is a leading comment.
+-     $quote "
+-     
+-     $set SetOne
+-     1 Message with ID 1.
+-     two "   Message with ID \"two\", which gets the value 2 assigned"
+-     
+-     $set SetTwo
+-     $ Since the last set got the number 1 assigned this set has number 2.
+-     4000 "The numbers can be arbitrary, they need not start at one."
+-
+-   This small example shows various aspects:
+-   * Lines 1 and 9 are comments since they start with `$' followed by a
+-     whitespace.
+-
+-   * The quoting character is set to `"'.  Otherwise the quotes in the
+-     message definition would have to be left away and in this case the
+-     message with the identifier `two' would loose its leading
+-     whitespace.
+-
+-   * Mixing numbered messages with message having symbolic names is no
+-     problem and the numbering happens automatically.
+-
+-   While this file format is pretty easy it is not the best possible for
+-use in a running program.  The `catopen' function would have to parser
+-the file and handle syntactic errors gracefully.  This is not so easy
+-and the whole process is pretty slow.  Therefore the `catgets'
+-functions expect the data in another more compact and ready-to-use file
+-format.  There is a special program `gencat' which is explained in
+-detail in the next section.
+-
+-   Files in this other format are not human readable.  To be easy to
+-use by programs it is a binary file.  But the format is byte order
+-independent so translation files can be shared by systems of arbitrary
+-architecture (as long as they use the GNU C Library).
+-
+-   Details about the binary file format are not important to know since
+-these files are always created by the `gencat' program.  The sources of
+-the GNU C Library also provide the sources for the `gencat' program and
+-so the interested reader can look through these source files to learn
+-about the file format.
+-
+-
+-File: libc.info,  Node: The gencat program,  Next: Common Usage,  Prev: The message catalog files,  Up: Message catalogs a la X/Open
+-
+-Generate Message Catalogs files
+--------------------------------
+-
+-   The `gencat' program is specified in the X/Open standard and the GNU
+-implementation follows this specification and so allows to process all
+-correctly formed input files.  Additionally some extension are
+-implemented which help to work in a more reasonable way with the
+-`catgets' functions.
+-
+-   The `gencat' program can be invoked in two ways:
+-
+-     `gencat [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]`
+-
+-   This is the interface defined in the X/Open standard.  If no
+-INPUT-FILE parameter is given input will be read from standard input.
+-Multiple input files will be read as if they are concatenated.  If
+-OUTPUT-FILE is also missing, the output will be written to standard
+-output.  To provide the interface one is used from other programs a
+-second interface is provided.
+-
+-     `gencat [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...`
+-
+-   The option `-o' is used to specify the output file and all file
+-arguments are used as input files.
+-
+-   Beside this one can use `-' or `/dev/stdin' for INPUT-FILE to denote
+-the standard input.  Corresponding one can use `-' and `/dev/stdout'
+-for OUTPUT-FILE to denote standard output.  Using `-' as a file name is
+-allowed in X/Open while using the device names is a GNU extension.
+-
+-   The `gencat' program works by concatenating all input files and then
+-*merge* the resulting collection of message sets with a possibly
+-existing output file.  This is done by removing all messages with
+-set/message number tuples matching any of the generated messages from
+-the output file and then adding all the new messages.  To regenerate a
+-catalog file while ignoring the old contents therefore requires to
+-remove the output file if it exists.  If the output is written to
+-standard output no merging takes place.
+-
+-The following table shows the options understood by the `gencat'
+-program.  The X/Open standard does not specify any option for the
+-program so all of these are GNU extensions.
+-
+-`-V'
+-`--version'
+-     Print the version information and exit.
+-
+-`-h'
+-`--help'
+-     Print a usage message listing all available options, then exit
+-     successfully.
+-
+-`--new'
+-     Do never merge the new messages from the input files with the old
+-     content of the output files.  The old content of the output file
+-     is discarded.
+-
+-`-H'
+-`--header=name'
+-     This option is used to emit the symbolic names given to sets and
+-     messages in the input files for use in the program.  Details about
+-     how to use this are given in the next section.  The NAME parameter
+-     to this option specifies the name of the output file.  It will
+-     contain a number of C preprocessor `#define's to associate a name
+-     with a number.
+-
+-     Please note that the generated file only contains the symbols from
+-     the input files.  If the output is merged with the previous
+-     content of the output file the possibly existing symbols from the
+-     file(s) which generated the old output files are not in the
+-     generated header file.
+-
+-
+-File: libc.info,  Node: Common Usage,  Prev: The gencat program,  Up: Message catalogs a la X/Open
+-
+-How to use the `catgets' interface
+-----------------------------------
+-
+-   The `catgets' functions can be used in two different ways.  By
+-following slavishly the X/Open specs and not relying on the extension
+-and by using the GNU extensions.  We will take a look at the former
+-method first to understand the benefits of extensions.
+-
+-Not using symbolic names
+-........................
+-
+-   Since the X/Open format of the message catalog files does not allow
+-symbol names we have to work with numbers all the time.  When we start
+-writing a program we have to replace all appearances of translatable
+-strings with something like
+-
+-     catgets (catdesc, set, msg, "string")
+-
+-CATGETS is retrieved from a call to `catopen' which is normally done
+-once at the program start.  The `"string"' is the string we want to
+-translate.  The problems start with the set and message numbers.
+-
+-   In a bigger program several programmers usually work at the same
+-time on the program and so coordinating the number allocation is
+-crucial.  Though no two different strings must be indexed by the same
+-tuple of numbers it is highly desirable to reuse the numbers for equal
+-strings with equal translations (please note that there might be
+-strings which are equal in one language but have different translations
+-due to difference contexts).
+-
+-   The allocation process can be relaxed a bit by different set numbers
+-for different parts of the program.  So the number of developers who
+-have to coordinate the allocation can be reduced.  But still lists must
+-be keep track of the allocation and errors can easily happen.  These
+-errors cannot be discovered by the compiler or the `catgets' functions.
+-Only the user of the program might see wrong messages printed.  In the
+-worst cases the messages are so irritating that they cannot be
+-recognized as wrong.  Think about the translations for `"true"' and
+-`"false"' being exchanged.  This could result in a disaster.
+-
+-Using symbolic names
+-....................
+-
+-   The problems mentioned in the last section derive from the fact that:
+-
+-  1. the numbers are allocated once and due to the possibly frequent
+-     use of them it is difficult to change a number later.
+-
+-  2. the numbers do not allow to guess anything about the string and
+-     therefore collisions can easily happen.
+-
+-   By constantly using symbolic names and by providing a method which
+-maps the string content to a symbolic name (however this will happen)
+-one can prevent both problems above.  The cost of this is that the
+-programmer has to write a complete message catalog file while s/he is
+-writing the program itself.
+-
+-   This is necessary since the symbolic names must be mapped to numbers
+-before the program sources can be compiled.  In the last section it was
+-described how to generate a header containing the mapping of the names.
+-E.g., for the example message file given in the last section we could
+-call the `gencat' program as follow (assume `ex.msg' contains the
+-sources).
+-
+-     gencat -H ex.h -o ex.cat ex.msg
+-
+-This generates a header file with the following content:
+-
+-     #define SetTwoSet 0x2   /* u.msg:8 */
+-     
+-     #define SetOneSet 0x1   /* u.msg:4 */
+-     #define SetOnetwo 0x2   /* u.msg:6 */
+-
+-   As can be seen the various symbols given in the source file are
+-mangled to generate unique identifiers and these identifiers get numbers
+-assigned.  Reading the source file and knowing about the rules will
+-allow to predict the content of the header file (it is deterministic)
+-but this is not necessary.  The `gencat' program can take care for
+-everything.  All the programmer has to do is to put the generated header
+-file in the dependency list of the source files of her/his project and
+-to add a rules to regenerate the header of any of the input files
+-change.
+-
+-   One word about the symbol mangling.  Every symbol consists of two
+-parts: the name of the message set plus the name of the message or the
+-special string `Set'.  So `SetOnetwo' means this macro can be used to
+-access the translation with identifier `two' in the message set
+-`SetOne'.
+-
+-   The other names denote the names of the message sets.  The special
+-string `Set' is used in the place of the message identifier.
+-
+-   If in the code the second string of the set `SetOne' is used the C
+-code should look like this:
+-
+-     catgets (catdesc, SetOneSet, SetOnetwo,
+-              "   Message with ID \"two\", which gets the value 2 assigned")
+-
+-   Writing the function this way will allow to change the message number
+-and even the set number without requiring any change in the C source
+-code.  (The text of the string is normally not the same; this is only
+-for this example.)
+-
+-How does to this allow to develop
+-.................................
+-
+-   To illustrate the usual way to work with the symbolic version numbers
+-here is a little example.  Assume we want to write the very complex and
+-famous greeting program.  We start by writing the code as usual:
+-
+-     #include <stdio.h>
+-     int
+-     main (void)
+-     {
+-       printf ("Hello, world!\n");
+-       return 0;
+-     }
+-
+-   Now we want to internationalize the message and therefore replace the
+-message with whatever the user wants.
+-
+-     #include <nl_types.h>
+-     #include <stdio.h>
+-     #include "msgnrs.h"
+-     int
+-     main (void)
+-     {
+-       nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE);
+-       printf (catgets (catdesc, SetMainSet, SetMainHello,
+-                        "Hello, world!\n"));
+-       catclose (catdesc);
+-       return 0;
+-     }
+-
+-   We see how the catalog object is opened and the returned descriptor
+-used in the other function calls.  It is not really necessary to check
+-for failure of any of the functions since even in these situations the
+-functions will behave reasonable.  They simply will be return a
+-translation.
+-
+-   What remains unspecified here are the constants `SetMainSet' and
+-`SetMainHello'.  These are the symbolic names describing the message.
+-To get the actual definitions which match the information in the
+-catalog file we have to create the message catalog source file and
+-process it using the `gencat' program.
+-
+-     $ Messages for the famous greeting program.
+-     $quote "
+-     
+-     $set Main
+-     Hello "Hallo, Welt!\n"
+-
+-   Now we can start building the program (assume the message catalog
+-source file is named `hello.msg' and the program source file `hello.c'):
+-
+-     % gencat -H msgnrs.h -o hello.cat hello.msg
+-     % cat msgnrs.h
+-     #define MainSet 0x1     /* hello.msg:4 */
+-     #define MainHello 0x1   /* hello.msg:5 */
+-     % gcc -o hello hello.c -I.
+-     % cp hello.cat /usr/share/locale/de/LC_MESSAGES
+-     % echo $LC_ALL
+-     de
+-     % ./hello
+-     Hallo, Welt!
+-     %
+-
+-   The call of the `gencat' program creates the missing header file
+-`msgnrs.h' as well as the message catalog binary.  The former is used
+-in the compilation of `hello.c' while the later is placed in a
+-directory in which the `catopen' function will try to locate it.
+-Please check the `LC_ALL' environment variable and the default path for
+-`catopen' presented in the description above.
+-
+-
+-File: libc.info,  Node: The Uniforum approach,  Prev: Message catalogs a la X/Open,  Up: Message Translation
+-
+-The Uniforum approach to Message Translation
+-============================================
+-
+-   Sun Microsystems tried to standardize a different approach to message
+-translation in the Uniforum group.  There never was a real standard
+-defined but still the interface was used in Sun's operation systems.
+-Since this approach fits better in the development process of free
+-software it is also used throughout the GNU package and the GNU
+-`gettext' package provides support for this outside the GNU C Library.
+-
+-   The code of the `libintl' from GNU `gettext' is the same as the code
+-in the GNU C Library.  So the documentation in the GNU `gettext' manual
+-is also valid for the functionality here.  The following text will
+-describe the library functions in detail.  But the numerous helper
+-programs are not described in this manual.  Instead people should read
+-the GNU `gettext' manual (*note GNU gettext utilities: (gettext)Top.).
+-We will only give a short overview.
+-
+-   Though the `catgets' functions are available by default on more
+-systems the `gettext' interface is at least as portable as the former.
+-The GNU `gettext' package can be used wherever the functions are not
+-available.
+-
+-* Menu:
+-
+-* Message catalogs with gettext::  The `gettext' family of functions.
+-* Helper programs for gettext::    Programs to handle message catalogs
+-                                    for `gettext'.
+-
+-
+-File: libc.info,  Node: Message catalogs with gettext,  Next: Helper programs for gettext,  Up: The Uniforum approach
+-
+-The `gettext' family of functions
+----------------------------------
+-
+-   The paradigms underlying the `gettext' approach to message
+-translations is different from that of the `catgets' functions the
+-basic functionally is equivalent.  There are functions of the following
+-categories:
+-
+-* Menu:
+-
+-* Translation with gettext::    What has to be done to translate a message.
+-* Locating gettext catalog::    How to determine which catalog to be used.
+-* Using gettextized software::  The possibilities of the user to influence
+-                                 the way `gettext' works.
+-
+-
+-File: libc.info,  Node: Translation with gettext,  Next: Locating gettext catalog,  Up: Message catalogs with gettext
+-
+-What has to be done to translate a message?
+-...........................................
+-
+-   The `gettext' functions have a very simple interface.  The most
+-basic function just takes the string which shall be translated as the
+-argument and it returns the translation.  This is fundamentally
+-different from the `catgets' approach where an extra key is necessary
+-and the original string is only used for the error case.
+-
+-   If the string which has to be translated is the only argument this of
+-course means the string itself is the key.  I.e., the translation will
+-be selected based on the original string.  The message catalogs must
+-therefore contain the original strings plus one translation for any such
+-string.  The task of the `gettext' function is it to compare the
+-argument string with the available strings in the catalog and return the
+-appropriate translation.  Of course this process is optimized so that
+-this process is not more expensive than an access using an atomic key
+-like in `catgets'.
+-
+-   The `gettext' approach has some advantages but also some
+-disadvantages.  Please see the GNU `gettext' manual for a detailed
+-discussion of the pros and cons.
+-
+-   All the definitions and declarations for `gettext' can be found in
+-the `libintl.h' header file.  On systems where these functions are not
+-part of the C library they can be found in a separate library named
+-`libintl.a' (or accordingly different for shared libraries).
+-
+- - Function: char * gettext (const char *MSGID)
+-     The `gettext' function searches the currently selected message
+-     catalogs for a string which is equal to MSGID.  If there is such a
+-     string available it is returned.  Otherwise the argument string
+-     MSGID is returned.
+-
+-     Please note that all though the return value is `char *' the
+-     returned string must not be changed.  This broken type results
+-     from the history of the function and does not reflect the way the
+-     function should be used.
+-
+-     Please note that above we wrote "message catalogs" (plural).  This
+-     is a speciality of the GNU implementation of these functions and
+-     we will say more about this when we talk about the ways message
+-     catalogs are selected (*note Locating gettext catalog::.).
+-
+-     The `gettext' function does not modify the value of the global
+-     ERRNO variable.  This is necessary to make it possible to write
+-     something like
+-
+-            printf (gettext ("Operation failed: %m\n"));
+-
+-     Here the ERRNO value is used in the `printf' function while
+-     processing the `%m' format element and if the `gettext' function
+-     would change this value (it is called before `printf' is called)
+-     we would get a wrong message.
+-
+-     So there is no easy way to detect a missing message catalog beside
+-     comparing the argument string with the result.  But it is normally
+-     the task of the user to react on missing catalogs.  The program
+-     cannot guess when a message catalog is really necessary since for
+-     a user who s peaks the language the program was developed in does
+-     not need any translation.
+-
+-   The remaining two functions to access the message catalog add some
+-functionality to select a message catalog which is not the default one.
+-This is important if parts of the program are developed independently.
+-Every part can have its own message catalog and all of them can be used
+-at the same time.  The C library itself is an example: internally it
+-uses the `gettext' functions but since it must not depend on a
+-currently selected default message catalog it must specify all ambiguous
+-information.
+-
+- - Function: char * dgettext (const char *DOMAINNAME, const char *MSGID)
+-     The `dgettext' functions acts just like the `gettext' function.
+-     It only takes an additional first argument DOMAINNAME which guides
+-     the selection of the message catalogs which are searched for the
+-     translation.  If the DOMAINNAME parameter is the null pointer the
+-     `dgettext' function is exactly equivalent to `gettext' since the
+-     default value for the domain name is used.
+-
+-     As for `gettext' the return value type is `char *' which is an
+-     anachronism.  The returned string must never be modified.
+-
+- - Function: char * dcgettext (const char *DOMAINNAME, const char
+-          *MSGID, int CATEGORY)
+-     The `dcgettext' adds another argument to those which `dgettext'
+-     takes.  This argument CATEGORY specifies the last piece of
+-     information needed to localize the message catalog.  I.e., the
+-     domain name and the locale category exactly specify which message
+-     catalog has to be used (relative to a given directory, see below).
+-
+-     The `dgettext' function can be expressed in terms of `dcgettext'
+-     by using
+-
+-          dcgettext (domain, string, LC_MESSAGES)
+-
+-     instead of
+-
+-          dgettext (domain, string)
+-
+-     This also shows which values are expected for the third parameter.
+-     One has to use the available selectors for the categories
+-     available in `locale.h'.  Normally the available values are
+-     `LC_CTYPE', `LC_COLLATE', `LC_MESSAGES', `LC_MONETARY',
+-     `LC_NUMERIC', and `LC_TIME'.  Please note that `LC_ALL' must not
+-     be used and even though the names might suggest this, there is no
+-     relation to the environments variables of this name.
+-
+-     The `dcgettext' function is only implemented for compatibility with
+-     other systems which have `gettext' functions.  There is not really
+-     any situation where it is necessary (or useful) to use a different
+-     value but `LC_MESSAGES' in for the CATEGORY parameter.  We are
+-     dealing with messages here and any other choice can only be
+-     irritating.
+-
+-     As for `gettext' the return value type is `char *' which is an
+-     anachronism.  The returned string must never be modified.
+-
+-   When using the three functions above in a program it is a frequent
+-case that the MSGID argument is a constant string.  So it is worth to
+-optimize this case.  Thinking shortly about this one will realize that
+-as long as no new message catalog is loaded the translation of a message
+-will not change.  I.e., the algorithm to determine the translation is
+-deterministic.
+-
+-   Exactly this is what the optimizations implemented in the
+-`libintl.h' header will use.  Whenever a program is compiler with the
+-GNU C compiler, optimization is selected and the MSGID argument to
+-`gettext', `dgettext' or `dcgettext' is a constant string the actual
+-function call will only be done the first time the message is used and
+-then always only if any new message catalog was loaded and so the
+-result of the translation lookup might be different.  See the
+-`libintl.h' header file for details.  For the user it is only important
+-to know that the result is always the same, independent of the compiler
+-or compiler options in use.
+-
+-
+-File: libc.info,  Node: Locating gettext catalog,  Next: Using gettextized software,  Prev: Translation with gettext,  Up: Message catalogs with gettext
+-
+-How to determine which catalog to be used
+-.........................................
+-
+-   The functions to retrieve the translations for a given message have a
+-remarkable simple interface.  But to provide the user of the program
+-still the opportunity to select exactly the translation s/he wants and
+-also to provide the programmer the possibility to influence the way to
+-locate the search for catalogs files there is a quite complicated
+-underlying mechanism which controls all this.  The code is complicated
+-the use is easy.
+-
+-   Basically we have two different tasks to perform which can also be
+-performed by the `catgets' functions:
+-
+-  1. Locate the set of message catalogs.  There are a number of files
+-     for different languages and which all belong to the package.
+-     Usually they are all stored in the filesystem below a certain
+-     directory.
+-
+-     There can be arbitrary many packages installed and they can follow
+-     different guidelines for the placement of their files.
+-
+-  2. Relative to the location specified by the package the actual
+-     translation files must be searched, based on the wishes of the
+-     user.  I.e., for each language the user selects the program should
+-     be able to locate the appropriate file.
+-
+-   This is the functionality required by the specifications for
+-`gettext' and this is also what the `catgets' functions are able to do.
+-But there are some problems unresolved:
+-
+-   * The language to be used can be specified in several different ways.
+-     There is no generally accepted standard for this and the user
+-     always expects the program understand what s/he means.  E.g., to
+-     select the German translation one could write `de', `german', or
+-     `deutsch' and the program should always react the same.
+-
+-   * Sometimes the specification of the user is too detailed.  If s/he,
+-     e.g., specifies `de_DE.ISO-8859-1' which means German, spoken in
+-     Germany, coded using the ISO 8859-1 character set there is the
+-     possibility that a message catalog matching this exactly is not
+-     available.  But there could be a catalog matching `de' and if the
+-     character set used on the machine is always ISO 8859-1 there is no
+-     reason why this later message catalog should not be used.  (We
+-     call this "message inheritance".)
+-
+-   * If a catalog for a wanted language is not available it is not
+-     always the second best choice to fall back on the language of the
+-     developer and simply not translate any message.  Instead a user
+-     might be better able to read the messages in another language and
+-     so the user of the program should be able to define an precedence
+-     order of languages.
+-
+-   We can divide the configuration actions in two parts: the one is
+-performed by the programmer, the other by the user.  We will start with
+-the functions the programmer can use since the user configuration will
+-be based on this.
+-
+-   As the functions described in the last sections already mention
+-separate sets of messages can be selected by a "domain name".  This is a
+-simple string which should be unique for each program part with uses a
+-separate domain.  It is possible to use in one program arbitrary many
+-domains at the same time.  E.g., the GNU C Library itself uses a domain
+-named `libc' while the program using the C Library could use a domain
+-named `foo'.  The important point is that at any time exactly one
+-domain is active.  This is controlled with the following function.
+-
+- - Function: char * textdomain (const char *DOMAINNAME)
+-     The `textdomain' function sets the default domain, which is used in
+-     all future `gettext' calls, to DOMAINNAME.  Please note that
+-     `dgettext' and `dcgettext' calls are not influenced if the
+-     DOMAINNAME parameter of these functions is not the null pointer.
+-
+-     Before the first call to `textdomain' the default domain is
+-     `messages'.  This is the name specified in the specification of
+-     the `gettext' API.  This name is as good as any other name.  No
+-     program should ever really use a domain with this name since this
+-     can only lead to problems.
+-
+-     The function returns the value which is from now on taken as the
+-     default domain.  If the system went out of memory the returned
+-     value is `NULL' and the global variable ERRNO is set to `ENOMEM'.
+-     Despite the return value type being `char *' the return string must
+-     not be changed.  It is allocated internally by the `textdomain'
+-     function.
+-
+-     If the DOMAINNAME parameter is the null pointer no new default
+-     domain is set.  Instead the currently selected default domain is
+-     returned.
+-
+-     If the DOMAINNAME parameter is the empty string the default domain
+-     is reset to its initial value, the domain with the name `messages'.
+-     This possibility is questionable to use since the domain `messages'
+-     really never should be used.
+-
+- - Function: char * bindtextdomain (const char *DOMAINNAME, const char
+-          *DIRNAME)
+-     The `bindtextdomain' function can be used to specify the directly
+-     which contains the message catalogs for domain DOMAINNAME for the
+-     different languages.  To be correct, this is the directory where
+-     the hierarchy of directories is expected.  Details are explained
+-     below.
+-
+-     For the programmer it is important to note that the translations
+-     which come with the program have be placed in a directory
+-     hierarchy starting at, say, `/foo/bar'.  Then the program should
+-     make a `bindtextdomain' call to bind the domain for the current
+-     program to this directory.  So it is made sure the catalogs are
+-     found.  A correctly running program does not depend on the user
+-     setting an environment variable.
+-
+-     The `bindtextdomain' function can be used several times and if the
+-     DOMAINNAME argument is different the previously bounded domains
+-     will not be overwritten.
+-
+-     If the program which wish to use `bindtextdomain' at some point of
+-     time use the `chdir' function to change the current working
+-     directory it is important that the DIRNAME strings ought to be an
+-     absolute pathname.  Otherwise the addressed directory might vary
+-     with the time.
+-
+-     If the DIRNAME parameter is the null pointer `bindtextdomain'
+-     returns the currently selected directory for the domain with the
+-     name DOMAINNAME.
+-
+-     the `bindtextdomain' function returns a pointer to a string
+-     containing the name of the selected directory name.  The string is
+-     allocated internally in the function and must not be changed by the
+-     user.  If the system went out of core during the execution of
+-     `bindtextdomain' the return value is `NULL' and the global
+-     variable ERRNO is set accordingly.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-12 glibc-2.1.3/manual/libc.info-12
+--- ../glibc-2.1.3/manual/libc.info-12	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-12	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1187 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Using gettextized software,  Prev: Locating gettext catalog,  Up: Message catalogs with gettext
+-
+-User influence on `gettext'
+-...........................
+-
+-   The last sections described what the programmer can do to
+-internationalize the messages of the program.  But it is finally up to
+-the user to select the message s/he wants to see.  S/He must understand
+-them.
+-
+-   The POSIX locale model uses the environment variables `LC_COLLATE',
+-`LC_CTYPE', `LC_MESSAGES', `LC_MONETARY', `NUMERIC', and `LC_TIME' to
+-select the locale which is to be used.  This way the user can influence
+-lots of functions.  As we mentioned above the `gettext' functions also
+-take advantage of this.
+-
+-   To understand how this happens it is necessary to take a look at the
+-various components of the filename which gets computed to locate a
+-message catalog.  It is composed as follows:
+-
+-     DIR_NAME/LOCALE/LC_CATEGORY/DOMAIN_NAME.mo
+-
+-   The default value for DIR_NAME is system specific.  It is computed
+-from the value given as the prefix while configuring the C library.
+-This value normally is `/usr' or `/'.  For the former the complete
+-DIR_NAME is:
+-
+-     /usr/share/locale
+-
+-   We can use `/usr/share' since the `.mo' files containing the message
+-catalogs are system independent, all systems can use the same files.
+-If the program executed the `bindtextdomain' function for the message
+-domain that is currently handled the `dir_name' component is the
+-exactly the value which was given to the function as the second
+-parameter.  I.e., `bindtextdomain' allows to overwrite the only system
+-dependent and fixed value to make it possible to address file
+-everywhere in the filesystem.
+-
+-   The CATEGORY is the name of the locale category which was selected
+-in the program code.  For `gettext' and `dgettext' this is always
+-`LC_MESSAGES', for `dcgettext' this is selected by the value of the
+-third parameter.  As said above it should be avoided to ever use a
+-category other than `LC_MESSAGES'.
+-
+-   The LOCALE component is computed based on the category used.  Just
+-like for the `setlocale' function here comes the user selection into
+-the play.  Some environment variables are examined in a fixed order and
+-the first environment variable set determines the return value of the
+-lookup process.  In detail, for the category `LC_xxx' the following
+-variables in this order are examined:
+-
+-`LANGUAGE'
+-
+-`LC_ALL'
+-
+-`LC_xxx'
+-
+-`LANG'
+-   This looks very familiar.  With the exception of the `LANGUAGE'
+-environment variable this is exactly the lookup order the `setlocale'
+-function uses.  But why introducing the `LANGUAGE' variable?
+-
+-   The reason is that the syntax of the values these variables can have
+-is different to what is expected by the `setlocale' function.  If we
+-would set `LC_ALL' to a value following the extended syntax that would
+-mean the `setlocale' function will never be able to use the value of
+-this variable as well.  An additional variable removes this problem
+-plus we can select the language independently of the locale setting
+-which sometimes is useful.
+-
+-   While for the `LC_xxx' variables the value should consist of exactly
+-one specification of a locale the `LANGUAGE' variable's value can
+-consist of a colon separated list of locale names.  The attentive
+-reader will realize that this is the way we manage to implement one of
+-our additional demands above: we want to be able to specify an ordered
+-list of language.
+-
+-   Back to the constructed filename we have only one component missing.
+-The DOMAIN_NAME part is the name which was either registered using the
+-`textdomain' function or which was given to `dgettext' or `dcgettext'
+-as the first parameter.  Now it becomes obvious that a good choice for
+-the domain name in the program code is a string which is closely
+-related to the program/package name.  E.g., for the GNU C Library the
+-domain name is `libc'.
+-
+-A limit piece of example code should show how the programmer is supposed
+-to work:
+-
+-     {
+-       textdomain ("test-package");
+-       bindtextdomain ("test-package", "/usr/local/share/locale");
+-       puts (gettext ("Hello, world!");
+-     }
+-
+-   At the program start the default domain is `messages'.  The
+-`textdomain' call changes this to `test-package'.  The `bindtextdomain'
+-call specifies that the message catalogs for the domain `test-package'
+-can be found below the directory `/usr/local/share/locale'.
+-
+-   If now the user set in her/his environment the variable `LANGUAGE'
+-to `de' the `gettext' function will try to use the translations from
+-the file
+-
+-     /usr/local/share/locale/de/LC_MESSAGES/test-package.mo
+-
+-   From the above descriptions it should be clear which component of
+-this filename is determined by which source.
+-
+-   In the above example we assumed that the `LANGUAGE' environment
+-variable to `de'.  This might be an appropriate selection but what
+-happens if the user wants to use `LC_ALL' because of the wider
+-usability and here the required value is `de_DE.ISO-8859-1'?  We
+-already mentioned above that a situation like this is not infrequent.
+-E.g., a person might prefer reading a dialect and if this is not
+-available fall back on the standard language.
+-
+-   The `gettext' functions know about situations like this and can
+-handle them gracefully.  The functions recognize the format of the value
+-of the environment variable.  It can split the value is different pieces
+-and by leaving out the only or the other part it can construct new
+-values.  This happens of course in a predictable way.  To understand
+-this one must know the format of the environment variable value.  There
+-are to more or less standardized forms:
+-
+-*X/Open Format*
+-     `language[_territory[.codeset]][@modifier]'
+-
+-*CEN Format (European Community Standard)*
+-     `language[_territory][+audience][+special][,[sponsor][_revision]]'
+-
+-   The functions will automatically recognize which format is used.
+-Less specific locale names will be stripped of in the order of the
+-following list:
+-
+-  1. `revision'
+-
+-  2. `sponsor'
+-
+-  3. `special'
+-
+-  4. `codeset'
+-
+-  5. `normalized codeset'
+-
+-  6. `territory'
+-
+-  7. `audience'/`modifier'
+-
+-   From the last entry one can see that the meaning of the `modifier'
+-field in the X/Open format and the `audience' format have the same
+-meaning.  Beside one can see that the `language' field for obvious
+-reasons never will be dropped.
+-
+-   The only new thing is the `normalized codeset' entry.  This is
+-another goodie which is introduced to help reducing the chaos which
+-derives from the inability of the people to standardize the names of
+-character sets.  Instead of ISO-8859-1 one can often see 8859-1, 88591,
+-iso8859-1, or iso_8859-1.  The `normalized codeset' value is generated
+-from the user-provided character set name by applying the following
+-rules:
+-
+-  1. Remove all characters beside numbers and letters.
+-
+-  2. Fold letters to lowercase.
+-
+-  3. If the same only contains digits prepend the string `"iso"'.
+-
+-So all of the above name will be normalized to `iso88591'.  This allows
+-the program user much more freely choosing the locale name.
+-
+-   Even this extended functionality still does not help to solve the
+-problem that completely different names can be used to denote the same
+-locale (e.g., `de' and `german').  To be of help in this situation the
+-locale implementation and also the `gettext' functions know about
+-aliases.
+-
+-   The file `/usr/share/locale/locale.alias' (replace `/usr' with
+-whatever prefix you used for configuring the C library) contains a
+-mapping of alternative names to more regular names.  The system manager
+-is free to add new entries to fill her/his own needs.  The selected
+-locale from the environment is compared with the entries in the first
+-column of this file ignoring the case.  If they match the value of the
+-second column is used instead for the further handling.
+-
+-   In the description of the format of the environment variables we
+-already mentioned the character set as a factor in the selection of the
+-message catalog.  In fact, only catalogs which contain text written
+-using the character set of the system/program can be used (directly;
+-there will come a solution for this some day).  This means for the user
+-that s/he will always have to take care for this.  If in the collection
+-of the message catalogs there are files for the same language but coded
+-using different character sets the user has to be careful.
+-
+-
+-File: libc.info,  Node: Helper programs for gettext,  Prev: Message catalogs with gettext,  Up: The Uniforum approach
+-
+-Programs to handle message catalogs for `gettext'
+--------------------------------------------------
+-
+-   The GNU C Library does not contain the source code for the programs
+-to handle message catalogs for the `gettext' functions.  As part of the
+-GNU project the GNU gettext package contains everything the developer
+-needs.  The functionality provided by the tools in this package by far
+-exceeds the abilities of the `gencat' program described above for the
+-`catgets' functions.
+-
+-   There is a program `msgfmt' which is the equivalent program to the
+-`gencat' program.  It generates from the human-readable and -editable
+-form of the message catalog a binary file which can be used by the
+-`gettext' functions.  But there are several more programs available.
+-
+-   The `xgettext' program can be used to automatically extract the
+-translatable messages from a source file.  I.e., the programmer need not
+-take care for the translations and the list of messages which have to be
+-translated.  S/He will simply wrap the translatable string in calls to
+-`gettext' et.al and the rest will be done by `xgettext'.  This program
+-has a lot of option which help to customize the output or do help to
+-understand the input better.
+-
+-   Other programs help to manage development cycle when new messages
+-appear in the source files or when a new translation of the messages
+-appear.  here it should only be noted that using all the tools in GNU
+-gettext it is possible to *completely* automize the handling of message
+-catalog.  Beside marking the translatable string in the source code and
+-generating the translations the developers do not have anything to do
+-themself.
+-
+-
+-File: libc.info,  Node: Searching and Sorting,  Next: Pattern Matching,  Prev: Message Translation,  Up: Top
+-
+-Searching and Sorting
+-*********************
+-
+-   This chapter describes functions for searching and sorting arrays of
+-arbitrary objects.  You pass the appropriate comparison function to be
+-applied as an argument, along with the size of the objects in the array
+-and the total number of elements.
+-
+-* Menu:
+-
+-* Comparison Functions::        Defining how to compare two objects.
+-				 Since the sort and search facilities
+-                                 are general, you have to specify the
+-                                 ordering.
+-* Array Search Function::       The `bsearch' function.
+-* Array Sort Function::         The `qsort' function.
+-* Search/Sort Example::         An example program.
+-* Hash Search Function::        The `hsearch' function.
+-* Tree Search Function::        The `tsearch' function.
+-
+-
+-File: libc.info,  Node: Comparison Functions,  Next: Array Search Function,  Up: Searching and Sorting
+-
+-Defining the Comparison Function
+-================================
+-
+-   In order to use the sorted array library functions, you have to
+-describe how to compare the elements of the array.
+-
+-   To do this, you supply a comparison function to compare two elements
+-of the array.  The library will call this function, passing as arguments
+-pointers to two array elements to be compared.  Your comparison function
+-should return a value the way `strcmp' (*note String/Array
+-Comparison::.) does: negative if the first argument is "less" than the
+-second, zero if they are "equal", and positive if the first argument is
+-"greater".
+-
+-   Here is an example of a comparison function which works with an
+-array of numbers of type `double':
+-
+-     int
+-     compare_doubles (const void *a, const void *b)
+-     {
+-       const double *da = (const double *) a;
+-       const double *db = (const double *) b;
+-     
+-       return (*da > *db) - (*da < *db);
+-     }
+-
+-   The header file `stdlib.h' defines a name for the data type of
+-comparison functions.  This type is a GNU extension.
+-
+-     int comparison_fn_t (const void *, const void *);
+-
+-
+-File: libc.info,  Node: Array Search Function,  Next: Array Sort Function,  Prev: Comparison Functions,  Up: Searching and Sorting
+-
+-Array Search Function
+-=====================
+-
+-   Generally searching for a specific element in an array means that
+-potentially all elements must be checked.  The GNU C library contains
+-functions to perform linear search.  The prototypes for the following
+-two functions can be found in `search.h'.
+-
+- - Function: void * lfind (const void *KEY, void *BASE, size_t *NMEMB,
+-          size_t SIZE, comparison_fn_t COMPAR)
+-     The `lfind' function searches in the array with `*NMEMB' elements
+-     of SIZE bytes pointed to by BASE for an element which matches the
+-     one pointed to by KEY.  The function pointed to by COMPAR is used
+-     decide whether two elements match.
+-
+-     The return value is a pointer to the matching element in the array
+-     starting at BASE if it is found.  If no matching element is
+-     available `NULL' is returned.
+-
+-     The mean runtime of this function is `*NMEMB'/2.  This function
+-     should only be used elements often get added to or deleted from
+-     the array in which case it might not be useful to sort the array
+-     before searching.
+-
+- - Function: void * lsearch (const void *KEY, void *BASE, size_t
+-          *NMEMB, size_t SIZE, comparison_fn_t COMPAR)
+-     The `lsearch' function is similar to the `lfind' function.  It
+-     searches the given array for an element and returns it if found.
+-     The difference is that if no matching element is found the
+-     `lsearch' function adds the object pointed to by KEY (with a size
+-     of SIZE bytes) at the end of the array and it increments the value
+-     of `*NMEMB' to reflect this addition.
+-
+-     This means for the caller that if it is not sure that the array
+-     contains the element one is searching for the memory allocated for
+-     the array starting at BASE must have room for at least SIZE more
+-     bytes.  If one is sure the element is in the array it is better to
+-     use `lfind' so having more room in the array is always necessary
+-     when calling `lsearch'.
+-
+-   To search a sorted array for an element matching the key, use the
+-`bsearch' function.  The prototype for this function is in the header
+-file `stdlib.h'.
+-
+- - Function: void * bsearch (const void *KEY, const void *ARRAY, size_t
+-          COUNT, size_t SIZE, comparison_fn_t COMPARE)
+-     The `bsearch' function searches the sorted array ARRAY for an
+-     object that is equivalent to KEY.  The array contains COUNT
+-     elements, each of which is of size SIZE bytes.
+-
+-     The COMPARE function is used to perform the comparison.  This
+-     function is called with two pointer arguments and should return an
+-     integer less than, equal to, or greater than zero corresponding to
+-     whether its first argument is considered less than, equal to, or
+-     greater than its second argument.  The elements of the ARRAY must
+-     already be sorted in ascending order according to this comparison
+-     function.
+-
+-     The return value is a pointer to the matching array element, or a
+-     null pointer if no match is found.  If the array contains more
+-     than one element that matches, the one that is returned is
+-     unspecified.
+-
+-     This function derives its name from the fact that it is implemented
+-     using the binary search algorithm.
+-
+-
+-File: libc.info,  Node: Array Sort Function,  Next: Search/Sort Example,  Prev: Array Search Function,  Up: Searching and Sorting
+-
+-Array Sort Function
+-===================
+-
+-   To sort an array using an arbitrary comparison function, use the
+-`qsort' function.  The prototype for this function is in `stdlib.h'.
+-
+- - Function: void qsort (void *ARRAY, size_t COUNT, size_t SIZE,
+-          comparison_fn_t COMPARE)
+-     The QSORT function sorts the array ARRAY.  The array contains
+-     COUNT elements, each of which is of size SIZE.
+-
+-     The COMPARE function is used to perform the comparison on the
+-     array elements.  This function is called with two pointer
+-     arguments and should return an integer less than, equal to, or
+-     greater than zero corresponding to whether its first argument is
+-     considered less than, equal to, or greater than its second
+-     argument.
+-
+-     *Warning:* If two objects compare as equal, their order after
+-     sorting is unpredictable.  That is to say, the sorting is not
+-     stable.  This can make a difference when the comparison considers
+-     only part of the elements.  Two elements with the same sort key
+-     may differ in other respects.
+-
+-     If you want the effect of a stable sort, you can get this result by
+-     writing the comparison function so that, lacking other reason
+-     distinguish between two elements, it compares them by their
+-     addresses.  Note that doing this may make the sorting algorithm
+-     less efficient, so do it only if necessary.
+-
+-     Here is a simple example of sorting an array of doubles in
+-     numerical order, using the comparison function defined above
+-     (*note Comparison Functions::.):
+-
+-          {
+-            double *array;
+-            int size;
+-            ...
+-            qsort (array, size, sizeof (double), compare_doubles);
+-          }
+-
+-     The `qsort' function derives its name from the fact that it was
+-     originally implemented using the "quick sort" algorithm.
+-
+-
+-File: libc.info,  Node: Search/Sort Example,  Next: Hash Search Function,  Prev: Array Sort Function,  Up: Searching and Sorting
+-
+-Searching and Sorting Example
+-=============================
+-
+-   Here is an example showing the use of `qsort' and `bsearch' with an
+-array of structures.  The objects in the array are sorted by comparing
+-their `name' fields with the `strcmp' function.  Then, we can look up
+-individual objects based on their names.
+-
+-     #include <stdlib.h>
+-     #include <stdio.h>
+-     #include <string.h>
+-     
+-     /* Define an array of critters to sort. */
+-     
+-     struct critter
+-       {
+-         const char *name;
+-         const char *species;
+-       };
+-     
+-     struct critter muppets[] =
+-       {
+-         {"Kermit", "frog"},
+-         {"Piggy", "pig"},
+-         {"Gonzo", "whatever"},
+-         {"Fozzie", "bear"},
+-         {"Sam", "eagle"},
+-         {"Robin", "frog"},
+-         {"Animal", "animal"},
+-         {"Camilla", "chicken"},
+-         {"Sweetums", "monster"},
+-         {"Dr. Strangepork", "pig"},
+-         {"Link Hogthrob", "pig"},
+-         {"Zoot", "human"},
+-         {"Dr. Bunsen Honeydew", "human"},
+-         {"Beaker", "human"},
+-         {"Swedish Chef", "human"}
+-       };
+-     
+-     int count = sizeof (muppets) / sizeof (struct critter);
+-     
+-     
+-     
+-     /* This is the comparison function used for sorting and searching. */
+-     
+-     int
+-     critter_cmp (const struct critter *c1, const struct critter *c2)
+-     {
+-       return strcmp (c1->name, c2->name);
+-     }
+-     
+-     
+-     /* Print information about a critter. */
+-     
+-     void
+-     print_critter (const struct critter *c)
+-     {
+-       printf ("%s, the %s\n", c->name, c->species);
+-     }
+-     /* Do the lookup into the sorted array. */
+-     
+-     void
+-     find_critter (const char *name)
+-     {
+-       struct critter target, *result;
+-       target.name = name;
+-       result = bsearch (&target, muppets, count, sizeof (struct critter),
+-                         critter_cmp);
+-       if (result)
+-         print_critter (result);
+-       else
+-         printf ("Couldn't find %s.\n", name);
+-     }
+-     
+-     /* Main program. */
+-     
+-     int
+-     main (void)
+-     {
+-       int i;
+-     
+-       for (i = 0; i < count; i++)
+-         print_critter (&muppets[i]);
+-       printf ("\n");
+-     
+-       qsort (muppets, count, sizeof (struct critter), critter_cmp);
+-     
+-       for (i = 0; i < count; i++)
+-         print_critter (&muppets[i]);
+-       printf ("\n");
+-     
+-       find_critter ("Kermit");
+-       find_critter ("Gonzo");
+-       find_critter ("Janice");
+-     
+-       return 0;
+-     }
+-
+-   The output from this program looks like:
+-
+-     Kermit, the frog
+-     Piggy, the pig
+-     Gonzo, the whatever
+-     Fozzie, the bear
+-     Sam, the eagle
+-     Robin, the frog
+-     Animal, the animal
+-     Camilla, the chicken
+-     Sweetums, the monster
+-     Dr. Strangepork, the pig
+-     Link Hogthrob, the pig
+-     Zoot, the human
+-     Dr. Bunsen Honeydew, the human
+-     Beaker, the human
+-     Swedish Chef, the human
+-     
+-     Animal, the animal
+-     Beaker, the human
+-     Camilla, the chicken
+-     Dr. Bunsen Honeydew, the human
+-     Dr. Strangepork, the pig
+-     Fozzie, the bear
+-     Gonzo, the whatever
+-     Kermit, the frog
+-     Link Hogthrob, the pig
+-     Piggy, the pig
+-     Robin, the frog
+-     Sam, the eagle
+-     Swedish Chef, the human
+-     Sweetums, the monster
+-     Zoot, the human
+-     
+-     Kermit, the frog
+-     Gonzo, the whatever
+-     Couldn't find Janice.
+-
+-
+-File: libc.info,  Node: Hash Search Function,  Next: Tree Search Function,  Prev: Search/Sort Example,  Up: Searching and Sorting
+-
+-The `hsearch' function.
+-=======================
+-
+-   The functions mentioned so far in this chapter are searching in a
+-sorted or unsorted array.  There are other methods to organize
+-information which later should be searched.  The costs of insert,
+-delete and search differ.  One possible implementation is using hashing
+-tables.
+-
+- - Function: int hcreate (size_t NEL)
+-     The `hcreate' function creates a hashing table which can contain at
+-     least NEL elements.  There is no possibility to grow this table so
+-     it is necessary to choose the value for NEL wisely.  The used
+-     methods to implement this function might make it necessary to make
+-     the number of elements in the hashing table larger than the
+-     expected maximal number of elements.  Hashing tables usually work
+-     inefficient if they are filled 80% or more.  The constant access
+-     time guaranteed by hashing can only be achieved if few collisions
+-     exist.  See Knuth's "The Art of Computer Programming, Part 3:
+-     Searching and Sorting" for more information.
+-
+-     The weakest aspect of this function is that there can be at most
+-     one hashing table used through the whole program.  The table is
+-     allocated in local memory out of control of the programmer.  As an
+-     extension the GNU C library provides an additional set of
+-     functions with an reentrant interface which provide a similar
+-     interface but which allow to keep arbitrary many hashing tables.
+-
+-     It is possible to use more than one hashing table in the program
+-     run if the former table is first destroyed by a call to `hdestroy'.
+-
+-     The function returns a non-zero value if successful.  If it return
+-     zero something went wrong.  This could either mean there is
+-     already a hashing table in use or the program runs out of memory.
+-
+- - Function: void hdestroy (void)
+-     The `hdestroy' function can be used to free all the resources
+-     allocated in a previous call of `hcreate'.  After a call to this
+-     function it is again possible to call `hcreate' and allocate a new
+-     table with possibly different size.
+-
+-     It is important to remember that the elements contained in the
+-     hashing table at the time `hdestroy' is called are *not* freed by
+-     this function.  It is the responsibility of the program code to
+-     free those strings (if necessary at all).  Freeing all the element
+-     memory is not possible without extra, separately kept information
+-     since there is no function to iterate through all available
+-     elements in the hashing table.  If it is really necessary to free
+-     a table and all elements the programmer has to keep a list of all
+-     table elements and before calling `hdestroy' s/he has to free all
+-     element's data using this list.  This is a very unpleasant
+-     mechanism and it also shows that this kind of hashing tables is
+-     mainly meant for tables which are created once and used until the
+-     end of the program run.
+-
+-   Entries of the hashing table and keys for the search are defined
+-using this type:
+-
+- - Data type: struct ENTRY
+-     Both elements of this structure are pointers to zero-terminated
+-     strings.  This is a limiting restriction of the functionality of
+-     the `hsearch' functions.  They can only be used for data sets
+-     which use the NUL character always and solely to terminate the
+-     records.  It is not possible to handle general binary data.
+-
+-    `char *key'
+-          Pointer to a zero-terminated string of characters describing
+-          the key for the search or the element in the hashing table.
+-
+-    `char *data'
+-          Pointer to a zero-terminated string of characters describing
+-          the data.  If the functions will be called only for searching
+-          an existing entry this element might stay undefined since it
+-          is not used.
+-
+- - Function: ENTRY * hsearch (ENTRY ITEM, ACTION ACTION)
+-     To search in a hashing table created using `hcreate' the `hsearch'
+-     function must be used.  This function can perform simple search
+-     for an element (if ACTION has the `FIND') or it can alternatively
+-     insert the key element into the hashing table, possibly replacing
+-     a previous value (if ACTION is `ENTER').
+-
+-     The key is denoted by a pointer to an object of type `ENTRY'.  For
+-     locating the corresponding position in the hashing table only the
+-     `key' element of the structure is used.
+-
+-     The return value depends on the ACTION parameter value.  If it is
+-     `FIND' the value is a pointer to the matching element in the
+-     hashing table or `NULL' if no matching element exists.  If ACTION
+-     is `ENTER' the return value is only `NULL' if the programs runs
+-     out of memory while adding the new element to the table.
+-     Otherwise the return value is a pointer to the element in the
+-     hashing table which contains newly added element based on the data
+-     in KEY.
+-
+-   As mentioned before the hashing table used by the functions
+-described so far is global and there can be at any time at most one
+-hashing table in the program.  A solution is to use the following
+-functions which are a GNU extension.  All have in common that they
+-operate on a hashing table which is described by the content of an
+-object of the type `struct hsearch_data'.  This type should be treated
+-as opaque, none of its members should be changed directly.
+-
+- - Function: int hcreate_r (size_t NEL, struct hsearch_data *HTAB)
+-     The `hcreate_r' function initializes the object pointed to by HTAB
+-     to contain a hashing table with at least NEL elements.  So this
+-     function is equivalent to the `hcreate' function except that the
+-     initialized data structure is controlled by the user.
+-
+-     This allows to have more than once hashing table at one time.  The
+-     memory necessary for the `struct hsearch_data' object can be
+-     allocated dynamically.
+-
+-     The return value is non-zero if the operation were successful.  if
+-     the return value is zero something went wrong which probably means
+-     the programs runs out of memory.
+-
+- - Function: void hdestroy_r (struct hsearch_data *HTAB)
+-     The `hdestroy_r' function frees all resources allocated by the
+-     `hcreate_r' function for this very same object HTAB.  As for
+-     `hdestroy' it is the programs responsibility to free the strings
+-     for the elements of the table.
+-
+- - Function: int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL,
+-          struct hsearch_data *HTAB)
+-     The `hsearch_r' function is equivalent to `hsearch'.  The meaning
+-     of the first two arguments is identical.  But instead of operating
+-     on a single global hashing table the function works on the table
+-     described by the object pointed to by HTAB (which is initialized
+-     by a call to `hcreate_r').
+-
+-     Another difference to `hcreate' is that the pointer to the found
+-     entry in the table is not the return value of the functions.  It is
+-     returned by storing it in a pointer variables pointed to by the
+-     RETVAL parameter.  The return value of the function is an integer
+-     value indicating success if it is non-zero and failure if it is
+-     zero.  In the later case the global variable ERRNO signals the
+-     reason for the failure.
+-
+-    `ENOMEM'
+-          The table is filled and `hsearch_r' was called with an so far
+-          unknown key and ACTION set to `ENTER'.
+-
+-    `ESRCH'
+-          The ACTION parameter is `FIND' and no corresponding element
+-          is found in the table.
+-
+-
+-File: libc.info,  Node: Tree Search Function,  Prev: Hash Search Function,  Up: Searching and Sorting
+-
+-The `tsearch' function.
+-=======================
+-
+-   Another common form to organize data for efficient search is to use
+-trees.  The `tsearch' function family provides a nice interface to
+-functions to organize possibly large amounts of data by providing a mean
+-access time proportional to the logarithm of the number of elements.
+-The GNU C library implementation even guarantees that this bound is
+-never exceeded even for input data which cause problems for simple
+-binary tree implementations.
+-
+-   The functions described in the chapter are all described in the
+-System V and X/Open specifications and are therefore quite portable.
+-
+-   In contrast to the `hsearch' functions the `tsearch' functions can
+-be used with arbitrary data and not only zero-terminated strings.
+-
+-   The `tsearch' functions have the advantage that no function to
+-initialize data structures is necessary.  A simple pointer of type
+-`void *' initialized to `NULL' is a valid tree and can be extended or
+-searched.
+-
+- - Function: void * tsearch (const void *KEY, void **ROOTP,
+-          comparison_fn_t COMPAR)
+-     The `tsearch' function searches in the tree pointed to by `*ROOTP'
+-     for an element matching KEY.  The function pointed to by COMPAR is
+-     used to determine whether two elements match.  *Note Comparison
+-     Functions::, for a specification of the functions which can be
+-     used for the COMPAR parameter.
+-
+-     If the tree does not contain a matching entry the KEY value will
+-     be added to the tree.  `tsearch' does not make a copy of the object
+-     pointed to by KEY (how could it since the size is unknown).
+-     Instead it adds a reference to this object which means the object
+-     must be available as long as the tree data structure is used.
+-
+-     The tree is represented by a pointer to a pointer since it is
+-     sometimes necessary to change the root node of the tree.  So it
+-     must not be assumed that the variable pointed to by ROOTP has the
+-     same value after the call.  This also shows that it is not safe to
+-     call the `tsearch' function more than once at the same time using
+-     the same tree.  It is no problem to run it more than once at a
+-     time on different trees.
+-
+-     The return value is a pointer to the matching element in the tree.
+-     If a new element was created the pointer points to the new data
+-     (which is in fact KEY).  If an entry had to be created and the
+-     program ran out of space `NULL' is returned.
+-
+- - Function: void * tfind (const void *KEY, void *const *ROOTP,
+-          comparison_fn_t COMPAR)
+-     The `tfind' function is similar to the `tsearch' function.  It
+-     locates an element matching the one pointed to by KEY and returns
+-     a pointer to this element.  But if no matching element is
+-     available no new element is entered (note that the ROOTP parameter
+-     points to a constant pointer).  Instead the function returns
+-     `NULL'.
+-
+-   Another advantage of the `tsearch' function in contrast to the
+-`hsearch' functions is that there is an easy way to remove elements.
+-
+- - Function: void * tdelete (const void *KEY, void **ROOTP,
+-          comparison_fn_t COMPAR)
+-     To remove a specific element matching KEY from the tree `tdelete'
+-     can be used.  It locates the matching element using the same
+-     method as `tfind'.  The corresponding element is then removed and
+-     the data if this tree node is returned by the function.  If there
+-     is no matching entry in the tree nothing can be deleted and the
+-     function returns `NULL'.
+-
+- - Function: void tdestroy (void *VROOT, __free_fn_t FREEFCT)
+-     If the complete search tree has to be removed one can use
+-     `tdestroy'.  It frees all resources allocated by the `tsearch'
+-     function to generate the tree pointed to by VROOT.
+-
+-     For the data in each tree node the function FREEFCT is called.
+-     The pointer to the data is passed as the argument to the function.
+-     If no such work is necessary FREEFCT must point to a function
+-     doing nothing.  It is called in any case.
+-
+-     This function is a GNU extension and not covered by the System V or
+-     X/Open specifications.
+-
+-   In addition to the function to create and destroy the tree data
+-structure there is another function which allows to apply a function on
+-all elements of the tree.  The function must have this type:
+-
+-     void __action_fn_t (const void *nodep, VISIT value, int level);
+-
+-   The NODEP is the data value of the current node (once given as the
+-KEY argument to `tsearch').  LEVEL is a numeric value which corresponds
+-to the depth of the current node in the tree.  The root node has the
+-depth 0 and its children have a depth of 1 and so on.  The `VISIT' type
+-is an enumeration type.
+-
+- - Data Type: VISIT
+-     The `VISIT' value indicates the status of the current node in the
+-     tree and how the function is called.  The status of a node is
+-     either `leaf' or `internal node'.  For each leaf node the function
+-     is called exactly once, for each internal node it is called three
+-     times: before the first child is processed, after the first child
+-     is processed and after both children are processed.  This makes it
+-     possible to handle all three methods of tree traversal (or even a
+-     combination of them).
+-
+-    `preorder'
+-          The current node is an internal node and the function is
+-          called before the first child was processed.
+-
+-    `endorder'
+-          The current node is an internal node and the function is
+-          called after the first child was processed.
+-
+-    `postorder'
+-          The current node is an internal node and the function is
+-          called after the second child was processed.
+-
+-    `leaf'
+-          The current node is a leaf.
+-
+- - Function: void twalk (const void *ROOT, __action_fn_t ACTION)
+-     For each node in the tree with a node pointed to by ROOT the
+-     `twalk' function calls the function provided by the parameter
+-     ACTION.  For leaf nodes the function is called exactly once with
+-     VALUE set to `leaf'.  For internal nodes the function is called
+-     three times, setting the VALUE parameter or ACTION to the
+-     appropriate value.  The LEVEL argument for the ACTION function is
+-     computed while descending the tree with increasing the value by
+-     one for the descend to a child, starting with the value 0 for the
+-     root node.
+-
+-     Since the functions used for the ACTION parameter to `twalk' must
+-     not modify the tree data it is safe to run `twalk' is more than
+-     one thread at the same time working on the same tree.  It is also
+-     safe to call `tfind' in parallel.  Functions which modify the tree
+-     must not be used.  Otherwise the behaviour is undefined.
+-
+-
+-File: libc.info,  Node: Pattern Matching,  Next: I/O Overview,  Prev: Searching and Sorting,  Up: Top
+-
+-Pattern Matching
+-****************
+-
+-   The GNU C Library provides pattern matching facilities for two kinds
+-of patterns: regular expressions and file-name wildcards.  The library
+-also provides a facility for expanding variable and command references
+-and parsing text into words in the way the shell does.
+-
+-* Menu:
+-
+-* Wildcard Matching::    Matching a wildcard pattern against a single string.
+-* Globbing::             Finding the files that match a wildcard pattern.
+-* Regular Expressions::  Matching regular expressions against strings.
+-* Word Expansion::       Expanding shell variables, nested commands,
+-			    arithmetic, and wildcards.
+-			    This is what the shell does with shell commands.
+-
+-
+-File: libc.info,  Node: Wildcard Matching,  Next: Globbing,  Up: Pattern Matching
+-
+-Wildcard Matching
+-=================
+-
+-   This section describes how to match a wildcard pattern against a
+-particular string.  The result is a yes or no answer: does the string
+-fit the pattern or not.  The symbols described here are all declared in
+-`fnmatch.h'.
+-
+- - Function: int fnmatch (const char *PATTERN, const char *STRING, int
+-          FLAGS)
+-     This function tests whether the string STRING matches the pattern
+-     PATTERN.  It returns `0' if they do match; otherwise, it returns
+-     the nonzero value `FNM_NOMATCH'.  The arguments PATTERN and STRING
+-     are both strings.
+-
+-     The argument FLAGS is a combination of flag bits that alter the
+-     details of matching.  See below for a list of the defined flags.
+-
+-     In the GNU C Library, `fnmatch' cannot experience an "error"--it
+-     always returns an answer for whether the match succeeds.  However,
+-     other implementations of `fnmatch' might sometimes report "errors".
+-     They would do so by returning nonzero values that are not equal to
+-     `FNM_NOMATCH'.
+-
+-   These are the available flags for the FLAGS argument:
+-
+-`FNM_FILE_NAME'
+-     Treat the `/' character specially, for matching file names.  If
+-     this flag is set, wildcard constructs in PATTERN cannot match `/'
+-     in STRING.  Thus, the only way to match `/' is with an explicit
+-     `/' in PATTERN.
+-
+-`FNM_PATHNAME'
+-     This is an alias for `FNM_FILE_NAME'; it comes from POSIX.2.  We
+-     don't recommend this name because we don't use the term "pathname"
+-     for file names.
+-
+-`FNM_PERIOD'
+-     Treat the `.' character specially if it appears at the beginning of
+-     STRING.  If this flag is set, wildcard constructs in PATTERN
+-     cannot match `.' as the first character of STRING.
+-
+-     If you set both `FNM_PERIOD' and `FNM_FILE_NAME', then the special
+-     treatment applies to `.' following `/' as well as to `.' at the
+-     beginning of STRING.  (The shell uses the `FNM_PERIOD' and
+-     `FNM_FILE_NAME' flags together for matching file names.)
+-
+-`FNM_NOESCAPE'
+-     Don't treat the `\' character specially in patterns.  Normally,
+-     `\' quotes the following character, turning off its special meaning
+-     (if any) so that it matches only itself.  When quoting is enabled,
+-     the pattern `\?' matches only the string `?', because the question
+-     mark in the pattern acts like an ordinary character.
+-
+-     If you use `FNM_NOESCAPE', then `\' is an ordinary character.
+-
+-`FNM_LEADING_DIR'
+-     Ignore a trailing sequence of characters starting with a `/' in
+-     STRING; that is to say, test whether STRING starts with a
+-     directory name that PATTERN matches.
+-
+-     If this flag is set, either `foo*' or `foobar' as a pattern would
+-     match the string `foobar/frobozz'.
+-
+-`FNM_CASEFOLD'
+-     Ignore case in comparing STRING to PATTERN.
+-
+-
+-File: libc.info,  Node: Globbing,  Next: Regular Expressions,  Prev: Wildcard Matching,  Up: Pattern Matching
+-
+-Globbing
+-========
+-
+-   The archetypal use of wildcards is for matching against the files in
+-a directory, and making a list of all the matches.  This is called
+-"globbing".
+-
+-   You could do this using `fnmatch', by reading the directory entries
+-one by one and testing each one with `fnmatch'.  But that would be slow
+-(and complex, since you would have to handle subdirectories by hand).
+-
+-   The library provides a function `glob' to make this particular use
+-of wildcards convenient.  `glob' and the other symbols in this section
+-are declared in `glob.h'.
+-
+-* Menu:
+-
+-* Calling Glob::             Basic use of `glob'.
+-* Flags for Globbing::       Flags that enable various options in `glob'.
+-* More Flags for Globbing::  GNU specific extensions to `glob'.
+-
+-
+-File: libc.info,  Node: Calling Glob,  Next: Flags for Globbing,  Up: Globbing
+-
+-Calling `glob'
+---------------
+-
+-   The result of globbing is a vector of file names (strings).  To
+-return this vector, `glob' uses a special data type, `glob_t', which is
+-a structure.  You pass `glob' the address of the structure, and it
+-fills in the structure's fields to tell you about the results.
+-
+- - Data Type: glob_t
+-     This data type holds a pointer to a word vector.  More precisely,
+-     it records both the address of the word vector and its size.  The
+-     GNU implementation contains some more fields which are non-standard
+-     extensions.
+-
+-    `gl_pathc'
+-          The number of elements in the vector.
+-
+-    `gl_pathv'
+-          The address of the vector.  This field has type `char **'.
+-
+-    `gl_offs'
+-          The offset of the first real element of the vector, from its
+-          nominal address in the `gl_pathv' field.  Unlike the other
+-          fields, this is always an input to `glob', rather than an
+-          output from it.
+-
+-          If you use a nonzero offset, then that many elements at the
+-          beginning of the vector are left empty.  (The `glob' function
+-          fills them with null pointers.)
+-
+-          The `gl_offs' field is meaningful only if you use the
+-          `GLOB_DOOFFS' flag.  Otherwise, the offset is always zero
+-          regardless of what is in this field, and the first real
+-          element comes at the beginning of the vector.
+-
+-    `gl_closedir'
+-          The address of an alternative implementation of the `closedir'
+-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
+-          the flag parameter.  The type of this field is
+-          `void (*) (void *)'.
+-
+-          This is a GNU extension.
+-
+-    `gl_readdir'
+-          The address of an alternative implementation of the `readdir'
+-          function used to read the contents of a directory.  It is
+-          used if the `GLOB_ALTDIRFUNC' bit is set in the flag
+-          parameter.  The type of this field is
+-          `struct dirent *(*) (void *)'.
+-
+-          This is a GNU extension.
+-
+-    `gl_opendir'
+-          The address of an alternative implementation of the `opendir'
+-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
+-          the flag parameter.  The type of this field is
+-          `void *(*) (const char *)'.
+-
+-          This is a GNU extension.
+-
+-    `gl_stat'
+-          The address of an alternative implementation of the `stat'
+-          function to get information about an object in the
+-          filesystem.  It is used if the `GLOB_ALTDIRFUNC' bit is set
+-          in the flag parameter.  The type of this field is
+-          `int (*) (const char *, struct stat *)'.
+-
+-          This is a GNU extension.
+-
+-    `gl_lstat'
+-          The address of an alternative implementation of the `lstat'
+-          function to get information about an object in the
+-          filesystems, not following symbolic links.  It is used if the
+-          `GLOB_ALTDIRFUNC' bit is set in the flag parameter.  The type
+-          of this field is `int (*) (const char *, struct stat *)'.
+-
+-          This is a GNU extension.
+-
+- - Function: int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC)
+-          (const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR)
+-     The function `glob' does globbing using the pattern PATTERN in the
+-     current directory.  It puts the result in a newly allocated
+-     vector, and stores the size and address of this vector into
+-     `*VECTOR-PTR'.  The argument FLAGS is a combination of bit flags;
+-     see *Note Flags for Globbing::, for details of the flags.
+-
+-     The result of globbing is a sequence of file names.  The function
+-     `glob' allocates a string for each resulting word, then allocates
+-     a vector of type `char **' to store the addresses of these
+-     strings.  The last element of the vector is a null pointer.  This
+-     vector is called the "word vector".
+-
+-     To return this vector, `glob' stores both its address and its
+-     length (number of elements, not counting the terminating null
+-     pointer) into `*VECTOR-PTR'.
+-
+-     Normally, `glob' sorts the file names alphabetically before
+-     returning them.  You can turn this off with the flag `GLOB_NOSORT'
+-     if you want to get the information as fast as possible.  Usually
+-     it's a good idea to let `glob' sort them--if you process the files
+-     in alphabetical order, the users will have a feel for the rate of
+-     progress that your application is making.
+-
+-     If `glob' succeeds, it returns 0.  Otherwise, it returns one of
+-     these error codes:
+-
+-    `GLOB_ABORTED'
+-          There was an error opening a directory, and you used the flag
+-          `GLOB_ERR' or your specified ERRFUNC returned a nonzero value.
+-          *Note Flags for Globbing::, for an explanation of the
+-          `GLOB_ERR' flag and ERRFUNC.
+-
+-    `GLOB_NOMATCH'
+-          The pattern didn't match any existing files.  If you use the
+-          `GLOB_NOCHECK' flag, then you never get this error code,
+-          because that flag tells `glob' to *pretend* that the pattern
+-          matched at least one file.
+-
+-    `GLOB_NOSPACE'
+-          It was impossible to allocate memory to hold the result.
+-
+-     In the event of an error, `glob' stores information in
+-     `*VECTOR-PTR' about all the matches it has found so far.
+-
+-
+-File: libc.info,  Node: Flags for Globbing,  Next: More Flags for Globbing,  Prev: Calling Glob,  Up: Globbing
+-
+-Flags for Globbing
+-------------------
+-
+-   This section describes the flags that you can specify in the FLAGS
+-argument to `glob'.  Choose the flags you want, and combine them with
+-the C bitwise OR operator `|'.
+-
+-`GLOB_APPEND'
+-     Append the words from this expansion to the vector of words
+-     produced by previous calls to `glob'.  This way you can
+-     effectively expand several words as if they were concatenated with
+-     spaces between them.
+-
+-     In order for appending to work, you must not modify the contents
+-     of the word vector structure between calls to `glob'.  And, if you
+-     set `GLOB_DOOFFS' in the first call to `glob', you must also set
+-     it when you append to the results.
+-
+-     Note that the pointer stored in `gl_pathv' may no longer be valid
+-     after you call `glob' the second time, because `glob' might have
+-     relocated the vector.  So always fetch `gl_pathv' from the
+-     `glob_t' structure after each `glob' call; *never* save the
+-     pointer across calls.
+-
+-`GLOB_DOOFFS'
+-     Leave blank slots at the beginning of the vector of words.  The
+-     `gl_offs' field says how many slots to leave.  The blank slots
+-     contain null pointers.
+-
+-`GLOB_ERR'
+-     Give up right away and report an error if there is any difficulty
+-     reading the directories that must be read in order to expand
+-     PATTERN fully.  Such difficulties might include a directory in
+-     which you don't have the requisite access.  Normally, `glob' tries
+-     its best to keep on going despite any errors, reading whatever
+-     directories it can.
+-
+-     You can exercise even more control than this by specifying an
+-     error-handler function ERRFUNC when you call `glob'.  If ERRFUNC
+-     is not a null pointer, then `glob' doesn't give up right away when
+-     it can't read a directory; instead, it calls ERRFUNC with two
+-     arguments, like this:
+-
+-          (*ERRFUNC) (FILENAME, ERROR-CODE)
+-
+-     The argument FILENAME is the name of the directory that `glob'
+-     couldn't open or couldn't read, and ERROR-CODE is the `errno'
+-     value that was reported to `glob'.
+-
+-     If the error handler function returns nonzero, then `glob' gives up
+-     right away.  Otherwise, it continues.
+-
+-`GLOB_MARK'
+-     If the pattern matches the name of a directory, append `/' to the
+-     directory's name when returning it.
+-
+-`GLOB_NOCHECK'
+-     If the pattern doesn't match any file names, return the pattern
+-     itself as if it were a file name that had been matched.
+-     (Normally, when the pattern doesn't match anything, `glob' returns
+-     that there were no matches.)
+-
+-`GLOB_NOSORT'
+-     Don't sort the file names; return them in no particular order.
+-     (In practice, the order will depend on the order of the entries in
+-     the directory.)  The only reason *not* to sort is to save time.
+-
+-`GLOB_NOESCAPE'
+-     Don't treat the `\' character specially in patterns.  Normally,
+-     `\' quotes the following character, turning off its special meaning
+-     (if any) so that it matches only itself.  When quoting is enabled,
+-     the pattern `\?' matches only the string `?', because the question
+-     mark in the pattern acts like an ordinary character.
+-
+-     If you use `GLOB_NOESCAPE', then `\' is an ordinary character.
+-
+-     `glob' does its work by calling the function `fnmatch' repeatedly.
+-     It handles the flag `GLOB_NOESCAPE' by turning on the
+-     `FNM_NOESCAPE' flag in calls to `fnmatch'.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-13 glibc-2.1.3/manual/libc.info-13
+--- ../glibc-2.1.3/manual/libc.info-13	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-13	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1154 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: More Flags for Globbing,  Prev: Flags for Globbing,  Up: Globbing
+-
+-More Flags for Globbing
+------------------------
+-
+-   Beside the flags described in the last section, the GNU
+-implementation of `glob' allows a few more flags which are also defined
+-in the `glob.h' file.  Some of the extensions implement functionality
+-which is available in modern shell implementations.
+-
+-`GLOB_PERIOD'
+-     The `.' character (period) is treated special.  It cannot be
+-     matched by wildcards.  *Note Wildcard Matching::, `FNM_PERIOD'.
+-
+-`GLOB_MAGCHAR'
+-     The `GLOB_MAGCHAR' value is not to be given to `glob' in the FLAGS
+-     parameter.  Instead, `glob' sets this bit in the GL_FLAGS element
+-     of the GLOB_T structure provided as the result if the pattern used
+-     for matching contains any wildcard character.
+-
+-`GLOB_ALTDIRFUNC'
+-     Instead of the using the using the normal functions for accessing
+-     the filesystem the `glob' implementation uses the user-supplied
+-     functions specified in the structure pointed to by PGLOB
+-     parameter.  For more information about the functions refer to the
+-     sections about directory handling see *Note Accessing
+-     Directories::, and *Note Reading Attributes::.
+-
+-`GLOB_BRACE'
+-     If this flag is given the handling of braces in the pattern is
+-     changed.  It is now required that braces appear correctly grouped.
+-     I.e., for each opening brace there must be a closing one.  Braces
+-     can be used recursively.  So it is possible to define one brace
+-     expression in another one.  It is important to note that the range
+-     of each brace expression is completely contained in the outer
+-     brace expression (if there is one).
+-
+-     The string between the matching braces is separated into single
+-     expressions by splitting at `,' (comma) characters.  The commas
+-     themself are discarded.  Please note what we said above about
+-     recursive brace expressions.  The commas used to separate the
+-     subexpressions must be at the same level.  Commas in brace
+-     subexpressions are not matched.  They are used during expansion of
+-     the brace expression of the deeper level.  The example below shows
+-     this
+-
+-          glob ("{foo/{,bar,biz},baz}", GLOB_BRACE, NULL, &result)
+-
+-     is equivalent to the sequence
+-
+-          glob ("foo/", GLOB_BRACE, NULL, &result)
+-          glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+-          glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+-          glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+-
+-     if we leave aside error handling.
+-
+-`GLOB_NOMAGIC'
+-     If the pattern contains no wildcard constructs (it is a literal
+-     file name), return it as the sole "matching" word, even if no file
+-     exists by that name.
+-
+-`GLOB_TILDE'
+-     If this flag is used the character `~' (tilde) is handled special
+-     if it appears at the beginning of the pattern.  Instead of being
+-     taken verbatim it is used to represent the home directory of a
+-     known user.
+-
+-     If `~' is the only character in pattern or it is followed by a `/'
+-     (slash), the home directory of the process owner is substituted.
+-     Using `getlogin' and `getpwnam' the information is read from the
+-     system databases.  As an example take user `bart' with his home
+-     directory at `/home/bart'.  For him a call like
+-
+-          glob ("~/bin/*", GLOB_TILDE, NULL, &result)
+-
+-     would return the contents of the directory `/home/bart/bin'.
+-     Instead of referring to the own home directory it is also possible
+-     to name the home directory of other users.  To do so one has to
+-     append the user name after the tilde character.  So the contents
+-     of user `homer''s `bin' directory can be retrieved by
+-
+-          glob ("~homer/bin/*", GLOB_TILDE, NULL, &result)
+-
+-     If the user name is not valid or the home directory cannot be
+-     determined for some reason the pattern is left untouched and
+-     itself used as the result.  I.e., if in the last example `home' is
+-     not available the tilde expansion yields to `"~homer/bin/*"' and
+-     `glob' is not looking for a directory named `~homer'.
+-
+-     This functionality is equivalent to what is available in C-shells
+-     if the `nonomatch' flag is set.
+-
+-`GLOB_TILDE_CHECK'
+-     If this flag is used `glob' behaves like as if `GLOB_TILDE' is
+-     given.  The only difference is that if the user name is not
+-     available or the home directory cannot be determined for other
+-     reasons this leads to an error.  `glob' will return `GLOB_NOMATCH'
+-     instead of using the pattern itself as the name.
+-
+-     This functionality is equivalent to what is available in C-shells
+-     if `nonomatch' flag is not set.
+-
+-`GLOB_ONLYDIR'
+-     If this flag is used the globbing function takes this as a *hint*
+-     that the caller is only interested in directories matching the
+-     pattern.  If the information about the type of the file is easily
+-     available non-directories will be rejected but no extra work will
+-     be done to determine the information for each file.  I.e., the
+-     caller must still be able to filter directories out.
+-
+-     This functionality is only available with the GNU `glob'
+-     implementation.  It is mainly used internally to increase the
+-     performance but might be useful for a user as well and therefore is
+-     documented here.
+-
+-   Calling `glob' will in most cases allocate resources which are used
+-to represent the result of the function call.  If the same object of
+-type `glob_t' is used in multiple call to `glob' the resources are
+-freed or reused so that no leaks appear.  But this does not include the
+-time when all `glob' calls are done.
+-
+- - Function: void globfree (glob_t *PGLOB)
+-     The `globfree' function frees all resources allocated by previous
+-     calls to `glob' associated with the object pointed to by PGLOB.
+-     This function should be called whenever the currently used
+-     `glob_t' typed object isn't used anymore.
+-
+-
+-File: libc.info,  Node: Regular Expressions,  Next: Word Expansion,  Prev: Globbing,  Up: Pattern Matching
+-
+-Regular Expression Matching
+-===========================
+-
+-   The GNU C library supports two interfaces for matching regular
+-expressions.  One is the standard POSIX.2 interface, and the other is
+-what the GNU system has had for many years.
+-
+-   Both interfaces are declared in the header file `regex.h'.  If you
+-define `_POSIX_C_SOURCE', then only the POSIX.2 functions, structures,
+-and constants are declared.
+-
+-* Menu:
+-
+-* POSIX Regexp Compilation::    Using `regcomp' to prepare to match.
+-* Flags for POSIX Regexps::     Syntax variations for `regcomp'.
+-* Matching POSIX Regexps::      Using `regexec' to match the compiled
+-				   pattern that you get from `regcomp'.
+-* Regexp Subexpressions::       Finding which parts of the string were matched.
+-* Subexpression Complications:: Find points of which parts were matched.
+-* Regexp Cleanup::		Freeing storage; reporting errors.
+-
+-
+-File: libc.info,  Node: POSIX Regexp Compilation,  Next: Flags for POSIX Regexps,  Up: Regular Expressions
+-
+-POSIX Regular Expression Compilation
+-------------------------------------
+-
+-   Before you can actually match a regular expression, you must
+-"compile" it.  This is not true compilation--it produces a special data
+-structure, not machine instructions.  But it is like ordinary
+-compilation in that its purpose is to enable you to "execute" the
+-pattern fast.  (*Note Matching POSIX Regexps::, for how to use the
+-compiled regular expression for matching.)
+-
+-   There is a special data type for compiled regular expressions:
+-
+- - Data Type: regex_t
+-     This type of object holds a compiled regular expression.  It is
+-     actually a structure.  It has just one field that your programs
+-     should look at:
+-
+-    `re_nsub'
+-          This field holds the number of parenthetical subexpressions
+-          in the regular expression that was compiled.
+-
+-     There are several other fields, but we don't describe them here,
+-     because only the functions in the library should use them.
+-
+-   After you create a `regex_t' object, you can compile a regular
+-expression into it by calling `regcomp'.
+-
+- - Function: int regcomp (regex_t *COMPILED, const char *PATTERN, int
+-          CFLAGS)
+-     The function `regcomp' "compiles" a regular expression into a data
+-     structure that you can use with `regexec' to match against a
+-     string.  The compiled regular expression format is designed for
+-     efficient matching.  `regcomp' stores it into `*COMPILED'.
+-
+-     It's up to you to allocate an object of type `regex_t' and pass its
+-     address to `regcomp'.
+-
+-     The argument CFLAGS lets you specify various options that control
+-     the syntax and semantics of regular expressions.  *Note Flags for
+-     POSIX Regexps::.
+-
+-     If you use the flag `REG_NOSUB', then `regcomp' omits from the
+-     compiled regular expression the information necessary to record
+-     how subexpressions actually match.  In this case, you might as well
+-     pass `0' for the MATCHPTR and NMATCH arguments when you call
+-     `regexec'.
+-
+-     If you don't use `REG_NOSUB', then the compiled regular expression
+-     does have the capacity to record how subexpressions match.  Also,
+-     `regcomp' tells you how many subexpressions PATTERN has, by
+-     storing the number in `COMPILED->re_nsub'.  You can use that value
+-     to decide how long an array to allocate to hold information about
+-     subexpression matches.
+-
+-     `regcomp' returns `0' if it succeeds in compiling the regular
+-     expression; otherwise, it returns a nonzero error code (see the
+-     table below).  You can use `regerror' to produce an error message
+-     string describing the reason for a nonzero value; see *Note Regexp
+-     Cleanup::.
+-
+-
+-   Here are the possible nonzero values that `regcomp' can return:
+-
+-`REG_BADBR'
+-     There was an invalid `\{...\}' construct in the regular
+-     expression.  A valid `\{...\}' construct must contain either a
+-     single number, or two numbers in increasing order separated by a
+-     comma.
+-
+-`REG_BADPAT'
+-     There was a syntax error in the regular expression.
+-
+-`REG_BADRPT'
+-     A repetition operator such as `?' or `*' appeared in a bad
+-     position (with no preceding subexpression to act on).
+-
+-`REG_ECOLLATE'
+-     The regular expression referred to an invalid collating element
+-     (one not defined in the current locale for string collation).
+-     *Note Locale Categories::.
+-
+-`REG_ECTYPE'
+-     The regular expression referred to an invalid character class name.
+-
+-`REG_EESCAPE'
+-     The regular expression ended with `\'.
+-
+-`REG_ESUBREG'
+-     There was an invalid number in the `\DIGIT' construct.
+-
+-`REG_EBRACK'
+-     There were unbalanced square brackets in the regular expression.
+-
+-`REG_EPAREN'
+-     An extended regular expression had unbalanced parentheses, or a
+-     basic regular expression had unbalanced `\(' and `\)'.
+-
+-`REG_EBRACE'
+-     The regular expression had unbalanced `\{' and `\}'.
+-
+-`REG_ERANGE'
+-     One of the endpoints in a range expression was invalid.
+-
+-`REG_ESPACE'
+-     `regcomp' ran out of memory.
+-
+-
+-File: libc.info,  Node: Flags for POSIX Regexps,  Next: Matching POSIX Regexps,  Prev: POSIX Regexp Compilation,  Up: Regular Expressions
+-
+-Flags for POSIX Regular Expressions
+------------------------------------
+-
+-   These are the bit flags that you can use in the CFLAGS operand when
+-compiling a regular expression with `regcomp'.
+-
+-`REG_EXTENDED'
+-     Treat the pattern as an extended regular expression, rather than
+-     as a basic regular expression.
+-
+-`REG_ICASE'
+-     Ignore case when matching letters.
+-
+-`REG_NOSUB'
+-     Don't bother storing the contents of the MATCHES-PTR array.
+-
+-`REG_NEWLINE'
+-     Treat a newline in STRING as dividing STRING into multiple lines,
+-     so that `$' can match before the newline and `^' can match after.
+-     Also, don't permit `.' to match a newline, and don't permit
+-     `[^...]' to match a newline.
+-
+-     Otherwise, newline acts like any other ordinary character.
+-
+-
+-File: libc.info,  Node: Matching POSIX Regexps,  Next: Regexp Subexpressions,  Prev: Flags for POSIX Regexps,  Up: Regular Expressions
+-
+-Matching a Compiled POSIX Regular Expression
+---------------------------------------------
+-
+-   Once you have compiled a regular expression, as described in *Note
+-POSIX Regexp Compilation::, you can match it against strings using
+-`regexec'.  A match anywhere inside the string counts as success,
+-unless the regular expression contains anchor characters (`^' or `$').
+-
+- - Function: int regexec (regex_t *COMPILED, char *STRING, size_t
+-          NMATCH, regmatch_t MATCHPTR [], int EFLAGS)
+-     This function tries to match the compiled regular expression
+-     `*COMPILED' against STRING.
+-
+-     `regexec' returns `0' if the regular expression matches;
+-     otherwise, it returns a nonzero value.  See the table below for
+-     what nonzero values mean.  You can use `regerror' to produce an
+-     error message string describing the reason for a nonzero value;
+-     see *Note Regexp Cleanup::.
+-
+-     The argument EFLAGS is a word of bit flags that enable various
+-     options.
+-
+-     If you want to get information about what part of STRING actually
+-     matched the regular expression or its subexpressions, use the
+-     arguments MATCHPTR and NMATCH.  Otherwise, pass `0' for NMATCH,
+-     and `NULL' for MATCHPTR.  *Note Regexp Subexpressions::.
+-
+-   You must match the regular expression with the same set of current
+-locales that were in effect when you compiled the regular expression.
+-
+-   The function `regexec' accepts the following flags in the EFLAGS
+-argument:
+-
+-`REG_NOTBOL'
+-     Do not regard the beginning of the specified string as the
+-     beginning of a line; more generally, don't make any assumptions
+-     about what text might precede it.
+-
+-`REG_NOTEOL'
+-     Do not regard the end of the specified string as the end of a
+-     line; more generally, don't make any assumptions about what text
+-     might follow it.
+-
+-   Here are the possible nonzero values that `regexec' can return:
+-
+-`REG_NOMATCH'
+-     The pattern didn't match the string.  This isn't really an error.
+-
+-`REG_ESPACE'
+-     `regexec' ran out of memory.
+-
+-
+-File: libc.info,  Node: Regexp Subexpressions,  Next: Subexpression Complications,  Prev: Matching POSIX Regexps,  Up: Regular Expressions
+-
+-Match Results with Subexpressions
+----------------------------------
+-
+-   When `regexec' matches parenthetical subexpressions of PATTERN, it
+-records which parts of STRING they match.  It returns that information
+-by storing the offsets into an array whose elements are structures of
+-type `regmatch_t'.  The first element of the array (index `0') records
+-the part of the string that matched the entire regular expression.
+-Each other element of the array records the beginning and end of the
+-part that matched a single parenthetical subexpression.
+-
+- - Data Type: regmatch_t
+-     This is the data type of the MATCHARRAY array that you pass to
+-     `regexec'.  It contains two structure fields, as follows:
+-
+-    `rm_so'
+-          The offset in STRING of the beginning of a substring.  Add
+-          this value to STRING to get the address of that part.
+-
+-    `rm_eo'
+-          The offset in STRING of the end of the substring.
+-
+- - Data Type: regoff_t
+-     `regoff_t' is an alias for another signed integer type.  The
+-     fields of `regmatch_t' have type `regoff_t'.
+-
+-   The `regmatch_t' elements correspond to subexpressions positionally;
+-the first element (index `1') records where the first subexpression
+-matched, the second element records the second subexpression, and so
+-on.  The order of the subexpressions is the order in which they begin.
+-
+-   When you call `regexec', you specify how long the MATCHPTR array is,
+-with the NMATCH argument.  This tells `regexec' how many elements to
+-store.  If the actual regular expression has more than NMATCH
+-subexpressions, then you won't get offset information about the rest of
+-them.  But this doesn't alter whether the pattern matches a particular
+-string or not.
+-
+-   If you don't want `regexec' to return any information about where
+-the subexpressions matched, you can either supply `0' for NMATCH, or
+-use the flag `REG_NOSUB' when you compile the pattern with `regcomp'.
+-
+-
+-File: libc.info,  Node: Subexpression Complications,  Next: Regexp Cleanup,  Prev: Regexp Subexpressions,  Up: Regular Expressions
+-
+-Complications in Subexpression Matching
+----------------------------------------
+-
+-   Sometimes a subexpression matches a substring of no characters.  This
+-happens when `f\(o*\)' matches the string `fum'.  (It really matches
+-just the `f'.)  In this case, both of the offsets identify the point in
+-the string where the null substring was found.  In this example, the
+-offsets are both `1'.
+-
+-   Sometimes the entire regular expression can match without using some
+-of its subexpressions at all--for example, when `ba\(na\)*' matches the
+-string `ba', the parenthetical subexpression is not used.  When this
+-happens, `regexec' stores `-1' in both fields of the element for that
+-subexpression.
+-
+-   Sometimes matching the entire regular expression can match a
+-particular subexpression more than once--for example, when `ba\(na\)*'
+-matches the string `bananana', the parenthetical subexpression matches
+-three times.  When this happens, `regexec' usually stores the offsets
+-of the last part of the string that matched the subexpression.  In the
+-case of `bananana', these offsets are `6' and `8'.
+-
+-   But the last match is not always the one that is chosen.  It's more
+-accurate to say that the last *opportunity* to match is the one that
+-takes precedence.  What this means is that when one subexpression
+-appears within another, then the results reported for the inner
+-subexpression reflect whatever happened on the last match of the outer
+-subexpression.  For an example, consider `\(ba\(na\)*s \)*' matching
+-the string `bananas bas '.  The last time the inner expression actually
+-matches is near the end of the first word.  But it is *considered*
+-again in the second word, and fails to match there.  `regexec' reports
+-nonuse of the "na" subexpression.
+-
+-   Another place where this rule applies is when the regular expression
+-     \(ba\(na\)*s \|nefer\(ti\)* \)*
+-
+-matches `bananas nefertiti'.  The "na" subexpression does match in the
+-first word, but it doesn't match in the second word because the other
+-alternative is used there.  Once again, the second repetition of the
+-outer subexpression overrides the first, and within that second
+-repetition, the "na" subexpression is not used.  So `regexec' reports
+-nonuse of the "na" subexpression.
+-
+-
+-File: libc.info,  Node: Regexp Cleanup,  Prev: Subexpression Complications,  Up: Regular Expressions
+-
+-POSIX Regexp Matching Cleanup
+------------------------------
+-
+-   When you are finished using a compiled regular expression, you can
+-free the storage it uses by calling `regfree'.
+-
+- - Function: void regfree (regex_t *COMPILED)
+-     Calling `regfree' frees all the storage that `*COMPILED' points
+-     to.  This includes various internal fields of the `regex_t'
+-     structure that aren't documented in this manual.
+-
+-     `regfree' does not free the object `*COMPILED' itself.
+-
+-   You should always free the space in a `regex_t' structure with
+-`regfree' before using the structure to compile another regular
+-expression.
+-
+-   When `regcomp' or `regexec' reports an error, you can use the
+-function `regerror' to turn it into an error message string.
+-
+- - Function: size_t regerror (int ERRCODE, regex_t *COMPILED, char
+-          *BUFFER, size_t LENGTH)
+-     This function produces an error message string for the error code
+-     ERRCODE, and stores the string in LENGTH bytes of memory starting
+-     at BUFFER.  For the COMPILED argument, supply the same compiled
+-     regular expression structure that `regcomp' or `regexec' was
+-     working with when it got the error.  Alternatively, you can supply
+-     `NULL' for COMPILED; you will still get a meaningful error
+-     message, but it might not be as detailed.
+-
+-     If the error message can't fit in LENGTH bytes (including a
+-     terminating null character), then `regerror' truncates it.  The
+-     string that `regerror' stores is always null-terminated even if it
+-     has been truncated.
+-
+-     The return value of `regerror' is the minimum length needed to
+-     store the entire error message.  If this is less than LENGTH, then
+-     the error message was not truncated, and you can use it.
+-     Otherwise, you should call `regerror' again with a larger buffer.
+-
+-     Here is a function which uses `regerror', but always dynamically
+-     allocates a buffer for the error message:
+-
+-          char *get_regerror (int errcode, regex_t *compiled)
+-          {
+-            size_t length = regerror (errcode, compiled, NULL, 0);
+-            char *buffer = xmalloc (length);
+-            (void) regerror (errcode, compiled, buffer, length);
+-            return buffer;
+-          }
+-
+-
+-File: libc.info,  Node: Word Expansion,  Prev: Regular Expressions,  Up: Pattern Matching
+-
+-Shell-Style Word Expansion
+-==========================
+-
+-   "Word expansion" means the process of splitting a string into
+-"words" and substituting for variables, commands, and wildcards just as
+-the shell does.
+-
+-   For example, when you write `ls -l foo.c', this string is split into
+-three separate words--`ls', `-l' and `foo.c'.  This is the most basic
+-function of word expansion.
+-
+-   When you write `ls *.c', this can become many words, because the
+-word `*.c' can be replaced with any number of file names.  This is
+-called "wildcard expansion", and it is also a part of word expansion.
+-
+-   When you use `echo $PATH' to print your path, you are taking
+-advantage of "variable substitution", which is also part of word
+-expansion.
+-
+-   Ordinary programs can perform word expansion just like the shell by
+-calling the library function `wordexp'.
+-
+-* Menu:
+-
+-* Expansion Stages::            What word expansion does to a string.
+-* Calling Wordexp::             How to call `wordexp'.
+-* Flags for Wordexp::           Options you can enable in `wordexp'.
+-* Wordexp Example::             A sample program that does word expansion.
+-* Tilde Expansion::             Details of how tilde expansion works.
+-* Variable Substitution::       Different types of variable substitution.
+-
+-
+-File: libc.info,  Node: Expansion Stages,  Next: Calling Wordexp,  Up: Word Expansion
+-
+-The Stages of Word Expansion
+-----------------------------
+-
+-   When word expansion is applied to a sequence of words, it performs
+-the following transformations in the order shown here:
+-
+-  1. "Tilde expansion": Replacement of `~foo' with the name of the home
+-     directory of `foo'.
+-
+-  2. Next, three different transformations are applied in the same step,
+-     from left to right:
+-
+-        * "Variable substitution": Environment variables are
+-          substituted for references such as `$foo'.
+-
+-        * "Command substitution": Constructs such as ``cat foo`' and
+-          the equivalent `$(cat foo)' are replaced with the output from
+-          the inner command.
+-
+-        * "Arithmetic expansion": Constructs such as `$(($x-1))' are
+-          replaced with the result of the arithmetic computation.
+-
+-  3. "Field splitting": subdivision of the text into "words".
+-
+-  4. "Wildcard expansion": The replacement of a construct such as `*.c'
+-     with a list of `.c' file names.  Wildcard expansion applies to an
+-     entire word at a time, and replaces that word with 0 or more file
+-     names that are themselves words.
+-
+-  5. "Quote removal": The deletion of string-quotes, now that they have
+-     done their job by inhibiting the above transformations when
+-     appropriate.
+-
+-   For the details of these transformations, and how to write the
+-constructs that use them, see `The BASH Manual' (to appear).
+-
+-
+-File: libc.info,  Node: Calling Wordexp,  Next: Flags for Wordexp,  Prev: Expansion Stages,  Up: Word Expansion
+-
+-Calling `wordexp'
+------------------
+-
+-   All the functions, constants and data types for word expansion are
+-declared in the header file `wordexp.h'.
+-
+-   Word expansion produces a vector of words (strings).  To return this
+-vector, `wordexp' uses a special data type, `wordexp_t', which is a
+-structure.  You pass `wordexp' the address of the structure, and it
+-fills in the structure's fields to tell you about the results.
+-
+- - Data Type: wordexp_t
+-     This data type holds a pointer to a word vector.  More precisely,
+-     it records both the address of the word vector and its size.
+-
+-    `we_wordc'
+-          The number of elements in the vector.
+-
+-    `we_wordv'
+-          The address of the vector.  This field has type `char **'.
+-
+-    `we_offs'
+-          The offset of the first real element of the vector, from its
+-          nominal address in the `we_wordv' field.  Unlike the other
+-          fields, this is always an input to `wordexp', rather than an
+-          output from it.
+-
+-          If you use a nonzero offset, then that many elements at the
+-          beginning of the vector are left empty.  (The `wordexp'
+-          function fills them with null pointers.)
+-
+-          The `we_offs' field is meaningful only if you use the
+-          `WRDE_DOOFFS' flag.  Otherwise, the offset is always zero
+-          regardless of what is in this field, and the first real
+-          element comes at the beginning of the vector.
+-
+- - Function: int wordexp (const char *WORDS, wordexp_t
+-          *WORD-VECTOR-PTR, int FLAGS)
+-     Perform word expansion on the string WORDS, putting the result in
+-     a newly allocated vector, and store the size and address of this
+-     vector into `*WORD-VECTOR-PTR'.  The argument FLAGS is a
+-     combination of bit flags; see *Note Flags for Wordexp::, for
+-     details of the flags.
+-
+-     You shouldn't use any of the characters `|&;<>' in the string
+-     WORDS unless they are quoted; likewise for newline.  If you use
+-     these characters unquoted, you will get the `WRDE_BADCHAR' error
+-     code.  Don't use parentheses or braces unless they are quoted or
+-     part of a word expansion construct.  If you use quotation
+-     characters `'"`', they should come in pairs that balance.
+-
+-     The results of word expansion are a sequence of words.  The
+-     function `wordexp' allocates a string for each resulting word, then
+-     allocates a vector of type `char **' to store the addresses of
+-     these strings.  The last element of the vector is a null pointer.
+-     This vector is called the "word vector".
+-
+-     To return this vector, `wordexp' stores both its address and its
+-     length (number of elements, not counting the terminating null
+-     pointer) into `*WORD-VECTOR-PTR'.
+-
+-     If `wordexp' succeeds, it returns 0.  Otherwise, it returns one of
+-     these error codes:
+-
+-    `WRDE_BADCHAR'
+-          The input string WORDS contains an unquoted invalid character
+-          such as `|'.
+-
+-    `WRDE_BADVAL'
+-          The input string refers to an undefined shell variable, and
+-          you used the flag `WRDE_UNDEF' to forbid such references.
+-
+-    `WRDE_CMDSUB'
+-          The input string uses command substitution, and you used the
+-          flag `WRDE_NOCMD' to forbid command substitution.
+-
+-    `WRDE_NOSPACE'
+-          It was impossible to allocate memory to hold the result.  In
+-          this case, `wordexp' can store part of the results--as much
+-          as it could allocate room for.
+-
+-    `WRDE_SYNTAX'
+-          There was a syntax error in the input string.  For example,
+-          an unmatched quoting character is a syntax error.
+-
+- - Function: void wordfree (wordexp_t *WORD-VECTOR-PTR)
+-     Free the storage used for the word-strings and vector that
+-     `*WORD-VECTOR-PTR' points to.  This does not free the structure
+-     `*WORD-VECTOR-PTR' itself--only the other data it points to.
+-
+-
+-File: libc.info,  Node: Flags for Wordexp,  Next: Wordexp Example,  Prev: Calling Wordexp,  Up: Word Expansion
+-
+-Flags for Word Expansion
+-------------------------
+-
+-   This section describes the flags that you can specify in the FLAGS
+-argument to `wordexp'.  Choose the flags you want, and combine them
+-with the C operator `|'.
+-
+-`WRDE_APPEND'
+-     Append the words from this expansion to the vector of words
+-     produced by previous calls to `wordexp'.  This way you can
+-     effectively expand several words as if they were concatenated with
+-     spaces between them.
+-
+-     In order for appending to work, you must not modify the contents
+-     of the word vector structure between calls to `wordexp'.  And, if
+-     you set `WRDE_DOOFFS' in the first call to `wordexp', you must also
+-     set it when you append to the results.
+-
+-`WRDE_DOOFFS'
+-     Leave blank slots at the beginning of the vector of words.  The
+-     `we_offs' field says how many slots to leave.  The blank slots
+-     contain null pointers.
+-
+-`WRDE_NOCMD'
+-     Don't do command substitution; if the input requests command
+-     substitution, report an error.
+-
+-`WRDE_REUSE'
+-     Reuse a word vector made by a previous call to `wordexp'.  Instead
+-     of allocating a new vector of words, this call to `wordexp' will
+-     use the vector that already exists (making it larger if necessary).
+-
+-     Note that the vector may move, so it is not safe to save an old
+-     pointer and use it again after calling `wordexp'.  You must fetch
+-     `we_pathv' anew after each call.
+-
+-`WRDE_SHOWERR'
+-     Do show any error messages printed by commands run by command
+-     substitution.  More precisely, allow these commands to inherit the
+-     standard error output stream of the current process.  By default,
+-     `wordexp' gives these commands a standard error stream that
+-     discards all output.
+-
+-`WRDE_UNDEF'
+-     If the input refers to a shell variable that is not defined,
+-     report an error.
+-
+-
+-File: libc.info,  Node: Wordexp Example,  Next: Tilde Expansion,  Prev: Flags for Wordexp,  Up: Word Expansion
+-
+-`wordexp' Example
+------------------
+-
+-   Here is an example of using `wordexp' to expand several strings and
+-use the results to run a shell command.  It also shows the use of
+-`WRDE_APPEND' to concatenate the expansions and of `wordfree' to free
+-the space allocated by `wordexp'.
+-
+-     int
+-     expand_and_execute (const char *program, const char *options)
+-     {
+-       wordexp_t result;
+-       pid_t pid
+-       int status, i;
+-     
+-       /* Expand the string for the program to run.  */
+-       switch (wordexp (program, &result, 0))
+-         {
+-         case 0:			/* Successful.  */
+-           break;
+-         case WRDE_NOSPACE:
+-           /* If the error was `WRDE_NOSPACE',
+-              then perhaps part of the result was allocated.  */
+-           wordfree (&result);
+-         default:                    /* Some other error.  */
+-           return -1;
+-         }
+-     
+-       /* Expand the strings specified for the arguments.  */
+-       for (i = 0; args[i]; i++)
+-         {
+-           if (wordexp (options, &result, WRDE_APPEND))
+-             {
+-               wordfree (&result);
+-               return -1;
+-             }
+-         }
+-     
+-       pid = fork ();
+-       if (pid == 0)
+-         {
+-           /* This is the child process.  Execute the command. */
+-           execv (result.we_wordv[0], result.we_wordv);
+-           exit (EXIT_FAILURE);
+-         }
+-       else if (pid < 0)
+-         /* The fork failed.  Report failure.  */
+-         status = -1;
+-       else
+-         /* This is the parent process.  Wait for the child to complete.  */
+-         if (waitpid (pid, &status, 0) != pid)
+-           status = -1;
+-     
+-       wordfree (&result);
+-       return status;
+-     }
+-
+-
+-File: libc.info,  Node: Tilde Expansion,  Next: Variable Substitution,  Prev: Wordexp Example,  Up: Word Expansion
+-
+-Details of Tilde Expansion
+---------------------------
+-
+-   It's a standard part of shell syntax that you can use `~' at the
+-beginning of a file name to stand for your own home directory.  You can
+-use `~USER' to stand for USER's home directory.
+-
+-   "Tilde expansion" is the process of converting these abbreviations
+-to the directory names that they stand for.
+-
+-   Tilde expansion applies to the `~' plus all following characters up
+-to whitespace or a slash.  It takes place only at the beginning of a
+-word, and only if none of the characters to be transformed is quoted in
+-any way.
+-
+-   Plain `~' uses the value of the environment variable `HOME' as the
+-proper home directory name.  `~' followed by a user name uses
+-`getpwname' to look up that user in the user database, and uses
+-whatever directory is recorded there.  Thus, `~' followed by your own
+-name can give different results from plain `~', if the value of `HOME'
+-is not really your home directory.
+-
+-
+-File: libc.info,  Node: Variable Substitution,  Prev: Tilde Expansion,  Up: Word Expansion
+-
+-Details of Variable Substitution
+---------------------------------
+-
+-   Part of ordinary shell syntax is the use of `$VARIABLE' to
+-substitute the value of a shell variable into a command.  This is called
+-"variable substitution", and it is one part of doing word expansion.
+-
+-   There are two basic ways you can write a variable reference for
+-substitution:
+-
+-`${VARIABLE}'
+-     If you write braces around the variable name, then it is completely
+-     unambiguous where the variable name ends.  You can concatenate
+-     additional letters onto the end of the variable value by writing
+-     them immediately after the close brace.  For example, `${foo}s'
+-     expands into `tractors'.
+-
+-`$VARIABLE'
+-     If you do not put braces around the variable name, then the
+-     variable name consists of all the alphanumeric characters and
+-     underscores that follow the `$'.  The next punctuation character
+-     ends the variable name.  Thus, `$foo-bar' refers to the variable
+-     `foo' and expands into `tractor-bar'.
+-
+-   When you use braces, you can also use various constructs to modify
+-the value that is substituted, or test it in various ways.
+-
+-`${VARIABLE:-DEFAULT}'
+-     Substitute the value of VARIABLE, but if that is empty or
+-     undefined, use DEFAULT instead.
+-
+-`${VARIABLE:=DEFAULT}'
+-     Substitute the value of VARIABLE, but if that is empty or
+-     undefined, use DEFAULT instead and set the variable to DEFAULT.
+-
+-`${VARIABLE:?MESSAGE}'
+-     If VARIABLE is defined and not empty, substitute its value.
+-
+-     Otherwise, print MESSAGE as an error message on the standard error
+-     stream, and consider word expansion a failure.
+-
+-`${VARIABLE:+REPLACEMENT}'
+-     Substitute REPLACEMENT, but only if VARIABLE is defined and
+-     nonempty.  Otherwise, substitute nothing for this construct.
+-
+-`${#VARIABLE}'
+-     Substitute a numeral which expresses in base ten the number of
+-     characters in the value of VARIABLE.  `${#foo}' stands for `7',
+-     because `tractor' is seven characters.
+-
+-   These variants of variable substitution let you remove part of the
+-variable's value before substituting it.  The PREFIX and SUFFIX are not
+-mere strings; they are wildcard patterns, just like the patterns that
+-you use to match multiple file names.  But in this context, they match
+-against parts of the variable value rather than against file names.
+-
+-`${VARIABLE%%SUFFIX}'
+-     Substitute the value of VARIABLE, but first discard from that
+-     variable any portion at the end that matches the pattern SUFFIX.
+-
+-     If there is more than one alternative for how to match against
+-     SUFFIX, this construct uses the longest possible match.
+-
+-     Thus, `${foo%%r*}' substitutes `t', because the largest match for
+-     `r*' at the end of `tractor' is `ractor'.
+-
+-`${VARIABLE%SUFFIX}'
+-     Substitute the value of VARIABLE, but first discard from that
+-     variable any portion at the end that matches the pattern SUFFIX.
+-
+-     If there is more than one alternative for how to match against
+-     SUFFIX, this construct uses the shortest possible alternative.
+-
+-     Thus, `${foo%%r*}' substitutes `tracto', because the shortest
+-     match for `r*' at the end of `tractor' is just `r'.
+-
+-`${VARIABLE##PREFIX}'
+-     Substitute the value of VARIABLE, but first discard from that
+-     variable any portion at the beginning that matches the pattern
+-     PREFIX.
+-
+-     If there is more than one alternative for how to match against
+-     PREFIX, this construct uses the longest possible match.
+-
+-     Thus, `${foo%%r*}' substitutes `t', because the largest match for
+-     `r*' at the end of `tractor' is `ractor'.
+-
+-`${VARIABLE#PREFIX}'
+-     Substitute the value of VARIABLE, but first discard from that
+-     variable any portion at the beginning that matches the pattern
+-     PREFIX.
+-
+-     If there is more than one alternative for how to match against
+-     PREFIX, this construct uses the shortest possible alternative.
+-
+-     Thus, `${foo%%r*}' substitutes `tracto', because the shortest
+-     match for `r*' at the end of `tractor' is just `r'.
+-
+-
+-File: libc.info,  Node: I/O Overview,  Next: I/O on Streams,  Prev: Pattern Matching,  Up: Top
+-
+-Input/Output Overview
+-*********************
+-
+-   Most programs need to do either input (reading data) or output
+-(writing data), or most frequently both, in order to do anything
+-useful.  The GNU C library provides such a large selection of input and
+-output functions that the hardest part is often deciding which function
+-is most appropriate!
+-
+-   This chapter introduces concepts and terminology relating to input
+-and output.  Other chapters relating to the GNU I/O facilities are:
+-
+-   * *Note I/O on Streams::, which covers the high-level functions that
+-     operate on streams, including formatted input and output.
+-
+-   * *Note Low-Level I/O::, which covers the basic I/O and control
+-     functions on file descriptors.
+-
+-   * *Note File System Interface::, which covers functions for
+-     operating on directories and for manipulating file attributes such
+-     as access modes and ownership.
+-
+-   * *Note Pipes and FIFOs::, which includes information on the basic
+-     interprocess communication facilities.
+-
+-   * *Note Sockets::, which covers a more complicated interprocess
+-     communication facility with support for networking.
+-
+-   * *Note Low-Level Terminal Interface::, which covers functions for
+-     changing how input and output to terminal or other serial devices
+-     are processed.
+-
+-* Menu:
+-
+-* I/O Concepts::       Some basic information and terminology.
+-* File Names::         How to refer to a file.
+-
+-
+-File: libc.info,  Node: I/O Concepts,  Next: File Names,  Up: I/O Overview
+-
+-Input/Output Concepts
+-=====================
+-
+-   Before you can read or write the contents of a file, you must
+-establish a connection or communications channel to the file.  This
+-process is called "opening" the file.  You can open a file for reading,
+-writing, or both.
+-
+-   The connection to an open file is represented either as a stream or
+-as a file descriptor.  You pass this as an argument to the functions
+-that do the actual read or write operations, to tell them which file to
+-operate on.  Certain functions expect streams, and others are designed
+-to operate on file descriptors.
+-
+-   When you have finished reading to or writing from the file, you can
+-terminate the connection by "closing" the file.  Once you have closed a
+-stream or file descriptor, you cannot do any more input or output
+-operations on it.
+-
+-* Menu:
+-
+-* Streams and File Descriptors::    The GNU Library provides two ways
+-			             to access the contents of files.
+-* File Position::                   The number of bytes from the
+-                                     beginning of the file.
+-
+-
+-File: libc.info,  Node: Streams and File Descriptors,  Next: File Position,  Up: I/O Concepts
+-
+-Streams and File Descriptors
+-----------------------------
+-
+-   When you want to do input or output to a file, you have a choice of
+-two basic mechanisms for representing the connection between your
+-program and the file: file descriptors and streams.  File descriptors
+-are represented as objects of type `int', while streams are represented
+-as `FILE *' objects.
+-
+-   File descriptors provide a primitive, low-level interface to input
+-and output operations.  Both file descriptors and streams can represent
+-a connection to a device (such as a terminal), or a pipe or socket for
+-communicating with another process, as well as a normal file.  But, if
+-you want to do control operations that are specific to a particular kind
+-of device, you must use a file descriptor; there are no facilities to
+-use streams in this way.  You must also use file descriptors if your
+-program needs to do input or output in special modes, such as
+-nonblocking (or polled) input (*note File Status Flags::.).
+-
+-   Streams provide a higher-level interface, layered on top of the
+-primitive file descriptor facilities.  The stream interface treats all
+-kinds of files pretty much alike--the sole exception being the three
+-styles of buffering that you can choose (*note Stream Buffering::.).
+-
+-   The main advantage of using the stream interface is that the set of
+-functions for performing actual input and output operations (as opposed
+-to control operations) on streams is much richer and more powerful than
+-the corresponding facilities for file descriptors.  The file descriptor
+-interface provides only simple functions for transferring blocks of
+-characters, but the stream interface also provides powerful formatted
+-input and output functions (`printf' and `scanf') as well as functions
+-for character- and line-oriented input and output.
+-
+-   Since streams are implemented in terms of file descriptors, you can
+-extract the file descriptor from a stream and perform low-level
+-operations directly on the file descriptor.  You can also initially open
+-a connection as a file descriptor and then make a stream associated with
+-that file descriptor.
+-
+-   In general, you should stick with using streams rather than file
+-descriptors, unless there is some specific operation you want to do that
+-can only be done on a file descriptor.  If you are a beginning
+-programmer and aren't sure what functions to use, we suggest that you
+-concentrate on the formatted input functions (*note Formatted Input::.)
+-and formatted output functions (*note Formatted Output::.).
+-
+-   If you are concerned about portability of your programs to systems
+-other than GNU, you should also be aware that file descriptors are not
+-as portable as streams.  You can expect any system running ISO C to
+-support streams, but non-GNU systems may not support file descriptors at
+-all, or may only implement a subset of the GNU functions that operate on
+-file descriptors.  Most of the file descriptor functions in the GNU
+-library are included in the POSIX.1 standard, however.
+-
+-
+-File: libc.info,  Node: File Position,  Prev: Streams and File Descriptors,  Up: I/O Concepts
+-
+-File Position
+--------------
+-
+-   One of the attributes of an open file is its "file position" that
+-keeps track of where in the file the next character is to be read or
+-written.  In the GNU system, and all POSIX.1 systems, the file position
+-is simply an integer representing the number of bytes from the beginning
+-of the file.
+-
+-   The file position is normally set to the beginning of the file when
+-it is opened, and each time a character is read or written, the file
+-position is incremented.  In other words, access to the file is normally
+-"sequential".
+-
+-   Ordinary files permit read or write operations at any position within
+-the file.  Some other kinds of files may also permit this.  Files which
+-do permit this are sometimes referred to as "random-access" files.  You
+-can change the file position using the `fseek' function on a stream
+-(*note File Positioning::.) or the `lseek' function on a file
+-descriptor (*note I/O Primitives::.).  If you try to change the file
+-position on a file that doesn't support random access, you get the
+-`ESPIPE' error.
+-
+-   Streams and descriptors that are opened for "append access" are
+-treated specially for output: output to such files is *always* appended
+-sequentially to the *end* of the file, regardless of the file position.
+-However, the file position is still used to control where in the file
+-reading is done.
+-
+-   If you think about it, you'll realize that several programs can read
+-a given file at the same time.  In order for each program to be able to
+-read the file at its own pace, each program must have its own file
+-pointer, which is not affected by anything the other programs do.
+-
+-   In fact, each opening of a file creates a separate file position.
+-Thus, if you open a file twice even in the same program, you get two
+-streams or descriptors with independent file positions.
+-
+-   By contrast, if you open a descriptor and then duplicate it to get
+-another descriptor, these two descriptors share the same file position:
+-changing the file position of one descriptor will affect the other.
+-
+-
+-File: libc.info,  Node: File Names,  Prev: I/O Concepts,  Up: I/O Overview
+-
+-File Names
+-==========
+-
+-   In order to open a connection to a file, or to perform other
+-operations such as deleting a file, you need some way to refer to the
+-file.  Nearly all files have names that are strings--even files which
+-are actually devices such as tape drives or terminals.  These strings
+-are called "file names".  You specify the file name to say which file
+-you want to open or operate on.
+-
+-   This section describes the conventions for file names and how the
+-operating system works with them.
+-
+-* Menu:
+-
+-* Directories::                 Directories contain entries for files.
+-* File Name Resolution::        A file name specifies how to look up a file.
+-* File Name Errors::            Error conditions relating to file names.
+-* File Name Portability::       File name portability and syntax issues.
+-
+-
+-File: libc.info,  Node: Directories,  Next: File Name Resolution,  Up: File Names
+-
+-Directories
+------------
+-
+-   In order to understand the syntax of file names, you need to
+-understand how the file system is organized into a hierarchy of
+-directories.
+-
+-   A "directory" is a file that contains information to associate other
+-files with names; these associations are called "links" or "directory
+-entries".  Sometimes, people speak of "files in a directory", but in
+-reality, a directory only contains pointers to files, not the files
+-themselves.
+-
+-   The name of a file contained in a directory entry is called a "file
+-name component".  In general, a file name consists of a sequence of one
+-or more such components, separated by the slash character (`/').  A
+-file name which is just one component names a file with respect to its
+-directory.  A file name with multiple components names a directory, and
+-then a file in that directory, and so on.
+-
+-   Some other documents, such as the POSIX standard, use the term
+-"pathname" for what we call a file name, and either "filename" or
+-"pathname component" for what this manual calls a file name component.
+-We don't use this terminology because a "path" is something completely
+-different (a list of directories to search), and we think that
+-"pathname" used for something else will confuse users.  We always use
+-"file name" and "file name component" (or sometimes just "component",
+-where the context is obvious) in GNU documentation.  Some macros use
+-the POSIX terminology in their names, such as `PATH_MAX'.  These macros
+-are defined by the POSIX standard, so we cannot change their names.
+-
+-   You can find more detailed information about operations on
+-directories in *Note File System Interface::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-14 glibc-2.1.3/manual/libc.info-14
+--- ../glibc-2.1.3/manual/libc.info-14	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-14	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1114 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: File Name Resolution,  Next: File Name Errors,  Prev: Directories,  Up: File Names
+-
+-File Name Resolution
+---------------------
+-
+-   A file name consists of file name components separated by slash
+-(`/') characters.  On the systems that the GNU C library supports,
+-multiple successive `/' characters are equivalent to a single `/'
+-character.
+-
+-   The process of determining what file a file name refers to is called
+-"file name resolution".  This is performed by examining the components
+-that make up a file name in left-to-right order, and locating each
+-successive component in the directory named by the previous component.
+-Of course, each of the files that are referenced as directories must
+-actually exist, be directories instead of regular files, and have the
+-appropriate permissions to be accessible by the process; otherwise the
+-file name resolution fails.
+-
+-   If a file name begins with a `/', the first component in the file
+-name is located in the "root directory" of the process (usually all
+-processes on the system have the same root directory).  Such a file name
+-is called an "absolute file name".
+-
+-   Otherwise, the first component in the file name is located in the
+-current working directory (*note Working Directory::.).  This kind of
+-file name is called a "relative file name".
+-
+-   The file name components `.' ("dot") and `..' ("dot-dot") have
+-special meanings.  Every directory has entries for these file name
+-components.  The file name component `.' refers to the directory
+-itself, while the file name component `..' refers to its "parent
+-directory" (the directory that contains the link for the directory in
+-question).  As a special case, `..' in the root directory refers to the
+-root directory itself, since it has no parent; thus `/..' is the same
+-as `/'.
+-
+-   Here are some examples of file names:
+-
+-`/a'
+-     The file named `a', in the root directory.
+-
+-`/a/b'
+-     The file named `b', in the directory named `a' in the root
+-     directory.
+-
+-`a'
+-     The file named `a', in the current working directory.
+-
+-`/a/./b'
+-     This is the same as `/a/b'.
+-
+-`./a'
+-     The file named `a', in the current working directory.
+-
+-`../a'
+-     The file named `a', in the parent directory of the current working
+-     directory.
+-
+-   A file name that names a directory may optionally end in a `/'.  You
+-can specify a file name of `/' to refer to the root directory, but the
+-empty string is not a meaningful file name.  If you want to refer to
+-the current working directory, use a file name of `.' or `./'.
+-
+-   Unlike some other operating systems, the GNU system doesn't have any
+-built-in support for file types (or extensions) or file versions as part
+-of its file name syntax.  Many programs and utilities use conventions
+-for file names--for example, files containing C source code usually
+-have names suffixed with `.c'--but there is nothing in the file system
+-itself that enforces this kind of convention.
+-
+-
+-File: libc.info,  Node: File Name Errors,  Next: File Name Portability,  Prev: File Name Resolution,  Up: File Names
+-
+-File Name Errors
+-----------------
+-
+-   Functions that accept file name arguments usually detect these
+-`errno' error conditions relating to the file name syntax or trouble
+-finding the named file.  These errors are referred to throughout this
+-manual as the "usual file name errors".
+-
+-`EACCES'
+-     The process does not have search permission for a directory
+-     component of the file name.
+-
+-`ENAMETOOLONG'
+-     This error is used when either the total length of a file name is
+-     greater than `PATH_MAX', or when an individual file name component
+-     has a length greater than `NAME_MAX'.  *Note Limits for Files::.
+-
+-     In the GNU system, there is no imposed limit on overall file name
+-     length, but some file systems may place limits on the length of a
+-     component.
+-
+-`ENOENT'
+-     This error is reported when a file referenced as a directory
+-     component in the file name doesn't exist, or when a component is a
+-     symbolic link whose target file does not exist.  *Note Symbolic
+-     Links::.
+-
+-`ENOTDIR'
+-     A file that is referenced as a directory component in the file name
+-     exists, but it isn't a directory.
+-
+-`ELOOP'
+-     Too many symbolic links were resolved while trying to look up the
+-     file name.  The system has an arbitrary limit on the number of
+-     symbolic links that may be resolved in looking up a single file
+-     name, as a primitive way to detect loops.  *Note Symbolic Links::.
+-
+-
+-File: libc.info,  Node: File Name Portability,  Prev: File Name Errors,  Up: File Names
+-
+-Portability of File Names
+--------------------------
+-
+-   The rules for the syntax of file names discussed in *Note File
+-Names::, are the rules normally used by the GNU system and by other
+-POSIX systems.  However, other operating systems may use other
+-conventions.
+-
+-   There are two reasons why it can be important for you to be aware of
+-file name portability issues:
+-
+-   * If your program makes assumptions about file name syntax, or
+-     contains embedded literal file name strings, it is more difficult
+-     to get it to run under other operating systems that use different
+-     syntax conventions.
+-
+-   * Even if you are not concerned about running your program on
+-     machines that run other operating systems, it may still be
+-     possible to access files that use different naming conventions.
+-     For example, you may be able to access file systems on another
+-     computer running a different operating system over a network, or
+-     read and write disks in formats used by other operating systems.
+-
+-   The ISO C standard says very little about file name syntax, only that
+-file names are strings.  In addition to varying restrictions on the
+-length of file names and what characters can validly appear in a file
+-name, different operating systems use different conventions and syntax
+-for concepts such as structured directories and file types or
+-extensions.  Some concepts such as file versions might be supported in
+-some operating systems and not by others.
+-
+-   The POSIX.1 standard allows implementations to put additional
+-restrictions on file name syntax, concerning what characters are
+-permitted in file names and on the length of file name and file name
+-component strings.  However, in the GNU system, you do not need to worry
+-about these restrictions; any character except the null character is
+-permitted in a file name string, and there are no limits on the length
+-of file name strings.
+-
+-
+-File: libc.info,  Node: I/O on Streams,  Next: Low-Level I/O,  Prev: I/O Overview,  Up: Top
+-
+-Input/Output on Streams
+-***********************
+-
+-   This chapter describes the functions for creating streams and
+-performing input and output operations on them.  As discussed in *Note
+-I/O Overview::, a stream is a fairly abstract, high-level concept
+-representing a communications channel to a file, device, or process.
+-
+-* Menu:
+-
+-* Streams::                     About the data type representing a stream.
+-* Standard Streams::            Streams to the standard input and output
+-                                 devices are created for you.
+-* Opening Streams::             How to create a stream to talk to a file.
+-* Closing Streams::             Close a stream when you are finished with it.
+-* Simple Output::               Unformatted output by characters and lines.
+-* Character Input::             Unformatted input by characters and words.
+-* Line Input::                  Reading a line or a record from a stream.
+-* Unreading::                   Peeking ahead/pushing back input just read.
+-* Block Input/Output::          Input and output operations on blocks of data.
+-* Formatted Output::            `printf' and related functions.
+-* Customizing Printf::          You can define new conversion specifiers for
+-                                 `printf' and friends.
+-* Formatted Input::             `scanf' and related functions.
+-* EOF and Errors::              How you can tell if an I/O error happens.
+-* Binary Streams::              Some systems distinguish between text files
+-                                 and binary files.
+-* File Positioning::            About random-access streams.
+-* Portable Positioning::        Random access on peculiar ISO C systems.
+-* Stream Buffering::            How to control buffering of streams.
+-* Other Kinds of Streams::      Streams that do not necessarily correspond
+-                                 to an open file.
+-* Formatted Messages::          Print strictly formatted messages.
+-
+-
+-File: libc.info,  Node: Streams,  Next: Standard Streams,  Up: I/O on Streams
+-
+-Streams
+-=======
+-
+-   For historical reasons, the type of the C data structure that
+-represents a stream is called `FILE' rather than "stream".  Since most
+-of the library functions deal with objects of type `FILE *', sometimes
+-the term "file pointer" is also used to mean "stream".  This leads to
+-unfortunate confusion over terminology in many books on C.  This
+-manual, however, is careful to use the terms "file" and "stream" only
+-in the technical sense.
+-
+-   The `FILE' type is declared in the header file `stdio.h'.
+-
+- - Data Type: FILE
+-     This is the data type used to represent stream objects.  A `FILE'
+-     object holds all of the internal state information about the
+-     connection to the associated file, including such things as the
+-     file position indicator and buffering information.  Each stream
+-     also has error and end-of-file status indicators that can be
+-     tested with the `ferror' and `feof' functions; see *Note EOF and
+-     Errors::.
+-
+-   `FILE' objects are allocated and managed internally by the
+-input/output library functions.  Don't try to create your own objects of
+-type `FILE'; let the library do it.  Your programs should deal only
+-with pointers to these objects (that is, `FILE *' values) rather than
+-the objects themselves.
+-
+-
+-File: libc.info,  Node: Standard Streams,  Next: Opening Streams,  Prev: Streams,  Up: I/O on Streams
+-
+-Standard Streams
+-================
+-
+-   When the `main' function of your program is invoked, it already has
+-three predefined streams open and available for use.  These represent
+-the "standard" input and output channels that have been established for
+-the process.
+-
+-   These streams are declared in the header file `stdio.h'.
+-
+- - Variable: FILE * stdin
+-     The "standard input" stream, which is the normal source of input
+-     for the program.
+-
+- - Variable: FILE * stdout
+-     The "standard output" stream, which is used for normal output from
+-     the program.
+-
+- - Variable: FILE * stderr
+-     The "standard error" stream, which is used for error messages and
+-     diagnostics issued by the program.
+-
+-   In the GNU system, you can specify what files or processes
+-correspond to these streams using the pipe and redirection facilities
+-provided by the shell.  (The primitives shells use to implement these
+-facilities are described in *Note File System Interface::.)  Most other
+-operating systems provide similar mechanisms, but the details of how to
+-use them can vary.
+-
+-   In the GNU C library, `stdin', `stdout', and `stderr' are normal
+-variables which you can set just like any others.  For example, to
+-redirect the standard output to a file, you could do:
+-
+-     fclose (stdout);
+-     stdout = fopen ("standard-output-file", "w");
+-
+-   Note however, that in other systems `stdin', `stdout', and `stderr'
+-are macros that you cannot assign to in the normal way.  But you can
+-use `freopen' to get the effect of closing one and reopening it.  *Note
+-Opening Streams::.
+-
+-
+-File: libc.info,  Node: Opening Streams,  Next: Closing Streams,  Prev: Standard Streams,  Up: I/O on Streams
+-
+-Opening Streams
+-===============
+-
+-   Opening a file with the `fopen' function creates a new stream and
+-establishes a connection between the stream and a file.  This may
+-involve creating a new file.
+-
+-   Everything described in this section is declared in the header file
+-`stdio.h'.
+-
+- - Function: FILE * fopen (const char *FILENAME, const char *OPENTYPE)
+-     The `fopen' function opens a stream for I/O to the file FILENAME,
+-     and returns a pointer to the stream.
+-
+-     The OPENTYPE argument is a string that controls how the file is
+-     opened and specifies attributes of the resulting stream.  It must
+-     begin with one of the following sequences of characters:
+-
+-    `r'
+-          Open an existing file for reading only.
+-
+-    `w'
+-          Open the file for writing only.  If the file already exists,
+-          it is truncated to zero length.  Otherwise a new file is
+-          created.
+-
+-    `a'
+-          Open a file for append access; that is, writing at the end of
+-          file only.  If the file already exists, its initial contents
+-          are unchanged and output to the stream is appended to the end
+-          of the file.  Otherwise, a new, empty file is created.
+-
+-    `r+'
+-          Open an existing file for both reading and writing.  The
+-          initial contents of the file are unchanged and the initial
+-          file position is at the beginning of the file.
+-
+-    `w+'
+-          Open a file for both reading and writing.  If the file
+-          already exists, it is truncated to zero length.  Otherwise, a
+-          new file is created.
+-
+-    `a+'
+-          Open or create file for both reading and appending.  If the
+-          file exists, its initial contents are unchanged.  Otherwise,
+-          a new file is created.  The initial file position for reading
+-          is at the beginning of the file, but output is always
+-          appended to the end of the file.
+-
+-     As you can see, `+' requests a stream that can do both input and
+-     output.  The ISO standard says that when using such a stream, you
+-     must call `fflush' (*note Stream Buffering::.) or a file
+-     positioning function such as `fseek' (*note File Positioning::.)
+-     when switching from reading to writing or vice versa.  Otherwise,
+-     internal buffers might not be emptied properly.  The GNU C library
+-     does not have this limitation; you can do arbitrary reading and
+-     writing operations on a stream in whatever order.
+-
+-     Additional characters may appear after these to specify flags for
+-     the call.  Always put the mode (`r', `w+', etc.) first; that is
+-     the only part you are guaranteed will be understood by all systems.
+-
+-     The GNU C library defines one additional character for use in
+-     OPENTYPE: the character `x' insists on creating a new file--if a
+-     file FILENAME already exists, `fopen' fails rather than opening
+-     it.  If you use `x' you can are guaranteed that you will not
+-     clobber an existing file.  This is equivalent to the `O_EXCL'
+-     option to the `open' function (*note Opening and Closing Files::.).
+-
+-     The character `b' in OPENTYPE has a standard meaning; it requests
+-     a binary stream rather than a text stream.  But this makes no
+-     difference in POSIX systems (including the GNU system).  If both
+-     `+' and `b' are specified, they can appear in either order.  *Note
+-     Binary Streams::.
+-
+-     Any other characters in OPENTYPE are simply ignored.  They may be
+-     meaningful in other systems.
+-
+-     If the open fails, `fopen' returns a null pointer.
+-
+-     When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits machine this function is in fact `fopen64' since the LFS
+-     interface replaces transparently the old interface.
+-
+-   You can have multiple streams (or file descriptors) pointing to the
+-same file open at the same time.  If you do only input, this works
+-straightforwardly, but you must be careful if any output streams are
+-included.  *Note Stream/Descriptor Precautions::.  This is equally true
+-whether the streams are in one program (not usual) or in several
+-programs (which can easily happen).  It may be advantageous to use the
+-file locking facilities to avoid simultaneous access.  *Note File
+-Locks::.
+-
+- - Function: FILE * fopen64 (const char *FILENAME, const char *OPENTYPE)
+-     This function is similar to `fopen' but the stream it returns a
+-     pointer for is opened using `open64'.  Therefore this stream can be
+-     used even on files larger then 2^31 bytes on 32 bits machines.
+-
+-     Please note that the return type is still `FILE *'.  There is no
+-     special `FILE' type for the LFS interface.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `fopen' and
+-     so transparently replaces the old interface.
+-
+- - Macro: int FOPEN_MAX
+-     The value of this macro is an integer constant expression that
+-     represents the minimum number of streams that the implementation
+-     guarantees can be open simultaneously.  You might be able to open
+-     more than this many streams, but that is not guaranteed.  The
+-     value of this constant is at least eight, which includes the three
+-     standard streams `stdin', `stdout', and `stderr'.  In POSIX.1
+-     systems this value is determined by the `OPEN_MAX' parameter;
+-     *note General Limits::..  In BSD and GNU, it is controlled by the
+-     `RLIMIT_NOFILE' resource limit; *note Limits on Resources::..
+-
+- - Function: FILE * freopen (const char *FILENAME, const char
+-          *OPENTYPE, FILE *STREAM)
+-     This function is like a combination of `fclose' and `fopen'.  It
+-     first closes the stream referred to by STREAM, ignoring any errors
+-     that are detected in the process.  (Because errors are ignored,
+-     you should not use `freopen' on an output stream if you have
+-     actually done any output using the stream.)  Then the file named by
+-     FILENAME is opened with mode OPENTYPE as for `fopen', and
+-     associated with the same stream object STREAM.
+-
+-     If the operation fails, a null pointer is returned; otherwise,
+-     `freopen' returns STREAM.
+-
+-     `freopen' has traditionally been used to connect a standard stream
+-     such as `stdin' with a file of your own choice.  This is useful in
+-     programs in which use of a standard stream for certain purposes is
+-     hard-coded.  In the GNU C library, you can simply close the
+-     standard streams and open new ones with `fopen'.  But other
+-     systems lack this ability, so using `freopen' is more portable.
+-
+-     When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits machine this function is in fact `freopen64' since the LFS
+-     interface replaces transparently the old interface.
+-
+- - Function: FILE * freopen64 (const char *FILENAME, const char
+-          *OPENTYPE, FILE *STREAM)
+-     This function is similar to `freopen'.  The only difference is that
+-     on 32 bits machine the stream returned is able to read beyond the
+-     2^31 bytes limits imposed by the normal interface.  It should be
+-     noted that the stream pointed to by STREAM need not be opened
+-     using `fopen64' or `freopen64' since its mode is not important for
+-     this function.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `freopen'
+-     and so transparently replaces the old interface.
+-
+-
+-File: libc.info,  Node: Closing Streams,  Next: Simple Output,  Prev: Opening Streams,  Up: I/O on Streams
+-
+-Closing Streams
+-===============
+-
+-   When a stream is closed with `fclose', the connection between the
+-stream and the file is cancelled.  After you have closed a stream, you
+-cannot perform any additional operations on it.
+-
+- - Function: int fclose (FILE *STREAM)
+-     This function causes STREAM to be closed and the connection to the
+-     corresponding file to be broken.  Any buffered output is written
+-     and any buffered input is discarded.  The `fclose' function returns
+-     a value of `0' if the file was closed successfully, and `EOF' if
+-     an error was detected.
+-
+-     It is important to check for errors when you call `fclose' to close
+-     an output stream, because real, everyday errors can be detected at
+-     this time.  For example, when `fclose' writes the remaining
+-     buffered output, it might get an error because the disk is full.
+-     Even if you know the buffer is empty, errors can still occur when
+-     closing a file if you are using NFS.
+-
+-     The function `fclose' is declared in `stdio.h'.
+-
+-   To close all streams currently available the GNU C Library provides
+-another function.
+-
+- - Function: int fcloseall (void)
+-     This function causes all open streams of the process to be closed
+-     and the connection to corresponding files to be broken.  All
+-     buffered data is written and any buffered input is discarded.  The
+-     `fcloseall' function returns a value of `0' if all the files were
+-     closed successfully, and `EOF' if an error was detected.
+-
+-     This function should be used only in special situation, e.g., when
+-     an error occurred and the program must be aborted.  Normally each
+-     single stream should be closed separately so that problems with
+-     one stream can be identified.  It is also problematic since the
+-     standard streams (*note Standard Streams::.) will also be closed.
+-
+-     The function `fcloseall' is declared in `stdio.h'.
+-
+-   If the `main' function to your program returns, or if you call the
+-`exit' function (*note Normal Termination::.), all open streams are
+-automatically closed properly.  If your program terminates in any other
+-manner, such as by calling the `abort' function (*note Aborting a
+-Program::.) or from a fatal signal (*note Signal Handling::.), open
+-streams might not be closed properly.  Buffered output might not be
+-flushed and files may be incomplete.  For more information on buffering
+-of streams, see *Note Stream Buffering::.
+-
+-
+-File: libc.info,  Node: Simple Output,  Next: Character Input,  Prev: Closing Streams,  Up: I/O on Streams
+-
+-Simple Output by Characters or Lines
+-====================================
+-
+-   This section describes functions for performing character- and
+-line-oriented output.
+-
+-   These functions are declared in the header file `stdio.h'.
+-
+- - Function: int fputc (int C, FILE *STREAM)
+-     The `fputc' function converts the character C to type `unsigned
+-     char', and writes it to the stream STREAM.  `EOF' is returned if a
+-     write error occurs; otherwise the character C is returned.
+-
+- - Function: int putc (int C, FILE *STREAM)
+-     This is just like `fputc', except that most systems implement it as
+-     a macro, making it faster.  One consequence is that it may
+-     evaluate the STREAM argument more than once, which is an exception
+-     to the general rule for macros.  `putc' is usually the best
+-     function to use for writing a single character.
+-
+- - Function: int putchar (int C)
+-     The `putchar' function is equivalent to `putc' with `stdout' as
+-     the value of the STREAM argument.
+-
+- - Function: int fputs (const char *S, FILE *STREAM)
+-     The function `fputs' writes the string S to the stream STREAM.
+-     The terminating null character is not written.  This function does
+-     *not* add a newline character, either.  It outputs only the
+-     characters in the string.
+-
+-     This function returns `EOF' if a write error occurs, and otherwise
+-     a non-negative value.
+-
+-     For example:
+-
+-          fputs ("Are ", stdout);
+-          fputs ("you ", stdout);
+-          fputs ("hungry?\n", stdout);
+-
+-     outputs the text `Are you hungry?' followed by a newline.
+-
+- - Function: int puts (const char *S)
+-     The `puts' function writes the string S to the stream `stdout'
+-     followed by a newline.  The terminating null character of the
+-     string is not written.  (Note that `fputs' does *not* write a
+-     newline as this function does.)
+-
+-     `puts' is the most convenient function for printing simple
+-     messages.  For example:
+-
+-          puts ("This is a message.");
+-
+- - Function: int putw (int W, FILE *STREAM)
+-     This function writes the word W (that is, an `int') to STREAM.  It
+-     is provided for compatibility with SVID, but we recommend you use
+-     `fwrite' instead (*note Block Input/Output::.).
+-
+-
+-File: libc.info,  Node: Character Input,  Next: Line Input,  Prev: Simple Output,  Up: I/O on Streams
+-
+-Character Input
+-===============
+-
+-   This section describes functions for performing character-oriented
+-input.  These functions are declared in the header file `stdio.h'.
+-
+-   These functions return an `int' value that is either a character of
+-input, or the special value `EOF' (usually -1).  It is important to
+-store the result of these functions in a variable of type `int' instead
+-of `char', even when you plan to use it only as a character.  Storing
+-`EOF' in a `char' variable truncates its value to the size of a
+-character, so that it is no longer distinguishable from the valid
+-character `(char) -1'.  So always use an `int' for the result of `getc'
+-and friends, and check for `EOF' after the call; once you've verified
+-that the result is not `EOF', you can be sure that it will fit in a
+-`char' variable without loss of information.
+-
+- - Function: int fgetc (FILE *STREAM)
+-     This function reads the next character as an `unsigned char' from
+-     the stream STREAM and returns its value, converted to an `int'.
+-     If an end-of-file condition or read error occurs, `EOF' is
+-     returned instead.
+-
+- - Function: int getc (FILE *STREAM)
+-     This is just like `fgetc', except that it is permissible (and
+-     typical) for it to be implemented as a macro that evaluates the
+-     STREAM argument more than once.  `getc' is often highly optimized,
+-     so it is usually the best function to use to read a single
+-     character.
+-
+- - Function: int getchar (void)
+-     The `getchar' function is equivalent to `getc' with `stdin' as the
+-     value of the STREAM argument.
+-
+-   Here is an example of a function that does input using `fgetc'.  It
+-would work just as well using `getc' instead, or using `getchar ()'
+-instead of `fgetc (stdin)'.
+-
+-     int
+-     y_or_n_p (const char *question)
+-     {
+-       fputs (question, stdout);
+-       while (1)
+-         {
+-           int c, answer;
+-           /* Write a space to separate answer from question. */
+-           fputc (' ', stdout);
+-           /* Read the first character of the line.
+-              This should be the answer character, but might not be. */
+-           c = tolower (fgetc (stdin));
+-           answer = c;
+-           /* Discard rest of input line. */
+-           while (c != '\n' && c != EOF)
+-             c = fgetc (stdin);
+-           /* Obey the answer if it was valid. */
+-           if (answer == 'y')
+-             return 1;
+-           if (answer == 'n')
+-             return 0;
+-           /* Answer was invalid: ask for valid answer. */
+-           fputs ("Please answer y or n:", stdout);
+-         }
+-     }
+-
+- - Function: int getw (FILE *STREAM)
+-     This function reads a word (that is, an `int') from STREAM.  It's
+-     provided for compatibility with SVID.  We recommend you use
+-     `fread' instead (*note Block Input/Output::.).  Unlike `getc', any
+-     `int' value could be a valid result.  `getw' returns `EOF' when it
+-     encounters end-of-file or an error, but there is no way to
+-     distinguish this from an input word with value -1.
+-
+-
+-File: libc.info,  Node: Line Input,  Next: Unreading,  Prev: Character Input,  Up: I/O on Streams
+-
+-Line-Oriented Input
+-===================
+-
+-   Since many programs interpret input on the basis of lines, it's
+-convenient to have functions to read a line of text from a stream.
+-
+-   Standard C has functions to do this, but they aren't very safe: null
+-characters and even (for `gets') long lines can confuse them.  So the
+-GNU library provides the nonstandard `getline' function that makes it
+-easy to read lines reliably.
+-
+-   Another GNU extension, `getdelim', generalizes `getline'.  It reads
+-a delimited record, defined as everything through the next occurrence
+-of a specified delimiter character.
+-
+-   All these functions are declared in `stdio.h'.
+-
+- - Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)
+-     This function reads an entire line from STREAM, storing the text
+-     (including the newline and a terminating null character) in a
+-     buffer and storing the buffer address in `*LINEPTR'.
+-
+-     Before calling `getline', you should place in `*LINEPTR' the
+-     address of a buffer `*N' bytes long, allocated with `malloc'.  If
+-     this buffer is long enough to hold the line, `getline' stores the
+-     line in this buffer.  Otherwise, `getline' makes the buffer bigger
+-     using `realloc', storing the new buffer address back in `*LINEPTR'
+-     and the increased size back in `*N'.  *Note Unconstrained
+-     Allocation::.
+-
+-     If you set `*LINEPTR' to a null pointer, and `*N' to zero, before
+-     the call, then `getline' allocates the initial buffer for you by
+-     calling `malloc'.
+-
+-     In either case, when `getline' returns,  `*LINEPTR' is a `char *'
+-     which points to the text of the line.
+-
+-     When `getline' is successful, it returns the number of characters
+-     read (including the newline, but not including the terminating
+-     null).  This value enables you to distinguish null characters that
+-     are part of the line from the null character inserted as a
+-     terminator.
+-
+-     This function is a GNU extension, but it is the recommended way to
+-     read lines from a stream.  The alternative standard functions are
+-     unreliable.
+-
+-     If an error occurs or end of file is reached, `getline' returns
+-     `-1'.
+-
+- - Function: ssize_t getdelim (char **LINEPTR, size_t *N, int
+-          DELIMITER, FILE *STREAM)
+-     This function is like `getline' except that the character which
+-     tells it to stop reading is not necessarily newline.  The argument
+-     DELIMITER specifies the delimiter character; `getdelim' keeps
+-     reading until it sees that character (or end of file).
+-
+-     The text is stored in LINEPTR, including the delimiter character
+-     and a terminating null.  Like `getline', `getdelim' makes LINEPTR
+-     bigger if it isn't big enough.
+-
+-     `getline' is in fact implemented in terms of `getdelim', just like
+-     this:
+-
+-          ssize_t
+-          getline (char **lineptr, size_t *n, FILE *stream)
+-          {
+-            return getdelim (lineptr, n, '\n', stream);
+-          }
+-
+- - Function: char * fgets (char *S, int COUNT, FILE *STREAM)
+-     The `fgets' function reads characters from the stream STREAM up to
+-     and including a newline character and stores them in the string S,
+-     adding a null character to mark the end of the string.  You must
+-     supply COUNT characters worth of space in S, but the number of
+-     characters read is at most COUNT - 1.  The extra character space
+-     is used to hold the null character at the end of the string.
+-
+-     If the system is already at end of file when you call `fgets', then
+-     the contents of the array S are unchanged and a null pointer is
+-     returned.  A null pointer is also returned if a read error occurs.
+-     Otherwise, the return value is the pointer S.
+-
+-     *Warning:*  If the input data has a null character, you can't tell.
+-     So don't use `fgets' unless you know the data cannot contain a
+-     null.  Don't use it to read files edited by the user because, if
+-     the user inserts a null character, you should either handle it
+-     properly or print a clear error message.  We recommend using
+-     `getline' instead of `fgets'.
+-
+- - Deprecated function: char * gets (char *S)
+-     The function `gets' reads characters from the stream `stdin' up to
+-     the next newline character, and stores them in the string S.  The
+-     newline character is discarded (note that this differs from the
+-     behavior of `fgets', which copies the newline character into the
+-     string).  If `gets' encounters a read error or end-of-file, it
+-     returns a null pointer; otherwise it returns S.
+-
+-     *Warning:* The `gets' function is *very dangerous* because it
+-     provides no protection against overflowing the string S.  The GNU
+-     library includes it for compatibility only.  You should *always*
+-     use `fgets' or `getline' instead.  To remind you of this, the
+-     linker (if using GNU `ld') will issue a warning whenever you use
+-     `gets'.
+-
+-
+-File: libc.info,  Node: Unreading,  Next: Block Input/Output,  Prev: Line Input,  Up: I/O on Streams
+-
+-Unreading
+-=========
+-
+-   In parser programs it is often useful to examine the next character
+-in the input stream without removing it from the stream.  This is called
+-"peeking ahead" at the input because your program gets a glimpse of the
+-input it will read next.
+-
+-   Using stream I/O, you can peek ahead at input by first reading it and
+-then "unreading" it (also called  "pushing it back" on the stream).
+-Unreading a character makes it available to be input again from the
+-stream, by  the next call to `fgetc' or other input function on that
+-stream.
+-
+-* Menu:
+-
+-* Unreading Idea::              An explanation of unreading with pictures.
+-* How Unread::                  How to call `ungetc' to do unreading.
+-
+-
+-File: libc.info,  Node: Unreading Idea,  Next: How Unread,  Up: Unreading
+-
+-What Unreading Means
+---------------------
+-
+-   Here is a pictorial explanation of unreading.  Suppose you have a
+-stream reading a file that contains just six characters, the letters
+-`foobar'.  Suppose you have read three characters so far.  The
+-situation looks like this:
+-
+-     f  o  o  b  a  r
+-              ^
+-
+-so the next input character will be `b'.
+-
+-   If instead of reading `b' you unread the letter `o', you get a
+-situation like this:
+-
+-     f  o  o  b  a  r
+-              |
+-           o--
+-           ^
+-
+-so that the next input characters will be `o' and `b'.
+-
+-   If you unread `9' instead of `o', you get this situation:
+-
+-     f  o  o  b  a  r
+-              |
+-           9--
+-           ^
+-
+-so that the next input characters will be `9' and `b'.
+-
+-
+-File: libc.info,  Node: How Unread,  Prev: Unreading Idea,  Up: Unreading
+-
+-Using `ungetc' To Do Unreading
+-------------------------------
+-
+-   The function to unread a character is called `ungetc', because it
+-reverses the action of `getc'.
+-
+- - Function: int ungetc (int C, FILE *STREAM)
+-     The `ungetc' function pushes back the character C onto the input
+-     stream STREAM.  So the next input from STREAM will read C before
+-     anything else.
+-
+-     If C is `EOF', `ungetc' does nothing and just returns `EOF'.  This
+-     lets you call `ungetc' with the return value of `getc' without
+-     needing to check for an error from `getc'.
+-
+-     The character that you push back doesn't have to be the same as
+-     the last character that was actually read from the stream.  In
+-     fact, it isn't necessary to actually read any characters from the
+-     stream before unreading them with `ungetc'!  But that is a strange
+-     way to write a program; usually `ungetc' is used only to unread a
+-     character that was just read from the same stream.
+-
+-     The GNU C library only supports one character of pushback--in other
+-     words, it does not work to call `ungetc' twice without doing input
+-     in between.  Other systems might let you push back multiple
+-     characters; then reading from the stream retrieves the characters
+-     in the reverse order that they were pushed.
+-
+-     Pushing back characters doesn't alter the file; only the internal
+-     buffering for the stream is affected.  If a file positioning
+-     function (such as `fseek', `fseeko' or `rewind'; *note File
+-     Positioning::.) is called, any pending pushed-back characters are
+-     discarded.
+-
+-     Unreading a character on a stream that is at end of file clears the
+-     end-of-file indicator for the stream, because it makes the
+-     character of input available.  After you read that character,
+-     trying to read again will encounter end of file.
+-
+-   Here is an example showing the use of `getc' and `ungetc' to skip
+-over whitespace characters.  When this function reaches a
+-non-whitespace character, it unreads that character to be seen again on
+-the next read operation on the stream.
+-
+-     #include <stdio.h>
+-     #include <ctype.h>
+-     
+-     void
+-     skip_whitespace (FILE *stream)
+-     {
+-       int c;
+-       do
+-         /* No need to check for `EOF' because it is not
+-            `isspace', and `ungetc' ignores `EOF'.  */
+-         c = getc (stream);
+-       while (isspace (c));
+-       ungetc (c, stream);
+-     }
+-
+-
+-File: libc.info,  Node: Block Input/Output,  Next: Formatted Output,  Prev: Unreading,  Up: I/O on Streams
+-
+-Block Input/Output
+-==================
+-
+-   This section describes how to do input and output operations on
+-blocks of data.  You can use these functions to read and write binary
+-data, as well as to read and write text in fixed-size blocks instead of
+-by characters or lines.
+-
+-   Binary files are typically used to read and write blocks of data in
+-the same format as is used to represent the data in a running program.
+-In other words, arbitrary blocks of memory--not just character or string
+-objects--can be written to a binary file, and meaningfully read in
+-again by the same program.
+-
+-   Storing data in binary form is often considerably more efficient than
+-using the formatted I/O functions.  Also, for floating-point numbers,
+-the binary form avoids possible loss of precision in the conversion
+-process.  On the other hand, binary files can't be examined or modified
+-easily using many standard file utilities (such as text editors), and
+-are not portable between different implementations of the language, or
+-different kinds of computers.
+-
+-   These functions are declared in `stdio.h'.
+-
+- - Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE
+-          *STREAM)
+-     This function reads up to COUNT objects of size SIZE into the
+-     array DATA, from the stream STREAM.  It returns the number of
+-     objects actually read, which might be less than COUNT if a read
+-     error occurs or the end of the file is reached.  This function
+-     returns a value of zero (and doesn't read anything) if either SIZE
+-     or COUNT is zero.
+-
+-     If `fread' encounters end of file in the middle of an object, it
+-     returns the number of complete objects read, and discards the
+-     partial object.  Therefore, the stream remains at the actual end
+-     of the file.
+-
+- - Function: size_t fwrite (const void *DATA, size_t SIZE, size_t
+-          COUNT, FILE *STREAM)
+-     This function writes up to COUNT objects of size SIZE from the
+-     array DATA, to the stream STREAM.  The return value is normally
+-     COUNT, if the call succeeds.  Any other value indicates some sort
+-     of error, such as running out of space.
+-
+-
+-File: libc.info,  Node: Formatted Output,  Next: Customizing Printf,  Prev: Block Input/Output,  Up: I/O on Streams
+-
+-Formatted Output
+-================
+-
+-   The functions described in this section (`printf' and related
+-functions) provide a convenient way to perform formatted output.  You
+-call `printf' with a "format string" or "template string" that
+-specifies how to format the values of the remaining arguments.
+-
+-   Unless your program is a filter that specifically performs line- or
+-character-oriented processing, using `printf' or one of the other
+-related functions described in this section is usually the easiest and
+-most concise way to perform output.  These functions are especially
+-useful for printing error messages, tables of data, and the like.
+-
+-* Menu:
+-
+-* Formatted Output Basics::     Some examples to get you started.
+-* Output Conversion Syntax::    General syntax of conversion
+-                                 specifications.
+-* Table of Output Conversions:: Summary of output conversions and
+-                                 what they do.
+-* Integer Conversions::         Details about formatting of integers.
+-* Floating-Point Conversions::  Details about formatting of
+-                                 floating-point numbers.
+-* Other Output Conversions::    Details about formatting of strings,
+-                                 characters, pointers, and the like.
+-* Formatted Output Functions::  Descriptions of the actual functions.
+-* Dynamic Output::		Functions that allocate memory for the output.
+-* Variable Arguments Output::   `vprintf' and friends.
+-* Parsing a Template String::   What kinds of args does a given template
+-                                 call for?
+-* Example of Parsing::          Sample program using `parse_printf_format'.
+-
+-
+-File: libc.info,  Node: Formatted Output Basics,  Next: Output Conversion Syntax,  Up: Formatted Output
+-
+-Formatted Output Basics
+------------------------
+-
+-   The `printf' function can be used to print any number of arguments.
+-The template string argument you supply in a call provides information
+-not only about the number of additional arguments, but also about their
+-types and what style should be used for printing them.
+-
+-   Ordinary characters in the template string are simply written to the
+-output stream as-is, while "conversion specifications" introduced by a
+-`%' character in the template cause subsequent arguments to be
+-formatted and written to the output stream.  For example,
+-
+-     int pct = 37;
+-     char filename[] = "foo.txt";
+-     printf ("Processing of `%s' is %d%% finished.\nPlease be patient.\n",
+-             filename, pct);
+-
+-produces output like
+-
+-     Processing of `foo.txt' is 37% finished.
+-     Please be patient.
+-
+-   This example shows the use of the `%d' conversion to specify that an
+-`int' argument should be printed in decimal notation, the `%s'
+-conversion to specify printing of a string argument, and the `%%'
+-conversion to print a literal `%' character.
+-
+-   There are also conversions for printing an integer argument as an
+-unsigned value in octal, decimal, or hexadecimal radix (`%o', `%u', or
+-`%x', respectively); or as a character value (`%c').
+-
+-   Floating-point numbers can be printed in normal, fixed-point notation
+-using the `%f' conversion or in exponential notation using the `%e'
+-conversion.  The `%g' conversion uses either `%e' or `%f' format,
+-depending on what is more appropriate for the magnitude of the
+-particular number.
+-
+-   You can control formatting more precisely by writing "modifiers"
+-between the `%' and the character that indicates which conversion to
+-apply.  These slightly alter the ordinary behavior of the conversion.
+-For example, most conversion specifications permit you to specify a
+-minimum field width and a flag indicating whether you want the result
+-left- or right-justified within the field.
+-
+-   The specific flags and modifiers that are permitted and their
+-interpretation vary depending on the particular conversion.  They're all
+-described in more detail in the following sections.  Don't worry if this
+-all seems excessively complicated at first; you can almost always get
+-reasonable free-format output without using any of the modifiers at all.
+-The modifiers are mostly used to make the output look "prettier" in
+-tables.
+-
+-
+-File: libc.info,  Node: Output Conversion Syntax,  Next: Table of Output Conversions,  Prev: Formatted Output Basics,  Up: Formatted Output
+-
+-Output Conversion Syntax
+-------------------------
+-
+-   This section provides details about the precise syntax of conversion
+-specifications that can appear in a `printf' template string.
+-
+-   Characters in the template string that are not part of a conversion
+-specification are printed as-is to the output stream.  Multibyte
+-character sequences (*note Character Set Handling::.) are permitted in a
+-template string.
+-
+-   The conversion specifications in a `printf' template string have the
+-general form:
+-
+-     % [ PARAM-NO $] FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION
+-
+-   For example, in the conversion specifier `%-10.8ld', the `-' is a
+-flag, `10' specifies the field width, the precision is `8', the letter
+-`l' is a type modifier, and `d' specifies the conversion style.  (This
+-particular type specifier says to print a `long int' argument in
+-decimal notation, with a minimum of 8 digits left-justified in a field
+-at least 10 characters wide.)
+-
+-   In more detail, output conversion specifications consist of an
+-initial `%' character followed in sequence by:
+-
+-   * An optional specification of the parameter used for this format.
+-     Normally the parameters to the `printf' function a assigned to the
+-     formats in the order of appearance in the format string.  But in
+-     some situations (such as message translation) this is not
+-     desirable and this extension allows to specify and explicit
+-     parameter to be used.
+-
+-     The PARAM-NO part of the format must be an integer in the range of
+-     1 to the maximum number of arguments present to the function call.
+-     Some implementations limit this number to a certainly upper
+-     bound.  The exact limit can be retrieved by the following constant.
+-
+-      - Macro: NL_ARGMAX
+-          The value of `ARGMAX' is the maximum value allowed for the
+-          specification of an positional parameter in a `printf' call.
+-          The actual value in effect at runtime can be retrieved by
+-          using `sysconf' using the `_SC_NL_ARGMAX' parameter *note
+-          Sysconf Definition::..
+-
+-          Some system have a quite low limit such as 9 for System V
+-          systems.  The GNU C library has no real limit.
+-
+-     If any of the formats has a specification for the parameter
+-     position all of them in the format string shall have one.
+-     Otherwise the behaviour is undefined.
+-
+-   * Zero or more "flag characters" that modify the normal behavior of
+-     the conversion specification.
+-
+-   * An optional decimal integer specifying the "minimum field width".
+-     If the normal conversion produces fewer characters than this, the
+-     field is padded with spaces to the specified width.  This is a
+-     *minimum* value; if the normal conversion produces more characters
+-     than this, the field is *not* truncated.  Normally, the output is
+-     right-justified within the field.
+-
+-     You can also specify a field width of `*'.  This means that the
+-     next argument in the argument list (before the actual value to be
+-     printed) is used as the field width.  The value must be an `int'.
+-     If the value is negative, this means to set the `-' flag (see
+-     below) and to use the absolute value as the field width.
+-
+-   * An optional "precision" to specify the number of digits to be
+-     written for the numeric conversions.  If the precision is
+-     specified, it consists of a period (`.') followed optionally by a
+-     decimal integer (which defaults to zero if omitted).
+-
+-     You can also specify a precision of `*'.  This means that the next
+-     argument in the argument list (before the actual value to be
+-     printed) is used as the precision.  The value must be an `int',
+-     and is ignored if it is negative.  If you specify `*' for both the
+-     field width and precision, the field width argument precedes the
+-     precision argument.  Other C library versions may not recognize
+-     this syntax.
+-
+-   * An optional "type modifier character", which is used to specify the
+-     data type of the corresponding argument if it differs from the
+-     default type.  (For example, the integer conversions assume a type
+-     of `int', but you can specify `h', `l', or `L' for other integer
+-     types.)
+-
+-   * A character that specifies the conversion to be applied.
+-
+-   The exact options that are permitted and how they are interpreted
+-vary between the different conversion specifiers.  See the descriptions
+-of the individual conversions for information about the particular
+-options that they use.
+-
+-   With the `-Wformat' option, the GNU C compiler checks calls to
+-`printf' and related functions.  It examines the format string and
+-verifies that the correct number and types of arguments are supplied.
+-There is also a GNU C syntax to tell the compiler that a function you
+-write uses a `printf'-style format string.  *Note Declaring Attributes
+-of Functions: (gcc.info)Function Attributes, for more information.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-15 glibc-2.1.3/manual/libc.info-15
+--- ../glibc-2.1.3/manual/libc.info-15	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-15	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1211 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Table of Output Conversions,  Next: Integer Conversions,  Prev: Output Conversion Syntax,  Up: Formatted Output
+-
+-Table of Output Conversions
+----------------------------
+-
+-   Here is a table summarizing what all the different conversions do:
+-
+-`%d', `%i'
+-     Print an integer as a signed decimal number.  *Note Integer
+-     Conversions::, for details.  `%d' and `%i' are synonymous for
+-     output, but are different when used with `scanf' for input (*note
+-     Table of Input Conversions::.).
+-
+-`%o'
+-     Print an integer as an unsigned octal number.  *Note Integer
+-     Conversions::, for details.
+-
+-`%u'
+-     Print an integer as an unsigned decimal number.  *Note Integer
+-     Conversions::, for details.
+-
+-`%x', `%X'
+-     Print an integer as an unsigned hexadecimal number.  `%x' uses
+-     lower-case letters and `%X' uses upper-case.  *Note Integer
+-     Conversions::, for details.
+-
+-`%f'
+-     Print a floating-point number in normal (fixed-point) notation.
+-     *Note Floating-Point Conversions::, for details.
+-
+-`%e', `%E'
+-     Print a floating-point number in exponential notation.  `%e' uses
+-     lower-case letters and `%E' uses upper-case.  *Note Floating-Point
+-     Conversions::, for details.
+-
+-`%g', `%G'
+-     Print a floating-point number in either normal or exponential
+-     notation, whichever is more appropriate for its magnitude.  `%g'
+-     uses lower-case letters and `%G' uses upper-case.  *Note
+-     Floating-Point Conversions::, for details.
+-
+-`%a', `%A'
+-     Print a floating-point number in a hexadecimal fractional notation
+-     which the exponent to base 2 represented in decimal digits.  `%a'
+-     uses lower-case letters and `%A' uses upper-case.  *Note
+-     Floating-Point Conversions::, for details.
+-
+-`%c'
+-     Print a single character.  *Note Other Output Conversions::.
+-
+-`%s'
+-     Print a string.  *Note Other Output Conversions::.
+-
+-`%p'
+-     Print the value of a pointer.  *Note Other Output Conversions::.
+-
+-`%n'
+-     Get the number of characters printed so far.  *Note Other Output
+-     Conversions::.  Note that this conversion specification never
+-     produces any output.
+-
+-`%m'
+-     Print the string corresponding to the value of `errno'.  (This is
+-     a GNU extension.)  *Note Other Output Conversions::.
+-
+-`%%'
+-     Print a literal `%' character.  *Note Other Output Conversions::.
+-
+-   If the syntax of a conversion specification is invalid, unpredictable
+-things will happen, so don't do this.  If there aren't enough function
+-arguments provided to supply values for all the conversion
+-specifications in the template string, or if the arguments are not of
+-the correct types, the results are unpredictable.  If you supply more
+-arguments than conversion specifications, the extra argument values are
+-simply ignored; this is sometimes useful.
+-
+-
+-File: libc.info,  Node: Integer Conversions,  Next: Floating-Point Conversions,  Prev: Table of Output Conversions,  Up: Formatted Output
+-
+-Integer Conversions
+--------------------
+-
+-   This section describes the options for the `%d', `%i', `%o', `%u',
+-`%x', and `%X' conversion specifications.  These conversions print
+-integers in various formats.
+-
+-   The `%d' and `%i' conversion specifications both print an `int'
+-argument as a signed decimal number; while `%o', `%u', and `%x' print
+-the argument as an unsigned octal, decimal, or hexadecimal number
+-(respectively).  The `%X' conversion specification is just like `%x'
+-except that it uses the characters `ABCDEF' as digits instead of
+-`abcdef'.
+-
+-   The following flags are meaningful:
+-
+-`-'
+-     Left-justify the result in the field (instead of the normal
+-     right-justification).
+-
+-`+'
+-     For the signed `%d' and `%i' conversions, print a plus sign if the
+-     value is positive.
+-
+-` '
+-     For the signed `%d' and `%i' conversions, if the result doesn't
+-     start with a plus or minus sign, prefix it with a space character
+-     instead.  Since the `+' flag ensures that the result includes a
+-     sign, this flag is ignored if you supply both of them.
+-
+-`#'
+-     For the `%o' conversion, this forces the leading digit to be `0',
+-     as if by increasing the precision.  For `%x' or `%X', this
+-     prefixes a leading `0x' or `0X' (respectively) to the result.
+-     This doesn't do anything useful for the `%d', `%i', or `%u'
+-     conversions.  Using this flag produces output which can be parsed
+-     by the `strtoul' function (*note Parsing of Integers::.) and
+-     `scanf' with the `%i' conversion (*note Numeric Input
+-     Conversions::.).
+-
+-`''
+-     Separate the digits into groups as specified by the locale
+-     specified for the `LC_NUMERIC' category; *note General Numeric::..
+-     This flag is a GNU extension.
+-
+-`0'
+-     Pad the field with zeros instead of spaces.  The zeros are placed
+-     after any indication of sign or base.  This flag is ignored if the
+-     `-' flag is also specified, or if a precision is specified.
+-
+-   If a precision is supplied, it specifies the minimum number of
+-digits to appear; leading zeros are produced if necessary.  If you
+-don't specify a precision, the number is printed with as many digits as
+-it needs.  If you convert a value of zero with an explicit precision of
+-zero, then no characters at all are produced.
+-
+-   Without a type modifier, the corresponding argument is treated as an
+-`int' (for the signed conversions `%i' and `%d') or `unsigned int' (for
+-the unsigned conversions `%o', `%u', `%x', and `%X').  Recall that
+-since `printf' and friends are variadic, any `char' and `short'
+-arguments are automatically converted to `int' by the default argument
+-promotions.  For arguments of other integer types, you can use these
+-modifiers:
+-
+-`hh'
+-     Specifies that the argument is a `signed char' or `unsigned char',
+-     as appropriate.  A `char' argument is converted to an `int' or
+-     `unsigned int' by the default argument promotions anyway, but the
+-     `h' modifier says to convert it back to a `char' again.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`h'
+-     Specifies that the argument is a `short int' or `unsigned short
+-     int', as appropriate.  A `short' argument is converted to an `int'
+-     or `unsigned int' by the default argument promotions anyway, but
+-     the `h' modifier says to convert it back to a `short' again.
+-
+-`j'
+-     Specifies that the argument is a `intmax_t' or `uintmax_t', as
+-     appropriate.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`l'
+-     Specifies that the argument is a `long int' or `unsigned long
+-     int', as appropriate.  Two `l' characters is like the `L'
+-     modifier, below.
+-
+-`L'
+-`ll'
+-`q'
+-     Specifies that the argument is a `long long int'.  (This type is
+-     an extension supported by the GNU C compiler.  On systems that
+-     don't support extra-long integers, this is the same as `long int'.)
+-
+-     The `q' modifier is another name for the same thing, which comes
+-     from 4.4 BSD; a `long long int' is sometimes called a "quad" `int'.
+-
+-`t'
+-     Specifies that the argument is a `ptrdiff_t'.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`z'
+-`Z'
+-     Specifies that the argument is a `size_t'.
+-
+-     `z' was introduced in ISO C 9x.  `Z' is a GNU extension predating
+-     this addition and should not be used anymore in new code.
+-
+-   Here is an example.  Using the template string:
+-
+-     "|%5d|%-5d|%+5d|%+-5d|% 5d|%05d|%5.0d|%5.2d|%d|\n"
+-
+-to print numbers using the different options for the `%d' conversion
+-gives results like:
+-
+-     |    0|0    |   +0|+0   |    0|00000|     |   00|0|
+-     |    1|1    |   +1|+1   |    1|00001|    1|   01|1|
+-     |   -1|-1   |   -1|-1   |   -1|-0001|   -1|  -01|-1|
+-     |100000|100000|+100000| 100000|100000|100000|100000|100000|
+-
+-   In particular, notice what happens in the last case where the number
+-is too large to fit in the minimum field width specified.
+-
+-   Here are some more examples showing how unsigned integers print under
+-various format options, using the template string:
+-
+-     "|%5u|%5o|%5x|%5X|%#5o|%#5x|%#5X|%#10.8x|\n"
+-
+-     |    0|    0|    0|    0|    0|  0x0|  0X0|0x00000000|
+-     |    1|    1|    1|    1|   01|  0x1|  0X1|0x00000001|
+-     |100000|303240|186a0|186A0|0303240|0x186a0|0X186A0|0x000186a0|
+-
+-
+-File: libc.info,  Node: Floating-Point Conversions,  Next: Other Output Conversions,  Prev: Integer Conversions,  Up: Formatted Output
+-
+-Floating-Point Conversions
+---------------------------
+-
+-   This section discusses the conversion specifications for
+-floating-point numbers: the `%f', `%e', `%E', `%g', and `%G'
+-conversions.
+-
+-   The `%f' conversion prints its argument in fixed-point notation,
+-producing output of the form [`-']DDD`.'DDD, where the number of digits
+-following the decimal point is controlled by the precision you specify.
+-
+-   The `%e' conversion prints its argument in exponential notation,
+-producing output of the form [`-']D`.'DDD`e'[`+'|`-']DD.  Again, the
+-number of digits following the decimal point is controlled by the
+-precision.  The exponent always contains at least two digits.  The `%E'
+-conversion is similar but the exponent is marked with the letter `E'
+-instead of `e'.
+-
+-   The `%g' and `%G' conversions print the argument in the style of
+-`%e' or `%E' (respectively) if the exponent would be less than -4 or
+-greater than or equal to the precision; otherwise they use the `%f'
+-style.  Trailing zeros are removed from the fractional portion of the
+-result and a decimal-point character appears only if it is followed by
+-a digit.
+-
+-   The `%a' and `%A' conversions are meant for representing
+-floating-point number exactly in textual form so that they can be
+-exchanged as texts between different programs and/or machines.  The
+-numbers are represented is the form [`-']`0x'H`.'HHH`p'[`+'|`-']DD.  At
+-the left of the decimal-point character exactly one digit is print.
+-This character is only `0' if the number is denormalized.  Otherwise
+-the value is unspecified; it is implemention dependent how many bits
+-are used.  The number of hexadecimal digits on the right side of the
+-decimal-point character is equal to the precision.  If the precision is
+-zero it is determined to be large enough to provide an exact
+-representation of the number (or it is large enough to distinguish two
+-adjacent values if the `FLT_RADIX' is not a power of 2, *note Floating
+-Point Parameters::.).  For the `%a' conversion lower-case characters
+-are used to represent the hexadecimal number and the prefix and
+-exponent sign are printed as `0x' and `p' respectively.  Otherwise
+-upper-case characters are used and `0X' and `P' are used for the
+-representation of prefix and exponent string.  The exponent to the base
+-of two is printed as a decimal number using at least one digit but at
+-most as many digits as necessary to represent the value exactly.
+-
+-   If the value to be printed represents infinity or a NaN, the output
+-is [`-']`inf' or `nan' respectively if the conversion specifier is
+-`%a', `%e', `%f', or `%g' and it is [`-']`INF' or `NAN' respectively if
+-the conversion is `%A', `%E', or `%G'.
+-
+-   The following flags can be used to modify the behavior:
+-
+-`-'
+-     Left-justify the result in the field.  Normally the result is
+-     right-justified.
+-
+-`+'
+-     Always include a plus or minus sign in the result.
+-
+-` '
+-     If the result doesn't start with a plus or minus sign, prefix it
+-     with a space instead.  Since the `+' flag ensures that the result
+-     includes a sign, this flag is ignored if you supply both of them.
+-
+-`#'
+-     Specifies that the result should always include a decimal point,
+-     even if no digits follow it.  For the `%g' and `%G' conversions,
+-     this also forces trailing zeros after the decimal point to be left
+-     in place where they would otherwise be removed.
+-
+-`''
+-     Separate the digits of the integer part of the result into groups
+-     as specified by the locale specified for the `LC_NUMERIC' category;
+-     *note General Numeric::..  This flag is a GNU extension.
+-
+-`0'
+-     Pad the field with zeros instead of spaces; the zeros are placed
+-     after any sign.  This flag is ignored if the `-' flag is also
+-     specified.
+-
+-   The precision specifies how many digits follow the decimal-point
+-character for the `%f', `%e', and `%E' conversions.  For these
+-conversions, the default precision is `6'.  If the precision is
+-explicitly `0', this suppresses the decimal point character entirely.
+-For the `%g' and `%G' conversions, the precision specifies how many
+-significant digits to print.  Significant digits are the first digit
+-before the decimal point, and all the digits after it.  If the
+-precision is `0' or not specified for `%g' or `%G', it is treated like
+-a value of `1'.  If the value being printed cannot be expressed
+-accurately in the specified number of digits, the value is rounded to
+-the nearest number that fits.
+-
+-   Without a type modifier, the floating-point conversions use an
+-argument of type `double'.  (By the default argument promotions, any
+-`float' arguments are automatically converted to `double'.)  The
+-following type modifier is supported:
+-
+-`L'
+-     An uppercase `L' specifies that the argument is a `long double'.
+-
+-   Here are some examples showing how numbers print using the various
+-floating-point conversions.  All of the numbers were printed using this
+-template string:
+-
+-     "|%13.4a|%13.4f|%13.4e|%13.4g|\n"
+-
+-   Here is the output:
+-
+-     |  0x0.0000p+0|       0.0000|   0.0000e+00|            0|
+-     |  0x1.0000p-1|       0.5000|   5.0000e-01|          0.5|
+-     |  0x1.0000p+0|       1.0000|   1.0000e+00|            1|
+-     | -0x1.0000p+0|      -1.0000|  -1.0000e+00|           -1|
+-     |  0x1.9000p+6|     100.0000|   1.0000e+02|          100|
+-     |  0x1.f400p+9|    1000.0000|   1.0000e+03|         1000|
+-     | 0x1.3880p+13|   10000.0000|   1.0000e+04|        1e+04|
+-     | 0x1.81c8p+13|   12345.0000|   1.2345e+04|    1.234e+04|
+-     | 0x1.86a0p+16|  100000.0000|   1.0000e+05|        1e+05|
+-     | 0x1.e240p+16|  123456.0000|   1.2346e+05|    1.235e+05|
+-
+-   Notice how the `%g' conversion drops trailing zeros.
+-
+-
+-File: libc.info,  Node: Other Output Conversions,  Next: Formatted Output Functions,  Prev: Floating-Point Conversions,  Up: Formatted Output
+-
+-Other Output Conversions
+-------------------------
+-
+-   This section describes miscellaneous conversions for `printf'.
+-
+-   The `%c' conversion prints a single character.  The `int' argument
+-is first converted to an `unsigned char'.  The `-' flag can be used to
+-specify left-justification in the field, but no other flags are
+-defined, and no precision or type modifier can be given.  For example:
+-
+-     printf ("%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o');
+-
+-prints `hello'.
+-
+-   The `%s' conversion prints a string.  The corresponding argument
+-must be of type `char *' (or `const char *').  A precision can be
+-specified to indicate the maximum number of characters to write;
+-otherwise characters in the string up to but not including the
+-terminating null character are written to the output stream.  The `-'
+-flag can be used to specify left-justification in the field, but no
+-other flags or type modifiers are defined for this conversion.  For
+-example:
+-
+-     printf ("%3s%-6s", "no", "where");
+-
+-prints ` nowhere '.
+-
+-   If you accidentally pass a null pointer as the argument for a `%s'
+-conversion, the GNU library prints it as `(null)'.  We think this is
+-more useful than crashing.  But it's not good practice to pass a null
+-argument intentionally.
+-
+-   The `%m' conversion prints the string corresponding to the error
+-code in `errno'.  *Note Error Messages::.  Thus:
+-
+-     fprintf (stderr, "can't open `%s': %m\n", filename);
+-
+-is equivalent to:
+-
+-     fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
+-
+-The `%m' conversion is a GNU C library extension.
+-
+-   The `%p' conversion prints a pointer value.  The corresponding
+-argument must be of type `void *'.  In practice, you can use any type
+-of pointer.
+-
+-   In the GNU system, non-null pointers are printed as unsigned
+-integers, as if a `%#x' conversion were used.  Null pointers print as
+-`(nil)'.  (Pointers might print differently in other systems.)
+-
+-   For example:
+-
+-     printf ("%p", "testing");
+-
+-prints `0x' followed by a hexadecimal number--the address of the string
+-constant `"testing"'.  It does not print the word `testing'.
+-
+-   You can supply the `-' flag with the `%p' conversion to specify
+-left-justification, but no other flags, precision, or type modifiers
+-are defined.
+-
+-   The `%n' conversion is unlike any of the other output conversions.
+-It uses an argument which must be a pointer to an `int', but instead of
+-printing anything it stores the number of characters printed so far by
+-this call at that location.  The `h' and `l' type modifiers are
+-permitted to specify that the argument is of type `short int *' or
+-`long int *' instead of `int *', but no flags, field width, or
+-precision are permitted.
+-
+-   For example,
+-
+-     int nchar;
+-     printf ("%d %s%n\n", 3, "bears", &nchar);
+-
+-prints:
+-
+-     3 bears
+-
+-and sets `nchar' to `7', because `3 bears' is seven characters.
+-
+-   The `%%' conversion prints a literal `%' character.  This conversion
+-doesn't use an argument, and no flags, field width, precision, or type
+-modifiers are permitted.
+-
+-
+-File: libc.info,  Node: Formatted Output Functions,  Next: Dynamic Output,  Prev: Other Output Conversions,  Up: Formatted Output
+-
+-Formatted Output Functions
+---------------------------
+-
+-   This section describes how to call `printf' and related functions.
+-Prototypes for these functions are in the header file `stdio.h'.
+-Because these functions take a variable number of arguments, you *must*
+-declare prototypes for them before using them.  Of course, the easiest
+-way to make sure you have all the right prototypes is to just include
+-`stdio.h'.
+-
+- - Function: int printf (const char *TEMPLATE, ...)
+-     The `printf' function prints the optional arguments under the
+-     control of the template string TEMPLATE to the stream `stdout'.
+-     It returns the number of characters printed, or a negative value
+-     if there was an output error.
+-
+- - Function: int fprintf (FILE *STREAM, const char *TEMPLATE, ...)
+-     This function is just like `printf', except that the output is
+-     written to the stream STREAM instead of `stdout'.
+-
+- - Function: int sprintf (char *S, const char *TEMPLATE, ...)
+-     This is like `printf', except that the output is stored in the
+-     character array S instead of written to a stream.  A null
+-     character is written to mark the end of the string.
+-
+-     The `sprintf' function returns the number of characters stored in
+-     the array S, not including the terminating null character.
+-
+-     The behavior of this function is undefined if copying takes place
+-     between objects that overlap--for example, if S is also given as
+-     an argument to be printed under control of the `%s' conversion.
+-     *Note Copying and Concatenation::.
+-
+-     *Warning:* The `sprintf' function can be *dangerous* because it
+-     can potentially output more characters than can fit in the
+-     allocation size of the string S.  Remember that the field width
+-     given in a conversion specification is only a *minimum* value.
+-
+-     To avoid this problem, you can use `snprintf' or `asprintf',
+-     described below.
+-
+- - Function: int snprintf (char *S, size_t SIZE, const char *TEMPLATE,
+-          ...)
+-     The `snprintf' function is similar to `sprintf', except that the
+-     SIZE argument specifies the maximum number of characters to
+-     produce.  The trailing null character is counted towards this
+-     limit, so you should allocate at least SIZE characters for the
+-     string S.
+-
+-     The return value is the number of characters which would be
+-     generated for the given input, excluding the trailing null.  If
+-     this value is greater or equal to SIZE, not all characters from
+-     the result have been stored in S.  You should try again with a
+-     bigger output string.  Here is an example of doing this:
+-
+-          /* Construct a message describing the value of a variable
+-             whose name is NAME and whose value is VALUE. */
+-          char *
+-          make_message (char *name, char *value)
+-          {
+-            /* Guess we need no more than 100 chars of space. */
+-            int size = 100;
+-            char *buffer = (char *) xmalloc (size);
+-            int nchars;
+-
+-          /* Try to print in the allocated space. */
+-            nchars = snprintf (buffer, size, "value of %s is %s",
+-                               name, value);
+-
+-          if (nchars >= size)
+-              {
+-                /* Reallocate buffer now that we know
+-                   how much space is needed. */
+-                buffer = (char *) xrealloc (buffer, nchars + 1);
+-          
+-                /* Try again. */
+-                snprintf (buffer, size, "value of %s is %s",
+-                          name, value);
+-              }
+-            /* The last call worked, return the string. */
+-            return buffer;
+-          }
+-
+-     In practice, it is often easier just to use `asprintf', below.
+-
+-     *Attention:* In the GNU C library version 2.0 the return value is
+-     the number of characters stored, not including the terminating
+-     null.  If this value equals `SIZE - 1', then there was not enough
+-     space in S for all the output.  This change was necessary with the
+-     adoption of snprintf by ISO C9x.
+-
+-
+-File: libc.info,  Node: Dynamic Output,  Next: Variable Arguments Output,  Prev: Formatted Output Functions,  Up: Formatted Output
+-
+-Dynamically Allocating Formatted Output
+----------------------------------------
+-
+-   The functions in this section do formatted output and place the
+-results in dynamically allocated memory.
+-
+- - Function: int asprintf (char **PTR, const char *TEMPLATE, ...)
+-     This function is similar to `sprintf', except that it dynamically
+-     allocates a string (as with `malloc'; *note Unconstrained
+-     Allocation::.) to hold the output, instead of putting the output
+-     in a buffer you allocate in advance.  The PTR argument should be
+-     the address of a `char *' object, and `asprintf' stores a pointer
+-     to the newly allocated string at that location.
+-
+-     Here is how to use `asprintf' to get the same result as the
+-     `snprintf' example, but more easily:
+-
+-          /* Construct a message describing the value of a variable
+-             whose name is NAME and whose value is VALUE. */
+-          char *
+-          make_message (char *name, char *value)
+-          {
+-            char *result;
+-            asprintf (&result, "value of %s is %s", name, value);
+-            return result;
+-          }
+-
+- - Function: int obstack_printf (struct obstack *OBSTACK, const char
+-          *TEMPLATE, ...)
+-     This function is similar to `asprintf', except that it uses the
+-     obstack OBSTACK to allocate the space.  *Note Obstacks::.
+-
+-     The characters are written onto the end of the current object.  To
+-     get at them, you must finish the object with `obstack_finish'
+-     (*note Growing Objects::.).
+-
+-
+-File: libc.info,  Node: Variable Arguments Output,  Next: Parsing a Template String,  Prev: Dynamic Output,  Up: Formatted Output
+-
+-Variable Arguments Output Functions
+------------------------------------
+-
+-   The functions `vprintf' and friends are provided so that you can
+-define your own variadic `printf'-like functions that make use of the
+-same internals as the built-in formatted output functions.
+-
+-   The most natural way to define such functions would be to use a
+-language construct to say, "Call `printf' and pass this template plus
+-all of my arguments after the first five."  But there is no way to do
+-this in C, and it would be hard to provide a way, since at the C
+-language level there is no way to tell how many arguments your function
+-received.
+-
+-   Since that method is impossible, we provide alternative functions,
+-the `vprintf' series, which lets you pass a `va_list' to describe "all
+-of my arguments after the first five."
+-
+-   When it is sufficient to define a macro rather than a real function,
+-the GNU C compiler provides a way to do this much more easily with
+-macros.  For example:
+-
+-     #define myprintf(a, b, c, d, e, rest...) \
+-                 printf (mytemplate , ## rest...)
+-
+-*Note Macros with Variable Numbers of Arguments: (gcc.info)Macro
+-Varargs, for details.  But this is limited to macros, and does not
+-apply to real functions at all.
+-
+-   Before calling `vprintf' or the other functions listed in this
+-section, you *must* call `va_start' (*note Variadic Functions::.) to
+-initialize a pointer to the variable arguments.  Then you can call
+-`va_arg' to fetch the arguments that you want to handle yourself.  This
+-advances the pointer past those arguments.
+-
+-   Once your `va_list' pointer is pointing at the argument of your
+-choice, you are ready to call `vprintf'.  That argument and all
+-subsequent arguments that were passed to your function are used by
+-`vprintf' along with the template that you specified separately.
+-
+-   In some other systems, the `va_list' pointer may become invalid
+-after the call to `vprintf', so you must not use `va_arg' after you
+-call `vprintf'.  Instead, you should call `va_end' to retire the
+-pointer from service.  However, you can safely call `va_start' on
+-another pointer variable and begin fetching the arguments again through
+-that pointer.  Calling `vprintf' does not destroy the argument list of
+-your function, merely the particular pointer that you passed to it.
+-
+-   GNU C does not have such restrictions.  You can safely continue to
+-fetch arguments from a `va_list' pointer after passing it to `vprintf',
+-and `va_end' is a no-op.  (Note, however, that subsequent `va_arg'
+-calls will fetch the same arguments which `vprintf' previously used.)
+-
+-   Prototypes for these functions are declared in `stdio.h'.
+-
+- - Function: int vprintf (const char *TEMPLATE, va_list AP)
+-     This function is similar to `printf' except that, instead of taking
+-     a variable number of arguments directly, it takes an argument list
+-     pointer AP.
+-
+- - Function: int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list
+-          AP)
+-     This is the equivalent of `fprintf' with the variable argument list
+-     specified directly as for `vprintf'.
+-
+- - Function: int vsprintf (char *S, const char *TEMPLATE, va_list AP)
+-     This is the equivalent of `sprintf' with the variable argument list
+-     specified directly as for `vprintf'.
+-
+- - Function: int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE,
+-          va_list AP)
+-     This is the equivalent of `snprintf' with the variable argument
+-     list specified directly as for `vprintf'.
+-
+- - Function: int vasprintf (char **PTR, const char *TEMPLATE, va_list
+-          AP)
+-     The `vasprintf' function is the equivalent of `asprintf' with the
+-     variable argument list specified directly as for `vprintf'.
+-
+- - Function: int obstack_vprintf (struct obstack *OBSTACK, const char
+-          *TEMPLATE, va_list AP)
+-     The `obstack_vprintf' function is the equivalent of
+-     `obstack_printf' with the variable argument list specified directly
+-     as for `vprintf'.
+-
+-   Here's an example showing how you might use `vfprintf'.  This is a
+-function that prints error messages to the stream `stderr', along with
+-a prefix indicating the name of the program (*note Error Messages::.,
+-for a description of `program_invocation_short_name').
+-
+-     #include <stdio.h>
+-     #include <stdarg.h>
+-     
+-     void
+-     eprintf (const char *template, ...)
+-     {
+-       va_list ap;
+-       extern char *program_invocation_short_name;
+-     
+-       fprintf (stderr, "%s: ", program_invocation_short_name);
+-       va_start (ap, template);
+-       vfprintf (stderr, template, ap);
+-       va_end (ap);
+-     }
+-
+-You could call `eprintf' like this:
+-
+-     eprintf ("file `%s' does not exist\n", filename);
+-
+-   In GNU C, there is a special construct you can use to let the
+-compiler know that a function uses a `printf'-style format string.
+-Then it can check the number and types of arguments in each call to the
+-function, and warn you when they do not match the format string.  For
+-example, take this declaration of `eprintf':
+-
+-     void eprintf (const char *template, ...)
+-             __attribute__ ((format (printf, 1, 2)));
+-
+-This tells the compiler that `eprintf' uses a format string like
+-`printf' (as opposed to `scanf'; *note Formatted Input::.); the format
+-string appears as the first argument; and the arguments to satisfy the
+-format begin with the second.  *Note Declaring Attributes of Functions:
+-(gcc.info)Function Attributes, for more information.
+-
+-
+-File: libc.info,  Node: Parsing a Template String,  Next: Example of Parsing,  Prev: Variable Arguments Output,  Up: Formatted Output
+-
+-Parsing a Template String
+--------------------------
+-
+-   You can use the function `parse_printf_format' to obtain information
+-about the number and types of arguments that are expected by a given
+-template string.  This function permits interpreters that provide
+-interfaces to `printf' to avoid passing along invalid arguments from
+-the user's program, which could cause a crash.
+-
+-   All the symbols described in this section are declared in the header
+-file `printf.h'.
+-
+- - Function: size_t parse_printf_format (const char *TEMPLATE, size_t
+-          N, int *ARGTYPES)
+-     This function returns information about the number and types of
+-     arguments expected by the `printf' template string TEMPLATE.  The
+-     information is stored in the array ARGTYPES; each element of this
+-     array describes one argument.  This information is encoded using
+-     the various `PA_' macros, listed below.
+-
+-     The N argument specifies the number of elements in the array
+-     ARGTYPES.  This is the most elements that `parse_printf_format'
+-     will try to write.
+-
+-     `parse_printf_format' returns the total number of arguments
+-     required by TEMPLATE.  If this number is greater than N, then the
+-     information returned describes only the first N arguments.  If you
+-     want information about more than that many arguments, allocate a
+-     bigger array and call `parse_printf_format' again.
+-
+-   The argument types are encoded as a combination of a basic type and
+-modifier flag bits.
+-
+- - Macro: int PA_FLAG_MASK
+-     This macro is a bitmask for the type modifier flag bits.  You can
+-     write the expression `(argtypes[i] & PA_FLAG_MASK)' to extract
+-     just the flag bits for an argument, or `(argtypes[i] &
+-     ~PA_FLAG_MASK)' to extract just the basic type code.
+-
+-   Here are symbolic constants that represent the basic types; they
+-stand for integer values.
+-
+-`PA_INT'
+-     This specifies that the base type is `int'.
+-
+-`PA_CHAR'
+-     This specifies that the base type is `int', cast to `char'.
+-
+-`PA_STRING'
+-     This specifies that the base type is `char *', a null-terminated
+-     string.
+-
+-`PA_POINTER'
+-     This specifies that the base type is `void *', an arbitrary
+-     pointer.
+-
+-`PA_FLOAT'
+-     This specifies that the base type is `float'.
+-
+-`PA_DOUBLE'
+-     This specifies that the base type is `double'.
+-
+-`PA_LAST'
+-     You can define additional base types for your own programs as
+-     offsets from `PA_LAST'.  For example, if you have data types `foo'
+-     and `bar' with their own specialized `printf' conversions, you
+-     could define encodings for these types as:
+-
+-          #define PA_FOO  PA_LAST
+-          #define PA_BAR  (PA_LAST + 1)
+-
+-   Here are the flag bits that modify a basic type.  They are combined
+-with the code for the basic type using inclusive-or.
+-
+-`PA_FLAG_PTR'
+-     If this bit is set, it indicates that the encoded type is a
+-     pointer to the base type, rather than an immediate value.  For
+-     example, `PA_INT|PA_FLAG_PTR' represents the type `int *'.
+-
+-`PA_FLAG_SHORT'
+-     If this bit is set, it indicates that the base type is modified
+-     with `short'.  (This corresponds to the `h' type modifier.)
+-
+-`PA_FLAG_LONG'
+-     If this bit is set, it indicates that the base type is modified
+-     with `long'.  (This corresponds to the `l' type modifier.)
+-
+-`PA_FLAG_LONG_LONG'
+-     If this bit is set, it indicates that the base type is modified
+-     with `long long'.  (This corresponds to the `L' type modifier.)
+-
+-`PA_FLAG_LONG_DOUBLE'
+-     This is a synonym for `PA_FLAG_LONG_LONG', used by convention with
+-     a base type of `PA_DOUBLE' to indicate a type of `long double'.
+-
+-   For an example of using these facilities, see *Note Example of
+-Parsing::.
+-
+-
+-File: libc.info,  Node: Example of Parsing,  Prev: Parsing a Template String,  Up: Formatted Output
+-
+-Example of Parsing a Template String
+-------------------------------------
+-
+-   Here is an example of decoding argument types for a format string.
+-We assume this is part of an interpreter which contains arguments of
+-type `NUMBER', `CHAR', `STRING' and `STRUCTURE' (and perhaps others
+-which are not valid here).
+-
+-     /* Test whether the NARGS specified objects
+-        in the vector ARGS are valid
+-        for the format string FORMAT:
+-        if so, return 1.
+-        If not, return 0 after printing an error message.  */
+-     
+-     int
+-     validate_args (char *format, int nargs, OBJECT *args)
+-     {
+-       int *argtypes;
+-       int nwanted;
+-     
+-       /* Get the information about the arguments.
+-          Each conversion specification must be at least two characters
+-          long, so there cannot be more specifications than half the
+-          length of the string.  */
+-     
+-       argtypes = (int *) alloca (strlen (format) / 2 * sizeof (int));
+-       nwanted = parse_printf_format (string, nelts, argtypes);
+-     
+-       /* Check the number of arguments.  */
+-       if (nwanted > nargs)
+-         {
+-           error ("too few arguments (at least %d required)", nwanted);
+-           return 0;
+-         }
+-     
+-       /* Check the C type wanted for each argument
+-          and see if the object given is suitable.  */
+-       for (i = 0; i < nwanted; i++)
+-         {
+-           int wanted;
+-     
+-           if (argtypes[i] & PA_FLAG_PTR)
+-             wanted = STRUCTURE;
+-           else
+-             switch (argtypes[i] & ~PA_FLAG_MASK)
+-               {
+-               case PA_INT:
+-               case PA_FLOAT:
+-               case PA_DOUBLE:
+-                 wanted = NUMBER;
+-                 break;
+-               case PA_CHAR:
+-                 wanted = CHAR;
+-                 break;
+-               case PA_STRING:
+-                 wanted = STRING;
+-                 break;
+-               case PA_POINTER:
+-                 wanted = STRUCTURE;
+-                 break;
+-               }
+-           if (TYPE (args[i]) != wanted)
+-             {
+-               error ("type mismatch for arg number %d", i);
+-               return 0;
+-             }
+-         }
+-       return 1;
+-     }
+-
+-
+-File: libc.info,  Node: Customizing Printf,  Next: Formatted Input,  Prev: Formatted Output,  Up: I/O on Streams
+-
+-Customizing `printf'
+-====================
+-
+-   The GNU C library lets you define your own custom conversion
+-specifiers for `printf' template strings, to teach `printf' clever ways
+-to print the important data structures of your program.
+-
+-   The way you do this is by registering the conversion with the
+-function `register_printf_function'; see *Note Registering New
+-Conversions::.  One of the arguments you pass to this function is a
+-pointer to a handler function that produces the actual output; see
+-*Note Defining the Output Handler::, for information on how to write
+-this function.
+-
+-   You can also install a function that just returns information about
+-the number and type of arguments expected by the conversion specifier.
+-*Note Parsing a Template String::, for information about this.
+-
+-   The facilities of this section are declared in the header file
+-`printf.h'.
+-
+-* Menu:
+-
+-* Registering New Conversions::         Using `register_printf_function'
+-                                         to register a new output conversion.
+-* Conversion Specifier Options::        The handler must be able to get
+-                                         the options specified in the
+-                                         template when it is called.
+-* Defining the Output Handler::         Defining the handler and arginfo
+-                                         functions that are passed as arguments
+-                                         to `register_printf_function'.
+-* Printf Extension Example::            How to define a `printf'
+-                                         handler function.
+-* Predefined Printf Handlers::          Predefined `printf' handlers.
+-
+-   *Portability Note:* The ability to extend the syntax of `printf'
+-template strings is a GNU extension.  ISO standard C has nothing
+-similar.
+-
+-
+-File: libc.info,  Node: Registering New Conversions,  Next: Conversion Specifier Options,  Up: Customizing Printf
+-
+-Registering New Conversions
+----------------------------
+-
+-   The function to register a new output conversion is
+-`register_printf_function', declared in `printf.h'.
+-
+- - Function: int register_printf_function (int SPEC, printf_function
+-          HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)
+-     This function defines the conversion specifier character SPEC.
+-     Thus, if SPEC is `'z'', it defines the conversion `%z'.  You can
+-     redefine the built-in conversions like `%s', but flag characters
+-     like `#' and type modifiers like `l' can never be used as
+-     conversions; calling `register_printf_function' for those
+-     characters has no effect.
+-
+-     The HANDLER-FUNCTION is the function called by `printf' and
+-     friends when this conversion appears in a template string.  *Note
+-     Defining the Output Handler::, for information about how to define
+-     a function to pass as this argument.  If you specify a null
+-     pointer, any existing handler function for SPEC is removed.
+-
+-     The ARGINFO-FUNCTION is the function called by
+-     `parse_printf_format' when this conversion appears in a template
+-     string.  *Note Parsing a Template String::, for information about
+-     this.
+-
+-     *Attention:* In the GNU C library version before 2.0 the
+-     ARGINFO-FUNCTION function did not need to be installed unless the
+-     user uses the `parse_printf_format' function.  This changed.  Now
+-     a call to any of the `printf' functions will call this function
+-     when this format specifier appears in the format string.
+-
+-     The return value is `0' on success, and `-1' on failure (which
+-     occurs if SPEC is out of range).
+-
+-     You can redefine the standard output conversions, but this is
+-     probably not a good idea because of the potential for confusion.
+-     Library routines written by other people could break if you do
+-     this.
+-
+-
+-File: libc.info,  Node: Conversion Specifier Options,  Next: Defining the Output Handler,  Prev: Registering New Conversions,  Up: Customizing Printf
+-
+-Conversion Specifier Options
+-----------------------------
+-
+-   If you define a meaning for `%A', what if the template contains
+-`%+23A' or `%-#A'?  To implement a sensible meaning for these, the
+-handler when called needs to be able to get the options specified in
+-the template.
+-
+-   Both the HANDLER-FUNCTION and ARGINFO-FUNCTION accept an argument
+-that points to a `struct printf_info', which contains information about
+-the options appearing in an instance of the conversion specifier.  This
+-data type is declared in the header file `printf.h'.
+-
+- - Type: struct printf_info
+-     This structure is used to pass information about the options
+-     appearing in an instance of a conversion specifier in a `printf'
+-     template string to the handler and arginfo functions for that
+-     specifier.  It contains the following members:
+-
+-    `int prec'
+-          This is the precision specified.  The value is `-1' if no
+-          precision was specified.  If the precision was given as `*',
+-          the `printf_info' structure passed to the handler function
+-          contains the actual value retrieved from the argument list.
+-          But the structure passed to the arginfo function contains a
+-          value of `INT_MIN', since the actual value is not known.
+-
+-    `int width'
+-          This is the minimum field width specified.  The value is `0'
+-          if no width was specified.  If the field width was given as
+-          `*', the `printf_info' structure passed to the handler
+-          function contains the actual value retrieved from the
+-          argument list.  But the structure passed to the arginfo
+-          function contains a value of `INT_MIN', since the actual
+-          value is not known.
+-
+-    `wchar_t spec'
+-          This is the conversion specifier character specified.  It's
+-          stored in the structure so that you can register the same
+-          handler function for multiple characters, but still have a
+-          way to tell them apart when the handler function is called.
+-
+-    `unsigned int is_long_double'
+-          This is a boolean that is true if the `L', `ll', or `q' type
+-          modifier was specified.  For integer conversions, this
+-          indicates `long long int', as opposed to `long double' for
+-          floating point conversions.
+-
+-    `unsigned int is_char'
+-          This is a boolean that is true if the `hh' type modifier was
+-          specified.
+-
+-    `unsigned int is_short'
+-          This is a boolean that is true if the `h' type modifier was
+-          specified.
+-
+-    `unsigned int is_long'
+-          This is a boolean that is true if the `l' type modifier was
+-          specified.
+-
+-    `unsigned int alt'
+-          This is a boolean that is true if the `#' flag was specified.
+-
+-    `unsigned int space'
+-          This is a boolean that is true if the ` ' flag was specified.
+-
+-    `unsigned int left'
+-          This is a boolean that is true if the `-' flag was specified.
+-
+-    `unsigned int showsign'
+-          This is a boolean that is true if the `+' flag was specified.
+-
+-    `unsigned int group'
+-          This is a boolean that is true if the `'' flag was specified.
+-
+-    `unsigned int extra'
+-          This flag has a special meaning depending on the context.  It
+-          could be used freely by the user-defined handlers but when
+-          called from the `printf' function this variable always
+-          contains the value `0'.
+-
+-    `wchar_t pad'
+-          This is the character to use for padding the output to the
+-          minimum field width.  The value is `'0'' if the `0' flag was
+-          specified, and `' '' otherwise.
+-
+-
+-File: libc.info,  Node: Defining the Output Handler,  Next: Printf Extension Example,  Prev: Conversion Specifier Options,  Up: Customizing Printf
+-
+-Defining the Output Handler
+----------------------------
+-
+-   Now let's look at how to define the handler and arginfo functions
+-which are passed as arguments to `register_printf_function'.
+-
+-   *Compatibility Note:* The interface changed in the GNU libc version
+-2.0.  Previously the third argument was of type `va_list *'.
+-
+-   You should define your handler functions with a prototype like:
+-
+-     int FUNCTION (FILE *stream, const struct printf_info *info,
+-                         const void *const *args)
+-
+-   The STREAM argument passed to the handler function is the stream to
+-which it should write output.
+-
+-   The INFO argument is a pointer to a structure that contains
+-information about the various options that were included with the
+-conversion in the template string.  You should not modify this structure
+-inside your handler function.  *Note Conversion Specifier Options::, for
+-a description of this data structure.
+-
+-   The ARGS is a vector of pointers to the arguments data.  The number
+-of arguments were determined by calling the argument information
+-function provided by the user.
+-
+-   Your handler function should return a value just like `printf' does:
+-it should return the number of characters it has written, or a negative
+-value to indicate an error.
+-
+- - Data Type: printf_function
+-     This is the data type that a handler function should have.
+-
+-   If you are going to use `parse_printf_format' in your application,
+-you must also define a function to pass as the ARGINFO-FUNCTION
+-argument for each new conversion you install with
+-`register_printf_function'.
+-
+-   You have to define these functions with a prototype like:
+-
+-     int FUNCTION (const struct printf_info *info,
+-                         size_t n, int *argtypes)
+-
+-   The return value from the function should be the number of arguments
+-the conversion expects.  The function should also fill in no more than
+-N elements of the ARGTYPES array with information about the types of
+-each of these arguments.  This information is encoded using the various
+-`PA_' macros.  (You will notice that this is the same calling
+-convention `parse_printf_format' itself uses.)
+-
+- - Data Type: printf_arginfo_function
+-     This type is used to describe functions that return information
+-     about the number and type of arguments used by a conversion
+-     specifier.
+-
+-
+-File: libc.info,  Node: Printf Extension Example,  Next: Predefined Printf Handlers,  Prev: Defining the Output Handler,  Up: Customizing Printf
+-
+-`printf' Extension Example
+---------------------------
+-
+-   Here is an example showing how to define a `printf' handler function.
+-This program defines a data structure called a `Widget' and defines the
+-`%W' conversion to print information about `Widget *' arguments,
+-including the pointer value and the name stored in the data structure.
+-The `%W' conversion supports the minimum field width and
+-left-justification options, but ignores everything else.
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <printf.h>
+-     typedef struct
+-     {
+-       char *name;
+-     }
+-     Widget;
+-     
+-     int
+-     print_widget (FILE *stream,
+-                   const struct printf_info *info,
+-                   const void *const *args)
+-     {
+-       const Widget *w;
+-       char *buffer;
+-       int len;
+-     
+-       /* Format the output into a string. */
+-       w = *((const Widget **) (args[0]));
+-       len = asprintf (&buffer, "<Widget %p: %s>", w, w->name);
+-       if (len == -1)
+-         return -1;
+-     
+-       /* Pad to the minimum field width and print to the stream. */
+-       len = fprintf (stream, "%*s",
+-                      (info->left ? -info->width : info->width),
+-                      buffer);
+-     
+-       /* Clean up and return. */
+-       free (buffer);
+-       return len;
+-     }
+-     
+-     
+-     int
+-     print_widget_arginfo (const struct printf_info *info, size_t n,
+-                           int *argtypes)
+-     {
+-       /* We always take exactly one argument and this is a pointer to the
+-          structure.. */
+-       if (n > 0)
+-         argtypes[0] = PA_POINTER;
+-       return 1;
+-     }
+-     
+-     
+-     int
+-     main (void)
+-     {
+-       /* Make a widget to print. */
+-       Widget mywidget;
+-       mywidget.name = "mywidget";
+-     
+-       /* Register the print function for widgets. */
+-       register_printf_function ('W', print_widget, print_widget_arginfo);
+-     
+-       /* Now print the widget. */
+-       printf ("|%W|\n", &mywidget);
+-       printf ("|%35W|\n", &mywidget);
+-       printf ("|%-35W|\n", &mywidget);
+-     
+-       return 0;
+-     }
+-
+-   The output produced by this program looks like:
+-
+-     |<Widget 0xffeffb7c: mywidget>|
+-     |      <Widget 0xffeffb7c: mywidget>|
+-     |<Widget 0xffeffb7c: mywidget>      |
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-16 glibc-2.1.3/manual/libc.info-16
+--- ../glibc-2.1.3/manual/libc.info-16	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-16	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1155 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Predefined Printf Handlers,  Prev: Printf Extension Example,  Up: Customizing Printf
+-
+-Predefined `printf' Handlers
+-----------------------------
+-
+-   The GNU libc also contains a concrete and useful application of the
+-`printf' handler extension.  There are two functions available which
+-implement a special way to print floating-point numbers.
+-
+- - Function: int printf_size (FILE *FP, const struct printf_info *INFO,
+-          const void *const *ARGS)
+-     Print a given floating point number as for the format `%f' except
+-     that there is a postfix character indicating the divisor for the
+-     number to make this less than 1000.  There are two possible
+-     divisors: powers of 1024 or powers to 1000.  Which one is used
+-     depends on the format character specified while registered this
+-     handler.  If the character is of lower case, 1024 is used.  For
+-     upper case characters, 1000 is used.
+-
+-     The postfix tag corresponds to bytes, kilobytes, megabytes,
+-     gigabytes, etc.  The full table is:
+-
+-     +-----+-------------+-------+-------+--------------+
+-     |low  |Multiplier   |From   |Upper  |Multiplier    |
+-     +-----+-------------+-------+-------+--------------+
+-     |' '  |1            |       |' '    |1             |
+-     +-----+-------------+-------+-------+--------------+
+-     |k    |2^10 (1024)  |kilo   |K      |10^3 (1000)   |
+-     +-----+-------------+-------+-------+--------------+
+-     |m    |2^20         |mega   |M      |10^6          |
+-     +-----+-------------+-------+-------+--------------+
+-     |g    |2^30         |giga   |G      |10^9          |
+-     +-----+-------------+-------+-------+--------------+
+-     |t    |2^40         |tera   |T      |10^12         |
+-     +-----+-------------+-------+-------+--------------+
+-     |p    |2^50         |peta   |P      |10^15         |
+-     +-----+-------------+-------+-------+--------------+
+-     |e    |2^60         |exa    |E      |10^18         |
+-     +-----+-------------+-------+-------+--------------+
+-     |z    |2^70         |zetta  |Z      |10^21         |
+-     +-----+-------------+-------+-------+--------------+
+-     |y    |2^80         |yotta  |Y      |10^24         |
+-     +-----+-------------+-------+-------+--------------+
+-
+-     The default precision is 3, i.e., 1024 is printed with a lower-case
+-     format character as if it were `%.3fk' and will yield `1.000k'.
+-
+-   Due to the requirements of `register_printf_function' we must also
+-provide the function which return information about the arguments.
+-
+- - Function: int printf_size_info (const struct printf_info *INFO,
+-          size_t N, int *ARGTYPES)
+-     This function will return in ARGTYPES the information about the
+-     used parameters in the way the `vfprintf' implementation expects
+-     it.  The format always takes one argument.
+-
+-   To use these functions both functions must be registered with a call
+-like
+-
+-     register_printf_function ('B', printf_size, printf_size_info);
+-
+-   Here we register the functions to print numbers as powers of 1000
+-since the format character `'B'' is an upper-case character.  If we
+-would additionally use `'b'' in a line like
+-
+-     register_printf_function ('b', printf_size, printf_size_info);
+-
+-we could also print using power of 1024.  Please note that all what is
+-different in these both lines in the format specifier.  The
+-`printf_size' function knows about the difference of low and upper case
+-format specifiers.
+-
+-   The use of `'B'' and `'b'' is no coincidence.  Rather it is the
+-preferred way to use this functionality since it is available on some
+-other systems also available using the format specifiers.
+-
+-
+-File: libc.info,  Node: Formatted Input,  Next: EOF and Errors,  Prev: Customizing Printf,  Up: I/O on Streams
+-
+-Formatted Input
+-===============
+-
+-   The functions described in this section (`scanf' and related
+-functions) provide facilities for formatted input analogous to the
+-formatted output facilities.  These functions provide a mechanism for
+-reading arbitrary values under the control of a "format string" or
+-"template string".
+-
+-* Menu:
+-
+-* Formatted Input Basics::      Some basics to get you started.
+-* Input Conversion Syntax::     Syntax of conversion specifications.
+-* Table of Input Conversions::  Summary of input conversions and what they do.
+-* Numeric Input Conversions::   Details of conversions for reading numbers.
+-* String Input Conversions::    Details of conversions for reading strings.
+-* Dynamic String Input::	String conversions that `malloc' the buffer.
+-* Other Input Conversions::     Details of miscellaneous other conversions.
+-* Formatted Input Functions::   Descriptions of the actual functions.
+-* Variable Arguments Input::    `vscanf' and friends.
+-
+-
+-File: libc.info,  Node: Formatted Input Basics,  Next: Input Conversion Syntax,  Up: Formatted Input
+-
+-Formatted Input Basics
+-----------------------
+-
+-   Calls to `scanf' are superficially similar to calls to `printf' in
+-that arbitrary arguments are read under the control of a template
+-string.  While the syntax of the conversion specifications in the
+-template is very similar to that for `printf', the interpretation of
+-the template is oriented more towards free-format input and simple
+-pattern matching, rather than fixed-field formatting.  For example,
+-most `scanf' conversions skip over any amount of "white space"
+-(including spaces, tabs, and newlines) in the input file, and there is
+-no concept of precision for the numeric input conversions as there is
+-for the corresponding output conversions.  Ordinarily, non-whitespace
+-characters in the template are expected to match characters in the
+-input stream exactly, but a matching failure is distinct from an input
+-error on the stream.
+-
+-   Another area of difference between `scanf' and `printf' is that you
+-must remember to supply pointers rather than immediate values as the
+-optional arguments to `scanf'; the values that are read are stored in
+-the objects that the pointers point to.  Even experienced programmers
+-tend to forget this occasionally, so if your program is getting strange
+-errors that seem to be related to `scanf', you might want to
+-double-check this.
+-
+-   When a "matching failure" occurs, `scanf' returns immediately,
+-leaving the first non-matching character as the next character to be
+-read from the stream.  The normal return value from `scanf' is the
+-number of values that were assigned, so you can use this to determine if
+-a matching error happened before all the expected values were read.
+-
+-   The `scanf' function is typically used for things like reading in
+-the contents of tables.  For example, here is a function that uses
+-`scanf' to initialize an array of `double':
+-
+-     void
+-     readarray (double *array, int n)
+-     {
+-       int i;
+-       for (i=0; i<n; i++)
+-         if (scanf (" %lf", &(array[i])) != 1)
+-           invalid_input_error ();
+-     }
+-
+-   The formatted input functions are not used as frequently as the
+-formatted output functions.  Partly, this is because it takes some care
+-to use them properly.  Another reason is that it is difficult to recover
+-from a matching error.
+-
+-   If you are trying to read input that doesn't match a single, fixed
+-pattern, you may be better off using a tool such as Flex to generate a
+-lexical scanner, or Bison to generate a parser, rather than using
+-`scanf'.  For more information about these tools, see *Note :
+-(flex.info), and *Note : (bison.info).
+-
+-
+-File: libc.info,  Node: Input Conversion Syntax,  Next: Table of Input Conversions,  Prev: Formatted Input Basics,  Up: Formatted Input
+-
+-Input Conversion Syntax
+------------------------
+-
+-   A `scanf' template string is a string that contains ordinary
+-multibyte characters interspersed with conversion specifications that
+-start with `%'.
+-
+-   Any whitespace character (as defined by the `isspace' function;
+-*note Classification of Characters::.) in the template causes any number
+-of whitespace characters in the input stream to be read and discarded.
+-The whitespace characters that are matched need not be exactly the same
+-whitespace characters that appear in the template string.  For example,
+-write ` , ' in the template to recognize a comma with optional
+-whitespace before and after.
+-
+-   Other characters in the template string that are not part of
+-conversion specifications must match characters in the input stream
+-exactly; if this is not the case, a matching failure occurs.
+-
+-   The conversion specifications in a `scanf' template string have the
+-general form:
+-
+-     % FLAGS WIDTH TYPE CONVERSION
+-
+-   In more detail, an input conversion specification consists of an
+-initial `%' character followed in sequence by:
+-
+-   * An optional "flag character" `*', which says to ignore the text
+-     read for this specification.  When `scanf' finds a conversion
+-     specification that uses this flag, it reads input as directed by
+-     the rest of the conversion specification, but it discards this
+-     input, does not use a pointer argument, and does not increment the
+-     count of successful assignments.
+-
+-   * An optional flag character `a' (valid with string conversions only)
+-     which requests allocation of a buffer long enough to store the
+-     string in.  (This is a GNU extension.)  *Note Dynamic String
+-     Input::.
+-
+-   * An optional decimal integer that specifies the "maximum field
+-     width".  Reading of characters from the input stream stops either
+-     when this maximum is reached or when a non-matching character is
+-     found, whichever happens first.  Most conversions discard initial
+-     whitespace characters (those that don't are explicitly
+-     documented), and these discarded characters don't count towards
+-     the maximum field width.  String input conversions store a null
+-     character to mark the end of the input; the maximum field width
+-     does not include this terminator.
+-
+-   * An optional "type modifier character".  For example, you can
+-     specify a type modifier of `l' with integer conversions such as
+-     `%d' to specify that the argument is a pointer to a `long int'
+-     rather than a pointer to an `int'.
+-
+-   * A character that specifies the conversion to be applied.
+-
+-   The exact options that are permitted and how they are interpreted
+-vary between the different conversion specifiers.  See the descriptions
+-of the individual conversions for information about the particular
+-options that they allow.
+-
+-   With the `-Wformat' option, the GNU C compiler checks calls to
+-`scanf' and related functions.  It examines the format string and
+-verifies that the correct number and types of arguments are supplied.
+-There is also a GNU C syntax to tell the compiler that a function you
+-write uses a `scanf'-style format string.  *Note Declaring Attributes
+-of Functions: (gcc.info)Function Attributes, for more information.
+-
+-
+-File: libc.info,  Node: Table of Input Conversions,  Next: Numeric Input Conversions,  Prev: Input Conversion Syntax,  Up: Formatted Input
+-
+-Table of Input Conversions
+---------------------------
+-
+-   Here is a table that summarizes the various conversion
+-specifications:
+-
+-`%d'
+-     Matches an optionally signed integer written in decimal.  *Note
+-     Numeric Input Conversions::.
+-
+-`%i'
+-     Matches an optionally signed integer in any of the formats that
+-     the C language defines for specifying an integer constant.  *Note
+-     Numeric Input Conversions::.
+-
+-`%o'
+-     Matches an unsigned integer written in octal radix.  *Note Numeric
+-     Input Conversions::.
+-
+-`%u'
+-     Matches an unsigned integer written in decimal radix.  *Note
+-     Numeric Input Conversions::.
+-
+-`%x', `%X'
+-     Matches an unsigned integer written in hexadecimal radix.  *Note
+-     Numeric Input Conversions::.
+-
+-`%e', `%f', `%g', `%E', `%G'
+-     Matches an optionally signed floating-point number.  *Note Numeric
+-     Input Conversions::.
+-
+-`%s'
+-     Matches a string containing only non-whitespace characters.  *Note
+-     String Input Conversions::.
+-
+-`%['
+-     Matches a string of characters that belong to a specified set.
+-     *Note String Input Conversions::.
+-
+-`%c'
+-     Matches a string of one or more characters; the number of
+-     characters read is controlled by the maximum field width given for
+-     the conversion.  *Note String Input Conversions::.
+-
+-`%p'
+-     Matches a pointer value in the same implementation-defined format
+-     used by the `%p' output conversion for `printf'.  *Note Other
+-     Input Conversions::.
+-
+-`%n'
+-     This conversion doesn't read any characters; it records the number
+-     of characters read so far by this call.  *Note Other Input
+-     Conversions::.
+-
+-`%%'
+-     This matches a literal `%' character in the input stream.  No
+-     corresponding argument is used.  *Note Other Input Conversions::.
+-
+-   If the syntax of a conversion specification is invalid, the behavior
+-is undefined.  If there aren't enough function arguments provided to
+-supply addresses for all the conversion specifications in the template
+-strings that perform assignments, or if the arguments are not of the
+-correct types, the behavior is also undefined.  On the other hand, extra
+-arguments are simply ignored.
+-
+-
+-File: libc.info,  Node: Numeric Input Conversions,  Next: String Input Conversions,  Prev: Table of Input Conversions,  Up: Formatted Input
+-
+-Numeric Input Conversions
+--------------------------
+-
+-   This section describes the `scanf' conversions for reading numeric
+-values.
+-
+-   The `%d' conversion matches an optionally signed integer in decimal
+-radix.  The syntax that is recognized is the same as that for the
+-`strtol' function (*note Parsing of Integers::.) with the value `10'
+-for the BASE argument.
+-
+-   The `%i' conversion matches an optionally signed integer in any of
+-the formats that the C language defines for specifying an integer
+-constant.  The syntax that is recognized is the same as that for the
+-`strtol' function (*note Parsing of Integers::.) with the value `0' for
+-the BASE argument.  (You can print integers in this syntax with
+-`printf' by using the `#' flag character with the `%x', `%o', or `%d'
+-conversion.  *Note Integer Conversions::.)
+-
+-   For example, any of the strings `10', `0xa', or `012' could be read
+-in as integers under the `%i' conversion.  Each of these specifies a
+-number with decimal value `10'.
+-
+-   The `%o', `%u', and `%x' conversions match unsigned integers in
+-octal, decimal, and hexadecimal radices, respectively.  The syntax that
+-is recognized is the same as that for the `strtoul' function (*note
+-Parsing of Integers::.) with the appropriate value (`8', `10', or `16')
+-for the BASE argument.
+-
+-   The `%X' conversion is identical to the `%x' conversion.  They both
+-permit either uppercase or lowercase letters to be used as digits.
+-
+-   The default type of the corresponding argument for the `%d' and `%i'
+-conversions is `int *', and `unsigned int *' for the other integer
+-conversions.  You can use the following type modifiers to specify other
+-sizes of integer:
+-
+-`hh'
+-     Specifies that the argument is a `signed char *' or `unsigned char
+-     *'.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`h'
+-     Specifies that the argument is a `short int *' or `unsigned short
+-     int *'.
+-
+-`j'
+-     Specifies that the argument is a `intmax_t *' or `uintmax_t *'.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`l'
+-     Specifies that the argument is a `long int *' or `unsigned long
+-     int *'.  Two `l' characters is like the `L' modifier, below.
+-
+-`ll'
+-`L'
+-`q'
+-     Specifies that the argument is a `long long int *' or `unsigned
+-     long long int *'.  (The `long long' type is an extension supported
+-     by the GNU C compiler.  For systems that don't provide extra-long
+-     integers, this is the same as `long int'.)
+-
+-     The `q' modifier is another name for the same thing, which comes
+-     from 4.4 BSD; a `long long int' is sometimes called a "quad" `int'.
+-
+-`t'
+-     Specifies that the argument is a `ptrdiff_t *'.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-`z'
+-     Specifies that the argument is a `size_t *'.
+-
+-     This modifier was introduced in ISO C 9x.
+-
+-   All of the `%e', `%f', `%g', `%E', and `%G' input conversions are
+-interchangeable.  They all match an optionally signed floating point
+-number, in the same syntax as for the `strtod' function (*note Parsing
+-of Floats::.).
+-
+-   For the floating-point input conversions, the default argument type
+-is `float *'.  (This is different from the corresponding output
+-conversions, where the default type is `double'; remember that `float'
+-arguments to `printf' are converted to `double' by the default argument
+-promotions, but `float *' arguments are not promoted to `double *'.)
+-You can specify other sizes of float using these type modifiers:
+-
+-`l'
+-     Specifies that the argument is of type `double *'.
+-
+-`L'
+-     Specifies that the argument is of type `long double *'.
+-
+-   For all the above number parsing formats there is an additional
+-optional flag `''.  When this flag is given the `scanf' function
+-expects the number represented in the input string to be formatted
+-according to the grouping rules of the currently selected locale (*note
+-General Numeric::.).
+-
+-   If the `"C"' or `"POSIX"' locale is selected there is no difference.
+-But for a locale which specifies values for the appropriate fields in
+-the locale the input must have the correct form in the input.
+-Otherwise the longest prefix with a correct form is processed.
+-
+-
+-File: libc.info,  Node: String Input Conversions,  Next: Dynamic String Input,  Prev: Numeric Input Conversions,  Up: Formatted Input
+-
+-String Input Conversions
+-------------------------
+-
+-   This section describes the `scanf' input conversions for reading
+-string and character values: `%s', `%[', and `%c'.
+-
+-   You have two options for how to receive the input from these
+-conversions:
+-
+-   * Provide a buffer to store it in.  This is the default.  You should
+-     provide an argument of type `char *'.
+-
+-     *Warning:* To make a robust program, you must make sure that the
+-     input (plus its terminating null) cannot possibly exceed the size
+-     of the buffer you provide.  In general, the only way to do this is
+-     to specify a maximum field width one less than the buffer size.
+-     *If you provide the buffer, always specify a maximum field width
+-     to prevent overflow.*
+-
+-   * Ask `scanf' to allocate a big enough buffer, by specifying the `a'
+-     flag character.  This is a GNU extension.  You should provide an
+-     argument of type `char **' for the buffer address to be stored in.
+-     *Note Dynamic String Input::.
+-
+-   The `%c' conversion is the simplest: it matches a fixed number of
+-characters, always.  The maximum field with says how many characters to
+-read; if you don't specify the maximum, the default is 1.  This
+-conversion doesn't append a null character to the end of the text it
+-reads.  It also does not skip over initial whitespace characters.  It
+-reads precisely the next N characters, and fails if it cannot get that
+-many.  Since there is always a maximum field width with `%c' (whether
+-specified, or 1 by default), you can always prevent overflow by making
+-the buffer long enough.
+-
+-   The `%s' conversion matches a string of non-whitespace characters.
+-It skips and discards initial whitespace, but stops when it encounters
+-more whitespace after having read something.  It stores a null character
+-at the end of the text that it reads.
+-
+-   For example, reading the input:
+-
+-      hello, world
+-
+-with the conversion `%10c' produces `" hello, wo"', but reading the
+-same input with the conversion `%10s' produces `"hello,"'.
+-
+-   *Warning:* If you do not specify a field width for `%s', then the
+-number of characters read is limited only by where the next whitespace
+-character appears.  This almost certainly means that invalid input can
+-make your program crash--which is a bug.
+-
+-   To read in characters that belong to an arbitrary set of your choice,
+-use the `%[' conversion.  You specify the set between the `[' character
+-and a following `]' character, using the same syntax used in regular
+-expressions.  As special cases:
+-
+-   * A literal `]' character can be specified as the first character of
+-     the set.
+-
+-   * An embedded `-' character (that is, one that is not the first or
+-     last character of the set) is used to specify a range of
+-     characters.
+-
+-   * If a caret character `^' immediately follows the initial `[', then
+-     the set of allowed input characters is the everything *except* the
+-     characters listed.
+-
+-   The `%[' conversion does not skip over initial whitespace characters.
+-
+-   Here are some examples of `%[' conversions and what they mean:
+-
+-`%25[1234567890]'
+-     Matches a string of up to 25 digits.
+-
+-`%25[][]'
+-     Matches a string of up to 25 square brackets.
+-
+-`%25[^ \f\n\r\t\v]'
+-     Matches a string up to 25 characters long that doesn't contain any
+-     of the standard whitespace characters.  This is slightly different
+-     from `%s', because if the input begins with a whitespace character,
+-     `%[' reports a matching failure while `%s' simply discards the
+-     initial whitespace.
+-
+-`%25[a-z]'
+-     Matches up to 25 lowercase characters.
+-
+-   One more reminder: the `%s' and `%[' conversions are *dangerous* if
+-you don't specify a maximum width or use the `a' flag, because input
+-too long would overflow whatever buffer you have provided for it.  No
+-matter how long your buffer is, a user could supply input that is
+-longer.  A well-written program reports invalid input with a
+-comprehensible error message, not with a crash.
+-
+-
+-File: libc.info,  Node: Dynamic String Input,  Next: Other Input Conversions,  Prev: String Input Conversions,  Up: Formatted Input
+-
+-Dynamically Allocating String Conversions
+------------------------------------------
+-
+-   A GNU extension to formatted input lets you safely read a string
+-with no maximum size.  Using this feature, you don't supply a buffer;
+-instead, `scanf' allocates a buffer big enough to hold the data and
+-gives you its address.  To use this feature, write `a' as a flag
+-character, as in `%as' or `%a[0-9a-z]'.
+-
+-   The pointer argument you supply for where to store the input should
+-have type `char **'.  The `scanf' function allocates a buffer and
+-stores its address in the word that the argument points to.  You should
+-free the buffer with `free' when you no longer need it.
+-
+-   Here is an example of using the `a' flag with the `%[...]'
+-conversion specification to read a "variable assignment" of the form
+-`VARIABLE = VALUE'.
+-
+-     {
+-       char *variable, *value;
+-     
+-       if (2 > scanf ("%a[a-zA-Z0-9] = %a[^\n]\n",
+-                      &variable, &value))
+-         {
+-           invalid_input_error ();
+-           return 0;
+-         }
+-     
+-       ...
+-     }
+-
+-
+-File: libc.info,  Node: Other Input Conversions,  Next: Formatted Input Functions,  Prev: Dynamic String Input,  Up: Formatted Input
+-
+-Other Input Conversions
+------------------------
+-
+-   This section describes the miscellaneous input conversions.
+-
+-   The `%p' conversion is used to read a pointer value.  It recognizes
+-the same syntax as is used by the `%p' output conversion for `printf'
+-(*note Other Output Conversions::.); that is, a hexadecimal number just
+-as the `%x' conversion accepts.  The corresponding argument should be
+-of type `void **'; that is, the address of a place to store a pointer.
+-
+-   The resulting pointer value is not guaranteed to be valid if it was
+-not originally written during the same program execution that reads it
+-in.
+-
+-   The `%n' conversion produces the number of characters read so far by
+-this call.  The corresponding argument should be of type `int *'.  This
+-conversion works in the same way as the `%n' conversion for `printf';
+-see *Note Other Output Conversions::, for an example.
+-
+-   The `%n' conversion is the only mechanism for determining the
+-success of literal matches or conversions with suppressed assignments.
+-If the `%n' follows the locus of a matching failure, then no value is
+-stored for it since `scanf' returns before processing the `%n'.  If you
+-store `-1' in that argument slot before calling `scanf', the presence
+-of `-1' after `scanf' indicates an error occurred before the `%n' was
+-reached.
+-
+-   Finally, the `%%' conversion matches a literal `%' character in the
+-input stream, without using an argument.  This conversion does not
+-permit any flags, field width, or type modifier to be specified.
+-
+-
+-File: libc.info,  Node: Formatted Input Functions,  Next: Variable Arguments Input,  Prev: Other Input Conversions,  Up: Formatted Input
+-
+-Formatted Input Functions
+--------------------------
+-
+-   Here are the descriptions of the functions for performing formatted
+-input.  Prototypes for these functions are in the header file `stdio.h'.
+-
+- - Function: int scanf (const char *TEMPLATE, ...)
+-     The `scanf' function reads formatted input from the stream `stdin'
+-     under the control of the template string TEMPLATE.  The optional
+-     arguments are pointers to the places which receive the resulting
+-     values.
+-
+-     The return value is normally the number of successful assignments.
+-     If an end-of-file condition is detected before any matches are
+-     performed (including matches against whitespace and literal
+-     characters in the template), then `EOF' is returned.
+-
+- - Function: int fscanf (FILE *STREAM, const char *TEMPLATE, ...)
+-     This function is just like `scanf', except that the input is read
+-     from the stream STREAM instead of `stdin'.
+-
+- - Function: int sscanf (const char *S, const char *TEMPLATE, ...)
+-     This is like `scanf', except that the characters are taken from the
+-     null-terminated string S instead of from a stream.  Reaching the
+-     end of the string is treated as an end-of-file condition.
+-
+-     The behavior of this function is undefined if copying takes place
+-     between objects that overlap--for example, if S is also given as
+-     an argument to receive a string read under control of the `%s'
+-     conversion.
+-
+-
+-File: libc.info,  Node: Variable Arguments Input,  Prev: Formatted Input Functions,  Up: Formatted Input
+-
+-Variable Arguments Input Functions
+-----------------------------------
+-
+-   The functions `vscanf' and friends are provided so that you can
+-define your own variadic `scanf'-like functions that make use of the
+-same internals as the built-in formatted output functions.  These
+-functions are analogous to the `vprintf' series of output functions.
+-*Note Variable Arguments Output::, for important information on how to
+-use them.
+-
+-   *Portability Note:* The functions listed in this section are GNU
+-extensions.
+-
+- - Function: int vscanf (const char *TEMPLATE, va_list AP)
+-     This function is similar to `scanf' except that, instead of taking
+-     a variable number of arguments directly, it takes an argument list
+-     pointer AP of type `va_list' (*note Variadic Functions::.).
+-
+- - Function: int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list
+-          AP)
+-     This is the equivalent of `fscanf' with the variable argument list
+-     specified directly as for `vscanf'.
+-
+- - Function: int vsscanf (const char *S, const char *TEMPLATE, va_list
+-          AP)
+-     This is the equivalent of `sscanf' with the variable argument list
+-     specified directly as for `vscanf'.
+-
+-   In GNU C, there is a special construct you can use to let the
+-compiler know that a function uses a `scanf'-style format string.  Then
+-it can check the number and types of arguments in each call to the
+-function, and warn you when they do not match the format string.  *Note
+-Declaring Attributes of Functions: (gcc.info)Function Attributes, for
+-details.
+-
+-
+-File: libc.info,  Node: EOF and Errors,  Next: Binary Streams,  Prev: Formatted Input,  Up: I/O on Streams
+-
+-End-Of-File and Errors
+-======================
+-
+-   Many of the functions described in this chapter return the value of
+-the macro `EOF' to indicate unsuccessful completion of the operation.
+-Since `EOF' is used to report both end of file and random errors, it's
+-often better to use the `feof' function to check explicitly for end of
+-file and `ferror' to check for errors.  These functions check
+-indicators that are part of the internal state of the stream object,
+-indicators set if the appropriate condition was detected by a previous
+-I/O operation on that stream.
+-
+-   These symbols are declared in the header file `stdio.h'.
+-
+- - Macro: int EOF
+-     This macro is an integer value that is returned by a number of
+-     functions to indicate an end-of-file condition, or some other
+-     error situation.  With the GNU library, `EOF' is `-1'.  In other
+-     libraries, its value may be some other negative number.
+-
+- - Function: void clearerr (FILE *STREAM)
+-     This function clears the end-of-file and error indicators for the
+-     stream STREAM.
+-
+-     The file positioning functions (*note File Positioning::.) also
+-     clear the end-of-file indicator for the stream.
+-
+- - Function: int feof (FILE *STREAM)
+-     The `feof' function returns nonzero if and only if the end-of-file
+-     indicator for the stream STREAM is set.
+-
+- - Function: int ferror (FILE *STREAM)
+-     The `ferror' function returns nonzero if and only if the error
+-     indicator for the stream STREAM is set, indicating that an error
+-     has occurred on a previous operation on the stream.
+-
+-   In addition to setting the error indicator associated with the
+-stream, the functions that operate on streams also set `errno' in the
+-same way as the corresponding low-level functions that operate on file
+-descriptors.  For example, all of the functions that perform output to a
+-stream--such as `fputc', `printf', and `fflush'--are implemented in
+-terms of `write', and all of the `errno' error conditions defined for
+-`write' are meaningful for these functions.  For more information about
+-the descriptor-level I/O functions, see *Note Low-Level I/O::.
+-
+-
+-File: libc.info,  Node: Binary Streams,  Next: File Positioning,  Prev: EOF and Errors,  Up: I/O on Streams
+-
+-Text and Binary Streams
+-=======================
+-
+-   The GNU system and other POSIX-compatible operating systems organize
+-all files as uniform sequences of characters.  However, some other
+-systems make a distinction between files containing text and files
+-containing binary data, and the input and output facilities of ISO C
+-provide for this distinction.  This section tells you how to write
+-programs portable to such systems.
+-
+-   When you open a stream, you can specify either a "text stream" or a
+-"binary stream".  You indicate that you want a binary stream by
+-specifying the `b' modifier in the OPENTYPE argument to `fopen'; see
+-*Note Opening Streams::.  Without this option, `fopen' opens the file
+-as a text stream.
+-
+-   Text and binary streams differ in several ways:
+-
+-   * The data read from a text stream is divided into "lines" which are
+-     terminated by newline (`'\n'') characters, while a binary stream is
+-     simply a long series of characters.  A text stream might on some
+-     systems fail to handle lines more than 254 characters long
+-     (including the terminating newline character).
+-
+-   * On some systems, text files can contain only printing characters,
+-     horizontal tab characters, and newlines, and so text streams may
+-     not support other characters.  However, binary streams can handle
+-     any character value.
+-
+-   * Space characters that are written immediately preceding a newline
+-     character in a text stream may disappear when the file is read in
+-     again.
+-
+-   * More generally, there need not be a one-to-one mapping between
+-     characters that are read from or written to a text stream, and the
+-     characters in the actual file.
+-
+-   Since a binary stream is always more capable and more predictable
+-than a text stream, you might wonder what purpose text streams serve.
+-Why not simply always use binary streams?  The answer is that on these
+-operating systems, text and binary streams use different file formats,
+-and the only way to read or write "an ordinary file of text" that can
+-work with other text-oriented programs is through a text stream.
+-
+-   In the GNU library, and on all POSIX systems, there is no difference
+-between text streams and binary streams.  When you open a stream, you
+-get the same kind of stream regardless of whether you ask for binary.
+-This stream can handle any file content, and has none of the
+-restrictions that text streams sometimes have.
+-
+-
+-File: libc.info,  Node: File Positioning,  Next: Portable Positioning,  Prev: Binary Streams,  Up: I/O on Streams
+-
+-File Positioning
+-================
+-
+-   The "file position" of a stream describes where in the file the
+-stream is currently reading or writing.  I/O on the stream advances the
+-file position through the file.  In the GNU system, the file position is
+-represented as an integer, which counts the number of bytes from the
+-beginning of the file.  *Note File Position::.
+-
+-   During I/O to an ordinary disk file, you can change the file position
+-whenever you wish, so as to read or write any portion of the file.  Some
+-other kinds of files may also permit this.  Files which support changing
+-the file position are sometimes referred to as "random-access" files.
+-
+-   You can use the functions in this section to examine or modify the
+-file position indicator associated with a stream.  The symbols listed
+-below are declared in the header file `stdio.h'.
+-
+- - Function: long int ftell (FILE *STREAM)
+-     This function returns the current file position of the stream
+-     STREAM.
+-
+-     This function can fail if the stream doesn't support file
+-     positioning, or if the file position can't be represented in a
+-     `long int', and possibly for other reasons as well.  If a failure
+-     occurs, a value of `-1' is returned.
+-
+- - Function: off_t ftello (FILE *STREAM)
+-     The `ftello' function is similar to `ftell' only it corrects a
+-     problem which the POSIX type system.  In this type system all file
+-     positions are described using values of type `off_t' which is not
+-     necessarily of the same size as `long int'.  Therefore using
+-     `ftell' can lead to problems if the implementation is written on
+-     top of a POSIX compliant lowlevel I/O implementation.
+-
+-     Therefore it is a good idea to prefer `ftello' whenever it is
+-     available since its functionality is (if different at all) closer
+-     the underlying definition.
+-
+-     If this function fails it return `(off_t) -1'.  This can happen due
+-     to missing support for file positioning or internal errors.
+-     Otherwise the return value is the current file position.
+-
+-     The function is an extension defined in the Unix Single
+-     Specification version 2.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `ftello64'.  I.e., the LFS
+-     interface transparently replaces the old interface.
+-
+- - Function: off64_t ftello64 (FILE *STREAM)
+-     This function is similar to `ftello' with the only difference that
+-     the return value is of type `off64_t'.  This also requires that the
+-     stream STREAM was opened using either `fopen64', `freopen64', or
+-     `tmpfile64' since otherwise the underlying file operations to
+-     position the file pointer beyond the 2^31 bytes limit might fail.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `ftello'
+-     and so transparently replaces the old interface.
+-
+- - Function: int fseek (FILE *STREAM, long int OFFSET, int WHENCE)
+-     The `fseek' function is used to change the file position of the
+-     stream STREAM.  The value of WHENCE must be one of the constants
+-     `SEEK_SET', `SEEK_CUR', or `SEEK_END', to indicate whether the
+-     OFFSET is relative to the beginning of the file, the current file
+-     position, or the end of the file, respectively.
+-
+-     This function returns a value of zero if the operation was
+-     successful, and a nonzero value to indicate failure.  A successful
+-     call also clears the end-of-file indicator of STREAM and discards
+-     any characters that were "pushed back" by the use of `ungetc'.
+-
+-     `fseek' either flushes any buffered output before setting the file
+-     position or else remembers it so it will be written later in its
+-     proper place in the file.
+-
+- - Function: int fseeko (FILE *STREAM, off_t OFFSET, int WHENCE)
+-     This function is similar to `fseek' but it corrects a problem with
+-     `fseek' in a system with POSIX types.  Using a value of type `long
+-     int' for the offset is not compatible with POSIX.  `fseeko' uses
+-     the correct type `off_t' for the OFFSET parameter.
+-
+-     For this reason it is a good idea to prefer `ftello' whenever it is
+-     available since its functionality is (if different at all) closer
+-     the underlying definition.
+-
+-     The functionality and return value is the same as for `fseek'.
+-
+-     The function is an extension defined in the Unix Single
+-     Specification version 2.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `fseeko64'.  I.e., the LFS
+-     interface transparently replaces the old interface.
+-
+- - Function: int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE)
+-     This function is similar to `fseeko' with the only difference that
+-     the OFFSET parameter is of type `off64_t'.  This also requires
+-     that the stream STREAM was opened using either `fopen64',
+-     `freopen64', or `tmpfile64' since otherwise the underlying file
+-     operations to position the file pointer beyond the 2^31 bytes
+-     limit might fail.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `fseeko'
+-     and so transparently replaces the old interface.
+-
+-   *Portability Note:* In non-POSIX systems, `ftell', `ftello', `fseek'
+-and `fseeko' might work reliably only on binary streams.  *Note Binary
+-Streams::.
+-
+-   The following symbolic constants are defined for use as the WHENCE
+-argument to `fseek'.  They are also used with the `lseek' function
+-(*note I/O Primitives::.) and to specify offsets for file locks (*note
+-Control Operations::.).
+-
+- - Macro: int SEEK_SET
+-     This is an integer constant which, when used as the WHENCE
+-     argument to the `fseek' or `fseeko' function, specifies that the
+-     offset provided is relative to the beginning of the file.
+-
+- - Macro: int SEEK_CUR
+-     This is an integer constant which, when used as the WHENCE
+-     argument to the `fseek' or `fseeko' function, specifies that the
+-     offset provided is relative to the current file position.
+-
+- - Macro: int SEEK_END
+-     This is an integer constant which, when used as the WHENCE
+-     argument to the `fseek' or `fseeko' function, specifies that the
+-     offset provided is relative to the end of the file.
+-
+- - Function: void rewind (FILE *STREAM)
+-     The `rewind' function positions the stream STREAM at the beginning
+-     of the file.  It is equivalent to calling `fseek' or `fseeko' on
+-     the STREAM with an OFFSET argument of `0L' and a WHENCE argument
+-     of `SEEK_SET', except that the return value is discarded and the
+-     error indicator for the stream is reset.
+-
+-   These three aliases for the `SEEK_...' constants exist for the sake
+-of compatibility with older BSD systems.  They are defined in two
+-different header files: `fcntl.h' and `sys/file.h'.
+-
+-`L_SET'
+-     An alias for `SEEK_SET'.
+-
+-`L_INCR'
+-     An alias for `SEEK_CUR'.
+-
+-`L_XTND'
+-     An alias for `SEEK_END'.
+-
+-
+-File: libc.info,  Node: Portable Positioning,  Next: Stream Buffering,  Prev: File Positioning,  Up: I/O on Streams
+-
+-Portable File-Position Functions
+-================================
+-
+-   On the GNU system, the file position is truly a character count.  You
+-can specify any character count value as an argument to `fseek' or
+-`fseeko' and get reliable results for any random access file.  However,
+-some ISO C systems do not represent file positions in this way.
+-
+-   On some systems where text streams truly differ from binary streams,
+-it is impossible to represent the file position of a text stream as a
+-count of characters from the beginning of the file.  For example, the
+-file position on some systems must encode both a record offset within
+-the file, and a character offset within the record.
+-
+-   As a consequence, if you want your programs to be portable to these
+-systems, you must observe certain rules:
+-
+-   * The value returned from `ftell' on a text stream has no predictable
+-     relationship to the number of characters you have read so far.
+-     The only thing you can rely on is that you can use it subsequently
+-     as the OFFSET argument to `fseek' or `fseeko' to move back to the
+-     same file position.
+-
+-   * In a call to `fseek' or `fseeko' on a text stream, either the
+-     OFFSET must either be zero; or WHENCE must be `SEEK_SET' and the
+-     OFFSET must be the result of an earlier call to `ftell' on the
+-     same stream.
+-
+-   * The value of the file position indicator of a text stream is
+-     undefined while there are characters that have been pushed back
+-     with `ungetc' that haven't been read or discarded.  *Note
+-     Unreading::.
+-
+-   But even if you observe these rules, you may still have trouble for
+-long files, because `ftell' and `fseek' use a `long int' value to
+-represent the file position.  This type may not have room to encode all
+-the file positions in a large file.  Using the `ftello' and `fseeko'
+-functions might help here since the `off_t' type is expected to be able
+-to hold all file position values but this still does not help to handle
+-additional information which must be associated with a file position.
+-
+-   So if you do want to support systems with peculiar encodings for the
+-file positions, it is better to use the functions `fgetpos' and
+-`fsetpos' instead.  These functions represent the file position using
+-the data type `fpos_t', whose internal representation varies from
+-system to system.
+-
+-   These symbols are declared in the header file `stdio.h'.
+-
+- - Data Type: fpos_t
+-     This is the type of an object that can encode information about the
+-     file position of a stream, for use by the functions `fgetpos' and
+-     `fsetpos'.
+-
+-     In the GNU system, `fpos_t' is equivalent to `off_t' or `long
+-     int'.  In other systems, it might have a different internal
+-     representation.
+-
+-     When compiling with `_FILE_OFFSET_BITS == 64' on a 32 bits machine
+-     this type is in fact equivalent to `off64_t' since the LFS
+-     interface transparently replaced the old interface.
+-
+- - Data Type: fpos64_t
+-     This is the type of an object that can encode information about the
+-     file position of a stream, for use by the functions `fgetpos64' and
+-     `fsetpos64'.
+-
+-     In the GNU system, `fpos64_t' is equivalent to `off64_t' or `long
+-     long int'.  In other systems, it might have a different internal
+-     representation.
+-
+- - Function: int fgetpos (FILE *STREAM, fpos_t *POSITION)
+-     This function stores the value of the file position indicator for
+-     the stream STREAM in the `fpos_t' object pointed to by POSITION.
+-     If successful, `fgetpos' returns zero; otherwise it returns a
+-     nonzero value and stores an implementation-defined positive value
+-     in `errno'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system the function is in fact `fgetpos64'.  I.e., the LFS
+-     interface transparently replaced the old interface.
+-
+- - Function: int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)
+-     This function is similar to `fgetpos' but the file position is
+-     returned in a variable of type `fpos64_t' to which POSITION points.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `fgetpos'
+-     and so transparently replaces the old interface.
+-
+- - Function: int fsetpos (FILE *STREAM, const fpos_t *POSITION)
+-     This function sets the file position indicator for the stream
+-     STREAM to the position POSITION, which must have been set by a
+-     previous call to `fgetpos' on the same stream.  If successful,
+-     `fsetpos' clears the end-of-file indicator on the stream, discards
+-     any characters that were "pushed back" by the use of `ungetc', and
+-     returns a value of zero.  Otherwise, `fsetpos' returns a nonzero
+-     value and stores an implementation-defined positive value in
+-     `errno'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system the function is in fact `fsetpos64'.  I.e., the LFS
+-     interface transparently replaced the old interface.
+-
+- - Function: int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)
+-     This function is similar to `fsetpos' but the file position used
+-     for positioning is provided in a variable of type `fpos64_t' to
+-     which POSITION points.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `fsetpos'
+-     and so transparently replaces the old interface.
+-
+-
+-File: libc.info,  Node: Stream Buffering,  Next: Other Kinds of Streams,  Prev: Portable Positioning,  Up: I/O on Streams
+-
+-Stream Buffering
+-================
+-
+-   Characters that are written to a stream are normally accumulated and
+-transmitted asynchronously to the file in a block, instead of appearing
+-as soon as they are output by the application program.  Similarly,
+-streams often retrieve input from the host environment in blocks rather
+-than on a character-by-character basis.  This is called "buffering".
+-
+-   If you are writing programs that do interactive input and output
+-using streams, you need to understand how buffering works when you
+-design the user interface to your program.  Otherwise, you might find
+-that output (such as progress or prompt messages) doesn't appear when
+-you intended it to, or other unexpected behavior.
+-
+-   This section deals only with controlling when characters are
+-transmitted between the stream and the file or device, and *not* with
+-how things like echoing, flow control, and the like are handled on
+-specific classes of devices.  For information on common control
+-operations on terminal devices, see *Note Low-Level Terminal
+-Interface::.
+-
+-   You can bypass the stream buffering facilities altogether by using
+-the low-level input and output functions that operate on file
+-descriptors instead.  *Note Low-Level I/O::.
+-
+-* Menu:
+-
+-* Buffering Concepts::          Terminology is defined here.
+-* Flushing Buffers::            How to ensure that output buffers are flushed.
+-* Controlling Buffering::       How to specify what kind of buffering to use.
+-
+-
+-File: libc.info,  Node: Buffering Concepts,  Next: Flushing Buffers,  Up: Stream Buffering
+-
+-Buffering Concepts
+-------------------
+-
+-   There are three different kinds of buffering strategies:
+-
+-   * Characters written to or read from an "unbuffered" stream are
+-     transmitted individually to or from the file as soon as possible.
+-
+-   * Characters written to a "line buffered" stream are transmitted to
+-     the file in blocks when a newline character is encountered.
+-
+-   * Characters written to or read from a "fully buffered" stream are
+-     transmitted to or from the file in blocks of arbitrary size.
+-
+-   Newly opened streams are normally fully buffered, with one
+-exception: a stream connected to an interactive device such as a
+-terminal is initially line buffered.  *Note Controlling Buffering::,
+-for information on how to select a different kind of buffering.
+-Usually the automatic selection gives you the most convenient kind of
+-buffering for the file or device you open.
+-
+-   The use of line buffering for interactive devices implies that output
+-messages ending in a newline will appear immediately--which is usually
+-what you want.  Output that doesn't end in a newline might or might not
+-show up immediately, so if you want them to appear immediately, you
+-should flush buffered output explicitly with `fflush', as described in
+-*Note Flushing Buffers::.
+-
+-
+-File: libc.info,  Node: Flushing Buffers,  Next: Controlling Buffering,  Prev: Buffering Concepts,  Up: Stream Buffering
+-
+-Flushing Buffers
+-----------------
+-
+-   "Flushing" output on a buffered stream means transmitting all
+-accumulated characters to the file.  There are many circumstances when
+-buffered output on a stream is flushed automatically:
+-
+-   * When you try to do output and the output buffer is full.
+-
+-   * When the stream is closed.  *Note Closing Streams::.
+-
+-   * When the program terminates by calling `exit'.  *Note Normal
+-     Termination::.
+-
+-   * When a newline is written, if the stream is line buffered.
+-
+-   * Whenever an input operation on *any* stream actually reads data
+-     from its file.
+-
+-   If you want to flush the buffered output at another time, call
+-`fflush', which is declared in the header file `stdio.h'.
+-
+- - Function: int fflush (FILE *STREAM)
+-     This function causes any buffered output on STREAM to be delivered
+-     to the file.  If STREAM is a null pointer, then `fflush' causes
+-     buffered output on *all* open output streams to be flushed.
+-
+-     This function returns `EOF' if a write error occurs, or zero
+-     otherwise.
+-
+-   *Compatibility Note:* Some brain-damaged operating systems have been
+-known to be so thoroughly fixated on line-oriented input and output
+-that flushing a line buffered stream causes a newline to be written!
+-Fortunately, this "feature" seems to be becoming less common.  You do
+-not need to worry about this in the GNU system.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-17 glibc-2.1.3/manual/libc.info-17
+--- ../glibc-2.1.3/manual/libc.info-17	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-17	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1134 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Controlling Buffering,  Prev: Flushing Buffers,  Up: Stream Buffering
+-
+-Controlling Which Kind of Buffering
+------------------------------------
+-
+-   After opening a stream (but before any other operations have been
+-performed on it), you can explicitly specify what kind of buffering you
+-want it to have using the `setvbuf' function.
+-
+-   The facilities listed in this section are declared in the header
+-file `stdio.h'.
+-
+- - Function: int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t
+-          SIZE)
+-     This function is used to specify that the stream STREAM should
+-     have the buffering mode MODE, which can be either `_IOFBF' (for
+-     full buffering), `_IOLBF' (for line buffering), or `_IONBF' (for
+-     unbuffered input/output).
+-
+-     If you specify a null pointer as the BUF argument, then `setvbuf'
+-     allocates a buffer itself using `malloc'.  This buffer will be
+-     freed when you close the stream.
+-
+-     Otherwise, BUF should be a character array that can hold at least
+-     SIZE characters.  You should not free the space for this array as
+-     long as the stream remains open and this array remains its buffer.
+-     You should usually either allocate it statically, or `malloc'
+-     (*note Unconstrained Allocation::.) the buffer.  Using an
+-     automatic array is not a good idea unless you close the file
+-     before exiting the block that declares the array.
+-
+-     While the array remains a stream buffer, the stream I/O functions
+-     will use the buffer for their internal purposes.  You shouldn't
+-     try to access the values in the array directly while the stream is
+-     using it for buffering.
+-
+-     The `setvbuf' function returns zero on success, or a nonzero value
+-     if the value of MODE is not valid or if the request could not be
+-     honored.
+-
+- - Macro: int _IOFBF
+-     The value of this macro is an integer constant expression that can
+-     be used as the MODE argument to the `setvbuf' function to specify
+-     that the stream should be fully buffered.
+-
+- - Macro: int _IOLBF
+-     The value of this macro is an integer constant expression that can
+-     be used as the MODE argument to the `setvbuf' function to specify
+-     that the stream should be line buffered.
+-
+- - Macro: int _IONBF
+-     The value of this macro is an integer constant expression that can
+-     be used as the MODE argument to the `setvbuf' function to specify
+-     that the stream should be unbuffered.
+-
+- - Macro: int BUFSIZ
+-     The value of this macro is an integer constant expression that is
+-     good to use for the SIZE argument to `setvbuf'.  This value is
+-     guaranteed to be at least `256'.
+-
+-     The value of `BUFSIZ' is chosen on each system so as to make stream
+-     I/O efficient.  So it is a good idea to use `BUFSIZ' as the size
+-     for the buffer when you call `setvbuf'.
+-
+-     Actually, you can get an even better value to use for the buffer
+-     size by means of the `fstat' system call: it is found in the
+-     `st_blksize' field of the file attributes.  *Note Attribute
+-     Meanings::.
+-
+-     Sometimes people also use `BUFSIZ' as the allocation size of
+-     buffers used for related purposes, such as strings used to receive
+-     a line of input with `fgets' (*note Character Input::.).  There is
+-     no particular reason to use `BUFSIZ' for this instead of any other
+-     integer, except that it might lead to doing I/O in chunks of an
+-     efficient size.
+-
+- - Function: void setbuf (FILE *STREAM, char *BUF)
+-     If BUF is a null pointer, the effect of this function is
+-     equivalent to calling `setvbuf' with a MODE argument of `_IONBF'.
+-     Otherwise, it is equivalent to calling `setvbuf' with BUF, and a
+-     MODE of `_IOFBF' and a SIZE argument of `BUFSIZ'.
+-
+-     The `setbuf' function is provided for compatibility with old code;
+-     use `setvbuf' in all new programs.
+-
+- - Function: void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)
+-     If BUF is a null pointer, this function makes STREAM unbuffered.
+-     Otherwise, it makes STREAM fully buffered using BUF as the buffer.
+-     The SIZE argument specifies the length of BUF.
+-
+-     This function is provided for compatibility with old BSD code.  Use
+-     `setvbuf' instead.
+-
+- - Function: void setlinebuf (FILE *STREAM)
+-     This function makes STREAM be line buffered, and allocates the
+-     buffer for you.
+-
+-     This function is provided for compatibility with old BSD code.  Use
+-     `setvbuf' instead.
+-
+-
+-File: libc.info,  Node: Other Kinds of Streams,  Next: Formatted Messages,  Prev: Stream Buffering,  Up: I/O on Streams
+-
+-Other Kinds of Streams
+-======================
+-
+-   The GNU library provides ways for you to define additional kinds of
+-streams that do not necessarily correspond to an open file.
+-
+-   One such type of stream takes input from or writes output to a
+-string.  These kinds of streams are used internally to implement the
+-`sprintf' and `sscanf' functions.  You can also create such a stream
+-explicitly, using the functions described in *Note String Streams::.
+-
+-   More generally, you can define streams that do input/output to
+-arbitrary objects using functions supplied by your program.  This
+-protocol is discussed in *Note Custom Streams::.
+-
+-   *Portability Note:* The facilities described in this section are
+-specific to GNU.  Other systems or C implementations might or might not
+-provide equivalent functionality.
+-
+-* Menu:
+-
+-* String Streams::              Streams that get data from or put data in
+-                                 a string or memory buffer.
+-* Obstack Streams::		Streams that store data in an obstack.
+-* Custom Streams::              Defining your own streams with an arbitrary
+-                                 input data source and/or output data sink.
+-
+-
+-File: libc.info,  Node: String Streams,  Next: Obstack Streams,  Up: Other Kinds of Streams
+-
+-String Streams
+---------------
+-
+-   The `fmemopen' and `open_memstream' functions allow you to do I/O to
+-a string or memory buffer.  These facilities are declared in `stdio.h'.
+-
+- - Function: FILE * fmemopen (void *BUF, size_t SIZE, const char
+-          *OPENTYPE)
+-     This function opens a stream that allows the access specified by
+-     the OPENTYPE argument, that reads from or writes to the buffer
+-     specified by the argument BUF.  This array must be at least SIZE
+-     bytes long.
+-
+-     If you specify a null pointer as the BUF argument, `fmemopen'
+-     dynamically allocates (as with `malloc'; *note Unconstrained
+-     Allocation::.) an array SIZE bytes long.  This is really only
+-     useful if you are going to write things to the buffer and then
+-     read them back in again, because you have no way of actually
+-     getting a pointer to the buffer (for this, try `open_memstream',
+-     below).  The buffer is freed when the stream is open.
+-
+-     The argument OPENTYPE is the same as in `fopen' (*note Opening
+-     Streams::.).  If the OPENTYPE specifies append mode, then the
+-     initial file position is set to the first null character in the
+-     buffer.  Otherwise the initial file position is at the beginning
+-     of the buffer.
+-
+-     When a stream open for writing is flushed or closed, a null
+-     character (zero byte) is written at the end of the buffer if it
+-     fits.  You should add an extra byte to the SIZE argument to
+-     account for this.  Attempts to write more than SIZE bytes to the
+-     buffer result in an error.
+-
+-     For a stream open for reading, null characters (zero bytes) in the
+-     buffer do not count as "end of file".  Read operations indicate
+-     end of file only when the file position advances past SIZE bytes.
+-     So, if you want to read characters from a null-terminated string,
+-     you should supply the length of the string as the SIZE argument.
+-
+-   Here is an example of using `fmemopen' to create a stream for
+-reading from a string:
+-
+-     #include <stdio.h>
+-     
+-     static char buffer[] = "foobar";
+-     
+-     int
+-     main (void)
+-     {
+-       int ch;
+-       FILE *stream;
+-     
+-       stream = fmemopen (buffer, strlen (buffer), "r");
+-       while ((ch = fgetc (stream)) != EOF)
+-         printf ("Got %c\n", ch);
+-       fclose (stream);
+-     
+-       return 0;
+-     }
+-
+-   This program produces the following output:
+-
+-     Got f
+-     Got o
+-     Got o
+-     Got b
+-     Got a
+-     Got r
+-
+- - Function: FILE * open_memstream (char **PTR, size_t *SIZELOC)
+-     This function opens a stream for writing to a buffer.  The buffer
+-     is allocated dynamically (as with `malloc'; *note Unconstrained
+-     Allocation::.) and grown as necessary.
+-
+-     When the stream is closed with `fclose' or flushed with `fflush',
+-     the locations PTR and SIZELOC are updated to contain the pointer
+-     to the buffer and its size.  The values thus stored remain valid
+-     only as long as no further output on the stream takes place.  If
+-     you do more output, you must flush the stream again to store new
+-     values before you use them again.
+-
+-     A null character is written at the end of the buffer.  This null
+-     character is *not* included in the size value stored at SIZELOC.
+-
+-     You can move the stream's file position with `fseek' or `fseeko'
+-     (*note File Positioning::.).  Moving the file position past the
+-     end of the data already written fills the intervening space with
+-     zeroes.
+-
+-   Here is an example of using `open_memstream':
+-
+-     #include <stdio.h>
+-     
+-     int
+-     main (void)
+-     {
+-       char *bp;
+-       size_t size;
+-       FILE *stream;
+-     
+-       stream = open_memstream (&bp, &size);
+-       fprintf (stream, "hello");
+-       fflush (stream);
+-       printf ("buf = `%s', size = %d\n", bp, size);
+-       fprintf (stream, ", world");
+-       fclose (stream);
+-       printf ("buf = `%s', size = %d\n", bp, size);
+-     
+-       return 0;
+-     }
+-
+-   This program produces the following output:
+-
+-     buf = `hello', size = 5
+-     buf = `hello, world', size = 12
+-
+-
+-File: libc.info,  Node: Obstack Streams,  Next: Custom Streams,  Prev: String Streams,  Up: Other Kinds of Streams
+-
+-Obstack Streams
+----------------
+-
+-   You can open an output stream that puts it data in an obstack.
+-*Note Obstacks::.
+-
+- - Function: FILE * open_obstack_stream (struct obstack *OBSTACK)
+-     This function opens a stream for writing data into the obstack
+-     OBSTACK.  This starts an object in the obstack and makes it grow
+-     as data is written (*note Growing Objects::.).
+-
+-     Calling `fflush' on this stream updates the current size of the
+-     object to match the amount of data that has been written.  After a
+-     call to `fflush', you can examine the object temporarily.
+-
+-     You can move the file position of an obstack stream with `fseek' or
+-     `fseeko' (*note File Positioning::.).  Moving the file position
+-     past the end of the data written fills the intervening space with
+-     zeros.
+-
+-     To make the object permanent, update the obstack with `fflush', and
+-     then use `obstack_finish' to finalize the object and get its
+-     address.  The following write to the stream starts a new object in
+-     the obstack, and later writes add to that object until you do
+-     another `fflush' and `obstack_finish'.
+-
+-     But how do you find out how long the object is?  You can get the
+-     length in bytes by calling `obstack_object_size' (*note Status of
+-     an Obstack::.), or you can null-terminate the object like this:
+-
+-          obstack_1grow (OBSTACK, 0);
+-
+-     Whichever one you do, you must do it *before* calling
+-     `obstack_finish'.  (You can do both if you wish.)
+-
+-   Here is a sample function that uses `open_obstack_stream':
+-
+-     char *
+-     make_message_string (const char *a, int b)
+-     {
+-       FILE *stream = open_obstack_stream (&message_obstack);
+-       output_task (stream);
+-       fprintf (stream, ": ");
+-       fprintf (stream, a, b);
+-       fprintf (stream, "\n");
+-       fclose (stream);
+-       obstack_1grow (&message_obstack, 0);
+-       return obstack_finish (&message_obstack);
+-     }
+-
+-
+-File: libc.info,  Node: Custom Streams,  Prev: Obstack Streams,  Up: Other Kinds of Streams
+-
+-Programming Your Own Custom Streams
+------------------------------------
+-
+-   This section describes how you can make a stream that gets input
+-from an arbitrary data source or writes output to an arbitrary data sink
+-programmed by you.  We call these "custom streams".
+-
+-* Menu:
+-
+-* Streams and Cookies::         The "cookie" records where to fetch or
+-                                 store data that is read or written.
+-* Hook Functions::              How you should define the four "hook
+-                                 functions" that a custom stream needs.
+-
+-
+-File: libc.info,  Node: Streams and Cookies,  Next: Hook Functions,  Up: Custom Streams
+-
+-Custom Streams and Cookies
+-..........................
+-
+-   Inside every custom stream is a special object called the "cookie".
+-This is an object supplied by you which records where to fetch or store
+-the data read or written.  It is up to you to define a data type to use
+-for the cookie.  The stream functions in the library never refer
+-directly to its contents, and they don't even know what the type is;
+-they record its address with type `void *'.
+-
+-   To implement a custom stream, you must specify *how* to fetch or
+-store the data in the specified place.  You do this by defining "hook
+-functions" to read, write, change "file position", and close the
+-stream.  All four of these functions will be passed the stream's cookie
+-so they can tell where to fetch or store the data.  The library
+-functions don't know what's inside the cookie, but your functions will
+-know.
+-
+-   When you create a custom stream, you must specify the cookie pointer,
+-and also the four hook functions stored in a structure of type
+-`cookie_io_functions_t'.
+-
+-   These facilities are declared in `stdio.h'.
+-
+- - Data Type: cookie_io_functions_t
+-     This is a structure type that holds the functions that define the
+-     communications protocol between the stream and its cookie.  It has
+-     the following members:
+-
+-    `cookie_read_function_t *read'
+-          This is the function that reads data from the cookie.  If the
+-          value is a null pointer instead of a function, then read
+-          operations on this stream always return `EOF'.
+-
+-    `cookie_write_function_t *write'
+-          This is the function that writes data to the cookie.  If the
+-          value is a null pointer instead of a function, then data
+-          written to the stream is discarded.
+-
+-    `cookie_seek_function_t *seek'
+-          This is the function that performs the equivalent of file
+-          positioning on the cookie.  If the value is a null pointer
+-          instead of a function, calls to `fseek' or `fseeko' on this
+-          stream can only seek to locations within the buffer; any
+-          attempt to seek outside the buffer will return an `ESPIPE'
+-          error.
+-
+-    `cookie_close_function_t *close'
+-          This function performs any appropriate cleanup on the cookie
+-          when closing the stream.  If the value is a null pointer
+-          instead of a function, nothing special is done to close the
+-          cookie when the stream is closed.
+-
+- - Function: FILE * fopencookie (void *COOKIE, const char *OPENTYPE,
+-          cookie_io_functions_t IO-FUNCTIONS)
+-     This function actually creates the stream for communicating with
+-     the COOKIE using the functions in the IO-FUNCTIONS argument.  The
+-     OPENTYPE argument is interpreted as for `fopen'; see *Note Opening
+-     Streams::.  (But note that the "truncate on open" option is
+-     ignored.)  The new stream is fully buffered.
+-
+-     The `fopencookie' function returns the newly created stream, or a
+-     null pointer in case of an error.
+-
+-
+-File: libc.info,  Node: Hook Functions,  Prev: Streams and Cookies,  Up: Custom Streams
+-
+-Custom Stream Hook Functions
+-............................
+-
+-   Here are more details on how you should define the four hook
+-functions that a custom stream needs.
+-
+-   You should define the function to read data from the cookie as:
+-
+-     ssize_t READER (void *COOKIE, void *BUFFER, size_t SIZE)
+-
+-   This is very similar to the `read' function; see *Note I/O
+-Primitives::.  Your function should transfer up to SIZE bytes into the
+-BUFFER, and return the number of bytes read, or zero to indicate
+-end-of-file.  You can return a value of `-1' to indicate an error.
+-
+-   You should define the function to write data to the cookie as:
+-
+-     ssize_t WRITER (void *COOKIE, const void *BUFFER, size_t SIZE)
+-
+-   This is very similar to the `write' function; see *Note I/O
+-Primitives::.  Your function should transfer up to SIZE bytes from the
+-buffer, and return the number of bytes written.  You can return a value
+-of `-1' to indicate an error.
+-
+-   You should define the function to perform seek operations on the
+-cookie as:
+-
+-     int SEEKER (void *COOKIE, fpos_t *POSITION, int WHENCE)
+-
+-   For this function, the POSITION and WHENCE arguments are interpreted
+-as for `fgetpos'; see *Note Portable Positioning::.  In the GNU
+-library, `fpos_t' is equivalent to `off_t' or `long int', and simply
+-represents the number of bytes from the beginning of the file.
+-
+-   After doing the seek operation, your function should store the
+-resulting file position relative to the beginning of the file in
+-POSITION.  Your function should return a value of `0' on success and
+-`-1' to indicate an error.
+-
+-   You should define the function to do cleanup operations on the cookie
+-appropriate for closing the stream as:
+-
+-     int CLEANER (void *COOKIE)
+-
+-   Your function should return `-1' to indicate an error, and `0'
+-otherwise.
+-
+- - Data Type: cookie_read_function
+-     This is the data type that the read function for a custom stream
+-     should have.  If you declare the function as shown above, this is
+-     the type it will have.
+-
+- - Data Type: cookie_write_function
+-     The data type of the write function for a custom stream.
+-
+- - Data Type: cookie_seek_function
+-     The data type of the seek function for a custom stream.
+-
+- - Data Type: cookie_close_function
+-     The data type of the close function for a custom stream.
+-
+-
+-File: libc.info,  Node: Formatted Messages,  Prev: Other Kinds of Streams,  Up: I/O on Streams
+-
+-Formatted Messages
+-==================
+-
+-   On systems which are based on System V messages of programs
+-(especially the system tools) are printed in a strict form using the
+-`fmtmsg' function.  The uniformity sometimes helps the user to
+-interpret messages and the strictness tests of the `fmtmsg' function
+-ensure that the programmer follows some minimal requirements.
+-
+-* Menu:
+-
+-* Printing Formatted Messages::   The `fmtmsg' function.
+-* Adding Severity Classes::       Add more severity classes.
+-* Example::                       How to use `fmtmsg' and `addseverity'.
+-
+-
+-File: libc.info,  Node: Printing Formatted Messages,  Next: Adding Severity Classes,  Up: Formatted Messages
+-
+-Printing Formatted Messages
+----------------------------
+-
+-   Messages can be printed to standard error and/or to the console.  To
+-select the destination the programmer can use the following two values,
+-bitwise OR combined if wanted, for the CLASSIFICATION parameter of
+-`fmtmsg':
+-
+-`MM_PRINT'
+-     Display the message in standard error.
+-
+-`MM_CONSOLE'
+-     Display the message on the system console.
+-
+-   The erroneous piece of the system can be signalled by exactly one of
+-the following values which also is bitwise ORed with the CLASSIFICATION
+-parameter to `fmtmsg':
+-
+-`MM_HARD'
+-     The source of the condition is some hardware.
+-
+-`MM_SOFT'
+-     The source of the condition is some software.
+-
+-`MM_FIRM'
+-     The source of the condition is some firmware.
+-
+-   A third component of the CLASSIFICATION parameter to `fmtmsg' can
+-describe the part of the system which detects the problem.  This is
+-done by using exactly one of the following values:
+-
+-`MM_APPL'
+-     The erroneous condition is detected by the application.
+-
+-`MM_UTIL'
+-     The erroneous condition is detected by a utility.
+-
+-`MM_OPSYS'
+-     The erroneous condition is detected by the operating system.
+-
+-   A last component of CLASSIFICATION can signal the results of this
+-message.  Exactly one of the following values can be used:
+-
+-`MM_RECOVER'
+-     It is a recoverable error.
+-
+-`MM_NRECOV'
+-     It is a non-recoverable error.
+-
+- - Function: int fmtmsg (long int CLASSIFICATION, const char *LABEL,
+-          int SEVERITY, const char *TEXT, const char *ACTION, const
+-          char *TAG)
+-     Display a message described by its parameters on the device(s)
+-     specified in the CLASSIFICATION parameter.  The LABEL parameter
+-     identifies the source of the message.  The string should consist
+-     of two colon separated parts where the first part has not more
+-     than 10 and the second part not more the 14 characters.  The TEXT
+-     parameter describes the condition of the error, the ACTION
+-     parameter possible steps to recover from the error and the TAG
+-     parameter is a reference to the online documentation where more
+-     information can be found.  It should contain the LABEL value and a
+-     unique identification number.
+-
+-     Each of the parameters can be a special value which means this
+-     value is to be omitted.  The symbolic names for these values are:
+-
+-    `MM_NULLLBL'
+-          Ignore LABEL parameter.
+-
+-    `MM_NULLSEV'
+-          Ignore SEVERITY parameter.
+-
+-    `MM_NULLMC'
+-          Ignore CLASSIFICATION parameter.  This implies that nothing is
+-          actually printed.
+-
+-    `MM_NULLTXT'
+-          Ignore TEXT parameter.
+-
+-    `MM_NULLACT'
+-          Ignore ACTION parameter.
+-
+-    `MM_NULLTAG'
+-          Ignore TAG parameter.
+-
+-     There is another way certain fields can be omitted from the output
+-     to standard error.  This is described below in the description of
+-     environment variables influencing the behaviour.
+-
+-     The SEVERITY parameter can have one of the values in the following
+-     table:
+-
+-    `MM_NOSEV'
+-          Nothing is printed, this value is the same as `MM_NULLSEV'.
+-
+-    `MM_HALT'
+-          This value is printed as `HALT'.
+-
+-    `MM_ERROR'
+-          This value is printed as `ERROR'.
+-
+-    `MM_WARNING'
+-          This value is printed as `WARNING'.
+-
+-    `MM_INFO'
+-          This value is printed as `INFO'.
+-
+-     The numeric value of these five macros are between `0' and `4'.
+-     Using the environment variable `SEV_LEVEL' or using the
+-     `addseverity' function one can add more severity levels with their
+-     corresponding string to print.  This is described below (*note
+-     Adding Severity Classes::.).
+-
+-     If no parameter is ignored the output looks like this:
+-
+-          LABEL: SEVERITY-STRING: TEXT
+-          TO FIX: ACTION TAG
+-
+-     The colons, new line characters and the `TO FIX' string are
+-     inserted if necessary, i.e., if the corresponding parameter is not
+-     ignored.
+-
+-     This function is specified in the X/Open Portability Guide.  It is
+-     also available on all system derived from System V.
+-
+-     The function returns the value `MM_OK' if no error occurred.  If
+-     only the printing to standard error failed, it returns `MM_NOMSG'.
+-     If printing to the console fails, it returns `MM_NOCON'.  If
+-     nothing is printed `MM_NOTOK' is returned.  Among situations where
+-     all outputs fail this last value is also returned if a parameter
+-     value is incorrect.
+-
+-   There are two environment variables which influence the behaviour of
+-`fmtmsg'.  The first is `MSGVERB'.  It is used to control the output
+-actually happening on standard error (*not* the console output).  Each
+-of the five fields can explicitely be enabled.  To do this the user has
+-to put the `MSGVERB' variable with a format like the following in the
+-environment before calling the `fmtmsg' function the first time:
+-
+-     MSGVERB=KEYWORD[:KEYWORD[:...]]
+-
+-   Valid KEYWORDs are `label', `severity', `text', `action', and `tag'.
+-If the environment variable is not given or is the empty string, a not
+-supported keyword is given or the value is somehow else invalid, no
+-part of the message is masked out.
+-
+-   The second environment variable which influences the behaviour of
+-`fmtmsg' is `SEV_LEVEL'.  This variable and the change in the behaviour
+-of `fmtmsg' is not specified in the X/Open Portability Guide.  It is
+-available in System V systems, though.  It can be used to introduce new
+-severity levels.  By default, only the five severity levels described
+-above are available.  Any other numeric value would make `fmtmsg' print
+-nothing.
+-
+-   If the user puts `SEV_LEVEL' with a format like
+-
+-     SEV_LEVEL=[DESCRIPTION[:DESCRIPTION[:...]]]
+-
+-in the environment of the process before the first call to `fmtmsg',
+-where DESCRIPTION has a value of the form
+-
+-     SEVERITY-KEYWORD,LEVEL,PRINTSTRING
+-
+-   The SEVERITY-KEYWORD part is not used by `fmtmsg' but it has to be
+-present.  The LEVEL part is a string representation of a number.  The
+-numeric value must be a number greater than 4.  This value must be used
+-in the SEVERITY parameter of `fmtmsg' to select this class.  It is not
+-possible to overwrite any of the predefined classes.  The PRINTSTRING
+-is the string printed when a message of this class is processed by
+-`fmtmsg' (see above, `fmtsmg' does not print the numeric value but
+-instead the string representation).
+-
+-
+-File: libc.info,  Node: Adding Severity Classes,  Next: Example,  Prev: Printing Formatted Messages,  Up: Formatted Messages
+-
+-Adding Severity Classes
+------------------------
+-
+-   There is another possibility to introduce severity classes beside
+-using the environment variable `SEV_LEVEL'.  This simplifies the task of
+-introducing new classes in a running program.  One could use the
+-`setenv' or `putenv' function to set the environment variable, but this
+-is toilsome.
+-
+- - Function: int addseverity (int SEVERITY, const char *STRING)
+-     This function allows to introduce new severity classes which can be
+-     addressed by the SEVERITY parameter of the `fmtmsg' function.  The
+-     SEVERITY parameter of `addseverity' must match the value for the
+-     parameter with the same name of `fmtmsg' and STRING is the string
+-     printed in the actual messages instead of the numeric value.
+-
+-     If STRING is `NULL' the severity class with the numeric value
+-     according to SEVERITY is removed.
+-
+-     It is not possible to overwrite or remove one of the default
+-     severity classes.  All calls to `addseverity' with SEVERITY set to
+-     one of the values for the default classes will fail.
+-
+-     The return value is `MM_OK' if the task was successfully performed.
+-     If the return value is `MM_NOTOK' something went wrong.  This could
+-     mean that no more memory is available or a class is not available
+-     when it has to be removed.
+-
+-     This function is not specified in the X/Open Portability Guide
+-     although the `fmtsmg' function is.  It is available on System V
+-     systems.
+-
+-
+-File: libc.info,  Node: Example,  Prev: Adding Severity Classes,  Up: Formatted Messages
+-
+-How to use `fmtmsg' and `addseverity'
+--------------------------------------
+-
+-   Here is a simple example program to illustrate the use of the both
+-functions described in this section.
+-
+-     #include <fmtmsg.h>
+-     
+-     int
+-     main (void)
+-     {
+-       addseverity (5, "NOTE2");
+-       fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2");
+-       fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual",
+-               "UX:cat:001");
+-       fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag");
+-       return 0;
+-     }
+-
+-   The second call to `fmtmsg' illustrates a use of this function how
+-it usually happens on System V systems which heavily use this function.
+-It might be worth a thought to follow the scheme used in System V
+-systems so we give a short explanation here.  The value of the LABEL
+-field (`UX:cat') says that the error occured in the Unix program `cat'.
+-The explanation of the error follows and the value for the ACTION
+-parameter is `"refer to manual"'.  One could me more specific here, if
+-needed.  The TAG field contains, as proposed above, the value of the
+-string given for the LABEL parameter, and additionally a unique ID
+-(`001' in this case).  For a GNU environment this string could contain
+-a reference to the corresponding node in the Info page for the program.
+-
+-Running this program without specifying the `MSGVERB' and `SEV_LEVEL'
+-function produces the following output:
+-
+-     UX:cat: NOTE2: invalid syntax
+-     TO FIX: refer to manual UX:cat:001
+-
+-   We see the different fields of the message and how the extra glue
+-(the colons and the `TO FIX' string) are printed.  But only one of the
+-three calls to `fmtmsg' produced output.  The first call does not print
+-anything because the LABEL parameter is not in the correct form.  The
+-string must contain two fields, separated by a colon (*note Printing
+-Formatted Messages::.).  The third `fmtmsg' call produced no output
+-since the class with the numeric value `6' is not defined.  Although a
+-class with numeric value `5' is also not defined by default, the call
+-the `addseverity' introduces it and the second call to `fmtmsg'
+-produces the above output.
+-
+-   When we change the environment of the program to contain
+-`SEV_LEVEL=XXX,6,NOTE' when running it we get a different result:
+-
+-     UX:cat: NOTE2: invalid syntax
+-     TO FIX: refer to manual UX:cat:001
+-     label:foo: NOTE: text
+-     TO FIX: action tag
+-
+-   Now the third call the `fmtmsg' produced some output and we see how
+-the string `NOTE' from the environment variable appears in the message.
+-
+-   Now we can reduce the output by specifying in which fields we are
+-interested in.  If we additionally set the environment variable
+-`MSGVERB' to the value `severity:label:action' we get the following
+-output:
+-
+-     UX:cat: NOTE2
+-     TO FIX: refer to manual
+-     label:foo: NOTE
+-     TO FIX: action
+-
+-I.e., the output produced by the TEXT and the TAG parameters to
+-`fmtmsg' vanished.  Please also note that now there is no colon after
+-the `NOTE' and `NOTE2' strings in the output.  This is not necessary
+-since there is no more output on this line since the text is missing.
+-
+-
+-File: libc.info,  Node: Low-Level I/O,  Next: File System Interface,  Prev: I/O on Streams,  Up: Top
+-
+-Low-Level Input/Output
+-**********************
+-
+-   This chapter describes functions for performing low-level
+-input/output operations on file descriptors.  These functions include
+-the primitives for the higher-level I/O functions described in *Note
+-I/O on Streams::, as well as functions for performing low-level control
+-operations for which there are no equivalents on streams.
+-
+-   Stream-level I/O is more flexible and usually more convenient;
+-therefore, programmers generally use the descriptor-level functions only
+-when necessary.  These are some of the usual reasons:
+-
+-   * For reading binary files in large chunks.
+-
+-   * For reading an entire file into core before parsing it.
+-
+-   * To perform operations other than data transfer, which can only be
+-     done with a descriptor.  (You can use `fileno' to get the
+-     descriptor corresponding to a stream.)
+-
+-   * To pass descriptors to a child process.  (The child can create its
+-     own stream to use a descriptor that it inherits, but cannot
+-     inherit a stream directly.)
+-
+-* Menu:
+-
+-* Opening and Closing Files::           How to open and close file
+-                                         descriptors.
+-* Truncating Files::                    Change the size of a file.
+-* I/O Primitives::                      Reading and writing data.
+-* File Position Primitive::             Setting a descriptor's file
+-                                         position.
+-* Descriptors and Streams::             Converting descriptor to stream
+-                                         or vice-versa.
+-* Stream/Descriptor Precautions::       Precautions needed if you use both
+-                                         descriptors and streams.
+-* Scatter-Gather::                      Fast I/O to discontinous buffers.
+-* Memory-mapped I/O::                   Using files like memory.
+-* Waiting for I/O::                     How to check for input or output
+-					 on multiple file descriptors.
+-* Synchronizing I/O::                   Making sure all I/O actions completed.
+-* Asynchronous I/O::                    Perform I/O in parallel.
+-* Control Operations::                  Various other operations on file
+-					 descriptors.
+-* Duplicating Descriptors::             Fcntl commands for duplicating
+-                                         file descriptors.
+-* Descriptor Flags::                    Fcntl commands for manipulating
+-                                         flags associated with file
+-                                         descriptors.
+-* File Status Flags::                   Fcntl commands for manipulating
+-                                         flags associated with open files.
+-* File Locks::                          Fcntl commands for implementing
+-                                         file locking.
+-* Interrupt Input::                     Getting an asynchronous signal when
+-                                         input arrives.
+-* IOCTLs::                              Generic I/O Control operations.
+-
+-
+-File: libc.info,  Node: Opening and Closing Files,  Next: Truncating Files,  Up: Low-Level I/O
+-
+-Opening and Closing Files
+-=========================
+-
+-   This section describes the primitives for opening and closing files
+-using file descriptors.  The `open' and `creat' functions are declared
+-in the header file `fcntl.h', while `close' is declared in `unistd.h'.
+-
+- - Function: int open (const char *FILENAME, int FLAGS[, mode_t MODE])
+-     The `open' function creates and returns a new file descriptor for
+-     the file named by FILENAME.  Initially, the file position
+-     indicator for the file is at the beginning of the file.  The
+-     argument MODE is used only when a file is created, but it doesn't
+-     hurt to supply the argument in any case.
+-
+-     The FLAGS argument controls how the file is to be opened.  This is
+-     a bit mask; you create the value by the bitwise OR of the
+-     appropriate parameters (using the `|' operator in C).  *Note File
+-     Status Flags::, for the parameters available.
+-
+-     The normal return value from `open' is a non-negative integer file
+-     descriptor.  In the case of an error, a value of -1 is returned
+-     instead.  In addition to the usual file name errors (*note File
+-     Name Errors::.), the following `errno' error conditions are defined
+-     for this function:
+-
+-    `EACCES'
+-          The file exists but is not readable/writable as requested by
+-          the FLAGS argument, the file does not exist and the directory
+-          is unwritable so it cannot be created.
+-
+-    `EEXIST'
+-          Both `O_CREAT' and `O_EXCL' are set, and the named file
+-          already exists.
+-
+-    `EINTR'
+-          The `open' operation was interrupted by a signal.  *Note
+-          Interrupted Primitives::.
+-
+-    `EISDIR'
+-          The FLAGS argument specified write access, and the file is a
+-          directory.
+-
+-    `EMFILE'
+-          The process has too many files open.  The maximum number of
+-          file descriptors is controlled by the `RLIMIT_NOFILE'
+-          resource limit; *note Limits on Resources::..
+-
+-    `ENFILE'
+-          The entire system, or perhaps the file system which contains
+-          the directory, cannot support any additional open files at
+-          the moment.  (This problem cannot happen on the GNU system.)
+-
+-    `ENOENT'
+-          The named file does not exist, and `O_CREAT' is not specified.
+-
+-    `ENOSPC'
+-          The directory or file system that would contain the new file
+-          cannot be extended, because there is no disk space left.
+-
+-    `ENXIO'
+-          `O_NONBLOCK' and `O_WRONLY' are both set in the FLAGS
+-          argument, the file named by FILENAME is a FIFO (*note Pipes
+-          and FIFOs::.), and no process has the file open for reading.
+-
+-    `EROFS'
+-          The file resides on a read-only file system and any of
+-          `O_WRONLY', `O_RDWR', and `O_TRUNC' are set in the FLAGS
+-          argument, or `O_CREAT' is set and the file does not already
+-          exist.
+-
+-     If on a 32 bits machine the sources are translated with
+-     `_FILE_OFFSET_BITS == 64' the function `open' returns a file
+-     descriptor opened in the large file mode which enables the file
+-     handling functions to use files up to 2^63 bytes in size and
+-     offset from -2^63 to 2^63.  This happens transparently for the user
+-     since all of the lowlevel file handling functions are equally
+-     replaced.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `open' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `open' should be protected using cancelation handlers.
+-
+-     The `open' function is the underlying primitive for the `fopen'
+-     and `freopen' functions, that create streams.
+-
+- - Function: int open64 (const char *FILENAME, int FLAGS[, mode_t MODE])
+-     This function is similar to `open'.  It returns a file descriptor
+-     which can be used to access the file named by FILENAME.  The only
+-     the difference is that on 32 bits systems the file is opened in the
+-     large file mode.  I.e., file length and file offsets can exceed 31
+-     bits.
+-
+-     When the sources are translated with `_FILE_OFFSET_BITS == 64' this
+-     function is actually available under the name `open'.  I.e., the
+-     new, extended API using 64 bit file sizes and offsets transparently
+-     replaces the old API.
+-
+- - Obsolete function: int creat (const char *FILENAME, mode_t MODE)
+-     This function is obsolete.  The call:
+-
+-          creat (FILENAME, MODE)
+-
+-     is equivalent to:
+-
+-          open (FILENAME, O_WRONLY | O_CREAT | O_TRUNC, MODE)
+-
+-     If on a 32 bits machine the sources are translated with
+-     `_FILE_OFFSET_BITS == 64' the function `creat' returns a file
+-     descriptor opened in the large file mode which enables the file
+-     handling functions to use files up to 2^63 in size and offset from
+-     -2^63 to 2^63.  This happens transparently for the user since all
+-     of the lowlevel file handling functions are equally replaced.
+-
+- - Obsolete function: int creat64 (const char *FILENAME, mode_t MODE)
+-     This function is similar to `creat'.  It returns a file descriptor
+-     which can be used to access the file named by FILENAME.  The only
+-     the difference is that on 32 bits systems the file is opened in the
+-     large file mode.  I.e., file length and file offsets can exceed 31
+-     bits.
+-
+-     To use this file descriptor one must not use the normal operations
+-     but instead the counterparts named `*64', e.g., `read64'.
+-
+-     When the sources are translated with `_FILE_OFFSET_BITS == 64' this
+-     function is actually available under the name `open'.  I.e., the
+-     new, extended API using 64 bit file sizes and offsets transparently
+-     replaces the old API.
+-
+- - Function: int close (int FILEDES)
+-     The function `close' closes the file descriptor FILEDES.  Closing
+-     a file has the following consequences:
+-
+-        * The file descriptor is deallocated.
+-
+-        * Any record locks owned by the process on the file are
+-          unlocked.
+-
+-        * When all file descriptors associated with a pipe or FIFO have
+-          been closed, any unread data is discarded.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `close' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `close' should be protected using cancelation handlers.
+-
+-     The normal return value from `close' is 0; a value of -1 is
+-     returned in case of failure.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINTR'
+-          The `close' call was interrupted by a signal.  *Note
+-          Interrupted Primitives::.  Here is an example of how to
+-          handle `EINTR' properly:
+-
+-               TEMP_FAILURE_RETRY (close (desc));
+-
+-    `ENOSPC'
+-    `EIO'
+-    `EDQUOT'
+-          When the file is accessed by NFS, these errors from `write'
+-          can sometimes not be detected until `close'.  *Note I/O
+-          Primitives::, for details on their meaning.
+-
+-     Please note that there is *no* separate `close64' function.  This
+-     is not necessary since this function does not determine nor depend
+-     on the mode of the file.  The kernel which performs the `close'
+-     operation knows for which mode the descriptor is used and can
+-     handle this situation.
+-
+-   To close a stream, call `fclose' (*note Closing Streams::.) instead
+-of trying to close its underlying file descriptor with `close'.  This
+-flushes any buffered output and updates the stream object to indicate
+-that it is closed.
+-
+-
+-File: libc.info,  Node: Truncating Files,  Next: I/O Primitives,  Prev: Opening and Closing Files,  Up: Low-Level I/O
+-
+-Change the size of a file
+-=========================
+-
+-   In some situations it is useful to explicitly determine the size of a
+-file.  Since the 4.2BSD days there is a function to truncate a file to
+-at most a given number of bytes and POSIX defines one additional
+-function.  The prototypes for these functions are in `unistd.h'.
+-
+- - Function: int truncate (const char *NAME, off_t LENGTH)
+-     The `truncation' function truncates the file named by NAME to at
+-     most LENGTH bytes.  I.e., if the file was larger before the extra
+-     bytes are stripped of.  If the file was small or equal to LENGTH
+-     in size before nothing is done.  The file must be writable by the
+-     user to perform this operation.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
+-     `truncate' function is in fact `truncate64' and the type `off_t'
+-     has 64 bits which makes it possible to handle files up to 2^63
+-     bytes in length.
+-
+-     The return value is zero is everything went ok.  Otherwise the
+-     return value is -1 and the global variable ERRNO is set to:
+-    `EACCES'
+-          The file is not accessible to the user.
+-
+-    `EINVAL'
+-          The LENGTH value is illegal.
+-
+-    `EISDIR'
+-          The object named by NAME is a directory.
+-
+-    `ENOENT'
+-          The file named by NAME does not exist.
+-
+-    `ENOTDIR'
+-          One part of the NAME is not a directory.
+-
+-     This function was introduced in 4.2BSD but also was available in
+-     later System V systems.  It is not added to POSIX since the
+-     authors felt it is only of marginally additional utility.  See
+-     below.
+-
+- - Function: int truncate64 (const char *NAME, off64_t LENGTH)
+-     This function is similar to the `truncate' function.  The
+-     difference is that the LENGTH argument is 64 bits wide even on 32
+-     bits machines which allows to handle file with a size up to 2^63
+-     bytes.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
+-     a 32 bits machine this function is actually available under the
+-     name `truncate' and so transparently replaces the 32 bits
+-     interface.
+-
+- - Function: int ftruncate (int FD, off_t LENGTH)
+-     The `ftruncate' function is similar to the `truncate' function.
+-     The main difference is that it takes a descriptor for an opened
+-     file instead of a file name to identify the object.  The file must
+-     be opened for writing to successfully carry out the operation.
+-
+-     The POSIX standard leaves it implementation defined what happens
+-     if the specified new LENGTH of the file is bigger than the
+-     original size.  The `ftruncate' function might simply leave the
+-     file alone and do nothing or it can increase the size to the
+-     desired size.  In this later case the extended area should be
+-     zero-filled.  So using `ftruncate' is no reliable way to increase
+-     the file size but if it is possible it is probably the fastest
+-     way.  The function also operates on POSIX shared memory segments
+-     if these are implemented by the system.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
+-     `ftruncate' function is in fact `ftruncate64' and the type `off_t'
+-     has 64 bits which makes it possible to handle files up to 2^63
+-     bytes in length.
+-
+-     On success the function returns zero.  Otherwise it returns -1 and
+-     set ERRNO to one of these values:
+-    `EBADF'
+-          FD is no valid file descriptor or is not opened for writing.
+-
+-    `EINVAL'
+-          The object referred to by FD does not permit this operation.
+-
+-    `EROFS'
+-          The file is on a read-only file system.
+-
+- - Function: int ftruncate64 (int ID, off64_t LENGTH)
+-     This function is similar to the `ftruncate' function.  The
+-     difference is that the LENGTH argument is 64 bits wide even on 32
+-     bits machines which allows to handle file with a size up to 2^63
+-     bytes.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
+-     a 32 bits machine this function is actually available under the
+-     name `ftruncate' and so transparently replaces the 32 bits
+-     interface.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-18 glibc-2.1.3/manual/libc.info-18
+--- ../glibc-2.1.3/manual/libc.info-18	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-18	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1157 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: I/O Primitives,  Next: File Position Primitive,  Prev: Truncating Files,  Up: Low-Level I/O
+-
+-Input and Output Primitives
+-===========================
+-
+-   This section describes the functions for performing primitive input
+-and output operations on file descriptors: `read', `write', and
+-`lseek'.  These functions are declared in the header file `unistd.h'.
+-
+- - Data Type: ssize_t
+-     This data type is used to represent the sizes of blocks that can be
+-     read or written in a single operation.  It is similar to `size_t',
+-     but must be a signed type.
+-
+- - Function: ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)
+-     The `read' function reads up to SIZE bytes from the file with
+-     descriptor FILEDES, storing the results in the BUFFER.  (This is
+-     not necessarily a character string and there is no terminating
+-     null character added.)
+-
+-     The return value is the number of bytes actually read.  This might
+-     be less than SIZE; for example, if there aren't that many bytes
+-     left in the file or if there aren't that many bytes immediately
+-     available.  The exact behavior depends on what kind of file it is.
+-     Note that reading less than SIZE bytes is not an error.
+-
+-     A value of zero indicates end-of-file (except if the value of the
+-     SIZE argument is also zero).  This is not considered an error.  If
+-     you keep calling `read' while at end-of-file, it will keep
+-     returning zero and doing nothing else.
+-
+-     If `read' returns at least one character, there is no way you can
+-     tell whether end-of-file was reached.  But if you did reach the
+-     end, the next read will return zero.
+-
+-     In case of an error, `read' returns -1.  The following `errno'
+-     error conditions are defined for this function:
+-
+-    `EAGAIN'
+-          Normally, when no input is immediately available, `read'
+-          waits for some input.  But if the `O_NONBLOCK' flag is set
+-          for the file (*note File Status Flags::.), `read' returns
+-          immediately without reading any data, and reports this error.
+-
+-          *Compatibility Note:* Most versions of BSD Unix use a
+-          different error code for this: `EWOULDBLOCK'.  In the GNU
+-          library, `EWOULDBLOCK' is an alias for `EAGAIN', so it
+-          doesn't matter which name you use.
+-
+-          On some systems, reading a large amount of data from a
+-          character special file can also fail with `EAGAIN' if the
+-          kernel cannot find enough physical memory to lock down the
+-          user's pages.  This is limited to devices that transfer with
+-          direct memory access into the user's memory, which means it
+-          does not include terminals, since they always use separate
+-          buffers inside the kernel.  This problem never happens in the
+-          GNU system.
+-
+-          Any condition that could result in `EAGAIN' can instead
+-          result in a successful `read' which returns fewer bytes than
+-          requested.  Calling `read' again immediately would result in
+-          `EAGAIN'.
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor, or is
+-          not open for reading.
+-
+-    `EINTR'
+-          `read' was interrupted by a signal while it was waiting for
+-          input.  *Note Interrupted Primitives::.  A signal will not
+-          necessary cause `read' to return `EINTR'; it may instead
+-          result in a successful `read' which returns fewer bytes than
+-          requested.
+-
+-    `EIO'
+-          For many devices, and for disk files, this error code
+-          indicates a hardware error.
+-
+-          `EIO' also occurs when a background process tries to read
+-          from the controlling terminal, and the normal action of
+-          stopping the process by sending it a `SIGTTIN' signal isn't
+-          working.  This might happen if signal is being blocked or
+-          ignored, or because the process group is orphaned.  *Note Job
+-          Control::, for more information about job control, and *Note
+-          Signal Handling::, for information about signals.
+-
+-     Please note that there is no function named `read64'.  This is not
+-     necessary since this function does not directly modify or handle
+-     the possibly wide file offset.  Since the kernel handles this state
+-     internally the `read' function can be used for all cases.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `read' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `read' should be protected using cancelation handlers.
+-
+-     The `read' function is the underlying primitive for all of the
+-     functions that read from streams, such as `fgetc'.
+-
+- - Function: ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE,
+-          off_t OFFSET)
+-     The `pread' function is similar to the `read' function.  The first
+-     three arguments are identical and also the return values and error
+-     codes correspond.
+-
+-     The difference is the fourth argument and its handling.  The data
+-     block is not read from the current position of the file descriptor
+-     `filedes'.  Instead the data is read from the file starting at
+-     position OFFSET.  The position of the file descriptor itself is
+-     not effected by the operation.  The value is the same as before
+-     the call.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
+-     `pread' function is in fact `pread64' and the type `off_t' has 64
+-     bits which makes it possible to handle files up to 2^63 bytes in
+-     length.
+-
+-     The return value of `pread' describes the number of bytes read.
+-     In the error case it returns -1 like `read' does and the error
+-     codes are also the same.  Only there are a few more error codes:
+-    `EINVAL'
+-          The value given for OFFSET is negative and therefore illegal.
+-
+-    `ESPIPE'
+-          The file descriptor FILEDES is associate with a pipe or a
+-          FIFO and this device does not allow positioning of the file
+-          pointer.
+-
+-     The function is an extension defined in the Unix Single
+-     Specification version 2.
+-
+- - Function: ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE,
+-          off64_t OFFSET)
+-     This function is similar to the `pread' function.  The difference
+-     is that the OFFSET parameter is of type `off64_t' instead of
+-     `off_t' which makes it possible on 32 bits machines to address
+-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
+-     descriptor `filedes' must be opened using `open64' since otherwise
+-     the large offsets possible with `off64_t' will lead to errors with
+-     a descriptor in small file mode.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
+-     a 32 bits machine this function is actually available under the
+-     name `pread' and so transparently replaces the 32 bits interface.
+-
+- - Function: ssize_t write (int FILEDES, const void *BUFFER, size_t
+-          SIZE)
+-     The `write' function writes up to SIZE bytes from BUFFER to the
+-     file with descriptor FILEDES.  The data in BUFFER is not
+-     necessarily a character string and a null character is output like
+-     any other character.
+-
+-     The return value is the number of bytes actually written.  This
+-     may be SIZE, but can always be smaller.  Your program should
+-     always call `write' in a loop, iterating until all the data is
+-     written.
+-
+-     Once `write' returns, the data is enqueued to be written and can be
+-     read back right away, but it is not necessarily written out to
+-     permanent storage immediately.  You can use `fsync' when you need
+-     to be sure your data has been permanently stored before
+-     continuing.  (It is more efficient for the system to batch up
+-     consecutive writes and do them all at once when convenient.
+-     Normally they will always be written to disk within a minute or
+-     less.)  Modern systems provide another function `fdatasync' which
+-     guarantees integrity only for the file data and is therefore
+-     faster.  You can use the `O_FSYNC' open mode to make `write' always
+-     store the data to disk before returning; *note Operating Modes::..
+-
+-     In the case of an error, `write' returns -1.  The following
+-     `errno' error conditions are defined for this function:
+-
+-    `EAGAIN'
+-          Normally, `write' blocks until the write operation is
+-          complete.  But if the `O_NONBLOCK' flag is set for the file
+-          (*note Control Operations::.), it returns immediately without
+-          writing any data, and reports this error.  An example of a
+-          situation that might cause the process to block on output is
+-          writing to a terminal device that supports flow control,
+-          where output has been suspended by receipt of a STOP
+-          character.
+-
+-          *Compatibility Note:* Most versions of BSD Unix use a
+-          different error code for this: `EWOULDBLOCK'.  In the GNU
+-          library, `EWOULDBLOCK' is an alias for `EAGAIN', so it
+-          doesn't matter which name you use.
+-
+-          On some systems, writing a large amount of data from a
+-          character special file can also fail with `EAGAIN' if the
+-          kernel cannot find enough physical memory to lock down the
+-          user's pages.  This is limited to devices that transfer with
+-          direct memory access into the user's memory, which means it
+-          does not include terminals, since they always use separate
+-          buffers inside the kernel.  This problem does not arise in the
+-          GNU system.
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor, or is
+-          not open for writing.
+-
+-    `EFBIG'
+-          The size of the file would become larger than the
+-          implementation can support.
+-
+-    `EINTR'
+-          The `write' operation was interrupted by a signal while it was
+-          blocked waiting for completion.  A signal will not necessary
+-          cause `write' to return `EINTR'; it may instead result in a
+-          successful `write' which writes fewer bytes than requested.
+-          *Note Interrupted Primitives::.
+-
+-    `EIO'
+-          For many devices, and for disk files, this error code
+-          indicates a hardware error.
+-
+-    `ENOSPC'
+-          The device containing the file is full.
+-
+-    `EPIPE'
+-          This error is returned when you try to write to a pipe or
+-          FIFO that isn't open for reading by any process.  When this
+-          happens, a `SIGPIPE' signal is also sent to the process; see
+-          *Note Signal Handling::.
+-
+-     Unless you have arranged to prevent `EINTR' failures, you should
+-     check `errno' after each failing call to `write', and if the error
+-     was `EINTR', you should simply repeat the call.  *Note Interrupted
+-     Primitives::.  The easy way to do this is with the macro
+-     `TEMP_FAILURE_RETRY', as follows:
+-
+-          nbytes = TEMP_FAILURE_RETRY (write (desc, buffer, count));
+-
+-     Please note that there is no function named `write64'.  This is not
+-     necessary since this function does not directly modify or handle
+-     the possibly wide file offset.  Since the kernel handles this state
+-     internally the `write' function can be used for all cases.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `write' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `write' should be protected using cancelation handlers.
+-
+-     The `write' function is the underlying primitive for all of the
+-     functions that write to streams, such as `fputc'.
+-
+- - Function: ssize_t pwrite (int FILEDES, const void *BUFFER, size_t
+-          SIZE, off_t OFFSET)
+-     The `pwrite' function is similar to the `write' function.  The
+-     first three arguments are identical and also the return values and
+-     error codes correspond.
+-
+-     The difference is the fourth argument and its handling.  The data
+-     block is not written to the current position of the file descriptor
+-     `filedes'.  Instead the data is written to the file starting at
+-     position OFFSET.  The position of the file descriptor itself is
+-     not effected by the operation.  The value is the same as before
+-     the call.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
+-     `pwrite' function is in fact `pwrite64' and the type `off_t' has
+-     64 bits which makes it possible to handle files up to 2^63 bytes
+-     in length.
+-
+-     The return value of `pwrite' describes the number of written bytes.
+-     In the error case it returns -1 like `write' does and the error
+-     codes are also the same.  Only there are a few more error codes:
+-    `EINVAL'
+-          The value given for OFFSET is negative and therefore illegal.
+-
+-    `ESPIPE'
+-          The file descriptor FILEDES is associate with a pipe or a
+-          FIFO and this device does not allow positioning of the file
+-          pointer.
+-
+-     The function is an extension defined in the Unix Single
+-     Specification version 2.
+-
+- - Function: ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t
+-          SIZE, off64_t OFFSET)
+-     This function is similar to the `pwrite' function.  The difference
+-     is that the OFFSET parameter is of type `off64_t' instead of
+-     `off_t' which makes it possible on 32 bits machines to address
+-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
+-     descriptor `filedes' must be opened using `open64' since otherwise
+-     the large offsets possible with `off64_t' will lead to errors with
+-     a descriptor in small file mode.
+-
+-     When the source file is compiled using `_FILE_OFFSET_BITS == 64'
+-     on a 32 bits machine this function is actually available under the
+-     name `pwrite' and so transparently replaces the 32 bits interface.
+-
+-
+-File: libc.info,  Node: File Position Primitive,  Next: Descriptors and Streams,  Prev: I/O Primitives,  Up: Low-Level I/O
+-
+-Setting the File Position of a Descriptor
+-=========================================
+-
+-   Just as you can set the file position of a stream with `fseek', you
+-can set the file position of a descriptor with `lseek'.  This specifies
+-the position in the file for the next `read' or `write' operation.
+-*Note File Positioning::, for more information on the file position and
+-what it means.
+-
+-   To read the current file position value from a descriptor, use
+-`lseek (DESC, 0, SEEK_CUR)'.
+-
+- - Function: off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)
+-     The `lseek' function is used to change the file position of the
+-     file with descriptor FILEDES.
+-
+-     The WHENCE argument specifies how the OFFSET should be interpreted
+-     in the same way as for the `fseek' function, and must be one of
+-     the symbolic constants `SEEK_SET', `SEEK_CUR', or `SEEK_END'.
+-
+-    `SEEK_SET'
+-          Specifies that WHENCE is a count of characters from the
+-          beginning of the file.
+-
+-    `SEEK_CUR'
+-          Specifies that WHENCE is a count of characters from the
+-          current file position.  This count may be positive or
+-          negative.
+-
+-    `SEEK_END'
+-          Specifies that WHENCE is a count of characters from the end of
+-          the file.  A negative count specifies a position within the
+-          current extent of the file; a positive count specifies a
+-          position past the current end.  If you set the position past
+-          the current end, and actually write data, you will extend the
+-          file with zeros up to that position.
+-
+-     The return value from `lseek' is normally the resulting file
+-     position, measured in bytes from the beginning of the file.  You
+-     can use this feature together with `SEEK_CUR' to read the current
+-     file position.
+-
+-     If you want to append to the file, setting the file position to the
+-     current end of file with `SEEK_END' is not sufficient.  Another
+-     process may write more data after you seek but before you write,
+-     extending the file so the position you write onto clobbers their
+-     data.  Instead, use the `O_APPEND' operating mode; *note Operating
+-     Modes::..
+-
+-     You can set the file position past the current end of the file.
+-     This does not by itself make the file longer; `lseek' never
+-     changes the file.  But subsequent output at that position will
+-     extend the file.  Characters between the previous end of file and
+-     the new position are filled with zeros.  Extending the file in
+-     this way can create a "hole": the blocks of zeros are not actually
+-     allocated on disk, so the file takes up less space than it appears
+-     so; it is then called a "sparse file".
+-
+-     If the file position cannot be changed, or the operation is in
+-     some way invalid, `lseek' returns a value of -1.  The following
+-     `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The WHENCE argument value is not valid, or the resulting file
+-          offset is not valid.  A file offset is invalid.
+-
+-    `ESPIPE'
+-          The FILEDES corresponds to an object that cannot be
+-          positioned, such as a pipe, FIFO or terminal device.
+-          (POSIX.1 specifies this error only for pipes and FIFOs, but
+-          in the GNU system, you always get `ESPIPE' if the object is
+-          not seekable.)
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
+-     `lseek' function is in fact `lseek64' and the type `off_t' has 64
+-     bits which makes it possible to handle files up to 2^63 bytes in
+-     length.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `lseek' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `lseek' should be protected using cancelation handlers.
+-
+-     The `lseek' function is the underlying primitive for the `fseek',
+-     `fseeko', `ftell', `ftello' and `rewind' functions, which operate
+-     on streams instead of file descriptors.
+-
+- - Function: off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)
+-     This function is similar to the `lseek' function.  The difference
+-     is that the OFFSET parameter is of type `off64_t' instead of
+-     `off_t' which makes it possible on 32 bits machines to address
+-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
+-     descriptor `filedes' must be opened using `open64' since otherwise
+-     the large offsets possible with `off64_t' will lead to errors with
+-     a descriptor in small file mode.
+-
+-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
+-     a 32 bits machine this function is actually available under the
+-     name `lseek' and so transparently replaces the 32 bits interface.
+-
+-   You can have multiple descriptors for the same file if you open the
+-file more than once, or if you duplicate a descriptor with `dup'.
+-Descriptors that come from separate calls to `open' have independent
+-file positions; using `lseek' on one descriptor has no effect on the
+-other.  For example,
+-
+-     {
+-       int d1, d2;
+-       char buf[4];
+-       d1 = open ("foo", O_RDONLY);
+-       d2 = open ("foo", O_RDONLY);
+-       lseek (d1, 1024, SEEK_SET);
+-       read (d2, buf, 4);
+-     }
+-
+-will read the first four characters of the file `foo'.  (The
+-error-checking code necessary for a real program has been omitted here
+-for brevity.)
+-
+-   By contrast, descriptors made by duplication share a common file
+-position with the original descriptor that was duplicated.  Anything
+-which alters the file position of one of the duplicates, including
+-reading or writing data, affects all of them alike.  Thus, for example,
+-
+-     {
+-       int d1, d2, d3;
+-       char buf1[4], buf2[4];
+-       d1 = open ("foo", O_RDONLY);
+-       d2 = dup (d1);
+-       d3 = dup (d2);
+-       lseek (d3, 1024, SEEK_SET);
+-       read (d1, buf1, 4);
+-       read (d2, buf2, 4);
+-     }
+-
+-will read four characters starting with the 1024'th character of `foo',
+-and then four more characters starting with the 1028'th character.
+-
+- - Data Type: off_t
+-     This is an arithmetic data type used to represent file sizes.  In
+-     the GNU system, this is equivalent to `fpos_t' or `long int'.
+-
+-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
+-     is transparently replaced by `off64_t'.
+-
+- - Data Type: off64_t
+-     This type is used similar to `off_t'.  The difference is that even
+-     on 32 bits machines, where the `off_t' type would have 32 bits,
+-     `off64_t' has 64 bits and so is able to address files up to 2^63
+-     bytes in length.
+-
+-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
+-     available under the name `off_t'.
+-
+-   These aliases for the `SEEK_...' constants exist for the sake of
+-compatibility with older BSD systems.  They are defined in two
+-different header files: `fcntl.h' and `sys/file.h'.
+-
+-`L_SET'
+-     An alias for `SEEK_SET'.
+-
+-`L_INCR'
+-     An alias for `SEEK_CUR'.
+-
+-`L_XTND'
+-     An alias for `SEEK_END'.
+-
+-
+-File: libc.info,  Node: Descriptors and Streams,  Next: Stream/Descriptor Precautions,  Prev: File Position Primitive,  Up: Low-Level I/O
+-
+-Descriptors and Streams
+-=======================
+-
+-   Given an open file descriptor, you can create a stream for it with
+-the `fdopen' function.  You can get the underlying file descriptor for
+-an existing stream with the `fileno' function.  These functions are
+-declared in the header file `stdio.h'.
+-
+- - Function: FILE * fdopen (int FILEDES, const char *OPENTYPE)
+-     The `fdopen' function returns a new stream for the file descriptor
+-     FILEDES.
+-
+-     The OPENTYPE argument is interpreted in the same way as for the
+-     `fopen' function (*note Opening Streams::.), except that the `b'
+-     option is not permitted; this is because GNU makes no distinction
+-     between text and binary files.  Also, `"w"' and `"w+"' do not
+-     cause truncation of the file; these have affect only when opening
+-     a file, and in this case the file has already been opened.  You
+-     must make sure that the OPENTYPE argument matches the actual mode
+-     of the open file descriptor.
+-
+-     The return value is the new stream.  If the stream cannot be
+-     created (for example, if the modes for the file indicated by the
+-     file descriptor do not permit the access specified by the OPENTYPE
+-     argument), a null pointer is returned instead.
+-
+-     In some other systems, `fdopen' may fail to detect that the modes
+-     for file descriptor do not permit the access specified by
+-     `opentype'.  The GNU C library always checks for this.
+-
+-   For an example showing the use of the `fdopen' function, see *Note
+-Creating a Pipe::.
+-
+- - Function: int fileno (FILE *STREAM)
+-     This function returns the file descriptor associated with the
+-     stream STREAM.  If an error is detected (for example, if the STREAM
+-     is not valid) or if STREAM does not do I/O to a file, `fileno'
+-     returns -1.
+-
+-   There are also symbolic constants defined in `unistd.h' for the file
+-descriptors belonging to the standard streams `stdin', `stdout', and
+-`stderr'; see *Note Standard Streams::.
+-
+-`STDIN_FILENO'
+-     This macro has value `0', which is the file descriptor for
+-     standard input.
+-
+-`STDOUT_FILENO'
+-     This macro has value `1', which is the file descriptor for
+-     standard output.
+-
+-`STDERR_FILENO'
+-     This macro has value `2', which is the file descriptor for
+-     standard error output.
+-
+-
+-File: libc.info,  Node: Stream/Descriptor Precautions,  Next: Scatter-Gather,  Prev: Descriptors and Streams,  Up: Low-Level I/O
+-
+-Dangers of Mixing Streams and Descriptors
+-=========================================
+-
+-   You can have multiple file descriptors and streams (let's call both
+-streams and descriptors "channels" for short) connected to the same
+-file, but you must take care to avoid confusion between channels.  There
+-are two cases to consider: "linked" channels that share a single file
+-position value, and "independent" channels that have their own file
+-positions.
+-
+-   It's best to use just one channel in your program for actual data
+-transfer to any given file, except when all the access is for input.
+-For example, if you open a pipe (something you can only do at the file
+-descriptor level), either do all I/O with the descriptor, or construct a
+-stream from the descriptor with `fdopen' and then do all I/O with the
+-stream.
+-
+-* Menu:
+-
+-* Linked Channels::	   Dealing with channels sharing a file position.
+-* Independent Channels::   Dealing with separately opened, unlinked channels.
+-* Cleaning Streams::	   Cleaning a stream makes it safe to use
+-                            another channel.
+-
+-
+-File: libc.info,  Node: Linked Channels,  Next: Independent Channels,  Up: Stream/Descriptor Precautions
+-
+-Linked Channels
+----------------
+-
+-   Channels that come from a single opening share the same file
+-position; we call them "linked" channels.  Linked channels result when
+-you make a stream from a descriptor using `fdopen', when you get a
+-descriptor from a stream with `fileno', when you copy a descriptor with
+-`dup' or `dup2', and when descriptors are inherited during `fork'.  For
+-files that don't support random access, such as terminals and pipes,
+-*all* channels are effectively linked.  On random-access files, all
+-append-type output streams are effectively linked to each other.
+-
+-   If you have been using a stream for I/O, and you want to do I/O using
+-another channel (either a stream or a descriptor) that is linked to it,
+-you must first "clean up" the stream that you have been using.  *Note
+-Cleaning Streams::.
+-
+-   Terminating a process, or executing a new program in the process,
+-destroys all the streams in the process.  If descriptors linked to these
+-streams persist in other processes, their file positions become
+-undefined as a result.  To prevent this, you must clean up the streams
+-before destroying them.
+-
+-
+-File: libc.info,  Node: Independent Channels,  Next: Cleaning Streams,  Prev: Linked Channels,  Up: Stream/Descriptor Precautions
+-
+-Independent Channels
+---------------------
+-
+-   When you open channels (streams or descriptors) separately on a
+-seekable file, each channel has its own file position.  These are called
+-"independent channels".
+-
+-   The system handles each channel independently.  Most of the time,
+-this is quite predictable and natural (especially for input): each
+-channel can read or write sequentially at its own place in the file.
+-However, if some of the channels are streams, you must take these
+-precautions:
+-
+-   * You should clean an output stream after use, before doing anything
+-     else that might read or write from the same part of the file.
+-
+-   * You should clean an input stream before reading data that may have
+-     been modified using an independent channel.  Otherwise, you might
+-     read obsolete data that had been in the stream's buffer.
+-
+-   If you do output to one channel at the end of the file, this will
+-certainly leave the other independent channels positioned somewhere
+-before the new end.  You cannot reliably set their file positions to the
+-new end of file before writing, because the file can always be extended
+-by another process between when you set the file position and when you
+-write the data.  Instead, use an append-type descriptor or stream; they
+-always output at the current end of the file.  In order to make the
+-end-of-file position accurate, you must clean the output channel you
+-were using, if it is a stream.
+-
+-   It's impossible for two channels to have separate file pointers for a
+-file that doesn't support random access.  Thus, channels for reading or
+-writing such files are always linked, never independent.  Append-type
+-channels are also always linked.  For these channels, follow the rules
+-for linked channels; see *Note Linked Channels::.
+-
+-
+-File: libc.info,  Node: Cleaning Streams,  Prev: Independent Channels,  Up: Stream/Descriptor Precautions
+-
+-Cleaning Streams
+-----------------
+-
+-   On the GNU system, you can clean up any stream with `fclean':
+-
+- - Function: int fclean (FILE *STREAM)
+-     Clean up the stream STREAM so that its buffer is empty.  If STREAM
+-     is doing output, force it out.  If STREAM is doing input, give the
+-     data in the buffer back to the system, arranging to reread it.
+-
+-   On other systems, you can use `fflush' to clean a stream in most
+-cases.
+-
+-   You can skip the `fclean' or `fflush' if you know the stream is
+-already clean.  A stream is clean whenever its buffer is empty.  For
+-example, an unbuffered stream is always clean.  An input stream that is
+-at end-of-file is clean.  A line-buffered stream is clean when the last
+-character output was a newline.
+-
+-   There is one case in which cleaning a stream is impossible on most
+-systems.  This is when the stream is doing input from a file that is not
+-random-access.  Such streams typically read ahead, and when the file is
+-not random access, there is no way to give back the excess data already
+-read.  When an input stream reads from a random-access file, `fflush'
+-does clean the stream, but leaves the file pointer at an unpredictable
+-place; you must set the file pointer before doing any further I/O.  On
+-the GNU system, using `fclean' avoids both of these problems.
+-
+-   Closing an output-only stream also does `fflush', so this is a valid
+-way of cleaning an output stream.  On the GNU system, closing an input
+-stream does `fclean'.
+-
+-   You need not clean a stream before using its descriptor for control
+-operations such as setting terminal modes; these operations don't affect
+-the file position and are not affected by it.  You can use any
+-descriptor for these operations, and all channels are affected
+-simultaneously.  However, text already "output" to a stream but still
+-buffered by the stream will be subject to the new terminal modes when
+-subsequently flushed.  To make sure "past" output is covered by the
+-terminal settings that were in effect at the time, flush the output
+-streams for that terminal before setting the modes.  *Note Terminal
+-Modes::.
+-
+-
+-File: libc.info,  Node: Scatter-Gather,  Next: Memory-mapped I/O,  Prev: Stream/Descriptor Precautions,  Up: Low-Level I/O
+-
+-Fast Scatter-Gather I/O
+-=======================
+-
+-   Some applications may need to read or write data to multiple buffers,
+-which are seperated in memory.  Although this can be done easily enough
+-with multiple calls to `read' and `write', it is inefficent because
+-there is overhead associated with each kernel call.
+-
+-   Instead, many platforms provide special high-speed primitives to
+-perform these "scatter-gather" operations in a single kernel call.  The
+-GNU C library will provide an emulation on any system that lacks these
+-primitives, so they are not a portability threat.  They are defined in
+-`sys/uio.h'.
+-
+-   These functions are controlled with arrays of `iovec' structures,
+-which describe the location and size of each buffer.
+-
+- - Data Type: struct iovec
+-     The `iovec' structure describes a buffer. It contains two fields:
+-
+-    `void *iov_base'
+-          Contains the address of a buffer.
+-
+-    `size_t iov_len'
+-          Contains the length of the buffer.
+-
+-
+- - Function: ssize_t readv (int FILEDES, const struct iovec *VECTOR,
+-          int COUNT)
+-     The `readv' function reads data from FILEDES and scatters it into
+-     the buffers described in VECTOR, which is taken to be COUNT
+-     structures long.  As each buffer is filled, data is sent to the
+-     next.
+-
+-     Note that `readv' is not guaranteed to fill all the buffers.  It
+-     may stop at any point, for the same reasons `read' would.
+-
+-     The return value is a count of bytes (*not* buffers) read, 0
+-     indicating end-of-file, or -1 indicating an error.  The possible
+-     errors are the same as in `read'.
+-
+-
+- - Function: ssize_t writev (int FILEDES, const struct iovec *VECTOR,
+-          int COUNT)
+-     The `writev' function gathers data from the buffers described in
+-     VECTOR, which is taken to be COUNT structures long, and writes
+-     them to `filedes'.  As each buffer is written, it moves on to the
+-     next.
+-
+-     Like `readv', `writev' may stop midstream under the same
+-     conditions `write' would.
+-
+-     The return value is a count of bytes written, or -1 indicating an
+-     error.  The possible errors are the same as in `write'.
+-
+-
+-   Note that if the buffers are small (under about 1kB), high-level
+-streams may be easier to use than these functions.  However, `readv' and
+-`writev' are more efficient when the individual buffers themselves (as
+-opposed to the total output), are large.  In that case, a high-level
+-stream would not be able to cache the data effectively.
+-
+-
+-File: libc.info,  Node: Memory-mapped I/O,  Next: Waiting for I/O,  Prev: Scatter-Gather,  Up: Low-Level I/O
+-
+-Memory-mapped I/O
+-=================
+-
+-   On modern operating systems, it is possible to "mmap" (pronounced
+-"em-map") a file to a region of memory.  When this is done, the file can
+-be accessed just like an array in the program.
+-
+-   This is more efficent than `read' or `write', as only regions of the
+-file a program actually accesses are loaded.  Accesses to
+-not-yet-loaded parts of the mmapped region are handled in the same way
+-as swapped out pages.
+-
+-   Since mmapped pages can be stored back to their file when physical
+-memory is low, it is possible to mmap files orders of magnitude larger
+-than both the physical memory *and* swap space.  The only limit is
+-address space.  The theoretical limit is 4GB on a 32-bit machine -
+-however, the actual limit will be smaller since some areas will be
+-reserved for other purposes.
+-
+-   Memory mapping only works on entire pages of memory.  Thus, addresses
+-for mapping must be page-aligned, and length values will be rounded up.
+-To determine the size of a page the machine uses one should use
+-
+-     size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
+-
+-   These functions are declared in `sys/mman.h'.
+-
+- - Function: void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int
+-          FLAGS, int FILEDES, off_t OFFSET)
+-     The `mmap' function creates a new mapping, connected to bytes
+-     (OFFSET) to (OFFSET + LENGTH) in the file open on FILEDES.
+-
+-     ADDRESS gives a preferred starting address for the mapping.
+-     `NULL' expresses no preference. Any previous mapping at that
+-     address is automatically removed. The address you give may still be
+-     changed, unless you use the `MAP_FIXED' flag.
+-
+-     PROTECT contains flags that control what kind of access is
+-     permitted.  They include `PROT_READ', `PROT_WRITE', and
+-     `PROT_EXEC', which permit reading, writing, and execution,
+-     respectively.  Inappropriate access will cause a segfault (*note
+-     Program Error Signals::.).
+-
+-     Note that most hardware designs cannot support write permission
+-     without read permission, and many do not distinguish read and
+-     execute permission.  Thus, you may recieve wider permissions than
+-     you ask for, and mappings of write-only files may be denied even
+-     if you do not use `PROT_READ'.
+-
+-     FLAGS contains flags that control the nature of the map.  One of
+-     `MAP_SHARED' or `MAP_PRIVATE' must be specified.
+-
+-     They include:
+-
+-    `MAP_PRIVATE'
+-          This specifies that writes to the region should never be
+-          written back to the attached file.  Instead, a copy is made
+-          for the process, and the region will be swapped normally if
+-          memory runs low.  No other process will see the changes.
+-
+-          Since private mappings effectively revert to ordinary memory
+-          when written to, you must have enough virtual memory for a
+-          copy of the entire mmapped region if you use this mode with
+-          `PROT_WRITE'.
+-
+-    `MAP_SHARED'
+-          This specifies that writes to the region will be written back
+-          to the file.  Changes made will be shared immediately with
+-          other processes mmaping the same file.
+-
+-          Note that actual writing may take place at any time.  You
+-          need to use `msync', described below, if it is important that
+-          other processes using conventional I/O get a consistent view
+-          of the file.
+-
+-    `MAP_FIXED'
+-          This forces the system to use the exact mapping address
+-          specified in ADDRESS and fail if it can't.
+-
+-    `MAP_ANONYMOUS'
+-    `MAP_ANON'
+-          This flag tells the system to create an anonymous mapping,
+-          not connected to a file.  FILEDES and OFF are ignored, and
+-          the region is initialized with zeros.
+-
+-          Anonymous maps are used as the basic primitive to extend the
+-          heap on some systems.  They are also useful to share data
+-          between multiple tasks without creating a file.
+-
+-          On some systems using private anonymous mmaps is more
+-          efficent than using `malloc' for large blocks.  This is not
+-          an issue with the GNU C library, as the included `malloc'
+-          automatically uses `mmap' where appropriate.
+-
+-     `mmap' returns the address of the new mapping, or -1 for an error.
+-
+-     Possible errors include:
+-
+-    `EINVAL'
+-          Either ADDRESS was unusable, or inconsistent FLAGS were given.
+-
+-    `EACCES'
+-          FILEDES was not open for the type of access specified in
+-          PROTECT.
+-
+-    `ENOMEM'
+-          Either there is not enough memory for the operation, or the
+-          process is out of address space.
+-
+-    `ENODEV'
+-          This file is of a type that doesn't support mapping.
+-
+-    `ENOEXEC'
+-          The file is on a filesystem that doesn't support mapping.
+-
+-
+- - Function: int munmap (void *ADDR, size_t LENGTH)
+-     `munmap' removes any memory maps from (ADDR) to (ADDR + LENGTH).
+-     LENGTH should be the length of the mapping.
+-
+-     It is safe to un-map multiple mappings in one command, or include
+-     unmapped space in the range.  It is also possible to unmap only
+-     part of an existing mapping, however only entire pages can be
+-     removed.  If LENGTH is not an even number of pages, it will be
+-     rounded up.
+-
+-     It returns 0 for success and -1 for an error.
+-
+-     One error is possible:
+-
+-    `EINVAL'
+-          The memory range given was outside the user mmap range, or
+-          wasn't page aligned.
+-
+-
+- - Function: int msync (void *ADDRESS, size_t LENGTH, int FLAGS)
+-     When using shared mappings, the kernel can write the file at any
+-     time before the mapping is removed.  To be certain data has
+-     actually been written to the file and will be accessable to
+-     non-memory-mapped I/O, it is neccessary to use this function.
+-
+-     It operates on the region ADDRESS to (ADDRESS + LENGTH).  It may
+-     be used on part of a mapping or multiple mappings, however the
+-     region given should not contain any unmapped space.
+-
+-     FLAGS can contain some options:
+-
+-    `MS_SYNC'
+-          This flag makes sure the data is actually written *to disk*.
+-          Normally `msync' only makes sure that accesses to a file with
+-          conventional I/O reflect the recent changes.
+-
+-    `MS_ASYNC'
+-          This tells `msync' to begin the synchronization, but not to
+-          wait for it to complete.
+-
+-     `msync' returns 0 for success and -1 for error.  Errors include:
+-
+-    `EINVAL'
+-          An invalid region was given, or the FLAGS were invalid.
+-
+-    `EFAULT'
+-          There is no existing mapping in at least part of the given
+-          region.
+-
+-
+- - Function: void * mremap (void *ADDRESS, size_t LENGTH, size_t
+-          NEW_LENGTH, int FLAG)
+-     This function can be used to change the size of an existing memory
+-     area. ADDRESS and LENGTH must cover a region entirely mapped in
+-     the same `mmap' statement. A new mapping with the same
+-     characteristics will be returned, but a with the length NEW_LENGTH
+-     instead.
+-
+-     One option is possible, `MREMAP_MAYMOVE'. If it is given in FLAGS,
+-     the system may remove the existing mapping and create a new one of
+-     the desired length in another location.
+-
+-     The address of the resulting mapping is returned, or -1. Possible
+-     error codes include:
+-
+-     This function is only available on a few systems.  Except for
+-     performing optional optimizations one should not rely on this
+-     function.
+-    `EFAULT'
+-          There is no existing mapping in at least part of the original
+-          region, or the region covers two or more distinct mappings.
+-
+-    `EINVAL'
+-          The address given is misaligned or inappropriate.
+-
+-    `EAGAIN'
+-          The region has pages locked, and if extended it would exceed
+-          the process's resource limit for locked pages.  *Note Limits
+-          on Resources::.
+-
+-    `ENOMEM'
+-          The region is private writable, and insufficent virtual
+-          memory is available to extend it.  Also, this error will
+-          occur if `MREMAP_MAYMOVE' is not given and the extension
+-          would collide with another mapped region.
+-
+-
+-   Not all file descriptors may be mapped.  Sockets, pipes, and most
+-devices only allow sequential access and do not fit into the mapping
+-abstraction.  In addition, some regular files may not be mmapable, and
+-older kernels may not support mapping at all.  Thus, programs using
+-`mmap' should have a fallback method to use should it fail. *Note Mmap:
+-(standards)Mmap.
+-
+-
+-File: libc.info,  Node: Waiting for I/O,  Next: Synchronizing I/O,  Prev: Memory-mapped I/O,  Up: Low-Level I/O
+-
+-Waiting for Input or Output
+-===========================
+-
+-   Sometimes a program needs to accept input on multiple input channels
+-whenever input arrives.  For example, some workstations may have devices
+-such as a digitizing tablet, function button box, or dial box that are
+-connected via normal asynchronous serial interfaces; good user interface
+-style requires responding immediately to input on any device.  Another
+-example is a program that acts as a server to several other processes
+-via pipes or sockets.
+-
+-   You cannot normally use `read' for this purpose, because this blocks
+-the program until input is available on one particular file descriptor;
+-input on other channels won't wake it up.  You could set nonblocking
+-mode and poll each file descriptor in turn, but this is very
+-inefficient.
+-
+-   A better solution is to use the `select' function.  This blocks the
+-program until input or output is ready on a specified set of file
+-descriptors, or until a timer expires, whichever comes first.  This
+-facility is declared in the header file `sys/types.h'.
+-
+-   In the case of a server socket (*note Listening::.), we say that
+-"input" is available when there are pending connections that could be
+-accepted (*note Accepting Connections::.).  `accept' for server sockets
+-blocks and interacts with `select' just as `read' does for normal input.
+-
+-   The file descriptor sets for the `select' function are specified as
+-`fd_set' objects.  Here is the description of the data type and some
+-macros for manipulating these objects.
+-
+- - Data Type: fd_set
+-     The `fd_set' data type represents file descriptor sets for the
+-     `select' function.  It is actually a bit array.
+-
+- - Macro: int FD_SETSIZE
+-     The value of this macro is the maximum number of file descriptors
+-     that a `fd_set' object can hold information about.  On systems
+-     with a fixed maximum number, `FD_SETSIZE' is at least that number.
+-     On some systems, including GNU, there is no absolute limit on the
+-     number of descriptors open, but this macro still has a constant
+-     value which controls the number of bits in an `fd_set'; if you get
+-     a file descriptor with a value as high as `FD_SETSIZE', you cannot
+-     put that descriptor into an `fd_set'.
+-
+- - Macro: void FD_ZERO (fd_set *SET)
+-     This macro initializes the file descriptor set SET to be the empty
+-     set.
+-
+- - Macro: void FD_SET (int FILEDES, fd_set *SET)
+-     This macro adds FILEDES to the file descriptor set SET.
+-
+- - Macro: void FD_CLR (int FILEDES, fd_set *SET)
+-     This macro removes FILEDES from the file descriptor set SET.
+-
+- - Macro: int FD_ISSET (int FILEDES, fd_set *SET)
+-     This macro returns a nonzero value (true) if FILEDES is a member
+-     of the file descriptor set SET, and zero (false) otherwise.
+-
+-   Next, here is the description of the `select' function itself.
+-
+- - Function: int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS,
+-          fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)
+-     The `select' function blocks the calling process until there is
+-     activity on any of the specified sets of file descriptors, or
+-     until the timeout period has expired.
+-
+-     The file descriptors specified by the READ-FDS argument are
+-     checked to see if they are ready for reading; the WRITE-FDS file
+-     descriptors are checked to see if they are ready for writing; and
+-     the EXCEPT-FDS file descriptors are checked for exceptional
+-     conditions.  You can pass a null pointer for any of these
+-     arguments if you are not interested in checking for that kind of
+-     condition.
+-
+-     A file descriptor is considered ready for reading if it is not at
+-     end of file.  A server socket is considered ready for reading if
+-     there is a pending connection which can be accepted with `accept';
+-     *note Accepting Connections::..  A client socket is ready for
+-     writing when its connection is fully established; *note
+-     Connecting::..
+-
+-     "Exceptional conditions" does not mean errors--errors are reported
+-     immediately when an erroneous system call is executed, and do not
+-     constitute a state of the descriptor.  Rather, they include
+-     conditions such as the presence of an urgent message on a socket.
+-     (*Note Sockets::, for information on urgent messages.)
+-
+-     The `select' function checks only the first NFDS file descriptors.
+-     The usual thing is to pass `FD_SETSIZE' as the value of this
+-     argument.
+-
+-     The TIMEOUT specifies the maximum time to wait.  If you pass a
+-     null pointer for this argument, it means to block indefinitely
+-     until one of the file descriptors is ready.  Otherwise, you should
+-     provide the time in `struct timeval' format; see *Note
+-     High-Resolution Calendar::.  Specify zero as the time (a `struct
+-     timeval' containing all zeros) if you want to find out which
+-     descriptors are ready without waiting if none are ready.
+-
+-     The normal return value from `select' is the total number of ready
+-     file descriptors in all of the sets.  Each of the argument sets is
+-     overwritten with information about the descriptors that are ready
+-     for the corresponding operation.  Thus, to see if a particular
+-     descriptor DESC has input, use `FD_ISSET (DESC, READ-FDS)' after
+-     `select' returns.
+-
+-     If `select' returns because the timeout period expires, it returns
+-     a value of zero.
+-
+-     Any signal will cause `select' to return immediately.  So if your
+-     program uses signals, you can't rely on `select' to keep waiting
+-     for the full time specified.  If you want to be sure of waiting
+-     for a particular amount of time, you must check for `EINTR' and
+-     repeat the `select' with a newly calculated timeout based on the
+-     current time.  See the example below.  See also *Note Interrupted
+-     Primitives::.
+-
+-     If an error occurs, `select' returns `-1' and does not modify the
+-     argument file descriptor sets.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EBADF'
+-          One of the file descriptor sets specified an invalid file
+-          descriptor.
+-
+-    `EINTR'
+-          The operation was interrupted by a signal.  *Note Interrupted
+-          Primitives::.
+-
+-    `EINVAL'
+-          The TIMEOUT argument is invalid; one of the components is
+-          negative or too large.
+-
+-   *Portability Note:*  The `select' function is a BSD Unix feature.
+-
+-   Here is an example showing how you can use `select' to establish a
+-timeout period for reading from a file descriptor.  The `input_timeout'
+-function blocks the calling process until input is available on the
+-file descriptor, or until the timeout period expires.
+-
+-     #include <stdio.h>
+-     #include <unistd.h>
+-     #include <sys/types.h>
+-     #include <sys/time.h>
+-
+-     int
+-     input_timeout (int filedes, unsigned int seconds)
+-     {
+-       fd_set set;
+-       struct timeval timeout;
+-     
+-       /* Initialize the file descriptor set. */
+-       FD_ZERO (&set);
+-       FD_SET (filedes, &set);
+-     
+-       /* Initialize the timeout data structure. */
+-       timeout.tv_sec = seconds;
+-       timeout.tv_usec = 0;
+-     /* `select' returns 0 if timeout, 1 if input available, -1 if error. */
+-       return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
+-                                          &set, NULL, NULL,
+-                                          &timeout));
+-     }
+-
+-     int
+-     main (void)
+-     {
+-       fprintf (stderr, "select returned %d.\n",
+-                input_timeout (STDIN_FILENO, 5));
+-       return 0;
+-     }
+-
+-   There is another example showing the use of `select' to multiplex
+-input from multiple sockets in *Note Server Example::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-19 glibc-2.1.3/manual/libc.info-19
+--- ../glibc-2.1.3/manual/libc.info-19	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-19	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1158 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Synchronizing I/O,  Next: Asynchronous I/O,  Prev: Waiting for I/O,  Up: Low-Level I/O
+-
+-Synchronizing I/O operations
+-============================
+-
+-   In most modern operation systems the normal I/O operations are not
+-executed synchronously.  I.e., even if a `write' system call returns
+-this does not mean the data is actually written to the media, e.g., the
+-disk.
+-
+-   In situations where synchronization points are necessary the user can
+-use special functions which ensure that all operations finished before
+-they return.
+-
+- - Function: int sync (void)
+-     A call to this function will not return as long as there is data
+-     which that is not written to the device.  All dirty buffers in the
+-     kernel will be written and so an overall consistent system can be
+-     achieved (if no other process in parallel writes data).
+-
+-     A prototype for `sync' can be found in `unistd.h'.
+-
+-     The return value is zero to indicate no error.
+-
+-   More often it is wanted that not all data in the system is committed.
+-Programs want to ensure that data written to a given file are all
+-committed and in this situation `sync' is overkill.
+-
+- - Function: int fsync (int FILDES)
+-     The `fsync' can be used to make sure all data associated with the
+-     open file FILDES is written to the device associated with the
+-     descriptor.  The function call does not return unless all actions
+-     have finished.
+-
+-     A prototype for `fsync' can be found in `unistd.h'.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `fsync' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `fsync' should be protected using cancelation handlers.
+-
+-     The return value of the function is zero if no error occured.
+-     Otherwise it is -1 and the global variable ERRNO is set to the
+-     following values:
+-    `EBADF'
+-          The descriptor FILDES is not valid.
+-
+-    `EINVAL'
+-          No synchronization is possible since the system does not
+-          implement this.
+-
+-   Sometimes it is not even necessary to write all data associated with
+-a file descriptor.  E.g., in database files which do not change in size
+-it is enough to write all the file content data to the device.
+-Meta-information like the modification time etc. are not that important
+-and leaving such information uncommitted does not prevent a successful
+-recovering of the file in case of a problem.
+-
+- - Function: int fdatasync (int FILDES)
+-     When a call to the `fdatasync' function returns it is made sure
+-     that all of the file data is written to the device.  For all
+-     pending I/O operations the parts guaranteeing data integrity
+-     finished.
+-
+-     Not all systems implement the `fdatasync' operation.  On systems
+-     missing this functionality `fdatasync' is emulated by a call to
+-     `fsync' since the performed actions are a superset of those
+-     required by `fdatasyn'.
+-
+-     The prototype for `fdatasync' is in `unistd.h'.
+-
+-     The return value of the function is zero if no error occured.
+-     Otherwise it is -1 and the global variable ERRNO is set to the
+-     following values:
+-    `EBADF'
+-          The descriptor FILDES is not valid.
+-
+-    `EINVAL'
+-          No synchronization is possible since the system does not
+-          implement this.
+-
+-
+-File: libc.info,  Node: Asynchronous I/O,  Next: Control Operations,  Prev: Synchronizing I/O,  Up: Low-Level I/O
+-
+-Perform I/O Operations in Parallel
+-==================================
+-
+-   The POSIX.1b standard defines a new set of I/O operations which can
+-reduce the time an application spends waiting at I/O significantly.  The
+-new functions allow a program to initiate one or more I/O operations and
+-then immediately resume the normal work while the I/O operations are
+-executed in parallel.  The functionality is available if the `unistd.h'
+-file defines the symbol `_POSIX_ASYNCHRONOUS_IO'.
+-
+-   These functions are part of the library with realtime functions named
+-`librt'.  They are not actually part of the `libc' binary.  The
+-implementation of these functions can be done using support in the
+-kernel (if available) or using an implementation based on threads at
+-userlevel.  In the latter case it might be necessary to link
+-applications with the thread library `libpthread' in addition to
+-`librt'.
+-
+-   All AIO operations operate on files which were opened previously.
+-There might be arbitrary many operations for one file running.  The
+-asynchronous I/O operations are controlled using a data structure named
+-`struct aiocb' ("AIO control block").  It is defined in `aio.h' as
+-follows.
+-
+- - Data Type: struct aiocb
+-     The POSIX.1b standard mandates that the `struct aiocb' structure
+-     contains at least the members described in the following table.
+-     There might be more elements which are used by the implementation
+-     but depending on these elements is not portable and is highly
+-     deprecated.
+-
+-    `int aio_fildes'
+-          This element specifies the file descriptor which is used for
+-          the operation.  It must be a legal descriptor since otherwise
+-          the operation fails for obvious reasons.
+-
+-          The device on which the file is opened must allow the seek
+-          operation.  I.e., it is not possible to use any of the AIO
+-          operations on devices like terminals where an `lseek' call
+-          would lead to an error.
+-
+-    `off_t aio_offset'
+-          This element specifies at which offset in the file the
+-          operation (input or output) is performed.  Since the
+-          operations are carried out in arbitrary order and more than
+-          one operation for one file descriptor can be started, one
+-          cannot expect a current read/write position of the file
+-          descriptor.
+-
+-    `volatile void *aio_buf'
+-          This is a pointer to the buffer with the data to be written
+-          or the place where the read data is stored.
+-
+-    `size_t aio_nbytes'
+-          This element specifies the length of the buffer pointed to by
+-          `aio_buf'.
+-
+-    `int aio_reqprio'
+-          If the platform has defined `_POSIX_PRIORITIZED_IO' and
+-          `_POSIX_PRIORITY_SCHEDULING' the AIO requests are processed
+-          based on the current scheduling priority.  The `aio_reqprio'
+-          element can then be used to lower the priority of the AIO
+-          operation.
+-
+-    `struct sigevent aio_sigevent'
+-          This element specifies how the calling process is notified
+-          once the operation terminates.  If the `sigev_notify' element
+-          is `SIGEV_NONE' no notification is send.  If it is
+-          `SIGEV_SIGNAL' the signal determined by `sigev_signo' is
+-          send.  Otherwise `sigev_notify' must be `SIGEV_THREAD'.  In
+-          this case a thread is created which starts executing the
+-          function pointed to by `sigev_notify_function'.
+-
+-    `int aio_lio_opcode'
+-          This element is only used by the `lio_listio' and
+-          `lio_listio64' functions.  Since these functions allow to
+-          start an arbitrary number of operations at once and since
+-          each operation can be input or output (or nothing) the
+-          information must be stored in the control block.  The
+-          possible values are:
+-
+-         `LIO_READ'
+-               Start a read operation.  Read from the file at position
+-               `aio_offset' and store the next `aio_nbytes' bytes in the
+-               buffer pointed to by `aio_buf'.
+-
+-         `LIO_WRITE'
+-               Start a write operation.  Write `aio_nbytes' bytes
+-               starting at `aio_buf' into the file starting at position
+-               `aio_offset'.
+-
+-         `LIO_NOP'
+-               Do nothing for this control block.  This value is useful
+-               sometimes when an array of `struct aiocb' values
+-               contains holes, i.e., some of the values must not be
+-               handled although the whole array is presented to the
+-               `lio_listio' function.
+-
+-     When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a
+-     32 bits machine this type is in fact `struct aiocb64' since the LFS
+-     interface transparently replaces the `struct aiocb' definition.
+-
+-   For use with the AIO functions defined in the LFS there is a similar
+-type defined which replaces the types of the appropriate members with
+-larger types but otherwise is equivalent to `struct aiocb'.  Especially
+-all member names are the same.
+-
+- - Data Type: struct aiocb64
+-    `int aio_fildes'
+-          This element specifies the file descriptor which is used for
+-          the operation.  It must be a legal descriptor since otherwise
+-          the operation fails for obvious reasons.
+-
+-          The device on which the file is opened must allow the seek
+-          operation.  I.e., it is not possible to use any of the AIO
+-          operations on devices like terminals where an `lseek' call
+-          would lead to an error.
+-
+-    `off64_t aio_offset'
+-          This element specified at which offset in the file the
+-          operation (input or output) is performed.  Since the
+-          operation are carried in arbitrary order and more than one
+-          operation for one file descriptor can be started, one cannot
+-          expect a current read/write position of the file descriptor.
+-
+-    `volatile void *aio_buf'
+-          This is a pointer to the buffer with the data to be written
+-          or the place where the ead data is stored.
+-
+-    `size_t aio_nbytes'
+-          This element specifies the length of the buffer pointed to by
+-          `aio_buf'.
+-
+-    `int aio_reqprio'
+-          If for the platform `_POSIX_PRIORITIZED_IO' and
+-          `_POSIX_PRIORITY_SCHEDULING' is defined the AIO requests are
+-          processed based on the current scheduling priority.  The
+-          `aio_reqprio' element can then be used to lower the priority
+-          of the AIO operation.
+-
+-    `struct sigevent aio_sigevent'
+-          This element specifies how the calling process is notified
+-          once the operation terminates.  If the `sigev_notify' element
+-          is `SIGEV_NONE' no notification is send.  If it is
+-          `SIGEV_SIGNAL' the signal determined by `sigev_signo' is
+-          send.  Otherwise `sigev_notify' must be `SIGEV_THREAD' in
+-          which case a thread which starts executing the function
+-          pointeed to by `sigev_notify_function'.
+-
+-    `int aio_lio_opcode'
+-          This element is only used by the `lio_listio' and
+-          `[lio_listio64' functions.  Since these functions allow to
+-          start an arbitrary number of operations at once and since
+-          each operation can be input or output (or nothing) the
+-          information must be stored in the control block.  See the
+-          description of `struct aiocb' for a description of the
+-          possible values.
+-
+-     When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a
+-     32 bits machine this type is available under the name `struct
+-     aiocb64' since the LFS replaces transparently the old interface.
+-
+-* Menu:
+-
+-* Asynchronous Reads/Writes::    Asynchronous Read and Write Operations.
+-* Status of AIO Operations::     Getting the Status of AIO Operations.
+-* Synchronizing AIO Operations:: Getting into a consistent state.
+-* Cancel AIO Operations::        Cancelation of AIO Operations.
+-* Configuration of AIO::         How to optimize the AIO implementation.
+-
+-
+-File: libc.info,  Node: Asynchronous Reads/Writes,  Next: Status of AIO Operations,  Up: Asynchronous I/O
+-
+-Asynchronous Read and Write Operations
+---------------------------------------
+-
+- - Function: int aio_read (struct aiocb *AIOCBP)
+-     This function initiates an asynchronous read operation.  The
+-     function call immediately returns after the operation was enqueued
+-     or when an error was encountered.
+-
+-     The first `aiocbp->aio_nbytes' bytes of the file for which
+-     `aiocbp->aio_fildes' is a descriptor are written to the buffer
+-     starting at `aiocbp->aio_buf'.  Reading starts at the absolute
+-     position `aiocbp->aio_offset' in the file.
+-
+-     If prioritized I/O is supported by the platform the
+-     `aiocbp->aio_reqprio' value is used to adjust the priority before
+-     the request is actually enqueued.
+-
+-     The calling process is notified about the termination of the read
+-     request according to the `aiocbp->aio_sigevent' value.
+-
+-     When `aio_read' returns the return value is zero if no error
+-     occurred that can be found before the process is enqueued.  If
+-     such an early error is found the function returns -1 and sets
+-     `errno' to one of the following values.
+-
+-    `EAGAIN'
+-          The request was not enqueued due to (temporarily) exceeded
+-          resource limitations.
+-
+-    `ENOSYS'
+-          The `aio_read' function is not implemented.
+-
+-    `EBADF'
+-          The `aiocbp->aio_fildes' descriptor is not valid.  This
+-          condition needs not be recognized before enqueueing the
+-          request and so this error might also be signaled
+-          asynchronously.
+-
+-    `EINVAL'
+-          The `aiocbp->aio_offset' or `aiocbp->aio_reqpiro' value is
+-          invalid.  This condition need not be recognized before
+-          enqueueing the request and so this error might also be
+-          signaled asynchrously.
+-
+-     In the case `aio_read' returns zero the current status of the
+-     request can be queried using `aio_error' and `aio_return'
+-     functions.  As long as the value returned by `aio_error' is
+-     `EINPROGRESS' the operation has not yet completed.  If `aio_error'
+-     returns zero the operation successfully terminated, otherwise the
+-     value is to be interpreted as an error code.  If the function
+-     terminated the result of the operation can be get using a call to
+-     `aio_return'.  The returned value is the same as an equivalent
+-     call to `read' would have returned.  Possible error codes returned
+-     by `aio_error' are:
+-
+-    `EBADF'
+-          The `aiocbp->aio_fildes' descriptor is not valid.
+-
+-    `ECANCELED'
+-          The operation was canceled before the operation was finished
+-          (*note Cancel AIO Operations::.)
+-
+-    `EINVAL'
+-          The `aiocbp->aio_offset' value is invalid.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_read64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_read64 (struct aiocb *AIOCBP)
+-     This function is similar to the `aio_read' function.  The only
+-     difference is that on 32 bits machines the file descriptor should
+-     be opened in the large file mode.  Internally `aio_read64' uses
+-     functionality equivalent to `lseek64' (*note File Position
+-     Primitive::.) to position the file descriptor correctly for the
+-     reading, as opposed to `lseek' functionality used in `aio_read'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_read' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-   To write data asynchronously to a file there exists an equivalent
+-pair of functions with a very similar interface.
+-
+- - Function: int aio_write (struct aiocb *AIOCBP)
+-     This function initiates an asynchronous write operation.  The
+-     function call immediately returns after the operation was enqueued
+-     or if before this happens an error was encountered.
+-
+-     The first `aiocbp->aio_nbytes' bytes from the buffer starting at
+-     `aiocbp->aio_buf' are written to the file for which
+-     `aiocbp->aio_fildes' is an descriptor, starting at the absolute
+-     position `aiocbp->aio_offset' in the file.
+-
+-     If prioritized I/O is supported by the platform the
+-     `aiocbp->aio_reqprio' value is used to adjust the priority before
+-     the request is actually enqueued.
+-
+-     The calling process is notified about the termination of the read
+-     request according to the `aiocbp->aio_sigevent' value.
+-
+-     When `aio_write' returns the return value is zero if no error
+-     occurred that can be found before the process is enqueued.  If
+-     such an early error is found the function returns -1 and sets
+-     `errno' to one of the following values.
+-
+-    `EAGAIN'
+-          The request was not enqueued due to (temporarily) exceeded
+-          resource limitations.
+-
+-    `ENOSYS'
+-          The `aio_write' function is not implemented.
+-
+-    `EBADF'
+-          The `aiocbp->aio_fildes' descriptor is not valid.  This
+-          condition needs not be recognized before enqueueing the
+-          request and so this error might also be signaled
+-          asynchronously.
+-
+-    `EINVAL'
+-          The `aiocbp->aio_offset' or `aiocbp->aio_reqpiro' value is
+-          invalid.  This condition needs not be recognized before
+-          enqueueing the request and so this error might also be
+-          signaled asynchronously.
+-
+-     In the case `aio_write' returns zero the current status of the
+-     request can be queried using `aio_error' and `aio_return'
+-     functions.  As long as the value returned by `aio_error' is
+-     `EINPROGRESS' the operation has not yet completed.  If `aio_error'
+-     returns zero the operation successfully terminated, otherwise the
+-     value is to be interpreted as an error code.  If the function
+-     terminated the result of the operation can be get using a call to
+-     `aio_return'.  The returned value is the same as an equivalent
+-     call to `read' would have returned.  Possible error code returned
+-     by `aio_error' are:
+-
+-    `EBADF'
+-          The `aiocbp->aio_fildes' descriptor is not valid.
+-
+-    `ECANCELED'
+-          The operation was canceled before the operation was finished
+-          (*note Cancel AIO Operations::.)
+-
+-    `EINVAL'
+-          The `aiocbp->aio_offset' value is invalid.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_write64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_write64 (struct aiocb *AIOCBP)
+-     This function is similar to the `aio_write' function.  The only
+-     difference is that on 32 bits machines the file descriptor should
+-     be opened in the large file mode.  Internally `aio_write64' uses
+-     functionality equivalent to `lseek64' (*note File Position
+-     Primitive::.) to position the file descriptor correctly for the
+-     writing, as opposed to `lseek' functionality used in `aio_write'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_write' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-   Beside these functions with the more or less traditional interface
+-POSIX.1b also defines a function with can initiate more than one
+-operation at once and which can handled freely mixed read and write
+-operation.  It is therefore similar to a combination of `readv' and
+-`writev'.
+-
+- - Function: int lio_listio (int MODE, struct aiocb *const LIST[], int
+-          NENT, struct sigevent *SIG)
+-     The `lio_listio' function can be used to enqueue an arbitrary
+-     number of read and write requests at one time.  The requests can
+-     all be meant for the same file, all for different files or every
+-     solution in between.
+-
+-     `lio_listio' gets the NENT requests from the array pointed to by
+-     LIST.  What operation has to be performed is determined by the
+-     `aio_lio_opcode' member in each element of LIST.  If this field is
+-     `LIO_READ' an read operation is queued, similar to a call of
+-     `aio_read' for this element of the array (except that the way the
+-     termination is signalled is different, as we will see below).  If
+-     the `aio_lio_opcode' member is `LIO_WRITE' an write operation is
+-     enqueued.  Otherwise the `aio_lio_opcode' must be `LIO_NOP' in
+-     which case this element of LIST is simply ignored.  This
+-     "operation" is useful in situations where one has a fixed array of
+-     `struct aiocb' elements from which only a few need to be handled at
+-     a time.  Another situation is where the `lio_listio' call was
+-     cancelled before all requests are processed (*note Cancel AIO
+-     Operations::.) and the remaining requests have to be reissued.
+-
+-     The other members of each element of the array pointed to by
+-     `list' must have values suitable for the operation as described in
+-     the documentation for `aio_read' and `aio_write' above.
+-
+-     The MODE argument determines how `lio_listio' behaves after having
+-     enqueued all the requests.  If MODE is `LIO_WAIT' it waits until
+-     all requests terminated.  Otherwise MODE must be `LIO_NOWAIT' and
+-     in this case the function returns immediately after having
+-     enqueued all the requests.  In this case the caller gets a
+-     notification of the termination of all requests according to the
+-     SIG parameter.  If SIG is `NULL' no notification is send.
+-     Otherwise a signal is sent or a thread is started, just as
+-     described in the description for `aio_read' or `aio_write'.
+-
+-     If MODE is `LIO_WAIT' the return value of `lio_listio' is 0 when
+-     all requests completed successfully.  Otherwise the function
+-     return -1 and `errno' is set accordingly.  To find out which
+-     request or requests failed one has to use the `aio_error' function
+-     on all the elements of the array LIST.
+-
+-     In case MODE is `LIO_NOWAIT' the function return 0 if all requests
+-     were enqueued correctly.  The current state of the requests can be
+-     found using `aio_error' and `aio_return' as described above.  In
+-     case `lio_listio' returns -1 in this mode the global variable
+-     `errno' is set accordingly.  If a request did not yet terminate a
+-     call to `aio_error' returns `EINPROGRESS'.  If the value is
+-     different the request is finished and the error value (or 0) is
+-     returned and the result of the operation can be retrieved using
+-     `aio_return'.
+-
+-     Possible values for `errno' are:
+-
+-    `EAGAIN'
+-          The resources necessary to queue all the requests are not
+-          available in the moment.  The error status for each element
+-          of LIST must be checked which request failed.
+-
+-          Another reason could be that the system wide limit of AIO
+-          requests is exceeded.  This cannot be the case for the
+-          implementation on GNU systems since no arbitrary limits exist.
+-
+-    `EINVAL'
+-          The MODE parameter is invalid or NENT is larger than
+-          `AIO_LISTIO_MAX'.
+-
+-    `EIO'
+-          One or more of the request's I/O operations failed.  The
+-          error status of each request should be checked for which one
+-          failed.
+-
+-    `ENOSYS'
+-          The `lio_listio' function is not supported.
+-
+-     If the MODE parameter is `LIO_NOWAIT' and the caller cancels an
+-     request the error status for this request returned by `aio_error'
+-     is `ECANCELED'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `lio_listio64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int lio_listio64 (int MODE, struct aiocb *const LIST, int
+-          NENT, struct sigevent *SIG)
+-     This function is similar to the `aio_listio' function.  The only
+-     difference is that only 32 bits machines the file descriptor should
+-     be opened in the large file mode.  Internally `lio_listio64' uses
+-     functionality equivalent to `lseek64' (*note File Position
+-     Primitive::.) to position the file descriptor correctly for the
+-     reading or writing, as opposed to `lseek' functionality used in
+-     `lio_listio'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `lio_listio' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-
+-File: libc.info,  Node: Status of AIO Operations,  Next: Synchronizing AIO Operations,  Prev: Asynchronous Reads/Writes,  Up: Asynchronous I/O
+-
+-Getting the Status of AIO Operations
+-------------------------------------
+-
+-   As already described in the documentation of the functions in the
+-last section it must be possible to get information about the status of
+-a I/O request.  When the operation is performed really asynchronous (as
+-with `aio_read' and `aio_write' and with `aio_listio' when the mode is
+-`LIO_NOWAIT') one sometimes needs to know whether a specific request
+-already terminated and if yes, what the result was..  The following two
+-function allow to get this kind of information.
+-
+- - Function: int aio_error (const struct aiocb *AIOCBP)
+-     This function determines the error state of the request described
+-     by the `struct aiocb' variable pointed to by AIOCBP.  If the
+-     request has not yet terminated the value returned is always
+-     `EINPROGRESS'.  Once the request has terminated the value
+-     `aio_error' returns is either 0 if the request completed
+-     successfully or it returns the value which would be stored in the
+-     `errno' variable if the request would have been done using `read',
+-     `write', or `fsync'.
+-
+-     The function can return `ENOSYS' if it is not implemented.  It
+-     could also return `EINVAL' if the AIOCBP parameter does not refer
+-     to an asynchronous operation whose return status is not yet known.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_error64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_error64 (const struct aiocb64 *AIOCBP)
+-     This function is similar to `aio_error' with the only difference
+-     that the argument is a reference to a variable of type `struct
+-     aiocb64'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_error' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+- - Function: ssize_t aio_return (const struct aiocb *AIOCBP)
+-     This function can be used to retrieve the return status of the
+-     operation carried out by the request described in the variable
+-     pointed to by AIOCBP.  As long as the error status of this request
+-     as returned by `aio_error' is `EINPROGRESS' the return of this
+-     function is undefined.
+-
+-     Once the request is finished this function can be used exactly
+-     once to retrieve the return value.  Following calls might lead to
+-     undefined behaviour.  The return value itself is the value which
+-     would have been returned by the `read', `write', or `fsync' call.
+-
+-     The function can return `ENOSYS' if it is not implemented.  It
+-     could also return `EINVAL' if the AIOCBP parameter does not refer
+-     to an asynchronous operation whose return status is not yet known.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_return64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_return64 (const struct aiocb64 *AIOCBP)
+-     This function is similar to `aio_return' with the only difference
+-     that the argument is a reference to a variable of type `struct
+-     aiocb64'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_return' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-
+-File: libc.info,  Node: Synchronizing AIO Operations,  Next: Cancel AIO Operations,  Prev: Status of AIO Operations,  Up: Asynchronous I/O
+-
+-Getting into a Consistent State
+--------------------------------
+-
+-   When dealing with asynchronous operations it is sometimes necessary
+-to get into a consistent state.  This would mean for AIO that one wants
+-to know whether a certain request or a group of request were processed.
+-This could be done by waiting for the notification sent by the system
+-after the operation terminated but this sometimes would mean wasting
+-resources (mainly computation time).  Instead POSIX.1b defines two
+-functions which will help with most kinds of consistency.
+-
+-   The `aio_fsync' and `aio_fsync64' functions are only available if in
+-`unistd.h' the symbol `_POSIX_SYNCHRONIZED_IO' is defined.
+-
+- - Function: int aio_fsync (int OP, struct aiocb *AIOCBP)
+-     Calling this function forces all I/O operations operating queued
+-     at the time of the function call operating on the file descriptor
+-     `aiocbp->aio_fildes' into the synchronized I/O completion state
+-     (*note Synchronizing I/O::.).  The `aio_fsync' function return
+-     immediately but the notification through the method described in
+-     `aiocbp->aio_sigevent' will happen only after all requests for this
+-     file descriptor terminated and the file is synchronized.  This also
+-     means that requests for this very same file descriptor which are
+-     queued after the synchronization request are not effected.
+-
+-     If OP is `O_DSYNC' the synchronization happens as with a call to
+-     `fdatasync'.  Otherwise OP should be `O_SYNC' and the
+-     synchronization happens as with `fsync'.
+-
+-     As long as the synchronization has not happened a call to
+-     `aio_error' with the reference to the object pointed to by AIOCBP
+-     returns `EINPROGRESS'.  Once the synchronization is done
+-     `aio_error' return 0 if the synchronization was not successful.
+-     Otherwise the value returned is the value to which the `fsync' or
+-     `fdatasync' function would have set the `errno' variable.  In this
+-     case nothing can be assumed about the consistency for the data
+-     written to this file descriptor.
+-
+-     The return value of this function is 0 if the request was
+-     successfully filed.  Otherwise the return value is -1 and `errno'
+-     is set to one of the following values:
+-
+-    `EAGAIN'
+-          The request could not be enqueued due to temporary lack of
+-          resources.
+-
+-    `EBADF'
+-          The file descriptor `aiocbp->aio_fildes' is not valid or not
+-          open for writing.
+-
+-    `EINVAL'
+-          The implementation does not support I/O synchronization or
+-          the OP parameter is other than `O_DSYNC' and `O_SYNC'.
+-
+-    `ENOSYS'
+-          This function is not implemented.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_return64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)
+-     This function is similar to `aio_fsync' with the only difference
+-     that the argument is a reference to a variable of type `struct
+-     aiocb64'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_fsync' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-   Another method of synchronization is to wait until one or more
+-requests of a specific set terminated.  This could be achieved by the
+-`aio_*' functions to notify the initiating process about the
+-termination but in some situations this is not the ideal solution.  In
+-a program which constantly updates clients somehow connected to the
+-server it is not always the best solution to go round robin since some
+-connections might be slow.  On the other hand letting the `aio_*'
+-function notify the caller might also be not the best solution since
+-whenever the process works on preparing data for on client it makes no
+-sense to be interrupted by a notification since the new client will not
+-be handled before the current client is served.  For situations like
+-this `aio_suspend' should be used.
+-
+- - Function: int aio_suspend (const struct aiocb *const LIST[], int
+-          NENT, const struct timespec *TIMEOUT)
+-     When calling this function the calling thread is suspended until at
+-     least one of the requests pointed to by the NENT elements of the
+-     array LIST has completed.  If any of the requests already has
+-     completed at the time `aio_suspend' is called the function returns
+-     immediately.  Whether a request has terminated or not is done by
+-     comparing the error status of the request with `EINPROGRESS'.  If
+-     an element of LIST is `NULL' the entry is simply ignored.
+-
+-     If no request has finished the calling process is suspended.  If
+-     TIMEOUT is `NULL' the process is not waked until a request
+-     finished.  If TIMEOUT is not `NULL' the process remains suspended
+-     at as long as specified in TIMEOUT.  In this case `aio_suspend'
+-     returns with an error.
+-
+-     The return value of the function is 0 if one or more requests from
+-     the LIST have terminated.  Otherwise the function returns -1 and
+-     `errno' is set to one of the following values:
+-
+-    `EAGAIN'
+-          None of the requests from the LIST completed in the time
+-          specified by TIMEOUT.
+-
+-    `EINTR'
+-          A signal interrupted the `aio_suspend' function.  This signal
+-          might also be sent by the AIO implementation while signalling
+-          the termination of one of the requests.
+-
+-    `ENOSYS'
+-          The `aio_suspend' function is not implemented.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_suspend64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_suspend64 (const struct aiocb64 *const LIST[], int
+-          NENT, const struct timespec *TIMEOUT)
+-     This function is similar to `aio_suspend' with the only difference
+-     that the argument is a reference to a variable of type `struct
+-     aiocb64'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_suspend' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-
+-File: libc.info,  Node: Cancel AIO Operations,  Next: Configuration of AIO,  Prev: Synchronizing AIO Operations,  Up: Asynchronous I/O
+-
+-Cancelation of AIO Operations
+------------------------------
+-
+-   When one or more requests are asynchronously processed it might be
+-useful in some situations to cancel a selected operation, e.g., if it
+-becomes obvious that the written data is not anymore accurate and would
+-have to be overwritten soon.  As an example assume an application, which
+-writes data in files in a situation where new incoming data would have
+-to be written in a file which will be updated by an enqueued request.
+-The POSIX AIO implementation provides such a function but this function
+-is not capable to force the cancelation of the request.  It is up to the
+-implementation to decide whether it is possible to cancel the operation
+-or not.  Therefore using this function is merely a hint.
+-
+- - Function: int aio_cancel (int FILDES, struct aiocb *AIOCBP)
+-     The `aio_cancel' function can be used to cancel one or more
+-     outstanding requests.  If the AIOCBP parameter is `NULL' the
+-     function tries to cancel all outstanding requests which would
+-     process the file descriptor FILDES (i.e.,, whose `aio_fildes'
+-     member is FILDES).  If AIOCBP is not `NULL' the very specific
+-     request pointed to by AIOCBP is tried to be canceled.
+-
+-     For requests which were successfully canceled the normal
+-     notification about the termination of the request should take
+-     place.  I.e., depending on the `struct sigevent' object which
+-     controls this, nothing happens, a signal is sent or a thread is
+-     started.  If the request cannot be canceled it terminates the
+-     usual way after performing te operation.
+-
+-     After a request is successfully canceled a call to `aio_error' with
+-     a reference to this request as the parameter will return
+-     `ECANCELED' and a call to `aio_return' will return -1.  If the
+-     request wasn't canceled and is still running the error status is
+-     still `EINPROGRESS'.
+-
+-     The return value of the function is `AIO_CANCELED' if there were
+-     requests which haven't terminated and which successfully were
+-     canceled.  If there is one or more request left which couldn't be
+-     canceled the return value is `AIO_NOTCANCELED'.  In this case
+-     `aio_error' must be used to find out which of the perhaps multiple
+-     requests (in AIOCBP is `NULL') wasn't successfully canceled.  If
+-     all requests already terminated at the time `aio_cancel' is called
+-     the return value is `AIO_ALLDONE'.
+-
+-     If an error occurred during the execution of `aio_cancel' the
+-     function returns -1 and sets `errno' to one of the following
+-     values.
+-
+-    `EBADF'
+-          The file descriptor FILDES is not valid.
+-
+-    `ENOSYS'
+-          `aio_cancel' is not implemented.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `aio_cancel64' since the LFS interface
+-     transparently replaces the normal implementation.
+-
+- - Function: int aio_cancel64 (int FILDES, struct aiocb *AIOCBP)
+-     This function is similar to `aio_cancel' with the only difference
+-     that the argument is a reference to a variable of type `struct
+-     aiocb64'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `aio_cancel' and so
+-     transparently replaces the interface for small files on 32 bits
+-     machines.
+-
+-
+-File: libc.info,  Node: Configuration of AIO,  Prev: Cancel AIO Operations,  Up: Asynchronous I/O
+-
+-How to optimize the AIO implementation
+---------------------------------------
+-
+-   The POSIX standard does not specify how the AIO functions are
+-implemented.  They could be system calls but it is also possible to
+-emulate them at userlevel.
+-
+-   At least the available implementation at the point of this writing
+-is a userlevel implementation which uses threads for handling the
+-enqueued requests.  This implementation requires to make some decisions
+-about limitations but hard limitations are something which better
+-should be avoided the GNU C library implementation provides a mean to
+-tune the AIO implementation individually for each use.
+-
+- - Data Type: struct aioinit
+-     This data type is used to pass the configuration or tunable
+-     parameters to the implementation.  The program has to initialize
+-     the members of this struct and pass it to the implementation using
+-     the `aio_init' function.
+-
+-    `int aio_threads'
+-          This member specifies the maximal number of threads which
+-          must be used at any one time.
+-
+-    `int aio_num'
+-          This number provides an estimate on the maximal number of
+-          simultaneously enqueued requests.
+-
+-    `int aio_locks'
+-
+-    `int aio_usedba'
+-
+-    `int aio_debug'
+-
+-    `int aio_numusers'
+-
+-    `int aio_reserved[2]'
+-
+- - Function: void aio_init (const struct aioinit *INIT)
+-     This function must be called before any other AIO function.
+-     Calling it is completely voluntarily since it only is meant to
+-     help the AIO implementation to perform better.
+-
+-     Before calling the `aio_init' function the members of a variable of
+-     type `struct aioinit' must be initialized.  Then a reference to
+-     this variable is passed as the parameter to `aio_init' which itself
+-     may or may not pay attention to the hints.
+-
+-     The function has no return value and no error cases are defined.
+-     It is a extension which follows a proposal from the SGI
+-     implementation in Irix 6.  It is not covered by POSIX.1b or Unix98.
+-
+-
+-File: libc.info,  Node: Control Operations,  Next: Duplicating Descriptors,  Prev: Asynchronous I/O,  Up: Low-Level I/O
+-
+-Control Operations on Files
+-===========================
+-
+-   This section describes how you can perform various other operations
+-on file descriptors, such as inquiring about or setting flags describing
+-the status of the file descriptor, manipulating record locks, and the
+-like.  All of these operations are performed by the function `fcntl'.
+-
+-   The second argument to the `fcntl' function is a command that
+-specifies which operation to perform.  The function and macros that name
+-various flags that are used with it are declared in the header file
+-`fcntl.h'.  Many of these flags are also used by the `open' function;
+-see *Note Opening and Closing Files::.
+-
+- - Function: int fcntl (int FILEDES, int COMMAND, ...)
+-     The `fcntl' function performs the operation specified by COMMAND
+-     on the file descriptor FILEDES.  Some commands require additional
+-     arguments to be supplied.  These additional arguments and the
+-     return value and error conditions are given in the detailed
+-     descriptions of the individual commands.
+-
+-     Briefly, here is a list of what the various commands are.
+-
+-    `F_DUPFD'
+-          Duplicate the file descriptor (return another file descriptor
+-          pointing to the same open file).  *Note Duplicating
+-          Descriptors::.
+-
+-    `F_GETFD'
+-          Get flags associated with the file descriptor.  *Note
+-          Descriptor Flags::.
+-
+-    `F_SETFD'
+-          Set flags associated with the file descriptor.  *Note
+-          Descriptor Flags::.
+-
+-    `F_GETFL'
+-          Get flags associated with the open file.  *Note File Status
+-          Flags::.
+-
+-    `F_SETFL'
+-          Set flags associated with the open file.  *Note File Status
+-          Flags::.
+-
+-    `F_GETLK'
+-          Get a file lock.  *Note File Locks::.
+-
+-    `F_SETLK'
+-          Set or clear a file lock.  *Note File Locks::.
+-
+-    `F_SETLKW'
+-          Like `F_SETLK', but wait for completion.  *Note File Locks::.
+-
+-    `F_GETOWN'
+-          Get process or process group ID to receive `SIGIO' signals.
+-          *Note Interrupt Input::.
+-
+-    `F_SETOWN'
+-          Set process or process group ID to receive `SIGIO' signals.
+-          *Note Interrupt Input::.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `fcntl' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `fcntl' should be protected using cancelation handlers.
+-
+-
+-File: libc.info,  Node: Duplicating Descriptors,  Next: Descriptor Flags,  Prev: Control Operations,  Up: Low-Level I/O
+-
+-Duplicating Descriptors
+-=======================
+-
+-   You can "duplicate" a file descriptor, or allocate another file
+-descriptor that refers to the same open file as the original.  Duplicate
+-descriptors share one file position and one set of file status flags
+-(*note File Status Flags::.), but each has its own set of file
+-descriptor flags (*note Descriptor Flags::.).
+-
+-   The major use of duplicating a file descriptor is to implement
+-"redirection" of input or output:  that is, to change the file or pipe
+-that a particular file descriptor corresponds to.
+-
+-   You can perform this operation using the `fcntl' function with the
+-`F_DUPFD' command, but there are also convenient functions `dup' and
+-`dup2' for duplicating descriptors.
+-
+-   The `fcntl' function and flags are declared in `fcntl.h', while
+-prototypes for `dup' and `dup2' are in the header file `unistd.h'.
+-
+- - Function: int dup (int OLD)
+-     This function copies descriptor OLD to the first available
+-     descriptor number (the first number not currently open).  It is
+-     equivalent to `fcntl (OLD, F_DUPFD, 0)'.
+-
+- - Function: int dup2 (int OLD, int NEW)
+-     This function copies the descriptor OLD to descriptor number NEW.
+-
+-     If OLD is an invalid descriptor, then `dup2' does nothing; it does
+-     not close NEW.  Otherwise, the new duplicate of OLD replaces any
+-     previous meaning of descriptor NEW, as if NEW were closed first.
+-
+-     If OLD and NEW are different numbers, and OLD is a valid
+-     descriptor number, then `dup2' is equivalent to:
+-
+-          close (NEW);
+-          fcntl (OLD, F_DUPFD, NEW)
+-
+-     However, `dup2' does this atomically; there is no instant in the
+-     middle of calling `dup2' at which NEW is closed and not yet a
+-     duplicate of OLD.
+-
+- - Macro: int F_DUPFD
+-     This macro is used as the COMMAND argument to `fcntl', to copy the
+-     file descriptor given as the first argument.
+-
+-     The form of the call in this case is:
+-
+-          fcntl (OLD, F_DUPFD, NEXT-FILEDES)
+-
+-     The NEXT-FILEDES argument is of type `int' and specifies that the
+-     file descriptor returned should be the next available one greater
+-     than or equal to this value.
+-
+-     The return value from `fcntl' with this command is normally the
+-     value of the new file descriptor.  A return value of -1 indicates
+-     an error.  The following `errno' error conditions are defined for
+-     this command:
+-
+-    `EBADF'
+-          The OLD argument is invalid.
+-
+-    `EINVAL'
+-          The NEXT-FILEDES argument is invalid.
+-
+-    `EMFILE'
+-          There are no more file descriptors available--your program is
+-          already using the maximum.  In BSD and GNU, the maximum is
+-          controlled by a resource limit that can be changed; *note
+-          Limits on Resources::., for more information about the
+-          `RLIMIT_NOFILE' limit.
+-
+-     `ENFILE' is not a possible error code for `dup2' because `dup2'
+-     does not create a new opening of a file; duplicate descriptors do
+-     not count toward the limit which `ENFILE' indicates.  `EMFILE' is
+-     possible because it refers to the limit on distinct descriptor
+-     numbers in use in one process.
+-
+-   Here is an example showing how to use `dup2' to do redirection.
+-Typically, redirection of the standard streams (like `stdin') is done
+-by a shell or shell-like program before calling one of the `exec'
+-functions (*note Executing a File::.) to execute a new program in a
+-child process.  When the new program is executed, it creates and
+-initializes the standard streams to point to the corresponding file
+-descriptors, before its `main' function is invoked.
+-
+-   So, to redirect standard input to a file, the shell could do
+-something like:
+-
+-     pid = fork ();
+-     if (pid == 0)
+-       {
+-         char *filename;
+-         char *program;
+-         int file;
+-         ...
+-         file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
+-         dup2 (file, STDIN_FILENO);
+-         TEMP_FAILURE_RETRY (close (file));
+-         execv (program, NULL);
+-       }
+-
+-   There is also a more detailed example showing how to implement
+-redirection in the context of a pipeline of processes in *Note
+-Launching Jobs::.
+-
+-
+-File: libc.info,  Node: Descriptor Flags,  Next: File Status Flags,  Prev: Duplicating Descriptors,  Up: Low-Level I/O
+-
+-File Descriptor Flags
+-=====================
+-
+-   "File descriptor flags" are miscellaneous attributes of a file
+-descriptor.  These flags are associated with particular file
+-descriptors, so that if you have created duplicate file descriptors
+-from a single opening of a file, each descriptor has its own set of
+-flags.
+-
+-   Currently there is just one file descriptor flag: `FD_CLOEXEC',
+-which causes the descriptor to be closed if you use any of the
+-`exec...' functions (*note Executing a File::.).
+-
+-   The symbols in this section are defined in the header file `fcntl.h'.
+-
+- - Macro: int F_GETFD
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should return the file descriptor flags associated with
+-     the FILEDES argument.
+-
+-     The normal return value from `fcntl' with this command is a
+-     nonnegative number which can be interpreted as the bitwise OR of
+-     the individual flags (except that currently there is only one flag
+-     to use).
+-
+-     In case of an error, `fcntl' returns -1.  The following `errno'
+-     error conditions are defined for this command:
+-
+-    `EBADF'
+-          The FILEDES argument is invalid.
+-
+- - Macro: int F_SETFD
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should set the file descriptor flags associated with the
+-     FILEDES argument.  This requires a third `int' argument to specify
+-     the new flags, so the form of the call is:
+-
+-          fcntl (FILEDES, F_SETFD, NEW-FLAGS)
+-
+-     The normal return value from `fcntl' with this command is an
+-     unspecified value other than -1, which indicates an error.  The
+-     flags and error conditions are the same as for the `F_GETFD'
+-     command.
+-
+-   The following macro is defined for use as a file descriptor flag with
+-the `fcntl' function.  The value is an integer constant usable as a bit
+-mask value.
+-
+- - Macro: int FD_CLOEXEC
+-     This flag specifies that the file descriptor should be closed when
+-     an `exec' function is invoked; see *Note Executing a File::.  When
+-     a file descriptor is allocated (as with `open' or `dup'), this bit
+-     is initially cleared on the new file descriptor, meaning that
+-     descriptor will survive into the new program after `exec'.
+-
+-   If you want to modify the file descriptor flags, you should get the
+-current flags with `F_GETFD' and modify the value.  Don't assume that
+-the flags listed here are the only ones that are implemented; your
+-program may be run years from now and more flags may exist then.  For
+-example, here is a function to set or clear the flag `FD_CLOEXEC'
+-without altering any other flags:
+-
+-     /* Set the `FD_CLOEXEC' flag of DESC if VALUE is nonzero,
+-        or clear the flag if VALUE is 0.
+-        Return 0 on success, or -1 on error with `errno' set. */
+-     
+-     int
+-     set_cloexec_flag (int desc, int value)
+-     {
+-       int oldflags = fcntl (desc, F_GETFD, 0);
+-       /* If reading the flags failed, return error indication now.
+-       if (oldflags < 0)
+-         return oldflags;
+-       /* Set just the flag we want to set. */
+-       if (value != 0)
+-         oldflags |= FD_CLOEXEC;
+-       else
+-         oldflags &= ~FD_CLOEXEC;
+-       /* Store modified flag word in the descriptor. */
+-       return fcntl (desc, F_SETFD, oldflags);
+-     }
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-2 glibc-2.1.3/manual/libc.info-2
+--- ../glibc-2.1.3/manual/libc.info-2	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-2	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1003 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Introduction,  Next: Error Reporting,  Prev: Top,  Up: Top
+-
+-Introduction
+-************
+-
+-   The C language provides no built-in facilities for performing such
+-common operations as input/output, memory management, string
+-manipulation, and the like.  Instead, these facilities are defined in a
+-standard "library", which you compile and link with your programs.
+-
+-   The GNU C library, described in this document, defines all of the
+-library functions that are specified by the ISO C standard, as well as
+-additional features specific to POSIX and other derivatives of the Unix
+-operating system, and extensions specific to the GNU system.
+-
+-   The purpose of this manual is to tell you how to use the facilities
+-of the GNU library.  We have mentioned which features belong to which
+-standards to help you identify things that are potentially non-portable
+-to other systems.  But the emphasis in this manual is not on strict
+-portability.
+-
+-* Menu:
+-
+-* Getting Started::             What this manual is for and how to use it.
+-* Standards and Portability::   Standards and sources upon which the GNU
+-                                 C library is based.
+-* Using the Library::           Some practical uses for the library.
+-* Roadmap to the Manual::       Overview of the remaining chapters in
+-                                 this manual.
+-
+-
+-File: libc.info,  Node: Getting Started,  Next: Standards and Portability,  Up: Introduction
+-
+-Getting Started
+-===============
+-
+-   This manual is written with the assumption that you are at least
+-somewhat familiar with the C programming language and basic programming
+-concepts.  Specifically, familiarity with ISO standard C (*note ISO
+-C::.), rather than "traditional" pre-ISO C dialects, is assumed.
+-
+-   The GNU C library includes several "header files", each of which
+-provides definitions and declarations for a group of related facilities;
+-this information is used by the C compiler when processing your program.
+-For example, the header file `stdio.h' declares facilities for
+-performing input and output, and the header file `string.h' declares
+-string processing utilities.  The organization of this manual generally
+-follows the same division as the header files.
+-
+-   If you are reading this manual for the first time, you should read
+-all of the introductory material and skim the remaining chapters.
+-There are a *lot* of functions in the GNU C library and it's not
+-realistic to expect that you will be able to remember exactly *how* to
+-use each and every one of them.  It's more important to become
+-generally familiar with the kinds of facilities that the library
+-provides, so that when you are writing your programs you can recognize
+-*when* to make use of library functions, and *where* in this manual you
+-can find more specific information about them.
+-
+-
+-File: libc.info,  Node: Standards and Portability,  Next: Using the Library,  Prev: Getting Started,  Up: Introduction
+-
+-Standards and Portability
+-=========================
+-
+-   This section discusses the various standards and other sources that
+-the GNU C library is based upon.  These sources include the ISO C and
+-POSIX standards, and the System V and Berkeley Unix implementations.
+-
+-   The primary focus of this manual is to tell you how to make effective
+-use of the GNU library facilities.  But if you are concerned about
+-making your programs compatible with these standards, or portable to
+-operating systems other than GNU, this can affect how you use the
+-library.  This section gives you an overview of these standards, so that
+-you will know what they are when they are mentioned in other parts of
+-the manual.
+-
+-   *Note Library Summary::, for an alphabetical list of the functions
+-and other symbols provided by the library.  This list also states which
+-standards each function or symbol comes from.
+-
+-* Menu:
+-
+-* ISO C::                       The international standard for the C
+-                                 programming language.
+-* POSIX::                       The ISO/IEC 9945 (aka IEEE 1003) standards
+-                                 for operating systems.
+-* Berkeley Unix::               BSD and SunOS.
+-* SVID::                        The System V Interface Description.
+-* XPG::                         The X/Open Portability Guide.
+-
+-
+-File: libc.info,  Node: ISO C,  Next: POSIX,  Up: Standards and Portability
+-
+-ISO C
+------
+-
+-   The GNU C library is compatible with the C standard adopted by the
+-American National Standards Institute (ANSI): `American National
+-Standard X3.159-1989--"ANSI C"' and later by the International
+-Standardization Organization (ISO): `ISO/IEC 9899:1990, "Programming
+-languages--C"'.  We here refer to the standard as ISO C since this is
+-the more general standard in respect of ratification.  The header files
+-and library facilities that make up the GNU library are a superset of
+-those specified by the ISO C standard.
+-
+-   If you are concerned about strict adherence to the ISO C standard,
+-you should use the `-ansi' option when you compile your programs with
+-the GNU C compiler.  This tells the compiler to define *only* ISO
+-standard features from the library header files, unless you explicitly
+-ask for additional features.  *Note Feature Test Macros::, for
+-information on how to do this.
+-
+-   Being able to restrict the library to include only ISO C features is
+-important because ISO C puts limitations on what names can be defined
+-by the library implementation, and the GNU extensions don't fit these
+-limitations.  *Note Reserved Names::, for more information about these
+-restrictions.
+-
+-   This manual does not attempt to give you complete details on the
+-differences between ISO C and older dialects.  It gives advice on how
+-to write programs to work portably under multiple C dialects, but does
+-not aim for completeness.
+-
+-
+-File: libc.info,  Node: POSIX,  Next: Berkeley Unix,  Prev: ISO C,  Up: Standards and Portability
+-
+-POSIX (The Portable Operating System Interface)
+------------------------------------------------
+-
+-   The GNU library is also compatible with the ISO "POSIX" family of
+-standards, known more formally as the "Portable Operating System
+-Interface for Computer Environments" (ISO/IEC 9945).  They were also
+-published as ANSI/IEEE Std 1003.  POSIX is derived mostly from various
+-versions of the Unix operating system.
+-
+-   The library facilities specified by the POSIX standards are a
+-superset of those required by ISO C; POSIX specifies additional
+-features for ISO C functions, as well as specifying new additional
+-functions.  In general, the additional requirements and functionality
+-defined by the POSIX standards are aimed at providing lower-level
+-support for a particular kind of operating system environment, rather
+-than general programming language support which can run in many diverse
+-operating system environments.
+-
+-   The GNU C library implements all of the functions specified in
+-`ISO/IEC 9945-1:1996, the POSIX System Application Program Interface',
+-commonly referred to as POSIX.1.  The primary extensions to the ISO C
+-facilities specified by this standard include file system interface
+-primitives (*note File System Interface::.), device-specific terminal
+-control functions (*note Low-Level Terminal Interface::.), and process
+-control functions (*note Processes::.).
+-
+-   Some facilities from `ISO/IEC 9945-2:1993, the POSIX Shell and
+-Utilities standard' (POSIX.2) are also implemented in the GNU library.
+-These include utilities for dealing with regular expressions and other
+-pattern matching facilities (*note Pattern Matching::.).
+-
+-
+-File: libc.info,  Node: Berkeley Unix,  Next: SVID,  Prev: POSIX,  Up: Standards and Portability
+-
+-Berkeley Unix
+--------------
+-
+-   The GNU C library defines facilities from some versions of Unix which
+-are not formally standardized, specifically from the 4.2 BSD, 4.3 BSD,
+-and 4.4 BSD Unix systems (also known as "Berkeley Unix") and from
+-"SunOS" (a popular 4.2 BSD derivative that includes some Unix System V
+-functionality).  These systems support most of the ISO C and POSIX
+-facilities, and 4.4 BSD and newer releases of SunOS in fact support
+-them all.
+-
+-   The BSD facilities include symbolic links (*note Symbolic Links::.),
+-the `select' function (*note Waiting for I/O::.), the BSD signal
+-functions (*note BSD Signal Handling::.), and sockets (*note
+-Sockets::.).
+-
+-
+-File: libc.info,  Node: SVID,  Next: XPG,  Prev: Berkeley Unix,  Up: Standards and Portability
+-
+-SVID (The System V Interface Description)
+------------------------------------------
+-
+-   The "System V Interface Description" (SVID) is a document describing
+-the AT&T Unix System V operating system.  It is to some extent a
+-superset of the POSIX standard (*note POSIX::.).
+-
+-   The GNU C library defines most of the facilities required by the SVID
+-that are not also required by the ISO C or POSIX standards, for
+-compatibility with  System V Unix and other Unix systems (such as
+-SunOS) which include these facilities.  However, many of the more
+-obscure and less generally useful facilities required by the SVID are
+-not included.  (In fact, Unix System V itself does not provide them
+-all.)
+-
+-   The supported facilities from System V include the methods for
+-inter-process communication and shared memory, the `hsearch' and
+-`drand48' families of functions, `fmtmsg' and several of the
+-mathematical functions.
+-
+-
+-File: libc.info,  Node: XPG,  Prev: SVID,  Up: Standards and Portability
+-
+-XPG (The X/Open Portability Guide)
+-----------------------------------
+-
+-   The X/Open Portability Guide, published by the X/Open Company, Ltd.,
+-is a more general standard than POSIX.  X/Open owns the Unix copyright
+-and the XPG specifies the requirements for systems which are intended
+-to be a Unix system.
+-
+-   The GNU C library complies to the X/Open Portability Guide, Issue
+-4.2, with all extensions common to XSI (X/Open System Interface)
+-compliant systems and also all X/Open UNIX extensions.
+-
+-   The additions on top of POSIX are mainly derived from functionality
+-available in System V and BSD systems.  Some of the really bad mistakes
+-in System V systems were corrected, though.  Since fulfilling the XPG
+-standard with the Unix extensions is a precondition for getting the
+-Unix brand chances are good that the functionality is available on
+-commercial systems.
+-
+-
+-File: libc.info,  Node: Using the Library,  Next: Roadmap to the Manual,  Prev: Standards and Portability,  Up: Introduction
+-
+-Using the Library
+-=================
+-
+-   This section describes some of the practical issues involved in using
+-the GNU C library.
+-
+-* Menu:
+-
+-* Header Files::                How to include the header files in your
+-                                 programs.
+-* Macro Definitions::           Some functions in the library may really
+-                                 be implemented as macros.
+-* Reserved Names::              The C standard reserves some names for
+-                                 the library, and some for users.
+-* Feature Test Macros::         How to control what names are defined.
+-
+-
+-File: libc.info,  Node: Header Files,  Next: Macro Definitions,  Up: Using the Library
+-
+-Header Files
+-------------
+-
+-   Libraries for use by C programs really consist of two parts: "header
+-files" that define types and macros and declare variables and
+-functions; and the actual library or "archive" that contains the
+-definitions of the variables and functions.
+-
+-   (Recall that in C, a "declaration" merely provides information that
+-a function or variable exists and gives its type.  For a function
+-declaration, information about the types of its arguments might be
+-provided as well.  The purpose of declarations is to allow the compiler
+-to correctly process references to the declared variables and functions.
+-A "definition", on the other hand, actually allocates storage for a
+-variable or says what a function does.)
+-
+-   In order to use the facilities in the GNU C library, you should be
+-sure that your program source files include the appropriate header
+-files.  This is so that the compiler has declarations of these
+-facilities available and can correctly process references to them.
+-Once your program has been compiled, the linker resolves these
+-references to the actual definitions provided in the archive file.
+-
+-   Header files are included into a program source file by the
+-`#include' preprocessor directive.  The C language supports two forms
+-of this directive; the first,
+-
+-     #include "HEADER"
+-
+-is typically used to include a header file HEADER that you write
+-yourself; this would contain definitions and declarations describing the
+-interfaces between the different parts of your particular application.
+-By contrast,
+-
+-     #include <file.h>
+-
+-is typically used to include a header file `file.h' that contains
+-definitions and declarations for a standard library.  This file would
+-normally be installed in a standard place by your system administrator.
+-You should use this second form for the C library header files.
+-
+-   Typically, `#include' directives are placed at the top of the C
+-source file, before any other code.  If you begin your source files with
+-some comments explaining what the code in the file does (a good idea),
+-put the `#include' directives immediately afterwards, following the
+-feature test macro definition (*note Feature Test Macros::.).
+-
+-   For more information about the use of header files and `#include'
+-directives, *note Header Files: (cpp.info)Header Files..
+-
+-   The GNU C library provides several header files, each of which
+-contains the type and macro definitions and variable and function
+-declarations for a group of related facilities.  This means that your
+-programs may need to include several header files, depending on exactly
+-which facilities you are using.
+-
+-   Some library header files include other library header files
+-automatically.  However, as a matter of programming style, you should
+-not rely on this; it is better to explicitly include all the header
+-files required for the library facilities you are using.  The GNU C
+-library header files have been written in such a way that it doesn't
+-matter if a header file is accidentally included more than once;
+-including a header file a second time has no effect.  Likewise, if your
+-program needs to include multiple header files, the order in which they
+-are included doesn't matter.
+-
+-   *Compatibility Note:* Inclusion of standard header files in any
+-order and any number of times works in any ISO C implementation.
+-However, this has traditionally not been the case in many older C
+-implementations.
+-
+-   Strictly speaking, you don't *have to* include a header file to use
+-a function it declares; you could declare the function explicitly
+-yourself, according to the specifications in this manual.  But it is
+-usually better to include the header file because it may define types
+-and macros that are not otherwise available and because it may define
+-more efficient macro replacements for some functions.  It is also a sure
+-way to have the correct declaration.
+-
+-
+-File: libc.info,  Node: Macro Definitions,  Next: Reserved Names,  Prev: Header Files,  Up: Using the Library
+-
+-Macro Definitions of Functions
+-------------------------------
+-
+-   If we describe something as a function in this manual, it may have a
+-macro definition as well.  This normally has no effect on how your
+-program runs--the macro definition does the same thing as the function
+-would.  In particular, macro equivalents for library functions evaluate
+-arguments exactly once, in the same way that a function call would.  The
+-main reason for these macro definitions is that sometimes they can
+-produce an inline expansion that is considerably faster than an actual
+-function call.
+-
+-   Taking the address of a library function works even if it is also
+-defined as a macro.  This is because, in this context, the name of the
+-function isn't followed by the left parenthesis that is syntactically
+-necessary to recognize a macro call.
+-
+-   You might occasionally want to avoid using the macro definition of a
+-function--perhaps to make your program easier to debug.  There are two
+-ways you can do this:
+-
+-   * You can avoid a macro definition in a specific use by enclosing
+-     the name of the function in parentheses.  This works because the
+-     name of the function doesn't appear in a syntactic context where
+-     it is recognizable as a macro call.
+-
+-   * You can suppress any macro definition for a whole source file by
+-     using the `#undef' preprocessor directive, unless otherwise stated
+-     explicitly in the description of that facility.
+-
+-   For example, suppose the header file `stdlib.h' declares a function
+-named `abs' with
+-
+-     extern int abs (int);
+-
+-and also provides a macro definition for `abs'.  Then, in:
+-
+-     #include <stdlib.h>
+-     int f (int *i) { return abs (++*i); }
+-
+-the reference to `abs' might refer to either a macro or a function.  On
+-the other hand, in each of the following examples the reference is to a
+-function and not a macro.
+-
+-     #include <stdlib.h>
+-     int g (int *i) { return (abs) (++*i); }
+-     
+-     #undef abs
+-     int h (int *i) { return abs (++*i); }
+-
+-   Since macro definitions that double for a function behave in exactly
+-the same way as the actual function version, there is usually no need
+-for any of these methods.  In fact, removing macro definitions usually
+-just makes your program slower.
+-
+-
+-File: libc.info,  Node: Reserved Names,  Next: Feature Test Macros,  Prev: Macro Definitions,  Up: Using the Library
+-
+-Reserved Names
+---------------
+-
+-   The names of all library types, macros, variables and functions that
+-come from the ISO C standard are reserved unconditionally; your program
+-*may not* redefine these names.  All other library names are reserved
+-if your program explicitly includes the header file that defines or
+-declares them.  There are several reasons for these restrictions:
+-
+-   * Other people reading your code could get very confused if you were
+-     using a function named `exit' to do something completely different
+-     from what the standard `exit' function does, for example.
+-     Preventing this situation helps to make your programs easier to
+-     understand and contributes to modularity and maintainability.
+-
+-   * It avoids the possibility of a user accidentally redefining a
+-     library function that is called by other library functions.  If
+-     redefinition were allowed, those other functions would not work
+-     properly.
+-
+-   * It allows the compiler to do whatever special optimizations it
+-     pleases on calls to these functions, without the possibility that
+-     they may have been redefined by the user.  Some library
+-     facilities, such as those for dealing with variadic arguments
+-     (*note Variadic Functions::.)  and non-local exits (*note
+-     Non-Local Exits::.), actually require a considerable amount of
+-     cooperation on the part of the C compiler, and implementationally
+-     it might be easier for the compiler to treat these as built-in
+-     parts of the language.
+-
+-   In addition to the names documented in this manual, reserved names
+-include all external identifiers (global functions and variables) that
+-begin with an underscore (`_') and all identifiers regardless of use
+-that begin with either two underscores or an underscore followed by a
+-capital letter are reserved names.  This is so that the library and
+-header files can define functions, variables, and macros for internal
+-purposes without risk of conflict with names in user programs.
+-
+-   Some additional classes of identifier names are reserved for future
+-extensions to the C language or the POSIX.1 environment.  While using
+-these names for your own purposes right now might not cause a problem,
+-they do raise the possibility of conflict with future versions of the C
+-or POSIX standards, so you should avoid these names.
+-
+-   * Names beginning with a capital `E' followed a digit or uppercase
+-     letter may be used for additional error code names.  *Note Error
+-     Reporting::.
+-
+-   * Names that begin with either `is' or `to' followed by a lowercase
+-     letter may be used for additional character testing and conversion
+-     functions.  *Note Character Handling::.
+-
+-   * Names that begin with `LC_' followed by an uppercase letter may be
+-     used for additional macros specifying locale attributes.  *Note
+-     Locales::.
+-
+-   * Names of all existing mathematics functions (*note Mathematics::.)
+-     suffixed with `f' or `l' are reserved for corresponding functions
+-     that operate on `float' and `long double' arguments, respectively.
+-
+-   * Names that begin with `SIG' followed by an uppercase letter are
+-     reserved for additional signal names.  *Note Standard Signals::.
+-
+-   * Names that begin with `SIG_' followed by an uppercase letter are
+-     reserved for additional signal actions.  *Note Basic Signal
+-     Handling::.
+-
+-   * Names beginning with `str', `mem', or `wcs' followed by a
+-     lowercase letter are reserved for additional string and array
+-     functions.  *Note String and Array Utilities::.
+-
+-   * Names that end with `_t' are reserved for additional type names.
+-
+-   In addition, some individual header files reserve names beyond those
+-that they actually define.  You only need to worry about these
+-restrictions if your program includes that particular header file.
+-
+-   * The header file `dirent.h' reserves names prefixed with `d_'.
+-
+-   * The header file `fcntl.h' reserves names prefixed with `l_', `F_',
+-     `O_', and `S_'.
+-
+-   * The header file `grp.h' reserves names prefixed with `gr_'.
+-
+-   * The header file `limits.h' reserves names suffixed with `_MAX'.
+-
+-   * The header file `pwd.h' reserves names prefixed with `pw_'.
+-
+-   * The header file `signal.h' reserves names prefixed with `sa_' and
+-     `SA_'.
+-
+-   * The header file `sys/stat.h' reserves names prefixed with `st_'
+-     and `S_'.
+-
+-   * The header file `sys/times.h' reserves names prefixed with `tms_'.
+-
+-   * The header file `termios.h' reserves names prefixed with `c_',
+-     `V', `I', `O', and `TC'; and names prefixed with `B' followed by a
+-     digit.
+-
+-
+-File: libc.info,  Node: Feature Test Macros,  Prev: Reserved Names,  Up: Using the Library
+-
+-Feature Test Macros
+--------------------
+-
+-   The exact set of features available when you compile a source file
+-is controlled by which "feature test macros" you define.
+-
+-   If you compile your programs using `gcc -ansi', you get only the
+-ISO C library features, unless you explicitly request additional
+-features by defining one or more of the feature macros.  *Note GNU CC
+-Command Options: (gcc.info)Invoking GCC, for more information about GCC
+-options.
+-
+-   You should define these macros by using `#define' preprocessor
+-directives at the top of your source code files.  These directives
+-*must* come before any `#include' of a system header file.  It is best
+-to make them the very first thing in the file, preceded only by
+-comments.  You could also use the `-D' option to GCC, but it's better
+-if you make the source files indicate their own meaning in a
+-self-contained way.
+-
+-   This system exists to allow the library to conform to multiple
+-standards.  Although the different standards are often described as
+-supersets of each other, they are usually incompatible because larger
+-standards require functions with names that smaller ones reserve to the
+-user program.  This is not mere pedantry -- it has been a problem in
+-practice.  For instance, some non-GNU programs define functions named
+-`getline' that have nothing to do with this library's `getline'.  They
+-would not be compilable if all features were enabled indescriminantly.
+-
+-   This should not be used to verify that a program conforms to a
+-limited standard.  It is insufficent for this purpose, as it will not
+-protect you from including header files outside the standard, or
+-relying on semantics undefined within the standard.
+-
+- - Macro: _POSIX_SOURCE
+-     If you define this macro, then the functionality from the POSIX.1
+-     standard (IEEE Standard 1003.1) is available, as well as all of the
+-     ISO C facilities.
+-
+-     The state of `_POSIX_SOURCE' is irrelevant if you define the macro
+-     `_POSIX_C_SOURCE' to a positive integer.
+-
+- - Macro: _POSIX_C_SOURCE
+-     Define this macro to a positive integer to control which POSIX
+-     functionality is made available.  The greater the value of this
+-     macro, the more functionality is made available.
+-
+-     If you define this macro to a value greater than or equal to `1',
+-     then the functionality from the 1990 edition of the POSIX.1
+-     standard (IEEE Standard 1003.1-1990) is made available.
+-
+-     If you define this macro to a value greater than or equal to `2',
+-     then the functionality from the 1992 edition of the POSIX.2
+-     standard (IEEE Standard 1003.2-1992) is made available.
+-
+-     If you define this macro to a value greater than or equal to
+-     `199309L', then the functionality from the 1993 edition of the
+-     POSIX.1b standard (IEEE Standard 1003.1b-1993) is made available.
+-
+-     Greater values for `_POSIX_C_SOURCE' will enable future extensions.
+-     The POSIX standards process will define these values as necessary,
+-     and the GNU C Library should support them some time after they
+-     become standardized.  The 1996 edition of POSIX.1 (ISO/IEC 9945-1:
+-     1996) states that if you define `_POSIX_C_SOURCE' to a value
+-     greater than or equal to `199506L', then the functionality from
+-     the 1996 edition is made available.
+-
+-     The Single Unix Specification specify that setting this macro to
+-     the value `199506L' selects all the values specified by the POSIX
+-     standards plus those of the Single Unix Specification, i.e., is the
+-     same as if `_XOPEN_SOURCE' is set to `500' (see below).
+-
+- - Macro: _BSD_SOURCE
+-     If you define this macro, functionality derived from 4.3 BSD Unix
+-     is included as well as the ISO C, POSIX.1, and POSIX.2 material.
+-
+-     Some of the features derived from 4.3 BSD Unix conflict with the
+-     corresponding features specified by the POSIX.1 standard.  If this
+-     macro is defined, the 4.3 BSD definitions take precedence over the
+-     POSIX definitions.
+-
+-     Due to the nature of some of the conflicts between 4.3 BSD and
+-     POSIX.1, you need to use a special "BSD compatibility library"
+-     when linking programs compiled for BSD compatibility.  This is
+-     because some functions must be defined in two different ways, one
+-     of them in the normal C library, and one of them in the
+-     compatibility library.  If your program defines `_BSD_SOURCE', you
+-     must give the option `-lbsd-compat' to the compiler or linker when
+-     linking the program, to tell it to find functions in this special
+-     compatibility library before looking for them in the normal C
+-     library.
+-
+- - Macro: _SVID_SOURCE
+-     If you define this macro, functionality derived from SVID is
+-     included as well as the ISO C, POSIX.1, POSIX.2, and X/Open
+-     material.
+-
+- - Macro: _XOPEN_SOURCE
+- - Macro: _XOPEN_SOURCE_EXTENDED
+-     If you define this macro, functionality described in the X/Open
+-     Portability Guide is included.  This is a superset of the POSIX.1
+-     and POSIX.2 functionality and in fact `_POSIX_SOURCE' and
+-     `_POSIX_C_SOURCE' are automatically defined.
+-
+-     As the unification of all Unices, functionality only available in
+-     BSD and SVID is also included.
+-
+-     If the macro `_XOPEN_SOURCE_EXTENDED' is also defined, even more
+-     functionality is available.  The extra functions will make all
+-     functions available which are necessary for the X/Open Unix brand.
+-
+-     If the macro `_XOPEN_SOURCE' has the value 500 this includes all
+-     functionality described so far plus some new definitions from the
+-     Single Unix Specification, version 2.
+-
+- - Macro: _LARGEFILE_SOURCE
+-     If this macro is defined some extra functions are available which
+-     rectify a few shortcomings in all previous standards.  More
+-     concrete the functions `fseeko' and `ftello' are available.
+-     Without these functions the difference between the ISO C interface
+-     (`fseek', `ftell') and the low-level POSIX interface (`lseek')
+-     would lead to problems.
+-
+-     This macro was introduced as part of the Large File Support
+-     extension (LFS).
+-
+- - Macro: _LARGEFILE64_SOURCE
+-     If you define this macro an additional set of function gets
+-     available which enables to use on 32 bit systems to use files of
+-     sizes beyond the usual limit of 2GB.  This interface is not
+-     available if the system does not support files that large.  On
+-     systems where the natural file size limit is greater than 2GB
+-     (i.e., on 64 bit systems) the new functions are identical to the
+-     replaced functions.
+-
+-     The new functionality is made available by a new set of types and
+-     functions which replace existing.  The names of these new objects
+-     contain `64' to indicate the intention, e.g., `off_t' vs.
+-     `off64_t' and `fseeko' vs. `fseeko64'.
+-
+-     This macro was introduced as part of the Large File Support
+-     extension (LFS).  It is a transition interface for the time 64 bit
+-     offsets are not generally used (see `_FILE_OFFSET_BITS'.
+-
+- - Macro: _FILE_OFFSET_BITS
+-     This macro lets decide which file system interface shall be used,
+-     one replacing the other.  While `_LARGEFILE64_SOURCE' makes the
+-     64 bit interface available as an additional interface
+-     `_FILE_OFFSET_BITS' allows to use the 64 bit interface to replace
+-     the old interface.
+-
+-     If `_FILE_OFFSET_BITS' is undefined or if it is defined to the
+-     value `32' nothing changes.  The 32 bit interface is used and
+-     types like `off_t' have a size of 32 bits on 32 bit systems.
+-
+-     If the macro is defined to the value `64' the large file interface
+-     replaces the old interface.  I.e., the functions are not made
+-     available under different names as `_LARGEFILE64_SOURCE' does.
+-     Instead the old function names now reference the new functions,
+-     e.g., a call to `fseeko' now indeed calls `fseeko64'.
+-
+-     This macro should only be selected if the system provides
+-     mechanisms for handling large files.  On 64 bit systems this macro
+-     has no effect since the `*64' functions are identical to the
+-     normal functions.
+-
+-     This macro was introduced as part of the Large File Support
+-     extension (LFS).
+-
+- - Macro: _GNU_SOURCE
+-     If you define this macro, everything is included: ISO C, POSIX.1,
+-     POSIX.2, BSD, SVID, X/Open, LFS, and GNU extensions.  In the cases
+-     where POSIX.1 conflicts with BSD, the POSIX definitions take
+-     precedence.
+-
+-     If you want to get the full effect of `_GNU_SOURCE' but make the
+-     BSD definitions take precedence over the POSIX definitions, use
+-     this sequence of definitions:
+-
+-          #define _GNU_SOURCE
+-          #define _BSD_SOURCE
+-          #define _SVID_SOURCE
+-
+-     Note that if you do this, you must link your program with the BSD
+-     compatibility library by passing the `-lbsd-compat' option to the
+-     compiler or linker.  *Note:* If you forget to do this, you may get
+-     very strange errors at run time.
+-
+- - Macro: _REENTRANT
+- - Macro: _THREAD_SAFE
+-     If you define one of these macros, reentrant versions of several
+-     functions get declared.  Some of the functions are specified in
+-     POSIX.1c but many others are only available on a few other systems
+-     or are unique to GNU libc.  The problem is that the
+-     standardization of the thread safe C library interface still is
+-     behind.
+-
+-     Unlike on some other systems no special version of the C library
+-     must be used for linking.  There is only one version but while
+-     compiling this it must have been specified to compile as thread
+-     safe.
+-
+-   We recommend you use `_GNU_SOURCE' in new programs.  If you don't
+-specify the `-ansi' option to GCC and don't define any of these macros
+-explicitly, the effect is the same as defining `_POSIX_C_SOURCE' to 2
+-and `_POSIX_SOURCE', `_SVID_SOURCE', and `_BSD_SOURCE' to 1.
+-
+-   When you define a feature test macro to request a larger class of
+-features, it is harmless to define in addition a feature test macro for
+-a subset of those features.  For example, if you define
+-`_POSIX_C_SOURCE', then defining `_POSIX_SOURCE' as well has no effect.
+-Likewise, if you define `_GNU_SOURCE', then defining either
+-`_POSIX_SOURCE' or `_POSIX_C_SOURCE' or `_SVID_SOURCE' as well has no
+-effect.
+-
+-   Note, however, that the features of `_BSD_SOURCE' are not a subset of
+-any of the other feature test macros supported.  This is because it
+-defines BSD features that take precedence over the POSIX features that
+-are requested by the other macros.  For this reason, defining
+-`_BSD_SOURCE' in addition to the other feature test macros does have an
+-effect: it causes the BSD features to take priority over the conflicting
+-POSIX features.
+-
+-
+-File: libc.info,  Node: Roadmap to the Manual,  Prev: Using the Library,  Up: Introduction
+-
+-Roadmap to the Manual
+-=====================
+-
+-   Here is an overview of the contents of the remaining chapters of
+-this manual.
+-
+-   * *Note Error Reporting::, describes how errors detected by the
+-     library are reported.
+-
+-   * *Note Language Features::, contains information about library
+-     support for standard parts of the C language, including things
+-     like the `sizeof' operator and the symbolic constant `NULL', how
+-     to write functions accepting variable numbers of arguments, and
+-     constants describing the ranges and other properties of the
+-     numerical types.  There is also a simple debugging mechanism which
+-     allows you to put assertions in your code, and have diagnostic
+-     messages printed if the tests fail.
+-
+-   * *Note Memory Allocation::, describes the GNU library's facilities
+-     for dynamic allocation of storage.  If you do not know in advance
+-     how much storage your program needs, you can allocate it
+-     dynamically instead, and manipulate it via pointers.
+-
+-   * *Note Character Handling::, contains information about character
+-     classification functions (such as `isspace') and functions for
+-     performing case conversion.
+-
+-   * *Note String and Array Utilities::, has descriptions of functions
+-     for manipulating strings (null-terminated character arrays) and
+-     general byte arrays, including operations such as copying and
+-     comparison.
+-
+-   * *Note I/O Overview::, gives an overall look at the input and output
+-     facilities in the library, and contains information about basic
+-     concepts such as file names.
+-
+-   * *Note I/O on Streams::, describes I/O operations involving streams
+-     (or `FILE *' objects).  These are the normal C library functions
+-     from `stdio.h'.
+-
+-   * *Note Low-Level I/O::, contains information about I/O operations
+-     on file descriptors.  File descriptors are a lower-level mechanism
+-     specific to the Unix family of operating systems.
+-
+-   * *Note File System Interface::, has descriptions of operations on
+-     entire files, such as functions for deleting and renaming them and
+-     for creating new directories.  This chapter also contains
+-     information about how you can access the attributes of a file,
+-     such as its owner and file protection modes.
+-
+-   * *Note Pipes and FIFOs::, contains information about simple
+-     interprocess communication mechanisms.  Pipes allow communication
+-     between two related processes (such as between a parent and
+-     child), while FIFOs allow communication between processes sharing
+-     a common file system on the same machine.
+-
+-   * *Note Sockets::, describes a more complicated interprocess
+-     communication mechanism that allows processes running on different
+-     machines to communicate over a network.  This chapter also
+-     contains information about Internet host addressing and how to use
+-     the system network databases.
+-
+-   * *Note Low-Level Terminal Interface::, describes how you can change
+-     the attributes of a terminal device.  If you want to disable echo
+-     of characters typed by the user, for example, read this chapter.
+-
+-   * *Note Mathematics::, contains information about the math library
+-     functions.  These include things like random-number generators and
+-     remainder functions on integers as well as the usual trigonometric
+-     and exponential functions on floating-point numbers.
+-
+-   * *Note Low-Level Arithmetic Functions: Arithmetic, describes
+-     functions for simple arithmetic, analysis of floating-point
+-     values, and reading numbers from strings.
+-
+-   * *Note Searching and Sorting::, contains information about functions
+-     for searching and sorting arrays.  You can use these functions on
+-     any kind of array by providing an appropriate comparison function.
+-
+-   * *Note Pattern Matching::, presents functions for matching regular
+-     expressions and shell file name patterns, and for expanding words
+-     as the shell does.
+-
+-   * *Note Date and Time::, describes functions for measuring both
+-     calendar time and CPU time, as well as functions for setting
+-     alarms and timers.
+-
+-   * *Note Character Set Handling::, contains information about
+-     manipulating characters and strings using character sets larger
+-     than will fit in the usual `char' data type.
+-
+-   * *Note Locales::, describes how selecting a particular country or
+-     language affects the behavior of the library.  For example, the
+-     locale affects collation sequences for strings and how monetary
+-     values are formatted.
+-
+-   * *Note Non-Local Exits::, contains descriptions of the `setjmp' and
+-     `longjmp' functions.  These functions provide a facility for
+-     `goto'-like jumps which can jump from one function to another.
+-
+-   * *Note Signal Handling::, tells you all about signals--what they
+-     are, how to establish a handler that is called when a particular
+-     kind of signal is delivered, and how to prevent signals from
+-     arriving during critical sections of your program.
+-
+-   * *Note Process Startup::, tells how your programs can access their
+-     command-line arguments and environment variables.
+-
+-   * *Note Processes::, contains information about how to start new
+-     processes and run programs.
+-
+-   * *Note Job Control::, describes functions for manipulating process
+-     groups and the controlling terminal.  This material is probably
+-     only of interest if you are writing a shell or other program which
+-     handles job control specially.
+-
+-   * *Note Name Service Switch::, describes the services which are
+-     available for looking up names in the system databases, how to
+-     determine which service is used for which database, and how these
+-     services are implemented so that contributors can design their own
+-     services.
+-
+-   * *Note User Database::, and *Note Group Database::, tell you how to
+-     access the system user and group databases.
+-
+-   * *Note System Information::, describes functions for getting
+-     information about the hardware and software configuration your
+-     program is executing under.
+-
+-   * *Note System Configuration::, tells you how you can get
+-     information about various operating system limits.  Most of these
+-     parameters are provided for compatibility with POSIX.
+-
+-   * *Note Library Summary::, gives a summary of all the functions,
+-     variables, and macros in the library, with complete data types and
+-     function prototypes, and says what standard or system each is
+-     derived from.
+-
+-   * *Note Maintenance::, explains how to build and install the GNU C
+-     library on your system, how to report any bugs you might find, and
+-     how to add new functions or port the library to a new system.
+-
+-   If you already know the name of the facility you are interested in,
+-you can look it up in *Note Library Summary::.  This gives you a
+-summary of its syntax and a pointer to where you can find a more
+-detailed description.  This appendix is particularly useful if you just
+-want to verify the order and type of arguments to a function, for
+-example.  It also tells you what standard or system each function,
+-variable, or macro is derived from.
+-
+-
+-File: libc.info,  Node: Error Reporting,  Next: Memory Allocation,  Prev: Introduction,  Up: Top
+-
+-Error Reporting
+-***************
+-
+-   Many functions in the GNU C library detect and report error
+-conditions, and sometimes your programs need to check for these error
+-conditions.  For example, when you open an input file, you should
+-verify that the file was actually opened correctly, and print an error
+-message or take other appropriate action if the call to the library
+-function failed.
+-
+-   This chapter describes how the error reporting facility works.  Your
+-program should include the header file `errno.h' to use this facility.
+-
+-* Menu:
+-
+-* Checking for Errors::         How errors are reported by library functions.
+-* Error Codes::                 Error code macros; all of these expand
+-                                 into integer constant values.
+-* Error Messages::              Mapping error codes onto error messages.
+-
+-
+-File: libc.info,  Node: Checking for Errors,  Next: Error Codes,  Up: Error Reporting
+-
+-Checking for Errors
+-===================
+-
+-   Most library functions return a special value to indicate that they
+-have failed.  The special value is typically `-1', a null pointer, or a
+-constant such as `EOF' that is defined for that purpose.  But this
+-return value tells you only that an error has occurred.  To find out
+-what kind of error it was, you need to look at the error code stored in
+-the variable `errno'.  This variable is declared in the header file
+-`errno.h'.
+-
+- - Variable: volatile int errno
+-     The variable `errno' contains the system error number.  You can
+-     change the value of `errno'.
+-
+-     Since `errno' is declared `volatile', it might be changed
+-     asynchronously by a signal handler; see *Note Defining Handlers::.
+-     However, a properly written signal handler saves and restores the
+-     value of `errno', so you generally do not need to worry about this
+-     possibility except when writing signal handlers.
+-
+-     The initial value of `errno' at program startup is zero.  Many
+-     library functions are guaranteed to set it to certain nonzero
+-     values when they encounter certain kinds of errors.  These error
+-     conditions are listed for each function.  These functions do not
+-     change `errno' when they succeed; thus, the value of `errno' after
+-     a successful call is not necessarily zero, and you should not use
+-     `errno' to determine *whether* a call failed.  The proper way to
+-     do that is documented for each function.  *If* the call the
+-     failed, you can examine `errno'.
+-
+-     Many library functions can set `errno' to a nonzero value as a
+-     result of calling other library functions which might fail.  You
+-     should assume that any library function might alter `errno' when
+-     the function returns an error.
+-
+-     *Portability Note:* ISO C specifies `errno' as a "modifiable
+-     lvalue" rather than as a variable, permitting it to be implemented
+-     as a macro.  For example, its expansion might involve a function
+-     call, like `*_errno ()'.  In fact, that is what it is on the GNU
+-     system itself.  The GNU library, on non-GNU systems, does whatever
+-     is right for the particular system.
+-
+-     There are a few library functions, like `sqrt' and `atan', that
+-     return a perfectly legitimate value in case of an error, but also
+-     set `errno'.  For these functions, if you want to check to see
+-     whether an error occurred, the recommended method is to set `errno'
+-     to zero before calling the function, and then check its value
+-     afterward.
+-
+-   All the error codes have symbolic names; they are macros defined in
+-`errno.h'.  The names start with `E' and an upper-case letter or digit;
+-you should consider names of this form to be reserved names.  *Note
+-Reserved Names::.
+-
+-   The error code values are all positive integers and are all distinct,
+-with one exception: `EWOULDBLOCK' and `EAGAIN' are the same.  Since the
+-values are distinct, you can use them as labels in a `switch'
+-statement; just don't use both `EWOULDBLOCK' and `EAGAIN'.  Your
+-program should not make any other assumptions about the specific values
+-of these symbolic constants.
+-
+-   The value of `errno' doesn't necessarily have to correspond to any
+-of these macros, since some library functions might return other error
+-codes of their own for other situations.  The only values that are
+-guaranteed to be meaningful for a particular library function are the
+-ones that this manual lists for that function.
+-
+-   On non-GNU systems, almost any system call can return `EFAULT' if it
+-is given an invalid pointer as an argument.  Since this could only
+-happen as a result of a bug in your program, and since it will not
+-happen on the GNU system, we have saved space by not mentioning
+-`EFAULT' in the descriptions of individual functions.
+-
+-   In some Unix systems, many system calls can also return `EFAULT' if
+-given as an argument a pointer into the stack, and the kernel for some
+-obscure reason fails in its attempt to extend the stack.  If this ever
+-happens, you should probably try using statically or dynamically
+-allocated memory instead of stack memory on that system.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-20 glibc-2.1.3/manual/libc.info-20
+--- ../glibc-2.1.3/manual/libc.info-20	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-20	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1238 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: File Status Flags,  Next: File Locks,  Prev: Descriptor Flags,  Up: Low-Level I/O
+-
+-File Status Flags
+-=================
+-
+-   "File status flags" are used to specify attributes of the opening of
+-a file.  Unlike the file descriptor flags discussed in *Note Descriptor
+-Flags::, the file status flags are shared by duplicated file descriptors
+-resulting from a single opening of the file.  The file status flags are
+-specified with the FLAGS argument to `open'; *note Opening and Closing
+-Files::..
+-
+-   File status flags fall into three categories, which are described in
+-the following sections.
+-
+-   * *Note Access Modes::, specify what type of access is allowed to the
+-     file: reading, writing, or both.  They are set by `open' and are
+-     returned by `fcntl', but cannot be changed.
+-
+-   * *Note Open-time Flags::, control details of what `open' will do.
+-     These flags are not preserved after the `open' call.
+-
+-   * *Note Operating Modes::, affect how operations such as `read' and
+-     `write' are done.  They are set by `open', and can be fetched or
+-     changed with `fcntl'.
+-
+-   The symbols in this section are defined in the header file `fcntl.h'.
+-
+-* Menu:
+-
+-* Access Modes::                Whether the descriptor can read or write.
+-* Open-time Flags::             Details of `open'.
+-* Operating Modes::             Special modes to control I/O operations.
+-* Getting File Status Flags::   Fetching and changing these flags.
+-
+-
+-File: libc.info,  Node: Access Modes,  Next: Open-time Flags,  Up: File Status Flags
+-
+-File Access Modes
+------------------
+-
+-   The file access modes allow a file descriptor to be used for reading,
+-writing, or both.  (In the GNU system, they can also allow none of
+-these, and allow execution of the file as a program.)  The access modes
+-are chosen when the file is opened, and never change.
+-
+- - Macro: int O_RDONLY
+-     Open the file for read access.
+-
+- - Macro: int O_WRONLY
+-     Open the file for write access.
+-
+- - Macro: int O_RDWR
+-     Open the file for both reading and writing.
+-
+-   In the GNU system (and not in other systems), `O_RDONLY' and
+-`O_WRONLY' are independent bits that can be bitwise-ORed together, and
+-it is valid for either bit to be set or clear.  This means that
+-`O_RDWR' is the same as `O_RDONLY|O_WRONLY'.  A file access mode of
+-zero is permissible; it allows no operations that do input or output to
+-the file, but does allow other operations such as `fchmod'.  On the GNU
+-system, since "read-only" or "write-only" is a misnomer, `fcntl.h'
+-defines additional names for the file access modes.  These names are
+-preferred when writing GNU-specific code.  But most programs will want
+-to be portable to other POSIX.1 systems and should use the POSIX.1
+-names above instead.
+-
+- - Macro: int O_READ
+-     Open the file for reading.  Same as `O_RDWR'; only defined on GNU.
+-
+- - Macro: int O_WRITE
+-     Open the file for reading.  Same as `O_WRONLY'; only defined on
+-     GNU.
+-
+- - Macro: int O_EXEC
+-     Open the file for executing.  Only defined on GNU.
+-
+-   To determine the file access mode with `fcntl', you must extract the
+-access mode bits from the retrieved file status flags.  In the GNU
+-system, you can just test the `O_READ' and `O_WRITE' bits in the flags
+-word.  But in other POSIX.1 systems, reading and writing access modes
+-are not stored as distinct bit flags.  The portable way to extract the
+-file access mode bits is with `O_ACCMODE'.
+-
+- - Macro: int O_ACCMODE
+-     This macro stands for a mask that can be bitwise-ANDed with the
+-     file status flag value to produce a value representing the file
+-     access mode.  The mode will be `O_RDONLY', `O_WRONLY', or `O_RDWR'.
+-     (In the GNU system it could also be zero, and it never includes the
+-     `O_EXEC' bit.)
+-
+-
+-File: libc.info,  Node: Open-time Flags,  Next: Operating Modes,  Prev: Access Modes,  Up: File Status Flags
+-
+-Open-time Flags
+----------------
+-
+-   The open-time flags specify options affecting how `open' will behave.
+-These options are not preserved once the file is open.  The exception to
+-this is `O_NONBLOCK', which is also an I/O operating mode and so it
+-*is* saved.  *Note Opening and Closing Files::, for how to call `open'.
+-
+-   There are two sorts of options specified by open-time flags.
+-
+-   * "File name translation flags" affect how `open' looks up the file
+-     name to locate the file, and whether the file can be created.
+-
+-   * "Open-time action flags" specify extra operations that `open' will
+-     perform on the file once it is open.
+-
+-   Here are the file name translation flags.
+-
+- - Macro: int O_CREAT
+-     If set, the file will be created if it doesn't already exist.
+-
+- - Macro: int O_EXCL
+-     If both `O_CREAT' and `O_EXCL' are set, then `open' fails if the
+-     specified file already exists.  This is guaranteed to never
+-     clobber an existing file.
+-
+- - Macro: int O_NONBLOCK
+-     This prevents `open' from blocking for a "long time" to open the
+-     file.  This is only meaningful for some kinds of files, usually
+-     devices such as serial ports; when it is not meaningful, it is
+-     harmless and ignored.  Often opening a port to a modem blocks
+-     until the modem reports carrier detection; if `O_NONBLOCK' is
+-     specified, `open' will return immediately without a carrier.
+-
+-     Note that the `O_NONBLOCK' flag is overloaded as both an I/O
+-     operating mode and a file name translation flag.  This means that
+-     specifying `O_NONBLOCK' in `open' also sets nonblocking I/O mode;
+-     *note Operating Modes::..  To open the file without blocking but
+-     do normal I/O that blocks, you must call `open' with `O_NONBLOCK'
+-     set and then call `fcntl' to turn the bit off.
+-
+- - Macro: int O_NOCTTY
+-     If the named file is a terminal device, don't make it the
+-     controlling terminal for the process.  *Note Job Control::, for
+-     information about what it means to be the controlling terminal.
+-
+-     In the GNU system and 4.4 BSD, opening a file never makes it the
+-     controlling terminal and `O_NOCTTY' is zero.  However, other
+-     systems may use a nonzero value for `O_NOCTTY' and set the
+-     controlling terminal when you open a file that is a terminal
+-     device; so to be portable, use `O_NOCTTY' when it is important to
+-     avoid this.
+-
+-   The following three file name translation flags exist only in the
+-GNU system.
+-
+- - Macro: int O_IGNORE_CTTY
+-     Do not recognize the named file as the controlling terminal, even
+-     if it refers to the process's existing controlling terminal
+-     device.  Operations on the new file descriptor will never induce
+-     job control signals.  *Note Job Control::.
+-
+- - Macro: int O_NOLINK
+-     If the named file is a symbolic link, open the link itself instead
+-     of the file it refers to.  (`fstat' on the new file descriptor will
+-     return the information returned by `lstat' on the link's name.)
+-
+- - Macro: int O_NOTRANS
+-     If the named file is specially translated, do not invoke the
+-     translator.  Open the bare file the translator itself sees.
+-
+-   The open-time action flags tell `open' to do additional operations
+-which are not really related to opening the file.  The reason to do them
+-as part of `open' instead of in separate calls is that `open' can do
+-them atomically.
+-
+- - Macro: int O_TRUNC
+-     Truncate the file to zero length.  This option is only useful for
+-     regular files, not special files such as directories or FIFOs.
+-     POSIX.1 requires that you open the file for writing to use
+-     `O_TRUNC'.  In BSD and GNU you must have permission to write the
+-     file to truncate it, but you need not open for write access.
+-
+-     This is the only open-time action flag specified by POSIX.1.
+-     There is no good reason for truncation to be done by `open',
+-     instead of by calling `ftruncate' afterwards.  The `O_TRUNC' flag
+-     existed in Unix before `ftruncate' was invented, and is retained
+-     for backward compatibility.
+-
+-   The remaining operating modes are BSD extensions.  They exist only
+-on some systems.  On other systems, these macros are not defined.
+-
+- - Macro: int O_SHLOCK
+-     Acquire a shared lock on the file, as with `flock'.  *Note File
+-     Locks::.
+-
+-     If `O_CREAT' is specified, the locking is done atomically when
+-     creating the file.  You are guaranteed that no other process will
+-     get the lock on the new file first.
+-
+- - Macro: int O_EXLOCK
+-     Acquire an exclusive lock on the file, as with `flock'.  *Note
+-     File Locks::.  This is atomic like `O_SHLOCK'.
+-
+-
+-File: libc.info,  Node: Operating Modes,  Next: Getting File Status Flags,  Prev: Open-time Flags,  Up: File Status Flags
+-
+-I/O Operating Modes
+--------------------
+-
+-   The operating modes affect how input and output operations using a
+-file descriptor work.  These flags are set by `open' and can be fetched
+-and changed with `fcntl'.
+-
+- - Macro: int O_APPEND
+-     The bit that enables append mode for the file.  If set, then all
+-     `write' operations write the data at the end of the file, extending
+-     it, regardless of the current file position.  This is the only
+-     reliable way to append to a file.  In append mode, you are
+-     guaranteed that the data you write will always go to the current
+-     end of the file, regardless of other processes writing to the
+-     file.  Conversely, if you simply set the file position to the end
+-     of file and write, then another process can extend the file after
+-     you set the file position but before you write, resulting in your
+-     data appearing someplace before the real end of file.
+-
+- - Macro: int O_NONBLOCK
+-     The bit that enables nonblocking mode for the file.  If this bit
+-     is set, `read' requests on the file can return immediately with a
+-     failure status if there is no input immediately available, instead
+-     of blocking.  Likewise, `write' requests can also return
+-     immediately with a failure status if the output can't be written
+-     immediately.
+-
+-     Note that the `O_NONBLOCK' flag is overloaded as both an I/O
+-     operating mode and a file name translation flag; *note Open-time
+-     Flags::..
+-
+- - Macro: int O_NDELAY
+-     This is an obsolete name for `O_NONBLOCK', provided for
+-     compatibility with BSD.  It is not defined by the POSIX.1 standard.
+-
+-   The remaining operating modes are BSD and GNU extensions.  They
+-exist only on some systems.  On other systems, these macros are not
+-defined.
+-
+- - Macro: int O_ASYNC
+-     The bit that enables asynchronous input mode.  If set, then `SIGIO'
+-     signals will be generated when input is available.  *Note
+-     Interrupt Input::.
+-
+-     Asynchronous input mode is a BSD feature.
+-
+- - Macro: int O_FSYNC
+-     The bit that enables synchronous writing for the file.  If set,
+-     each `write' call will make sure the data is reliably stored on
+-     disk before returning.  Synchronous writing is a BSD feature.
+-
+- - Macro: int O_SYNC
+-     This is another name for `O_FSYNC'.  They have the same value.
+-
+- - Macro: int O_NOATIME
+-     If this bit is set, `read' will not update the access time of the
+-     file.  *Note File Times::.  This is used by programs that do
+-     backups, so that backing a file up does not count as reading it.
+-     Only the owner of the file or the superuser may use this bit.
+-
+-     This is a GNU extension.
+-
+-
+-File: libc.info,  Node: Getting File Status Flags,  Prev: Operating Modes,  Up: File Status Flags
+-
+-Getting and Setting File Status Flags
+--------------------------------------
+-
+-   The `fcntl' function can fetch or change file status flags.
+-
+- - Macro: int F_GETFL
+-     This macro is used as the COMMAND argument to `fcntl', to read the
+-     file status flags for the open file with descriptor FILEDES.
+-
+-     The normal return value from `fcntl' with this command is a
+-     nonnegative number which can be interpreted as the bitwise OR of
+-     the individual flags.  Since the file access modes are not
+-     single-bit values, you can mask off other bits in the returned
+-     flags with `O_ACCMODE' to compare them.
+-
+-     In case of an error, `fcntl' returns -1.  The following `errno'
+-     error conditions are defined for this command:
+-
+-    `EBADF'
+-          The FILEDES argument is invalid.
+-
+- - Macro: int F_SETFL
+-     This macro is used as the COMMAND argument to `fcntl', to set the
+-     file status flags for the open file corresponding to the FILEDES
+-     argument.  This command requires a third `int' argument to specify
+-     the new flags, so the call looks like this:
+-
+-          fcntl (FILEDES, F_SETFL, NEW-FLAGS)
+-
+-     You can't change the access mode for the file in this way; that is,
+-     whether the file descriptor was opened for reading or writing.
+-
+-     The normal return value from `fcntl' with this command is an
+-     unspecified value other than -1, which indicates an error.  The
+-     error conditions are the same as for the `F_GETFL' command.
+-
+-   If you want to modify the file status flags, you should get the
+-current flags with `F_GETFL' and modify the value.  Don't assume that
+-the flags listed here are the only ones that are implemented; your
+-program may be run years from now and more flags may exist then.  For
+-example, here is a function to set or clear the flag `O_NONBLOCK'
+-without altering any other flags:
+-
+-     /* Set the `O_NONBLOCK' flag of DESC if VALUE is nonzero,
+-        or clear the flag if VALUE is 0.
+-        Return 0 on success, or -1 on error with `errno' set. */
+-     
+-     int
+-     set_nonblock_flag (int desc, int value)
+-     {
+-       int oldflags = fcntl (desc, F_GETFL, 0);
+-       /* If reading the flags failed, return error indication now. */
+-       if (oldflags == -1)
+-         return -1;
+-       /* Set just the flag we want to set. */
+-       if (value != 0)
+-         oldflags |= O_NONBLOCK;
+-       else
+-         oldflags &= ~O_NONBLOCK;
+-       /* Store modified flag word in the descriptor. */
+-       return fcntl (desc, F_SETFL, oldflags);
+-     }
+-
+-
+-File: libc.info,  Node: File Locks,  Next: Interrupt Input,  Prev: File Status Flags,  Up: Low-Level I/O
+-
+-File Locks
+-==========
+-
+-   The remaining `fcntl' commands are used to support "record locking",
+-which permits multiple cooperating programs to prevent each other from
+-simultaneously accessing parts of a file in error-prone ways.
+-
+-   An "exclusive" or "write" lock gives a process exclusive access for
+-writing to the specified part of the file.  While a write lock is in
+-place, no other process can lock that part of the file.
+-
+-   A "shared" or "read" lock prohibits any other process from
+-requesting a write lock on the specified part of the file.  However,
+-other processes can request read locks.
+-
+-   The `read' and `write' functions do not actually check to see
+-whether there are any locks in place.  If you want to implement a
+-locking protocol for a file shared by multiple processes, your
+-application must do explicit `fcntl' calls to request and clear locks
+-at the appropriate points.
+-
+-   Locks are associated with processes.  A process can only have one
+-kind of lock set for each byte of a given file.  When any file
+-descriptor for that file is closed by the process, all of the locks
+-that process holds on that file are released, even if the locks were
+-made using other descriptors that remain open.  Likewise, locks are
+-released when a process exits, and are not inherited by child processes
+-created using `fork' (*note Creating a Process::.).
+-
+-   When making a lock, use a `struct flock' to specify what kind of
+-lock and where.  This data type and the associated macros for the
+-`fcntl' function are declared in the header file `fcntl.h'.
+-
+- - Data Type: struct flock
+-     This structure is used with the `fcntl' function to describe a file
+-     lock.  It has these members:
+-
+-    `short int l_type'
+-          Specifies the type of the lock; one of `F_RDLCK', `F_WRLCK',
+-          or `F_UNLCK'.
+-
+-    `short int l_whence'
+-          This corresponds to the WHENCE argument to `fseek' or
+-          `lseek', and specifies what the offset is relative to.  Its
+-          value can be one of `SEEK_SET', `SEEK_CUR', or `SEEK_END'.
+-
+-    `off_t l_start'
+-          This specifies the offset of the start of the region to which
+-          the lock applies, and is given in bytes relative to the point
+-          specified by `l_whence' member.
+-
+-    `off_t l_len'
+-          This specifies the length of the region to be locked.  A
+-          value of `0' is treated specially; it means the region
+-          extends to the end of the file.
+-
+-    `pid_t l_pid'
+-          This field is the process ID (*note Process Creation
+-          Concepts::.) of the process holding the lock.  It is filled
+-          in by calling `fcntl' with the `F_GETLK' command, but is
+-          ignored when making a lock.
+-
+- - Macro: int F_GETLK
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should get information about a lock.  This command
+-     requires a third argument of type `struct flock *' to be passed to
+-     `fcntl', so that the form of the call is:
+-
+-          fcntl (FILEDES, F_GETLK, LOCKP)
+-
+-     If there is a lock already in place that would block the lock
+-     described by the LOCKP argument, information about that lock
+-     overwrites `*LOCKP'.  Existing locks are not reported if they are
+-     compatible with making a new lock as specified.  Thus, you should
+-     specify a lock type of `F_WRLCK' if you want to find out about both
+-     read and write locks, or `F_RDLCK' if you want to find out about
+-     write locks only.
+-
+-     There might be more than one lock affecting the region specified
+-     by the LOCKP argument, but `fcntl' only returns information about
+-     one of them.  The `l_whence' member of the LOCKP structure is set
+-     to `SEEK_SET' and the `l_start' and `l_len' fields set to identify
+-     the locked region.
+-
+-     If no lock applies, the only change to the LOCKP structure is to
+-     update the `l_type' to a value of `F_UNLCK'.
+-
+-     The normal return value from `fcntl' with this command is an
+-     unspecified value other than -1, which is reserved to indicate an
+-     error.  The following `errno' error conditions are defined for
+-     this command:
+-
+-    `EBADF'
+-          The FILEDES argument is invalid.
+-
+-    `EINVAL'
+-          Either the LOCKP argument doesn't specify valid lock
+-          information, or the file associated with FILEDES doesn't
+-          support locks.
+-
+- - Macro: int F_SETLK
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should set or clear a lock.  This command requires a third
+-     argument of type `struct flock *' to be passed to `fcntl', so that
+-     the form of the call is:
+-
+-          fcntl (FILEDES, F_SETLK, LOCKP)
+-
+-     If the process already has a lock on any part of the region, the
+-     old lock on that part is replaced with the new lock.  You can
+-     remove a lock by specifying a lock type of `F_UNLCK'.
+-
+-     If the lock cannot be set, `fcntl' returns immediately with a value
+-     of -1.  This function does not block waiting for other processes
+-     to release locks.  If `fcntl' succeeds, it return a value other
+-     than -1.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EAGAIN'
+-    `EACCES'
+-          The lock cannot be set because it is blocked by an existing
+-          lock on the file.  Some systems use `EAGAIN' in this case,
+-          and other systems use `EACCES'; your program should treat
+-          them alike, after `F_SETLK'.  (The GNU system always uses
+-          `EAGAIN'.)
+-
+-    `EBADF'
+-          Either: the FILEDES argument is invalid; you requested a read
+-          lock but the FILEDES is not open for read access; or, you
+-          requested a write lock but the FILEDES is not open for write
+-          access.
+-
+-    `EINVAL'
+-          Either the LOCKP argument doesn't specify valid lock
+-          information, or the file associated with FILEDES doesn't
+-          support locks.
+-
+-    `ENOLCK'
+-          The system has run out of file lock resources; there are
+-          already too many file locks in place.
+-
+-          Well-designed file systems never report this error, because
+-          they have no limitation on the number of locks.  However, you
+-          must still take account of the possibility of this error, as
+-          it could result from network access to a file system on
+-          another machine.
+-
+- - Macro: int F_SETLKW
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should set or clear a lock.  It is just like the `F_SETLK'
+-     command, but causes the process to block (or wait) until the
+-     request can be specified.
+-
+-     This command requires a third argument of type `struct flock *', as
+-     for the `F_SETLK' command.
+-
+-     The `fcntl' return values and errors are the same as for the
+-     `F_SETLK' command, but these additional `errno' error conditions
+-     are defined for this command:
+-
+-    `EINTR'
+-          The function was interrupted by a signal while it was waiting.
+-          *Note Interrupted Primitives::.
+-
+-    `EDEADLK'
+-          The specified region is being locked by another process.  But
+-          that process is waiting to lock a region which the current
+-          process has locked, so waiting for the lock would result in
+-          deadlock.  The system does not guarantee that it will detect
+-          all such conditions, but it lets you know if it notices one.
+-
+-   The following macros are defined for use as values for the `l_type'
+-member of the `flock' structure.  The values are integer constants.
+-
+-`F_RDLCK'
+-     This macro is used to specify a read (or shared) lock.
+-
+-`F_WRLCK'
+-     This macro is used to specify a write (or exclusive) lock.
+-
+-`F_UNLCK'
+-     This macro is used to specify that the region is unlocked.
+-
+-   As an example of a situation where file locking is useful, consider a
+-program that can be run simultaneously by several different users, that
+-logs status information to a common file.  One example of such a program
+-might be a game that uses a file to keep track of high scores.  Another
+-example might be a program that records usage or accounting information
+-for billing purposes.
+-
+-   Having multiple copies of the program simultaneously writing to the
+-file could cause the contents of the file to become mixed up.  But you
+-can prevent this kind of problem by setting a write lock on the file
+-before actually writing to the file.
+-
+-   If the program also needs to read the file and wants to make sure
+-that the contents of the file are in a consistent state, then it can
+-also use a read lock.  While the read lock is set, no other process can
+-lock that part of the file for writing.
+-
+-   Remember that file locks are only a *voluntary* protocol for
+-controlling access to a file.  There is still potential for access to
+-the file by programs that don't use the lock protocol.
+-
+-
+-File: libc.info,  Node: Interrupt Input,  Next: IOCTLs,  Prev: File Locks,  Up: Low-Level I/O
+-
+-Interrupt-Driven Input
+-======================
+-
+-   If you set the `O_ASYNC' status flag on a file descriptor (*note
+-File Status Flags::.), a `SIGIO' signal is sent whenever input or
+-output becomes possible on that file descriptor.  The process or
+-process group to receive the signal can be selected by using the
+-`F_SETOWN' command to the `fcntl' function.  If the file descriptor is
+-a socket, this also selects the recipient of `SIGURG' signals that are
+-delivered when out-of-band data arrives on that socket; see *Note
+-Out-of-Band Data::.  (`SIGURG' is sent in any situation where `select'
+-would report the socket as having an "exceptional condition".  *Note
+-Waiting for I/O::.)
+-
+-   If the file descriptor corresponds to a terminal device, then `SIGIO'
+-signals are sent to the foreground process group of the terminal.
+-*Note Job Control::.
+-
+-   The symbols in this section are defined in the header file `fcntl.h'.
+-
+- - Macro: int F_GETOWN
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should get information about the process or process group
+-     to which `SIGIO' signals are sent.  (For a terminal, this is
+-     actually the foreground process group ID, which you can get using
+-     `tcgetpgrp'; see *Note Terminal Access Functions::.)
+-
+-     The return value is interpreted as a process ID; if negative, its
+-     absolute value is the process group ID.
+-
+-     The following `errno' error condition is defined for this command:
+-
+-    `EBADF'
+-          The FILEDES argument is invalid.
+-
+- - Macro: int F_SETOWN
+-     This macro is used as the COMMAND argument to `fcntl', to specify
+-     that it should set the process or process group to which `SIGIO'
+-     signals are sent.  This command requires a third argument of type
+-     `pid_t' to be passed to `fcntl', so that the form of the call is:
+-
+-          fcntl (FILEDES, F_SETOWN, PID)
+-
+-     The PID argument should be a process ID.  You can also pass a
+-     negative number whose absolute value is a process group ID.
+-
+-     The return value from `fcntl' with this command is -1 in case of
+-     error and some other value if successful.  The following `errno'
+-     error conditions are defined for this command:
+-
+-    `EBADF'
+-          The FILEDES argument is invalid.
+-
+-    `ESRCH'
+-          There is no process or process group corresponding to PID.
+-
+-
+-File: libc.info,  Node: IOCTLs,  Prev: Interrupt Input,  Up: Low-Level I/O
+-
+-Generic I/O Control operations
+-==============================
+-
+-   The GNU system can handle most input/output operations on many
+-different devices and objects in terms of a few file primitives -
+-`read', `write' and `lseek'.  However, most devices also have a few
+-peculiar operations which do not fit into this model. Such as:
+-
+-   * Changing the character font used on a terminal.
+-
+-   * Telling a magnetic tape system to rewind or fast forward.  (Since
+-     they cannot move in byte increments, `lseek' is inapplicable).
+-
+-   * Ejecting a disk from a drive.
+-
+-   * Playing an audio track from a CD-ROM drive.
+-
+-   * Maintaining routing tables for a network.
+-
+-   Although some such objects such as sockets and terminals (1) have
+-special functions of their own, it would not be practical to create
+-functions for all these cases.
+-
+-   Instead these minor operations, known as "IOCTL"s, are assigned code
+-numbers and multiplexed through the `ioctl' function, defined in
+-`sys/ioctl.h'.  The code numbers themselves are defined in many
+-different headers.
+-
+- - Function: int ioctl (int FILEDES, int COMMAND, ...)
+-     The `ioctl' function performs the generic I/O operation COMMAND on
+-     FILEDES.
+-
+-     A third argument is usually present, either a single number or a
+-     pointer to a structure.  The meaning of this argument, the
+-     returned value, and any error codes depends upon the command used.
+-     Often -1 is returned for a failure.
+-
+-
+-   On some systems, IOCTLs used by different devices share the same
+-numbers.  Thus, although use of an inappropriate IOCTL *usually* only
+-produces an error, you should not attempt to use device-specific IOCTLs
+-on an unknown device.
+-
+-   Most IOCTLs are OS-specific and/or only used in special system
+-utilities, and are thus beyond the scope of this document.  For an
+-example of the use of an IOCTL, see *Note Out-of-Band Data::.
+-
+-   ---------- Footnotes ----------
+-
+-   (1) Actually, the terminal-specific functions are implemented with
+-IOCTLs on many platforms.
+-
+-
+-File: libc.info,  Node: File System Interface,  Next: Pipes and FIFOs,  Prev: Low-Level I/O,  Up: Top
+-
+-File System Interface
+-*********************
+-
+-   This chapter describes the GNU C library's functions for manipulating
+-files.  Unlike the input and output functions (*note I/O on Streams::.;
+-*note Low-Level I/O::.), these functions are concerned with operating
+-on the files themselves, rather than on their contents.
+-
+-   Among the facilities described in this chapter are functions for
+-examining or modifying directories, functions for renaming and deleting
+-files, and functions for examining and setting file attributes such as
+-access permissions and modification times.
+-
+-* Menu:
+-
+-* Working Directory::           This is used to resolve relative
+-				 file names.
+-* Accessing Directories::       Finding out what files a directory
+-				 contains.
+-* Working on Directory Trees::  Apply actions to all files or a selectable
+-                                 subset of a directory hierarchy.
+-* Hard Links::                  Adding alternate names to a file.
+-* Symbolic Links::              A file that "points to" a file name.
+-* Deleting Files::              How to delete a file, and what that means.
+-* Renaming Files::              Changing a file's name.
+-* Creating Directories::        A system call just for creating a directory.
+-* File Attributes::             Attributes of individual files.
+-* Making Special Files::        How to create special files.
+-* Temporary Files::             Naming and creating temporary files.
+-
+-
+-File: libc.info,  Node: Working Directory,  Next: Accessing Directories,  Up: File System Interface
+-
+-Working Directory
+-=================
+-
+-   Each process has associated with it a directory, called its "current
+-working directory" or simply "working directory", that is used in the
+-resolution of relative file names (*note File Name Resolution::.).
+-
+-   When you log in and begin a new session, your working directory is
+-initially set to the home directory associated with your login account
+-in the system user database.  You can find any user's home directory
+-using the `getpwuid' or `getpwnam' functions; see *Note User Database::.
+-
+-   Users can change the working directory using shell commands like
+-`cd'.  The functions described in this section are the primitives used
+-by those commands and by other programs for examining and changing the
+-working directory.
+-
+-   Prototypes for these functions are declared in the header file
+-`unistd.h'.
+-
+- - Function: char * getcwd (char *BUFFER, size_t SIZE)
+-     The `getcwd' function returns an absolute file name representing
+-     the current working directory, storing it in the character array
+-     BUFFER that you provide.  The SIZE argument is how you tell the
+-     system the allocation size of BUFFER.
+-
+-     The GNU library version of this function also permits you to
+-     specify a null pointer for the BUFFER argument.  Then `getcwd'
+-     allocates a buffer automatically, as with `malloc' (*note
+-     Unconstrained Allocation::.).  If the SIZE is greater than zero,
+-     then the buffer is that large; otherwise, the buffer is as large
+-     as necessary to hold the result.
+-
+-     The return value is BUFFER on success and a null pointer on
+-     failure.  The following `errno' error conditions are defined for
+-     this function:
+-
+-    `EINVAL'
+-          The SIZE argument is zero and BUFFER is not a null pointer.
+-
+-    `ERANGE'
+-          The SIZE argument is less than the length of the working
+-          directory name.  You need to allocate a bigger array and try
+-          again.
+-
+-    `EACCES'
+-          Permission to read or search a component of the file name was
+-          denied.
+-
+-   You could implement the behavior of GNU's `getcwd (NULL, 0)' using
+-only the standard behavior of `getcwd':
+-
+-     char *
+-     gnu_getcwd ()
+-     {
+-       int size = 100;
+-       char *buffer = (char *) xmalloc (size);
+-     
+-       while (1)
+-         {
+-           char *value = getcwd (buffer, size);
+-           if (value != 0)
+-             return buffer;
+-           size *= 2;
+-           free (buffer);
+-           buffer = (char *) xmalloc (size);
+-         }
+-     }
+-
+-*Note Malloc Examples::, for information about `xmalloc', which is not
+-a library function but is a customary name used in most GNU software.
+-
+- - Function: char * getwd (char *BUFFER)
+-     This is similar to `getcwd', but has no way to specify the size of
+-     the buffer.  The GNU library provides `getwd' only for backwards
+-     compatibility with BSD.
+-
+-     The BUFFER argument should be a pointer to an array at least
+-     `PATH_MAX' bytes long (*note Limits for Files::.).  In the GNU
+-     system there is no limit to the size of a file name, so this is not
+-     necessarily enough space to contain the directory name.  That is
+-     why this function is deprecated.
+-
+- - Function: int chdir (const char *FILENAME)
+-     This function is used to set the process's working directory to
+-     FILENAME.
+-
+-     The normal, successful return value from `chdir' is `0'.  A value
+-     of `-1' is returned to indicate an error.  The `errno' error
+-     conditions defined for this function are the usual file name
+-     syntax errors (*note File Name Errors::.), plus `ENOTDIR' if the
+-     file FILENAME is not a directory.
+-
+-
+-File: libc.info,  Node: Accessing Directories,  Next: Working on Directory Trees,  Prev: Working Directory,  Up: File System Interface
+-
+-Accessing Directories
+-=====================
+-
+-   The facilities described in this section let you read the contents
+-of a directory file.  This is useful if you want your program to list
+-all the files in a directory, perhaps as part of a menu.
+-
+-   The `opendir' function opens a "directory stream" whose elements are
+-directory entries.  You use the `readdir' function on the directory
+-stream to retrieve these entries, represented as `struct dirent'
+-objects.  The name of the file for each entry is stored in the `d_name'
+-member of this structure.  There are obvious parallels here to the
+-stream facilities for ordinary files, described in *Note I/O on
+-Streams::.
+-
+-* Menu:
+-
+-* Directory Entries::           Format of one directory entry.
+-* Opening a Directory::         How to open a directory stream.
+-* Reading/Closing Directory::   How to read directory entries from the stream.
+-* Simple Directory Lister::     A very simple directory listing program.
+-* Random Access Directory::     Rereading part of the directory
+-                                 already read with the same stream.
+-* Scanning Directory Content::  Get entries for user selected subset of
+-                                 contents in given directory.
+-* Simple Directory Lister Mark II::  Revised version of the program.
+-
+-
+-File: libc.info,  Node: Directory Entries,  Next: Opening a Directory,  Up: Accessing Directories
+-
+-Format of a Directory Entry
+----------------------------
+-
+-   This section describes what you find in a single directory entry, as
+-you might obtain it from a directory stream.  All the symbols are
+-declared in the header file `dirent.h'.
+-
+- - Data Type: struct dirent
+-     This is a structure type used to return information about directory
+-     entries.  It contains the following fields:
+-
+-    `char d_name[]'
+-          This is the null-terminated file name component.  This is the
+-          only field you can count on in all POSIX systems.
+-
+-    `ino_t d_fileno'
+-          This is the file serial number.  For BSD compatibility, you
+-          can also refer to this member as `d_ino'.  In the GNU system
+-          and most POSIX systems, for most files this the same as the
+-          `st_ino' member that `stat' will return for the file.  *Note
+-          File Attributes::.
+-
+-    `unsigned char d_namlen'
+-          This is the length of the file name, not including the
+-          terminating null character.  Its type is `unsigned char'
+-          because that is the integer type of the appropriate size
+-
+-    `unsigned char d_type'
+-          This is the type of the file, possibly unknown.  The
+-          following constants are defined for its value:
+-
+-         `DT_UNKNOWN'
+-               The type is unknown.  On some systems this is the only
+-               value returned.
+-
+-         `DT_REG'
+-               A regular file.
+-
+-         `DT_DIR'
+-               A directory.
+-
+-         `DT_FIFO'
+-               A named pipe, or FIFO.  *Note FIFO Special Files::.
+-
+-         `DT_SOCK'
+-               A local-domain socket.
+-
+-         `DT_CHR'
+-               A character device.
+-
+-         `DT_BLK'
+-               A block device.
+-
+-          This member is a BSD extension.  On systems where it is used,
+-          it corresponds to the file type bits in the `st_mode' member
+-          of `struct statbuf'.  On other systems it will always be
+-          DT_UNKNOWN.  These two macros convert between `d_type' values
+-          and `st_mode' values:
+-
+-           - Function: int IFTODT (mode_t MODE)
+-               This returns the `d_type' value corresponding to MODE.
+-
+-           - Function: mode_t DTTOIF (int DTYPE)
+-               This returns the `st_mode' value corresponding to DTYPE.
+-
+-     This structure may contain additional members in the future.
+-
+-     When a file has multiple names, each name has its own directory
+-     entry.  The only way you can tell that the directory entries
+-     belong to a single file is that they have the same value for the
+-     `d_fileno' field.
+-
+-     File attributes such as size, modification times, and the like are
+-     part of the file itself, not any particular directory entry.
+-     *Note File Attributes::.
+-
+-
+-File: libc.info,  Node: Opening a Directory,  Next: Reading/Closing Directory,  Prev: Directory Entries,  Up: Accessing Directories
+-
+-Opening a Directory Stream
+---------------------------
+-
+-   This section describes how to open a directory stream.  All the
+-symbols are declared in the header file `dirent.h'.
+-
+- - Data Type: DIR
+-     The `DIR' data type represents a directory stream.
+-
+-   You shouldn't ever allocate objects of the `struct dirent' or `DIR'
+-data types, since the directory access functions do that for you.
+-Instead, you refer to these objects using the pointers returned by the
+-following functions.
+-
+- - Function: DIR * opendir (const char *DIRNAME)
+-     The `opendir' function opens and returns a directory stream for
+-     reading the directory whose file name is DIRNAME.  The stream has
+-     type `DIR *'.
+-
+-     If unsuccessful, `opendir' returns a null pointer.  In addition to
+-     the usual file name errors (*note File Name Errors::.), the
+-     following `errno' error conditions are defined for this function:
+-
+-    `EACCES'
+-          Read permission is denied for the directory named by
+-          `dirname'.
+-
+-    `EMFILE'
+-          The process has too many files open.
+-
+-    `ENFILE'
+-          The entire system, or perhaps the file system which contains
+-          the directory, cannot support any additional open files at
+-          the moment.  (This problem cannot happen on the GNU system.)
+-
+-     The `DIR' type is typically implemented using a file descriptor,
+-     and the `opendir' function in terms of the `open' function.  *Note
+-     Low-Level I/O::.  Directory streams and the underlying file
+-     descriptors are closed on `exec' (*note Executing a File::.).
+-
+-
+-File: libc.info,  Node: Reading/Closing Directory,  Next: Simple Directory Lister,  Prev: Opening a Directory,  Up: Accessing Directories
+-
+-Reading and Closing a Directory Stream
+---------------------------------------
+-
+-   This section describes how to read directory entries from a directory
+-stream, and how to close the stream when you are done with it.  All the
+-symbols are declared in the header file `dirent.h'.
+-
+- - Function: struct dirent * readdir (DIR *DIRSTREAM)
+-     This function reads the next entry from the directory.  It normally
+-     returns a pointer to a structure containing information about the
+-     file.  This structure is statically allocated and can be rewritten
+-     by a subsequent call.
+-
+-     *Portability Note:* On some systems, `readdir' may not return
+-     entries for `.' and `..', even though these are always valid file
+-     names in any directory.  *Note File Name Resolution::.
+-
+-     If there are no more entries in the directory or an error is
+-     detected, `readdir' returns a null pointer.  The following `errno'
+-     error conditions are defined for this function:
+-
+-    `EBADF'
+-          The DIRSTREAM argument is not valid.
+-
+-     `readdir' is not thread safe.  Multiple threads using `readdir' on
+-     the same DIRSTREAM may overwrite the return value.  Use
+-     `readdir_r' when this is critical.
+-
+- - Function: int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY,
+-          struct dirent **RESULT)
+-     This function is the reentrant version of `readdir'.  Like
+-     `readdir' it returns the next entry from the directory.  But to
+-     prevent conflicts for simultaneously running threads the result is
+-     not stored in some internal memory.  Instead the argument ENTRY
+-     has to point to a place where the result is stored.
+-
+-     The return value is `0' in case the next entry was read
+-     successfully.  In this case a pointer to the result is returned in
+-     *RESULT.  It is not required that *RESULT is the same as ENTRY.
+-     If something goes wrong while executing `readdir_r' the function
+-     returns a value indicating the error (as described for `readdir').
+-
+-     If there are no more directory entries, `readdir_r''s return value
+-     is `0', and *RESULT is set to `NULL'.
+-
+-     *Portability Note:* On some systems, `readdir_r' may not return a
+-     terminated string as the file name even if no `d_reclen' element
+-     is available in `struct dirent' and the file name as the maximal
+-     allowed size.  Modern systems all have the `d_reclen' field and on
+-     old systems multi threading is not critical.  In any case, there
+-     is no such problem with the `readdir' function so that even on
+-     systems without `d_reclen' field one could use multiple threads by
+-     using external locking.
+-
+- - Function: int closedir (DIR *DIRSTREAM)
+-     This function closes the directory stream DIRSTREAM.  It returns
+-     `0' on success and `-1' on failure.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EBADF'
+-          The DIRSTREAM argument is not valid.
+-
+-
+-File: libc.info,  Node: Simple Directory Lister,  Next: Random Access Directory,  Prev: Reading/Closing Directory,  Up: Accessing Directories
+-
+-Simple Program to List a Directory
+-----------------------------------
+-
+-   Here's a simple program that prints the names of the files in the
+-current working directory:
+-
+-     #include <stddef.h>
+-     #include <stdio.h>
+-     #include <sys/types.h>
+-     #include <dirent.h>
+-     
+-     int
+-     main (void)
+-     {
+-       DIR *dp;
+-       struct dirent *ep;
+-     
+-       dp = opendir ("./");
+-       if (dp != NULL)
+-         {
+-           while (ep = readdir (dp))
+-             puts (ep->d_name);
+-           (void) closedir (dp);
+-         }
+-       else
+-         puts ("Couldn't open the directory.");
+-     
+-       return 0;
+-     }
+-
+-   The order in which files appear in a directory tends to be fairly
+-random.  A more useful program would sort the entries (perhaps by
+-alphabetizing them) before printing them; see *Note Scanning Directory
+-Content::, and *Note Array Sort Function::.
+-
+-
+-File: libc.info,  Node: Random Access Directory,  Next: Scanning Directory Content,  Prev: Simple Directory Lister,  Up: Accessing Directories
+-
+-Random Access in a Directory Stream
+------------------------------------
+-
+-   This section describes how to reread parts of a directory that you
+-have already read from an open directory stream.  All the symbols are
+-declared in the header file `dirent.h'.
+-
+- - Function: void rewinddir (DIR *DIRSTREAM)
+-     The `rewinddir' function is used to reinitialize the directory
+-     stream DIRSTREAM, so that if you call `readdir' it returns
+-     information about the first entry in the directory again.  This
+-     function also notices if files have been added or removed to the
+-     directory since it was opened with `opendir'.  (Entries for these
+-     files might or might not be returned by `readdir' if they were
+-     added or removed since you last called `opendir' or `rewinddir'.)
+-
+- - Function: off_t telldir (DIR *DIRSTREAM)
+-     The `telldir' function returns the file position of the directory
+-     stream DIRSTREAM.  You can use this value with `seekdir' to
+-     restore the directory stream to that position.
+-
+- - Function: void seekdir (DIR *DIRSTREAM, off_t POS)
+-     The `seekdir' function sets the file position of the directory
+-     stream DIRSTREAM to POS.  The value POS must be the result of a
+-     previous call to `telldir' on this particular stream; closing and
+-     reopening the directory can invalidate values returned by
+-     `telldir'.
+-
+-
+-File: libc.info,  Node: Scanning Directory Content,  Next: Simple Directory Lister Mark II,  Prev: Random Access Directory,  Up: Accessing Directories
+-
+-Scanning the Content of a Directory
+------------------------------------
+-
+-   A higher-level interface to the directory handling functions is the
+-`scandir' function.  With its help one can select a subset of the
+-entries in a directory, possibly sort them and get as the result a list
+-of names.
+-
+- - Function: int scandir (const char *DIR, struct dirent ***NAMELIST,
+-          int (*SELECTOR) (const struct dirent *), int (*CMP) (const
+-          void *, const void *))
+-     The `scandir' function scans the contents of the directory selected
+-     by DIR.  The result in NAMELIST is an array of pointers to
+-     structure of type `struct dirent' which describe all selected
+-     directory entries and which is allocated using `malloc'.  Instead
+-     of always getting all directory entries returned, the user supplied
+-     function SELECTOR can be used to decide which entries are in the
+-     result.  Only the entries for which SELECTOR returns a nonzero
+-     value are selected.
+-
+-     Finally the entries in the NAMELIST are sorted using the user
+-     supplied function CMP.  The arguments of the CMP function are of
+-     type `struct dirent **'.  I.e., one cannot directly use the
+-     `strcmp' or `strcoll' function; see the functions `alphasort' and
+-     `versionsort' below.
+-
+-     The return value of the function gives the number of entries
+-     placed in NAMELIST.  If it is `-1' an error occurred (either the
+-     directory could not be opened for reading or the malloc call
+-     failed) and the global variable `errno' contains more information
+-     on the error.
+-
+-   As said above the fourth argument to the `scandir' function must be
+-a pointer to a sorting function.  For the convenience of the programmer
+-the GNU C library contains implementations of functions which are very
+-helpful for this purpose.
+-
+- - Function: int alphasort (const void *A, const void *B)
+-     The `alphasort' function behaves like the `strcoll' function
+-     (*note String/Array Comparison::.).  The difference is that the
+-     arguments are not string pointers but instead they are of type
+-     `struct dirent **'.
+-
+-     Return value of `alphasort' is less than, equal to, or greater than
+-     zero depending on the order of the two entries A and B.
+-
+- - Function: int versionsort (const void *A, const void *B)
+-     The `versionsort' function is like `alphasort', excepted that it
+-     uses the `strverscmp' function internally.
+-
+-   If the filesystem supports large files we cannot use the `scandir'
+-anymore since the `dirent' structure might not able to contain all the
+-information.  The LFS provides the new type `struct dirent64'.  To use
+-this we need a new function.
+-
+- - Function: int scandir64 (const char *DIR, struct dirent64
+-          ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int
+-          (*CMP) (const void *, const void *))
+-     The `scandir64' function works like the `scandir' function only
+-     that the directory entries it returns are described by elements of
+-     type `struct dirent64'.  The function pointed to by SELECTOR is
+-     again used to select the wanted entries only that SELECTOR now
+-     must point to a function which takes a `struct dirent64 *'
+-     parameter.
+-
+-     The CMP now must be a function which expects its two arguments to
+-     be of type `struct dirent64 **'.
+-
+-   As just said the function expected as the fourth is different from
+-the function expected in `scandir'.  Therefore we cannot use the
+-`alphasort' and `versionsort' functions anymore.  Instead we have two
+-similar functions available.
+-
+- - Function: int alphasort64 (const void *A, const void *B)
+-     The `alphasort64' function behaves like the `strcoll' function
+-     (*note String/Array Comparison::.).  The difference is that the
+-     arguments are not string pointers but instead they are of type
+-     `struct dirent64 **'.
+-
+-     Return value of `alphasort64' is less than, equal to, or greater
+-     than zero depending on the order of the two entries A and B.
+-
+- - Function: int versionsort64 (const void *A, const void *B)
+-     The `versionsort64' function is like `alphasort64', excepted that
+-     it uses the `strverscmp' function internally.
+-
+-   It is important not to mix the use of `scandir' and the 64 bits
+-comparison functions or vice versa.  There are systems on which this
+-works but on others it will fail miserably.
+-
+-
+-File: libc.info,  Node: Simple Directory Lister Mark II,  Prev: Scanning Directory Content,  Up: Accessing Directories
+-
+-Simple Program to List a Directory, Mark II
+--------------------------------------------
+-
+-   Here is a revised version of the directory lister found above (*note
+-Simple Directory Lister::.).  Using the `scandir' function we can avoid
+-using the functions which directly work with the directory contents.
+-After the call the found entries are available for direct used.
+-
+-     #include <stdio.h>
+-     #include <dirent.h>
+-     
+-     static int
+-     one (struct dirent *unused)
+-     {
+-       return 1;
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       struct dirent **eps;
+-       int n;
+-     
+-       n = scandir ("./", &eps, one, alphasort);
+-       if (n >= 0)
+-         {
+-           int cnt;
+-           for (cnt = 0; cnt < n; ++cnt)
+-             puts (eps[cnt]->d_name);
+-         }
+-       else
+-         perror ("Couldn't open the directory");
+-     
+-       return 0;
+-     }
+-
+-   Please note the simple selector function for this example.  Since we
+-want to see all directory entries we always return `1'.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-21 glibc-2.1.3/manual/libc.info-21
+--- ../glibc-2.1.3/manual/libc.info-21	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-21	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1198 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Working on Directory Trees,  Next: Hard Links,  Prev: Accessing Directories,  Up: File System Interface
+-
+-Working on Directory Trees
+-==========================
+-
+-   The functions to handle files in directories described so far
+-allowed to retrieve all the information in small pieces or process all
+-files in a directory (see `scandir').  Sometimes it is useful to
+-process whole hierarchies of directories and the contained files.  The
+-X/Open specification define two functions to do this.  The simpler form
+-is derived from an early definition in System V systems and therefore
+-this function is available on SVID derived systems.  The prototypes and
+-required definitions can be found in the `ftw.h' header.
+-
+-   Both functions of this `ftw' family take as one of the arguments a
+-reference to a callback function.  The functions must be of these types.
+-
+- - Data Type: __ftw_func_t
+-          int (*) (const char *, const struct stat *, int)
+-
+-     Type for callback functions given to the `ftw' function.  The first
+-     parameter will contain a pointer to the filename, the second
+-     parameter will point to an object of type `struct stat' which will
+-     be filled for the file named by the first parameter.
+-
+-     The last parameter is a flag given more information about the
+-     current file.  It can have the following values:
+-
+-    `FTW_F'
+-          The current item is a normal file or files which do not fit
+-          into one of the following categories.  This means especially
+-          special files, sockets etc.
+-
+-    `FTW_D'
+-          The current item is a directory.
+-
+-    `FTW_NS'
+-          The `stat' call to fill the object pointed to by the second
+-          parameter failed and so the information is invalid.
+-
+-    `FTW_DNR'
+-          The item is a directory which cannot be read.
+-
+-    `FTW_SL'
+-          The item is a symbolic link.  Since symbolic links are
+-          normally followed seeing this value in a `ftw' callback
+-          function means the referenced file does not exist.  The
+-          situation for `nftw' is different.
+-
+-          This value is only available if the program is compiled with
+-          `_BSD_SOURCE' or `_XOPEN_EXTENDED' defined before including
+-          the first header.  The original SVID systems do not have
+-          symbolic links.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     type is in fact `__ftw64_func_t' since this mode also changes
+-     `struct stat' to be `struct stat64'.
+-
+-   For the LFS interface and the use in the function `ftw64' the header
+-`ftw.h' defines another function type.
+-
+- - Data Type: __ftw64_func_t
+-          int (*) (const char *, const struct stat64 *, int)
+-
+-     This type is used just like `__ftw_func_t' for the callback
+-     function, but this time called from `ftw64'.  The second parameter
+-     to the function is this time a pointer to a variable of type
+-     `struct stat64' which is able to represent the larger values.
+-
+- - Data Type: __nftw_func_t
+-          int (*) (const char *, const struct stat *, int, struct FTW *)
+-
+-     The first three arguments have the same as for the `__ftw_func_t'
+-     type.  A difference is that for the third argument some additional
+-     values are defined to allow finer differentiation:
+-    `FTW_DP'
+-          The current item is a directory and all subdirectories have
+-          already been visited and reported.  This flag is returned
+-          instead of `FTW_D' if the `FTW_DEPTH' flag is given to `nftw'
+-          (see below).
+-
+-    `FTW_SLN'
+-          The current item is a stale symbolic link.  The file it
+-          points to does not exist.
+-
+-     The last parameter of the callback function is a pointer to a
+-     structure with some extra information as described below.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     type is in fact `__nftw64_func_t' since this mode also changes
+-     `struct stat' to be `struct stat64'.
+-
+-   For the LFS interface there is also a variant of this data type
+-available which has to be used with the `nftw64' function.
+-
+- - Data Type: __nftw64_func_t
+-          int (*) (const char *, const struct stat64 *, int, struct FTW *)
+-
+-     This type is used just like `__nftw_func_t' for the callback
+-     function, but this time called from `nftw64'.  The second parameter
+-     to the function is this time a pointer to a variable of type
+-     `struct stat64' which is able to represent the larger values.
+-
+- - Data Type: struct FTW
+-     The contained information helps to interpret the name parameter and
+-     gives some information about current state of the traversal of the
+-     directory hierarchy.
+-
+-    `int base'
+-          The value specifies which part of the filename argument given
+-          in the first parameter to the callback function is the name
+-          of the file.  The rest of the string is the path to locate
+-          the file.  This information is especially important if the
+-          `FTW_CHDIR' flag for `nftw' was set since then the current
+-          directory is the one the current item is found in.
+-
+-    `int level'
+-          While processing the directory the functions tracks how many
+-          directories have been examine to find the current item.  This
+-          nesting level is 0 for the item given starting item (file or
+-          directory) and is incremented by one for each entered
+-          directory.
+-
+- - Function: int ftw (const char *FILENAME, __ftw_func_t FUNC, int
+-          DESCRIPTORS)
+-     The `ftw' function calls the callback function given in the
+-     parameter FUNC for every item which is found in the directory
+-     specified by FILENAME and all directories below.  The function
+-     follows symbolic links if necessary but does not process an item
+-     twice.  If FILENAME names no directory this item is the only object
+-     reported by calling the callback function.
+-
+-     The filename given to the callback function is constructed by
+-     taking the FILENAME parameter and appending the names of all passed
+-     directories and then the local file name.  So the callback
+-     function can use this parameter to access the file.  Before the
+-     callback function is called `ftw' calls `stat' for this file and
+-     passes the information up to the callback function.  If this
+-     `stat' call was not successful the failure is indicated by setting
+-     the falg argument of the callback function to `FTW_NS'.  Otherwise
+-     the flag is set according to the description given in the
+-     description of `__ftw_func_t' above.
+-
+-     The callback function is expected to return 0 to indicate that no
+-     error occurred and the processing should be continued.  If an error
+-     occurred in the callback function or the call to `ftw' shall return
+-     immediately the callback function can return a value other than 0.
+-     This is the only correct way to stop the function.  The program
+-     must not use `setjmp' or similar techniques to continue the
+-     program in another place.  This would leave the resources
+-     allocated in the `ftw' function allocated.
+-
+-     The DESCRIPTORS parameter to the `ftw' function specifies how many
+-     file descriptors the `ftw' function is allowed to consume.  The
+-     more descriptors can be used the faster the function can run.  For
+-     each level of directories at most one descriptor is used so that
+-     for very deep directory hierarchies the limit on open file
+-     descriptors for the process or the system can be exceeded.  Beside
+-     this the limit on file descriptors is counted together for all
+-     threads in a multi-threaded program and therefore it is always
+-     good too limit the maximal number of open descriptors to a
+-     reasonable number.
+-
+-     The return value of the `ftw' function is 0 if all callback
+-     function calls returned 0 and all actions performed by the `ftw'
+-     succeeded.  If some function call failed (other than calling
+-     `stat' on an item) the function return -1.  If a callback function
+-     returns a value other than 0 this value is returned as the return
+-     value of `ftw'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `ftw64'.  I.e., the LFS
+-     interface transparently replaces the old interface.
+-
+- - Function: int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int
+-          DESCRIPTORS)
+-     This function is similar to `ftw' but it can work on filesystems
+-     with large files since the information about the files is reported
+-     using a variable of type `struct stat64' which is passed by
+-     reference to the callback function.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is available under the name `ftw' and
+-     transparently replaces the old implementation.
+-
+- - Function: int nftw (const char *FILENAME, __nftw_func_t FUNC, int
+-          DESCRIPTORS, int FLAG)
+-     The `nftw' functions works like the `ftw' functions.  It calls the
+-     callback function FUNC for all items it finds in the directory
+-     FILENAME and below.  At most DESCRIPTORS file descriptors are
+-     consumed during the `nftw' call.
+-
+-     The differences are that for one the callback function is of a
+-     different type.  It is of type `struct FTW *' and provides the
+-     callback functions the information described above.
+-
+-     The second difference is that `nftw' takes an additional fourth
+-     argument which is 0 or a combination of any of the following
+-     values, combined using bitwise OR.
+-
+-    `FTW_PHYS'
+-          While traversing the directory symbolic links are not
+-          followed.  I.e., if this flag is given symbolic links are
+-          reported using the `FTW_SL' value for the type parameter to
+-          the callback function.  Please note that if this flag is used
+-          the appearance of `FTW_SL' in a callback function does not
+-          mean the referenced file does not exist.  To indicate this
+-          the extra value `FTW_SLN' exists.
+-
+-    `FTW_MOUNT'
+-          The callback function is only called for items which are on
+-          the same mounted filesystem as the directory given as the
+-          FILENAME parameter to `nftw'.
+-
+-    `FTW_CHDIR'
+-          If this flag is given the current working directory is
+-          changed to the directory containing the reported object
+-          before the callback function is called.
+-
+-    `FTW_DEPTH'
+-          If this option is given the function visits first all files
+-          and subdirectories before the callback function is called for
+-          the directory itself (depth-first processing).  This also
+-          means the type flag given to the callback function is
+-          `FTW_DP' and not `FTW_D'.
+-
+-     The return value is computed in the same way as for `ftw'.  `nftw'
+-     return 0 if no failure occurred in `nftw' and all callback
+-     function call return values are also 0.  For internal errors such
+-     as memory problems -1 is returned and ERRNO is set accordingly.
+-     If the return value of a callback invocation is nonzero this very
+-     same value is returned.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `nftw64'.  I.e., the LFS
+-     interface transparently replaces the old interface.
+-
+- - Function: int nftw64 (const char *FILENAME, __nftw64_func_t FUNC,
+-          int DESCRIPTORS, int FLAG)
+-     This function is similar to `nftw' but it can work on filesystems
+-     with large files since the information about the files is reported
+-     using a variable of type `struct stat64' which is passed by
+-     reference to the callback function.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is available under the name `nftw' and
+-     transparently replaces the old implementation.
+-
+-
+-File: libc.info,  Node: Hard Links,  Next: Symbolic Links,  Prev: Working on Directory Trees,  Up: File System Interface
+-
+-Hard Links
+-==========
+-
+-   In POSIX systems, one file can have many names at the same time.
+-All of the names are equally real, and no one of them is preferred to
+-the others.
+-
+-   To add a name to a file, use the `link' function.  (The new name is
+-also called a "hard link" to the file.)  Creating a new link to a file
+-does not copy the contents of the file; it simply makes a new name by
+-which the file can be known, in addition to the file's existing name or
+-names.
+-
+-   One file can have names in several directories, so the organization
+-of the file system is not a strict hierarchy or tree.
+-
+-   In most implementations, it is not possible to have hard links to the
+-same file in multiple file systems.  `link' reports an error if you try
+-to make a hard link to the file from another file system when this
+-cannot be done.
+-
+-   The prototype for the `link' function is declared in the header file
+-`unistd.h'.
+-
+- - Function: int link (const char *OLDNAME, const char *NEWNAME)
+-     The `link' function makes a new link to the existing file named by
+-     OLDNAME, under the new name NEWNAME.
+-
+-     This function returns a value of `0' if it is successful and `-1'
+-     on failure.  In addition to the usual file name errors (*note File
+-     Name Errors::.) for both OLDNAME and NEWNAME, the following
+-     `errno' error conditions are defined for this function:
+-
+-    `EACCES'
+-          You are not allowed to write the directory in which the new
+-          link is to be written.
+-
+-    `EEXIST'
+-          There is already a file named NEWNAME.  If you want to replace
+-          this link with a new link, you must remove the old link
+-          explicitly first.
+-
+-    `EMLINK'
+-          There are already too many links to the file named by OLDNAME.
+-          (The maximum number of links to a file is `LINK_MAX'; see
+-          *Note Limits for Files::.)
+-
+-    `ENOENT'
+-          The file named by OLDNAME doesn't exist.  You can't make a
+-          link to a file that doesn't exist.
+-
+-    `ENOSPC'
+-          The directory or file system that would contain the new link
+-          is full and cannot be extended.
+-
+-    `EPERM'
+-          In the GNU system and some others, you cannot make links to
+-          directories.  Many systems allow only privileged users to do
+-          so.  This error is used to report the problem.
+-
+-    `EROFS'
+-          The directory containing the new link can't be modified
+-          because it's on a read-only file system.
+-
+-    `EXDEV'
+-          The directory specified in NEWNAME is on a different file
+-          system than the existing file.
+-
+-    `EIO'
+-          A hardware error occurred while trying to read or write the
+-          to filesystem.
+-
+-
+-File: libc.info,  Node: Symbolic Links,  Next: Deleting Files,  Prev: Hard Links,  Up: File System Interface
+-
+-Symbolic Links
+-==============
+-
+-   The GNU system supports "soft links" or "symbolic links".  This is a
+-kind of "file" that is essentially a pointer to another file name.
+-Unlike hard links, symbolic links can be made to directories or across
+-file systems with no restrictions.  You can also make a symbolic link
+-to a name which is not the name of any file.  (Opening this link will
+-fail until a file by that name is created.)  Likewise, if the symbolic
+-link points to an existing file which is later deleted, the symbolic
+-link continues to point to the same file name even though the name no
+-longer names any file.
+-
+-   The reason symbolic links work the way they do is that special things
+-happen when you try to open the link.  The `open' function realizes you
+-have specified the name of a link, reads the file name contained in the
+-link, and opens that file name instead.  The `stat' function likewise
+-operates on the file that the symbolic link points to, instead of on
+-the link itself.
+-
+-   By contrast, other operations such as deleting or renaming the file
+-operate on the link itself.  The functions `readlink' and `lstat' also
+-refrain from following symbolic links, because their purpose is to
+-obtain information about the link.  So does `link', the function that
+-makes a hard link--it makes a hard link to the symbolic link, which one
+-rarely wants.
+-
+-   Prototypes for the functions listed in this section are in
+-`unistd.h'.
+-
+- - Function: int symlink (const char *OLDNAME, const char *NEWNAME)
+-     The `symlink' function makes a symbolic link to OLDNAME named
+-     NEWNAME.
+-
+-     The normal return value from `symlink' is `0'.  A return value of
+-     `-1' indicates an error.  In addition to the usual file name
+-     syntax errors (*note File Name Errors::.), the following `errno'
+-     error conditions are defined for this function:
+-
+-    `EEXIST'
+-          There is already an existing file named NEWNAME.
+-
+-    `EROFS'
+-          The file NEWNAME would exist on a read-only file system.
+-
+-    `ENOSPC'
+-          The directory or file system cannot be extended to make the
+-          new link.
+-
+-    `EIO'
+-          A hardware error occurred while reading or writing data on
+-          the disk.
+-
+-
+- - Function: int readlink (const char *FILENAME, char *BUFFER, size_t
+-          SIZE)
+-     The `readlink' function gets the value of the symbolic link
+-     FILENAME.  The file name that the link points to is copied into
+-     BUFFER.  This file name string is *not* null-terminated;
+-     `readlink' normally returns the number of characters copied.  The
+-     SIZE argument specifies the maximum number of characters to copy,
+-     usually the allocation size of BUFFER.
+-
+-     If the return value equals SIZE, you cannot tell whether or not
+-     there was room to return the entire name.  So make a bigger buffer
+-     and call `readlink' again.  Here is an example:
+-
+-          char *
+-          readlink_malloc (char *filename)
+-          {
+-            int size = 100;
+-          
+-            while (1)
+-              {
+-                char *buffer = (char *) xmalloc (size);
+-                int nchars = readlink (filename, buffer, size);
+-                if (nchars < size)
+-                  return buffer;
+-                free (buffer);
+-                size *= 2;
+-              }
+-          }
+-
+-     A value of `-1' is returned in case of error.  In addition to the
+-     usual file name errors (*note File Name Errors::.), the following
+-     `errno' error conditions are defined for this function:
+-
+-    `EINVAL'
+-          The named file is not a symbolic link.
+-
+-    `EIO'
+-          A hardware error occurred while reading or writing data on
+-          the disk.
+-
+-
+-File: libc.info,  Node: Deleting Files,  Next: Renaming Files,  Prev: Symbolic Links,  Up: File System Interface
+-
+-Deleting Files
+-==============
+-
+-   You can delete a file with the functions `unlink' or `remove'.
+-
+-   Deletion actually deletes a file name.  If this is the file's only
+-name, then the file is deleted as well.  If the file has other names as
+-well (*note Hard Links::.), it remains accessible under its other names.
+-
+- - Function: int unlink (const char *FILENAME)
+-     The `unlink' function deletes the file name FILENAME.  If this is
+-     a file's sole name, the file itself is also deleted.  (Actually,
+-     if any process has the file open when this happens, deletion is
+-     postponed until all processes have closed the file.)
+-
+-     The function `unlink' is declared in the header file `unistd.h'.
+-
+-     This function returns `0' on successful completion, and `-1' on
+-     error.  In addition to the usual file name errors (*note File Name
+-     Errors::.), the following `errno' error conditions are defined for
+-     this function:
+-
+-    `EACCES'
+-          Write permission is denied for the directory from which the
+-          file is to be removed, or the directory has the sticky bit
+-          set and you do not own the file.
+-
+-    `EBUSY'
+-          This error indicates that the file is being used by the
+-          system in such a way that it can't be unlinked.  For example,
+-          you might see this error if the file name specifies the root
+-          directory or a mount point for a file system.
+-
+-    `ENOENT'
+-          The file name to be deleted doesn't exist.
+-
+-    `EPERM'
+-          On some systems, `unlink' cannot be used to delete the name
+-          of a directory, or can only be used this way by a privileged
+-          user.  To avoid such problems, use `rmdir' to delete
+-          directories.  (In the GNU system `unlink' can never delete
+-          the name of a directory.)
+-
+-    `EROFS'
+-          The directory in which the file name is to be deleted is on a
+-          read-only file system, and can't be modified.
+-
+- - Function: int rmdir (const char *FILENAME)
+-     The `rmdir' function deletes a directory.  The directory must be
+-     empty before it can be removed; in other words, it can only contain
+-     entries for `.' and `..'.
+-
+-     In most other respects, `rmdir' behaves like `unlink'.  There are
+-     two additional `errno' error conditions defined for `rmdir':
+-
+-    `ENOTEMPTY'
+-    `EEXIST'
+-          The directory to be deleted is not empty.
+-
+-     These two error codes are synonymous; some systems use one, and
+-     some use the other.  The GNU system always uses `ENOTEMPTY'.
+-
+-     The prototype for this function is declared in the header file
+-     `unistd.h'.
+-
+- - Function: int remove (const char *FILENAME)
+-     This is the ISO C function to remove a file.  It works like
+-     `unlink' for files and like `rmdir' for directories.  `remove' is
+-     declared in `stdio.h'.
+-
+-
+-File: libc.info,  Node: Renaming Files,  Next: Creating Directories,  Prev: Deleting Files,  Up: File System Interface
+-
+-Renaming Files
+-==============
+-
+-   The `rename' function is used to change a file's name.
+-
+- - Function: int rename (const char *OLDNAME, const char *NEWNAME)
+-     The `rename' function renames the file name OLDNAME with NEWNAME.
+-     The file formerly accessible under the name OLDNAME is afterward
+-     accessible as NEWNAME instead.  (If the file had any other names
+-     aside from OLDNAME, it continues to have those names.)
+-
+-     The directory containing the name NEWNAME must be on the same file
+-     system as the file (as indicated by the name OLDNAME).
+-
+-     One special case for `rename' is when OLDNAME and NEWNAME are two
+-     names for the same file.  The consistent way to handle this case
+-     is to delete OLDNAME.  However, POSIX requires that in this case
+-     `rename' do nothing and report success--which is inconsistent.  We
+-     don't know what your operating system will do.
+-
+-     If the OLDNAME is not a directory, then any existing file named
+-     NEWNAME is removed during the renaming operation.  However, if
+-     NEWNAME is the name of a directory, `rename' fails in this case.
+-
+-     If the OLDNAME is a directory, then either NEWNAME must not exist
+-     or it must name a directory that is empty.  In the latter case,
+-     the existing directory named NEWNAME is deleted first.  The name
+-     NEWNAME must not specify a subdirectory of the directory `oldname'
+-     which is being renamed.
+-
+-     One useful feature of `rename' is that the meaning of the name
+-     NEWNAME changes "atomically" from any previously existing file by
+-     that name to its new meaning (the file that was called OLDNAME).
+-     There is no instant at which NEWNAME is nonexistent "in between"
+-     the old meaning and the new meaning.  If there is a system crash
+-     during the operation, it is possible for both names to still
+-     exist; but NEWNAME will always be intact if it exists at all.
+-
+-     If `rename' fails, it returns `-1'.  In addition to the usual file
+-     name errors (*note File Name Errors::.), the following `errno'
+-     error conditions are defined for this function:
+-
+-    `EACCES'
+-          One of the directories containing NEWNAME or OLDNAME refuses
+-          write permission; or NEWNAME and OLDNAME are directories and
+-          write permission is refused for one of them.
+-
+-    `EBUSY'
+-          A directory named by OLDNAME or NEWNAME is being used by the
+-          system in a way that prevents the renaming from working.
+-          This includes directories that are mount points for
+-          filesystems, and directories that are the current working
+-          directories of processes.
+-
+-    `ENOTEMPTY'
+-    `EEXIST'
+-          The directory NEWNAME isn't empty.  The GNU system always
+-          returns `ENOTEMPTY' for this, but some other systems return
+-          `EEXIST'.
+-
+-    `EINVAL'
+-          The OLDNAME is a directory that contains NEWNAME.
+-
+-    `EISDIR'
+-          The NEWNAME names a directory, but the OLDNAME doesn't.
+-
+-    `EMLINK'
+-          The parent directory of NEWNAME would have too many links.
+-
+-    `ENOENT'
+-          The file named by OLDNAME doesn't exist.
+-
+-    `ENOSPC'
+-          The directory that would contain NEWNAME has no room for
+-          another entry, and there is no space left in the file system
+-          to expand it.
+-
+-    `EROFS'
+-          The operation would involve writing to a directory on a
+-          read-only file system.
+-
+-    `EXDEV'
+-          The two file names NEWNAME and OLDNAMES are on different file
+-          systems.
+-
+-
+-File: libc.info,  Node: Creating Directories,  Next: File Attributes,  Prev: Renaming Files,  Up: File System Interface
+-
+-Creating Directories
+-====================
+-
+-   Directories are created with the `mkdir' function.  (There is also a
+-shell command `mkdir' which does the same thing.)
+-
+- - Function: int mkdir (const char *FILENAME, mode_t MODE)
+-     The `mkdir' function creates a new, empty directory whose name is
+-     FILENAME.
+-
+-     The argument MODE specifies the file permissions for the new
+-     directory file.  *Note Permission Bits::, for more information
+-     about this.
+-
+-     A return value of `0' indicates successful completion, and `-1'
+-     indicates failure.  In addition to the usual file name syntax
+-     errors (*note File Name Errors::.), the following `errno' error
+-     conditions are defined for this function:
+-
+-    `EACCES'
+-          Write permission is denied for the parent directory in which
+-          the new directory is to be added.
+-
+-    `EEXIST'
+-          A file named FILENAME already exists.
+-
+-    `EMLINK'
+-          The parent directory has too many links.
+-
+-          Well-designed file systems never report this error, because
+-          they permit more links than your disk could possibly hold.
+-          However, you must still take account of the possibility of
+-          this error, as it could result from network access to a file
+-          system on another machine.
+-
+-    `ENOSPC'
+-          The file system doesn't have enough room to create the new
+-          directory.
+-
+-    `EROFS'
+-          The parent directory of the directory being created is on a
+-          read-only file system, and cannot be modified.
+-
+-     To use this function, your program should include the header file
+-     `sys/stat.h'.
+-
+-
+-File: libc.info,  Node: File Attributes,  Next: Making Special Files,  Prev: Creating Directories,  Up: File System Interface
+-
+-File Attributes
+-===============
+-
+-   When you issue an `ls -l' shell command on a file, it gives you
+-information about the size of the file, who owns it, when it was last
+-modified, and the like.  This kind of information is called the "file
+-attributes"; it is associated with the file itself and not a particular
+-one of its names.
+-
+-   This section contains information about how you can inquire about and
+-modify these attributes of files.
+-
+-* Menu:
+-
+-* Attribute Meanings::          The names of the file attributes,
+-                                 and what their values mean.
+-* Reading Attributes::          How to read the attributes of a file.
+-* Testing File Type::           Distinguishing ordinary files,
+-                                 directories, links...
+-* File Owner::                  How ownership for new files is determined,
+-			         and how to change it.
+-* Permission Bits::             How information about a file's access
+-                                 mode is stored.
+-* Access Permission::           How the system decides who can access a file.
+-* Setting Permissions::         How permissions for new files are assigned,
+-			         and how to change them.
+-* Testing File Access::         How to find out if your process can
+-                                 access a file.
+-* File Times::                  About the time attributes of a file.
+-* File Size::			Manually changing the size of a file.
+-
+-
+-File: libc.info,  Node: Attribute Meanings,  Next: Reading Attributes,  Up: File Attributes
+-
+-What the File Attribute Values Mean
+------------------------------------
+-
+-   When you read the attributes of a file, they come back in a structure
+-called `struct stat'.  This section describes the names of the
+-attributes, their data types, and what they mean.  For the functions to
+-read the attributes of a file, see *Note Reading Attributes::.
+-
+-   The header file `sys/stat.h' declares all the symbols defined in
+-this section.
+-
+- - Data Type: struct stat
+-     The `stat' structure type is used to return information about the
+-     attributes of a file.  It contains at least the following members:
+-
+-    `mode_t st_mode'
+-          Specifies the mode of the file.  This includes file type
+-          information (*note Testing File Type::.) and the file
+-          permission bits (*note Permission Bits::.).
+-
+-    `ino_t st_ino'
+-          The file serial number, which distinguishes this file from
+-          all other files on the same device.
+-
+-    `dev_t st_dev'
+-          Identifies the device containing the file.  The `st_ino' and
+-          `st_dev', taken together, uniquely identify the file.  The
+-          `st_dev' value is not necessarily consistent across reboots or
+-          system crashes, however.
+-
+-    `nlink_t st_nlink'
+-          The number of hard links to the file.  This count keeps track
+-          of how many directories have entries for this file.  If the
+-          count is ever decremented to zero, then the file itself is
+-          discarded as soon as no process still holds it open.
+-          Symbolic links are not counted in the total.
+-
+-    `uid_t st_uid'
+-          The user ID of the file's owner.  *Note File Owner::.
+-
+-    `gid_t st_gid'
+-          The group ID of the file.  *Note File Owner::.
+-
+-    `off_t st_size'
+-          This specifies the size of a regular file in bytes.  For
+-          files that are really devices and the like, this field isn't
+-          usually meaningful.  For symbolic links, this specifies the
+-          length of the file name the link refers to.
+-
+-    `time_t st_atime'
+-          This is the last access time for the file.  *Note File
+-          Times::.
+-
+-    `unsigned long int st_atime_usec'
+-          This is the fractional part of the last access time for the
+-          file.  *Note File Times::.
+-
+-    `time_t st_mtime'
+-          This is the time of the last modification to the contents of
+-          the file.  *Note File Times::.
+-
+-    `unsigned long int st_mtime_usec'
+-          This is the fractional part of the time of last modification
+-          to the contents of the file.  *Note File Times::.
+-
+-    `time_t st_ctime'
+-          This is the time of the last modification to the attributes
+-          of the file.  *Note File Times::.
+-
+-    `unsigned long int st_ctime_usec'
+-          This is the fractional part of the time of last modification
+-          to the attributes of the file.  *Note File Times::.
+-
+-    `blkcnt_t st_blocks'
+-          This is the amount of disk space that the file occupies,
+-          measured in units of 512-byte blocks.
+-
+-          The number of disk blocks is not strictly proportional to the
+-          size of the file, for two reasons: the file system may use
+-          some blocks for internal record keeping; and the file may be
+-          sparse--it may have "holes" which contain zeros but do not
+-          actually take up space on the disk.
+-
+-          You can tell (approximately) whether a file is sparse by
+-          comparing this value with `st_size', like this:
+-
+-               (st.st_blocks * 512 < st.st_size)
+-
+-          This test is not perfect because a file that is just slightly
+-          sparse might not be detected as sparse at all.  For practical
+-          applications, this is not a problem.
+-
+-    `unsigned int st_blksize'
+-          The optimal block size for reading of writing this file, in
+-          bytes.  You might use this size for allocating the buffer
+-          space for reading of writing the file.  (This is unrelated to
+-          `st_blocks'.)
+-
+-   The extensions for the Large File Support (LFS) require even on 32
+-bits machine types which can handle file sizes up to 2^63.  Therefore a
+-new definition of `struct stat' is necessary.
+-
+- - Data Type: struct stat64
+-     The members of this type are the same and have the same names as
+-     those in `struct stat'.  The only difference is that the members
+-     `st_ino', `st_size', and `st_blocks' have a different type to
+-     support larger values.
+-
+-    `mode_t st_mode'
+-          Specifies the mode of the file.  This includes file type
+-          information (*note Testing File Type::.) and the file
+-          permission bits (*note Permission Bits::.).
+-
+-    `ino64_t st_ino'
+-          The file serial number, which distinguishes this file from
+-          all other files on the same device.
+-
+-    `dev_t st_dev'
+-          Identifies the device containing the file.  The `st_ino' and
+-          `st_dev', taken together, uniquely identify the file.  The
+-          `st_dev' value is not necessarily consistent across reboots or
+-          system crashes, however.
+-
+-    `nlink_t st_nlink'
+-          The number of hard links to the file.  This count keeps track
+-          of how many directories have entries for this file.  If the
+-          count is ever decremented to zero, then the file itself is
+-          discarded as soon as no process still holds it open.
+-          Symbolic links are not counted in the total.
+-
+-    `uid_t st_uid'
+-          The user ID of the file's owner.  *Note File Owner::.
+-
+-    `gid_t st_gid'
+-          The group ID of the file.  *Note File Owner::.
+-
+-    `off64_t st_size'
+-          This specifies the size of a regular file in bytes.  For
+-          files that are really devices and the like, this field isn't
+-          usually meaningful.  For symbolic links, this specifies the
+-          length of the file name the link refers to.
+-
+-    `time_t st_atime'
+-          This is the last access time for the file.  *Note File
+-          Times::.
+-
+-    `unsigned long int st_atime_usec'
+-          This is the fractional part of the last access time for the
+-          file.  *Note File Times::.
+-
+-    `time_t st_mtime'
+-          This is the time of the last modification to the contents of
+-          the file.  *Note File Times::.
+-
+-    `unsigned long int st_mtime_usec'
+-          This is the fractional part of the time of last modification
+-          to the contents of the file.  *Note File Times::.
+-
+-    `time_t st_ctime'
+-          This is the time of the last modification to the attributes
+-          of the file.  *Note File Times::.
+-
+-    `unsigned long int st_ctime_usec'
+-          This is the fractional part of the time of last modification
+-          to the attributes of the file.  *Note File Times::.
+-
+-    `blkcnt64_t st_blocks'
+-          This is the amount of disk space that the file occupies,
+-          measured in units of 512-byte blocks.
+-
+-    `unsigned int st_blksize'
+-          The optimal block size for reading of writing this file, in
+-          bytes.  You might use this size for allocating the buffer
+-          space for reading of writing the file.  (This is unrelated to
+-          `st_blocks'.)
+-
+-   Some of the file attributes have special data type names which exist
+-specifically for those attributes.  (They are all aliases for well-known
+-integer types that you know and love.)  These typedef names are defined
+-in the header file `sys/types.h' as well as in `sys/stat.h'.  Here is a
+-list of them.
+-
+- - Data Type: mode_t
+-     This is an integer data type used to represent file modes.  In the
+-     GNU system, this is equivalent to `unsigned int'.
+-
+- - Data Type: ino_t
+-     This is an arithmetic data type used to represent file serial
+-     numbers.  (In Unix jargon, these are sometimes called "inode
+-     numbers".)  In the GNU system, this type is equivalent to
+-     `unsigned long int'.
+-
+-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
+-     is transparently replaced by `ino64_t'.
+-
+- - Data Type: ino64_t
+-     This is an arithmetic data type used to represent file serial
+-     numbers for the use in LFS.  In the GNU system, this type is
+-     equivalent to `unsigned long longint'.
+-
+-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
+-     available under the name `ino_t'.
+-
+- - Data Type: dev_t
+-     This is an arithmetic data type used to represent file device
+-     numbers.  In the GNU system, this is equivalent to `int'.
+-
+- - Data Type: nlink_t
+-     This is an arithmetic data type used to represent file link counts.
+-     In the GNU system, this is equivalent to `unsigned short int'.
+-
+- - Data Type: blkcnt_t
+-     This is an arithmetic data type used to represent block counts.
+-     In the GNU system, this is equivalent to `unsigned long int'.
+-
+-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
+-     is transparently replaced by `blkcnt64_t'.
+-
+- - Data Type: blkcnt64_t
+-     This is an arithmetic data type used to represent block counts for
+-     the use in LFS.  In the GNU system, this is equivalent to `unsigned
+-     long long int'.
+-
+-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
+-     available under the name `blkcnt_t'.
+-
+-
+-File: libc.info,  Node: Reading Attributes,  Next: Testing File Type,  Prev: Attribute Meanings,  Up: File Attributes
+-
+-Reading the Attributes of a File
+---------------------------------
+-
+-   To examine the attributes of files, use the functions `stat',
+-`fstat' and `lstat'.  They return the attribute information in a
+-`struct stat' object.  All three functions are declared in the header
+-file `sys/stat.h'.
+-
+- - Function: int stat (const char *FILENAME, struct stat *BUF)
+-     The `stat' function returns information about the attributes of the
+-     file named by FILENAME in the structure pointed at by BUF.
+-
+-     If FILENAME is the name of a symbolic link, the attributes you get
+-     describe the file that the link points to.  If the link points to a
+-     nonexistent file name, then `stat' fails, reporting a nonexistent
+-     file.
+-
+-     The return value is `0' if the operation is successful, and `-1'
+-     on failure.  In addition to the usual file name errors (*note File
+-     Name Errors::., the following `errno' error conditions are defined
+-     for this function:
+-
+-    `ENOENT'
+-          The file named by FILENAME doesn't exist.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `stat64' since the LFS interface transparently
+-     replaces the normal implementation.
+-
+- - Function: int stat64 (const char *FILENAME, struct stat64 *BUF)
+-     This function is similar to `stat' but it is also able to work on
+-     file larger then 2^31 bytes on 32 bits systems.  To be able to do
+-     this the result is stored in a variable of type `struct stat64' to
+-     which BUF must point.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `stat' and so transparently
+-     replaces the interface for small fiels on 32 bits machines.
+-
+- - Function: int fstat (int FILEDES, struct stat *BUF)
+-     The `fstat' function is like `stat', except that it takes an open
+-     file descriptor as an argument instead of a file name.  *Note
+-     Low-Level I/O::.
+-
+-     Like `stat', `fstat' returns `0' on success and `-1' on failure.
+-     The following `errno' error conditions are defined for `fstat':
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `fstat64' since the LFS interface transparently
+-     replaces the normal implementation.
+-
+- - Function: int fstat64 (int FILEDES, struct stat64 *BUF)
+-     This function is similar to `fstat' but it is prepared to work on
+-     large files on 32 bits platforms.  For large files the file
+-     descriptor FILEDES should be returned by `open64' or `creat64'.
+-     The BUF pointer points to a variable of type `struct stat64' which
+-     is able to represent the larger values.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `fstat' and so transparently
+-     replaces the interface for small fiels on 32 bits machines.
+-
+- - Function: int lstat (const char *FILENAME, struct stat *BUF)
+-     The `lstat' function is like `stat', except that it does not
+-     follow symbolic links.  If FILENAME is the name of a symbolic
+-     link, `lstat' returns information about the link itself; otherwise,
+-     `lstat' works like `stat'.  *Note Symbolic Links::.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is in fact `lstat64' since the LFS interface transparently
+-     replaces the normal implementation.
+-
+- - Function: int lstat64 (const char *FILENAME, struct stat64 *BUF)
+-     This function is similar to `lstat' but it is also able to work on
+-     file larger then 2^31 bytes on 32 bits systems.  To be able to do
+-     this the result is stored in a variable of type `struct stat64' to
+-     which BUF must point.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
+-     function is available under the name `lstat' and so transparently
+-     replaces the interface for small fiels on 32 bits machines.
+-
+-
+-File: libc.info,  Node: Testing File Type,  Next: File Owner,  Prev: Reading Attributes,  Up: File Attributes
+-
+-Testing the Type of a File
+---------------------------
+-
+-   The "file mode", stored in the `st_mode' field of the file
+-attributes, contains two kinds of information: the file type code, and
+-the access permission bits.  This section discusses only the type code,
+-which you can use to tell whether the file is a directory, whether it is
+-a socket, and so on.  For information about the access permission,
+-*Note Permission Bits::.
+-
+-   There are two predefined ways you can access the file type portion of
+-the file mode.  First of all, for each type of file, there is a
+-"predicate macro" which examines a file mode value and returns true or
+-false--is the file of that type, or not.  Secondly, you can mask out
+-the rest of the file mode to get just a file type code.  You can
+-compare this against various constants for the supported file types.
+-
+-   All of the symbols listed in this section are defined in the header
+-file `sys/stat.h'.
+-
+-   The following predicate macros test the type of a file, given the
+-value M which is the `st_mode' field returned by `stat' on that file:
+-
+- - Macro: int S_ISDIR (mode_t M)
+-     This macro returns nonzero if the file is a directory.
+-
+- - Macro: int S_ISCHR (mode_t M)
+-     This macro returns nonzero if the file is a character special file
+-     (a device like a terminal).
+-
+- - Macro: int S_ISBLK (mode_t M)
+-     This macro returns nonzero if the file is a block special file (a
+-     device like a disk).
+-
+- - Macro: int S_ISREG (mode_t M)
+-     This macro returns nonzero if the file is a regular file.
+-
+- - Macro: int S_ISFIFO (mode_t M)
+-     This macro returns nonzero if the file is a FIFO special file, or a
+-     pipe.  *Note Pipes and FIFOs::.
+-
+- - Macro: int S_ISLNK (mode_t M)
+-     This macro returns nonzero if the file is a symbolic link.  *Note
+-     Symbolic Links::.
+-
+- - Macro: int S_ISSOCK (mode_t M)
+-     This macro returns nonzero if the file is a socket.  *Note
+-     Sockets::.
+-
+-   An alternate non-POSIX method of testing the file type is supported
+-for compatibility with BSD.  The mode can be bitwise ANDed with
+-`S_IFMT' to extract the file type code, and compared to the appropriate
+-type code constant.  For example,
+-
+-     S_ISCHR (MODE)
+-
+-is equivalent to:
+-
+-     ((MODE & S_IFMT) == S_IFCHR)
+-
+- - Macro: int S_IFMT
+-     This is a bit mask used to extract the file type code portion of a
+-     mode value.
+-
+-   These are the symbolic names for the different file type codes:
+-
+-`S_IFDIR'
+-     This macro represents the value of the file type code for a
+-     directory file.
+-
+-`S_IFCHR'
+-     This macro represents the value of the file type code for a
+-     character-oriented device file.
+-
+-`S_IFBLK'
+-     This macro represents the value of the file type code for a
+-     block-oriented device file.
+-
+-`S_IFREG'
+-     This macro represents the value of the file type code for a
+-     regular file.
+-
+-`S_IFLNK'
+-     This macro represents the value of the file type code for a
+-     symbolic link.
+-
+-`S_IFSOCK'
+-     This macro represents the value of the file type code for a socket.
+-
+-`S_IFIFO'
+-     This macro represents the value of the file type code for a FIFO
+-     or pipe.
+-
+-
+-File: libc.info,  Node: File Owner,  Next: Permission Bits,  Prev: Testing File Type,  Up: File Attributes
+-
+-File Owner
+-----------
+-
+-   Every file has an "owner" which is one of the registered user names
+-defined on the system.  Each file also has a "group", which is one of
+-the defined groups.  The file owner can often be useful for showing you
+-who edited the file (especially when you edit with GNU Emacs), but its
+-main purpose is for access control.
+-
+-   The file owner and group play a role in determining access because
+-the file has one set of access permission bits for the user that is the
+-owner, another set that apply to users who belong to the file's group,
+-and a third set of bits that apply to everyone else.  *Note Access
+-Permission::, for the details of how access is decided based on this
+-data.
+-
+-   When a file is created, its owner is set from the effective user ID
+-of the process that creates it (*note Process Persona::.).  The file's
+-group ID may be set from either effective group ID of the process, or
+-the group ID of the directory that contains the file, depending on the
+-system where the file is stored.  When you access a remote file system,
+-it behaves according to its own rule, not according to the system your
+-program is running on.  Thus, your program must be prepared to encounter
+-either kind of behavior, no matter what kind of system you run it on.
+-
+-   You can change the owner and/or group owner of an existing file using
+-the `chown' function.  This is the primitive for the `chown' and
+-`chgrp' shell commands.
+-
+-   The prototype for this function is declared in `unistd.h'.
+-
+- - Function: int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)
+-     The `chown' function changes the owner of the file FILENAME to
+-     OWNER, and its group owner to GROUP.
+-
+-     Changing the owner of the file on certain systems clears the
+-     set-user-ID and set-group-ID bits of the file's permissions.
+-     (This is because those bits may not be appropriate for the new
+-     owner.)  The other file permission bits are not changed.
+-
+-     The return value is `0' on success and `-1' on failure.  In
+-     addition to the usual file name errors (*note File Name Errors::.),
+-     the following `errno' error conditions are defined for this
+-     function:
+-
+-    `EPERM'
+-          This process lacks permission to make the requested change.
+-
+-          Only privileged users or the file's owner can change the
+-          file's group.  On most file systems, only privileged users
+-          can change the file owner; some file systems allow you to
+-          change the owner if you are currently the owner.  When you
+-          access a remote file system, the behavior you encounter is
+-          determined by the system that actually holds the file, not by
+-          the system your program is running on.
+-
+-          *Note Options for Files::, for information about the
+-          `_POSIX_CHOWN_RESTRICTED' macro.
+-
+-    `EROFS'
+-          The file is on a read-only file system.
+-
+- - Function: int fchown (int FILEDES, int OWNER, int GROUP)
+-     This is like `chown', except that it changes the owner of the file
+-     with open file descriptor FILEDES.
+-
+-     The return value from `fchown' is `0' on success and `-1' on
+-     failure.  The following `errno' error codes are defined for this
+-     function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The FILEDES argument corresponds to a pipe or socket, not an
+-          ordinary file.
+-
+-    `EPERM'
+-          This process lacks permission to make the requested change.
+-          For details, see `chmod', above.
+-
+-    `EROFS'
+-          The file resides on a read-only file system.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-22 glibc-2.1.3/manual/libc.info-22
+--- ../glibc-2.1.3/manual/libc.info-22	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-22	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1259 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Permission Bits,  Next: Access Permission,  Prev: File Owner,  Up: File Attributes
+-
+-The Mode Bits for Access Permission
+------------------------------------
+-
+-   The "file mode", stored in the `st_mode' field of the file
+-attributes, contains two kinds of information: the file type code, and
+-the access permission bits.  This section discusses only the access
+-permission bits, which control who can read or write the file.  *Note
+-Testing File Type::, for information about the file type code.
+-
+-   All of the symbols listed in this section are defined in the header
+-file `sys/stat.h'.
+-
+-   These symbolic constants are defined for the file mode bits that
+-control access permission for the file:
+-
+-`S_IRUSR'
+-`S_IREAD'
+-     Read permission bit for the owner of the file.  On many systems,
+-     this bit is 0400.  `S_IREAD' is an obsolete synonym provided for
+-     BSD compatibility.
+-
+-`S_IWUSR'
+-`S_IWRITE'
+-     Write permission bit for the owner of the file.  Usually 0200.
+-     `S_IWRITE' is an obsolete synonym provided for BSD compatibility.
+-
+-`S_IXUSR'
+-`S_IEXEC'
+-     Execute (for ordinary files) or search (for directories)
+-     permission bit for the owner of the file.  Usually 0100.
+-     `S_IEXEC' is an obsolete synonym provided for BSD compatibility.
+-
+-`S_IRWXU'
+-     This is equivalent to `(S_IRUSR | S_IWUSR | S_IXUSR)'.
+-
+-`S_IRGRP'
+-     Read permission bit for the group owner of the file.  Usually 040.
+-
+-`S_IWGRP'
+-     Write permission bit for the group owner of the file.  Usually 020.
+-
+-`S_IXGRP'
+-     Execute or search permission bit for the group owner of the file.
+-     Usually 010.
+-
+-`S_IRWXG'
+-     This is equivalent to `(S_IRGRP | S_IWGRP | S_IXGRP)'.
+-
+-`S_IROTH'
+-     Read permission bit for other users.  Usually 04.
+-
+-`S_IWOTH'
+-     Write permission bit for other users.  Usually 02.
+-
+-`S_IXOTH'
+-     Execute or search permission bit for other users.  Usually 01.
+-
+-`S_IRWXO'
+-     This is equivalent to `(S_IROTH | S_IWOTH | S_IXOTH)'.
+-
+-`S_ISUID'
+-     This is the set-user-ID on execute bit, usually 04000.  *Note How
+-     Change Persona::.
+-
+-`S_ISGID'
+-     This is the set-group-ID on execute bit, usually 02000.  *Note How
+-     Change Persona::.
+-
+-`S_ISVTX'
+-     This is the "sticky" bit, usually 01000.
+-
+-     On a directory, it gives permission to delete a file in the
+-     directory only if you own that file.  Ordinarily, a user either
+-     can delete all the files in the directory or cannot delete any of
+-     them (based on whether the user has write permission for the
+-     directory).  The same restriction applies--you must both have
+-     write permission for the directory and own the file you want to
+-     delete.  The one exception is that the owner of the directory can
+-     delete any file in the directory, no matter who owns it (provided
+-     the owner has given himself write permission for the directory).
+-     This is commonly used for the `/tmp' directory, where anyone may
+-     create files, but not delete files created by other users.
+-
+-     Originally the sticky bit on an executable file modified the
+-     swapping policies of the system.  Normally, when a program
+-     terminated, its pages in core were immediately freed and reused.
+-     If the sticky bit was set on the executable file, the system kept
+-     the pages in core for a while as if the program were still
+-     running.  This was advantageous for a program likely to be run
+-     many times in succession.  This usage is obsolete in modern
+-     systems.  When a program terminates, its pages always remain in
+-     core as long as there is no shortage of memory in the system.
+-     When the program is next run, its pages will still be in core if
+-     no shortage arose since the last run.
+-
+-     On some modern systems where the sticky bit has no useful meaning
+-     for an executable file, you cannot set the bit at all for a
+-     non-directory.  If you try, `chmod' fails with `EFTYPE'; *note
+-     Setting Permissions::..
+-
+-     Some systems (particularly SunOS) have yet another use for the
+-     sticky bit.  If the sticky bit is set on a file that is *not*
+-     executable, it means the opposite: never cache the pages of this
+-     file at all.  The main use of this is for the files on an NFS
+-     server machine which are used as the swap area of diskless client
+-     machines.  The idea is that the pages of the file will be cached
+-     in the client's memory, so it is a waste of the server's memory to
+-     cache them a second time.  In this use the sticky bit also says
+-     that the filesystem may fail to record the file's modification
+-     time onto disk reliably (the idea being that no-one cares for a
+-     swap file).
+-
+-     This bit is only available on BSD systems (and those derived from
+-     them).  Therefore one has to use the `_BSD_SOURCE' feature select
+-     macro to get the definition (*note Feature Test Macros::.).
+-
+-   The actual bit values of the symbols are listed in the table above
+-so you can decode file mode values when debugging your programs.  These
+-bit values are correct for most systems, but they are not guaranteed.
+-
+-   *Warning:* Writing explicit numbers for file permissions is bad
+-practice.  It is not only non-portable, it also requires everyone who
+-reads your program to remember what the bits mean.  To make your
+-program clean, use the symbolic names.
+-
+-
+-File: libc.info,  Node: Access Permission,  Next: Setting Permissions,  Prev: Permission Bits,  Up: File Attributes
+-
+-How Your Access to a File is Decided
+-------------------------------------
+-
+-   Recall that the operating system normally decides access permission
+-for a file based on the effective user and group IDs of the process,
+-and its supplementary group IDs, together with the file's owner, group
+-and permission bits.  These concepts are discussed in detail in *Note
+-Process Persona::.
+-
+-   If the effective user ID of the process matches the owner user ID of
+-the file, then permissions for read, write, and execute/search are
+-controlled by the corresponding "user" (or "owner") bits.  Likewise, if
+-any of the effective group ID or supplementary group IDs of the process
+-matches the group owner ID of the file, then permissions are controlled
+-by the "group" bits.  Otherwise, permissions are controlled by the
+-"other" bits.
+-
+-   Privileged users, like `root', can access any file, regardless of
+-its file permission bits.  As a special case, for a file to be
+-executable even for a privileged user, at least one of its execute bits
+-must be set.
+-
+-
+-File: libc.info,  Node: Setting Permissions,  Next: Testing File Access,  Prev: Access Permission,  Up: File Attributes
+-
+-Assigning File Permissions
+---------------------------
+-
+-   The primitive functions for creating files (for example, `open' or
+-`mkdir') take a MODE argument, which specifies the file permissions for
+-the newly created file.  But the specified mode is modified by the
+-process's "file creation mask", or "umask", before it is used.
+-
+-   The bits that are set in the file creation mask identify permissions
+-that are always to be disabled for newly created files.  For example, if
+-you set all the "other" access bits in the mask, then newly created
+-files are not accessible at all to processes in the "other" category,
+-even if the MODE argument specified to the creation function would
+-permit such access.  In other words, the file creation mask is the
+-complement of the ordinary access permissions you want to grant.
+-
+-   Programs that create files typically specify a MODE argument that
+-includes all the permissions that make sense for the particular file.
+-For an ordinary file, this is typically read and write permission for
+-all classes of users.  These permissions are then restricted as
+-specified by the individual user's own file creation mask.
+-
+-   To change the permission of an existing file given its name, call
+-`chmod'.  This function ignores the file creation mask; it uses exactly
+-the specified permission bits.
+-
+-   In normal use, the file creation mask is initialized in the user's
+-login shell (using the `umask' shell command), and inherited by all
+-subprocesses.  Application programs normally don't need to worry about
+-the file creation mask.  It will do automatically what it is supposed to
+-do.
+-
+-   When your program should create a file and bypass the umask for its
+-access permissions, the easiest way to do this is to use `fchmod' after
+-opening the file, rather than changing the umask.
+-
+-   In fact, changing the umask is usually done only by shells.  They use
+-the `umask' function.
+-
+-   The functions in this section are declared in `sys/stat.h'.
+-
+- - Function: mode_t umask (mode_t MASK)
+-     The `umask' function sets the file creation mask of the current
+-     process to MASK, and returns the previous value of the file
+-     creation mask.
+-
+-     Here is an example showing how to read the mask with `umask'
+-     without changing it permanently:
+-
+-          mode_t
+-          read_umask (void)
+-          {
+-            mode_t mask = umask (0);
+-            umask (mask);
+-            return mask;
+-          }
+-
+-     However, it is better to use `getumask' if you just want to read
+-     the mask value, because that is reentrant (at least if you use the
+-     GNU operating system).
+-
+- - Function: mode_t getumask (void)
+-     Return the current value of the file creation mask for the current
+-     process.  This function is a GNU extension.
+-
+- - Function: int chmod (const char *FILENAME, mode_t MODE)
+-     The `chmod' function sets the access permission bits for the file
+-     named by FILENAME to MODE.
+-
+-     If the FILENAME names a symbolic link, `chmod' changes the
+-     permission of the file pointed to by the link, not those of the
+-     link itself.
+-
+-     This function returns `0' if successful and `-1' if not.  In
+-     addition to the usual file name errors (*note File Name
+-     Errors::.), the following `errno' error conditions are defined for
+-     this function:
+-
+-    `ENOENT'
+-          The named file doesn't exist.
+-
+-    `EPERM'
+-          This process does not have permission to change the access
+-          permission of this file.  Only the file's owner (as judged by
+-          the effective user ID of the process) or a privileged user
+-          can change them.
+-
+-    `EROFS'
+-          The file resides on a read-only file system.
+-
+-    `EFTYPE'
+-          MODE has the `S_ISVTX' bit (the "sticky bit") set, and the
+-          named file is not a directory.  Some systems do not allow
+-          setting the sticky bit on non-directory files, and some do
+-          (and only some of those assign a useful meaning to the bit
+-          for non-directory files).
+-
+-          You only get `EFTYPE' on systems where the sticky bit has no
+-          useful meaning for non-directory files, so it is always safe
+-          to just clear the bit in MODE and call `chmod' again.  *Note
+-          Permission Bits::, for full details on the sticky bit.
+-
+- - Function: int fchmod (int FILEDES, int MODE)
+-     This is like `chmod', except that it changes the permissions of
+-     the file currently open via descriptor FILEDES.
+-
+-     The return value from `fchmod' is `0' on success and `-1' on
+-     failure.  The following `errno' error codes are defined for this
+-     function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The FILEDES argument corresponds to a pipe or socket, or
+-          something else that doesn't really have access permissions.
+-
+-    `EPERM'
+-          This process does not have permission to change the access
+-          permission of this file.  Only the file's owner (as judged by
+-          the effective user ID of the process) or a privileged user
+-          can change them.
+-
+-    `EROFS'
+-          The file resides on a read-only file system.
+-
+-
+-File: libc.info,  Node: Testing File Access,  Next: File Times,  Prev: Setting Permissions,  Up: File Attributes
+-
+-Testing Permission to Access a File
+------------------------------------
+-
+-   When a program runs as a privileged user, this permits it to access
+-files off-limits to ordinary users--for example, to modify
+-`/etc/passwd'.  Programs designed to be run by ordinary users but
+-access such files use the setuid bit feature so that they always run
+-with `root' as the effective user ID.
+-
+-   Such a program may also access files specified by the user, files
+-which conceptually are being accessed explicitly by the user.  Since the
+-program runs as `root', it has permission to access whatever file the
+-user specifies--but usually the desired behavior is to permit only
+-those files which the user could ordinarily access.
+-
+-   The program therefore must explicitly check whether *the user* would
+-have the necessary access to a file, before it reads or writes the file.
+-
+-   To do this, use the function `access', which checks for access
+-permission based on the process's *real* user ID rather than the
+-effective user ID.  (The setuid feature does not alter the real user ID,
+-so it reflects the user who actually ran the program.)
+-
+-   There is another way you could check this access, which is easy to
+-describe, but very hard to use.  This is to examine the file mode bits
+-and mimic the system's own access computation.  This method is
+-undesirable because many systems have additional access control
+-features; your program cannot portably mimic them, and you would not
+-want to try to keep track of the diverse features that different systems
+-have.  Using `access' is simple and automatically does whatever is
+-appropriate for the system you are using.
+-
+-   `access' is *only* only appropriate to use in setuid programs.  A
+-non-setuid program will always use the effective ID rather than the
+-real ID.
+-
+-   The symbols in this section are declared in `unistd.h'.
+-
+- - Function: int access (const char *FILENAME, int HOW)
+-     The `access' function checks to see whether the file named by
+-     FILENAME can be accessed in the way specified by the HOW argument.
+-     The HOW argument either can be the bitwise OR of the flags
+-     `R_OK', `W_OK', `X_OK', or the existence test `F_OK'.
+-
+-     This function uses the *real* user and group ID's of the calling
+-     process, rather than the *effective* ID's, to check for access
+-     permission.  As a result, if you use the function from a `setuid'
+-     or `setgid' program (*note How Change Persona::.), it gives
+-     information relative to the user who actually ran the program.
+-
+-     The return value is `0' if the access is permitted, and `-1'
+-     otherwise.  (In other words, treated as a predicate function,
+-     `access' returns true if the requested access is *denied*.)
+-
+-     In addition to the usual file name errors (*note File Name
+-     Errors::.), the following `errno' error conditions are defined for
+-     this function:
+-
+-    `EACCES'
+-          The access specified by HOW is denied.
+-
+-    `ENOENT'
+-          The file doesn't exist.
+-
+-    `EROFS'
+-          Write permission was requested for a file on a read-only file
+-          system.
+-
+-   These macros are defined in the header file `unistd.h' for use as
+-the HOW argument to the `access' function.  The values are integer
+-constants.
+-
+- - Macro: int R_OK
+-     Argument that means, test for read permission.
+-
+- - Macro: int W_OK
+-     Argument that means, test for write permission.
+-
+- - Macro: int X_OK
+-     Argument that means, test for execute/search permission.
+-
+- - Macro: int F_OK
+-     Argument that means, test for existence of the file.
+-
+-
+-File: libc.info,  Node: File Times,  Next: File Size,  Prev: Testing File Access,  Up: File Attributes
+-
+-File Times
+-----------
+-
+-   Each file has three time stamps associated with it:  its access time,
+-its modification time, and its attribute modification time.  These
+-correspond to the `st_atime', `st_mtime', and `st_ctime' members of the
+-`stat' structure; see *Note File Attributes::.
+-
+-   All of these times are represented in calendar time format, as
+-`time_t' objects.  This data type is defined in `time.h'.  For more
+-information about representation and manipulation of time values, see
+-*Note Calendar Time::.
+-
+-   Reading from a file updates its access time attribute, and writing
+-updates its modification time.  When a file is created, all three time
+-stamps for that file are set to the current time.  In addition, the
+-attribute change time and modification time fields of the directory that
+-contains the new entry are updated.
+-
+-   Adding a new name for a file with the `link' function updates the
+-attribute change time field of the file being linked, and both the
+-attribute change time and modification time fields of the directory
+-containing the new name.  These same fields are affected if a file name
+-is deleted with `unlink', `remove', or `rmdir'.  Renaming a file with
+-`rename' affects only the attribute change time and modification time
+-fields of the two parent directories involved, and not the times for
+-the file being renamed.
+-
+-   Changing attributes of a file (for example, with `chmod') updates
+-its attribute change time field.
+-
+-   You can also change some of the time stamps of a file explicitly
+-using the `utime' function--all except the attribute change time.  You
+-need to include the header file `utime.h' to use this facility.
+-
+- - Data Type: struct utimbuf
+-     The `utimbuf' structure is used with the `utime' function to
+-     specify new access and modification times for a file.  It contains
+-     the following members:
+-
+-    `time_t actime'
+-          This is the access time for the file.
+-
+-    `time_t modtime'
+-          This is the modification time for the file.
+-
+- - Function: int utime (const char *FILENAME, const struct utimbuf
+-          *TIMES)
+-     This function is used to modify the file times associated with the
+-     file named FILENAME.
+-
+-     If TIMES is a null pointer, then the access and modification times
+-     of the file are set to the current time.  Otherwise, they are set
+-     to the values from the `actime' and `modtime' members
+-     (respectively) of the `utimbuf' structure pointed at by TIMES.
+-
+-     The attribute modification time for the file is set to the current
+-     time in either case (since changing the time stamps is itself a
+-     modification of the file attributes).
+-
+-     The `utime' function returns `0' if successful and `-1' on
+-     failure.  In addition to the usual file name errors (*note File
+-     Name Errors::.), the following `errno' error conditions are
+-     defined for this function:
+-
+-    `EACCES'
+-          There is a permission problem in the case where a null
+-          pointer was passed as the TIMES argument.  In order to update
+-          the time stamp on the file, you must either be the owner of
+-          the file, have write permission on the file, or be a
+-          privileged user.
+-
+-    `ENOENT'
+-          The file doesn't exist.
+-
+-    `EPERM'
+-          If the TIMES argument is not a null pointer, you must either
+-          be the owner of the file or be a privileged user.  This error
+-          is used to report the problem.
+-
+-    `EROFS'
+-          The file lives on a read-only file system.
+-
+-   Each of the three time stamps has a corresponding microsecond part,
+-which extends its resolution.  These fields are called `st_atime_usec',
+-`st_mtime_usec', and `st_ctime_usec'; each has a value between 0 and
+-999,999, which indicates the time in microseconds.  They correspond to
+-the `tv_usec' field of a `timeval' structure; see *Note High-Resolution
+-Calendar::.
+-
+-   The `utimes' function is like `utime', but also lets you specify the
+-fractional part of the file times.  The prototype for this function is
+-in the header file `sys/time.h'.
+-
+- - Function: int utimes (const char *FILENAME, struct timeval TVP[2])
+-     This function sets the file access and modification times for the
+-     file named by FILENAME.  The new file access time is specified by
+-     `TVP[0]', and the new modification time by `TVP[1]'.  This
+-     function comes from BSD.
+-
+-     The return values and error conditions are the same as for the
+-     `utime' function.
+-
+-
+-File: libc.info,  Node: File Size,  Prev: File Times,  Up: File Attributes
+-
+-File Size
+----------
+-
+-   Normally file sizes are maintained automatically.  A file begins
+-with a size of 0 and is automatically extended when data is written
+-past its end.  It is also possible to empty a file completely in an
+-`open' or `fopen' call.
+-
+-   However, sometimes it is neccessary to *reduce* the size of a file.
+-This can be done with the `truncate' and `ftruncate' functions.  They
+-were introduced in BSD Unix.  `ftruncate' was later added to POSIX.1.
+-
+-   Some systems allow you to extend a file (creating holes) with these
+-functions.  This is useful when using memory-mapped I/O (*note
+-Memory-mapped I/O::.), where files are not automatically extended.
+-However it is not portable but must be implemented if `mmap' allows
+-mapping of files (i.e., `_POSIX_MAPPED_FILES' is defined).
+-
+-   Using these functions on anything other than a regular file gives
+-*undefined* results.  On many systems, such a call will appear to
+-succeed, without actually accomplishing anything.
+-
+- - Function: int truncate (const char *FILENAME, off_t LENGTH)
+-     The `truncate' function changes the size of FILENAME to LENGTH.
+-     If LENGTH is shorter than the previous length, data at the end
+-     will be lost.
+-
+-     If LENGTH is longer, holes will be added to the end.  However, some
+-     systems do not support this feature and will leave the file
+-     unchanged.
+-
+-     The return value is 0 for success, or -1 for an error.  In
+-     addition to the usual file name errors, the following errors may
+-     occur:
+-
+-    `EACCES'
+-          The file is a directory or not writable.
+-
+-    `EINVAL'
+-          LENGTH is negative.
+-
+-    `EFBIG'
+-          The operation would extend the file beyond the limits of the
+-          operating system.
+-
+-    `EIO'
+-          A hardware I/O error occured.
+-
+-    `EPERM'
+-          The file is "append-only" or "immutable".
+-
+-    `EINTR'
+-          The operation was interrupted by a signal.
+-
+-
+- - Function: int ftruncate (int FD, off_t LENGTH)
+-     This is like `truncate', but it works on a file descriptor FD.
+-
+-     `ftruncate' is especially useful in combination with `mmap'.
+-     Since the mapped region must have a fixed size one cannot enlarge
+-     the file by writing something beyond the last mapped page.
+-     Instead one has to enlarge the file itself and then remap the file
+-     with the new size.  The example below shows how this works.
+-
+-     The return value is 0 for success, or -1 for an error.  The
+-     following errors may occur:
+-
+-    `EBADF'
+-          FD does not correspond to an open file.
+-
+-    `EACCES'
+-          FD is a directory or not open for write.
+-
+-    `EINVAL'
+-          LENGTH is negative.
+-
+-    `EFBIG'
+-          The operation would extend the file beyond the limits of the
+-          operating system.
+-
+-    `EIO'
+-          A hardware I/O error occured.
+-
+-    `EPERM'
+-          The file is "append-only" or "immutable".
+-
+-    `EINTR'
+-          The operation was interrupted by a signal.
+-
+-
+-   As announced here is a little example how to use `ftruncate' in
+-combination with `mmap':
+-
+-     int fd;
+-     void *start;
+-     size_t len;
+-     
+-     int
+-     add (off_t at, void *block, size_t size)
+-     {
+-       if (at + size > len)
+-         {
+-           /* Resize the file and remap.  */
+-           size_t ps = sysconf (_SC_PAGESIZE);
+-           size_t ns = (at + size + ps - 1) & ~(ps - 1);
+-           void *np;
+-           if (ftruncate (fd, ns) < 0)
+-             return -1;
+-           np = mmap (NULL, ns, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+-           if (np == MAP_FAILED)
+-             return -1;
+-           start = np;
+-           len = ns;
+-         }
+-       memcpy ((char *) start + at, block, size);
+-       return 0;
+-     }
+-
+-   The function `add' allows to add at arbitrary positions in the file
+-given blocks of memory.  If the current size of the file is too small it
+-is extended.  Please note the it is extended in multiples of a pagesize.
+-This is a requirement of `mmap'.  The program has to track the real
+-size and once the program finished to work a final `ftruncate' call
+-should set the real size of the file.
+-
+-
+-File: libc.info,  Node: Making Special Files,  Next: Temporary Files,  Prev: File Attributes,  Up: File System Interface
+-
+-Making Special Files
+-====================
+-
+-   The `mknod' function is the primitive for making special files, such
+-as files that correspond to devices.  The GNU library includes this
+-function for compatibility with BSD.
+-
+-   The prototype for `mknod' is declared in `sys/stat.h'.
+-
+- - Function: int mknod (const char *FILENAME, int MODE, int DEV)
+-     The `mknod' function makes a special file with name FILENAME.  The
+-     MODE specifies the mode of the file, and may include the various
+-     special file bits, such as `S_IFCHR' (for a character special file)
+-     or `S_IFBLK' (for a block special file).  *Note Testing File
+-     Type::.
+-
+-     The DEV argument specifies which device the special file refers to.
+-     Its exact interpretation depends on the kind of special file being
+-     created.
+-
+-     The return value is `0' on success and `-1' on error.  In addition
+-     to the usual file name errors (*note File Name Errors::.), the
+-     following `errno' error conditions are defined for this function:
+-
+-    `EPERM'
+-          The calling process is not privileged.  Only the superuser
+-          can create special files.
+-
+-    `ENOSPC'
+-          The directory or file system that would contain the new file
+-          is full and cannot be extended.
+-
+-    `EROFS'
+-          The directory containing the new file can't be modified
+-          because it's on a read-only file system.
+-
+-    `EEXIST'
+-          There is already a file named FILENAME.  If you want to
+-          replace this file, you must remove the old file explicitly
+-          first.
+-
+-
+-File: libc.info,  Node: Temporary Files,  Prev: Making Special Files,  Up: File System Interface
+-
+-Temporary Files
+-===============
+-
+-   If you need to use a temporary file in your program, you can use the
+-`tmpfile' function to open it.  Or you can use the `tmpnam' (better:
+-`tmpnam_r') function to make a name for a temporary file and then you
+-can open it in the usual way with `fopen'.
+-
+-   The `tempnam' function is like `tmpnam' but lets you choose what
+-directory temporary files will go in, and something about what their
+-file names will look like.  Important for multi threaded programs is
+-that `tempnam' is reentrant while `tmpnam' is not since it returns a
+-pointer to a static buffer.
+-
+-   These facilities are declared in the header file `stdio.h'.
+-
+- - Function: FILE * tmpfile (void)
+-     This function creates a temporary binary file for update mode, as
+-     if by calling `fopen' with mode `"wb+"'.  The file is deleted
+-     automatically when it is closed or when the program terminates.
+-     (On some other ISO C systems the file may fail to be deleted if
+-     the program terminates abnormally).
+-
+-     This function is reentrant.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `tmpfile64'.  I.e., the
+-     LFS interface transparently replaces the old interface.
+-
+- - Function: FILE * tmpfile64 (void)
+-     This function is similar to `tmpfile' but the stream it returns a
+-     pointer for is opened using `tmpfile64'.  Therefore this stream
+-     can be used even on files larger then 2^31 bytes on 32 bits
+-     machines.
+-
+-     Please note that the return type is still `FILE *'.  There is no
+-     special `FILE' type for the LFS interface.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `tmpfile'
+-     and so transparently replaces the old interface.
+-
+- - Function: char * tmpnam (char *RESULT)
+-     This function constructs and returns a file name that is a valid
+-     file name and that does not name any existing file.  If the RESULT
+-     argument is a null pointer, the return value is a pointer to an
+-     internal static string, which might be modified by subsequent
+-     calls and therefore makes this function non-reentrant.  Otherwise,
+-     the RESULT argument should be a pointer to an array of at least
+-     `L_tmpnam' characters, and the result is written into that array.
+-
+-     It is possible for `tmpnam' to fail if you call it too many times
+-     without removing previously created files.  This is because the
+-     fixed length of a temporary file name gives room for only a finite
+-     number of different names.  If `tmpnam' fails, it returns a null
+-     pointer.
+-
+-     *Warning:* Since between the time the pathname is constructed and
+-     the file is created another process might have created a file with
+-     this name using `tmpnam' is a possible security hole.  The
+-     implementation generates names which hardly can be predicted but
+-     opening the file in any case should use the `O_EXCL' flag.  Using
+-     `tmpfile' is a safe way to avoid this problem.
+-
+- - Function: char * tmpnam_r (char *RESULT)
+-     This function is nearly identical to the `tmpnam' function.  But it
+-     does not allow RESULT to be a null pointer.  In the later case a
+-     null pointer is returned.
+-
+-     This function is reentrant because the non-reentrant situation of
+-     `tmpnam' cannot happen here.
+-
+- - Macro: int L_tmpnam
+-     The value of this macro is an integer constant expression that
+-     represents the minimum allocation size of a string large enough to
+-     hold the file name generated by the `tmpnam' function.
+-
+- - Macro: int TMP_MAX
+-     The macro `TMP_MAX' is a lower bound for how many temporary names
+-     you can create with `tmpnam'.  You can rely on being able to call
+-     `tmpnam' at least this many times before it might fail saying you
+-     have made too many temporary file names.
+-
+-     With the GNU library, you can create a very large number of
+-     temporary file names--if you actually create the files, you will
+-     probably run out of disk space before you run out of names.  Some
+-     other systems have a fixed, small limit on the number of temporary
+-     files.  The limit is never less than `25'.
+-
+- - Function: char * tempnam (const char *DIR, const char *PREFIX)
+-     This function generates a unique temporary filename.  If PREFIX is
+-     not a null pointer, up to five characters of this string are used
+-     as a prefix for the file name.  The return value is a string newly
+-     allocated with `malloc'; you should release its storage with
+-     `free' when it is no longer needed.
+-
+-     Because the string is dynamically allocated this function is
+-     reentrant.
+-
+-     The directory prefix for the temporary file name is determined by
+-     testing each of the following, in sequence.  The directory must
+-     exist and be writable.
+-
+-        * The environment variable `TMPDIR', if it is defined.  For
+-          security reasons this only happens if the program is not SUID
+-          or SGID enabled.
+-
+-        * The DIR argument, if it is not a null pointer.
+-
+-        * The value of the `P_tmpdir' macro.
+-
+-        * The directory `/tmp'.
+-
+-     This function is defined for SVID compatibility.
+-
+- - SVID Macro: char * P_tmpdir
+-     This macro is the name of the default directory for temporary
+-     files.
+-
+-   Older Unix systems did not have the functions just described.
+-Instead they used `mktemp' and `mkstemp'.  Both of these functions work
+-by modifying a file name template string you pass.  The last six
+-characters of this string must be `XXXXXX'.  These six `X's are
+-replaced with six characters which make the whole string a unique file
+-name.  Usually the template string is something like
+-`/tmp/PREFIXXXXXXX', and each program uses a unique PREFIX.
+-
+-   *Note:* Because `mktemp' and `mkstemp' modify the template string,
+-you *must not* pass string constants to them.  String constants are
+-normally in read-only storage, so your program would crash when
+-`mktemp' or `mkstemp' tried to modify the string.
+-
+- - Function: char * mktemp (char *TEMPLATE)
+-     The `mktemp' function generates a unique file name by modifying
+-     TEMPLATE as described above.  If successful, it returns TEMPLATE
+-     as modified.  If `mktemp' cannot find a unique file name, it makes
+-     TEMPLATE an empty string and returns that.  If TEMPLATE does not
+-     end with `XXXXXX', `mktemp' returns a null pointer.
+-
+-     *Warning:* Since between the time the pathname is constructed and
+-     the file is created another process might have created a file with
+-     this name using `mktemp' is a possible security hole.  The
+-     implementation generates names which hardly can be predicted but
+-     opening the file in any case should use the `O_EXCL' flag.  Using
+-     `mkstemp' is a safe way to avoid this problem.
+-
+- - Function: int mkstemp (char *TEMPLATE)
+-     The `mkstemp' function generates a unique file name just as
+-     `mktemp' does, but it also opens the file for you with `open'
+-     (*note Opening and Closing Files::.).  If successful, it modifies
+-     TEMPLATE in place and returns a file descriptor open on that file
+-     for reading and writing.  If `mkstemp' cannot create a
+-     uniquely-named file, it returns `-1'.  If TEMPLATE does not end
+-     with `XXXXXX', `mkstemp' returns `-1' and does not modify TEMPLATE.
+-
+-     The file is opened using mode `0600'.  If the file is meant to be
+-     used by other users the mode must explicitly changed.
+-
+-   Unlike `mktemp', `mkstemp' is actually guaranteed to create a unique
+-file that cannot possibly clash with any other program trying to create
+-a temporary file.  This is because it works by calling `open' with the
+-`O_EXCL' flag bit, which says you want to always create a new file, and
+-get an error if the file already exists.
+-
+-
+-File: libc.info,  Node: Pipes and FIFOs,  Next: Sockets,  Prev: File System Interface,  Up: Top
+-
+-Pipes and FIFOs
+-***************
+-
+-   A "pipe" is a mechanism for interprocess communication; data written
+-to the pipe by one process can be read by another process.  The data is
+-handled in a first-in, first-out (FIFO) order.  The pipe has no name; it
+-is created for one use and both ends must be inherited from the single
+-process which created the pipe.
+-
+-   A "FIFO special file" is similar to a pipe, but instead of being an
+-anonymous, temporary connection, a FIFO has a name or names like any
+-other file.  Processes open the FIFO by name in order to communicate
+-through it.
+-
+-   A pipe or FIFO has to be open at both ends simultaneously.  If you
+-read from a pipe or FIFO file that doesn't have any processes writing
+-to it (perhaps because they have all closed the file, or exited), the
+-read returns end-of-file.  Writing to a pipe or FIFO that doesn't have a
+-reading process is treated as an error condition; it generates a
+-`SIGPIPE' signal, and fails with error code `EPIPE' if the signal is
+-handled or blocked.
+-
+-   Neither pipes nor FIFO special files allow file positioning.  Both
+-reading and writing operations happen sequentially; reading from the
+-beginning of the file and writing at the end.
+-
+-* Menu:
+-
+-* Creating a Pipe::             Making a pipe with the `pipe' function.
+-* Pipe to a Subprocess::        Using a pipe to communicate with a
+-				 child process.
+-* FIFO Special Files::          Making a FIFO special file.
+-* Pipe Atomicity::		When pipe (or FIFO) I/O is atomic.
+-
+-
+-File: libc.info,  Node: Creating a Pipe,  Next: Pipe to a Subprocess,  Up: Pipes and FIFOs
+-
+-Creating a Pipe
+-===============
+-
+-   The primitive for creating a pipe is the `pipe' function.  This
+-creates both the reading and writing ends of the pipe.  It is not very
+-useful for a single process to use a pipe to talk to itself.  In typical
+-use, a process creates a pipe just before it forks one or more child
+-processes (*note Creating a Process::.).  The pipe is then used for
+-communication either between the parent or child processes, or between
+-two sibling processes.
+-
+-   The `pipe' function is declared in the header file `unistd.h'.
+-
+- - Function: int pipe (int FILEDES[2])
+-     The `pipe' function creates a pipe and puts the file descriptors
+-     for the reading and writing ends of the pipe (respectively) into
+-     `FILEDES[0]' and `FILEDES[1]'.
+-
+-     An easy way to remember that the input end comes first is that file
+-     descriptor `0' is standard input, and file descriptor `1' is
+-     standard output.
+-
+-     If successful, `pipe' returns a value of `0'.  On failure, `-1' is
+-     returned.  The following `errno' error conditions are defined for
+-     this function:
+-
+-    `EMFILE'
+-          The process has too many files open.
+-
+-    `ENFILE'
+-          There are too many open files in the entire system.  *Note
+-          Error Codes::, for more information about `ENFILE'.  This
+-          error never occurs in the GNU system.
+-
+-   Here is an example of a simple program that creates a pipe.  This
+-program uses the `fork' function (*note Creating a Process::.) to create
+-a child process.  The parent process writes data to the pipe, which is
+-read by the child process.
+-
+-     #include <sys/types.h>
+-     #include <unistd.h>
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     
+-     /* Read characters from the pipe and echo them to `stdout'. */
+-     
+-     void
+-     read_from_pipe (int file)
+-     {
+-       FILE *stream;
+-       int c;
+-       stream = fdopen (file, "r");
+-       while ((c = fgetc (stream)) != EOF)
+-         putchar (c);
+-       fclose (stream);
+-     }
+-     
+-     /* Write some random text to the pipe. */
+-     
+-     void
+-     write_to_pipe (int file)
+-     {
+-       FILE *stream;
+-       stream = fdopen (file, "w");
+-       fprintf (stream, "hello, world!\n");
+-       fprintf (stream, "goodbye, world!\n");
+-       fclose (stream);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       pid_t pid;
+-       int mypipe[2];
+-     /* Create the pipe. */
+-       if (pipe (mypipe))
+-         {
+-           fprintf (stderr, "Pipe failed.\n");
+-           return EXIT_FAILURE;
+-         }
+-     
+-       /* Create the child process. */
+-       pid = fork ();
+-       if (pid == (pid_t) 0)
+-         {
+-           /* This is the child process. */
+-           read_from_pipe (mypipe[0]);
+-           return EXIT_SUCCESS;
+-         }
+-       else if (pid < (pid_t) 0)
+-         {
+-           /* The fork failed. */
+-           fprintf (stderr, "Fork failed.\n");
+-           return EXIT_FAILURE;
+-         }
+-       else
+-         {
+-           /* This is the parent process. */
+-           write_to_pipe (mypipe[1]);
+-           return EXIT_SUCCESS;
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Pipe to a Subprocess,  Next: FIFO Special Files,  Prev: Creating a Pipe,  Up: Pipes and FIFOs
+-
+-Pipe to a Subprocess
+-====================
+-
+-   A common use of pipes is to send data to or receive data from a
+-program being run as subprocess.  One way of doing this is by using a
+-combination of `pipe' (to create the pipe), `fork' (to create the
+-subprocess), `dup2' (to force the subprocess to use the pipe as its
+-standard input or output channel), and `exec' (to execute the new
+-program).  Or, you can use `popen' and `pclose'.
+-
+-   The advantage of using `popen' and `pclose' is that the interface is
+-much simpler and easier to use.  But it doesn't offer as much
+-flexibility as using the low-level functions directly.
+-
+- - Function: FILE * popen (const char *COMMAND, const char *MODE)
+-     The `popen' function is closely related to the `system' function;
+-     see *Note Running a Command::.  It executes the shell command
+-     COMMAND as a subprocess.  However, instead of waiting for the
+-     command to complete, it creates a pipe to the subprocess and
+-     returns a stream that corresponds to that pipe.
+-
+-     If you specify a MODE argument of `"r"', you can read from the
+-     stream to retrieve data from the standard output channel of the
+-     subprocess.  The subprocess inherits its standard input channel
+-     from the parent process.
+-
+-     Similarly, if you specify a MODE argument of `"w"', you can write
+-     to the stream to send data to the standard input channel of the
+-     subprocess.  The subprocess inherits its standard output channel
+-     from the parent process.
+-
+-     In the event of an error, `popen' returns a null pointer.  This
+-     might happen if the pipe or stream cannot be created, if the
+-     subprocess cannot be forked, or if the program cannot be executed.
+-
+- - Function: int pclose (FILE *STREAM)
+-     The `pclose' function is used to close a stream created by `popen'.
+-     It waits for the child process to terminate and returns its status
+-     value, as for the `system' function.
+-
+-   Here is an example showing how to use `popen' and `pclose' to filter
+-output through another program, in this case the paging program `more'.
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     
+-     void
+-     write_data (FILE * stream)
+-     {
+-       int i;
+-       for (i = 0; i < 100; i++)
+-         fprintf (stream, "%d\n", i);
+-       if (ferror (stream))
+-         {
+-           fprintf (stderr, "Output to stream failed.\n");
+-           exit (EXIT_FAILURE);
+-         }
+-     }
+-     int
+-     main (void)
+-     {
+-       FILE *output;
+-     
+-       output = popen ("more", "w");
+-       if (!output)
+-         {
+-           fprintf (stderr, "Could not run more.\n");
+-           return EXIT_FAILURE;
+-         }
+-       write_data (output);
+-       pclose (output);
+-       return EXIT_SUCCESS;
+-     }
+-
+-
+-File: libc.info,  Node: FIFO Special Files,  Next: Pipe Atomicity,  Prev: Pipe to a Subprocess,  Up: Pipes and FIFOs
+-
+-FIFO Special Files
+-==================
+-
+-   A FIFO special file is similar to a pipe, except that it is created
+-in a different way.  Instead of being an anonymous communications
+-channel, a FIFO special file is entered into the file system by calling
+-`mkfifo'.
+-
+-   Once you have created a FIFO special file in this way, any process
+-can open it for reading or writing, in the same way as an ordinary file.
+-However, it has to be open at both ends simultaneously before you can
+-proceed to do any input or output operations on it.  Opening a FIFO for
+-reading normally blocks until some other process opens the same FIFO for
+-writing, and vice versa.
+-
+-   The `mkfifo' function is declared in the header file `sys/stat.h'.
+-
+- - Function: int mkfifo (const char *FILENAME, mode_t MODE)
+-     The `mkfifo' function makes a FIFO special file with name
+-     FILENAME.  The MODE argument is used to set the file's
+-     permissions; see *Note Setting Permissions::.
+-
+-     The normal, successful return value from `mkfifo' is `0'.  In the
+-     case of an error, `-1' is returned.  In addition to the usual file
+-     name errors (*note File Name Errors::.), the following `errno'
+-     error conditions are defined for this function:
+-
+-    `EEXIST'
+-          The named file already exists.
+-
+-    `ENOSPC'
+-          The directory or file system cannot be extended.
+-
+-    `EROFS'
+-          The directory that would contain the file resides on a
+-          read-only file system.
+-
+-
+-File: libc.info,  Node: Pipe Atomicity,  Prev: FIFO Special Files,  Up: Pipes and FIFOs
+-
+-Atomicity of Pipe I/O
+-=====================
+-
+-   Reading or writing pipe data is "atomic" if the size of data written
+-is not greater than `PIPE_BUF'.  This means that the data transfer
+-seems to be an instantaneous unit, in that nothing else in the system
+-can observe a state in which it is partially complete.  Atomic I/O may
+-not begin right away (it may need to wait for buffer space or for data),
+-but once it does begin, it finishes immediately.
+-
+-   Reading or writing a larger amount of data may not be atomic; for
+-example, output data from other processes sharing the descriptor may be
+-interspersed.  Also, once `PIPE_BUF' characters have been written,
+-further writes will block until some characters are read.
+-
+-   *Note Limits for Files::, for information about the `PIPE_BUF'
+-parameter.
+-
+-
+-File: libc.info,  Node: Sockets,  Next: Low-Level Terminal Interface,  Prev: Pipes and FIFOs,  Up: Top
+-
+-Sockets
+-*******
+-
+-   This chapter describes the GNU facilities for interprocess
+-communication using sockets.
+-
+-   A "socket" is a generalized interprocess communication channel.
+-Like a pipe, a socket is represented as a file descriptor.  But, unlike
+-pipes, sockets support communication between unrelated processes, and
+-even between processes running on different machines that communicate
+-over a network.  Sockets are the primary means of communicating with
+-other machines; `telnet', `rlogin', `ftp', `talk', and the other
+-familiar network programs use sockets.
+-
+-   Not all operating systems support sockets.  In the GNU library, the
+-header file `sys/socket.h' exists regardless of the operating system,
+-and the socket functions always exist, but if the system does not
+-really support sockets, these functions always fail.
+-
+-   *Incomplete:* We do not currently document the facilities for
+-broadcast messages or for configuring Internet interfaces.  The
+-reentrant functions and some newer functions that are related to IPv6
+-aren't documented either so far.
+-
+-* Menu:
+-
+-* Socket Concepts::	Basic concepts you need to know about.
+-* Communication Styles::Stream communication, datagrams, and other styles.
+-* Socket Addresses::	How socket names ("addresses") work.
+-* Interface Naming::	Identifying specific network interfaces.
+-* Local Namespace::	Details about the local namespace.
+-* Internet Namespace::	Details about the Internet namespace.
+-* Misc Namespaces::	Other namespaces not documented fully here.
+-* Open/Close Sockets::  Creating sockets and destroying them.
+-* Connections::		Operations on sockets with connection state.
+-* Datagrams::		Operations on datagram sockets.
+-* Inetd::		Inetd is a daemon that starts servers on request.
+-			   The most convenient way to write a server
+-			   is to make it work with Inetd.
+-* Socket Options::	Miscellaneous low-level socket options.
+-* Networks Database::   Accessing the database of network names.
+-
+-
+-File: libc.info,  Node: Socket Concepts,  Next: Communication Styles,  Up: Sockets
+-
+-Socket Concepts
+-===============
+-
+-   When you create a socket, you must specify the style of communication
+-you want to use and the type of protocol that should implement it.  The
+-"communication style" of a socket defines the user-level semantics of
+-sending and receiving data on the socket.  Choosing a communication
+-style specifies the answers to questions such as these:
+-
+-   * *What are the units of data transmission?*  Some communication
+-     styles regard the data as a sequence of bytes, with no larger
+-     structure; others group the bytes into records (which are known in
+-     this context as "packets").
+-
+-   * *Can data be lost during normal operation?*  Some communication
+-     styles guarantee that all the data sent arrives in the order it was
+-     sent (barring system or network crashes); other styles occasionally
+-     lose data as a normal part of operation, and may sometimes deliver
+-     packets more than once or in the wrong order.
+-
+-     Designing a program to use unreliable communication styles usually
+-     involves taking precautions to detect lost or misordered packets
+-     and to retransmit data as needed.
+-
+-   * *Is communication entirely with one partner?*  Some communication
+-     styles are like a telephone call--you make a "connection" with one
+-     remote socket, and then exchange data freely.  Other styles are
+-     like mailing letters--you specify a destination address for each
+-     message you send.
+-
+-   You must also choose a "namespace" for naming the socket.  A socket
+-name ("address") is meaningful only in the context of a particular
+-namespace.  In fact, even the data type to use for a socket name may
+-depend on the namespace.  Namespaces are also called "domains", but we
+-avoid that word as it can be confused with other usage of the same
+-term.  Each namespace has a symbolic name that starts with `PF_'.  A
+-corresponding symbolic name starting with `AF_' designates the address
+-format for that namespace.
+-
+-   Finally you must choose the "protocol" to carry out the
+-communication.  The protocol determines what low-level mechanism is used
+-to transmit and receive data.  Each protocol is valid for a particular
+-namespace and communication style; a namespace is sometimes called a
+-"protocol family" because of this, which is why the namespace names
+-start with `PF_'.
+-
+-   The rules of a protocol apply to the data passing between two
+-programs, perhaps on different computers; most of these rules are
+-handled by the operating system, and you need not know about them.
+-What you do need to know about protocols is this:
+-
+-   * In order to have communication between two sockets, they must
+-     specify the *same* protocol.
+-
+-   * Each protocol is meaningful with particular style/namespace
+-     combinations and cannot be used with inappropriate combinations.
+-     For example, the TCP protocol fits only the byte stream style of
+-     communication and the Internet namespace.
+-
+-   * For each combination of style and namespace, there is a "default
+-     protocol" which you can request by specifying 0 as the protocol
+-     number.  And that's what you should normally do--use the default.
+-
+-   Throughout the following description at various places
+-variables/parameters to denote sizes are required.  And here the trouble
+-starts.  In the first implementations the type of these variables was
+-simply `int'.  This type was on almost all machines of this time 32
+-bits wide and so a de-factor standard required 32 bit variables.  This
+-is important since references to variables of this type are passed to
+-the kernel.
+-
+-   But then the POSIX people came and unified the interface with the
+-words "all size values are of type `size_t'".  But on 64 bit machines
+-`size_t' is 64 bits wide, and so variable references are not anymore
+-possible.
+-
+-   The Unix98 specification provides a solution by introducing a type
+-`socklen_t'.  This type is used in all of the cases that POSIX changed
+-to use `size_t'.  The only requirement of this type is that it be an
+-unsigned type of at least 32 bits.  Therefore, implementations which
+-require that references to 32 bit variables be passed can be as happy
+-as implementations which use 64 bit values.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-23 glibc-2.1.3/manual/libc.info-23
+--- ../glibc-2.1.3/manual/libc.info-23	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-23	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1160 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Communication Styles,  Next: Socket Addresses,  Prev: Socket Concepts,  Up: Sockets
+-
+-Communication Styles
+-====================
+-
+-   The GNU library includes support for several different kinds of
+-sockets, each with different characteristics.  This section describes
+-the supported socket types.  The symbolic constants listed here are
+-defined in `sys/socket.h'.
+-
+- - Macro: int SOCK_STREAM
+-     The `SOCK_STREAM' style is like a pipe (*note Pipes and FIFOs::.);
+-     it operates over a connection with a particular remote socket, and
+-     transmits data reliably as a stream of bytes.
+-
+-     Use of this style is covered in detail in *Note Connections::.
+-
+- - Macro: int SOCK_DGRAM
+-     The `SOCK_DGRAM' style is used for sending individually-addressed
+-     packets, unreliably.  It is the diametrical opposite of
+-     `SOCK_STREAM'.
+-
+-     Each time you write data to a socket of this kind, that data
+-     becomes one packet.  Since `SOCK_DGRAM' sockets do not have
+-     connections, you must specify the recipient address with each
+-     packet.
+-
+-     The only guarantee that the system makes about your requests to
+-     transmit data is that it will try its best to deliver each packet
+-     you send.  It may succeed with the sixth packet after failing with
+-     the fourth and fifth packets; the seventh packet may arrive before
+-     the sixth, and may arrive a second time after the sixth.
+-
+-     The typical use for `SOCK_DGRAM' is in situations where it is
+-     acceptable to simply resend a packet if no response is seen in a
+-     reasonable amount of time.
+-
+-     *Note Datagrams::, for detailed information about how to use
+-     datagram sockets.
+-
+- - Macro: int SOCK_RAW
+-     This style provides access to low-level network protocols and
+-     interfaces.  Ordinary user programs usually have no need to use
+-     this style.
+-
+-
+-File: libc.info,  Node: Socket Addresses,  Next: Interface Naming,  Prev: Communication Styles,  Up: Sockets
+-
+-Socket Addresses
+-================
+-
+-   The name of a socket is normally called an "address".  The functions
+-and symbols for dealing with socket addresses were named
+-inconsistently, sometimes using the term "name" and sometimes using
+-"address".  You can regard these terms as synonymous where sockets are
+-concerned.
+-
+-   A socket newly created with the `socket' function has no address.
+-Other processes can find it for communication only if you give it an
+-address.  We call this "binding" the address to the socket, and the way
+-to do it is with the `bind' function.
+-
+-   You need be concerned with the address of a socket if other processes
+-are to find it and start communicating with it.  You can specify an
+-address for other sockets, but this is usually pointless; the first time
+-you send data from a socket, or use it to initiate a connection, the
+-system assigns an address automatically if you have not specified one.
+-
+-   Occasionally a client needs to specify an address because the server
+-discriminates based on addresses; for example, the rsh and rlogin
+-protocols look at the client's socket address and only bypass password
+-checking if it is less than `IPPORT_RESERVED' (*note Ports::.).
+-
+-   The details of socket addresses vary depending on what namespace you
+-are using.  *Note Local Namespace::, or *Note Internet Namespace::, for
+-specific information.
+-
+-   Regardless of the namespace, you use the same functions `bind' and
+-`getsockname' to set and examine a socket's address.  These functions
+-use a phony data type, `struct sockaddr *', to accept the address.  In
+-practice, the address lives in a structure of some other data type
+-appropriate to the address format you are using, but you cast its
+-address to `struct sockaddr *' when you pass it to `bind'.
+-
+-* Menu:
+-
+-* Address Formats::		About `struct sockaddr'.
+-* Setting Address::		Binding an address to a socket.
+-* Reading Address::		Reading the address of a socket.
+-
+-
+-File: libc.info,  Node: Address Formats,  Next: Setting Address,  Up: Socket Addresses
+-
+-Address Formats
+----------------
+-
+-   The functions `bind' and `getsockname' use the generic data type
+-`struct sockaddr *' to represent a pointer to a socket address.  You
+-can't use this data type effectively to interpret an address or
+-construct one; for that, you must use the proper data type for the
+-socket's namespace.
+-
+-   Thus, the usual practice is to construct an address in the proper
+-namespace-specific type, then cast a pointer to `struct sockaddr *'
+-when you call `bind' or `getsockname'.
+-
+-   The one piece of information that you can get from the `struct
+-sockaddr' data type is the "address format" designator which tells you
+-which data type to use to understand the address fully.
+-
+-   The symbols in this section are defined in the header file
+-`sys/socket.h'.
+-
+- - Data Type: struct sockaddr
+-     The `struct sockaddr' type itself has the following members:
+-
+-    `short int sa_family'
+-          This is the code for the address format of this address.  It
+-          identifies the format of the data which follows.
+-
+-    `char sa_data[14]'
+-          This is the actual socket address data, which is
+-          format-dependent.  Its length also depends on the format, and
+-          may well be more than 14.  The length 14 of `sa_data' is
+-          essentially arbitrary.
+-
+-   Each address format has a symbolic name which starts with `AF_'.
+-Each of them corresponds to a `PF_' symbol which designates the
+-corresponding namespace.  Here is a list of address format names:
+-
+-`AF_LOCAL'
+-     This designates the address format that goes with the local
+-     namespace.  (`PF_LOCAL' is the name of that namespace.)  *Note
+-     Local Namespace Details::, for information about this address
+-     format.
+-
+-`AF_UNIX'
+-     This is a synonym for `AF_LOCAL', for compatibility.  (`PF_UNIX'
+-     is likewise a synonym for `PF_LOCAL'.)
+-
+-`AF_FILE'
+-     This is another synonym for `AF_LOCAL', for compatibility.
+-     (`PF_FILE' is likewise a synonym for `PF_LOCAL'.)
+-
+-`AF_INET'
+-     This designates the address format that goes with the Internet
+-     namespace.  (`PF_INET' is the name of that namespace.)  *Note
+-     Internet Address Formats::.
+-
+-`AF_INET6'
+-     This is similar to `AF_INET', but refers to the IPv6 protocol.
+-     (`PF_INET6' is the name of the corresponding namespace.)
+-
+-`AF_UNSPEC'
+-     This designates no particular address format.  It is used only in
+-     rare cases, such as to clear out the default destination address
+-     of a "connected" datagram socket.  *Note Sending Datagrams::.
+-
+-     The corresponding namespace designator symbol `PF_UNSPEC' exists
+-     for completeness, but there is no reason to use it in a program.
+-
+-   `sys/socket.h' defines symbols starting with `AF_' for many
+-different kinds of networks, all or most of which are not actually
+-implemented.  We will document those that really work, as we receive
+-information about how to use them.
+-
+-
+-File: libc.info,  Node: Setting Address,  Next: Reading Address,  Prev: Address Formats,  Up: Socket Addresses
+-
+-Setting the Address of a Socket
+--------------------------------
+-
+-   Use the `bind' function to assign an address to a socket.  The
+-prototype for `bind' is in the header file `sys/socket.h'.  For
+-examples of use, see *Note Local Socket Example::, or see *Note Inet
+-Example::.
+-
+- - Function: int bind (int SOCKET, struct sockaddr *ADDR, socklen_t
+-          LENGTH)
+-     The `bind' function assigns an address to the socket SOCKET.  The
+-     ADDR and LENGTH arguments specify the address; the detailed format
+-     of the address depends on the namespace.  The first part of the
+-     address is always the format designator, which specifies a
+-     namespace, and says that the address is in the format for that
+-     namespace.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `EADDRNOTAVAIL'
+-          The specified address is not available on this machine.
+-
+-    `EADDRINUSE'
+-          Some other socket is already using the specified address.
+-
+-    `EINVAL'
+-          The socket SOCKET already has an address.
+-
+-    `EACCES'
+-          You do not have permission to access the requested address.
+-          (In the Internet domain, only the super-user is allowed to
+-          specify a port number in the range 0 through
+-          `IPPORT_RESERVED' minus one; see *Note Ports::.)
+-
+-     Additional conditions may be possible depending on the particular
+-     namespace of the socket.
+-
+-
+-File: libc.info,  Node: Reading Address,  Prev: Setting Address,  Up: Socket Addresses
+-
+-Reading the Address of a Socket
+--------------------------------
+-
+-   Use the function `getsockname' to examine the address of an Internet
+-socket.  The prototype for this function is in the header file
+-`sys/socket.h'.
+-
+- - Function: int getsockname (int SOCKET, struct sockaddr *ADDR,
+-          socklen_t *LENGTH-PTR)
+-     The `getsockname' function returns information about the address
+-     of the socket SOCKET in the locations specified by the ADDR and
+-     LENGTH-PTR arguments.  Note that the LENGTH-PTR is a pointer; you
+-     should initialize it to be the allocation size of ADDR, and on
+-     return it contains the actual size of the address data.
+-
+-     The format of the address data depends on the socket namespace.
+-     The length of the information is usually fixed for a given
+-     namespace, so normally you can know exactly how much space is
+-     needed and can provide that much.  The usual practice is to
+-     allocate a place for the value using the proper data type for the
+-     socket's namespace, then cast its address to `struct sockaddr *'
+-     to pass it to `getsockname'.
+-
+-     The return value is `0' on success and `-1' on error.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `ENOBUFS'
+-          There are not enough internal buffers available for the
+-          operation.
+-
+-   You can't read the address of a socket in the file namespace.  This
+-is consistent with the rest of the system; in general, there's no way to
+-find a file's name from a descriptor for that file.
+-
+-
+-File: libc.info,  Node: Interface Naming,  Next: Local Namespace,  Prev: Socket Addresses,  Up: Sockets
+-
+-Interface Naming
+-================
+-
+-   Each network interface has a name.  This usually consists of a few
+-letters that relate to the type of interface, which may be followed by a
+-number if there is more than one interface of that type.  Examples
+-might be `lo' (the loopback interface) and `eth0' (the first Ethernet
+-interface).
+-
+-   Although such names are convenient for humans, it would be clumsy to
+-have to use them whenever a program needs to refer to an interface.  In
+-such situations an interface is referred to by its "index", which is an
+-arbitrarily-assigned small positive integer.
+-
+-   The following functions, constants and data types are declared in the
+-header file `net/if.h'.
+-
+- - Constant: size_t IFNAMSIZ
+-     This constant defines the maximum buffer size needed to hold an
+-     interface name, including its terminating zero byte.
+-
+- - Function: unsigned int if_nametoindex (const char *ifname)
+-     This function yields the interface index corresponding to a
+-     particular name.  If no interface exists with the name given, it
+-     returns 0.
+-
+- - Function: char * if_indextoname (unsigned int ifindex, char *ifname)
+-     This function maps an interface index to its corresponding name.
+-     The returned name is placed in the buffer pointed to by `ifname',
+-     which must be at least `IFNAMSIZE' bytes in length.  If the index
+-     was invalid, the function's return value is a null pointer,
+-     otherwise it is `ifname'.
+-
+- - Data Type: struct if_nameindex
+-     This data type is used to hold the information about a single
+-     interface.  It has the following members:
+-
+-    `unsigned int if_index;'
+-          This is the interface index.
+-
+-    `char *if_name'
+-          This is the null-terminated index name.
+-
+-
+- - Function: struct if_nameindex * if_nameindex (void)
+-     This function returns an array of `if_nameindex' structures, one
+-     for every interface that is present.  The end of the list is
+-     indicated by a structure with an interface of 0 and a null name
+-     pointer.  If an error occurs, this function returns a null pointer.
+-
+-     The returned structure must be freed with `if_freenameindex' after
+-     use.
+-
+- - Function: void if_freenameindex (struct if_nameindex *ptr)
+-     This function frees the structure returned by an earlier call to
+-     `if_nameindex'.
+-
+-
+-File: libc.info,  Node: Local Namespace,  Next: Internet Namespace,  Prev: Interface Naming,  Up: Sockets
+-
+-The Local Namespace
+-===================
+-
+-   This section describes the details of the local namespace, whose
+-symbolic name (required when you create a socket) is `PF_LOCAL'.  The
+-local namespace is also known as "Unix domain sockets".  Another name
+-is file namespace since socket addresses are normally implemented as
+-file names.
+-
+-* Menu:
+-
+-* Concepts: Local Namespace Concepts. What you need to understand.
+-* Details: Local Namespace Details.   Address format, symbolic names, etc.
+-* Example: Local Socket Example.      Example of creating a socket.
+-
+-
+-File: libc.info,  Node: Local Namespace Concepts,  Next: Local Namespace Details,  Up: Local Namespace
+-
+-Local Namespace Concepts
+-------------------------
+-
+-   In the local namespace, socket addresses are file names.  You can
+-specify any file name you want as the address of the socket, but you
+-must have write permission on the directory containing it.  In order to
+-connect to a socket, you must have read permission for it.  It's common
+-to put these files in the `/tmp' directory.
+-
+-   One peculiarity of the local namespace is that the name is only used
+-when opening the connection; once that is over with, the address is not
+-meaningful and may not exist.
+-
+-   Another peculiarity is that you cannot connect to such a socket from
+-another machine-not even if the other machine shares the file system
+-which contains the name of the socket.  You can see the socket in a
+-directory listing, but connecting to it never succeeds.  Some programs
+-take advantage of this, such as by asking the client to send its own
+-process ID, and using the process IDs to distinguish between clients.
+-However, we recommend you not to use this method in protocols you
+-design, as we might someday permit connections from other machines that
+-mount the same file systems.  Instead, send each new client an
+-identifying number if you want it to have one.
+-
+-   After you close a socket in the local namespace, you should delete
+-the file name from the file system.  Use `unlink' or `remove' to do
+-this; see *Note Deleting Files::.
+-
+-   The local namespace supports just one protocol for any communication
+-style; it is protocol number `0'.
+-
+-
+-File: libc.info,  Node: Local Namespace Details,  Next: Local Socket Example,  Prev: Local Namespace Concepts,  Up: Local Namespace
+-
+-Details of Local Namespace
+---------------------------
+-
+-   To create a socket in the local namespace, use the constant
+-`PF_LOCAL' as the NAMESPACE argument to `socket' or `socketpair'.  This
+-constant is defined in `sys/socket.h'.
+-
+- - Macro: int PF_LOCAL
+-     This designates the local namespace, in which socket addresses are
+-     local names, and its associated family of protocols.  `PF_Local'
+-     is the macro used by Posix.1g.
+-
+- - Macro: int PF_UNIX
+-     This is a synonym for `PF_LOCAL', for compatibility's sake.
+-
+- - Macro: int PF_FILE
+-     This is a synonym for `PF_LOCAL', for compatibility's sake.
+-
+-   The structure for specifying socket names in the local namespace is
+-defined in the header file `sys/un.h':
+-
+- - Data Type: struct sockaddr_un
+-     This structure is used to specify local namespace socket
+-     addresses.  It has the following members:
+-
+-    `short int sun_family'
+-          This identifies the address family or format of the socket
+-          address.  You should store the value `AF_LOCAL' to designate
+-          the local namespace.  *Note Socket Addresses::.
+-
+-    `char sun_path[108]'
+-          This is the file name to use.
+-
+-          *Incomplete:*  Why is 108 a magic number?  RMS suggests making
+-          this a zero-length array and tweaking the example following
+-          to use `alloca' to allocate an appropriate amount of storage
+-          based on the length of the filename.
+-
+-   You should compute the LENGTH parameter for a socket address in the
+-local namespace as the sum of the size of the `sun_family' component
+-and the string length (*not* the allocation size!) of the file name
+-string.  This can be done using the macro `SUN_LEN':
+-
+- - Macro: int SUN_LEN (*struct sockaddr_un ** PTR)
+-     The macro computes the length of socket address in the local
+-     namespace.
+-
+-
+-File: libc.info,  Node: Local Socket Example,  Prev: Local Namespace Details,  Up: Local Namespace
+-
+-Example of Local-Namespace Sockets
+-----------------------------------
+-
+-   Here is an example showing how to create and name a socket in the
+-local namespace.
+-
+-     #include <stddef.h>
+-     #include <stdio.h>
+-     #include <errno.h>
+-     #include <stdlib.h>
+-     #include <sys/socket.h>
+-     #include <sys/un.h>
+-     
+-     int
+-     make_named_socket (const char *filename)
+-     {
+-       struct sockaddr_un name;
+-       int sock;
+-       size_t size;
+-     
+-       /* Create the socket. */
+-       sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
+-       if (sock < 0)
+-         {
+-           perror ("socket");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Bind a name to the socket. */
+-       name.sun_family = AF_LOCAL;
+-       strncpy (name.sun_path, filename, sizeof (name.sun_path));
+-     
+-       /* The size of the address is
+-          the offset of the start of the filename,
+-          plus its length,
+-          plus one for the terminating null byte.
+-          Alternativly you can just do:
+-          size = SUN_LEN (&name);
+-      */
+-       size = (offsetof (struct sockaddr_un, sun_path)
+-               + strlen (name.sun_path) + 1);
+-     
+-       if (bind (sock, (struct sockaddr *) &name, size) < 0)
+-         {
+-           perror ("bind");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       return sock;
+-     }
+-
+-
+-File: libc.info,  Node: Internet Namespace,  Next: Misc Namespaces,  Prev: Local Namespace,  Up: Sockets
+-
+-The Internet Namespace
+-======================
+-
+-   This section describes the details of the protocols and socket naming
+-conventions used in the Internet namespace.
+-
+-   Originaly the Internet namespace used only IP version 4 (IPv4).  With
+-the growing number of hosts on the Internet, a new protocol with a
+-larger address space was neccessary: IP version 6 (IPv6).  IPv6
+-introduces besides 128bit addresses (IPv4 has 32bit addresses) also
+-other features and will eventually replace IPv4.
+-
+-   To create a socket in the IPv4 Internet namespace, use the symbolic
+-name `PF_INET' of this namespace as the NAMESPACE argument to `socket'
+-or `socketpair'.  For IPv6 addresses, you need the macro `PF_INET6'.
+-These macros are defined in `sys/socket.h'.
+-
+- - Macro: int PF_INET
+-     This designates the IPv4 Internet namespace and associated family
+-     of protocols.
+-
+- - Macro: int AF_INET6
+-     This designates the IPv6 Internet namespace and associated family
+-     of protocols.
+-
+-   A socket address for the Internet namespace includes the following
+-components:
+-
+-   * The address of the machine you want to connect to.  Internet
+-     addresses can be specified in several ways; these are discussed in
+-     *Note Internet Address Formats::, *Note Host Addresses::, and
+-     *Note Host Names::.
+-
+-   * A port number for that machine.  *Note Ports::.
+-
+-   You must ensure that the address and port number are represented in a
+-canonical format called "network byte order".  *Note Byte Order::, for
+-information about this.
+-
+-* Menu:
+-
+-* Internet Address Formats::    How socket addresses are specified in the
+-                                 Internet namespace.
+-* Host Addresses::	        All about host addresses of internet host.
+-* Protocols Database::		Referring to protocols by name.
+-* Ports::			Internet port numbers.
+-* Services Database::           Ports may have symbolic names.
+-* Byte Order::		        Different hosts may use different byte
+-                                 ordering conventions; you need to
+-                                 canonicalize host address and port number.
+-* Inet Example::	        Putting it all together.
+-
+-
+-File: libc.info,  Node: Internet Address Formats,  Next: Host Addresses,  Up: Internet Namespace
+-
+-Internet Socket Address Formats
+--------------------------------
+-
+-   In the Internet namespace, for both IPv4 (`AF_INET') and IPv6
+-(`AF_INET6'), a socket address consists of a host address and a port on
+-that host.  In addition, the protocol you choose serves effectively as
+-a part of the address because local port numbers are meaningful only
+-within a particular protocol.
+-
+-   The data types for representing socket addresses in the Internet
+-namespace are defined in the header file `netinet/in.h'.
+-
+- - Data Type: struct sockaddr_in
+-     This is the data type used to represent socket addresses in the
+-     Internet namespace.  It has the following members:
+-
+-    `sa_family_t sin_family'
+-          This identifies the address family or format of the socket
+-          address.  You should store the value of `AF_INET' in this
+-          member.  *Note Socket Addresses::.
+-
+-    `struct in_addr sin_addr'
+-          This is the Internet address of the host machine.  *Note Host
+-          Addresses::, and *Note Host Names::, for how to get a value
+-          to store here.
+-
+-    `unsigned short int sin_port'
+-          This is the port number.  *Note Ports::.
+-
+-   When you call `bind' or `getsockname', you should specify `sizeof
+-(struct sockaddr_in)' as the LENGTH parameter if you are using an IPv4
+-Internet namespace socket address.
+-
+- - Data Type: struct sockaddr_in6
+-     This is the data type used to represent socket addresses in the
+-     IPv6 namespace.  It has the following members:
+-
+-    `sa_family_t sin6_family'
+-          This identifies the address family or format of the socket
+-          address.  You should store the value of `AF_INET6' in this
+-          member.  *Note Socket Addresses::.
+-
+-    `struct in6_addr sin6_addr'
+-          This is the IPv6 address of the host machine.  *Note Host
+-          Addresses::, and *Note Host Names::, for how to get a value
+-          to store here.
+-
+-    `uint32_t sin6_flowinfo'
+-          This is a currently unimplemented field.
+-
+-    `uint16_t sin6_port'
+-          This is the port number.  *Note Ports::.
+-
+-
+-
+-File: libc.info,  Node: Host Addresses,  Next: Protocols Database,  Prev: Internet Address Formats,  Up: Internet Namespace
+-
+-Host Addresses
+---------------
+-
+-   Each computer on the Internet has one or more "Internet addresses",
+-numbers which identify that computer among all those on the Internet.
+-Users typically write IPv4 numeric host addresses as sequences of four
+-numbers, separated by periods, as in `128.52.46.32', and IPv6 numeric
+-host addresses as sequences of up to eight numbers separated by colons,
+-as in `5f03:1200:836f:c100::1'.
+-
+-   Each computer also has one or more "host names", which are strings
+-of words separated by periods, as in `mescaline.gnu.org'.
+-
+-   Programs that let the user specify a host typically accept both
+-numeric addresses and host names.  But the program needs a numeric
+-address to open a connection; to use a host name, you must convert it
+-to the numeric address it stands for.
+-
+-* Menu:
+-
+-* Abstract Host Addresses::	What a host number consists of.
+-* Data type: Host Address Data Type.	Data type for a host number.
+-* Functions: Host Address Functions.	Functions to operate on them.
+-* Names: Host Names.		Translating host names to host numbers.
+-
+-
+-File: libc.info,  Node: Abstract Host Addresses,  Next: Host Address Data Type,  Up: Host Addresses
+-
+-Internet Host Addresses
+-.......................
+-
+-   Each computer on the Internet has one or more Internet addresses,
+-numbers which identify that computer among all those on the Internet.
+-
+-   An IPv4 Internet host address is a number containing four bytes of
+-data.  Historically these are divided into two parts, a "network
+-number" and a "local network address number" within that network.  In
+-the mid-1990s classless address were introduced which changed the
+-behaviour.  Since some functions implicitly expect the old definitions,
+-we first describe the class based network and will then describe
+-classless addresses.  IPv6 uses only classless adresses and therefore
+-the following paragraphs don't apply.
+-
+-   The class based IPv4 network number consists of the first one, two or
+-three bytes; the rest of the bytes are the local address.
+-
+-   IPv4 network numbers are registered with the Network Information
+-Center (NIC), and are divided into three classes--A, B, and C.  The
+-local network address numbers of individual machines are registered
+-with the administrator of the particular network.
+-
+-   Class A networks have single-byte numbers in the range 0 to 127.
+-There are only a small number of Class A networks, but they can each
+-support a very large number of hosts.  Medium-sized Class B networks
+-have two-byte network numbers, with the first byte in the range 128 to
+-191.  Class C networks are the smallest; they have three-byte network
+-numbers, with the first byte in the range 192-255.  Thus, the first 1,
+-2, or 3 bytes of an Internet address specifies a network.  The
+-remaining bytes of the Internet address specify the address within that
+-network.
+-
+-   The Class A network 0 is reserved for broadcast to all networks.  In
+-addition, the host number 0 within each network is reserved for
+-broadcast to all hosts in that network.  These uses are obsolete now
+-but out of compatibility reasons you shouldn't use network 0 and host
+-number 0.
+-
+-   The Class A network 127 is reserved for loopback; you can always use
+-the Internet address `127.0.0.1' to refer to the host machine.
+-
+-   Since a single machine can be a member of multiple networks, it can
+-have multiple Internet host addresses.  However, there is never
+-supposed to be more than one machine with the same host address.
+-
+-   There are four forms of the "standard numbers-and-dots notation" for
+-Internet addresses:
+-
+-`A.B.C.D'
+-     This specifies all four bytes of the address individually and is
+-     the commonly used representation.
+-
+-`A.B.C'
+-     The last part of the address, C, is interpreted as a 2-byte
+-     quantity.  This is useful for specifying host addresses in a Class
+-     B network with network address number `A.B'.
+-
+-`A.B'
+-     The last part of the address, B, is interpreted as a 3-byte
+-     quantity.  This is useful for specifying host addresses in a Class
+-     A network with network address number A.
+-
+-`A'
+-     If only one part is given, this corresponds directly to the host
+-     address number.
+-
+-   Within each part of the address, the usual C conventions for
+-specifying the radix apply.  In other words, a leading `0x' or `0X'
+-implies hexadecimal radix; a leading `0' implies octal; and otherwise
+-decimal radix is assumed.
+-
+-Classless Addresses
+-...................
+-
+-   IPv4 addresses (and IPv6 addresses also) are now considered as
+-classless.  The distinction between classes A, B, and C can be ignored.
+-Instead a IPv4 host adddress consists of a 32-bit address and a 32-bit
+-mask.  The mask contains bits of 1 for the network part and bits of 0
+-for the host part.  The 1-bits are contigous from the leftmost bit, the
+-0-bits are contigous from the rightmost bit so that the netmask can also
+-be written as a prefix length of bits of 1.  Classes A, B and C are just
+-special cases of this general rule.  For example, class A addresses have
+-a netmask of `255.0.0.0' or a prefix length of 8.
+-
+-   Classless IPv4 network addresses are written in numbers-and-dots
+-notation with the prefix length appended and a slash as separator.  For
+-example the class A network 10 is written as `10.0.0.0/8'.
+-
+-IPv6 Addresses
+-..............
+-
+-   IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data.  A host
+-address is usually written as eight 16-bit hexadecimal numbers that are
+-separated by colons.  Two colons are used to abbreviate strings of
+-consecutive zeros.  For example the IPv6 loopback address which is
+-`0:0:0:0:0:0:0:1' can be just written as `::1'.
+-
+-
+-File: libc.info,  Node: Host Address Data Type,  Next: Host Address Functions,  Prev: Abstract Host Addresses,  Up: Host Addresses
+-
+-Host Address Data Type
+-......................
+-
+-   IPv4 Internet host addresses are represented in some contexts as
+-integers (type `uint32_t').  In other contexts, the integer is packaged
+-inside a structure of type `struct in_addr'.  It would be better if the
+-usage were made consistent, but it is not hard to extract the integer
+-from the structure or put the integer into a structure.
+-
+-   You will find older code that uses `unsigned long int' for IPv4
+-Internet host addresses instead of `uint32_t' or `struct in_addr'.
+-Historically `unsigned long int' was a 32 bit number but with 64 bit
+-machines this has changed.  Using `unsigned long int' might break the
+-code if it is used on machines where this type doesn't have 32 bits.
+-`uint32_t' is specified by Unix98 and guaranteed to have 32 bits.
+-
+-   IPv6 Internet host addresses have 128 bits and are packaged inside a
+-structure of type `struct in6_addr'.
+-
+-   The following basic definitions for Internet addresses are declared
+-in the header file `netinet/in.h':
+-
+- - Data Type: struct in_addr
+-     This data type is used in certain contexts to contain an IPv4
+-     Internet host address.  It has just one field, named `s_addr',
+-     which records the host address number as an `uint32_t'.
+-
+- - Macro: uint32_t INADDR_LOOPBACK
+-     You can use this constant to stand for "the address of this
+-     machine," instead of finding its actual address.  It is the IPv4
+-     Internet address `127.0.0.1', which is usually called `localhost'.
+-     This special constant saves you the trouble of looking up the
+-     address of your own machine.  Also, the system usually implements
+-     `INADDR_LOOPBACK' specially, avoiding any network traffic for the
+-     case of one machine talking to itself.
+-
+- - Macro: uint32_t INADDR_ANY
+-     You can use this constant to stand for "any incoming address," when
+-     binding to an address.  *Note Setting Address::.  This is the usual
+-     address to give in the `sin_addr' member of `struct sockaddr_in'
+-     when you want to accept Internet connections.
+-
+- - Macro: uint32_t INADDR_BROADCAST
+-     This constant is the address you use to send a broadcast message.
+-
+- - Macro: uint32_t INADDR_NONE
+-     This constant is returned by some functions to indicate an error.
+-
+- - Data Type: struct in6_addr
+-     This data type is used to store an IPv6 address.  It stores 128
+-     bits of data, which can be accessed (via a union) in a variety of
+-     ways.
+-
+- - Constant: struct in6_addr in6addr_loopback
+-     This constant is the IPv6 address `::1', the loopback address.  See
+-     above for a description of what this means.  The macro
+-     `IN6ADDR_LOOPBACK_INIT' is provided to allow you to initialise your
+-     own variables to this value.
+-
+- - Constant: struct in6_addr in6addr_any
+-     This constant is the IPv6 address `::', the unspecified address.
+-     See above for a description of what this means.  The macro
+-     `IN6ADDR_ANY_INIT' is provided to allow you to initialise your own
+-     variables to this value.
+-
+-
+-File: libc.info,  Node: Host Address Functions,  Next: Host Names,  Prev: Host Address Data Type,  Up: Host Addresses
+-
+-Host Address Functions
+-......................
+-
+-These additional functions for manipulating Internet addresses are
+-declared in the header file `arpa/inet.h'.  They represent Internet
+-addresses in network byte order; they represent network numbers and
+-local-address-within-network numbers in host byte order.  *Note Byte
+-Order::, for an explanation of network and host byte order.
+-
+- - Function: int inet_aton (const char *NAME, struct in_addr *ADDR)
+-     This function converts the IPv4 Internet host address NAME from
+-     the standard numbers-and-dots notation into binary data and stores
+-     it in the `struct in_addr' that ADDR points to.  `inet_aton'
+-     returns nonzero if the address is valid, zero if not.
+-
+- - Function: uint32_t inet_addr (const char *NAME)
+-     This function converts the IPv4 Internet host address NAME from the
+-     standard numbers-and-dots notation into binary data.  If the input
+-     is not valid, `inet_addr' returns `INADDR_NONE'.  This is an
+-     obsolete interface to `inet_aton', described immediately above; it
+-     is obsolete because `INADDR_NONE' is a valid address
+-     (255.255.255.255), and `inet_aton' provides a cleaner way to
+-     indicate error return.
+-
+- - Function: uint32_t inet_network (const char *NAME)
+-     This function extracts the network number from the address NAME,
+-     given in the standard numbers-and-dots notation. The returned
+-     address is in host order. If the input is not valid,
+-     `inet_network' returns `-1'.
+-
+-     The function works only with traditional IPv4 class A, B and C
+-     network types.  It doesn't work with classless addresses and
+-     shouldn't be used anymore.
+-
+- - Function: char * inet_ntoa (struct in_addr ADDR)
+-     This function converts the IPv4 Internet host address ADDR to a
+-     string in the standard numbers-and-dots notation.  The return
+-     value is a pointer into a statically-allocated buffer.  Subsequent
+-     calls will overwrite the same buffer, so you should copy the
+-     string if you need to save it.
+-
+-     In multi-threaded programs each thread has an own
+-     statically-allocated buffer.  But still subsequent calls of
+-     `inet_ntoa' in the same thread will overwrite the result of the
+-     last call.
+-
+-     Instead of `inet_ntoa' the newer function `inet_ntop' which is
+-     described below should be used since it handles both IPv4 and IPv6
+-     addresses.
+-
+- - Function: struct in_addr inet_makeaddr (uint32_t NET, uint32_t LOCAL)
+-     This function makes an IPv4 Internet host address by combining the
+-     network number NET with the local-address-within-network number
+-     LOCAL.
+-
+- - Function: uint32_t inet_lnaof (struct in_addr ADDR)
+-     This function returns the local-address-within-network part of the
+-     Internet host address ADDR.
+-
+-     The function works only with traditional IPv4 class A, B and C
+-     network types.  It doesn't work with classless addresses and
+-     shouldn't be used anymore.
+-
+- - Function: uint32_t inet_netof (struct in_addr ADDR)
+-     This function returns the network number part of the Internet host
+-     address ADDR.
+-
+-     The function works only with traditional IPv4 class A, B and C
+-     network types.  It doesn't work with classless addresses and
+-     shouldn't be used anymore.
+-
+- - Function: int inet_pton (int AF, const char *CP, void *BUF)
+-     This function converts an Internet address (either IPv4 or IPv6)
+-     from presentation (textual) to network (binary) format.  AF should
+-     be either `AF_INET' or `AF_INET6', as appropriate for the type of
+-     address being converted.  CP is a pointer to the input string, and
+-     BUF is a pointer to a buffer for the result.  It is the caller's
+-     responsibility to make sure the buffer is large enough.
+-
+- - Function: const char * inet_ntop (int AF, const void *CP, char *BUF,
+-          size_t LEN)
+-     This function converts an Internet address (either IPv4 or IPv6)
+-     from network (binary) to presentation (textual) form.  AF should be
+-     either `AF_INET' or `AF_INET6', as appropriate.  CP is a pointer
+-     to the address to be converted.  BUF should be a pointer to a
+-     buffer to hold the result, and LEN is the length of this buffer.
+-     The return value from the function will be this buffer address.
+-
+-
+-File: libc.info,  Node: Host Names,  Prev: Host Address Functions,  Up: Host Addresses
+-
+-Host Names
+-..........
+-
+-   Besides the standard numbers-and-dots notation for Internet
+-addresses, you can also refer to a host by a symbolic name.  The
+-advantage of a symbolic name is that it is usually easier to remember.
+-For example, the machine with Internet address `158.121.106.19' is also
+-known as `alpha.gnu.org'; and other machines in the `gnu.org' domain
+-can refer to it simply as `alpha'.
+-
+-   Internally, the system uses a database to keep track of the mapping
+-between host names and host numbers.  This database is usually either
+-the file `/etc/hosts' or an equivalent provided by a name server.  The
+-functions and other symbols for accessing this database are declared in
+-`netdb.h'.  They are BSD features, defined unconditionally if you
+-include `netdb.h'.
+-
+- - Data Type: struct hostent
+-     This data type is used to represent an entry in the hosts
+-     database.  It has the following members:
+-
+-    `char *h_name'
+-          This is the "official" name of the host.
+-
+-    `char **h_aliases'
+-          These are alternative names for the host, represented as a
+-          null-terminated vector of strings.
+-
+-    `int h_addrtype'
+-          This is the host address type; in practice, its value is
+-          always either `AF_INET' or `AF_INET6', with the latter being
+-          used for IPv6 hosts.  In principle other kinds of addresses
+-          could be represented in the data base as well as Internet
+-          addresses; if this were done, you might find a value in this
+-          field other than `AF_INET' or `AF_INET6'.  *Note Socket
+-          Addresses::.
+-
+-    `int h_length'
+-          This is the length, in bytes, of each address.
+-
+-    `char **h_addr_list'
+-          This is the vector of addresses for the host.  (Recall that
+-          the host might be connected to multiple networks and have
+-          different addresses on each one.)  The vector is terminated
+-          by a null pointer.
+-
+-    `char *h_addr'
+-          This is a synonym for `h_addr_list[0]'; in other words, it is
+-          the first host address.
+-
+-   As far as the host database is concerned, each address is just a
+-block of memory `h_length' bytes long.  But in other contexts there is
+-an implicit assumption that you can convert IPv4 addresses to a `struct
+-in_addr' or an `uint32_t'.  Host addresses in a `struct hostent'
+-structure are always given in network byte order; see *Note Byte
+-Order::.
+-
+-   You can use `gethostbyname', `gethostbyname2' or `gethostbyaddr' to
+-search the hosts database for information about a particular host.  The
+-information is returned in a statically-allocated structure; you must
+-copy the information if you need to save it across calls.  You can also
+-use `getaddrinfo' and `getnameinfo' to obtain this information.
+-
+- - Function: struct hostent * gethostbyname (const char *NAME)
+-     The `gethostbyname' function returns information about the host
+-     named NAME.  If the lookup fails, it returns a null pointer.
+-
+- - Function: struct hostent * gethostbyname2 (const char *NAME, int AF)
+-     The `gethostbyname2' function is like `gethostbyname', but allows
+-     the caller to specify the desired address family (e.g.  `AF_INET'
+-     or `AF_INET6') for the result.
+-
+- - Function: struct hostent * gethostbyaddr (const char *ADDR, int
+-          LENGTH, int FORMAT)
+-     The `gethostbyaddr' function returns information about the host
+-     with Internet address ADDR.  The parameter ADDR is not really a
+-     pointer to char - it can be a pointer to an IPv4 or an IPv6
+-     address. The LENGTH argument is the size (in bytes) of the address
+-     at ADDR.  FORMAT specifies the address format; for an IPv4
+-     Internet address, specify a value of `AF_INET'; for an IPv6
+-     Internet address, use `AF_INET6'.
+-
+-     If the lookup fails, `gethostbyaddr' returns a null pointer.
+-
+-   If the name lookup by `gethostbyname' or `gethostbyaddr' fails, you
+-can find out the reason by looking at the value of the variable
+-`h_errno'.  (It would be cleaner design for these functions to set
+-`errno', but use of `h_errno' is compatible with other systems.)
+-
+-   Here are the error codes that you may find in `h_errno':
+-
+-`HOST_NOT_FOUND'
+-     No such host is known in the data base.
+-
+-`TRY_AGAIN'
+-     This condition happens when the name server could not be
+-     contacted.  If you try again later, you may succeed then.
+-
+-`NO_RECOVERY'
+-     A non-recoverable error occurred.
+-
+-`NO_ADDRESS'
+-     The host database contains an entry for the name, but it doesn't
+-     have an associated Internet address.
+-
+-   The lookup functions above all have one in common: they are not
+-reentrant and therefore unusable in multi-threaded applications.
+-Therefore provides the GNU C library a new set of functions which can be
+-used in this context.
+-
+- - Function: int gethostbyname_r (const char *restrict NAME, struct
+-          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
+-          BUFLEN, struct hostent **restrict RESULT, int *restrict
+-          H_ERRNOP)
+-     The `gethostbyname_r' function returns information about the host
+-     named NAME.  The caller must pass a pointer to an object of type
+-     `struct hostent' in the RESULT_BUF parameter.  In addition the
+-     function may need extra buffer space and the caller must pass an
+-     pointer and the size of the buffer in the BUF and BUFLEN
+-     parameters.
+-
+-     A pointer to the buffer, in which the result is stored, is
+-     available in `*RESULT' after the function call successfully
+-     returned.  If an error occurs or if no entry is found, the pointer
+-     `*RESULT' is a null pointer.  Success is signalled by a zero
+-     return value.  If the function failed the return value is an error
+-     number.  In addition to the errors defined for `gethostbyname' it
+-     can also be `ERANGE'.  In this case the call should be repeated
+-     with a larger buffer.  Additional error information is not stored
+-     in the global variable `h_errno' but instead in the object pointed
+-     to by H_ERRNOP.
+-
+-     Here's a small example:
+-          struct hostent *
+-          gethostname (char *host)
+-          {
+-            struct hostent hostbuf, *hp;
+-            size_t hstbuflen;
+-            char *tmphstbuf;
+-            int res;
+-            int herr;
+-          
+-            hstbuflen = 1024;
+-            tmphstbuf = malloc (hstbuflen);
+-          
+-            while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen,
+-                                           &hp, &herr)) == ERANGE)
+-              {
+-                /* Enlarge the buffer.  */
+-                hstbuflen *= 2;
+-                tmphstbuf = realloc (tmphstbuf, hstbuflen);
+-              }
+-            /*  Check for errors.  */
+-            if (res || hp == NULL)
+-              return NULL;
+-            return hp->h_name;
+-          }
+-
+- - Function: int gethostbyname2_r (const char *NAME, int AF, struct
+-          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
+-          BUFLEN, struct hostent **restrict RESULT, int *restrict
+-          H_ERRNOP)
+-     The `gethostbyname2_r' function is like `gethostbyname_r', but
+-     allows the caller to specify the desired address family (e.g.
+-     `AF_INET' or `AF_INET6') for the result.
+-
+- - Function: int gethostbyaddr_r (const char *ADDR, int LENGTH, int
+-          FORMAT, struct hostent *restrict RESULT_BUF, char *restrict
+-          BUF, size_t BUFLEN, struct hostent **restrict RESULT, int
+-          *restrict H_ERRNOP)
+-     The `gethostbyaddr_r' function returns information about the host
+-     with Internet address ADDR.  The parameter ADDR is not really a
+-     pointer to char - it can be a pointer to an IPv4 or an IPv6
+-     address. The LENGTH argument is the size (in bytes) of the address
+-     at ADDR.  FORMAT specifies the address format; for an IPv4
+-     Internet address, specify a value of `AF_INET'; for an IPv6
+-     Internet address, use `AF_INET6'.
+-
+-     Similar to the `gethostbyname_r' function, the caller must provide
+-     buffers for the result and memory used internally.  In case of
+-     success the function returns zero.  Otherwise the value is an
+-     error number where `ERANGE' has the special meaning that the
+-     caller-provided buffer is too small.
+-
+-   You can also scan the entire hosts database one entry at a time using
+-`sethostent', `gethostent', and `endhostent'.  Be careful in using
+-these functions, because they are not reentrant.
+-
+- - Function: void sethostent (int STAYOPEN)
+-     This function opens the hosts database to begin scanning it.  You
+-     can then call `gethostent' to read the entries.
+-
+-     If the STAYOPEN argument is nonzero, this sets a flag so that
+-     subsequent calls to `gethostbyname' or `gethostbyaddr' will not
+-     close the database (as they usually would).  This makes for more
+-     efficiency if you call those functions several times, by avoiding
+-     reopening the database for each call.
+-
+- - Function: struct hostent * gethostent (void)
+-     This function returns the next entry in the hosts database.  It
+-     returns a null pointer if there are no more entries.
+-
+- - Function: void endhostent (void)
+-     This function closes the hosts database.
+-
+-
+-File: libc.info,  Node: Ports,  Next: Services Database,  Prev: Protocols Database,  Up: Internet Namespace
+-
+-Internet Ports
+---------------
+-
+-   A socket address in the Internet namespace consists of a machine's
+-Internet address plus a "port number" which distinguishes the sockets
+-on a given machine (for a given protocol).  Port numbers range from 0
+-to 65,535.
+-
+-   Port numbers less than `IPPORT_RESERVED' are reserved for standard
+-servers, such as `finger' and `telnet'.  There is a database that keeps
+-track of these, and you can use the `getservbyname' function to map a
+-service name onto a port number; see *Note Services Database::.
+-
+-   If you write a server that is not one of the standard ones defined in
+-the database, you must choose a port number for it.  Use a number
+-greater than `IPPORT_USERRESERVED'; such numbers are reserved for
+-servers and won't ever be generated automatically by the system.
+-Avoiding conflicts with servers being run by other users is up to you.
+-
+-   When you use a socket without specifying its address, the system
+-generates a port number for it.  This number is between
+-`IPPORT_RESERVED' and `IPPORT_USERRESERVED'.
+-
+-   On the Internet, it is actually legitimate to have two different
+-sockets with the same port number, as long as they never both try to
+-communicate with the same socket address (host address plus port
+-number).  You shouldn't duplicate a port number except in special
+-circumstances where a higher-level protocol requires it.  Normally, the
+-system won't let you do it; `bind' normally insists on distinct port
+-numbers.  To reuse a port number, you must set the socket option
+-`SO_REUSEADDR'.  *Note Socket-Level Options::.
+-
+-   These macros are defined in the header file `netinet/in.h'.
+-
+- - Macro: int IPPORT_RESERVED
+-     Port numbers less than `IPPORT_RESERVED' are reserved for
+-     superuser use.
+-
+- - Macro: int IPPORT_USERRESERVED
+-     Port numbers greater than or equal to `IPPORT_USERRESERVED' are
+-     reserved for explicit use; they will never be allocated
+-     automatically.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-24 glibc-2.1.3/manual/libc.info-24
+--- ../glibc-2.1.3/manual/libc.info-24	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-24	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1331 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Services Database,  Next: Byte Order,  Prev: Ports,  Up: Internet Namespace
+-
+-The Services Database
+----------------------
+-
+-   The database that keeps track of "well-known" services is usually
+-either the file `/etc/services' or an equivalent from a name server.
+-You can use these utilities, declared in `netdb.h', to access the
+-services database.
+-
+- - Data Type: struct servent
+-     This data type holds information about entries from the services
+-     database.  It has the following members:
+-
+-    `char *s_name'
+-          This is the "official" name of the service.
+-
+-    `char **s_aliases'
+-          These are alternate names for the service, represented as an
+-          array of strings.  A null pointer terminates the array.
+-
+-    `int s_port'
+-          This is the port number for the service.  Port numbers are
+-          given in network byte order; see *Note Byte Order::.
+-
+-    `char *s_proto'
+-          This is the name of the protocol to use with this service.
+-          *Note Protocols Database::.
+-
+-   To get information about a particular service, use the
+-`getservbyname' or `getservbyport' functions.  The information is
+-returned in a statically-allocated structure; you must copy the
+-information if you need to save it across calls.
+-
+- - Function: struct servent * getservbyname (const char *NAME, const
+-          char *PROTO)
+-     The `getservbyname' function returns information about the service
+-     named NAME using protocol PROTO.  If it can't find such a service,
+-     it returns a null pointer.
+-
+-     This function is useful for servers as well as for clients; servers
+-     use it to determine which port they should listen on (*note
+-     Listening::.).
+-
+- - Function: struct servent * getservbyport (int PORT, const char
+-          *PROTO)
+-     The `getservbyport' function returns information about the service
+-     at port PORT using protocol PROTO.  If it can't find such a
+-     service, it returns a null pointer.
+-
+-You can also scan the services database using `setservent',
+-`getservent', and `endservent'.  Be careful in using these functions,
+-because they are not reentrant.
+-
+- - Function: void setservent (int STAYOPEN)
+-     This function opens the services database to begin scanning it.
+-
+-     If the STAYOPEN argument is nonzero, this sets a flag so that
+-     subsequent calls to `getservbyname' or `getservbyport' will not
+-     close the database (as they usually would).  This makes for more
+-     efficiency if you call those functions several times, by avoiding
+-     reopening the database for each call.
+-
+- - Function: struct servent * getservent (void)
+-     This function returns the next entry in the services database.  If
+-     there are no more entries, it returns a null pointer.
+-
+- - Function: void endservent (void)
+-     This function closes the services database.
+-
+-
+-File: libc.info,  Node: Byte Order,  Next: Inet Example,  Prev: Services Database,  Up: Internet Namespace
+-
+-Byte Order Conversion
+----------------------
+-
+-   Different kinds of computers use different conventions for the
+-ordering of bytes within a word.  Some computers put the most
+-significant byte within a word first (this is called "big-endian"
+-order), and others put it last ("little-endian" order).
+-
+-   So that machines with different byte order conventions can
+-communicate, the Internet protocols specify a canonical byte order
+-convention for data transmitted over the network.  This is known as the
+-"network byte order".
+-
+-   When establishing an Internet socket connection, you must make sure
+-that the data in the `sin_port' and `sin_addr' members of the
+-`sockaddr_in' structure are represented in the network byte order.  If
+-you are encoding integer data in the messages sent through the socket,
+-you should convert this to network byte order too.  If you don't do
+-this, your program may fail when running on or talking to other kinds
+-of machines.
+-
+-   If you use `getservbyname' and `gethostbyname' or `inet_addr' to get
+-the port number and host address, the values are already in the network
+-byte order, and you can copy them directly into the `sockaddr_in'
+-structure.
+-
+-   Otherwise, you have to convert the values explicitly.  Use `htons'
+-and `ntohs' to convert values for the `sin_port' member.  Use `htonl'
+-and `ntohl' to convert IPv4 addresses for the `sin_addr' member.
+-(Remember, `struct in_addr' is equivalent to `uint32_t'.)  These
+-functions are declared in `netinet/in.h'.
+-
+- - Function: uint16_t htons (uint16_t HOSTSHORT)
+-     This function converts the `uint16_t' integer HOSTSHORT from host
+-     byte order to network byte order.
+-
+- - Function: uint16_t ntohs (uint16_t NETSHORT)
+-     This function converts the `uint16_t' integer NETSHORT from
+-     network byte order to host byte order.
+-
+- - Function: uint32_t htonl (uint32_t HOSTLONG)
+-     This function converts the `uint32_t' integer HOSTLONG from host
+-     byte order to network byte order.
+-
+-     This is used for IPv4 internet addresses.
+-
+- - Function: uint32_t ntohl (uint32_t NETLONG)
+-     This function converts the `uint32_t' integer NETLONG from network
+-     byte order to host byte order.
+-
+-     This is used for IPv4 internet addresses.
+-
+-
+-File: libc.info,  Node: Protocols Database,  Next: Ports,  Prev: Host Addresses,  Up: Internet Namespace
+-
+-Protocols Database
+-------------------
+-
+-   The communications protocol used with a socket controls low-level
+-details of how data is exchanged.  For example, the protocol implements
+-things like checksums to detect errors in transmissions, and routing
+-instructions for messages.  Normal user programs have little reason to
+-mess with these details directly.
+-
+-   The default communications protocol for the Internet namespace
+-depends on the communication style.  For stream communication, the
+-default is TCP ("transmission control protocol").  For datagram
+-communication, the default is UDP ("user datagram protocol").  For
+-reliable datagram communication, the default is RDP ("reliable datagram
+-protocol").  You should nearly always use the default.
+-
+-   Internet protocols are generally specified by a name instead of a
+-number.  The network protocols that a host knows about are stored in a
+-database.  This is usually either derived from the file
+-`/etc/protocols', or it may be an equivalent provided by a name server.
+-You look up the protocol number associated with a named protocol in
+-the database using the `getprotobyname' function.
+-
+-   Here are detailed descriptions of the utilities for accessing the
+-protocols database.  These are declared in `netdb.h'.
+-
+- - Data Type: struct protoent
+-     This data type is used to represent entries in the network
+-     protocols database.  It has the following members:
+-
+-    `char *p_name'
+-          This is the official name of the protocol.
+-
+-    `char **p_aliases'
+-          These are alternate names for the protocol, specified as an
+-          array of strings.  The last element of the array is a null
+-          pointer.
+-
+-    `int p_proto'
+-          This is the protocol number (in host byte order); use this
+-          member as the PROTOCOL argument to `socket'.
+-
+-   You can use `getprotobyname' and `getprotobynumber' to search the
+-protocols database for a specific protocol.  The information is
+-returned in a statically-allocated structure; you must copy the
+-information if you need to save it across calls.
+-
+- - Function: struct protoent * getprotobyname (const char *NAME)
+-     The `getprotobyname' function returns information about the
+-     network protocol named NAME.  If there is no such protocol, it
+-     returns a null pointer.
+-
+- - Function: struct protoent * getprotobynumber (int PROTOCOL)
+-     The `getprotobynumber' function returns information about the
+-     network protocol with number PROTOCOL.  If there is no such
+-     protocol, it returns a null pointer.
+-
+-   You can also scan the whole protocols database one protocol at a
+-time by using `setprotoent', `getprotoent', and `endprotoent'.  Be
+-careful in using these functions, because they are not reentrant.
+-
+- - Function: void setprotoent (int STAYOPEN)
+-     This function opens the protocols database to begin scanning it.
+-
+-     If the STAYOPEN argument is nonzero, this sets a flag so that
+-     subsequent calls to `getprotobyname' or `getprotobynumber' will
+-     not close the database (as they usually would).  This makes for
+-     more efficiency if you call those functions several times, by
+-     avoiding reopening the database for each call.
+-
+- - Function: struct protoent * getprotoent (void)
+-     This function returns the next entry in the protocols database.  It
+-     returns a null pointer if there are no more entries.
+-
+- - Function: void endprotoent (void)
+-     This function closes the protocols database.
+-
+-
+-File: libc.info,  Node: Inet Example,  Prev: Byte Order,  Up: Internet Namespace
+-
+-Internet Socket Example
+------------------------
+-
+-   Here is an example showing how to create and name a socket in the
+-Internet namespace.  The newly created socket exists on the machine that
+-the program is running on.  Rather than finding and using the machine's
+-Internet address, this example specifies `INADDR_ANY' as the host
+-address; the system replaces that with the machine's actual address.
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <sys/socket.h>
+-     #include <netinet/in.h>
+-     
+-     int
+-     make_socket (uint16_t port)
+-     {
+-       int sock;
+-       struct sockaddr_in name;
+-     
+-       /* Create the socket. */
+-       sock = socket (PF_INET, SOCK_STREAM, 0);
+-       if (sock < 0)
+-         {
+-           perror ("socket");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Give the socket a name. */
+-       name.sin_family = AF_INET;
+-       name.sin_port = htons (port);
+-       name.sin_addr.s_addr = htonl (INADDR_ANY);
+-       if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
+-         {
+-           perror ("bind");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       return sock;
+-     }
+-
+-   Here is another example, showing how you can fill in a `sockaddr_in'
+-structure, given a host name string and a port number:
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <sys/socket.h>
+-     #include <netinet/in.h>
+-     #include <netdb.h>
+-     
+-     void
+-     init_sockaddr (struct sockaddr_in *name,
+-                    const char *hostname,
+-                    uint16_t port)
+-     {
+-       struct hostent *hostinfo;
+-     
+-       name->sin_family = AF_INET;
+-       name->sin_port = htons (port);
+-       hostinfo = gethostbyname (hostname);
+-       if (hostinfo == NULL)
+-         {
+-           fprintf (stderr, "Unknown host %s.\n", hostname);
+-           exit (EXIT_FAILURE);
+-         }
+-       name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
+-     }
+-
+-
+-File: libc.info,  Node: Misc Namespaces,  Next: Open/Close Sockets,  Prev: Internet Namespace,  Up: Sockets
+-
+-Other Namespaces
+-================
+-
+-   Certain other namespaces and associated protocol families are
+-supported but not documented yet because they are not often used.
+-`PF_NS' refers to the Xerox Network Software protocols.  `PF_ISO' stands
+-for Open Systems Interconnect.  `PF_CCITT' refers to protocols from
+-CCITT.  `socket.h' defines these symbols and others naming protocols
+-not actually implemented.
+-
+-   `PF_IMPLINK' is used for communicating between hosts and Internet
+-Message Processors.  For information on this, and on `PF_ROUTE', an
+-occasionally-used local area routing protocol, see the GNU Hurd Manual
+-(to appear in the future).
+-
+-
+-File: libc.info,  Node: Open/Close Sockets,  Next: Connections,  Prev: Misc Namespaces,  Up: Sockets
+-
+-Opening and Closing Sockets
+-===========================
+-
+-   This section describes the actual library functions for opening and
+-closing sockets.  The same functions work for all namespaces and
+-connection styles.
+-
+-* Menu:
+-
+-* Creating a Socket::           How to open a socket.
+-* Closing a Socket::            How to close a socket.
+-* Socket Pairs::                These are created like pipes.
+-
+-
+-File: libc.info,  Node: Creating a Socket,  Next: Closing a Socket,  Up: Open/Close Sockets
+-
+-Creating a Socket
+------------------
+-
+-   The primitive for creating a socket is the `socket' function,
+-declared in `sys/socket.h'.
+-
+- - Function: int socket (int NAMESPACE, int STYLE, int PROTOCOL)
+-     This function creates a socket and specifies communication style
+-     STYLE, which should be one of the socket styles listed in *Note
+-     Communication Styles::.  The NAMESPACE argument specifies the
+-     namespace; it must be `PF_LOCAL' (*note Local Namespace::.) or
+-     `PF_INET' (*note Internet Namespace::.).  PROTOCOL designates the
+-     specific protocol (*note Socket Concepts::.); zero is usually
+-     right for PROTOCOL.
+-
+-     The return value from `socket' is the file descriptor for the new
+-     socket, or `-1' in case of error.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EPROTONOSUPPORT'
+-          The PROTOCOL or STYLE is not supported by the NAMESPACE
+-          specified.
+-
+-    `EMFILE'
+-          The process already has too many file descriptors open.
+-
+-    `ENFILE'
+-          The system already has too many file descriptors open.
+-
+-    `EACCESS'
+-          The process does not have privilege to create a socket of the
+-          specified STYLE or PROTOCOL.
+-
+-    `ENOBUFS'
+-          The system ran out of internal buffer space.
+-
+-     The file descriptor returned by the `socket' function supports both
+-     read and write operations.  But, like pipes, sockets do not
+-     support file positioning operations.
+-
+-   For examples of how to call the `socket' function, see *Note Local
+-Socket Example::, or *Note Inet Example::.
+-
+-
+-File: libc.info,  Node: Closing a Socket,  Next: Socket Pairs,  Prev: Creating a Socket,  Up: Open/Close Sockets
+-
+-Closing a Socket
+-----------------
+-
+-   When you are finished using a socket, you can simply close its file
+-descriptor with `close'; see *Note Opening and Closing Files::.  If
+-there is still data waiting to be transmitted over the connection,
+-normally `close' tries to complete this transmission.  You can control
+-this behavior using the `SO_LINGER' socket option to specify a timeout
+-period; see *Note Socket Options::.
+-
+-   You can also shut down only reception or only transmission on a
+-connection by calling `shutdown', which is declared in `sys/socket.h'.
+-
+- - Function: int shutdown (int SOCKET, int HOW)
+-     The `shutdown' function shuts down the connection of socket
+-     SOCKET.  The argument HOW specifies what action to perform:
+-
+-    `0'
+-          Stop receiving data for this socket.  If further data arrives,
+-          reject it.
+-
+-    `1'
+-          Stop trying to transmit data from this socket.  Discard any
+-          data waiting to be sent.  Stop looking for acknowledgement of
+-          data already sent; don't retransmit it if it is lost.
+-
+-    `2'
+-          Stop both reception and transmission.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          SOCKET is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          SOCKET is not a socket.
+-
+-    `ENOTCONN'
+-          SOCKET is not connected.
+-
+-
+-File: libc.info,  Node: Socket Pairs,  Prev: Closing a Socket,  Up: Open/Close Sockets
+-
+-Socket Pairs
+-------------
+-
+-   A "socket pair" consists of a pair of connected (but unnamed)
+-sockets.  It is very similar to a pipe and is used in much the same
+-way.  Socket pairs are created with the `socketpair' function, declared
+-in `sys/socket.h'.  A socket pair is much like a pipe; the main
+-difference is that the socket pair is bidirectional, whereas the pipe
+-has one input-only end and one output-only end (*note Pipes and
+-FIFOs::.).
+-
+- - Function: int socketpair (int NAMESPACE, int STYLE, int PROTOCOL,
+-          int FILEDES[2])
+-     This function creates a socket pair, returning the file
+-     descriptors in `FILEDES[0]' and `FILEDES[1]'.  The socket pair is
+-     a full-duplex communications channel, so that both reading and
+-     writing may be performed at either end.
+-
+-     The NAMESPACE, STYLE, and PROTOCOL arguments are interpreted as
+-     for the `socket' function.  STYLE should be one of the
+-     communication styles listed in *Note Communication Styles::.  The
+-     NAMESPACE argument specifies the namespace, which must be
+-     `AF_LOCAL' (*note Local Namespace::.); PROTOCOL specifies the
+-     communications protocol, but zero is the only meaningful value.
+-
+-     If STYLE specifies a connectionless communication style, then the
+-     two sockets you get are not *connected*, strictly speaking, but
+-     each of them knows the other as the default destination address,
+-     so they can send packets to each other.
+-
+-     The `socketpair' function returns `0' on success and `-1' on
+-     failure.  The following `errno' error conditions are defined for
+-     this function:
+-
+-    `EMFILE'
+-          The process has too many file descriptors open.
+-
+-    `EAFNOSUPPORT'
+-          The specified namespace is not supported.
+-
+-    `EPROTONOSUPPORT'
+-          The specified protocol is not supported.
+-
+-    `EOPNOTSUPP'
+-          The specified protocol does not support the creation of
+-          socket pairs.
+-
+-
+-File: libc.info,  Node: Connections,  Next: Datagrams,  Prev: Open/Close Sockets,  Up: Sockets
+-
+-Using Sockets with Connections
+-==============================
+-
+-   The most common communication styles involve making a connection to a
+-particular other socket, and then exchanging data with that socket over
+-and over.  Making a connection is asymmetric; one side (the "client")
+-acts to request a connection, while the other side (the "server") makes
+-a socket and waits for the connection request.
+-
+-* Menu:
+-
+-* Connecting::    	     What the client program must do.
+-* Listening::		     How a server program waits for requests.
+-* Accepting Connections::    What the server does when it gets a request.
+-* Who is Connected::	     Getting the address of the
+-				other side of a connection.
+-* Transferring Data::        How to send and receive data.
+-* Byte Stream Example::	     An example program: a client for communicating
+-			      over a byte stream socket in the Internet namespace.
+-* Server Example::	     A corresponding server program.
+-* Out-of-Band Data::         This is an advanced feature.
+-
+-
+-File: libc.info,  Node: Connecting,  Next: Listening,  Up: Connections
+-
+-Making a Connection
+--------------------
+-
+-   In making a connection, the client makes a connection while the
+-server waits for and accepts the connection.  Here we discuss what the
+-client program must do, using the `connect' function, which is declared
+-in `sys/socket.h'.
+-
+- - Function: int connect (int SOCKET, struct sockaddr *ADDR, socklen_t
+-          LENGTH)
+-     The `connect' function initiates a connection from the socket with
+-     file descriptor SOCKET to the socket whose address is specified by
+-     the ADDR and LENGTH arguments.  (This socket is typically on
+-     another machine, and it must be already set up as a server.)
+-     *Note Socket Addresses::, for information about how these
+-     arguments are interpreted.
+-
+-     Normally, `connect' waits until the server responds to the request
+-     before it returns.  You can set nonblocking mode on the socket
+-     SOCKET to make `connect' return immediately without waiting for
+-     the response.  *Note File Status Flags::, for information about
+-     nonblocking mode.
+-
+-     The normal return value from `connect' is `0'.  If an error
+-     occurs, `connect' returns `-1'.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EBADF'
+-          The socket SOCKET is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          File descriptor SOCKET is not a socket.
+-
+-    `EADDRNOTAVAIL'
+-          The specified address is not available on the remote machine.
+-
+-    `EAFNOSUPPORT'
+-          The namespace of the ADDR is not supported by this socket.
+-
+-    `EISCONN'
+-          The socket SOCKET is already connected.
+-
+-    `ETIMEDOUT'
+-          The attempt to establish the connection timed out.
+-
+-    `ECONNREFUSED'
+-          The server has actively refused to establish the connection.
+-
+-    `ENETUNREACH'
+-          The network of the given ADDR isn't reachable from this host.
+-
+-    `EADDRINUSE'
+-          The socket address of the given ADDR is already in use.
+-
+-    `EINPROGRESS'
+-          The socket SOCKET is non-blocking and the connection could
+-          not be established immediately.  You can determine when the
+-          connection is completely established with `select'; *note
+-          Waiting for I/O::..  Another `connect' call on the same
+-          socket, before the connection is completely established, will
+-          fail with `EALREADY'.
+-
+-    `EALREADY'
+-          The socket SOCKET is non-blocking and already has a pending
+-          connection in progress (see `EINPROGRESS' above).
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+-
+-File: libc.info,  Node: Listening,  Next: Accepting Connections,  Prev: Connecting,  Up: Connections
+-
+-Listening for Connections
+--------------------------
+-
+-   Now let us consider what the server process must do to accept
+-connections on a socket.  First it must use the `listen' function to
+-enable connection requests on the socket, and then accept each incoming
+-connection with a call to `accept' (*note Accepting Connections::.).
+-Once connection requests are enabled on a server socket, the `select'
+-function reports when the socket has a connection ready to be accepted
+-(*note Waiting for I/O::.).
+-
+-   The `listen' function is not allowed for sockets using
+-connectionless communication styles.
+-
+-   You can write a network server that does not even start running
+-until a connection to it is requested.  *Note Inetd Servers::.
+-
+-   In the Internet namespace, there are no special protection mechanisms
+-for controlling access to connect to a port; any process on any machine
+-can make a connection to your server.  If you want to restrict access to
+-your server, make it examine the addresses associated with connection
+-requests or implement some other handshaking or identification protocol.
+-
+-   In the local namespace, the ordinary file protection bits control
+-who has access to connect to the socket.
+-
+- - Function: int listen (int SOCKET, unsigned int N)
+-     The `listen' function enables the socket SOCKET to accept
+-     connections, thus making it a server socket.
+-
+-     The argument N specifies the length of the queue for pending
+-     connections.  When the queue fills, new clients attempting to
+-     connect fail with `ECONNREFUSED' until the server calls `accept' to
+-     accept a connection from the queue.
+-
+-     The `listen' function returns `0' on success and `-1' on failure.
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EBADF'
+-          The argument SOCKET is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The argument SOCKET is not a socket.
+-
+-    `EOPNOTSUPP'
+-          The socket SOCKET does not support this operation.
+-
+-
+-File: libc.info,  Node: Accepting Connections,  Next: Who is Connected,  Prev: Listening,  Up: Connections
+-
+-Accepting Connections
+----------------------
+-
+-   When a server receives a connection request, it can complete the
+-connection by accepting the request.  Use the function `accept' to do
+-this.
+-
+-   A socket that has been established as a server can accept connection
+-requests from multiple clients.  The server's original socket *does not
+-become part* of the connection; instead, `accept' makes a new socket
+-which participates in the connection.  `accept' returns the descriptor
+-for this socket.  The server's original socket remains available for
+-listening for further connection requests.
+-
+-   The number of pending connection requests on a server socket is
+-finite.  If connection requests arrive from clients faster than the
+-server can act upon them, the queue can fill up and additional requests
+-are refused with a `ECONNREFUSED' error.  You can specify the maximum
+-length of this queue as an argument to the `listen' function, although
+-the system may also impose its own internal limit on the length of this
+-queue.
+-
+- - Function: int accept (int SOCKET, struct sockaddr *ADDR, socklen_t
+-          *LENGTH_PTR)
+-     This function is used to accept a connection request on the server
+-     socket SOCKET.
+-
+-     The `accept' function waits if there are no connections pending,
+-     unless the socket SOCKET has nonblocking mode set.  (You can use
+-     `select' to wait for a pending connection, with a nonblocking
+-     socket.)  *Note File Status Flags::, for information about
+-     nonblocking mode.
+-
+-     The ADDR and LENGTH-PTR arguments are used to return information
+-     about the name of the client socket that initiated the connection.
+-     *Note Socket Addresses::, for information about the format of the
+-     information.
+-
+-     Accepting a connection does not make SOCKET part of the
+-     connection.  Instead, it creates a new socket which becomes
+-     connected.  The normal return value of `accept' is the file
+-     descriptor for the new socket.
+-
+-     After `accept', the original socket SOCKET remains open and
+-     unconnected, and continues listening until you close it.  You can
+-     accept further connections with SOCKET by calling `accept' again.
+-
+-     If an error occurs, `accept' returns `-1'.  The following `errno'
+-     error conditions are defined for this function:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET argument is not a socket.
+-
+-    `EOPNOTSUPP'
+-          The descriptor SOCKET does not support this operation.
+-
+-    `EWOULDBLOCK'
+-          SOCKET has nonblocking mode set, and there are no pending
+-          connections immediately available.
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+-   The `accept' function is not allowed for sockets using
+-connectionless communication styles.
+-
+-
+-File: libc.info,  Node: Who is Connected,  Next: Transferring Data,  Prev: Accepting Connections,  Up: Connections
+-
+-Who is Connected to Me?
+------------------------
+-
+- - Function: int getpeername (int SOCKET, struct sockaddr *ADDR,
+-          socklen_t *LENGTH-PTR)
+-     The `getpeername' function returns the address of the socket that
+-     SOCKET is connected to; it stores the address in the memory space
+-     specified by ADDR and LENGTH-PTR.  It stores the length of the
+-     address in `*LENGTH-PTR'.
+-
+-     *Note Socket Addresses::, for information about the format of the
+-     address.  In some operating systems, `getpeername' works only for
+-     sockets in the Internet domain.
+-
+-     The return value is `0' on success and `-1' on error.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          The argument SOCKET is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `ENOTCONN'
+-          The socket SOCKET is not connected.
+-
+-    `ENOBUFS'
+-          There are not enough internal buffers available.
+-
+-
+-File: libc.info,  Node: Transferring Data,  Next: Byte Stream Example,  Prev: Who is Connected,  Up: Connections
+-
+-Transferring Data
+------------------
+-
+-   Once a socket has been connected to a peer, you can use the ordinary
+-`read' and `write' operations (*note I/O Primitives::.) to transfer
+-data.  A socket is a two-way communications channel, so read and write
+-operations can be performed at either end.
+-
+-   There are also some I/O modes that are specific to socket operations.
+-In order to specify these modes, you must use the `recv' and `send'
+-functions instead of the more generic `read' and `write' functions.
+-The `recv' and `send' functions take an additional argument which you
+-can use to specify various flags to control the special I/O modes.  For
+-example, you can specify the `MSG_OOB' flag to read or write
+-out-of-band data, the `MSG_PEEK' flag to peek at input, or the
+-`MSG_DONTROUTE' flag to control inclusion of routing information on
+-output.
+-
+-* Menu:
+-
+-* Sending Data::		Sending data with `send'.
+-* Receiving Data::		Reading data with `recv'.
+-* Socket Data Options::		Using `send' and `recv'.
+-
+-
+-File: libc.info,  Node: Sending Data,  Next: Receiving Data,  Up: Transferring Data
+-
+-Sending Data
+-............
+-
+-   The `send' function is declared in the header file `sys/socket.h'.
+-If your FLAGS argument is zero, you can just as well use `write'
+-instead of `send'; see *Note I/O Primitives::.  If the socket was
+-connected but the connection has broken, you get a `SIGPIPE' signal for
+-any use of `send' or `write' (*note Miscellaneous Signals::.).
+-
+- - Function: int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)
+-     The `send' function is like `write', but with the additional flags
+-     FLAGS.  The possible values of FLAGS are described in *Note Socket
+-     Data Options::.
+-
+-     This function returns the number of bytes transmitted, or `-1' on
+-     failure.  If the socket is nonblocking, then `send' (like `write')
+-     can return after sending just part of the data.  *Note File Status
+-     Flags::, for information about nonblocking mode.
+-
+-     Note, however, that a successful return value merely indicates that
+-     the message has been sent without error, not necessarily that it
+-     has been received without error.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `EINTR'
+-          The operation was interrupted by a signal before any data was
+-          sent.  *Note Interrupted Primitives::.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `EMSGSIZE'
+-          The socket type requires that the message be sent atomically,
+-          but the message is too large for this to be possible.
+-
+-    `EWOULDBLOCK'
+-          Nonblocking mode has been set on the socket, and the write
+-          operation would block.  (Normally `send' blocks until the
+-          operation can be completed.)
+-
+-    `ENOBUFS'
+-          There is not enough internal buffer space available.
+-
+-    `ENOTCONN'
+-          You never connected this socket.
+-
+-    `EPIPE'
+-          This socket was connected but the connection is now broken.
+-          In this case, `send' generates a `SIGPIPE' signal first; if
+-          that signal is ignored or blocked, or if its handler returns,
+-          then `send' fails with `EPIPE'.
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+-
+-File: libc.info,  Node: Receiving Data,  Next: Socket Data Options,  Prev: Sending Data,  Up: Transferring Data
+-
+-Receiving Data
+-..............
+-
+-   The `recv' function is declared in the header file `sys/socket.h'.
+-If your FLAGS argument is zero, you can just as well use `read' instead
+-of `recv'; see *Note I/O Primitives::.
+-
+- - Function: int recv (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)
+-     The `recv' function is like `read', but with the additional flags
+-     FLAGS.  The possible values of FLAGS are described in *Note Socket
+-     Data Options::.
+-
+-     If nonblocking mode is set for SOCKET, and no data is available to
+-     be read, `recv' fails immediately rather than waiting.  *Note File
+-     Status Flags::, for information about nonblocking mode.
+-
+-     This function returns the number of bytes received, or `-1' on
+-     failure.  The following `errno' error conditions are defined for
+-     this function:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `EWOULDBLOCK'
+-          Nonblocking mode has been set on the socket, and the read
+-          operation would block.  (Normally, `recv' blocks until there
+-          is input available to be read.)
+-
+-    `EINTR'
+-          The operation was interrupted by a signal before any data was
+-          read.  *Note Interrupted Primitives::.
+-
+-    `ENOTCONN'
+-          You never connected this socket.
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+-
+-File: libc.info,  Node: Socket Data Options,  Prev: Receiving Data,  Up: Transferring Data
+-
+-Socket Data Options
+-...................
+-
+-   The FLAGS argument to `send' and `recv' is a bit mask.  You can
+-bitwise-OR the values of the following macros together to obtain a
+-value for this argument.  All are defined in the header file
+-`sys/socket.h'.
+-
+- - Macro: int MSG_OOB
+-     Send or receive out-of-band data.  *Note Out-of-Band Data::.
+-
+- - Macro: int MSG_PEEK
+-     Look at the data but don't remove it from the input queue.  This is
+-     only meaningful with input functions such as `recv', not with
+-     `send'.
+-
+- - Macro: int MSG_DONTROUTE
+-     Don't include routing information in the message.  This is only
+-     meaningful with output operations, and is usually only of interest
+-     for diagnostic or routing programs.  We don't try to explain it
+-     here.
+-
+-
+-File: libc.info,  Node: Byte Stream Example,  Next: Server Example,  Prev: Transferring Data,  Up: Connections
+-
+-Byte Stream Socket Example
+---------------------------
+-
+-   Here is an example client program that makes a connection for a byte
+-stream socket in the Internet namespace.  It doesn't do anything
+-particularly interesting once it has connected to the server; it just
+-sends a text string to the server and exits.
+-
+-   This program uses `init_sockaddr' to set up the socket address; see
+-*Note Inet Example::.
+-
+-     #include <stdio.h>
+-     #include <errno.h>
+-     #include <stdlib.h>
+-     #include <unistd.h>
+-     #include <sys/types.h>
+-     #include <sys/socket.h>
+-     #include <netinet/in.h>
+-     #include <netdb.h>
+-     
+-     #define PORT            5555
+-     #define MESSAGE         "Yow!!! Are we having fun yet?!?"
+-     #define SERVERHOST      "mescaline.gnu.org"
+-     
+-     void
+-     write_to_server (int filedes)
+-     {
+-       int nbytes;
+-     
+-       nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
+-       if (nbytes < 0)
+-         {
+-           perror ("write");
+-           exit (EXIT_FAILURE);
+-         }
+-     }
+-     
+-     
+-     int
+-     main (void)
+-     {
+-       extern void init_sockaddr (struct sockaddr_in *name,
+-                                  const char *hostname,
+-                                  uint16_t port);
+-       int sock;
+-       struct sockaddr_in servername;
+-     
+-       /* Create the socket. */
+-       sock = socket (PF_INET, SOCK_STREAM, 0);
+-       if (sock < 0)
+-         {
+-           perror ("socket (client)");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Connect to the server. */
+-       init_sockaddr (&servername, SERVERHOST, PORT);
+-       if (0 > connect (sock,
+-                        (struct sockaddr *) &servername,
+-                        sizeof (servername)))
+-         {
+-           perror ("connect (client)");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Send data to the server. */
+-       write_to_server (sock);
+-       close (sock);
+-       exit (EXIT_SUCCESS);
+-     }
+-
+-
+-File: libc.info,  Node: Server Example,  Next: Out-of-Band Data,  Prev: Byte Stream Example,  Up: Connections
+-
+-Byte Stream Connection Server Example
+--------------------------------------
+-
+-   The server end is much more complicated.  Since we want to allow
+-multiple clients to be connected to the server at the same time, it
+-would be incorrect to wait for input from a single client by simply
+-calling `read' or `recv'.  Instead, the right thing to do is to use
+-`select' (*note Waiting for I/O::.) to wait for input on all of the
+-open sockets.  This also allows the server to deal with additional
+-connection requests.
+-
+-   This particular server doesn't do anything interesting once it has
+-gotten a message from a client.  It does close the socket for that
+-client when it detects an end-of-file condition (resulting from the
+-client shutting down its end of the connection).
+-
+-   This program uses `make_socket' to set up the socket address; see
+-*Note Inet Example::.
+-
+-     #include <stdio.h>
+-     #include <errno.h>
+-     #include <stdlib.h>
+-     #include <unistd.h>
+-     #include <sys/types.h>
+-     #include <sys/socket.h>
+-     #include <netinet/in.h>
+-     #include <netdb.h>
+-     
+-     #define PORT    5555
+-     #define MAXMSG  512
+-     
+-     int
+-     read_from_client (int filedes)
+-     {
+-       char buffer[MAXMSG];
+-       int nbytes;
+-     
+-       nbytes = read (filedes, buffer, MAXMSG);
+-       if (nbytes < 0)
+-         {
+-           /* Read error. */
+-           perror ("read");
+-           exit (EXIT_FAILURE);
+-         }
+-       else if (nbytes == 0)
+-         /* End-of-file. */
+-         return -1;
+-       else
+-         {
+-           /* Data read. */
+-           fprintf (stderr, "Server: got message: `%s'\n", buffer);
+-           return 0;
+-         }
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       extern int make_socket (uint16_t port);
+-       int sock;
+-       fd_set active_fd_set, read_fd_set;
+-       int i;
+-       struct sockaddr_in clientname;
+-       size_t size;
+-     
+-       /* Create the socket and set it up to accept connections. */
+-       sock = make_socket (PORT);
+-       if (listen (sock, 1) < 0)
+-         {
+-           perror ("listen");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Initialize the set of active sockets. */
+-       FD_ZERO (&active_fd_set);
+-       FD_SET (sock, &active_fd_set);
+-     
+-       while (1)
+-         {
+-           /* Block until input arrives on one or more active sockets. */
+-           read_fd_set = active_fd_set;
+-           if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
+-             {
+-               perror ("select");
+-               exit (EXIT_FAILURE);
+-             }
+-     
+-           /* Service all the sockets with input pending. */
+-           for (i = 0; i < FD_SETSIZE; ++i)
+-             if (FD_ISSET (i, &read_fd_set))
+-               {
+-                 if (i == sock)
+-                   {
+-                     /* Connection request on original socket. */
+-                     int new;
+-                     size = sizeof (clientname);
+-                     new = accept (sock,
+-                                   (struct sockaddr *) &clientname,
+-                                   &size);
+-                     if (new < 0)
+-                       {
+-                         perror ("accept");
+-                         exit (EXIT_FAILURE);
+-                       }
+-                     fprintf (stderr,
+-                              "Server: connect from host %s, port %hd.\n",
+-                              inet_ntoa (clientname.sin_addr),
+-                              ntohs (clientname.sin_port));
+-                     FD_SET (new, &active_fd_set);
+-                   }
+-                 else
+-                   {
+-                     /* Data arriving on an already-connected socket. */
+-                     if (read_from_client (i) < 0)
+-                       {
+-                         close (i);
+-                         FD_CLR (i, &active_fd_set);
+-                       }
+-                   }
+-               }
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Out-of-Band Data,  Prev: Server Example,  Up: Connections
+-
+-Out-of-Band Data
+-----------------
+-
+-   Streams with connections permit "out-of-band" data that is delivered
+-with higher priority than ordinary data.  Typically the reason for
+-sending out-of-band data is to send notice of an exceptional condition.
+-The way to send out-of-band data is using `send', specifying the flag
+-`MSG_OOB' (*note Sending Data::.).
+-
+-   Out-of-band data is received with higher priority because the
+-receiving process need not read it in sequence; to read the next
+-available out-of-band data, use `recv' with the `MSG_OOB' flag (*note
+-Receiving Data::.).  Ordinary read operations do not read out-of-band
+-data; they read only the ordinary data.
+-
+-   When a socket finds that out-of-band data is on its way, it sends a
+-`SIGURG' signal to the owner process or process group of the socket.
+-You can specify the owner using the `F_SETOWN' command to the `fcntl'
+-function; see *Note Interrupt Input::.  You must also establish a
+-handler for this signal, as described in *Note Signal Handling::, in
+-order to take appropriate action such as reading the out-of-band data.
+-
+-   Alternatively, you can test for pending out-of-band data, or wait
+-until there is out-of-band data, using the `select' function; it can
+-wait for an exceptional condition on the socket.  *Note Waiting for
+-I/O::, for more information about `select'.
+-
+-   Notification of out-of-band data (whether with `SIGURG' or with
+-`select') indicates that out-of-band data is on the way; the data may
+-not actually arrive until later.  If you try to read the out-of-band
+-data before it arrives, `recv' fails with an `EWOULDBLOCK' error.
+-
+-   Sending out-of-band data automatically places a "mark" in the stream
+-of ordinary data, showing where in the sequence the out-of-band data
+-"would have been".  This is useful when the meaning of out-of-band data
+-is "cancel everything sent so far".  Here is how you can test, in the
+-receiving process, whether any ordinary data was sent before the mark:
+-
+-     success = ioctl (socket, SIOCATMARK, &atmark);
+-
+-   The `integer' variable ATMARK is set to a nonzero value if the
+-socket's read pointer has reached the "mark".
+-
+-   Here's a function to discard any ordinary data preceding the
+-out-of-band mark:
+-
+-     int
+-     discard_until_mark (int socket)
+-     {
+-       while (1)
+-         {
+-           /* This is not an arbitrary limit; any size will do.  */
+-           char buffer[1024];
+-           int atmark, success;
+-     
+-           /* If we have reached the mark, return.  */
+-           success = ioctl (socket, SIOCATMARK, &atmark);
+-           if (success < 0)
+-             perror ("ioctl");
+-           if (result)
+-             return;
+-     
+-           /* Otherwise, read a bunch of ordinary data and discard it.
+-              This is guaranteed not to read past the mark
+-              if it starts before the mark.  */
+-           success = read (socket, buffer, sizeof buffer);
+-           if (success < 0)
+-             perror ("read");
+-         }
+-     }
+-
+-   If you don't want to discard the ordinary data preceding the mark,
+-you may need to read some of it anyway, to make room in internal system
+-buffers for the out-of-band data.  If you try to read out-of-band data
+-and get an `EWOULDBLOCK' error, try reading some ordinary data (saving
+-it so that you can use it when you want it) and see if that makes room.
+-Here is an example:
+-
+-     struct buffer
+-     {
+-       char *buffer;
+-       int size;
+-       struct buffer *next;
+-     };
+-     
+-     /* Read the out-of-band data from SOCKET and return it
+-        as a `struct buffer', which records the address of the data
+-        and its size.
+-     
+-        It may be necessary to read some ordinary data
+-        in order to make room for the out-of-band data.
+-        If so, the ordinary data is saved as a chain of buffers
+-        found in the `next' field of the value.  */
+-     
+-     struct buffer *
+-     read_oob (int socket)
+-     {
+-       struct buffer *tail = 0;
+-       struct buffer *list = 0;
+-     
+-       while (1)
+-         {
+-           /* This is an arbitrary limit.
+-              Does anyone know how to do this without a limit?  */
+-           char *buffer = (char *) xmalloc (1024);
+-           int success;
+-           int atmark;
+-     
+-           /* Try again to read the out-of-band data.  */
+-           success = recv (socket, buffer, sizeof buffer, MSG_OOB);
+-           if (success >= 0)
+-             {
+-               /* We got it, so return it.  */
+-               struct buffer *link
+-                 = (struct buffer *) xmalloc (sizeof (struct buffer));
+-               link->buffer = buffer;
+-               link->size = success;
+-               link->next = list;
+-               return link;
+-             }
+-     
+-           /* If we fail, see if we are at the mark.  */
+-           success = ioctl (socket, SIOCATMARK, &atmark);
+-           if (success < 0)
+-             perror ("ioctl");
+-           if (atmark)
+-             {
+-               /* At the mark; skipping past more ordinary data cannot help.
+-                  So just wait a while.  */
+-               sleep (1);
+-               continue;
+-             }
+-     
+-           /* Otherwise, read a bunch of ordinary data and save it.
+-              This is guaranteed not to read past the mark
+-              if it starts before the mark.  */
+-           success = read (socket, buffer, sizeof buffer);
+-           if (success < 0)
+-             perror ("read");
+-     
+-           /* Save this data in the buffer list.  */
+-           {
+-             struct buffer *link
+-               = (struct buffer *) xmalloc (sizeof (struct buffer));
+-             link->buffer = buffer;
+-             link->size = success;
+-     
+-             /* Add the new link to the end of the list.  */
+-             if (tail)
+-               tail->next = link;
+-             else
+-               list = link;
+-             tail = link;
+-           }
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Datagrams,  Next: Inetd,  Prev: Connections,  Up: Sockets
+-
+-Datagram Socket Operations
+-==========================
+-
+-   This section describes how to use communication styles that don't use
+-connections (styles `SOCK_DGRAM' and `SOCK_RDM').  Using these styles,
+-you group data into packets and each packet is an independent
+-communication.  You specify the destination for each packet
+-individually.
+-
+-   Datagram packets are like letters: you send each one independently,
+-with its own destination address, and they may arrive in the wrong
+-order or not at all.
+-
+-   The `listen' and `accept' functions are not allowed for sockets
+-using connectionless communication styles.
+-
+-* Menu:
+-
+-* Sending Datagrams::    Sending packets on a datagram socket.
+-* Receiving Datagrams::  Receiving packets on a datagram socket.
+-* Datagram Example::     An example program: packets sent over a
+-                           datagram socket in the local namespace.
+-* Example Receiver::	 Another program, that receives those packets.
+-
+-
+-File: libc.info,  Node: Sending Datagrams,  Next: Receiving Datagrams,  Up: Datagrams
+-
+-Sending Datagrams
+------------------
+-
+-   The normal way of sending data on a datagram socket is by using the
+-`sendto' function, declared in `sys/socket.h'.
+-
+-   You can call `connect' on a datagram socket, but this only specifies
+-a default destination for further data transmission on the socket.
+-When a socket has a default destination, then you can use `send' (*note
+-Sending Data::.) or even `write' (*note I/O Primitives::.) to send a
+-packet there.  You can cancel the default destination by calling
+-`connect' using an address format of `AF_UNSPEC' in the ADDR argument.
+-*Note Connecting::, for more information about the `connect' function.
+-
+- - Function: int sendto (int SOCKET, void *BUFFER. size_t SIZE, int
+-          FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)
+-     The `sendto' function transmits the data in the BUFFER through the
+-     socket SOCKET to the destination address specified by the ADDR and
+-     LENGTH arguments.  The SIZE argument specifies the number of bytes
+-     to be transmitted.
+-
+-     The FLAGS are interpreted the same way as for `send'; see *Note
+-     Socket Data Options::.
+-
+-     The return value and error conditions are also the same as for
+-     `send', but you cannot rely on the system to detect errors and
+-     report them; the most common error is that the packet is lost or
+-     there is no one at the specified address to receive it, and the
+-     operating system on your machine usually does not know this.
+-
+-     It is also possible for one call to `sendto' to report an error
+-     due to a problem related to a previous call.
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-25 glibc-2.1.3/manual/libc.info-25
+--- ../glibc-2.1.3/manual/libc.info-25	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-25	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1208 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Receiving Datagrams,  Next: Datagram Example,  Prev: Sending Datagrams,  Up: Datagrams
+-
+-Receiving Datagrams
+--------------------
+-
+-   The `recvfrom' function reads a packet from a datagram socket and
+-also tells you where it was sent from.  This function is declared in
+-`sys/socket.h'.
+-
+- - Function: int recvfrom (int SOCKET, void *BUFFER, size_t SIZE, int
+-          FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)
+-     The `recvfrom' function reads one packet from the socket SOCKET
+-     into the buffer BUFFER.  The SIZE argument specifies the maximum
+-     number of bytes to be read.
+-
+-     If the packet is longer than SIZE bytes, then you get the first
+-     SIZE bytes of the packet, and the rest of the packet is lost.
+-     There's no way to read the rest of the packet.  Thus, when you use
+-     a packet protocol, you must always know how long a packet to
+-     expect.
+-
+-     The ADDR and LENGTH-PTR arguments are used to return the address
+-     where the packet came from.  *Note Socket Addresses::.  For a
+-     socket in the local domain, the address information won't be
+-     meaningful, since you can't read the address of such a socket
+-     (*note Local Namespace::.).  You can specify a null pointer as the
+-     ADDR argument if you are not interested in this information.
+-
+-     The FLAGS are interpreted the same way as for `recv' (*note Socket
+-     Data Options::.).  The return value and error conditions are also
+-     the same as for `recv'.
+-
+-     This function is defined as a cancelation point in multi-threaded
+-     programs.  So one has to be prepared for this and make sure that
+-     possibly allocated resources (like memory, files descriptors,
+-     semaphores or whatever) are freed even if the thread is canceled.
+-
+-   You can use plain `recv' (*note Receiving Data::.) instead of
+-`recvfrom' if you know don't need to find out who sent the packet
+-(either because you know where it should come from or because you treat
+-all possible senders alike).  Even `read' can be used if you don't want
+-to specify FLAGS (*note I/O Primitives::.).
+-
+-
+-File: libc.info,  Node: Datagram Example,  Next: Example Receiver,  Prev: Receiving Datagrams,  Up: Datagrams
+-
+-Datagram Socket Example
+------------------------
+-
+-   Here is a set of example programs that send messages over a datagram
+-stream in the local namespace.  Both the client and server programs use
+-the `make_named_socket' function that was presented in *Note Local
+-Socket Example::, to create and name their sockets.
+-
+-   First, here is the server program.  It sits in a loop waiting for
+-messages to arrive, bouncing each message back to the sender.
+-Obviously, this isn't a particularly useful program, but it does show
+-the general ideas involved.
+-
+-     #include <stdio.h>
+-     #include <errno.h>
+-     #include <stdlib.h>
+-     #include <sys/socket.h>
+-     #include <sys/un.h>
+-     
+-     #define SERVER  "/tmp/serversocket"
+-     #define MAXMSG  512
+-     
+-     int
+-     main (void)
+-     {
+-       int sock;
+-       char message[MAXMSG];
+-       struct sockaddr_un name;
+-       size_t size;
+-       int nbytes;
+-     
+-       /* Remove the filename first, it's ok if the call fails */
+-       unlink (SERVER);
+-     
+-       /* Make the socket, then loop endlessly. */
+-       sock = make_named_socket (SERVER);
+-       while (1)
+-         {
+-           /* Wait for a datagram. */
+-           size = sizeof (name);
+-           nbytes = recvfrom (sock, message, MAXMSG, 0,
+-                              (struct sockaddr *) & name, &size);
+-           if (nbytes < 0)
+-             {
+-               perror ("recfrom (server)");
+-               exit (EXIT_FAILURE);
+-             }
+-     
+-           /* Give a diagnostic message. */
+-           fprintf (stderr, "Server: got message: %s\n", message);
+-     
+-           /* Bounce the message back to the sender. */
+-           nbytes = sendto (sock, message, nbytes, 0,
+-                            (struct sockaddr *) & name, size);
+-           if (nbytes < 0)
+-             {
+-               perror ("sendto (server)");
+-               exit (EXIT_FAILURE);
+-             }
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Example Receiver,  Prev: Datagram Example,  Up: Datagrams
+-
+-Example of Reading Datagrams
+-----------------------------
+-
+-   Here is the client program corresponding to the server above.
+-
+-   It sends a datagram to the server and then waits for a reply.  Notice
+-that the socket for the client (as well as for the server) in this
+-example has to be given a name.  This is so that the server can direct
+-a message back to the client.  Since the socket has no associated
+-connection state, the only way the server can do this is by referencing
+-the name of the client.
+-
+-     #include <stdio.h>
+-     #include <errno.h>
+-     #include <unistd.h>
+-     #include <stdlib.h>
+-     #include <sys/socket.h>
+-     #include <sys/un.h>
+-     
+-     #define SERVER  "/tmp/serversocket"
+-     #define CLIENT  "/tmp/mysocket"
+-     #define MAXMSG  512
+-     #define MESSAGE "Yow!!! Are we having fun yet?!?"
+-     
+-     int
+-     main (void)
+-     {
+-       extern int make_named_socket (const char *name);
+-       int sock;
+-       char message[MAXMSG];
+-       struct sockaddr_un name;
+-       size_t size;
+-       int nbytes;
+-     
+-       /* Make the socket. */
+-       sock = make_named_socket (CLIENT);
+-     
+-       /* Initialize the server socket address. */
+-       name.sun_family = AF_LOCAL;
+-       strcpy (name.sun_path, SERVER);
+-       size = strlen (name.sun_path) + sizeof (name.sun_family);
+-     
+-       /* Send the datagram. */
+-       nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
+-                        (struct sockaddr *) & name, size);
+-       if (nbytes < 0)
+-         {
+-           perror ("sendto (client)");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Wait for a reply. */
+-       nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
+-       if (nbytes < 0)
+-         {
+-           perror ("recfrom (client)");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Print a diagnostic message. */
+-       fprintf (stderr, "Client: got message: %s\n", message);
+-     
+-       /* Clean up. */
+-       remove (CLIENT);
+-       close (sock);
+-     }
+-
+-   Keep in mind that datagram socket communications are unreliable.  In
+-this example, the client program waits indefinitely if the message
+-never reaches the server or if the server's response never comes back.
+-It's up to the user running the program to kill it and restart it, if
+-desired.  A more automatic solution could be to use `select' (*note
+-Waiting for I/O::.) to establish a timeout period for the reply, and in
+-case of timeout either resend the message or shut down the socket and
+-exit.
+-
+-
+-File: libc.info,  Node: Inetd,  Next: Socket Options,  Prev: Datagrams,  Up: Sockets
+-
+-The `inetd' Daemon
+-==================
+-
+-   We've explained above how to write a server program that does its own
+-listening.  Such a server must already be running in order for anyone
+-to connect to it.
+-
+-   Another way to provide service for an Internet port is to let the
+-daemon program `inetd' do the listening.  `inetd' is a program that
+-runs all the time and waits (using `select') for messages on a
+-specified set of ports.  When it receives a message, it accepts the
+-connection (if the socket style calls for connections) and then forks a
+-child process to run the corresponding server program.  You specify the
+-ports and their programs in the file `/etc/inetd.conf'.
+-
+-* Menu:
+-
+-* Inetd Servers::
+-* Configuring Inetd::
+-
+-
+-File: libc.info,  Node: Inetd Servers,  Next: Configuring Inetd,  Up: Inetd
+-
+-`inetd' Servers
+----------------
+-
+-   Writing a server program to be run by `inetd' is very simple.  Each
+-time someone requests a connection to the appropriate port, a new server
+-process starts.  The connection already exists at this time; the socket
+-is available as the standard input descriptor and as the standard
+-output descriptor (descriptors 0 and 1) in the server process.  So the
+-server program can begin reading and writing data right away.  Often
+-the program needs only the ordinary I/O facilities; in fact, a
+-general-purpose filter program that knows nothing about sockets can
+-work as a byte stream server run by `inetd'.
+-
+-   You can also use `inetd' for servers that use connectionless
+-communication styles.  For these servers, `inetd' does not try to accept
+-a connection, since no connection is possible.  It just starts the
+-server program, which can read the incoming datagram packet from
+-descriptor 0.  The server program can handle one request and then exit,
+-or you can choose to write it to keep reading more requests until no
+-more arrive, and then exit.  You must specify which of these two
+-techniques the server uses, when you configure `inetd'.
+-
+-
+-File: libc.info,  Node: Configuring Inetd,  Prev: Inetd Servers,  Up: Inetd
+-
+-Configuring `inetd'
+--------------------
+-
+-   The file `/etc/inetd.conf' tells `inetd' which ports to listen to
+-and what server programs to run for them.  Normally each entry in the
+-file is one line, but you can split it onto multiple lines provided all
+-but the first line of the entry start with whitespace.  Lines that
+-start with `#' are comments.
+-
+-   Here are two standard entries in `/etc/inetd.conf':
+-
+-     ftp	stream	tcp	nowait	root	/libexec/ftpd	ftpd
+-     talk	dgram	udp	wait	root	/libexec/talkd	talkd
+-
+-   An entry has this format:
+-
+-     SERVICE STYLE PROTOCOL WAIT USERNAME PROGRAM ARGUMENTS
+-
+-   The SERVICE field says which service this program provides.  It
+-should be the name of a service defined in `/etc/services'.  `inetd'
+-uses SERVICE to decide which port to listen on for this entry.
+-
+-   The fields STYLE and PROTOCOL specify the communication style and
+-the protocol to use for the listening socket.  The style should be the
+-name of a communication style, converted to lower case and with `SOCK_'
+-deleted--for example, `stream' or `dgram'.  PROTOCOL should be one of
+-the protocols listed in `/etc/protocols'.  The typical protocol names
+-are `tcp' for byte stream connections and `udp' for unreliable
+-datagrams.
+-
+-   The WAIT field should be either `wait' or `nowait'.  Use `wait' if
+-STYLE is a connectionless style and the server, once started, handles
+-multiple requests, as many as come in.  Use `nowait' if `inetd' should
+-start a new process for each message or request that comes in.  If
+-STYLE uses connections, then WAIT *must* be `nowait'.
+-
+-   USER is the user name that the server should run as.  `inetd' runs
+-as root, so it can set the user ID of its children arbitrarily.  It's
+-best to avoid using `root' for USER if you can; but some servers, such
+-as Telnet and FTP, read a username and password themselves.  These
+-servers need to be root initially so they can log in as commanded by
+-the data coming over the network.
+-
+-   PROGRAM together with ARGUMENTS specifies the command to run to
+-start the server.  PROGRAM should be an absolute file name specifying
+-the executable file to run.  ARGUMENTS consists of any number of
+-whitespace-separated words, which become the command-line arguments of
+-PROGRAM.  The first word in ARGUMENTS is argument zero, which should by
+-convention be the program name itself (sans directories).
+-
+-   If you edit `/etc/inetd.conf', you can tell `inetd' to reread the
+-file and obey its new contents by sending the `inetd' process the
+-`SIGHUP' signal.  You'll have to use `ps' to determine the process ID
+-of the `inetd' process, as it is not fixed.
+-
+-
+-File: libc.info,  Node: Socket Options,  Next: Networks Database,  Prev: Inetd,  Up: Sockets
+-
+-Socket Options
+-==============
+-
+-   This section describes how to read or set various options that modify
+-the behavior of sockets and their underlying communications protocols.
+-
+-   When you are manipulating a socket option, you must specify which
+-"level" the option pertains to.  This describes whether the option
+-applies to the socket interface, or to a lower-level communications
+-protocol interface.
+-
+-* Menu:
+-
+-* Socket Option Functions::     The basic functions for setting and getting
+-                                 socket options.
+-* Socket-Level Options::        Details of the options at the socket level.
+-
+-
+-File: libc.info,  Node: Socket Option Functions,  Next: Socket-Level Options,  Up: Socket Options
+-
+-Socket Option Functions
+------------------------
+-
+-   Here are the functions for examining and modifying socket options.
+-They are declared in `sys/socket.h'.
+-
+- - Function: int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void
+-          *OPTVAL, socklen_t *OPTLEN-PTR)
+-     The `getsockopt' function gets information about the value of
+-     option OPTNAME at level LEVEL for socket SOCKET.
+-
+-     The option value is stored in a buffer that OPTVAL points to.
+-     Before the call, you should supply in `*OPTLEN-PTR' the size of
+-     this buffer; on return, it contains the number of bytes of
+-     information actually stored in the buffer.
+-
+-     Most options interpret the OPTVAL buffer as a single `int' value.
+-
+-     The actual return value of `getsockopt' is `0' on success and `-1'
+-     on failure.  The following `errno' error conditions are defined:
+-
+-    `EBADF'
+-          The SOCKET argument is not a valid file descriptor.
+-
+-    `ENOTSOCK'
+-          The descriptor SOCKET is not a socket.
+-
+-    `ENOPROTOOPT'
+-          The OPTNAME doesn't make sense for the given LEVEL.
+-
+- - Function: int setsockopt (int SOCKET, int LEVEL, int OPTNAME, void
+-          *OPTVAL, socklen_t OPTLEN)
+-     This function is used to set the socket option OPTNAME at level
+-     LEVEL for socket SOCKET.  The value of the option is passed in the
+-     buffer OPTVAL, which has size OPTLEN.
+-
+-     The return value and error codes for `setsockopt' are the same as
+-     for `getsockopt'.
+-
+-
+-
+-File: libc.info,  Node: Socket-Level Options,  Prev: Socket Option Functions,  Up: Socket Options
+-
+-Socket-Level Options
+---------------------
+-
+- - Constant: int SOL_SOCKET
+-     Use this constant as the LEVEL argument to `getsockopt' or
+-     `setsockopt' to manipulate the socket-level options described in
+-     this section.
+-
+-Here is a table of socket-level option names; all are defined in the
+-header file `sys/socket.h'.
+-
+-`SO_DEBUG'
+-     This option toggles recording of debugging information in the
+-     underlying protocol modules.  The value has type `int'; a nonzero
+-     value means "yes".
+-
+-`SO_REUSEADDR'
+-     This option controls whether `bind' (*note Setting Address::.)
+-     should permit reuse of local addresses for this socket.  If you
+-     enable this option, you can actually have two sockets with the
+-     same Internet port number; but the system won't allow you to use
+-     the two identically-named sockets in a way that would confuse the
+-     Internet.  The reason for this option is that some higher-level
+-     Internet protocols, including FTP, require you to keep reusing the
+-     same port number.
+-
+-     The value has type `int'; a nonzero value means "yes".
+-
+-`SO_KEEPALIVE'
+-     This option controls whether the underlying protocol should
+-     periodically transmit messages on a connected socket.  If the peer
+-     fails to respond to these messages, the connection is considered
+-     broken.  The value has type `int'; a nonzero value means "yes".
+-
+-`SO_DONTROUTE'
+-     This option controls whether outgoing messages bypass the normal
+-     message routing facilities.  If set, messages are sent directly to
+-     the network interface instead.  The value has type `int'; a nonzero
+-     value means "yes".
+-
+-`SO_LINGER'
+-     This option specifies what should happen when the socket of a type
+-     that promises reliable delivery still has untransmitted messages
+-     when it is closed; see *Note Closing a Socket::.  The value has
+-     type `struct linger'.
+-
+-      - Data Type: struct linger
+-          This structure type has the following members:
+-
+-         `int l_onoff'
+-               This field is interpreted as a boolean.  If nonzero,
+-               `close' blocks until the data is transmitted or the
+-               timeout period has expired.
+-
+-         `int l_linger'
+-               This specifies the timeout period, in seconds.
+-
+-`SO_BROADCAST'
+-     This option controls whether datagrams may be broadcast from the
+-     socket.  The value has type `int'; a nonzero value means "yes".
+-
+-`SO_OOBINLINE'
+-     If this option is set, out-of-band data received on the socket is
+-     placed in the normal input queue.  This permits it to be read using
+-     `read' or `recv' without specifying the `MSG_OOB' flag.  *Note
+-     Out-of-Band Data::.  The value has type `int'; a nonzero value
+-     means "yes".
+-
+-`SO_SNDBUF'
+-     This option gets or sets the size of the output buffer.  The value
+-     is a `size_t', which is the size in bytes.
+-
+-`SO_RCVBUF'
+-     This option gets or sets the size of the input buffer.  The value
+-     is a `size_t', which is the size in bytes.
+-
+-`SO_STYLE'
+-`SO_TYPE'
+-     This option can be used with `getsockopt' only.  It is used to get
+-     the socket's communication style.  `SO_TYPE' is the historical
+-     name, and `SO_STYLE' is the preferred name in GNU.  The value has
+-     type `int' and its value designates a communication style; see
+-     *Note Communication Styles::.
+-
+-`SO_ERROR'
+-     This option can be used with `getsockopt' only.  It is used to
+-     reset the error status of the socket.  The value is an `int',
+-     which represents the previous error status.
+-
+-
+-File: libc.info,  Node: Networks Database,  Prev: Socket Options,  Up: Sockets
+-
+-Networks Database
+-=================
+-
+-   Many systems come with a database that records a list of networks
+-known to the system developer.  This is usually kept either in the file
+-`/etc/networks' or in an equivalent from a name server.  This data base
+-is useful for routing programs such as `route', but it is not useful
+-for programs that simply communicate over the network.  We provide
+-functions to access this data base, which are declared in `netdb.h'.
+-
+- - Data Type: struct netent
+-     This data type is used to represent information about entries in
+-     the networks database.  It has the following members:
+-
+-    `char *n_name'
+-          This is the "official" name of the network.
+-
+-    `char **n_aliases'
+-          These are alternative names for the network, represented as a
+-          vector of strings.  A null pointer terminates the array.
+-
+-    `int n_addrtype'
+-          This is the type of the network number; this is always equal
+-          to `AF_INET' for Internet networks.
+-
+-    `unsigned long int n_net'
+-          This is the network number.  Network numbers are returned in
+-          host byte order; see *Note Byte Order::.
+-
+-   Use the `getnetbyname' or `getnetbyaddr' functions to search the
+-networks database for information about a specific network.  The
+-information is returned in a statically-allocated structure; you must
+-copy the information if you need to save it.
+-
+- - Function: struct netent * getnetbyname (const char *NAME)
+-     The `getnetbyname' function returns information about the network
+-     named NAME.  It returns a null pointer if there is no such network.
+-
+- - Function: struct netent * getnetbyaddr (unsigned long int NET, int
+-          TYPE)
+-     The `getnetbyaddr' function returns information about the network
+-     of type TYPE with number NET.  You should specify a value of
+-     `AF_INET' for the TYPE argument for Internet networks.
+-
+-     `getnetbyaddr' returns a null pointer if there is no such network.
+-
+-   You can also scan the networks database using `setnetent',
+-`getnetent', and `endnetent'.  Be careful in using these functions,
+-because they are not reentrant.
+-
+- - Function: void setnetent (int STAYOPEN)
+-     This function opens and rewinds the networks database.
+-
+-     If the STAYOPEN argument is nonzero, this sets a flag so that
+-     subsequent calls to `getnetbyname' or `getnetbyaddr' will not
+-     close the database (as they usually would).  This makes for more
+-     efficiency if you call those functions several times, by avoiding
+-     reopening the database for each call.
+-
+- - Function: struct netent * getnetent (void)
+-     This function returns the next entry in the networks database.  It
+-     returns a null pointer if there are no more entries.
+-
+- - Function: void endnetent (void)
+-     This function closes the networks database.
+-
+-
+-File: libc.info,  Node: Low-Level Terminal Interface,  Next: Mathematics,  Prev: Sockets,  Up: Top
+-
+-Low-Level Terminal Interface
+-****************************
+-
+-   This chapter describes functions that are specific to terminal
+-devices.  You can use these functions to do things like turn off input
+-echoing; set serial line characteristics such as line speed and flow
+-control; and change which characters are used for end-of-file,
+-command-line editing, sending signals, and similar control functions.
+-
+-   Most of the functions in this chapter operate on file descriptors.
+-*Note Low-Level I/O::, for more information about what a file
+-descriptor is and how to open a file descriptor for a terminal device.
+-
+-* Menu:
+-
+-* Is It a Terminal::            How to determine if a file is a terminal
+-			         device, and what its name is.
+-* I/O Queues::                  About flow control and typeahead.
+-* Canonical or Not::            Two basic styles of input processing.
+-* Terminal Modes::              How to examine and modify flags controlling
+-			         details of terminal I/O: echoing,
+-                                 signals, editing.
+-* Line Control::                Sending break sequences, clearing
+-                                 terminal buffers ...
+-* Noncanon Example::            How to read single characters without echo.
+-* Pseudo-Terminals::            How to open a pseudo-terminal.
+-
+-
+-File: libc.info,  Node: Is It a Terminal,  Next: I/O Queues,  Up: Low-Level Terminal Interface
+-
+-Identifying Terminals
+-=====================
+-
+-   The functions described in this chapter only work on files that
+-correspond to terminal devices.  You can find out whether a file
+-descriptor is associated with a terminal by using the `isatty' function.
+-
+-   Prototypes for the functions in this section are declared in the
+-header file `unistd.h'.
+-
+- - Function: int isatty (int FILEDES)
+-     This function returns `1' if FILEDES is a file descriptor
+-     associated with an open terminal device, and 0 otherwise.
+-
+-   If a file descriptor is associated with a terminal, you can get its
+-associated file name using the `ttyname' function.  See also the
+-`ctermid' function, described in *Note Identifying the Terminal::.
+-
+- - Function: char * ttyname (int FILEDES)
+-     If the file descriptor FILEDES is associated with a terminal
+-     device, the `ttyname' function returns a pointer to a
+-     statically-allocated, null-terminated string containing the file
+-     name of the terminal file.  The value is a null pointer if the
+-     file descriptor isn't associated with a terminal, or the file name
+-     cannot be determined.
+-
+- - Function: int ttyname_r (int FILEDES, char *BUF, size_t LEN)
+-     The `ttyname_r' function is similar to the `ttyname' function
+-     except that it places its result into the user-specified buffer
+-     starting at BUF with length LEN.
+-
+-     The normal return value from `ttyname_r' is 0.  Otherwise an error
+-     number is returned to indicate the error.  The following `errno'
+-     error conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal.
+-
+-    `ERANGE'
+-          The buffer length LEN is too small to store the string to be
+-          returned.
+-
+-
+-File: libc.info,  Node: I/O Queues,  Next: Canonical or Not,  Prev: Is It a Terminal,  Up: Low-Level Terminal Interface
+-
+-I/O Queues
+-==========
+-
+-   Many of the remaining functions in this section refer to the input
+-and output queues of a terminal device.  These queues implement a form
+-of buffering *within the kernel* independent of the buffering
+-implemented by I/O streams (*note I/O on Streams::.).
+-
+-   The "terminal input queue" is also sometimes referred to as its
+-"typeahead buffer".  It holds the characters that have been received
+-from the terminal but not yet read by any process.
+-
+-   The size of the input queue is described by the `MAX_INPUT' and
+-`_POSIX_MAX_INPUT' parameters; see *Note Limits for Files::.  You are
+-guaranteed a queue size of at least `MAX_INPUT', but the queue might be
+-larger, and might even dynamically change size.  If input flow control
+-is enabled by setting the `IXOFF' input mode bit (*note Input
+-Modes::.), the terminal driver transmits STOP and START characters to
+-the terminal when necessary to prevent the queue from overflowing.
+-Otherwise, input may be lost if it comes in too fast from the terminal.
+-In canonical mode, all input stays in the queue until a newline
+-character is received, so the terminal input queue can fill up when you
+-type a very long line.  *Note Canonical or Not::.
+-
+-   The "terminal output queue" is like the input queue, but for output;
+-it contains characters that have been written by processes, but not yet
+-transmitted to the terminal.  If output flow control is enabled by
+-setting the `IXON' input mode bit (*note Input Modes::.), the terminal
+-driver obeys START and STOP characters sent by the terminal to stop and
+-restart transmission of output.
+-
+-   "Clearing" the terminal input queue means discarding any characters
+-that have been received but not yet read.  Similarly, clearing the
+-terminal output queue means discarding any characters that have been
+-written but not yet transmitted.
+-
+-
+-File: libc.info,  Node: Canonical or Not,  Next: Terminal Modes,  Prev: I/O Queues,  Up: Low-Level Terminal Interface
+-
+-Two Styles of Input: Canonical or Not
+-=====================================
+-
+-   POSIX systems support two basic modes of input: canonical and
+-noncanonical.
+-
+-   In "canonical input processing" mode, terminal input is processed in
+-lines terminated by newline (`'\n''), EOF, or EOL characters.  No input
+-can be read until an entire line has been typed by the user, and the
+-`read' function (*note I/O Primitives::.) returns at most a single line
+-of input, no matter how many bytes are requested.
+-
+-   In canonical input mode, the operating system provides input editing
+-facilities: some characters are interpreted specially to perform editing
+-operations within the current line of text, such as ERASE and KILL.
+-*Note Editing Characters::.
+-
+-   The constants `_POSIX_MAX_CANON' and `MAX_CANON' parameterize the
+-maximum number of bytes which may appear in a single line of canonical
+-input.  *Note Limits for Files::.  You are guaranteed a maximum line
+-length of at least `MAX_CANON' bytes, but the maximum might be larger,
+-and might even dynamically change size.
+-
+-   In "noncanonical input processing" mode, characters are not grouped
+-into lines, and ERASE and KILL processing is not performed.  The
+-granularity with which bytes are read in noncanonical input mode is
+-controlled by the MIN and TIME settings.  *Note Noncanonical Input::.
+-
+-   Most programs use canonical input mode, because this gives the user a
+-way to edit input line by line.  The usual reason to use noncanonical
+-mode is when the program accepts single-character commands or provides
+-its own editing facilities.
+-
+-   The choice of canonical or noncanonical input is controlled by the
+-`ICANON' flag in the `c_lflag' member of `struct termios'.  *Note Local
+-Modes::.
+-
+-
+-File: libc.info,  Node: Terminal Modes,  Next: Line Control,  Prev: Canonical or Not,  Up: Low-Level Terminal Interface
+-
+-Terminal Modes
+-==============
+-
+-   This section describes the various terminal attributes that control
+-how input and output are done.  The functions, data structures, and
+-symbolic constants are all declared in the header file `termios.h'.
+-
+-* Menu:
+-
+-* Mode Data Types::             The data type `struct termios' and
+-                                 related types.
+-* Mode Functions::              Functions to read and set the terminal
+-                                 attributes.
+-* Setting Modes::               The right way to set terminal attributes
+-                                 reliably.
+-* Input Modes::                 Flags controlling low-level input handling.
+-* Output Modes::                Flags controlling low-level output handling.
+-* Control Modes::               Flags controlling serial port behavior.
+-* Local Modes::                 Flags controlling high-level input handling.
+-* Line Speed::                  How to read and set the terminal line speed.
+-* Special Characters::          Characters that have special effects,
+-			         and how to change them.
+-* Noncanonical Input::          Controlling how long to wait for input.
+-
+-
+-File: libc.info,  Node: Mode Data Types,  Next: Mode Functions,  Up: Terminal Modes
+-
+-Terminal Mode Data Types
+-------------------------
+-
+-   The entire collection of attributes of a terminal is stored in a
+-structure of type `struct termios'.  This structure is used with the
+-functions `tcgetattr' and `tcsetattr' to read and set the attributes.
+-
+- - Data Type: struct termios
+-     Structure that records all the I/O attributes of a terminal.  The
+-     structure includes at least the following members:
+-
+-    `tcflag_t c_iflag'
+-          A bit mask specifying flags for input modes; see *Note Input
+-          Modes::.
+-
+-    `tcflag_t c_oflag'
+-          A bit mask specifying flags for output modes; see *Note
+-          Output Modes::.
+-
+-    `tcflag_t c_cflag'
+-          A bit mask specifying flags for control modes; see *Note
+-          Control Modes::.
+-
+-    `tcflag_t c_lflag'
+-          A bit mask specifying flags for local modes; see *Note Local
+-          Modes::.
+-
+-    `cc_t c_cc[NCCS]'
+-          An array specifying which characters are associated with
+-          various control functions; see *Note Special Characters::.
+-
+-     The `struct termios' structure also contains members which encode
+-     input and output transmission speeds, but the representation is
+-     not specified.  *Note Line Speed::, for how to examine and store
+-     the speed values.
+-
+-   The following sections describe the details of the members of the
+-`struct termios' structure.
+-
+- - Data Type: tcflag_t
+-     This is an unsigned integer type used to represent the various bit
+-     masks for terminal flags.
+-
+- - Data Type: cc_t
+-     This is an unsigned integer type used to represent characters
+-     associated with various terminal control functions.
+-
+- - Macro: int NCCS
+-     The value of this macro is the number of elements in the `c_cc'
+-     array.
+-
+-
+-File: libc.info,  Node: Mode Functions,  Next: Setting Modes,  Prev: Mode Data Types,  Up: Terminal Modes
+-
+-Terminal Mode Functions
+------------------------
+-
+- - Function: int tcgetattr (int FILEDES, struct termios *TERMIOS-P)
+-     This function is used to examine the attributes of the terminal
+-     device with file descriptor FILEDES.  The attributes are returned
+-     in the structure that TERMIOS-P points to.
+-
+-     If successful, `tcgetattr' returns 0.  A return value of -1
+-     indicates an error.  The following `errno' error conditions are
+-     defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal.
+-
+- - Function: int tcsetattr (int FILEDES, int WHEN, const struct termios
+-          *TERMIOS-P)
+-     This function sets the attributes of the terminal device with file
+-     descriptor FILEDES.  The new attributes are taken from the
+-     structure that TERMIOS-P points to.
+-
+-     The WHEN argument specifies how to deal with input and output
+-     already queued.  It can be one of the following values:
+-
+-    `TCSANOW'
+-          Make the change immediately.
+-
+-    `TCSADRAIN'
+-          Make the change after waiting until all queued output has
+-          been written.  You should usually use this option when
+-          changing parameters that affect output.
+-
+-    `TCSAFLUSH'
+-          This is like `TCSADRAIN', but also discards any queued input.
+-
+-    `TCSASOFT'
+-          This is a flag bit that you can add to any of the above
+-          alternatives.  Its meaning is to inhibit alteration of the
+-          state of the terminal hardware.  It is a BSD extension; it is
+-          only supported on BSD systems and the GNU system.
+-
+-          Using `TCSASOFT' is exactly the same as setting the `CIGNORE'
+-          bit in the `c_cflag' member of the structure TERMIOS-P points
+-          to.  *Note Control Modes::, for a description of `CIGNORE'.
+-
+-     If this function is called from a background process on its
+-     controlling terminal, normally all processes in the process group
+-     are sent a `SIGTTOU' signal, in the same way as if the process
+-     were trying to write to the terminal.  The exception is if the
+-     calling process itself is ignoring or blocking `SIGTTOU' signals,
+-     in which case the operation is performed and no signal is sent.
+-     *Note Job Control::.
+-
+-     If successful, `tcsetattr' returns 0.  A return value of -1
+-     indicates an error.  The following `errno' error conditions are
+-     defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal.
+-
+-    `EINVAL'
+-          Either the value of the `when' argument is not valid, or
+-          there is something wrong with the data in the TERMIOS-P
+-          argument.
+-
+-   Although `tcgetattr' and `tcsetattr' specify the terminal device
+-with a file descriptor, the attributes are those of the terminal device
+-itself and not of the file descriptor.  This means that the effects of
+-changing terminal attributes are persistent; if another process opens
+-the terminal file later on, it will see the changed attributes even
+-though it doesn't have anything to do with the open file descriptor you
+-originally specified in changing the attributes.
+-
+-   Similarly, if a single process has multiple or duplicated file
+-descriptors for the same terminal device, changing the terminal
+-attributes affects input and output to all of these file descriptors.
+-This means, for example, that you can't open one file descriptor or
+-stream to read from a terminal in the normal line-buffered, echoed
+-mode; and simultaneously have another file descriptor for the same
+-terminal that you use to read from it in single-character, non-echoed
+-mode.  Instead, you have to explicitly switch the terminal back and
+-forth between the two modes.
+-
+-
+-File: libc.info,  Node: Setting Modes,  Next: Input Modes,  Prev: Mode Functions,  Up: Terminal Modes
+-
+-Setting Terminal Modes Properly
+--------------------------------
+-
+-   When you set terminal modes, you should call `tcgetattr' first to
+-get the current modes of the particular terminal device, modify only
+-those modes that you are really interested in, and store the result with
+-`tcsetattr'.
+-
+-   It's a bad idea to simply initialize a `struct termios' structure to
+-a chosen set of attributes and pass it directly to `tcsetattr'.  Your
+-program may be run years from now, on systems that support members not
+-documented in this manual.  The way to avoid setting these members to
+-unreasonable values is to avoid changing them.
+-
+-   What's more, different terminal devices may require different mode
+-settings in order to function properly.  So you should avoid blindly
+-copying attributes from one terminal device to another.
+-
+-   When a member contains a collection of independent flags, as the
+-`c_iflag', `c_oflag' and `c_cflag' members do, even setting the entire
+-member is a bad idea, because particular operating systems have their
+-own flags.  Instead, you should start with the current value of the
+-member and alter only the flags whose values matter in your program,
+-leaving any other flags unchanged.
+-
+-   Here is an example of how to set one flag (`ISTRIP') in the `struct
+-termios' structure while properly preserving all the other data in the
+-structure:
+-
+-     int
+-     set_istrip (int desc, int value)
+-     {
+-       struct termios settings;
+-       int result;
+-
+-     result = tcgetattr (desc, &settings);
+-       if (result < 0)
+-         {
+-           perror ("error in tcgetattr");
+-           return 0;
+-         }
+-
+-     settings.c_iflag &= ~ISTRIP;
+-       if (value)
+-         settings.c_iflag |= ISTRIP;
+-
+-     result = tcsetattr (desc, TCSANOW, &settings);
+-       if (result < 0)
+-         {
+-           perror ("error in tcgetattr");
+-           return;
+-        }
+-       return 1;
+-     }
+-
+-
+-File: libc.info,  Node: Input Modes,  Next: Output Modes,  Prev: Setting Modes,  Up: Terminal Modes
+-
+-Input Modes
+------------
+-
+-   This section describes the terminal attribute flags that control
+-fairly low-level aspects of input processing: handling of parity errors,
+-break signals, flow control, and <RET> and <LFD> characters.
+-
+-   All of these flags are bits in the `c_iflag' member of the `struct
+-termios' structure.  The member is an integer, and you change flags
+-using the operators `&', `|' and `^'.  Don't try to specify the entire
+-value for `c_iflag'--instead, change only specific flags and leave the
+-rest untouched (*note Setting Modes::.).
+-
+- - Macro: tcflag_t INPCK
+-     If this bit is set, input parity checking is enabled.  If it is
+-     not set, no checking at all is done for parity errors on input; the
+-     characters are simply passed through to the application.
+-
+-     Parity checking on input processing is independent of whether
+-     parity detection and generation on the underlying terminal
+-     hardware is enabled; see *Note Control Modes::.  For example, you
+-     could clear the `INPCK' input mode flag and set the `PARENB'
+-     control mode flag to ignore parity errors on input, but still
+-     generate parity on output.
+-
+-     If this bit is set, what happens when a parity error is detected
+-     depends on whether the `IGNPAR' or `PARMRK' bits are set.  If
+-     neither of these bits are set, a byte with a parity error is
+-     passed to the application as a `'\0'' character.
+-
+- - Macro: tcflag_t IGNPAR
+-     If this bit is set, any byte with a framing or parity error is
+-     ignored.  This is only useful if `INPCK' is also set.
+-
+- - Macro: tcflag_t PARMRK
+-     If this bit is set, input bytes with parity or framing errors are
+-     marked when passed to the program.  This bit is meaningful only
+-     when `INPCK' is set and `IGNPAR' is not set.
+-
+-     The way erroneous bytes are marked is with two preceding bytes,
+-     `377' and `0'.  Thus, the program actually reads three bytes for
+-     one erroneous byte received from the terminal.
+-
+-     If a valid byte has the value `0377', and `ISTRIP' (see below) is
+-     not set, the program might confuse it with the prefix that marks a
+-     parity error.  So a valid byte `0377' is passed to the program as
+-     two bytes, `0377' `0377', in this case.
+-
+- - Macro: tcflag_t ISTRIP
+-     If this bit is set, valid input bytes are stripped to seven bits;
+-     otherwise, all eight bits are available for programs to read.
+-
+- - Macro: tcflag_t IGNBRK
+-     If this bit is set, break conditions are ignored.
+-
+-     A "break condition" is defined in the context of asynchronous
+-     serial data transmission as a series of zero-value bits longer
+-     than a single byte.
+-
+- - Macro: tcflag_t BRKINT
+-     If this bit is set and `IGNBRK' is not set, a break condition
+-     clears the terminal input and output queues and raises a `SIGINT'
+-     signal for the foreground process group associated with the
+-     terminal.
+-
+-     If neither `BRKINT' nor `IGNBRK' are set, a break condition is
+-     passed to the application as a single `'\0'' character if `PARMRK'
+-     is not set, or otherwise as a three-character sequence `'\377'',
+-     `'\0'', `'\0''.
+-
+- - Macro: tcflag_t IGNCR
+-     If this bit is set, carriage return characters (`'\r'') are
+-     discarded on input.  Discarding carriage return may be useful on
+-     terminals that send both carriage return and linefeed when you
+-     type the <RET> key.
+-
+- - Macro: tcflag_t ICRNL
+-     If this bit is set and `IGNCR' is not set, carriage return
+-     characters (`'\r'') received as input are passed to the
+-     application as newline characters (`'\n'').
+-
+- - Macro: tcflag_t INLCR
+-     If this bit is set, newline characters (`'\n'') received as input
+-     are passed to the application as carriage return characters
+-     (`'\r'').
+-
+- - Macro: tcflag_t IXOFF
+-     If this bit is set, start/stop control on input is enabled.  In
+-     other words, the computer sends STOP and START characters as
+-     necessary to prevent input from coming in faster than programs are
+-     reading it.  The idea is that the actual terminal hardware that is
+-     generating the input data responds to a STOP character by
+-     suspending transmission, and to a START character by resuming
+-     transmission.  *Note Start/Stop Characters::.
+-
+- - Macro: tcflag_t IXON
+-     If this bit is set, start/stop control on output is enabled.  In
+-     other words, if the computer receives a STOP character, it
+-     suspends output until a START character is received.  In this
+-     case, the STOP and START characters are never passed to the
+-     application program.  If this bit is not set, then START and STOP
+-     can be read as ordinary characters.  *Note Start/Stop Characters::.
+-
+- - Macro: tcflag_t IXANY
+-     If this bit is set, any input character restarts output when
+-     output has been suspended with the STOP character.  Otherwise,
+-     only the START character restarts output.
+-
+-     This is a BSD extension; it exists only on BSD systems and the GNU
+-     system.
+-
+- - Macro: tcflag_t IMAXBEL
+-     If this bit is set, then filling up the terminal input buffer
+-     sends a BEL character (code `007') to the terminal to ring the
+-     bell.
+-
+-     This is a BSD extension.
+-
+-
+-File: libc.info,  Node: Output Modes,  Next: Control Modes,  Prev: Input Modes,  Up: Terminal Modes
+-
+-Output Modes
+-------------
+-
+-   This section describes the terminal flags and fields that control how
+-output characters are translated and padded for display.  All of these
+-are contained in the `c_oflag' member of the `struct termios' structure.
+-
+-   The `c_oflag' member itself is an integer, and you change the flags
+-and fields using the operators `&', `|', and `^'.  Don't try to specify
+-the entire value for `c_oflag'--instead, change only specific flags and
+-leave the rest untouched (*note Setting Modes::.).
+-
+- - Macro: tcflag_t OPOST
+-     If this bit is set, output data is processed in some unspecified
+-     way so that it is displayed appropriately on the terminal device.
+-     This typically includes mapping newline characters (`'\n'') onto
+-     carriage return and linefeed pairs.
+-
+-     If this bit isn't set, the characters are transmitted as-is.
+-
+-   The following three bits are BSD features, and they exist only BSD
+-systems and the GNU system.  They are effective only if `OPOST' is set.
+-
+- - Macro: tcflag_t ONLCR
+-     If this bit is set, convert the newline character on output into a
+-     pair of characters, carriage return followed by linefeed.
+-
+- - Macro: tcflag_t OXTABS
+-     If this bit is set, convert tab characters on output into the
+-     appropriate number of spaces to emulate a tab stop every eight
+-     columns.
+-
+- - Macro: tcflag_t ONOEOT
+-     If this bit is set, discard `C-d' characters (code `004') on
+-     output.  These characters cause many dial-up terminals to
+-     disconnect.
+-
+-
+-File: libc.info,  Node: Control Modes,  Next: Local Modes,  Prev: Output Modes,  Up: Terminal Modes
+-
+-Control Modes
+--------------
+-
+-   This section describes the terminal flags and fields that control
+-parameters usually associated with asynchronous serial data
+-transmission.  These flags may not make sense for other kinds of
+-terminal ports (such as a network connection pseudo-terminal).  All of
+-these are contained in the `c_cflag' member of the `struct termios'
+-structure.
+-
+-   The `c_cflag' member itself is an integer, and you change the flags
+-and fields using the operators `&', `|', and `^'.  Don't try to specify
+-the entire value for `c_cflag'--instead, change only specific flags and
+-leave the rest untouched (*note Setting Modes::.).
+-
+- - Macro: tcflag_t CLOCAL
+-     If this bit is set, it indicates that the terminal is connected
+-     "locally" and that the modem status lines (such as carrier detect)
+-     should be ignored.
+-
+-     On many systems if this bit is not set and you call `open' without
+-     the `O_NONBLOCK' flag set, `open' blocks until a modem connection
+-     is established.
+-
+-     If this bit is not set and a modem disconnect is detected, a
+-     `SIGHUP' signal is sent to the controlling process group for the
+-     terminal (if it has one).  Normally, this causes the process to
+-     exit; see *Note Signal Handling::.  Reading from the terminal
+-     after a disconnect causes an end-of-file condition, and writing
+-     causes an `EIO' error to be returned.  The terminal device must be
+-     closed and reopened to clear the condition.
+-
+- - Macro: tcflag_t HUPCL
+-     If this bit is set, a modem disconnect is generated when all
+-     processes that have the terminal device open have either closed
+-     the file or exited.
+-
+- - Macro: tcflag_t CREAD
+-     If this bit is set, input can be read from the terminal.
+-     Otherwise, input is discarded when it arrives.
+-
+- - Macro: tcflag_t CSTOPB
+-     If this bit is set, two stop bits are used.  Otherwise, only one
+-     stop bit is used.
+-
+- - Macro: tcflag_t PARENB
+-     If this bit is set, generation and detection of a parity bit are
+-     enabled.  *Note Input Modes::, for information on how input parity
+-     errors are handled.
+-
+-     If this bit is not set, no parity bit is added to output
+-     characters, and input characters are not checked for correct
+-     parity.
+-
+- - Macro: tcflag_t PARODD
+-     This bit is only useful if `PARENB' is set.  If `PARODD' is set,
+-     odd parity is used, otherwise even parity is used.
+-
+-   The control mode flags also includes a field for the number of bits
+-per character.  You can use the `CSIZE' macro as a mask to extract the
+-value, like this: `settings.c_cflag & CSIZE'.
+-
+- - Macro: tcflag_t CSIZE
+-     This is a mask for the number of bits per character.
+-
+- - Macro: tcflag_t CS5
+-     This specifies five bits per byte.
+-
+- - Macro: tcflag_t CS6
+-     This specifies six bits per byte.
+-
+- - Macro: tcflag_t CS7
+-     This specifies seven bits per byte.
+-
+- - Macro: tcflag_t CS8
+-     This specifies eight bits per byte.
+-
+-   The following four bits are BSD extensions; this exist only on BSD
+-systems and the GNU system.
+-
+- - Macro: tcflag_t CCTS_OFLOW
+-     If this bit is set, enable flow control of output based on the CTS
+-     wire (RS232 protocol).
+-
+- - Macro: tcflag_t CRTS_IFLOW
+-     If this bit is set, enable flow control of input based on the RTS
+-     wire (RS232 protocol).
+-
+- - Macro: tcflag_t MDMBUF
+-     If this bit is set, enable carrier-based flow control of output.
+-
+- - Macro: tcflag_t CIGNORE
+-     If this bit is set, it says to ignore the control modes and line
+-     speed values entirely.  This is only meaningful in a call to
+-     `tcsetattr'.
+-
+-     The `c_cflag' member and the line speed values returned by
+-     `cfgetispeed' and `cfgetospeed' will be unaffected by the call.
+-     `CIGNORE' is useful if you want to set all the software modes in
+-     the other members, but leave the hardware details in `c_cflag'
+-     unchanged.  (This is how the `TCSASOFT' flag to `tcsettattr'
+-     works.)
+-
+-     This bit is never set in the structure filled in by `tcgetattr'.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-26 glibc-2.1.3/manual/libc.info-26
+--- ../glibc-2.1.3/manual/libc.info-26	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-26	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1201 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Local Modes,  Next: Line Speed,  Prev: Control Modes,  Up: Terminal Modes
+-
+-Local Modes
+------------
+-
+-   This section describes the flags for the `c_lflag' member of the
+-`struct termios' structure.  These flags generally control higher-level
+-aspects of input processing than the input modes flags described in
+-*Note Input Modes::, such as echoing, signals, and the choice of
+-canonical or noncanonical input.
+-
+-   The `c_lflag' member itself is an integer, and you change the flags
+-and fields using the operators `&', `|', and `^'.  Don't try to specify
+-the entire value for `c_lflag'--instead, change only specific flags and
+-leave the rest untouched (*note Setting Modes::.).
+-
+- - Macro: tcflag_t ICANON
+-     This bit, if set, enables canonical input processing mode.
+-     Otherwise, input is processed in noncanonical mode.  *Note
+-     Canonical or Not::.
+-
+- - Macro: tcflag_t ECHO
+-     If this bit is set, echoing of input characters back to the
+-     terminal is enabled.
+-
+- - Macro: tcflag_t ECHOE
+-     If this bit is set, echoing indicates erasure of input with the
+-     ERASE character by erasing the last character in the current line
+-     from the screen.  Otherwise, the character erased is re-echoed to
+-     show what has happened (suitable for a printing terminal).
+-
+-     This bit only controls the display behavior; the `ICANON' bit by
+-     itself controls actual recognition of the ERASE character and
+-     erasure of input, without which `ECHOE' is simply irrelevant.
+-
+- - Macro: tcflag_t ECHOPRT
+-     This bit is like `ECHOE', enables display of the ERASE character in
+-     a way that is geared to a hardcopy terminal.  When you type the
+-     ERASE character, a `\' character is printed followed by the first
+-     character erased.  Typing the ERASE character again just prints
+-     the next character erased.  Then, the next time you type a normal
+-     character, a `/' character is printed before the character echoes.
+-
+-     This is a BSD extension, and exists only in BSD systems and the
+-     GNU system.
+-
+- - Macro: tcflag_t ECHOK
+-     This bit enables special display of the KILL character by moving
+-     to a new line after echoing the KILL character normally.  The
+-     behavior of `ECHOKE' (below) is nicer to look at.
+-
+-     If this bit is not set, the KILL character echoes just as it would
+-     if it were not the KILL character.  Then it is up to the user to
+-     remember that the KILL character has erased the preceding input;
+-     there is no indication of this on the screen.
+-
+-     This bit only controls the display behavior; the `ICANON' bit by
+-     itself controls actual recognition of the KILL character and
+-     erasure of input, without which `ECHOK' is simply irrelevant.
+-
+- - Macro: tcflag_t ECHOKE
+-     This bit is similar to `ECHOK'.  It enables special display of the
+-     KILL character by erasing on the screen the entire line that has
+-     been killed.  This is a BSD extension, and exists only in BSD
+-     systems and the GNU system.
+-
+- - Macro: tcflag_t ECHONL
+-     If this bit is set and the `ICANON' bit is also set, then the
+-     newline (`'\n'') character is echoed even if the `ECHO' bit is not
+-     set.
+-
+- - Macro: tcflag_t ECHOCTL
+-     If this bit is set and the `ECHO' bit is also set, echo control
+-     characters with `^' followed by the corresponding text character.
+-     Thus, control-A echoes as `^A'.  This is usually the preferred mode
+-     for interactive input, because echoing a control character back to
+-     the terminal could have some undesired effect on the terminal.
+-
+-     This is a BSD extension, and exists only in BSD systems and the
+-     GNU system.
+-
+- - Macro: tcflag_t ISIG
+-     This bit controls whether the INTR, QUIT, and SUSP characters are
+-     recognized.  The functions associated with these characters are
+-     performed if and only if this bit is set.  Being in canonical or
+-     noncanonical input mode has no affect on the interpretation of
+-     these characters.
+-
+-     You should use caution when disabling recognition of these
+-     characters.  Programs that cannot be interrupted interactively are
+-     very user-unfriendly.  If you clear this bit, your program should
+-     provide some alternate interface that allows the user to
+-     interactively send the signals associated with these characters,
+-     or to escape from the program.
+-
+-     *Note Signal Characters::.
+-
+- - Macro: tcflag_t IEXTEN
+-     POSIX.1 gives `IEXTEN' implementation-defined meaning, so you
+-     cannot rely on this interpretation on all systems.
+-
+-     On BSD systems and the GNU system, it enables the LNEXT and
+-     DISCARD characters.  *Note Other Special::.
+-
+- - Macro: tcflag_t NOFLSH
+-     Normally, the INTR, QUIT, and SUSP characters cause input and
+-     output queues for the terminal to be cleared.  If this bit is set,
+-     the queues are not cleared.
+-
+- - Macro: tcflag_t TOSTOP
+-     If this bit is set and the system supports job control, then
+-     `SIGTTOU' signals are generated by background processes that
+-     attempt to write to the terminal.  *Note Access to the Terminal::.
+-
+-   The following bits are BSD extensions; they exist only in BSD systems
+-and the GNU system.
+-
+- - Macro: tcflag_t ALTWERASE
+-     This bit determines how far the WERASE character should erase.  The
+-     WERASE character erases back to the beginning of a word; the
+-     question is, where do words begin?
+-
+-     If this bit is clear, then the beginning of a word is a
+-     nonwhitespace character following a whitespace character.  If the
+-     bit is set, then the beginning of a word is an alphanumeric
+-     character or underscore following a character which is none of
+-     those.
+-
+-     *Note Editing Characters::, for more information about the WERASE
+-     character.
+-
+- - Macro: tcflag_t FLUSHO
+-     This is the bit that toggles when the user types the DISCARD
+-     character.  While this bit is set, all output is discarded.  *Note
+-     Other Special::.
+-
+- - Macro: tcflag_t NOKERNINFO
+-     Setting this bit disables handling of the STATUS character.  *Note
+-     Other Special::.
+-
+- - Macro: tcflag_t PENDIN
+-     If this bit is set, it indicates that there is a line of input that
+-     needs to be reprinted.  Typing the REPRINT character sets this
+-     bit; the bit remains set until reprinting is finished.  *Note
+-     Editing Characters::.
+-
+-
+-File: libc.info,  Node: Line Speed,  Next: Special Characters,  Prev: Local Modes,  Up: Terminal Modes
+-
+-Line Speed
+-----------
+-
+-   The terminal line speed tells the computer how fast to read and write
+-data on the terminal.
+-
+-   If the terminal is connected to a real serial line, the terminal
+-speed you specify actually controls the line--if it doesn't match the
+-terminal's own idea of the speed, communication does not work.  Real
+-serial ports accept only certain standard speeds.  Also, particular
+-hardware may not support even all the standard speeds.  Specifying a
+-speed of zero hangs up a dialup connection and turns off modem control
+-signals.
+-
+-   If the terminal is not a real serial line (for example, if it is a
+-network connection), then the line speed won't really affect data
+-transmission speed, but some programs will use it to determine the
+-amount of padding needed.  It's best to specify a line speed value that
+-matches the actual speed of the actual terminal, but you can safely
+-experiment with different values to vary the amount of padding.
+-
+-   There are actually two line speeds for each terminal, one for input
+-and one for output.  You can set them independently, but most often
+-terminals use the same speed for both directions.
+-
+-   The speed values are stored in the `struct termios' structure, but
+-don't try to access them in the `struct termios' structure directly.
+-Instead, you should use the following functions to read and store them:
+-
+- - Function: speed_t cfgetospeed (const struct termios *TERMIOS-P)
+-     This function returns the output line speed stored in the structure
+-     `*TERMIOS-P'.
+-
+- - Function: speed_t cfgetispeed (const struct termios *TERMIOS-P)
+-     This function returns the input line speed stored in the structure
+-     `*TERMIOS-P'.
+-
+- - Function: int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)
+-     This function stores SPEED in `*TERMIOS-P' as the output speed.
+-     The normal return value is 0; a value of -1 indicates an error.
+-     If SPEED is not a speed, `cfsetospeed' returns -1.
+-
+- - Function: int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)
+-     This function stores SPEED in `*TERMIOS-P' as the input speed.
+-     The normal return value is 0; a value of -1 indicates an error.
+-     If SPEED is not a speed, `cfsetospeed' returns -1.
+-
+- - Function: int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)
+-     This function stores SPEED in `*TERMIOS-P' as both the input and
+-     output speeds.  The normal return value is 0; a value of -1
+-     indicates an error.  If SPEED is not a speed, `cfsetspeed' returns
+-     -1.  This function is an extension in 4.4 BSD.
+-
+- - Data Type: speed_t
+-     The `speed_t' type is an unsigned integer data type used to
+-     represent line speeds.
+-
+-   The functions `cfsetospeed' and `cfsetispeed' report errors only for
+-speed values that the system simply cannot handle.  If you specify a
+-speed value that is basically acceptable, then those functions will
+-succeed.  But they do not check that a particular hardware device can
+-actually support the specified speeds--in fact, they don't know which
+-device you plan to set the speed for.  If you use `tcsetattr' to set
+-the speed of a particular device to a value that it cannot handle,
+-`tcsetattr' returns -1.
+-
+-   *Portability note:* In the GNU library, the functions above accept
+-speeds measured in bits per second as input, and return speed values
+-measured in bits per second.  Other libraries require speeds to be
+-indicated by special codes.  For POSIX.1 portability, you must use one
+-of the following symbols to represent the speed; their precise numeric
+-values are system-dependent, but each name has a fixed meaning: `B110'
+-stands for 110 bps, `B300' for 300 bps, and so on.  There is no
+-portable way to represent any speed but these, but these are the only
+-speeds that typical serial lines can support.
+-
+-     B0  B50  B75  B110  B134  B150  B200
+-     B300  B600  B1200  B1800  B2400  B4800
+-     B9600  B19200  B38400  B57600  B115200
+-     B230400  B460800
+-
+-   BSD defines two additional speed symbols as aliases: `EXTA' is an
+-alias for `B19200' and `EXTB' is an alias for `B38400'.  These aliases
+-are obsolete.
+-
+-
+-File: libc.info,  Node: Special Characters,  Next: Noncanonical Input,  Prev: Line Speed,  Up: Terminal Modes
+-
+-Special Characters
+-------------------
+-
+-   In canonical input, the terminal driver recognizes a number of
+-special characters which perform various control functions.  These
+-include the ERASE character (usually <DEL>) for editing input, and
+-other editing characters.  The INTR character (normally `C-c') for
+-sending a `SIGINT' signal, and other signal-raising characters, may be
+-available in either canonical or noncanonical input mode.  All these
+-characters are described in this section.
+-
+-   The particular characters used are specified in the `c_cc' member of
+-the `struct termios' structure.  This member is an array; each element
+-specifies the character for a particular role.  Each element has a
+-symbolic constant that stands for the index of that element--for
+-example, `VINTR' is the index of the element that specifies the INTR
+-character, so storing `'='' in `TERMIOS.c_cc[VINTR]' specifies `=' as
+-the INTR character.
+-
+-   On some systems, you can disable a particular special character
+-function by specifying the value `_POSIX_VDISABLE' for that role.  This
+-value is unequal to any possible character code.  *Note Options for
+-Files::, for more information about how to tell whether the operating
+-system you are using supports `_POSIX_VDISABLE'.
+-
+-* Menu:
+-
+-* Editing Characters::          Special characters that terminate lines and
+-                                  delete text, and other editing functions.
+-* Signal Characters::           Special characters that send or raise signals
+-                                  to or for certain classes of processes.
+-* Start/Stop Characters::       Special characters that suspend or resume
+-                                  suspended output.
+-* Other Special::		Other special characters for BSD systems:
+-				  they can discard output, and print status.
+-
+-
+-File: libc.info,  Node: Editing Characters,  Next: Signal Characters,  Up: Special Characters
+-
+-Characters for Input Editing
+-............................
+-
+-   These special characters are active only in canonical input mode.
+-*Note Canonical or Not::.
+-
+- - Macro: int VEOF
+-     This is the subscript for the EOF character in the special control
+-     character array.  `TERMIOS.c_cc[VEOF]' holds the character itself.
+-
+-     The EOF character is recognized only in canonical input mode.  It
+-     acts as a line terminator in the same way as a newline character,
+-     but if the EOF character is typed at the beginning of a line it
+-     causes `read' to return a byte count of zero, indicating
+-     end-of-file.  The EOF character itself is discarded.
+-
+-     Usually, the EOF character is `C-d'.
+-
+- - Macro: int VEOL
+-     This is the subscript for the EOL character in the special control
+-     character array.  `TERMIOS.c_cc[VEOL]' holds the character itself.
+-
+-     The EOL character is recognized only in canonical input mode.  It
+-     acts as a line terminator, just like a newline character.  The EOL
+-     character is not discarded; it is read as the last character in
+-     the input line.
+-
+-     You don't need to use the EOL character to make <RET> end a line.
+-     Just set the ICRNL flag.  In fact, this is the default state of
+-     affairs.
+-
+- - Macro: int VEOL2
+-     This is the subscript for the EOL2 character in the special control
+-     character array.  `TERMIOS.c_cc[VEOL2]' holds the character itself.
+-
+-     The EOL2 character works just like the EOL character (see above),
+-     but it can be a different character.  Thus, you can specify two
+-     characters to terminate an input line, by setting EOL to one of
+-     them and EOL2 to the other.
+-
+-     The EOL2 character is a BSD extension; it exists only on BSD
+-     systems and the GNU system.
+-
+- - Macro: int VERASE
+-     This is the subscript for the ERASE character in the special
+-     control character array.  `TERMIOS.c_cc[VERASE]' holds the
+-     character itself.
+-
+-     The ERASE character is recognized only in canonical input mode.
+-     When the user types the erase character, the previous character
+-     typed is discarded.  (If the terminal generates multibyte
+-     character sequences, this may cause more than one byte of input to
+-     be discarded.)  This cannot be used to erase past the beginning of
+-     the current line of text.  The ERASE character itself is discarded.
+-
+-     Usually, the ERASE character is <DEL>.
+-
+- - Macro: int VWERASE
+-     This is the subscript for the WERASE character in the special
+-     control character array.  `TERMIOS.c_cc[VWERASE]' holds the
+-     character itself.
+-
+-     The WERASE character is recognized only in canonical mode.  It
+-     erases an entire word of prior input, and any whitespace after it;
+-     whitespace characters before the word are not erased.
+-
+-     The definition of a "word" depends on the setting of the
+-     `ALTWERASE' mode; *note Local Modes::..
+-
+-     If the `ALTWERASE' mode is not set, a word is defined as a sequence
+-     of any characters except space or tab.
+-
+-     If the `ALTWERASE' mode is set, a word is defined as a sequence of
+-     characters containing only letters, numbers, and underscores,
+-     optionally followed by one character that is not a letter, number,
+-     or underscore.
+-
+-     The WERASE character is usually `C-w'.
+-
+-     This is a BSD extension.
+-
+- - Macro: int VKILL
+-     This is the subscript for the KILL character in the special control
+-     character array.  `TERMIOS.c_cc[VKILL]' holds the character itself.
+-
+-     The KILL character is recognized only in canonical input mode.
+-     When the user types the kill character, the entire contents of the
+-     current line of input are discarded.  The kill character itself is
+-     discarded too.
+-
+-     The KILL character is usually `C-u'.
+-
+- - Macro: int VREPRINT
+-     This is the subscript for the REPRINT character in the special
+-     control character array.  `TERMIOS.c_cc[VREPRINT]' holds the
+-     character itself.
+-
+-     The REPRINT character is recognized only in canonical mode.  It
+-     reprints the current input line.  If some asynchronous output has
+-     come while you are typing, this lets you see the line you are
+-     typing clearly again.
+-
+-     The REPRINT character is usually `C-r'.
+-
+-     This is a BSD extension.
+-
+-
+-File: libc.info,  Node: Signal Characters,  Next: Start/Stop Characters,  Prev: Editing Characters,  Up: Special Characters
+-
+-Characters that Cause Signals
+-.............................
+-
+-   These special characters may be active in either canonical or
+-noncanonical input mode, but only when the `ISIG' flag is set (*note
+-Local Modes::.).
+-
+- - Macro: int VINTR
+-     This is the subscript for the INTR character in the special control
+-     character array.  `TERMIOS.c_cc[VINTR]' holds the character itself.
+-
+-     The INTR (interrupt) character raises a `SIGINT' signal for all
+-     processes in the foreground job associated with the terminal.  The
+-     INTR character itself is then discarded.  *Note Signal Handling::,
+-     for more information about signals.
+-
+-     Typically, the INTR character is `C-c'.
+-
+- - Macro: int VQUIT
+-     This is the subscript for the QUIT character in the special control
+-     character array.  `TERMIOS.c_cc[VQUIT]' holds the character itself.
+-
+-     The QUIT character raises a `SIGQUIT' signal for all processes in
+-     the foreground job associated with the terminal.  The QUIT
+-     character itself is then discarded.  *Note Signal Handling::, for
+-     more information about signals.
+-
+-     Typically, the QUIT character is `C-\'.
+-
+- - Macro: int VSUSP
+-     This is the subscript for the SUSP character in the special control
+-     character array.  `TERMIOS.c_cc[VSUSP]' holds the character itself.
+-
+-     The SUSP (suspend) character is recognized only if the
+-     implementation supports job control (*note Job Control::.).  It
+-     causes a `SIGTSTP' signal to be sent to all processes in the
+-     foreground job associated with the terminal.  The SUSP character
+-     itself is then discarded.  *Note Signal Handling::, for more
+-     information about signals.
+-
+-     Typically, the SUSP character is `C-z'.
+-
+-   Few applications disable the normal interpretation of the SUSP
+-character.  If your program does this, it should provide some other
+-mechanism for the user to stop the job.  When the user invokes this
+-mechanism, the program should send a `SIGTSTP' signal to the process
+-group of the process, not just to the process itself.  *Note Signaling
+-Another Process::.
+-
+- - Macro: int VDSUSP
+-     This is the subscript for the DSUSP character in the special
+-     control character array.  `TERMIOS.c_cc[VDSUSP]' holds the
+-     character itself.
+-
+-     The DSUSP (suspend) character is recognized only if the
+-     implementation supports job control (*note Job Control::.).  It
+-     sends a `SIGTSTP' signal, like the SUSP character, but not right
+-     away--only when the program tries to read it as input.  Not all
+-     systems with job control support DSUSP; only BSD-compatible
+-     systems (including the GNU system).
+-
+-     *Note Signal Handling::, for more information about signals.
+-
+-     Typically, the DSUSP character is `C-y'.
+-
+-
+-File: libc.info,  Node: Start/Stop Characters,  Next: Other Special,  Prev: Signal Characters,  Up: Special Characters
+-
+-Special Characters for Flow Control
+-...................................
+-
+-   These special characters may be active in either canonical or
+-noncanonical input mode, but their use is controlled by the flags
+-`IXON' and `IXOFF' (*note Input Modes::.).
+-
+- - Macro: int VSTART
+-     This is the subscript for the START character in the special
+-     control character array.  `TERMIOS.c_cc[VSTART]' holds the
+-     character itself.
+-
+-     The START character is used to support the `IXON' and `IXOFF'
+-     input modes.  If `IXON' is set, receiving a START character resumes
+-     suspended output; the START character itself is discarded.  If
+-     `IXANY' is set, receiving any character at all resumes suspended
+-     output; the resuming character is not discarded unless it is the
+-     START character.  `IXOFF' is set, the system may also transmit
+-     START characters to the terminal.
+-
+-     The usual value for the START character is `C-q'.  You may not be
+-     able to change this value--the hardware may insist on using `C-q'
+-     regardless of what you specify.
+-
+- - Macro: int VSTOP
+-     This is the subscript for the STOP character in the special control
+-     character array.  `TERMIOS.c_cc[VSTOP]' holds the character itself.
+-
+-     The STOP character is used to support the `IXON' and `IXOFF' input
+-     modes.  If `IXON' is set, receiving a STOP character causes output
+-     to be suspended; the STOP character itself is discarded.  If
+-     `IXOFF' is set, the system may also transmit STOP characters to the
+-     terminal, to prevent the input queue from overflowing.
+-
+-     The usual value for the STOP character is `C-s'.  You may not be
+-     able to change this value--the hardware may insist on using `C-s'
+-     regardless of what you specify.
+-
+-
+-File: libc.info,  Node: Other Special,  Prev: Start/Stop Characters,  Up: Special Characters
+-
+-Other Special Characters
+-........................
+-
+-   These special characters exist only in BSD systems and the GNU
+-system.
+-
+- - Macro: int VLNEXT
+-     This is the subscript for the LNEXT character in the special
+-     control character array.  `TERMIOS.c_cc[VLNEXT]' holds the
+-     character itself.
+-
+-     The LNEXT character is recognized only when `IEXTEN' is set, but in
+-     both canonical and noncanonical mode.  It disables any special
+-     significance of the next character the user types.  Even if the
+-     character would normally perform some editing function or generate
+-     a signal, it is read as a plain character.  This is the analogue
+-     of the `C-q' command in Emacs.  "LNEXT" stands for "literal next."
+-
+-     The LNEXT character is usually `C-v'.
+-
+- - Macro: int VDISCARD
+-     This is the subscript for the DISCARD character in the special
+-     control character array.  `TERMIOS.c_cc[VDISCARD]' holds the
+-     character itself.
+-
+-     The DISCARD character is recognized only when `IEXTEN' is set, but
+-     in both canonical and noncanonical mode.  Its effect is to toggle
+-     the discard-output flag.  When this flag is set, all program
+-     output is discarded.  Setting the flag also discards all output
+-     currently in the output buffer.  Typing any other character resets
+-     the flag.
+-
+- - Macro: int VSTATUS
+-     This is the subscript for the STATUS character in the special
+-     control character array.  `TERMIOS.c_cc[VSTATUS]' holds the
+-     character itself.
+-
+-     The STATUS character's effect is to print out a status message
+-     about how the current process is running.
+-
+-     The STATUS character is recognized only in canonical mode, and
+-     only if `NOKERNINFO' is not set.
+-
+-
+-File: libc.info,  Node: Noncanonical Input,  Prev: Special Characters,  Up: Terminal Modes
+-
+-Noncanonical Input
+-------------------
+-
+-   In noncanonical input mode, the special editing characters such as
+-ERASE and KILL are ignored.  The system facilities for the user to edit
+-input are disabled in noncanonical mode, so that all input characters
+-(unless they are special for signal or flow-control purposes) are passed
+-to the application program exactly as typed.  It is up to the
+-application program to give the user ways to edit the input, if
+-appropriate.
+-
+-   Noncanonical mode offers special parameters called MIN and TIME for
+-controlling whether and how long to wait for input to be available.  You
+-can even use them to avoid ever waiting--to return immediately with
+-whatever input is available, or with no input.
+-
+-   The MIN and TIME are stored in elements of the `c_cc' array, which
+-is a member of the `struct termios' structure.  Each element of this
+-array has a particular role, and each element has a symbolic constant
+-that stands for the index of that element.  `VMIN' and `VMAX' are the
+-names for the indices in the array of the MIN and TIME slots.
+-
+- - Macro: int VMIN
+-     This is the subscript for the MIN slot in the `c_cc' array.  Thus,
+-     `TERMIOS.c_cc[VMIN]' is the value itself.
+-
+-     The MIN slot is only meaningful in noncanonical input mode; it
+-     specifies the minimum number of bytes that must be available in the
+-     input queue in order for `read' to return.
+-
+- - Macro: int VTIME
+-     This is the subscript for the TIME slot in the `c_cc' array.  Thus,
+-     `TERMIOS.c_cc[VTIME]' is the value itself.
+-
+-     The TIME slot is only meaningful in noncanonical input mode; it
+-     specifies how long to wait for input before returning, in units of
+-     0.1 seconds.
+-
+-   The MIN and TIME values interact to determine the criterion for when
+-`read' should return; their precise meanings depend on which of them
+-are nonzero.  There are four possible cases:
+-
+-   * Both TIME and MIN are nonzero.
+-
+-     In this case, TIME specifies how long to wait after each input
+-     character to see if more input arrives.  After the first character
+-     received, `read' keeps waiting until either MIN bytes have arrived
+-     in all, or TIME elapses with no further input.
+-
+-     `read' always blocks until the first character arrives, even if
+-     TIME elapses first.  `read' can return more than MIN characters if
+-     more than MIN happen to be in the queue.
+-
+-   * Both MIN and TIME are zero.
+-
+-     In this case, `read' always returns immediately with as many
+-     characters as are available in the queue, up to the number
+-     requested.  If no input is immediately available, `read' returns a
+-     value of zero.
+-
+-   * MIN is zero but TIME has a nonzero value.
+-
+-     In this case, `read' waits for time TIME for input to become
+-     available; the availability of a single byte is enough to satisfy
+-     the read request and cause `read' to return.  When it returns, it
+-     returns as many characters as are available, up to the number
+-     requested.  If no input is available before the timer expires,
+-     `read' returns a value of zero.
+-
+-   * TIME is zero but MIN has a nonzero value.
+-
+-     In this case, `read' waits until at least MIN bytes are available
+-     in the queue.  At that time, `read' returns as many characters as
+-     are available, up to the number requested.  `read' can return more
+-     than MIN characters if more than MIN happen to be in the queue.
+-
+-   What happens if MIN is 50 and you ask to read just 10 bytes?
+-Normally, `read' waits until there are 50 bytes in the buffer (or, more
+-generally, the wait condition described above is satisfied), and then
+-reads 10 of them, leaving the other 40 buffered in the operating system
+-for a subsequent call to `read'.
+-
+-   *Portability note:* On some systems, the MIN and TIME slots are
+-actually the same as the EOF and EOL slots.  This causes no serious
+-problem because the MIN and TIME slots are used only in noncanonical
+-input and the EOF and EOL slots are used only in canonical input, but it
+-isn't very clean.  The GNU library allocates separate slots for these
+-uses.
+-
+- - Function: int cfmakeraw (struct termios *TERMIOS-P)
+-     This function provides an easy way to set up `*TERMIOS-P' for what
+-     has traditionally been called "raw mode" in BSD.  This uses
+-     noncanonical input, and turns off most processing to give an
+-     unmodified channel to the terminal.
+-
+-     It does exactly this:
+-            TERMIOS-P->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+-                                          |INLCR|IGNCR|ICRNL|IXON);
+-            TERMIOS-P->c_oflag &= ~OPOST;
+-            TERMIOS-P->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+-            TERMIOS-P->c_cflag &= ~(CSIZE|PARENB);
+-            TERMIOS-P->c_cflag |= CS8;
+-
+-
+-File: libc.info,  Node: Line Control,  Next: Noncanon Example,  Prev: Terminal Modes,  Up: Low-Level Terminal Interface
+-
+-Line Control Functions
+-======================
+-
+-   These functions perform miscellaneous control actions on terminal
+-devices.  As regards terminal access, they are treated like doing
+-output: if any of these functions is used by a background process on its
+-controlling terminal, normally all processes in the process group are
+-sent a `SIGTTOU' signal.  The exception is if the calling process
+-itself is ignoring or blocking `SIGTTOU' signals, in which case the
+-operation is performed and no signal is sent.  *Note Job Control::.
+-
+- - Function: int tcsendbreak (int FILEDES, int DURATION)
+-     This function generates a break condition by transmitting a stream
+-     of zero bits on the terminal associated with the file descriptor
+-     FILEDES.  The duration of the break is controlled by the DURATION
+-     argument.  If zero, the duration is between 0.25 and 0.5 seconds.
+-     The meaning of a nonzero value depends on the operating system.
+-
+-     This function does nothing if the terminal is not an asynchronous
+-     serial data port.
+-
+-     The return value is normally zero.  In the event of an error, a
+-     value of -1 is returned.  The following `errno' error conditions
+-     are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal device.
+-
+- - Function: int tcdrain (int FILEDES)
+-     The `tcdrain' function waits until all queued output to the
+-     terminal FILEDES has been transmitted.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `tcdrain' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `tcdrain' should be protected using cancelation handlers.
+-
+-     The return value is normally zero.  In the event of an error, a
+-     value of -1 is returned.  The following `errno' error conditions
+-     are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal device.
+-
+-    `EINTR'
+-          The operation was interrupted by delivery of a signal.  *Note
+-          Interrupted Primitives::.
+-
+- - Function: int tcflush (int FILEDES, int QUEUE)
+-     The `tcflush' function is used to clear the input and/or output
+-     queues associated with the terminal file FILEDES.  The QUEUE
+-     argument specifies which queue(s) to clear, and can be one of the
+-     following values:
+-
+-    `TCIFLUSH'
+-          Clear any input data received, but not yet read.
+-
+-    `TCOFLUSH'
+-          Clear any output data written, but not yet transmitted.
+-
+-    `TCIOFLUSH'
+-          Clear both queued input and output.
+-
+-     The return value is normally zero.  In the event of an error, a
+-     value of -1 is returned.  The following `errno' error conditions
+-     are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal device.
+-
+-    `EINVAL'
+-          A bad value was supplied as the QUEUE argument.
+-
+-     It is unfortunate that this function is named `tcflush', because
+-     the term "flush" is normally used for quite another
+-     operation--waiting until all output is transmitted--and using it
+-     for discarding input or output would be confusing.  Unfortunately,
+-     the name `tcflush' comes from POSIX and we cannot change it.
+-
+- - Function: int tcflow (int FILEDES, int ACTION)
+-     The `tcflow' function is used to perform operations relating to
+-     XON/XOFF flow control on the terminal file specified by FILEDES.
+-
+-     The ACTION argument specifies what operation to perform, and can
+-     be one of the following values:
+-
+-    `TCOOFF'
+-          Suspend transmission of output.
+-
+-    `TCOON'
+-          Restart transmission of output.
+-
+-    `TCIOFF'
+-          Transmit a STOP character.
+-
+-    `TCION'
+-          Transmit a START character.
+-
+-     For more information about the STOP and START characters, see
+-     *Note Special Characters::.
+-
+-     The return value is normally zero.  In the event of an error, a
+-     value of -1 is returned.  The following `errno' error conditions
+-     are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The FILEDES is not associated with a terminal device.
+-
+-    `EINVAL'
+-          A bad value was supplied as the ACTION argument.
+-
+-
+-File: libc.info,  Node: Noncanon Example,  Next: Pseudo-Terminals,  Prev: Line Control,  Up: Low-Level Terminal Interface
+-
+-Noncanonical Mode Example
+-=========================
+-
+-   Here is an example program that shows how you can set up a terminal
+-device to read single characters in noncanonical input mode, without
+-echo.
+-
+-     #include <unistd.h>
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <termios.h>
+-     
+-     /* Use this variable to remember original terminal attributes. */
+-     
+-     struct termios saved_attributes;
+-     
+-     void
+-     reset_input_mode (void)
+-     {
+-       tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
+-     }
+-     
+-     void
+-     set_input_mode (void)
+-     {
+-       struct termios tattr;
+-       char *name;
+-     
+-       /* Make sure stdin is a terminal. */
+-       if (!isatty (STDIN_FILENO))
+-         {
+-           fprintf (stderr, "Not a terminal.\n");
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Save the terminal attributes so we can restore them later. */
+-       tcgetattr (STDIN_FILENO, &saved_attributes);
+-       atexit (reset_input_mode);
+-     /* Set the funny terminal modes. */
+-       tcgetattr (STDIN_FILENO, &tattr);
+-       tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
+-       tattr.c_cc[VMIN] = 1;
+-       tattr.c_cc[VTIME] = 0;
+-       tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       char c;
+-     
+-       set_input_mode ();
+-     
+-       while (1)
+-         {
+-           read (STDIN_FILENO, &c, 1);
+-           if (c == '\004')          /* `C-d' */
+-             break;
+-           else
+-             putchar (c);
+-         }
+-     
+-       return EXIT_SUCCESS;
+-     }
+-
+-   This program is careful to restore the original terminal modes before
+-exiting or terminating with a signal.  It uses the `atexit' function
+-(*note Cleanups on Exit::.) to make sure this is done by `exit'.
+-
+-   The shell is supposed to take care of resetting the terminal modes
+-when a process is stopped or continued; see *Note Job Control::.  But
+-some existing shells do not actually do this, so you may wish to
+-establish handlers for job control signals that reset terminal modes.
+-The above example does so.
+-
+-
+-File: libc.info,  Node: Pseudo-Terminals,  Prev: Noncanon Example,  Up: Low-Level Terminal Interface
+-
+-Pseudo-Terminals
+-================
+-
+-   A "pseudo-terminal" is a special interprocess communication channel
+-that acts like a terminal.  One end of the channel is called the
+-"master" side or "master pseudo-terminal device", the other side is
+-called the "slave" side.  Data written to the master side is received
+-by the slave side as if it was the result of a user typing at an
+-ordinary terminal, and data written to the slave side is sent to the
+-master side as if it was written on an ordinary terminal.
+-
+-   Pseudo terminals are the way programs like `xterm' and `emacs'
+-implement their terminal emulation functionality.
+-
+-* Menu:
+-
+-* Allocation::             Allocating a pseudo terminal.
+-* Pseudo-Terminal Pairs::  How to open both sides of a
+-                            pseudo-terminal in a single operation.
+-
+-
+-File: libc.info,  Node: Allocation,  Next: Pseudo-Terminal Pairs,  Up: Pseudo-Terminals
+-
+-Allocating Pseudo-Terminals
+----------------------------
+-
+-   This subsection describes functions for allocating a pseudo-terminal,
+-and for making this pseudo-terminal available for actual use.  These
+-functions are declared in the header file `stdlib.h'.
+-
+- - Function: int getpt (void)
+-     The `getpt' function returns a new file descriptor for the next
+-     available master pseudo-terminal.  The normal return value from
+-     `getpt' is a non-negative integer file descriptor.  In the case of
+-     an error, a value of -1 is returned instead.  The following
+-     `errno' conditions are defined for this function:
+-
+-    `ENOENT'
+-          There are no free master pseudo-terminals available.
+-
+-     This function is a GNU extension.
+-
+- - Function: int grantpt (int FILEDES)
+-     The `grantpt' function changes the ownership and access permission
+-     of the slave pseudo-terminal device corresponding to the master
+-     pseudo-terminal device associated with the file descriptor
+-     FILEDES.  The owner is set from the real user ID of the calling
+-     process (*note Process Persona::.), and the group is set to a
+-     special group (typically "tty") or from the real group ID of the
+-     calling process.  The access permission is set such that the file
+-     is both readable and writable by the owner and only writable by
+-     the group.
+-
+-     On some systems this function is implemented by invoking a special
+-     `setuid' root program (*note How Change Persona::.).  As a
+-     consequence, installing a signal handler for the `SIGCHLD' signal
+-     (*note Job Control Signals::.) may interfere with a call to
+-     `grantpt'.
+-
+-     The normal return value from `grantpt' is 0; a value of -1 is
+-     returned in case of failure.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENINVAL'
+-          The FILEDES argument is not associated with a master
+-          pseudo-terminal device.
+-
+-    `EACCESS'
+-          The slave pseudo-terminal device corresponding to the master
+-          associated with FILEDES could not be accessed.
+-
+-
+- - Function: int unlockpt (int FILEDES)
+-     The `unlockpt' function unlocks the slave pseudo-terminal device
+-     corresponding to the master pseudo-terminal device associated with
+-     the file descriptor FILEDES.  On many systems, the slave can only
+-     be opened after unlocking, so portable applications should always
+-     call `unlockpt' before trying to open the slave.
+-
+-     The normal return value from `unlockpt' is 0; a value of -1 is
+-     returned in case of failure.  The following `errno' error
+-     conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The FILEDES argument is not associated with a master
+-          pseudo-terminal device.
+-
+- - Function: char * ptsname (int FILEDES)
+-     If the file descriptor FILEDES is associated with a master
+-     pseudo-terminal device, the `ptsname' function returns a pointer
+-     to a statically-allocated, null-terminated string containing the
+-     file name of the associated slave pseudo-terminal file.  This
+-     string might be overwritten by subsequent calls to `ptsname'.
+-
+- - Function: int ptsname_r (int FILEDES, char *BUF, size_t LEN)
+-     The `ptsname_r' function is similar to the `ptsname' function
+-     except that it places its result into the user-specified buffer
+-     starting at BUF with length LEN.
+-
+-     This function is a GNU extension.
+-
+-   *Portability Note:* On System V derived systems, the file returned
+-by the `ptsname' and `ptsname_r' functions may be STREAMS-based, and
+-therefore require additional processing after opening before it
+-actually behaves as a pseudo terminal.
+-
+-   Typical usage of these functions is illustrated by the following
+-example:
+-     int
+-     open_pty_pair (int *amaster, int *aslave)
+-     {
+-       int master, slave;
+-       char *name
+-     
+-       master = getpt ();
+-       if (master < 0)
+-         return 0;
+-     
+-       if (grantpt (master) < 0 || unlockpt (master) < 0)
+-         goto close_master;
+-       name = ptsname (master);
+-       if (name == NULL)
+-         goto close_master;
+-     
+-       slave = open (name, O_RDWR);
+-       if (slave == -1)
+-         goto close_master;
+-     
+-       if (isastream (slave))
+-         {
+-           if (ioctl (slave, I_PUSH, "ptem") < 0
+-               || ioctl (slave, I_PUSH, "ldterm") < 0)
+-             goto close_slave;
+-         }
+-     
+-       *amaster = master;
+-       *aslave = slave;
+-       return 1;
+-     
+-     close_slave:
+-       close (slave);
+-     
+-     close_master:
+-       close (master);
+-       return 0;
+-     }
+-
+-
+-File: libc.info,  Node: Pseudo-Terminal Pairs,  Prev: Allocation,  Up: Pseudo-Terminals
+-
+-Opening a Pseudo-Terminal Pair
+-------------------------------
+-
+-   These functions, derived from BSD, are available in the separate
+-`libutil' library, and declared in `pty.h'.
+-
+- - Function: int openpty (int *AMASTER, int *ASLAVE, char *NAME, struct
+-          termios *TERMP, struct winsize *WINP)
+-     This function allocates and opens a pseudo-terminal pair,
+-     returning the file descriptor for the master in *AMASTER, and the
+-     file descriptor for the slave in *ASLAVE.  If the argument NAME is
+-     not a null pointer, the file name of the slave pseudo-terminal
+-     device is stored in `*name'.  If TERMP is not a null pointer, the
+-     terminal attributes of the slave are set to the ones specified in
+-     the structure that TERMP points to (*note Terminal Modes::.).
+-     Likewise, if the WINP is not a null pointer, the screen size of
+-     the slave is set to the values specified in the structure that
+-     WINP points to.
+-
+-     The normal return value from `openpty' is 0; a value of -1 is
+-     returned in case of failure.  The following `errno' conditions are
+-     defined for this function:
+-
+-    `ENOENT'
+-          There are no free pseudo-terminal pairs available.
+-
+-     *Warning:* Using the `openpty' function with NAME not set to
+-     `NULL' is *very dangerous* because it provides no protection
+-     against overflowing the string NAME.  You should use the `ttyname'
+-     function on the file descriptor returned in *SLAVE to find out the
+-     file name of the slave pseudo-terminal device instead.
+-
+- - Function: int forkpty (int *AMASTER, char *NAME, struct termios
+-          *TERMP, struct winsize *WINP)
+-     This function is similar to the `openpty' function, but in
+-     addition, forks a new process (*note Creating a Process::.) and
+-     makes the newly opened slave pseudo-terminal device the
+-     controlling terminal (*note Controlling Terminal::.) for the child
+-     process.
+-
+-     If the operation is successful, there are then both parent and
+-     child processes and both see `forkpty' return, but with different
+-     values: it returns a value of 0 in the child process and returns
+-     the child's process ID in the parent process.
+-
+-     If the allocation of a pseudo-terminal pair or the process creation
+-     failed, `forkpty' returns a value of -1 in the parent process.
+-
+-     *Warning:* The `forkpty' function has the same problems with
+-     respect to the NAME argument as `openpty'.
+-
+-
+-File: libc.info,  Node: Mathematics,  Next: Arithmetic,  Prev: Low-Level Terminal Interface,  Up: Top
+-
+-Mathematics
+-***********
+-
+-   This chapter contains information about functions for performing
+-mathematical computations, such as trigonometric functions.  Most of
+-these functions have prototypes declared in the header file `math.h'.
+-The complex-valued functions are defined in `complex.h'.
+-
+-   All mathematical functions which take a floating-point argument have
+-three variants, one each for `double', `float', and `long double'
+-arguments.  The `double' versions are mostly defined in ISO C 89.  The
+-`float' and `long double' versions are from the numeric extensions to C
+-included in ISO C 9X.
+-
+-   Which of the three versions of a function should be used depends on
+-the situation.  For most calculations, the `float' functions are the
+-fastest.  On the other hand, the `long double' functions have the
+-highest precision.  `double' is somewhere in between.  It is usually
+-wise to pick the narrowest type that can accomodate your data.  Not all
+-machines have a distinct `long double' type; it may be the same as
+-`double'.
+-
+-* Menu:
+-
+-* Mathematical Constants::      Precise numeric values for often-used
+-                                 constants.
+-* Trig Functions::              Sine, cosine, tangent, and friends.
+-* Inverse Trig Functions::      Arcsine, arccosine, etc.
+-* Exponents and Logarithms::    Also pow and sqrt.
+-* Hyperbolic Functions::        sinh, cosh, tanh, etc.
+-* Special Functions::           Bessel, gamma, erf.
+-* Pseudo-Random Numbers::       Functions for generating pseudo-random
+-				 numbers.
+-* FP Function Optimizations::   Fast code or small code.
+-
+-
+-File: libc.info,  Node: Mathematical Constants,  Next: Trig Functions,  Up: Mathematics
+-
+-Predefined Mathematical Constants
+-=================================
+-
+-   The header `math.h' defines several useful mathematical constants.
+-All values are defined as preprocessor macros starting with `M_'.  The
+-values provided are:
+-
+-`M_E'
+-     The base of natural logarithms.
+-
+-`M_LOG2E'
+-     The logarithm to base `2' of `M_E'.
+-
+-`M_LOG10E'
+-     The logarithm to base `10' of `M_E'.
+-
+-`M_LN2'
+-     The natural logarithm of `2'.
+-
+-`M_LN10'
+-     The natural logarithm of `10'.
+-
+-`M_PI'
+-     Pi, the ratio of a circle's circumrefence to its diameter.
+-
+-`M_PI_2'
+-     Pi divided by two.
+-
+-`M_PI_4'
+-     Pi divided by four.
+-
+-`M_1_PI'
+-     The reciprocal of pi (1/pi)
+-
+-`M_2_PI'
+-     Two times the reciprocal of pi.
+-
+-`M_2_SQRTPI'
+-     Two times the reciprocal of the square root of pi.
+-
+-`M_SQRT2'
+-     The square root of two.
+-
+-`M_SQRT1_2'
+-     The reciprocal of the square root of two (also the square root of
+-     1/2).
+-
+-   These constants come from the Unix98 standard and were also
+-available in 4.4BSD; therefore, they are only defined if `_BSD_SOURCE'
+-or `_XOPEN_SOURCE=500', or a more general feature select macro, is
+-defined.  The default set of features includes these constants.  *Note
+-Feature Test Macros::.
+-
+-   All values are of type `double'.  As an extension, the GNU C library
+-also defines these constants with type `long double'.  The `long
+-double' macros have a lowercase `l' appended to their names: `M_El',
+-`M_PIl', and so forth.  These are only available if `_GNU_SOURCE' is
+-defined.
+-
+-   *Note:* Some programs use a constant named `PI' which has the same
+-value as `M_PI'.  This constant is not standard; it may have appeared
+-in some old AT&T headers, and is mentioned in Stroustrup's book on C++.
+-It infringes on the user's name space, so the GNU C library does not
+-define it.  Fixing programs written to expect it is simple: replace
+-`PI' with `M_PI' throughout, or put `-DPI=M_PI' on the compiler command
+-line.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-27 glibc-2.1.3/manual/libc.info-27
+--- ../glibc-2.1.3/manual/libc.info-27	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-27	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1146 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Trig Functions,  Next: Inverse Trig Functions,  Prev: Mathematical Constants,  Up: Mathematics
+-
+-Trigonometric Functions
+-=======================
+-
+-   These are the familiar `sin', `cos', and `tan' functions.  The
+-arguments to all of these functions are in units of radians; recall
+-that pi radians equals 180 degrees.
+-
+-   The math library normally defines `M_PI' to a `double' approximation
+-of pi.  If strict ISO and/or POSIX compliance are requested this
+-constant is not defined, but you can easily define it yourself:
+-
+-     #define M_PI 3.14159265358979323846264338327
+-
+-You can also compute the value of pi with the expression `acos (-1.0)'.
+-
+- - Function: double sin (double X)
+- - Function: float sinf (float X)
+- - Function: long double sinl (long double X)
+-     These functions return the sine of X, where X is given in radians.
+-     The return value is in the range `-1' to `1'.
+-
+- - Function: double cos (double X)
+- - Function: float cosf (float X)
+- - Function: long double cosl (long double X)
+-     These functions return the cosine of X, where X is given in
+-     radians.  The return value is in the range `-1' to `1'.
+-
+- - Function: double tan (double X)
+- - Function: float tanf (float X)
+- - Function: long double tanl (long double X)
+-     These functions return the tangent of X, where X is given in
+-     radians.
+-
+-     Mathematically, the tangent function has singularities at odd
+-     multiples of pi/2.  If the argument X is too close to one of these
+-     singularities, `tan' will signal overflow.
+-
+-   In many applications where `sin' and `cos' are used, the sine and
+-cosine of the same angle are needed at the same time.  It is more
+-efficient to compute them simultaneously, so the library provides a
+-function to do that.
+-
+- - Function: void sincos (double X, double *SINX, double *COSX)
+- - Function: void sincosf (float X, float *SINX, float *COSX)
+- - Function: void sincosl (long double X, long double *SINX, long
+-          double *COSX)
+-     These functions return the sine of X in `*SINX' and the cosine of
+-     X in `*COS', where X is given in radians.  Both values, `*SINX'
+-     and `*COSX', are in the range of `-1' to `1'.
+-
+-     This function is a GNU extension.  Portable programs should be
+-     prepared to cope with its absence.
+-
+-   ISO C 9x defines variants of the trig functions which work on
+-complex numbers.  The GNU C library provides these functions, but they
+-are only useful if your compiler supports the new complex types defined
+-by the standard.  (As of this writing GCC supports complex numbers, but
+-there are bugs in the implementation.)
+-
+- - Function: complex double csin (complex double Z)
+- - Function: complex float csinf (complex float Z)
+- - Function: complex long double csinl (complex long double Z)
+-     These functions return the complex sine of Z.  The mathematical
+-     definition of the complex sine is
+-
+-     sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i)).
+-
+- - Function: complex double ccos (complex double Z)
+- - Function: complex float ccosf (complex float Z)
+- - Function: complex long double ccosl (complex long double Z)
+-     These functions return the complex cosine of Z.  The mathematical
+-     definition of the complex cosine is
+-
+-     cos (z) = 1/2 * (exp (z*i) + exp (-z*i))
+-
+- - Function: complex double ctan (complex double Z)
+- - Function: complex float ctanf (complex float Z)
+- - Function: complex long double ctanl (complex long double Z)
+-     These functions return the complex tangent of Z.  The mathematical
+-     definition of the complex tangent is
+-
+-     tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))
+-
+-     The complex tangent has poles at pi/2 + 2n, where n is an integer.
+-     `ctan' may signal overflow if Z is too close to a pole.
+-
+-
+-File: libc.info,  Node: Inverse Trig Functions,  Next: Exponents and Logarithms,  Prev: Trig Functions,  Up: Mathematics
+-
+-Inverse Trigonometric Functions
+-===============================
+-
+-   These are the usual arc sine, arc cosine and arc tangent functions,
+-which are the inverses of the sine, cosine and tangent functions,
+-respectively.
+-
+- - Function: double asin (double X)
+- - Function: float asinf (float X)
+- - Function: long double asinl (long double X)
+-     These functions compute the arc sine of X--that is, the value whose
+-     sine is X.  The value is in units of radians.  Mathematically,
+-     there are infinitely many such values; the one actually returned
+-     is the one between `-pi/2' and `pi/2' (inclusive).
+-
+-     The arc sine function is defined mathematically only over the
+-     domain `-1' to `1'.  If X is outside the domain, `asin' signals a
+-     domain error.
+-
+- - Function: double acos (double X)
+- - Function: float acosf (float X)
+- - Function: long double acosl (long double X)
+-     These functions compute the arc cosine of X--that is, the value
+-     whose cosine is X.  The value is in units of radians.
+-     Mathematically, there are infinitely many such values; the one
+-     actually returned is the one between `0' and `pi' (inclusive).
+-
+-     The arc cosine function is defined mathematically only over the
+-     domain `-1' to `1'.  If X is outside the domain, `acos' signals a
+-     domain error.
+-
+- - Function: double atan (double X)
+- - Function: float atanf (float X)
+- - Function: long double atanl (long double X)
+-     These functions compute the arc tangent of X--that is, the value
+-     whose tangent is X.  The value is in units of radians.
+-     Mathematically, there are infinitely many such values; the one
+-     actually returned is the one between `-pi/2' and `pi/2'
+-     (inclusive).
+-
+- - Function: double atan2 (double Y, double X)
+- - Function: float atan2f (float Y, float X)
+- - Function: long double atan2l (long double Y, long double X)
+-     This function computes the arc tangent of Y/X, but the signs of
+-     both arguments are used to determine the quadrant of the result,
+-     and X is permitted to be zero.  The return value is given in
+-     radians and is in the range `-pi' to `pi', inclusive.
+-
+-     If X and Y are coordinates of a point in the plane, `atan2'
+-     returns the signed angle between the line from the origin to that
+-     point and the x-axis.  Thus, `atan2' is useful for converting
+-     Cartesian coordinates to polar coordinates.  (To compute the
+-     radial coordinate, use `hypot'; see *Note Exponents and
+-     Logarithms::.)
+-
+-     If both X and Y are zero, `atan2' returns zero.
+-
+-   ISO C 9x defines complex versions of the inverse trig functions.
+-
+- - Function: complex double casin (complex double Z)
+- - Function: complex float casinf (complex float Z)
+- - Function: complex long double casinl (complex long double Z)
+-     These functions compute the complex arc sine of Z--that is, the
+-     value whose sine is Z.  The value returned is in radians.
+-
+-     Unlike the real-valued functions, `casin' is defined for all
+-     values of Z.
+-
+- - Function: complex double cacos (complex double Z)
+- - Function: complex float cacosf (complex float Z)
+- - Function: complex long double cacosl (complex long double Z)
+-     These functions compute the complex arc cosine of Z--that is, the
+-     value whose cosine is Z.  The value returned is in radians.
+-
+-     Unlike the real-valued functions, `cacos' is defined for all
+-     values of Z.
+-
+- - Function: complex double catan (complex double Z)
+- - Function: complex float catanf (complex float Z)
+- - Function: complex long double catanl (complex long double Z)
+-     These functions compute the complex arc tangent of Z--that is, the
+-     value whose tangent is Z.  The value is in units of radians.
+-
+-
+-File: libc.info,  Node: Exponents and Logarithms,  Next: Hyperbolic Functions,  Prev: Inverse Trig Functions,  Up: Mathematics
+-
+-Exponentiation and Logarithms
+-=============================
+-
+- - Function: double exp (double X)
+- - Function: float expf (float X)
+- - Function: long double expl (long double X)
+-     These functions compute `e' (the base of natural logarithms) raised
+-     to the power X.
+-
+-     If the magnitude of the result is too large to be representable,
+-     `exp' signals overflow.
+-
+- - Function: double exp2 (double X)
+- - Function: float exp2f (float X)
+- - Function: long double exp2l (long double X)
+-     These functions compute `2' raised to the power X.
+-     Mathematically, `exp2 (x)' is the same as `exp (x * log (2))'.
+-
+- - Function: double exp10 (double X)
+- - Function: float exp10f (float X)
+- - Function: long double exp10l (long double X)
+- - Function: double pow10 (double X)
+- - Function: float pow10f (float X)
+- - Function: long double pow10l (long double X)
+-     These functions compute `10' raised to the power X.
+-     Mathematically, `exp10 (x)' is the same as `exp (x * log (10))'.
+-
+-     These functions are GNU extensions.  The name `exp10' is
+-     preferred, since it is analogous to `exp' and `exp2'.
+-
+- - Function: double log (double X)
+- - Function: float logf (float X)
+- - Function: long double logl (long double X)
+-     These functions compute the natural logarithm of X.  `exp (log
+-     (X))' equals X, exactly in mathematics and approximately in C.
+-
+-     If X is negative, `log' signals a domain error.  If X is zero, it
+-     returns negative infinity; if X is too close to zero, it may
+-     signal overflow.
+-
+- - Function: double log10 (double X)
+- - Function: float log10f (float X)
+- - Function: long double log10l (long double X)
+-     These functions return the base-10 logarithm of X.  `log10 (X)'
+-     equals `log (X) / log (10)'.
+-
+-
+- - Function: double log2 (double X)
+- - Function: float log2f (float X)
+- - Function: long double log2l (long double X)
+-     These functions return the base-2 logarithm of X.  `log2 (X)'
+-     equals `log (X) / log (2)'.
+-
+- - Function: double logb (double X)
+- - Function: float logbf (float X)
+- - Function: long double logbl (long double X)
+-     These functions extract the exponent of X and return it as a
+-     floating-point value.  If `FLT_RADIX' is two, `logb' is equal to
+-     `floor (log2 (x))', except it's probably faster.
+-
+-     If X is denormalized, `logb' returns the exponent X would have if
+-     it were normalized.  If X is infinity (positive or negative),
+-     `logb' returns oo.  If X is zero, `logb' returns oo.  It does not
+-     signal.
+-
+- - Function: int ilogb (double X)
+- - Function: int ilogbf (float X)
+- - Function: int ilogbl (long double X)
+-     These functions are equivalent to the corresponding `logb'
+-     functions except that they return signed integer values.
+-
+-Since integers cannot represent infinity and NaN, `ilogb' instead
+-returns an integer that can't be the exponent of a normal floating-point
+-number.  `math.h' defines constants so you can check for this.
+-
+- - Macro: int FP_ILOGB0
+-     `ilogb' returns this value if its argument is `0'.  The numeric
+-     value is either `INT_MIN' or `-INT_MAX'.
+-
+-     This macro is defined in ISO C 9X.
+-
+- - Macro: int FP_ILOGBNAN
+-     `ilogb' returns this value if its argument is `NaN'.  The numeric
+-     value is either `INT_MIN' or `INT_MAX'.
+-
+-     This macro is defined in ISO C 9X.
+-
+-   These values are system specific.  They might even be the same.  The
+-proper way to test the result of `ilogb' is as follows:
+-
+-     i = ilogb (f);
+-     if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
+-       {
+-         if (isnan (f))
+-           {
+-             /* Handle NaN.  */
+-           }
+-         else if (f  == 0.0)
+-           {
+-             /* Handle 0.0.  */
+-           }
+-         else
+-           {
+-             /* Some other value with large exponent,
+-                perhaps +Inf.  */
+-           }
+-       }
+-
+- - Function: double pow (double BASE, double POWER)
+- - Function: float powf (float BASE, float POWER)
+- - Function: long double powl (long double BASE, long double POWER)
+-     These are general exponentiation functions, returning BASE raised
+-     to POWER.
+-
+-     Mathematically, `pow' would return a complex number when BASE is
+-     negative and POWER is not an integral value.  `pow' can't do that,
+-     so instead it signals a domain error. `pow' may also underflow or
+-     overflow the destination type.
+-
+- - Function: double sqrt (double X)
+- - Function: float sqrtf (float X)
+- - Function: long double sqrtl (long double X)
+-     These functions return the nonnegative square root of X.
+-
+-     If X is negative, `sqrt' signals a domain error.  Mathematically,
+-     it should return a complex number.
+-
+- - Function: double cbrt (double X)
+- - Function: float cbrtf (float X)
+- - Function: long double cbrtl (long double X)
+-     These functions return the cube root of X.  They cannot fail;
+-     every representable real value has a representable real cube root.
+-
+- - Function: double hypot (double X, double Y)
+- - Function: float hypotf (float X, float Y)
+- - Function: long double hypotl (long double X, long double Y)
+-     These functions return `sqrt (X*X + Y*Y)'.  This is the length of
+-     the hypotenuse of a right triangle with sides of length X and Y,
+-     or the distance of the point (X, Y) from the origin.  Using this
+-     function instead of the direct formula is wise, since the error is
+-     much smaller.  See also the function `cabs' in *Note Absolute
+-     Value::.
+-
+- - Function: double expm1 (double X)
+- - Function: float expm1f (float X)
+- - Function: long double expm1l (long double X)
+-     These functions return a value equivalent to `exp (X) - 1'.  They
+-     are computed in a way that is accurate even if X is near zero--a
+-     case where `exp (X) - 1' would be inaccurate due to subtraction of
+-     two numbers that are nearly equal.
+-
+- - Function: double log1p (double X)
+- - Function: float log1pf (float X)
+- - Function: long double log1pl (long double X)
+-     These functions returns a value equivalent to `log (1 + X)'.  They
+-     are computed in a way that is accurate even if X is near zero.
+-
+-   ISO C 9X defines complex variants of some of the exponentiation and
+-logarithm functions.
+-
+- - Function: complex double cexp (complex double Z)
+- - Function: complex float cexpf (complex float Z)
+- - Function: complex long double cexpl (complex long double Z)
+-     These functions return `e' (the base of natural logarithms) raised
+-     to the power of Z.  Mathematically this corresponds to the value
+-
+-     exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))
+-
+- - Function: complex double clog (complex double Z)
+- - Function: complex float clogf (complex float Z)
+- - Function: complex long double clogl (complex long double Z)
+-     These functions return the natural logarithm of Z.  Mathematically
+-     this corresponds to the value
+-
+-     log (z) = log (cabs (z)) + I * carg (z)
+-
+-     `clog' has a pole at 0, and will signal overflow if Z equals or is
+-     very close to 0.  It is well-defined for all other values of Z.
+-
+- - Function: complex double clog10 (complex double Z)
+- - Function: complex float clog10f (complex float Z)
+- - Function: complex long double clog10l (complex long double Z)
+-     These functions return the base 10 logarithm of the complex value
+-     Z. Mathematically this corresponds to the value
+-
+-     log (z) = log10 (cabs (z)) + I * carg (z)
+-
+-     These functions are GNU extensions.
+-
+- - Function: complex double csqrt (complex double Z)
+- - Function: complex float csqrtf (complex float Z)
+- - Function: complex long double csqrtl (complex long double Z)
+-     These functions return the complex square root of the argument Z.
+-     Unlike the real-valued functions, they are defined for all values
+-     of Z.
+-
+- - Function: complex double cpow (complex double BASE, complex double
+-          POWER)
+- - Function: complex float cpowf (complex float BASE, complex float
+-          POWER)
+- - Function: complex long double cpowl (complex long double BASE,
+-          complex long double POWER)
+-     These functions return BASE raised to the power of POWER.  This is
+-     equivalent to `cexp (y * clog (x))'
+-
+-
+-File: libc.info,  Node: Hyperbolic Functions,  Next: Special Functions,  Prev: Exponents and Logarithms,  Up: Mathematics
+-
+-Hyperbolic Functions
+-====================
+-
+-   The functions in this section are related to the exponential
+-functions; see *Note Exponents and Logarithms::.
+-
+- - Function: double sinh (double X)
+- - Function: float sinhf (float X)
+- - Function: long double sinhl (long double X)
+-     These functions return the hyperbolic sine of X, defined
+-     mathematically as `(exp (X) - exp (-X)) / 2'.  They may signal
+-     overflow if X is too large.
+-
+- - Function: double cosh (double X)
+- - Function: float coshf (float X)
+- - Function: long double coshl (long double X)
+-     These function return the hyperbolic cosine of X, defined
+-     mathematically as `(exp (X) + exp (-X)) / 2'.  They may signal
+-     overflow if X is too large.
+-
+- - Function: double tanh (double X)
+- - Function: float tanhf (float X)
+- - Function: long double tanhl (long double X)
+-     These functions return the hyperbolic tangent of X, defined
+-     mathematically as `sinh (X) / cosh (X)'.  They may signal overflow
+-     if X is too large.
+-
+-   There are counterparts for the hyperbolic functions which take
+-complex arguments.
+-
+- - Function: complex double csinh (complex double Z)
+- - Function: complex float csinhf (complex float Z)
+- - Function: complex long double csinhl (complex long double Z)
+-     These functions return the complex hyperbolic sine of Z, defined
+-     mathematically as `(exp (Z) - exp (-Z)) / 2'.
+-
+- - Function: complex double ccosh (complex double Z)
+- - Function: complex float ccoshf (complex float Z)
+- - Function: complex long double ccoshl (complex long double Z)
+-     These functions return the complex hyperbolic cosine of Z, defined
+-     mathematically as `(exp (Z) + exp (-Z)) / 2'.
+-
+- - Function: complex double ctanh (complex double Z)
+- - Function: complex float ctanhf (complex float Z)
+- - Function: complex long double ctanhl (complex long double Z)
+-     These functions return the complex hyperbolic tangent of Z,
+-     defined mathematically as `csinh (Z) / ccosh (Z)'.
+-
+- - Function: double asinh (double X)
+- - Function: float asinhf (float X)
+- - Function: long double asinhl (long double X)
+-     These functions return the inverse hyperbolic sine of X--the value
+-     whose hyperbolic sine is X.
+-
+- - Function: double acosh (double X)
+- - Function: float acoshf (float X)
+- - Function: long double acoshl (long double X)
+-     These functions return the inverse hyperbolic cosine of X--the
+-     value whose hyperbolic cosine is X.  If X is less than `1',
+-     `acosh' signals a domain error.
+-
+- - Function: double atanh (double X)
+- - Function: float atanhf (float X)
+- - Function: long double atanhl (long double X)
+-     These functions return the inverse hyperbolic tangent of X--the
+-     value whose hyperbolic tangent is X.  If the absolute value of X
+-     is greater than `1', `atanh' signals a domain error; if it is
+-     equal to 1, `atanh' returns infinity.
+-
+- - Function: complex double casinh (complex double Z)
+- - Function: complex float casinhf (complex float Z)
+- - Function: complex long double casinhl (complex long double Z)
+-     These functions return the inverse complex hyperbolic sine of
+-     Z--the value whose complex hyperbolic sine is Z.
+-
+- - Function: complex double cacosh (complex double Z)
+- - Function: complex float cacoshf (complex float Z)
+- - Function: complex long double cacoshl (complex long double Z)
+-     These functions return the inverse complex hyperbolic cosine of
+-     Z--the value whose complex hyperbolic cosine is Z.  Unlike the
+-     real-valued functions, there are no restrictions on the value of Z.
+-
+- - Function: complex double catanh (complex double Z)
+- - Function: complex float catanhf (complex float Z)
+- - Function: complex long double catanhl (complex long double Z)
+-     These functions return the inverse complex hyperbolic tangent of
+-     Z--the value whose complex hyperbolic tangent is Z.  Unlike the
+-     real-valued functions, there are no restrictions on the value of Z.
+-
+-
+-File: libc.info,  Node: Special Functions,  Next: Pseudo-Random Numbers,  Prev: Hyperbolic Functions,  Up: Mathematics
+-
+-Special Functions
+-=================
+-
+-   These are some more exotic mathematical functions, which are
+-sometimes useful.  Currently they only have real-valued versions.
+-
+- - Function: double erf (double X)
+- - Function: float erff (float X)
+- - Function: long double erfl (long double X)
+-     `erf' returns the error function of X.  The error function is
+-     defined as
+-          erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
+-
+- - Function: double erfc (double X)
+- - Function: float erfcf (float X)
+- - Function: long double erfcl (long double X)
+-     `erfc' returns `1.0 - erf(X)', but computed in a fashion that
+-     avoids round-off error when X is large.
+-
+- - Function: double lgamma (double X)
+- - Function: float lgammaf (float X)
+- - Function: long double lgammal (long double X)
+-     `lgamma' returns the natural logarithm of the absolute value of
+-     the gamma function of X.  The gamma function is defined as
+-          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
+-
+-     The sign of the gamma function is stored in the global variable
+-     SIGNGAM, which is declared in `math.h'.  It is `1' if the
+-     intermediate result was positive or zero, and, `-1' if it was
+-     negative.
+-
+-     To compute the real gamma function you can use the `tgamma'
+-     function or you can compute the values as follows:
+-          lgam = lgamma(x);
+-          gam  = signgam*exp(lgam);
+-
+-     The gamma function has singularities at the nonpositive integers.
+-     `lgamma' will raise the zero divide exception if evaluated at a
+-     singularity.
+-
+- - Function: double lgamma_r (double X, int *SIGNP)
+- - Function: float lgammaf_r (float X, int *SIGNP)
+- - Function: long double lgammal_r (long double X, int *SIGNP)
+-     `lgamma_r' is just like `lgamma', but it stores the sign of the
+-     intermediate result in the variable pointed to by SIGNP instead of
+-     in the SIGNGAM global.
+-
+- - Function: double gamma (double X)
+- - Function: float gammaf (float X)
+- - Function: long double gammal (long double X)
+-     These functions exist for compatibility reasons.  They are
+-     equivalent to `lgamma' etc.  It is better to use `lgamma' since
+-     for one the name reflects better the actual computation and
+-     `lgamma' is also standardized in ISO C 9x while `gamma' is not.
+-
+- - Function: double tgamma (double X)
+- - Function: float tgammaf (float X)
+- - Function: long double tgammal (long double X)
+-     `tgamma' applies the gamma function to X.  The gamma function is
+-     defined as
+-          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
+-
+-     This function was introduced in ISO C 9x.
+-
+- - Function: double j0 (double X)
+- - Function: float j0f (float X)
+- - Function: long double j0l (long double X)
+-     `j0' returns the Bessel function of the first kind of order 0 of
+-     X.  It may signal underflow if X is too large.
+-
+- - Function: double j1 (double X)
+- - Function: float j1f (float X)
+- - Function: long double j1l (long double X)
+-     `j1' returns the Bessel function of the first kind of order 1 of
+-     X.  It may signal underflow if X is too large.
+-
+- - Function: double jn (int n, double X)
+- - Function: float jnf (int n, float X)
+- - Function: long double jnl (int n, long double X)
+-     `jn' returns the Bessel function of the first kind of order N of
+-     X.  It may signal underflow if X is too large.
+-
+- - Function: double y0 (double X)
+- - Function: float y0f (float X)
+- - Function: long double y0l (long double X)
+-     `y0' returns the Bessel function of the second kind of order 0 of
+-     X.  It may signal underflow if X is too large.  If X is negative,
+-     `y0' signals a domain error; if it is zero, `y0' signals overflow
+-     and returns -oo.
+-
+- - Function: double y1 (double X)
+- - Function: float y1f (float X)
+- - Function: long double y1l (long double X)
+-     `y1' returns the Bessel function of the second kind of order 1 of
+-     X.  It may signal underflow if X is too large.  If X is negative,
+-     `y1' signals a domain error; if it is zero, `y1' signals overflow
+-     and returns -oo.
+-
+- - Function: double yn (int n, double X)
+- - Function: float ynf (int n, float X)
+- - Function: long double ynl (int n, long double X)
+-     `yn' returns the Bessel function of the second kind of order N of
+-     X.  It may signal underflow if X is too large.  If X is negative,
+-     `yn' signals a domain error; if it is zero, `yn' signals overflow
+-     and returns -oo.
+-
+-
+-File: libc.info,  Node: Pseudo-Random Numbers,  Next: FP Function Optimizations,  Prev: Special Functions,  Up: Mathematics
+-
+-Pseudo-Random Numbers
+-=====================
+-
+-   This section describes the GNU facilities for generating a series of
+-pseudo-random numbers.  The numbers generated are not truly random;
+-typically, they form a sequence that repeats periodically, with a period
+-so large that you can ignore it for ordinary purposes.  The random
+-number generator works by remembering a "seed" value which it uses to
+-compute the next random number and also to compute a new seed.
+-
+-   Although the generated numbers look unpredictable within one run of a
+-program, the sequence of numbers is *exactly the same* from one run to
+-the next.  This is because the initial seed is always the same.  This
+-is convenient when you are debugging a program, but it is unhelpful if
+-you want the program to behave unpredictably.  If you want a different
+-pseudo-random series each time your program runs, you must specify a
+-different seed each time.  For ordinary purposes, basing the seed on the
+-current time works well.
+-
+-   You can get repeatable sequences of numbers on a particular machine
+-type by specifying the same initial seed value for the random number
+-generator.  There is no standard meaning for a particular seed value;
+-the same seed, used in different C libraries or on different CPU types,
+-will give you different random numbers.
+-
+-   The GNU library supports the standard ISO C random number functions
+-plus two other sets derived from BSD and SVID.  The BSD and ISO C
+-functions provide identical, somewhat limited functionality.  If only a
+-small number of random bits are required, we recommend you use the
+-ISO C interface, `rand' and `srand'.  The SVID functions provide a more
+-flexible interface, which allows better random number generator
+-algorithms, provides more random bits (up to 48) per call, and can
+-provide random floating-point numbers.  These functions are required by
+-the XPG standard and therefore will be present in all modern Unix
+-systems.
+-
+-* Menu:
+-
+-* ISO Random::                  `rand' and friends.
+-* BSD Random::                  `random' and friends.
+-* SVID Random::                 `drand48' and friends.
+-
+-
+-File: libc.info,  Node: ISO Random,  Next: BSD Random,  Up: Pseudo-Random Numbers
+-
+-ISO C Random Number Functions
+------------------------------
+-
+-   This section describes the random number functions that are part of
+-the ISO C standard.
+-
+-   To use these facilities, you should include the header file
+-`stdlib.h' in your program.
+-
+- - Macro: int RAND_MAX
+-     The value of this macro is an integer constant representing the
+-     largest value the `rand' function can return.  In the GNU library,
+-     it is `2147483647', which is the largest signed integer
+-     representable in 32 bits.  In other libraries, it may be as low as
+-     `32767'.
+-
+- - Function: int rand (void)
+-     The `rand' function returns the next pseudo-random number in the
+-     series.  The value ranges from `0' to `RAND_MAX'.
+-
+- - Function: void srand (unsigned int SEED)
+-     This function establishes SEED as the seed for a new series of
+-     pseudo-random numbers.  If you call `rand' before a seed has been
+-     established with `srand', it uses the value `1' as a default seed.
+-
+-     To produce a different pseudo-random series each time your program
+-     is run, do `srand (time (0))'.
+-
+-   POSIX.1 extended the C standard functions to support reproducible
+-random numbers in multi-threaded programs.  However, the extension is
+-badly designed and unsuitable for serious work.
+-
+- - Function: int rand_r (unsigned int *SEED)
+-     This function returns a random number in the range 0 to `RAND_MAX'
+-     just as `rand' does.  However, all its state is stored in the SEED
+-     argument.  This means the RNG's state can only have as many bits
+-     as the type `unsigned int' has.  This is far too few to provide a
+-     good RNG.
+-
+-     If your program requires a reentrant RNG, we recommend you use the
+-     reentrant GNU extensions to the SVID random number generator.  The
+-     POSIX.1 interface should only be used when the GNU extensions are
+-     not available.
+-
+-
+-File: libc.info,  Node: BSD Random,  Next: SVID Random,  Prev: ISO Random,  Up: Pseudo-Random Numbers
+-
+-BSD Random Number Functions
+----------------------------
+-
+-   This section describes a set of random number generation functions
+-that are derived from BSD.  There is no advantage to using these
+-functions with the GNU C library; we support them for BSD compatibility
+-only.
+-
+-   The prototypes for these functions are in `stdlib.h'.
+-
+- - Function: int32_t random (void)
+-     This function returns the next pseudo-random number in the
+-     sequence.  The value returned ranges from `0' to `RAND_MAX'.
+-
+-     *Note:* Historically this function returned a `long int' value.
+-     On 64bit systems `long int' would have been larger than programs
+-     expected, so `random' is now defined to return exactly 32 bits.
+-
+- - Function: void srandom (unsigned int SEED)
+-     The `srandom' function sets the state of the random number
+-     generator based on the integer SEED.  If you supply a SEED value
+-     of `1', this will cause `random' to reproduce the default set of
+-     random numbers.
+-
+-     To produce a different set of pseudo-random numbers each time your
+-     program runs, do `srandom (time (0))'.
+-
+- - Function: void * initstate (unsigned int SEED, void *STATE, size_t
+-          SIZE)
+-     The `initstate' function is used to initialize the random number
+-     generator state.  The argument STATE is an array of SIZE bytes,
+-     used to hold the state information.  It is initialized based on
+-     SEED.  The size must be between 8 and 256 bytes, and should be a
+-     power of two.  The bigger the STATE array, the better.
+-
+-     The return value is the previous value of the state information
+-     array.  You can use this value later as an argument to `setstate'
+-     to restore that state.
+-
+- - Function: void * setstate (void *STATE)
+-     The `setstate' function restores the random number state
+-     information STATE.  The argument must have been the result of a
+-     previous call to INITSTATE or SETSTATE.
+-
+-     The return value is the previous value of the state information
+-     array.  You can use this value later as an argument to `setstate'
+-     to restore that state.
+-
+-
+-File: libc.info,  Node: SVID Random,  Prev: BSD Random,  Up: Pseudo-Random Numbers
+-
+-SVID Random Number Function
+----------------------------
+-
+-   The C library on SVID systems contains yet another kind of random
+-number generator functions.  They use a state of 48 bits of data.  The
+-user can choose among a collection of functions which return the random
+-bits in different forms.
+-
+-   Generally there are two kinds of functions: those which use a state
+-of the random number generator which is shared among several functions
+-and by all threads of the process.  The second group of functions
+-require the user to handle the state.
+-
+-   All functions have in common that they use the same congruential
+-formula with the same constants.  The formula is
+-
+-     Y = (a * X + c) mod m
+-
+-where X is the state of the generator at the beginning and Y the state
+-at the end.  `a' and `c' are constants determining the way the
+-generator work.  By default they are
+-
+-     a = 0x5DEECE66D = 25214903917
+-     c = 0xb = 11
+-
+-but they can also be changed by the user.  `m' is of course 2^48 since
+-the state consists of a 48 bit array.
+-
+- - Function: double drand48 (void)
+-     This function returns a `double' value in the range of `0.0' to
+-     `1.0' (exclusive).  The random bits are determined by the global
+-     state of the random number generator in the C library.
+-
+-     Since the `double' type according to IEEE 754 has a 52 bit
+-     mantissa this means 4 bits are not initialized by the random number
+-     generator.  These are (of course) chosen to be the least
+-     significant bits and they are initialized to `0'.
+-
+- - Function: double erand48 (unsigned short int XSUBI[3])
+-     This function returns a `double' value in the range of `0.0' to
+-     `1.0' (exclusive), similar to `drand48'.  The argument is an array
+-     describing the state of the random number generator.
+-
+-     This function can be called subsequently since it updates the
+-     array to guarantee random numbers.  The array should have been
+-     initialized before using to get reproducible results.
+-
+- - Function: long int lrand48 (void)
+-     The `lrand48' functions return an integer value in the range of
+-     `0' to `2^31' (exclusive).  Even if the size of the `long int'
+-     type can take more than 32 bits no higher numbers are returned.
+-     The random bits are determined by the global state of the random
+-     number generator in the C library.
+-
+- - Function: long int nrand48 (unsigned short int XSUBI[3])
+-     This function is similar to the `lrand48' function in that it
+-     returns a number in the range of `0' to `2^31' (exclusive) but the
+-     state of the random number generator used to produce the random
+-     bits is determined by the array provided as the parameter to the
+-     function.
+-
+-     The numbers in the array are afterwards updated so that subsequent
+-     calls to this function yield to different results (as it is
+-     expected by a random number generator).  The array should have
+-     been initialized before the first call to get reproducible results.
+-
+- - Function: long int mrand48 (void)
+-     The `mrand48' function is similar to `lrand48'.  The only
+-     difference is that the numbers returned are in the range `-2^31' to
+-     `2^31' (exclusive).
+-
+- - Function: long int jrand48 (unsigned short int XSUBI[3])
+-     The `jrand48' function is similar to `nrand48'.  The only
+-     difference is that the numbers returned are in the range `-2^31' to
+-     `2^31' (exclusive).  For the `xsubi' parameter the same
+-     requirements are necessary.
+-
+-   The internal state of the random number generator can be initialized
+-in several ways.  The functions differ in the completeness of the
+-information provided.
+-
+- - Function: void srand48 (long int SEEDVAL))
+-     The `srand48' function sets the most significant 32 bits of the
+-     state internal state of the random number generator to the least
+-     significant 32 bits of the SEEDVAL parameter.  The lower 16 bits
+-     are initialized to the value `0x330E'.  Even if the `long int'
+-     type contains more the 32 bits only the lower 32 bits are used.
+-
+-     Due to this limitation the initialization of the state using this
+-     function of not very useful.  But it makes it easy to use a
+-     construct like `srand48 (time (0))'.
+-
+-     A side-effect of this function is that the values `a' and `c' from
+-     the internal state, which are used in the congruential formula,
+-     are reset to the default values given above.  This is of
+-     importance once the user called the `lcong48' function (see below).
+-
+- - Function: unsigned short int * seed48 (unsigned short int SEED16V[3])
+-     The `seed48' function initializes all 48 bits of the state of the
+-     internal random number generator from the content of the parameter
+-     SEED16V.  Here the lower 16 bits of the first element of SEE16V
+-     initialize the least significant 16 bits of the internal state,
+-     the lower 16 bits of `SEED16V[1]' initialize the mid-order 16 bits
+-     of the state and the 16 lower bits of `SEED16V[2]' initialize the
+-     most significant 16 bits of the state.
+-
+-     Unlike `srand48' this function lets the user initialize all 48 bits
+-     of the state.
+-
+-     The value returned by `seed48' is a pointer to an array containing
+-     the values of the internal state before the change.  This might be
+-     useful to restart the random number generator at a certain state.
+-     Otherwise, the value can simply be ignored.
+-
+-     As for `srand48', the values `a' and `c' from the congruential
+-     formula are reset to the default values.
+-
+-   There is one more function to initialize the random number generator
+-which allows to specify even more information by allowing to change the
+-parameters in the congruential formula.
+-
+- - Function: void lcong48 (unsigned short int PARAM[7])
+-     The `lcong48' function allows the user to change the complete state
+-     of the random number generator.  Unlike `srand48' and `seed48',
+-     this function also changes the constants in the congruential
+-     formula.
+-
+-     From the seven elements in the array PARAM the least significant
+-     16 bits of the entries `PARAM[0]' to `PARAM[2]' determine the
+-     initial state, the least 16 bits of `PARAM[3]' to `PARAM[5]'
+-     determine the 48 bit constant `a' and `PARAM[6]' determines the 16
+-     bit value `c'.
+-
+-   All the above functions have in common that they use the global
+-parameters for the congruential formula.  In multi-threaded programs it
+-might sometimes be useful to have different parameters in different
+-threads.  For this reason all the above functions have a counterpart
+-which works on a description of the random number generator in the
+-user-supplied buffer instead of the global state.
+-
+-   Please note that it is no problem if several threads use the global
+-state if all threads use the functions which take a pointer to an array
+-containing the state.  The random numbers are computed following the
+-same loop but if the state in the array is different all threads will
+-get an individual random number generator.
+-
+-   The user supplied buffer must be of type `struct drand48_data'.
+-This type should be regarded as opaque and no member should be used
+-directly.
+-
+- - Function: int drand48_r (struct drand48_data *BUFFER, double *RESULT)
+-     This function is equivalent to the `drand48' function with the
+-     difference it does not modify the global random number generator
+-     parameters but instead the parameters is the buffer supplied by the
+-     buffer through the pointer BUFFER.  The random number is return in
+-     the variable pointed to by RESULT.
+-
+-     The return value of the function indicate whether the call
+-     succeeded.  If the value is less than `0' an error occurred and
+-     ERRNO is set to indicate the problem.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int erand48_r (unsigned short int XSUBI[3], struct
+-          drand48_data *BUFFER, double *RESULT)
+-     The `erand48_r' function works like the `erand48' and it takes an
+-     argument BUFFER which describes the random number generator.  The
+-     state of the random number generator is taken from the `xsubi'
+-     array, the parameters for the congruential formula from the global
+-     random number generator data.  The random number is return in the
+-     variable pointed to by RESULT.
+-
+-     The return value is non-negative is the call succeeded.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int lrand48_r (struct drand48_data *BUFFER, double *RESULT)
+-     This function is similar to `lrand48' and it takes a pointer to a
+-     buffer describing the state of the random number generator as a
+-     parameter just like `drand48'.
+-
+-     If the return value of the function is non-negative the variable
+-     pointed to by RESULT contains the result.  Otherwise an error
+-     occurred.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int nrand48_r (unsigned short int XSUBI[3], struct
+-          drand48_data *BUFFER, long int *RESULT)
+-     The `nrand48_r' function works like `nrand48' in that it produces
+-     a random number in range `0' to `2^31'.  But instead of using the
+-     global parameters for the congruential formula it uses the
+-     information from the buffer pointed to by BUFFER.  The state is
+-     described by the values in XSUBI.
+-
+-     If the return value is non-negative the variable pointed to by
+-     RESULT contains the result.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int mrand48_r (struct drand48_data *BUFFER, double *RESULT)
+-     This function is similar to `mrand48' but as the other reentrant
+-     function it uses the random number generator described by the
+-     value in the buffer pointed to by BUFFER.
+-
+-     If the return value is non-negative the variable pointed to by
+-     RESULT contains the result.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int jrand48_r (unsigned short int XSUBI[3], struct
+-          drand48_data *BUFFER, long int *RESULT)
+-     The `jrand48_r' function is similar to `jrand48'.  But as the
+-     other reentrant functions of this function family it uses the
+-     congruential formula parameters from the buffer pointed to by
+-     BUFFER.
+-
+-     If the return value is non-negative the variable pointed to by
+-     RESULT contains the result.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+-   Before any of the above functions should be used the buffer of type
+-`struct drand48_data' should initialized.  The easiest way is to fill
+-the whole buffer with null bytes, e.g., using
+-
+-     memset (buffer, '\0', sizeof (struct drand48_data));
+-
+-Using any of the reentrant functions of this family now will
+-automatically initialize the random number generator to the default
+-values for the state and the parameters of the congruential formula.
+-
+-   The other possibility is too use any of the functions which
+-explicitely initialize the buffer.  Though it might be obvious how to
+-initialize the buffer from the data given as parameter from the
+-function it is highly recommended to use these functions since the
+-result might not always be what you expect.
+-
+- - Function: int srand48_r (long int SEEDVAL, struct drand48_data
+-          *BUFFER)
+-     The description of the random number generator represented by the
+-     information in BUFFER is initialized similar to what the function
+-     `srand48' does.  The state is initialized from the parameter
+-     SEEDVAL and the parameters for the congruential formula are
+-     initialized to the default values.
+-
+-     If the return value is non-negative the function call succeeded.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int seed48_r (unsigned short int SEED16V[3], struct
+-          drand48_data *BUFFER)
+-     This function is similar to `srand48_r' but like `seed48' it
+-     initializes all 48 bits of the state from the parameter SEED16V.
+-
+-     If the return value is non-negative the function call succeeded.
+-     It does not return a pointer to the previous state of the random
+-     number generator like the `seed48' function does.  if the user
+-     wants to preserve the state for a later rerun s/he can copy the
+-     whole buffer pointed to by BUFFER.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+- - Function: int lcong48_r (unsigned short int PARAM[7], struct
+-          drand48_data *BUFFER)
+-     This function initializes all aspects of the random number
+-     generator described in BUFFER by the data in PARAM.  Here it is
+-     especially true the function does more than just copying the
+-     contents of PARAM of BUFFER.  Some more actions are required and
+-     therefore it is important to use this function and not initialized
+-     the random number generator directly.
+-
+-     If the return value is non-negative the function call succeeded.
+-
+-     This function is a GNU extension and should not be used in portable
+-     programs.
+-
+-
+-File: libc.info,  Node: FP Function Optimizations,  Prev: Pseudo-Random Numbers,  Up: Mathematics
+-
+-Is Fast Code or Small Code preferred?
+-=====================================
+-
+-   If an application uses many floating point function it is often the
+-case that the costs for the function calls itselfs are not neglectable.
+-Modern processor implementation often can execute the operation itself
+-very fast but the call means a disturbance of the control flow.
+-
+-   For this reason the GNU C Library provides optimizations for many of
+-the frequently used math functions.  When the GNU CC is used and the
+-user activates the optimizer several new inline functions and macros get
+-defined.  These new functions and macros have the same names as the
+-library function and so get used instead of the later.  In case of
+-inline functions the compiler will decide whether it is reasonable to
+-use the inline function and this decision is usually correct.
+-
+-   For the generated code this means that no calls to the library
+-functions are necessary.  This increases the speed significantly.  But
+-the drawback is that the code size increases and this increase is not
+-always neglectable.
+-
+-   The speed increase has one drawback: the inline functions might not
+-set `errno' and might not have the same precission as the library
+-functions.
+-
+-   In cases where the inline functions and macros are not wanted the
+-symbol `__NO_MATH_INLINES' should be defined before any system header is
+-included.  This will make sure only library functions are used.  Of
+-course it can be determined for each single file in the project whether
+-giving this option is preferred or not.
+-
+-   Not all hardware implements the entire IEEE 754 standard, or if it
+-does, there may be a substantial performance penalty for using some of
+-its features.  For example, enabling traps on some processors forces
+-the FPU to run unpipelined, which more than doubles calculation time.
+-
+-
+-File: libc.info,  Node: Arithmetic,  Next: Date and Time,  Prev: Mathematics,  Up: Top
+-
+-Arithmetic Functions
+-********************
+-
+-   This chapter contains information about functions for doing basic
+-arithmetic operations, such as splitting a float into its integer and
+-fractional parts or retrieving the imaginary part of a complex value.
+-These functions are declared in the header files `math.h' and
+-`complex.h'.
+-
+-* Menu:
+-
+-* Floating Point Numbers::      Basic concepts.  IEEE 754.
+-* Floating Point Classes::      The five kinds of floating-point number.
+-* Floating Point Errors::       When something goes wrong in a calculation.
+-* Rounding::                    Controlling how results are rounded.
+-* Control Functions::           Saving and restoring the FPU's state.
+-* Arithmetic Functions::        Fundamental operations provided by the library.
+-* Complex Numbers::             The types.  Writing complex constants.
+-* Operations on Complex::       Projection, conjugation, decomposition.
+-* Integer Division::            Integer division with guaranteed rounding.
+-* Parsing of Numbers::          Converting strings to numbers.
+-* System V Number Conversion::  An archaic way to convert numbers to strings.
+-
+-
+-File: libc.info,  Node: Floating Point Numbers,  Next: Floating Point Classes,  Up: Arithmetic
+-
+-Floating Point Numbers
+-======================
+-
+-   Most computer hardware has support for two different kinds of
+-numbers: integers (...-3, -2, -1, 0, 1, 2, 3...) and floating-point
+-numbers.  Floating-point numbers have three parts: the "mantissa", the
+-"exponent", and the "sign bit".  The real number represented by a
+-floating-point value is given by (s ? -1 : 1) * 2^e * M where s is the
+-sign bit, e the exponent, and M the mantissa.  *Note Floating Point
+-Concepts::, for details.  (It is possible to have a different "base"
+-for the exponent, but all modern hardware uses 2.)
+-
+-   Floating-point numbers can represent a finite subset of the real
+-numbers.  While this subset is large enough for most purposes, it is
+-important to remember that the only reals that can be represented
+-exactly are rational numbers that have a terminating binary expansion
+-shorter than the width of the mantissa.  Even simple fractions such as
+-1/5 can only be approximated by floating point.
+-
+-   Mathematical operations and functions frequently need to produce
+-values that are not representable.  Often these values can be
+-approximated closely enough for practical purposes, but sometimes they
+-can't.  Historically there was no way to tell when the results of a
+-calculation were inaccurate.  Modern computers implement the IEEE 754
+-standard for numerical computations, which defines a framework for
+-indicating to the program when the results of calculation are not
+-trustworthy.  This framework consists of a set of "exceptions" that
+-indicate why a result could not be represented, and the special values
+-"infinity" and "not a number" (NaN).
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-28 glibc-2.1.3/manual/libc.info-28
+--- ../glibc-2.1.3/manual/libc.info-28	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-28	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1161 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Floating Point Classes,  Next: Floating Point Errors,  Prev: Floating Point Numbers,  Up: Arithmetic
+-
+-Floating-Point Number Classification Functions
+-==============================================
+-
+-   ISO C 9x defines macros that let you determine what sort of
+-floating-point number a variable holds.
+-
+- - Macro: int fpclassify (*float-type* X)
+-     This is a generic macro which works on all floating-point types and
+-     which returns a value of type `int'.  The possible values are:
+-
+-    `FP_NAN'
+-          The floating-point number X is "Not a Number" (*note Infinity
+-          and NaN::.)
+-
+-    `FP_INFINITE'
+-          The value of X is either plus or minus infinity (*note
+-          Infinity and NaN::.)
+-
+-    `FP_ZERO'
+-          The value of X is zero.  In floating-point formats like
+-          IEEE 754, where zero can be signed, this value is also
+-          returned if X is negative zero.
+-
+-    `FP_SUBNORMAL'
+-          Numbers whose absolute value is too small to be represented
+-          in the normal format are represented in an alternate,
+-          "denormalized" format (*note Floating Point Concepts::.).
+-          This format is less precise but can represent values closer
+-          to zero.  `fpclassify' returns this value for values of X in
+-          this alternate format.
+-
+-    `FP_NORMAL'
+-          This value is returned for all other values of X.  It
+-          indicates that there is nothing special about the number.
+-
+-
+-   `fpclassify' is most useful if more than one property of a number
+-must be tested.  There are more specific macros which only test one
+-property at a time.  Generally these macros execute faster than
+-`fpclassify', since there is special hardware support for them.  You
+-should therefore use the specific macros whenever possible.
+-
+- - Macro: int isfinite (*float-type* X)
+-     This macro returns a nonzero value if X is finite: not plus or
+-     minus infinity, and not NaN.  It is equivalent to
+-
+-          (fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
+-
+-     `isfinite' is implemented as a macro which accepts any
+-     floating-point type.
+-
+- - Macro: int isnormal (*float-type* X)
+-     This macro returns a nonzero value if X is finite and normalized.
+-     It is equivalent to
+-
+-          (fpclassify (x) == FP_NORMAL)
+-
+- - Macro: int isnan (*float-type* X)
+-     This macro returns a nonzero value if X is NaN.  It is equivalent
+-     to
+-
+-          (fpclassify (x) == FP_NAN)
+-
+-   Another set of floating-point classification functions was provided
+-by BSD.  The GNU C library also supports these functions; however, we
+-recommend that you use the C9x macros in new code.  Those are standard
+-and will be available more widely.  Also, since they are macros, you do
+-not have to worry about the type of their argument.
+-
+- - Function: int isinf (double X)
+- - Function: int isinff (float X)
+- - Function: int isinfl (long double X)
+-     This function returns `-1' if X represents negative infinity, `1'
+-     if X represents positive infinity, and `0' otherwise.
+-
+- - Function: int isnan (double X)
+- - Function: int isnanf (float X)
+- - Function: int isnanl (long double X)
+-     This function returns a nonzero value if X is a "not a number"
+-     value, and zero otherwise.
+-
+-     *Note:* The `isnan' macro defined by ISO C 9x overrides the BSD
+-     function.  This is normally not a problem, because the two
+-     routines behave identically.  However, if you really need to get
+-     the BSD function for some reason, you can write
+-
+-          (isnan) (x)
+-
+- - Function: int finite (double X)
+- - Function: int finitef (float X)
+- - Function: int finitel (long double X)
+-     This function returns a nonzero value if X is finite or a "not a
+-     number" value, and zero otherwise.
+-
+- - Function: double infnan (int ERROR)
+-     This function is provided for compatibility with BSD.  Its
+-     argument is an error code, `EDOM' or `ERANGE'; `infnan' returns the
+-     value that a math function would return if it set `errno' to that
+-     value.  *Note Math Error Reporting::.  `-ERANGE' is also acceptable
+-     as an argument, and corresponds to `-HUGE_VAL' as a value.
+-
+-     In the BSD library, on certain machines, `infnan' raises a fatal
+-     signal in all cases.  The GNU library does not do likewise,
+-     because that does not fit the ISO C specification.
+-
+-   *Portability Note:* The functions listed in this section are BSD
+-extensions.
+-
+-
+-File: libc.info,  Node: Floating Point Errors,  Next: Rounding,  Prev: Floating Point Classes,  Up: Arithmetic
+-
+-Errors in Floating-Point Calculations
+-=====================================
+-
+-* Menu:
+-
+-* FP Exceptions::               IEEE 754 math exceptions and how to detect them.
+-* Infinity and NaN::            Special values returned by calculations.
+-* Status bit operations::       Checking for exceptions after the fact.
+-* Math Error Reporting::        How the math functions report errors.
+-
+-
+-File: libc.info,  Node: FP Exceptions,  Next: Infinity and NaN,  Up: Floating Point Errors
+-
+-FP Exceptions
+--------------
+-
+-   The IEEE 754 standard defines five "exceptions" that can occur
+-during a calculation.  Each corresponds to a particular sort of error,
+-such as overflow.
+-
+-   When exceptions occur (when exceptions are "raised", in the language
+-of the standard), one of two things can happen.  By default the
+-exception is simply noted in the floating-point "status word", and the
+-program continues as if nothing had happened.  The operation produces a
+-default value, which depends on the exception (see the table below).
+-Your program can check the status word to find out which exceptions
+-happened.
+-
+-   Alternatively, you can enable "traps" for exceptions.  In that case,
+-when an exception is raised, your program will receive the `SIGFPE'
+-signal.  The default action for this signal is to terminate the
+-program.  *Note Signal Handling::, for how you can change the effect of
+-the signal.
+-
+-   In the System V math library, the user-defined function `matherr' is
+-called when certain exceptions occur inside math library functions.
+-However, the Unix98 standard deprecates this interface.  We support it
+-for historical compatibility, but recommend that you do not use it in
+-new programs.
+-
+-The exceptions defined in IEEE 754 are:
+-
+-`Invalid Operation'
+-     This exception is raised if the given operands are invalid for the
+-     operation to be performed.  Examples are (see IEEE 754, section 7):
+-       1. Addition or subtraction: oo - oo.  (But oo + oo = oo).
+-
+-       2. Multiplication: 0 * oo.
+-
+-       3. Division: 0/0 or oo/oo.
+-
+-       4. Remainder: x REM y, where y is zero or x is infinite.
+-
+-       5. Square root if the operand is less then zero.  More
+-          generally, any mathematical function evaluated outside its
+-          domain produces this exception.
+-
+-       6. Conversion of a floating-point number to an integer or decimal
+-          string, when the number cannot be represented in the target
+-          format (due to overflow, infinity, or NaN).
+-
+-       7. Conversion of an unrecognizable input string.
+-
+-       8. Comparison via predicates involving < or >, when one or other
+-          of the operands is NaN.  You can prevent this exception by
+-          using the unordered comparison functions instead; see *Note
+-          FP Comparison Functions::.
+-
+-     If the exception does not trap, the result of the operation is NaN.
+-
+-`Division by Zero'
+-     This exception is raised when a finite nonzero number is divided
+-     by zero.  If no trap occurs the result is either +oo or -oo,
+-     depending on the signs of the operands.
+-
+-`Overflow'
+-     This exception is raised whenever the result cannot be represented
+-     as a finite value in the precision format of the destination.  If
+-     no trap occurs the result depends on the sign of the intermediate
+-     result and the current rounding mode (IEEE 754, section 7.3):
+-       1. Round to nearest carries all overflows to oo with the sign of
+-          the intermediate result.
+-
+-       2. Round toward 0 carries all overflows to the largest
+-          representable finite number with the sign of the intermediate
+-          result.
+-
+-       3. Round toward -oo carries positive overflows to the largest
+-          representable finite number and negative overflows to -oo.
+-
+-       4. Round toward oo carries negative overflows to the most
+-          negative representable finite number and positive overflows
+-          to oo.
+-
+-     Whenever the overflow exception is raised, the inexact exception
+-     is also raised.
+-
+-`Underflow'
+-     The underflow exception is raised when an intermediate result is
+-     too small to be calculated accurately, or if the operation's
+-     result rounded to the destination precision is too small to be
+-     normalized.
+-
+-     When no trap is installed for the underflow exception, underflow is
+-     signaled (via the underflow flag) only when both tininess and loss
+-     of accuracy have been detected.  If no trap handler is installed
+-     the operation continues with an imprecise small value, or zero if
+-     the destination precision cannot hold the small exact result.
+-
+-`Inexact'
+-     This exception is signalled if a rounded result is not exact (such
+-     as when calculating the square root of two) or a result overflows
+-     without an overflow trap.
+-
+-
+-File: libc.info,  Node: Infinity and NaN,  Next: Status bit operations,  Prev: FP Exceptions,  Up: Floating Point Errors
+-
+-Infinity and NaN
+-----------------
+-
+-   IEEE 754 floating point numbers can represent positive or negative
+-infinity, and "NaN" (not a number).  These three values arise from
+-calculations whose result is undefined or cannot be represented
+-accurately.  You can also deliberately set a floating-point variable to
+-any of them, which is sometimes useful.  Some examples of calculations
+-that produce infinity or NaN:
+-
+-     1/0 = oo
+-     log (0) = -oo
+-     sqrt (-1) = NaN
+-
+-   When a calculation produces any of these values, an exception also
+-occurs; see *Note FP Exceptions::.
+-
+-   The basic operations and math functions all accept infinity and NaN
+-and produce sensible output.  Infinities propagate through calculations
+-as one would expect: for example, 2 + oo = oo, 4/oo = 0, atan (oo) =
+-pi/2.  NaN, on the other hand, infects any calculation that involves
+-it.  Unless the calculation would produce the same result no matter
+-what real value replaced NaN, the result is NaN.
+-
+-   In comparison operations, positive infinity is larger than all values
+-except itself and NaN, and negative infinity is smaller than all values
+-except itself and NaN.  NaN is "unordered": it is not equal to, greater
+-than, or less than anything, *including itself*. `x == x' is false if
+-the value of `x' is NaN.  You can use this to test whether a value is
+-NaN or not, but the recommended way to test for NaN is with the `isnan'
+-function (*note Floating Point Classes::.).  In addition, `<', `>',
+-`<=', and `>=' will raise an exception when applied to NaNs.
+-
+-   `math.h' defines macros that allow you to explicitly set a variable
+-to infinity or NaN.
+-
+- - Macro: float INFINITY
+-     An expression representing positive infinity.  It is equal to the
+-     value produced  by mathematical operations like `1.0 / 0.0'.
+-     `-INFINITY' represents negative infinity.
+-
+-     You can test whether a floating-point value is infinite by
+-     comparing it to this macro.  However, this is not recommended; you
+-     should use the `isfinite' macro instead.  *Note Floating Point
+-     Classes::.
+-
+-     This macro was introduced in the ISO C 9X standard.
+-
+- - Macro: float NAN
+-     An expression representing a value which is "not a number".  This
+-     macro is a GNU extension, available only on machines that support
+-     the "not a number" value--that is to say, on all machines that
+-     support IEEE floating point.
+-
+-     You can use `#ifdef NAN' to test whether the machine supports NaN.
+-     (Of course, you must arrange for GNU extensions to be visible,
+-     such as by defining `_GNU_SOURCE', and then you must include
+-     `math.h'.)
+-
+-   IEEE 754 also allows for another unusual value: negative zero.  This
+-value is produced when you divide a positive number by negative
+-infinity, or when a negative result is smaller than the limits of
+-representation.  Negative zero behaves identically to zero in all
+-calculations, unless you explicitly test the sign bit with `signbit' or
+-`copysign'.
+-
+-
+-File: libc.info,  Node: Status bit operations,  Next: Math Error Reporting,  Prev: Infinity and NaN,  Up: Floating Point Errors
+-
+-Examining the FPU status word
+------------------------------
+-
+-   ISO C 9x defines functions to query and manipulate the
+-floating-point status word.  You can use these functions to check for
+-untrapped exceptions when it's convenient, rather than worrying about
+-them in the middle of a calculation.
+-
+-   These constants represent the various IEEE 754 exceptions.  Not all
+-FPUs report all the different exceptions.  Each constant is defined if
+-and only if the FPU you are compiling for supports that exception, so
+-you can test for FPU support with `#ifdef'.  They are defined in
+-`fenv.h'.
+-
+-`FE_INEXACT'
+-     The inexact exception.
+-
+-`FE_DIVBYZERO'
+-     The divide by zero exception.
+-
+-`FE_UNDERFLOW'
+-     The underflow exception.
+-
+-`FE_OVERFLOW'
+-     The overflow exception.
+-
+-`FE_INVALID'
+-     The invalid exception.
+-
+-   The macro `FE_ALL_EXCEPT' is the bitwise OR of all exception macros
+-which are supported by the FP implementation.
+-
+-   These functions allow you to clear exception flags, test for
+-exceptions, and save and restore the set of exceptions flagged.
+-
+- - Function: void feclearexcept (int EXCEPTS)
+-     This function clears all of the supported exception flags
+-     indicated by EXCEPTS.
+-
+- - Function: int fetestexcept (int EXCEPTS)
+-     Test whether the exception flags indicated by the parameter EXCEPT
+-     are currently set.  If any of them are, a nonzero value is returned
+-     which specifies which exceptions are set.  Otherwise the result is
+-     zero.
+-
+-   To understand these functions, imagine that the status word is an
+-integer variable named STATUS.  `feclearexcept' is then equivalent to
+-`status &= ~excepts' and `fetestexcept' is equivalent to `(status &
+-excepts)'.  The actual implementation may be very different, of course.
+-
+-   Exception flags are only cleared when the program explicitly
+-requests it, by calling `feclearexcept'.  If you want to check for
+-exceptions from a set of calculations, you should clear all the flags
+-first.  Here is a simple example of the way to use `fetestexcept':
+-
+-     {
+-       double f;
+-       int raised;
+-       feclearexcept (FE_ALL_EXCEPT);
+-       f = compute ();
+-       raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
+-       if (raised & FE_OVERFLOW) { /* ... */ }
+-       if (raised & FE_INVALID) { /* ... */ }
+-       /* ... */
+-     }
+-
+-   You cannot explicitly set bits in the status word.  You can, however,
+-save the entire status word and restore it later.  This is done with the
+-following functions:
+-
+- - Function: void fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)
+-     This function stores in the variable pointed to by FLAGP an
+-     implementation-defined value representing the current setting of
+-     the exception flags indicated by EXCEPTS.
+-
+- - Function: void fesetexceptflag (const fexcept_t *FLAGP, int
+-     EXCEPTS) This function restores the flags for the exceptions
+-     indicated by EXCEPTS to the values stored in the variable pointed
+-     to by FLAGP.
+-
+-   Note that the value stored in `fexcept_t' bears no resemblance to
+-the bit mask returned by `fetestexcept'.  The type may not even be an
+-integer.  Do not attempt to modify an `fexcept_t' variable.
+-
+-
+-File: libc.info,  Node: Math Error Reporting,  Prev: Status bit operations,  Up: Floating Point Errors
+-
+-Error Reporting by Mathematical Functions
+------------------------------------------
+-
+-   Many of the math functions are defined only over a subset of the
+-real or complex numbers.  Even if they are mathematically defined,
+-their result may be larger or smaller than the range representable by
+-their return type.  These are known as "domain errors", "overflows", and
+-"underflows", respectively.  Math functions do several things when one
+-of these errors occurs.  In this manual we will refer to the complete
+-response as "signalling" a domain error, overflow, or underflow.
+-
+-   When a math function suffers a domain error, it raises the invalid
+-exception and returns NaN.  It also sets ERRNO to `EDOM'; this is for
+-compatibility with old systems that do not support IEEE 754 exception
+-handling.  Likewise, when overflow occurs, math functions raise the
+-overflow exception and return oo or -oo as appropriate.  They also set
+-ERRNO to `ERANGE'.  When underflow occurs, the underflow exception is
+-raised, and zero (appropriately signed) is returned.  ERRNO may be set
+-to `ERANGE', but this is not guaranteed.
+-
+-   Some of the math functions are defined mathematically to result in a
+-complex value over parts of their domains.  The most familiar example of
+-this is taking the square root of a negative number.  The complex math
+-functions, such as `csqrt', will return the appropriate complex value
+-in this case.  The real-valued functions, such as `sqrt', will signal a
+-domain error.
+-
+-   Some older hardware does not support infinities.  On that hardware,
+-overflows instead return a particular very large number (usually the
+-largest representable number).  `math.h' defines macros you can use to
+-test for overflow on both old and new hardware.
+-
+- - Macro: double HUGE_VAL
+- - Macro: float HUGE_VALF
+- - Macro: long double HUGE_VALL
+-     An expression representing a particular very large number.  On
+-     machines that use IEEE 754 floating point format, `HUGE_VAL' is
+-     infinity.  On other machines, it's typically the largest positive
+-     number that can be represented.
+-
+-     Mathematical functions return the appropriately typed version of
+-     `HUGE_VAL' or `-HUGE_VAL' when the result is too large to be
+-     represented.
+-
+-
+-File: libc.info,  Node: Rounding,  Next: Control Functions,  Prev: Floating Point Errors,  Up: Arithmetic
+-
+-Rounding Modes
+-==============
+-
+-   Floating-point calculations are carried out internally with extra
+-precision, and then rounded to fit into the destination type.  This
+-ensures that results are as precise as the input data.  IEEE 754
+-defines four possible rounding modes:
+-
+-Round to nearest.
+-     This is the default mode.  It should be used unless there is a
+-     specific need for one of the others.  In this mode results are
+-     rounded to the nearest representable value.  If the result is
+-     midway between two representable values, the even representable is
+-     chosen. "Even" here means the lowest-order bit is zero.  This
+-     rounding mode prevents statistical bias and guarantees numeric
+-     stability: round-off errors in a lengthy calculation will remain
+-     smaller than half of `FLT_EPSILON'.
+-
+-Round toward plus Infinity.
+-     All results are rounded to the smallest representable value which
+-     is greater than the result.
+-
+-Round toward minus Infinity.
+-     All results are rounded to the largest representable value which
+-     is less than the result.
+-
+-Round toward zero.
+-     All results are rounded to the largest representable value whose
+-     magnitude is less than that of the result.  In other words, if the
+-     result is negative it is rounded up; if it is positive, it is
+-     rounded down.
+-
+-`fenv.h' defines constants which you can use to refer to the various
+-rounding modes.  Each one will be defined if and only if the FPU
+-supports the corresponding rounding mode.
+-
+-`FE_TONEAREST'
+-     Round to nearest.
+-
+-`FE_UPWARD'
+-     Round toward +oo.
+-
+-`FE_DOWNWARD'
+-     Round toward -oo.
+-
+-`FE_TOWARDZERO'
+-     Round toward zero.
+-
+-   Underflow is an unusual case.  Normally, IEEE 754 floating point
+-numbers are always normalized (*note Floating Point Concepts::.).
+-Numbers smaller than 2^r (where r is the minimum exponent,
+-`FLT_MIN_RADIX-1' for FLOAT) cannot be represented as normalized
+-numbers.  Rounding all such numbers to zero or 2^r would cause some
+-algorithms to fail at 0.  Therefore, they are left in denormalized
+-form.  That produces loss of precision, since some bits of the mantissa
+-are stolen to indicate the decimal point.
+-
+-   If a result is too small to be represented as a denormalized number,
+-it is rounded to zero.  However, the sign of the result is preserved; if
+-the calculation was negative, the result is "negative zero".  Negative
+-zero can also result from some operations on infinity, such as 4/-oo.
+-Negative zero behaves identically to zero except when the `copysign' or
+-`signbit' functions are used to check the sign bit directly.
+-
+-   At any time one of the above four rounding modes is selected.  You
+-can find out which one with this function:
+-
+- - Function: int fegetround (void)
+-     Returns the currently selected rounding mode, represented by one
+-     of the values of the defined rounding mode macros.
+-
+-To change the rounding mode, use this function:
+-
+- - Function: int fesetround (int ROUND)
+-     Changes the currently selected rounding mode to ROUND.  If ROUND
+-     does not correspond to one of the supported rounding modes nothing
+-     is changed.  `fesetround' returns a nonzero value if it changed
+-     the rounding mode, zero if the mode is not supported.
+-
+-   You should avoid changing the rounding mode if possible.  It can be
+-an expensive operation; also, some hardware requires you to compile your
+-program differently for it to work.  The resulting code may run slower.
+-See your compiler documentation for details.
+-
+-
+-File: libc.info,  Node: Control Functions,  Next: Arithmetic Functions,  Prev: Rounding,  Up: Arithmetic
+-
+-Floating-Point Control Functions
+-================================
+-
+-   IEEE 754 floating-point implementations allow the programmer to
+-decide whether traps will occur for each of the exceptions, by setting
+-bits in the "control word".  In C, traps result in the program
+-receiving the `SIGFPE' signal; see *Note Signal Handling::.
+-
+-   *Note:* IEEE 754 says that trap handlers are given details of the
+-exceptional situation, and can set the result value.  C signals do not
+-provide any mechanism to pass this information back and forth.
+-Trapping exceptions in C is therefore not very useful.
+-
+-   It is sometimes necessary to save the state of the floating-point
+-unit while you perform some calculation.  The library provides functions
+-which save and restore the exception flags, the set of exceptions that
+-generate traps, and the rounding mode.  This information is known as the
+-"floating-point environment".
+-
+-   The functions to save and restore the floating-point environment all
+-use a variable of type `fenv_t' to store information.  This type is
+-defined in `fenv.h'.  Its size and contents are implementation-defined.
+-You should not attempt to manipulate a variable of this type directly.
+-
+-   To save the state of the FPU, use one of these functions:
+-
+- - Function: void fegetenv (fenv_t *ENVP)
+-     Store the floating-point environment in the variable pointed to by
+-     ENVP.
+-
+- - Function: int feholdexcept (fenv_t *ENVP)
+-     Store the current floating-point environment in the object pointed
+-     to by ENVP.  Then clear all exception flags, and set the FPU to
+-     trap no exceptions.  Not all FPUs support trapping no exceptions;
+-     if `feholdexcept' cannot set this mode, it returns zero.  If it
+-     succeeds, it returns a nonzero value.
+-
+-   The functions which restore the floating-point environment can take
+-two kinds of arguments:
+-
+-   * Pointers to `fenv_t' objects, which were initialized previously by
+-     a call to `fegetenv' or `feholdexcept'.
+-
+-   * The special macro `FE_DFL_ENV' which represents the floating-point
+-     environment as it was available at program start.
+-
+-   * Implementation defined macros with names starting with `FE_'.
+-
+-     If possible, the GNU C Library defines a macro `FE_NOMASK_ENV'
+-     which represents an environment where every exception raised
+-     causes a trap to occur.  You can test for this macro using
+-     `#ifdef'.  It is only defined if `_GNU_SOURCE' is defined.
+-
+-     Some platforms might define other predefined environments.
+-
+-To set the floating-point environment, you can use either of these
+-functions:
+-
+- - Function: void fesetenv (const fenv_t *ENVP)
+-     Set the floating-point environment to that described by ENVP.
+-
+- - Function: void feupdateenv (const fenv_t *ENVP)
+-     Like `fesetenv', this function sets the floating-point environment
+-     to that described by ENVP.  However, if any exceptions were
+-     flagged in the status word before `feupdateenv' was called, they
+-     remain flagged after the call.  In other words, after `feupdateenv'
+-     is called, the status word is the bitwise OR of the previous
+-     status word and the one saved in ENVP.
+-
+-
+-File: libc.info,  Node: Arithmetic Functions,  Next: Complex Numbers,  Prev: Control Functions,  Up: Arithmetic
+-
+-Arithmetic Functions
+-====================
+-
+-   The C library provides functions to do basic operations on
+-floating-point numbers.  These include absolute value, maximum and
+-minimum, normalization, bit twiddling, rounding, and a few others.
+-
+-* Menu:
+-
+-* Absolute Value::              Absolute values of integers and floats.
+-* Normalization Functions::     Extracting exponents and putting them back.
+-* Rounding Functions::          Rounding floats to integers.
+-* Remainder Functions::         Remainders on division, precisely defined.
+-* FP Bit Twiddling::            Sign bit adjustment.  Adding epsilon.
+-* FP Comparison Functions::     Comparisons without risk of exceptions.
+-* Misc FP Arithmetic::          Max, min, positive difference, multiply-add.
+-
+-
+-File: libc.info,  Node: Absolute Value,  Next: Normalization Functions,  Up: Arithmetic Functions
+-
+-Absolute Value
+---------------
+-
+-   These functions are provided for obtaining the "absolute value" (or
+-"magnitude") of a number.  The absolute value of a real number X is X
+-if X is positive, -X if X is negative.  For a complex number Z, whose
+-real part is X and whose imaginary part is Y, the absolute value is
+-`sqrt (X*X + Y*Y)'.
+-
+-   Prototypes for `abs', `labs' and `llabs' are in `stdlib.h';
+-`imaxabs' is declared in `inttypes.h'; `fabs', `fabsf' and `fabsl' are
+-declared in `math.h'.  `cabs', `cabsf' and `cabsl' are declared in
+-`complex.h'.
+-
+- - Function: int abs (int NUMBER)
+- - Function: long int labs (long int NUMBER)
+- - Function: long long int llabs (long long int NUMBER)
+- - Function: intmax_t imaxabs (intmax_t NUMBER)
+-     These functions return the absolute value of NUMBER.
+-
+-     Most computers use a two's complement integer representation, in
+-     which the absolute value of `INT_MIN' (the smallest possible `int')
+-     cannot be represented; thus, `abs (INT_MIN)' is not defined.
+-
+-     `llabs' and `imaxdiv' are new to ISO C 9x.
+-
+- - Function: double fabs (double NUMBER)
+- - Function: float fabsf (float NUMBER)
+- - Function: long double fabsl (long double NUMBER)
+-     This function returns the absolute value of the floating-point
+-     number NUMBER.
+-
+- - Function: double cabs (complex double Z)
+- - Function: float cabsf (complex float Z)
+- - Function: long double cabsl (complex long double Z)
+-     These functions return the absolute  value of the complex number Z
+-     (*note Complex Numbers::.).  The absolute value of a complex
+-     number is:
+-
+-          sqrt (creal (Z) * creal (Z) + cimag (Z) * cimag (Z))
+-
+-     This function should always be used instead of the direct formula
+-     because it takes special care to avoid losing precision.  It may
+-     also take advantage of hardware support for this operation. See
+-     `hypot' in *Note Exponents and Logarithms::.
+-
+-
+-File: libc.info,  Node: Normalization Functions,  Next: Rounding Functions,  Prev: Absolute Value,  Up: Arithmetic Functions
+-
+-Normalization Functions
+------------------------
+-
+-   The functions described in this section are primarily provided as a
+-way to efficiently perform certain low-level manipulations on floating
+-point numbers that are represented internally using a binary radix; see
+-*Note Floating Point Concepts::.  These functions are required to have
+-equivalent behavior even if the representation does not use a radix of
+-2, but of course they are unlikely to be particularly efficient in
+-those cases.
+-
+-   All these functions are declared in `math.h'.
+-
+- - Function: double frexp (double VALUE, int *EXPONENT)
+- - Function: float frexpf (float VALUE, int *EXPONENT)
+- - Function: long double frexpl (long double VALUE, int *EXPONENT)
+-     These functions are used to split the number VALUE into a
+-     normalized fraction and an exponent.
+-
+-     If the argument VALUE is not zero, the return value is VALUE times
+-     a power of two, and is always in the range 1/2 (inclusive) to 1
+-     (exclusive).  The corresponding exponent is stored in `*EXPONENT';
+-     the return value multiplied by 2 raised to this exponent equals
+-     the original number VALUE.
+-
+-     For example, `frexp (12.8, &exponent)' returns `0.8' and stores
+-     `4' in `exponent'.
+-
+-     If VALUE is zero, then the return value is zero and zero is stored
+-     in `*EXPONENT'.
+-
+- - Function: double ldexp (double VALUE, int EXPONENT)
+- - Function: float ldexpf (float VALUE, int EXPONENT)
+- - Function: long double ldexpl (long double VALUE, int EXPONENT)
+-     These functions return the result of multiplying the floating-point
+-     number VALUE by 2 raised to the power EXPONENT.  (It can be used
+-     to reassemble floating-point numbers that were taken apart by
+-     `frexp'.)
+-
+-     For example, `ldexp (0.8, 4)' returns `12.8'.
+-
+-   The following functions, which come from BSD, provide facilities
+-equivalent to those of `ldexp' and `frexp'.
+-
+- - Function: double logb (double X)
+- - Function: float logbf (float X)
+- - Function: long double logbl (long double X)
+-     These functions return the integer part of the base-2 logarithm of
+-     X, an integer value represented in type `double'.  This is the
+-     highest integer power of `2' contained in X.  The sign of X is
+-     ignored.  For example, `logb (3.5)' is `1.0' and `logb (4.0)' is
+-     `2.0'.
+-
+-     When `2' raised to this power is divided into X, it gives a
+-     quotient between `1' (inclusive) and `2' (exclusive).
+-
+-     If X is zero, the return value is minus infinity if the machine
+-     supports infinities, and a very small number if it does not.  If X
+-     is infinity, the return value is infinity.
+-
+-     For finite X, the value returned by `logb' is one less than the
+-     value that `frexp' would store into `*EXPONENT'.
+-
+- - Function: double scalb (double VALUE, int EXPONENT)
+- - Function: float scalbf (float VALUE, int EXPONENT)
+- - Function: long double scalbl (long double VALUE, int EXPONENT)
+-     The `scalb' function is the BSD name for `ldexp'.
+-
+- - Function: long long int scalbn (double X, int n)
+- - Function: long long int scalbnf (float X, int n)
+- - Function: long long int scalbnl (long double X, int n)
+-     `scalbn' is identical to `scalb', except that the exponent N is an
+-     `int' instead of a floating-point number.
+-
+- - Function: long long int scalbln (double X, long int n)
+- - Function: long long int scalblnf (float X, long int n)
+- - Function: long long int scalblnl (long double X, long int n)
+-     `scalbln' is identical to `scalb', except that the exponent N is a
+-     `long int' instead of a floating-point number.
+-
+- - Function: long long int significand (double X)
+- - Function: long long int significandf (float X)
+- - Function: long long int significandl (long double X)
+-     `significand' returns the mantissa of X scaled to the range [1, 2).
+-     It is equivalent to `scalb (X, (double) -ilogb (X))'.
+-
+-     This function exists mainly for use in certain standardized tests
+-     of IEEE 754 conformance.
+-
+-
+-File: libc.info,  Node: Rounding Functions,  Next: Remainder Functions,  Prev: Normalization Functions,  Up: Arithmetic Functions
+-
+-Rounding Functions
+-------------------
+-
+-   The functions listed here perform operations such as rounding and
+-truncation of floating-point values. Some of these functions convert
+-floating point numbers to integer values.  They are all declared in
+-`math.h'.
+-
+-   You can also convert floating-point numbers to integers simply by
+-casting them to `int'.  This discards the fractional part, effectively
+-rounding towards zero.  However, this only works if the result can
+-actually be represented as an `int'--for very large numbers, this is
+-impossible.  The functions listed here return the result as a `double'
+-instead to get around this problem.
+-
+- - Function: double ceil (double X)
+- - Function: float ceilf (float X)
+- - Function: long double ceill (long double X)
+-     These functions round X upwards to the nearest integer, returning
+-     that value as a `double'.  Thus, `ceil (1.5)' is `2.0'.
+-
+- - Function: double floor (double X)
+- - Function: float floorf (float X)
+- - Function: long double floorl (long double X)
+-     These functions round X downwards to the nearest integer,
+-     returning that value as a `double'.  Thus, `floor (1.5)' is `1.0'
+-     and `floor (-1.5)' is `-2.0'.
+-
+- - Function: double trunc (double X)
+- - Function: float truncf (float X)
+- - Function: long double truncl (long double X)
+-     `trunc' is another name for `floor'
+-
+- - Function: double rint (double X)
+- - Function: float rintf (float X)
+- - Function: long double rintl (long double X)
+-     These functions round X to an integer value according to the
+-     current rounding mode.  *Note Floating Point Parameters::, for
+-     information about the various rounding modes.  The default
+-     rounding mode is to round to the nearest integer; some machines
+-     support other modes, but round-to-nearest is always used unless
+-     you explicitly select another.
+-
+-     If X was not initially an integer, these functions raise the
+-     inexact exception.
+-
+- - Function: double nearbyint (double X)
+- - Function: float nearbyintf (float X)
+- - Function: long double nearbyintl (long double X)
+-     These functions return the same value as the `rint' functions, but
+-     do not raise the inexact exception if X is not an integer.
+-
+- - Function: double round (double X)
+- - Function: float roundf (float X)
+- - Function: long double roundl (long double X)
+-     These functions are similar to `rint', but they round halfway
+-     cases away from zero instead of to the nearest even integer.
+-
+- - Function: long int lrint (double X)
+- - Function: long int lrintf (float X)
+- - Function: long int lrintl (long double X)
+-     These functions are just like `rint', but they return a `long int'
+-     instead of a floating-point number.
+-
+- - Function: long long int llrint (double X)
+- - Function: long long int llrintf (float X)
+- - Function: long long int llrintl (long double X)
+-     These functions are just like `rint', but they return a `long long
+-     int' instead of a floating-point number.
+-
+- - Function: long int lround (double X)
+- - Function: long int lroundf (float X)
+- - Function: long int lroundl (long double X)
+-     These functions are just like `round', but they return a `long
+-     int' instead of a floating-point number.
+-
+- - Function: long long int llround (double X)
+- - Function: long long int llroundf (float X)
+- - Function: long long int llroundl (long double X)
+-     These functions are just like `round', but they return a `long
+-     long int' instead of a floating-point number.
+-
+- - Function: double modf (double VALUE, double *INTEGER-PART)
+- - Function: float modff (float VALUE, float *INTEGER-PART)
+- - Function: long double modfl (long double VALUE, long double
+-          *INTEGER-PART)
+-     These functions break the argument VALUE into an integer part and a
+-     fractional part (between `-1' and `1', exclusive).  Their sum
+-     equals VALUE.  Each of the parts has the same sign as VALUE, and
+-     the integer part is always rounded toward zero.
+-
+-     `modf' stores the integer part in `*INTEGER-PART', and returns the
+-     fractional part.  For example, `modf (2.5, &intpart)' returns
+-     `0.5' and stores `2.0' into `intpart'.
+-
+-
+-File: libc.info,  Node: Remainder Functions,  Next: FP Bit Twiddling,  Prev: Rounding Functions,  Up: Arithmetic Functions
+-
+-Remainder Functions
+--------------------
+-
+-   The functions in this section compute the remainder on division of
+-two floating-point numbers.  Each is a little different; pick the one
+-that suits your problem.
+-
+- - Function: double fmod (double NUMERATOR, double DENOMINATOR)
+- - Function: float fmodf (float NUMERATOR, float DENOMINATOR)
+- - Function: long double fmodl (long double NUMERATOR, long double
+-          DENOMINATOR)
+-     These functions compute the remainder from the division of
+-     NUMERATOR by DENOMINATOR.  Specifically, the return value is
+-     `NUMERATOR - N * DENOMINATOR', where N is the quotient of
+-     NUMERATOR divided by DENOMINATOR, rounded towards zero to an
+-     integer.  Thus, `fmod (6.5, 2.3)' returns `1.9', which is `6.5'
+-     minus `4.6'.
+-
+-     The result has the same sign as the NUMERATOR and has magnitude
+-     less than the magnitude of the DENOMINATOR.
+-
+-     If DENOMINATOR is zero, `fmod' signals a domain error.
+-
+- - Function: double drem (double NUMERATOR, double DENOMINATOR)
+- - Function: float dremf (float NUMERATOR, float DENOMINATOR)
+- - Function: long double dreml (long double NUMERATOR, long double
+-          DENOMINATOR)
+-     These functions are like `fmod' except that they rounds the
+-     internal quotient N to the nearest integer instead of towards zero
+-     to an integer.  For example, `drem (6.5, 2.3)' returns `-0.4',
+-     which is `6.5' minus `6.9'.
+-
+-     The absolute value of the result is less than or equal to half the
+-     absolute value of the DENOMINATOR.  The difference between `fmod
+-     (NUMERATOR, DENOMINATOR)' and `drem (NUMERATOR, DENOMINATOR)' is
+-     always either DENOMINATOR, minus DENOMINATOR, or zero.
+-
+-     If DENOMINATOR is zero, `drem' signals a domain error.
+-
+- - Function: double remainder (double NUMERATOR, double DENOMINATOR)
+- - Function: float remainderf (float NUMERATOR, float DENOMINATOR)
+- - Function: long double remainderl (long double NUMERATOR, long double
+-          DENOMINATOR)
+-     This function is another name for `drem'.
+-
+-
+-File: libc.info,  Node: FP Bit Twiddling,  Next: FP Comparison Functions,  Prev: Remainder Functions,  Up: Arithmetic Functions
+-
+-Setting and modifying single bits of FP values
+-----------------------------------------------
+-
+-   There are some operations that are too complicated or expensive to
+-perform by hand on floating-point numbers.  ISO C 9x defines functions
+-to do these operations, which mostly involve changing single bits.
+-
+- - Function: double copysign (double X, double Y)
+- - Function: float copysignf (float X, float Y)
+- - Function: long double copysignl (long double X, long double Y)
+-     These functions return X but with the sign of Y.  They work even
+-     if X or Y are NaN or zero.  Both of these can carry a sign
+-     (although not all implementations support it) and this is one of
+-     the few operations that can tell the difference.
+-
+-     `copysign' never raises an exception.
+-
+-     This function is defined in IEC 559 (and the appendix with
+-     recommended functions in IEEE 754/IEEE 854).
+-
+- - Function: int signbit (*float-type* X)
+-     `signbit' is a generic macro which can work on all floating-point
+-     types.  It returns a nonzero value if the value of X has its sign
+-     bit set.
+-
+-     This is not the same as `x < 0.0', because IEEE 754 floating point
+-     allows zero to be signed.  The comparison `-0.0 < 0.0' is false,
+-     but `signbit (-0.0)' will return a nonzero value.
+-
+- - Function: double nextafter (double X, double Y)
+- - Function: float nextafterf (float X, float Y)
+- - Function: long double nextafterl (long double X, long double Y)
+-     The `nextafter' function returns the next representable neighbor of
+-     X in the direction towards Y.  The size of the step between X and
+-     the result depends on the type of the result.  If X = Y the
+-     function simply returns X.  If either value is `NaN', `NaN' is
+-     returned.  Otherwise a value corresponding to the value of the
+-     least significant bit in the mantissa is added or subtracted,
+-     depending on the direction.  `nextafter' will signal overflow or
+-     underflow if the result goes outside of the range of normalized
+-     numbers.
+-
+-     This function is defined in IEC 559 (and the appendix with
+-     recommended functions in IEEE 754/IEEE 854).
+-
+- - Function: double nexttoward (double X, long double Y)
+- - Function: float nexttowardf (float X, long double Y)
+- - Function: long double nexttowardl (long double X, long double Y)
+-     These functions are identical to the corresponding versions of
+-     `nextafter' except that their second argument is a `long double'.
+-
+- - Function: double nan (const char *TAGP)
+- - Function: float nanf (const char *TAGP)
+- - Function: long double nanl (const char *TAGP)
+-     The `nan' function returns a representation of NaN, provided that
+-     NaN is supported by the target platform.  `nan
+-     ("N-CHAR-SEQUENCE")' is equivalent to `strtod
+-     ("NAN(N-CHAR-SEQUENCE)")'.
+-
+-     The argument TAGP is used in an unspecified manner.  On IEEE 754
+-     systems, there are many representations of NaN, and TAGP selects
+-     one.  On other systems it may do nothing.
+-
+-
+-File: libc.info,  Node: FP Comparison Functions,  Next: Misc FP Arithmetic,  Prev: FP Bit Twiddling,  Up: Arithmetic Functions
+-
+-Floating-Point Comparison Functions
+------------------------------------
+-
+-   The standard C comparison operators provoke exceptions when one or
+-other of the operands is NaN.  For example,
+-
+-     int v = a < 1.0;
+-
+-will raise an exception if A is NaN.  (This does *not* happen with `=='
+-and `!='; those merely return false and true, respectively, when NaN is
+-examined.)  Frequently this exception is undesirable.  ISO C 9x
+-therefore defines comparison functions that do not raise exceptions
+-when NaN is examined.  All of the functions are implemented as macros
+-which allow their arguments to be of any floating-point type.  The
+-macros are guaranteed to evaluate their arguments only once.
+-
+- - Macro: int isgreater (*real-floating* X, *real-floating* Y)
+-     This macro determines whether the argument X is greater than Y.
+-     It is equivalent to `(X) > (Y)', but no exception is raised if X
+-     or Y are NaN.
+-
+- - Macro: int isgreaterequal (*real-floating* X, *real-floating* Y)
+-     This macro determines whether the argument X is greater than or
+-     equal to Y.  It is equivalent to `(X) >= (Y)', but no exception is
+-     raised if X or Y are NaN.
+-
+- - Macro: int isless (*real-floating* X, *real-floating* Y)
+-     This macro determines whether the argument X is less than Y.  It
+-     is equivalent to `(X) < (Y)', but no exception is raised if X or Y
+-     are NaN.
+-
+- - Macro: int islessequal (*real-floating* X, *real-floating* Y)
+-     This macro determines whether the argument X is less than or equal
+-     to Y.  It is equivalent to `(X) <= (Y)', but no exception is
+-     raised if X or Y are NaN.
+-
+- - Macro: int islessgreater (*real-floating* X, *real-floating* Y)
+-     This macro determines whether the argument X is less or greater
+-     than Y.  It is equivalent to `(X) < (Y) || (X) > (Y)' (although it
+-     only evaluates X and Y once), but no exception is raised if X or Y
+-     are NaN.
+-
+-     This macro is not equivalent to `X != Y', because that expression
+-     is true if X or Y are NaN.
+-
+- - Macro: int isunordered (*real-floating* X, *real-floating* Y)
+-     This macro determines whether its arguments are unordered.  In
+-     other words, it is true if X or Y are NaN, and false otherwise.
+-
+-   Not all machines provide hardware support for these operations.  On
+-machines that don't, the macros can be very slow.  Therefore, you should
+-not use these functions when NaN is not a concern.
+-
+-   *Note:* There are no macros `isequal' or `isunequal'.  They are
+-unnecessary, because the `==' and `!=' operators do *not* throw an
+-exception if one or both of the operands are NaN.
+-
+-
+-File: libc.info,  Node: Misc FP Arithmetic,  Prev: FP Comparison Functions,  Up: Arithmetic Functions
+-
+-Miscellaneous FP arithmetic functions
+--------------------------------------
+-
+-   The functions in this section perform miscellaneous but common
+-operations that are awkward to express with C operators.  On some
+-processors these functions can use special machine instructions to
+-perform these operations faster than the equivalent C code.
+-
+- - Function: double fmin (double X, double Y)
+- - Function: float fminf (float X, float Y)
+- - Function: long double fminl (long double X, long double Y)
+-     The `fmin' function returns the lesser of the two values X and Y.
+-     It is similar to the expression
+-          ((x) < (y) ? (x) : (y))
+-     except that X and Y are only evaluated once.
+-
+-     If an argument is NaN, the other argument is returned.  If both
+-     arguments are NaN, NaN is returned.
+-
+- - Function: double fmax (double X, double Y)
+- - Function: float fmaxf (float X, float Y)
+- - Function: long double fmaxl (long double X, long double Y)
+-     The `fmax' function returns the greater of the two values X and Y.
+-
+-     If an argument is NaN, the other argument is returned.  If both
+-     arguments are NaN, NaN is returned.
+-
+- - Function: double fdim (double X, double Y)
+- - Function: float fdimf (float X, float Y)
+- - Function: long double fdiml (long double X, long double Y)
+-     The `fdim' function returns the positive difference between X and
+-     Y.  The positive difference is X - Y if X is greater than Y, and 0
+-     otherwise.
+-
+-     If X, Y, or both are NaN, NaN is returned.
+-
+- - Function: double fma (double X, double Y, double Z)
+- - Function: float fmaf (float X, float Y, float Z)
+- - Function: long double fmal (long double X, long double Y, long
+-          double Z)
+-     The `fma' function performs floating-point multiply-add.  This is
+-     the operation (X * Y) + Z, but the intermediate result is not
+-     rounded to the destination type.  This can sometimes improve the
+-     precision of a calculation.
+-
+-     This function was introduced because some processors have a special
+-     instruction to perform multiply-add.  The C compiler cannot use it
+-     directly, because the expression `x*y + z' is defined to round the
+-     intermediate result.  `fma' lets you choose when you want to round
+-     only once.
+-
+-     On processors which do not implement multiply-add in hardware,
+-     `fma' can be very slow since it must avoid intermediate rounding.
+-     `math.h' defines the symbols `FP_FAST_FMA', `FP_FAST_FMAF', and
+-     `FP_FAST_FMAL' when the corresponding version of `fma' is no
+-     slower than the expression `x*y + z'.  In the GNU C library, this
+-     always means the operation is implemented in hardware.
+-
+-
+-File: libc.info,  Node: Complex Numbers,  Next: Operations on Complex,  Prev: Arithmetic Functions,  Up: Arithmetic
+-
+-Complex Numbers
+-===============
+-
+-   ISO C 9x introduces support for complex numbers in C.  This is done
+-with a new type qualifier, `complex'.  It is a keyword if and only if
+-`complex.h' has been included.  There are three complex types,
+-corresponding to the three real types:  `float complex', `double
+-complex', and `long double complex'.
+-
+-   To construct complex numbers you need a way to indicate the imaginary
+-part of a number.  There is no standard notation for an imaginary
+-floating point constant.  Instead, `complex.h' defines two macros that
+-can be used to create complex numbers.
+-
+- - Macro: const float complex _Complex_I
+-     This macro is a representation of the complex number "0+1i".
+-     Multiplying a real floating-point value by `_Complex_I' gives a
+-     complex number whose value is purely imaginary.  You can use this
+-     to construct complex constants:
+-
+-          3.0 + 4.0i = `3.0 + 4.0 * _Complex_I'
+-
+-     Note that `_Complex_I * _Complex_I' has the value `-1', but the
+-     type of that value is `complex'.
+-
+-`_Complex_I' is a bit of a mouthful.  `complex.h' also defines a
+-shorter name for the same constant.
+-
+- - Macro: const float complex I
+-     This macro has exactly the same value as `_Complex_I'.  Most of the
+-     time it is preferable.  However, it causes problems if you want to
+-     use the identifier `I' for something else.  You can safely write
+-
+-          #include <complex.h>
+-          #undef I
+-
+-     if you need `I' for your own purposes.  (In that case we recommend
+-     you also define some other short name for `_Complex_I', such as
+-     `J'.)
+-
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-29 glibc-2.1.3/manual/libc.info-29
+--- ../glibc-2.1.3/manual/libc.info-29	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-29	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1129 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Operations on Complex,  Next: Integer Division,  Prev: Complex Numbers,  Up: Arithmetic
+-
+-Projections, Conjugates, and Decomposing of Complex Numbers
+-===========================================================
+-
+-   ISO C 9x also defines functions that perform basic operations on
+-complex numbers, such as decomposition and conjugation.  The prototypes
+-for all these functions are in `complex.h'.  All functions are
+-available in three variants, one for each of the three complex types.
+-
+- - Function: double creal (complex double Z)
+- - Function: float crealf (complex float Z)
+- - Function: long double creall (complex long double Z)
+-     These functions return the real part of the complex number Z.
+-
+- - Function: double cimag (complex double Z)
+- - Function: float cimagf (complex float Z)
+- - Function: long double cimagl (complex long double Z)
+-     These functions return the imaginary part of the complex number Z.
+-
+- - Function: complex double conj (complex double Z)
+- - Function: complex float conjf (complex float Z)
+- - Function: complex long double conjl (complex long double Z)
+-     These functions return the conjugate value of the complex number
+-     Z.  The conjugate of a complex number has the same real part and a
+-     negated imaginary part.  In other words, `conj(a + bi) = a + -bi'.
+-
+- - Function: double carg (complex double Z)
+- - Function: float cargf (complex float Z)
+- - Function: long double cargl (complex long double Z)
+-     These functions return the argument of the complex number Z.  The
+-     argument of a complex number is the angle in the complex plane
+-     between the positive real axis and a line passing through zero and
+-     the number.  This angle is measured in the usual fashion and
+-     ranges from 0 to 2pi.
+-
+-     `carg' has a branch cut along the positive real axis.
+-
+- - Function: complex double cproj (complex double Z)
+- - Function: complex float cprojf (complex float Z)
+- - Function: complex long double cprojl (complex long double Z)
+-     These functions return the projection of the complex value Z onto
+-     the Riemann sphere.  Values with a infinite imaginary part are
+-     projected to positive infinity on the real axis, even if the real
+-     part is NaN.  If the real part is infinite, the result is
+-     equivalent to
+-
+-          INFINITY + I * copysign (0.0, cimag (z))
+-
+-
+-File: libc.info,  Node: Integer Division,  Next: Parsing of Numbers,  Prev: Operations on Complex,  Up: Arithmetic
+-
+-Integer Division
+-================
+-
+-   This section describes functions for performing integer division.
+-These functions are redundant when GNU CC is used, because in GNU C the
+-`/' operator always rounds towards zero.  But in other C
+-implementations, `/' may round differently with negative arguments.
+-`div' and `ldiv' are useful because they specify how to round the
+-quotient: towards zero.  The remainder has the same sign as the
+-numerator.
+-
+-   These functions are specified to return a result R such that the
+-value `R.quot*DENOMINATOR + R.rem' equals NUMERATOR.
+-
+-   To use these facilities, you should include the header file
+-`stdlib.h' in your program.
+-
+- - Data Type: div_t
+-     This is a structure type used to hold the result returned by the
+-     `div' function.  It has the following members:
+-
+-    `int quot'
+-          The quotient from the division.
+-
+-    `int rem'
+-          The remainder from the division.
+-
+- - Function: div_t div (int NUMERATOR, int DENOMINATOR)
+-     This function `div' computes the quotient and remainder from the
+-     division of NUMERATOR by DENOMINATOR, returning the result in a
+-     structure of type `div_t'.
+-
+-     If the result cannot be represented (as in a division by zero), the
+-     behavior is undefined.
+-
+-     Here is an example, albeit not a very useful one.
+-
+-          div_t result;
+-          result = div (20, -6);
+-
+-     Now `result.quot' is `-3' and `result.rem' is `2'.
+-
+- - Data Type: ldiv_t
+-     This is a structure type used to hold the result returned by the
+-     `ldiv' function.  It has the following members:
+-
+-    `long int quot'
+-          The quotient from the division.
+-
+-    `long int rem'
+-          The remainder from the division.
+-
+-     (This is identical to `div_t' except that the components are of
+-     type `long int' rather than `int'.)
+-
+- - Function: ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)
+-     The `ldiv' function is similar to `div', except that the arguments
+-     are of type `long int' and the result is returned as a structure
+-     of type `ldiv_t'.
+-
+- - Data Type: lldiv_t
+-     This is a structure type used to hold the result returned by the
+-     `lldiv' function.  It has the following members:
+-
+-    `long long int quot'
+-          The quotient from the division.
+-
+-    `long long int rem'
+-          The remainder from the division.
+-
+-     (This is identical to `div_t' except that the components are of
+-     type `long long int' rather than `int'.)
+-
+- - Function: lldiv_t lldiv (long long int NUMERATOR, long long int
+-          DENOMINATOR)
+-     The `lldiv' function is like the `div' function, but the arguments
+-     are of type `long long int' and the result is returned as a
+-     structure of type `lldiv_t'.
+-
+-     The `lldiv' function was added in ISO C 9x.
+-
+- - Data Type: imaxdiv_t
+-     This is a structure type used to hold the result returned by the
+-     `imaxdiv' function.  It has the following members:
+-
+-    `intmax_t quot'
+-          The quotient from the division.
+-
+-    `intmax_t rem'
+-          The remainder from the division.
+-
+-     (This is identical to `div_t' except that the components are of
+-     type `intmax_t' rather than `int'.)
+-
+- - Function: imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t
+-          DENOMINATOR)
+-     The `imaxdiv' function is like the `div' function, but the
+-     arguments are of type `intmax_t' and the result is returned as a
+-     structure of type `imaxdiv_t'.
+-
+-     The `imaxdiv' function was added in ISO C 9x.
+-
+-
+-File: libc.info,  Node: Parsing of Numbers,  Next: System V Number Conversion,  Prev: Integer Division,  Up: Arithmetic
+-
+-Parsing of Numbers
+-==================
+-
+-   This section describes functions for "reading" integer and
+-floating-point numbers from a string.  It may be more convenient in some
+-cases to use `sscanf' or one of the related functions; see *Note
+-Formatted Input::.  But often you can make a program more robust by
+-finding the tokens in the string by hand, then converting the numbers
+-one by one.
+-
+-* Menu:
+-
+-* Parsing of Integers::         Functions for conversion of integer values.
+-* Parsing of Floats::           Functions for conversion of floating-point
+-				 values.
+-
+-
+-File: libc.info,  Node: Parsing of Integers,  Next: Parsing of Floats,  Up: Parsing of Numbers
+-
+-Parsing of Integers
+--------------------
+-
+-   These functions are declared in `stdlib.h'.
+-
+- - Function: long int strtol (const char *STRING, char **TAILPTR, int
+-          BASE)
+-     The `strtol' ("string-to-long") function converts the initial part
+-     of STRING to a signed integer, which is returned as a value of
+-     type `long int'.
+-
+-     This function attempts to decompose STRING as follows:
+-
+-        * A (possibly empty) sequence of whitespace characters.  Which
+-          characters are whitespace is determined by the `isspace'
+-          function (*note Classification of Characters::.).  These are
+-          discarded.
+-
+-        * An optional plus or minus sign (`+' or `-').
+-
+-        * A nonempty sequence of digits in the radix specified by BASE.
+-
+-          If BASE is zero, decimal radix is assumed unless the series of
+-          digits begins with `0' (specifying octal radix), or `0x' or
+-          `0X' (specifying hexadecimal radix); in other words, the same
+-          syntax used for integer constants in C.
+-
+-          Otherwise BASE must have a value between `2' and `35'.  If
+-          BASE is `16', the digits may optionally be preceded by `0x'
+-          or `0X'.  If base has no legal value the value returned is
+-          `0l' and the global variable `errno' is set to `EINVAL'.
+-
+-        * Any remaining characters in the string.  If TAILPTR is not a
+-          null pointer, `strtol' stores a pointer to this tail in
+-          `*TAILPTR'.
+-
+-     If the string is empty, contains only whitespace, or does not
+-     contain an initial substring that has the expected syntax for an
+-     integer in the specified BASE, no conversion is performed.  In
+-     this case, `strtol' returns a value of zero and the value stored in
+-     `*TAILPTR' is the value of STRING.
+-
+-     In a locale other than the standard `"C"' locale, this function
+-     may recognize additional implementation-dependent syntax.
+-
+-     If the string has valid syntax for an integer but the value is not
+-     representable because of overflow, `strtol' returns either
+-     `LONG_MAX' or `LONG_MIN' (*note Range of Type::.), as appropriate
+-     for the sign of the value.  It also sets `errno' to `ERANGE' to
+-     indicate there was overflow.
+-
+-     You should not check for errors by examining the return value of
+-     `strtol', because the string might be a valid representation of
+-     `0l', `LONG_MAX', or `LONG_MIN'.  Instead, check whether TAILPTR
+-     points to what you expect after the number (e.g. `'\0'' if the
+-     string should end after the number).  You also need to clear ERRNO
+-     before the call and check it afterward, in case there was overflow.
+-
+-     There is an example at the end of this section.
+-
+- - Function: unsigned long int strtoul (const char *STRING, char
+-          **TAILPTR, int BASE)
+-     The `strtoul' ("string-to-unsigned-long") function is like
+-     `strtol' except it returns an `unsigned long int' value.  If the
+-     number has a leading `-' sign, the return value is negated.  The
+-     syntax is the same as described above for `strtol'.  The value
+-     returned on overflow is `ULONG_MAX' (*note Range of Type::.).
+-
+-     `strtoul' sets ERRNO to `EINVAL' if BASE is out of range, or
+-     `ERANGE' on overflow.
+-
+- - Function: long long int strtoll (const char *STRING, char **TAILPTR,
+-          int BASE)
+-     The `strtoll' function is like `strtol' except that it returns a
+-     `long long int' value, and accepts numbers with a correspondingly
+-     larger range.
+-
+-     If the string has valid syntax for an integer but the value is not
+-     representable because of overflow, `strtoll' returns either
+-     `LONG_LONG_MAX' or `LONG_LONG_MIN' (*note Range of Type::.), as
+-     appropriate for the sign of the value.  It also sets `errno' to
+-     `ERANGE' to indicate there was overflow.
+-
+-     The `strtoll' function was introduced in ISO C 9x.
+-
+- - Function: long long int strtoq (const char *STRING, char **TAILPTR,
+-          int BASE)
+-     `strtoq' ("string-to-quad-word") is the BSD name for `strtoll'.
+-
+- - Function: unsigned long long int strtoull (const char *STRING, char
+-          **TAILPTR, int BASE)
+-     The `strtoull' function is like `strtoul' except that it returns
+-     an `unsigned long long int'.  The value returned on overflow is
+-     `ULONG_LONG_MAX' (*note Range of Type::.).
+-
+-     The `strtoull' function was introduced in ISO C 9x.
+-
+- - Function: unsigned long long int strtouq (const char *STRING, char
+-          **TAILPTR, int BASE)
+-     `strtouq' is the BSD name for `strtoull'.
+-
+- - Function: long int atol (const char *STRING)
+-     This function is similar to the `strtol' function with a BASE
+-     argument of `10', except that it need not detect overflow errors.
+-     The `atol' function is provided mostly for compatibility with
+-     existing code; using `strtol' is more robust.
+-
+- - Function: int atoi (const char *STRING)
+-     This function is like `atol', except that it returns an `int'.
+-     The `atoi' function is also considered obsolete; use `strtol'
+-     instead.
+-
+- - Function: long long int atoll (const char *STRING)
+-     This function is similar to `atol', except it returns a `long long
+-     int'.
+-
+-     The `atoll' function was introduced in ISO C 9x.  It too is
+-     obsolete (despite having just been added); use `strtoll' instead.
+-
+-   Some locales specify a printed syntax for numbers other than the one
+-that these functions understand.  If you need to read numbers formatted
+-in some other locale, you can use the `strtoX_l' functions.  Each of
+-the `strtoX' functions has a counterpart with `_l' added to its name.
+-The `_l' counterparts take an additional argument: a pointer to an
+-`locale_t' structure, which describes how the numbers to be read are
+-formatted.  *Note Locales::.
+-
+-   *Portability Note:* These functions are all GNU extensions.  You can
+-also use `scanf' or its relatives, which have the `'' flag for parsing
+-numeric input according to the current locale (*note Numeric Input
+-Conversions::.).  This feature is standard.
+-
+-   Here is a function which parses a string as a sequence of integers
+-and returns the sum of them:
+-
+-     int
+-     sum_ints_from_string (char *string)
+-     {
+-       int sum = 0;
+-     
+-       while (1) {
+-         char *tail;
+-         int next;
+-     
+-         /* Skip whitespace by hand, to detect the end.  */
+-         while (isspace (*string)) string++;
+-         if (*string == 0)
+-           break;
+-     
+-         /* There is more nonwhitespace,  */
+-         /* so it ought to be another number.  */
+-         errno = 0;
+-         /* Parse it.  */
+-         next = strtol (string, &tail, 0);
+-         /* Add it in, if not overflow.  */
+-         if (errno)
+-           printf ("Overflow\n");
+-         else
+-           sum += next;
+-         /* Advance past it.  */
+-         string = tail;
+-       }
+-     
+-       return sum;
+-     }
+-
+-
+-File: libc.info,  Node: Parsing of Floats,  Prev: Parsing of Integers,  Up: Parsing of Numbers
+-
+-Parsing of Floats
+------------------
+-
+-   These functions are declared in `stdlib.h'.
+-
+- - Function: double strtod (const char *STRING, char **TAILPTR)
+-     The `strtod' ("string-to-double") function converts the initial
+-     part of STRING to a floating-point number, which is returned as a
+-     value of type `double'.
+-
+-     This function attempts to decompose STRING as follows:
+-
+-        * A (possibly empty) sequence of whitespace characters.  Which
+-          characters are whitespace is determined by the `isspace'
+-          function (*note Classification of Characters::.).  These are
+-          discarded.
+-
+-        * An optional plus or minus sign (`+' or `-').
+-
+-        * A nonempty sequence of digits optionally containing a
+-          decimal-point character--normally `.', but it depends on the
+-          locale (*note General Numeric::.).
+-
+-        * An optional exponent part, consisting of a character `e' or
+-          `E', an optional sign, and a sequence of digits.
+-
+-        * Any remaining characters in the string.  If TAILPTR is not a
+-          null pointer, a pointer to this tail of the string is stored
+-          in `*TAILPTR'.
+-
+-     If the string is empty, contains only whitespace, or does not
+-     contain an initial substring that has the expected syntax for a
+-     floating-point number, no conversion is performed.  In this case,
+-     `strtod' returns a value of zero and the value returned in
+-     `*TAILPTR' is the value of STRING.
+-
+-     In a locale other than the standard `"C"' or `"POSIX"' locales,
+-     this function may recognize additional locale-dependent syntax.
+-
+-     If the string has valid syntax for a floating-point number but the
+-     value is outside the range of a `double', `strtod' will signal
+-     overflow or underflow as described in *Note Math Error Reporting::.
+-
+-     `strtod' recognizes four special input strings.  The strings
+-     `"inf"' and `"infinity"' are converted to oo, or to the largest
+-     representable value if the floating-point format doesn't support
+-     infinities.  You can prepend a `"+"' or `"-"' to specify the sign.
+-     Case is ignored when scanning these strings.
+-
+-     The strings `"nan"' and `"nan(CHARS...)"' are converted to NaN.
+-     Again, case is ignored.  If CHARS... are provided, they are used
+-     in some unspecified fashion to select a particular representation
+-     of NaN (there can be several).
+-
+-     Since zero is a valid result as well as the value returned on
+-     error, you should check for errors in the same way as for
+-     `strtol', by examining ERRNO and TAILPTR.
+-
+- - Function: float strtof (const char *STRING, char **TAILPTR)
+- - Function: long double strtold (const char *STRING, char **TAILPTR)
+-     These functions are analogous to `strtod', but return `float' and
+-     `long double' values respectively.  They report errors in the same
+-     way as `strtod'.  `strtof' can be substantially faster than
+-     `strtod', but has less precision; conversely, `strtold' can be
+-     much slower but has more precision (on systems where `long double'
+-     is a separate type).
+-
+-     These functions are GNU extensions.
+-
+- - Function: double atof (const char *STRING)
+-     This function is similar to the `strtod' function, except that it
+-     need not detect overflow and underflow errors.  The `atof' function
+-     is provided mostly for compatibility with existing code; using
+-     `strtod' is more robust.
+-
+-   The GNU C library also provides `_l' versions of thse functions,
+-which take an additional argument, the locale to use in conversion.
+-*Note Parsing of Integers::.
+-
+-
+-File: libc.info,  Node: System V Number Conversion,  Prev: Parsing of Numbers,  Up: Arithmetic
+-
+-Old-fashioned System V number-to-string functions
+-=================================================
+-
+-   The old System V C library provided three functions to convert
+-numbers to strings, with unusual and hard-to-use semantics.  The GNU C
+-library also provides these functions and some natural extensions.
+-
+-   These functions are only available in glibc and on systems descended
+-from AT&T Unix.  Therefore, unless these functions do precisely what you
+-need, it is better to use `sprintf', which is standard.
+-
+-   All these functions are defined in `stdlib.h'.
+-
+- - Function: char * ecvt (double VALUE, int NDIGIT, int *DECPT, int
+-          *NEG)
+-     The function `ecvt' converts the floating-point number VALUE to a
+-     string with at most NDIGIT decimal digits.  The returned string
+-     contains no decimal point or sign. The first digit of the string
+-     is non-zero (unless VALUE is actually zero) and the last digit is
+-     rounded to nearest.  `*DECPT' is set to the index in the string of
+-     the first digit after the decimal point.  `*NEG' is set to a
+-     nonzero value if VALUE is negative, zero otherwise.
+-
+-     If NDIGIT decimal digits would exceed the precision of a `double'
+-     it is reduced to a system-specific value.
+-
+-     The returned string is statically allocated and overwritten by
+-     each call to `ecvt'.
+-
+-     If VALUE is zero, it is implementation defined whether `*DECPT' is
+-     `0' or `1'.
+-
+-     For example: `ecvt (12.3, 5, &d, &n)' returns `"12300"' and sets D
+-     to `2' and N to `0'.
+-
+- - Function: char * fcvt (double VALUE, int NDIGIT, int *DECPT, int
+-          *NEG)
+-     The function `fcvt' is like `ecvt', but NDIGIT specifies the
+-     number of digits after the decimal point.  If NDIGIT is less than
+-     zero, VALUE is rounded to the NDIGIT+1'th place to the left of the
+-     decimal point.  For example, if NDIGIT is `-1', VALUE will be
+-     rounded to the nearest 10.  If NDIGIT is negative and larger than
+-     the number of digits to the left of the decimal point in VALUE,
+-     VALUE will be rounded to one significant digit.
+-
+-     If NDIGIT decimal digits would exceed the precision of a `double'
+-     it is reduced to a system-specific value.
+-
+-     The returned string is statically allocated and overwritten by
+-     each call to `fcvt'.
+-
+- - Function: char * gcvt (double VALUE, int NDIGIT, char *BUF)
+-     `gcvt' is functionally equivalent to `sprintf(buf, "%*g", ndigit,
+-     value'.  It is provided only for compatibility's sake.  It returns
+-     BUF.
+-
+-     If NDIGIT decimal digits would exceed the precision of a `double'
+-     it is reduced to a system-specific value.
+-
+-   As extensions, the GNU C library provides versions of these three
+-functions that take `long double' arguments.
+-
+- - Function: char * qecvt (long double VALUE, int NDIGIT, int *DECPT,
+-          int *NEG)
+-     This function is equivalent to `ecvt' except that it takes a `long
+-     double' for the first parameter and that NDIGIT is restricted by
+-     the precision of a `long double'.
+-
+- - Function: char * qfcvt (long double VALUE, int NDIGIT, int *DECPT,
+-          int *NEG)
+-     This function is equivalent to `fcvt' except that it takes a `long
+-     double' for the first parameter and that NDIGIT is restricted by
+-     the precision of a `long double'.
+-
+- - Function: char * qgcvt (long double VALUE, int NDIGIT, char *BUF)
+-     This function is equivalent to `gcvt' except that it takes a `long
+-     double' for the first parameter and that NDIGIT is restricted by
+-     the precision of a `long double'.
+-
+-   The `ecvt' and `fcvt' functions, and their `long double'
+-equivalents, all return a string located in a static buffer which is
+-overwritten by the next call to the function.  The GNU C library
+-provides another set of extended functions which write the converted
+-string into a user-supplied buffer.  These have the conventional `_r'
+-suffix.
+-
+-   `gcvt_r' is not necessary, because `gcvt' already uses a
+-user-supplied buffer.
+-
+- - Function: char * ecvt_r (double VALUE, int NDIGIT, int *DECPT, int
+-          *NEG, char *BUF, size_t LEN)
+-     The `ecvt_r' function is the same as `ecvt', except that it places
+-     its result into the user-specified buffer pointed to by BUF, with
+-     length LEN.
+-
+-     This function is a GNU extension.
+-
+- - Function: char * fcvt_r (double VALUE, int NDIGIT, int *DECPT, int
+-          *NEG, char *BUF, size_t LEN)
+-     The `fcvt_r' function is the same as `fcvt', except that it places
+-     its result into the user-specified buffer pointed to by BUF, with
+-     length LEN.
+-
+-     This function is a GNU extension.
+-
+- - Function: char * qecvt_r (long double VALUE, int NDIGIT, int *DECPT,
+-          int *NEG, char *BUF, size_t LEN)
+-     The `qecvt_r' function is the same as `qecvt', except that it
+-     places its result into the user-specified buffer pointed to by
+-     BUF, with length LEN.
+-
+-     This function is a GNU extension.
+-
+- - Function: char * qfcvt_r (long double VALUE, int NDIGIT, int *DECPT,
+-          int *NEG, char *BUF, size_t LEN)
+-     The `qfcvt_r' function is the same as `qfcvt', except that it
+-     places its result into the user-specified buffer pointed to by
+-     BUF, with length LEN.
+-
+-     This function is a GNU extension.
+-
+-
+-File: libc.info,  Node: Date and Time,  Next: Non-Local Exits,  Prev: Arithmetic,  Up: Top
+-
+-Date and Time
+-*************
+-
+-   This chapter describes functions for manipulating dates and times,
+-including functions for determining what the current time is and
+-conversion between different time representations.
+-
+-   The time functions fall into three main categories:
+-
+-   * Functions for measuring elapsed CPU time are discussed in *Note
+-     Processor Time::.
+-
+-   * Functions for measuring absolute clock or calendar time are
+-     discussed in *Note Calendar Time::.
+-
+-   * Functions for setting alarms and timers are discussed in *Note
+-     Setting an Alarm::.
+-
+-* Menu:
+-
+-* Processor Time::              Measures processor time used by a program.
+-* Calendar Time::               Manipulation of "real" dates and times.
+-* Precision Time::              Manipulation and monitoring of high accuracy
+-                                  time.
+-* Setting an Alarm::            Sending a signal after a specified time.
+-* Sleeping::                    Waiting for a period of time.
+-* Resource Usage::		Measuring various resources used.
+-* Limits on Resources::		Specifying limits on resource usage.
+-* Priority::			Reading or setting process run priority.
+-
+-
+-File: libc.info,  Node: Processor Time,  Next: Calendar Time,  Up: Date and Time
+-
+-Processor Time
+-==============
+-
+-   If you're trying to optimize your program or measure its efficiency,
+-it's very useful to be able to know how much "processor time" or "CPU
+-time" it has used at any given point.  Processor time is different from
+-actual wall clock time because it doesn't include any time spent waiting
+-for I/O or when some other process is running.  Processor time is
+-represented by the data type `clock_t', and is given as a number of
+-"clock ticks" relative to an arbitrary base time marking the beginning
+-of a single program invocation.
+-
+-* Menu:
+-
+-* Basic CPU Time::              The `clock' function.
+-* Detailed CPU Time::           The `times' function.
+-
+-
+-File: libc.info,  Node: Basic CPU Time,  Next: Detailed CPU Time,  Up: Processor Time
+-
+-Basic CPU Time Inquiry
+-----------------------
+-
+-   To get the elapsed CPU time used by a process, you can use the
+-`clock' function.  This facility is declared in the header file
+-`time.h'.
+-
+-   In typical usage, you call the `clock' function at the beginning and
+-end of the interval you want to time, subtract the values, and then
+-divide by `CLOCKS_PER_SEC' (the number of clock ticks per second), like
+-this:
+-
+-     #include <time.h>
+-     
+-     clock_t start, end;
+-     double elapsed;
+-     
+-     start = clock();
+-     ... /* Do the work. */
+-     end = clock();
+-     elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
+-
+-   Different computers and operating systems vary wildly in how they
+-keep track of processor time.  It's common for the internal processor
+-clock to have a resolution somewhere between hundredth and millionth of
+-a second.
+-
+-   In the GNU system, `clock_t' is equivalent to `long int' and
+-`CLOCKS_PER_SEC' is an integer value.  But in other systems, both
+-`clock_t' and the type of the macro `CLOCKS_PER_SEC' can be either
+-integer or floating-point types.  Casting processor time values to
+-`double', as in the example above, makes sure that operations such as
+-arithmetic and printing work properly and consistently no matter what
+-the underlying representation is.
+-
+-   Note that the clock can wrap around.  On a 32bit system with
+-`CLOCKS_PER_SEC' set to one million a wrap around happens after around
+-36 minutes.
+-
+- - Macro: int CLOCKS_PER_SEC
+-     The value of this macro is the number of clock ticks per second
+-     measured by the `clock' function.  POSIX requires that this value
+-     is one million independend of the actual resolution.
+-
+- - Macro: int CLK_TCK
+-     This is an obsolete name for `CLOCKS_PER_SEC'.
+-
+- - Data Type: clock_t
+-     This is the type of the value returned by the `clock' function.
+-     Values of type `clock_t' are in units of clock ticks.
+-
+- - Function: clock_t clock (void)
+-     This function returns the elapsed processor time.  The base time is
+-     arbitrary but doesn't change within a single process.  If the
+-     processor time is not available or cannot be represented, `clock'
+-     returns the value `(clock_t)(-1)'.
+-
+-
+-File: libc.info,  Node: Detailed CPU Time,  Prev: Basic CPU Time,  Up: Processor Time
+-
+-Detailed Elapsed CPU Time Inquiry
+----------------------------------
+-
+-   The `times' function returns more detailed information about elapsed
+-processor time in a `struct tms' object.  You should include the header
+-file `sys/times.h' to use this facility.
+-
+- - Data Type: struct tms
+-     The `tms' structure is used to return information about process
+-     times.  It contains at least the following members:
+-
+-    `clock_t tms_utime'
+-          This is the CPU time used in executing the instructions of
+-          the calling process.
+-
+-    `clock_t tms_stime'
+-          This is the CPU time used by the system on behalf of the
+-          calling process.
+-
+-    `clock_t tms_cutime'
+-          This is the sum of the `tms_utime' values and the `tms_cutime'
+-          values of all terminated child processes of the calling
+-          process, whose status has been reported to the parent process
+-          by `wait' or `waitpid'; see *Note Process Completion::.  In
+-          other words, it represents the total CPU time used in
+-          executing the instructions of all the terminated child
+-          processes of the calling process, excluding child processes
+-          which have not yet been reported by `wait' or `waitpid'.
+-
+-    `clock_t tms_cstime'
+-          This is similar to `tms_cutime', but represents the total CPU
+-          time used by the system on behalf of all the terminated child
+-          processes of the calling process.
+-
+-     All of the times are given in clock ticks.  These are absolute
+-     values; in a newly created process, they are all zero.  *Note
+-     Creating a Process::.
+-
+- - Function: clock_t times (struct tms *BUFFER)
+-     The `times' function stores the processor time information for the
+-     calling process in BUFFER.
+-
+-     The return value is the same as the value of `clock()': the elapsed
+-     real time relative to an arbitrary base.  The base is a constant
+-     within a particular process, and typically represents the time
+-     since system start-up.  A value of `(clock_t)(-1)' is returned to
+-     indicate failure.
+-
+-   *Portability Note:* The `clock' function described in *Note Basic
+-CPU Time::, is specified by the ISO C standard.  The `times' function
+-is a feature of POSIX.1.  In the GNU system, the value returned by the
+-`clock' function is equivalent to the sum of the `tms_utime' and
+-`tms_stime' fields returned by `times'.
+-
+-
+-File: libc.info,  Node: Calendar Time,  Next: Precision Time,  Prev: Processor Time,  Up: Date and Time
+-
+-Calendar Time
+-=============
+-
+-   This section describes facilities for keeping track of dates and
+-times according to the Gregorian calendar.
+-
+-   There are three representations for date and time information:
+-
+-   * "Calendar time" (the `time_t' data type) is a compact
+-     representation, typically giving the number of seconds elapsed
+-     since some implementation-specific base time.
+-
+-   * There is also a "high-resolution time" representation (the `struct
+-     timeval' data type) that includes fractions of a second.  Use this
+-     time representation instead of ordinary calendar time when you
+-     need greater precision.
+-
+-   * "Local time" or "broken-down time" (the `struct tm' data type)
+-     represents the date and time as a set of components specifying the
+-     year, month, and so on, for a specific time zone.  This time
+-     representation is usually used in conjunction with formatting date
+-     and time values.
+-
+-* Menu:
+-
+-* Simple Calendar Time::        Facilities for manipulating calendar time.
+-* High-Resolution Calendar::    A time representation with greater precision.
+-* Broken-down Time::            Facilities for manipulating local time.
+-* Formatting Date and Time::    Converting times to strings.
+-* Parsing Date and Time::       Convert textual time and date information back
+-                                 into broken-down time values.
+-* TZ Variable::                 How users specify the time zone.
+-* Time Zone Functions::         Functions to examine or specify the time zone.
+-* Time Functions Example::      An example program showing use of some of
+-				 the time functions.
+-
+-
+-File: libc.info,  Node: Simple Calendar Time,  Next: High-Resolution Calendar,  Up: Calendar Time
+-
+-Simple Calendar Time
+---------------------
+-
+-   This section describes the `time_t' data type for representing
+-calendar time, and the functions which operate on calendar time objects.
+-These facilities are declared in the header file `time.h'.
+-
+- - Data Type: time_t
+-     This is the data type used to represent calendar time.  When
+-     interpreted as an absolute time value, it represents the number of
+-     seconds elapsed since 00:00:00 on January 1, 1970, Coordinated
+-     Universal Time.  (This date is sometimes referred to as the
+-     "epoch".)  POSIX requires that this count ignore leap seconds, but
+-     on some hosts this count includes leap seconds if you set `TZ' to
+-     certain values (*note TZ Variable::.).
+-
+-     In the GNU C library, `time_t' is equivalent to `long int'.  In
+-     other systems, `time_t' might be either an integer or
+-     floating-point type.
+-
+- - Function: double difftime (time_t TIME1, time_t TIME0)
+-     The `difftime' function returns the number of seconds elapsed
+-     between time TIME1 and time TIME0, as a value of type `double'.
+-     The difference ignores leap seconds unless leap second support is
+-     enabled.
+-
+-     In the GNU system, you can simply subtract `time_t' values.  But on
+-     other systems, the `time_t' data type might use some other encoding
+-     where subtraction doesn't work directly.
+-
+- - Function: time_t time (time_t *RESULT)
+-     The `time' function returns the current time as a value of type
+-     `time_t'.  If the argument RESULT is not a null pointer, the time
+-     value is also stored in `*RESULT'.  If the calendar time is not
+-     available, the value `(time_t)(-1)' is returned.
+-
+-
+-File: libc.info,  Node: High-Resolution Calendar,  Next: Broken-down Time,  Prev: Simple Calendar Time,  Up: Calendar Time
+-
+-High-Resolution Calendar
+-------------------------
+-
+-   The `time_t' data type used to represent calendar times has a
+-resolution of only one second.  Some applications need more precision.
+-
+-   So, the GNU C library also contains functions which are capable of
+-representing calendar times to a higher resolution than one second.  The
+-functions and the associated data types described in this section are
+-declared in `sys/time.h'.
+-
+- - Data Type: struct timeval
+-     The `struct timeval' structure represents a calendar time.  It has
+-     the following members:
+-
+-    `long int tv_sec'
+-          This represents the number of seconds since the epoch.  It is
+-          equivalent to a normal `time_t' value.
+-
+-    `long int tv_usec'
+-          This is the fractional second value, represented as the
+-          number of microseconds.
+-
+-          Some times struct timeval values are used for time intervals.
+-          Then the `tv_sec' member is the number of seconds in the
+-          interval, and `tv_usec' is the number of additional
+-          microseconds.
+-
+- - Data Type: struct timezone
+-     The `struct timezone' structure is used to hold minimal information
+-     about the local time zone.  It has the following members:
+-
+-    `int tz_minuteswest'
+-          This is the number of minutes west of UTC.
+-
+-    `int tz_dsttime'
+-          If nonzero, daylight saving time applies during some part of
+-          the year.
+-
+-     The `struct timezone' type is obsolete and should never be used.
+-     Instead, use the facilities described in *Note Time Zone
+-     Functions::.
+-
+-   It is often necessary to subtract two values of type
+-`struct timeval'.  Here is the best way to do this.  It works even on
+-some peculiar operating systems where the `tv_sec' member has an
+-unsigned type.
+-
+-     /* Subtract the `struct timeval' values X and Y,
+-        storing the result in RESULT.
+-        Return 1 if the difference is negative, otherwise 0.  */
+-     
+-     int
+-     timeval_subtract (result, x, y)
+-          struct timeval *result, *x, *y;
+-     {
+-       /* Perform the carry for the later subtraction by updating Y. */
+-       if (x->tv_usec < y->tv_usec) {
+-         int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
+-         y->tv_usec -= 1000000 * nsec;
+-         y->tv_sec += nsec;
+-       }
+-       if (x->tv_usec - y->tv_usec > 1000000) {
+-         int nsec = (x->tv_usec - y->tv_usec) / 1000000;
+-         y->tv_usec += 1000000 * nsec;
+-         y->tv_sec -= nsec;
+-       }
+-     
+-       /* Compute the time remaining to wait.
+-          `tv_usec' is certainly positive. */
+-       result->tv_sec = x->tv_sec - y->tv_sec;
+-       result->tv_usec = x->tv_usec - y->tv_usec;
+-     
+-       /* Return 1 if result is negative. */
+-       return x->tv_sec < y->tv_sec;
+-     }
+-
+- - Function: int gettimeofday (struct timeval *TP, struct timezone *TZP)
+-     The `gettimeofday' function returns the current date and time in
+-     the `struct timeval' structure indicated by TP.  Information about
+-     the time zone is returned in the structure pointed at TZP.  If the
+-     TZP argument is a null pointer, time zone information is ignored.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition is defined for this function:
+-
+-    `ENOSYS'
+-          The operating system does not support getting time zone
+-          information, and TZP is not a null pointer.  The GNU
+-          operating system does not support using `struct timezone' to
+-          represent time zone information; that is an obsolete feature
+-          of 4.3 BSD.  Instead, use the facilities described in *Note
+-          Time Zone Functions::.
+-
+- - Function: int settimeofday (const struct timeval *TP, const struct
+-          timezone *TZP)
+-     The `settimeofday' function sets the current date and time
+-     according to the arguments.  As for `gettimeofday', time zone
+-     information is ignored if TZP is a null pointer.
+-
+-     You must be a privileged user in order to use `settimeofday'.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EPERM'
+-          This process cannot set the time because it is not privileged.
+-
+-    `ENOSYS'
+-          The operating system does not support setting time zone
+-          information, and TZP is not a null pointer.
+-
+- - Function: int adjtime (const struct timeval *DELTA, struct timeval
+-          *OLDDELTA)
+-     This function speeds up or slows down the system clock in order to
+-     make gradual adjustments in the current time.  This ensures that
+-     the time reported by the system clock is always monotonically
+-     increasing, which might not happen if you simply set the current
+-     time.
+-
+-     The DELTA argument specifies a relative adjustment to be made to
+-     the current time.  If negative, the system clock is slowed down
+-     for a while until it has lost this much time.  If positive, the
+-     system clock is speeded up for a while.
+-
+-     If the OLDDELTA argument is not a null pointer, the `adjtime'
+-     function returns information about any previous time adjustment
+-     that has not yet completed.
+-
+-     This function is typically used to synchronize the clocks of
+-     computers in a local network.  You must be a privileged user to
+-     use it.  The return value is `0' on success and `-1' on failure.
+-     The following `errno' error condition is defined for this function:
+-
+-    `EPERM'
+-          You do not have privilege to set the time.
+-
+-   *Portability Note:*  The `gettimeofday', `settimeofday', and
+-`adjtime' functions are derived from BSD.
+-
+-
+-File: libc.info,  Node: Broken-down Time,  Next: Formatting Date and Time,  Prev: High-Resolution Calendar,  Up: Calendar Time
+-
+-Broken-down Time
+-----------------
+-
+-   Calendar time is represented as a number of seconds.  This is
+-convenient for calculation, but has no resemblance to the way people
+-normally represent dates and times.  By contrast, "broken-down time" is
+-a binary representation separated into year, month, day, and so on.
+-Broken down time values are not useful for calculations, but they are
+-useful for printing human readable time.
+-
+-   A broken-down time value is always relative to a choice of local time
+-zone, and it also indicates which time zone was used.
+-
+-   The symbols in this section are declared in the header file `time.h'.
+-
+- - Data Type: struct tm
+-     This is the data type used to represent a broken-down time.  The
+-     structure contains at least the following members, which can
+-     appear in any order:
+-
+-    `int tm_sec'
+-          This is the number of seconds after the minute, normally in
+-          the range `0' through `59'.  (The actual upper limit is `60',
+-          to allow for leap seconds if leap second support is
+-          available.)
+-
+-    `int tm_min'
+-          This is the number of minutes after the hour, in the range
+-          `0' through `59'.
+-
+-    `int tm_hour'
+-          This is the number of hours past midnight, in the range `0'
+-          through `23'.
+-
+-    `int tm_mday'
+-          This is the day of the month, in the range `1' through `31'.
+-
+-    `int tm_mon'
+-          This is the number of months since January, in the range `0'
+-          through `11'.
+-
+-    `int tm_year'
+-          This is the number of years since `1900'.
+-
+-    `int tm_wday'
+-          This is the number of days since Sunday, in the range `0'
+-          through `6'.
+-
+-    `int tm_yday'
+-          This is the number of days since January 1, in the range `0'
+-          through `365'.
+-
+-    `int tm_isdst'
+-          This is a flag that indicates whether Daylight Saving Time is
+-          (or was, or will be) in effect at the time described.  The
+-          value is positive if Daylight Saving Time is in effect, zero
+-          if it is not, and negative if the information is not
+-          available.
+-
+-    `long int tm_gmtoff'
+-          This field describes the time zone that was used to compute
+-          this broken-down time value, including any adjustment for
+-          daylight saving; it is the number of seconds that you must
+-          add to UTC to get local time.  You can also think of this as
+-          the number of seconds east of UTC.  For example, for U.S.
+-          Eastern Standard Time, the value is `-5*60*60'.  The
+-          `tm_gmtoff' field is derived from BSD and is a GNU library
+-          extension; it is not visible in a strict ISO C environment.
+-
+-    `const char *tm_zone'
+-          This field is the name for the time zone that was used to
+-          compute this broken-down time value.  Like `tm_gmtoff', this
+-          field is a BSD and GNU extension, and is not visible in a
+-          strict ISO C environment.
+-
+- - Function: struct tm * localtime (const time_t *TIME)
+-     The `localtime' function converts the calendar time pointed to by
+-     TIME to broken-down time representation, expressed relative to the
+-     user's specified time zone.
+-
+-     The return value is a pointer to a static broken-down time
+-     structure, which might be overwritten by subsequent calls to
+-     `ctime', `gmtime', or `localtime'.  (But no other library function
+-     overwrites the contents of this object.)
+-
+-     The return value is the null pointer if TIME cannot be represented
+-     as a broken-down time; typically this is because the year cannot
+-     fit into an `int'.
+-
+-     Calling `localtime' has one other effect: it sets the variable
+-     `tzname' with information about the current time zone.  *Note Time
+-     Zone Functions::.
+-
+-   Using the `localtime' function is a big problem in multi-threaded
+-programs.  The result is returned in a static buffer and this is used in
+-all threads.  POSIX.1c introduced a varient of this function.
+-
+- - Function: struct tm * localtime_r (const time_t *TIME, struct tm
+-          *RESULTP)
+-     The `localtime_r' function works just like the `localtime'
+-     function.  It takes a pointer to a variable containing the
+-     calendar time and converts it to the broken-down time format.
+-
+-     But the result is not placed in a static buffer.  Instead it is
+-     placed in the object of type `struct tm' to which the parameter
+-     RESULTP points.
+-
+-     If the conversion is successful the function returns a pointer to
+-     the object the result was written into, i.e., it returns RESULTP.
+-
+- - Function: struct tm * gmtime (const time_t *TIME)
+-     This function is similar to `localtime', except that the
+-     broken-down time is expressed as Coordinated Universal Time
+-     (UTC)--that is, as Greenwich Mean Time (GMT)--rather than relative
+-     to the local time zone.
+-
+-     Recall that calendar times are *always* expressed in coordinated
+-     universal time.
+-
+-   As for the `localtime' function we have the problem that the result
+-is placed in a static variable.  POSIX.1c also provides a replacement
+-for `gmtime'.
+-
+- - Function: struct tm * gmtime_r (const time_t *TIME, struct tm
+-          *RESULTP)
+-     This function is similar to `localtime_r', except that it converts
+-     just like `gmtime' the given time as Coordinated Universal Time.
+-
+-     If the conversion is successful the function returns a pointer to
+-     the object the result was written into, i.e., it returns RESULTP.
+-
+- - Function: time_t mktime (struct tm *BROKENTIME)
+-     The `mktime' function is used to convert a broken-down time
+-     structure to a calendar time representation.  It also "normalizes"
+-     the contents of the broken-down time structure, by filling in the
+-     day of week and day of year based on the other date and time
+-     components.
+-
+-     The `mktime' function ignores the specified contents of the
+-     `tm_wday' and `tm_yday' members of the broken-down time structure.
+-     It uses the values of the other components to compute the
+-     calendar time; it's permissible for these components to have
+-     unnormalized values outside of their normal ranges.  The last
+-     thing that `mktime' does is adjust the components of the BROKENTIME
+-     structure (including the `tm_wday' and `tm_yday').
+-
+-     If the specified broken-down time cannot be represented as a
+-     calendar time, `mktime' returns a value of `(time_t)(-1)' and does
+-     not modify the contents of BROKENTIME.
+-
+-     Calling `mktime' also sets the variable `tzname' with information
+-     about the current time zone.  *Note Time Zone Functions::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-3 glibc-2.1.3/manual/libc.info-3
+--- ../glibc-2.1.3/manual/libc.info-3	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-3	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1292 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Error Codes,  Next: Error Messages,  Prev: Checking for Errors,  Up: Error Reporting
+-
+-Error Codes
+-===========
+-
+-   The error code macros are defined in the header file `errno.h'.  All
+-of them expand into integer constant values.  Some of these error codes
+-can't occur on the GNU system, but they can occur using the GNU library
+-on other systems.
+-
+- - Macro: int EPERM
+-     Operation not permitted; only the owner of the file (or other
+-     resource) or processes with special privileges can perform the
+-     operation.
+-
+- - Macro: int ENOENT
+-     No such file or directory.  This is a "file doesn't exist" error
+-     for ordinary files that are referenced in contexts where they are
+-     expected to already exist.
+-
+- - Macro: int ESRCH
+-     No process matches the specified process ID.
+-
+- - Macro: int EINTR
+-     Interrupted function call; an asynchronous signal occurred and
+-     prevented completion of the call.  When this happens, you should
+-     try the call again.
+-
+-     You can choose to have functions resume after a signal that is
+-     handled, rather than failing with `EINTR'; see *Note Interrupted
+-     Primitives::.
+-
+- - Macro: int EIO
+-     Input/output error; usually used for physical read or write errors.
+-
+- - Macro: int ENXIO
+-     No such device or address.  The system tried to use the device
+-     represented by a file you specified, and it couldn't find the
+-     device.  This can mean that the device file was installed
+-     incorrectly, or that the physical device is missing or not
+-     correctly attached to the computer.
+-
+- - Macro: int E2BIG
+-     Argument list too long; used when the arguments passed to a new
+-     program being executed with one of the `exec' functions (*note
+-     Executing a File::.) occupy too much memory space.  This condition
+-     never arises in the GNU system.
+-
+- - Macro: int ENOEXEC
+-     Invalid executable file format.  This condition is detected by the
+-     `exec' functions; see *Note Executing a File::.
+-
+- - Macro: int EBADF
+-     Bad file descriptor; for example, I/O on a descriptor that has been
+-     closed or reading from a descriptor open only for writing (or vice
+-     versa).
+-
+- - Macro: int ECHILD
+-     There are no child processes.  This error happens on operations
+-     that are supposed to manipulate child processes, when there aren't
+-     any processes to manipulate.
+-
+- - Macro: int EDEADLK
+-     Deadlock avoided; allocating a system resource would have resulted
+-     in a deadlock situation.  The system does not guarantee that it
+-     will notice all such situations.  This error means you got lucky
+-     and the system noticed; it might just hang.  *Note File Locks::,
+-     for an example.
+-
+- - Macro: int ENOMEM
+-     No memory available.  The system cannot allocate more virtual
+-     memory because its capacity is full.
+-
+- - Macro: int EACCES
+-     Permission denied; the file permissions do not allow the attempted
+-     operation.
+-
+- - Macro: int EFAULT
+-     Bad address; an invalid pointer was detected.  In the GNU system,
+-     this error never happens; you get a signal instead.
+-
+- - Macro: int ENOTBLK
+-     A file that isn't a block special file was given in a situation
+-     that requires one.  For example, trying to mount an ordinary file
+-     as a file system in Unix gives this error.
+-
+- - Macro: int EBUSY
+-     Resource busy; a system resource that can't be shared is already
+-     in use.  For example, if you try to delete a file that is the root
+-     of a currently mounted filesystem, you get this error.
+-
+- - Macro: int EEXIST
+-     File exists; an existing file was specified in a context where it
+-     only makes sense to specify a new file.
+-
+- - Macro: int EXDEV
+-     An attempt to make an improper link across file systems was
+-     detected.  This happens not only when you use `link' (*note Hard
+-     Links::.) but also when you rename a file with `rename' (*note
+-     Renaming Files::.).
+-
+- - Macro: int ENODEV
+-     The wrong type of device was given to a function that expects a
+-     particular sort of device.
+-
+- - Macro: int ENOTDIR
+-     A file that isn't a directory was specified when a directory is
+-     required.
+-
+- - Macro: int EISDIR
+-     File is a directory; you cannot open a directory for writing, or
+-     create or remove hard links to it.
+-
+- - Macro: int EINVAL
+-     Invalid argument.  This is used to indicate various kinds of
+-     problems with passing the wrong argument to a library function.
+-
+- - Macro: int EMFILE
+-     The current process has too many files open and can't open any
+-     more.  Duplicate descriptors do count toward this limit.
+-
+-     In BSD and GNU, the number of open files is controlled by a
+-     resource limit that can usually be increased.  If you get this
+-     error, you might want to increase the `RLIMIT_NOFILE' limit or
+-     make it unlimited; *note Limits on Resources::..
+-
+- - Macro: int ENFILE
+-     There are too many distinct file openings in the entire system.
+-     Note that any number of linked channels count as just one file
+-     opening; see *Note Linked Channels::.  This error never occurs in
+-     the GNU system.
+-
+- - Macro: int ENOTTY
+-     Inappropriate I/O control operation, such as trying to set terminal
+-     modes on an ordinary file.
+-
+- - Macro: int ETXTBSY
+-     An attempt to execute a file that is currently open for writing, or
+-     write to a file that is currently being executed.  Often using a
+-     debugger to run a program is considered having it open for writing
+-     and will cause this error.  (The name stands for "text file
+-     busy".)  This is not an error in the GNU system; the text is
+-     copied as necessary.
+-
+- - Macro: int EFBIG
+-     File too big; the size of a file would be larger than allowed by
+-     the system.
+-
+- - Macro: int ENOSPC
+-     No space left on device; write operation on a file failed because
+-     the disk is full.
+-
+- - Macro: int ESPIPE
+-     Invalid seek operation (such as on a pipe).
+-
+- - Macro: int EROFS
+-     An attempt was made to modify something on a read-only file system.
+-
+- - Macro: int EMLINK
+-     Too many links; the link count of a single file would become too
+-     large.  `rename' can cause this error if the file being renamed
+-     already has as many links as it can take (*note Renaming Files::.).
+-
+- - Macro: int EPIPE
+-     Broken pipe; there is no process reading from the other end of a
+-     pipe.  Every library function that returns this error code also
+-     generates a `SIGPIPE' signal; this signal terminates the program
+-     if not handled or blocked.  Thus, your program will never actually
+-     see `EPIPE' unless it has handled or blocked `SIGPIPE'.
+-
+- - Macro: int EDOM
+-     Domain error; used by mathematical functions when an argument
+-     value does not fall into the domain over which the function is
+-     defined.
+-
+- - Macro: int ERANGE
+-     Range error; used by mathematical functions when the result value
+-     is not representable because of overflow or underflow.
+-
+- - Macro: int EAGAIN
+-     Resource temporarily unavailable; the call might work if you try
+-     again later.  The macro `EWOULDBLOCK' is another name for `EAGAIN';
+-     they are always the same in the GNU C library.
+-
+-     This error can happen in a few different situations:
+-
+-        * An operation that would block was attempted on an object that
+-          has non-blocking mode selected.  Trying the same operation
+-          again will block until some external condition makes it
+-          possible to read, write, or connect (whatever the operation).
+-          You can use `select' to find out when the operation will be
+-          possible; *note Waiting for I/O::..
+-
+-          *Portability Note:* In many older Unix systems, this condition
+-          was indicated by `EWOULDBLOCK', which was a distinct error
+-          code different from `EAGAIN'.  To make your program portable,
+-          you should check for both codes and treat them the same.
+-
+-        * A temporary resource shortage made an operation impossible.
+-          `fork' can return this error.  It indicates that the shortage
+-          is expected to pass, so your program can try the call again
+-          later and it may succeed.  It is probably a good idea to
+-          delay for a few seconds before trying it again, to allow time
+-          for other processes to release scarce resources.  Such
+-          shortages are usually fairly serious and affect the whole
+-          system, so usually an interactive program should report the
+-          error to the user and return to its command loop.
+-
+- - Macro: int EWOULDBLOCK
+-     In the GNU C library, this is another name for `EAGAIN' (above).
+-     The values are always the same, on every operating system.
+-
+-     C libraries in many older Unix systems have `EWOULDBLOCK' as a
+-     separate error code.
+-
+- - Macro: int EINPROGRESS
+-     An operation that cannot complete immediately was initiated on an
+-     object that has non-blocking mode selected.  Some functions that
+-     must always block (such as `connect'; *note Connecting::.) never
+-     return `EAGAIN'.  Instead, they return `EINPROGRESS' to indicate
+-     that the operation has begun and will take some time.  Attempts to
+-     manipulate the object before the call completes return `EALREADY'.
+-     You can use the `select' function to find out when the pending
+-     operation has completed; *note Waiting for I/O::..
+-
+- - Macro: int EALREADY
+-     An operation is already in progress on an object that has
+-     non-blocking mode selected.
+-
+- - Macro: int ENOTSOCK
+-     A file that isn't a socket was specified when a socket is required.
+-
+- - Macro: int EMSGSIZE
+-     The size of a message sent on a socket was larger than the
+-     supported maximum size.
+-
+- - Macro: int EPROTOTYPE
+-     The socket type does not support the requested communications
+-     protocol.
+-
+- - Macro: int ENOPROTOOPT
+-     You specified a socket option that doesn't make sense for the
+-     particular protocol being used by the socket.  *Note Socket
+-     Options::.
+-
+- - Macro: int EPROTONOSUPPORT
+-     The socket domain does not support the requested communications
+-     protocol (perhaps because the requested protocol is completely
+-     invalid).  *Note Creating a Socket::.
+-
+- - Macro: int ESOCKTNOSUPPORT
+-     The socket type is not supported.
+-
+- - Macro: int EOPNOTSUPP
+-     The operation you requested is not supported.  Some socket
+-     functions don't make sense for all types of sockets, and others
+-     may not be implemented for all communications protocols.  In the
+-     GNU system, this error can happen for many calls when the object
+-     does not support the particular operation; it is a generic
+-     indication that the server knows nothing to do for that call.
+-
+- - Macro: int EPFNOSUPPORT
+-     The socket communications protocol family you requested is not
+-     supported.
+-
+- - Macro: int EAFNOSUPPORT
+-     The address family specified for a socket is not supported; it is
+-     inconsistent with the protocol being used on the socket.  *Note
+-     Sockets::.
+-
+- - Macro: int EADDRINUSE
+-     The requested socket address is already in use.  *Note Socket
+-     Addresses::.
+-
+- - Macro: int EADDRNOTAVAIL
+-     The requested socket address is not available; for example, you
+-     tried to give a socket a name that doesn't match the local host
+-     name.  *Note Socket Addresses::.
+-
+- - Macro: int ENETDOWN
+-     A socket operation failed because the network was down.
+-
+- - Macro: int ENETUNREACH
+-     A socket operation failed because the subnet containing the remote
+-     host was unreachable.
+-
+- - Macro: int ENETRESET
+-     A network connection was reset because the remote host crashed.
+-
+- - Macro: int ECONNABORTED
+-     A network connection was aborted locally.
+-
+- - Macro: int ECONNRESET
+-     A network connection was closed for reasons outside the control of
+-     the local host, such as by the remote machine rebooting or an
+-     unrecoverable protocol violation.
+-
+- - Macro: int ENOBUFS
+-     The kernel's buffers for I/O operations are all in use.  In GNU,
+-     this error is always synonymous with `ENOMEM'; you may get one or
+-     the other from network operations.
+-
+- - Macro: int EISCONN
+-     You tried to connect a socket that is already connected.  *Note
+-     Connecting::.
+-
+- - Macro: int ENOTCONN
+-     The socket is not connected to anything.  You get this error when
+-     you try to transmit data over a socket, without first specifying a
+-     destination for the data.  For a connectionless socket (for
+-     datagram protocols, such as UDP), you get `EDESTADDRREQ' instead.
+-
+- - Macro: int EDESTADDRREQ
+-     No default destination address was set for the socket.  You get
+-     this error when you try to transmit data over a connectionless
+-     socket, without first specifying a destination for the data with
+-     `connect'.
+-
+- - Macro: int ESHUTDOWN
+-     The socket has already been shut down.
+-
+- - Macro: int ETOOMANYREFS
+-     ???
+-
+- - Macro: int ETIMEDOUT
+-     A socket operation with a specified timeout received no response
+-     during the timeout period.
+-
+- - Macro: int ECONNREFUSED
+-     A remote host refused to allow the network connection (typically
+-     because it is not running the requested service).
+-
+- - Macro: int ELOOP
+-     Too many levels of symbolic links were encountered in looking up a
+-     file name.  This often indicates a cycle of symbolic links.
+-
+- - Macro: int ENAMETOOLONG
+-     Filename too long (longer than `PATH_MAX'; *note Limits for
+-     Files::.) or host name too long (in `gethostname' or
+-     `sethostname'; *note Host Identification::.).
+-
+- - Macro: int EHOSTDOWN
+-     The remote host for a requested network connection is down.
+-
+- - Macro: int EHOSTUNREACH
+-     The remote host for a requested network connection is not
+-     reachable.
+-
+- - Macro: int ENOTEMPTY
+-     Directory not empty, where an empty directory was expected.
+-     Typically, this error occurs when you are trying to delete a
+-     directory.
+-
+- - Macro: int EPROCLIM
+-     This means that the per-user limit on new process would be
+-     exceeded by an attempted `fork'.  *Note Limits on Resources::, for
+-     details on the `RLIMIT_NPROC' limit.
+-
+- - Macro: int EUSERS
+-     The file quota system is confused because there are too many users.
+-
+- - Macro: int EDQUOT
+-     The user's disk quota was exceeded.
+-
+- - Macro: int ESTALE
+-     Stale NFS file handle.  This indicates an internal confusion in
+-     the NFS system which is due to file system rearrangements on the
+-     server host.  Repairing this condition usually requires unmounting
+-     and remounting the NFS file system on the local host.
+-
+- - Macro: int EREMOTE
+-     An attempt was made to NFS-mount a remote file system with a file
+-     name that already specifies an NFS-mounted file.  (This is an
+-     error on some operating systems, but we expect it to work properly
+-     on the GNU system, making this error code impossible.)
+-
+- - Macro: int EBADRPC
+-     ???
+-
+- - Macro: int ERPCMISMATCH
+-     ???
+-
+- - Macro: int EPROGUNAVAIL
+-     ???
+-
+- - Macro: int EPROGMISMATCH
+-     ???
+-
+- - Macro: int EPROCUNAVAIL
+-     ???
+-
+- - Macro: int ENOLCK
+-     No locks available.  This is used by the file locking facilities;
+-     see *Note File Locks::.  This error is never generated by the GNU
+-     system, but it can result from an operation to an NFS server
+-     running another operating system.
+-
+- - Macro: int EFTYPE
+-     Inappropriate file type or format.  The file was the wrong type
+-     for the operation, or a data file had the wrong format.
+-
+-     On some systems `chmod' returns this error if you try to set the
+-     sticky bit on a non-directory file; *note Setting Permissions::..
+-
+- - Macro: int EAUTH
+-     ???
+-
+- - Macro: int ENEEDAUTH
+-     ???
+-
+- - Macro: int ENOSYS
+-     Function not implemented.  This indicates that the function called
+-     is not implemented at all, either in the C library itself or in the
+-     operating system.  When you get this error, you can be sure that
+-     this particular function will always fail with `ENOSYS' unless you
+-     install a new version of the C library or the operating system.
+-
+- - Macro: int ENOTSUP
+-     Not supported.  A function returns this error when certain
+-     parameter values are valid, but the functionality they request is
+-     not available.  This can mean that the function does not implement
+-     a particular command or option value or flag bit at all.  For
+-     functions that operate on some object given in a parameter, such
+-     as a file descriptor or a port, it might instead mean that only
+-     *that specific object* (file descriptor, port, etc.) is unable to
+-     support the other parameters given; different file descriptors
+-     might support different ranges of parameter values.
+-
+-     If the entire function is not available at all in the
+-     implementation, it returns `ENOSYS' instead.
+-
+- - Macro: int EILSEQ
+-     While decoding a multibyte character the function came along an
+-     invalid or an incomplete sequence of bytes or the given wide
+-     character is invalid.
+-
+- - Macro: int EBACKGROUND
+-     In the GNU system, servers supporting the `term' protocol return
+-     this error for certain operations when the caller is not in the
+-     foreground process group of the terminal.  Users do not usually
+-     see this error because functions such as `read' and `write'
+-     translate it into a `SIGTTIN' or `SIGTTOU' signal.  *Note Job
+-     Control::, for information on process groups and these signals.
+-
+- - Macro: int EDIED
+-     In the GNU system, opening a file returns this error when the file
+-     is translated by a program and the translator program dies while
+-     starting up, before it has connected to the file.
+-
+- - Macro: int ED
+-     The experienced user will know what is wrong.
+-
+- - Macro: int EGREGIOUS
+-     You did *what*?
+-
+- - Macro: int EIEIO
+-     Go home and have a glass of warm, dairy-fresh milk.
+-
+- - Macro: int EGRATUITOUS
+-     This error code has no purpose.
+-
+- - Macro: int EBADMSG
+-
+- - Macro: int EIDRM
+-
+- - Macro: int EMULTIHOP
+-
+- - Macro: int ENODATA
+-
+- - Macro: int ENOLINK
+-
+- - Macro: int ENOMSG
+-
+- - Macro: int ENOSR
+-
+- - Macro: int ENOSTR
+-
+- - Macro: int EOVERFLOW
+-
+- - Macro: int EPROTO
+-
+- - Macro: int ETIME
+-
+-   *The following error codes are defined by the Linux/i386 kernel.
+-They are not yet documented.*
+-
+- - Macro: int ERESTART
+-
+- - Macro: int ECHRNG
+-
+- - Macro: int EL2NSYNC
+-
+- - Macro: int EL3HLT
+-
+- - Macro: int EL3RST
+-
+- - Macro: int ELNRNG
+-
+- - Macro: int EUNATCH
+-
+- - Macro: int ENOCSI
+-
+- - Macro: int EL2HLT
+-
+- - Macro: int EBADE
+-
+- - Macro: int EBADR
+-
+- - Macro: int EXFULL
+-
+- - Macro: int ENOANO
+-
+- - Macro: int EBADRQC
+-
+- - Macro: int EBADSLT
+-
+- - Macro: int EDEADLOCK
+-
+- - Macro: int EBFONT
+-
+- - Macro: int ENONET
+-
+- - Macro: int ENOPKG
+-
+- - Macro: int EADV
+-
+- - Macro: int ESRMNT
+-
+- - Macro: int ECOMM
+-
+- - Macro: int EDOTDOT
+-
+- - Macro: int ENOTUNIQ
+-
+- - Macro: int EBADFD
+-
+- - Macro: int EREMCHG
+-
+- - Macro: int ELIBACC
+-
+- - Macro: int ELIBBAD
+-
+- - Macro: int ELIBSCN
+-
+- - Macro: int ELIBMAX
+-
+- - Macro: int ELIBEXEC
+-
+- - Macro: int ESTRPIPE
+-
+- - Macro: int EUCLEAN
+-
+- - Macro: int ENOTNAM
+-
+- - Macro: int ENAVAIL
+-
+- - Macro: int EISNAM
+-
+- - Macro: int EREMOTEIO
+-
+- - Macro: int ENOMEDIUM
+-
+- - Macro: int EMEDIUMTYPE
+-
+-
+-File: libc.info,  Node: Error Messages,  Prev: Error Codes,  Up: Error Reporting
+-
+-Error Messages
+-==============
+-
+-   The library has functions and variables designed to make it easy for
+-your program to report informative error messages in the customary
+-format about the failure of a library call.  The functions `strerror'
+-and `perror' give you the standard error message for a given error
+-code; the variable `program_invocation_short_name' gives you convenient
+-access to the name of the program that encountered the error.
+-
+- - Function: char * strerror (int ERRNUM)
+-     The `strerror' function maps the error code (*note Checking for
+-     Errors::.) specified by the ERRNUM argument to a descriptive error
+-     message string.  The return value is a pointer to this string.
+-
+-     The value ERRNUM normally comes from the variable `errno'.
+-
+-     You should not modify the string returned by `strerror'.  Also, if
+-     you make subsequent calls to `strerror', the string might be
+-     overwritten.  (But it's guaranteed that no library function ever
+-     calls `strerror' behind your back.)
+-
+-     The function `strerror' is declared in `string.h'.
+-
+- - Function: char * strerror_r (int ERRNUM, char *BUF, size_t N)
+-     The `strerror_r' function works like `strerror' but instead of
+-     returning the error message in a statically allocated buffer
+-     shared by all threads in the process, it returns a private copy
+-     for the thread. This might be either some permanent global data or
+-     a message string in the user supplied buffer starting at BUF with
+-     the length of N bytes.
+-
+-     At most N characters are written (including the NUL byte) so it is
+-     up to the user to select the buffer large enough.
+-
+-     This function should always be used in multi-threaded programs
+-     since there is no way to guarantee the string returned by
+-     `strerror' really belongs to the last call of the current thread.
+-
+-     This function `strerror_r' is a GNU extension and it is declared in
+-     `string.h'.
+-
+- - Function: void perror (const char *MESSAGE)
+-     This function prints an error message to the stream `stderr'; see
+-     *Note Standard Streams::.
+-
+-     If you call `perror' with a MESSAGE that is either a null pointer
+-     or an empty string, `perror' just prints the error message
+-     corresponding to `errno', adding a trailing newline.
+-
+-     If you supply a non-null MESSAGE argument, then `perror' prefixes
+-     its output with this string.  It adds a colon and a space
+-     character to separate the MESSAGE from the error string
+-     corresponding to `errno'.
+-
+-     The function `perror' is declared in `stdio.h'.
+-
+-   `strerror' and `perror' produce the exact same message for any given
+-error code; the precise text varies from system to system.  On the GNU
+-system, the messages are fairly short; there are no multi-line messages
+-or embedded newlines.  Each error message begins with a capital letter
+-and does not include any terminating punctuation.
+-
+-   *Compatibility Note:*  The `strerror' function is a new feature of
+-ISO C.  Many older C systems do not support this function yet.
+-
+-   Many programs that don't read input from the terminal are designed to
+-exit if any system call fails.  By convention, the error message from
+-such a program should start with the program's name, sans directories.
+-You can find that name in the variable `program_invocation_short_name';
+-the full file name is stored the variable `program_invocation_name':
+-
+- - Variable: char * program_invocation_name
+-     This variable's value is the name that was used to invoke the
+-     program running in the current process.  It is the same as
+-     `argv[0]'.  Note that this is not necessarily a useful file name;
+-     often it contains no directory names.  *Note Program Arguments::.
+-
+- - Variable: char * program_invocation_short_name
+-     This variable's value is the name that was used to invoke the
+-     program running in the current process, with directory names
+-     removed.  (That is to say, it is the same as
+-     `program_invocation_name' minus everything up to the last slash,
+-     if any.)
+-
+-   The library initialization code sets up both of these variables
+-before calling `main'.
+-
+-   *Portability Note:* These two variables are GNU extensions.  If you
+-want your program to work with non-GNU libraries, you must save the
+-value of `argv[0]' in `main', and then strip off the directory names
+-yourself.  We added these extensions to make it possible to write
+-self-contained error-reporting subroutines that require no explicit
+-cooperation from `main'.
+-
+-   Here is an example showing how to handle failure to open a file
+-correctly.  The function `open_sesame' tries to open the named file for
+-reading and returns a stream if successful.  The `fopen' library
+-function returns a null pointer if it couldn't open the file for some
+-reason.  In that situation, `open_sesame' constructs an appropriate
+-error message using the `strerror' function, and terminates the
+-program.  If we were going to make some other library calls before
+-passing the error code to `strerror', we'd have to save it in a local
+-variable instead, because those other library functions might overwrite
+-`errno' in the meantime.
+-
+-     #include <errno.h>
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <string.h>
+-     
+-     FILE *
+-     open_sesame (char *name)
+-     {
+-       FILE *stream;
+-     
+-       errno = 0;
+-       stream = fopen (name, "r");
+-       if (stream == NULL)
+-         {
+-           fprintf (stderr, "%s: Couldn't open file %s; %s\n",
+-                    program_invocation_short_name, name, strerror (errno));
+-           exit (EXIT_FAILURE);
+-         }
+-       else
+-         return stream;
+-     }
+-
+-
+-File: libc.info,  Node: Memory Allocation,  Next: Character Handling,  Prev: Error Reporting,  Up: Top
+-
+-Memory Allocation
+-*****************
+-
+-   The GNU system provides several methods for allocating memory space
+-under explicit program control.  They vary in generality and in
+-efficiency.
+-
+-* Menu:
+-
+-* Memory Concepts::             An introduction to concepts and terminology.
+-* Dynamic Allocation and C::    How to get different kinds of allocation in C.
+-* Unconstrained Allocation::    The `malloc' facility allows fully general
+-		 		 dynamic allocation.
+-* Allocation Debugging::        Finding memory leaks and not freed memory.
+-* Obstacks::                    Obstacks are less general than malloc
+-				 but more efficient and convenient.
+-* Variable Size Automatic::     Allocation of variable-sized blocks
+-				 of automatic storage that are freed when the
+-				 calling function returns.
+-
+-
+-File: libc.info,  Node: Memory Concepts,  Next: Dynamic Allocation and C,  Up: Memory Allocation
+-
+-Dynamic Memory Allocation Concepts
+-==================================
+-
+-   "Dynamic memory allocation" is a technique in which programs
+-determine as they are running where to store some information.  You need
+-dynamic allocation when the number of memory blocks you need, or how
+-long you continue to need them, depends on the data you are working on.
+-
+-   For example, you may need a block to store a line read from an input
+-file; since there is no limit to how long a line can be, you must
+-allocate the storage dynamically and make it dynamically larger as you
+-read more of the line.
+-
+-   Or, you may need a block for each record or each definition in the
+-input data; since you can't know in advance how many there will be, you
+-must allocate a new block for each record or definition as you read it.
+-
+-   When you use dynamic allocation, the allocation of a block of memory
+-is an action that the program requests explicitly.  You call a function
+-or macro when you want to allocate space, and specify the size with an
+-argument.  If you want to free the space, you do so by calling another
+-function or macro.  You can do these things whenever you want, as often
+-as you want.
+-
+-
+-File: libc.info,  Node: Dynamic Allocation and C,  Next: Unconstrained Allocation,  Prev: Memory Concepts,  Up: Memory Allocation
+-
+-Dynamic Allocation and C
+-========================
+-
+-   The C language supports two kinds of memory allocation through the
+-variables in C programs:
+-
+-   * "Static allocation" is what happens when you declare a static or
+-     global variable.  Each static or global variable defines one block
+-     of space, of a fixed size.  The space is allocated once, when your
+-     program is started, and is never freed.
+-
+-   * "Automatic allocation" happens when you declare an automatic
+-     variable, such as a function argument or a local variable.  The
+-     space for an automatic variable is allocated when the compound
+-     statement containing the declaration is entered, and is freed when
+-     that compound statement is exited.
+-
+-     In GNU C, the length of the automatic storage can be an expression
+-     that varies.  In other C implementations, it must be a constant.
+-
+-   Dynamic allocation is not supported by C variables; there is no
+-storage class "dynamic", and there can never be a C variable whose
+-value is stored in dynamically allocated space.  The only way to refer
+-to dynamically allocated space is through a pointer.  Because it is less
+-convenient, and because the actual process of dynamic allocation
+-requires more computation time, programmers generally use dynamic
+-allocation only when neither static nor automatic allocation will serve.
+-
+-   For example, if you want to allocate dynamically some space to hold a
+-`struct foobar', you cannot declare a variable of type `struct foobar'
+-whose contents are the dynamically allocated space.  But you can
+-declare a variable of pointer type `struct foobar *' and assign it the
+-address of the space.  Then you can use the operators `*' and `->' on
+-this pointer variable to refer to the contents of the space:
+-
+-     {
+-       struct foobar *ptr
+-          = (struct foobar *) malloc (sizeof (struct foobar));
+-       ptr->name = x;
+-       ptr->next = current_foobar;
+-       current_foobar = ptr;
+-     }
+-
+-
+-File: libc.info,  Node: Unconstrained Allocation,  Next: Allocation Debugging,  Prev: Dynamic Allocation and C,  Up: Memory Allocation
+-
+-Unconstrained Allocation
+-========================
+-
+-   The most general dynamic allocation facility is `malloc'.  It allows
+-you to allocate blocks of memory of any size at any time, make them
+-bigger or smaller at any time, and free the blocks individually at any
+-time (or never).
+-
+-* Menu:
+-
+-* Basic Allocation::            Simple use of `malloc'.
+-* Malloc Examples::             Examples of `malloc'.  `xmalloc'.
+-* Freeing after Malloc::        Use `free' to free a block you
+-				 got with `malloc'.
+-* Changing Block Size::         Use `realloc' to make a block
+-				 bigger or smaller.
+-* Allocating Cleared Space::    Use `calloc' to allocate a
+-				 block and clear it.
+-* Efficiency and Malloc::       Efficiency considerations in use of
+-				 these functions.
+-* Aligned Memory Blocks::       Allocating specially aligned memory:
+-				 `memalign' and `valloc'.
+-* Malloc Tunable Parameters::   Use `mallopt' to adjust allocation
+-                                 parameters.
+-* Heap Consistency Checking::   Automatic checking for errors.
+-* Hooks for Malloc::            You can use these hooks for debugging
+-				 programs that use `malloc'.
+-* Statistics of Malloc::        Getting information about how much
+-				 memory your program is using.
+-* Summary of Malloc::           Summary of `malloc' and related functions.
+-
+-
+-File: libc.info,  Node: Basic Allocation,  Next: Malloc Examples,  Up: Unconstrained Allocation
+-
+-Basic Storage Allocation
+-------------------------
+-
+-   To allocate a block of memory, call `malloc'.  The prototype for
+-this function is in `stdlib.h'.
+-
+- - Function: void * malloc (size_t SIZE)
+-     This function returns a pointer to a newly allocated block SIZE
+-     bytes long, or a null pointer if the block could not be allocated.
+-
+-   The contents of the block are undefined; you must initialize it
+-yourself (or use `calloc' instead; *note Allocating Cleared Space::.).
+-Normally you would cast the value as a pointer to the kind of object
+-that you want to store in the block.  Here we show an example of doing
+-so, and of initializing the space with zeros using the library function
+-`memset' (*note Copying and Concatenation::.):
+-
+-     struct foo *ptr;
+-     ...
+-     ptr = (struct foo *) malloc (sizeof (struct foo));
+-     if (ptr == 0) abort ();
+-     memset (ptr, 0, sizeof (struct foo));
+-
+-   You can store the result of `malloc' into any pointer variable
+-without a cast, because ISO C automatically converts the type `void *'
+-to another type of pointer when necessary.  But the cast is necessary
+-in contexts other than assignment operators or if you might want your
+-code to run in traditional C.
+-
+-   Remember that when allocating space for a string, the argument to
+-`malloc' must be one plus the length of the string.  This is because a
+-string is terminated with a null character that doesn't count in the
+-"length" of the string but does need space.  For example:
+-
+-     char *ptr;
+-     ...
+-     ptr = (char *) malloc (length + 1);
+-
+-*Note Representation of Strings::, for more information about this.
+-
+-
+-File: libc.info,  Node: Malloc Examples,  Next: Freeing after Malloc,  Prev: Basic Allocation,  Up: Unconstrained Allocation
+-
+-Examples of `malloc'
+---------------------
+-
+-   If no more space is available, `malloc' returns a null pointer.  You
+-should check the value of *every* call to `malloc'.  It is useful to
+-write a subroutine that calls `malloc' and reports an error if the
+-value is a null pointer, returning only if the value is nonzero.  This
+-function is conventionally called `xmalloc'.  Here it is:
+-
+-     void *
+-     xmalloc (size_t size)
+-     {
+-       register void *value = malloc (size);
+-       if (value == 0)
+-         fatal ("virtual memory exhausted");
+-       return value;
+-     }
+-
+-   Here is a real example of using `malloc' (by way of `xmalloc').  The
+-function `savestring' will copy a sequence of characters into a newly
+-allocated null-terminated string:
+-
+-     char *
+-     savestring (const char *ptr, size_t len)
+-     {
+-       register char *value = (char *) xmalloc (len + 1);
+-       value[len] = '\0';
+-       return (char *) memcpy (value, ptr, len);
+-     }
+-
+-   The block that `malloc' gives you is guaranteed to be aligned so
+-that it can hold any type of data.  In the GNU system, the address is
+-always a multiple of eight on most systems, and a multiple of 16 on
+-64-bit systems.  Only rarely is any higher boundary (such as a page
+-boundary) necessary; for those cases, use `memalign' or `valloc' (*note
+-Aligned Memory Blocks::.).
+-
+-   Note that the memory located after the end of the block is likely to
+-be in use for something else; perhaps a block already allocated by
+-another call to `malloc'.  If you attempt to treat the block as longer
+-than you asked for it to be, you are liable to destroy the data that
+-`malloc' uses to keep track of its blocks, or you may destroy the
+-contents of another block.  If you have already allocated a block and
+-discover you want it to be bigger, use `realloc' (*note Changing Block
+-Size::.).
+-
+-
+-File: libc.info,  Node: Freeing after Malloc,  Next: Changing Block Size,  Prev: Malloc Examples,  Up: Unconstrained Allocation
+-
+-Freeing Memory Allocated with `malloc'
+---------------------------------------
+-
+-   When you no longer need a block that you got with `malloc', use the
+-function `free' to make the block available to be allocated again.  The
+-prototype for this function is in `stdlib.h'.
+-
+- - Function: void free (void *PTR)
+-     The `free' function deallocates the block of storage pointed at by
+-     PTR.
+-
+- - Function: void cfree (void *PTR)
+-     This function does the same thing as `free'.  It's provided for
+-     backward compatibility with SunOS; you should use `free' instead.
+-
+-   Freeing a block alters the contents of the block.  *Do not expect to
+-find any data (such as a pointer to the next block in a chain of
+-blocks) in the block after freeing it.*  Copy whatever you need out of
+-the block before freeing it!  Here is an example of the proper way to
+-free all the blocks in a chain, and the strings that they point to:
+-
+-     struct chain
+-       {
+-         struct chain *next;
+-         char *name;
+-       }
+-     
+-     void
+-     free_chain (struct chain *chain)
+-     {
+-       while (chain != 0)
+-         {
+-           struct chain *next = chain->next;
+-           free (chain->name);
+-           free (chain);
+-           chain = next;
+-         }
+-     }
+-
+-   Occasionally, `free' can actually return memory to the operating
+-system and make the process smaller.  Usually, all it can do is allow a
+-later call to `malloc' to reuse the space.  In the meantime, the space
+-remains in your program as part of a free-list used internally by
+-`malloc'.
+-
+-   There is no point in freeing blocks at the end of a program, because
+-all of the program's space is given back to the system when the process
+-terminates.
+-
+-
+-File: libc.info,  Node: Changing Block Size,  Next: Allocating Cleared Space,  Prev: Freeing after Malloc,  Up: Unconstrained Allocation
+-
+-Changing the Size of a Block
+-----------------------------
+-
+-   Often you do not know for certain how big a block you will
+-ultimately need at the time you must begin to use the block.  For
+-example, the block might be a buffer that you use to hold a line being
+-read from a file; no matter how long you make the buffer initially, you
+-may encounter a line that is longer.
+-
+-   You can make the block longer by calling `realloc'.  This function
+-is declared in `stdlib.h'.
+-
+- - Function: void * realloc (void *PTR, size_t NEWSIZE)
+-     The `realloc' function changes the size of the block whose address
+-     is PTR to be NEWSIZE.
+-
+-     Since the space after the end of the block may be in use, `realloc'
+-     may find it necessary to copy the block to a new address where
+-     more free space is available.  The value of `realloc' is the new
+-     address of the block.  If the block needs to be moved, `realloc'
+-     copies the old contents.
+-
+-     If you pass a null pointer for PTR, `realloc' behaves just like
+-     `malloc (NEWSIZE)'.  This can be convenient, but beware that older
+-     implementations (before ISO C) may not support this behavior, and
+-     will probably crash when `realloc' is passed a null pointer.
+-
+-   Like `malloc', `realloc' may return a null pointer if no memory
+-space is available to make the block bigger.  When this happens, the
+-original block is untouched; it has not been modified or relocated.
+-
+-   In most cases it makes no difference what happens to the original
+-block when `realloc' fails, because the application program cannot
+-continue when it is out of memory, and the only thing to do is to give
+-a fatal error message.  Often it is convenient to write and use a
+-subroutine, conventionally called `xrealloc', that takes care of the
+-error message as `xmalloc' does for `malloc':
+-
+-     void *
+-     xrealloc (void *ptr, size_t size)
+-     {
+-       register void *value = realloc (ptr, size);
+-       if (value == 0)
+-         fatal ("Virtual memory exhausted");
+-       return value;
+-     }
+-
+-   You can also use `realloc' to make a block smaller.  The reason you
+-would do this is to avoid tying up a lot of memory space when only a
+-little is needed.  In several allocation implementations, making a
+-block smaller sometimes necessitates copying it, so it can fail if no
+-other space is available.
+-
+-   If the new size you specify is the same as the old size, `realloc'
+-is guaranteed to change nothing and return the same address that you
+-gave.
+-
+-
+-File: libc.info,  Node: Allocating Cleared Space,  Next: Efficiency and Malloc,  Prev: Changing Block Size,  Up: Unconstrained Allocation
+-
+-Allocating Cleared Space
+-------------------------
+-
+-   The function `calloc' allocates memory and clears it to zero.  It is
+-declared in `stdlib.h'.
+-
+- - Function: void * calloc (size_t COUNT, size_t ELTSIZE)
+-     This function allocates a block long enough to contain a vector of
+-     COUNT elements, each of size ELTSIZE.  Its contents are cleared to
+-     zero before `calloc' returns.
+-
+-   You could define `calloc' as follows:
+-
+-     void *
+-     calloc (size_t count, size_t eltsize)
+-     {
+-       size_t size = count * eltsize;
+-       void *value = malloc (size);
+-       if (value != 0)
+-         memset (value, 0, size);
+-       return value;
+-     }
+-
+-   But in general, it is not guaranteed that `calloc' calls `malloc'
+-internally.  Therefore, if an application provides its own
+-`malloc'/`realloc'/`free' outside the C library, it should always
+-define `calloc', too.
+-
+-
+-File: libc.info,  Node: Efficiency and Malloc,  Next: Aligned Memory Blocks,  Prev: Allocating Cleared Space,  Up: Unconstrained Allocation
+-
+-Efficiency Considerations for `malloc'
+---------------------------------------
+-
+-   As apposed to other versions, the `malloc' in GNU libc does not
+-round up block sizes to powers of two, neither for large nor for small
+-sizes.  Neighboring chunks can be coalesced on a `free' no matter what
+-their size is.  This makes the implementation suitable for all kinds of
+-allocation patterns without generally incurring high memory waste
+-through fragmentation.
+-
+-   Very large blocks (much larger than a page) are allocated with
+-`mmap' (anonymous or via `/dev/zero') by this implementation.  This has
+-the great advantage that these chunks are returned to the system
+-immediately when they are freed.  Therefore, it cannot happen that a
+-large chunk becomes "locked" in between smaller ones and even after
+-calling `free' wastes memory.  The size threshold for `mmap' to be used
+-can be adjusted with `mallopt'.  The use of `mmap' can also be disabled
+-completely.
+-
+-
+-File: libc.info,  Node: Aligned Memory Blocks,  Next: Malloc Tunable Parameters,  Prev: Efficiency and Malloc,  Up: Unconstrained Allocation
+-
+-Allocating Aligned Memory Blocks
+---------------------------------
+-
+-   The address of a block returned by `malloc' or `realloc' in the GNU
+-system is always a multiple of eight (or sixteen on 64-bit systems).
+-If you need a block whose address is a multiple of a higher power of
+-two than that, use `memalign' or `valloc'.  These functions are
+-declared in `stdlib.h'.
+-
+-   With the GNU library, you can use `free' to free the blocks that
+-`memalign' and `valloc' return.  That does not work in BSD,
+-however--BSD does not provide any way to free such blocks.
+-
+- - Function: void * memalign (size_t BOUNDARY, size_t SIZE)
+-     The `memalign' function allocates a block of SIZE bytes whose
+-     address is a multiple of BOUNDARY.  The BOUNDARY must be a power
+-     of two!  The function `memalign' works by allocating a somewhat
+-     larger block, and then returning an address within the block that
+-     is on the specified boundary.
+-
+- - Function: void * valloc (size_t SIZE)
+-     Using `valloc' is like using `memalign' and passing the page size
+-     as the value of the second argument.  It is implemented like this:
+-
+-          void *
+-          valloc (size_t size)
+-          {
+-            return memalign (getpagesize (), size);
+-          }
+-
+-
+-File: libc.info,  Node: Malloc Tunable Parameters,  Next: Heap Consistency Checking,  Prev: Aligned Memory Blocks,  Up: Unconstrained Allocation
+-
+-Malloc Tunable Parameters
+--------------------------
+-
+-   You can adjust some parameters for dynamic memory allocation with the
+-`mallopt' function.  This function is the general SVID/XPG interface,
+-defined in `malloc.h'.
+-
+- - Function: int mallopt (int PARAM, int VALUE)
+-     When calling `mallopt', the PARAM argument specifies the parameter
+-     to be set, and VALUE the new value to be set.  Possible choices
+-     for PARAM, as defined in `malloc.h', are:
+-
+-    `M_TRIM_THRESHOLD'
+-          This is the minimum size (in bytes) of the top-most,
+-          releaseable chunk that will cause `sbrk' to be called with a
+-          negative argument in order to return memory to the system.
+-
+-    `M_TOP_PAD'
+-          This parameter determines the amount of extra memory to
+-          obtain from the system when a call to `sbrk' is required.  It
+-          also specifies the number of bytes to retain when shrinking
+-          the heap by calling `sbrk' with a negative argument.  This
+-          provides the necessary hysteresis in heap size such that
+-          excessive amounts of system calls can be avoided.
+-
+-    `M_MMAP_THRESHOLD'
+-          All chunks larger than this value are allocated outside the
+-          normal heap, using the `mmap' system call.  This way it is
+-          guaranteed that the memory for these chunks can be returned
+-          to the system on `free'.
+-
+-    `M_MMAP_MAX'
+-          The maximum number of chunks to allocate with `mmap'.
+-          Setting this to zero disables all use of `mmap'.
+-
+-
+-
+-File: libc.info,  Node: Heap Consistency Checking,  Next: Hooks for Malloc,  Prev: Malloc Tunable Parameters,  Up: Unconstrained Allocation
+-
+-Heap Consistency Checking
+--------------------------
+-
+-   You can ask `malloc' to check the consistency of dynamic storage by
+-using the `mcheck' function.  This function is a GNU extension,
+-declared in `mcheck.h'.
+-
+- - Function: int mcheck (void (*ABORTFN) (enum mcheck_status STATUS))
+-     Calling `mcheck' tells `malloc' to perform occasional consistency
+-     checks.  These will catch things such as writing past the end of a
+-     block that was allocated with `malloc'.
+-
+-     The ABORTFN argument is the function to call when an inconsistency
+-     is found.  If you supply a null pointer, then `mcheck' uses a
+-     default function which prints a message and calls `abort' (*note
+-     Aborting a Program::.).  The function you supply is called with
+-     one argument, which says what sort of inconsistency was detected;
+-     its type is described below.
+-
+-     It is too late to begin allocation checking once you have allocated
+-     anything with `malloc'.  So `mcheck' does nothing in that case.
+-     The function returns `-1' if you call it too late, and `0'
+-     otherwise (when it is successful).
+-
+-     The easiest way to arrange to call `mcheck' early enough is to use
+-     the option `-lmcheck' when you link your program; then you don't
+-     need to modify your program source at all.  Alternately you might
+-     use a debugger to insert a call to `mcheck' whenever the program is
+-     started, for example these gdb commands will automatically call
+-     `mcheck' whenever the program starts:
+-
+-          (gdb) break main
+-          Breakpoint 1, main (argc=2, argv=0xbffff964) at whatever.c:10
+-          (gdb) command 1
+-          Type commands for when breakpoint 1 is hit, one per line.
+-          End with a line saying just "end".
+-          >call mcheck(0)
+-          >continue
+-          >end
+-          (gdb) ...
+-
+-     This will however only work if no initialization function of any
+-     object involved calls any of the `malloc' functions since `mcheck'
+-     must be called before the first such function.
+-
+-
+- - Function: enum mcheck_status mprobe (void *POINTER)
+-     The `mprobe' function lets you explicitly check for inconsistencies
+-     in a particular allocated block.  You must have already called
+-     `mcheck' at the beginning of the program, to do its occasional
+-     checks; calling `mprobe' requests an additional consistency check
+-     to be done at the time of the call.
+-
+-     The argument POINTER must be a pointer returned by `malloc' or
+-     `realloc'.  `mprobe' returns a value that says what inconsistency,
+-     if any, was found.  The values are described below.
+-
+- - Data Type: enum mcheck_status
+-     This enumerated type describes what kind of inconsistency was
+-     detected in an allocated block, if any.  Here are the possible
+-     values:
+-
+-    `MCHECK_DISABLED'
+-          `mcheck' was not called before the first allocation.  No
+-          consistency checking can be done.
+-
+-    `MCHECK_OK'
+-          No inconsistency detected.
+-
+-    `MCHECK_HEAD'
+-          The data immediately before the block was modified.  This
+-          commonly happens when an array index or pointer is
+-          decremented too far.
+-
+-    `MCHECK_TAIL'
+-          The data immediately after the block was modified.  This
+-          commonly happens when an array index or pointer is
+-          incremented too far.
+-
+-    `MCHECK_FREE'
+-          The block was already freed.
+-
+-   Another possibility to check for and guard against bugs in the use of
+-`malloc', `realloc' and `free' is to set the environment variable
+-`MALLOC_CHECK_'.  When `MALLOC_CHECK_' is set, a special (less
+-efficient) implementation is used which is designed to be tolerant
+-against simple errors, such as double calls of `free' with the same
+-argument, or overruns of a single byte (off-by-one bugs).  Not all such
+-errors can be proteced against, however, and memory leaks can result.
+-If `MALLOC_CHECK_' is set to `0', any detected heap corruption is
+-silently ignored; if set to `1', a diagnostic is printed on `stderr';
+-if set to `2', `abort' is called immediately.  This can be useful
+-because otherwise a crash may happen much later, and the true cause for
+-the problem is then very hard to track down.
+-
+-   So, what's the difference between using `MALLOC_CHECK_' and linking
+-with `-lmcheck'?  `MALLOC_CHECK_' is orthognal with respect to
+-`-lmcheck'.  `-lmcheck' has been added for backward compatibility.
+-Both `MALLOC_CHECK_' and `-lmcheck' should uncover the same bugs - but
+-using `MALLOC_CHECK_' you don't need to recompile your application.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-30 glibc-2.1.3/manual/libc.info-30
+--- ../glibc-2.1.3/manual/libc.info-30	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-30	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1213 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Formatting Date and Time,  Next: Parsing Date and Time,  Prev: Broken-down Time,  Up: Calendar Time
+-
+-Formatting Date and Time
+-------------------------
+-
+-   The functions described in this section format time values as
+-strings.  These functions are declared in the header file `time.h'.
+-
+- - Function: char * asctime (const struct tm *BROKENTIME)
+-     The `asctime' function converts the broken-down time value that
+-     BROKENTIME points to into a string in a standard format:
+-
+-          "Tue May 21 13:46:22 1991\n"
+-
+-     The abbreviations for the days of week are: `Sun', `Mon', `Tue',
+-     `Wed', `Thu', `Fri', and `Sat'.
+-
+-     The abbreviations for the months are: `Jan', `Feb', `Mar', `Apr',
+-     `May', `Jun', `Jul', `Aug', `Sep', `Oct', `Nov', and `Dec'.
+-
+-     The return value points to a statically allocated string, which
+-     might be overwritten by subsequent calls to `asctime' or `ctime'.
+-     (But no other library function overwrites the contents of this
+-     string.)
+-
+- - Function: char * asctime_r (const struct tm *BROKENTIME, char
+-          *BUFFER)
+-     This function is similar to `asctime' but instead of placing the
+-     result in a static buffer it writes the string in the buffer
+-     pointed to by the parameter BUFFER.  This buffer should have at
+-     least room for 16 bytes.
+-
+-     If no error occurred the function returns a pointer to the string
+-     the result was written into, i.e., it returns BUFFER.  Otherwise
+-     return `NULL'.
+-
+- - Function: char * ctime (const time_t *TIME)
+-     The `ctime' function is similar to `asctime', except that the time
+-     value is specified as a `time_t' calendar time value rather than
+-     in broken-down local time format.  It is equivalent to
+-
+-          asctime (localtime (TIME))
+-
+-     `ctime' sets the variable `tzname', because `localtime' does so.
+-     *Note Time Zone Functions::.
+-
+- - Function: char * ctime_r (const time_t *TIME, char *BUFFER)
+-     This function is similar to `ctime', only that it places the result
+-     in the string pointed to by BUFFER.  It is equivalent to (written
+-     using gcc extensions, *note Statement Exprs: (gcc)Statement
+-     Exprs.):
+-
+-          ({ struct tm tm; asctime_r (localtime_r (time, &tm), buf); })
+-
+-     If no error occurred the function returns a pointer to the string
+-     the result was written into, i.e., it returns BUFFER.  Otherwise
+-     return `NULL'.
+-
+- - Function: size_t strftime (char *S, size_t SIZE, const char
+-          *TEMPLATE, const struct tm *BROKENTIME)
+-     This function is similar to the `sprintf' function (*note
+-     Formatted Input::.), but the conversion specifications that can
+-     appear in the format template TEMPLATE are specialized for
+-     printing components of the date and time BROKENTIME according to
+-     the locale currently specified for time conversion (*note
+-     Locales::.).
+-
+-     Ordinary characters appearing in the TEMPLATE are copied to the
+-     output string S; this can include multibyte character sequences.
+-     Conversion specifiers are introduced by a `%' character, followed
+-     by an optional flag which can be one of the following.  These flags
+-     are all GNU extensions. The first three affect only the output of
+-     numbers:
+-
+-    `_'
+-          The number is padded with spaces.
+-
+-    `-'
+-          The number is not padded at all.
+-
+-    `0'
+-          The number is padded with zeros even if the format specifies
+-          padding with spaces.
+-
+-    `^'
+-          The output uses uppercase characters, but only if this is
+-          possible (*note Case Conversion::.).
+-
+-     The default action is to pad the number with zeros to keep it a
+-     constant width.  Numbers that do not have a range indicated below
+-     are never padded, since there is no natural width for them.
+-
+-     Following the flag an optional specification of the width is
+-     possible.  This is specified in decimal notation.  If the natural
+-     size of the output is of the field has less than the specified
+-     number of characters, the result is written right adjusted and
+-     space padded to the given size.
+-
+-     An optional modifier can follow the optional flag and width
+-     specification.  The modifiers, which are POSIX.2 extensions, are:
+-
+-    `E'
+-          Use the locale's alternate representation for date and time.
+-          This modifier applies to the `%c', `%C', `%x', `%X', `%y' and
+-          `%Y' format specifiers.  In a Japanese locale, for example,
+-          `%Ex' might yield a date format based on the Japanese
+-          Emperors' reigns.
+-
+-    `O'
+-          Use the locale's alternate numeric symbols for numbers.  This
+-          modifier applies only to numeric format specifiers.
+-
+-     If the format supports the modifier but no alternate representation
+-     is available, it is ignored.
+-
+-     The conversion specifier ends with a format specifier taken from
+-     the following list.  The whole `%' sequence is replaced in the
+-     output string as follows:
+-
+-    `%a'
+-          The abbreviated weekday name according to the current locale.
+-
+-    `%A'
+-          The full weekday name according to the current locale.
+-
+-    `%b'
+-          The abbreviated month name according to the current locale.
+-
+-    `%B'
+-          The full month name according to the current locale.
+-
+-    `%c'
+-          The preferred date and time representation for the current
+-          locale.
+-
+-    `%C'
+-          The century of the year.  This is equivalent to the greatest
+-          integer not greater than the year divided by 100.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%d'
+-          The day of the month as a decimal number (range `01' through
+-          `31').
+-
+-    `%D'
+-          The date using the format `%m/%d/%y'.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%e'
+-          The day of the month like with `%d', but padded with blank
+-          (range ` 1' through `31').
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%F'
+-          The date using the format `%Y-%m-%d'.  This is the form
+-          specified in the ISO 8601 standard and is the preferred form
+-          for all uses.
+-
+-          This format is a ISO C 9X extension.
+-
+-    `%g'
+-          The year corresponding to the ISO week number, but without
+-          the century (range `00' through `99').  This has the same
+-          format and value as `%y', except that if the ISO week number
+-          (see `%V') belongs to the previous or next year, that year is
+-          used instead.
+-
+-          This format is a GNU extension.
+-
+-    `%G'
+-          The year corresponding to the ISO week number.  This has the
+-          same format and value as `%Y', except that if the ISO week
+-          number (see `%V') belongs to the previous or next year, that
+-          year is used instead.
+-
+-          This format is a GNU extension.
+-
+-    `%h'
+-          The abbreviated month name according to the current locale.
+-          The action is the same as for `%b'.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%H'
+-          The hour as a decimal number, using a 24-hour clock (range
+-          `00' through `23').
+-
+-    `%I'
+-          The hour as a decimal number, using a 12-hour clock (range
+-          `01' through `12').
+-
+-    `%j'
+-          The day of the year as a decimal number (range `001' through
+-          `366').
+-
+-    `%k'
+-          The hour as a decimal number, using a 24-hour clock like
+-          `%H', but padded with blank (range ` 0' through `23').
+-
+-          This format is a GNU extension.
+-
+-    `%l'
+-          The hour as a decimal number, using a 12-hour clock like
+-          `%I', but padded with blank (range ` 1' through `12').
+-
+-          This format is a GNU extension.
+-
+-    `%m'
+-          The month as a decimal number (range `01' through `12').
+-
+-    `%M'
+-          The minute as a decimal number (range `00' through `59').
+-
+-    `%n'
+-          A single `\n' (newline) character.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%p'
+-          Either `AM' or `PM', according to the given time value; or the
+-          corresponding strings for the current locale.  Noon is
+-          treated as `PM' and midnight as `AM'.
+-
+-    `%P'
+-          Either `am' or `pm', according to the given time value; or the
+-          corresponding strings for the current locale, printed in
+-          lowercase characters.  Noon is treated as `pm' and midnight
+-          as `am'.
+-
+-          This format is a GNU extension.
+-
+-    `%r'
+-          The complete time using the AM/PM format of the current
+-          locale.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%R'
+-          The hour and minute in decimal numbers using the format
+-          `%H:%M'.
+-
+-          This format is a GNU extension.
+-
+-    `%s'
+-          The number of seconds since the epoch, i.e., since 1970-01-01
+-          00:00:00 UTC.  Leap seconds are not counted unless leap
+-          second support is available.
+-
+-          This format is a GNU extension.
+-
+-    `%S'
+-          The seconds as a decimal number (range `00' through `60').
+-
+-    `%t'
+-          A single `\t' (tabulator) character.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%T'
+-          The time using decimal numbers using the format `%H:%M:%S'.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%u'
+-          The day of the week as a decimal number (range `1' through
+-          `7'), Monday being `1'.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%U'
+-          The week number of the current year as a decimal number
+-          (range `00' through `53'), starting with the first Sunday as
+-          the first day of the first week.  Days preceding the first
+-          Sunday in the year are considered to be in week `00'.
+-
+-    `%V'
+-          The ISO 8601:1988 week number as a decimal number (range `01'
+-          through `53').  ISO weeks start with Monday and end with
+-          Sunday.  Week `01' of a year is the first week which has the
+-          majority of its days in that year; this is equivalent to the
+-          week containing the year's first Thursday, and it is also
+-          equivalent to the week containing January 4.  Week `01' of a
+-          year can contain days from the previous year.  The week
+-          before week `01' of a year is the last week (`52' or `53') of
+-          the previous year even if it contains days from the new year.
+-
+-          This format is a POSIX.2 extension.
+-
+-    `%w'
+-          The day of the week as a decimal number (range `0' through
+-          `6'), Sunday being `0'.
+-
+-    `%W'
+-          The week number of the current year as a decimal number
+-          (range `00' through `53'), starting with the first Monday as
+-          the first day of the first week.  All days preceding the
+-          first Monday in the year are considered to be in week `00'.
+-
+-    `%x'
+-          The preferred date representation for the current locale, but
+-          without the time.
+-
+-    `%X'
+-          The preferred time representation for the current locale, but
+-          with no date.
+-
+-    `%y'
+-          The year without a century as a decimal number (range `00'
+-          through `99').  This is equivalent to the year modulo 100.
+-
+-    `%Y'
+-          The year as a decimal number, using the Gregorian calendar.
+-          Years before the year `1' are numbered `0', `-1', and so on.
+-
+-    `%z'
+-          RFC 822/ISO 8601:1988 style numeric time zone (e.g., `-0600'
+-          or `+0100'), or nothing if no time zone is determinable.
+-
+-          This format is a GNU extension.
+-
+-          A full RFC 822 timestamp is generated by the format
+-          `"%a, %d %b %Y %H:%M:%S %z"' (or the equivalent
+-          `"%a, %d %b %Y %T %z"').
+-
+-    `%Z'
+-          The time zone abbreviation (empty if the time zone can't be
+-          determined).
+-
+-    `%%'
+-          A literal `%' character.
+-
+-     The SIZE parameter can be used to specify the maximum number of
+-     characters to be stored in the array S, including the terminating
+-     null character.  If the formatted time requires more than SIZE
+-     characters, `strftime' returns zero and the content of the array S
+-     is indetermined.  Otherwise the return value indicates the number
+-     of characters placed in the array S, not including the terminating
+-     null character.
+-
+-     *Warning:* This convention for the return value which is prescribed
+-     in ISO C can lead to problems in some situations.  For certain
+-     format strings and certain locales the output really can be the
+-     empty string and this cannot be discovered by testing the return
+-     value only.  E.g., in most locales the AM/PM time format is not
+-     supported (most of the world uses the 24 hour time
+-     representation).  In such locales `"%p"' will return the empty
+-     string, i.e., the return value is zero.  To detect situations like
+-     this something similar to the following code should be used:
+-
+-          buf[0] = '\1';
+-          len = strftime (buf, bufsize, format, tp);
+-          if (len == 0 && buf[0] != '\0')
+-            {
+-              /* Something went wrong in the strftime call.  */
+-              ...
+-            }
+-
+-     If S is a null pointer, `strftime' does not actually write
+-     anything, but instead returns the number of characters it would
+-     have written.
+-
+-     According to POSIX.1 every call to `strftime' implies a call to
+-     `tzset'.  So the contents of the environment variable `TZ' is
+-     examined before any output is produced.
+-
+-     For an example of `strftime', see *Note Time Functions Example::.
+-
+-
+-File: libc.info,  Node: Parsing Date and Time,  Next: TZ Variable,  Prev: Formatting Date and Time,  Up: Calendar Time
+-
+-Convert textual time and date information back
+-----------------------------------------------
+-
+-   The ISO C standard does not specify any functions which can convert
+-the output of the `strftime' function back into a binary format.  This
+-lead to variety of more or less successful implementations with
+-different interfaces over the years.  Then the Unix standard got
+-extended by two functions: `strptime' and `getdate'.  Both have kind of
+-strange interfaces but at least they are widely available.
+-
+-* Menu:
+-
+-* Low-Level Time String Parsing::  Interpret string according to given format.
+-* General Time String Parsing::    User-friendly function to parse data and
+-                                    time strings.
+-
+-
+-File: libc.info,  Node: Low-Level Time String Parsing,  Next: General Time String Parsing,  Up: Parsing Date and Time
+-
+-Interpret string according to given format
+-..........................................
+-
+-   The first function is a rather low-level interface.  It is
+-nevertheless frequently used in user programs since it is better known.
+-Its implementation and the interface though is heavily influenced by
+-the `getdate' function which is defined and implemented in terms of
+-calls to `strptime'.
+-
+- - Function: char * strptime (const char *S, const char *FMT, struct tm
+-          *TP)
+-     The `strptime' function parses the input string S according to the
+-     format string FMT and stores the found values in the structure TP.
+-
+-     The input string can be retrieved in any way.  It does not matter
+-     whether it was generated by a `strftime' call or made up directly
+-     by a program.  It is also not necessary that the content is in any
+-     human-recognizable format.  I.e., it is OK if a date is written
+-     like `"02:1999:9"' which is not understandable without context.
+-     As long the format string FMT matches the format of the input
+-     string everything goes.
+-
+-     The format string consists of the same components as the format
+-     string for the `strftime' function.  The only difference is that
+-     the flags `_', `-', `0', and `^' are not allowed.  Several of the
+-     formats which `strftime' handled differently do the same work in
+-     `strptime' since differences like case of the output do not
+-     matter.  For symmetry reasons all formats are supported, though.
+-
+-     The modifiers `E' and `O' are also allowed everywhere the
+-     `strftime' function allows them.
+-
+-     The formats are:
+-
+-    `%a'
+-    `%A'
+-          The weekday name according to the current locale, in
+-          abbreviated form or the full name.
+-
+-    `%b'
+-    `%B'
+-    `%h'
+-          The month name according to the current locale, in
+-          abbreviated form or the full name.
+-
+-    `%c'
+-          The date and time representation for the current locale.
+-
+-    `%Ec'
+-          Like `%c' but the locale's alternative date and time format
+-          is used.
+-
+-    `%C'
+-          The century of the year.
+-
+-          It makes sense to use this format only if the format string
+-          also contains the `%y' format.
+-
+-    `%EC'
+-          The locale's representation of the period.
+-
+-          Unlike `%C' it makes sometimes sense to use this format since
+-          in some cultures it is required to specify years relative to
+-          periods instead of using the Gregorian years.
+-
+-    `%d'
+-
+-    `%e'
+-          The day of the month as a decimal number (range `1' through
+-          `31').  Leading zeroes are permitted but not required.
+-
+-    `%Od'
+-    `%Oe'
+-          Same as `%d' but the locale's alternative numeric symbols are
+-          used.
+-
+-          Leading zeroes are permitted but not required.
+-
+-    `%D'
+-          Equivalent to the use of `%m/%d/%y' in this place.
+-
+-    `%F'
+-          Equivalent to the use of `%Y-%m-%d' which is the ISO 8601 date
+-          format.
+-
+-          This is a GNU extension following an ISO C 9X extension to
+-          `strftime'.
+-
+-    `%g'
+-          The year corresponding to the ISO week number, but without
+-          the century (range `00' through `99').
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-          This format is a GNU extension following a GNU extension of
+-          `strftime'.
+-
+-    `%G'
+-          The year corresponding to the ISO week number.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-          This format is a GNU extension following a GNU extension of
+-          `strftime'.
+-
+-    `%H'
+-    `%k'
+-          The hour as a decimal number, using a 24-hour clock (range
+-          `00' through `23').
+-
+-          `%k' is a GNU extension following a GNU extension of
+-          `strftime'.
+-
+-    `%OH'
+-          Same as `%H' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%I'
+-    `%l'
+-          The hour as a decimal number, using a 12-hour clock (range
+-          `01' through `12').
+-
+-          `%l' is a GNU extension following a GNU extension of
+-          `strftime'.
+-
+-    `%OI'
+-          Same as `%I' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%j'
+-          The day of the year as a decimal number (range `1' through
+-          `366').
+-
+-          Leading zeroes are permitted but not required.
+-
+-    `%m'
+-          The month as a decimal number (range `1' through `12').
+-
+-          Leading zeroes are permitted but not required.
+-
+-    `%Om'
+-          Same as `%m' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%M'
+-          The minute as a decimal number (range `0' through `59').
+-
+-          Leading zeroes are permitted but not required.
+-
+-    `%OM'
+-          Same as `%M' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%n'
+-    `%t'
+-          Matches any white space.
+-
+-    `%p'
+-
+-    `%P'
+-          The locale-dependent equivalent to `AM' or `PM'.
+-
+-          This format is not useful unless `%I' or `%l' is also used.
+-          Another complication is that the locale might not define
+-          these values at all and therefore the conversion fails.
+-
+-          `%P' is a GNU extension following a GNU extension to
+-          `strftime'.
+-
+-    `%r'
+-          The complete time using the AM/PM format of the current
+-          locale.
+-
+-          A complication is that the locale might not define this
+-          format at all and therefore the conversion fails.
+-
+-    `%R'
+-          The hour and minute in decimal numbers using the format
+-          `%H:%M'.
+-
+-          `%R' is a GNU extension following a GNU extension to
+-          `strftime'.
+-
+-    `%s'
+-          The number of seconds since the epoch, i.e., since 1970-01-01
+-          00:00:00 UTC.  Leap seconds are not counted unless leap
+-          second support is available.
+-
+-          `%s' is a GNU extension following a GNU extension to
+-          `strftime'.
+-
+-    `%S'
+-          The seconds as a decimal number (range `0' through `61').
+-
+-          Leading zeroes are permitted but not required.
+-
+-          Please note the nonsense with `61' being allowed.  This is
+-          what the Unix specification says.  They followed the stupid
+-          decision once made to allow double leap seconds.  These do
+-          not exist but the myth persists.
+-
+-    `%OS'
+-          Same as `%S' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%T'
+-          Equivalent to the use of `%H:%M:%S' in this place.
+-
+-    `%u'
+-          The day of the week as a decimal number (range `1' through
+-          `7'), Monday being `1'.
+-
+-          Leading zeroes are permitted but not required.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-    `%U'
+-          The week number of the current year as a decimal number
+-          (range `0' through `53').
+-
+-          Leading zeroes are permitted but not required.
+-
+-    `%OU'
+-          Same as `%U' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%V'
+-          The ISO 8601:1988 week number as a decimal number (range `1'
+-          through `53').
+-
+-          Leading zeroes are permitted but not required.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-    `%w'
+-          The day of the week as a decimal number (range `0' through
+-          `6'), Sunday being `0'.
+-
+-          Leading zeroes are permitted but not required.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-    `%Ow'
+-          Same as `%w' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%W'
+-          The week number of the current year as a decimal number
+-          (range `0' through `53').
+-
+-          Leading zeroes are permitted but not required.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-    `%OW'
+-          Same as `%W' but using the locale's alternative numeric
+-          symbols are used.
+-
+-    `%x'
+-          The date using the locale's date format.
+-
+-    `%Ex'
+-          Like `%x' but the locale's alternative data representation is
+-          used.
+-
+-    `%X'
+-          The time using the locale's time format.
+-
+-    `%EX'
+-          Like `%X' but the locale's alternative time representation is
+-          used.
+-
+-    `%y'
+-          The year without a century as a decimal number (range `0'
+-          through `99').
+-
+-          Leading zeroes are permitted but not required.
+-
+-          Please note that it is at least questionable to use this
+-          format without the `%C' format.  The `strptime' function does
+-          regard input values in the range 68 to 99 as the years 1969 to
+-          1999 and the values 0 to 68 as the years 2000 to 2068.  But
+-          maybe this heuristic fails for some input data.
+-
+-          Therefore it is best to avoid `%y' completely and use `%Y'
+-          instead.
+-
+-    `%Ey'
+-          The offset from `%EC' in the locale's alternative
+-          representation.
+-
+-    `%Oy'
+-          The offset of the year (from `%C') using the locale's
+-          alternative numeric symbols.
+-
+-    `%Y'
+-          The year as a decimal number, using the Gregorian calendar.
+-
+-    `%EY'
+-          The full alternative year representation.
+-
+-    `%z'
+-          Equivalent to the use of `%a, %d %b %Y %H:%M:%S %z' in this
+-          place.  This is the full ISO 8601 date and time format.
+-
+-    `%Z'
+-          The timezone name.
+-
+-          *Note:* This is not really implemented currently.  The format
+-          is recognized, input is consumed but no field in TM is set.
+-
+-    `%%'
+-          A literal `%' character.
+-
+-     All other characters in the format string must have a matching
+-     character in the input string.  Exceptions are white spaces in the
+-     input string which can match zero or more white space characters
+-     in the input string.
+-
+-     The `strptime' function processes the input string from right to
+-     left.  Each of the three possible input elements (white space,
+-     literal, or format) are handled one after the other.  If the input
+-     cannot be matched to the format string the function stops.  The
+-     remainder of the format and input strings are not processed.
+-
+-     The return value of the function is a pointer to the first
+-     character not processed in this function call.  In case the input
+-     string contains more characters than required by the format string
+-     the return value points right after the last consumed input
+-     character.  In case the whole input string is consumed the return
+-     value points to the NUL byte at the end of the string.  If
+-     `strptime' fails to match all of the format string and therefore
+-     an error occurred the function returns `NULL'.
+-
+-   The specification of the function in the XPG standard is rather
+-vague.  It leaves out a few important pieces of information.  Most
+-important it does not specify what happens to those elements of TM
+-which are not directly initialized by the different formats.  Various
+-implementations on different Unix systems vary here.
+-
+-   The GNU libc implementation does not touch those fields which are not
+-directly initialized.  Exceptions are the `tm_wday' and `tm_yday'
+-elements which are recomputed if any of the year, month, or date
+-elements changed.  This has two implications:
+-
+-   * Before calling the `strptime' function for a new input string one
+-     has to prepare the structure passed in as the TM.  Normally this
+-     will mean that all values are initialized to zero.  Alternatively
+-     one can use all fields to values like `INT_MAX' which allows to
+-     determine which elements were set by the function call.  Zero does
+-     not work here since it is a valid value for many of the fields.
+-
+-     Careful initialization is necessary if one wants to find out
+-     whether a certain field in TM was initialized by the function call.
+-
+-   * One can construct a `struct tm' value in several `strptime' calls
+-     in a row.  A useful application of this is for example the parsing
+-     of two separate strings, one containing the date information, the
+-     other the time information.  By parsing both one after the other
+-     without clearing the structure in between one can construct a
+-     complete broken-down time.
+-
+-   The following example shows a function which parses a string which is
+-supposed to contain the date information in either US style or ISO 8601
+-form.
+-
+-     const char *
+-     parse_date (const char *input, struct tm *tm)
+-     {
+-       const char *cp;
+-     
+-       /* First clear the result structure.  */
+-       memset (tm, '\0', sizeof (*tm));
+-     
+-       /* Try the ISO format first.  */
+-       cp = strptime (input, "%F", tm);
+-       if (cp == NULL)
+-         {
+-           /* Does not match.  Try the US form.  */
+-           cp = strptime (input, "%D", tm);
+-         }
+-     
+-       return cp;
+-     }
+-
+-
+-File: libc.info,  Node: General Time String Parsing,  Prev: Low-Level Time String Parsing,  Up: Parsing Date and Time
+-
+-A user-friendlier way to parse times and dates
+-..............................................
+-
+-   The Unix standard defines another function to parse date strings.
+-The interface is, mildly said, weird.  But if this function fits into
+-the application to be written it is just fine.  It is a problem when
+-using this function in multi-threaded programs or in libraries since it
+-returns a pointer to a static variable, uses a global variable, and a
+-global state (an environment variable).
+-
+- - Variable: getdate_err
+-     This variable of type `int' will contain the error code of the last
+-     unsuccessful call of the `getdate' function.  Defined values are:
+-
+-    1
+-          The environment variable `DATEMSK' is not defined or null.
+-
+-    2
+-          The template file denoted by the `DATEMSK' environment
+-          variable cannot be opened.
+-
+-    3
+-          Information about the template file cannot retrieved.
+-
+-    4
+-          The template file is no regular file.
+-
+-    5
+-          An I/O error occurred while reading the template file.
+-
+-    6
+-          Not enough memory available to execute the function.
+-
+-    7
+-          The template file contains no matching template.
+-
+-    8
+-          The input string is invalid for a template which would match
+-          otherwise.  This includes error like February 31st, or return
+-          values which can be represented using `time_t'.
+-
+- - Function: struct tm * getdate (const char *STRING)
+-     The interface of the `getdate' function is the simplest possible
+-     for a function to parse a string and return the value.  STRING is
+-     the input string and the result is passed to the user in a
+-     statically allocated variable.
+-
+-     The details about how the string is processed is hidden from the
+-     user.  In fact, it can be outside the control of the program.
+-     Which formats are recognized is controlled by the file named by
+-     the environment variable `DATEMSK'.  The content of the named file
+-     should contain lines of valid format strings which could be passed
+-     to `strptime'.
+-
+-     The `getdate' function reads these format strings one after the
+-     other and tries to match the input string.  The first line which
+-     completely matches the input string is used.
+-
+-     Elements which were not initialized through the format string get
+-     assigned the values of the time the `getdate' function is called.
+-
+-     The format elements recognized by `getdate' are the same as for
+-     `strptime'.  See above for an explanation.  There are only a few
+-     extension to the `strptime' behavior:
+-
+-        * If the `%Z' format is given the broken-down time is based on
+-          the current time in the timezone matched, not in the current
+-          timezone of the runtime environment.
+-
+-          *Note*: This is not implemented (currently).  The problem is
+-          that timezone names are not unique.  If a fixed timezone is
+-          assumed for a given string (say `EST' meaning US East Coast
+-          time) uses for countries other than the USA will fail.  So
+-          far we have found no good solution for this.
+-
+-        * If only the weekday is specified the selected day depends on
+-          the current date.  If the current weekday is greater or equal
+-          to the `tm_wday' value this weeks day is selected.  Otherwise
+-          next weeks day.
+-
+-        * A similar heuristic is used if only the month is given, not
+-          the year.  For value corresponding to the current or a later
+-          month the current year s used.  Otherwise the next year.  The
+-          first day of the month is assumed if it is not explicitly
+-          specified.
+-
+-        * The current hour, minute, and second is used if the
+-          appropriate value is not set through the format.
+-
+-        * If no date is given the date for the next day is used if the
+-          time is smaller than the current time.  Otherwise it is the
+-          same day.
+-
+-     It should be noted that the format in the template file need not
+-     only contain format elements.  The following is a list of possible
+-     format strings (taken from the Unix standard):
+-
+-          %m
+-          %A %B %d, %Y %H:%M:%S
+-          %A
+-          %B
+-          %m/%d/%y %I %p
+-          %d,%m,%Y %H:%M
+-          at %A the %dst of %B in %Y
+-          run job at %I %p,%B %dnd
+-          %A den %d. %B %Y %H.%M Uhr
+-
+-     As one can see the template list can contain very specific strings
+-     like `run job at %I %p,%B %dnd'.  Using the above list of
+-     templates and assuming the current time is Mon Sep 22 12:19:47 EDT
+-     1986 we can get the following results for the given input.
+-
+-     Mon           %a          Mon Sep 22 12:19:47 EDT 1986             
+-     Sun           %a          Sun Sep 28 12:19:47 EDT 1986             
+-     Fri           %a          Fri Sep 26 12:19:47 EDT 1986             
+-     September     %B          Mon Sep 1 12:19:47 EDT 1986              
+-     January       %B          Thu Jan 1 12:19:47 EST 1987              
+-     December      %B          Mon Dec 1 12:19:47 EST 1986              
+-     Sep Mon       %b %a       Mon Sep 1 12:19:47 EDT 1986              
+-     Jan Fri       %b %a       Fri Jan 2 12:19:47 EST 1987              
+-     Dec Mon       %b %a       Mon Dec 1 12:19:47 EST 1986              
+-     Jan Wed 1989  %b %a %Y    Wed Jan 4 12:19:47 EST 1989              
+-     Fri 9         %a %H       Fri Sep 26 09:00:00 EDT 1986             
+-     Feb 10:30     %b %H:%S    Sun Feb 1 10:00:30 EST 1987              
+-     10:30         %H:%M       Tue Sep 23 10:30:00 EDT 1986             
+-     13:30         %H:%M       Mon Sep 22 13:30:00 EDT 1986             
+-
+-     The return value of the function is a pointer to a static variable
+-     of type `struct tm' or a null pointer if an error occurred.  The
+-     result in the variable pointed to by the return value is only valid
+-     until the next `getdate' call which makes this function unusable in
+-     multi-threaded applications.
+-
+-     The `errno' variable is *not* changed.  Error conditions are
+-     signalled using the global variable `getdate_err'.  See the
+-     description above for a list of the possible error values.
+-
+-     *Warning:* The `getdate' function should *never* be used in
+-     SUID-programs.  The reason is obvious: using the `DATEMSK'
+-     environment variable one can get the function to open any
+-     arbitrary file and chances are high that with some bogus input
+-     (such as a binary file) the program will crash.
+-
+- - Function: int getdate_r (const char *STRING, struct tm *TP)
+-     The `getdate_r' function is the reentrant counterpart of
+-     `getdate'.  It does not use the global variable `getdate_err' to
+-     signal the error but instead the return value now is this error
+-     code.  The same error codes as described in the `getdate_err'
+-     documentation above are used.
+-
+-     `getdate_r' also does not store the broken-down time in a static
+-     variable.  Instead it takes an second argument which must be a
+-     pointer to a variable of type `struct tm' where the broken-down
+-     can be stored.
+-
+-     This function is not defined in the Unix standard.  Nevertheless
+-     it is available on some other Unix systems as well.
+-
+-     As for `getdate' the warning for using this function in
+-     SUID-programs applies to `getdate_r' as well.
+-
+-
+-File: libc.info,  Node: TZ Variable,  Next: Time Zone Functions,  Prev: Parsing Date and Time,  Up: Calendar Time
+-
+-Specifying the Time Zone with `TZ'
+-----------------------------------
+-
+-   In POSIX systems, a user can specify the time zone by means of the
+-`TZ' environment variable.  For information about how to set
+-environment variables, see *Note Environment Variables::.  The functions
+-for accessing the time zone are declared in `time.h'.
+-
+-   You should not normally need to set `TZ'.  If the system is
+-configured properly, the default time zone will be correct.  You might
+-set `TZ' if you are using a computer over the network from a different
+-time zone, and would like times reported to you in the time zone that
+-local for you, rather than what is local for the computer.
+-
+-   In POSIX.1 systems the value of the `TZ' variable can be of one of
+-three formats.  With the GNU C library, the most common format is the
+-last one, which can specify a selection from a large database of time
+-zone information for many regions of the world.  The first two formats
+-are used to describe the time zone information directly, which is both
+-more cumbersome and less precise.  But the POSIX.1 standard only
+-specifies the details of the first two formats, so it is good to be
+-familiar with them in case you come across a POSIX.1 system that doesn't
+-support a time zone information database.
+-
+-   The first format is used when there is no Daylight Saving Time (or
+-summer time) in the local time zone:
+-
+-     STD OFFSET
+-
+-   The STD string specifies the name of the time zone.  It must be
+-three or more characters long and must not contain a leading colon or
+-embedded digits, commas, or plus or minus signs.  There is no space
+-character separating the time zone name from the OFFSET, so these
+-restrictions are necessary to parse the specification correctly.
+-
+-   The OFFSET specifies the time value one must add to the local time
+-to get a Coordinated Universal Time value.  It has syntax like
+-[`+'|`-']HH[`:'MM[`:'SS]].  This is positive if the local time zone is
+-west of the Prime Meridian and negative if it is east.  The hour must
+-be between `0' and `23', and the minute and seconds between `0' and
+-`59'.
+-
+-   For example, here is how we would specify Eastern Standard Time, but
+-without any daylight saving time alternative:
+-
+-     EST+5
+-
+-   The second format is used when there is Daylight Saving Time:
+-
+-     STD OFFSET DST [OFFSET]`,'START[`/'TIME]`,'END[`/'TIME]
+-
+-   The initial STD and OFFSET specify the standard time zone, as
+-described above.  The DST string and OFFSET specify the name and offset
+-for the corresponding daylight saving time zone; if the OFFSET is
+-omitted, it defaults to one hour ahead of standard time.
+-
+-   The remainder of the specification describes when daylight saving
+-time is in effect.  The START field is when daylight saving time goes
+-into effect and the END field is when the change is made back to
+-standard time.  The following formats are recognized for these fields:
+-
+-`JN'
+-     This specifies the Julian day, with N between `1' and `365'.
+-     February 29 is never counted, even in leap years.
+-
+-`N'
+-     This specifies the Julian day, with N between `0' and `365'.
+-     February 29 is counted in leap years.
+-
+-`MM.W.D'
+-     This specifies day D of week W of month M.  The day D must be
+-     between `0' (Sunday) and `6'.  The week W must be between `1' and
+-     `5'; week `1' is the first week in which day D occurs, and week
+-     `5' specifies the *last* D day in the month.  The month M should be
+-     between `1' and `12'.
+-
+-   The TIME fields specify when, in the local time currently in effect,
+-the change to the other time occurs.  If omitted, the default is
+-`02:00:00'.
+-
+-   For example, here is how one would specify the Eastern time zone in
+-the United States, including the appropriate daylight saving time and
+-its dates of applicability.  The normal offset from UTC is 5 hours;
+-since this is west of the prime meridian, the sign is positive.  Summer
+-time begins on the first Sunday in April at 2:00am, and ends on the
+-last Sunday in October at 2:00am.
+-
+-     EST+5EDT,M4.1.0/2,M10.5.0/2
+-
+-   The schedule of daylight saving time in any particular jurisdiction
+-has changed over the years.  To be strictly correct, the conversion of
+-dates and times in the past should be based on the schedule that was in
+-effect then.  However, this format has no facilities to let you specify
+-how the schedule has changed from year to year.  The most you can do is
+-specify one particular schedule--usually the present day schedule--and
+-this is used to convert any date, no matter when.  For precise time zone
+-specifications, it is best to use the time zone information database
+-(see below).
+-
+-   The third format looks like this:
+-
+-     :CHARACTERS
+-
+-   Each operating system interprets this format differently; in the GNU
+-C library, CHARACTERS is the name of a file which describes the time
+-zone.
+-
+-   If the `TZ' environment variable does not have a value, the
+-operation chooses a time zone by default.  In the GNU C library, the
+-default time zone is like the specification `TZ=:/etc/localtime' (or
+-`TZ=:/usr/local/etc/localtime', depending on how GNU C library was
+-configured; *note Installation::.).  Other C libraries use their own
+-rule for choosing the default time zone, so there is little we can say
+-about them.
+-
+-   If CHARACTERS begins with a slash, it is an absolute file name;
+-otherwise the library looks for the file
+-`/share/lib/zoneinfo/CHARACTERS'.  The `zoneinfo' directory contains
+-data files describing local time zones in many different parts of the
+-world.  The names represent major cities, with subdirectories for
+-geographical areas; for example, `America/New_York', `Europe/London',
+-`Asia/Hong_Kong'.  These data files are installed by the system
+-administrator, who also sets `/etc/localtime' to point to the data file
+-for the local time zone.  The GNU C library comes with a large database
+-of time zone information for most regions of the world, which is
+-maintained by a community of volunteers and put in the public domain.
+-
+-
+-File: libc.info,  Node: Time Zone Functions,  Next: Time Functions Example,  Prev: TZ Variable,  Up: Calendar Time
+-
+-Functions and Variables for Time Zones
+---------------------------------------
+-
+- - Variable: char * tzname [2]
+-     The array `tzname' contains two strings, which are the standard
+-     names of the pair of time zones (standard and daylight saving)
+-     that the user has selected.  `tzname[0]' is the name of the
+-     standard time zone (for example, `"EST"'), and `tzname[1]' is the
+-     name for the time zone when daylight saving time is in use (for
+-     example, `"EDT"').  These correspond to the STD and DST strings
+-     (respectively) from the `TZ' environment variable.  If daylight
+-     saving time is never used, `tzname[1]' is the empty string.
+-
+-     The `tzname' array is initialized from the `TZ' environment
+-     variable whenever `tzset', `ctime', `strftime', `mktime', or
+-     `localtime' is called.  If multiple abbreviations have been used
+-     (e.g. `"EWT"' and `"EDT"' for U.S. Eastern War Time and Eastern
+-     Daylight Time), the array contains the most recent abbreviation.
+-
+-     The `tzname' array is required for POSIX.1 compatibility, but in
+-     GNU programs it is better to use the `tm_zone' member of the
+-     broken-down time structure, since `tm_zone' reports the correct
+-     abbreviation even when it is not the latest one.
+-
+-     Though the strings are declared as `char *' the user must stay away
+-     from modifying these strings.  Modifying the strings will almost
+-     certainly lead to trouble.
+-
+-
+- - Function: void tzset (void)
+-     The `tzset' function initializes the `tzname' variable from the
+-     value of the `TZ' environment variable.  It is not usually
+-     necessary for your program to call this function, because it is
+-     called automatically when you use the other time conversion
+-     functions that depend on the time zone.
+-
+-   The following variables are defined for compatibility with System V
+-Unix.  Like `tzname', these variables are set by calling `tzset' or the
+-other time conversion functions.
+-
+- - Variable: long int timezone
+-     This contains the difference between UTC and the latest local
+-     standard time, in seconds west of UTC.  For example, in the U.S.
+-     Eastern time zone, the value is `5*60*60'.  Unlike the `tm_gmtoff'
+-     member of the broken-down time structure, this value is not
+-     adjusted for daylight saving, and its sign is reversed.  In GNU
+-     programs it is better to use `tm_gmtoff', since it contains the
+-     correct offset even when it is not the latest one.
+-
+- - Variable: int daylight
+-     This variable has a nonzero value if daylight savings time rules
+-     apply.  A nonzero value does not necessarily mean that daylight
+-     savings time is now in effect; it means only that daylight savings
+-     time is sometimes in effect.
+-
+-
+-File: libc.info,  Node: Time Functions Example,  Prev: Time Zone Functions,  Up: Calendar Time
+-
+-Time Functions Example
+-----------------------
+-
+-   Here is an example program showing the use of some of the local time
+-and calendar time functions.
+-
+-     #include <time.h>
+-     #include <stdio.h>
+-     
+-     #define SIZE 256
+-     
+-     int
+-     main (void)
+-     {
+-       char buffer[SIZE];
+-       time_t curtime;
+-       struct tm *loctime;
+-     
+-       /* Get the current time. */
+-       curtime = time (NULL);
+-     
+-       /* Convert it to local time representation. */
+-       loctime = localtime (&curtime);
+-     
+-       /* Print out the date and time in the standard format. */
+-       fputs (asctime (loctime), stdout);
+-     /* Print it out in a nice format. */
+-       strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime);
+-       fputs (buffer, stdout);
+-       strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime);
+-       fputs (buffer, stdout);
+-     
+-       return 0;
+-     }
+-
+-   It produces output like this:
+-
+-     Wed Jul 31 13:02:36 1991
+-     Today is Wednesday, July 31.
+-     The time is 01:02 PM.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-31 glibc-2.1.3/manual/libc.info-31
+--- ../glibc-2.1.3/manual/libc.info-31	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-31	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1223 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Precision Time,  Next: Setting an Alarm,  Prev: Calendar Time,  Up: Date and Time
+-
+-Precision Time
+-==============
+-
+-   The `net_gettime' and `ntp_adjtime' functions provide an interface
+-to monitor and manipulate high precision time.  These functions are
+-declared in `sys/timex.h'.
+-
+- - Data Type: struct ntptimeval
+-     This structure is used to monitor kernel time.  It contains the
+-     following members:
+-    `struct timeval time'
+-          This is the current time.  The `struct timeval' data type is
+-          described in *Note High-Resolution Calendar::.
+-
+-    `long int maxerror'
+-          This is the maximum error, measured in microseconds.  Unless
+-          updated via `ntp_adjtime' periodically, this value will reach
+-          some platform-specific maximum value.
+-
+-    `long int esterror'
+-          This is the estimated error, measured in microseconds.  This
+-          value can be set by `ntp_adjtime' to indicate the estimated
+-          offset of the local clock against the true time.
+-
+- - Function: int ntp_gettime (struct ntptimeval *TPTR)
+-     The `ntp_gettime' function sets the structure pointed to by TPTR
+-     to current values.  The elements of the structure afterwards
+-     contain the values the timer implementation in the kernel assumes.
+-     They might or might not be correct.  If they are not a
+-     `ntp_adjtime' call is necessary.
+-
+-     The return value is `0' on success and other values on failure.
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `TIME_ERROR'
+-          The precision clock model is not properly set up at the
+-          moment, thus the clock must be considered unsynchronized, and
+-          the values should be treated with care.
+-
+- - Data Type: struct timex
+-     This structure is used to control and monitor kernel time in a
+-     greater level of detail.  It contains the following members:
+-    `unsigned int modes'
+-          This variable controls whether and which values are set.
+-          Several symbolic constants have to be combined with *binary
+-          or* to specify the effective mode.  These constants start
+-          with `MOD_'.
+-
+-    `long int offset'
+-          This value indicates the current offset of the local clock
+-          from the true time.  The value is given in microseconds.  If
+-          bit `MOD_OFFSET' is set in `modes', the offset (and possibly
+-          other dependent values) can be set.  The offset's absolute
+-          value must not exceed `MAXPHASE'.
+-
+-    `long int frequency'
+-          This value indicates the difference in frequency between the
+-          true time and the local clock.  The value is expressed as
+-          scaled PPM (parts per million, 0.0001%).  The scaling is `1
+-          << SHIFT_USEC'.  The value can be set with bit
+-          `MOD_FREQUENCY', but the absolute value must not exceed
+-          `MAXFREQ'.
+-
+-    `long int maxerror'
+-          This is the maximum error, measured in microseconds.  A new
+-          value can be set using bit `MOD_MAXERROR'.  Unless updated via
+-          `ntp_adjtime' periodically, this value will increase steadily
+-          and reach some platform-specific maximum value.
+-
+-    `long int esterror'
+-          This is the estimated error, measured in microseconds.  This
+-          value can be set using bit `MOD_ESTERROR'.
+-
+-    `int status'
+-          This valiable reflects the various states of the clock
+-          machinery.  There are symbolic constants for the significant
+-          bits, starting with `STA_'.  Some of these flags can be
+-          updated using the `MOD_STATUS' bit.
+-
+-    `long int constant'
+-          This value represents the bandwidth or stiffness of the PLL
+-          (phase locked loop) implemented in the kernel.  The value can
+-          be changed using bit `MOD_TIMECONST'.
+-
+-    `long int precision'
+-          This value represents the accuracy or the maximum error when
+-          reading the system clock.  The value is expressed in
+-          microseconds and can't be changed.
+-
+-    `long int tolerance'
+-          This value represents the maximum frequency error of the
+-          system clock in scaled PPM.  This value is used to increase
+-          the `maxerror' every second.
+-
+-    `long int ppsfreq'
+-          This is the first of a few optional variables that are
+-          present only if the system clock can use a PPS (pulse per
+-          second) signal to discipline the local clock.  The value is
+-          expressed in scaled PPM and it denotes the difference in
+-          frequency between the local clock and the PPS signal.
+-
+-    `long int jitter'
+-          This value expresses a median filtered average of the PPS
+-          signal's dispersion in microseconds.
+-
+-    `int int shift'
+-          This value is a binary exponent for the duration of the PPS
+-          calibration interval, ranging from `PPS_SHIFT' to
+-          `PPS_SHIFTMAX'.
+-
+-    `long int stabil'
+-          This value represents the median filtered dispersion of the
+-          PPS frequency in scaled PPM.
+-
+-    `long int jitcnt'
+-          This counter represents the numer of pulses where the jitter
+-          exceeded the allowed maximum `MAXTIME'.
+-
+-    `long int calcnt'
+-          This counter reflects the number of successful calibration
+-          intervals.
+-
+-    `long int errcnt'
+-          This counter represents the number of calibration errors
+-          (caused by large offsets or jitter).
+-
+-    `long int stbcnt'
+-          This counter denotes the number of of calibrations where the
+-          stability exceeded the threshold.
+-
+- - Function: int ntp_adjtime (struct timex *TPTR)
+-     The `ntp_adjtime' function sets the structure specified by TPTR to
+-     current values.  In addition, values passed in TPTR can be used to
+-     replace existing settings.  To do this the `modes' element of the
+-     `struct timex' must be set appropriately.  Setting it to zero
+-     selects reading the current state.
+-
+-     The return value is `0' on success and other values on failure.
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `TIME_ERROR'
+-          The precision clock model is not properly set up at the
+-          moment, thus the clock must be considered unsynchronized, and
+-          the values should be treated with care.  Another reason could
+-          be that the specified new values are not allowed.
+-
+-     For more details see RFC1305 (Network Time Protocol, Version 3) and
+-     related documents.
+-
+-
+-File: libc.info,  Node: Setting an Alarm,  Next: Sleeping,  Prev: Precision Time,  Up: Date and Time
+-
+-Setting an Alarm
+-================
+-
+-   The `alarm' and `setitimer' functions provide a mechanism for a
+-process to interrupt itself at some future time.  They do this by
+-setting a timer; when the timer expires, the process receives a signal.
+-
+-   Each process has three independent interval timers available:
+-
+-   * A real-time timer that counts clock time.  This timer sends a
+-     `SIGALRM' signal to the process when it expires.
+-
+-   * A virtual timer that counts CPU time used by the process.  This
+-     timer sends a `SIGVTALRM' signal to the process when it expires.
+-
+-   * A profiling timer that counts both CPU time used by the process,
+-     and CPU time spent in system calls on behalf of the process.  This
+-     timer sends a `SIGPROF' signal to the process when it expires.
+-
+-     This timer is useful for profiling in interpreters.  The interval
+-     timer mechanism does not have the fine granularity necessary for
+-     profiling native code.
+-
+-   You can only have one timer of each kind set at any given time.  If
+-you set a timer that has not yet expired, that timer is simply reset to
+-the new value.
+-
+-   You should establish a handler for the appropriate alarm signal using
+-`signal' or `sigaction' before issuing a call to `setitimer' or
+-`alarm'.  Otherwise, an unusual chain of events could cause the timer
+-to expire before your program establishes the handler, and in that case
+-it would be terminated, since that is the default action for the alarm
+-signals.  *Note Signal Handling::.
+-
+-   The `setitimer' function is the primary means for setting an alarm.
+-This facility is declared in the header file `sys/time.h'.  The `alarm'
+-function, declared in `unistd.h', provides a somewhat simpler interface
+-for setting the real-time timer.
+-
+- - Data Type: struct itimerval
+-     This structure is used to specify when a timer should expire.  It
+-     contains the following members:
+-    `struct timeval it_interval'
+-          This is the interval between successive timer interrupts.  If
+-          zero, the alarm will only be sent once.
+-
+-    `struct timeval it_value'
+-          This is the interval to the first timer interrupt.  If zero,
+-          the alarm is disabled.
+-
+-     The `struct timeval' data type is described in *Note
+-     High-Resolution Calendar::.
+-
+- - Function: int setitimer (int WHICH, struct itimerval *NEW, struct
+-          itimerval *OLD)
+-     The `setitimer' function sets the timer specified by WHICH
+-     according to NEW.  The WHICH argument can have a value of
+-     `ITIMER_REAL', `ITIMER_VIRTUAL', or `ITIMER_PROF'.
+-
+-     If OLD is not a null pointer, `setitimer' returns information
+-     about any previous unexpired timer of the same kind in the
+-     structure it points to.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EINVAL'
+-          The timer interval was too large.
+-
+- - Function: int getitimer (int WHICH, struct itimerval *OLD)
+-     The `getitimer' function stores information about the timer
+-     specified by WHICH in the structure pointed at by OLD.
+-
+-     The return value and error conditions are the same as for
+-     `setitimer'.
+-
+-`ITIMER_REAL'
+-     This constant can be used as the WHICH argument to the `setitimer'
+-     and `getitimer' functions to specify the real-time timer.
+-
+-`ITIMER_VIRTUAL'
+-     This constant can be used as the WHICH argument to the `setitimer'
+-     and `getitimer' functions to specify the virtual timer.
+-
+-`ITIMER_PROF'
+-     This constant can be used as the WHICH argument to the `setitimer'
+-     and `getitimer' functions to specify the profiling timer.
+-
+- - Function: unsigned int alarm (unsigned int SECONDS)
+-     The `alarm' function sets the real-time timer to expire in SECONDS
+-     seconds.  If you want to cancel any existing alarm, you can do
+-     this by calling `alarm' with a SECONDS argument of zero.
+-
+-     The return value indicates how many seconds remain before the
+-     previous alarm would have been sent.  If there is no previous
+-     alarm, `alarm' returns zero.
+-
+-   The `alarm' function could be defined in terms of `setitimer' like
+-this:
+-
+-     unsigned int
+-     alarm (unsigned int seconds)
+-     {
+-       struct itimerval old, new;
+-       new.it_interval.tv_usec = 0;
+-       new.it_interval.tv_sec = 0;
+-       new.it_value.tv_usec = 0;
+-       new.it_value.tv_sec = (long int) seconds;
+-       if (setitimer (ITIMER_REAL, &new, &old) < 0)
+-         return 0;
+-       else
+-         return old.it_value.tv_sec;
+-     }
+-
+-   There is an example showing the use of the `alarm' function in *Note
+-Handler Returns::.
+-
+-   If you simply want your process to wait for a given number of
+-seconds, you should use the `sleep' function.  *Note Sleeping::.
+-
+-   You shouldn't count on the signal arriving precisely when the timer
+-expires.  In a multiprocessing environment there is typically some
+-amount of delay involved.
+-
+-   *Portability Note:* The `setitimer' and `getitimer' functions are
+-derived from BSD Unix, while the `alarm' function is specified by the
+-POSIX.1 standard.  `setitimer' is more powerful than `alarm', but
+-`alarm' is more widely used.
+-
+-
+-File: libc.info,  Node: Sleeping,  Next: Resource Usage,  Prev: Setting an Alarm,  Up: Date and Time
+-
+-Sleeping
+-========
+-
+-   The function `sleep' gives a simple way to make the program wait for
+-short periods of time.  If your program doesn't use signals (except to
+-terminate), then you can expect `sleep' to wait reliably for the
+-specified amount of time.  Otherwise, `sleep' can return sooner if a
+-signal arrives; if you want to wait for a given period regardless of
+-signals, use `select' (*note Waiting for I/O::.) and don't specify any
+-descriptors to wait for.
+-
+- - Function: unsigned int sleep (unsigned int SECONDS)
+-     The `sleep' function waits for SECONDS or until a signal is
+-     delivered, whichever happens first.
+-
+-     If `sleep' function returns because the requested time has
+-     elapsed, it returns a value of zero.  If it returns because of
+-     delivery of a signal, its return value is the remaining time in
+-     the sleep period.
+-
+-     The `sleep' function is declared in `unistd.h'.
+-
+-   Resist the temptation to implement a sleep for a fixed amount of
+-time by using the return value of `sleep', when nonzero, to call
+-`sleep' again.  This will work with a certain amount of accuracy as
+-long as signals arrive infrequently.  But each signal can cause the
+-eventual wakeup time to be off by an additional second or so.  Suppose a
+-few signals happen to arrive in rapid succession by bad luck--there is
+-no limit on how much this could shorten or lengthen the wait.
+-
+-   Instead, compute the time at which the program should stop waiting,
+-and keep trying to wait until that time.  This won't be off by more
+-than a second.  With just a little more work, you can use `select' and
+-make the waiting period quite accurate.  (Of course, heavy system load
+-can cause unavoidable additional delays--unless the machine is
+-dedicated to one application, there is no way you can avoid this.)
+-
+-   On some systems, `sleep' can do strange things if your program uses
+-`SIGALRM' explicitly.  Even if `SIGALRM' signals are being ignored or
+-blocked when `sleep' is called, `sleep' might return prematurely on
+-delivery of a `SIGALRM' signal.  If you have established a handler for
+-`SIGALRM' signals and a `SIGALRM' signal is delivered while the process
+-is sleeping, the action taken might be just to cause `sleep' to return
+-instead of invoking your handler.  And, if `sleep' is interrupted by
+-delivery of a signal whose handler requests an alarm or alters the
+-handling of `SIGALRM', this handler and `sleep' will interfere.
+-
+-   On the GNU system, it is safe to use `sleep' and `SIGALRM' in the
+-same program, because `sleep' does not work by means of `SIGALRM'.
+-
+- - Function: int nanosleep (const struct timespec *REQUESTED_TIME,
+-          struct timespec *REMAINING)
+-     If the resolution of seconds is not enough the `nanosleep' function
+-     can be used.  As the name suggests the sleeping period can be
+-     specified in nanoseconds.  The actual period of waiting time might
+-     be longer since the requested time in the REQUESTED_TIME parameter
+-     is rounded up to the next integer multiple of the actual
+-     resolution of the system.
+-
+-     If the function returns because the time has elapsed the return
+-     value is zero.  If the function return -1 the global variable ERRNO
+-     is set to the following values:
+-
+-    `EINTR'
+-          The call was interrupted because a signal was delivered to
+-          the thread.  If the REMAINING parameter is not the null
+-          pointer the structure pointed to by REMAINING is updated to
+-          contain the remaining time.
+-
+-    `EINVAL'
+-          The nanosecond value in the REQUESTED_TIME parameter contains
+-          an illegal value.  Either the value is negative or greater
+-          than or equal to 1000 million.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `nanosleep' is called.  If the thread gets canceled these
+-     resources stay allocated until the program ends.  To avoid this
+-     calls to `nanosleep' should be protected using cancelation
+-     handlers.
+-
+-     The `nanosleep' function is declared in `time.h'.
+-
+-
+-File: libc.info,  Node: Resource Usage,  Next: Limits on Resources,  Prev: Sleeping,  Up: Date and Time
+-
+-Resource Usage
+-==============
+-
+-   The function `getrusage' and the data type `struct rusage' are used
+-for examining the usage figures of a process.  They are declared in
+-`sys/resource.h'.
+-
+- - Function: int getrusage (int PROCESSES, struct rusage *RUSAGE)
+-     This function reports the usage totals for processes specified by
+-     PROCESSES, storing the information in `*RUSAGE'.
+-
+-     In most systems, PROCESSES has only two valid values:
+-
+-    `RUSAGE_SELF'
+-          Just the current process.
+-
+-    `RUSAGE_CHILDREN'
+-          All child processes (direct and indirect) that have
+-          terminated already.
+-
+-     In the GNU system, you can also inquire about a particular child
+-     process by specifying its process ID.
+-
+-     The return value of `getrusage' is zero for success, and `-1' for
+-     failure.
+-
+-    `EINVAL'
+-          The argument PROCESSES is not valid.
+-
+-   One way of getting usage figures for a particular child process is
+-with the function `wait4', which returns totals for a child when it
+-terminates.  *Note BSD Wait Functions::.
+-
+- - Data Type: struct rusage
+-     This data type records a collection usage amounts for various
+-     sorts of resources.  It has the following members, and possibly
+-     others:
+-
+-    `struct timeval ru_utime'
+-          Time spent executing user instructions.
+-
+-    `struct timeval ru_stime'
+-          Time spent in operating system code on behalf of PROCESSES.
+-
+-    `long int ru_maxrss'
+-          The maximum resident set size used, in kilobytes.  That is,
+-          the maximum number of kilobytes that PROCESSES used in real
+-          memory simultaneously.
+-
+-    `long int ru_ixrss'
+-          An integral value expressed in kilobytes times ticks of
+-          execution, which indicates the amount of memory used by text
+-          that was shared with other processes.
+-
+-    `long int ru_idrss'
+-          An integral value expressed the same way, which is the amount
+-          of unshared memory used in data.
+-
+-    `long int ru_isrss'
+-          An integral value expressed the same way, which is the amount
+-          of unshared memory used in stack space.
+-
+-    `long int ru_minflt'
+-          The number of page faults which were serviced without
+-          requiring any I/O.
+-
+-    `long int ru_majflt'
+-          The number of page faults which were serviced by doing I/O.
+-
+-    `long int ru_nswap'
+-          The number of times PROCESSES was swapped entirely out of
+-          main memory.
+-
+-    `long int ru_inblock'
+-          The number of times the file system had to read from the disk
+-          on behalf of PROCESSES.
+-
+-    `long int ru_oublock'
+-          The number of times the file system had to write to the disk
+-          on behalf of PROCESSES.
+-
+-    `long int ru_msgsnd'
+-          Number of IPC messages sent.
+-
+-    `long ru_msgrcv'
+-          Number of IPC messages received.
+-
+-    `long int ru_nsignals'
+-          Number of signals received.
+-
+-    `long int ru_nvcsw'
+-          The number of times PROCESSES voluntarily invoked a context
+-          switch (usually to wait for some service).
+-
+-    `long int ru_nivcsw'
+-          The number of times an involuntary context switch took place
+-          (because the time slice expired, or another process of higher
+-          priority became runnable).
+-
+-   An additional historical function for examining usage figures,
+-`vtimes', is supported but not documented here.  It is declared in
+-`sys/vtimes.h'.
+-
+-
+-File: libc.info,  Node: Limits on Resources,  Next: Priority,  Prev: Resource Usage,  Up: Date and Time
+-
+-Limiting Resource Usage
+-=======================
+-
+-   You can specify limits for the resource usage of a process.  When the
+-process tries to exceed a limit, it may get a signal, or the system call
+-by which it tried to do so may fail, depending on the limit.  Each
+-process initially inherits its limit values from its parent, but it can
+-subsequently change them.
+-
+-   The symbols in this section are defined in `sys/resource.h'.
+-
+- - Function: int getrlimit (int RESOURCE, struct rlimit *RLP)
+-     Read the current value and the maximum value of resource RESOURCE
+-     and store them in `*RLP'.
+-
+-     The return value is `0' on success and `-1' on failure.  The only
+-     possible `errno' error condition is `EFAULT'.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `getrlimit64'.  I.e., the
+-     LFS interface transparently replaces the old interface.
+-
+- - Function: int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)
+-     This function is similar to the `getrlimit' but its second
+-     parameter is a pointer to a variable of type `struct rlimit64'
+-     which allows this function to read values which wouldn't fit in the
+-     member of a `struct rlimit'.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `getrlimit'
+-     and so transparently replaces the old interface.
+-
+- - Function: int setrlimit (int RESOURCE, const struct rlimit *RLP)
+-     Store the current value and the maximum value of resource RESOURCE
+-     in `*RLP'.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition is possible:
+-
+-    `EPERM'
+-          You tried to change the maximum permissible limit value, but
+-          you don't have privileges to do so.
+-
+-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
+-     32 bits system this function is in fact `setrlimit64'.  I.e., the
+-     LFS interface transparently replaces the old interface.
+-
+- - Function: int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)
+-     This function is similar to the `setrlimit' but its second
+-     parameter is a pointer to a variable of type `struct rlimit64'
+-     which allows this function to set values which wouldn't fit in the
+-     member of a `struct rlimit'.
+-
+-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
+-     bits machine this function is available under the name `setrlimit'
+-     and so transparently replaces the old interface.
+-
+- - Data Type: struct rlimit
+-     This structure is used with `getrlimit' to receive limit values,
+-     and with `setrlimit' to specify limit values.  It has two fields:
+-
+-    `rlim_t rlim_cur'
+-          The current value of the limit in question.  This is also
+-          called the "soft limit".
+-
+-    `rlim_t rlim_max'
+-          The maximum permissible value of the limit in question.  You
+-          cannot set the current value of the limit to a larger number
+-          than this maximum.  Only the super user can change the
+-          maximum permissible value.  This is also called the "hard
+-          limit".
+-
+-     In `getrlimit', the structure is an output; it receives the current
+-     values.  In `setrlimit', it specifies the new values.
+-
+-   For the LFS functions a similar type is defined in `sys/resource.h'.
+-
+- - Data Type: struct rlimit64
+-     This structure is used with `getrlimit64' to receive limit values,
+-     and with `setrlimit64' to specify limit values.  It has two fields:
+-
+-    `rlim64_t rlim_cur'
+-          The current value of the limit in question.  This is also
+-          called the "soft limit".
+-
+-    `rlim64_t rlim_max'
+-          The maximum permissible value of the limit in question.  You
+-          cannot set the current value of the limit to a larger number
+-          than this maximum.  Only the super user can change the
+-          maximum permissible value.  This is also called the "hard
+-          limit".
+-
+-     In `getrlimit64', the structure is an output; it receives the
+-     current values.  In `setrlimit64', it specifies the new values.
+-
+-   Here is a list of resources that you can specify a limit for.  Those
+-that are sizes are measured in bytes.
+-
+-`RLIMIT_CPU'
+-     The maximum amount of cpu time the process can use.  If it runs for
+-     longer than this, it gets a signal: `SIGXCPU'.  The value is
+-     measured in seconds.  *Note Operation Error Signals::.
+-
+-`RLIMIT_FSIZE'
+-     The maximum size of file the process can create.  Trying to write a
+-     larger file causes a signal: `SIGXFSZ'.  *Note Operation Error
+-     Signals::.
+-
+-`RLIMIT_DATA'
+-     The maximum size of data memory for the process.  If the process
+-     tries to allocate data memory beyond this amount, the allocation
+-     function fails.
+-
+-`RLIMIT_STACK'
+-     The maximum stack size for the process.  If the process tries to
+-     extend its stack past this size, it gets a `SIGSEGV' signal.
+-     *Note Program Error Signals::.
+-
+-`RLIMIT_CORE'
+-     The maximum size core file that this process can create.  If the
+-     process terminates and would dump a core file larger than this
+-     maximum size, then no core file is created.  So setting this limit
+-     to zero prevents core files from ever being created.
+-
+-`RLIMIT_RSS'
+-     The maximum amount of physical memory that this process should get.
+-     This parameter is a guide for the system's scheduler and memory
+-     allocator; the system may give the process more memory when there
+-     is a surplus.
+-
+-`RLIMIT_MEMLOCK'
+-     The maximum amount of memory that can be locked into physical
+-     memory (so it will never be paged out).
+-
+-`RLIMIT_NPROC'
+-     The maximum number of processes that can be created with the same
+-     user ID.  If you have reached the limit for your user ID, `fork'
+-     will fail with `EAGAIN'.  *Note Creating a Process::.
+-
+-`RLIMIT_NOFILE'
+-`RLIMIT_OFILE'
+-     The maximum number of files that the process can open.  If it
+-     tries to open more files than this, it gets error code `EMFILE'.
+-     *Note Error Codes::.  Not all systems support this limit; GNU
+-     does, and 4.4 BSD does.
+-
+-`RLIM_NLIMITS'
+-     The number of different resource limits.  Any valid RESOURCE
+-     operand must be less than `RLIM_NLIMITS'.
+-
+- - Constant: int RLIM_INFINITY
+-     This constant stands for a value of "infinity" when supplied as
+-     the limit value in `setrlimit'.
+-
+-   Two historical functions for setting resource limits, `ulimit' and
+-`vlimit', are not documented here.  The latter is declared in
+-`sys/vlimit.h' and comes from BSD.
+-
+-
+-File: libc.info,  Node: Priority,  Prev: Limits on Resources,  Up: Date and Time
+-
+-Process Priority
+-================
+-
+-   When several processes try to run, their respective priorities
+-determine what share of the CPU each process gets.  This section
+-describes how you can read and set the priority of a process.  All
+-these functions and macros are declared in `sys/resource.h'.
+-
+-   The range of valid priority values depends on the operating system,
+-but typically it runs from `-20' to `20'.  A lower priority value means
+-the process runs more often.  These constants describe the range of
+-priority values:
+-
+-`PRIO_MIN'
+-     The smallest valid priority value.
+-
+-`PRIO_MAX'
+-     The largest valid priority value.
+-
+- - Function: int getpriority (int CLASS, int ID)
+-     Read the priority of a class of processes; CLASS and ID specify
+-     which ones (see below).  If the processes specified do not all
+-     have the same priority, this returns the smallest value that any
+-     of them has.
+-
+-     The return value is the priority value on success, and `-1' on
+-     failure.  The following `errno' error condition are possible for
+-     this function:
+-
+-    `ESRCH'
+-          The combination of CLASS and ID does not match any existing
+-          process.
+-
+-    `EINVAL'
+-          The value of CLASS is not valid.
+-
+-     When the return value is `-1', it could indicate failure, or it
+-     could be the priority value.  The only way to make certain is to
+-     set `errno = 0' before calling `getpriority', then use `errno !=
+-     0' afterward as the criterion for failure.
+-
+- - Function: int setpriority (int CLASS, int ID, int PRIORITY)
+-     Set the priority of a class of processes to PRIORITY; CLASS and ID
+-     specify which ones (see below).
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition are defined for this function:
+-
+-    `ESRCH'
+-          The combination of CLASS and ID does not match any existing
+-          process.
+-
+-    `EINVAL'
+-          The value of CLASS is not valid.
+-
+-    `EPERM'
+-          You tried to set the priority of some other user's process,
+-          and you don't have privileges for that.
+-
+-    `EACCES'
+-          You tried to lower the priority of a process, and you don't
+-          have privileges for that.
+-
+-   The arguments CLASS and ID together specify a set of processes you
+-are interested in.  These are the possible values for CLASS:
+-
+-`PRIO_PROCESS'
+-     Read or set the priority of one process.  The argument ID is a
+-     process ID.
+-
+-`PRIO_PGRP'
+-     Read or set the priority of one process group.  The argument ID is
+-     a process group ID.
+-
+-`PRIO_USER'
+-     Read or set the priority of one user's processes.  The argument ID
+-     is a user ID.
+-
+-   If the argument ID is 0, it stands for the current process, current
+-process group, or the current user, according to CLASS.
+-
+- - Function: int nice (int INCREMENT)
+-     Increment the priority of the current process by INCREMENT.  The
+-     return value is the same as for `setpriority'.
+-
+-     Here is an equivalent definition for `nice':
+-
+-          int
+-          nice (int increment)
+-          {
+-            int old = getpriority (PRIO_PROCESS, 0);
+-            return setpriority (PRIO_PROCESS, 0, old + increment);
+-          }
+-
+-
+-File: libc.info,  Node: Non-Local Exits,  Next: Signal Handling,  Prev: Date and Time,  Up: Top
+-
+-Non-Local Exits
+-***************
+-
+-   Sometimes when your program detects an unusual situation inside a
+-deeply nested set of function calls, you would like to be able to
+-immediately return to an outer level of control.  This section
+-describes how you can do such "non-local exits" using the `setjmp' and
+-`longjmp' functions.
+-
+-* Menu:
+-
+-* Intro: Non-Local Intro.        When and how to use these facilities.
+-* Details: Non-Local Details.   Functions for nonlocal exits.
+-* Non-Local Exits and Signals::  Portability issues.
+-
+-
+-File: libc.info,  Node: Non-Local Intro,  Next: Non-Local Details,  Up: Non-Local Exits
+-
+-Introduction to Non-Local Exits
+-===============================
+-
+-   As an example of a situation where a non-local exit can be useful,
+-suppose you have an interactive program that has a "main loop" that
+-prompts for and executes commands.  Suppose the "read" command reads
+-input from a file, doing some lexical analysis and parsing of the input
+-while processing it.  If a low-level input error is detected, it would
+-be useful to be able to return immediately to the "main loop" instead
+-of having to make each of the lexical analysis, parsing, and processing
+-phases all have to explicitly deal with error situations initially
+-detected by nested calls.
+-
+-   (On the other hand, if each of these phases has to do a substantial
+-amount of cleanup when it exits--such as closing files, deallocating
+-buffers or other data structures, and the like--then it can be more
+-appropriate to do a normal return and have each phase do its own
+-cleanup, because a non-local exit would bypass the intervening phases
+-and their associated cleanup code entirely.  Alternatively, you could
+-use a non-local exit but do the cleanup explicitly either before or
+-after returning to the "main loop".)
+-
+-   In some ways, a non-local exit is similar to using the `return'
+-statement to return from a function.  But while `return' abandons only
+-a single function call, transferring control back to the point at which
+-it was called, a non-local exit can potentially abandon many levels of
+-nested function calls.
+-
+-   You identify return points for non-local exits calling the function
+-`setjmp'.  This function saves information about the execution
+-environment in which the call to `setjmp' appears in an object of type
+-`jmp_buf'.  Execution of the program continues normally after the call
+-to `setjmp', but if a exit is later made to this return point by
+-calling `longjmp' with the corresponding `jmp_buf' object, control is
+-transferred back to the point where `setjmp' was called.  The return
+-value from `setjmp' is used to distinguish between an ordinary return
+-and a return made by a call to `longjmp', so calls to `setjmp' usually
+-appear in an `if' statement.
+-
+-   Here is how the example program described above might be set up:
+-
+-     #include <setjmp.h>
+-     #include <stdlib.h>
+-     #include <stdio.h>
+-     
+-     jmp_buf main_loop;
+-     
+-     void
+-     abort_to_main_loop (int status)
+-     {
+-       longjmp (main_loop, status);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       while (1)
+-         if (setjmp (main_loop))
+-           puts ("Back at main loop....");
+-         else
+-           do_command ();
+-     }
+-     
+-     
+-     void
+-     do_command (void)
+-     {
+-       char buffer[128];
+-       if (fgets (buffer, 128, stdin) == NULL)
+-         abort_to_main_loop (-1);
+-       else
+-         exit (EXIT_SUCCESS);
+-     }
+-
+-   The function `abort_to_main_loop' causes an immediate transfer of
+-control back to the main loop of the program, no matter where it is
+-called from.
+-
+-   The flow of control inside the `main' function may appear a little
+-mysterious at first, but it is actually a common idiom with `setjmp'.
+-A normal call to `setjmp' returns zero, so the "else" clause of the
+-conditional is executed.  If `abort_to_main_loop' is called somewhere
+-within the execution of `do_command', then it actually appears as if
+-the *same* call to `setjmp' in `main' were returning a second time with
+-a value of `-1'.
+-
+-   So, the general pattern for using `setjmp' looks something like:
+-
+-     if (setjmp (BUFFER))
+-       /* Code to clean up after premature return. */
+-       ...
+-     else
+-       /* Code to be executed normally after setting up the return point. */
+-       ...
+-
+-
+-File: libc.info,  Node: Non-Local Details,  Next: Non-Local Exits and Signals,  Prev: Non-Local Intro,  Up: Non-Local Exits
+-
+-Details of Non-Local Exits
+-==========================
+-
+-   Here are the details on the functions and data structures used for
+-performing non-local exits.  These facilities are declared in
+-`setjmp.h'.
+-
+- - Data Type: jmp_buf
+-     Objects of type `jmp_buf' hold the state information to be
+-     restored by a non-local exit.  The contents of a `jmp_buf'
+-     identify a specific place to return to.
+-
+- - Macro: int setjmp (jmp_buf STATE)
+-     When called normally, `setjmp' stores information about the
+-     execution state of the program in STATE and returns zero.  If
+-     `longjmp' is later used to perform a non-local exit to this STATE,
+-     `setjmp' returns a nonzero value.
+-
+- - Function: void longjmp (jmp_buf STATE, int VALUE)
+-     This function restores current execution to the state saved in
+-     STATE, and continues execution from the call to `setjmp' that
+-     established that return point.  Returning from `setjmp' by means of
+-     `longjmp' returns the VALUE argument that was passed to `longjmp',
+-     rather than `0'.  (But if VALUE is given as `0', `setjmp' returns
+-     `1').
+-
+-   There are a lot of obscure but important restrictions on the use of
+-`setjmp' and `longjmp'.  Most of these restrictions are present because
+-non-local exits require a fair amount of magic on the part of the C
+-compiler and can interact with other parts of the language in strange
+-ways.
+-
+-   The `setjmp' function is actually a macro without an actual function
+-definition, so you shouldn't try to `#undef' it or take its address.
+-In addition, calls to `setjmp' are safe in only the following contexts:
+-
+-   * As the test expression of a selection or iteration statement (such
+-     as `if', `switch', or `while').
+-
+-   * As one operand of a equality or comparison operator that appears
+-     as the test expression of a selection or iteration statement.  The
+-     other operand must be an integer constant expression.
+-
+-   * As the operand of a unary `!' operator, that appears as the test
+-     expression of a selection or iteration statement.
+-
+-   * By itself as an expression statement.
+-
+-   Return points are valid only during the dynamic extent of the
+-function that called `setjmp' to establish them.  If you `longjmp' to a
+-return point that was established in a function that has already
+-returned, unpredictable and disastrous things are likely to happen.
+-
+-   You should use a nonzero VALUE argument to `longjmp'.  While
+-`longjmp' refuses to pass back a zero argument as the return value from
+-`setjmp', this is intended as a safety net against accidental misuse
+-and is not really good programming style.
+-
+-   When you perform a non-local exit, accessible objects generally
+-retain whatever values they had at the time `longjmp' was called.  The
+-exception is that the values of automatic variables local to the
+-function containing the `setjmp' call that have been changed since the
+-call to `setjmp' are indeterminate, unless you have declared them
+-`volatile'.
+-
+-
+-File: libc.info,  Node: Non-Local Exits and Signals,  Prev: Non-Local Details,  Up: Non-Local Exits
+-
+-Non-Local Exits and Signals
+-===========================
+-
+-   In BSD Unix systems, `setjmp' and `longjmp' also save and restore
+-the set of blocked signals; see *Note Blocking Signals::.  However, the
+-POSIX.1 standard requires `setjmp' and `longjmp' not to change the set
+-of blocked signals, and provides an additional pair of functions
+-(`sigsetjmp' and `siglongjmp') to get the BSD behavior.
+-
+-   The behavior of `setjmp' and `longjmp' in the GNU library is
+-controlled by feature test macros; see *Note Feature Test Macros::.  The
+-default in the GNU system is the POSIX.1 behavior rather than the BSD
+-behavior.
+-
+-   The facilities in this section are declared in the header file
+-`setjmp.h'.
+-
+- - Data Type: sigjmp_buf
+-     This is similar to `jmp_buf', except that it can also store state
+-     information about the set of blocked signals.
+-
+- - Function: int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)
+-     This is similar to `setjmp'.  If SAVESIGS is nonzero, the set of
+-     blocked signals is saved in STATE and will be restored if a
+-     `siglongjmp' is later performed with this STATE.
+-
+- - Function: void siglongjmp (sigjmp_buf STATE, int VALUE)
+-     This is similar to `longjmp' except for the type of its STATE
+-     argument.  If the `sigsetjmp' call that set this STATE used a
+-     nonzero SAVESIGS flag, `siglongjmp' also restores the set of
+-     blocked signals.
+-
+-
+-File: libc.info,  Node: Signal Handling,  Next: Process Startup,  Prev: Non-Local Exits,  Up: Top
+-
+-Signal Handling
+-***************
+-
+-   A "signal" is a software interrupt delivered to a process.  The
+-operating system uses signals to report exceptional situations to an
+-executing program.  Some signals report errors such as references to
+-invalid memory addresses; others report asynchronous events, such as
+-disconnection of a phone line.
+-
+-   The GNU C library defines a variety of signal types, each for a
+-particular kind of event.  Some kinds of events make it inadvisable or
+-impossible for the program to proceed as usual, and the corresponding
+-signals normally abort the program.  Other kinds of signals that report
+-harmless events are ignored by default.
+-
+-   If you anticipate an event that causes signals, you can define a
+-handler function and tell the operating system to run it when that
+-particular type of signal arrives.
+-
+-   Finally, one process can send a signal to another process; this
+-allows a parent process to abort a child, or two related processes to
+-communicate and synchronize.
+-
+-* Menu:
+-
+-* Concepts of Signals::         Introduction to the signal facilities.
+-* Standard Signals::            Particular kinds of signals with
+-                                 standard names and meanings.
+-* Signal Actions::              Specifying what happens when a
+-                                 particular signal is delivered.
+-* Defining Handlers::           How to write a signal handler function.
+-* Interrupted Primitives::	Signal handlers affect use of `open',
+-				 `read', `write' and other functions.
+-* Generating Signals::          How to send a signal to a process.
+-* Blocking Signals::            Making the system hold signals temporarily.
+-* Waiting for a Signal::        Suspending your program until a signal
+-                                 arrives.
+-* Signal Stack::                Using a Separate Signal Stack.
+-* BSD Signal Handling::         Additional functions for backward
+-			         compatibility with BSD.
+-
+-
+-File: libc.info,  Node: Concepts of Signals,  Next: Standard Signals,  Up: Signal Handling
+-
+-Basic Concepts of Signals
+-=========================
+-
+-   This section explains basic concepts of how signals are generated,
+-what happens after a signal is delivered, and how programs can handle
+-signals.
+-
+-* Menu:
+-
+-* Kinds of Signals::            Some examples of what can cause a signal.
+-* Signal Generation::           Concepts of why and how signals occur.
+-* Delivery of Signal::          Concepts of what a signal does to the
+-                                 process.
+-
+-
+-File: libc.info,  Node: Kinds of Signals,  Next: Signal Generation,  Up: Concepts of Signals
+-
+-Some Kinds of Signals
+----------------------
+-
+-   A signal reports the occurrence of an exceptional event.  These are
+-some of the events that can cause (or "generate", or "raise") a signal:
+-
+-   * A program error such as dividing by zero or issuing an address
+-     outside the valid range.
+-
+-   * A user request to interrupt or terminate the program.  Most
+-     environments are set up to let a user suspend the program by
+-     typing `C-z', or terminate it with `C-c'.  Whatever key sequence
+-     is used, the operating system sends the proper signal to interrupt
+-     the process.
+-
+-   * The termination of a child process.
+-
+-   * Expiration of a timer or alarm.
+-
+-   * A call to `kill' or `raise' by the same process.
+-
+-   * A call to `kill' from another process.  Signals are a limited but
+-     useful form of interprocess communication.
+-
+-   * An attempt to perform an I/O operation that cannot be done.
+-     Examples are reading from a pipe that has no writer (*note Pipes
+-     and FIFOs::.), and reading or writing to a terminal in certain
+-     situations (*note Job Control::.).
+-
+-   Each of these kinds of events (excepting explicit calls to `kill'
+-and `raise') generates its own particular kind of signal.  The various
+-kinds of signals are listed and described in detail in *Note Standard
+-Signals::.
+-
+-
+-File: libc.info,  Node: Signal Generation,  Next: Delivery of Signal,  Prev: Kinds of Signals,  Up: Concepts of Signals
+-
+-Concepts of Signal Generation
+------------------------------
+-
+-   In general, the events that generate signals fall into three major
+-categories: errors, external events, and explicit requests.
+-
+-   An error means that a program has done something invalid and cannot
+-continue execution.  But not all kinds of errors generate signals--in
+-fact, most do not.  For example, opening a nonexistent file is an error,
+-but it does not raise a signal; instead, `open' returns `-1'.  In
+-general, errors that are necessarily associated with certain library
+-functions are reported by returning a value that indicates an error.
+-The errors which raise signals are those which can happen anywhere in
+-the program, not just in library calls.  These include division by zero
+-and invalid memory addresses.
+-
+-   An external event generally has to do with I/O or other processes.
+-These include the arrival of input, the expiration of a timer, and the
+-termination of a child process.
+-
+-   An explicit request means the use of a library function such as
+-`kill' whose purpose is specifically to generate a signal.
+-
+-   Signals may be generated "synchronously" or "asynchronously".  A
+-synchronous signal pertains to a specific action in the program, and is
+-delivered (unless blocked) during that action.  Most errors generate
+-signals synchronously, and so do explicit requests by a process to
+-generate a signal for that same process.  On some machines, certain
+-kinds of hardware errors (usually floating-point exceptions) are not
+-reported completely synchronously, but may arrive a few instructions
+-later.
+-
+-   Asynchronous signals are generated by events outside the control of
+-the process that receives them.  These signals arrive at unpredictable
+-times during execution.  External events generate signals
+-asynchronously, and so do explicit requests that apply to some other
+-process.
+-
+-   A given type of signal is either typically synchronous or typically
+-asynchronous.  For example, signals for errors are typically synchronous
+-because errors generate signals synchronously.  But any type of signal
+-can be generated synchronously or asynchronously with an explicit
+-request.
+-
+-
+-File: libc.info,  Node: Delivery of Signal,  Prev: Signal Generation,  Up: Concepts of Signals
+-
+-How Signals Are Delivered
+--------------------------
+-
+-   When a signal is generated, it becomes "pending".  Normally it
+-remains pending for just a short period of time and then is "delivered"
+-to the process that was signaled.  However, if that kind of signal is
+-currently "blocked", it may remain pending indefinitely--until signals
+-of that kind are "unblocked".  Once unblocked, it will be delivered
+-immediately.  *Note Blocking Signals::.
+-
+-   When the signal is delivered, whether right away or after a long
+-delay, the "specified action" for that signal is taken.  For certain
+-signals, such as `SIGKILL' and `SIGSTOP', the action is fixed, but for
+-most signals, the program has a choice: ignore the signal, specify a
+-"handler function", or accept the "default action" for that kind of
+-signal.  The program specifies its choice using functions such as
+-`signal' or `sigaction' (*note Signal Actions::.).  We sometimes say
+-that a handler "catches" the signal.  While the handler is running,
+-that particular signal is normally blocked.
+-
+-   If the specified action for a kind of signal is to ignore it, then
+-any such signal which is generated is discarded immediately.  This
+-happens even if the signal is also blocked at the time.  A signal
+-discarded in this way will never be delivered, not even if the program
+-subsequently specifies a different action for that kind of signal and
+-then unblocks it.
+-
+-   If a signal arrives which the program has neither handled nor
+-ignored, its "default action" takes place.  Each kind of signal has its
+-own default action, documented below (*note Standard Signals::.).  For
+-most kinds of signals, the default action is to terminate the process.
+-For certain kinds of signals that represent "harmless" events, the
+-default action is to do nothing.
+-
+-   When a signal terminates a process, its parent process can determine
+-the cause of termination by examining the termination status code
+-reported by the `wait' or `waitpid' functions.  (This is discussed in
+-more detail in *Note Process Completion::.)  The information it can get
+-includes the fact that termination was due to a signal, and the kind of
+-signal involved.  If a program you run from a shell is terminated by a
+-signal, the shell typically prints some kind of error message.
+-
+-   The signals that normally represent program errors have a special
+-property: when one of these signals terminates the process, it also
+-writes a "core dump file" which records the state of the process at the
+-time of termination.  You can examine the core dump with a debugger to
+-investigate what caused the error.
+-
+-   If you raise a "program error" signal by explicit request, and this
+-terminates the process, it makes a core dump file just as if the signal
+-had been due directly to an error.
+-
+-
+-File: libc.info,  Node: Standard Signals,  Next: Signal Actions,  Prev: Concepts of Signals,  Up: Signal Handling
+-
+-Standard Signals
+-================
+-
+-   This section lists the names for various standard kinds of signals
+-and describes what kind of event they mean.  Each signal name is a macro
+-which stands for a positive integer--the "signal number" for that kind
+-of signal.  Your programs should never make assumptions about the
+-numeric code for a particular kind of signal, but rather refer to them
+-always by the names defined here.  This is because the number for a
+-given kind of signal can vary from system to system, but the meanings of
+-the names are standardized and fairly uniform.
+-
+-   The signal names are defined in the header file `signal.h'.
+-
+- - Macro: int NSIG
+-     The value of this symbolic constant is the total number of signals
+-     defined.  Since the signal numbers are allocated consecutively,
+-     `NSIG' is also one greater than the largest defined signal number.
+-
+-* Menu:
+-
+-* Program Error Signals::       Used to report serious program errors.
+-* Termination Signals::         Used to interrupt and/or terminate the
+-                                 program.
+-* Alarm Signals::               Used to indicate expiration of timers.
+-* Asynchronous I/O Signals::    Used to indicate input is available.
+-* Job Control Signals::         Signals used to support job control.
+-* Operation Error Signals::     Used to report operational system errors.
+-* Miscellaneous Signals::       Miscellaneous Signals.
+-* Signal Messages::             Printing a message describing a signal.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-32 glibc-2.1.3/manual/libc.info-32
+--- ../glibc-2.1.3/manual/libc.info-32	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-32	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1213 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Program Error Signals,  Next: Termination Signals,  Up: Standard Signals
+-
+-Program Error Signals
+----------------------
+-
+-   The following signals are generated when a serious program error is
+-detected by the operating system or the computer itself.  In general,
+-all of these signals are indications that your program is seriously
+-broken in some way, and there's usually no way to continue the
+-computation which encountered the error.
+-
+-   Some programs handle program error signals in order to tidy up before
+-terminating; for example, programs that turn off echoing of terminal
+-input should handle program error signals in order to turn echoing back
+-on.  The handler should end by specifying the default action for the
+-signal that happened and then reraising it; this will cause the program
+-to terminate with that signal, as if it had not had a handler.  (*Note
+-Termination in Handler::.)
+-
+-   Termination is the sensible ultimate outcome from a program error in
+-most programs.  However, programming systems such as Lisp that can load
+-compiled user programs might need to keep executing even if a user
+-program incurs an error.  These programs have handlers which use
+-`longjmp' to return control to the command level.
+-
+-   The default action for all of these signals is to cause the process
+-to terminate.  If you block or ignore these signals or establish
+-handlers for them that return normally, your program will probably
+-break horribly when such signals happen, unless they are generated by
+-`raise' or `kill' instead of a real error.
+-
+-   When one of these program error signals terminates a process, it also
+-writes a "core dump file" which records the state of the process at the
+-time of termination.  The core dump file is named `core' and is written
+-in whichever directory is current in the process at the time.  (On the
+-GNU system, you can specify the file name for core dumps with the
+-environment variable `COREFILE'.)  The purpose of core dump files is so
+-that you can examine them with a debugger to investigate what caused
+-the error.
+-
+- - Macro: int SIGFPE
+-     The `SIGFPE' signal reports a fatal arithmetic error.  Although the
+-     name is derived from "floating-point exception", this signal
+-     actually covers all arithmetic errors, including division by zero
+-     and overflow.  If a program stores integer data in a location
+-     which is then used in a floating-point operation, this often
+-     causes an "invalid operation" exception, because the processor
+-     cannot recognize the data as a floating-point number.
+-
+-     Actual floating-point exceptions are a complicated subject because
+-     there are many types of exceptions with subtly different meanings,
+-     and the `SIGFPE' signal doesn't distinguish between them.  The
+-     `IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std
+-     754-1985 and ANSI/IEEE Std 854-1987)' defines various
+-     floating-point exceptions and requires conforming computer systems
+-     to report their occurrences.  However, this standard does not
+-     specify how the exceptions are reported, or what kinds of handling
+-     and control the operating system can offer to the programmer.
+-
+-   BSD systems provide the `SIGFPE' handler with an extra argument that
+-distinguishes various causes of the exception.  In order to access this
+-argument, you must define the handler to accept two arguments, which
+-means you must cast it to a one-argument function type in order to
+-establish the handler.  The GNU library does provide this extra
+-argument, but the value is meaningful only on operating systems that
+-provide the information (BSD systems and GNU systems).
+-
+-`FPE_INTOVF_TRAP'
+-     Integer overflow (impossible in a C program unless you enable
+-     overflow trapping in a hardware-specific fashion).
+-
+-`FPE_INTDIV_TRAP'
+-     Integer division by zero.
+-
+-`FPE_SUBRNG_TRAP'
+-     Subscript-range (something that C programs never check for).
+-
+-`FPE_FLTOVF_TRAP'
+-     Floating overflow trap.
+-
+-`FPE_FLTDIV_TRAP'
+-     Floating/decimal division by zero.
+-
+-`FPE_FLTUND_TRAP'
+-     Floating underflow trap.  (Trapping on floating underflow is not
+-     normally enabled.)
+-
+-`FPE_DECOVF_TRAP'
+-     Decimal overflow trap.  (Only a few machines have decimal
+-     arithmetic and C never uses it.)
+-
+- - Macro: int SIGILL
+-     The name of this signal is derived from "illegal instruction"; it
+-     usually means your program is trying to execute garbage or a
+-     privileged instruction.  Since the C compiler generates only valid
+-     instructions, `SIGILL' typically indicates that the executable
+-     file is corrupted, or that you are trying to execute data.  Some
+-     common ways of getting into the latter situation are by passing an
+-     invalid object where a pointer to a function was expected, or by
+-     writing past the end of an automatic array (or similar problems
+-     with pointers to automatic variables) and corrupting other data on
+-     the stack such as the return address of a stack frame.
+-
+-     `SIGILL' can also be generated when the stack overflows, or when
+-     the system has trouble running the handler for a signal.
+-
+- - Macro: int SIGSEGV
+-     This signal is generated when a program tries to read or write
+-     outside the memory that is allocated for it, or to write memory
+-     that can only be read.  (Actually, the signals only occur when the
+-     program goes far enough outside to be detected by the system's
+-     memory protection mechanism.)  The name is an abbreviation for
+-     "segmentation violation".
+-
+-     Common ways of getting a `SIGSEGV' condition include dereferencing
+-     a null or uninitialized pointer, or when you use a pointer to step
+-     through an array, but fail to check for the end of the array.  It
+-     varies among systems whether dereferencing a null pointer generates
+-     `SIGSEGV' or `SIGBUS'.
+-
+- - Macro: int SIGBUS
+-     This signal is generated when an invalid pointer is dereferenced.
+-     Like `SIGSEGV', this signal is typically the result of
+-     dereferencing an uninitialized pointer.  The difference between
+-     the two is that `SIGSEGV' indicates an invalid access to valid
+-     memory, while `SIGBUS' indicates an access to an invalid address.
+-     In particular, `SIGBUS' signals often result from dereferencing a
+-     misaligned pointer, such as referring to a four-word integer at an
+-     address not divisible by four.  (Each kind of computer has its own
+-     requirements for address alignment.)
+-
+-     The name of this signal is an abbreviation for "bus error".
+-
+- - Macro: int SIGABRT
+-     This signal indicates an error detected by the program itself and
+-     reported by calling `abort'.  *Note Aborting a Program::.
+-
+- - Macro: int SIGIOT
+-     Generated by the PDP-11 "iot" instruction.  On most machines, this
+-     is just another name for `SIGABRT'.
+-
+- - Macro: int SIGTRAP
+-     Generated by the machine's breakpoint instruction, and possibly
+-     other trap instructions.  This signal is used by debuggers.  Your
+-     program will probably only see `SIGTRAP' if it is somehow
+-     executing bad instructions.
+-
+- - Macro: int SIGEMT
+-     Emulator trap; this results from certain unimplemented instructions
+-     which might be emulated in software, or the operating system's
+-     failure to properly emulate them.
+-
+- - Macro: int SIGSYS
+-     Bad system call; that is to say, the instruction to trap to the
+-     operating system was executed, but the code number for the system
+-     call to perform was invalid.
+-
+-
+-File: libc.info,  Node: Termination Signals,  Next: Alarm Signals,  Prev: Program Error Signals,  Up: Standard Signals
+-
+-Termination Signals
+--------------------
+-
+-   These signals are all used to tell a process to terminate, in one way
+-or another.  They have different names because they're used for slightly
+-different purposes, and programs might want to handle them differently.
+-
+-   The reason for handling these signals is usually so your program can
+-tidy up as appropriate before actually terminating.  For example, you
+-might want to save state information, delete temporary files, or restore
+-the previous terminal modes.  Such a handler should end by specifying
+-the default action for the signal that happened and then reraising it;
+-this will cause the program to terminate with that signal, as if it had
+-not had a handler.  (*Note Termination in Handler::.)
+-
+-   The (obvious) default action for all of these signals is to cause the
+-process to terminate.
+-
+- - Macro: int SIGTERM
+-     The `SIGTERM' signal is a generic signal used to cause program
+-     termination.  Unlike `SIGKILL', this signal can be blocked,
+-     handled, and ignored.  It is the normal way to politely ask a
+-     program to terminate.
+-
+-     The shell command `kill' generates `SIGTERM' by default.
+-
+- - Macro: int SIGINT
+-     The `SIGINT' ("program interrupt") signal is sent when the user
+-     types the INTR character (normally `C-c').  *Note Special
+-     Characters::, for information about terminal driver support for
+-     `C-c'.
+-
+- - Macro: int SIGQUIT
+-     The `SIGQUIT' signal is similar to `SIGINT', except that it's
+-     controlled by a different key--the QUIT character, usually
+-     `C-\'--and produces a core dump when it terminates the process,
+-     just like a program error signal.  You can think of this as a
+-     program error condition "detected" by the user.
+-
+-     *Note Program Error Signals::, for information about core dumps.
+-     *Note Special Characters::, for information about terminal driver
+-     support.
+-
+-     Certain kinds of cleanups are best omitted in handling `SIGQUIT'.
+-     For example, if the program creates temporary files, it should
+-     handle the other termination requests by deleting the temporary
+-     files.  But it is better for `SIGQUIT' not to delete them, so that
+-     the user can examine them in conjunction with the core dump.
+-
+- - Macro: int SIGKILL
+-     The `SIGKILL' signal is used to cause immediate program
+-     termination.  It cannot be handled or ignored, and is therefore
+-     always fatal.  It is also not possible to block this signal.
+-
+-     This signal is usually generated only by explicit request.  Since
+-     it cannot be handled, you should generate it only as a last
+-     resort, after first trying a less drastic method such as `C-c' or
+-     `SIGTERM'.  If a process does not respond to any other termination
+-     signals, sending it a `SIGKILL' signal will almost always cause it
+-     to go away.
+-
+-     In fact, if `SIGKILL' fails to terminate a process, that by itself
+-     constitutes an operating system bug which you should report.
+-
+-     The system will generate `SIGKILL' for a process itself under some
+-     unusual conditions where the program cannot possible continue to
+-     run (even to run a signal handler).
+-
+- - Macro: int SIGHUP
+-     The `SIGHUP' ("hang-up") signal is used to report that the user's
+-     terminal is disconnected, perhaps because a network or telephone
+-     connection was broken.  For more information about this, see *Note
+-     Control Modes::.
+-
+-     This signal is also used to report the termination of the
+-     controlling process on a terminal to jobs associated with that
+-     session; this termination effectively disconnects all processes in
+-     the session from the controlling terminal.  For more information,
+-     see *Note Termination Internals::.
+-
+-
+-File: libc.info,  Node: Alarm Signals,  Next: Asynchronous I/O Signals,  Prev: Termination Signals,  Up: Standard Signals
+-
+-Alarm Signals
+--------------
+-
+-   These signals are used to indicate the expiration of timers.  *Note
+-Setting an Alarm::, for information about functions that cause these
+-signals to be sent.
+-
+-   The default behavior for these signals is to cause program
+-termination.  This default is rarely useful, but no other default would
+-be useful; most of the ways of using these signals would require
+-handler functions in any case.
+-
+- - Macro: int SIGALRM
+-     This signal typically indicates expiration of a timer that
+-     measures real or clock time.  It is used by the `alarm' function,
+-     for example.
+-
+- - Macro: int SIGVTALRM
+-     This signal typically indicates expiration of a timer that
+-     measures CPU time used by the current process.  The name is an
+-     abbreviation for "virtual time alarm".
+-
+- - Macro: int SIGPROF
+-     This signal is typically indicates expiration of a timer that
+-     measures both CPU time used by the current process, and CPU time
+-     expended on behalf of the process by the system.  Such a timer is
+-     used to implement code profiling facilities, hence the name of
+-     this signal.
+-
+-
+-File: libc.info,  Node: Asynchronous I/O Signals,  Next: Job Control Signals,  Prev: Alarm Signals,  Up: Standard Signals
+-
+-Asynchronous I/O Signals
+-------------------------
+-
+-   The signals listed in this section are used in conjunction with
+-asynchronous I/O facilities.  You have to take explicit action by
+-calling `fcntl' to enable a particular file descriptor to generate
+-these signals (*note Interrupt Input::.).  The default action for these
+-signals is to ignore them.
+-
+- - Macro: int SIGIO
+-     This signal is sent when a file descriptor is ready to perform
+-     input or output.
+-
+-     On most operating systems, terminals and sockets are the only
+-     kinds of files that can generate `SIGIO'; other kinds, including
+-     ordinary files, never generate `SIGIO' even if you ask them to.
+-
+-     In the GNU system `SIGIO' will always be generated properly if you
+-     successfully set asynchronous mode with `fcntl'.
+-
+- - Macro: int SIGURG
+-     This signal is sent when "urgent" or out-of-band data arrives on a
+-     socket.  *Note Out-of-Band Data::.
+-
+- - Macro: int SIGPOLL
+-     This is a System V signal name, more or less similar to `SIGIO'.
+-     It is defined only for compatibility.
+-
+-
+-File: libc.info,  Node: Job Control Signals,  Next: Operation Error Signals,  Prev: Asynchronous I/O Signals,  Up: Standard Signals
+-
+-Job Control Signals
+--------------------
+-
+-   These signals are used to support job control.  If your system
+-doesn't support job control, then these macros are defined but the
+-signals themselves can't be raised or handled.
+-
+-   You should generally leave these signals alone unless you really
+-understand how job control works.  *Note Job Control::.
+-
+- - Macro: int SIGCHLD
+-     This signal is sent to a parent process whenever one of its child
+-     processes terminates or stops.
+-
+-     The default action for this signal is to ignore it.  If you
+-     establish a handler for this signal while there are child
+-     processes that have terminated but not reported their status via
+-     `wait' or `waitpid' (*note Process Completion::.), whether your
+-     new handler applies to those processes or not depends on the
+-     particular operating system.
+-
+- - Macro: int SIGCLD
+-     This is an obsolete name for `SIGCHLD'.
+-
+- - Macro: int SIGCONT
+-     You can send a `SIGCONT' signal to a process to make it continue.
+-     This signal is special--it always makes the process continue if it
+-     is stopped, before the signal is delivered.  The default behavior
+-     is to do nothing else.  You cannot block this signal.  You can set
+-     a handler, but `SIGCONT' always makes the process continue
+-     regardless.
+-
+-     Most programs have no reason to handle `SIGCONT'; they simply
+-     resume execution without realizing they were ever stopped.  You
+-     can use a handler for `SIGCONT' to make a program do something
+-     special when it is stopped and continued--for example, to reprint
+-     a prompt when it is suspended while waiting for input.
+-
+- - Macro: int SIGSTOP
+-     The `SIGSTOP' signal stops the process.  It cannot be handled,
+-     ignored, or blocked.
+-
+- - Macro: int SIGTSTP
+-     The `SIGTSTP' signal is an interactive stop signal.  Unlike
+-     `SIGSTOP', this signal can be handled and ignored.
+-
+-     Your program should handle this signal if you have a special need
+-     to leave files or system tables in a secure state when a process is
+-     stopped.  For example, programs that turn off echoing should handle
+-     `SIGTSTP' so they can turn echoing back on before stopping.
+-
+-     This signal is generated when the user types the SUSP character
+-     (normally `C-z').  For more information about terminal driver
+-     support, see *Note Special Characters::.
+-
+- - Macro: int SIGTTIN
+-     A process cannot read from the user's terminal while it is running
+-     as a background job.  When any process in a background job tries to
+-     read from the terminal, all of the processes in the job are sent a
+-     `SIGTTIN' signal.  The default action for this signal is to stop
+-     the process.  For more information about how this interacts with
+-     the terminal driver, see *Note Access to the Terminal::.
+-
+- - Macro: int SIGTTOU
+-     This is similar to `SIGTTIN', but is generated when a process in a
+-     background job attempts to write to the terminal or set its modes.
+-     Again, the default action is to stop the process.  `SIGTTOU' is
+-     only generated for an attempt to write to the terminal if the
+-     `TOSTOP' output mode is set; *note Output Modes::..
+-
+-   While a process is stopped, no more signals can be delivered to it
+-until it is continued, except `SIGKILL' signals and (obviously)
+-`SIGCONT' signals.  The signals are marked as pending, but not
+-delivered until the process is continued.  The `SIGKILL' signal always
+-causes termination of the process and can't be blocked, handled or
+-ignored.  You can ignore `SIGCONT', but it always causes the process to
+-be continued anyway if it is stopped.  Sending a `SIGCONT' signal to a
+-process causes any pending stop signals for that process to be
+-discarded.  Likewise, any pending `SIGCONT' signals for a process are
+-discarded when it receives a stop signal.
+-
+-   When a process in an orphaned process group (*note Orphaned Process
+-Groups::.) receives a `SIGTSTP', `SIGTTIN', or `SIGTTOU' signal and
+-does not handle it, the process does not stop.  Stopping the process
+-would probably not be very useful, since there is no shell program that
+-will notice it stop and allow the user to continue it.  What happens
+-instead depends on the operating system you are using.  Some systems
+-may do nothing; others may deliver another signal instead, such as
+-`SIGKILL' or `SIGHUP'.  In the GNU system, the process dies with
+-`SIGKILL'; this avoids the problem of many stopped, orphaned processes
+-lying around the system.
+-
+-
+-File: libc.info,  Node: Operation Error Signals,  Next: Miscellaneous Signals,  Prev: Job Control Signals,  Up: Standard Signals
+-
+-Operation Error Signals
+------------------------
+-
+-   These signals are used to report various errors generated by an
+-operation done by the program.  They do not necessarily indicate a
+-programming error in the program, but an error that prevents an
+-operating system call from completing.  The default action for all of
+-them is to cause the process to terminate.
+-
+- - Macro: int SIGPIPE
+-     Broken pipe.  If you use pipes or FIFOs, you have to design your
+-     application so that one process opens the pipe for reading before
+-     another starts writing.  If the reading process never starts, or
+-     terminates unexpectedly, writing to the pipe or FIFO raises a
+-     `SIGPIPE' signal.  If `SIGPIPE' is blocked, handled or ignored,
+-     the offending call fails with `EPIPE' instead.
+-
+-     Pipes and FIFO special files are discussed in more detail in *Note
+-     Pipes and FIFOs::.
+-
+-     Another cause of `SIGPIPE' is when you try to output to a socket
+-     that isn't connected.  *Note Sending Data::.
+-
+- - Macro: int SIGLOST
+-     Resource lost.  This signal is generated when you have an advisory
+-     lock on an NFS file, and the NFS server reboots and forgets about
+-     your lock.
+-
+-     In the GNU system, `SIGLOST' is generated when any server program
+-     dies unexpectedly.  It is usually fine to ignore the signal;
+-     whatever call was made to the server that died just returns an
+-     error.
+-
+- - Macro: int SIGXCPU
+-     CPU time limit exceeded.  This signal is generated when the process
+-     exceeds its soft resource limit on CPU time.  *Note Limits on
+-     Resources::.
+-
+- - Macro: int SIGXFSZ
+-     File size limit exceeded.  This signal is generated when the
+-     process attempts to extend a file so it exceeds the process's soft
+-     resource limit on file size.  *Note Limits on Resources::.
+-
+-
+-File: libc.info,  Node: Miscellaneous Signals,  Next: Signal Messages,  Prev: Operation Error Signals,  Up: Standard Signals
+-
+-Miscellaneous Signals
+----------------------
+-
+-   These signals are used for various other purposes.  In general, they
+-will not affect your program unless it explicitly uses them for
+-something.
+-
+- - Macro: int SIGUSR1
+- - Macro: int SIGUSR2
+-     The `SIGUSR1' and `SIGUSR2' signals are set aside for you to use
+-     any way you want.  They're useful for simple interprocess
+-     communication, if you write a signal handler for them in the
+-     program that receives the signal.
+-
+-     There is an example showing the use of `SIGUSR1' and `SIGUSR2' in
+-     *Note Signaling Another Process::.
+-
+-     The default action is to terminate the process.
+-
+- - Macro: int SIGWINCH
+-     Window size change.  This is generated on some systems (including
+-     GNU) when the terminal driver's record of the number of rows and
+-     columns on the screen is changed.  The default action is to ignore
+-     it.
+-
+-     If a program does full-screen display, it should handle `SIGWINCH'.
+-     When the signal arrives, it should fetch the new screen size and
+-     reformat its display accordingly.
+-
+- - Macro: int SIGINFO
+-     Information request.  In 4.4 BSD and the GNU system, this signal
+-     is sent to all the processes in the foreground process group of
+-     the controlling terminal when the user types the STATUS character
+-     in canonical mode; *note Signal Characters::..
+-
+-     If the process is the leader of the process group, the default
+-     action is to print some status information about the system and
+-     what the process is doing.  Otherwise the default is to do nothing.
+-
+-
+-File: libc.info,  Node: Signal Messages,  Prev: Miscellaneous Signals,  Up: Standard Signals
+-
+-Signal Messages
+----------------
+-
+-   We mentioned above that the shell prints a message describing the
+-signal that terminated a child process.  The clean way to print a
+-message describing a signal is to use the functions `strsignal' and
+-`psignal'.  These functions use a signal number to specify which kind
+-of signal to describe.  The signal number may come from the termination
+-status of a child process (*note Process Completion::.) or it may come
+-from a signal handler in the same process.
+-
+- - Function: char * strsignal (int SIGNUM)
+-     This function returns a pointer to a statically-allocated string
+-     containing a message describing the signal SIGNUM.  You should not
+-     modify the contents of this string; and, since it can be rewritten
+-     on subsequent calls, you should save a copy of it if you need to
+-     reference it later.
+-
+-     This function is a GNU extension, declared in the header file
+-     `string.h'.
+-
+- - Function: void psignal (int SIGNUM, const char *MESSAGE)
+-     This function prints a message describing the signal SIGNUM to the
+-     standard error output stream `stderr'; see *Note Standard
+-     Streams::.
+-
+-     If you call `psignal' with a MESSAGE that is either a null pointer
+-     or an empty string, `psignal' just prints the message
+-     corresponding to SIGNUM, adding a trailing newline.
+-
+-     If you supply a non-null MESSAGE argument, then `psignal' prefixes
+-     its output with this string.  It adds a colon and a space
+-     character to separate the MESSAGE from the string corresponding to
+-     SIGNUM.
+-
+-     This function is a BSD feature, declared in the header file
+-     `signal.h'.
+-
+-   There is also an array `sys_siglist' which contains the messages for
+-the various signal codes.  This array exists on BSD systems, unlike
+-`strsignal'.
+-
+-
+-File: libc.info,  Node: Signal Actions,  Next: Defining Handlers,  Prev: Standard Signals,  Up: Signal Handling
+-
+-Specifying Signal Actions
+-=========================
+-
+-   The simplest way to change the action for a signal is to use the
+-`signal' function.  You can specify a built-in action (such as to
+-ignore the signal), or you can "establish a handler".
+-
+-   The GNU library also implements the more versatile `sigaction'
+-facility.  This section describes both facilities and gives suggestions
+-on which to use when.
+-
+-* Menu:
+-
+-* Basic Signal Handling::       The simple `signal' function.
+-* Advanced Signal Handling::    The more powerful `sigaction' function.
+-* Signal and Sigaction::        How those two functions interact.
+-* Sigaction Function Example::  An example of using the sigaction function.
+-* Flags for Sigaction::         Specifying options for signal handling.
+-* Initial Signal Actions::      How programs inherit signal actions.
+-
+-
+-File: libc.info,  Node: Basic Signal Handling,  Next: Advanced Signal Handling,  Up: Signal Actions
+-
+-Basic Signal Handling
+----------------------
+-
+-   The `signal' function provides a simple interface for establishing
+-an action for a particular signal.  The function and associated macros
+-are declared in the header file `signal.h'.
+-
+- - Data Type: sighandler_t
+-     This is the type of signal handler functions.  Signal handlers
+-     take one integer argument specifying the signal number, and have
+-     return type `void'.  So, you should define handler functions like
+-     this:
+-
+-          void HANDLER (int `signum') { ... }
+-
+-     The name `sighandler_t' for this data type is a GNU extension.
+-
+- - Function: sighandler_t signal (int SIGNUM, sighandler_t ACTION)
+-     The `signal' function establishes ACTION as the action for the
+-     signal SIGNUM.
+-
+-     The first argument, SIGNUM, identifies the signal whose behavior
+-     you want to control, and should be a signal number.  The proper
+-     way to specify a signal number is with one of the symbolic signal
+-     names (*note Standard Signals::.)--don't use an explicit number,
+-     because the numerical code for a given kind of signal may vary
+-     from operating system to operating system.
+-
+-     The second argument, ACTION, specifies the action to use for the
+-     signal SIGNUM.  This can be one of the following:
+-
+-    `SIG_DFL'
+-          `SIG_DFL' specifies the default action for the particular
+-          signal.  The default actions for various kinds of signals are
+-          stated in *Note Standard Signals::.
+-
+-    `SIG_IGN'
+-          `SIG_IGN' specifies that the signal should be ignored.
+-
+-          Your program generally should not ignore signals that
+-          represent serious events or that are normally used to request
+-          termination.  You cannot ignore the `SIGKILL' or `SIGSTOP'
+-          signals at all.  You can ignore program error signals like
+-          `SIGSEGV', but ignoring the error won't enable the program to
+-          continue executing meaningfully.  Ignoring user requests such
+-          as `SIGINT', `SIGQUIT', and `SIGTSTP' is unfriendly.
+-
+-          When you do not wish signals to be delivered during a certain
+-          part of the program, the thing to do is to block them, not
+-          ignore them.  *Note Blocking Signals::.
+-
+-    `HANDLER'
+-          Supply the address of a handler function in your program, to
+-          specify running this handler as the way to deliver the signal.
+-
+-          For more information about defining signal handler functions,
+-          see *Note Defining Handlers::.
+-
+-     If you set the action for a signal to `SIG_IGN', or if you set it
+-     to `SIG_DFL' and the default action is to ignore that signal, then
+-     any pending signals of that type are discarded (even if they are
+-     blocked).  Discarding the pending signals means that they will
+-     never be delivered, not even if you subsequently specify another
+-     action and unblock this kind of signal.
+-
+-     The `signal' function returns the action that was previously in
+-     effect for the specified SIGNUM.  You can save this value and
+-     restore it later by calling `signal' again.
+-
+-     If `signal' can't honor the request, it returns `SIG_ERR' instead.
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINVAL'
+-          You specified an invalid SIGNUM; or you tried to ignore or
+-          provide a handler for `SIGKILL' or `SIGSTOP'.
+-
+-   *Compatibility Note:* A problem when working with the `signal'
+-function is that it has a different semantic on BSD and SVID system.
+-The difference is that on SVID systems the signal handler is
+-deinstalled after an signal was delivered.  On BSD systems the handler
+-must be explicitly deinstalled.  In the GNU C Library we use the BSD
+-version by default.  To use the SVID version you can either use the
+-function `sysv_signal' (see below) or use the `_XOPEN_SOURCE' feature
+-select macro (*note Feature Test Macros::.).  Generally it should be
+-avoided to use this functions due to the compatibility problems.  It is
+-better to use `sigaction' if it is available since the results are much
+-more reliable.
+-
+-   Here is a simple example of setting up a handler to delete temporary
+-files when certain fatal signals happen:
+-
+-     #include <signal.h>
+-     
+-     void
+-     termination_handler (int signum)
+-     {
+-       struct temp_file *p;
+-     
+-       for (p = temp_file_list; p; p = p->next)
+-         unlink (p->name);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       ...
+-       if (signal (SIGINT, termination_handler) == SIG_IGN)
+-         signal (SIGINT, SIG_IGN);
+-       if (signal (SIGHUP, termination_handler) == SIG_IGN)
+-         signal (SIGHUP, SIG_IGN);
+-       if (signal (SIGTERM, termination_handler) == SIG_IGN)
+-         signal (SIGTERM, SIG_IGN);
+-       ...
+-     }
+-
+-Note how if a given signal was previously set to be ignored, this code
+-avoids altering that setting.  This is because non-job-control shells
+-often ignore certain signals when starting children, and it is important
+-for the children to respect this.
+-
+-   We do not handle `SIGQUIT' or the program error signals in this
+-example because these are designed to provide information for debugging
+-(a core dump), and the temporary files may give useful information.
+-
+- - Function: sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)
+-     The `sysv_signal' implements the behaviour of the standard
+-     `signal' function as found on SVID systems.  The difference to BSD
+-     systems is that the handler is deinstalled after a delivery of a
+-     signal.
+-
+-     *Compatibility Note:* As said above for `signal', this function
+-     should be avoided when possible.  `sigaction' is the preferred
+-     method.
+-
+- - Function: sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)
+-     The `ssignal' function does the same thing as `signal'; it is
+-     provided only for compatibility with SVID.
+-
+- - Macro: sighandler_t SIG_ERR
+-     The value of this macro is used as the return value from `signal'
+-     to indicate an error.
+-
+-
+-File: libc.info,  Node: Advanced Signal Handling,  Next: Signal and Sigaction,  Prev: Basic Signal Handling,  Up: Signal Actions
+-
+-Advanced Signal Handling
+-------------------------
+-
+-   The `sigaction' function has the same basic effect as `signal': to
+-specify how a signal should be handled by the process.  However,
+-`sigaction' offers more control, at the expense of more complexity.  In
+-particular, `sigaction' allows you to specify additional flags to
+-control when the signal is generated and how the handler is invoked.
+-
+-   The `sigaction' function is declared in `signal.h'.
+-
+- - Data Type: struct sigaction
+-     Structures of type `struct sigaction' are used in the `sigaction'
+-     function to specify all the information about how to handle a
+-     particular signal.  This structure contains at least the following
+-     members:
+-
+-    `sighandler_t sa_handler'
+-          This is used in the same way as the ACTION argument to the
+-          `signal' function.  The value can be `SIG_DFL', `SIG_IGN', or
+-          a function pointer.  *Note Basic Signal Handling::.
+-
+-    `sigset_t sa_mask'
+-          This specifies a set of signals to be blocked while the
+-          handler runs.  Blocking is explained in *Note Blocking for
+-          Handler::.  Note that the signal that was delivered is
+-          automatically blocked by default before its handler is
+-          started; this is true regardless of the value in `sa_mask'.
+-          If you want that signal not to be blocked within its handler,
+-          you must write code in the handler to unblock it.
+-
+-    `int sa_flags'
+-          This specifies various flags which can affect the behavior of
+-          the signal.  These are described in more detail in *Note
+-          Flags for Sigaction::.
+-
+- - Function: int sigaction (int SIGNUM, const struct sigaction *ACTION,
+-          struct sigaction *OLD-ACTION)
+-     The ACTION argument is used to set up a new action for the signal
+-     SIGNUM, while the OLD-ACTION argument is used to return
+-     information about the action previously associated with this
+-     symbol.  (In other words, OLD-ACTION has the same purpose as the
+-     `signal' function's return value--you can check to see what the
+-     old action in effect for the signal was, and restore it later if
+-     you want.)
+-
+-     Either ACTION or OLD-ACTION can be a null pointer.  If OLD-ACTION
+-     is a null pointer, this simply suppresses the return of
+-     information about the old action.  If ACTION is a null pointer,
+-     the action associated with the signal SIGNUM is unchanged; this
+-     allows you to inquire about how a signal is being handled without
+-     changing that handling.
+-
+-     The return value from `sigaction' is zero if it succeeds, and `-1'
+-     on failure.  The following `errno' error conditions are defined
+-     for this function:
+-
+-    `EINVAL'
+-          The SIGNUM argument is not valid, or you are trying to trap
+-          or ignore `SIGKILL' or `SIGSTOP'.
+-
+-
+-File: libc.info,  Node: Signal and Sigaction,  Next: Sigaction Function Example,  Prev: Advanced Signal Handling,  Up: Signal Actions
+-
+-Interaction of `signal' and `sigaction'
+----------------------------------------
+-
+-   It's possible to use both the `signal' and `sigaction' functions
+-within a single program, but you have to be careful because they can
+-interact in slightly strange ways.
+-
+-   The `sigaction' function specifies more information than the
+-`signal' function, so the return value from `signal' cannot express the
+-full range of `sigaction' possibilities.  Therefore, if you use
+-`signal' to save and later reestablish an action, it may not be able to
+-reestablish properly a handler that was established with `sigaction'.
+-
+-   To avoid having problems as a result, always use `sigaction' to save
+-and restore a handler if your program uses `sigaction' at all.  Since
+-`sigaction' is more general, it can properly save and reestablish any
+-action, regardless of whether it was established originally with
+-`signal' or `sigaction'.
+-
+-   On some systems if you establish an action with `signal' and then
+-examine it with `sigaction', the handler address that you get may not
+-be the same as what you specified with `signal'.  It may not even be
+-suitable for use as an action argument with `signal'.  But you can rely
+-on using it as an argument to `sigaction'.  This problem never happens
+-on the GNU system.
+-
+-   So, you're better off using one or the other of the mechanisms
+-consistently within a single program.
+-
+-   *Portability Note:* The basic `signal' function is a feature of
+-ISO C, while `sigaction' is part of the POSIX.1 standard.  If you are
+-concerned about portability to non-POSIX systems, then you should use
+-the `signal' function instead.
+-
+-
+-File: libc.info,  Node: Sigaction Function Example,  Next: Flags for Sigaction,  Prev: Signal and Sigaction,  Up: Signal Actions
+-
+-`sigaction' Function Example
+-----------------------------
+-
+-   In *Note Basic Signal Handling::, we gave an example of establishing
+-a simple handler for termination signals using `signal'.  Here is an
+-equivalent example using `sigaction':
+-
+-     #include <signal.h>
+-     
+-     void
+-     termination_handler (int signum)
+-     {
+-       struct temp_file *p;
+-     
+-       for (p = temp_file_list; p; p = p->next)
+-         unlink (p->name);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       ...
+-       struct sigaction new_action, old_action;
+-     
+-       /* Set up the structure to specify the new action. */
+-       new_action.sa_handler = termination_handler;
+-       sigemptyset (&new_action.sa_mask);
+-       new_action.sa_flags = 0;
+-     
+-       sigaction (SIGINT, NULL, &old_action);
+-       if (old_action.sa_handler != SIG_IGN)
+-         sigaction (SIGINT, &new_action, NULL);
+-       sigaction (SIGHUP, NULL, &old_action);
+-       if (old_action.sa_handler != SIG_IGN)
+-         sigaction (SIGHUP, &new_action, NULL);
+-       sigaction (SIGTERM, NULL, &old_action);
+-       if (old_action.sa_handler != SIG_IGN)
+-         sigaction (SIGTERM, &new_action, NULL);
+-       ...
+-     }
+-
+-   The program just loads the `new_action' structure with the desired
+-parameters and passes it in the `sigaction' call.  The usage of
+-`sigemptyset' is described later; see *Note Blocking Signals::.
+-
+-   As in the example using `signal', we avoid handling signals
+-previously set to be ignored.  Here we can avoid altering the signal
+-handler even momentarily, by using the feature of `sigaction' that lets
+-us examine the current action without specifying a new one.
+-
+-   Here is another example.  It retrieves information about the current
+-action for `SIGINT' without changing that action.
+-
+-     struct sigaction query_action;
+-     
+-     if (sigaction (SIGINT, NULL, &query_action) < 0)
+-       /* `sigaction' returns -1 in case of error. */
+-     else if (query_action.sa_handler == SIG_DFL)
+-       /* `SIGINT' is handled in the default, fatal manner. */
+-     else if (query_action.sa_handler == SIG_IGN)
+-       /* `SIGINT' is ignored. */
+-     else
+-       /* A programmer-defined signal handler is in effect. */
+-
+-
+-File: libc.info,  Node: Flags for Sigaction,  Next: Initial Signal Actions,  Prev: Sigaction Function Example,  Up: Signal Actions
+-
+-Flags for `sigaction'
+----------------------
+-
+-   The `sa_flags' member of the `sigaction' structure is a catch-all
+-for special features.  Most of the time, `SA_RESTART' is a good value
+-to use for this field.
+-
+-   The value of `sa_flags' is interpreted as a bit mask.  Thus, you
+-should choose the flags you want to set, OR those flags together, and
+-store the result in the `sa_flags' member of your `sigaction' structure.
+-
+-   Each signal number has its own set of flags.  Each call to
+-`sigaction' affects one particular signal number, and the flags that
+-you specify apply only to that particular signal.
+-
+-   In the GNU C library, establishing a handler with `signal' sets all
+-the flags to zero except for `SA_RESTART', whose value depends on the
+-settings you have made with `siginterrupt'.  *Note Interrupted
+-Primitives::, to see what this is about.
+-
+-   These macros are defined in the header file `signal.h'.
+-
+- - Macro: int SA_NOCLDSTOP
+-     This flag is meaningful only for the `SIGCHLD' signal.  When the
+-     flag is set, the system delivers the signal for a terminated child
+-     process but not for one that is stopped.  By default, `SIGCHLD' is
+-     delivered for both terminated children and stopped children.
+-
+-     Setting this flag for a signal other than `SIGCHLD' has no effect.
+-
+- - Macro: int SA_ONSTACK
+-     If this flag is set for a particular signal number, the system
+-     uses the signal stack when delivering that kind of signal.  *Note
+-     Signal Stack::.  If a signal with this flag arrives and you have
+-     not set a signal stack, the system terminates the program with
+-     `SIGILL'.
+-
+- - Macro: int SA_RESTART
+-     This flag controls what happens when a signal is delivered during
+-     certain primitives (such as `open', `read' or `write'), and the
+-     signal handler returns normally.  There are two alternatives: the
+-     library function can resume, or it can return failure with error
+-     code `EINTR'.
+-
+-     The choice is controlled by the `SA_RESTART' flag for the
+-     particular kind of signal that was delivered.  If the flag is set,
+-     returning from a handler resumes the library function.  If the
+-     flag is clear, returning from a handler makes the function fail.
+-     *Note Interrupted Primitives::.
+-
+-
+-File: libc.info,  Node: Initial Signal Actions,  Prev: Flags for Sigaction,  Up: Signal Actions
+-
+-Initial Signal Actions
+-----------------------
+-
+-   When a new process is created (*note Creating a Process::.), it
+-inherits handling of signals from its parent process.  However, when
+-you load a new process image using the `exec' function (*note Executing
+-a File::.), any signals that you've defined your own handlers for
+-revert to their `SIG_DFL' handling.  (If you think about it a little,
+-this makes sense; the handler functions from the old program are
+-specific to that program, and aren't even present in the address space
+-of the new program image.)  Of course, the new program can establish
+-its own handlers.
+-
+-   When a program is run by a shell, the shell normally sets the initial
+-actions for the child process to `SIG_DFL' or `SIG_IGN', as
+-appropriate.  It's a good idea to check to make sure that the shell has
+-not set up an initial action of `SIG_IGN' before you establish your own
+-signal handlers.
+-
+-   Here is an example of how to establish a handler for `SIGHUP', but
+-not if `SIGHUP' is currently ignored:
+-
+-     ...
+-     struct sigaction temp;
+-     
+-     sigaction (SIGHUP, NULL, &temp);
+-     
+-     if (temp.sa_handler != SIG_IGN)
+-       {
+-         temp.sa_handler = handle_sighup;
+-         sigemptyset (&temp.sa_mask);
+-         sigaction (SIGHUP, &temp, NULL);
+-       }
+-
+-
+-File: libc.info,  Node: Defining Handlers,  Next: Interrupted Primitives,  Prev: Signal Actions,  Up: Signal Handling
+-
+-Defining Signal Handlers
+-========================
+-
+-   This section describes how to write a signal handler function that
+-can be established with the `signal' or `sigaction' functions.
+-
+-   A signal handler is just a function that you compile together with
+-the rest of the program.  Instead of directly invoking the function,
+-you use `signal' or `sigaction' to tell the operating system to call it
+-when a signal arrives.  This is known as "establishing" the handler.
+-*Note Signal Actions::.
+-
+-   There are two basic strategies you can use in signal handler
+-functions:
+-
+-   * You can have the handler function note that the signal arrived by
+-     tweaking some global data structures, and then return normally.
+-
+-   * You can have the handler function terminate the program or transfer
+-     control to a point where it can recover from the situation that
+-     caused the signal.
+-
+-   You need to take special care in writing handler functions because
+-they can be called asynchronously.  That is, a handler might be called
+-at any point in the program, unpredictably.  If two signals arrive
+-during a very short interval, one handler can run within another.  This
+-section describes what your handler should do, and what you should
+-avoid.
+-
+-* Menu:
+-
+-* Handler Returns::             Handlers that return normally, and what
+-                                 this means.
+-* Termination in Handler::      How handler functions terminate a program.
+-* Longjmp in Handler::          Nonlocal transfer of control out of a
+-                                 signal handler.
+-* Signals in Handler::          What happens when signals arrive while
+-                                 the handler is already occupied.
+-* Merged Signals::		When a second signal arrives before the
+-				 first is handled.
+-* Nonreentrancy::               Do not call any functions unless you know they
+-                                 are reentrant with respect to signals.
+-* Atomic Data Access::          A single handler can run in the middle of
+-                                 reading or writing a single object.
+-
+-
+-File: libc.info,  Node: Handler Returns,  Next: Termination in Handler,  Up: Defining Handlers
+-
+-Signal Handlers that Return
+----------------------------
+-
+-   Handlers which return normally are usually used for signals such as
+-`SIGALRM' and the I/O and interprocess communication signals.  But a
+-handler for `SIGINT' might also return normally after setting a flag
+-that tells the program to exit at a convenient time.
+-
+-   It is not safe to return normally from the handler for a program
+-error signal, because the behavior of the program when the handler
+-function returns is not defined after a program error.  *Note Program
+-Error Signals::.
+-
+-   Handlers that return normally must modify some global variable in
+-order to have any effect.  Typically, the variable is one that is
+-examined periodically by the program during normal operation.  Its data
+-type should be `sig_atomic_t' for reasons described in *Note Atomic
+-Data Access::.
+-
+-   Here is a simple example of such a program.  It executes the body of
+-the loop until it has noticed that a `SIGALRM' signal has arrived.
+-This technique is useful because it allows the iteration in progress
+-when the signal arrives to complete before the loop exits.
+-
+-     #include <signal.h>
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     
+-     /* This flag controls termination of the main loop. */
+-     volatile sig_atomic_t keep_going = 1;
+-     
+-     /* The signal handler just clears the flag and re-enables itself. */
+-     void
+-     catch_alarm (int sig)
+-     {
+-       keep_going = 0;
+-       signal (sig, catch_alarm);
+-     }
+-     
+-     void
+-     do_stuff (void)
+-     {
+-       puts ("Doing stuff while waiting for alarm....");
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       /* Establish a handler for SIGALRM signals. */
+-       signal (SIGALRM, catch_alarm);
+-     
+-       /* Set an alarm to go off in a little while. */
+-       alarm (2);
+-     
+-       /* Check the flag once in a while to see when to quit. */
+-       while (keep_going)
+-         do_stuff ();
+-     
+-       return EXIT_SUCCESS;
+-     }
+-
+-
+-File: libc.info,  Node: Termination in Handler,  Next: Longjmp in Handler,  Prev: Handler Returns,  Up: Defining Handlers
+-
+-Handlers That Terminate the Process
+------------------------------------
+-
+-   Handler functions that terminate the program are typically used to
+-cause orderly cleanup or recovery from program error signals and
+-interactive interrupts.
+-
+-   The cleanest way for a handler to terminate the process is to raise
+-the same signal that ran the handler in the first place.  Here is how
+-to do this:
+-
+-     volatile sig_atomic_t fatal_error_in_progress = 0;
+-     
+-     void
+-     fatal_error_signal (int sig)
+-     {
+-     /* Since this handler is established for more than one kind of signal, 
+-          it might still get invoked recursively by delivery of some other kind
+-          of signal.  Use a static variable to keep track of that. */
+-       if (fatal_error_in_progress)
+-         raise (sig);
+-       fatal_error_in_progress = 1;
+-
+-     /* Now do the clean up actions:
+-          - reset terminal modes
+-          - kill child processes
+-          - remove lock files */
+-       ...
+-
+-     /* Now reraise the signal.  We reactivate the signal's
+-          default handling, which is to terminate the process.
+-          We could just call `exit' or `abort',
+-          but reraising the signal sets the return status
+-          from the process correctly. */
+-       signal (sig, SIG_DFL);
+-       raise (sig);
+-     }
+-
+-
+-File: libc.info,  Node: Longjmp in Handler,  Next: Signals in Handler,  Prev: Termination in Handler,  Up: Defining Handlers
+-
+-Nonlocal Control Transfer in Handlers
+--------------------------------------
+-
+-   You can do a nonlocal transfer of control out of a signal handler
+-using the `setjmp' and `longjmp' facilities (*note Non-Local Exits::.).
+-
+-   When the handler does a nonlocal control transfer, the part of the
+-program that was running will not continue.  If this part of the program
+-was in the middle of updating an important data structure, the data
+-structure will remain inconsistent.  Since the program does not
+-terminate, the inconsistency is likely to be noticed later on.
+-
+-   There are two ways to avoid this problem.  One is to block the signal
+-for the parts of the program that update important data structures.
+-Blocking the signal delays its delivery until it is unblocked, once the
+-critical updating is finished.  *Note Blocking Signals::.
+-
+-   The other way to re-initialize the crucial data structures in the
+-signal handler, or make their values consistent.
+-
+-   Here is a rather schematic example showing the reinitialization of
+-one global variable.
+-
+-     #include <signal.h>
+-     #include <setjmp.h>
+-     
+-     jmp_buf return_to_top_level;
+-     
+-     volatile sig_atomic_t waiting_for_input;
+-     
+-     void
+-     handle_sigint (int signum)
+-     {
+-       /* We may have been waiting for input when the signal arrived,
+-          but we are no longer waiting once we transfer control. */
+-       waiting_for_input = 0;
+-       longjmp (return_to_top_level, 1);
+-     }
+-
+-     int
+-     main (void)
+-     {
+-       ...
+-       signal (SIGINT, sigint_handler);
+-       ...
+-       while (1) {
+-         prepare_for_command ();
+-         if (setjmp (return_to_top_level) == 0)
+-           read_and_execute_command ();
+-       }
+-     }
+-
+-     /* Imagine this is a subroutine used by various commands. */
+-     char *
+-     read_data ()
+-     {
+-       if (input_from_terminal) {
+-         waiting_for_input = 1;
+-         ...
+-         waiting_for_input = 0;
+-       } else {
+-         ...
+-       }
+-     }
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-33 glibc-2.1.3/manual/libc.info-33
+--- ../glibc-2.1.3/manual/libc.info-33	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-33	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1181 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Signals in Handler,  Next: Merged Signals,  Prev: Longjmp in Handler,  Up: Defining Handlers
+-
+-Signals Arriving While a Handler Runs
+--------------------------------------
+-
+-   What happens if another signal arrives while your signal handler
+-function is running?
+-
+-   When the handler for a particular signal is invoked, that signal is
+-automatically blocked until the handler returns.  That means that if two
+-signals of the same kind arrive close together, the second one will be
+-held until the first has been handled.  (The handler can explicitly
+-unblock the signal using `sigprocmask', if you want to allow more
+-signals of this type to arrive; see *Note Process Signal Mask::.)
+-
+-   However, your handler can still be interrupted by delivery of another
+-kind of signal.  To avoid this, you can use the `sa_mask' member of the
+-action structure passed to `sigaction' to explicitly specify which
+-signals should be blocked while the signal handler runs.  These signals
+-are in addition to the signal for which the handler was invoked, and
+-any other signals that are normally blocked by the process.  *Note
+-Blocking for Handler::.
+-
+-   When the handler returns, the set of blocked signals is restored to
+-the value it had before the handler ran.  So using `sigprocmask' inside
+-the handler only affects what signals can arrive during the execution of
+-the handler itself, not what signals can arrive once the handler
+-returns.
+-
+-   *Portability Note:* Always use `sigaction' to establish a handler
+-for a signal that you expect to receive asynchronously, if you want
+-your program to work properly on System V Unix.  On this system, the
+-handling of a signal whose handler was established with `signal'
+-automatically sets the signal's action back to `SIG_DFL', and the
+-handler must re-establish itself each time it runs.  This practice,
+-while inconvenient, does work when signals cannot arrive in succession.
+-However, if another signal can arrive right away, it may arrive before
+-the handler can re-establish itself.  Then the second signal would
+-receive the default handling, which could terminate the process.
+-
+-
+-File: libc.info,  Node: Merged Signals,  Next: Nonreentrancy,  Prev: Signals in Handler,  Up: Defining Handlers
+-
+-Signals Close Together Merge into One
+--------------------------------------
+-
+-   If multiple signals of the same type are delivered to your process
+-before your signal handler has a chance to be invoked at all, the
+-handler may only be invoked once, as if only a single signal had
+-arrived.  In effect, the signals merge into one.  This situation can
+-arise when the signal is blocked, or in a multiprocessing environment
+-where the system is busy running some other processes while the signals
+-are delivered.  This means, for example, that you cannot reliably use a
+-signal handler to count signals.  The only distinction you can reliably
+-make is whether at least one signal has arrived since a given time in
+-the past.
+-
+-   Here is an example of a handler for `SIGCHLD' that compensates for
+-the fact that the number of signals received may not equal the number of
+-child processes generate them.  It assumes that the program keeps track
+-of all the child processes with a chain of structures as follows:
+-
+-     struct process
+-     {
+-       struct process *next;
+-       /* The process ID of this child.  */
+-       int pid;
+-       /* The descriptor of the pipe or pseudo terminal
+-          on which output comes from this child.  */
+-       int input_descriptor;
+-       /* Nonzero if this process has stopped or terminated.  */
+-       sig_atomic_t have_status;
+-       /* The status of this child; 0 if running,
+-          otherwise a status value from `waitpid'.  */
+-       int status;
+-     };
+-     
+-     struct process *process_list;
+-
+-   This example also uses a flag to indicate whether signals have
+-arrived since some time in the past--whenever the program last cleared
+-it to zero.
+-
+-     /* Nonzero means some child's status has changed
+-        so look at `process_list' for the details.  */
+-     int process_status_change;
+-
+-   Here is the handler itself:
+-
+-     void
+-     sigchld_handler (int signo)
+-     {
+-       int old_errno = errno;
+-     
+-       while (1) {
+-         register int pid;
+-         int w;
+-         struct process *p;
+-     
+-         /* Keep asking for a status until we get a definitive result.  */
+-         do
+-           {
+-             errno = 0;
+-             pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED);
+-           }
+-         while (pid <= 0 && errno == EINTR);
+-     
+-         if (pid <= 0) {
+-           /* A real failure means there are no more
+-              stopped or terminated child processes, so return.  */
+-           errno = old_errno;
+-           return;
+-         }
+-     
+-         /* Find the process that signaled us, and record its status.  */
+-     
+-         for (p = process_list; p; p = p->next)
+-           if (p->pid == pid) {
+-             p->status = w;
+-             /* Indicate that the `status' field
+-                has data to look at.  We do this only after storing it.  */
+-             p->have_status = 1;
+-     
+-             /* If process has terminated, stop waiting for its output.  */
+-             if (WIFSIGNALED (w) || WIFEXITED (w))
+-               if (p->input_descriptor)
+-                 FD_CLR (p->input_descriptor, &input_wait_mask);
+-     
+-             /* The program should check this flag from time to time
+-                to see if there is any news in `process_list'.  */
+-             ++process_status_change;
+-           }
+-     
+-         /* Loop around to handle all the processes
+-            that have something to tell us.  */
+-       }
+-     }
+-
+-   Here is the proper way to check the flag `process_status_change':
+-
+-     if (process_status_change) {
+-       struct process *p;
+-       process_status_change = 0;
+-       for (p = process_list; p; p = p->next)
+-         if (p->have_status) {
+-           ... Examine `p->status' ...
+-         }
+-     }
+-
+-It is vital to clear the flag before examining the list; otherwise, if a
+-signal were delivered just before the clearing of the flag, and after
+-the appropriate element of the process list had been checked, the status
+-change would go unnoticed until the next signal arrived to set the flag
+-again.  You could, of course, avoid this problem by blocking the signal
+-while scanning the list, but it is much more elegant to guarantee
+-correctness by doing things in the right order.
+-
+-   The loop which checks process status avoids examining `p->status'
+-until it sees that status has been validly stored.  This is to make sure
+-that the status cannot change in the middle of accessing it.  Once
+-`p->have_status' is set, it means that the child process is stopped or
+-terminated, and in either case, it cannot stop or terminate again until
+-the program has taken notice.  *Note Atomic Usage::, for more
+-information about coping with interruptions during accessings of a
+-variable.
+-
+-   Here is another way you can test whether the handler has run since
+-the last time you checked.  This technique uses a counter which is never
+-changed outside the handler.  Instead of clearing the count, the program
+-remembers the previous value and sees whether it has changed since the
+-previous check.  The advantage of this method is that different parts of
+-the program can check independently, each part checking whether there
+-has been a signal since that part last checked.
+-
+-     sig_atomic_t process_status_change;
+-     
+-     sig_atomic_t last_process_status_change;
+-     
+-     ...
+-     {
+-       sig_atomic_t prev = last_process_status_change;
+-       last_process_status_change = process_status_change;
+-       if (last_process_status_change != prev) {
+-         struct process *p;
+-         for (p = process_list; p; p = p->next)
+-           if (p->have_status) {
+-             ... Examine `p->status' ...
+-           }
+-       }
+-     }
+-
+-
+-File: libc.info,  Node: Nonreentrancy,  Next: Atomic Data Access,  Prev: Merged Signals,  Up: Defining Handlers
+-
+-Signal Handling and Nonreentrant Functions
+-------------------------------------------
+-
+-   Handler functions usually don't do very much.  The best practice is
+-to write a handler that does nothing but set an external variable that
+-the program checks regularly, and leave all serious work to the program.
+-This is best because the handler can be called at asynchronously, at
+-unpredictable times--perhaps in the middle of a primitive function, or
+-even between the beginning and the end of a C operator that requires
+-multiple instructions.  The data structures being manipulated might
+-therefore be in an inconsistent state when the handler function is
+-invoked.  Even copying one `int' variable into another can take two
+-instructions on most machines.
+-
+-   This means you have to be very careful about what you do in a signal
+-handler.
+-
+-   * If your handler needs to access any global variables from your
+-     program, declare those variables `volatile'.  This tells the
+-     compiler that the value of the variable might change
+-     asynchronously, and inhibits certain optimizations that would be
+-     invalidated by such modifications.
+-
+-   * If you call a function in the handler, make sure it is "reentrant"
+-     with respect to signals, or else make sure that the signal cannot
+-     interrupt a call to a related function.
+-
+-   A function can be non-reentrant if it uses memory that is not on the
+-stack.
+-
+-   * If a function uses a static variable or a global variable, or a
+-     dynamically-allocated object that it finds for itself, then it is
+-     non-reentrant and any two calls to the function can interfere.
+-
+-     For example, suppose that the signal handler uses `gethostbyname'.
+-     This function returns its value in a static object, reusing the
+-     same object each time.  If the signal happens to arrive during a
+-     call to `gethostbyname', or even after one (while the program is
+-     still using the value), it will clobber the value that the program
+-     asked for.
+-
+-     However, if the program does not use `gethostbyname' or any other
+-     function that returns information in the same object, or if it
+-     always blocks signals around each use, then you are safe.
+-
+-     There are a large number of library functions that return values
+-     in a fixed object, always reusing the same object in this fashion,
+-     and all of them cause the same problem.  The description of a
+-     function in this manual always mentions this behavior.
+-
+-   * If a function uses and modifies an object that you supply, then it
+-     is potentially non-reentrant; two calls can interfere if they use
+-     the same object.
+-
+-     This case arises when you do I/O using streams.  Suppose that the
+-     signal handler prints a message with `fprintf'.  Suppose that the
+-     program was in the middle of an `fprintf' call using the same
+-     stream when the signal was delivered.  Both the signal handler's
+-     message and the program's data could be corrupted, because both
+-     calls operate on the same data structure--the stream itself.
+-
+-     However, if you know that the stream that the handler uses cannot
+-     possibly be used by the program at a time when signals can arrive,
+-     then you are safe.  It is no problem if the program uses some
+-     other stream.
+-
+-   * On most systems, `malloc' and `free' are not reentrant, because
+-     they use a static data structure which records what memory blocks
+-     are free.  As a result, no library functions that allocate or free
+-     memory are reentrant.  This includes functions that allocate space
+-     to store a result.
+-
+-     The best way to avoid the need to allocate memory in a handler is
+-     to allocate in advance space for signal handlers to use.
+-
+-     The best way to avoid freeing memory in a handler is to flag or
+-     record the objects to be freed, and have the program check from
+-     time to time whether anything is waiting to be freed.  But this
+-     must be done with care, because placing an object on a chain is
+-     not atomic, and if it is interrupted by another signal handler
+-     that does the same thing, you could "lose" one of the objects.
+-
+-   * Any function that modifies `errno' is non-reentrant, but you can
+-     correct for this: in the handler, save the original value of
+-     `errno' and restore it before returning normally.  This prevents
+-     errors that occur within the signal handler from being confused
+-     with errors from system calls at the point the program is
+-     interrupted to run the handler.
+-
+-     This technique is generally applicable; if you want to call in a
+-     handler a function that modifies a particular object in memory,
+-     you can make this safe by saving and restoring that object.
+-
+-   * Merely reading from a memory object is safe provided that you can
+-     deal with any of the values that might appear in the object at a
+-     time when the signal can be delivered.  Keep in mind that
+-     assignment to some data types requires more than one instruction,
+-     which means that the handler could run "in the middle of" an
+-     assignment to the variable if its type is not atomic.  *Note
+-     Atomic Data Access::.
+-
+-   * Merely writing into a memory object is safe as long as a sudden
+-     change in the value, at any time when the handler might run, will
+-     not disturb anything.
+-
+-
+-File: libc.info,  Node: Atomic Data Access,  Prev: Nonreentrancy,  Up: Defining Handlers
+-
+-Atomic Data Access and Signal Handling
+---------------------------------------
+-
+-   Whether the data in your application concerns atoms, or mere text,
+-you have to be careful about the fact that access to a single datum is
+-not necessarily "atomic".  This means that it can take more than one
+-instruction to read or write a single object.  In such cases, a signal
+-handler might in the middle of reading or writing the object.
+-
+-   There are three ways you can cope with this problem.  You can use
+-data types that are always accessed atomically; you can carefully
+-arrange that nothing untoward happens if an access is interrupted, or
+-you can block all signals around any access that had better not be
+-interrupted (*note Blocking Signals::.).
+-
+-* Menu:
+-
+-* Non-atomic Example::		A program illustrating interrupted access.
+-* Types: Atomic Types.		Data types that guarantee no interruption.
+-* Usage: Atomic Usage.		Proving that interruption is harmless.
+-
+-
+-File: libc.info,  Node: Non-atomic Example,  Next: Atomic Types,  Up: Atomic Data Access
+-
+-Problems with Non-Atomic Access
+-...............................
+-
+-   Here is an example which shows what can happen if a signal handler
+-runs in the middle of modifying a variable.  (Interrupting the reading
+-of a variable can also lead to paradoxical results, but here we only
+-show writing.)
+-
+-     #include <signal.h>
+-     #include <stdio.h>
+-     
+-     struct two_words { int a, b; } memory;
+-     
+-     void
+-     handler(int signum)
+-     {
+-        printf ("%d,%d\n", memory.a, memory.b);
+-        alarm (1);
+-     }
+-     int
+-     main (void)
+-     {
+-        static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
+-        signal (SIGALRM, handler);
+-        memory = zeros;
+-        alarm (1);
+-        while (1)
+-          {
+-            memory = zeros;
+-            memory = ones;
+-          }
+-     }
+-
+-   This program fills `memory' with zeros, ones, zeros, ones,
+-alternating forever; meanwhile, once per second, the alarm signal
+-handler prints the current contents.  (Calling `printf' in the handler
+-is safe in this program because it is certainly not being called outside
+-the handler when the signal happens.)
+-
+-   Clearly, this program can print a pair of zeros or a pair of ones.
+-But that's not all it can do!  On most machines, it takes several
+-instructions to store a new value in `memory', and the value is stored
+-one word at a time.  If the signal is delivered in between these
+-instructions, the handler might find that `memory.a' is zero and
+-`memory.b' is one (or vice versa).
+-
+-   On some machines it may be possible to store a new value in `memory'
+-with just one instruction that cannot be interrupted.  On these
+-machines, the handler will always print two zeros or two ones.
+-
+-
+-File: libc.info,  Node: Atomic Types,  Next: Atomic Usage,  Prev: Non-atomic Example,  Up: Atomic Data Access
+-
+-Atomic Types
+-............
+-
+-   To avoid uncertainty about interrupting access to a variable, you can
+-use a particular data type for which access is always atomic:
+-`sig_atomic_t'.  Reading and writing this data type is guaranteed to
+-happen in a single instruction, so there's no way for a handler to run
+-"in the middle" of an access.
+-
+-   The type `sig_atomic_t' is always an integer data type, but which
+-one it is, and how many bits it contains, may vary from machine to
+-machine.
+-
+- - Data Type: sig_atomic_t
+-     This is an integer data type.  Objects of this type are always
+-     accessed atomically.
+-
+-   In practice, you can assume that `int' and other integer types no
+-longer than `int' are atomic.  You can also assume that pointer types
+-are atomic; that is very convenient.  Both of these are true on all of
+-the machines that the GNU C library supports, and on all POSIX systems
+-we know of.
+-
+-
+-File: libc.info,  Node: Atomic Usage,  Prev: Atomic Types,  Up: Atomic Data Access
+-
+-Atomic Usage Patterns
+-.....................
+-
+-   Certain patterns of access avoid any problem even if an access is
+-interrupted.  For example, a flag which is set by the handler, and
+-tested and cleared by the main program from time to time, is always safe
+-even if access actually requires two instructions.  To show that this is
+-so, we must consider each access that could be interrupted, and show
+-that there is no problem if it is interrupted.
+-
+-   An interrupt in the middle of testing the flag is safe because
+-either it's recognized to be nonzero, in which case the precise value
+-doesn't matter, or it will be seen to be nonzero the next time it's
+-tested.
+-
+-   An interrupt in the middle of clearing the flag is no problem because
+-either the value ends up zero, which is what happens if a signal comes
+-in just before the flag is cleared, or the value ends up nonzero, and
+-subsequent events occur as if the signal had come in just after the flag
+-was cleared.  As long as the code handles both of these cases properly,
+-it can also handle a signal in the middle of clearing the flag.  (This
+-is an example of the sort of reasoning you need to do to figure out
+-whether non-atomic usage is safe.)
+-
+-   Sometimes you can insure uninterrupted access to one object by
+-protecting its use with another object, perhaps one whose type
+-guarantees atomicity.  *Note Merged Signals::, for an example.
+-
+-
+-File: libc.info,  Node: Interrupted Primitives,  Next: Generating Signals,  Prev: Defining Handlers,  Up: Signal Handling
+-
+-Primitives Interrupted by Signals
+-=================================
+-
+-   A signal can arrive and be handled while an I/O primitive such as
+-`open' or `read' is waiting for an I/O device.  If the signal handler
+-returns, the system faces the question: what should happen next?
+-
+-   POSIX specifies one approach: make the primitive fail right away.
+-The error code for this kind of failure is `EINTR'.  This is flexible,
+-but usually inconvenient.  Typically, POSIX applications that use signal
+-handlers must check for `EINTR' after each library function that can
+-return it, in order to try the call again.  Often programmers forget to
+-check, which is a common source of error.
+-
+-   The GNU library provides a convenient way to retry a call after a
+-temporary failure, with the macro `TEMP_FAILURE_RETRY':
+-
+- - Macro: TEMP_FAILURE_RETRY (EXPRESSION)
+-     This macro evaluates EXPRESSION once.  If it fails and reports
+-     error code `EINTR', `TEMP_FAILURE_RETRY' evaluates it again, and
+-     over and over until the result is not a temporary failure.
+-
+-     The value returned by `TEMP_FAILURE_RETRY' is whatever value
+-     EXPRESSION produced.
+-
+-   BSD avoids `EINTR' entirely and provides a more convenient approach:
+-to restart the interrupted primitive, instead of making it fail.  If
+-you choose this approach, you need not be concerned with `EINTR'.
+-
+-   You can choose either approach with the GNU library.  If you use
+-`sigaction' to establish a signal handler, you can specify how that
+-handler should behave.  If you specify the `SA_RESTART' flag, return
+-from that handler will resume a primitive; otherwise, return from that
+-handler will cause `EINTR'.  *Note Flags for Sigaction::.
+-
+-   Another way to specify the choice is with the `siginterrupt'
+-function.  *Note BSD Handler::.
+-
+-   When you don't specify with `sigaction' or `siginterrupt' what a
+-particular handler should do, it uses a default choice.  The default
+-choice in the GNU library depends on the feature test macros you have
+-defined.  If you define `_BSD_SOURCE' or `_GNU_SOURCE' before calling
+-`signal', the default is to resume primitives; otherwise, the default
+-is to make them fail with `EINTR'.  (The library contains alternate
+-versions of the `signal' function, and the feature test macros
+-determine which one you really call.)  *Note Feature Test Macros::.
+-
+-   The description of each primitive affected by this issue lists
+-`EINTR' among the error codes it can return.
+-
+-   There is one situation where resumption never happens no matter which
+-choice you make: when a data-transfer function such as `read' or
+-`write' is interrupted by a signal after transferring part of the data.
+-In this case, the function returns the number of bytes already
+-transferred, indicating partial success.
+-
+-   This might at first appear to cause unreliable behavior on
+-record-oriented devices (including datagram sockets; *note
+-Datagrams::.), where splitting one `read' or `write' into two would
+-read or write two records.  Actually, there is no problem, because
+-interruption after a partial transfer cannot happen on such devices;
+-they always transfer an entire record in one burst, with no waiting
+-once data transfer has started.
+-
+-
+-File: libc.info,  Node: Generating Signals,  Next: Blocking Signals,  Prev: Interrupted Primitives,  Up: Signal Handling
+-
+-Generating Signals
+-==================
+-
+-   Besides signals that are generated as a result of a hardware trap or
+-interrupt, your program can explicitly send signals to itself or to
+-another process.
+-
+-* Menu:
+-
+-* Signaling Yourself::          A process can send a signal to itself.
+-* Signaling Another Process::   Send a signal to another process.
+-* Permission for kill::         Permission for using `kill'.
+-* Kill Example::                Using `kill' for Communication.
+-
+-
+-File: libc.info,  Node: Signaling Yourself,  Next: Signaling Another Process,  Up: Generating Signals
+-
+-Signaling Yourself
+-------------------
+-
+-   A process can send itself a signal with the `raise' function.  This
+-function is declared in `signal.h'.
+-
+- - Function: int raise (int SIGNUM)
+-     The `raise' function sends the signal SIGNUM to the calling
+-     process.  It returns zero if successful and a nonzero value if it
+-     fails.  About the only reason for failure would be if the value of
+-     SIGNUM is invalid.
+-
+- - Function: int gsignal (int SIGNUM)
+-     The `gsignal' function does the same thing as `raise'; it is
+-     provided only for compatibility with SVID.
+-
+-   One convenient use for `raise' is to reproduce the default behavior
+-of a signal that you have trapped.  For instance, suppose a user of your
+-program types the SUSP character (usually `C-z'; *note Special
+-Characters::.) to send it an interactive stop signal (`SIGTSTP'), and
+-you want to clean up some internal data buffers before stopping.  You
+-might set this up like this:
+-
+-     #include <signal.h>
+-     
+-     /* When a stop signal arrives, set the action back to the default
+-        and then resend the signal after doing cleanup actions. */
+-     
+-     void
+-     tstp_handler (int sig)
+-     {
+-       signal (SIGTSTP, SIG_DFL);
+-       /* Do cleanup actions here. */
+-       ...
+-       raise (SIGTSTP);
+-     }
+-     
+-     /* When the process is continued again, restore the signal handler. */
+-     
+-     void
+-     cont_handler (int sig)
+-     {
+-       signal (SIGCONT, cont_handler);
+-       signal (SIGTSTP, tstp_handler);
+-     }
+-     /* Enable both handlers during program initialization. */
+-     
+-     int
+-     main (void)
+-     {
+-       signal (SIGCONT, cont_handler);
+-       signal (SIGTSTP, tstp_handler);
+-       ...
+-     }
+-
+-   *Portability note:* `raise' was invented by the ISO C committee.
+-Older systems may not support it, so using `kill' may be more portable.
+-*Note Signaling Another Process::.
+-
+-
+-File: libc.info,  Node: Signaling Another Process,  Next: Permission for kill,  Prev: Signaling Yourself,  Up: Generating Signals
+-
+-Signaling Another Process
+--------------------------
+-
+-   The `kill' function can be used to send a signal to another process.
+-In spite of its name, it can be used for a lot of things other than
+-causing a process to terminate.  Some examples of situations where you
+-might want to send signals between processes are:
+-
+-   * A parent process starts a child to perform a task--perhaps having
+-     the child running an infinite loop--and then terminates the child
+-     when the task is no longer needed.
+-
+-   * A process executes as part of a group, and needs to terminate or
+-     notify the other processes in the group when an error or other
+-     event occurs.
+-
+-   * Two processes need to synchronize while working together.
+-
+-   This section assumes that you know a little bit about how processes
+-work.  For more information on this subject, see *Note Processes::.
+-
+-   The `kill' function is declared in `signal.h'.
+-
+- - Function: int kill (pid_t PID, int SIGNUM)
+-     The `kill' function sends the signal SIGNUM to the process or
+-     process group specified by PID.  Besides the signals listed in
+-     *Note Standard Signals::, SIGNUM can also have a value of zero to
+-     check the validity of the PID.
+-
+-     The PID specifies the process or process group to receive the
+-     signal:
+-
+-    `PID > 0'
+-          The process whose identifier is PID.
+-
+-    `PID == 0'
+-          All processes in the same process group as the sender.
+-
+-    `PID < -1'
+-          The process group whose identifier is -PID.
+-
+-    `PID == -1'
+-          If the process is privileged, send the signal to all
+-          processes except for some special system processes.
+-          Otherwise, send the signal to all processes with the same
+-          effective user ID.
+-
+-     A process can send a signal to itself with a call like
+-     `kill (getpid(), SIGNUM)'.  If `kill' is used by a process to send
+-     a signal to itself, and the signal is not blocked, then `kill'
+-     delivers at least one signal (which might be some other pending
+-     unblocked signal instead of the signal SIGNUM) to that process
+-     before it returns.
+-
+-     The return value from `kill' is zero if the signal can be sent
+-     successfully.  Otherwise, no signal is sent, and a value of `-1' is
+-     returned.  If PID specifies sending a signal to several processes,
+-     `kill' succeeds if it can send the signal to at least one of them.
+-     There's no way you can tell which of the processes got the signal
+-     or whether all of them did.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINVAL'
+-          The SIGNUM argument is an invalid or unsupported number.
+-
+-    `EPERM'
+-          You do not have the privilege to send a signal to the process
+-          or any of the processes in the process group named by PID.
+-
+-    `ESCRH'
+-          The PID argument does not refer to an existing process or
+-          group.
+-
+- - Function: int killpg (int PGID, int SIGNUM)
+-     This is similar to `kill', but sends signal SIGNUM to the process
+-     group PGID.  This function is provided for compatibility with BSD;
+-     using `kill' to do this is more portable.
+-
+-   As a simple example of `kill', the call `kill (getpid (), SIG)' has
+-the same effect as `raise (SIG)'.
+-
+-
+-File: libc.info,  Node: Permission for kill,  Next: Kill Example,  Prev: Signaling Another Process,  Up: Generating Signals
+-
+-Permission for using `kill'
+----------------------------
+-
+-   There are restrictions that prevent you from using `kill' to send
+-signals to any random process.  These are intended to prevent antisocial
+-behavior such as arbitrarily killing off processes belonging to another
+-user.  In typical use, `kill' is used to pass signals between parent,
+-child, and sibling processes, and in these situations you normally do
+-have permission to send signals.  The only common exception is when you
+-run a setuid program in a child process; if the program changes its
+-real UID as well as its effective UID, you may not have permission to
+-send a signal.  The `su' program does this.
+-
+-   Whether a process has permission to send a signal to another process
+-is determined by the user IDs of the two processes.  This concept is
+-discussed in detail in *Note Process Persona::.
+-
+-   Generally, for a process to be able to send a signal to another
+-process, either the sending process must belong to a privileged user
+-(like `root'), or the real or effective user ID of the sending process
+-must match the real or effective user ID of the receiving process.  If
+-the receiving process has changed its effective user ID from the
+-set-user-ID mode bit on its process image file, then the owner of the
+-process image file is used in place of its current effective user ID.
+-In some implementations, a parent process might be able to send signals
+-to a child process even if the user ID's don't match, and other
+-implementations might enforce other restrictions.
+-
+-   The `SIGCONT' signal is a special case.  It can be sent if the
+-sender is part of the same session as the receiver, regardless of user
+-IDs.
+-
+-
+-File: libc.info,  Node: Kill Example,  Prev: Permission for kill,  Up: Generating Signals
+-
+-Using `kill' for Communication
+-------------------------------
+-
+-   Here is a longer example showing how signals can be used for
+-interprocess communication.  This is what the `SIGUSR1' and `SIGUSR2'
+-signals are provided for.  Since these signals are fatal by default,
+-the process that is supposed to receive them must trap them through
+-`signal' or `sigaction'.
+-
+-   In this example, a parent process forks a child process and then
+-waits for the child to complete its initialization.  The child process
+-tells the parent when it is ready by sending it a `SIGUSR1' signal,
+-using the `kill' function.
+-
+-     #include <signal.h>
+-     #include <stdio.h>
+-     #include <sys/types.h>
+-     #include <unistd.h>
+-     
+-     /* When a `SIGUSR1' signal arrives, set this variable. */
+-     volatile sig_atomic_t usr_interrupt = 0;
+-     
+-     void
+-     synch_signal (int sig)
+-     {
+-       usr_interrupt = 1;
+-     }
+-     
+-     /* The child process executes this function. */
+-     void
+-     child_function (void)
+-     {
+-       /* Perform initialization. */
+-       printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());
+-     
+-       /* Let parent know you're done. */
+-       kill (getppid (), SIGUSR1);
+-     
+-       /* Continue with execution. */
+-       puts ("Bye, now....");
+-       exit (0);
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       struct sigaction usr_action;
+-       sigset_t block_mask;
+-       pid_t child_id;
+-     
+-       /* Establish the signal handler. */
+-       sigfillset (&block_mask);
+-       usr_action.sa_handler = synch_signal;
+-       usr_action.sa_mask = block_mask;
+-       usr_action.sa_flags = 0;
+-       sigaction (SIGUSR1, &usr_action, NULL);
+-     
+-       /* Create the child process. */
+-       child_id = fork ();
+-       if (child_id == 0)
+-         child_function ();          /* Does not return. */
+-     /* Busy wait for the child to send a signal. */
+-       while (!usr_interrupt)
+-         ;
+-     
+-       /* Now continue execution. */
+-       puts ("That's all, folks!");
+-     
+-       return 0;
+-     }
+-
+-   This example uses a busy wait, which is bad, because it wastes CPU
+-cycles that other programs could otherwise use.  It is better to ask the
+-system to wait until the signal arrives.  See the example in *Note
+-Waiting for a Signal::.
+-
+-
+-File: libc.info,  Node: Blocking Signals,  Next: Waiting for a Signal,  Prev: Generating Signals,  Up: Signal Handling
+-
+-Blocking Signals
+-================
+-
+-   Blocking a signal means telling the operating system to hold it and
+-deliver it later.  Generally, a program does not block signals
+-indefinitely--it might as well ignore them by setting their actions to
+-`SIG_IGN'.  But it is useful to block signals briefly, to prevent them
+-from interrupting sensitive operations.  For instance:
+-
+-   * You can use the `sigprocmask' function to block signals while you
+-     modify global variables that are also modified by the handlers for
+-     these signals.
+-
+-   * You can set `sa_mask' in your `sigaction' call to block certain
+-     signals while a particular signal handler runs.  This way, the
+-     signal handler can run without being interrupted itself by signals.
+-
+-* Menu:
+-
+-* Why Block::                           The purpose of blocking signals.
+-* Signal Sets::                         How to specify which signals to
+-                                         block.
+-* Process Signal Mask::                 Blocking delivery of signals to your
+-				         process during normal execution.
+-* Testing for Delivery::                Blocking to Test for Delivery of
+-                                         a Signal.
+-* Blocking for Handler::                Blocking additional signals while a
+-				         handler is being run.
+-* Checking for Pending Signals::        Checking for Pending Signals
+-* Remembering a Signal::                How you can get almost the same
+-                                         effect as blocking a signal, by
+-                                         handling it and setting a flag
+-                                         to be tested later.
+-
+-
+-File: libc.info,  Node: Why Block,  Next: Signal Sets,  Up: Blocking Signals
+-
+-Why Blocking Signals is Useful
+-------------------------------
+-
+-   Temporary blocking of signals with `sigprocmask' gives you a way to
+-prevent interrupts during critical parts of your code.  If signals
+-arrive in that part of the program, they are delivered later, after you
+-unblock them.
+-
+-   One example where this is useful is for sharing data between a signal
+-handler and the rest of the program.  If the type of the data is not
+-`sig_atomic_t' (*note Atomic Data Access::.), then the signal handler
+-could run when the rest of the program has only half finished reading
+-or writing the data.  This would lead to confusing consequences.
+-
+-   To make the program reliable, you can prevent the signal handler from
+-running while the rest of the program is examining or modifying that
+-data--by blocking the appropriate signal around the parts of the
+-program that touch the data.
+-
+-   Blocking signals is also necessary when you want to perform a certain
+-action only if a signal has not arrived.  Suppose that the handler for
+-the signal sets a flag of type `sig_atomic_t'; you would like to test
+-the flag and perform the action if the flag is not set.  This is
+-unreliable.  Suppose the signal is delivered immediately after you test
+-the flag, but before the consequent action: then the program will
+-perform the action even though the signal has arrived.
+-
+-   The only way to test reliably for whether a signal has yet arrived
+-is to test while the signal is blocked.
+-
+-
+-File: libc.info,  Node: Signal Sets,  Next: Process Signal Mask,  Prev: Why Block,  Up: Blocking Signals
+-
+-Signal Sets
+------------
+-
+-   All of the signal blocking functions use a data structure called a
+-"signal set" to specify what signals are affected.  Thus, every
+-activity involves two stages: creating the signal set, and then passing
+-it as an argument to a library function.
+-
+-   These facilities are declared in the header file `signal.h'.
+-
+- - Data Type: sigset_t
+-     The `sigset_t' data type is used to represent a signal set.
+-     Internally, it may be implemented as either an integer or structure
+-     type.
+-
+-     For portability, use only the functions described in this section
+-     to initialize, change, and retrieve information from `sigset_t'
+-     objects--don't try to manipulate them directly.
+-
+-   There are two ways to initialize a signal set.  You can initially
+-specify it to be empty with `sigemptyset' and then add specified
+-signals individually.  Or you can specify it to be full with
+-`sigfillset' and then delete specified signals individually.
+-
+-   You must always initialize the signal set with one of these two
+-functions before using it in any other way.  Don't try to set all the
+-signals explicitly because the `sigset_t' object might include some
+-other information (like a version field) that needs to be initialized as
+-well.  (In addition, it's not wise to put into your program an
+-assumption that the system has no signals aside from the ones you know
+-about.)
+-
+- - Function: int sigemptyset (sigset_t *SET)
+-     This function initializes the signal set SET to exclude all of the
+-     defined signals.  It always returns `0'.
+-
+- - Function: int sigfillset (sigset_t *SET)
+-     This function initializes the signal set SET to include all of the
+-     defined signals.  Again, the return value is `0'.
+-
+- - Function: int sigaddset (sigset_t *SET, int SIGNUM)
+-     This function adds the signal SIGNUM to the signal set SET.  All
+-     `sigaddset' does is modify SET; it does not block or unblock any
+-     signals.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition is defined for this function:
+-
+-    `EINVAL'
+-          The SIGNUM argument doesn't specify a valid signal.
+-
+- - Function: int sigdelset (sigset_t *SET, int SIGNUM)
+-     This function removes the signal SIGNUM from the signal set SET.
+-     All `sigdelset' does is modify SET; it does not block or unblock
+-     any signals.  The return value and error conditions are the same
+-     as for `sigaddset'.
+-
+-   Finally, there is a function to test what signals are in a signal
+-set:
+-
+- - Function: int sigismember (const sigset_t *SET, int SIGNUM)
+-     The `sigismember' function tests whether the signal SIGNUM is a
+-     member of the signal set SET.  It returns `1' if the signal is in
+-     the set, `0' if not, and `-1' if there is an error.
+-
+-     The following `errno' error condition is defined for this function:
+-
+-    `EINVAL'
+-          The SIGNUM argument doesn't specify a valid signal.
+-
+-
+-File: libc.info,  Node: Process Signal Mask,  Next: Testing for Delivery,  Prev: Signal Sets,  Up: Blocking Signals
+-
+-Process Signal Mask
+--------------------
+-
+-   The collection of signals that are currently blocked is called the
+-"signal mask".  Each process has its own signal mask.  When you create
+-a new process (*note Creating a Process::.), it inherits its parent's
+-mask.  You can block or unblock signals with total flexibility by
+-modifying the signal mask.
+-
+-   The prototype for the `sigprocmask' function is in `signal.h'.
+-
+- - Function: int sigprocmask (int HOW, const sigset_t *SET, sigset_t
+-          *OLDSET)
+-     The `sigprocmask' function is used to examine or change the calling
+-     process's signal mask.  The HOW argument determines how the signal
+-     mask is changed, and must be one of the following values:
+-
+-    `SIG_BLOCK'
+-          Block the signals in `set'--add them to the existing mask.  In
+-          other words, the new mask is the union of the existing mask
+-          and SET.
+-
+-    `SIG_UNBLOCK'
+-          Unblock the signals in SET--remove them from the existing
+-          mask.
+-
+-    `SIG_SETMASK'
+-          Use SET for the mask; ignore the previous value of the mask.
+-
+-     The last argument, OLDSET, is used to return information about the
+-     old process signal mask.  If you just want to change the mask
+-     without looking at it, pass a null pointer as the OLDSET argument.
+-     Similarly, if you want to know what's in the mask without changing
+-     it, pass a null pointer for SET (in this case the HOW argument is
+-     not significant).  The OLDSET argument is often used to remember
+-     the previous signal mask in order to restore it later.  (Since the
+-     signal mask is inherited over `fork' and `exec' calls, you can't
+-     predict what its contents are when your program starts running.)
+-
+-     If invoking `sigprocmask' causes any pending signals to be
+-     unblocked, at least one of those signals is delivered to the
+-     process before `sigprocmask' returns.  The order in which pending
+-     signals are delivered is not specified, but you can control the
+-     order explicitly by making multiple `sigprocmask' calls to unblock
+-     various signals one at a time.
+-
+-     The `sigprocmask' function returns `0' if successful, and `-1' to
+-     indicate an error.  The following `errno' error conditions are
+-     defined for this function:
+-
+-    `EINVAL'
+-          The HOW argument is invalid.
+-
+-     You can't block the `SIGKILL' and `SIGSTOP' signals, but if the
+-     signal set includes these, `sigprocmask' just ignores them instead
+-     of returning an error status.
+-
+-     Remember, too, that blocking program error signals such as `SIGFPE'
+-     leads to undesirable results for signals generated by an actual
+-     program error (as opposed to signals sent with `raise' or `kill').
+-     This is because your program may be too broken to be able to
+-     continue executing to a point where the signal is unblocked again.
+-     *Note Program Error Signals::.
+-
+-
+-File: libc.info,  Node: Testing for Delivery,  Next: Blocking for Handler,  Prev: Process Signal Mask,  Up: Blocking Signals
+-
+-Blocking to Test for Delivery of a Signal
+------------------------------------------
+-
+-   Now for a simple example.  Suppose you establish a handler for
+-`SIGALRM' signals that sets a flag whenever a signal arrives, and your
+-main program checks this flag from time to time and then resets it.
+-You can prevent additional `SIGALRM' signals from arriving in the
+-meantime by wrapping the critical part of the code with calls to
+-`sigprocmask', like this:
+-
+-     /* This variable is set by the SIGALRM signal handler. */
+-     volatile sig_atomic_t flag = 0;
+-     
+-     int
+-     main (void)
+-     {
+-       sigset_t block_alarm;
+-     
+-       ...
+-     
+-       /* Initialize the signal mask. */
+-       sigemptyset (&block_alarm);
+-       sigaddset (&block_alarm, SIGALRM);
+-     while (1)
+-         {
+-           /* Check if a signal has arrived; if so, reset the flag. */
+-           sigprocmask (SIG_BLOCK, &block_alarm, NULL);
+-           if (flag)
+-             {
+-               ACTIONS-IF-NOT-ARRIVED
+-               flag = 0;
+-             }
+-           sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
+-     
+-           ...
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Blocking for Handler,  Next: Checking for Pending Signals,  Prev: Testing for Delivery,  Up: Blocking Signals
+-
+-Blocking Signals for a Handler
+-------------------------------
+-
+-   When a signal handler is invoked, you usually want it to be able to
+-finish without being interrupted by another signal.  From the moment the
+-handler starts until the moment it finishes, you must block signals that
+-might confuse it or corrupt its data.
+-
+-   When a handler function is invoked on a signal, that signal is
+-automatically blocked (in addition to any other signals that are already
+-in the process's signal mask) during the time the handler is running.
+-If you set up a handler for `SIGTSTP', for instance, then the arrival
+-of that signal forces further `SIGTSTP' signals to wait during the
+-execution of the handler.
+-
+-   However, by default, other kinds of signals are not blocked; they can
+-arrive during handler execution.
+-
+-   The reliable way to block other kinds of signals during the
+-execution of the handler is to use the `sa_mask' member of the
+-`sigaction' structure.
+-
+-   Here is an example:
+-
+-     #include <signal.h>
+-     #include <stddef.h>
+-     
+-     void catch_stop ();
+-     
+-     void
+-     install_handler (void)
+-     {
+-       struct sigaction setup_action;
+-       sigset_t block_mask;
+-     
+-       sigemptyset (&block_mask);
+-       /* Block other terminal-generated signals while handler runs. */
+-       sigaddset (&block_mask, SIGINT);
+-       sigaddset (&block_mask, SIGQUIT);
+-       setup_action.sa_handler = catch_stop;
+-       setup_action.sa_mask = block_mask;
+-       setup_action.sa_flags = 0;
+-       sigaction (SIGTSTP, &setup_action, NULL);
+-     }
+-
+-   This is more reliable than blocking the other signals explicitly in
+-the code for the handler.  If you block signals explicitly in the
+-handler, you can't avoid at least a short interval at the beginning of
+-the handler where they are not yet blocked.
+-
+-   You cannot remove signals from the process's current mask using this
+-mechanism.  However, you can make calls to `sigprocmask' within your
+-handler to block or unblock signals as you wish.
+-
+-   In any case, when the handler returns, the system restores the mask
+-that was in place before the handler was entered.  If any signals that
+-become unblocked by this restoration are pending, the process will
+-receive those signals immediately, before returning to the code that was
+-interrupted.
+-
+-
+-File: libc.info,  Node: Checking for Pending Signals,  Next: Remembering a Signal,  Prev: Blocking for Handler,  Up: Blocking Signals
+-
+-Checking for Pending Signals
+-----------------------------
+-
+-   You can find out which signals are pending at any time by calling
+-`sigpending'.  This function is declared in `signal.h'.
+-
+- - Function: int sigpending (sigset_t *SET)
+-     The `sigpending' function stores information about pending signals
+-     in SET.  If there is a pending signal that is blocked from
+-     delivery, then that signal is a member of the returned set.  (You
+-     can test whether a particular signal is a member of this set using
+-     `sigismember'; see *Note Signal Sets::.)
+-
+-     The return value is `0' if successful, and `-1' on failure.
+-
+-   Testing whether a signal is pending is not often useful.  Testing
+-when that signal is not blocked is almost certainly bad design.
+-
+-   Here is an example.
+-
+-     #include <signal.h>
+-     #include <stddef.h>
+-     
+-     sigset_t base_mask, waiting_mask;
+-     
+-     sigemptyset (&base_mask);
+-     sigaddset (&base_mask, SIGINT);
+-     sigaddset (&base_mask, SIGTSTP);
+-     
+-     /* Block user interrupts while doing other processing. */
+-     sigprocmask (SIG_SETMASK, &base_mask, NULL);
+-     ...
+-     
+-     /* After a while, check to see whether any signals are pending. */
+-     sigpending (&waiting_mask);
+-     if (sigismember (&waiting_mask, SIGINT)) {
+-       /* User has tried to kill the process. */
+-     }
+-     else if (sigismember (&waiting_mask, SIGTSTP)) {
+-       /* User has tried to stop the process. */
+-     }
+-
+-   Remember that if there is a particular signal pending for your
+-process, additional signals of that same type that arrive in the
+-meantime might be discarded.  For example, if a `SIGINT' signal is
+-pending when another `SIGINT' signal arrives, your program will
+-probably only see one of them when you unblock this signal.
+-
+-   *Portability Note:* The `sigpending' function is new in POSIX.1.
+-Older systems have no equivalent facility.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-34 glibc-2.1.3/manual/libc.info-34
+--- ../glibc-2.1.3/manual/libc.info-34	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-34	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1256 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Remembering a Signal,  Prev: Checking for Pending Signals,  Up: Blocking Signals
+-
+-Remembering a Signal to Act On Later
+-------------------------------------
+-
+-   Instead of blocking a signal using the library facilities, you can
+-get almost the same results by making the handler set a flag to be
+-tested later, when you "unblock".  Here is an example:
+-
+-     /* If this flag is nonzero, don't handle the signal right away. */
+-     volatile sig_atomic_t signal_pending;
+-     
+-     /* This is nonzero if a signal arrived and was not handled. */
+-     volatile sig_atomic_t defer_signal;
+-     
+-     void
+-     handler (int signum)
+-     {
+-       if (defer_signal)
+-         signal_pending = signum;
+-       else
+-         ... /* "Really" handle the signal. */
+-     }
+-     
+-     ...
+-     
+-     void
+-     update_mumble (int frob)
+-     {
+-       /* Prevent signals from having immediate effect. */
+-       defer_signal++;
+-       /* Now update `mumble', without worrying about interruption. */
+-       mumble.a = 1;
+-       mumble.b = hack ();
+-       mumble.c = frob;
+-       /* We have updated `mumble'.  Handle any signal that came in. */
+-       defer_signal--;
+-       if (defer_signal == 0 && signal_pending != 0)
+-         raise (signal_pending);
+-     }
+-
+-   Note how the particular signal that arrives is stored in
+-`signal_pending'.  That way, we can handle several types of
+-inconvenient signals with the same mechanism.
+-
+-   We increment and decrement `defer_signal' so that nested critical
+-sections will work properly; thus, if `update_mumble' were called with
+-`signal_pending' already nonzero, signals would be deferred not only
+-within `update_mumble', but also within the caller.  This is also why
+-we do not check `signal_pending' if `defer_signal' is still nonzero.
+-
+-   The incrementing and decrementing of `defer_signal' require more
+-than one instruction; it is possible for a signal to happen in the
+-middle.  But that does not cause any problem.  If the signal happens
+-early enough to see the value from before the increment or decrement,
+-that is equivalent to a signal which came before the beginning of the
+-increment or decrement, which is a case that works properly.
+-
+-   It is absolutely vital to decrement `defer_signal' before testing
+-`signal_pending', because this avoids a subtle bug.  If we did these
+-things in the other order, like this,
+-
+-       if (defer_signal == 1 && signal_pending != 0)
+-         raise (signal_pending);
+-       defer_signal--;
+-
+-then a signal arriving in between the `if' statement and the decrement
+-would be effectively "lost" for an indefinite amount of time.  The
+-handler would merely set `defer_signal', but the program having already
+-tested this variable, it would not test the variable again.
+-
+-   Bugs like these are called "timing errors".  They are especially bad
+-because they happen only rarely and are nearly impossible to reproduce.
+-You can't expect to find them with a debugger as you would find a
+-reproducible bug.  So it is worth being especially careful to avoid
+-them.
+-
+-   (You would not be tempted to write the code in this order, given the
+-use of `defer_signal' as a counter which must be tested along with
+-`signal_pending'.  After all, testing for zero is cleaner than testing
+-for one.  But if you did not use `defer_signal' as a counter, and gave
+-it values of zero and one only, then either order might seem equally
+-simple.  This is a further advantage of using a counter for
+-`defer_signal': it will reduce the chance you will write the code in
+-the wrong order and create a subtle bug.)
+-
+-
+-File: libc.info,  Node: Waiting for a Signal,  Next: Signal Stack,  Prev: Blocking Signals,  Up: Signal Handling
+-
+-Waiting for a Signal
+-====================
+-
+-   If your program is driven by external events, or uses signals for
+-synchronization, then when it has nothing to do it should probably wait
+-until a signal arrives.
+-
+-* Menu:
+-
+-* Using Pause::                 The simple way, using `pause'.
+-* Pause Problems::              Why the simple way is often not very good.
+-* Sigsuspend::                  Reliably waiting for a specific signal.
+-
+-
+-File: libc.info,  Node: Using Pause,  Next: Pause Problems,  Up: Waiting for a Signal
+-
+-Using `pause'
+--------------
+-
+-   The simple way to wait until a signal arrives is to call `pause'.
+-Please read about its disadvantages, in the following section, before
+-you use it.
+-
+- - Function: int pause ()
+-     The `pause' function suspends program execution until a signal
+-     arrives whose action is either to execute a handler function, or to
+-     terminate the process.
+-
+-     If the signal causes a handler function to be executed, then
+-     `pause' returns.  This is considered an unsuccessful return (since
+-     "successful" behavior would be to suspend the program forever), so
+-     the return value is `-1'.  Even if you specify that other
+-     primitives should resume when a system handler returns (*note
+-     Interrupted Primitives::.), this has no effect on `pause'; it
+-     always fails when a signal is handled.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINTR'
+-          The function was interrupted by delivery of a signal.
+-
+-     If the signal causes program termination, `pause' doesn't return
+-     (obviously).
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `pause' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `pause' should be protected using cancelation handlers.
+-
+-     The `pause' function is declared in  `unistd.h'.
+-
+-
+-File: libc.info,  Node: Pause Problems,  Next: Sigsuspend,  Prev: Using Pause,  Up: Waiting for a Signal
+-
+-Problems with `pause'
+----------------------
+-
+-   The simplicity of `pause' can conceal serious timing errors that can
+-make a program hang mysteriously.
+-
+-   It is safe to use `pause' if the real work of your program is done
+-by the signal handlers themselves, and the "main program" does nothing
+-but call `pause'.  Each time a signal is delivered, the handler will do
+-the next batch of work that is to be done, and then return, so that the
+-main loop of the program can call `pause' again.
+-
+-   You can't safely use `pause' to wait until one more signal arrives,
+-and then resume real work.  Even if you arrange for the signal handler
+-to cooperate by setting a flag, you still can't use `pause' reliably.
+-Here is an example of this problem:
+-
+-     /* `usr_interrupt' is set by the signal handler.  */
+-     if (!usr_interrupt)
+-       pause ();
+-     
+-     /* Do work once the signal arrives.  */
+-     ...
+-
+-This has a bug: the signal could arrive after the variable
+-`usr_interrupt' is checked, but before the call to `pause'.  If no
+-further signals arrive, the process would never wake up again.
+-
+-   You can put an upper limit on the excess waiting by using `sleep' in
+-a loop, instead of using `pause'.  (*Note Sleeping::, for more about
+-`sleep'.)  Here is what this looks like:
+-
+-     /* `usr_interrupt' is set by the signal handler.
+-     while (!usr_interrupt)
+-       sleep (1);
+-     
+-     /* Do work once the signal arrives.  */
+-     ...
+-
+-   For some purposes, that is good enough.  But with a little more
+-complexity, you can wait reliably until a particular signal handler is
+-run, using `sigsuspend'.  *Note Sigsuspend::.
+-
+-
+-File: libc.info,  Node: Sigsuspend,  Prev: Pause Problems,  Up: Waiting for a Signal
+-
+-Using `sigsuspend'
+-------------------
+-
+-   The clean and reliable way to wait for a signal to arrive is to
+-block it and then use `sigsuspend'.  By using `sigsuspend' in a loop,
+-you can wait for certain kinds of signals, while letting other kinds of
+-signals be handled by their handlers.
+-
+- - Function: int sigsuspend (const sigset_t *SET)
+-     This function replaces the process's signal mask with SET and then
+-     suspends the process until a signal is delivered whose action is
+-     either to terminate the process or invoke a signal handling
+-     function.  In other words, the program is effectively suspended
+-     until one of the signals that is not a member of SET arrives.
+-
+-     If the process is woken up by deliver of a signal that invokes a
+-     handler function, and the handler function returns, then
+-     `sigsuspend' also returns.
+-
+-     The mask remains SET only as long as `sigsuspend' is waiting.  The
+-     function `sigsuspend' always restores the previous signal mask
+-     when it returns.
+-
+-     The return value and error conditions are the same as for `pause'.
+-
+-   With `sigsuspend', you can replace the `pause' or `sleep' loop in
+-the previous section with something completely reliable:
+-
+-     sigset_t mask, oldmask;
+-     
+-     ...
+-     
+-     /* Set up the mask of signals to temporarily block. */
+-     sigemptyset (&mask);
+-     sigaddset (&mask, SIGUSR1);
+-     
+-     ...
+-     
+-     /* Wait for a signal to arrive. */
+-     sigprocmask (SIG_BLOCK, &mask, &oldmask);
+-     while (!usr_interrupt)
+-       sigsuspend (&oldmask);
+-     sigprocmask (SIG_UNBLOCK, &mask, NULL);
+-
+-   This last piece of code is a little tricky.  The key point to
+-remember here is that when `sigsuspend' returns, it resets the process's
+-signal mask to the original value, the value from before the call to
+-`sigsuspend'--in this case, the `SIGUSR1' signal is once again blocked.
+-The second call to `sigprocmask' is necessary to explicitly unblock
+-this signal.
+-
+-   One other point: you may be wondering why the `while' loop is
+-necessary at all, since the program is apparently only waiting for one
+-`SIGUSR1' signal.  The answer is that the mask passed to `sigsuspend'
+-permits the process to be woken up by the delivery of other kinds of
+-signals, as well--for example, job control signals.  If the process is
+-woken up by a signal that doesn't set `usr_interrupt', it just suspends
+-itself again until the "right" kind of signal eventually arrives.
+-
+-   This technique takes a few more lines of preparation, but that is
+-needed just once for each kind of wait criterion you want to use.  The
+-code that actually waits is just four lines.
+-
+-
+-File: libc.info,  Node: Signal Stack,  Next: BSD Signal Handling,  Prev: Waiting for a Signal,  Up: Signal Handling
+-
+-Using a Separate Signal Stack
+-=============================
+-
+-   A signal stack is a special area of memory to be used as the
+-execution stack during signal handlers.  It should be fairly large, to
+-avoid any danger that it will overflow in turn; the macro `SIGSTKSZ' is
+-defined to a canonical size for signal stacks.  You can use `malloc' to
+-allocate the space for the stack.  Then call `sigaltstack' or
+-`sigstack' to tell the system to use that space for the signal stack.
+-
+-   You don't need to write signal handlers differently in order to use a
+-signal stack.  Switching from one stack to the other happens
+-automatically.  (Some non-GNU debuggers on some machines may get
+-confused if you examine a stack trace while a handler that uses the
+-signal stack is running.)
+-
+-   There are two interfaces for telling the system to use a separate
+-signal stack.  `sigstack' is the older interface, which comes from 4.2
+-BSD.  `sigaltstack' is the newer interface, and comes from 4.4 BSD.
+-The `sigaltstack' interface has the advantage that it does not require
+-your program to know which direction the stack grows, which depends on
+-the specific machine and operating system.
+-
+- - Data Type: struct sigaltstack
+-     This structure describes a signal stack.  It contains the
+-     following members:
+-
+-    `void *ss_sp'
+-          This points to the base of the signal stack.
+-
+-    `size_t ss_size'
+-          This is the size (in bytes) of the signal stack which `ss_sp'
+-          points to.  You should set this to however much space you
+-          allocated for the stack.
+-
+-          There are two macros defined in `signal.h' that you should
+-          use in calculating this size:
+-
+-         `SIGSTKSZ'
+-               This is the canonical size for a signal stack.  It is
+-               judged to be sufficient for normal uses.
+-
+-         `MINSIGSTKSZ'
+-               This is the amount of signal stack space the operating
+-               system needs just to implement signal delivery.  The
+-               size of a signal stack *must* be greater than this.
+-
+-               For most cases, just using `SIGSTKSZ' for `ss_size' is
+-               sufficient.  But if you know how much stack space your
+-               program's signal handlers will need, you may want to use
+-               a different size.  In this case, you should allocate
+-               `MINSIGSTKSZ' additional bytes for the signal stack and
+-               increase `ss_size' accordingly.
+-
+-    `int ss_flags'
+-          This field contains the bitwise OR of these flags:
+-
+-         `SS_DISABLE'
+-               This tells the system that it should not use the signal
+-               stack.
+-
+-         `SS_ONSTACK'
+-               This is set by the system, and indicates that the signal
+-               stack is currently in use.  If this bit is not set, then
+-               signals will be delivered on the normal user stack.
+-
+- - Function: int sigaltstack (const struct sigaltstack *STACK, struct
+-          sigaltstack *OLDSTACK)
+-     The `sigaltstack' function specifies an alternate stack for use
+-     during signal handling.  When a signal is received by the process
+-     and its action indicates that the signal stack is used, the system
+-     arranges a switch to the currently installed signal stack while
+-     the handler for that signal is executed.
+-
+-     If OLDSTACK is not a null pointer, information about the currently
+-     installed signal stack is returned in the location it points to.
+-     If STACK is not a null pointer, then this is installed as the new
+-     stack for use by signal handlers.
+-
+-     The return value is `0' on success and `-1' on failure.  If
+-     `sigaltstack' fails, it sets `errno' to one of these values:
+-
+-    `EINVAL'
+-          You tried to disable a stack that was in fact currently in
+-          use.
+-
+-    `ENOMEM'
+-          The size of the alternate stack was too small.  It must be
+-          greater than `MINSIGSTKSZ'.
+-
+-   Here is the older `sigstack' interface.  You should use
+-`sigaltstack' instead on systems that have it.
+-
+- - Data Type: struct sigstack
+-     This structure describes a signal stack.  It contains the
+-     following members:
+-
+-    `void *ss_sp'
+-          This is the stack pointer.  If the stack grows downwards on
+-          your machine, this should point to the top of the area you
+-          allocated.  If the stack grows upwards, it should point to
+-          the bottom.
+-
+-    `int ss_onstack'
+-          This field is true if the process is currently using this
+-          stack.
+-
+- - Function: int sigstack (const struct sigstack *STACK, struct
+-          sigstack *OLDSTACK)
+-     The `sigstack' function specifies an alternate stack for use during
+-     signal handling.  When a signal is received by the process and its
+-     action indicates that the signal stack is used, the system
+-     arranges a switch to the currently installed signal stack while
+-     the handler for that signal is executed.
+-
+-     If OLDSTACK is not a null pointer, information about the currently
+-     installed signal stack is returned in the location it points to.
+-     If STACK is not a null pointer, then this is installed as the new
+-     stack for use by signal handlers.
+-
+-     The return value is `0' on success and `-1' on failure.
+-
+-
+-File: libc.info,  Node: BSD Signal Handling,  Prev: Signal Stack,  Up: Signal Handling
+-
+-BSD Signal Handling
+-===================
+-
+-   This section describes alternative signal handling functions derived
+-from BSD Unix.  These facilities were an advance, in their time; today,
+-they are mostly obsolete, and supported mainly for compatibility with
+-BSD Unix.
+-
+-   There are many similarities between the BSD and POSIX signal handling
+-facilities, because the POSIX facilities were inspired by the BSD
+-facilities.  Besides having different names for all the functions to
+-avoid conflicts, the main differences between the two are:
+-
+-   * BSD Unix represents signal masks as an `int' bit mask, rather than
+-     as a `sigset_t' object.
+-
+-   * The BSD facilities use a different default for whether an
+-     interrupted primitive should fail or resume.  The POSIX facilities
+-     make system calls fail unless you specify that they should resume.
+-     With the BSD facility, the default is to make system calls resume
+-     unless you say they should fail.  *Note Interrupted Primitives::.
+-
+-   The BSD facilities are declared in `signal.h'.
+-
+-* Menu:
+-
+-* BSD Handler::                 BSD Function to Establish a Handler.
+-* Blocking in BSD::             BSD Functions for Blocking Signals.
+-
+-
+-File: libc.info,  Node: BSD Handler,  Next: Blocking in BSD,  Up: BSD Signal Handling
+-
+-BSD Function to Establish a Handler
+------------------------------------
+-
+- - Data Type: struct sigvec
+-     This data type is the BSD equivalent of `struct sigaction' (*note
+-     Advanced Signal Handling::.); it is used to specify signal actions
+-     to the `sigvec' function.  It contains the following members:
+-
+-    `sighandler_t sv_handler'
+-          This is the handler function.
+-
+-    `int sv_mask'
+-          This is the mask of additional signals to be blocked while
+-          the handler function is being called.
+-
+-    `int sv_flags'
+-          This is a bit mask used to specify various flags which affect
+-          the behavior of the signal.  You can also refer to this field
+-          as `sv_onstack'.
+-
+-   These symbolic constants can be used to provide values for the
+-`sv_flags' field of a `sigvec' structure.  This field is a bit mask
+-value, so you bitwise-OR the flags of interest to you together.
+-
+- - Macro: int SV_ONSTACK
+-     If this bit is set in the `sv_flags' field of a `sigvec'
+-     structure, it means to use the signal stack when delivering the
+-     signal.
+-
+- - Macro: int SV_INTERRUPT
+-     If this bit is set in the `sv_flags' field of a `sigvec'
+-     structure, it means that system calls interrupted by this kind of
+-     signal should not be restarted if the handler returns; instead,
+-     the system calls should return with a `EINTR' error status.  *Note
+-     Interrupted Primitives::.
+-
+- - Macro: int SV_RESETHAND
+-     If this bit is set in the `sv_flags' field of a `sigvec'
+-     structure, it means to reset the action for the signal back to
+-     `SIG_DFL' when the signal is received.
+-
+- - Function: int sigvec (int SIGNUM, const struct sigvec *ACTION,struct
+-          sigvec *OLD-ACTION)
+-     This function is the equivalent of `sigaction' (*note Advanced
+-     Signal Handling::.); it installs the action ACTION for the signal
+-     SIGNUM, returning information about the previous action in effect
+-     for that signal in OLD-ACTION.
+-
+- - Function: int siginterrupt (int SIGNUM, int FAILFLAG)
+-     This function specifies which approach to use when certain
+-     primitives are interrupted by handling signal SIGNUM.  If FAILFLAG
+-     is false, signal SIGNUM restarts primitives.  If FAILFLAG is true,
+-     handling SIGNUM causes these primitives to fail with error code
+-     `EINTR'.  *Note Interrupted Primitives::.
+-
+-
+-File: libc.info,  Node: Blocking in BSD,  Prev: BSD Handler,  Up: BSD Signal Handling
+-
+-BSD Functions for Blocking Signals
+-----------------------------------
+-
+- - Macro: int sigmask (int SIGNUM)
+-     This macro returns a signal mask that has the bit for signal SIGNUM
+-     set.  You can bitwise-OR the results of several calls to `sigmask'
+-     together to specify more than one signal.  For example,
+-
+-          (sigmask (SIGTSTP) | sigmask (SIGSTOP)
+-           | sigmask (SIGTTIN) | sigmask (SIGTTOU))
+-
+-     specifies a mask that includes all the job-control stop signals.
+-
+- - Function: int sigblock (int MASK)
+-     This function is equivalent to `sigprocmask' (*note Process Signal
+-     Mask::.) with a HOW argument of `SIG_BLOCK': it adds the signals
+-     specified by MASK to the calling process's set of blocked signals.
+-     The return value is the previous set of blocked signals.
+-
+- - Function: int sigsetmask (int MASK)
+-     This function equivalent to `sigprocmask' (*note Process Signal
+-     Mask::.) with a HOW argument of `SIG_SETMASK': it sets the calling
+-     process's signal mask to MASK.  The return value is the previous
+-     set of blocked signals.
+-
+- - Function: int sigpause (int MASK)
+-     This function is the equivalent of `sigsuspend' (*note Waiting for
+-     a Signal::.):  it sets the calling process's signal mask to MASK,
+-     and waits for a signal to arrive.  On return the previous set of
+-     blocked signals is restored.
+-
+-
+-File: libc.info,  Node: Process Startup,  Next: Processes,  Prev: Signal Handling,  Up: Top
+-
+-Process Startup and Termination
+-*******************************
+-
+-   "Processes" are the primitive units for allocation of system
+-resources.  Each process has its own address space and (usually) one
+-thread of control.  A process executes a program; you can have multiple
+-processes executing the same program, but each process has its own copy
+-of the program within its own address space and executes it
+-independently of the other copies.
+-
+-   This chapter explains what your program should do to handle the
+-startup of a process, to terminate its process, and to receive
+-information (arguments and the environment) from the parent process.
+-
+-* Menu:
+-
+-* Program Arguments::           Parsing your program's command-line arguments.
+-* Environment Variables::       How to access parameters inherited from
+-				 a parent process.
+-* Program Termination::         How to cause a process to terminate and
+-				 return status information to its parent.
+-
+-
+-File: libc.info,  Node: Program Arguments,  Next: Environment Variables,  Up: Process Startup
+-
+-Program Arguments
+-=================
+-
+-   The system starts a C program by calling the function `main'.  It is
+-up to you to write a function named `main'--otherwise, you won't even
+-be able to link your program without errors.
+-
+-   In ISO C you can define `main' either to take no arguments, or to
+-take two arguments that represent the command line arguments to the
+-program, like this:
+-
+-     int main (int ARGC, char *ARGV[])
+-
+-   The command line arguments are the whitespace-separated tokens given
+-in the shell command used to invoke the program; thus, in `cat foo
+-bar', the arguments are `foo' and `bar'.  The only way a program can
+-look at its command line arguments is via the arguments of `main'.  If
+-`main' doesn't take arguments, then you cannot get at the command line.
+-
+-   The value of the ARGC argument is the number of command line
+-arguments.  The ARGV argument is a vector of C strings; its elements
+-are the individual command line argument strings.  The file name of the
+-program being run is also included in the vector as the first element;
+-the value of ARGC counts this element.  A null pointer always follows
+-the last element: `ARGV[ARGC]' is this null pointer.
+-
+-   For the command `cat foo bar', ARGC is 3 and ARGV has three
+-elements, `"cat"', `"foo"' and `"bar"'.
+-
+-   In Unix systems you can define `main' a third way, using three
+-arguments:
+-
+-     int main (int ARGC, char *ARGV[], char *ENVP)
+-
+-   The first two arguments are just the same.  The third argument ENVP
+-gives the process's environment; it is the same as the value of
+-`environ'.  *Note Environment Variables::.  POSIX.1 does not allow this
+-three-argument form, so to be portable it is best to write `main' to
+-take two arguments, and use the value of `environ'.
+-
+-* Menu:
+-
+-* Argument Syntax::             By convention, options start with a hyphen.
+-* Parsing Program Arguments::   Ways to parse program options and arguments.
+-
+-
+-File: libc.info,  Node: Argument Syntax,  Next: Parsing Program Arguments,  Up: Program Arguments
+-
+-Program Argument Syntax Conventions
+------------------------------------
+-
+-   POSIX recommends these conventions for command line arguments.
+-`getopt' (*note Getopt::.) and `argp_parse' (*note Argp::.) make it
+-easy to implement them.
+-
+-   * Arguments are options if they begin with a hyphen delimiter (`-').
+-
+-   * Multiple options may follow a hyphen delimiter in a single token if
+-     the options do not take arguments.  Thus, `-abc' is equivalent to
+-     `-a -b -c'.
+-
+-   * Option names are single alphanumeric characters (as for `isalnum';
+-     *note Classification of Characters::.).
+-
+-   * Certain options require an argument.  For example, the `-o' command
+-     of the `ld' command requires an argument--an output file name.
+-
+-   * An option and its argument may or may not appear as separate
+-     tokens.  (In other words, the whitespace separating them is
+-     optional.)  Thus, `-o foo' and `-ofoo' are equivalent.
+-
+-   * Options typically precede other non-option arguments.
+-
+-     The implementations of `getopt' and `argp_parse' in the GNU C
+-     library normally make it appear as if all the option arguments were
+-     specified before all the non-option arguments for the purposes of
+-     parsing, even if the user of your program intermixed option and
+-     non-option arguments.  They do this by reordering the elements of
+-     the ARGV array.  This behavior is nonstandard; if you want to
+-     suppress it, define the `_POSIX_OPTION_ORDER' environment variable.
+-     *Note Standard Environment::.
+-
+-   * The argument `--' terminates all options; any following arguments
+-     are treated as non-option arguments, even if they begin with a
+-     hyphen.
+-
+-   * A token consisting of a single hyphen character is interpreted as
+-     an ordinary non-option argument.  By convention, it is used to
+-     specify input from or output to the standard input and output
+-     streams.
+-
+-   * Options may be supplied in any order, or appear multiple times.
+-     The interpretation is left up to the particular application
+-     program.
+-
+-   GNU adds "long options" to these conventions.  Long options consist
+-of `--' followed by a name made of alphanumeric characters and dashes.
+-Option names are typically one to three words long, with hyphens to
+-separate words.  Users can abbreviate the option names as long as the
+-abbreviations are unique.
+-
+-   To specify an argument for a long option, write `--NAME=VALUE'.
+-This syntax enables a long option to accept an argument that is itself
+-optional.
+-
+-   Eventually, the GNU system will provide completion for long option
+-names in the shell.
+-
+-
+-File: libc.info,  Node: Parsing Program Arguments,  Prev: Argument Syntax,  Up: Program Arguments
+-
+-Parsing Program Arguments
+--------------------------
+-
+-   If the syntax for the command line arguments to your program is
+-simple enough, you can simply pick the arguments off from ARGV by hand.
+-But unless your program takes a fixed number of arguments, or all of the
+-arguments are interpreted in the same way (as file names, for example),
+-you are usually better off using `getopt' (*note Getopt::.) or
+-`argp_parse' (*note Argp::.) to do the parsing.
+-
+-   `getopt' is more standard (the short-option only version of it is a
+-part of the POSIX standard), but using `argp_parse' is often easier,
+-both for very simple and very complex option structures, because it
+-does more of the dirty work for you.
+-
+-* Menu:
+-
+-* Getopt::                      Parsing program options using `getopt'.
+-* Argp::                        Parsing program options using `argp_parse'.
+-* Suboptions::                  Some programs need more detailed options.
+-* Suboptions Example::          This shows how it could be done for `mount'.
+-
+-
+-File: libc.info,  Node: Getopt,  Next: Argp,  Up: Parsing Program Arguments
+-
+-Parsing program options using `getopt'
+-======================================
+-
+-   The `getopt' and `getopt_long' functions automate some of the chore
+-involved in parsing typical unix command line options.
+-
+-* Menu:
+-
+-* Using Getopt::                Using the `getopt' function.
+-* Example of Getopt::           An example of parsing options with `getopt'.
+-* Getopt Long Options::         GNU suggests utilities accept long-named
+-                                 options; here is one way to do.
+-* Getopt Long Option Example::  An example of using `getopt_long'.
+-
+-
+-File: libc.info,  Node: Using Getopt,  Next: Example of Getopt,  Up: Getopt
+-
+-Using the `getopt' function
+----------------------------
+-
+-   Here are the details about how to call the `getopt' function.  To
+-use this facility, your program must include the header file `unistd.h'.
+-
+- - Variable: int opterr
+-     If the value of this variable is nonzero, then `getopt' prints an
+-     error message to the standard error stream if it encounters an
+-     unknown option character or an option with a missing required
+-     argument.  This is the default behavior.  If you set this variable
+-     to zero, `getopt' does not print any messages, but it still
+-     returns the character `?'  to indicate an error.
+-
+- - Variable: int optopt
+-     When `getopt' encounters an unknown option character or an option
+-     with a missing required argument, it stores that option character
+-     in this variable.  You can use this for providing your own
+-     diagnostic messages.
+-
+- - Variable: int optind
+-     This variable is set by `getopt' to the index of the next element
+-     of the ARGV array to be processed.  Once `getopt' has found all of
+-     the option arguments, you can use this variable to determine where
+-     the remaining non-option arguments begin.  The initial value of
+-     this variable is `1'.
+-
+- - Variable: char * optarg
+-     This variable is set by `getopt' to point at the value of the
+-     option argument, for those options that accept arguments.
+-
+- - Function: int getopt (int ARGC, char **ARGV, const char *OPTIONS)
+-     The `getopt' function gets the next option argument from the
+-     argument list specified by the ARGV and ARGC arguments.  Normally
+-     these values come directly from the arguments received by `main'.
+-
+-     The OPTIONS argument is a string that specifies the option
+-     characters that are valid for this program.  An option character
+-     in this string can be followed by a colon (`:') to indicate that
+-     it takes a required argument.  If an option character is followed
+-     by two colons (`::'), its argument is optional; this is a GNU
+-     extension.
+-
+-     If the OPTIONS argument string begins with a hyphen (`-'), this is
+-     treated specially.  It permits arguments that are not options to be
+-     returned as if they were associated with option character `\0'.
+-
+-     The `getopt' function returns the option character for the next
+-     command line option.  When no more option arguments are available,
+-     it returns `-1'.  There may still be more non-option arguments; you
+-     must compare the external variable `optind' against the ARGC
+-     parameter to check this.
+-
+-     If the option has an argument, `getopt' returns the argument by
+-     storing it in the variable OPTARG.  You don't ordinarily need to
+-     copy the `optarg' string, since it is a pointer into the original
+-     ARGV array, not into a static area that might be overwritten.
+-
+-     If `getopt' finds an option character in ARGV that was not
+-     included in OPTIONS, or a missing option argument, it returns `?'
+-     and sets the external variable `optopt' to the actual option
+-     character.  If the first character of OPTIONS is a colon (`:'),
+-     then `getopt' returns `:' instead of `?' to indicate a missing
+-     option argument.  In addition, if the external variable `opterr'
+-     is nonzero (which is the default), `getopt' prints an error
+-     message.
+-
+-
+-File: libc.info,  Node: Example of Getopt,  Next: Getopt Long Options,  Prev: Using Getopt,  Up: Getopt
+-
+-Example of Parsing Arguments with `getopt'
+-------------------------------------------
+-
+-   Here is an example showing how `getopt' is typically used.  The key
+-points to notice are:
+-
+-   * Normally, `getopt' is called in a loop.  When `getopt' returns
+-     `-1', indicating no more options are present, the loop terminates.
+-
+-   * A `switch' statement is used to dispatch on the return value from
+-     `getopt'.  In typical use, each case just sets a variable that is
+-     used later in the program.
+-
+-   * A second loop is used to process the remaining non-option
+-     arguments.
+-
+-     #include <unistd.h>
+-     #include <stdio.h>
+-     
+-     int
+-     main (int argc, char **argv)
+-     {
+-       int aflag = 0;
+-       int bflag = 0;
+-       char *cvalue = NULL;
+-       int index;
+-       int c;
+-     
+-       opterr = 0;
+-
+-     while ((c = getopt (argc, argv, "abc:")) != -1)
+-         switch (c)
+-           {
+-           case 'a':
+-             aflag = 1;
+-             break;
+-           case 'b':
+-             bflag = 1;
+-             break;
+-           case 'c':
+-             cvalue = optarg;
+-             break;
+-           case '?':
+-             if (isprint (optopt))
+-               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+-             else
+-               fprintf (stderr,
+-                        "Unknown option character `\\x%x'.\n",
+-                        optopt);
+-             return 1;
+-           default:
+-             abort ();
+-           }
+-
+-     printf ("aflag = %d, bflag = %d, cvalue = %s\n",
+-               aflag, bflag, cvalue);
+-     
+-       for (index = optind; index < argc; index++)
+-         printf ("Non-option argument %s\n", argv[index]);
+-       return 0;
+-     }
+-
+-   Here are some examples showing what this program prints with
+-different combinations of arguments:
+-
+-     % testopt
+-     aflag = 0, bflag = 0, cvalue = (null)
+-     
+-     % testopt -a -b
+-     aflag = 1, bflag = 1, cvalue = (null)
+-     
+-     % testopt -ab
+-     aflag = 1, bflag = 1, cvalue = (null)
+-     
+-     % testopt -c foo
+-     aflag = 0, bflag = 0, cvalue = foo
+-     
+-     % testopt -cfoo
+-     aflag = 0, bflag = 0, cvalue = foo
+-     
+-     % testopt arg1
+-     aflag = 0, bflag = 0, cvalue = (null)
+-     Non-option argument arg1
+-     
+-     % testopt -a arg1
+-     aflag = 1, bflag = 0, cvalue = (null)
+-     Non-option argument arg1
+-     
+-     % testopt -c foo arg1
+-     aflag = 0, bflag = 0, cvalue = foo
+-     Non-option argument arg1
+-     
+-     % testopt -a -- -b
+-     aflag = 1, bflag = 0, cvalue = (null)
+-     Non-option argument -b
+-     
+-     % testopt -a -
+-     aflag = 1, bflag = 0, cvalue = (null)
+-     Non-option argument -
+-
+-
+-File: libc.info,  Node: Getopt Long Options,  Next: Getopt Long Option Example,  Prev: Example of Getopt,  Up: Getopt
+-
+-Parsing Long Options with `getopt_long'
+----------------------------------------
+-
+-   To accept GNU-style long options as well as single-character options,
+-use `getopt_long' instead of `getopt'.  This function is declared in
+-`getopt.h', not `unistd.h'.  You should make every program accept long
+-options if it uses any options, for this takes little extra work and
+-helps beginners remember how to use the program.
+-
+- - Data Type: struct option
+-     This structure describes a single long option name for the sake of
+-     `getopt_long'.  The argument LONGOPTS must be an array of these
+-     structures, one for each long option.  Terminate the array with an
+-     element containing all zeros.
+-
+-     The `struct option' structure has these fields:
+-
+-    `const char *name'
+-          This field is the name of the option.  It is a string.
+-
+-    `int has_arg'
+-          This field says whether the option takes an argument.  It is
+-          an integer, and there are three legitimate values:
+-          `no_argument', `required_argument' and `optional_argument'.
+-
+-    `int *flag'
+-    `int val'
+-          These fields control how to report or act on the option when
+-          it occurs.
+-
+-          If `flag' is a null pointer, then the `val' is a value which
+-          identifies this option.  Often these values are chosen to
+-          uniquely identify particular long options.
+-
+-          If `flag' is not a null pointer, it should be the address of
+-          an `int' variable which is the flag for this option.  The
+-          value in `val' is the value to store in the flag to indicate
+-          that the option was seen.
+-
+- - Function: int getopt_long (int ARGC, char **ARGV, const char
+-          *SHORTOPTS, struct option *LONGOPTS, int *INDEXPTR)
+-     Decode options from the vector ARGV (whose length is ARGC).  The
+-     argument SHORTOPTS describes the short options to accept, just as
+-     it does in `getopt'.  The argument LONGOPTS describes the long
+-     options to accept (see above).
+-
+-     When `getopt_long' encounters a short option, it does the same
+-     thing that `getopt' would do: it returns the character code for the
+-     option, and stores the options argument (if it has one) in
+-     `optarg'.
+-
+-     When `getopt_long' encounters a long option, it takes actions based
+-     on the `flag' and `val' fields of the definition of that option.
+-
+-     If `flag' is a null pointer, then `getopt_long' returns the
+-     contents of `val' to indicate which option it found.  You should
+-     arrange distinct values in the `val' field for options with
+-     different meanings, so you can decode these values after
+-     `getopt_long' returns.  If the long option is equivalent to a short
+-     option, you can use the short option's character code in `val'.
+-
+-     If `flag' is not a null pointer, that means this option should just
+-     set a flag in the program.  The flag is a variable of type `int'
+-     that you define.  Put the address of the flag in the `flag' field.
+-     Put in the `val' field the value you would like this option to
+-     store in the flag.  In this case, `getopt_long' returns `0'.
+-
+-     For any long option, `getopt_long' tells you the index in the array
+-     LONGOPTS of the options definition, by storing it into
+-     `*INDEXPTR'.  You can get the name of the option with
+-     `LONGOPTS[*INDEXPTR].name'.  So you can distinguish among long
+-     options either by the values in their `val' fields or by their
+-     indices.  You can also distinguish in this way among long options
+-     that set flags.
+-
+-     When a long option has an argument, `getopt_long' puts the argument
+-     value in the variable `optarg' before returning.  When the option
+-     has no argument, the value in `optarg' is a null pointer.  This is
+-     how you can tell whether an optional argument was supplied.
+-
+-     When `getopt_long' has no more options to handle, it returns `-1',
+-     and leaves in the variable `optind' the index in ARGV of the next
+-     remaining argument.
+-
+-
+-File: libc.info,  Node: Getopt Long Option Example,  Prev: Getopt Long Options,  Up: Getopt
+-
+-Example of Parsing Long Options with `getopt_long'
+---------------------------------------------------
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     #include <getopt.h>
+-     
+-     /* Flag set by `--verbose'. */
+-     static int verbose_flag;
+-     
+-     int
+-     main (argc, argv)
+-          int argc;
+-          char **argv;
+-     {
+-       int c;
+-     
+-       while (1)
+-         {
+-           static struct option long_options[] =
+-             {
+-               /* These options set a flag. */
+-               {"verbose", 0, &verbose_flag, 1},
+-               {"brief", 0, &verbose_flag, 0},
+-               /* These options don't set a flag.
+-                  We distinguish them by their indices. */
+-               {"add", 1, 0, 0},
+-               {"append", 0, 0, 0},
+-               {"delete", 1, 0, 0},
+-               {"create", 0, 0, 0},
+-               {"file", 1, 0, 0},
+-               {0, 0, 0, 0}
+-             };
+-           /* `getopt_long' stores the option index here. */
+-           int option_index = 0;
+-     
+-           c = getopt_long (argc, argv, "abc:d:",
+-                            long_options, &option_index);
+-     
+-           /* Detect the end of the options. */
+-           if (c == -1)
+-             break;
+-     
+-           switch (c)
+-             {
+-             case 0:
+-               /* If this option set a flag, do nothing else now. */
+-               if (long_options[option_index].flag != 0)
+-                 break;
+-               printf ("option %s", long_options[option_index].name);
+-               if (optarg)
+-                 printf (" with arg %s", optarg);
+-               printf ("\n");
+-               break;
+-     
+-             case 'a':
+-               puts ("option -a\n");
+-               break;
+-     
+-             case 'b':
+-               puts ("option -b\n");
+-               break;
+-     
+-             case 'c':
+-               printf ("option -c with value `%s'\n", optarg);
+-               break;
+-     
+-             case 'd':
+-               printf ("option -d with value `%s'\n", optarg);
+-               break;
+-     
+-             case '?':
+-               /* `getopt_long' already printed an error message. */
+-               break;
+-     
+-             default:
+-               abort ();
+-             }
+-         }
+-     
+-       /* Instead of reporting `--verbose'
+-          and `--brief' as they are encountered,
+-          we report the final status resulting from them. */
+-       if (verbose_flag)
+-         puts ("verbose flag is set");
+-     
+-       /* Print any remaining command line arguments (not options). */
+-       if (optind < argc)
+-         {
+-           printf ("non-option ARGV-elements: ");
+-           while (optind < argc)
+-             printf ("%s ", argv[optind++]);
+-           putchar ('\n');
+-         }
+-     
+-       exit (0);
+-     }
+-
+-
+-File: libc.info,  Node: Argp,  Next: Suboptions,  Prev: Getopt,  Up: Parsing Program Arguments
+-
+-Parsing Program Options with Argp
+-=================================
+-
+-   "Argp" is an interface for parsing unix-style argument vectors
+-(*note Program Arguments::.).
+-
+-   Unlike the more common `getopt' interface, it provides many related
+-convenience features in addition to parsing options, such as
+-automatically producing output in response to `--help' and `--version'
+-options (as defined by the GNU coding standards).  Doing these things
+-in argp results in a more consistent look for programs that use it, and
+-makes less likely that implementors will neglect to implement them or
+-keep them up-to-date.
+-
+-   Argp also provides the ability to merge several independently defined
+-option parsers into one, mediating conflicts between them, and making
+-the result appear seamless.  A library can export an argp option parser,
+-which programs can easily use in conjunction with their own option
+-parser.  This results in less work for user programs (indeed, some may
+-use only argument parsers exported by libraries, and have no options of
+-their own), and more consistent option-parsing for the abstractions
+-implemented by the library.
+-
+-   The header file `<argp.h>' should be included to use argp.
+-
+-The `argp_parse' Function
+--------------------------
+-
+-   The main interface to argp is the `argp_parse' function; often, a
+-call to `argp_parse' is the only argument-parsing code needed in `main'
+-(*note Program Arguments::.).
+-
+- - Function: error_t argp_parse (const struct argp *ARGP, int ARGC,
+-          char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)
+-     The `argp_parse' function parses the arguments in ARGV, of length
+-     ARGC, using the argp parser ARGP (*note Argp Parsers::.); a value
+-     of zero is the same as a `struct argp' containing all zeros.
+-     FLAGS is a set of flag bits that modify the parsing behavior
+-     (*note Argp Flags::.).  INPUT is passed through to the argp parser
+-     ARGP, and has meaning defined by it; a typical usage is to pass a
+-     pointer to a structure which can be used for specifying parameters
+-     to the parser and passing back results from it.
+-
+-     Unless the `ARGP_NO_EXIT' or `ARGP_NO_HELP' flags are included in
+-     FLAGS, calling `argp_parse' may result in the program exiting--for
+-     instance when an unknown option is encountered.  *Note Program
+-     Termination::.
+-
+-     The return value is zero for successful parsing, or a unix error
+-     code (*note Error Codes::.) if an error was detected.  Different
+-     argp parsers may return arbitrary error codes, but standard ones
+-     are `ENOMEM' if a memory allocation error occurred, or `EINVAL' if
+-     an unknown option or option argument was encountered.
+-
+-* Menu:
+-
+-* Globals: Argp Global Variables.  Global argp parameters.
+-* Parsers: Argp Parsers.        Defining parsers for use with `argp_parse'.
+-* Flags: Argp Flags.            Flags that modify the behavior of `argp_parse'.
+-* Help: Argp Help.              Printing help messages when not parsing.
+-* Examples: Argp Examples.      Simple examples of programs using argp.
+-* Customization: Argp User Customization.
+-                                Users may control the `--help' output format.
+-
+-
+-File: libc.info,  Node: Argp Global Variables,  Next: Argp Parsers,  Up: Argp
+-
+-Argp Global Variables
+----------------------
+-
+-   These variables make it very easy for every user program to implement
+-the `--version' option and provide a bug-reporting address in the
+-`--help' output (which is implemented by argp regardless).
+-
+- - Variable: const char * argp_program_version
+-     If defined or set by the user program to a non-zero value, then a
+-     `--version' option is added when parsing with `argp_parse' (unless
+-     the `ARGP_NO_HELP' flag is used), which will print this string
+-     followed by a newline and exit (unless the `ARGP_NO_EXIT' flag is
+-     used).
+-
+- - Variable: const char * argp_program_bug_address
+-     If defined or set by the user program to a non-zero value,
+-     `argp_program_bug_address' should point to string that is the
+-     bug-reporting address for the program.  It will be printed at the
+-     end of the standard output for the `--help' option, embedded in a
+-     sentence that says something like `Report bugs to ADDRESS.'.
+-
+- - Variable: argp_program_version_hook
+-     If defined or set by the user program to a non-zero value, then a
+-     `--version' option is added when parsing with `argp_parse' (unless
+-     the `ARGP_NO_HELP' flag is used), which calls this function to
+-     print the version, and then exits with a status of 0 (unless the
+-     `ARGP_NO_EXIT' flag is used).  It should point to a function with
+-     the following type signature:
+-
+-          void PRINT-VERSION (FILE *STREAM, struct argp_state *STATE)
+-
+-     *Note Argp Parsing State::, for an explanation of STATE.
+-
+-     This variable takes precedent over `argp_program_version', and is
+-     useful if a program has version information that cannot be easily
+-     specified as a simple string.
+-
+- - Variable: error_t argp_err_exit_status
+-     The exit status that argp will use when exiting due to a parsing
+-     error.  If not defined or set by the user program, this defaults to
+-     `EX_USAGE' from `<sysexits.h>'.
+-
+-
+-File: libc.info,  Node: Argp Parsers,  Next: Argp Flags,  Prev: Argp Global Variables,  Up: Argp
+-
+-Specifying Argp Parsers
+------------------------
+-
+-   The first argument to the `argp_parse' function is a pointer to a
+-`struct argp', which known as an "argp parser":
+-
+- - Data Type: struct argp
+-     This structure specifies how to parse a given set of options and
+-     arguments, perhaps in conjunction with other argp parsers.  It has
+-     the following fields:
+-
+-    `const struct argp_option *options'
+-          A pointer to a vector of `argp_option' structures specifying
+-          which options this argp parser understands; it may be zero if
+-          there are no options at all.  *Note Argp Option Vectors::.
+-
+-    `argp_parser_t parser'
+-          A pointer to a function that defines actions for this parser;
+-          it is called for each option parsed, and at other
+-          well-defined points in the parsing process.  A value of zero
+-          is the same as a pointer to a function that always returns
+-          `ARGP_ERR_UNKNOWN'.  *Note Argp Parser Functions::.
+-
+-    `const char *args_doc'
+-          If non-zero, a string describing what non-option arguments
+-          are wanted by this parser; it is only used to print the
+-          `Usage:' message.  If it contains newlines, the strings
+-          separated by them are considered alternative usage patterns,
+-          and printed on separate lines (lines after the first are
+-          prefix by ` or: ' instead of `Usage:').
+-
+-    `const char *doc'
+-          If non-zero, a string containing extra text to be printed
+-          before and after the options in a long help message, with the
+-          two sections separated by a vertical tab (`'\v'', `'\013'')
+-          character.  By convention, the documentation before the
+-          options is just a short string saying what the program does,
+-          and that afterwards is longer, describing the behavior in
+-          more detail.
+-
+-    `const struct argp_child *children'
+-          A pointer to a vector of `argp_children' structures specifying
+-          additional argp parsers that should be combined with this one.
+-          *Note Argp Children::.
+-
+-    `char *(*help_filter)(int KEY, const char *TEXT, void *INPUT)'
+-          If non-zero, a pointer to a function to filter the output of
+-          help messages.  *Note Argp Help Filtering::.
+-
+-   The `options', `parser', `args_doc', and `doc' fields are usually
+-all that are needed.  If an argp parser is defined as an initialized C
+-variable, only the used fields need be specified in the
+-initializer--the rest will default to zero due to the way C structure
+-initialization works (this fact is exploited for most argp structures,
+-grouping the most-used fields near the beginning, so that unused fields
+-can simply be left unspecified).
+-
+-* Menu:
+-
+-* Options: Argp Option Vectors.   Specifying options in an argp parser.
+-* Argp Parser Functions::         Defining actions for an argp parser.
+-* Children: Argp Children.        Combining multiple argp parsers.
+-* Help Filtering: Argp Help Filtering.  Customizing help output for an argp parser.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-35 glibc-2.1.3/manual/libc.info-35
+--- ../glibc-2.1.3/manual/libc.info-35	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-35	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1239 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Argp Option Vectors,  Next: Argp Parser Functions,  Prev: Argp Parsers,  Up: Argp Parsers
+-
+-Specifying Options in an Argp Parser
+-------------------------------------
+-
+-   The `options' field in a `struct argp' points to a vector of `struct
+-argp_option' structures, each of which specifies an option that argp
+-parser supports (actually, sometimes multiple entries may used for a
+-single option if it has many names).  It should be terminated by an
+-entry with zero in all fields (note that when using an initialized C
+-array for options, writing `{ 0 }' is enough to achieve this).
+-
+- - Data Type: struct argp_option
+-     This structure specifies a single option that an argp parser
+-     understands, and how to parse and document it.  It has the
+-     following fields:
+-
+-    `const char *name'
+-          The long name for this option, corresponding to the long
+-          option `--NAME'; this field can be zero if this option only
+-          has a short name.  To specify multiple names for an option,
+-          additional entries may follow this one, with the
+-          `OPTION_ALIAS' flag set (*note Argp Option Flags::.).
+-
+-    `int key'
+-          The integer key that is provided to the argp parser's parsing
+-          function when this option is being parsed.  Also, if KEY has
+-          a value that is a printable ASCII character (i.e., `isascii
+-          (KEY)' is true), it *also* specifies a short option `-CHAR',
+-          where CHAR is the ASCII character with the code KEY.
+-
+-    `const char *arg'
+-          If non-zero, this is the name of an argument associated with
+-          this option, which must be provided (e.g., with the
+-          `--NAME=VALUE' or `-CHAR VALUE' syntaxes) unless the
+-          `OPTION_ARG_OPTIONAL' flag (*note Argp Option Flags::.) is
+-          set, in which case it *may* be provided.
+-
+-    `int flags'
+-          Flags associated with this option (some of which are referred
+-          to above).  *Note Argp Option Flags::.
+-
+-    `const char *doc'
+-          A documentation string for this option, for printing in help
+-          messages.
+-
+-          If both the `name' and `key' fields are zero, this string
+-          will be printed out-dented from the normal option column,
+-          making it useful as a group header (it will be the first
+-          thing printed in its group); in this usage, it's conventional
+-          to end the string with a `:' character.
+-
+-    `int group'
+-          The group this option is in.
+-
+-          In a long help message, options are sorted alphabetically
+-          within each group, and the groups presented in the order 0,
+-          1, 2, ..., N, -M, ..., -2, -1.  Every entry in an options
+-          array with this field 0 will inherit the group number of the
+-          previous entry, or zero if it's the first one, unless its a
+-          group header (`name' and `key' fields both zero), in which
+-          case, the previous entry + 1 is the default.  Automagic
+-          options such as `--help' are put into group -1.
+-
+-          Note that because of C structure initialization rules, this
+-          field often need not be specified, because 0 is the right
+-          value.
+-
+-* Menu:
+-
+-* Flags: Argp Option Flags.     Flags for options.
+-
+-
+-File: libc.info,  Node: Argp Option Flags,  Up: Argp Option Vectors
+-
+-Flags for Argp Options
+-......................
+-
+-   The following flags may be or'd together in the `flags' field of a
+-`struct argp_option', and control various aspects of how that option is
+-parsed or displayed in help messages:
+-
+-`OPTION_ARG_OPTIONAL'
+-     The argument associated with this option is optional.
+-
+-`OPTION_HIDDEN'
+-     This option isn't displayed in any help messages.
+-
+-`OPTION_ALIAS'
+-     This option is an alias for the closest previous non-alias option.
+-     This means that it will be displayed in the same help entry, and
+-     will inherit fields other than `name' and `key' from the aliased
+-     option.
+-
+-`OPTION_DOC'
+-     This option isn't actually an option (and so should be ignored by
+-     the actual option parser), but rather an arbitrary piece of
+-     documentation that should be displayed in much the same manner as
+-     the options (known as a "documentation option").
+-
+-     If this flag is set, then the option `name' field is displayed
+-     unmodified (e.g., no `--' prefix is added) at the left-margin
+-     (where a *short* option would normally be displayed), and the
+-     documentation string in the normal place.  For purposes of
+-     sorting, any leading whitespace and punctuation is ignored, except
+-     that if the first non-whitespace character is not `-', this entry
+-     is displayed after all options (and `OPTION_DOC' entries with a
+-     leading `-') in the same group.
+-
+-`OPTION_NO_USAGE'
+-     This option shouldn't be included in `long' usage messages (but is
+-     still included in help messages).  This is mainly intended for
+-     options that are completely documented in an argp's `args_doc'
+-     field (*note Argp Parsers::.), in which case including the option
+-     in the generic usage list would be redundant.
+-
+-     For instance, if `args_doc' is `"FOO BAR\n-x BLAH"', and the `-x'
+-     option's purpose is to distinguish these two cases, `-x' should
+-     probably be marked `OPTION_NO_USAGE'.
+-
+-
+-File: libc.info,  Node: Argp Parser Functions,  Next: Argp Children,  Prev: Argp Option Vectors,  Up: Argp Parsers
+-
+-Argp Parser Functions
+----------------------
+-
+-   The function pointed to by the `parser' field in a `struct argp'
+-(*note Argp Parsers::.) defines what actions take place in response to
+-each option or argument that is parsed, and is also used as a hook, to
+-allow a parser to do something at certain other points during parsing.
+-
+-   Argp parser functions have the following type signature:
+-
+-     error_t PARSER (int KEY, char *ARG, struct argp_state *STATE)
+-
+-where the arguments are as follows:
+-
+-KEY
+-     For each option that is parsed, PARSER is called with a value of
+-     KEY from that option's `key' field in the option vector (*note
+-     Argp Option Vectors::.).  PARSER is also called at other times
+-     with special reserved keys, such as `ARGP_KEY_ARG' for non-option
+-     arguments.  *Note Argp Special Keys::.
+-
+-ARG
+-     If KEY is an option, ARG is the value given for it, or zero if no
+-     value was specified.  Only options that have a non-zero `arg'
+-     field can ever have a value, and those must *always* have a value,
+-     unless the `OPTION_ARG_OPTIONAL' flag was specified (if the input
+-     being parsed specifies a value for an option that doesn't allow
+-     one, an error results before PARSER ever gets called).
+-
+-     If KEY is `ARGP_KEY_ARG', ARG is a non-option argument; other
+-     special keys always have a zero ARG.
+-
+-STATE
+-     STATE points to a `struct argp_state', containing useful
+-     information about the current parsing state for use by PARSER.
+-     *Note Argp Parsing State::.
+-
+-   When PARSER is called, it should perform whatever action is
+-appropriate for KEY, and return either `0' for success,
+-`ARGP_ERR_UNKNOWN', if the value of KEY is not handled by this parser
+-function, or a unix error code if a real error occurred (*note Error
+-Codes::.).
+-
+- - Macro: int ARGP_ERR_UNKNOWN
+-     Argp parser functions should return `ARGP_ERR_UNKNOWN' for any KEY
+-     value they do not recognize, or for non-option arguments (`KEY ==
+-     ARGP_KEY_ARG') that they do not which to handle.
+-
+-   A typical parser function uses a switch statement on KEY:
+-
+-     error_t
+-     parse_opt (int key, char *arg, struct argp_state *state)
+-     {
+-       switch (key)
+-         {
+-         case OPTION_KEY:
+-           ACTION
+-           break;
+-         ...
+-         default:
+-           return ARGP_ERR_UNKNOWN;
+-         }
+-       return 0;
+-     }
+-
+-* Menu:
+-
+-* Keys: Argp Special Keys.           Special values for the KEY argument.
+-* State: Argp Parsing State.         What the STATE argument refers to.
+-* Functions: Argp Helper Functions.  Functions to help during argp parsing.
+-
+-
+-File: libc.info,  Node: Argp Special Keys,  Next: Argp Parsing State,  Up: Argp Parser Functions
+-
+-Special Keys for Argp Parser Functions
+-......................................
+-
+-   In addition to key values corresponding to user options, the KEY
+-argument to argp parser functions may have a number of other special
+-values (ARG and STATE refer to parser function arguments; *note Argp
+-Parser Functions::.):
+-
+-`ARGP_KEY_ARG'
+-     This is not an option at all, but rather a command line argument,
+-     whose value is pointed to by ARG.
+-
+-     When there are multiple parser functions (due to argp parsers being
+-     combined), it's impossible to know which one wants to handle an
+-     argument, so each is called in turn, until one returns 0 or an
+-     error other than `ARGP_ERR_UNKNOWN'; if an argument is handled by
+-     no one, `argp_parse' immediately returns success, without parsing
+-     any more arguments.
+-
+-     Once a parser function returns success for this key, that fact is
+-     recorded, and the `ARGP_KEY_NO_ARGS' case won't be used.
+-     *However*, if while processing the argument, a parser function
+-     decrements the `next' field of its STATE argument, the option
+-     won't be considered processed; this is to allow you to actually
+-     modify the argument (perhaps into an option), and have it
+-     processed again.
+-
+-`ARGP_KEY_ARGS'
+-     If a parser function returns `ARGP_ERR_UNKNOWN' for
+-     `ARGP_KEY_ARG', it is immediately called again with the key
+-     `ARGP_KEY_ARGS', which has a similar meaning, but is slightly more
+-     convenient for consuming all remaining arguments.  ARG is 0, and
+-     the tail of the argument vector may be found at `STATE->argv +
+-     STATE->next'.  If success is returned for this key, and
+-     `STATE->next' is unchanged, then all remaining arguments are
+-     considered to have been consumed, otherwise, the amount by which
+-     `STATE->next' has been adjust indicates how many were used.  For
+-     instance, here's an example that uses both, for different args:
+-
+-          ...
+-          case ARGP_KEY_ARG:
+-            if (STATE->arg_num == 0)
+-              /* First argument */
+-              first_arg = ARG;
+-            else
+-              /* Let the next case parse it.  */
+-              return ARGP_KEY_UNKNOWN;
+-            break;
+-          case ARGP_KEY_ARGS:
+-            remaining_args = STATE->argv + STATE->next;
+-            num_remaining_args = STATE->argc - STATE->next;
+-            break;
+-
+-`ARGP_KEY_END'
+-     There are no more command line arguments at all.
+-
+-`ARGP_KEY_NO_ARGS'
+-     Because it's common to want to do some special processing if there
+-     aren't any non-option args, parser functions are called with this
+-     key if they didn't successfully process any non-option arguments.
+-     Called just before `ARGP_KEY_END' (where more general validity
+-     checks on previously parsed arguments can take place).
+-
+-`ARGP_KEY_INIT'
+-     Passed in before any parsing is done.  Afterwards, the values of
+-     each element of the `child_input' field of STATE, if any, are
+-     copied to each child's state to be the initial value of the `input'
+-     when *their* parsers are called.
+-
+-`ARGP_KEY_SUCCESS'
+-     Passed in when parsing has successfully been completed (even if
+-     there are still arguments remaining).
+-
+-`ARGP_KEY_ERROR'
+-     Passed in if an error has occurred, and parsing terminated (in
+-     which case a call with a key of `ARGP_KEY_SUCCESS' is never made).
+-
+-`ARGP_KEY_FINI'
+-     The final key ever seen by any parser (even after
+-     `ARGP_KEY_SUCCESS' and `ARGP_KEY_ERROR').  Any resources allocated
+-     by `ARGP_KEY_INIT' may be freed here (although sometimes certain
+-     resources allocated there are to be returned to the caller after a
+-     successful parse; in that case, those particular resources can be
+-     freed in the `ARGP_KEY_ERROR' case).
+-
+-   In all cases, `ARGP_KEY_INIT' is the first key seen by parser
+-functions, and `ARGP_KEY_FINI' the last (unless an error was returned
+-by the parser for `ARGP_KEY_INIT').  Other keys can occur in one the
+-following orders (OPT refers to an arbitrary option key):
+-
+-OPT... `ARGP_KEY_NO_ARGS' `ARGP_KEY_END' `ARGP_KEY_SUCCESS'
+-     The arguments being parsed contained no non-option arguments at
+-     all.
+-
+-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_END' `ARGP_KEY_SUCCESS'
+-     All non-option arguments were successfully handled by a parser
+-     function (there may be multiple parser functions if multiple argp
+-     parsers were combined).
+-
+-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_SUCCESS'
+-     Some non-option argument was unrecognized.
+-
+-     This occurs when every parser function returns `ARGP_KEY_UNKNOWN'
+-     for an argument, in which case parsing stops at that argument.  If
+-     a non-zero value for ARG_INDEX was passed to `argp_parse', the
+-     index of this argument is returned in it, otherwise an error
+-     occurs.
+-
+-   If an error occurs (either detected by argp, or because a parser
+-function returned an error value), then each parser is called with
+-`ARGP_KEY_ERROR', and no further calls are made except the final call
+-with `ARGP_KEY_FINI'.
+-
+-
+-File: libc.info,  Node: Argp Helper Functions,  Prev: Argp Parsing State,  Up: Argp Parser Functions
+-
+-Functions For Use in Argp Parsers
+-.................................
+-
+-   Argp provides a number of functions for the user of argp parser
+-functions (*note Argp Parser Functions::.), mostly for producing error
+-messages.  These take as their first argument the STATE argument to the
+-parser function (*note Argp Parsing State::.).
+-
+- - Function: void argp_usage (const struct argp_state *STATE)
+-     Output the standard usage message for the argp parser referred to
+-     by STATE to `STATE->err_stream' and terminate the program with
+-     `exit (argp_err_exit_status)' (*note Argp Global Variables::.).
+-
+- - Function: void argp_error (const struct argp_state *STATE, const
+-          char *FMT, ...)
+-     Print the printf format string FMT and following args, preceded by
+-     the program name and `:', and followed by a `Try ... --help'
+-     message, and terminate the program with an exit status of
+-     `argp_err_exit_status' (*note Argp Global Variables::.).
+-
+- - Function: void argp_failure (const struct argp_state *STATE, int
+-          STATUS, int ERRNUM, const char *FMT, ...)
+-     Similarly to the standard gnu error-reporting function `error',
+-     print the printf format string FMT and following args, preceded by
+-     the program name and `:', and followed by the standard unix error
+-     text for ERRNUM if it is non-zero; then if STATUS is non-zero,
+-     terminate the program with that as its exit status.
+-
+-     The difference between this function and `argp_error' is that
+-     `argp_error' is for *parsing errors*, whereas `argp_failure' is
+-     for other problems that occur during parsing but don't reflect a
+-     syntactic problem with the input--such as illegal values for
+-     options, bad phase of the moon, etc.
+-
+- - Function: void argp_state_help (const struct argp_state *STATE, FILE
+-          *STREAM, unsigned FLAGS)
+-     Output a help message for the argp parser referred to by STATE to
+-     STREAM.  The FLAGS argument determines what sort of help message
+-     is produced.  *Note Argp Help Flags::.
+-
+-   Error output is sent to `STATE->err_stream', and the program name
+-printed is `STATE->name'.
+-
+-   The output or program termination behavior of these functions may be
+-suppressed if the `ARGP_NO_EXIT' or `ARGP_NO_ERRS' flags, respectively,
+-were passed to `argp_parse'.  *Note Argp Flags::.
+-
+-   This behavior is useful if an argp parser is exported for use by
+-other programs (e.g., by a library), and may be used in a context where
+-it is not desirable to terminate the program in response to parsing
+-errors.  In argp parsers intended for such general use, calls to any of
+-these functions should be followed by code return of an appropriate
+-error code for the case where the program *doesn't* terminate; for
+-example:
+-
+-     if (BAD ARGUMENT SYNTAX)
+-       {
+-          argp_usage (STATE);
+-          return EINVAL;
+-       }
+-
+-If it's known that a parser function will only be used when
+-`ARGP_NO_EXIT' is not set, the return may be omitted.
+-
+-
+-File: libc.info,  Node: Argp Parsing State,  Next: Argp Helper Functions,  Prev: Argp Special Keys,  Up: Argp Parser Functions
+-
+-Argp Parsing State
+-..................
+-
+-   The third argument to argp parser functions (*note Argp Parser
+-Functions::.) is a pointer to a `struct argp_state', which contains
+-information about the state of the option parsing.
+-
+- - Data Type: struct argp_state
+-     This structure has the following fields, which may be modified as
+-     noted:
+-
+-    `const struct argp *const root_argp'
+-          The top level argp parser being parsed.  Note that this is
+-          often *not* the same `struct argp' passed into `argp_parse' by
+-          the invoking program (*note Argp::.), but instead an internal
+-          argp parser that contains options implemented by `argp_parse'
+-          itself (such as `--help').
+-
+-    `int argc'
+-    `char **argv'
+-          The argument vector being parsed.  May be modified.
+-
+-    `int next'
+-          The index in `argv' of the next argument to be parsed.  May
+-          be modified.
+-
+-          One way to consume all remaining arguments in the input is to
+-          set `STATE->next = STATE->argc' (perhaps after recording the
+-          value of the `next' field to find the consumed arguments).
+-          Also, you can cause the current option to be re-parsed by
+-          decrementing this field, and then modifying
+-          `STATE->argv[STATE->next]' to be the option that should be
+-          reexamined.
+-
+-    `unsigned flags'
+-          The flags supplied to `argp_parse'.  May be modified,
+-          although some flags may only take effect when `argp_parse' is
+-          first invoked.  *Note Argp Flags::.
+-
+-    `unsigned arg_num'
+-          While calling a parsing function with the KEY argument
+-          `ARGP_KEY_ARG', this is the number of the current arg,
+-          starting at 0, and incremented after each such call returns.
+-          At all other times, this is the number of such arguments that
+-          have been processed.
+-
+-    `int quoted'
+-          If non-zero, the index in `argv' of the first argument
+-          following a special `--' argument (which prevents anything
+-          following being interpreted as an option).  Only set once
+-          argument parsing has proceeded past this point.
+-
+-    `void *input'
+-          An arbitrary pointer passed in from the caller of
+-          `argp_parse', in the INPUT argument.
+-
+-    `void **child_inputs'
+-          Values to pass to child parsers.  This vector will be the
+-          same length as the number of children in the current parser,
+-          and each child parser will be given the value of
+-          `STATE->child_inputs[I]' as *its* `STATE->input' field, where
+-          I is the index of the child in the this parser's `children'
+-          field.  *Note Argp Children::.
+-
+-    `void *hook'
+-          For the parser function's use.  Initialized to 0, but
+-          otherwise ignored by argp.
+-
+-    `char *name'
+-          The name used when printing messages.  This is initialized to
+-          `argv[0]', or `program_invocation_name' if that is
+-          unavailable.
+-
+-    `FILE *err_stream'
+-    `FILE *out_stream'
+-          Stdio streams used when argp prints something; error messages
+-          are printed to `err_stream', and all other output (such as
+-          `--help' output) to `out_stream'.  These are initialized to
+-          `stderr' and `stdout' respectively (*note Standard
+-          Streams::.).
+-
+-    `void *pstate'
+-          Private, for use by the argp implementation.
+-
+-
+-File: libc.info,  Node: Argp Children,  Next: Argp Help Filtering,  Prev: Argp Parser Functions,  Up: Argp Parsers
+-
+-Combining Multiple Argp Parsers
+--------------------------------
+-
+-   The `children' field in a `struct argp' allows other argp parsers to
+-be combined with the referencing one to parse a single set of
+-arguments.  It should point to a vector of `struct argp_child',
+-terminated by an entry having a value of zero in the `argp' field.
+-
+-   Where conflicts between combined parsers arise (for instance, if two
+-specify an option with the same name), they are resolved in favor of
+-the parent argp parsers, or earlier argp parsers in the list of
+-children.
+-
+- - Data Type: struct argp_child
+-     An entry in the list of subsidiary argp parsers pointed to by the
+-     `children' field in a `struct argp'.  The fields are as follows:
+-
+-    `const struct argp *argp'
+-          The child argp parser, or zero to end the list.
+-
+-    `int flags'
+-          Flags for this child.
+-
+-    `const char *header'
+-          If non-zero, an optional header to be printed in help output
+-          before the child options.  As a side-effect, a non-zero value
+-          forces the child options to be grouped together; to achieve
+-          this effect without actually printing a header string, use a
+-          value of `""'.  As with header strings specified in an option
+-          entry, the value conventionally has `:' as the last
+-          character.  *Note Argp Option Vectors::.
+-
+-    `int group'
+-          Where to group the child options relative to the other
+-          (`consolidated') options in the parent argp parser.  The
+-          values are the same as the `group' field in `struct
+-          argp_option' (*note Argp Option Vectors::.), but all
+-          child-groupings follow parent options at a particular group
+-          level.  If both this field and `header' are zero, then the
+-          child's options aren't grouped together at all, but rather
+-          merged with the parent options (merging the child's grouping
+-          levels with the parents).
+-
+-
+-File: libc.info,  Node: Argp Flags,  Next: Argp Help,  Prev: Argp Parsers,  Up: Argp
+-
+-Flags for `argp_parse'
+-----------------------
+-
+-   The default behavior of `argp_parse' is designed to be convenient
+-for the most common case of parsing program command line argument.  To
+-modify these defaults, the following flags may be or'd together in the
+-FLAGS argument to `argp_parse':
+-
+-`ARGP_PARSE_ARGV0'
+-     Don't ignore the first element of the ARGV argument to
+-     `argp_parse'.  Normally (and always unless `ARGP_NO_ERRS' is set)
+-     the first element of the argument vector is skipped for option
+-     parsing purposes, as it corresponds to the program name in a
+-     command line.
+-
+-`ARGP_NO_ERRS'
+-     Don't print error messages for unknown options to `stderr'; unless
+-     this flag is set, `ARGP_PARSE_ARGV0' is ignored, as `argv[0]' is
+-     used as the program name in the error messages.  This flag implies
+-     `ARGP_NO_EXIT' (on the assumption that silent exiting upon errors
+-     is bad behaviour).
+-
+-`ARGP_NO_ARGS'
+-     Don't parse any non-option args.  Normally non-option args are
+-     parsed by calling the parse functions with a key of
+-     `ARGP_KEY_ARG', and the actual arg as the value.  This flag
+-     needn't normally be set, as the normal behavior is to stop parsing
+-     as soon as some argument isn't accepted by a parsing function.
+-     *Note Argp Parser Functions::.
+-
+-`ARGP_IN_ORDER'
+-     Parse options and arguments in the same order they occur on the
+-     command line--normally they're rearranged so that all options come
+-     first
+-
+-`ARGP_NO_HELP'
+-     Don't provide the standard long option `--help', which ordinarily
+-     causes usage and option help information to be output to `stdout',
+-     and `exit (0)' called.
+-
+-`ARGP_NO_EXIT'
+-     Don't exit on errors (they may still result in error messages).
+-
+-`ARGP_LONG_ONLY'
+-     Use the gnu getopt `long-only' rules for parsing arguments.  This
+-     allows long-options to be recognized with only a single `-' (for
+-     instances, `-help'), but results in a generally somewhat less
+-     useful interface, that conflicts with the way most GNU programs
+-     work.  For this reason, its use is discouraged.
+-
+-`ARGP_SILENT'
+-     Turns off any message-printing/exiting options, specifically
+-     `ARGP_NO_EXIT', `ARGP_NO_ERRS', and `ARGP_NO_HELP'.
+-
+-
+-File: libc.info,  Node: Argp Help Filtering,  Prev: Argp Children,  Up: Argp Parsers
+-
+-Customizing Argp Help Output
+-----------------------------
+-
+-   The `help_filter' field in a `struct argp' is a pointer to a
+-function to filter the text of help messages before displaying them.
+-They have a function signature like:
+-
+-     char *HELP-FILTER (int KEY, const char *TEXT, void *INPUT)
+-
+-where KEY is either a key from an option, in which case TEXT is that
+-option's help text (*note Argp Option Vectors::.), or one of the
+-special keys with names beginning with `ARGP_KEY_HELP_', describing
+-which other help text TEXT is (*note Argp Help Filter Keys::.).
+-
+-   The function should return either TEXT, if it should be used as-is,
+-a replacement string, which should be allocated using `malloc', and
+-will be freed by argp, or zero, meaning `print nothing'.  The value of
+-TEXT supplied is *after* any translation has been done, so if any of
+-the replacement text also needs translation, that should be done by the
+-filter function.  INPUT is either the input supplied to `argp_parse',
+-or zero, if `argp_help' was called directly by the user.
+-
+-* Menu:
+-
+-* Keys: Argp Help Filter Keys.  Special KEY values for help filter functions.
+-
+-
+-File: libc.info,  Node: Argp Help Filter Keys,  Up: Argp Help Filtering
+-
+-Special Keys for Argp Help Filter Functions
+-...........................................
+-
+-   The following special values may be passed to an argp help filter
+-function as the first argument, in addition to key values for user
+-options, and specify which help text the TEXT argument contains:
+-
+-`ARGP_KEY_HELP_PRE_DOC'
+-     Help text preceding options.
+-
+-`ARGP_KEY_HELP_POST_DOC'
+-     Help text following options.
+-
+-`ARGP_KEY_HELP_HEADER'
+-     Option header string.
+-
+-`ARGP_KEY_HELP_EXTRA'
+-     After all other documentation; TEXT is zero for this key.
+-
+-`ARGP_KEY_HELP_DUP_ARGS_NOTE'
+-     The explanatory note emitted when duplicate option arguments have
+-     been suppressed.
+-
+-`ARGP_KEY_HELP_ARGS_DOC'
+-     The argument doc string (the `args_doc' field from the argp parser;
+-     *note Argp Parsers::.).
+-
+-
+-File: libc.info,  Node: Argp Help,  Next: Argp Examples,  Prev: Argp Flags,  Up: Argp
+-
+-The `argp_help' Function
+-------------------------
+-
+-   Normally programs using argp need not worry too much about printing
+-argument-usage-type help messages, because the standard `--help' option
+-is handled automatically by argp, and the typical error cases can be
+-handled using `argp_usage' and `argp_error' (*note Argp Helper
+-Functions::.).
+-
+-   However, if it's desirable to print a standard help message in some
+-context other than parsing the program options, argp offers the
+-`argp_help' interface.
+-
+- - Function: void argp_help (const struct argp *ARGP, FILE *STREAM,
+-          unsigned FLAGS, char *NAME)
+-     Output a help message for the argp parser ARGP to STREAM.  What
+-     sort of messages is printed is determined by FLAGS.
+-
+-     Any options such as `--help' that are implemented automatically by
+-     argp itself will *not* be present in the help output; for this
+-     reason, it is better to use `argp_state_help' if calling from
+-     within an argp parser function.  *Note Argp Helper Functions::.
+-
+-* Menu:
+-
+-* Flags: Argp Help Flags.       Specifying what sort of help message to print.
+-
+-
+-File: libc.info,  Node: Argp Help Flags,  Up: Argp Help
+-
+-Flags for the `argp_help' Function
+-----------------------------------
+-
+-   When calling `argp_help' (*note Argp Help::.), or `argp_state_help'
+-(*note Argp Helper Functions::.), exactly what is output is determined
+-by the FLAGS argument, which should consist of any of the following
+-flags, or'd together:
+-
+-`ARGP_HELP_USAGE'
+-     A unix `Usage:' message that explicitly lists all options.
+-
+-`ARGP_HELP_SHORT_USAGE'
+-     A unix `Usage:' message that displays only an appropriate
+-     placeholder to indicate where the options go; useful for showing
+-     the non-option argument syntax.
+-
+-`ARGP_HELP_SEE'
+-     A `Try ... for more help' message; `...' contains the program name
+-     and `--help'.
+-
+-`ARGP_HELP_LONG'
+-     A verbose option help message that gives each option understood
+-     along with its documentation string.
+-
+-`ARGP_HELP_PRE_DOC'
+-     The part of the argp parser doc string that precedes the verbose
+-     option help.
+-
+-`ARGP_HELP_POST_DOC'
+-     The part of the argp parser doc string that follows the verbose
+-     option help.
+-
+-`ARGP_HELP_DOC'
+-     `(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)'
+-
+-`ARGP_HELP_BUG_ADDR'
+-     A message saying where to report bugs for this program, if the
+-     `argp_program_bug_address' variable contains one.
+-
+-`ARGP_HELP_LONG_ONLY'
+-     Modify any output appropriately to reflect `ARGP_LONG_ONLY' mode.
+-
+-   The following flags are only understood when used with
+-`argp_state_help', and control whether the function returns after
+-printing its output, or terminates the program:
+-
+-`ARGP_HELP_EXIT_ERR'
+-     Terminate the program with `exit (argp_err_exit_status)'.
+-
+-`ARGP_HELP_EXIT_OK'
+-     Terminate the program with `exit (0)'.
+-
+-   The following flags are combinations of the basic ones for printing
+-standard messages:
+-
+-`ARGP_HELP_STD_ERR'
+-     Assuming an error message for a parsing error has already printed,
+-     prints a note on how to get help, and terminates the program with
+-     an error.
+-
+-`ARGP_HELP_STD_USAGE'
+-     Prints a standard usage message and terminates the program with an
+-     error.  This is used when no more specific error message is
+-     appropriate.
+-
+-`ARGP_HELP_STD_HELP'
+-     Prints the standard response for a `--help' option, and terminates
+-     the program successfully.
+-
+-
+-File: libc.info,  Node: Argp Examples,  Next: Argp User Customization,  Prev: Argp Help,  Up: Argp
+-
+-Argp Examples
+--------------
+-
+-   These example programs demonstrate the basic usage of argp.
+-
+-* Menu:
+-
+-* 1: Argp Example 1.            A minimal program using argp.
+-* 2: Argp Example 2.            A program using only default options.
+-* 3: Argp Example 3.            A simple program with user options.
+-* 4: Argp Example 4.            Combining multiple argp parsers.
+-
+-
+-File: libc.info,  Node: Argp Example 1,  Next: Argp Example 2,  Up: Argp Examples
+-
+-A Minimal Program Using Argp
+-............................
+-
+-   This is (probably) the smallest possible program that uses argp.  It
+-won't do much except give an error messages and exit when there are any
+-arguments, and print a (rather pointless) message for `--help'.
+-
+-     /* Argp example #1 - a minimal program using argp */
+-     
+-     /* This is (probably) the smallest possible program that
+-        uses argp.  It won't do much except give an error
+-        messages and exit when there are any arguments, and print
+-        a (rather pointless) messages for -help. */
+-     
+-     #include <argp.h>
+-     
+-     int main (int argc, char **argv)
+-     {
+-       argp_parse (0, argc, argv, 0, 0, 0);
+-       exit (0);
+-     }
+-
+-
+-File: libc.info,  Node: Argp Example 2,  Next: Argp Example 3,  Prev: Argp Example 1,  Up: Argp Examples
+-
+-A Program Using Argp with Only Default Options
+-..............................................
+-
+-   This program doesn't use any options or arguments, but uses argp to
+-be compliant with the GNU standard command line format.
+-
+-   In addition to making sure no arguments are given, and implementing a
+-`--help' option, this example will have a `--version' option, and will
+-put the given documentation string and bug address in the `--help'
+-output, as per GNU standards.
+-
+-   The variable `argp' contains the argument parser specification;
+-adding fields to this structure is the way most parameters are passed to
+-`argp_parse' (the first three fields are usually used, but not in this
+-small program).  There are also two global variables that argp knows
+-about defined here, `argp_program_version' and
+-`argp_program_bug_address' (they are global variables because they will
+-almost always be constant for a given program, even if it uses
+-different argument parsers for various tasks).
+-
+-     /* Argp example #2 - a pretty minimal program using argp */
+-     
+-     /* This program doesn't use any options or arguments, but uses
+-        argp to be compliant with the GNU standard command line
+-        format.
+-     
+-        In addition to making sure no arguments are given, and
+-        implementing a -help option, this example will have a
+-        -version option, and will put the given documentation string
+-        and bug address in the -help output, as per GNU standards.
+-     
+-        The variable ARGP contains the argument parser specification;
+-        adding fields to this structure is the way most parameters are
+-        passed to argp_parse (the first three fields are usually used,
+-        but not in this small program).  There are also two global
+-        variables that argp knows about defined here,
+-        ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are
+-        global variables becuase they will almost always be constant
+-        for a given program, even if it uses different argument
+-        parsers for various tasks). */
+-     
+-     #include <argp.h>
+-     
+-     const char *argp_program_version =
+-       "argp-ex2 1.0";
+-     const char *argp_program_bug_address =
+-       "<bug-gnu-utils@gnu.org>";
+-     
+-     /* Program documentation. */
+-     static char doc[] =
+-       "Argp example #2 -- a pretty minimal program using argp";
+-     
+-     /* Our argpument parser.  The `options', `parser', and
+-        `args_doc' fields are zero because we have neither options or
+-        arguments; `doc' and `argp_program_bug_address' will be
+-        used in the output for `--help', and the `--version'
+-        option will print out `argp_program_version'. */
+-     static struct argp argp = { 0, 0, 0, doc };
+-     
+-     int main (int argc, char **argv)
+-     {
+-       argp_parse (&argp, argc, argv, 0, 0, 0);
+-       exit (0);
+-     }
+-
+-
+-File: libc.info,  Node: Argp Example 3,  Next: Argp Example 4,  Prev: Argp Example 2,  Up: Argp Examples
+-
+-A Program Using Argp with User Options
+-......................................
+-
+-   This program uses the same features as example 2, and adds user
+-options and arguments.
+-
+-   We now use the first four fields in `argp' (*note Argp Parsers::.),
+-and specifies `parse_opt' as the parser function (*note Argp Parser
+-Functions::.).
+-
+-   Note that in this example, `main' uses a structure to communicate
+-with the `parse_opt' function, a pointer to which it passes in the
+-`input' argument to `argp_parse' (*note Argp::.), and is retrieved by
+-`parse_opt' through the `input' field in its `state' argument (*note
+-Argp Parsing State::.).  Of course, it's also possible to use global
+-variables instead, but using a structure like this is somewhat more
+-flexible and clean.
+-
+-     /* Argp example #3 - a program with options and arguments using argp */
+-     
+-     /* This program uses the same features as example 2, and uses options and
+-        arguments.
+-     
+-        We now use the first four fields in ARGP, so here's a description of them:
+-          OPTIONS  - A pointer to a vector of struct argp_option (see below)
+-          PARSER   - A function to parse a single option, called by argp
+-          ARGS_DOC - A string describing how the non-option arguments should look
+-          DOC      - A descriptive string about this program; if it contains a
+-                      vertical tab character (\v), the part after it will be
+-                      printed *following* the options
+-     
+-        The function PARSER takes the following arguments:
+-          KEY  - An integer specifying which option this is (taken
+-                  from the KEY field in each struct argp_option), or
+-                  a special key specifying something else; the only
+-                  special keys we use here are ARGP_KEY_ARG, meaning
+-                  a non-option argument, and ARGP_KEY_END, meaning
+-                  that all argumens have been parsed
+-          ARG  - For an option KEY, the string value of its
+-                  argument, or NULL if it has none
+-          STATE- A pointer to a struct argp_state, containing
+-                  various useful information about the parsing state; used here
+-                  are the INPUT field, which reflects the INPUT argument to
+-                  argp_parse, and the ARG_NUM field, which is the number of the
+-                  current non-option argument being parsed
+-        It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the
+-        given KEY wasn't recognized, or an errno value indicating some other
+-        error.
+-     
+-        Note that in this example, main uses a structure to communicate with the
+-        parse_opt function, a pointer to which it passes in the INPUT argument to
+-        argp_parse.  Of course, it's also possible to use global variables
+-        instead, but this is somewhat more flexible.
+-     
+-        The OPTIONS field contains a pointer to a vector of struct argp_option's;
+-        that structure has the following fields (if you assign your option
+-        structures using array initialization like this example, unspecified
+-        fields will be defaulted to 0, and need not be specified):
+-          NAME   - The name of this option's long option (may be zero)
+-          KEY    - The KEY to pass to the PARSER function when parsing this option,
+-                    *and* the name of this option's short option, if it is a
+-                    printable ascii character
+-          ARG    - The name of this option's argument, if any
+-          FLAGS  - Flags describing this option; some of them are:
+-                      OPTION_ARG_OPTIONAL - The argument to this option is optional
+-                      OPTION_ALIAS        - This option is an alias for the
+-                                             previous option
+-                      OPTION_HIDDEN       - Don't show this option in -help output
+-          DOC    - A documentation string for this option, shown in -help output
+-     
+-        An options vector should be terminated by an option with all fields zero. */
+-     
+-     #include <argp.h>
+-     
+-     const char *argp_program_version =
+-       "argp-ex3 1.0";
+-     const char *argp_program_bug_address =
+-       "<bug-gnu-utils@gnu.org>";
+-     
+-     /* Program documentation. */
+-     static char doc[] =
+-       "Argp example #3 -- a program with options and arguments using argp";
+-     
+-     /* A description of the arguments we accept. */
+-     static char args_doc[] = "ARG1 ARG2";
+-     
+-     /* The options we understand. */
+-     static struct argp_option options[] = {
+-       {"verbose",  'v', 0,      0,  "Produce verbose output" },
+-       {"quiet",    'q', 0,      0,  "Don't produce any output" },
+-       {"silent",   's', 0,      OPTION_ALIAS },
+-       {"output",   'o', "FILE", 0,
+-        "Output to FILE instead of standard output" },
+-       { 0 }
+-     };
+-     
+-     /* Used by `main' to communicate with `parse_opt'. */
+-     struct arguments
+-     {
+-       char *args[2];                /* ARG1 & ARG2 */
+-       int silent, verbose;
+-       char *output_file;
+-     };
+-     
+-     /* Parse a single option. */
+-     static error_t
+-     parse_opt (int key, char *arg, struct argp_state *state)
+-     {
+-       /* Get the INPUT argument from `argp_parse', which we
+-          know is a pointer to our arguments structure. */
+-       struct arguments *arguments = state->input;
+-     
+-       switch (key)
+-         {
+-         case 'q': case 's':
+-           arguments->silent = 1;
+-           break;
+-         case 'v':
+-           arguments->verbose = 1;
+-           break;
+-         case 'o':
+-           arguments->output_file = arg;
+-           break;
+-     
+-         case ARGP_KEY_ARG:
+-           if (state->arg_num >= 2)
+-             /* Too many arguments. */
+-             argp_usage (state);
+-     
+-           arguments->args[state->arg_num] = arg;
+-     
+-           break;
+-     
+-         case ARGP_KEY_END:
+-           if (state->arg_num < 2)
+-             /* Not enough arguments. */
+-             argp_usage (state);
+-           break;
+-     
+-         default:
+-           return ARGP_ERR_UNKNOWN;
+-         }
+-       return 0;
+-     }
+-     
+-     /* Our argp parser. */
+-     static struct argp argp = { options, parse_opt, args_doc, doc };
+-     
+-     int main (int argc, char **argv)
+-     {
+-       struct arguments arguments;
+-     
+-       /* Default values. */
+-       arguments.silent = 0;
+-       arguments.verbose = 0;
+-       arguments.output_file = "-";
+-     
+-       /* Parse our arguments; every option seen by `parse_opt' will
+-          be reflected in `arguments'. */
+-       argp_parse (&argp, argc, argv, 0, 0, &arguments);
+-     
+-       printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
+-               "VERBOSE = %s\nSILENT = %s\n",
+-               arguments.args[0], arguments.args[1],
+-               arguments.output_file,
+-               arguments.verbose ? "yes" : "no",
+-               arguments.silent ? "yes" : "no");
+-     
+-       exit (0);
+-     }
+-
+-
+-File: libc.info,  Node: Argp Example 4,  Prev: Argp Example 3,  Up: Argp Examples
+-
+-A Program Using Multiple Combined Argp Parsers
+-..............................................
+-
+-   This program uses the same features as example 3, but has more
+-options, and somewhat more structure in the `--help' output.  It also
+-shows how you can `steal' the remainder of the input arguments past a
+-certain point, for programs that accept a list of items, and the special
+-KEY value `ARGP_KEY_NO_ARGS', which is only given if no non-option
+-arguments were supplied to the program (*note Argp Special Keys::.).
+-
+-   For structuring the help output, two features are used: *headers*,
+-which are entries in the options vector (*note Argp Option Vectors::.)
+-with the first four fields being zero, and a two part documentation
+-string (in the variable `doc'), which allows documentation both before
+-and after the options (*note Argp Parsers::.); the two parts of `doc'
+-are separated by a vertical-tab character (`'\v'', or `'\013'').  By
+-convention, the documentation before the options is just a short string
+-saying what the program does, and that afterwards is longer, describing
+-the behavior in more detail.  All documentation strings are
+-automatically filled for output, although newlines may be included to
+-force a line break at a particular point.  All documentation strings
+-are also passed to the `gettext' function, for possible translation
+-into the current locale.
+-
+-     /* Argp example #4 - a program with somewhat more complicated options */
+-     
+-     /* This program uses the same features as example 3, but has more
+-        options, and somewhat more structure in the -help output.  It
+-        also shows how you can `steal' the remainder of the input
+-        arguments past a certain point, for programs that accept a
+-        list of items.  It also shows the special argp KEY value
+-        ARGP_KEY_NO_ARGS, which is only given if no non-option
+-        arguments were supplied to the program.
+-     
+-        For structuring the help output, two features are used,
+-        *headers* which are entries in the options vector with the
+-        first four fields being zero, and a two part documentation
+-        string (in the variable DOC), which allows documentation both
+-        before and after the options; the two parts of DOC are
+-        separated by a vertical-tab character ('\v', or '\013').  By
+-        convention, the documentation before the options is just a
+-        short string saying what the program does, and that afterwards
+-        is longer, describing the behavior in more detail.  All
+-        documentation strings are automatically filled for output,
+-        although newlines may be included to force a line break at a
+-        particular point.  All documenation strings are also passed to
+-        the `gettext' function, for possible translation into the
+-        current locale. */
+-     
+-     #include <stdlib.h>
+-     #include <error.h>
+-     #include <argp.h>
+-     
+-     const char *argp_program_version =
+-       "argp-ex4 1.0";
+-     const char *argp_program_bug_address =
+-       "<bug-gnu-utils@prep.ai.mit.edu>";
+-     
+-     /* Program documentation. */
+-     static char doc[] =
+-       "Argp example #4 -- a program with somewhat more complicated\
+-     options\
+-     \vThis part of the documentation comes *after* the options;\
+-      note that the text is automatically filled, but it's possible\
+-      to force a line-break, e.g.\n<-- here.";
+-     
+-     /* A description of the arguments we accept. */
+-     static char args_doc[] = "ARG1 [STRING...]";
+-     
+-     /* Keys for options without short-options. */
+-     #define OPT_ABORT  1            /* -abort */
+-     
+-     /* The options we understand. */
+-     static struct argp_option options[] = {
+-       {"verbose",  'v', 0,       0, "Produce verbose output" },
+-       {"quiet",    'q', 0,       0, "Don't produce any output" },
+-       {"silent",   's', 0,       OPTION_ALIAS },
+-       {"output",   'o', "FILE",  0,
+-        "Output to FILE instead of standard output" },
+-     
+-       {0,0,0,0, "The following options should be grouped together:" },
+-       {"repeat",   'r', "COUNT", OPTION_ARG_OPTIONAL,
+-        "Repeat the output COUNT (default 10) times"},
+-       {"abort",    OPT_ABORT, 0, 0, "Abort before showing any output"},
+-     
+-       { 0 }
+-     };
+-     
+-     /* Used by `main' to communicate with `parse_opt'. */
+-     struct arguments
+-     {
+-       char *arg1;                   /* ARG1 */
+-       char **strings;               /* [STRING...] */
+-       int silent, verbose, abort;   /* `-s', `-v', `--abort' */
+-       char *output_file;            /* FILE arg to `--output' */
+-       int repeat_count;             /* COUNT arg to `--repeat' */
+-     };
+-     
+-     /* Parse a single option. */
+-     static error_t
+-     parse_opt (int key, char *arg, struct argp_state *state)
+-     {
+-       /* Get the `input' argument from `argp_parse', which we
+-          know is a pointer to our arguments structure. */
+-       struct arguments *arguments = state->input;
+-     
+-       switch (key)
+-         {
+-         case 'q': case 's':
+-           arguments->silent = 1;
+-           break;
+-         case 'v':
+-           arguments->verbose = 1;
+-           break;
+-         case 'o':
+-           arguments->output_file = arg;
+-           break;
+-         case 'r':
+-           arguments->repeat_count = arg ? atoi (arg) : 10;
+-           break;
+-         case OPT_ABORT:
+-           arguments->abort = 1;
+-           break;
+-     
+-         case ARGP_KEY_NO_ARGS:
+-           argp_usage (state);
+-     
+-         case ARGP_KEY_ARG:
+-           /* Here we know that `state->arg_num == 0', since we
+-              force argument parsing to end before any more arguments can
+-              get here. */
+-           arguments->arg1 = arg;
+-     
+-           /* Now we consume all the rest of the arguments.
+-              `state->next' is the index in `state->argv' of the
+-              next argument to be parsed, which is the first STRING
+-              we're interested in, so we can just use
+-              `&state->argv[state->next]' as the value for
+-              arguments->strings.
+-     
+-              *In addition*, by setting `state->next' to the end
+-              of the arguments, we can force argp to stop parsing here and
+-              return. */
+-           arguments->strings = &state->argv[state->next];
+-           state->next = state->argc;
+-     
+-           break;
+-     
+-         default:
+-           return ARGP_ERR_UNKNOWN;
+-         }
+-       return 0;
+-     }
+-     
+-     /* Our argp parser. */
+-     static struct argp argp = { options, parse_opt, args_doc, doc };
+-     
+-     int main (int argc, char **argv)
+-     {
+-       int i, j;
+-       struct arguments arguments;
+-     
+-       /* Default values. */
+-       arguments.silent = 0;
+-       arguments.verbose = 0;
+-       arguments.output_file = "-";
+-       arguments.repeat_count = 1;
+-       arguments.abort = 0;
+-     
+-       /* Parse our arguments; every option seen by `parse_opt' will be
+-          reflected in `arguments'. */
+-       argp_parse (&argp, argc, argv, 0, 0, &arguments);
+-     
+-       if (arguments.abort)
+-         error (10, 0, "ABORTED");
+-     
+-       for (i = 0; i < arguments.repeat_count; i++)
+-         {
+-           printf ("ARG1 = %s\n", arguments.arg1);
+-           printf ("STRINGS = ");
+-           for (j = 0; arguments.strings[j]; j++)
+-             printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
+-           printf ("\n");
+-           printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
+-                   arguments.output_file,
+-                   arguments.verbose ? "yes" : "no",
+-                   arguments.silent ? "yes" : "no");
+-         }
+-     
+-       exit (0);
+-     }
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-36 glibc-2.1.3/manual/libc.info-36
+--- ../glibc-2.1.3/manual/libc.info-36	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-36	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1096 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Argp User Customization,  Prev: Argp Examples,  Up: Argp
+-
+-Argp User Customization
+------------------------
+-
+-   The way formatting of argp `--help' output may be controlled to some
+-extent by a program's users, by setting the `ARGP_HELP_FMT' environment
+-variable to a comma-separated list (whitespace is ignored) of the
+-following tokens:
+-
+-`dup-args'
+-`no-dup-args'
+-     Turn "duplicate-argument-mode" on or off.  In duplicate argument
+-     mode, if an option which accepts an argument has multiple names,
+-     the argument is shown for each name; otherwise, it is only shown
+-     for the first long option, and a note is emitted later so the user
+-     knows that it applies to the other names as well.  The default is
+-     `no-dup-args', which is less consistent, but prettier.
+-
+-`dup-args-note'
+-
+-`no-dup-args-note'
+-     Enable or disable the note informing the user of suppressed option
+-     argument duplication.  The default is `dup-args-note'.
+-
+-`short-opt-col=N'
+-     Show the first short option in column N (default 2).
+-
+-`long-opt-col=N'
+-     Show the first long option in column N (default 6).
+-
+-`doc-opt-col=N'
+-     Show `documentation options' (*note Argp Option Flags::.) in column
+-     N (default 2).
+-
+-`opt-doc-col=N'
+-     Show the documentation for options starting in column N (default
+-     29).
+-
+-`header-col=N'
+-     Indent group headers (which document groups of options) to column
+-     N (default 1).
+-
+-`usage-indent=N'
+-     Indent continuation lines in `Usage:' messages to column N
+-     (default 12).
+-
+-`rmargin=N'
+-     Word wrap help output at or before column N (default 79).
+-
+-
+-File: libc.info,  Node: Suboptions,  Next: Suboptions Example,  Prev: Argp,  Up: Parsing Program Arguments
+-
+-Parsing of Suboptions
+-.....................
+-
+-   Having a single level of options is sometimes not enough.  There
+-might be too many options which have to be available or a set of
+-options is closely related.
+-
+-   For this case some programs use suboptions.  One of the most
+-prominent programs is certainly `mount'(8).  The `-o' option take one
+-argument which itself is a comma separated list of options.  To ease the
+-programming of code like this the function `getsubopt' is available.
+-
+- - Function: int getsubopt (char **OPTIONP, const char* const *TOKENS,
+-          char **VALUEP)
+-     The OPTIONP parameter must be a pointer to a variable containing
+-     the address of the string to process.  When the function returns
+-     the reference is updated to point to the next suboption or to the
+-     terminating `\0' character if there is no more suboption available.
+-
+-     The TOKENS parameter references an array of strings containing the
+-     known suboptions.  All strings must be `\0' terminated and to mark
+-     the end a null pointer must be stored.  When `getsubopt' finds a
+-     possible legal suboption it compares it with all strings available
+-     in the TOKENS array and returns the index in the string as the
+-     indicator.
+-
+-     In case the suboption has an associated value introduced by a `='
+-     character, a pointer to the value is returned in VALUEP.  The
+-     string is `\0' terminated.  If no argument is available VALUEP is
+-     set to the null pointer.  By doing this the caller can check
+-     whether a necessary value is given or whether no unexpected value
+-     is present.
+-
+-     In case the next suboption in the string is not mentioned in the
+-     TOKENS array the starting address of the suboption including a
+-     possible value is returned in VALUEP and the return value of the
+-     function is `-1'.
+-
+-
+-File: libc.info,  Node: Suboptions Example,  Prev: Suboptions,  Up: Parsing Program Arguments
+-
+-Parsing of Suboptions Example
+------------------------------
+-
+-   The code which might appear in the `mount'(8) program is a perfect
+-example of the use of `getsubopt':
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     
+-     int do_all;
+-     const char *type;
+-     int read_size;
+-     int write_size;
+-     int read_only;
+-     
+-     enum
+-     {
+-       RO_OPTION = 0,
+-       RW_OPTION,
+-       READ_SIZE_OPTION,
+-       WRITE_SIZE_OPTION
+-     };
+-     
+-     const char *mount_opts[] =
+-     {
+-       [RO_OPTION] = "ro",
+-       [RW_OPTION] = "rw",
+-       [READ_SIZE_OPTION] = "rsize",
+-       [WRITE_SIZE_OPTION] = "wsize"
+-     };
+-     
+-     int
+-     main (int argc, char *argv[])
+-     {
+-       char *subopts, *value;
+-       int opt;
+-     
+-       while ((opt = getopt (argc, argv, "at:o:")) != -1)
+-         switch (opt)
+-           {
+-           case 'a':
+-             do_all = 1;
+-             break;
+-           case 't':
+-             type = optarg;
+-             break;
+-           case 'o':
+-             subopts = optarg;
+-             while (*subopts != '\0')
+-               switch (getsubopt (&subopts, mount_opts, &value))
+-                 {
+-                 case RO_OPTION:
+-                   read_only = 1;
+-                   break;
+-                 case RW_OPTION:
+-                   read_only = 0;
+-                   break;
+-                 case READ_SIZE_OPTION:
+-                   if (value == NULL)
+-                     abort ();
+-                   read_size = atoi (value);
+-                   break;
+-                 case WRITE_SIZE_OPTION:
+-                   if (value == NULL)
+-                     abort ();
+-                   write_size = atoi (value);
+-                   break;
+-                 default:
+-                   /* Unknown suboption. */
+-                   printf ("Unknown suboption `%s'\n", value);
+-                   break;
+-                 }
+-             break;
+-           default:
+-             abort ();
+-           }
+-     
+-       /* Do the real work. */
+-     
+-       return 0;
+-     }
+-
+-
+-File: libc.info,  Node: Environment Variables,  Next: Program Termination,  Prev: Program Arguments,  Up: Process Startup
+-
+-Environment Variables
+-=====================
+-
+-   When a program is executed, it receives information about the
+-context in which it was invoked in two ways.  The first mechanism uses
+-the ARGV and ARGC arguments to its `main' function, and is discussed in
+-*Note Program Arguments::.  The second mechanism uses "environment
+-variables" and is discussed in this section.
+-
+-   The ARGV mechanism is typically used to pass command-line arguments
+-specific to the particular program being invoked.  The environment, on
+-the other hand, keeps track of information that is shared by many
+-programs, changes infrequently, and that is less frequently used.
+-
+-   The environment variables discussed in this section are the same
+-environment variables that you set using assignments and the `export'
+-command in the shell.  Programs executed from the shell inherit all of
+-the environment variables from the shell.
+-
+-   Standard environment variables are used for information about the
+-user's home directory, terminal type, current locale, and so on; you
+-can define additional variables for other purposes.  The set of all
+-environment variables that have values is collectively known as the
+-"environment".
+-
+-   Names of environment variables are case-sensitive and must not
+-contain the character `='.  System-defined environment variables are
+-invariably uppercase.
+-
+-   The values of environment variables can be anything that can be
+-represented as a string.  A value must not contain an embedded null
+-character, since this is assumed to terminate the string.
+-
+-* Menu:
+-
+-* Environment Access::          How to get and set the values of
+-				 environment variables.
+-* Standard Environment::        These environment variables have
+-                		 standard interpretations.
+-
+-
+-File: libc.info,  Node: Environment Access,  Next: Standard Environment,  Up: Environment Variables
+-
+-Environment Access
+-------------------
+-
+-   The value of an environment variable can be accessed with the
+-`getenv' function.  This is declared in the header file `stdlib.h'.
+-All of the following functions can be safely used in multi-threaded
+-programs.  It is made sure that concurrent modifications to the
+-environment do not lead to errors.
+-
+- - Function: char * getenv (const char *NAME)
+-     This function returns a string that is the value of the environment
+-     variable NAME.  You must not modify this string.  In some non-Unix
+-     systems not using the GNU library, it might be overwritten by
+-     subsequent calls to `getenv' (but not by any other library
+-     function).  If the environment variable NAME is not defined, the
+-     value is a null pointer.
+-
+- - Function: int putenv (const char *STRING)
+-     The `putenv' function adds or removes definitions from the
+-     environment.  If the STRING is of the form `NAME=VALUE', the
+-     definition is added to the environment.  Otherwise, the STRING is
+-     interpreted as the name of an environment variable, and any
+-     definition for this variable in the environment is removed.
+-
+-     This function is part of the extended Unix interface.  Since it
+-     was also available in old SVID libraries you should define either
+-     _XOPEN_SOURCE or _SVID_SOURCE before including any header.
+-
+- - Function: int setenv (const char *NAME, const char *VALUE, int
+-          REPLACE)
+-     The `setenv' function can be used to add a new definition to the
+-     environment.  The entry with the name NAME is replaced by the
+-     value `NAME=VALUE'.  Please note that this is also true if VALUE
+-     is the empty string.  A null pointer for the VALUE parameter is
+-     illegal.  If the environment already contains an entry with key
+-     NAME the REPLACE parameter controls the action.  If replace is
+-     zero, nothing happens.  otherwise the old entry is replaced by the
+-     new one.
+-
+-     Please note that you cannot remove an entry completely using this
+-     function.
+-
+-     This function is part of the BSD library.  The GNU C Library
+-     provides this function for compatibility but it may not be
+-     available on other systems.
+-
+- - Function: void unsetenv (const char *NAME)
+-     Using this function one can remove an entry completely from the
+-     environment.  If the environment contains an entry with the key
+-     NAME this whole entry is removed.  A call to this function is
+-     equivalent to a call to `putenv' when the VALUE part of the string
+-     is empty.
+-
+-     This function is part of the BSD library.  The GNU C Library
+-     provides this function for compatibility but it may not be
+-     available on other systems.
+-
+-   There is one more function to modify the whole environment.  This
+-function is said to be used in the POSIX.9 (POSIX bindings for Fortran
+-77) and so one should expect it did made it into POSIX.1.  But this
+-never happened.  But we still provide this function as a GNU extension
+-to enable writing standard compliant Fortran environments.
+-
+- - Function: int clearenv (void)
+-     The `clearenv' function removes all entries from the environment.
+-     Using `putenv' and `setenv' new entries can be added again later.
+-
+-     If the function is successful it returns `0'.  Otherwise the return
+-     value is nonzero.
+-
+-   You can deal directly with the underlying representation of
+-environment objects to add more variables to the environment (for
+-example, to communicate with another program you are about to execute;
+-*note Executing a File::.).
+-
+- - Variable: char ** environ
+-     The environment is represented as an array of strings.  Each
+-     string is of the format `NAME=VALUE'.  The order in which strings
+-     appear in the environment is not significant, but the same NAME
+-     must not appear more than once.  The last element of the array is
+-     a null pointer.
+-
+-     This variable is declared in the header file `unistd.h'.
+-
+-     If you just want to get the value of an environment variable, use
+-     `getenv'.
+-
+-   Unix systems, and the GNU system, pass the initial value of
+-`environ' as the third argument to `main'.  *Note Program Arguments::.
+-
+-
+-File: libc.info,  Node: Standard Environment,  Prev: Environment Access,  Up: Environment Variables
+-
+-Standard Environment Variables
+-------------------------------
+-
+-   These environment variables have standard meanings.  This doesn't
+-mean that they are always present in the environment; but if these
+-variables *are* present, they have these meanings.  You shouldn't try
+-to use these environment variable names for some other purpose.
+-
+-`HOME'
+-     This is a string representing the user's "home directory", or
+-     initial default working directory.
+-
+-     The user can set `HOME' to any value.  If you need to make sure to
+-     obtain the proper home directory for a particular user, you should
+-     not use `HOME'; instead, look up the user's name in the user
+-     database (*note User Database::.).
+-
+-     For most purposes, it is better to use `HOME', precisely because
+-     this lets the user specify the value.
+-
+-`LOGNAME'
+-     This is the name that the user used to log in.  Since the value in
+-     the environment can be tweaked arbitrarily, this is not a reliable
+-     way to identify the user who is running a process; a function like
+-     `getlogin' (*note Who Logged In::.) is better for that purpose.
+-
+-     For most purposes, it is better to use `LOGNAME', precisely because
+-     this lets the user specify the value.
+-
+-`PATH'
+-     A "path" is a sequence of directory names which is used for
+-     searching for a file.  The variable `PATH' holds a path used for
+-     searching for programs to be run.
+-
+-     The `execlp' and `execvp' functions (*note Executing a File::.)
+-     use this environment variable, as do many shells and other
+-     utilities which are implemented in terms of those functions.
+-
+-     The syntax of a path is a sequence of directory names separated by
+-     colons.  An empty string instead of a directory name stands for the
+-     current directory (*note Working Directory::.).
+-
+-     A typical value for this environment variable might be a string
+-     like:
+-
+-          :/bin:/etc:/usr/bin:/usr/new/X11:/usr/new:/usr/local/bin
+-
+-     This means that if the user tries to execute a program named `foo',
+-     the system will look for files named `foo', `/bin/foo',
+-     `/etc/foo', and so on.  The first of these files that exists is
+-     the one that is executed.
+-
+-`TERM'
+-     This specifies the kind of terminal that is receiving program
+-     output.  Some programs can make use of this information to take
+-     advantage of special escape sequences or terminal modes supported
+-     by particular kinds of terminals.  Many programs which use the
+-     termcap library (*note Find: (termcap)Finding a Terminal
+-     Description.) use the `TERM' environment variable, for example.
+-
+-`TZ'
+-     This specifies the time zone.  *Note TZ Variable::, for
+-     information about the format of this string and how it is used.
+-
+-`LANG'
+-     This specifies the default locale to use for attribute categories
+-     where neither `LC_ALL' nor the specific environment variable for
+-     that category is set.  *Note Locales::, for more information about
+-     locales.
+-
+-`LC_ALL'
+-     If this environment variable is set it overrides the selection for
+-     all the locales done using the other `LC_*' environment variables.
+-     The value of the other `LC_*' environment variables is simply
+-     ignored in this case.
+-
+-`LC_COLLATE'
+-     This specifies what locale to use for string sorting.
+-
+-`LC_CTYPE'
+-     This specifies what locale to use for character sets and character
+-     classification.
+-
+-`LC_MESSAGES'
+-     This specifies what locale to use for printing messages and to
+-     parse responses.
+-
+-`LC_MONETARY'
+-     This specifies what locale to use for formatting monetary values.
+-
+-`LC_NUMERIC'
+-     This specifies what locale to use for formatting numbers.
+-
+-`LC_TIME'
+-     This specifies what locale to use for formatting date/time values.
+-
+-`NLSPATH'
+-     This specifies the directories in which the `catopen' function
+-     looks for message translation catalogs.
+-
+-`_POSIX_OPTION_ORDER'
+-     If this environment variable is defined, it suppresses the usual
+-     reordering of command line arguments by `getopt' and `argp_parse'.
+-     *Note Argument Syntax::.
+-
+-
+-File: libc.info,  Node: Program Termination,  Prev: Environment Variables,  Up: Process Startup
+-
+-Program Termination
+-===================
+-
+-   The usual way for a program to terminate is simply for its `main'
+-function to return.  The "exit status value" returned from the `main'
+-function is used to report information back to the process's parent
+-process or shell.
+-
+-   A program can also terminate normally by calling the `exit' function.
+-
+-   In addition, programs can be terminated by signals; this is
+-discussed in more detail in *Note Signal Handling::.  The `abort'
+-function causes a signal that kills the program.
+-
+-* Menu:
+-
+-* Normal Termination::          If a program calls `exit', a
+-                                 process terminates normally.
+-* Exit Status::                 The `exit status' provides information
+-                                 about why the process terminated.
+-* Cleanups on Exit::            A process can run its own cleanup
+-                                 functions upon normal termination.
+-* Aborting a Program::          The `abort' function causes
+-                                 abnormal program termination.
+-* Termination Internals::       What happens when a process terminates.
+-
+-
+-File: libc.info,  Node: Normal Termination,  Next: Exit Status,  Up: Program Termination
+-
+-Normal Termination
+-------------------
+-
+-   A process terminates normally when the program calls `exit'.
+-Returning from `main' is equivalent to calling `exit', and the value
+-that `main' returns is used as the argument to `exit'.
+-
+- - Function: void exit (int STATUS)
+-     The `exit' function terminates the process with status STATUS.
+-     This function does not return.
+-
+-   Normal termination causes the following actions:
+-
+-  1. Functions that were registered with the `atexit' or `on_exit'
+-     functions are called in the reverse order of their registration.
+-     This mechanism allows your application to specify its own
+-     "cleanup" actions to be performed at program termination.
+-     Typically, this is used to do things like saving program state
+-     information in a file, or unlocking locks in shared data bases.
+-
+-  2. All open streams are closed, writing out any buffered output data.
+-     See *Note Closing Streams::.  In addition, temporary files opened
+-     with the `tmpfile' function are removed; see *Note Temporary
+-     Files::.
+-
+-  3. `_exit' is called, terminating the program.  *Note Termination
+-     Internals::.
+-
+-
+-File: libc.info,  Node: Exit Status,  Next: Cleanups on Exit,  Prev: Normal Termination,  Up: Program Termination
+-
+-Exit Status
+------------
+-
+-   When a program exits, it can return to the parent process a small
+-amount of information about the cause of termination, using the "exit
+-status".  This is a value between 0 and 255 that the exiting process
+-passes as an argument to `exit'.
+-
+-   Normally you should use the exit status to report very broad
+-information about success or failure.  You can't provide a lot of
+-detail about the reasons for the failure, and most parent processes
+-would not want much detail anyway.
+-
+-   There are conventions for what sorts of status values certain
+-programs should return.  The most common convention is simply 0 for
+-success and 1 for failure.  Programs that perform comparison use a
+-different convention: they use status 1 to indicate a mismatch, and
+-status 2 to indicate an inability to compare.  Your program should
+-follow an existing convention if an existing convention makes sense for
+-it.
+-
+-   A general convention reserves status values 128 and up for special
+-purposes.  In particular, the value 128 is used to indicate failure to
+-execute another program in a subprocess.  This convention is not
+-universally obeyed, but it is a good idea to follow it in your programs.
+-
+-   *Warning:* Don't try to use the number of errors as the exit status.
+-This is actually not very useful; a parent process would generally not
+-care how many errors occurred.  Worse than that, it does not work,
+-because the status value is truncated to eight bits.  Thus, if the
+-program tried to report 256 errors, the parent would receive a report
+-of 0 errors--that is, success.
+-
+-   For the same reason, it does not work to use the value of `errno' as
+-the exit status--these can exceed 255.
+-
+-   *Portability note:* Some non-POSIX systems use different conventions
+-for exit status values.  For greater portability, you can use the
+-macros `EXIT_SUCCESS' and `EXIT_FAILURE' for the conventional status
+-value for success and failure, respectively.  They are declared in the
+-file `stdlib.h'.
+-
+- - Macro: int EXIT_SUCCESS
+-     This macro can be used with the `exit' function to indicate
+-     successful program completion.
+-
+-     On POSIX systems, the value of this macro is `0'.  On other
+-     systems, the value might be some other (possibly non-constant)
+-     integer expression.
+-
+- - Macro: int EXIT_FAILURE
+-     This macro can be used with the `exit' function to indicate
+-     unsuccessful program completion in a general sense.
+-
+-     On POSIX systems, the value of this macro is `1'.  On other
+-     systems, the value might be some other (possibly non-constant)
+-     integer expression.  Other nonzero status values also indicate
+-     failures.  Certain programs use different nonzero status values to
+-     indicate particular kinds of "non-success".  For example, `diff'
+-     uses status value `1' to mean that the files are different, and
+-     `2' or more to mean that there was difficulty in opening the files.
+-
+-
+-File: libc.info,  Node: Cleanups on Exit,  Next: Aborting a Program,  Prev: Exit Status,  Up: Program Termination
+-
+-Cleanups on Exit
+-----------------
+-
+-   Your program can arrange to run its own cleanup functions if normal
+-termination happens.  If you are writing a library for use in various
+-application programs, then it is unreliable to insist that all
+-applications call the library's cleanup functions explicitly before
+-exiting.  It is much more robust to make the cleanup invisible to the
+-application, by setting up a cleanup function in the library itself
+-using `atexit' or `on_exit'.
+-
+- - Function: int atexit (void (*FUNCTION) (void))
+-     The `atexit' function registers the function FUNCTION to be called
+-     at normal program termination.  The FUNCTION is called with no
+-     arguments.
+-
+-     The return value from `atexit' is zero on success and nonzero if
+-     the function cannot be registered.
+-
+- - Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void
+-          *ARG)
+-     This function is a somewhat more powerful variant of `atexit'.  It
+-     accepts two arguments, a function FUNCTION and an arbitrary
+-     pointer ARG.  At normal program termination, the FUNCTION is
+-     called with two arguments:  the STATUS value passed to `exit', and
+-     the ARG.
+-
+-     This function is included in the GNU C library only for
+-     compatibility for SunOS, and may not be supported by other
+-     implementations.
+-
+-   Here's a trivial program that illustrates the use of `exit' and
+-`atexit':
+-
+-     #include <stdio.h>
+-     #include <stdlib.h>
+-     
+-     void
+-     bye (void)
+-     {
+-       puts ("Goodbye, cruel world....");
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       atexit (bye);
+-       exit (EXIT_SUCCESS);
+-     }
+-
+-When this program is executed, it just prints the message and exits.
+-
+-
+-File: libc.info,  Node: Aborting a Program,  Next: Termination Internals,  Prev: Cleanups on Exit,  Up: Program Termination
+-
+-Aborting a Program
+-------------------
+-
+-   You can abort your program using the `abort' function.  The prototype
+-for this function is in `stdlib.h'.
+-
+- - Function: void abort (void)
+-     The `abort' function causes abnormal program termination.  This
+-     does not execute cleanup functions registered with `atexit' or
+-     `on_exit'.
+-
+-     This function actually terminates the process by raising a
+-     `SIGABRT' signal, and your program can include a handler to
+-     intercept this signal; see *Note Signal Handling::.
+-
+-   *Future Change Warning:* Proposed Federal censorship regulations may
+-prohibit us from giving you information about the possibility of
+-calling this function.  We would be required to say that this is not an
+-acceptable way of terminating a program.
+-
+-
+-File: libc.info,  Node: Termination Internals,  Prev: Aborting a Program,  Up: Program Termination
+-
+-Termination Internals
+----------------------
+-
+-   The `_exit' function is the primitive used for process termination
+-by `exit'.  It is declared in the header file `unistd.h'.
+-
+- - Function: void _exit (int STATUS)
+-     The `_exit' function is the primitive for causing a process to
+-     terminate with status STATUS.  Calling this function does not
+-     execute cleanup functions registered with `atexit' or `on_exit'.
+-
+- - Function: void _Exit (int STATUS)
+-     The `_Exit' function is the ISO C equivalent to `_exit'.  The
+-     ISO C committee members were not sure whether the definitions of
+-     `_exit' and `_Exit' were compatible so they have not used the
+-     POSIX name.
+-
+-     This function was introduced in ISO C9x and is declared in
+-     `stdlib.h'.
+-
+-   When a process terminates for any reason--either by an explicit
+-termination call, or termination as a result of a signal--the following
+-things happen:
+-
+-   * All open file descriptors in the process are closed.  *Note
+-     Low-Level I/O::.  Note that streams are not flushed automatically
+-     when the process terminates; see *Note I/O on Streams::.
+-
+-   * The low-order 8 bits of the return status code are saved to be
+-     reported back to the parent process via `wait' or `waitpid'; see
+-     *Note Process Completion::.
+-
+-   * Any child processes of the process being terminated are assigned a
+-     new parent process.  (On most systems, including GNU, this is the
+-     `init' process, with process ID 1.)
+-
+-   * A `SIGCHLD' signal is sent to the parent process.
+-
+-   * If the process is a session leader that has a controlling
+-     terminal, then a `SIGHUP' signal is sent to each process in the
+-     foreground job, and the controlling terminal is disassociated from
+-     that session.  *Note Job Control::.
+-
+-   * If termination of a process causes a process group to become
+-     orphaned, and any member of that process group is stopped, then a
+-     `SIGHUP' signal and a `SIGCONT' signal are sent to each process in
+-     the group.  *Note Job Control::.
+-
+-
+-File: libc.info,  Node: Processes,  Next: Job Control,  Prev: Process Startup,  Up: Top
+-
+-Processes
+-*********
+-
+-   "Processes" are the primitive units for allocation of system
+-resources.  Each process has its own address space and (usually) one
+-thread of control.  A process executes a program; you can have multiple
+-processes executing the same program, but each process has its own copy
+-of the program within its own address space and executes it
+-independently of the other copies.
+-
+-   Processes are organized hierarchically.  Each process has a "parent
+-process" which explicitly arranged to create it.  The processes created
+-by a given parent are called its "child processes".  A child inherits
+-many of its attributes from the parent process.
+-
+-   This chapter describes how a program can create, terminate, and
+-control child processes.  Actually, there are three distinct operations
+-involved: creating a new child process, causing the new process to
+-execute a program, and coordinating the completion of the child process
+-with the original program.
+-
+-   The `system' function provides a simple, portable mechanism for
+-running another program; it does all three steps automatically.  If you
+-need more control over the details of how this is done, you can use the
+-primitive functions to do each step individually instead.
+-
+-* Menu:
+-
+-* Running a Command::           The easy way to run another program.
+-* Process Creation Concepts::   An overview of the hard way to do it.
+-* Process Identification::      How to get the process ID of a process.
+-* Creating a Process::          How to fork a child process.
+-* Executing a File::            How to make a process execute another program.
+-* Process Completion::          How to tell when a child process has completed.
+-* Process Completion Status::   How to interpret the status value
+-                                 returned from a child process.
+-* BSD Wait Functions::  	More functions, for backward compatibility.
+-* Process Creation Example::    A complete example program.
+-
+-
+-File: libc.info,  Node: Running a Command,  Next: Process Creation Concepts,  Up: Processes
+-
+-Running a Command
+-=================
+-
+-   The easy way to run another program is to use the `system' function.
+-This function does all the work of running a subprogram, but it
+-doesn't give you much control over the details: you have to wait until
+-the subprogram terminates before you can do anything else.
+-
+- - Function: int system (const char *COMMAND)
+-     This function executes COMMAND as a shell command.  In the GNU C
+-     library, it always uses the default shell `sh' to run the command.
+-     In particular, it searches the directories in `PATH' to find
+-     programs to execute.  The return value is `-1' if it wasn't
+-     possible to create the shell process, and otherwise is the status
+-     of the shell process.  *Note Process Completion::, for details on
+-     how this status code can be interpreted.
+-
+-     If the COMMAND argument is a null pointer a non-zero return value
+-     indicates that a command processor is available and this function
+-     can be used at all.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `system' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `system' should be protected using cancelation handlers.
+-
+-     The `system' function is declared in the header file `stdlib.h'.
+-
+-   *Portability Note:* Some C implementations may not have any notion
+-of a command processor that can execute other programs.  You can
+-determine whether a command processor exists by executing
+-`system (NULL)'; if the return value is nonzero, a command processor is
+-available.
+-
+-   The `popen' and `pclose' functions (*note Pipe to a Subprocess::.)
+-are closely related to the `system' function.  They allow the parent
+-process to communicate with the standard input and output channels of
+-the command being executed.
+-
+-
+-File: libc.info,  Node: Process Creation Concepts,  Next: Process Identification,  Prev: Running a Command,  Up: Processes
+-
+-Process Creation Concepts
+-=========================
+-
+-   This section gives an overview of processes and of the steps
+-involved in creating a process and making it run another program.
+-
+-   Each process is named by a "process ID" number.  A unique process ID
+-is allocated to each process when it is created.  The "lifetime" of a
+-process ends when its termination is reported to its parent process; at
+-that time, all of the process resources, including its process ID, are
+-freed.
+-
+-   Processes are created with the `fork' system call (so the operation
+-of creating a new process is sometimes called "forking" a process).
+-The "child process" created by `fork' is a copy of the original "parent
+-process", except that it has its own process ID.
+-
+-   After forking a child process, both the parent and child processes
+-continue to execute normally.  If you want your program to wait for a
+-child process to finish executing before continuing, you must do this
+-explicitly after the fork operation, by calling `wait' or `waitpid'
+-(*note Process Completion::.).  These functions give you limited
+-information about why the child terminated--for example, its exit
+-status code.
+-
+-   A newly forked child process continues to execute the same program as
+-its parent process, at the point where the `fork' call returns.  You
+-can use the return value from `fork' to tell whether the program is
+-running in the parent process or the child.
+-
+-   Having several processes run the same program is only occasionally
+-useful.  But the child can execute another program using one of the
+-`exec' functions; see *Note Executing a File::.  The program that the
+-process is executing is called its "process image".  Starting execution
+-of a new program causes the process to forget all about its previous
+-process image; when the new program exits, the process exits too,
+-instead of returning to the previous process image.
+-
+-
+-File: libc.info,  Node: Process Identification,  Next: Creating a Process,  Prev: Process Creation Concepts,  Up: Processes
+-
+-Process Identification
+-======================
+-
+-   The `pid_t' data type represents process IDs.  You can get the
+-process ID of a process by calling `getpid'.  The function `getppid'
+-returns the process ID of the parent of the current process (this is
+-also known as the "parent process ID").  Your program should include
+-the header files `unistd.h' and `sys/types.h' to use these functions.
+-
+- - Data Type: pid_t
+-     The `pid_t' data type is a signed integer type which is capable of
+-     representing a process ID.  In the GNU library, this is an `int'.
+-
+- - Function: pid_t getpid (void)
+-     The `getpid' function returns the process ID of the current
+-     process.
+-
+- - Function: pid_t getppid (void)
+-     The `getppid' function returns the process ID of the parent of the
+-     current process.
+-
+-
+-File: libc.info,  Node: Creating a Process,  Next: Executing a File,  Prev: Process Identification,  Up: Processes
+-
+-Creating a Process
+-==================
+-
+-   The `fork' function is the primitive for creating a process.  It is
+-declared in the header file `unistd.h'.
+-
+- - Function: pid_t fork (void)
+-     The `fork' function creates a new process.
+-
+-     If the operation is successful, there are then both parent and
+-     child processes and both see `fork' return, but with different
+-     values: it returns a value of `0' in the child process and returns
+-     the child's process ID in the parent process.
+-
+-     If process creation failed, `fork' returns a value of `-1' in the
+-     parent process.  The following `errno' error conditions are
+-     defined for `fork':
+-
+-    `EAGAIN'
+-          There aren't enough system resources to create another
+-          process, or the user already has too many processes running.
+-          This means exceeding the `RLIMIT_NPROC' resource limit, which
+-          can usually be increased; *note Limits on Resources::..
+-
+-    `ENOMEM'
+-          The process requires more space than the system can supply.
+-
+-   The specific attributes of the child process that differ from the
+-parent process are:
+-
+-   * The child process has its own unique process ID.
+-
+-   * The parent process ID of the child process is the process ID of its
+-     parent process.
+-
+-   * The child process gets its own copies of the parent process's open
+-     file descriptors.  Subsequently changing attributes of the file
+-     descriptors in the parent process won't affect the file
+-     descriptors in the child, and vice versa.  *Note Control
+-     Operations::.  However, the file position associated with each
+-     descriptor is shared by both processes; *note File Position::..
+-
+-   * The elapsed processor times for the child process are set to zero;
+-     see *Note Processor Time::.
+-
+-   * The child doesn't inherit file locks set by the parent process.
+-     *Note Control Operations::.
+-
+-   * The child doesn't inherit alarms set by the parent process.  *Note
+-     Setting an Alarm::.
+-
+-   * The set of pending signals (*note Delivery of Signal::.) for the
+-     child process is cleared.  (The child process inherits its mask of
+-     blocked signals and signal actions from the parent process.)
+-
+- - Function: pid_t vfork (void)
+-     The `vfork' function is similar to `fork' but on some systems it
+-     is more efficient; however, there are restrictions you must follow
+-     to use it safely.
+-
+-     While `fork' makes a complete copy of the calling process's address
+-     space and allows both the parent and child to execute
+-     independently, `vfork' does not make this copy.  Instead, the
+-     child process created with `vfork' shares its parent's address
+-     space until it calls `_exit' or one of the `exec' functions.  In
+-     the meantime, the parent process suspends execution.
+-
+-     You must be very careful not to allow the child process created
+-     with `vfork' to modify any global data or even local variables
+-     shared with the parent.  Furthermore, the child process cannot
+-     return from (or do a long jump out of) the function that called
+-     `vfork'!  This would leave the parent process's control
+-     information very confused.  If in doubt, use `fork' instead.
+-
+-     Some operating systems don't really implement `vfork'.  The GNU C
+-     library permits you to use `vfork' on all systems, but actually
+-     executes `fork' if `vfork' isn't available.  If you follow the
+-     proper precautions for using `vfork', your program will still work
+-     even if the system uses `fork' instead.
+-
+-
+-File: libc.info,  Node: Executing a File,  Next: Process Completion,  Prev: Creating a Process,  Up: Processes
+-
+-Executing a File
+-================
+-
+-   This section describes the `exec' family of functions, for executing
+-a file as a process image.  You can use these functions to make a child
+-process execute a new program after it has been forked.
+-
+-   The functions in this family differ in how you specify the arguments,
+-but otherwise they all do the same thing.  They are declared in the
+-header file `unistd.h'.
+-
+- - Function: int execv (const char *FILENAME, char *const ARGV[])
+-     The `execv' function executes the file named by FILENAME as a new
+-     process image.
+-
+-     The ARGV argument is an array of null-terminated strings that is
+-     used to provide a value for the `argv' argument to the `main'
+-     function of the program to be executed.  The last element of this
+-     array must be a null pointer.  By convention, the first element of
+-     this array is the file name of the program sans directory names.
+-     *Note Program Arguments::, for full details on how programs can
+-     access these arguments.
+-
+-     The environment for the new process image is taken from the
+-     `environ' variable of the current process image; see *Note
+-     Environment Variables::, for information about environments.
+-
+- - Function: int execl (const char *FILENAME, const char *ARG0, ...)
+-     This is similar to `execv', but the ARGV strings are specified
+-     individually instead of as an array.  A null pointer must be
+-     passed as the last such argument.
+-
+- - Function: int execve (const char *FILENAME, char *const ARGV[], char
+-          *const ENV[])
+-     This is similar to `execv', but permits you to specify the
+-     environment for the new program explicitly as the ENV argument.
+-     This should be an array of strings in the same format as for the
+-     `environ' variable; see *Note Environment Access::.
+-
+- - Function: int execle (const char *FILENAME, const char *ARG0, char
+-          *const ENV[], ...)
+-     This is similar to `execl', but permits you to specify the
+-     environment for the new program explicitly.  The environment
+-     argument is passed following the null pointer that marks the last
+-     ARGV argument, and should be an array of strings in the same
+-     format as for the `environ' variable.
+-
+- - Function: int execvp (const char *FILENAME, char *const ARGV[])
+-     The `execvp' function is similar to `execv', except that it
+-     searches the directories listed in the `PATH' environment variable
+-     (*note Standard Environment::.) to find the full file name of a
+-     file from FILENAME if FILENAME does not contain a slash.
+-
+-     This function is useful for executing system utility programs,
+-     because it looks for them in the places that the user has chosen.
+-     Shells use it to run the commands that users type.
+-
+- - Function: int execlp (const char *FILENAME, const char *ARG0, ...)
+-     This function is like `execl', except that it performs the same
+-     file name searching as the `execvp' function.
+-
+-   The size of the argument list and environment list taken together
+-must not be greater than `ARG_MAX' bytes.  *Note General Limits::.  In
+-the GNU system, the size (which compares against `ARG_MAX') includes,
+-for each string, the number of characters in the string, plus the size
+-of a `char *', plus one, rounded up to a multiple of the size of a
+-`char *'.  Other systems may have somewhat different rules for counting.
+-
+-   These functions normally don't return, since execution of a new
+-program causes the currently executing program to go away completely.
+-A value of `-1' is returned in the event of a failure.  In addition to
+-the usual file name errors (*note File Name Errors::.), the following
+-`errno' error conditions are defined for these functions:
+-
+-`E2BIG'
+-     The combined size of the new program's argument list and
+-     environment list is larger than `ARG_MAX' bytes.  The GNU system
+-     has no specific limit on the argument list size, so this error
+-     code cannot result, but you may get `ENOMEM' instead if the
+-     arguments are too big for available memory.
+-
+-`ENOEXEC'
+-     The specified file can't be executed because it isn't in the right
+-     format.
+-
+-`ENOMEM'
+-     Executing the specified file requires more storage than is
+-     available.
+-
+-   If execution of the new file succeeds, it updates the access time
+-field of the file as if the file had been read.  *Note File Times::,
+-for more details about access times of files.
+-
+-   The point at which the file is closed again is not specified, but is
+-at some point before the process exits or before another process image
+-is executed.
+-
+-   Executing a new process image completely changes the contents of
+-memory, copying only the argument and environment strings to new
+-locations.  But many other attributes of the process are unchanged:
+-
+-   * The process ID and the parent process ID.  *Note Process Creation
+-     Concepts::.
+-
+-   * Session and process group membership.  *Note Concepts of Job
+-     Control::.
+-
+-   * Real user ID and group ID, and supplementary group IDs.  *Note
+-     Process Persona::.
+-
+-   * Pending alarms.  *Note Setting an Alarm::.
+-
+-   * Current working directory and root directory.  *Note Working
+-     Directory::.  In the GNU system, the root directory is not copied
+-     when executing a setuid program; instead the system default root
+-     directory is used for the new program.
+-
+-   * File mode creation mask.  *Note Setting Permissions::.
+-
+-   * Process signal mask; see *Note Process Signal Mask::.
+-
+-   * Pending signals; see *Note Blocking Signals::.
+-
+-   * Elapsed processor time associated with the process; see *Note
+-     Processor Time::.
+-
+-   If the set-user-ID and set-group-ID mode bits of the process image
+-file are set, this affects the effective user ID and effective group ID
+-(respectively) of the process.  These concepts are discussed in detail
+-in *Note Process Persona::.
+-
+-   Signals that are set to be ignored in the existing process image are
+-also set to be ignored in the new process image.  All other signals are
+-set to the default action in the new process image.  For more
+-information about signals, see *Note Signal Handling::.
+-
+-   File descriptors open in the existing process image remain open in
+-the new process image, unless they have the `FD_CLOEXEC'
+-(close-on-exec) flag set.  The files that remain open inherit all
+-attributes of the open file description from the existing process image,
+-including file locks.  File descriptors are discussed in *Note
+-Low-Level I/O::.
+-
+-   Streams, by contrast, cannot survive through `exec' functions,
+-because they are located in the memory of the process itself.  The new
+-process image has no streams except those it creates afresh.  Each of
+-the streams in the pre-`exec' process image has a descriptor inside it,
+-and these descriptors do survive through `exec' (provided that they do
+-not have `FD_CLOEXEC' set).  The new process image can reconnect these
+-to new streams using `fdopen' (*note Descriptors and Streams::.).
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-37 glibc-2.1.3/manual/libc.info-37
+--- ../glibc-2.1.3/manual/libc.info-37	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-37	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1308 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Process Completion,  Next: Process Completion Status,  Prev: Executing a File,  Up: Processes
+-
+-Process Completion
+-==================
+-
+-   The functions described in this section are used to wait for a child
+-process to terminate or stop, and determine its status.  These functions
+-are declared in the header file `sys/wait.h'.
+-
+- - Function: pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)
+-     The `waitpid' function is used to request status information from a
+-     child process whose process ID is PID.  Normally, the calling
+-     process is suspended until the child process makes status
+-     information available by terminating.
+-
+-     Other values for the PID argument have special interpretations.  A
+-     value of `-1' or `WAIT_ANY' requests status information for any
+-     child process; a value of `0' or `WAIT_MYPGRP' requests
+-     information for any child process in the same process group as the
+-     calling process; and any other negative value - PGID requests
+-     information for any child process whose process group ID is PGID.
+-
+-     If status information for a child process is available
+-     immediately, this function returns immediately without waiting.
+-     If more than one eligible child process has status information
+-     available, one of them is chosen randomly, and its status is
+-     returned immediately.  To get the status from the other eligible
+-     child processes, you need to call `waitpid' again.
+-
+-     The OPTIONS argument is a bit mask.  Its value should be the
+-     bitwise OR (that is, the `|' operator) of zero or more of the
+-     `WNOHANG' and `WUNTRACED' flags.  You can use the `WNOHANG' flag
+-     to indicate that the parent process shouldn't wait; and the
+-     `WUNTRACED' flag to request status information from stopped
+-     processes as well as processes that have terminated.
+-
+-     The status information from the child process is stored in the
+-     object that STATUS-PTR points to, unless STATUS-PTR is a null
+-     pointer.
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `waitpid' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `waitpid' should be protected using cancelation handlers.
+-
+-     The return value is normally the process ID of the child process
+-     whose status is reported.  If there are child processes but none
+-     of them is waiting to be noticed, `waitpid' will block until one
+-     is.  However, if the `WNOHANG' option was specified, `waitpid'
+-     will return zero instead of blocking.
+-
+-     If a specific PID to wait for was given to `waitpid', it will
+-     ignore all other children (if any).  Therefore if there are
+-     children waiting to be noticed but the child whose PID was
+-     specified is not one of them, `waitpid' will block or return zero
+-     as described above.
+-
+-     A value of `-1' is returned in case of error.  The following
+-     `errno' error conditions are defined for this function:
+-
+-    `EINTR'
+-          The function was interrupted by delivery of a signal to the
+-          calling process.  *Note Interrupted Primitives::.
+-
+-    `ECHILD'
+-          There are no child processes to wait for, or the specified PID
+-          is not a child of the calling process.
+-
+-    `EINVAL'
+-          An invalid value was provided for the OPTIONS argument.
+-
+-   These symbolic constants are defined as values for the PID argument
+-to the `waitpid' function.
+-
+-`WAIT_ANY'
+-     This constant macro (whose value is `-1') specifies that `waitpid'
+-     should return status information about any child process.
+-
+-`WAIT_MYPGRP'
+-     This constant (with value `0') specifies that `waitpid' should
+-     return status information about any child process in the same
+-     process group as the calling process.
+-
+-   These symbolic constants are defined as flags for the OPTIONS
+-argument to the `waitpid' function.  You can bitwise-OR the flags
+-together to obtain a value to use as the argument.
+-
+-`WNOHANG'
+-     This flag specifies that `waitpid' should return immediately
+-     instead of waiting, if there is no child process ready to be
+-     noticed.
+-
+-`WUNTRACED'
+-     This flag specifies that `waitpid' should report the status of any
+-     child processes that have been stopped as well as those that have
+-     terminated.
+-
+- - Function: pid_t wait (int *STATUS-PTR)
+-     This is a simplified version of `waitpid', and is used to wait
+-     until any one child process terminates.  The call:
+-
+-          wait (&status)
+-
+-     is exactly equivalent to:
+-
+-          waitpid (-1, &status, 0)
+-
+-     This function is a cancelation point in multi-threaded programs.
+-     This is a problem if the thread allocates some resources (like
+-     memory, file descriptors, semaphores or whatever) at the time
+-     `wait' is called.  If the thread gets canceled these resources
+-     stay allocated until the program ends.  To avoid this calls to
+-     `wait' should be protected using cancelation handlers.
+-
+- - Function: pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS,
+-          struct rusage *USAGE)
+-     If USAGE is a null pointer, `wait4' is equivalent to `waitpid
+-     (PID, STATUS-PTR, OPTIONS)'.
+-
+-     If USAGE is not null, `wait4' stores usage figures for the child
+-     process in `*RUSAGE' (but only if the child has terminated, not if
+-     it has stopped).  *Note Resource Usage::.
+-
+-     This function is a BSD extension.
+-
+-   Here's an example of how to use `waitpid' to get the status from all
+-child processes that have terminated, without ever waiting.  This
+-function is designed to be a handler for `SIGCHLD', the signal that
+-indicates that at least one child process has terminated.
+-
+-     void
+-     sigchld_handler (int signum)
+-     {
+-       int pid, status, serrno;
+-       serrno = errno;
+-       while (1)
+-         {
+-           pid = waitpid (WAIT_ANY, &status, WNOHANG);
+-           if (pid < 0)
+-             {
+-               perror ("waitpid");
+-               break;
+-             }
+-           if (pid == 0)
+-             break;
+-           notice_termination (pid, status);
+-         }
+-       errno = serrno;
+-     }
+-
+-
+-File: libc.info,  Node: Process Completion Status,  Next: BSD Wait Functions,  Prev: Process Completion,  Up: Processes
+-
+-Process Completion Status
+-=========================
+-
+-   If the exit status value (*note Program Termination::.) of the child
+-process is zero, then the status value reported by `waitpid' or `wait'
+-is also zero.  You can test for other kinds of information encoded in
+-the returned status value using the following macros.  These macros are
+-defined in the header file `sys/wait.h'.
+-
+- - Macro: int WIFEXITED (int STATUS)
+-     This macro returns a nonzero value if the child process terminated
+-     normally with `exit' or `_exit'.
+-
+- - Macro: int WEXITSTATUS (int STATUS)
+-     If `WIFEXITED' is true of STATUS, this macro returns the low-order
+-     8 bits of the exit status value from the child process.  *Note
+-     Exit Status::.
+-
+- - Macro: int WIFSIGNALED (int STATUS)
+-     This macro returns a nonzero value if the child process terminated
+-     because it received a signal that was not handled.  *Note Signal
+-     Handling::.
+-
+- - Macro: int WTERMSIG (int STATUS)
+-     If `WIFSIGNALED' is true of STATUS, this macro returns the signal
+-     number of the signal that terminated the child process.
+-
+- - Macro: int WCOREDUMP (int STATUS)
+-     This macro returns a nonzero value if the child process terminated
+-     and produced a core dump.
+-
+- - Macro: int WIFSTOPPED (int STATUS)
+-     This macro returns a nonzero value if the child process is stopped.
+-
+- - Macro: int WSTOPSIG (int STATUS)
+-     If `WIFSTOPPED' is true of STATUS, this macro returns the signal
+-     number of the signal that caused the child process to stop.
+-
+-
+-File: libc.info,  Node: BSD Wait Functions,  Next: Process Creation Example,  Prev: Process Completion Status,  Up: Processes
+-
+-BSD Process Wait Functions
+-==========================
+-
+-   The GNU library also provides these related facilities for
+-compatibility with BSD Unix.  BSD uses the `union wait' data type to
+-represent status values rather than an `int'.  The two representations
+-are actually interchangeable; they describe the same bit patterns.  The
+-GNU C Library defines macros such as `WEXITSTATUS' so that they will
+-work on either kind of object, and the `wait' function is defined to
+-accept either type of pointer as its STATUS-PTR argument.
+-
+-   These functions are declared in `sys/wait.h'.
+-
+- - Data Type: union wait
+-     This data type represents program termination status values.  It
+-     has the following members:
+-
+-    `int w_termsig'
+-          The value of this member is the same as that of the
+-          `WTERMSIG' macro.
+-
+-    `int w_coredump'
+-          The value of this member is the same as that of the
+-          `WCOREDUMP' macro.
+-
+-    `int w_retcode'
+-          The value of this member is the same as that of the
+-          `WEXITSTATUS' macro.
+-
+-    `int w_stopsig'
+-          The value of this member is the same as that of the
+-          `WSTOPSIG' macro.
+-
+-     Instead of accessing these members directly, you should use the
+-     equivalent macros.
+-
+-   The `wait3' function is the predecessor to `wait4', which is more
+-flexible.  `wait3' is now obsolete.
+-
+- - Function: pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct
+-          rusage *USAGE)
+-     If USAGE is a null pointer, `wait3' is equivalent to `waitpid (-1,
+-     STATUS-PTR, OPTIONS)'.
+-
+-     If USAGE is not null, `wait3' stores usage figures for the child
+-     process in `*RUSAGE' (but only if the child has terminated, not if
+-     it has stopped).  *Note Resource Usage::.
+-
+-
+-File: libc.info,  Node: Process Creation Example,  Prev: BSD Wait Functions,  Up: Processes
+-
+-Process Creation Example
+-========================
+-
+-   Here is an example program showing how you might write a function
+-similar to the built-in `system'.  It executes its COMMAND argument
+-using the equivalent of `sh -c COMMAND'.
+-
+-     #include <stddef.h>
+-     #include <stdlib.h>
+-     #include <unistd.h>
+-     #include <sys/types.h>
+-     #include <sys/wait.h>
+-     
+-     /* Execute the command using this shell program.  */
+-     #define SHELL "/bin/sh"
+-     int
+-     my_system (const char *command)
+-     {
+-       int status;
+-       pid_t pid;
+-     
+-       pid = fork ();
+-       if (pid == 0)
+-         {
+-           /* This is the child process.  Execute the shell command. */
+-           execl (SHELL, SHELL, "-c", command, NULL);
+-           _exit (EXIT_FAILURE);
+-         }
+-       else if (pid < 0)
+-         /* The fork failed.  Report failure.  */
+-         status = -1;
+-       else
+-         /* This is the parent process.  Wait for the child to complete.  */
+-         if (waitpid (pid, &status, 0) != pid)
+-           status = -1;
+-       return status;
+-     }
+-
+-   There are a couple of things you should pay attention to in this
+-example.
+-
+-   Remember that the first `argv' argument supplied to the program
+-represents the name of the program being executed.  That is why, in the
+-call to `execl', `SHELL' is supplied once to name the program to
+-execute and a second time to supply a value for `argv[0]'.
+-
+-   The `execl' call in the child process doesn't return if it is
+-successful.  If it fails, you must do something to make the child
+-process terminate.  Just returning a bad status code with `return'
+-would leave two processes running the original program.  Instead, the
+-right behavior is for the child process to report failure to its parent
+-process.
+-
+-   Call `_exit' to accomplish this.  The reason for using `_exit'
+-instead of `exit' is to avoid flushing fully buffered streams such as
+-`stdout'.  The buffers of these streams probably contain data that was
+-copied from the parent process by the `fork', data that will be output
+-eventually by the parent process.  Calling `exit' in the child would
+-output the data twice.  *Note Termination Internals::.
+-
+-
+-File: libc.info,  Node: Job Control,  Next: Name Service Switch,  Prev: Processes,  Up: Top
+-
+-Job Control
+-***********
+-
+-   "Job control" refers to the protocol for allowing a user to move
+-between multiple "process groups" (or "jobs") within a single "login
+-session".  The job control facilities are set up so that appropriate
+-behavior for most programs happens automatically and they need not do
+-anything special about job control.  So you can probably ignore the
+-material in this chapter unless you are writing a shell or login
+-program.
+-
+-   You need to be familiar with concepts relating to process creation
+-(*note Process Creation Concepts::.) and signal handling (*note Signal
+-Handling::.) in order to understand this material presented in this
+-chapter.
+-
+-* Menu:
+-
+-* Concepts of Job Control::     Jobs can be controlled by a shell.
+-* Job Control is Optional::     Not all POSIX systems support job control.
+-* Controlling Terminal::        How a process gets its controlling terminal.
+-* Access to the Terminal::      How processes share the controlling terminal.
+-* Orphaned Process Groups::     Jobs left after the user logs out.
+-* Implementing a Shell::        What a shell must do to implement job control.
+-* Functions for Job Control::   Functions to control process groups.
+-
+-
+-File: libc.info,  Node: Concepts of Job Control,  Next: Job Control is Optional,  Up: Job Control
+-
+-Concepts of Job Control
+-=======================
+-
+-   The fundamental purpose of an interactive shell is to read commands
+-from the user's terminal and create processes to execute the programs
+-specified by those commands.  It can do this using the `fork' (*note
+-Creating a Process::.) and `exec' (*note Executing a File::.) functions.
+-
+-   A single command may run just one process--but often one command uses
+-several processes.  If you use the `|' operator in a shell command, you
+-explicitly request several programs in their own processes.  But even
+-if you run just one program, it can use multiple processes internally.
+-For example, a single compilation command such as `cc -c foo.c'
+-typically uses four processes (though normally only two at any given
+-time).  If you run `make', its job is to run other programs in separate
+-processes.
+-
+-   The processes belonging to a single command are called a "process
+-group" or "job".  This is so that you can operate on all of them at
+-once.  For example, typing `C-c' sends the signal `SIGINT' to terminate
+-all the processes in the foreground process group.
+-
+-   A "session" is a larger group of processes.  Normally all the
+-processes that stem from a single login belong to the same session.
+-
+-   Every process belongs to a process group.  When a process is
+-created, it becomes a member of the same process group and session as
+-its parent process.  You can put it in another process group using the
+-`setpgid' function, provided the process group belongs to the same
+-session.
+-
+-   The only way to put a process in a different session is to make it
+-the initial process of a new session, or a "session leader", using the
+-`setsid' function.  This also puts the session leader into a new
+-process group, and you can't move it out of that process group again.
+-
+-   Usually, new sessions are created by the system login program, and
+-the session leader is the process running the user's login shell.
+-
+-   A shell that supports job control must arrange to control which job
+-can use the terminal at any time.  Otherwise there might be multiple
+-jobs trying to read from the terminal at once, and confusion about which
+-process should receive the input typed by the user.  To prevent this,
+-the shell must cooperate with the terminal driver using the protocol
+-described in this chapter.
+-
+-   The shell can give unlimited access to the controlling terminal to
+-only one process group at a time.  This is called the "foreground job"
+-on that controlling terminal.  Other process groups managed by the shell
+-that are executing without such access to the terminal are called
+-"background jobs".
+-
+-   If a background job needs to read from its controlling terminal, it
+-is "stopped" by the terminal driver; if the `TOSTOP' mode is set,
+-likewise for writing.  The user can stop a foreground job by typing the
+-SUSP character (*note Special Characters::.) and a program can stop any
+-job by sending it a `SIGSTOP' signal.  It's the responsibility of the
+-shell to notice when jobs stop, to notify the user about them, and to
+-provide mechanisms for allowing the user to interactively continue
+-stopped jobs and switch jobs between foreground and background.
+-
+-   *Note Access to the Terminal::, for more information about I/O to the
+-controlling terminal,
+-
+-
+-File: libc.info,  Node: Job Control is Optional,  Next: Controlling Terminal,  Prev: Concepts of Job Control,  Up: Job Control
+-
+-Job Control is Optional
+-=======================
+-
+-   Not all operating systems support job control.  The GNU system does
+-support job control, but if you are using the GNU library on some other
+-system, that system may not support job control itself.
+-
+-   You can use the `_POSIX_JOB_CONTROL' macro to test at compile-time
+-whether the system supports job control.  *Note System Options::.
+-
+-   If job control is not supported, then there can be only one process
+-group per session, which behaves as if it were always in the foreground.
+-The functions for creating additional process groups simply fail with
+-the error code `ENOSYS'.
+-
+-   The macros naming the various job control signals (*note Job Control
+-Signals::.) are defined even if job control is not supported.  However,
+-the system never generates these signals, and attempts to send a job
+-control signal or examine or specify their actions report errors or do
+-nothing.
+-
+-
+-File: libc.info,  Node: Controlling Terminal,  Next: Access to the Terminal,  Prev: Job Control is Optional,  Up: Job Control
+-
+-Controlling Terminal of a Process
+-=================================
+-
+-   One of the attributes of a process is its controlling terminal.
+-Child processes created with `fork' inherit the controlling terminal
+-from their parent process.  In this way, all the processes in a session
+-inherit the controlling terminal from the session leader.  A session
+-leader that has control of a terminal is called the "controlling
+-process" of that terminal.
+-
+-   You generally do not need to worry about the exact mechanism used to
+-allocate a controlling terminal to a session, since it is done for you
+-by the system when you log in.
+-
+-   An individual process disconnects from its controlling terminal when
+-it calls `setsid' to become the leader of a new session.  *Note Process
+-Group Functions::.
+-
+-
+-File: libc.info,  Node: Access to the Terminal,  Next: Orphaned Process Groups,  Prev: Controlling Terminal,  Up: Job Control
+-
+-Access to the Controlling Terminal
+-==================================
+-
+-   Processes in the foreground job of a controlling terminal have
+-unrestricted access to that terminal; background processes do not.  This
+-section describes in more detail what happens when a process in a
+-background job tries to access its controlling terminal.
+-
+-   When a process in a background job tries to read from its controlling
+-terminal, the process group is usually sent a `SIGTTIN' signal.  This
+-normally causes all of the processes in that group to stop (unless they
+-handle the signal and don't stop themselves).  However, if the reading
+-process is ignoring or blocking this signal, then `read' fails with an
+-`EIO' error instead.
+-
+-   Similarly, when a process in a background job tries to write to its
+-controlling terminal, the default behavior is to send a `SIGTTOU'
+-signal to the process group.  However, the behavior is modified by the
+-`TOSTOP' bit of the local modes flags (*note Local Modes::.).  If this
+-bit is not set (which is the default), then writing to the controlling
+-terminal is always permitted without sending a signal.  Writing is also
+-permitted if the `SIGTTOU' signal is being ignored or blocked by the
+-writing process.
+-
+-   Most other terminal operations that a program can do are treated as
+-reading or as writing.  (The description of each operation should say
+-which.)
+-
+-   For more information about the primitive `read' and `write'
+-functions, see *Note I/O Primitives::.
+-
+-
+-File: libc.info,  Node: Orphaned Process Groups,  Next: Implementing a Shell,  Prev: Access to the Terminal,  Up: Job Control
+-
+-Orphaned Process Groups
+-=======================
+-
+-   When a controlling process terminates, its terminal becomes free and
+-a new session can be established on it.  (In fact, another user could
+-log in on the terminal.)  This could cause a problem if any processes
+-from the old session are still trying to use that terminal.
+-
+-   To prevent problems, process groups that continue running even after
+-the session leader has terminated are marked as "orphaned process
+-groups".
+-
+-   When a process group becomes an orphan, its processes are sent a
+-`SIGHUP' signal.  Ordinarily, this causes the processes to terminate.
+-However, if a program ignores this signal or establishes a handler for
+-it (*note Signal Handling::.), it can continue running as in the orphan
+-process group even after its controlling process terminates; but it
+-still cannot access the terminal any more.
+-
+-
+-File: libc.info,  Node: Implementing a Shell,  Next: Functions for Job Control,  Prev: Orphaned Process Groups,  Up: Job Control
+-
+-Implementing a Job Control Shell
+-================================
+-
+-   This section describes what a shell must do to implement job
+-control, by presenting an extensive sample program to illustrate the
+-concepts involved.
+-
+-* Menu:
+-
+-* Data Structures::             Introduction to the sample shell.
+-* Initializing the Shell::      What the shell must do to take
+-				 responsibility for job control.
+-* Launching Jobs::              Creating jobs to execute commands.
+-* Foreground and Background::   Putting a job in foreground of background.
+-* Stopped and Terminated Jobs::  Reporting job status.
+-* Continuing Stopped Jobs::     How to continue a stopped job in
+-				 the foreground or background.
+-* Missing Pieces::              Other parts of the shell.
+-
+-
+-File: libc.info,  Node: Data Structures,  Next: Initializing the Shell,  Up: Implementing a Shell
+-
+-Data Structures for the Shell
+------------------------------
+-
+-   All of the program examples included in this chapter are part of a
+-simple shell program.  This section presents data structures and
+-utility functions which are used throughout the example.
+-
+-   The sample shell deals mainly with two data structures.  The `job'
+-type contains information about a job, which is a set of subprocesses
+-linked together with pipes.  The `process' type holds information about
+-a single subprocess.  Here are the relevant data structure declarations:
+-
+-     /* A process is a single process.  */
+-     typedef struct process
+-     {
+-       struct process *next;       /* next process in pipeline */
+-       char **argv;                /* for exec */
+-       pid_t pid;                  /* process ID */
+-       char completed;             /* true if process has completed */
+-       char stopped;               /* true if process has stopped */
+-       int status;                 /* reported status value */
+-     } process;
+-
+-     /* A job is a pipeline of processes.  */
+-     typedef struct job
+-     {
+-       struct job *next;           /* next active job */
+-       char *command;              /* command line, used for messages */
+-       process *first_process;     /* list of processes in this job */
+-       pid_t pgid;                 /* process group ID */
+-       char notified;              /* true if user told about stopped job */
+-       struct termios tmodes;      /* saved terminal modes */
+-       int stdin, stdout, stderr;  /* standard i/o channels */
+-     } job;
+-     
+-     /* The active jobs are linked into a list.  This is its head.   */
+-     job *first_job = NULL;
+-
+-   Here are some utility functions that are used for operating on `job'
+-objects.
+-
+-     /* Find the active job with the indicated PGID.  */
+-     job *
+-     find_job (pid_t pgid)
+-     {
+-       job *j;
+-     
+-       for (j = first_job; j; j = j->next)
+-         if (j->pgid == pgid)
+-           return j;
+-       return NULL;
+-     }
+-
+-     /* Return true if all processes in the job have stopped or completed.  */
+-     int
+-     job_is_stopped (job *j)
+-     {
+-       process *p;
+-     
+-       for (p = j->first_process; p; p = p->next)
+-         if (!p->completed && !p->stopped)
+-           return 0;
+-       return 1;
+-     }
+-
+-     /* Return true if all processes in the job have completed.  */
+-     int
+-     job_is_completed (job *j)
+-     {
+-       process *p;
+-     
+-       for (p = j->first_process; p; p = p->next)
+-         if (!p->completed)
+-           return 0;
+-       return 1;
+-     }
+-
+-
+-File: libc.info,  Node: Initializing the Shell,  Next: Launching Jobs,  Prev: Data Structures,  Up: Implementing a Shell
+-
+-Initializing the Shell
+-----------------------
+-
+-   When a shell program that normally performs job control is started,
+-it has to be careful in case it has been invoked from another shell
+-that is already doing its own job control.
+-
+-   A subshell that runs interactively has to ensure that it has been
+-placed in the foreground by its parent shell before it can enable job
+-control itself.  It does this by getting its initial process group ID
+-with the `getpgrp' function, and comparing it to the process group ID
+-of the current foreground job associated with its controlling terminal
+-(which can be retrieved using the `tcgetpgrp' function).
+-
+-   If the subshell is not running as a foreground job, it must stop
+-itself by sending a `SIGTTIN' signal to its own process group.  It may
+-not arbitrarily put itself into the foreground; it must wait for the
+-user to tell the parent shell to do this.  If the subshell is continued
+-again, it should repeat the check and stop itself again if it is still
+-not in the foreground.
+-
+-   Once the subshell has been placed into the foreground by its parent
+-shell, it can enable its own job control.  It does this by calling
+-`setpgid' to put itself into its own process group, and then calling
+-`tcsetpgrp' to place this process group into the foreground.
+-
+-   When a shell enables job control, it should set itself to ignore all
+-the job control stop signals so that it doesn't accidentally stop
+-itself.  You can do this by setting the action for all the stop signals
+-to `SIG_IGN'.
+-
+-   A subshell that runs non-interactively cannot and should not support
+-job control.  It must leave all processes it creates in the same process
+-group as the shell itself; this allows the non-interactive shell and its
+-child processes to be treated as a single job by the parent shell.  This
+-is easy to do--just don't use any of the job control primitives--but
+-you must remember to make the shell do it.
+-
+-   Here is the initialization code for the sample shell that shows how
+-to do all of this.
+-
+-     /* Keep track of attributes of the shell.  */
+-     
+-     #include <sys/types.h>
+-     #include <termios.h>
+-     #include <unistd.h>
+-     
+-     pid_t shell_pgid;
+-     struct termios shell_tmodes;
+-     int shell_terminal;
+-     int shell_is_interactive;
+-     
+-     
+-     /* Make sure the shell is running interactively as the foreground job
+-        before proceeding. */
+-     
+-     void
+-     init_shell ()
+-     {
+-     
+-       /* See if we are running interactively.  */
+-       shell_terminal = STDIN_FILENO;
+-       shell_is_interactive = isatty (shell_terminal);
+-     
+-       if (shell_is_interactive)
+-         {
+-           /* Loop until we are in the foreground.  */
+-           while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ()))
+-             kill (- shell_pgid, SIGTTIN);
+-     
+-           /* Ignore interactive and job-control signals.  */
+-           signal (SIGINT, SIG_IGN);
+-           signal (SIGQUIT, SIG_IGN);
+-           signal (SIGTSTP, SIG_IGN);
+-           signal (SIGTTIN, SIG_IGN);
+-           signal (SIGTTOU, SIG_IGN);
+-           signal (SIGCHLD, SIG_IGN);
+-     
+-           /* Put ourselves in our own process group.  */
+-           shell_pgid = getpid ();
+-           if (setpgid (shell_pgid, shell_pgid) < 0)
+-             {
+-               perror ("Couldn't put the shell in its own process group");
+-               exit (1);
+-             }
+-     
+-           /* Grab control of the terminal.  */
+-           tcsetpgrp (shell_terminal, shell_pgid);
+-     
+-           /* Save default terminal attributes for shell.  */
+-           tcgetattr (shell_terminal, &shell_tmodes);
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Launching Jobs,  Next: Foreground and Background,  Prev: Initializing the Shell,  Up: Implementing a Shell
+-
+-Launching Jobs
+---------------
+-
+-   Once the shell has taken responsibility for performing job control on
+-its controlling terminal, it can launch jobs in response to commands
+-typed by the user.
+-
+-   To create the processes in a process group, you use the same `fork'
+-and `exec' functions described in *Note Process Creation Concepts::.
+-Since there are multiple child processes involved, though, things are a
+-little more complicated and you must be careful to do things in the
+-right order.  Otherwise, nasty race conditions can result.
+-
+-   You have two choices for how to structure the tree of parent-child
+-relationships among the processes.  You can either make all the
+-processes in the process group be children of the shell process, or you
+-can make one process in group be the ancestor of all the other processes
+-in that group.  The sample shell program presented in this chapter uses
+-the first approach because it makes bookkeeping somewhat simpler.
+-
+-   As each process is forked, it should put itself in the new process
+-group by calling `setpgid'; see *Note Process Group Functions::.  The
+-first process in the new group becomes its "process group leader", and
+-its process ID becomes the "process group ID" for the group.
+-
+-   The shell should also call `setpgid' to put each of its child
+-processes into the new process group.  This is because there is a
+-potential timing problem: each child process must be put in the process
+-group before it begins executing a new program, and the shell depends on
+-having all the child processes in the group before it continues
+-executing.  If both the child processes and the shell call `setpgid',
+-this ensures that the right things happen no matter which process gets
+-to it first.
+-
+-   If the job is being launched as a foreground job, the new process
+-group also needs to be put into the foreground on the controlling
+-terminal using `tcsetpgrp'.  Again, this should be done by the shell as
+-well as by each of its child processes, to avoid race conditions.
+-
+-   The next thing each child process should do is to reset its signal
+-actions.
+-
+-   During initialization, the shell process set itself to ignore job
+-control signals; see *Note Initializing the Shell::.  As a result, any
+-child processes it creates also ignore these signals by inheritance.
+-This is definitely undesirable, so each child process should explicitly
+-set the actions for these signals back to `SIG_DFL' just after it is
+-forked.
+-
+-   Since shells follow this convention, applications can assume that
+-they inherit the correct handling of these signals from the parent
+-process.  But every application has a responsibility not to mess up the
+-handling of stop signals.  Applications that disable the normal
+-interpretation of the SUSP character should provide some other
+-mechanism for the user to stop the job.  When the user invokes this
+-mechanism, the program should send a `SIGTSTP' signal to the process
+-group of the process, not just to the process itself.  *Note Signaling
+-Another Process::.
+-
+-   Finally, each child process should call `exec' in the normal way.
+-This is also the point at which redirection of the standard input and
+-output channels should be handled.  *Note Duplicating Descriptors::,
+-for an explanation of how to do this.
+-
+-   Here is the function from the sample shell program that is
+-responsible for launching a program.  The function is executed by each
+-child process immediately after it has been forked by the shell, and
+-never returns.
+-
+-     void
+-     launch_process (process *p, pid_t pgid,
+-                     int infile, int outfile, int errfile,
+-                     int foreground)
+-     {
+-       pid_t pid;
+-     
+-       if (shell_is_interactive)
+-         {
+-           /* Put the process into the process group and give the process group
+-              the terminal, if appropriate.
+-              This has to be done both by the shell and in the individual
+-              child processes because of potential race conditions.  */
+-           pid = getpid ();
+-           if (pgid == 0) pgid = pid;
+-           setpgid (pid, pgid);
+-           if (foreground)
+-             tcsetpgrp (shell_terminal, pgid);
+-     
+-           /* Set the handling for job control signals back to the default.  */
+-           signal (SIGINT, SIG_DFL);
+-           signal (SIGQUIT, SIG_DFL);
+-           signal (SIGTSTP, SIG_DFL);
+-           signal (SIGTTIN, SIG_DFL);
+-           signal (SIGTTOU, SIG_DFL);
+-           signal (SIGCHLD, SIG_DFL);
+-         }
+-     
+-       /* Set the standard input/output channels of the new process.  */
+-       if (infile != STDIN_FILENO)
+-         {
+-           dup2 (infile, STDIN_FILENO);
+-           close (infile);
+-         }
+-       if (outfile != STDOUT_FILENO)
+-         {
+-           dup2 (outfile, STDOUT_FILENO);
+-           close (outfile);
+-         }
+-       if (errfile != STDERR_FILENO)
+-         {
+-           dup2 (errfile, STDERR_FILENO);
+-           close (errfile);
+-         }
+-     
+-       /* Exec the new process.  Make sure we exit.  */
+-       execvp (p->argv[0], p->argv);
+-       perror ("execvp");
+-       exit (1);
+-     }
+-
+-   If the shell is not running interactively, this function does not do
+-anything with process groups or signals.  Remember that a shell not
+-performing job control must keep all of its subprocesses in the same
+-process group as the shell itself.
+-
+-   Next, here is the function that actually launches a complete job.
+-After creating the child processes, this function calls some other
+-functions to put the newly created job into the foreground or
+-background; these are discussed in *Note Foreground and Background::.
+-
+-     void
+-     launch_job (job *j, int foreground)
+-     {
+-       process *p;
+-       pid_t pid;
+-       int mypipe[2], infile, outfile;
+-     
+-       infile = j->stdin;
+-       for (p = j->first_process; p; p = p->next)
+-         {
+-           /* Set up pipes, if necessary.  */
+-           if (p->next)
+-             {
+-               if (pipe (mypipe) < 0)
+-                 {
+-                   perror ("pipe");
+-                   exit (1);
+-                 }
+-               outfile = mypipe[1];
+-             }
+-           else
+-             outfile = j->stdout;
+-     
+-           /* Fork the child processes.  */
+-           pid = fork ();
+-           if (pid == 0)
+-             /* This is the child process.  */
+-             launch_process (p, j->pgid, infile,
+-                             outfile, j->stderr, foreground);
+-           else if (pid < 0)
+-             {
+-               /* The fork failed.  */
+-               perror ("fork");
+-               exit (1);
+-             }
+-           else
+-             {
+-               /* This is the parent process.  */
+-               p->pid = pid;
+-               if (shell_is_interactive)
+-                 {
+-                   if (!j->pgid)
+-                     j->pgid = pid;
+-                   setpgid (pid, j->pgid);
+-                 }
+-             }
+-     
+-           /* Clean up after pipes.  */
+-           if (infile != j->stdin)
+-             close (infile);
+-           if (outfile != j->stdout)
+-             close (outfile);
+-           infile = mypipe[0];
+-         }
+-     
+-       format_job_info (j, "launched");
+-     
+-       if (!shell_is_interactive)
+-         wait_for_job (j);
+-       else if (foreground)
+-         put_job_in_foreground (j, 0);
+-       else
+-         put_job_in_background (j, 0);
+-     }
+-
+-
+-File: libc.info,  Node: Foreground and Background,  Next: Stopped and Terminated Jobs,  Prev: Launching Jobs,  Up: Implementing a Shell
+-
+-Foreground and Background
+--------------------------
+-
+-   Now let's consider what actions must be taken by the shell when it
+-launches a job into the foreground, and how this differs from what must
+-be done when a background job is launched.
+-
+-   When a foreground job is launched, the shell must first give it
+-access to the controlling terminal by calling `tcsetpgrp'.  Then, the
+-shell should wait for processes in that process group to terminate or
+-stop.  This is discussed in more detail in *Note Stopped and Terminated
+-Jobs::.
+-
+-   When all of the processes in the group have either completed or
+-stopped, the shell should regain control of the terminal for its own
+-process group by calling `tcsetpgrp' again.  Since stop signals caused
+-by I/O from a background process or a SUSP character typed by the user
+-are sent to the process group, normally all the processes in the job
+-stop together.
+-
+-   The foreground job may have left the terminal in a strange state, so
+-the shell should restore its own saved terminal modes before
+-continuing.  In case the job is merely been stopped, the shell should
+-first save the current terminal modes so that it can restore them later
+-if the job is continued.  The functions for dealing with terminal modes
+-are `tcgetattr' and `tcsetattr'; these are described in *Note Terminal
+-Modes::.
+-
+-   Here is the sample shell's function for doing all of this.
+-
+-     /* Put job J in the foreground.  If CONT is nonzero,
+-        restore the saved terminal modes and send the process group a
+-        `SIGCONT' signal to wake it up before we block.  */
+-     
+-     void
+-     put_job_in_foreground (job *j, int cont)
+-     {
+-       /* Put the job into the foreground.  */
+-       tcsetpgrp (shell_terminal, j->pgid);
+-
+-     /* Send the job a continue signal, if necessary.  */
+-       if (cont)
+-         {
+-           tcsetattr (shell_terminal, TCSADRAIN, &j->tmodes);
+-           if (kill (- j->pgid, SIGCONT) < 0)
+-             perror ("kill (SIGCONT)");
+-         }
+-     
+-       /* Wait for it to report.  */
+-       wait_for_job (j);
+-     
+-       /* Put the shell back in the foreground.  */
+-       tcsetpgrp (shell_terminal, shell_pgid);
+-     /* Restore the shell's terminal modes.  */
+-       tcgetattr (shell_terminal, &j->tmodes);
+-       tcsetattr (shell_terminal, TCSADRAIN, &shell_tmodes);
+-     }
+-
+-   If the process group is launched as a background job, the shell
+-should remain in the foreground itself and continue to read commands
+-from the terminal.
+-
+-   In the sample shell, there is not much that needs to be done to put
+-a job into the background.  Here is the function it uses:
+-
+-     /* Put a job in the background.  If the cont argument is true, send
+-        the process group a `SIGCONT' signal to wake it up.  */
+-     
+-     void
+-     put_job_in_background (job *j, int cont)
+-     {
+-       /* Send the job a continue signal, if necessary.  */
+-       if (cont)
+-         if (kill (-j->pgid, SIGCONT) < 0)
+-           perror ("kill (SIGCONT)");
+-     }
+-
+-
+-File: libc.info,  Node: Stopped and Terminated Jobs,  Next: Continuing Stopped Jobs,  Prev: Foreground and Background,  Up: Implementing a Shell
+-
+-Stopped and Terminated Jobs
+----------------------------
+-
+-   When a foreground process is launched, the shell must block until
+-all of the processes in that job have either terminated or stopped.  It
+-can do this by calling the `waitpid' function; see *Note Process
+-Completion::.  Use the `WUNTRACED' option so that status is reported
+-for processes that stop as well as processes that terminate.
+-
+-   The shell must also check on the status of background jobs so that it
+-can report terminated and stopped jobs to the user; this can be done by
+-calling `waitpid' with the `WNOHANG' option.  A good place to put a
+-such a check for terminated and stopped jobs is just before prompting
+-for a new command.
+-
+-   The shell can also receive asynchronous notification that there is
+-status information available for a child process by establishing a
+-handler for `SIGCHLD' signals.  *Note Signal Handling::.
+-
+-   In the sample shell program, the `SIGCHLD' signal is normally
+-ignored.  This is to avoid reentrancy problems involving the global data
+-structures the shell manipulates.  But at specific times when the shell
+-is not using these data structures--such as when it is waiting for
+-input on the terminal--it makes sense to enable a handler for
+-`SIGCHLD'.  The same function that is used to do the synchronous status
+-checks (`do_job_notification', in this case) can also be called from
+-within this handler.
+-
+-   Here are the parts of the sample shell program that deal with
+-checking the status of jobs and reporting the information to the user.
+-
+-     /* Store the status of the process PID that was returned by waitpid.
+-        Return 0 if all went well, nonzero otherwise.  */
+-     
+-     int
+-     mark_process_status (pid_t pid, int status)
+-     {
+-       job *j;
+-       process *p;
+-
+-     if (pid > 0)
+-         {
+-           /* Update the record for the process.  */
+-           for (j = first_job; j; j = j->next)
+-             for (p = j->first_process; p; p = p->next)
+-               if (p->pid == pid)
+-                 {
+-                   p->status = status;
+-                   if (WIFSTOPPED (status))
+-                     p->stopped = 1;
+-                   else
+-                     {
+-                       p->completed = 1;
+-                       if (WIFSIGNALED (status))
+-                         fprintf (stderr, "%d: Terminated by signal %d.\n",
+-                                  (int) pid, WTERMSIG (p->status));
+-                     }
+-                   return 0;
+-                  }
+-           fprintf (stderr, "No child process %d.\n", pid);
+-           return -1;
+-         }
+-
+-     else if (pid == 0 || errno == ECHILD)
+-         /* No processes ready to report.  */
+-         return -1;
+-       else {
+-         /* Other weird errors.  */
+-         perror ("waitpid");
+-         return -1;
+-       }
+-     }
+-
+-     /* Check for processes that have status information available,
+-        without blocking.  */
+-     
+-     void
+-     update_status (void)
+-     {
+-       int status;
+-       pid_t pid;
+-     
+-       do
+-         pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG);
+-       while (!mark_process_status (pid, status));
+-     }
+-
+-     /* Check for processes that have status information available,
+-        blocking until all processes in the given job have reported.  */
+-     
+-     void
+-     wait_for_job (job *j)
+-     {
+-       int status;
+-       pid_t pid;
+-     
+-       do
+-         pid = waitpid (WAIT_ANY, &status, WUNTRACED);
+-       while (!mark_process_status (pid, status)
+-              && !job_is_stopped (j)
+-              && !job_is_completed (j));
+-     }
+-
+-     /* Format information about job status for the user to look at.  */
+-     
+-     void
+-     format_job_info (job *j, const char *status)
+-     {
+-       fprintf (stderr, "%ld (%s): %s\n", (long)j->pgid, status, j->command);
+-     }
+-
+-     /* Notify the user about stopped or terminated jobs.
+-        Delete terminated jobs from the active job list.  */
+-     
+-     void
+-     do_job_notification (void)
+-     {
+-       job *j, *jlast, *jnext;
+-       process *p;
+-     
+-       /* Update status information for child processes.  */
+-       update_status ();
+-     
+-       jlast = NULL;
+-       for (j = first_job; j; j = jnext)
+-         {
+-           jnext = j->next;
+-     
+-           /* If all processes have completed, tell the user the job has
+-              completed and delete it from the list of active jobs.  */
+-           if (job_is_completed (j)) {
+-             format_job_info (j, "completed");
+-             if (jlast)
+-               jlast->next = jnext;
+-             else
+-               first_job = jnext;
+-             free_job (j);
+-           }
+-     
+-           /* Notify the user about stopped jobs,
+-              marking them so that we won't do this more than once.  */
+-           else if (job_is_stopped (j) && !j->notified) {
+-             format_job_info (j, "stopped");
+-             j->notified = 1;
+-             jlast = j;
+-           }
+-     
+-           /* Don't say anything about jobs that are still running.  */
+-           else
+-             jlast = j;
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Continuing Stopped Jobs,  Next: Missing Pieces,  Prev: Stopped and Terminated Jobs,  Up: Implementing a Shell
+-
+-Continuing Stopped Jobs
+------------------------
+-
+-   The shell can continue a stopped job by sending a `SIGCONT' signal
+-to its process group.  If the job is being continued in the foreground,
+-the shell should first invoke `tcsetpgrp' to give the job access to the
+-terminal, and restore the saved terminal settings.  After continuing a
+-job in the foreground, the shell should wait for the job to stop or
+-complete, as if the job had just been launched in the foreground.
+-
+-   The sample shell program handles both newly created and continued
+-jobs with the same pair of functions, `put_job_in_foreground' and
+-`put_job_in_background'.  The definitions of these functions were given
+-in *Note Foreground and Background::.  When continuing a stopped job, a
+-nonzero value is passed as the CONT argument to ensure that the
+-`SIGCONT' signal is sent and the terminal modes reset, as appropriate.
+-
+-   This leaves only a function for updating the shell's internal
+-bookkeeping about the job being continued:
+-
+-     /* Mark a stopped job J as being running again.  */
+-     
+-     void
+-     mark_job_as_running (job *j)
+-     {
+-       Process *p;
+-     
+-       for (p = j->first_process; p; p = p->next)
+-         p->stopped = 0;
+-       j->notified = 0;
+-     }
+-
+-     /* Continue the job J.  */
+-     
+-     void
+-     continue_job (job *j, int foreground)
+-     {
+-       mark_job_as_running (j);
+-       if (foreground)
+-         put_job_in_foreground (j, 1);
+-       else
+-         put_job_in_background (j, 1);
+-     }
+-
+-
+-File: libc.info,  Node: Missing Pieces,  Prev: Continuing Stopped Jobs,  Up: Implementing a Shell
+-
+-The Missing Pieces
+-------------------
+-
+-   The code extracts for the sample shell included in this chapter are
+-only a part of the entire shell program.  In particular, nothing at all
+-has been said about how `job' and `program' data structures are
+-allocated and initialized.
+-
+-   Most real shells provide a complex user interface that has support
+-for a command language; variables; abbreviations, substitutions, and
+-pattern matching on file names; and the like.  All of this is far too
+-complicated to explain here!  Instead, we have concentrated on showing
+-how to implement the core process creation and job control functions
+-that can be called from such a shell.
+-
+-   Here is a table summarizing the major entry points we have presented:
+-
+-`void init_shell (void)'
+-     Initialize the shell's internal state.  *Note Initializing the
+-     Shell::.
+-
+-`void launch_job (job *J, int FOREGROUND)'
+-     Launch the job J as either a foreground or background job.  *Note
+-     Launching Jobs::.
+-
+-`void do_job_notification (void)'
+-     Check for and report any jobs that have terminated or stopped.
+-     Can be called synchronously or within a handler for `SIGCHLD'
+-     signals.  *Note Stopped and Terminated Jobs::.
+-
+-`void continue_job (job *J, int FOREGROUND)'
+-     Continue the job J.  *Note Continuing Stopped Jobs::.
+-
+-   Of course, a real shell would also want to provide other functions
+-for managing jobs.  For example, it would be useful to have commands to
+-list all active jobs or to send a signal (such as `SIGKILL') to a job.
+-
+-
+-File: libc.info,  Node: Functions for Job Control,  Prev: Implementing a Shell,  Up: Job Control
+-
+-Functions for Job Control
+-=========================
+-
+-   This section contains detailed descriptions of the functions relating
+-to job control.
+-
+-* Menu:
+-
+-* Identifying the Terminal::    Determining the controlling terminal's name.
+-* Process Group Functions::     Functions for manipulating process groups.
+-* Terminal Access Functions::   Functions for controlling terminal access.
+-
+-
+-File: libc.info,  Node: Identifying the Terminal,  Next: Process Group Functions,  Up: Functions for Job Control
+-
+-Identifying the Controlling Terminal
+-------------------------------------
+-
+-   You can use the `ctermid' function to get a file name that you can
+-use to open the controlling terminal.  In the GNU library, it returns
+-the same string all the time: `"/dev/tty"'.  That is a special "magic"
+-file name that refers to the controlling terminal of the current
+-process (if it has one).  To find the name of the specific terminal
+-device, use `ttyname'; *note Is It a Terminal::..
+-
+-   The function `ctermid' is declared in the header file `stdio.h'.
+-
+- - Function: char * ctermid (char *STRING)
+-     The `ctermid' function returns a string containing the file name of
+-     the controlling terminal for the current process.  If STRING is
+-     not a null pointer, it should be an array that can hold at least
+-     `L_ctermid' characters; the string is returned in this array.
+-     Otherwise, a pointer to a string in a static area is returned,
+-     which might get overwritten on subsequent calls to this function.
+-
+-     An empty string is returned if the file name cannot be determined
+-     for any reason.  Even if a file name is returned, access to the
+-     file it represents is not guaranteed.
+-
+- - Macro: int L_ctermid
+-     The value of this macro is an integer constant expression that
+-     represents the size of a string large enough to hold the file name
+-     returned by `ctermid'.
+-
+-   See also the `isatty' and `ttyname' functions, in *Note Is It a
+-Terminal::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-38 glibc-2.1.3/manual/libc.info-38
+--- ../glibc-2.1.3/manual/libc.info-38	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-38	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1195 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Process Group Functions,  Next: Terminal Access Functions,  Prev: Identifying the Terminal,  Up: Functions for Job Control
+-
+-Process Group Functions
+------------------------
+-
+-   Here are descriptions of the functions for manipulating process
+-groups.  Your program should include the header files `sys/types.h' and
+-`unistd.h' to use these functions.
+-
+- - Function: pid_t setsid (void)
+-     The `setsid' function creates a new session.  The calling process
+-     becomes the session leader, and is put in a new process group whose
+-     process group ID is the same as the process ID of that process.
+-     There are initially no other processes in the new process group,
+-     and no other process groups in the new session.
+-
+-     This function also makes the calling process have no controlling
+-     terminal.
+-
+-     The `setsid' function returns the new process group ID of the
+-     calling process if successful.  A return value of `-1' indicates an
+-     error.  The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EPERM'
+-          The calling process is already a process group leader, or
+-          there is already another process group around that has the
+-          same process group ID.
+-
+- - Function: pid_t getsid (pid_t PID)
+-     The `getsid' function returns the process group ID of the session
+-     leader of the specified process.  If a PID is `0', the process
+-     group ID of the session leader of the current process is returned.
+-
+-     In case of error `-1' is returned and `errno' is set.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `ESRCH'
+-          There is no process with the given process ID PID.
+-
+-    `EPERM'
+-          The calling process and the process specified by PID are in
+-          different sessions, and the implementation doesn't allow to
+-          access the process group ID of the session leader of the
+-          process with ID PID from the calling process.
+-
+-   The `getpgrp' function has two definitions: one derived from BSD
+-Unix, and one from the POSIX.1 standard.  The feature test macros you
+-have selected (*note Feature Test Macros::.) determine which definition
+-you get.  Specifically, you get the BSD version if you define
+-`_BSD_SOURCE'; otherwise, you get the POSIX version if you define
+-`_POSIX_SOURCE' or `_GNU_SOURCE'.  Programs written for old BSD systems
+-will not include `unistd.h', which defines `getpgrp' specially under
+-`_BSD_SOURCE'.  You must link such programs with the `-lbsd-compat'
+-option to get the BSD definition.
+-
+- - POSIX.1 Function: pid_t getpgrp (void)
+-     The POSIX.1 definition of `getpgrp' returns the process group ID of
+-     the calling process.
+-
+- - BSD Function: pid_t getpgrp (pid_t PID)
+-     The BSD definition of `getpgrp' returns the process group ID of the
+-     process PID.  You can supply a value of `0' for the PID argument
+-     to get information about the calling process.
+-
+- - System V Function: int getpgid (pid_t PID)
+-     `getpgid' is the same as the BSD function `getpgrp'.  It returns
+-     the process group ID of the process PID.  You can supply a value
+-     of `0' for the PID argument to get information about the calling
+-     process.
+-
+-     In case of error `-1' is returned and `errno' is set.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `ESRCH'
+-          There is no process with the given process ID PID.  The
+-          calling process and the process specified by PID are in
+-          different sessions, and the implementation doesn't allow to
+-          access the process group ID of the process with ID PID from
+-          the calling process.
+-
+- - Function: int setpgid (pid_t PID, pid_t PGID)
+-     The `setpgid' function puts the process PID into the process group
+-     PGID.  As a special case, either PID or PGID can be zero to
+-     indicate the process ID of the calling process.
+-
+-     This function fails on a system that does not support job control.
+-     *Note Job Control is Optional::, for more information.
+-
+-     If the operation is successful, `setpgid' returns zero.  Otherwise
+-     it returns `-1'.  The following `errno' error conditions are
+-     defined for this function:
+-
+-    `EACCES'
+-          The child process named by PID has executed an `exec'
+-          function since it was forked.
+-
+-    `EINVAL'
+-          The value of the PGID is not valid.
+-
+-    `ENOSYS'
+-          The system doesn't support job control.
+-
+-    `EPERM'
+-          The process indicated by the PID argument is a session leader,
+-          or is not in the same session as the calling process, or the
+-          value of the PGID argument doesn't match a process group ID
+-          in the same session as the calling process.
+-
+-    `ESRCH'
+-          The process indicated by the PID argument is not the calling
+-          process or a child of the calling process.
+-
+- - Function: int setpgrp (pid_t PID, pid_t PGID)
+-     This is the BSD Unix name for `setpgid'.  Both functions do exactly
+-     the same thing.
+-
+-
+-File: libc.info,  Node: Terminal Access Functions,  Prev: Process Group Functions,  Up: Functions for Job Control
+-
+-Functions for Controlling Terminal Access
+------------------------------------------
+-
+-   These are the functions for reading or setting the foreground
+-process group of a terminal.  You should include the header files
+-`sys/types.h' and `unistd.h' in your application to use these functions.
+-
+-   Although these functions take a file descriptor argument to specify
+-the terminal device, the foreground job is associated with the terminal
+-file itself and not a particular open file descriptor.
+-
+- - Function: pid_t tcgetpgrp (int FILEDES)
+-     This function returns the process group ID of the foreground
+-     process group associated with the terminal open on descriptor
+-     FILEDES.
+-
+-     If there is no foreground process group, the return value is a
+-     number greater than `1' that does not match the process group ID
+-     of any existing process group.  This can happen if all of the
+-     processes in the job that was formerly the foreground job have
+-     terminated, and no other job has yet been moved into the
+-     foreground.
+-
+-     In case of an error, a value of `-1' is returned.  The following
+-     `errno' error conditions are defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENOSYS'
+-          The system doesn't support job control.
+-
+-    `ENOTTY'
+-          The terminal file associated with the FILEDES argument isn't
+-          the controlling terminal of the calling process.
+-
+- - Function: int tcsetpgrp (int FILEDES, pid_t PGID)
+-     This function is used to set a terminal's foreground process group
+-     ID.  The argument FILEDES is a descriptor which specifies the
+-     terminal; PGID specifies the process group.  The calling process
+-     must be a member of the same session as PGID and must have the same
+-     controlling terminal.
+-
+-     For terminal access purposes, this function is treated as output.
+-     If it is called from a background process on its controlling
+-     terminal, normally all processes in the process group are sent a
+-     `SIGTTOU' signal.  The exception is if the calling process itself
+-     is ignoring or blocking `SIGTTOU' signals, in which case the
+-     operation is performed and no signal is sent.
+-
+-     If successful, `tcsetpgrp' returns `0'.  A return value of `-1'
+-     indicates an error.  The following `errno' error conditions are
+-     defined for this function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The PGID argument is not valid.
+-
+-    `ENOSYS'
+-          The system doesn't support job control.
+-
+-    `ENOTTY'
+-          The FILEDES isn't the controlling terminal of the calling
+-          process.
+-
+-    `EPERM'
+-          The PGID isn't a process group in the same session as the
+-          calling process.
+-
+- - Function: pid_t tcgetsid (int FILDES)
+-     This function is used to obtain the process group ID of the session
+-     for which terminal specified by FILDES is the controlling terminal.
+-     If the call is successful the group ID is returned.  Otherwise the
+-     return value is `(pid_t) -1' and the global variable ERRNO is set
+-     to the following value:
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `ENOTTY'
+-          The calling process does not have a controlling terminal, or
+-          the file ins not the controlling terminal.
+-
+-
+-File: libc.info,  Node: Name Service Switch,  Next: Users and Groups,  Prev: Job Control,  Up: Top
+-
+-System Databases and Name Service Switch
+-****************************************
+-
+-   Various functions in the C Library need to be configured to work
+-correctly in the local environment.  Traditionally, this was done by
+-using files (e.g., `/etc/passwd'), but other nameservices (like the
+-Network Information Service (NIS) and the Domain Name Service (DNS))
+-became popular, and were hacked into the C library, usually with a fixed
+-search order (*note frobnicate: (jargon)frobnicate.).
+-
+-   The GNU C Library contains a cleaner solution of this problem.  It is
+-designed after a method used by Sun Microsystems in the C library of
+-Solaris 2.  GNU C Library follows their name and calls this scheme
+-"Name Service Switch" (NSS).
+-
+-   Though the interface might be similar to Sun's version there is no
+-common code.  We never saw any source code of Sun's implementation and
+-so the internal interface is incompatible.  This also manifests in the
+-file names we use as we will see later.
+-
+-* Menu:
+-
+-* NSS Basics::                  What is this NSS good for.
+-* NSS Configuration File::      Configuring NSS.
+-* NSS Module Internals::        How does it work internally.
+-* Extending NSS::               What to do to add services or databases.
+-
+-
+-File: libc.info,  Node: NSS Basics,  Next: NSS Configuration File,  Prev: Name Service Switch,  Up: Name Service Switch
+-
+-NSS Basics
+-==========
+-
+-   The basic idea is to put the implementation of the different services
+-offered to access the databases in separate modules.  This has some
+-advantages:
+-
+-  1. Contributors can add new services without adding them to GNU C
+-     Library.
+-
+-  2. The modules can be updated separately.
+-
+-  3. The C library image is smaller.
+-
+-   To fulfill the first goal above the ABI of the modules will be
+-described below.  For getting the implementation of a new service right
+-it is important to understand how the functions in the modules get
+-called.  They are in no way designed to be used by the programmer
+-directly.  Instead the programmer should only use the documented and
+-standardized functions to access the databases.
+-
+-The databases available in the NSS are
+-
+-`aliases'
+-     Mail aliases
+-
+-`ethers'
+-     Ethernet numbers,
+-
+-`group'
+-     Groups of users, *note Group Database::..
+-
+-`hosts'
+-     Host names and numbers, *note Host Names::..
+-
+-`netgroup'
+-     Network wide list of host and users, *note Netgroup Database::..
+-
+-`networks'
+-     Network names and numbers, *note Networks Database::..
+-
+-`protocols'
+-     Network protocols, *note Protocols Database::..
+-
+-`passwd'
+-     User passwords, *note User Database::..
+-
+-`rpc'
+-     Remote procedure call names and numbers,
+-
+-`services'
+-     Network services, *note Services Database::..
+-
+-`shadow'
+-     Shadow user passwords,
+-
+-There will be some more added later (`automount', `bootparams',
+-`netmasks', and `publickey').
+-
+-
+-File: libc.info,  Node: NSS Configuration File,  Next: NSS Module Internals,  Prev: NSS Basics,  Up: Name Service Switch
+-
+-The NSS Configuration File
+-==========================
+-
+-   Somehow the NSS code must be told about the wishes of the user.  For
+-this reason there is the file `/etc/nsswitch.conf'.  For each database
+-this file contain a specification how the lookup process should work.
+-The file could look like this:
+-
+-     # /etc/nsswitch.conf
+-     #
+-     # Name Service Switch configuration file.
+-     #
+-     
+-     passwd:     db files nis
+-     shadow:     files
+-     group:      db files nis
+-     
+-     hosts:      files nisplus nis dns
+-     networks:   nisplus [NOTFOUND=return] files
+-     
+-     ethers:     nisplus [NOTFOUND=return] db files
+-     protocols:  nisplus [NOTFOUND=return] db files
+-     rpc:        nisplus [NOTFOUND=return] db files
+-     services:   nisplus [NOTFOUND=return] db files
+-
+-   The first column is the database as you can guess from the table
+-above.  The rest of the line specifies how the lookup process works.
+-Please note that you specify the way it works for each database
+-individually.  This cannot be done with the old way of a monolithic
+-implementation.
+-
+-   The configuration specification for each database can contain two
+-different items:
+-
+-   * the service specification like `files', `db', or `nis'.
+-
+-   * the reaction on lookup result like `[NOTFOUND=return]'.
+-
+-* Menu:
+-
+-* Services in the NSS configuration::  Service names in the NSS configuration.
+-* Actions in the NSS configuration::  React appropriately to the lookup result.
+-* Notes on NSS Configuration File::  Things to take care about while
+-                                     configuring NSS.
+-
+-
+-File: libc.info,  Node: Services in the NSS configuration,  Next: Actions in the NSS configuration,  Prev: NSS Configuration File,  Up: NSS Configuration File
+-
+-Services in the NSS configuration File
+---------------------------------------
+-
+-   The above example file mentions four different services: `files',
+-`db', `nis', and `nisplus'.  This does not mean these services are
+-available on all sites and it does also not mean these are all the
+-services which will ever be available.
+-
+-   In fact, these names are simply strings which the NSS code uses to
+-find the implicitly addressed functions.  The internal interface will be
+-described later.  Visible to the user are the modules which implement an
+-individual service.
+-
+-   Assume the service NAME shall be used for a lookup.  The code for
+-this service is implemented in a module called `libnss_NAME'.  On a
+-system supporting shared libraries this is in fact a shared library
+-with the name (for example) `libnss_NAME.so.2'.  The number at the end
+-is the currently used version of the interface which will not change
+-frequently.  Normally the user should not have to be cognizant of these
+-files since they should be placed in a directory where they are found
+-automatically.  Only the names of all available services are important.
+-
+-
+-File: libc.info,  Node: Actions in the NSS configuration,  Next: Notes on NSS Configuration File,  Prev: Services in the NSS configuration,  Up: NSS Configuration File
+-
+-Actions in the NSS configuration
+---------------------------------
+-
+-   The second item in the specification gives the user much finer
+-control on the lookup process.  Action items are placed between two
+-service names and are written within brackets.  The general form is
+-
+-     `[' ( `!'? STATUS `=' ACTION )+ `]'
+-
+-where
+-
+-     STATUS => success | notfound | unavail | tryagain
+-     ACTION => return | continue
+-
+-   The case of the keywords is insignificant.  The STATUS values are
+-the results of a call to a lookup function of a specific service.  They
+-mean
+-
+-`success'
+-     No error occurred and the wanted entry is returned.  The default
+-     action for this is `return'.
+-
+-`notfound'
+-     The lookup process works ok but the needed value was not found.
+-     The default action is `continue'.
+-
+-`unavail'
+-     The service is permanently unavailable.  This can either mean the
+-     needed file is not available, or, for DNS, the server is not
+-     available or does not allow queries.  The default action is
+-     `continue'.
+-
+-`tryagain'
+-     The service is temporarily unavailable.  This could mean a file is
+-     locked or a server currently cannot accept more connections.  The
+-     default action is `continue'.
+-
+-If we have a line like
+-
+-     ethers: nisplus [NOTFOUND=return] db files
+-
+-this is equivalent to
+-
+-     ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
+-                      TRYAGAIN=continue]
+-             db      [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
+-                      TRYAGAIN=continue]
+-             files
+-
+-(except that it would have to be written on one line).  The default
+-value for the actions are normally what you want, and only need to be
+-changed in exceptional cases.
+-
+-   If the optional `!' is placed before the STATUS this means the
+-following action is used for all statuses but STATUS itself.  I.e., `!'
+-is negation as in the C language (and others).
+-
+-   Before we explain the exception which makes this action item
+-necessary one more remark: obviously it makes no sense to add another
+-action item after the `files' service.  Since there is no other service
+-following the action *always* is `return'.
+-
+-   Now, why is this `[NOTFOUND=return]' action useful?  To understand
+-this we should know that the `nisplus' service is often complete; i.e.,
+-if an entry is not available in the NIS+ tables it is not available
+-anywhere else.  This is what is expressed by this action item: it is
+-useless to examine further services since they will not give us a
+-result.
+-
+-   The situation would be different if the NIS+ service is not available
+-because the machine is booting.  In this case the return value of the
+-lookup function is not `notfound' but instead `unavail'.  And as you
+-can see in the complete form above: in this situation the `db' and
+-`files' services are used.  Neat, isn't it?  The system administrator
+-need not pay special care for the time the system is not completely
+-ready to work (while booting or shutdown or network problems).
+-
+-
+-File: libc.info,  Node: Notes on NSS Configuration File,  Prev: Actions in the NSS configuration,  Up: NSS Configuration File
+-
+-Notes on the NSS Configuration File
+------------------------------------
+-
+-   Finally a few more hints.  The NSS implementation is not completely
+-helpless if `/etc/nsswitch.conf' does not exist.  For all supported
+-databases there is a default value so it should normally be possible to
+-get the system running even if the file is corrupted or missing.
+-
+-   For the `hosts' and `networks' databases the default value is `dns
+-[!UNAVAIL=return] files'.  I.e., the system is prepared for the DNS
+-service not to be available but if it is available the answer it
+-returns is ultimative.
+-
+-   The `passwd', `group', and `shadow' databases are traditionally
+-handled in a special way.  The appropriate files in the `/etc'
+-directory are read but if an entry with a name starting with a `+'
+-character is found NIS is used.  This kind of lookup remains possible
+-by using the special lookup service `compat' and the default value for
+-the three databases above is `compat [NOTFOUND=return] files'.
+-
+-   For all other databases the default value is `nis [NOTFOUND=return]
+-files'.  This solution give the best chance to be correct since NIS and
+-file based lookup is used.
+-
+-   A second point is that the user should try to optimize the lookup
+-process.  The different service have different response times.  A
+-simple file look up on a local file could be fast, but if the file is
+-long and the needed entry is near the end of the file this may take
+-quite some time.  In this case it might be better to use the `db'
+-service which allows fast local access to large data sets.
+-
+-   Often the situation is that some global information like NIS must be
+-used.  So it is unavoidable to use service entries like `nis' etc.  But
+-one should avoid slow services like this if possible.
+-
+-
+-File: libc.info,  Node: NSS Module Internals,  Next: Extending NSS,  Prev: NSS Configuration File,  Up: Name Service Switch
+-
+-NSS Module Internals
+-====================
+-
+-   Now it is time to described how the modules look like.  The functions
+-contained in a module are identified by their names.  I.e., there is no
+-jump table or the like.  How this is done is of no interest here; those
+-interested in this topic should read about Dynamic Linking.
+-
+-* Menu:
+-
+-* NSS Module Names::            Construction of the interface function of
+-                                the NSS modules.
+-* NSS Modules Interface::       Programming interface in the NSS module
+-                                functions.
+-
+-
+-File: libc.info,  Node: NSS Module Names,  Next: NSS Modules Interface,  Prev: NSS Module Internals,  Up: NSS Module Internals
+-
+-The Naming Scheme of the NSS Modules
+-------------------------------------
+-
+-The name of each function consist of various parts:
+-
+-            _nss_SERVICE_FUNCTION
+-
+-   SERVICE of course corresponds to the name of the module this
+-function is found in.(1)  The FUNCTION part is derived from the
+-interface function in the C library itself.  If the user calls the
+-function `gethostbyname' and the service used is `files' the function
+-
+-            _nss_files_gethostbyname_r
+-
+-in the module
+-
+-            libnss_files.so.2
+-
+-is used.  You see, what is explained above in not the whole truth.  In
+-fact the NSS modules only contain reentrant versions of the lookup
+-functions.  I.e., if the user would call the `gethostbyname_r' function
+-this also would end in the above function.  For all user interface
+-functions the C library maps this call to a call to the reentrant
+-function.  For reentrant functions this is trivial since the interface
+-is (nearly) the same.  For the non-reentrant version The library keeps
+-internal buffers which are used to replace the user supplied buffer.
+-
+-   I.e., the reentrant functions *can* have counterparts.  No service
+-module is forced to have functions for all databases and all kinds to
+-access them.  If a function is not available it is simply treated as if
+-the function would return `unavail' (*note Actions in the NSS
+-configuration::.).
+-
+-   The file name `libnss_files.so.2' would be on a Solaris 2 system
+-`nss_files.so.2'.  This is the difference mentioned above.  Sun's NSS
+-modules are usable as modules which get indirectly loaded only.
+-
+-   The NSS modules in the GNU C Library are prepared to be used as
+-normal libraries itself.  This is *not* true in the moment, though.
+-But the different organization of the name space in the modules does
+-not make it impossible like it is for Solaris.  Now you can see why the
+-modules are still libraries.(2)
+-
+-   ---------- Footnotes ----------
+-
+-   (1) Now you might ask why to duplicate this information.  The answer
+-is that we want to keep the possibility to link directly with these
+-shared objects.
+-
+-   (2) There is a second explanation: we were too lazy to change the
+-Makefiles to allow the generation of shared objects not starting with
+-`lib' but do not tell this anybody.
+-
+-
+-File: libc.info,  Node: NSS Modules Interface,  Prev: NSS Module Names,  Up: NSS Module Internals
+-
+-The Interface of the Function in NSS Modules
+---------------------------------------------
+-
+-   Now we know about the functions contained in the modules.  It is now
+-time to describe the types.  When we mentioned the reentrant versions of
+-the functions above, this means there are some additional arguments
+-(compared with the standard, non-reentrant version).  The prototypes for
+-the non-reentrant and reentrant versions of our function above are:
+-
+-     struct hostent *gethostbyname (const char *name)
+-     
+-     int gethostbyname_r (const char *name, struct hostent *result_buf,
+-                          char *buf, size_t buflen, struct hostent **result,
+-                          int *h_errnop)
+-
+-The actual prototype of the function in the NSS modules in this case is
+-
+-     enum nss_status _nss_files_gethostbyname_r (const char *name,
+-                                                 struct hostent *result_buf,
+-                                                 char *buf, size_t buflen,
+-                                                 int *errnop, int *h_errnop)
+-
+-   I.e., the interface function is in fact the reentrant function with
+-the change of the return value and the omission of the RESULT
+-parameter.  While the user-level function returns a pointer to the
+-result the reentrant function return an `enum nss_status' value:
+-
+-`NSS_STATUS_TRYAGAIN'
+-     numeric value `-2'
+-
+-`NSS_STATUS_UNAVAIL'
+-     numeric value `-1'
+-
+-`NSS_STATUS_NOTFOUND'
+-     numeric value `0'
+-
+-`NSS_STATUS_SUCCESS'
+-     numeric value `1'
+-
+-Now you see where the action items of the `/etc/nsswitch.conf' file are
+-used.
+-
+-   If you study the source code you will find there is a fifth value:
+-`NSS_STATUS_RETURN'.  This is an internal use only value, used by a few
+-functions in places where none of the above value can be used.  If
+-necessary the source code should be examined to learn about the details.
+-
+-   In case the interface function has to return an error it is important
+-that the correct error code is stored in `*ERRNOP'.  Some return status
+-value have only one associated error code, others have more.
+-
+-`NSS_STATUS_TRYAGAIN'   `EAGAIN'      One functions used ran temporarily   
+-                                      out of resources or a service is     
+-                                      currently not available.             
+-                       `ERANGE'       The provided buffer is not large     
+-                                      enough.  The function should be      
+-                                      called again with a larger buffer.   
+-`NSS_STATUS_UNAVAIL'    `ENOENT'      A necessary input file cannot be     
+-                                      found.                               
+-`NSS_STATUS_NOTFOUND'   `ENOENT'      The requested entry is not           
+-                                      available.                           
+-
+-   These are proposed values.  There can be other error codes and the
+-described error codes can have different meaning.  *With one
+-exception:* when returning `NSS_STATUS_TRYAGAIN' the error code
+-`ERANGE' *must* mean that the user provided buffer is too small.
+-Everything is non-critical.
+-
+-   The above function has something special which is missing for almost
+-all the other module functions.  There is an argument H_ERRNOP.  This
+-points to a variable which will be filled with the error code in case
+-the execution of the function fails for some reason.  The reentrant
+-function cannot use the global variable H_ERRNO; `gethostbyname' calls
+-`gethostbyname_r' with the last argument set to `&h_errno'.
+-
+-   The `getXXXbyYYY' functions are the most important functions in the
+-NSS modules.  But there are others which implement the other ways to
+-access system databases (say for the password database, there are
+-`setpwent', `getpwent', and `endpwent').  These will be described in
+-more detail later.  Here we give a general way to determine the
+-signature of the module function:
+-
+-   * the return value is `int';
+-
+-   * the name is as explain in *note NSS Module Names::.;
+-
+-   * the first arguments are identical to the arguments of the
+-     non-reentrant function;
+-
+-   * the next three arguments are:
+-
+-    `STRUCT_TYPE *result_buf'
+-          pointer to buffer where the result is stored.  `STRUCT_TYPE'
+-          is normally a struct which corresponds to the database.
+-
+-    `char *buffer'
+-          pointer to a buffer where the function can store additional
+-          adata for the result etc.
+-
+-    `size_t buflen'
+-          length of the buffer pointed to by BUFFER.
+-
+-   * possibly a last argument H_ERRNOP, for the host name and network
+-     name lookup functions.
+-
+-This table is correct for all functions but the `set...ent' and
+-`end...ent' functions.
+-
+-
+-File: libc.info,  Node: Extending NSS,  Prev: NSS Module Internals,  Up: Name Service Switch
+-
+-Extending NSS
+-=============
+-
+-   One of the advantages of NSS mentioned above is that it can be
+-extended quite easily.  There are two ways in which the extension can
+-happen: adding another database or adding another service.  The former
+-is normally done only by the C library developers.  It is here only
+-important to remember that adding another database is independent from
+-adding another service because a service need not support all databases
+-or lookup functions.
+-
+-   A designer/implementor of a new service is therefore free to choose
+-the databases s/he is interested in and leave the rest for later (or
+-completely aside).
+-
+-* Menu:
+-
+-* Adding another Service to NSS::  What is to do to add a new service.
+-* NSS Module Function Internals::  Guidelines for writing new NSS
+-                                        service functions.
+-
+-
+-File: libc.info,  Node: Adding another Service to NSS,  Next: NSS Module Function Internals,  Prev: Extending NSS,  Up: Extending NSS
+-
+-Adding another Service to NSS
+------------------------------
+-
+-   The sources for a new service need not (and should not) be part of
+-the GNU C Library itself.  The developer retains complete control over
+-the sources and its development.  The links between the C library and
+-the new service module consists solely of the interface functions.
+-
+-   Each module is designed following a specific interface specification.
+-For now the version is 2 (the interface in version 1 was not adequate)
+-and this manifests in the version number of the shared library object of
+-the NSS modules: they have the extension `.2'.  If the interface
+-changes again in an incompatible way, this number will be increased.
+-Modules using the old interface will still be usable.
+-
+-   Developers of a new service will have to make sure that their module
+-is created using the correct interface number.  This means the file
+-itself must have the correct name and on ElF systems the "soname"
+-(Shared Object Name) must also have this number.  Building a module
+-from a bunch of object files on an ELF system using GNU CC could be
+-done like this:
+-
+-     gcc -shared -o libnss_NAME.so.2 -Wl,-soname,libnss_NAME.so.2 OBJECTS
+-
+-*Note Options for Linking: (gcc)Link Options, to learn more about this
+-command line.
+-
+-   To use the new module the library must be able to find it.  This can
+-be achieved by using options for the dynamic linker so that it will
+-search directory where the binary is placed.  For an ELF system this
+-could be done by adding the wanted directory to the value of
+-`LD_LIBRARY_PATH'.
+-
+-   But this is not always possible since some program (those which run
+-under IDs which do not belong to the user) ignore this variable.
+-Therefore the stable version of the module should be placed into a
+-directory which is searched by the dynamic linker.  Normally this should
+-be the directory `$prefix/lib', where `$prefix' corresponds to the
+-value given to configure using the `--prefix' option.  But be careful:
+-this should only be done if it is clear the module does not cause any
+-harm.  System administrators should be careful.
+-
+-
+-File: libc.info,  Node: NSS Module Function Internals,  Prev: Adding another Service to NSS,  Up: Extending NSS
+-
+-Internals of the NSS Module Functions
+--------------------------------------
+-
+-   Until now we only provided the syntactic interface for the functions
+-in the NSS module.  In fact there is not more much we can tell since the
+-implementation obviously is different for each function.  But a few
+-general rules must be followed by all functions.
+-
+-   In fact there are four kinds of different functions which may appear
+-in the interface.  All derive from the traditional ones for system
+-databases.  DB in the following table is normally an abbreviation for
+-the database (e.g., it is `pw' for the password database).
+-
+-`enum nss_status _nss_DATABASE_setDBent (void)'
+-     This function prepares the service for following operations.  For a
+-     simple file based lookup this means files could be opened, for
+-     other services this function simply is a noop.
+-
+-     One special case for this function is that it takes an additional
+-     argument for some DATABASEs (i.e., the interface is `int setDBent
+-     (int)').  *Note Host Names::, which describes the `sethostent'
+-     function.
+-
+-     The return value should be NSS_STATUS_SUCCESS or according to the
+-     table above in case of an error (*note NSS Modules Interface::.).
+-
+-`enum nss_status _nss_DATABASE_endDBent (void)'
+-     This function simply closes all files which are still open or
+-     removes buffer caches.  If there are no files or buffers to remove
+-     this is again a simple noop.
+-
+-     There normally is no return value different to NSS_STATUS_SUCCESS.
+-
+-`enum nss_status _nss_DATABASE_getDBent_r (STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
+-     Since this function will be called several times in a row to
+-     retrieve one entry after the other it must keep some kind of
+-     state.  But this also means the functions are not really
+-     reentrant.  They are reentrant only in that simultaneous calls to
+-     this function will not try to write the retrieved data in the same
+-     place (as it would be the case for the non-reentrant functions);
+-     instead, it writes to the structure pointed to by the RESULT
+-     parameter.  But the calls share a common state and in the case of
+-     a file access this means they return neighboring entries in the
+-     file.
+-
+-     The buffer of length BUFLEN pointed to by BUFFER can be used for
+-     storing some additional data for the result.  It is *not*
+-     guaranteed that the same buffer will be passed for the next call
+-     of this function.  Therefore one must not misuse this buffer to
+-     save some state information from one call to another.
+-
+-     Before the function returns the implementation should store the
+-     value of the local ERRNO variable in the variable pointed to be
+-     ERRNOP.  This is important to guarantee the module working in
+-     statically linked programs.
+-
+-     As explained above this function could also have an additional last
+-     argument.  This depends on the database used; it happens only for
+-     `host' and `networks'.
+-
+-     The function shall return `NSS_STATUS_SUCCESS' as long as their are
+-     more entries.  When the last entry was read it should return
+-     `NSS_STATUS_NOTFOUND'.  When the buffer given as an argument is too
+-     small for the data to be returned `NSS_STATUS_TRYAGAIN' should be
+-     returned.  When the service was not formerly initialized by a call
+-     to `_nss_DATABASE_setDBent' all return value allowed for this
+-     function can also be returned here.
+-
+-`enum nss_status _nss_DATABASE_getDBbyXX_r (PARAMS, STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
+-     This function shall return the entry from the database which is
+-     addressed by the PARAMS.  The type and number of these arguments
+-     vary.  It must be individually determined by looking to the
+-     user-level interface functions.  All arguments given to the
+-     non-reentrant version are here described by PARAMS.
+-
+-     The result must be stored in the structure pointed to by RESULT.
+-     If there is additional data to return (say strings, where the
+-     RESULT structure only contains pointers) the function must use the
+-     BUFFER or length BUFLEN.  There must not be any references to
+-     non-constant global data.
+-
+-     The implementation of this function should honour the STAYOPEN
+-     flag set by the `setDBent' function whenever this makes sense.
+-
+-     Before the function returns the implementation should store the
+-     value of the local ERRNO variable in the variable pointed to be
+-     ERRNOP.  This is important to guarantee the module working in
+-     statically linked programs.
+-
+-     Again, this function takes an additional last argument for the
+-     `host' and `networks' database.
+-
+-     The return value should as always follow the rules given above
+-     (*note NSS Modules Interface::.).
+-
+-
+-File: libc.info,  Node: Users and Groups,  Next: System Information,  Prev: Name Service Switch,  Up: Top
+-
+-Users and Groups
+-****************
+-
+-   Every user who can log in on the system is identified by a unique
+-number called the "user ID".  Each process has an effective user ID
+-which says which user's access permissions it has.
+-
+-   Users are classified into "groups" for access control purposes.  Each
+-process has one or more "group ID values" which say which groups the
+-process can use for access to files.
+-
+-   The effective user and group IDs of a process collectively form its
+-"persona".  This determines which files the process can access.
+-Normally, a process inherits its persona from the parent process, but
+-under special circumstances a process can change its persona and thus
+-change its access permissions.
+-
+-   Each file in the system also has a user ID and a group ID.  Access
+-control works by comparing the user and group IDs of the file with those
+-of the running process.
+-
+-   The system keeps a database of all the registered users, and another
+-database of all the defined groups.  There are library functions you
+-can use to examine these databases.
+-
+-* Menu:
+-
+-* User and Group IDs::          Each user has a unique numeric ID;
+-				 likewise for groups.
+-* Process Persona::             The user IDs and group IDs of a process.
+-* Why Change Persona::          Why a program might need to change
+-				 its user and/or group IDs.
+-* How Change Persona::          Changing the user and group IDs.
+-* Reading Persona::             How to examine the user and group IDs.
+-
+-* Setting User ID::             Functions for setting the user ID.
+-* Setting Groups::              Functions for setting the group IDs.
+-
+-* Enable/Disable Setuid::       Turning setuid access on and off.
+-* Setuid Program Example::      The pertinent parts of one sample program.
+-* Tips for Setuid::             How to avoid granting unlimited access.
+-
+-* Who Logged In::               Getting the name of the user who logged in,
+-				 or of the real user ID of the current process.
+-
+-* User Accounting Database::    Keeping information about users and various
+-                                 actions in databases.
+-
+-* User Database::               Functions and data structures for
+-                        	 accessing the user database.
+-* Group Database::              Functions and data structures for
+-                        	 accessing the group database.
+-* Database Example::            Example program showing the use of database
+-				 inquiry functions.
+-* Netgroup Database::           Functions for accessing the netgroup database.
+-
+-
+-File: libc.info,  Node: User and Group IDs,  Next: Process Persona,  Up: Users and Groups
+-
+-User and Group IDs
+-==================
+-
+-   Each user account on a computer system is identified by a "user
+-name" (or "login name") and "user ID".  Normally, each user name has a
+-unique user ID, but it is possible for several login names to have the
+-same user ID.  The user names and corresponding user IDs are stored in
+-a data base which you can access as described in *Note User Database::.
+-
+-   Users are classified in "groups".  Each user name belongs to one
+-"default group" and may also belong to any number of "supplementary
+-groups". Users who are members of the same group can share resources
+-(such as files) that are not accessible to users who are not a member
+-of that group.  Each group has a "group name" and "group ID".  *Note
+-Group Database::, for how to find information about a group ID or group
+-name.
+-
+-
+-File: libc.info,  Node: Process Persona,  Next: Why Change Persona,  Prev: User and Group IDs,  Up: Users and Groups
+-
+-The Persona of a Process
+-========================
+-
+-   At any time, each process has an "effective user ID", a "effective
+-group ID", and a set of "supplementary group IDs".  These IDs determine
+-the privileges of the process.  They are collectively called the
+-"persona" of the process, because they determine "who it is" for
+-purposes of access control.
+-
+-   Your login shell starts out with a persona which consists of your
+-user ID, your default group ID, and your supplementary group IDs (if
+-you are in more than one group).  In normal circumstances, all your
+-other processes inherit these values.
+-
+-   A process also has a "real user ID" which identifies the user who
+-created the process, and a "real group ID" which identifies that user's
+-default group.  These values do not play a role in access control, so
+-we do not consider them part of the persona.  But they are also
+-important.
+-
+-   Both the real and effective user ID can be changed during the
+-lifetime of a process.  *Note Why Change Persona::.
+-
+-   For details on how a process's effective user ID and group IDs affect
+-its permission to access files, see *Note Access Permission::.
+-
+-   The effective user ID of a process also controls permissions for
+-sending signals using the `kill' function.  *Note Signaling Another
+-Process::.
+-
+-   Finally, there are many operations which can only be performed by a
+-process whose effective user ID is zero.  A process with this user ID is
+-a "privileged process".  Commonly the user name `root' is associated
+-with user ID 0, but there may be other user names with this ID.
+-
+-
+-File: libc.info,  Node: Why Change Persona,  Next: How Change Persona,  Prev: Process Persona,  Up: Users and Groups
+-
+-Why Change the Persona of a Process?
+-====================================
+-
+-   The most obvious situation where it is necessary for a process to
+-change its user and/or group IDs is the `login' program.  When `login'
+-starts running, its user ID is `root'.  Its job is to start a shell
+-whose user and group IDs are those of the user who is logging in.  (To
+-accomplish this fully, `login' must set the real user and group IDs as
+-well as its persona.  But this is a special case.)
+-
+-   The more common case of changing persona is when an ordinary user
+-program needs access to a resource that wouldn't ordinarily be
+-accessible to the user actually running it.
+-
+-   For example, you may have a file that is controlled by your program
+-but that shouldn't be read or modified directly by other users, either
+-because it implements some kind of locking protocol, or because you want
+-to preserve the integrity or privacy of the information it contains.
+-This kind of restricted access can be implemented by having the program
+-change its effective user or group ID to match that of the resource.
+-
+-   Thus, imagine a game program that saves scores in a file.  The game
+-program itself needs to be able to update this file no matter who is
+-running it, but if users can write the file without going through the
+-game, they can give themselves any scores they like.  Some people
+-consider this undesirable, or even reprehensible.  It can be prevented
+-by creating a new user ID and login name (say, `games') to own the
+-scores file, and make the file writable only by this user.  Then, when
+-the game program wants to update this file, it can change its effective
+-user ID to be that for `games'.  In effect, the program must adopt the
+-persona of `games' so it can write the scores file.
+-
+-
+-File: libc.info,  Node: How Change Persona,  Next: Reading Persona,  Prev: Why Change Persona,  Up: Users and Groups
+-
+-How an Application Can Change Persona
+-=====================================
+-
+-   The ability to change the persona of a process can be a source of
+-unintentional privacy violations, or even intentional abuse.  Because of
+-the potential for problems, changing persona is restricted to special
+-circumstances.
+-
+-   You can't arbitrarily set your user ID or group ID to anything you
+-want; only privileged processes can do that.  Instead, the normal way
+-for a program to change its persona is that it has been set up in
+-advance to change to a particular user or group.  This is the function
+-of the setuid and setgid bits of a file's access mode.  *Note
+-Permission Bits::.
+-
+-   When the setuid bit of an executable file is on, executing that file
+-gives the process a third user ID: the "file user ID".  This ID is set
+-to the owner ID of the file.  The system then changes the effective
+-user ID to the file user ID.  The real user ID remains as it was.
+-Likewise, if the setgid bit is on, the process is given a "file group
+-ID" equal to the group ID of the file, and its effective group ID is
+-changed to the file group ID.
+-
+-   If a process has a file ID (user or group), then it can at any time
+-change its effective ID to its real ID and back to its file ID.
+-Programs use this feature to relinquish their special privileges except
+-when they actually need them.  This makes it less likely that they can
+-be tricked into doing something inappropriate with their privileges.
+-
+-   *Portability Note:* Older systems do not have file IDs.  To
+-determine if a system has this feature, you can test the compiler
+-define `_POSIX_SAVED_IDS'.  (In the POSIX standard, file IDs are known
+-as saved IDs.)
+-
+-   *Note File Attributes::, for a more general discussion of file modes
+-and accessibility.
+-
+-
+-File: libc.info,  Node: Reading Persona,  Next: Setting User ID,  Prev: How Change Persona,  Up: Users and Groups
+-
+-Reading the Persona of a Process
+-================================
+-
+-   Here are detailed descriptions of the functions for reading the user
+-and group IDs of a process, both real and effective.  To use these
+-facilities, you must include the header files `sys/types.h' and
+-`unistd.h'.
+-
+- - Data Type: uid_t
+-     This is an integer data type used to represent user IDs.  In the
+-     GNU library, this is an alias for `unsigned int'.
+-
+- - Data Type: gid_t
+-     This is an integer data type used to represent group IDs.  In the
+-     GNU library, this is an alias for `unsigned int'.
+-
+- - Function: uid_t getuid (void)
+-     The `getuid' function returns the real user ID of the process.
+-
+- - Function: gid_t getgid (void)
+-     The `getgid' function returns the real group ID of the process.
+-
+- - Function: uid_t geteuid (void)
+-     The `geteuid' function returns the effective user ID of the
+-     process.
+-
+- - Function: gid_t getegid (void)
+-     The `getegid' function returns the effective group ID of the
+-     process.
+-
+- - Function: int getgroups (int COUNT, gid_t *GROUPS)
+-     The `getgroups' function is used to inquire about the supplementary
+-     group IDs of the process.  Up to COUNT of these group IDs are
+-     stored in the array GROUPS; the return value from the function is
+-     the number of group IDs actually stored.  If COUNT is smaller than
+-     the total number of supplementary group IDs, then `getgroups'
+-     returns a value of `-1' and `errno' is set to `EINVAL'.
+-
+-     If COUNT is zero, then `getgroups' just returns the total number
+-     of supplementary group IDs.  On systems that do not support
+-     supplementary groups, this will always be zero.
+-
+-     Here's how to use `getgroups' to read all the supplementary group
+-     IDs:
+-
+-          gid_t *
+-          read_all_groups (void)
+-          {
+-            int ngroups = getgroups (0, NULL);
+-            gid_t *groups
+-              = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
+-            int val = getgroups (ngroups, groups);
+-            if (val < 0)
+-              {
+-                free (groups);
+-                return NULL;
+-              }
+-            return groups;
+-          }
+-
+-
+-File: libc.info,  Node: Setting User ID,  Next: Setting Groups,  Prev: Reading Persona,  Up: Users and Groups
+-
+-Setting the User ID
+-===================
+-
+-   This section describes the functions for altering the user ID (real
+-and/or effective) of a process.  To use these facilities, you must
+-include the header files `sys/types.h' and `unistd.h'.
+-
+- - Function: int seteuid (uid_t NEWEUID)
+-     This function sets the effective user ID of a process to NEWUID,
+-     provided that the process is allowed to change its effective user
+-     ID.  A privileged process (effective user ID zero) can change its
+-     effective user ID to any legal value.  An unprivileged process
+-     with a file user ID can change its effective user ID to its real
+-     user ID or to its file user ID.  Otherwise, a process may not
+-     change its effective user ID at all.
+-
+-     The `seteuid' function returns a value of `0' to indicate
+-     successful completion, and a value of `-1' to indicate an error.
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINVAL'
+-          The value of the NEWUID argument is invalid.
+-
+-    `EPERM'
+-          The process may not change to the specified ID.
+-
+-     Older systems (those without the `_POSIX_SAVED_IDS' feature) do not
+-     have this function.
+-
+- - Function: int setuid (uid_t NEWUID)
+-     If the calling process is privileged, this function sets both the
+-     real and effective user ID of the process to NEWUID.  It also
+-     deletes the file user ID of the process, if any.  NEWUID may be any
+-     legal value.  (Once this has been done, there is no way to recover
+-     the old effective user ID.)
+-
+-     If the process is not privileged, and the system supports the
+-     `_POSIX_SAVED_IDS' feature, then this function behaves like
+-     `seteuid'.
+-
+-     The return values and error conditions are the same as for
+-     `seteuid'.
+-
+- - Function: int setreuid (uid_t RUID, uid_t EUID)
+-     This function sets the real user ID of the process to RUID and the
+-     effective user ID to EUID.  If RUID is `-1', it means not to
+-     change the real user ID; likewise if EUID is `-1', it means not to
+-     change the effective user ID.
+-
+-     The `setreuid' function exists for compatibility with 4.3 BSD Unix,
+-     which does not support file IDs.  You can use this function to
+-     swap the effective and real user IDs of the process.  (Privileged
+-     processes are not limited to this particular usage.)  If file IDs
+-     are supported, you should use that feature instead of this
+-     function.  *Note Enable/Disable Setuid::.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EPERM'
+-          The process does not have the appropriate privileges; you do
+-          not have permission to change to the specified ID.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-39 glibc-2.1.3/manual/libc.info-39
+--- ../glibc-2.1.3/manual/libc.info-39	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-39	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1245 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Setting Groups,  Next: Enable/Disable Setuid,  Prev: Setting User ID,  Up: Users and Groups
+-
+-Setting the Group IDs
+-=====================
+-
+-   This section describes the functions for altering the group IDs (real
+-and effective) of a process.  To use these facilities, you must include
+-the header files `sys/types.h' and `unistd.h'.
+-
+- - Function: int setegid (gid_t NEWGID)
+-     This function sets the effective group ID of the process to
+-     NEWGID, provided that the process is allowed to change its group
+-     ID.  Just as with `seteuid', if the process is privileged it may
+-     change its effective group ID to any value; if it isn't, but it
+-     has a file group ID, then it may change to its real group ID or
+-     file group ID; otherwise it may not change its effective group ID.
+-
+-     Note that a process is only privileged if its effective *user* ID
+-     is zero.  The effective group ID only affects access permissions.
+-
+-     The return values and error conditions for `setegid' are the same
+-     as those for `seteuid'.
+-
+-     This function is only present if `_POSIX_SAVED_IDS' is defined.
+-
+- - Function: int setgid (gid_t NEWGID)
+-     This function sets both the real and effective group ID of the
+-     process to NEWGID, provided that the process is privileged.  It
+-     also deletes the file group ID, if any.
+-
+-     If the process is not privileged, then `setgid' behaves like
+-     `setegid'.
+-
+-     The return values and error conditions for `setgid' are the same
+-     as those for `seteuid'.
+-
+- - Function: int setregid (gid_t RGID, gid_t EGID)
+-     This function sets the real group ID of the process to RGID and
+-     the effective group ID to EGID.  If RGID is `-1', it means not to
+-     change the real group ID; likewise if EGID is `-1', it means not
+-     to change the effective group ID.
+-
+-     The `setregid' function is provided for compatibility with 4.3 BSD
+-     Unix, which does not support file IDs.  You can use this function
+-     to swap the effective and real group IDs of the process.
+-     (Privileged processes are not limited to this usage.)  If file IDs
+-     are supported, you should use that feature instead of using this
+-     function.  *Note Enable/Disable Setuid::.
+-
+-     The return values and error conditions for `setregid' are the same
+-     as those for `setreuid'.
+-
+-   `setuid' and `setgid' behave differently depending on whether the
+-effective user ID at the time is zero.  If it is not zero, they behave
+-like `seteuid' and `setegid'.  If it is, they change both effective and
+-real IDs and delete the file ID.  To avoid confusion, we recommend you
+-always use `seteuid' and `setegid' except when you know the effective
+-user ID is zero and your intent is to change the persona permanently.
+-This case is rare--most of the programs that need it, such as `login'
+-and `su', have already been written.
+-
+-   Note that if your program is setuid to some user other than `root',
+-there is no way to drop privileges permanently.
+-
+-   The system also lets privileged processes change their supplementary
+-group IDs.  To use `setgroups' or `initgroups', your programs should
+-include the header file `grp.h'.
+-
+- - Function: int setgroups (size_t COUNT, gid_t *GROUPS)
+-     This function sets the process's supplementary group IDs.  It can
+-     only be called from privileged processes.  The COUNT argument
+-     specifies the number of group IDs in the array GROUPS.
+-
+-     This function returns `0' if successful and `-1' on error.  The
+-     following `errno' error conditions are defined for this function:
+-
+-    `EPERM'
+-          The calling process is not privileged.
+-
+- - Function: int initgroups (const char *USER, gid_t GID)
+-     The `initgroups' function sets the process's supplementary group
+-     IDs to be the normal default for the user name USER. If GID is not
+-     -1, it includes that group also.
+-
+-     This function works by scanning the group database for all the
+-     groups USER belongs to.  It then calls `setgroups' with the list it
+-     has constructed.
+-
+-     The return values and error conditions are the same as for
+-     `setgroups'.
+-
+-
+-File: libc.info,  Node: Enable/Disable Setuid,  Next: Setuid Program Example,  Prev: Setting Groups,  Up: Users and Groups
+-
+-Enabling and Disabling Setuid Access
+-====================================
+-
+-   A typical setuid program does not need its special access all of the
+-time.  It's a good idea to turn off this access when it isn't needed,
+-so it can't possibly give unintended access.
+-
+-   If the system supports the `_POSIX_SAVED_IDS' feature, you can
+-accomplish this with `seteuid'.  When the game program starts, its real
+-user ID is `jdoe', its effective user ID is `games', and its saved user
+-ID is also `games'.  The program should record both user ID values once
+-at the beginning, like this:
+-
+-     user_user_id = getuid ();
+-     game_user_id = geteuid ();
+-
+-   Then it can turn off game file access with
+-
+-     seteuid (user_user_id);
+-
+-and turn it on with
+-
+-     seteuid (game_user_id);
+-
+-Throughout this process, the real user ID remains `jdoe' and the file
+-user ID remains `games', so the program can always set its effective
+-user ID to either one.
+-
+-   On other systems that don't support file user IDs, you can turn
+-setuid access on and off by using `setreuid' to swap the real and
+-effective user IDs of the process, as follows:
+-
+-     setreuid (geteuid (), getuid ());
+-
+-This special case is always allowed--it cannot fail.
+-
+-   Why does this have the effect of toggling the setuid access?
+-Suppose a game program has just started, and its real user ID is `jdoe'
+-while its effective user ID is `games'.  In this state, the game can
+-write the scores file.  If it swaps the two uids, the real becomes
+-`games' and the effective becomes `jdoe'; now the program has only
+-`jdoe' access.  Another swap brings `games' back to the effective user
+-ID and restores access to the scores file.
+-
+-   In order to handle both kinds of systems, test for the saved user ID
+-feature with a preprocessor conditional, like this:
+-
+-     #ifdef _POSIX_SAVED_IDS
+-       setuid (user_user_id);
+-     #else
+-       setreuid (geteuid (), getuid ());
+-     #endif
+-
+-
+-File: libc.info,  Node: Setuid Program Example,  Next: Tips for Setuid,  Prev: Enable/Disable Setuid,  Up: Users and Groups
+-
+-Setuid Program Example
+-======================
+-
+-   Here's an example showing how to set up a program that changes its
+-effective user ID.
+-
+-   This is part of a game program called `caber-toss' that manipulates
+-a file `scores' that should be writable only by the game program
+-itself.  The program assumes that its executable file will be installed
+-with the setuid bit set and owned by the same user as the `scores'
+-file.  Typically, a system administrator will set up an account like
+-`games' for this purpose.
+-
+-   The executable file is given mode `4755', so that doing an `ls -l'
+-on it produces output like:
+-
+-     -rwsr-xr-x   1 games    184422 Jul 30 15:17 caber-toss
+-
+-The setuid bit shows up in the file modes as the `s'.
+-
+-   The scores file is given mode `644', and doing an `ls -l' on it
+-shows:
+-
+-     -rw-r--r--  1 games           0 Jul 31 15:33 scores
+-
+-   Here are the parts of the program that show how to set up the changed
+-user ID.  This program is conditionalized so that it makes use of the
+-file IDs feature if it is supported, and otherwise uses `setreuid' to
+-swap the effective and real user IDs.
+-
+-     #include <stdio.h>
+-     #include <sys/types.h>
+-     #include <unistd.h>
+-     #include <stdlib.h>
+-     
+-     
+-     /* Remember the effective and real UIDs. */
+-     
+-     static uid_t euid, ruid;
+-     
+-     
+-     /* Restore the effective UID to its original value. */
+-     
+-     void
+-     do_setuid (void)
+-     {
+-       int status;
+-     
+-     #ifdef _POSIX_SAVED_IDS
+-       status = seteuid (euid);
+-     #else
+-       status = setreuid (ruid, euid);
+-     #endif
+-       if (status < 0) {
+-         fprintf (stderr, "Couldn't set uid.\n");
+-         exit (status);
+-         }
+-     }
+-     /* Set the effective UID to the real UID. */
+-     
+-     void
+-     undo_setuid (void)
+-     {
+-       int status;
+-     
+-     #ifdef _POSIX_SAVED_IDS
+-       status = seteuid (ruid);
+-     #else
+-       status = setreuid (euid, ruid);
+-     #endif
+-       if (status < 0) {
+-         fprintf (stderr, "Couldn't set uid.\n");
+-         exit (status);
+-         }
+-     }
+-     
+-     /* Main program. */
+-     
+-     int
+-     main (void)
+-     {
+-       /* Remember the real and effective user IDs.  */
+-       ruid = getuid ();
+-       euid = geteuid ();
+-       undo_setuid ();
+-     
+-       /* Do the game and record the score.  */
+-       ...
+-     }
+-
+-   Notice how the first thing the `main' function does is to set the
+-effective user ID back to the real user ID.  This is so that any other
+-file accesses that are performed while the user is playing the game use
+-the real user ID for determining permissions.  Only when the program
+-needs to open the scores file does it switch back to the file user ID,
+-like this:
+-
+-     /* Record the score. */
+-     
+-     int
+-     record_score (int score)
+-     {
+-       FILE *stream;
+-       char *myname;
+-     
+-       /* Open the scores file. */
+-       do_setuid ();
+-       stream = fopen (SCORES_FILE, "a");
+-       undo_setuid ();
+-     /* Write the score to the file. */
+-       if (stream)
+-         {
+-           myname = cuserid (NULL);
+-           if (score < 0)
+-             fprintf (stream, "%10s: Couldn't lift the caber.\n", myname);
+-           else
+-             fprintf (stream, "%10s: %d feet.\n", myname, score);
+-           fclose (stream);
+-           return 0;
+-         }
+-       else
+-         return -1;
+-     }
+-
+-
+-File: libc.info,  Node: Tips for Setuid,  Next: Who Logged In,  Prev: Setuid Program Example,  Up: Users and Groups
+-
+-Tips for Writing Setuid Programs
+-================================
+-
+-   It is easy for setuid programs to give the user access that isn't
+-intended--in fact, if you want to avoid this, you need to be careful.
+-Here are some guidelines for preventing unintended access and
+-minimizing its consequences when it does occur:
+-
+-   * Don't have `setuid' programs with privileged user IDs such as
+-     `root' unless it is absolutely necessary.  If the resource is
+-     specific to your particular program, it's better to define a new,
+-     nonprivileged user ID or group ID just to manage that resource.
+-     It's better if you can write your program to use a special group
+-     than a special user.
+-
+-   * Be cautious about using the `exec' functions in combination with
+-     changing the effective user ID.  Don't let users of your program
+-     execute arbitrary programs under a changed user ID.  Executing a
+-     shell is especially bad news. Less obviously, the `execlp' and
+-     `execvp' functions are a potential risk (since the program they
+-     execute depends on the user's `PATH' environment variable).
+-
+-     If you must `exec' another program under a changed ID, specify an
+-     absolute file name (*note File Name Resolution::.) for the
+-     executable, and make sure that the protections on that executable
+-     and *all* containing directories are such that ordinary users
+-     cannot replace it with some other program.
+-
+-     You should also check the arguments passed to the program to make
+-     sure they do not have unexpected effects.  Likewise, you should
+-     examine the environment variables.  Decide which arguments and
+-     variables are safe, and reject all others.
+-
+-     You should never use `system' in a privileged program, because it
+-     invokes a shell.
+-
+-   * Only use the user ID controlling the resource in the part of the
+-     program that actually uses that resource.  When you're finished
+-     with it, restore the effective user ID back to the actual user's
+-     user ID.  *Note Enable/Disable Setuid::.
+-
+-   * If the `setuid' part of your program needs to access other files
+-     besides the controlled resource, it should verify that the real
+-     user would ordinarily have permission to access those files.  You
+-     can use the `access' function (*note Access Permission::.) to
+-     check this; it uses the real user and group IDs, rather than the
+-     effective IDs.
+-
+-
+-File: libc.info,  Node: Who Logged In,  Next: User Accounting Database,  Prev: Tips for Setuid,  Up: Users and Groups
+-
+-Identifying Who Logged In
+-=========================
+-
+-   You can use the functions listed in this section to determine the
+-login name of the user who is running a process, and the name of the
+-user who logged in the current session.  See also the function `getuid'
+-and friends (*note Reading Persona::.).  How this information is
+-collected by the system and how to control/add/remove information from
+-the background storage is described in *Note User Accounting Database::.
+-
+-   The `getlogin' function is declared in `unistd.h', while `cuserid'
+-and `L_cuserid' are declared in `stdio.h'.
+-
+- - Function: char * getlogin (void)
+-     The `getlogin' function returns a pointer to a string containing
+-     the name of the user logged in on the controlling terminal of the
+-     process, or a null pointer if this information cannot be
+-     determined.  The string is statically allocated and might be
+-     overwritten on subsequent calls to this function or to `cuserid'.
+-
+- - Function: char * cuserid (char *STRING)
+-     The `cuserid' function returns a pointer to a string containing a
+-     user name associated with the effective ID of the process.  If
+-     STRING is not a null pointer, it should be an array that can hold
+-     at least `L_cuserid' characters; the string is returned in this
+-     array.  Otherwise, a pointer to a string in a static area is
+-     returned.  This string is statically allocated and might be
+-     overwritten on subsequent calls to this function or to `getlogin'.
+-
+-     The use of this function is deprecated since it is marked to be
+-     withdrawn in XPG4.2 and has already been removed from newer
+-     revisions of POSIX.1.
+-
+- - Macro: int L_cuserid
+-     An integer constant that indicates how long an array you might
+-     need to store a user name.
+-
+-   These functions let your program identify positively the user who is
+-running or the user who logged in this session.  (These can differ when
+-setuid programs are involved; see *Note Process Persona::.)  The user
+-cannot do anything to fool these functions.
+-
+-   For most purposes, it is more useful to use the environment variable
+-`LOGNAME' to find out who the user is.  This is more flexible precisely
+-because the user can set `LOGNAME' arbitrarily.  *Note Standard
+-Environment::.
+-
+-
+-File: libc.info,  Node: User Accounting Database,  Next: User Database,  Prev: Who Logged In,  Up: Users and Groups
+-
+-The User Accounting Database
+-============================
+-
+-   Most Unix-like operating systems keep track of logged in users by
+-maintaining a user accounting database.  This user accounting database
+-stores for each terminal, who has logged on, at what time, the process
+-ID of the user's login shell, etc., etc., but also stores information
+-about the run level of the system, the time of the last system reboot,
+-and possibly more.
+-
+-   The user accounting database typically lives in `/etc/utmp',
+-`/var/adm/utmp' or `/var/run/utmp'.  However, these files should
+-*never* be accessed directly.  For reading information from and writing
+-information to the user accounting database, the functions described in
+-this section should be used.
+-
+-* Menu:
+-
+-* Manipulating the Database::   Scanning and modifying the user
+-                                 accounting database.
+-* XPG Functions::               A standardized way for doing the same thing.
+-* Logging In and Out::          Functions from BSD that modify the user
+-                                 accounting database.
+-
+-
+-File: libc.info,  Node: Manipulating the Database,  Next: XPG Functions,  Up: User Accounting Database
+-
+-Manipulating the User Accounting Database
+------------------------------------------
+-
+-   These functions and the corresponding data structures are declared in
+-the header file `utmp.h'.
+-
+- - Data Type: struct exit_status
+-     The `exit_status' data structure is used to hold information about
+-     the exit status of processes marked as `DEAD_PROCESS' in the user
+-     accounting database.
+-
+-    `short int e_termination'
+-          The exit status of the process.
+-
+-    `short int e_exit'
+-          The exit status of the process.
+-
+- - Data Type: struct utmp
+-     The `utmp' data structure is used to hold information about entries
+-     in the user accounting database.  On the GNU system it has the
+-     following members:
+-
+-    `short int ut_type'
+-          Specifies the type of login; one of `EMPTY', `RUN_LVL',
+-          `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS',
+-          `LOGIN_PROCESS', `USER_PROCESS', `DEAD_PROCESS' or
+-          `ACCOUNTING'.
+-
+-    `pid_t ut_pid'
+-          The process ID number of the login process.
+-
+-    `char ut_line[]'
+-          The device name of the tty (without `/dev/').
+-
+-    `char ut_id[]'
+-          The inittab ID of the process.
+-
+-    `char ut_user[]'
+-          The user's login name.
+-
+-    `char ut_host[]'
+-          The name of the host from which the user logged in.
+-
+-    `struct exit_status ut_exit'
+-          The exit status of a process marked as `DEAD_PROCESS'.
+-
+-    `long ut_session'
+-          The Session ID, used for windowing.
+-
+-    `struct timeval ut_tv'
+-          Time the entry was made.  For entries of type `OLD_TIME' this
+-          is the time when the system clock changed, and for entries of
+-          type `NEW_TIME' this is the time the system clock was set to.
+-
+-    `int32_t ut_addr_v6[4]'
+-          The Internet address of a remote host.
+-
+-   The `ut_type', `ut_pid', `ut_id', `ut_tv', and `ut_host' fields are
+-not available on all systems.  Portable applications therefore should
+-be prepared for these situations.  To help doing this the `utmp.h'
+-header provides macros `_HAVE_UT_TYPE', `_HAVE_UT_PID', `_HAVE_UT_ID',
+-`_HAVE_UT_TV', and `_HAVE_UT_HOST' if the respective field is
+-available.  The programmer can handle the situations by using `#ifdef'
+-in the program code.
+-
+-   The following macros are defined for use as values for the `ut_type'
+-member of the `utmp' structure.  The values are integer constants.
+-
+-`EMPTY'
+-     This macro is used to indicate that the entry contains no valid
+-     user accounting information.
+-
+-`RUN_LVL'
+-     This macro is used to identify the systems runlevel.
+-
+-`BOOT_TIME'
+-     This macro is used to identify the time of system boot.
+-
+-`OLD_TIME'
+-     This macro is used to identify the time when the system clock
+-     changed.
+-
+-`NEW_TIME'
+-     This macro is used to identify the time after the system changed.
+-
+-`INIT_PROCESS'
+-     This macro is used to identify a process spawned by the init
+-     process.
+-
+-`LOGIN_PROCESS'
+-     This macro is used to identify the session leader of a logged in
+-     user.
+-
+-`USER_PROCESS'
+-     This macro is used to identify a user process.
+-
+-`DEAD_PROCESS'
+-     This macro is used to identify a terminated process.
+-
+-`ACCOUNTING'
+-     ???
+-
+-   The size of the `ut_line', `ut_id', `ut_user' and `ut_host' arrays
+-can be found using the `sizeof' operator.
+-
+-   Many older systems have, instead of an `ut_tv' member, an `ut_time'
+-member, usually of type `time_t', for representing the time associated
+-with the entry.  Therefore, for backwards compatibility only, `utmp.h'
+-defines `ut_time' as an alias for `ut_tv.tv_sec'.
+-
+- - Function: void setutent (void)
+-     This function opens the user accounting database to begin scanning
+-     it.  You can then call `getutent', `getutid' or `getutline' to
+-     read entries and `pututline' to write entries.
+-
+-     If the database is already open, it resets the input to the
+-     beginning of the database.
+-
+- - Function: struct utmp * getutent (void)
+-     The `getutent' function reads the next entry from the user
+-     accounting database.  It returns a pointer to the entry, which is
+-     statically allocated and may be overwritten by subsequent calls to
+-     `getutent'.  You must copy the contents of the structure if you
+-     wish to save the information or you can use the `getutent_r'
+-     function which stores the data in a user-provided buffer.
+-
+-     A null pointer is returned in case no further entry is available.
+-
+- - Function: void endutent (void)
+-     This function closes the user accounting database.
+-
+- - Function: struct utmp * getutid (const struct utmp *ID)
+-     This function searches forward from the current point in the
+-     database for an entry that matches ID.  If the `ut_type' member of
+-     the ID structure is one of `RUN_LVL', `BOOT_TIME', `OLD_TIME' or
+-     `NEW_TIME' the entries match if the `ut_type' members are
+-     identical.  If the `ut_type' member of the ID structure is
+-     `INIT_PROCESS', `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS',
+-     the entries match if the `ut_type' member of the entry read from
+-     the database is one of these four, and the `ut_id' members match.
+-     However if the `ut_id' member of either the ID structure or the
+-     entry read from the database is empty it checks if the `ut_line'
+-     members match instead.  If a matching entry is found, `getutid'
+-     returns a pointer to the entry, which is statically allocated, and
+-     may be overwritten by a subsequent call to `getutent', `getutid'
+-     or `getutline'.  You must copy the contents of the structure if
+-     you wish to save the information.
+-
+-     A null pointer is returned in case the end of the database is
+-     reached without a match.
+-
+-     The `getutid' function may cache the last read entry.  Therefore,
+-     if you are using `getutid' to search for multiple occurrences, it
+-     is necessary to zero out the static data after each call.
+-     Otherwise `getutid' could just return a pointer to the same entry
+-     over and over again.
+-
+- - Function: struct utmp * getutline (const struct utmp *LINE)
+-     This function searches forward from the current point in the
+-     database until it finds an entry whose `ut_type' value is
+-     `LOGIN_PROCESS' or `USER_PROCESS', and whose `ut_line' member
+-     matches the `ut_line' member of the LINE structure.  If it finds
+-     such an entry, it returns a pointer to the entry which is
+-     statically allocated, and may be overwritten by a subsequent call
+-     to `getutent', `getutid' or `getutline'.  You must copy the
+-     contents of the structure if you wish to save the information.
+-
+-     A null pointer is returned in case the end of the database is
+-     reached without a match.
+-
+-     The `getutline' function may cache the last read entry.  Therefore
+-     if you are using `getutline' to search for multiple occurrences, it
+-     is necessary to zero out the static data after each call.
+-     Otherwise `getutline' could just return a pointer to the same
+-     entry over and over again.
+-
+- - Function: struct utmp * pututline (const struct utmp *UTMP)
+-     The `pututline' function inserts the entry `*UTMP' at the
+-     appropriate place in the user accounting database.  If it finds
+-     that it is not already at the correct place in the database, it
+-     uses `getutid' to search for the position to insert the entry,
+-     however this will not modify the static structure returned by
+-     `getutent', `getutid' and `getutline'.  If this search fails, the
+-     entry is appended to the database.
+-
+-     The `pututline' function returns a pointer to a copy of the entry
+-     inserted in the user accounting database, or a null pointer if the
+-     entry could not be added.  The following `errno' error conditions
+-     are defined for this function:
+-
+-    `EPERM'
+-          The process does not have the appropriate privileges; you
+-          cannot modify the user accounting database.
+-
+-   All the `get*' functions mentioned before store the information they
+-return in a static buffer.  This can be a problem in multi-threaded
+-programs since the data return for the request is overwritten be the
+-return value data in another thread.  Therefore the GNU C Library
+-provides as extensions three more functions which return the data in a
+-user-provided buffer.
+-
+- - Function: int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)
+-     The `getutent_r' is equivalent to the `getutent' function.  It
+-     returns the next entry from the database.  But instead of storing
+-     the information in a static buffer it stores it in the buffer
+-     pointed to by the parameter BUFFER.
+-
+-     If the call was successful, the function returns `0' and the
+-     pointer variable pointed to by the parameter RESULT contains a
+-     pointer to the buffer which contains the result (this is most
+-     probably the same value as BUFFER).  If something went wrong
+-     during the execution of `getutent_r' the function returns `-1'.
+-
+-     This function is a GNU extension.
+-
+- - Function: int getutid_r (const struct utmp *ID, struct utmp *BUFFER,
+-          struct utmp **RESULT)
+-     This function retrieves just like `getutid' the next entry matching
+-     the information stored in ID.  But the result is stored in the
+-     buffer pointed to by the parameter BUFFER.
+-
+-     If successful the function returns `0' and the pointer variable
+-     pointed to by the parameter RESULT contains a pointer to the
+-     buffer with the result (probably the same as RESULT.  If not
+-     successful the function return `-1'.
+-
+-     This function is a GNU extension.
+-
+- - Function: int getutline_r (const struct utmp *LINE, struct utmp
+-          *BUFFER, struct utmp **RESULT)
+-     This function retrieves just like `getutline' the next entry
+-     matching the information stored in LINE.  But the result is stored
+-     in the buffer pointed to by the parameter BUFFER.
+-
+-     If successful the function returns `0' and the pointer variable
+-     pointed to by the parameter RESULT contains a pointer to the
+-     buffer with the result (probably the same as RESULT.  If not
+-     successful the function return `-1'.
+-
+-     This function is a GNU extension.
+-
+-   In addition to the user accounting database, most systems keep a
+-number of similar databases.  For example most systems keep a log file
+-with all previous logins (usually in `/etc/wtmp' or `/var/log/wtmp').
+-
+-   For specifying which database to examine, the following function
+-should be used.
+-
+- - Function: int utmpname (const char *FILE)
+-     The `utmpname' function changes the name of the database to be
+-     examined to FILE, and closes any previously opened database.  By
+-     default `getutent', `getutid', `getutline' and `pututline' read
+-     from and write to the user accounting database.
+-
+-     The following macros are defined for use as the FILE argument:
+-
+-      - Macro: char * _PATH_UTMP
+-          This macro is used to specify the user accounting database.
+-
+-      - Macro: char * _PATH_WTMP
+-          This macro is used to specify the user accounting log file.
+-
+-     The `utmpname' function returns a value of `0' if the new name was
+-     successfully stored, and a value of `-1' to indicate an error.
+-     Note that `utmpname' does not try to open the database, and that
+-     therefore the return value does not say anything about whether the
+-     database can be successfully opened.
+-
+-   Specially for maintaining log-like databases the GNU C Library
+-provides the following function:
+-
+- - Function: void updwtmp (const char *WTMP_FILE, const struct utmp
+-          *UTMP)
+-     The `updwtmp' function appends the entry *UTMP to the database
+-     specified by WTMP_FILE.  For possible values for the WTMP_FILE
+-     argument see the `utmpname' function.
+-
+-   *Portability Note:* Although many operating systems provide a subset
+-of these functions, they are not standardized.  There are often subtle
+-differences in the return types, and there are considerable differences
+-between the various definitions of `struct utmp'.  When programming for
+-the GNU system, it is probably best to stick with the functions
+-described in this section.  If however, you want your program to be
+-portable, consider using the XPG functions described in *Note XPG
+-Functions::, or take a look at the BSD compatible functions in *Note
+-Logging In and Out::.
+-
+-
+-File: libc.info,  Node: XPG Functions,  Next: Logging In and Out,  Prev: Manipulating the Database,  Up: User Accounting Database
+-
+-XPG User Accounting Database Functions
+---------------------------------------
+-
+-   These functions, described in the X/Open Portability Guide, are
+-declared in the header file `utmpx.h'.
+-
+- - Data Type: struct utmpx
+-     The `utmpx' data structure contains at least the following members:
+-
+-    `short int ut_type'
+-          Specifies the type of login; one of `EMPTY', `RUN_LVL',
+-          `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS',
+-          `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS'.
+-
+-    `pid_t ut_pid'
+-          The process ID number of the login process.
+-
+-    `char ut_line[]'
+-          The device name of the tty (without `/dev/').
+-
+-    `char ut_id[]'
+-          The inittab ID of the process.
+-
+-    `char ut_user[]'
+-          The user's login name.
+-
+-    `struct timeval ut_tv'
+-          Time the entry was made.  For entries of type `OLD_TIME' this
+-          is the time when the system clock changed, and for entries of
+-          type `NEW_TIME' this is the time the system clock was set to.
+-     On the GNU system, `struct utmpx' is identical to `struct utmp'
+-     except for the fact that including `utmpx.h' does not make visible
+-     the declaration of `struct exit_status'.
+-
+-   The following macros are defined for use as values for the `ut_type'
+-member of the `utmpx' structure.  The values are integer constants and
+-are, on the GNU system, identical to the definitions in `utmp.h'.
+-
+-`EMPTY'
+-     This macro is used to indicate that the entry contains no valid
+-     user accounting information.
+-
+-`RUN_LVL'
+-     This macro is used to identify the systems runlevel.
+-
+-`BOOT_TIME'
+-     This macro is used to identify the time of system boot.
+-
+-`OLD_TIME'
+-     This macro is used to identify the time when the system clock
+-     changed.
+-
+-`NEW_TIME'
+-     This macro is used to identify the time after the system changed.
+-
+-`INIT_PROCESS'
+-     This macro is used to identify a process spawned by the init
+-     process.
+-
+-`LOGIN_PROCESS'
+-     This macro is used to identify the session leader of a logged in
+-     user.
+-
+-`USER_PROCESS'
+-     This macro is used to identify a user process.
+-
+-`DEAD_PROCESS'
+-     This macro is used to identify a terminated process.
+-
+-   The size of the `ut_line', `ut_id' and `ut_user' arrays can be found
+-using the `sizeof' operator.
+-
+- - Function: void setutxent (void)
+-     This function is similar to `setutent'.  On the GNU system it is
+-     simply an alias for `setutent'.
+-
+- - Function: struct utmpx * getutxent (void)
+-     The `getutxent' function is similar to `getutent', but returns a
+-     pointer to a `struct utmpx' instead of `struct utmp'.  On the GNU
+-     system it simply is an alias for `getutent'.
+-
+- - Function: void endutxent (void)
+-     This function is similar to `endutent'.  On the GNU system it is
+-     simply an alias for `endutent'.
+-
+- - Function: struct utmpx * getutxid (const struct utmpx *ID)
+-     This function is similar to `getutid', but uses `struct utmpx'
+-     instead of `struct utmp'.  On the GNU system it is simply an alias
+-     for `getutid'.
+-
+- - Function: struct utmpx * getutxline (const struct utmpx *LINE)
+-     This function is similar to `getutid', but uses `struct utmpx'
+-     instead of `struct utmp'.  On the GNU system it is simply an alias
+-     for `getutline'.
+-
+- - Function: struct utmpx * pututxline (const struct utmpx *UTMP)
+-     The `pututxline' function provides functionality identical to
+-     `pututline', but uses `struct utmpx' instead of `struct utmp'.  On
+-     the GNU system `pututxline' is simply an alias for `pututline'.
+-
+-
+-File: libc.info,  Node: Logging In and Out,  Prev: XPG Functions,  Up: User Accounting Database
+-
+-Logging In and Out
+-------------------
+-
+-   These functions, derived from BSD, are available in the separate
+-`libutil' library, and declared in `utmp.h'.
+-
+-   Note that the `ut_user' member of `struct utmp' is called `ut_name'
+-in BSD.  Therefore, `ut_name' is defined as an alias for `ut_user' in
+-`utmp.h'.
+-
+- - Function: int login_tty (int FILEDES)
+-     This function makes FILEDES the controlling terminal of the
+-     current process, redirects standard input, standard output and
+-     standard error output to this terminal, and closes FILEDES.
+-
+-     This function returns `0' on successful completion, and `-1' on
+-     error.
+-
+- - Function: void login (const struct utmp *ENTRY)
+-     The `login' functions inserts an entry into the user accounting
+-     database.  The `ut_line' member is set to the name of the terminal
+-     on standard input.  If standard input is not a terminal `login'
+-     uses standard output or standard error output to determine the
+-     name of the terminal.  If `struct utmp' has a `ut_type' member,
+-     `login' sets it to `USER_PROCESS', and if there is an `ut_pid'
+-     member, it will be set to the process ID of the current process.
+-     The remaining entries are copied from ENTRY.
+-
+-     A copy of the entry is written to the user accounting log file.
+-
+- - Function: int logout (const char *UT_LINE)
+-     This function modifies the user accounting database to indicate
+-     that the user on UT_LINE has logged out.
+-
+-     The `logout' function returns `1' if the entry was successfully
+-     written to the database, or `0' on error.
+-
+- - Function: void logwtmp (const char *UT_LINE, const char *UT_NAME,
+-          const char *UT_HOST)
+-     The `logwtmp' function appends an entry to the user accounting log
+-     file, for the current time and the information provided in the
+-     UT_LINE, UT_NAME and UT_HOST arguments.
+-
+-   *Portability Note:* The BSD `struct utmp' only has the `ut_line',
+-`ut_name', `ut_host' and `ut_time' members.  Older systems do not even
+-have the `ut_host' member.
+-
+-
+-File: libc.info,  Node: User Database,  Next: Group Database,  Prev: User Accounting Database,  Up: Users and Groups
+-
+-User Database
+-=============
+-
+-   This section describes how to search and scan the database of
+-registered users.  The database itself is kept in the file
+-`/etc/passwd' on most systems, but on some systems a special network
+-server gives access to it.
+-
+-* Menu:
+-
+-* User Data Structure::         What each user record contains.
+-* Lookup User::                 How to look for a particular user.
+-* Scanning All Users::          Scanning the list of all users, one by one.
+-* Writing a User Entry::        How a program can rewrite a user's record.
+-
+-
+-File: libc.info,  Node: User Data Structure,  Next: Lookup User,  Up: User Database
+-
+-The Data Structure that Describes a User
+-----------------------------------------
+-
+-   The functions and data structures for accessing the system user
+-database are declared in the header file `pwd.h'.
+-
+- - Data Type: struct passwd
+-     The `passwd' data structure is used to hold information about
+-     entries in the system user data base.  It has at least the
+-     following members:
+-
+-    `char *pw_name'
+-          The user's login name.
+-
+-    `char *pw_passwd.'
+-          The encrypted password string.
+-
+-    `uid_t pw_uid'
+-          The user ID number.
+-
+-    `gid_t pw_gid'
+-          The user's default group ID number.
+-
+-    `char *pw_gecos'
+-          A string typically containing the user's real name, and
+-          possibly other information such as a phone number.
+-
+-    `char *pw_dir'
+-          The user's home directory, or initial working directory.
+-          This might be a null pointer, in which case the
+-          interpretation is system-dependent.
+-
+-    `char *pw_shell'
+-          The user's default shell, or the initial program run when the
+-          user logs in.  This might be a null pointer, indicating that
+-          the system default should be used.
+-
+-
+-File: libc.info,  Node: Lookup User,  Next: Scanning All Users,  Prev: User Data Structure,  Up: User Database
+-
+-Looking Up One User
+--------------------
+-
+-   You can search the system user database for information about a
+-specific user using `getpwuid' or `getpwnam'.  These functions are
+-declared in `pwd.h'.
+-
+- - Function: struct passwd * getpwuid (uid_t UID)
+-     This function returns a pointer to a statically-allocated structure
+-     containing information about the user whose user ID is UID.  This
+-     structure may be overwritten on subsequent calls to `getpwuid'.
+-
+-     A null pointer value indicates there is no user in the data base
+-     with user ID UID.
+-
+- - Function: int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char
+-          *BUFFER, size_t BUFLEN, struct passwd **RESULT)
+-     This function is similar to `getpwuid' in that it returns
+-     information about the user whose user ID is UID.  However, it
+-     fills the user supplied structure pointed to by RESULT_BUF with
+-     the information instead of using a static buffer.  The first
+-     BUFLEN bytes of the additional buffer pointed to by BUFFER are
+-     used to contain additional information, normally strings which are
+-     pointed to by the elements of the result structure.
+-
+-     If a user with ID UID is found, the pointer returned in RESULT
+-     points to the record which contains the wanted data (i.e., RESULT
+-     contains the value RESULT_BUF).  If no user is found or if an
+-     error occured, the pointer returned in RESULT is a null pointer.
+-     The function returns zero or an error code.  If the buffer BUFFER
+-     is too small to contain all the needed information, the error code
+-     `ERANGE' is returned and ERRNO is set to `ERANGE'.
+-
+- - Function: struct passwd * getpwnam (const char *NAME)
+-     This function returns a pointer to a statically-allocated structure
+-     containing information about the user whose user name is NAME.
+-     This structure may be overwritten on subsequent calls to
+-     `getpwnam'.
+-
+-     A null pointer return indicates there is no user named NAME.
+-
+- - Function: int getpwnam_r (const char *NAME, struct passwd
+-          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd
+-          **RESULT)
+-     This function is similar to `getpwnam' in that is returns
+-     information about the user whose user name is NAME.  However, like
+-     `getpwuid_r', it fills the user supplied buffers in RESULT_BUF and
+-     BUFFER with the information instead of using a static buffer.
+-
+-     The return values are the same as for `getpwuid_r'.
+-
+-
+-File: libc.info,  Node: Scanning All Users,  Next: Writing a User Entry,  Prev: Lookup User,  Up: User Database
+-
+-Scanning the List of All Users
+-------------------------------
+-
+-   This section explains how a program can read the list of all users in
+-the system, one user at a time.  The functions described here are
+-declared in `pwd.h'.
+-
+-   You can use the `fgetpwent' function to read user entries from a
+-particular file.
+-
+- - Function: struct passwd * fgetpwent (FILE *STREAM)
+-     This function reads the next user entry from STREAM and returns a
+-     pointer to the entry.  The structure is statically allocated and is
+-     rewritten on subsequent calls to `fgetpwent'.  You must copy the
+-     contents of the structure if you wish to save the information.
+-
+-     The stream must correspond to a file in the same format as the
+-     standard password database file.
+-
+- - Function: int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF,
+-          char *BUFFER, size_t BUFLEN, struct passwd **RESULT)
+-     This function is similar to `fgetpwent' in that it reads the next
+-     user entry from STREAM.  But the result is returned in the
+-     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
+-     additional buffer pointed to by BUFFER are used to contain
+-     additional information, normally strings which are pointed to by
+-     the elements of the result structure.
+-
+-     The stream must correspond to a file in the same format as the
+-     standard password database file.
+-
+-     If the function returns zero RESULT points to the structure with
+-     the wanted data (normally this is in RESULT_BUF).  If errors
+-     occurred the return value is nonzero and RESULT contains a null
+-     pointer.
+-
+-   The way to scan all the entries in the user database is with
+-`setpwent', `getpwent', and `endpwent'.
+-
+- - Function: void setpwent (void)
+-     This function initializes a stream which `getpwent' and
+-     `getpwent_r' use to read the user database.
+-
+- - Function: struct passwd * getpwent (void)
+-     The `getpwent' function reads the next entry from the stream
+-     initialized by `setpwent'.  It returns a pointer to the entry.  The
+-     structure is statically allocated and is rewritten on subsequent
+-     calls to `getpwent'.  You must copy the contents of the structure
+-     if you wish to save the information.
+-
+-     A null pointer is returned when no more entries are available.
+-
+- - Function: int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER,
+-          int BUFLEN, struct passwd **RESULT)
+-     This function is similar to `getpwent' in that it returns the next
+-     entry from the stream initialized by `setpwent'.  Like
+-     `fgetpwent_r', it uses the user-supplied buffers in RESULT_BUF and
+-     BUFFER to return the information requested.
+-
+-     The return values are the same as for `fgetpwent_r'.
+-
+-
+- - Function: void endpwent (void)
+-     This function closes the internal stream used by `getpwent' or
+-     `getpwent_r'.
+-
+-
+-File: libc.info,  Node: Writing a User Entry,  Prev: Scanning All Users,  Up: User Database
+-
+-Writing a User Entry
+---------------------
+-
+- - Function: int putpwent (const struct passwd *P, FILE *STREAM)
+-     This function writes the user entry `*P' to the stream STREAM, in
+-     the format used for the standard user database file.  The return
+-     value is zero on success and nonzero on failure.
+-
+-     This function exists for compatibility with SVID.  We recommend
+-     that you avoid using it, because it makes sense only on the
+-     assumption that the `struct passwd' structure has no members
+-     except the standard ones; on a system which merges the traditional
+-     Unix data base with other extended information about users, adding
+-     an entry using this function would inevitably leave out much of
+-     the important information.
+-
+-     The function `putpwent' is declared in `pwd.h'.
+-
+-
+-File: libc.info,  Node: Group Database,  Next: Database Example,  Prev: User Database,  Up: Users and Groups
+-
+-Group Database
+-==============
+-
+-   This section describes how to search and scan the database of
+-registered groups.  The database itself is kept in the file
+-`/etc/group' on most systems, but on some systems a special network
+-service provides access to it.
+-
+-* Menu:
+-
+-* Group Data Structure::        What each group record contains.
+-* Lookup Group::                How to look for a particular group.
+-* Scanning All Groups::         Scanning the list of all groups.
+-
+-
+-File: libc.info,  Node: Group Data Structure,  Next: Lookup Group,  Up: Group Database
+-
+-The Data Structure for a Group
+-------------------------------
+-
+-   The functions and data structures for accessing the system group
+-database are declared in the header file `grp.h'.
+-
+- - Data Type: struct group
+-     The `group' structure is used to hold information about an entry in
+-     the system group database.  It has at least the following members:
+-
+-    `char *gr_name'
+-          The name of the group.
+-
+-    `gid_t gr_gid'
+-          The group ID of the group.
+-
+-    `char **gr_mem'
+-          A vector of pointers to the names of users in the group.
+-          Each user name is a null-terminated string, and the vector
+-          itself is terminated by a null pointer.
+-
+-
+-File: libc.info,  Node: Lookup Group,  Next: Scanning All Groups,  Prev: Group Data Structure,  Up: Group Database
+-
+-Looking Up One Group
+---------------------
+-
+-   You can search the group database for information about a specific
+-group using `getgrgid' or `getgrnam'.  These functions are declared in
+-`grp.h'.
+-
+- - Function: struct group * getgrgid (gid_t GID)
+-     This function returns a pointer to a statically-allocated structure
+-     containing information about the group whose group ID is GID.
+-     This structure may be overwritten by subsequent calls to
+-     `getgrgid'.
+-
+-     A null pointer indicates there is no group with ID GID.
+-
+- - Function: int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char
+-          *BUFFER, size_t BUFLEN, struct group **RESULT)
+-     This function is similar to `getgrgid' in that it returns
+-     information about the group whose group ID is GID.  However, it
+-     fills the user supplied structure pointed to by RESULT_BUF with
+-     the information instead of using a static buffer.  The first
+-     BUFLEN bytes of the additional buffer pointed to by BUFFER are
+-     used to contain additional information, normally strings which are
+-     pointed to by the elements of the result structure.
+-
+-     If a group with ID GID is found, the pointer returned in RESULT
+-     points to the record which contains the wanted data (i.e., RESULT
+-     contains the value RESULT_BUF).  If no group is found or if an
+-     error occured, the pointer returned in RESULT is a null pointer.
+-     The function returns zero or an error code.  If the buffer BUFFER
+-     is too small to contain all the needed information, the error code
+-     `ERANGE' is returned and ERRNO is set to `ERANGE'.
+-
+- - Function: struct group * getgrnam (const char *NAME)
+-     This function returns a pointer to a statically-allocated structure
+-     containing information about the group whose group name is NAME.
+-     This structure may be overwritten by subsequent calls to
+-     `getgrnam'.
+-
+-     A null pointer indicates there is no group named NAME.
+-
+- - Function: int getgrnam_r (const char *NAME, struct group
+-          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group
+-          **RESULT)
+-     This function is similar to `getgrnam' in that is returns
+-     information about the group whose group name is NAME.  Like
+-     `getgrgid_r', it uses the user supplied buffers in RESULT_BUF and
+-     BUFFER, not a static buffer.
+-
+-     The return values are the same as for `getgrgid_r' `ERANGE'.
+-
+-
+-File: libc.info,  Node: Scanning All Groups,  Prev: Lookup Group,  Up: Group Database
+-
+-Scanning the List of All Groups
+--------------------------------
+-
+-   This section explains how a program can read the list of all groups
+-in the system, one group at a time.  The functions described here are
+-declared in `grp.h'.
+-
+-   You can use the `fgetgrent' function to read group entries from a
+-particular file.
+-
+- - Function: struct group * fgetgrent (FILE *STREAM)
+-     The `fgetgrent' function reads the next entry from STREAM.  It
+-     returns a pointer to the entry.  The structure is statically
+-     allocated and is overwritten on subsequent calls to `fgetgrent'.
+-     You must copy the contents of the structure if you wish to save the
+-     information.
+-
+-     The stream must correspond to a file in the same format as the
+-     standard group database file.
+-
+- - Function: int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF,
+-          char *BUFFER, size_t BUFLEN, struct group **RESULT)
+-     This function is similar to `fgetgrent' in that it reads the next
+-     user entry from STREAM.  But the result is returned in the
+-     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
+-     additional buffer pointed to by BUFFER are used to contain
+-     additional information, normally strings which are pointed to by
+-     the elements of the result structure.
+-
+-     This stream must correspond to a file in the same format as the
+-     standard group database file.
+-
+-     If the function returns zero RESULT points to the structure with
+-     the wanted data (normally this is in RESULT_BUF).  If errors
+-     occurred the return value is non-zero and RESULT contains a null
+-     pointer.
+-
+-   The way to scan all the entries in the group database is with
+-`setgrent', `getgrent', and `endgrent'.
+-
+- - Function: void setgrent (void)
+-     This function initializes a stream for reading from the group data
+-     base.  You use this stream by calling `getgrent' or `getgrent_r'.
+-
+- - Function: struct group * getgrent (void)
+-     The `getgrent' function reads the next entry from the stream
+-     initialized by `setgrent'.  It returns a pointer to the entry.  The
+-     structure is statically allocated and is overwritten on subsequent
+-     calls to `getgrent'.  You must copy the contents of the structure
+-     if you wish to save the information.
+-
+- - Function: int getgrent_r (struct group *RESULT_BUF, char *BUFFER,
+-          size_t BUFLEN, struct group **RESULT)
+-     This function is similar to `getgrent' in that it returns the next
+-     entry from the stream initialized by `setgrent'.  Like
+-     `fgetgrent_r', it places the result in user-supplied buffers
+-     pointed to RESULT_BUF and BUFFER.
+-
+-     If the function returns zero RESULT contains a pointer to the data
+-     (normally equal to RESULT_BUF).  If errors occurred the return
+-     value is non-zero and RESULT contains a null pointer.
+-
+- - Function: void endgrent (void)
+-     This function closes the internal stream used by `getgrent' or
+-     `getgrent_r'.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-4 glibc-2.1.3/manual/libc.info-4
+--- ../glibc-2.1.3/manual/libc.info-4	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-4	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1233 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Hooks for Malloc,  Next: Statistics of Malloc,  Prev: Heap Consistency Checking,  Up: Unconstrained Allocation
+-
+-Storage Allocation Hooks
+-------------------------
+-
+-   The GNU C library lets you modify the behavior of `malloc',
+-`realloc', and `free' by specifying appropriate hook functions.  You
+-can use these hooks to help you debug programs that use dynamic storage
+-allocation, for example.
+-
+-   The hook variables are declared in `malloc.h'.
+-
+- - Variable: __malloc_hook
+-     The value of this variable is a pointer to function that `malloc'
+-     uses whenever it is called.  You should define this function to
+-     look like `malloc'; that is, like:
+-
+-          void *FUNCTION (size_t SIZE, void *CALLER)
+-
+-     The value of CALLER is the return address found on the stack when
+-     the `malloc' function was called.  This value allows to trace the
+-     memory consumption of the program.
+-
+- - Variable: __realloc_hook
+-     The value of this variable is a pointer to function that `realloc'
+-     uses whenever it is called.  You should define this function to
+-     look like `realloc'; that is, like:
+-
+-          void *FUNCTION (void *PTR, size_t SIZE, void *CALLER)
+-
+-     The value of CALLER is the return address found on the stack when
+-     the `realloc' function was called.  This value allows to trace the
+-     memory consumption of the program.
+-
+- - Variable: __free_hook
+-     The value of this variable is a pointer to function that `free'
+-     uses whenever it is called.  You should define this function to
+-     look like `free'; that is, like:
+-
+-          void FUNCTION (void *PTR, void *CALLER)
+-
+-     The value of CALLER is the return address found on the stack when
+-     the `free' function was called.  This value allows to trace the
+-     memory consumption of the program.
+-
+- - Variable: __memalign_hook
+-     The value of this variable is a pointer to function that `memalign'
+-     uses whenever it is called.  You should define this function to
+-     look like `memalign'; that is, like:
+-
+-          void *FUNCTION (size_t SIZE, size_t ALIGNMENT)
+-
+-   You must make sure that the function you install as a hook for one of
+-these functions does not call that function recursively without
+-restoring the old value of the hook first!  Otherwise, your program
+-will get stuck in an infinite recursion.  Before calling the function
+-recursively, one should make sure to restore all the hooks to their
+-previous value.  When coming back from the recursive call, all the
+-hooks should be resaved since a hook might modify itself.
+-
+-   Here is an example showing how to use `__malloc_hook' and
+-`__free_hook' properly.  It installs a function that prints out
+-information every time `malloc' or `free' is called.  We just assume
+-here that `realloc' and `memalign' are not used in our program.
+-
+-     /* Global variables used to hold underlaying hook values.  */
+-     static void *(*old_malloc_hook) (size_t);
+-     static void (*old_free_hook) (void*);
+-     
+-     /* Prototypes for our hooks.  */
+-     static void *my_malloc_hook (size_t);
+-     static void my_free_hook(void*);
+-     
+-     static void *
+-     my_malloc_hook (size_t size)
+-     {
+-       void *result;
+-       /* Restore all old hooks */
+-       __malloc_hook = old_malloc_hook;
+-       __free_hook = old_free_hook;
+-       /* Call recursively */
+-       result = malloc (size);
+-       /* Save underlaying hooks */
+-       old_malloc_hook = __malloc_hook;
+-       old_free_hook = __free_hook;
+-       /* `printf' might call `malloc', so protect it too. */
+-       printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
+-       /* Restore our own hooks */
+-       __malloc_hook = my_malloc_hook;
+-       __free_hook = my_free_hook;
+-       return result;
+-     }
+-     
+-     static void *
+-     my_free_hook (void *ptr)
+-     {
+-       /* Restore all old hooks */
+-       __malloc_hook = old_malloc_hook;
+-       __free_hook = old_free_hook;
+-       /* Call recursively */
+-       free (ptr);
+-       /* Save underlaying hooks */
+-       old_malloc_hook = __malloc_hook;
+-       old_free_hook = __free_hook;
+-       /* `printf' might call `free', so protect it too. */
+-       printf ("freed pointer %p\n", ptr);
+-       /* Restore our own hooks */
+-       __malloc_hook = my_malloc_hook;
+-       __free_hook = my_free_hook;
+-     }
+-     
+-     main ()
+-     {
+-       ...
+-       old_malloc_hook = __malloc_hook;
+-       old_free_hook = __free_hook;
+-       __malloc_hook = my_malloc_hook;
+-       __free_hook = my_free_hook;
+-       ...
+-     }
+-
+-   The `mcheck' function (*note Heap Consistency Checking::.) works by
+-installing such hooks.
+-
+-
+-File: libc.info,  Node: Statistics of Malloc,  Next: Summary of Malloc,  Prev: Hooks for Malloc,  Up: Unconstrained Allocation
+-
+-Statistics for Storage Allocation with `malloc'
+------------------------------------------------
+-
+-   You can get information about dynamic storage allocation by calling
+-the `mallinfo' function.  This function and its associated data type
+-are declared in `malloc.h'; they are an extension of the standard
+-SVID/XPG version.
+-
+- - Data Type: struct mallinfo
+-     This structure type is used to return information about the dynamic
+-     storage allocator.  It contains the following members:
+-
+-    `int arena'
+-          This is the total size of memory allocated with `sbrk' by
+-          `malloc', in bytes.
+-
+-    `int ordblks'
+-          This is the number of chunks not in use.  (The storage
+-          allocator internally gets chunks of memory from the operating
+-          system, and then carves them up to satisfy individual
+-          `malloc' requests; see *Note Efficiency and Malloc::.)
+-
+-    `int smblks'
+-          This field is unused.
+-
+-    `int hblks'
+-          This is the total number of chunks allocated with `mmap'.
+-
+-    `int hblkhd'
+-          This is the total size of memory allocated with `mmap', in
+-          bytes.
+-
+-    `int usmblks'
+-          This field is unused.
+-
+-    `int fsmblks'
+-          This field is unused.
+-
+-    `int uordblks'
+-          This is the total size of memory occupied by chunks handed
+-          out by `malloc'.
+-
+-    `int fordblks'
+-          This is the total size of memory occupied by free (not in
+-          use) chunks.
+-
+-    `int keepcost'
+-          This is the size of the top-most, releaseable chunk that
+-          normally borders the end of the heap (i.e. the "brk" of the
+-          process).
+-
+-
+- - Function: struct mallinfo mallinfo (void)
+-     This function returns information about the current dynamic memory
+-     usage in a structure of type `struct mallinfo'.
+-
+-
+-File: libc.info,  Node: Summary of Malloc,  Prev: Statistics of Malloc,  Up: Unconstrained Allocation
+-
+-Summary of `malloc'-Related Functions
+--------------------------------------
+-
+-   Here is a summary of the functions that work with `malloc':
+-
+-`void *malloc (size_t SIZE)'
+-     Allocate a block of SIZE bytes.  *Note Basic Allocation::.
+-
+-`void free (void *ADDR)'
+-     Free a block previously allocated by `malloc'.  *Note Freeing
+-     after Malloc::.
+-
+-`void *realloc (void *ADDR, size_t SIZE)'
+-     Make a block previously allocated by `malloc' larger or smaller,
+-     possibly by copying it to a new location.  *Note Changing Block
+-     Size::.
+-
+-`void *calloc (size_t COUNT, size_t ELTSIZE)'
+-     Allocate a block of COUNT * ELTSIZE bytes using `malloc', and set
+-     its contents to zero.  *Note Allocating Cleared Space::.
+-
+-`void *valloc (size_t SIZE)'
+-     Allocate a block of SIZE bytes, starting on a page boundary.
+-     *Note Aligned Memory Blocks::.
+-
+-`void *memalign (size_t SIZE, size_t BOUNDARY)'
+-     Allocate a block of SIZE bytes, starting on an address that is a
+-     multiple of BOUNDARY.  *Note Aligned Memory Blocks::.
+-
+-`int mallopt (int PARAM, int VALUE)'
+-     Adjust a tunable parameter.  *Note Malloc Tunable Parameters::.
+-
+-`int mcheck (void (*ABORTFN) (void))'
+-     Tell `malloc' to perform occasional consistency checks on
+-     dynamically allocated memory, and to call ABORTFN when an
+-     inconsistency is found.  *Note Heap Consistency Checking::.
+-
+-`void *(*__malloc_hook) (size_t SIZE, void *CALLER)'
+-     A pointer to a function that `malloc' uses whenever it is called.
+-
+-`void *(*__realloc_hook) (void *PTR, size_t SIZE, void *CALLER)'
+-     A pointer to a function that `realloc' uses whenever it is called.
+-
+-`void (*__free_hook) (void *PTR, void *CALLER)'
+-     A pointer to a function that `free' uses whenever it is called.
+-
+-`void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT)'
+-     A pointer to a function that `memalign' uses whenever it is called.
+-
+-`struct mallinfo mallinfo (void)'
+-     Return information about the current dynamic memory usage.  *Note
+-     Statistics of Malloc::.
+-
+-
+-File: libc.info,  Node: Allocation Debugging,  Next: Obstacks,  Prev: Unconstrained Allocation,  Up: Memory Allocation
+-
+-Allocation Debugging
+-====================
+-
+-   An complicated task when programming with languages which do not use
+-garbage collected dynamic memory allocation is to find memory leaks.
+-Long running programs must assure that dynamically allocated objects are
+-freed at the end of their lifetime.  If this does not happen the system
+-runs out of memory, sooner or later.
+-
+-   The `malloc' implementation in the GNU C library provides some
+-simple means to detect sich leaks and provide some information to find
+-the location.  To do this the application must be started in a special
+-mode which is enabled by an environment variable.  There are no speed
+-penalties if the program is compiled in preparation of the debugging if
+-the debug mode is not enabled.
+-
+-* Menu:
+-
+-* Tracing malloc::               How to install the tracing functionality.
+-* Using the Memory Debugger::    Example programs excerpts.
+-* Tips for the Memory Debugger:: Some more or less clever ideas.
+-* Interpreting the traces::      What do all these lines mean?
+-
+-
+-File: libc.info,  Node: Tracing malloc,  Next: Using the Memory Debugger,  Up: Allocation Debugging
+-
+-How to install the tracing functionality
+-----------------------------------------
+-
+- - Function: void mtrace (void)
+-     When the `mtrace' function is called it looks for an environment
+-     variable named `MALLOC_TRACE'.  This variable is supposed to
+-     contain a valid file name.  The user must have write access.  If
+-     the file already exists it is truncated.  If the environment
+-     variable is not set or it does not name a valid file which can be
+-     opened for writing nothing is done.  The behaviour of `malloc'
+-     etc. is not changed.  For obvious reasons this also happens if the
+-     application is install SUID or SGID.
+-
+-     If the named file is successfully opened `mtrace' installs special
+-     handlers for the functions `malloc', `realloc', and `free' (*note
+-     Hooks for Malloc::.).  From now on all uses of these functions are
+-     traced and protocolled into the file.  There is now of course a
+-     speed penalty for all calls to the traced functions so that the
+-     tracing should not be enabled during their normal use.
+-
+-     This function is a GNU extension and generally not available on
+-     other systems.  The prototype can be found in `mcheck.h'.
+-
+- - Function: void muntrace (void)
+-     The `muntrace' function can be called after `mtrace' was used to
+-     enable tracing the `malloc' calls.  If no (succesful) call of
+-     `mtrace' was made `muntrace' does nothing.
+-
+-     Otherwise it deinstalls the handlers for `malloc', `realloc', and
+-     `free' and then closes the protocol file.  No calls are
+-     protocolled anymore and the programs runs again with the full
+-     speed.
+-
+-     This function is a GNU extension and generally not available on
+-     other systems.  The prototype can be found in `mcheck.h'.
+-
+-
+-File: libc.info,  Node: Using the Memory Debugger,  Next: Tips for the Memory Debugger,  Prev: Tracing malloc,  Up: Allocation Debugging
+-
+-Example programs excerpts
+--------------------------
+-
+-   Even though the tracing functionality does not influence the runtime
+-behaviour of the program it is no wise idea to call `mtrace' in all
+-programs.  Just imagine you debug a program using `mtrace' and all
+-other programs used in the debug sessions also trace their `malloc'
+-calls.  The output file would be the same for all programs and so is
+-unusable.  Therefore one should call `mtrace' only if compiled for
+-debugging.  A program could therefore start like this:
+-
+-     #include <mcheck.h>
+-     
+-     int
+-     main (int argc, char *argv[])
+-     {
+-     #ifdef DEBUGGING
+-       mtrace ();
+-     #endif
+-       ...
+-     }
+-
+-   This is all what is needed if you want to trace the calls during the
+-whole runtime of the program.  Alternatively you can stop the tracing at
+-any time with a call to `muntrace'.  It is even possible to restart the
+-tracing again with a new call to `mtrace'.  But this can course
+-unreliable results since there are possibly calls of the functions which
+-are not called.  Please note that not only the application uses the
+-traced functions, also libraries (including the C library itself) use
+-this function.
+-
+-   This last point is also why it is no good idea to call `muntrace'
+-before the program terminated.  The libraries are informed about the
+-termination of the program only after the program returns from `main'
+-or calls `exit' and so cannot free the memory they use before this time.
+-
+-   So the best thing one can do is to call `mtrace' as the very first
+-function in the program and never call `muntrace'.  So the program
+-traces almost all uses of the `malloc' functions (except those calls
+-which are executed by constructors of the program or used libraries).
+-
+-
+-File: libc.info,  Node: Tips for the Memory Debugger,  Next: Interpreting the traces,  Prev: Using the Memory Debugger,  Up: Allocation Debugging
+-
+-Some more or less clever ideas
+-------------------------------
+-
+-   You know the situation.  The program is prepared for debugging and in
+-all debugging sessions it runs well.  But once it is started without
+-debugging the error shows up.  In our situation here: the memory leaks
+-becomes visible only when we just turned off the debugging.  If you
+-foresee such situations you can still win.  Simply use something
+-equivalent to the following little program:
+-
+-     #include <mcheck.h>
+-     #include <signal.h>
+-     
+-     static void
+-     enable (int sig)
+-     {
+-       mtrace ();
+-       signal (SIGUSR1, enable);
+-     }
+-     
+-     static void
+-     disable (int sig)
+-     {
+-       muntrace ();
+-       signal (SIGUSR2, disable);
+-     }
+-     
+-     int
+-     main (int argc, char *argv[])
+-     {
+-       ...
+-     
+-       signal (SIGUSR1, enable);
+-       signal (SIGUSR2, disable);
+-     
+-       ...
+-     }
+-
+-   I.e., the user can start the memory debugger any time s/he wants if
+-the program was started with `MALLOC_TRACE' set in the environment.
+-The output will of course not show the allocations which happened before
+-the first signal but if there is a memory leak this will show up
+-nevertheless.
+-
+-
+-File: libc.info,  Node: Interpreting the traces,  Prev: Tips for the Memory Debugger,  Up: Allocation Debugging
+-
+-Interpreting the traces
+------------------------
+-
+-   If you take a look at the output it will look similar to this:
+-
+-     = Start
+-      [0x8048209] - 0x8064cc8
+-      [0x8048209] - 0x8064ce0
+-      [0x8048209] - 0x8064cf8
+-      [0x80481eb] + 0x8064c48 0x14
+-      [0x80481eb] + 0x8064c60 0x14
+-      [0x80481eb] + 0x8064c78 0x14
+-      [0x80481eb] + 0x8064c90 0x14
+-     = End
+-
+-   What this all means is not really important since the trace file is
+-not meant to be read by a human.  Therefore no attention is payed to
+-good readability.  Instead there is a program which comes with the GNU C
+-library which interprets the traces and outputs a summary in on
+-user-friendly way.  The program is called `mtrace' (it is in fact a
+-Perl script) and it takes one or two arguments.  In any case the name of
+-the file with the trace output must be specified.  If an optional
+-argument precedes the name of the trace file this must be the name of
+-the program which generated the trace.
+-
+-     drepper$ mtrace tst-mtrace log
+-     No memory leaks.
+-
+-   In this case the program `tst-mtrace' was run and it produced a
+-trace file `log'.  The message printed by `mtrace' shows there are no
+-problems with the code, all allocated memory was freed afterwards.
+-
+-   If we call `mtrace' on the example trace given above we would get a
+-different outout:
+-
+-     drepper$ mtrace errlog
+-     - 0x08064cc8 Free 2 was never alloc'd 0x8048209
+-     - 0x08064ce0 Free 3 was never alloc'd 0x8048209
+-     - 0x08064cf8 Free 4 was never alloc'd 0x8048209
+-     
+-     Memory not freed:
+-     -----------------
+-        Address     Size     Caller
+-     0x08064c48     0x14  at 0x80481eb
+-     0x08064c60     0x14  at 0x80481eb
+-     0x08064c78     0x14  at 0x80481eb
+-     0x08064c90     0x14  at 0x80481eb
+-
+-   We have called `mtrace' with only one argument and so the script has
+-no chance to find out what is meant with the addresses given in the
+-trace.  We can do better:
+-
+-     drepper$ mtrace tst-mtrace errlog
+-     - 0x08064cc8 Free 2 was never alloc'd /home/drepper/tst-mtrace.c:39
+-     - 0x08064ce0 Free 3 was never alloc'd /home/drepper/tst-mtrace.c:39
+-     - 0x08064cf8 Free 4 was never alloc'd /home/drepper/tst-mtrace.c:39
+-     
+-     Memory not freed:
+-     -----------------
+-        Address     Size     Caller
+-     0x08064c48     0x14  at /home/drepper/tst-mtrace.c:33
+-     0x08064c60     0x14  at /home/drepper/tst-mtrace.c:33
+-     0x08064c78     0x14  at /home/drepper/tst-mtrace.c:33
+-     0x08064c90     0x14  at /home/drepper/tst-mtrace.c:33
+-
+-   Suddenly the output makes much more sense and the user can see
+-immediately where the function calls causing the trouble can be found.
+-
+-   Interpreting this output is not complicated.  There are at most two
+-different situations being detected.  First, `free' was called for
+-pointers which were never returned by one of the allocation functions.
+-This is usually a very bad problem and how this looks like is shown in
+-the first three lines of the output.  Situations like this are quite
+-rare and if they appear they show up very drastically: the program
+-normally crashes.
+-
+-   The other situation which is much harder to detect are memory leaks.
+-As you can see in the output the `mtrace' function collects all this
+-information and so can say that the program calls an allocation function
+-from line 33 in the source file `/home/drepper/tst-mtrace.c' four times
+-without freeing this memory before the program terminates.  Whether
+-this is a real problem keeps to be investigated.
+-
+-
+-File: libc.info,  Node: Obstacks,  Next: Variable Size Automatic,  Prev: Allocation Debugging,  Up: Memory Allocation
+-
+-Obstacks
+-========
+-
+-   An "obstack" is a pool of memory containing a stack of objects.  You
+-can create any number of separate obstacks, and then allocate objects in
+-specified obstacks.  Within each obstack, the last object allocated must
+-always be the first one freed, but distinct obstacks are independent of
+-each other.
+-
+-   Aside from this one constraint of order of freeing, obstacks are
+-totally general: an obstack can contain any number of objects of any
+-size.  They are implemented with macros, so allocation is usually very
+-fast as long as the objects are usually small.  And the only space
+-overhead per object is the padding needed to start each object on a
+-suitable boundary.
+-
+-* Menu:
+-
+-* Creating Obstacks::		How to declare an obstack in your program.
+-* Preparing for Obstacks::	Preparations needed before you can
+-				 use obstacks.
+-* Allocation in an Obstack::    Allocating objects in an obstack.
+-* Freeing Obstack Objects::     Freeing objects in an obstack.
+-* Obstack Functions::		The obstack functions are both
+-				 functions and macros.
+-* Growing Objects::             Making an object bigger by stages.
+-* Extra Fast Growing::		Extra-high-efficiency (though more
+-				 complicated) growing objects.
+-* Status of an Obstack::        Inquiries about the status of an obstack.
+-* Obstacks Data Alignment::     Controlling alignment of objects in obstacks.
+-* Obstack Chunks::              How obstacks obtain and release chunks;
+-				 efficiency considerations.
+-* Summary of Obstacks::
+-
+-
+-File: libc.info,  Node: Creating Obstacks,  Next: Preparing for Obstacks,  Up: Obstacks
+-
+-Creating Obstacks
+------------------
+-
+-   The utilities for manipulating obstacks are declared in the header
+-file `obstack.h'.
+-
+- - Data Type: struct obstack
+-     An obstack is represented by a data structure of type `struct
+-     obstack'.  This structure has a small fixed size; it records the
+-     status of the obstack and how to find the space in which objects
+-     are allocated.  It does not contain any of the objects themselves.
+-     You should not try to access the contents of the structure
+-     directly; use only the functions described in this chapter.
+-
+-   You can declare variables of type `struct obstack' and use them as
+-obstacks, or you can allocate obstacks dynamically like any other kind
+-of object.  Dynamic allocation of obstacks allows your program to have a
+-variable number of different stacks.  (You can even allocate an obstack
+-structure in another obstack, but this is rarely useful.)
+-
+-   All the functions that work with obstacks require you to specify
+-which obstack to use.  You do this with a pointer of type `struct
+-obstack *'.  In the following, we often say "an obstack" when strictly
+-speaking the object at hand is such a pointer.
+-
+-   The objects in the obstack are packed into large blocks called
+-"chunks".  The `struct obstack' structure points to a chain of the
+-chunks currently in use.
+-
+-   The obstack library obtains a new chunk whenever you allocate an
+-object that won't fit in the previous chunk.  Since the obstack library
+-manages chunks automatically, you don't need to pay much attention to
+-them, but you do need to supply a function which the obstack library
+-should use to get a chunk.  Usually you supply a function which uses
+-`malloc' directly or indirectly.  You must also supply a function to
+-free a chunk.  These matters are described in the following section.
+-
+-
+-File: libc.info,  Node: Preparing for Obstacks,  Next: Allocation in an Obstack,  Prev: Creating Obstacks,  Up: Obstacks
+-
+-Preparing for Using Obstacks
+-----------------------------
+-
+-   Each source file in which you plan to use the obstack functions must
+-include the header file `obstack.h', like this:
+-
+-     #include <obstack.h>
+-
+-   Also, if the source file uses the macro `obstack_init', it must
+-declare or define two functions or macros that will be called by the
+-obstack library.  One, `obstack_chunk_alloc', is used to allocate the
+-chunks of memory into which objects are packed.  The other,
+-`obstack_chunk_free', is used to return chunks when the objects in them
+-are freed.  These macros should appear before any use of obstacks in
+-the source file.
+-
+-   Usually these are defined to use `malloc' via the intermediary
+-`xmalloc' (*note Unconstrained Allocation::.).  This is done with the
+-following pair of macro definitions:
+-
+-     #define obstack_chunk_alloc xmalloc
+-     #define obstack_chunk_free free
+-
+-Though the storage you get using obstacks really comes from `malloc',
+-using obstacks is faster because `malloc' is called less often, for
+-larger blocks of memory.  *Note Obstack Chunks::, for full details.
+-
+-   At run time, before the program can use a `struct obstack' object as
+-an obstack, it must initialize the obstack by calling `obstack_init'.
+-
+- - Function: int obstack_init (struct obstack *OBSTACK-PTR)
+-     Initialize obstack OBSTACK-PTR for allocation of objects.  This
+-     function calls the obstack's `obstack_chunk_alloc' function.  If
+-     allocation of memory fails, the function pointed to by
+-     `obstack_alloc_failed_handler' is called.  The `obstack_init'
+-     function always returns 1 (Compatibility notice: Former versions of
+-     obstack returned 0 if allocation failed).
+-
+-   Here are two examples of how to allocate the space for an obstack and
+-initialize it.  First, an obstack that is a static variable:
+-
+-     static struct obstack myobstack;
+-     ...
+-     obstack_init (&myobstack);
+-
+-Second, an obstack that is itself dynamically allocated:
+-
+-     struct obstack *myobstack_ptr
+-       = (struct obstack *) xmalloc (sizeof (struct obstack));
+-     
+-     obstack_init (myobstack_ptr);
+-
+- - Variable: obstack_alloc_failed_handler
+-     The value of this variable is a pointer to a function that
+-     `obstack' uses when `obstack_chunk_alloc' fails to allocate
+-     memory.  The default action is to print a message and abort.  You
+-     should supply a function that either calls `exit' (*note Program
+-     Termination::.) or `longjmp' (*note Non-Local Exits::.) and
+-     doesn't return.
+-
+-          void my_obstack_alloc_failed (void)
+-          ...
+-          obstack_alloc_failed_handler = &my_obstack_alloc_failed;
+-
+-
+-
+-File: libc.info,  Node: Allocation in an Obstack,  Next: Freeing Obstack Objects,  Prev: Preparing for Obstacks,  Up: Obstacks
+-
+-Allocation in an Obstack
+-------------------------
+-
+-   The most direct way to allocate an object in an obstack is with
+-`obstack_alloc', which is invoked almost like `malloc'.
+-
+- - Function: void * obstack_alloc (struct obstack *OBSTACK-PTR, int
+-          SIZE)
+-     This allocates an uninitialized block of SIZE bytes in an obstack
+-     and returns its address.  Here OBSTACK-PTR specifies which obstack
+-     to allocate the block in; it is the address of the `struct obstack'
+-     object which represents the obstack.  Each obstack function or
+-     macro requires you to specify an OBSTACK-PTR as the first argument.
+-
+-     This function calls the obstack's `obstack_chunk_alloc' function if
+-     it needs to allocate a new chunk of memory; it calls
+-     `obstack_alloc_failed_handler' if allocation of memory by
+-     `obstack_chunk_alloc' failed.
+-
+-   For example, here is a function that allocates a copy of a string STR
+-in a specific obstack, which is in the variable `string_obstack':
+-
+-     struct obstack string_obstack;
+-     
+-     char *
+-     copystring (char *string)
+-     {
+-       size_t len = strlen (string) + 1;
+-       char *s = (char *) obstack_alloc (&string_obstack, len);
+-       memcpy (s, string, len);
+-       return s;
+-     }
+-
+-   To allocate a block with specified contents, use the function
+-`obstack_copy', declared like this:
+-
+- - Function: void * obstack_copy (struct obstack *OBSTACK-PTR, void
+-          *ADDRESS, int SIZE)
+-     This allocates a block and initializes it by copying SIZE bytes of
+-     data starting at ADDRESS.  It calls `obstack_alloc_failed_handler'
+-     if allocation of memory by `obstack_chunk_alloc' failed.
+-
+- - Function: void * obstack_copy0 (struct obstack *OBSTACK-PTR, void
+-          *ADDRESS, int SIZE)
+-     Like `obstack_copy', but appends an extra byte containing a null
+-     character.  This extra byte is not counted in the argument SIZE.
+-
+-   The `obstack_copy0' function is convenient for copying a sequence of
+-characters into an obstack as a null-terminated string.  Here is an
+-example of its use:
+-
+-     char *
+-     obstack_savestring (char *addr, int size)
+-     {
+-       return obstack_copy0 (&myobstack, addr, size);
+-     }
+-
+-Contrast this with the previous example of `savestring' using `malloc'
+-(*note Basic Allocation::.).
+-
+-
+-File: libc.info,  Node: Freeing Obstack Objects,  Next: Obstack Functions,  Prev: Allocation in an Obstack,  Up: Obstacks
+-
+-Freeing Objects in an Obstack
+------------------------------
+-
+-   To free an object allocated in an obstack, use the function
+-`obstack_free'.  Since the obstack is a stack of objects, freeing one
+-object automatically frees all other objects allocated more recently in
+-the same obstack.
+-
+- - Function: void obstack_free (struct obstack *OBSTACK-PTR, void
+-          *OBJECT)
+-     If OBJECT is a null pointer, everything allocated in the obstack
+-     is freed.  Otherwise, OBJECT must be the address of an object
+-     allocated in the obstack.  Then OBJECT is freed, along with
+-     everything allocated in OBSTACK since OBJECT.
+-
+-   Note that if OBJECT is a null pointer, the result is an
+-uninitialized obstack.  To free all storage in an obstack but leave it
+-valid for further allocation, call `obstack_free' with the address of
+-the first object allocated on the obstack:
+-
+-     obstack_free (obstack_ptr, first_object_allocated_ptr);
+-
+-   Recall that the objects in an obstack are grouped into chunks.  When
+-all the objects in a chunk become free, the obstack library
+-automatically frees the chunk (*note Preparing for Obstacks::.).  Then
+-other obstacks, or non-obstack allocation, can reuse the space of the
+-chunk.
+-
+-
+-File: libc.info,  Node: Obstack Functions,  Next: Growing Objects,  Prev: Freeing Obstack Objects,  Up: Obstacks
+-
+-Obstack Functions and Macros
+-----------------------------
+-
+-   The interfaces for using obstacks may be defined either as functions
+-or as macros, depending on the compiler.  The obstack facility works
+-with all C compilers, including both ISO C and traditional C, but there
+-are precautions you must take if you plan to use compilers other than
+-GNU C.
+-
+-   If you are using an old-fashioned non-ISO C compiler, all the obstack
+-"functions" are actually defined only as macros.  You can call these
+-macros like functions, but you cannot use them in any other way (for
+-example, you cannot take their address).
+-
+-   Calling the macros requires a special precaution: namely, the first
+-operand (the obstack pointer) may not contain any side effects, because
+-it may be computed more than once.  For example, if you write this:
+-
+-     obstack_alloc (get_obstack (), 4);
+-
+-you will find that `get_obstack' may be called several times.  If you
+-use `*obstack_list_ptr++' as the obstack pointer argument, you will get
+-very strange results since the incrementation may occur several times.
+-
+-   In ISO C, each function has both a macro definition and a function
+-definition.  The function definition is used if you take the address of
+-the function without calling it.  An ordinary call uses the macro
+-definition by default, but you can request the function definition
+-instead by writing the function name in parentheses, as shown here:
+-
+-     char *x;
+-     void *(*funcp) ();
+-     /* Use the macro.  */
+-     x = (char *) obstack_alloc (obptr, size);
+-     /* Call the function.  */
+-     x = (char *) (obstack_alloc) (obptr, size);
+-     /* Take the address of the function.  */
+-     funcp = obstack_alloc;
+-
+-This is the same situation that exists in ISO C for the standard library
+-functions.  *Note Macro Definitions::.
+-
+-   *Warning:* When you do use the macros, you must observe the
+-precaution of avoiding side effects in the first operand, even in ISO C.
+-
+-   If you use the GNU C compiler, this precaution is not necessary,
+-because various language extensions in GNU C permit defining the macros
+-so as to compute each argument only once.
+-
+-
+-File: libc.info,  Node: Growing Objects,  Next: Extra Fast Growing,  Prev: Obstack Functions,  Up: Obstacks
+-
+-Growing Objects
+----------------
+-
+-   Because storage in obstack chunks is used sequentially, it is
+-possible to build up an object step by step, adding one or more bytes
+-at a time to the end of the object.  With this technique, you do not
+-need to know how much data you will put in the object until you come to
+-the end of it.  We call this the technique of "growing objects".  The
+-special functions for adding data to the growing object are described
+-in this section.
+-
+-   You don't need to do anything special when you start to grow an
+-object.  Using one of the functions to add data to the object
+-automatically starts it.  However, it is necessary to say explicitly
+-when the object is finished.  This is done with the function
+-`obstack_finish'.
+-
+-   The actual address of the object thus built up is not known until the
+-object is finished.  Until then, it always remains possible that you
+-will add so much data that the object must be copied into a new chunk.
+-
+-   While the obstack is in use for a growing object, you cannot use it
+-for ordinary allocation of another object.  If you try to do so, the
+-space already added to the growing object will become part of the other
+-object.
+-
+- - Function: void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)
+-     The most basic function for adding to a growing object is
+-     `obstack_blank', which adds space without initializing it.
+-
+- - Function: void obstack_grow (struct obstack *OBSTACK-PTR, void
+-          *DATA, int SIZE)
+-     To add a block of initialized space, use `obstack_grow', which is
+-     the growing-object analogue of `obstack_copy'.  It adds SIZE bytes
+-     of data to the growing object, copying the contents from DATA.
+-
+- - Function: void obstack_grow0 (struct obstack *OBSTACK-PTR, void
+-          *DATA, int SIZE)
+-     This is the growing-object analogue of `obstack_copy0'.  It adds
+-     SIZE bytes copied from DATA, followed by an additional null
+-     character.
+-
+- - Function: void obstack_1grow (struct obstack *OBSTACK-PTR, char C)
+-     To add one character at a time, use the function `obstack_1grow'.
+-     It adds a single byte containing C to the growing object.
+-
+- - Function: void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void
+-          *DATA)
+-     Adding the value of a pointer one can use the function
+-     `obstack_ptr_grow'.  It adds `sizeof (void *)' bytes containing
+-     the value of DATA.
+-
+- - Function: void obstack_int_grow (struct obstack *OBSTACK-PTR, int
+-          DATA)
+-     A single value of type `int' can be added by using the
+-     `obstack_int_grow' function.  It adds `sizeof (int)' bytes to the
+-     growing object and initializes them with the value of DATA.
+-
+- - Function: void * obstack_finish (struct obstack *OBSTACK-PTR)
+-     When you are finished growing the object, use the function
+-     `obstack_finish' to close it off and return its final address.
+-
+-     Once you have finished the object, the obstack is available for
+-     ordinary allocation or for growing another object.
+-
+-     This function can return a null pointer under the same conditions
+-     as `obstack_alloc' (*note Allocation in an Obstack::.).
+-
+-   When you build an object by growing it, you will probably need to
+-know afterward how long it became.  You need not keep track of this as
+-you grow the object, because you can find out the length from the
+-obstack just before finishing the object with the function
+-`obstack_object_size', declared as follows:
+-
+- - Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
+-     This function returns the current size of the growing object, in
+-     bytes.  Remember to call this function *before* finishing the
+-     object.  After it is finished, `obstack_object_size' will return
+-     zero.
+-
+-   If you have started growing an object and wish to cancel it, you
+-should finish it and then free it, like this:
+-
+-     obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
+-
+-This has no effect if no object was growing.
+-
+-   You can use `obstack_blank' with a negative size argument to make
+-the current object smaller.  Just don't try to shrink it beyond zero
+-length--there's no telling what will happen if you do that.
+-
+-
+-File: libc.info,  Node: Extra Fast Growing,  Next: Status of an Obstack,  Prev: Growing Objects,  Up: Obstacks
+-
+-Extra Fast Growing Objects
+---------------------------
+-
+-   The usual functions for growing objects incur overhead for checking
+-whether there is room for the new growth in the current chunk.  If you
+-are frequently constructing objects in small steps of growth, this
+-overhead can be significant.
+-
+-   You can reduce the overhead by using special "fast growth" functions
+-that grow the object without checking.  In order to have a robust
+-program, you must do the checking yourself.  If you do this checking in
+-the simplest way each time you are about to add data to the object, you
+-have not saved anything, because that is what the ordinary growth
+-functions do.  But if you can arrange to check less often, or check
+-more efficiently, then you make the program faster.
+-
+-   The function `obstack_room' returns the amount of room available in
+-the current chunk.  It is declared as follows:
+-
+- - Function: int obstack_room (struct obstack *OBSTACK-PTR)
+-     This returns the number of bytes that can be added safely to the
+-     current growing object (or to an object about to be started) in
+-     obstack OBSTACK using the fast growth functions.
+-
+-   While you know there is room, you can use these fast growth functions
+-for adding data to a growing object:
+-
+- - Function: void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char
+-          C)
+-     The function `obstack_1grow_fast' adds one byte containing the
+-     character C to the growing object in obstack OBSTACK-PTR.
+-
+- - Function: void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR,
+-          void *DATA)
+-     The function `obstack_ptr_grow_fast' adds `sizeof (void *)' bytes
+-     containing the value of DATA to the growing object in obstack
+-     OBSTACK-PTR.
+-
+- - Function: void obstack_int_grow_fast (struct obstack *OBSTACK-PTR,
+-          int DATA)
+-     The function `obstack_int_grow_fast' adds `sizeof (int)' bytes
+-     containing the value of DATA to the growing object in obstack
+-     OBSTACK-PTR.
+-
+- - Function: void obstack_blank_fast (struct obstack *OBSTACK-PTR, int
+-          SIZE)
+-     The function `obstack_blank_fast' adds SIZE bytes to the growing
+-     object in obstack OBSTACK-PTR without initializing them.
+-
+-   When you check for space using `obstack_room' and there is not
+-enough room for what you want to add, the fast growth functions are not
+-safe.  In this case, simply use the corresponding ordinary growth
+-function instead.  Very soon this will copy the object to a new chunk;
+-then there will be lots of room available again.
+-
+-   So, each time you use an ordinary growth function, check afterward
+-for sufficient space using `obstack_room'.  Once the object is copied
+-to a new chunk, there will be plenty of space again, so the program will
+-start using the fast growth functions again.
+-
+-   Here is an example:
+-
+-     void
+-     add_string (struct obstack *obstack, const char *ptr, int len)
+-     {
+-       while (len > 0)
+-         {
+-           int room = obstack_room (obstack);
+-           if (room == 0)
+-             {
+-               /* Not enough room. Add one character slowly,
+-                  which may copy to a new chunk and make room.  */
+-               obstack_1grow (obstack, *ptr++);
+-               len--;
+-             }
+-           else
+-             {
+-               if (room > len)
+-                 room = len;
+-               /* Add fast as much as we have room for. */
+-               len -= room;
+-               while (room-- > 0)
+-                 obstack_1grow_fast (obstack, *ptr++);
+-             }
+-         }
+-     }
+-
+-
+-File: libc.info,  Node: Status of an Obstack,  Next: Obstacks Data Alignment,  Prev: Extra Fast Growing,  Up: Obstacks
+-
+-Status of an Obstack
+---------------------
+-
+-   Here are functions that provide information on the current status of
+-allocation in an obstack.  You can use them to learn about an object
+-while still growing it.
+-
+- - Function: void * obstack_base (struct obstack *OBSTACK-PTR)
+-     This function returns the tentative address of the beginning of the
+-     currently growing object in OBSTACK-PTR.  If you finish the object
+-     immediately, it will have that address.  If you make it larger
+-     first, it may outgrow the current chunk--then its address will
+-     change!
+-
+-     If no object is growing, this value says where the next object you
+-     allocate will start (once again assuming it fits in the current
+-     chunk).
+-
+- - Function: void * obstack_next_free (struct obstack *OBSTACK-PTR)
+-     This function returns the address of the first free byte in the
+-     current chunk of obstack OBSTACK-PTR.  This is the end of the
+-     currently growing object.  If no object is growing,
+-     `obstack_next_free' returns the same value as `obstack_base'.
+-
+- - Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
+-     This function returns the size in bytes of the currently growing
+-     object.  This is equivalent to
+-
+-          obstack_next_free (OBSTACK-PTR) - obstack_base (OBSTACK-PTR)
+-
+-
+-File: libc.info,  Node: Obstacks Data Alignment,  Next: Obstack Chunks,  Prev: Status of an Obstack,  Up: Obstacks
+-
+-Alignment of Data in Obstacks
+------------------------------
+-
+-   Each obstack has an "alignment boundary"; each object allocated in
+-the obstack automatically starts on an address that is a multiple of the
+-specified boundary.  By default, this boundary is 4 bytes.
+-
+-   To access an obstack's alignment boundary, use the macro
+-`obstack_alignment_mask', whose function prototype looks like this:
+-
+- - Macro: int obstack_alignment_mask (struct obstack *OBSTACK-PTR)
+-     The value is a bit mask; a bit that is 1 indicates that the
+-     corresponding bit in the address of an object should be 0.  The
+-     mask value should be one less than a power of 2; the effect is
+-     that all object addresses are multiples of that power of 2.  The
+-     default value of the mask is 3, so that addresses are multiples of
+-     4.  A mask value of 0 means an object can start on any multiple of
+-     1 (that is, no alignment is required).
+-
+-     The expansion of the macro `obstack_alignment_mask' is an lvalue,
+-     so you can alter the mask by assignment.  For example, this
+-     statement:
+-
+-          obstack_alignment_mask (obstack_ptr) = 0;
+-
+-     has the effect of turning off alignment processing in the
+-     specified obstack.
+-
+-   Note that a change in alignment mask does not take effect until
+-*after* the next time an object is allocated or finished in the
+-obstack.  If you are not growing an object, you can make the new
+-alignment mask take effect immediately by calling `obstack_finish'.
+-This will finish a zero-length object and then do proper alignment for
+-the next object.
+-
+-
+-File: libc.info,  Node: Obstack Chunks,  Next: Summary of Obstacks,  Prev: Obstacks Data Alignment,  Up: Obstacks
+-
+-Obstack Chunks
+---------------
+-
+-   Obstacks work by allocating space for themselves in large chunks, and
+-then parceling out space in the chunks to satisfy your requests.  Chunks
+-are normally 4096 bytes long unless you specify a different chunk size.
+-The chunk size includes 8 bytes of overhead that are not actually used
+-for storing objects.  Regardless of the specified size, longer chunks
+-will be allocated when necessary for long objects.
+-
+-   The obstack library allocates chunks by calling the function
+-`obstack_chunk_alloc', which you must define.  When a chunk is no
+-longer needed because you have freed all the objects in it, the obstack
+-library frees the chunk by calling `obstack_chunk_free', which you must
+-also define.
+-
+-   These two must be defined (as macros) or declared (as functions) in
+-each source file that uses `obstack_init' (*note Creating Obstacks::.).
+-Most often they are defined as macros like this:
+-
+-     #define obstack_chunk_alloc malloc
+-     #define obstack_chunk_free free
+-
+-   Note that these are simple macros (no arguments).  Macro definitions
+-with arguments will not work!  It is necessary that
+-`obstack_chunk_alloc' or `obstack_chunk_free', alone, expand into a
+-function name if it is not itself a function name.
+-
+-   If you allocate chunks with `malloc', the chunk size should be a
+-power of 2.  The default chunk size, 4096, was chosen because it is long
+-enough to satisfy many typical requests on the obstack yet short enough
+-not to waste too much memory in the portion of the last chunk not yet
+-used.
+-
+- - Macro: int obstack_chunk_size (struct obstack *OBSTACK-PTR)
+-     This returns the chunk size of the given obstack.
+-
+-   Since this macro expands to an lvalue, you can specify a new chunk
+-size by assigning it a new value.  Doing so does not affect the chunks
+-already allocated, but will change the size of chunks allocated for
+-that particular obstack in the future.  It is unlikely to be useful to
+-make the chunk size smaller, but making it larger might improve
+-efficiency if you are allocating many objects whose size is comparable
+-to the chunk size.  Here is how to do so cleanly:
+-
+-     if (obstack_chunk_size (obstack_ptr) < NEW-CHUNK-SIZE)
+-       obstack_chunk_size (obstack_ptr) = NEW-CHUNK-SIZE;
+-
+-
+-File: libc.info,  Node: Summary of Obstacks,  Prev: Obstack Chunks,  Up: Obstacks
+-
+-Summary of Obstack Functions
+-----------------------------
+-
+-   Here is a summary of all the functions associated with obstacks.
+-Each takes the address of an obstack (`struct obstack *') as its first
+-argument.
+-
+-`void obstack_init (struct obstack *OBSTACK-PTR)'
+-     Initialize use of an obstack.  *Note Creating Obstacks::.
+-
+-`void *obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)'
+-     Allocate an object of SIZE uninitialized bytes.  *Note Allocation
+-     in an Obstack::.
+-
+-`void *obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     Allocate an object of SIZE bytes, with contents copied from
+-     ADDRESS.  *Note Allocation in an Obstack::.
+-
+-`void *obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     Allocate an object of SIZE+1 bytes, with SIZE of them copied from
+-     ADDRESS, followed by a null character at the end.  *Note
+-     Allocation in an Obstack::.
+-
+-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)'
+-     Free OBJECT (and everything allocated in the specified obstack
+-     more recently than OBJECT).  *Note Freeing Obstack Objects::.
+-
+-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)'
+-     Add SIZE uninitialized bytes to a growing object.  *Note Growing
+-     Objects::.
+-
+-`void obstack_grow (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     Add SIZE bytes, copied from ADDRESS, to a growing object.  *Note
+-     Growing Objects::.
+-
+-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     Add SIZE bytes, copied from ADDRESS, to a growing object, and then
+-     add another byte containing a null character.  *Note Growing
+-     Objects::.
+-
+-`void obstack_1grow (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
+-     Add one byte containing DATA-CHAR to a growing object.  *Note
+-     Growing Objects::.
+-
+-`void *obstack_finish (struct obstack *OBSTACK-PTR)'
+-     Finalize the object that is growing and return its permanent
+-     address.  *Note Growing Objects::.
+-
+-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
+-     Get the current size of the currently growing object.  *Note
+-     Growing Objects::.
+-
+-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)'
+-     Add SIZE uninitialized bytes to a growing object without checking
+-     that there is enough room.  *Note Extra Fast Growing::.
+-
+-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
+-     Add one byte containing DATA-CHAR to a growing object without
+-     checking that there is enough room.  *Note Extra Fast Growing::.
+-
+-`int obstack_room (struct obstack *OBSTACK-PTR)'
+-     Get the amount of room now available for growing the current
+-     object.  *Note Extra Fast Growing::.
+-
+-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)'
+-     The mask used for aligning the beginning of an object.  This is an
+-     lvalue.  *Note Obstacks Data Alignment::.
+-
+-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)'
+-     The size for allocating chunks.  This is an lvalue.  *Note Obstack
+-     Chunks::.
+-
+-`void *obstack_base (struct obstack *OBSTACK-PTR)'
+-     Tentative starting address of the currently growing object.  *Note
+-     Status of an Obstack::.
+-
+-`void *obstack_next_free (struct obstack *OBSTACK-PTR)'
+-     Address just after the end of the currently growing object.  *Note
+-     Status of an Obstack::.
+-
+-
+-File: libc.info,  Node: Variable Size Automatic,  Prev: Obstacks,  Up: Memory Allocation
+-
+-Automatic Storage with Variable Size
+-====================================
+-
+-   The function `alloca' supports a kind of half-dynamic allocation in
+-which blocks are allocated dynamically but freed automatically.
+-
+-   Allocating a block with `alloca' is an explicit action; you can
+-allocate as many blocks as you wish, and compute the size at run time.
+-But all the blocks are freed when you exit the function that `alloca'
+-was called from, just as if they were automatic variables declared in
+-that function.  There is no way to free the space explicitly.
+-
+-   The prototype for `alloca' is in `stdlib.h'.  This function is a BSD
+-extension.
+-
+- - Function: void * alloca (size_t SIZE);
+-     The return value of `alloca' is the address of a block of SIZE
+-     bytes of storage, allocated in the stack frame of the calling
+-     function.
+-
+-   Do not use `alloca' inside the arguments of a function call--you
+-will get unpredictable results, because the stack space for the
+-`alloca' would appear on the stack in the middle of the space for the
+-function arguments.  An example of what to avoid is `foo (x, alloca
+-(4), y)'.
+-
+-* Menu:
+-
+-* Alloca Example::              Example of using `alloca'.
+-* Advantages of Alloca::        Reasons to use `alloca'.
+-* Disadvantages of Alloca::     Reasons to avoid `alloca'.
+-* GNU C Variable-Size Arrays::  Only in GNU C, here is an alternative
+-				 method of allocating dynamically and
+-				 freeing automatically.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-40 glibc-2.1.3/manual/libc.info-40
+--- ../glibc-2.1.3/manual/libc.info-40	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-40	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1028 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Database Example,  Next: Netgroup Database,  Prev: Group Database,  Up: Users and Groups
+-
+-User and Group Database Example
+-===============================
+-
+-   Here is an example program showing the use of the system database
+-inquiry functions.  The program prints some information about the user
+-running the program.
+-
+-     #include <grp.h>
+-     #include <pwd.h>
+-     #include <sys/types.h>
+-     #include <unistd.h>
+-     #include <stdlib.h>
+-     
+-     int
+-     main (void)
+-     {
+-       uid_t me;
+-       struct passwd *my_passwd;
+-       struct group *my_group;
+-       char **members;
+-     
+-       /* Get information about the user ID. */
+-       me = getuid ();
+-       my_passwd = getpwuid (me);
+-       if (!my_passwd)
+-         {
+-           printf ("Couldn't find out about user %d.\n", (int) me);
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Print the information. */
+-       printf ("I am %s.\n", my_passwd->pw_gecos);
+-       printf ("My login name is %s.\n", my_passwd->pw_name);
+-       printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
+-       printf ("My home directory is %s.\n", my_passwd->pw_dir);
+-       printf ("My default shell is %s.\n", my_passwd->pw_shell);
+-     
+-       /* Get information about the default group ID. */
+-       my_group = getgrgid (my_passwd->pw_gid);
+-       if (!my_group)
+-         {
+-           printf ("Couldn't find out about group %d.\n",
+-                   (int) my_passwd->pw_gid);
+-           exit (EXIT_FAILURE);
+-         }
+-     
+-       /* Print the information. */
+-       printf ("My default group is %s (%d).\n",
+-               my_group->gr_name, (int) (my_passwd->pw_gid));
+-       printf ("The members of this group are:\n");
+-       members = my_group->gr_mem;
+-       while (*members)
+-         {
+-           printf ("  %s\n", *(members));
+-           members++;
+-         }
+-     
+-       return EXIT_SUCCESS;
+-     }
+-
+-   Here is some output from this program:
+-
+-     I am Throckmorton Snurd.
+-     My login name is snurd.
+-     My uid is 31093.
+-     My home directory is /home/fsg/snurd.
+-     My default shell is /bin/sh.
+-     My default group is guest (12).
+-     The members of this group are:
+-       friedman
+-       tami
+-
+-
+-File: libc.info,  Node: Netgroup Database,  Prev: Database Example,  Up: Users and Groups
+-
+-Netgroup Database
+-=================
+-
+-* Menu:
+-
+-* Netgroup Data::                  Data in the Netgroup database and where
+-                                   it comes from.
+-* Lookup Netgroup::                How to look for a particular netgroup.
+-* Netgroup Membership::            How to test for netgroup membership.
+-
+-
+-File: libc.info,  Node: Netgroup Data,  Next: Lookup Netgroup,  Up: Netgroup Database
+-
+-Netgroup Data
+--------------
+-
+-   Sometimes it is useful to group users according to other criteria
+-(*note Group Database::.).  E.g., it is useful to associate a certain
+-group of users with a certain machine.  On the other hand grouping of
+-host names is not supported so far.
+-
+-   In Sun Microsystems SunOS appeared a new kind of database, the
+-netgroup database.  It allows to group hosts, users, and domain freely,
+-giving them individual names.  More concrete: a netgroup is a list of
+-triples consisting of a host name, a user name, and a domain name,
+-where any of the entries can be a wildcard entry, matching all inputs.
+-A last possibility is that names of other netgroups can also be given
+-in the list specifying a netgroup.  So one can construct arbitrary
+-hierarchies without loops.
+-
+-   Sun's implementation allows netgroups only for the `nis' or
+-`nisplus' service *note Services in the NSS configuration::..  The
+-implementation in the GNU C library has no such restriction.  An entry
+-in either of the input services must have the following form:
+-
+-     GROUPNAME ( GROUPNAME | `('HOSTNAME`,'USERNAME`,'`domainname'`)' )+
+-
+-   Any of the fields in the triple can be empty which means anything
+-matches.  While describing the functions we will see that the opposite
+-case is useful as well.  I.e., there may be entries which will not
+-match any input.  For entries like a name consisting of the single
+-character `-' shall be used.
+-
+-
+-File: libc.info,  Node: Lookup Netgroup,  Next: Netgroup Membership,  Prev: Netgroup Data,  Up: Netgroup Database
+-
+-Looking up one Netgroup
+------------------------
+-
+-   The lookup functions for netgroups are a bit different to all other
+-system database handling functions.  Since a single netgroup can contain
+-many entries a two-step process is needed.  First a single netgroup is
+-selected and then one can iterate over all entries in this netgroup.
+-These functions are declared in `netdb.h'.
+-
+- - Function: int setnetgrent (const char *NETGROUP)
+-     A call to this function initializes the internal state of the
+-     library to allow following calls of the `getnetgrent' iterate over
+-     all entries in the netgroup with name NETGROUP.
+-
+-     When the call is successful (i.e., when a netgroup with this name
+-     exist) the return value is `1'.  When the return value is `0' no
+-     netgroup of this name is known or some other error occurred.
+-
+-   It is important to remember that there is only one single state for
+-iterating the netgroups.  Even if the programmer uses the
+-`getnetgrent_r' function the result is not really reentrant since
+-always only one single netgroup at a time can be processed.  If the
+-program needs to process more than one netgroup simultaneously she must
+-protect this by using external locking.  This problem was introduced in
+-the original netgroups implementation in SunOS and since we must stay
+-compatible it is not possible to change this.
+-
+-   Some other functions also use the netgroups state.  Currently these
+-are the `innetgr' function and parts of the implementation of the
+-`compat' service part of the NSS implementation.
+-
+- - Function: int getnetgrent (char **HOSTP, char **USERP, char
+-          **DOMAINP)
+-     This function returns the next unprocessed entry of the currently
+-     selected netgroup.  The string pointers, which addresses are
+-     passed in the arguments HOSTP, USERP, and DOMAINP, will contain
+-     after a successful call pointers to appropriate strings.  If the
+-     string in the next entry is empty the pointer has the value `NULL'.
+-     The returned string pointers are only valid unless no of the
+-     netgroup related functions are called.
+-
+-     The return value is `1' if the next entry was successfully read.  A
+-     value of `0' means no further entries exist or internal errors
+-     occurred.
+-
+- - Function: int getnetgrent_r (char **HOSTP, char **USERP, char
+-          **DOMAINP, char *BUFFER, int BUFLEN)
+-     This function is similar to `getnetgrent' with only one exception:
+-     the strings the three string pointers HOSTP, USERP, and DOMAINP
+-     point to, are placed in the buffer of BUFLEN bytes starting at
+-     BUFFER.  This means the returned values are valid even after other
+-     netgroup related functions are called.
+-
+-     The return value is `1' if the next entry was successfully read and
+-     the buffer contains enough room to place the strings in it.  `0' is
+-     returned in case no more entries are found, the buffer is too
+-     small, or internal errors occurred.
+-
+-     This function is a GNU extension.  The original implementation in
+-     the SunOS libc does not provide this function.
+-
+- - Function: void endnetgrent (void)
+-     This function free all buffers which were allocated to process the
+-     last selected netgroup.  As a result all string pointers returned
+-     by calls to `getnetgrent' are invalid afterwards.
+-
+-
+-File: libc.info,  Node: Netgroup Membership,  Prev: Lookup Netgroup,  Up: Netgroup Database
+-
+-Testing for Netgroup Membership
+--------------------------------
+-
+-   It is often not necessary to scan the whole netgroup since often the
+-only interesting question is whether a given entry is part of the
+-selected netgroup.
+-
+- - Function: int innetgr (const char *NETGROUP, const char *HOST, const
+-          char *USER, const char *DOMAIN)
+-     This function tests whether the triple specified by the parameters
+-     HOSTP, USERP, and DOMAINP is part of the netgroup NETGROUP.  Using
+-     this function has the advantage that
+-
+-       1. no other netgroup function can use the global netgroup state
+-          since internal locking is used and
+-
+-       2. the function is implemented more efficiently than successive
+-          calls to the other `set'/`get'/`endnetgrent' functions.
+-
+-     Any of the pointers HOSTP, USERP, and DOMAINP can be `NULL' which
+-     means any value is excepted in this position.  This is also true
+-     for the name `-' which should not match any other string otherwise.
+-
+-     The return value is `1' if an entry matching the given triple is
+-     found in the netgroup.  The return value is `0' if the netgroup
+-     itself is not found, the netgroup does not contain the triple or
+-     internal errors occurred.
+-
+-
+-File: libc.info,  Node: System Information,  Next: System Configuration,  Prev: Users and Groups,  Up: Top
+-
+-System Information
+-******************
+-
+-   This chapter describes functions that return information about the
+-particular machine that is in use--the type of hardware, the type of
+-software, and the individual machine's name.
+-
+-* Menu:
+-
+-* Host Identification::         Determining the name of the machine.
+-* Hardware/Software Type ID::   Determining the hardware type of the
+-                                 machine and what operating system it is
+-                                 running.
+-* Filesystem handling::         Which is mounted and/or available?
+-
+-
+-File: libc.info,  Node: Host Identification,  Next: Hardware/Software Type ID,  Up: System Information
+-
+-Host Identification
+-===================
+-
+-   This section explains how to identify the particular machine that
+-your program is running on.  The identification of a machine consists
+-of its Internet host name and Internet address; see *Note Internet
+-Namespace::.  The host name should always be a fully qualified domain
+-name, like `crispy-wheats-n-chicken.ai.mit.edu', not a simple name like
+-just `crispy-wheats-n-chicken'.
+-
+-   Prototypes for these functions appear in `unistd.h'.  The shell
+-commands `hostname' and `hostid' work by calling them.
+-
+- - Function: int gethostname (char *NAME, size_t SIZE)
+-     This function returns the name of the host machine in the array
+-     NAME.  The SIZE argument specifies the size of this array, in
+-     bytes.
+-
+-     The return value is `0' on success and `-1' on failure.  In the
+-     GNU C library, `gethostname' fails if SIZE is not large enough;
+-     then you can try again with a larger array.  The following `errno'
+-     error condition is defined for this function:
+-
+-    `ENAMETOOLONG'
+-          The SIZE argument is less than the size of the host name plus
+-          one.
+-
+-     On some systems, there is a symbol for the maximum possible host
+-     name length: `MAXHOSTNAMELEN'.  It is defined in `sys/param.h'.
+-     But you can't count on this to exist, so it is cleaner to handle
+-     failure and try again.
+-
+-     `gethostname' stores the beginning of the host name in NAME even
+-     if the host name won't entirely fit.  For some purposes, a
+-     truncated host name is good enough.  If it is, you can ignore the
+-     error code.
+-
+- - Function: int sethostname (const char *NAME, size_t LENGTH)
+-     The `sethostname' function sets the name of the host machine to
+-     NAME, a string with length LENGTH.  Only privileged processes are
+-     allowed to do this.  Usually it happens just once, at system boot
+-     time.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition is defined for this function:
+-
+-    `EPERM'
+-          This process cannot set the host name because it is not
+-          privileged.
+-
+- - Function: long int gethostid (void)
+-     This function returns the "host ID" of the machine the program is
+-     running on.  By convention, this is usually the primary Internet
+-     address of that machine, converted to a `long int'.  However, some
+-     systems it is a meaningless but unique number which is hard-coded
+-     for each machine.
+-
+- - Function: int sethostid (long int ID)
+-     The `sethostid' function sets the "host ID" of the host machine to
+-     ID.  Only privileged processes are allowed to do this.  Usually it
+-     happens just once, at system boot time.
+-
+-     The return value is `0' on success and `-1' on failure.  The
+-     following `errno' error condition is defined for this function:
+-
+-    `EPERM'
+-          This process cannot set the host name because it is not
+-          privileged.
+-
+-    `ENOSYS'
+-          The operating system does not support setting the host ID.
+-          On some systems, the host ID is a meaningless but unique
+-          number hard-coded for each machine.
+-
+-
+-File: libc.info,  Node: Hardware/Software Type ID,  Next: Filesystem handling,  Prev: Host Identification,  Up: System Information
+-
+-Hardware/Software Type Identification
+-=====================================
+-
+-   You can use the `uname' function to find out some information about
+-the type of computer your program is running on.  This function and the
+-associated data type are declared in the header file `sys/utsname.h'.
+-
+- - Data Type: struct utsname
+-     The `utsname' structure is used to hold information returned by
+-     the `uname' function.  It has the following members:
+-
+-    `char sysname[]'
+-          This is the name of the operating system in use.
+-
+-    `char nodename[]'
+-          This is the network name of this particular computer.  In the
+-          GNU library, the value is the same as that returned by
+-          `gethostname'; see *Note Host Identification::.
+-
+-    `char release[]'
+-          This is the current release level of the operating system
+-          implementation.
+-
+-    `char version[]'
+-          This is the current version level within the release of the
+-          operating system.
+-
+-    `char machine[]'
+-          This is a description of the type of hardware that is in use.
+-
+-          Some systems provide a mechanism to interrogate the kernel
+-          directly for this information.  On systems without such a
+-          mechanism, the GNU C library fills in this field based on the
+-          configuration name that was specified when building and
+-          installing the library.
+-
+-          GNU uses a three-part name to describe a system
+-          configuration; the three parts are CPU, MANUFACTURER and
+-          SYSTEM-TYPE, and they are separated with dashes.  Any
+-          possible combination of three names is potentially
+-          meaningful, but most such combinations are meaningless in
+-          practice and even the meaningful ones are not necessarily
+-          supported by any particular GNU program.
+-
+-          Since the value in `machine' is supposed to describe just the
+-          hardware, it consists of the first two parts of the
+-          configuration name: `CPU-MANUFACTURER'.  For example, it
+-          might be one of these:
+-
+-               `"sparc-sun"', `"i386-ANYTHING"', `"m68k-hp"',
+-               `"m68k-sony"', `"m68k-sun"', `"mips-dec"'
+-
+- - Function: int uname (struct utsname *INFO)
+-     The `uname' function fills in the structure pointed to by INFO
+-     with information about the operating system and host machine.  A
+-     non-negative value indicates that the data was successfully stored.
+-
+-     `-1' as the value indicates an error.  The only error possible is
+-     `EFAULT', which we normally don't mention as it is always a
+-     possibility.
+-
+-
+-File: libc.info,  Node: Filesystem handling,  Prev: Hardware/Software Type ID,  Up: System Information
+-
+-Which filesystems are mounted and/or available?
+-===============================================
+-
+-   The Unix concept of *Everything is a file* is based on the
+-possibility to "mount" filesystems or other things into the filesystem.
+-For some programs it is desirable and necessary to access the
+-information whether and, if yes, where a certain filesystem is mounted
+-or simply to get lists of all the available filesystems.  The GNU libc
+-provides some functions to retrieve this information portably.
+-
+-   Traditionally Unix systems have a file named `/etc/fstab' which
+-describes all possibly mounted filesystems.  The `mount' program uses
+-this file to mount at startup time of the system all the necessary
+-filesystems.  The information about all the filesystems actually mounted
+-is normally kept in a file named `/etc/mtab'.  Both files share the
+-same syntax and it is crucial that this syntax is followed all the
+-time.  Therefore it is best to never directly write the files.  The
+-functions described in this section can do this and they also provide
+-the functionality to convert the external textual representation to the
+-internal representation.
+-
+-   The filenames given above should never be used directly.  The
+-portable way to handle these file is to use the macros `_PATH_FSTAB',
+-defined in `fstab.h' and `_PATH_MNTTAB', defined in `mntent.h',
+-respectively.  There are also two alternate macro names `FSTAB' and
+-`_PATH_MOUNTED' defined but both names are deprecated and kept only for
+-backward compatibility.  The two former names should always be used.
+-
+-   The internal representation for entries of the file is
+-`struct fstab', defined in `fstab.h'.
+-
+- - Data Type: struct fstab
+-     This structure is used with the `getfsent', `getfsspec', and
+-     `getfsfile' functions.
+-
+-    `char *fs_spec'
+-          This element describes the device from which the filesystem
+-          is mounted.  Normally this is the name of a special device,
+-          such as a hard disk partition, but it could also be a more or
+-          less generic string.  For "NFS" it would be a hostname and
+-          directory name combination.
+-
+-          Even though the element is not declared `const' it shouldn't
+-          be modified.  The missing `const' has historic reasons, since
+-          this function predates ISO C.  The same is true for the other
+-          string elements of this structure.
+-
+-    `char *fs_file'
+-          This describes the mount point on the local system.  I.e.,
+-          accessing any file in this filesystem has implicitly or
+-          explicitly this string as a prefix.
+-
+-    `char *fs_vfstype'
+-          This is the type of the filesystem.  Depending on what the
+-          underlying kernel understands it can be any string.
+-
+-    `char *fs_mntops'
+-          This is a string containing options passed to the kernel with
+-          the `mount' call.  Again, this can be almost anything.  There
+-          can be more than one option, separated from the others by a
+-          comma.  Each option consists of a name and an optional value
+-          part, introduced by an `=' character.
+-
+-          If the value of this element must be processed it should best
+-          happen using the `getsubopt' function; see *Note Suboptions::.
+-
+-    `const char *fs_type'
+-          This name is poorly chosen.  This element points to a string
+-          (possibly in the `fs_mntops' string) which describes the
+-          modes with which the filesystem is mounted.  `fstab' defines
+-          five macros to describe the possible values:
+-
+-         `FSTAB_RW'
+-               The filesystems gets mounted with read and write enabled.
+-
+-         `FSTAB_RQ'
+-               The filesystems gets mounted with read and write
+-               enabled.  Write access is restricted by quotas.
+-
+-         `FSTAB_RO'
+-               The filesystem gets mounted read-only.
+-
+-         `FSTAB_SW'
+-               This is not a real filesystem, it is a swap device.
+-
+-         `FSTAB_XX'
+-               This entry from the `fstab' file is totally ignored.
+-
+-          Testing for equality with these value must happen using
+-          `strcmp' since these are all strings.  Comparing the pointer
+-          will probably always fail.
+-
+-    `int fs_freq'
+-          This element describes the dump frequency in days.
+-
+-    `int fs_passno'
+-          This element describes the pass number on parallel dumps.  It
+-          is closely related to the `dump' utility used on Unix systems.
+-
+-   To read the entire content of the of the `fstab' file the GNU libc
+-contains a set of three functions which are designed in the usual way.
+-
+- - Function: int setfsent (void)
+-     This function makes sure that the internal read pointer for the
+-     `fstab' file is at the beginning of the file.  This is done by
+-     either opening the file or resetting the read pointer.
+-
+-     Since the file handle is internal to the libc this function is not
+-     thread-safe.
+-
+-     This function returns a non-zero value if the operation was
+-     successful and the `getfs*' functions can be used to read the
+-     entries of the file.
+-
+- - Function: void endfsent (void)
+-     This function makes sure that all resources acquired by a prior
+-     call to `setfsent' (explicitly or implicitly by calling
+-     `getfsent') are freed.
+-
+- - Function: struct fstab * getfsent (void)
+-     This function returns the next entry of the `fstab' file.  If this
+-     is the first call to any of the functions handling `fstab' since
+-     program start or the last call of `endfsent', the file will be
+-     opened.
+-
+-     The function returns a pointer to an variable of type `struct
+-     fstab'.  This variable is shared by all threads and therefore this
+-     function is not thread-safe.  If an error occurred `getfsent'
+-     returns a `NULL' pointer.
+-
+- - Function: struct fstab * getfsspec (const char *NAME)
+-     This function returns the next entry of the `fstab' file which has
+-     a string equal to NAME pointed to by the `fs_spec' element.  Since
+-     there is normally exactly one entry for each special device it
+-     makes no sense to call this function more than once for the same
+-     argument.  If this is the first call to any of the functions
+-     handling `fstab' since program start or the last call of
+-     `endfsent', the file will be opened.
+-
+-     The function returns a pointer to an variable of type `struct
+-     fstab'.  This variable is shared by all threads and therefore this
+-     function is not thread-safe.  If an error occurred `getfsent'
+-     returns a `NULL' pointer.
+-
+- - Function: struct fstab * getfsfile (const char *NAME)
+-     This function returns the next entry of the `fstab' file which has
+-     a string equal to NAME pointed to by the `fs_file' element.  Since
+-     there is normally exactly one entry for each mount point it makes
+-     no sense to call this function more than once for the same
+-     argument.  If this is the first call to any of the functions
+-     handling `fstab' since program start or the last call of
+-     `endfsent', the file will be opened.
+-
+-     The function returns a pointer to an variable of type `struct
+-     fstab'.  This variable is shared by all threads and therefore this
+-     function is not thread-safe.  If an error occurred `getfsent'
+-     returns a `NULL' pointer.
+-
+-   To access the `mtab' file there is a different set of functions and
+-also a different structure to describe the results.
+-
+- - Data Type: struct mntent
+-     This structure is used with the `getmntent', `getmntent_t',
+-     `addmntent', and `hasmntopt' functions.
+-
+-    `char *mnt_fsname'
+-          This element contains a pointer to a string describing the
+-          name of the special device from which the filesystem is
+-          mounted.  It corresponds to the `fs_spec' element in `struct
+-          fstab'.
+-
+-    `char *mnt_dir'
+-          This element points to a string describing the mount point of
+-          the filesystem.  It corresponds to the `fs_file' element in
+-          `struct fstab'.
+-
+-    `char *mnt_type'
+-          `mnt_type' describes the filesystem type and is therefore
+-          equivalent to `fs_vfstype' in `struct fstab'.  `mntent.h'
+-          defines a few symbolic names for some of the value this
+-          string can have.  But since the kernel can support an
+-          arbitrary filesystems it does not make much sense to give
+-          them symbolic names.  If one knows the symbol name one also
+-          knows the filesystem name.  Nevertheless here follows the
+-          list of the symbol provided in `mntent.h'.
+-
+-         `MNTTYPE_IGNORE'
+-               This symbol expands to `"ignore"'.  The value is
+-               sometime used in `fstab' files to make sure entries are
+-               not used without removing them.
+-
+-         `MNTTYPE_NFS'
+-               Expands to `"nfs"'.  Using this macro sometimes could
+-               make sense since it names the default NFS
+-               implementation, in case both version 2 and 3 are
+-               supported.
+-
+-         `MNTTYPE_SWAP'
+-               This symbol expands to `"swap"'.  It names the special
+-               `fstab' entry which names one of the possibly multiple
+-               swap partitions.
+-
+-    `char *mnt_opts'
+-          The element contains a string describing the options used
+-          while mounting the filesystem.  As for the equivalent element
+-          `fs_mntops' of `struct fstab' it is best to use the function
+-          `getsubopt' (*note Suboptions::.) to access the parts of this
+-          string.
+-
+-          The `mntent.h' file defines a number of macros with string
+-          values which correspond to some of the options understood by
+-          the kernel.  There might be many more options which are
+-          possible so it makes not much sense to rely on these macros
+-          but to be consistent here is the list:
+-
+-         `MNTOPT_DEFAULTS'
+-               Expands to `"defaults"'.  This option should be used
+-               alone since it indicates all values for the custumizable
+-               values are chosen to be the default.
+-
+-         `MNTOPT_RO'
+-               Expands to `"ro"'.  See the `FSTAB_RO' value, it means
+-               the filesystem is mounted read-only.
+-
+-         `MNTOPT_RW'
+-               Expand to `"rw"'.  See the `FSTAB_RW' value, it means the
+-               filesystem is mounted with read and write permissions.
+-
+-         `MNTOPT_SUID'
+-               Expands to `"suid"'.  This means that the SUID bit
+-               (*note How Change Persona::.) is respected when a
+-               program from the filesystem is started.
+-
+-         `MNTOPT_NOSUID'
+-               Expands to `"nosuid"'.  This is the opposite of
+-               `MNTOPT_SUID', the SUID bit for all files from the
+-               filesystem is ignored.
+-
+-         `MNTOPT_NOAUTO'
+-               Expands to `"noauto"'.  At startup time the `mount'
+-               program will ignore this entry if it is started with the
+-               `-a' option to mount all filesystems mentioned in the
+-               `fstab' file.
+-
+-          As for the `FSTAB_*' entries introduced above it is important
+-          to use `strcmp' to check for equality.
+-
+-    `mnt_freq'
+-          This elements corresponds to `fs_freq' and also specifies the
+-          frequency in days in which dumps are made.
+-
+-    `mnt_passno'
+-          This element is equivalent to `fs_passno' with the same
+-          meaning which is uninteresting for all programs beside `dump'.
+-
+-   For accessing the `mtab' file there is again a set of three
+-functions to access all entries in a row.  Unlike the functions to
+-handle `fstab' these functions do not access a fixed file and there is
+-even a thread safe variant of the get function.  Beside this the GNU
+-libc contains functions to alter the file and test for specific options.
+-
+- - Function: FILE * setmntent (const char *FILE, const char *MODE)
+-     The `setmntent' function prepares the file named FILE which must
+-     be in the format of a `fstab' and `mtab' file for the upcoming
+-     processing through the other functions of the family.  The MODE
+-     parameter can be chosen in the way the OPENTYPE parameter for
+-     `fopen' (*note Opening Streams::.) can be chosen.  If the file is
+-     opened for writing the file is also allowed to be empty.
+-
+-     If the file was successfully opened `setmntent' returns a file
+-     descriptor for future use.  Otherwise the return value is `NULL'
+-     and `errno' is set accordingly.
+-
+- - Function: int endmntent (FILE *STREAM)
+-     This function takes for the STREAM parameter a file handle which
+-     previously was returned from the `setmntent' call.  `endmntent'
+-     closes the stream and frees all resources.
+-
+-     The return value is 1 unless an error occurred in which case it is
+-     0.
+-
+- - Function: struct mntent * getmntent (FILE *STREAM)
+-     The `getmntent' function takes as the parameter a file handle
+-     previously returned by successful call to `setmntent'.  It returns
+-     a pointer to a static variable of type `struct mntent' which is
+-     filled with the information from the next entry from the file
+-     currently read.
+-
+-     If there was an error or the end of the file is reached the return
+-     value is `NULL'.
+-
+-     This function is not thread-safe since all calls to this function
+-     return a pointer to the same static variable.  `getmntent_r'
+-     should be used in situations where multiple threads access the
+-     file.
+-
+- - Function: struct mntent * getmntent_r (FILE *STREAM, struct mentent
+-          *RESULT, char *BUFFER, int BUFSIZE)
+-     The `getmntent_r' function is the reentrant variant of
+-     `getmntent'.  It also returns the next entry from the file and
+-     returns a pointer.  The actual variable the values are stored in
+-     is not static, though.  Instead the function stores the values in
+-     the variable pointed to by the RESULT parameter.  Additional
+-     information (e.g., the strings pointed to by the elements of the
+-     result) are kept in the buffer of size BUFSIZE pointed to by
+-     BUFFER.
+-
+-     The function returns a `NULL' pointer in error cases.  Errors
+-     could be:
+-        * error while reading the file,
+-
+-        * end of file reached,
+-
+-        * BUFSIZE is too small for reading a complete new entry.
+-
+- - Function: int addmntent (FILE *STREAM, const struct mntent *MNT)
+-     The `addmntent' function allows to add a new entry to the file
+-     previously opened with `setmntent'.  The new entries are always
+-     appended.  I.e., even if the position of the file descriptor is
+-     not at the end of the file this function does not overwrite an
+-     existing entry following the current position.
+-
+-     The implication of this is that to remove an entry from a file one
+-     has to create a new file while leaving out the entry to be removed
+-     and after closing the file remove the old one and rename the new
+-     file to the chosen name.
+-
+-     This function returns 0 in case the operation was successful.
+-     Otherwise the return value is 1 and `errno' is set appropriately.
+-
+- - Function: char * hasmntopt (const struct mntent *MNT, const char
+-          *OPT)
+-     This function can be used to check whether the string pointed to
+-     by the `mnt_opts' element of the variable pointed to by MNT
+-     contains the option OPT.  If this is true a pointer to the
+-     beginning of the option in the `mnt_opts' element is returned.  If
+-     no such option exists the function returns `NULL'.
+-
+-     This function is useful to test whether a specific option is
+-     present but when all options have to be processed one is better
+-     off with using the `getsubopt' function to iterate over all
+-     options in the string.
+-
+-
+-File: libc.info,  Node: System Configuration,  Next: Cryptographic Functions,  Prev: System Information,  Up: Top
+-
+-System Configuration Parameters
+-*******************************
+-
+-   The functions and macros listed in this chapter give information
+-about configuration parameters of the operating system--for example,
+-capacity limits, presence of optional POSIX features, and the default
+-path for executable files (*note String Parameters::.).
+-
+-* Menu:
+-
+-* General Limits::           Constants and functions that describe
+-				various process-related limits that have
+-				one uniform value for any given machine.
+-* System Options::           Optional POSIX features.
+-* Version Supported::        Version numbers of POSIX.1 and POSIX.2.
+-* Sysconf::                  Getting specific configuration values
+-                                of general limits and system options.
+-* Minimums::                 Minimum values for general limits.
+-
+-* Limits for Files::         Size limitations that pertain to individual files.
+-                                These can vary between file systems
+-                                or even from file to file.
+-* Options for Files::        Optional features that some files may support.
+-* File Minimums::            Minimum values for file limits.
+-* Pathconf::                 Getting the limit values for a particular file.
+-
+-* Utility Limits::           Capacity limits of some POSIX.2 utility programs.
+-* Utility Minimums::         Minimum allowable values of those limits.
+-
+-* String Parameters::        Getting the default search path.
+-
+-
+-File: libc.info,  Node: General Limits,  Next: System Options,  Up: System Configuration
+-
+-General Capacity Limits
+-=======================
+-
+-   The POSIX.1 and POSIX.2 standards specify a number of parameters that
+-describe capacity limitations of the system.  These limits can be fixed
+-constants for a given operating system, or they can vary from machine to
+-machine.  For example, some limit values may be configurable by the
+-system administrator, either at run time or by rebuilding the kernel,
+-and this should not require recompiling application programs.
+-
+-   Each of the following limit parameters has a macro that is defined in
+-`limits.h' only if the system has a fixed, uniform limit for the
+-parameter in question.  If the system allows different file systems or
+-files to have different limits, then the macro is undefined; use
+-`sysconf' to find out the limit that applies at a particular time on a
+-particular machine.  *Note Sysconf::.
+-
+-   Each of these parameters also has another macro, with a name starting
+-with `_POSIX', which gives the lowest value that the limit is allowed
+-to have on *any* POSIX system.  *Note Minimums::.
+-
+- - Macro: int ARG_MAX
+-     If defined, the unvarying maximum combined length of the ARGV and
+-     ENVIRON arguments that can be passed to the `exec' functions.
+-
+- - Macro: int CHILD_MAX
+-     If defined, the unvarying maximum number of processes that can
+-     exist with the same real user ID at any one time.  In BSD and GNU,
+-     this is controlled by the `RLIMIT_NPROC' resource limit; *note
+-     Limits on Resources::..
+-
+- - Macro: int OPEN_MAX
+-     If defined, the unvarying maximum number of files that a single
+-     process can have open simultaneously.  In BSD and GNU, this is
+-     controlled by the `RLIMIT_NOFILE' resource limit; *note Limits on
+-     Resources::..
+-
+- - Macro: int STREAM_MAX
+-     If defined, the unvarying maximum number of streams that a single
+-     process can have open simultaneously.  *Note Opening Streams::.
+-
+- - Macro: int TZNAME_MAX
+-     If defined, the unvarying maximum length of a time zone name.
+-     *Note Time Zone Functions::.
+-
+-   These limit macros are always defined in `limits.h'.
+-
+- - Macro: int NGROUPS_MAX
+-     The maximum number of supplementary group IDs that one process can
+-     have.
+-
+-     The value of this macro is actually a lower bound for the maximum.
+-     That is, you can count on being able to have that many
+-     supplementary group IDs, but a particular machine might let you
+-     have even more.  You can use `sysconf' to see whether a particular
+-     machine will let you have more (*note Sysconf::.).
+-
+- - Macro: int SSIZE_MAX
+-     The largest value that can fit in an object of type `ssize_t'.
+-     Effectively, this is the limit on the number of bytes that can be
+-     read or written in a single operation.
+-
+-     This macro is defined in all POSIX systems because this limit is
+-     never configurable.
+-
+- - Macro: int RE_DUP_MAX
+-     The largest number of repetitions you are guaranteed is allowed in
+-     the construct `\{MIN,MAX\}' in a regular expression.
+-
+-     The value of this macro is actually a lower bound for the maximum.
+-     That is, you can count on being able to have that many
+-     repetitions, but a particular machine might let you have even
+-     more.  You can use `sysconf' to see whether a particular machine
+-     will let you have more (*note Sysconf::.).  And even the value
+-     that `sysconf' tells you is just a lower bound--larger values
+-     might work.
+-
+-     This macro is defined in all POSIX.2 systems, because POSIX.2 says
+-     it should always be defined even if there is no specific imposed
+-     limit.
+-
+-
+-File: libc.info,  Node: System Options,  Next: Version Supported,  Prev: General Limits,  Up: System Configuration
+-
+-Overall System Options
+-======================
+-
+-   POSIX defines certain system-specific options that not all POSIX
+-systems support.  Since these options are provided in the kernel, not
+-in the library, simply using the GNU C library does not guarantee any
+-of these features is supported; it depends on the system you are using.
+-
+-   You can test for the availability of a given option using the macros
+-in this section, together with the function `sysconf'.  The macros are
+-defined only if you include `unistd.h'.
+-
+-   For the following macros, if the macro is defined in `unistd.h',
+-then the option is supported.  Otherwise, the option may or may not be
+-supported; use `sysconf' to find out.  *Note Sysconf::.
+-
+- - Macro: int _POSIX_JOB_CONTROL
+-     If this symbol is defined, it indicates that the system supports
+-     job control.  Otherwise, the implementation behaves as if all
+-     processes within a session belong to a single process group.
+-     *Note Job Control::.
+-
+- - Macro: int _POSIX_SAVED_IDS
+-     If this symbol is defined, it indicates that the system remembers
+-     the effective user and group IDs of a process before it executes an
+-     executable file with the set-user-ID or set-group-ID bits set, and
+-     that explicitly changing the effective user or group IDs back to
+-     these values is permitted.  If this option is not defined, then if
+-     a nonprivileged process changes its effective user or group ID to
+-     the real user or group ID of the process, it can't change it back
+-     again.  *Note Enable/Disable Setuid::.
+-
+-   For the following macros, if the macro is defined in `unistd.h',
+-then its value indicates whether the option is supported.  A value of
+-`-1' means no, and any other value means yes.  If the macro is not
+-defined, then the option may or may not be supported; use `sysconf' to
+-find out.  *Note Sysconf::.
+-
+- - Macro: int _POSIX2_C_DEV
+-     If this symbol is defined, it indicates that the system has the
+-     POSIX.2 C compiler command, `c89'.  The GNU C library always
+-     defines this as `1', on the assumption that you would not have
+-     installed it if you didn't have a C compiler.
+-
+- - Macro: int _POSIX2_FORT_DEV
+-     If this symbol is defined, it indicates that the system has the
+-     POSIX.2 Fortran compiler command, `fort77'.  The GNU C library
+-     never defines this, because we don't know what the system has.
+-
+- - Macro: int _POSIX2_FORT_RUN
+-     If this symbol is defined, it indicates that the system has the
+-     POSIX.2 `asa' command to interpret Fortran carriage control.  The
+-     GNU C library never defines this, because we don't know what the
+-     system has.
+-
+- - Macro: int _POSIX2_LOCALEDEF
+-     If this symbol is defined, it indicates that the system has the
+-     POSIX.2 `localedef' command.  The GNU C library never defines
+-     this, because we don't know what the system has.
+-
+- - Macro: int _POSIX2_SW_DEV
+-     If this symbol is defined, it indicates that the system has the
+-     POSIX.2 commands `ar', `make', and `strip'.  The GNU C library
+-     always defines this as `1', on the assumption that you had to have
+-     `ar' and `make' to install the library, and it's unlikely that
+-     `strip' would be absent when those are present.
+-
+-
+-File: libc.info,  Node: Version Supported,  Next: Sysconf,  Prev: System Options,  Up: System Configuration
+-
+-Which Version of POSIX is Supported
+-===================================
+-
+- - Macro: long int _POSIX_VERSION
+-     This constant represents the version of the POSIX.1 standard to
+-     which the implementation conforms.  For an implementation
+-     conforming to the 1995 POSIX.1 standard, the value is the integer
+-     `199506L'.
+-
+-     `_POSIX_VERSION' is always defined (in `unistd.h') in any POSIX
+-     system.
+-
+-     *Usage Note:* Don't try to test whether the system supports POSIX
+-     by including `unistd.h' and then checking whether `_POSIX_VERSION'
+-     is defined.  On a non-POSIX system, this will probably fail
+-     because there is no `unistd.h'.  We do not know of *any* way you
+-     can reliably test at compilation time whether your target system
+-     supports POSIX or whether `unistd.h' exists.
+-
+-     The GNU C compiler predefines the symbol `__POSIX__' if the target
+-     system is a POSIX system.  Provided you do not use any other
+-     compilers on POSIX systems, testing `defined (__POSIX__)' will
+-     reliably detect such systems.
+-
+- - Macro: long int _POSIX2_C_VERSION
+-     This constant represents the version of the POSIX.2 standard which
+-     the library and system kernel support.  We don't know what value
+-     this will be for the first version of the POSIX.2 standard,
+-     because the value is based on the year and month in which the
+-     standard is officially adopted.
+-
+-     The value of this symbol says nothing about the utilities
+-     installed on the system.
+-
+-     *Usage Note:* You can use this macro to tell whether a POSIX.1
+-     system library supports POSIX.2 as well.  Any POSIX.1 system
+-     contains `unistd.h', so include that file and then test `defined
+-     (_POSIX2_C_VERSION)'.
+-
+-
+-File: libc.info,  Node: Sysconf,  Next: Minimums,  Prev: Version Supported,  Up: System Configuration
+-
+-Using `sysconf'
+-===============
+-
+-   When your system has configurable system limits, you can use the
+-`sysconf' function to find out the value that applies to any particular
+-machine.  The function and the associated PARAMETER constants are
+-declared in the header file `unistd.h'.
+-
+-* Menu:
+-
+-* Sysconf Definition::        Detailed specifications of `sysconf'.
+-* Constants for Sysconf::     The list of parameters `sysconf' can read.
+-* Examples of Sysconf::       How to use `sysconf' and the parameter
+-				 macros properly together.
+-
+-
+-File: libc.info,  Node: Sysconf Definition,  Next: Constants for Sysconf,  Up: Sysconf
+-
+-Definition of `sysconf'
+------------------------
+-
+- - Function: long int sysconf (int PARAMETER)
+-     This function is used to inquire about runtime system parameters.
+-     The PARAMETER argument should be one of the `_SC_' symbols listed
+-     below.
+-
+-     The normal return value from `sysconf' is the value you requested.
+-     A value of `-1' is returned both if the implementation does not
+-     impose a limit, and in case of an error.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINVAL'
+-          The value of the PARAMETER is invalid.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-41 glibc-2.1.3/manual/libc.info-41
+--- ../glibc-2.1.3/manual/libc.info-41	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-41	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1269 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Constants for Sysconf,  Next: Examples of Sysconf,  Prev: Sysconf Definition,  Up: Sysconf
+-
+-Constants for `sysconf' Parameters
+-----------------------------------
+-
+-   Here are the symbolic constants for use as the PARAMETER argument to
+-`sysconf'.  The values are all integer constants (more specifically,
+-enumeration type values).
+-
+-`_SC_ARG_MAX'
+-     Inquire about the parameter corresponding to `ARG_MAX'.
+-
+-`_SC_CHILD_MAX'
+-     Inquire about the parameter corresponding to `CHILD_MAX'.
+-
+-`_SC_OPEN_MAX'
+-     Inquire about the parameter corresponding to `OPEN_MAX'.
+-
+-`_SC_STREAM_MAX'
+-     Inquire about the parameter corresponding to `STREAM_MAX'.
+-
+-`_SC_TZNAME_MAX'
+-     Inquire about the parameter corresponding to `TZNAME_MAX'.
+-
+-`_SC_NGROUPS_MAX'
+-     Inquire about the parameter corresponding to `NGROUPS_MAX'.
+-
+-`_SC_JOB_CONTROL'
+-     Inquire about the parameter corresponding to `_POSIX_JOB_CONTROL'.
+-
+-`_SC_SAVED_IDS'
+-     Inquire about the parameter corresponding to `_POSIX_SAVED_IDS'.
+-
+-`_SC_VERSION'
+-     Inquire about the parameter corresponding to `_POSIX_VERSION'.
+-
+-`_SC_CLK_TCK'
+-     Inquire about the parameter corresponding to `CLOCKS_PER_SEC';
+-     *note Basic CPU Time::..
+-
+-`_SC_CHARCLASS_NAME_MAX'
+-     Inquire about the parameter corresponding to maximal length
+-     allowed for a character class name in an extended locale
+-     specification.  These extensions are not yet standardized and so
+-     this option is not standardized as well.
+-
+-`_SC_REALTIME_SIGNALS'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_REALTIME_SIGNALS'.
+-
+-`_SC_PRIORITY_SCHEDULING'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_PRIORITY_SCHEDULING'.
+-
+-`_SC_TIMERS'
+-     Inquire about the parameter corresponding to `_POSIX_TIMERS'.
+-
+-`_SC_ASYNCHRONOUS_IO'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_ASYNCHRONOUS_IO'.
+-
+-`_SC_PRIORITIZED_IO'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_PRIORITIZED_IO'.
+-
+-`_SC_SYNCHRONIZED_IO'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_SYNCHRONIZED_IO'.
+-
+-`_SC_FSYNC'
+-     Inquire about the parameter corresponding to `_POSIX_FSYNC'.
+-
+-`_SC_MAPPED_FILES'
+-     Inquire about the parameter corresponding to `_POSIX_MAPPED_FILES'.
+-
+-`_SC_MEMLOCK'
+-     Inquire about the parameter corresponding to `_POSIX_MEMLOCK'.
+-
+-`_SC_MEMLOCK_RANGE'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_MEMLOCK_RANGE'.
+-
+-`_SC_MEMORY_PROTECTION'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_MEMORY_PROTECTION'.
+-
+-`_SC_MESSAGE_PASSING'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_MESSAGE_PASSING'.
+-
+-`_SC_SEMAPHORES'
+-     Inquire about the parameter corresponding to `_POSIX_SEMAPHORES'.
+-
+-`_SC_SHARED_MEMORY_OBJECTS'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_SHARED_MEMORY_OBJECTS'.
+-
+-`_SC_AIO_LISTIO_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_AIO_LISTIO_MAX'.
+-
+-`_SC_AIO_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_AIO_MAX'.
+-
+-`_SC_AIO_PRIO_DELTA_MAX'
+-     Inquire the value by which a process can decrease its asynchronous
+-     I/O priority level from its own scheduling priority.  This
+-     corresponds to the run-time invariant value `AIO_PRIO_DELTA_MAX'.
+-
+-`_SC_DELAYTIMER_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_DELAYTIMER_MAX'.
+-
+-`_SC_MQ_OPEN_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_MQ_OPEN_MAX'.
+-
+-`_SC_MQ_PRIO_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_MQ_PRIO_MAX'.
+-
+-`_SC_RTSIG_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_RTSIG_MAX'.
+-
+-`_SC_SEM_NSEMS_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_SEM_NSEMS_MAX'.
+-
+-`_SC_SEM_VALUE_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_SEM_VALUE_MAX'.
+-
+-`_SC_SIGQUEUE_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_SIGQUEUE_MAX'.
+-
+-`_SC_TIMER_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_TIMER_MAX'.
+-
+-`_SC_PII'
+-     Inquire about the parameter corresponding to `_POSIX_PII'.
+-
+-`_SC_PII_XTI'
+-     Inquire about the parameter corresponding to `_POSIX_PII_XTI'.
+-
+-`_SC_PII_SOCKET'
+-     Inquire about the parameter corresponding to `_POSIX_PII_SOCKET'.
+-
+-`_SC_PII_INTERNET'
+-     Inquire about the parameter corresponding to `_POSIX_PII_INTERNET'.
+-
+-`_SC_PII_OSI'
+-     Inquire about the parameter corresponding to `_POSIX_PII_OSI'.
+-
+-`_SC_SELECT'
+-     Inquire about the parameter corresponding to `_POSIX_SELECT'.
+-
+-`_SC_UIO_MAXIOV'
+-     Inquire about the parameter corresponding to `_POSIX_UIO_MAXIOV'.
+-
+-`_SC_PII_INTERNET_STREAM'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_PII_INTERNET_STREAM'.
+-
+-`_SC_PII_INTERNET_DGRAM'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_PII_INTERNET_DGRAM'.
+-
+-`_SC_PII_OSI_COTS'
+-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_COTS'.
+-
+-`_SC_PII_OSI_CLTS'
+-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_CLTS'.
+-
+-`_SC_PII_OSI_M'
+-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_M'.
+-
+-`_SC_T_IOV_MAX'
+-     Inquire the value of the value associated with the `T_IOV_MAX'
+-     variable.
+-
+-`_SC_THREADS'
+-     Inquire about the parameter corresponding to `_POSIX_THREADS'.
+-
+-`_SC_THREAD_SAFE_FUNCTIONS'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_SAFE_FUNCTIONS'.
+-
+-`_SC_GETGR_R_SIZE_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_GETGR_R_SIZE_MAX'.
+-
+-`_SC_GETPW_R_SIZE_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_GETPW_R_SIZE_MAX'.
+-
+-`_SC_LOGIN_NAME_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_LOGIN_NAME_MAX'.
+-
+-`_SC_TTY_NAME_MAX'
+-     Inquire about the parameter corresponding to `_POSIX_TTY_NAME_MAX'.
+-
+-`_SC_THREAD_DESTRUCTOR_ITERATIONS'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_DESTRUCTOR_ITERATIONS'.
+-
+-`_SC_THREAD_KEYS_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_KEYS_MAX'.
+-
+-`_SC_THREAD_STACK_MIN'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_STACK_MIN'.
+-
+-`_SC_THREAD_THREADS_MAX'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_THREADS_MAX'.
+-
+-`_SC_THREAD_ATTR_STACKADDR'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_ATTR_STACKADDR'.
+-
+-`_SC_THREAD_ATTR_STACKSIZE'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_ATTR_STACKSIZE'.
+-
+-`_SC_THREAD_PRIORITY_SCHEDULING'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_PRIORITY_SCHEDULING'.
+-
+-`_SC_THREAD_PRIO_INHERIT'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_PRIO_INHERIT'.
+-
+-`_SC_THREAD_PRIO_PROTECT'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_PRIO_PROTECT'.
+-
+-`_SC_THREAD_PROCESS_SHARED'
+-     Inquire about the parameter corresponding to
+-     `_POSIX_THREAD_PROCESS_SHARED'.
+-
+-`_SC_2_C_DEV'
+-     Inquire about whether the system has the POSIX.2 C compiler
+-     command, `c89'.
+-
+-`_SC_2_FORT_DEV'
+-     Inquire about whether the system has the POSIX.2 Fortran compiler
+-     command, `fort77'.
+-
+-`_SC_2_FORT_RUN'
+-     Inquire about whether the system has the POSIX.2 `asa' command to
+-     interpret Fortran carriage control.
+-
+-`_SC_2_LOCALEDEF'
+-     Inquire about whether the system has the POSIX.2 `localedef'
+-     command.
+-
+-`_SC_2_SW_DEV'
+-     Inquire about whether the system has the POSIX.2 commands `ar',
+-     `make', and `strip'.
+-
+-`_SC_BC_BASE_MAX'
+-     Inquire about the maximum value of `obase' in the `bc' utility.
+-
+-`_SC_BC_DIM_MAX'
+-     Inquire about the maximum size of an array in the `bc' utility.
+-
+-`_SC_BC_SCALE_MAX'
+-     Inquire about the maximum value of `scale' in the `bc' utility.
+-
+-`_SC_BC_STRING_MAX'
+-     Inquire about the maximum size of a string constant in the `bc'
+-     utility.
+-
+-`_SC_COLL_WEIGHTS_MAX'
+-     Inquire about the maximum number of weights that can necessarily
+-     be used in defining the collating sequence for a locale.
+-
+-`_SC_EXPR_NEST_MAX'
+-     Inquire about the maximum number of expressions nested within
+-     parentheses when using the `expr' utility.
+-
+-`_SC_LINE_MAX'
+-     Inquire about the maximum size of a text line that the POSIX.2 text
+-     utilities can handle.
+-
+-`_SC_EQUIV_CLASS_MAX'
+-     Inquire about the maximum number of weights that can be assigned
+-     to an entry of the `LC_COLLATE' category `order' keyword in a
+-     locale definition.  The GNU C library does not presently support
+-     locale definitions.
+-
+-`_SC_VERSION'
+-     Inquire about the version number of POSIX.1 that the library and
+-     kernel support.
+-
+-`_SC_2_VERSION'
+-     Inquire about the version number of POSIX.2 that the system
+-     utilities support.
+-
+-`_SC_PAGESIZE'
+-     Inquire about the virtual memory page size of the machine.
+-     `getpagesize' returns the same value.
+-
+-`_SC_NPROCESSORS_CONF'
+-     Inquire about number of configured processors.
+-
+-`_SC_NPROCESSORS_ONLN'
+-     Inquire about number of processors online.
+-
+-`_SC_PHYS_PAGES'
+-     Inquire about number of physical pages in the system.
+-
+-`_SC_AVPHYS_PAGES'
+-     Inquire about number of available physical pages in the system.
+-
+-`_SC_ATEXIT_MAX'
+-     Inquire about number of functions which can be registered as
+-     termination functions for `atexit'; *note Cleanups on Exit::..
+-
+-`_SC_XOPEN_VERSION'
+-     Inquire about the parameter corresponding to `_XOPEN_VERSION'.
+-
+-`_SC_XOPEN_XCU_VERSION'
+-     Inquire about the parameter corresponding to `_XOPEN_XCU_VERSION'.
+-
+-`_SC_XOPEN_UNIX'
+-     Inquire about the parameter corresponding to `_XOPEN_UNIX'.
+-
+-`_SC_XOPEN_CRYPT'
+-     Inquire about the parameter corresponding to `_XOPEN_CRYPT'.
+-
+-`_SC_XOPEN_ENH_I18N'
+-     Inquire about the parameter corresponding to `_XOPEN_ENH_I18N'.
+-
+-`_SC_XOPEN_SHM'
+-     Inquire about the parameter corresponding to `_XOPEN_SHM'.
+-
+-`_SC_XOPEN_XPG2'
+-     Inquire about the parameter corresponding to `_XOPEN_XPG2'.
+-
+-`_SC_XOPEN_XPG3'
+-     Inquire about the parameter corresponding to `_XOPEN_XPG3'.
+-
+-`_SC_XOPEN_XPG4'
+-     Inquire about the parameter corresponding to `_XOPEN_XPG4'.
+-
+-`_SC_CHAR_BIT'
+-     Inquire about number of bits in a variable of type `char'.
+-
+-`_SC_CHAR_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `char'.
+-
+-`_SC_CHAR_MIN'
+-     Inquire about minimum value which can be stored in a variable of
+-     type `char'.
+-
+-`_SC_INT_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `int'.
+-
+-`_SC_INT_MIN'
+-     Inquire about minimum value which can be stored in a variable of
+-     type `int'.
+-
+-`_SC_LONG_BIT'
+-     Inquire about number of bits in a variable of type `long int'.
+-
+-`_SC_WORD_BIT'
+-     Inquire about number of bits in a variable of a register word.
+-
+-`_SC_MB_LEN_MAX'
+-     Inquire the maximum length of a multi-byte representation of a wide
+-     character value.
+-
+-`_SC_NZERO'
+-     Inquire value used to internally represent the zero priority level
+-     for the process execution.
+-
+-`SC_SSIZE_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `ssize_t'.
+-
+-`_SC_SCHAR_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `signed char'.
+-
+-`_SC_SCHAR_MIN'
+-     Inquire about minimum value which can be stored in a variable of
+-     type `signed char'.
+-
+-`_SC_SHRT_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `short int'.
+-
+-`_SC_SHRT_MIN'
+-     Inquire about minimum value which can be stored in a variable of
+-     type `short int'.
+-
+-`_SC_UCHAR_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `unsigned char'.
+-
+-`_SC_UINT_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `unsigned int'.
+-
+-`_SC_ULONG_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `unsigned long int'.
+-
+-`_SC_USHRT_MAX'
+-     Inquire about maximum value which can be stored in a variable of
+-     type `unsigned short int'.
+-
+-`_SC_NL_ARGMAX'
+-     Inquire about the parameter corresponding to `NL_ARGMAX'.
+-
+-`_SC_NL_LANGMAX'
+-     Inquire about the parameter corresponding to `NL_LANGMAX'.
+-
+-`_SC_NL_MSGMAX'
+-     Inquire about the parameter corresponding to `NL_MSGMAX'.
+-
+-`_SC_NL_NMAX'
+-     Inquire about  the parameter corresponding to `NL_NMAX'.
+-
+-`_SC_NL_SETMAX'
+-     Inquire about  the parameter corresponding to `NL_SETMAX'.
+-
+-`_SC_NL_TEXTMAX'
+-     Inquire about  the parameter corresponding to `NL_TEXTMAX'.
+-
+-
+-File: libc.info,  Node: Examples of Sysconf,  Prev: Constants for Sysconf,  Up: Sysconf
+-
+-Examples of `sysconf'
+----------------------
+-
+-   We recommend that you first test for a macro definition for the
+-parameter you are interested in, and call `sysconf' only if the macro
+-is not defined.  For example, here is how to test whether job control
+-is supported:
+-
+-     int
+-     have_job_control (void)
+-     {
+-     #ifdef _POSIX_JOB_CONTROL
+-       return 1;
+-     #else
+-       int value = sysconf (_SC_JOB_CONTROL);
+-       if (value < 0)
+-         /* If the system is that badly wedged,
+-            there's no use trying to go on.  */
+-         fatal (strerror (errno));
+-       return value;
+-     #endif
+-     }
+-
+-   Here is how to get the value of a numeric limit:
+-
+-     int
+-     get_child_max ()
+-     {
+-     #ifdef CHILD_MAX
+-       return CHILD_MAX;
+-     #else
+-       int value = sysconf (_SC_CHILD_MAX);
+-       if (value < 0)
+-         fatal (strerror (errno));
+-       return value;
+-     #endif
+-     }
+-
+-
+-File: libc.info,  Node: Minimums,  Next: Limits for Files,  Prev: Sysconf,  Up: System Configuration
+-
+-Minimum Values for General Capacity Limits
+-==========================================
+-
+-   Here are the names for the POSIX minimum upper bounds for the system
+-limit parameters.  The significance of these values is that you can
+-safely push to these limits without checking whether the particular
+-system you are using can go that far.
+-
+-`_POSIX_AIO_LISTIO_MAX'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of I/O operations that can be specified in a list I/O call.
+-     The value of this constant is `2'; thus you can add up to two new
+-     entries of the list of outstandard operations.
+-
+-`_POSIX_AIO_MAX'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of outstanding asynchronous I/O operations.  The value of
+-     this constant is `1'.  So you cannot expect that you can issue
+-     more than one operation and immediately continue with the normal
+-     work, receiving the notifications asynchronously.
+-
+-`_POSIX_ARG_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum combined length of the ARGV and ENVIRON
+-     arguments that can be passed to the `exec' functions.  Its value
+-     is `4096'.
+-
+-`_POSIX_CHILD_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum number of simultaneous processes per real
+-     user ID.  Its value is `6'.
+-
+-`_POSIX_NGROUPS_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum number of supplementary group IDs per
+-     process.  Its value is `0'.
+-
+-`_POSIX_OPEN_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum number of files that a single process can
+-     have open simultaneously.  Its value is `16'.
+-
+-`_POSIX_SSIZE_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum value that can be stored in an object of type
+-     `ssize_t'.  Its value is `32767'.
+-
+-`_POSIX_STREAM_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum number of streams that a single process can
+-     have open simultaneously.  Its value is `8'.
+-
+-`_POSIX_TZNAME_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the maximum length of a time zone name.  Its value is
+-     `3'.
+-
+-`_POSIX2_RE_DUP_MAX'
+-     The value of this macro is the most restrictive limit permitted by
+-     POSIX for the numbers used in the `\{MIN,MAX\}' construct in a
+-     regular expression.  Its value is `255'.
+-
+-
+-File: libc.info,  Node: Limits for Files,  Next: Options for Files,  Prev: Minimums,  Up: System Configuration
+-
+-Limits on File System Capacity
+-==============================
+-
+-   The POSIX.1 standard specifies a number of parameters that describe
+-the limitations of the file system.  It's possible for the system to
+-have a fixed, uniform limit for a parameter, but this isn't the usual
+-case.  On most systems, it's possible for different file systems (and,
+-for some parameters, even different files) to have different maximum
+-limits.  For example, this is very likely if you use NFS to mount some
+-of the file systems from other machines.
+-
+-   Each of the following macros is defined in `limits.h' only if the
+-system has a fixed, uniform limit for the parameter in question.  If the
+-system allows different file systems or files to have different limits,
+-then the macro is undefined; use `pathconf' or `fpathconf' to find out
+-the limit that applies to a particular file.  *Note Pathconf::.
+-
+-   Each parameter also has another macro, with a name starting with
+-`_POSIX', which gives the lowest value that the limit is allowed to
+-have on *any* POSIX system.  *Note File Minimums::.
+-
+- - Macro: int LINK_MAX
+-     The uniform system limit (if any) for the number of names for a
+-     given file.  *Note Hard Links::.
+-
+- - Macro: int MAX_CANON
+-     The uniform system limit (if any) for the amount of text in a line
+-     of input when input editing is enabled.  *Note Canonical or Not::.
+-
+- - Macro: int MAX_INPUT
+-     The uniform system limit (if any) for the total number of
+-     characters typed ahead as input.  *Note I/O Queues::.
+-
+- - Macro: int NAME_MAX
+-     The uniform system limit (if any) for the length of a file name
+-     component.
+-
+- - Macro: int PATH_MAX
+-     The uniform system limit (if any) for the length of an entire file
+-     name (that is, the argument given to system calls such as `open').
+-
+- - Macro: int PIPE_BUF
+-     The uniform system limit (if any) for the number of bytes that can
+-     be written atomically to a pipe.  If multiple processes are
+-     writing to the same pipe simultaneously, output from different
+-     processes might be interleaved in chunks of this size.  *Note
+-     Pipes and FIFOs::.
+-
+-   These are alternative macro names for some of the same information.
+-
+- - Macro: int MAXNAMLEN
+-     This is the BSD name for `NAME_MAX'.  It is defined in `dirent.h'.
+-
+- - Macro: int FILENAME_MAX
+-     The value of this macro is an integer constant expression that
+-     represents the maximum length of a file name string.  It is
+-     defined in `stdio.h'.
+-
+-     Unlike `PATH_MAX', this macro is defined even if there is no actual
+-     limit imposed.  In such a case, its value is typically a very large
+-     number.  *This is always the case on the GNU system.*
+-
+-     *Usage Note:* Don't use `FILENAME_MAX' as the size of an array in
+-     which to store a file name!  You can't possibly make an array that
+-     big!  Use dynamic allocation (*note Memory Allocation::.) instead.
+-
+-
+-File: libc.info,  Node: Options for Files,  Next: File Minimums,  Prev: Limits for Files,  Up: System Configuration
+-
+-Optional Features in File Support
+-=================================
+-
+-   POSIX defines certain system-specific options in the system calls for
+-operating on files.  Some systems support these options and others do
+-not.  Since these options are provided in the kernel, not in the
+-library, simply using the GNU C library does not guarantee any of these
+-features is supported; it depends on the system you are using.  They can
+-also vary between file systems on a single machine.
+-
+-   This section describes the macros you can test to determine whether a
+-particular option is supported on your machine.  If a given macro is
+-defined in `unistd.h', then its value says whether the corresponding
+-feature is supported.  (A value of `-1' indicates no; any other value
+-indicates yes.)  If the macro is undefined, it means particular files
+-may or may not support the feature.
+-
+-   Since all the machines that support the GNU C library also support
+-NFS, one can never make a general statement about whether all file
+-systems support the `_POSIX_CHOWN_RESTRICTED' and `_POSIX_NO_TRUNC'
+-features.  So these names are never defined as macros in the GNU C
+-library.
+-
+- - Macro: int _POSIX_CHOWN_RESTRICTED
+-     If this option is in effect, the `chown' function is restricted so
+-     that the only changes permitted to nonprivileged processes is to
+-     change the group owner of a file to either be the effective group
+-     ID of the process, or one of its supplementary group IDs.  *Note
+-     File Owner::.
+-
+- - Macro: int _POSIX_NO_TRUNC
+-     If this option is in effect, file name components longer than
+-     `NAME_MAX' generate an `ENAMETOOLONG' error.  Otherwise, file name
+-     components that are too long are silently truncated.
+-
+- - Macro: unsigned char _POSIX_VDISABLE
+-     This option is only meaningful for files that are terminal devices.
+-     If it is enabled, then handling for special control characters can
+-     be disabled individually.  *Note Special Characters::.
+-
+-   If one of these macros is undefined, that means that the option
+-might be in effect for some files and not for others.  To inquire about
+-a particular file, call `pathconf' or `fpathconf'.  *Note Pathconf::.
+-
+-
+-File: libc.info,  Node: File Minimums,  Next: Pathconf,  Prev: Options for Files,  Up: System Configuration
+-
+-Minimum Values for File System Limits
+-=====================================
+-
+-   Here are the names for the POSIX minimum upper bounds for some of the
+-above parameters.  The significance of these values is that you can
+-safely push to these limits without checking whether the particular
+-system you are using can go that far.  In most cases GNU systems do not
+-have these strict limitations.  The actual limit should be requested if
+-necessary.
+-
+-`_POSIX_LINK_MAX'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     value of a file's link count.  The value of this constant is `8';
+-     thus, you can always make up to eight names for a file without
+-     running into a system limit.
+-
+-`_POSIX_MAX_CANON'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of bytes in a canonical input line from a terminal device.
+-     The value of this constant is `255'.
+-
+-`_POSIX_MAX_INPUT'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of bytes in a terminal device input queue (or typeahead
+-     buffer).  *Note Input Modes::.  The value of this constant is
+-     `255'.
+-
+-`_POSIX_NAME_MAX'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of bytes in a file name component.  The value of this
+-     constant is `14'.
+-
+-`_POSIX_PATH_MAX'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of bytes in a file name.  The value of this constant is
+-     `255'.
+-
+-`_POSIX_PIPE_BUF'
+-     The most restrictive limit permitted by POSIX for the maximum
+-     number of bytes that can be written atomically to a pipe.  The
+-     value of this constant is `512'.
+-
+-
+-File: libc.info,  Node: Pathconf,  Next: Utility Limits,  Prev: File Minimums,  Up: System Configuration
+-
+-Using `pathconf'
+-================
+-
+-   When your machine allows different files to have different values
+-for a file system parameter, you can use the functions in this section
+-to find out the value that applies to any particular file.
+-
+-   These functions and the associated constants for the PARAMETER
+-argument are declared in the header file `unistd.h'.
+-
+- - Function: long int pathconf (const char *FILENAME, int PARAMETER)
+-     This function is used to inquire about the limits that apply to
+-     the file named FILENAME.
+-
+-     The PARAMETER argument should be one of the `_PC_' constants
+-     listed below.
+-
+-     The normal return value from `pathconf' is the value you requested.
+-     A value of `-1' is returned both if the implementation does not
+-     impose a limit, and in case of an error.  In the former case,
+-     `errno' is not set, while in the latter case, `errno' is set to
+-     indicate the cause of the problem.  So the only way to use this
+-     function robustly is to store `0' into `errno' just before calling
+-     it.
+-
+-     Besides the usual file name errors (*note File Name Errors::.),
+-     the following error condition is defined for this function:
+-
+-    `EINVAL'
+-          The value of PARAMETER is invalid, or the implementation
+-          doesn't support the PARAMETER for the specific file.
+-
+- - Function: long int fpathconf (int FILEDES, int PARAMETER)
+-     This is just like `pathconf' except that an open file descriptor
+-     is used to specify the file for which information is requested,
+-     instead of a file name.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EBADF'
+-          The FILEDES argument is not a valid file descriptor.
+-
+-    `EINVAL'
+-          The value of PARAMETER is invalid, or the implementation
+-          doesn't support the PARAMETER for the specific file.
+-
+-   Here are the symbolic constants that you can use as the PARAMETER
+-argument to `pathconf' and `fpathconf'.  The values are all integer
+-constants.
+-
+-`_PC_LINK_MAX'
+-     Inquire about the value of `LINK_MAX'.
+-
+-`_PC_MAX_CANON'
+-     Inquire about the value of `MAX_CANON'.
+-
+-`_PC_MAX_INPUT'
+-     Inquire about the value of `MAX_INPUT'.
+-
+-`_PC_NAME_MAX'
+-     Inquire about the value of `NAME_MAX'.
+-
+-`_PC_PATH_MAX'
+-     Inquire about the value of `PATH_MAX'.
+-
+-`_PC_PIPE_BUF'
+-     Inquire about the value of `PIPE_BUF'.
+-
+-`_PC_CHOWN_RESTRICTED'
+-     Inquire about the value of `_POSIX_CHOWN_RESTRICTED'.
+-
+-`_PC_NO_TRUNC'
+-     Inquire about the value of `_POSIX_NO_TRUNC'.
+-
+-`_PC_VDISABLE'
+-     Inquire about the value of `_POSIX_VDISABLE'.
+-
+-`_PC_SYNC_IO'
+-     Inquire about the value of `_POSIX_SYNC_IO'.
+-
+-`_PC_ASYNC_IO'
+-     Inquire about the value of `_POSIX_ASYNC_IO'.
+-
+-`_PC_PRIO_IO'
+-     Inquire about the value of `_POSIX_PRIO_IO'.
+-
+-`_PC_SOCK_MAXBUF'
+-     Inquire about the value of `_POSIX_PIPE_BUF'.
+-
+-
+-File: libc.info,  Node: Utility Limits,  Next: Utility Minimums,  Prev: Pathconf,  Up: System Configuration
+-
+-Utility Program Capacity Limits
+-===============================
+-
+-   The POSIX.2 standard specifies certain system limits that you can
+-access through `sysconf' that apply to utility behavior rather than the
+-behavior of the library or the operating system.
+-
+-   The GNU C library defines macros for these limits, and `sysconf'
+-returns values for them if you ask; but these values convey no
+-meaningful information.  They are simply the smallest values that
+-POSIX.2 permits.
+-
+- - Macro: int BC_BASE_MAX
+-     The largest value of `obase' that the `bc' utility is guaranteed
+-     to support.
+-
+- - Macro: int BC_DIM_MAX
+-     The largest number of elements in one array that the `bc' utility
+-     is guaranteed to support.
+-
+- - Macro: int BC_SCALE_MAX
+-     The largest value of `scale' that the `bc' utility is guaranteed
+-     to support.
+-
+- - Macro: int BC_STRING_MAX
+-     The largest number of characters in one string constant that the
+-     `bc' utility is guaranteed to support.
+-
+- - Macro: int COLL_WEIGHTS_MAX
+-     The largest number of weights that can necessarily be used in
+-     defining the collating sequence for a locale.
+-
+- - Macro: int EXPR_NEST_MAX
+-     The maximum number of expressions that can be nested within
+-     parenthesis by the `expr' utility.
+-
+- - Macro: int LINE_MAX
+-     The largest text line that the text-oriented POSIX.2 utilities can
+-     support.  (If you are using the GNU versions of these utilities,
+-     then there is no actual limit except that imposed by the available
+-     virtual memory, but there is no way that the library can tell you
+-     this.)
+-
+- - Macro: int EQUIV_CLASS_MAX
+-     The maximum number of weights that can be assigned to an entry of
+-     the `LC_COLLATE' category `order' keyword in a locale definition.
+-     The GNU C library does not presently support locale definitions.
+-
+-
+-File: libc.info,  Node: Utility Minimums,  Next: String Parameters,  Prev: Utility Limits,  Up: System Configuration
+-
+-Minimum Values for Utility Limits
+-=================================
+-
+-`_POSIX2_BC_BASE_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     value of `obase' in the `bc' utility.  Its value is `99'.
+-
+-`_POSIX2_BC_DIM_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     size of an array in the `bc' utility.  Its value is `2048'.
+-
+-`_POSIX2_BC_SCALE_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     value of `scale' in the `bc' utility.  Its value is `99'.
+-
+-`_POSIX2_BC_STRING_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     size of a string constant in the `bc' utility.  Its value is
+-     `1000'.
+-
+-`_POSIX2_COLL_WEIGHTS_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     number of weights that can necessarily be used in defining the
+-     collating sequence for a locale.  Its value is `2'.
+-
+-`_POSIX2_EXPR_NEST_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     number of expressions nested within parenthesis when using the
+-     `expr' utility.  Its value is `32'.
+-
+-`_POSIX2_LINE_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     size of a text line that the text utilities can handle.  Its value
+-     is `2048'.
+-
+-`_POSIX2_EQUIV_CLASS_MAX'
+-     The most restrictive limit permitted by POSIX.2 for the maximum
+-     number of weights that can be assigned to an entry of the
+-     `LC_COLLATE' category `order' keyword in a locale definition.  Its
+-     value is `2'.  The GNU C library does not presently support locale
+-     definitions.
+-
+-
+-File: libc.info,  Node: String Parameters,  Prev: Utility Minimums,  Up: System Configuration
+-
+-String-Valued Parameters
+-========================
+-
+-   POSIX.2 defines a way to get string-valued parameters from the
+-operating system with the function `confstr':
+-
+- - Function: size_t confstr (int PARAMETER, char *BUF, size_t LEN)
+-     This function reads the value of a string-valued system parameter,
+-     storing the string into LEN bytes of memory space starting at BUF.
+-     The PARAMETER argument should be one of the `_CS_' symbols listed
+-     below.
+-
+-     The normal return value from `confstr' is the length of the string
+-     value that you asked for.  If you supply a null pointer for BUF,
+-     then `confstr' does not try to store the string; it just returns
+-     its length.  A value of `0' indicates an error.
+-
+-     If the string you asked for is too long for the buffer (that is,
+-     longer than `LEN - 1'), then `confstr' stores just that much
+-     (leaving room for the terminating null character).  You can tell
+-     that this has happened because `confstr' returns a value greater
+-     than or equal to LEN.
+-
+-     The following `errno' error conditions are defined for this
+-     function:
+-
+-    `EINVAL'
+-          The value of the PARAMETER is invalid.
+-
+-   Currently there is just one parameter you can read with `confstr':
+-
+-`_CS_PATH'
+-     This parameter's value is the recommended default path for
+-     searching for executable files.  This is the path that a user has
+-     by default just after logging in.
+-
+-`_CS_LFS_CFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the C compiler if a source is compiled using the
+-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS_LDFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the linker if a source is compiled using the
+-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS_LIBS'
+-     The returned string specifies which additional libraries must be
+-     linked to the application if a source is compiled using the
+-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS_LINTFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the lint tool if a source is compiled using the
+-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS64_CFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the C compiler if a source is compiled using the
+-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS64_LDFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the linker if a source is compiled using the
+-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS64_LIBS'
+-     The returned string specifies which additional libraries must be
+-     linked to the application if a source is compiled using the
+-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-`_CS_LFS64_LINTFLAGS'
+-     The returned string specifies which additional flags must be given
+-     to the lint tool if a source is compiled using the
+-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
+-     Macros::..
+-
+-   The way to use `confstr' without any arbitrary limit on string size
+-is to call it twice: first call it to get the length, allocate the
+-buffer accordingly, and then call `confstr' again to fill the buffer,
+-like this:
+-
+-     char *
+-     get_default_path (void)
+-     {
+-       size_t len = confstr (_CS_PATH, NULL, 0);
+-       char *buffer = (char *) xmalloc (len);
+-     
+-       if (confstr (_CS_PATH, buf, len + 1) == 0)
+-         {
+-           free (buffer);
+-           return NULL;
+-         }
+-     
+-       return buffer;
+-     }
+-
+-
+-File: libc.info,  Node: Cryptographic Functions,  Next: POSIX Threads,  Prev: System Configuration,  Up: Top
+-
+-DES Encryption and Password Handling
+-************************************
+-
+-   On many systems, it is unnecessary to have any kind of user
+-authentication; for instance, a workstation which is not connected to a
+-network probably does not need any user authentication, because to use
+-the machine an intruder must have physical access.
+-
+-   Sometimes, however, it is necessary to be sure that a user is
+-authorised to use some service a machine provides--for instance, to log
+-in as a particular user id (*note Users and Groups::.).  One
+-traditional way of doing this is for each user to choose a secret
+-"password"; then, the system can ask someone claiming to be a user what
+-the user's password is, and if the person gives the correct password
+-then the system can grant the appropriate privileges.
+-
+-   If all the passwords are just stored in a file somewhere, then this
+-file has to be very carefully protected.  To avoid this, passwords are
+-run through a "one-way function", a function which makes it difficult to
+-work out what its input was by looking at its output, before storing in
+-the file.
+-
+-   The GNU C library already provides a one-way function based on MD5.
+-The `crypt' add-on provides additional compatibility with the standard
+-UNIX one-way function based on the Data Encryption Standard.
+-
+-   It also provides support for Secure RPC, and some library functions
+-that can be used to perform normal DES encryption.
+-
+-   The add-on is not included in the main distribution of the GNU C
+-library because some governments, most notably those of France, Russia,
+-and the US, have very restrictive rules governing the distribution and
+-use of encryption software.  The first section below tries to describe
+-some of those rules.
+-
+-* Menu:
+-
+-* Legal Problems::              This software can get you locked up, or worse.
+-* getpass::                     Prompting the user for a password.
+-* crypt::                       A one-way function for UNIX passwords.
+-* DES Encryption::              Routines for DES encryption.
+-
+-
+-File: libc.info,  Node: Legal Problems,  Next: getpass,  Up: Cryptographic Functions
+-
+-Legal Problems
+-==============
+-
+-   Because of the continuously changing state of the law, it's not
+-possible to provide a definitive survey of the laws affecting
+-cryptography.  Instead, this section warns you of some of the known
+-trouble spots; this may help you when you try to find out what the laws
+-of your country are.
+-
+-   Some countries require that you have a licence to use, posess, or
+-import cryptography.  These countries are believed to include
+-Byelorussia, Burma, France, India, Indonesia, Israel, Kazakhstan,
+-Pakistan, Russia, and Saudi Arabia.
+-
+-   Some countries restrict the transmission of encrypted messages by
+-radio; some telecommunications carriers restrict the transmission of
+-encrypted messages over their network.
+-
+-   Many countries have some form of export control for encryption
+-software.  The Wassenaar Arrangement is a multilateral agreement
+-between 33 countries (Argentina, Australia, Austria, Belgium, Bulgaria,
+-Canada, the Czech Republic, Denmark, Finland, France, Germany, Greece,
+-Hungary, Ireland, Italy, Japan, Luxembourg, the Netherlands, New
+-Zealand, Norway, Poland, Portugal, the Republic of Korea, Romania, the
+-Russian Federation, the Slovak Republic, Spain, Sweden, Switzerland,
+-Turkey, Ukraine, the United Kingdom and the United States) which
+-restricts some kinds of encryption exports.  Different countries apply
+-the arrangement in different ways; some do not allow the exception for
+-certain kinds of "public domain" software (which would include this
+-library), some only restrict the export of software in tangible form,
+-and others impose significant additional restrictions.
+-
+-   In particular, the US does not allow export of this software without
+-a licence, including via the Internet.  So please do not download it
+-from the main FSF FTP site at `ftp.gnu.org' if you are outside the US.
+-This software was completely developed outside the US.
+-
+-   The rules in this area are continuously changing.  If any
+-information in this manual is out-of-date, please report it using the
+-`glibcbug' script. *Note Reporting Bugs::.
+-
+-
+-File: libc.info,  Node: getpass,  Next: crypt,  Prev: Legal Problems,  Up: Cryptographic Functions
+-
+-Reading Passwords
+-=================
+-
+-   When reading in a password, it is desirable to avoid displaying it on
+-the screen, to help keep it secret.  The following function handles this
+-in a convenient way.
+-
+- - Function: char * getpass (const char * PROMPT)
+-     `getpass' outputs PROMPT, then reads a string in from the terminal
+-     without echoing it.  It tries to connect to the real terminal,
+-     `/dev/tty', if possible, to encourage users not to put plaintext
+-     passwords in files; otherwise, it uses `stdin' and `stderr'.
+-
+-     In other C libraries, `getpass' may only return the first
+-     `PASS_MAX' bytes of a password.  The GNU C library has no limit, so
+-     `PASS_MAX' is undefined.
+-
+-     The prototype for this function is in `unistd.h'.  PASS_MAX would
+-     be defined in `limits.h'.
+-
+-
+-File: libc.info,  Node: crypt,  Next: DES Encryption,  Prev: getpass,  Up: Cryptographic Functions
+-
+-Encrypting Passwords
+-====================
+-
+- - Function: char * crypt (const char * KEY, const char * SALT)
+-     The `crypt' function takes a password, KEY, as a string, and a
+-     SALT character array which is described below, and returns a
+-     printable ASCII string which starts with another salt.  It is
+-     believed that, given the output of the function, the best way to
+-     find a KEY that will produce that output is to guess values of KEY
+-     until the original value of KEY is found.
+-
+-     The SALT parameter does two things.  Firstly, it selects which
+-     algorithm is used, the MD5-based one or the DES-based one.
+-     Secondly, it makes life harder for someone trying to guess
+-     passwords against a file containing many passwords; without a
+-     SALT, an intruder can make a guess, run `crypt' on it once, and
+-     compare the result with all the passwords.  With a SALT, the
+-     intruder must run `crypt' once for each different salt.
+-
+-     For the MD5-based algorithm, the SALT should consist of the string
+-     `$1$', followed by up to 8 characters, terminated by either
+-     another `$' or the end of the string.  The result of `crypt' will
+-     be the SALT, followed by a `$' if the salt didn't end with one,
+-     followed by 22 characters from the alphabet `./0-9A-Za-z', up to
+-     34 characters total.  Every character in the KEY is significant.
+-
+-     For the DES-based algorithm, the SALT should consist of two
+-     characters from the alphabet `./0-9A-Za-z', and the result of
+-     `crypt' will be those two characters followed by 11 more from the
+-     same alphabet, 13 in total.  Only the first 8 characters in the
+-     KEY are significant.  If the `crypt' add-on is not installed,
+-     trying to use the DES-based algorithm will return an empty string
+-     and set `errno' to `EOPNOTSUPP'.
+-
+-     The MD5-based algorithm is available in the GNU C library even if
+-     the `crypt' add-on is not installed.  It also has no limit on the
+-     useful length of the password used, and is slightly more secure.
+-     It is therefore preferred over the DES-based algorithm.
+-
+-     When the user enters their password for the first time, the SALT
+-     should be set to a new string which is reasonably random.  To
+-     verify a password against the result of a previous call to
+-     `crypt', pass the result of the previous call as the SALT.
+-
+-   The following short program is an example of how to use `crypt' the
+-first time a password is entered.  Note that the SALT generation is
+-just barely acceptable; in particular, it is not unique between
+-machines, and in many applications it would not be acceptable to let an
+-attacker know what time the user's password was last set.
+-
+-     #include <stdio.h>
+-     #include <time.h>
+-     #include <unistd.h>
+-     #include <crypt.h>
+-     
+-     int
+-     main(void)
+-     {
+-       unsigned long seed[2];
+-       char salt[] = "$1$........";
+-       const char *const seedchars =
+-         "./0123456789ABCDEFGHIJKLMNOPQRST"
+-         "UVWXYZabcdefghijklmnopqrstuvwxyz";
+-       char *password;
+-       int i;
+-     
+-       /* Generate a (not very) random seed.
+-          You should do it better than this... */
+-       seed[0] = time(NULL);
+-       seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);
+-     
+-       /* Turn it into printable characters from `seedchars'. */
+-       for (i = 0; i < 8; i++)
+-         salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];
+-     
+-       /* Read in the user's password and encrypt it. */
+-       password = crypt(getpass("Password:"), salt);
+-     
+-       /* Print the results. */
+-       puts(password);
+-       return 0;
+-     }
+-
+-   The next program shows how to verify a password.  It prompts the user
+-for a password and prints "Access granted." if the user types `GNU libc
+-manual'.
+-
+-     #include <stdio.h>
+-     #include <string.h>
+-     #include <unistd.h>
+-     #include <crypt.h>
+-     
+-     int
+-     main(void)
+-     {
+-       /* Hashed form of "GNU libc manual". */
+-       const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/";
+-     
+-       char *result;
+-       int ok;
+-     
+-       /* Read in the user's password and encrypt it,
+-          passing the expected password in as the salt. */
+-       result = crypt(getpass("Password:"), pass);
+-     
+-       /* Test the result. */
+-       ok = strcmp (result, pass) == 0;
+-     
+-       puts(ok ? "Access granted." : "Access denied.");
+-       return ok ? 0 : 1;
+-     }
+-
+- - Function: char * crypt_r (const char * KEY, const char * SALT,
+-          struct crypt_data * DATA)
+-     The `crypt_r' function does the same thing as `crypt', but takes
+-     an extra parameter which includes space for its result (among
+-     other things), so it can be reentrant.  `data->initialized' must be
+-     cleared to zero before the first time `crypt_r' is called.
+-
+-     The `crypt_r' function is a GNU extension.
+-
+-   The `crypt' and `crypt_r' functions are prototyped in the header
+-`crypt.h'.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-42 glibc-2.1.3/manual/libc.info-42
+--- ../glibc-2.1.3/manual/libc.info-42	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-42	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1068 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: DES Encryption,  Prev: crypt,  Up: Cryptographic Functions
+-
+-DES Encryption
+-==============
+-
+-   The Data Encryption Standard is described in the US Government
+-Federal Information Processing Standards (FIPS) 46-2 published by the
+-National Institute of Standards and Technology.  The DES has been very
+-thoroughly analysed since it was developed in the late 1970s, and no new
+-significant flaws have been found.  However, the DES uses only a 56-bit
+-key (plus 8 parity bits), and a machine has been built which can search
+-through all possible keys in about 6 days, which cost about US$200000;
+-faster searches would be possible with more money.  This makes simple
+-DES insecure for most practical purposes, and NIST is now evaluating
+-improved encryption algorithms.
+-
+-   The DES is a reversible operation which takes a 64-bit block and a
+-64-bit key, and produces another 64-bit block.  Usually the bits are
+-numbered so that the most-significant bit, the first bit, of each block
+-is numbered 1.
+-
+-   Under that numbering, every 8th bit of the key (the 8th, 16th, and so
+-on) is not used by the encryption algorithm itself.  But the key must
+-have odd parity; that is, out of bits 1 through 8, and 9 through 16, and
+-so on, there must be an odd number of `1' bits, and this completely
+-specifies the unused bits.
+-
+- - Function: void setkey (const char * KEY)
+-     The `setkey' function sets an internal data structure to be an
+-     expanded form of KEY.  KEY is specified as an array of 64 bits
+-     each stored in a `char', the first bit is `key[0]' and the 64th
+-     bit is `key[63]'.  The KEY should have the correct parity.
+-
+- - Function: void encrypt (char * BLOCK, int EDFLAG)
+-     The `encrypt' function encrypts BLOCK if EDFLAG is 0, otherwise it
+-     decrypts BLOCK, using a key previously set by `setkey'.  The
+-     result is placed in BLOCK.
+-
+-     Like `setkey', BLOCK is specified as an array of 64 bits each
+-     stored in a `char', but there are no parity bits in BLOCK.
+-
+- - Function: void setkey_r (const char * KEY, struct crypt_data * DATA)
+- - Function: void encrypt_r (char * BLOCK, int EDFLAG, struct
+-          crypt_data * DATA)
+-     These are reentrant versions of `setkey' and `encrypt'.  The only
+-     difference is the extra parameter, which stores the expanded
+-     version of KEY.  Before calling `setkey' the first time,
+-     `data->initialised' must be cleared to zero.
+-
+-   The `setkey_r' and `encrypt_r' functions are GNU extensions.
+-`setkey', `encrypt', `setkey_r', and `encrypt_r' are defined in
+-`crypt.h'.
+-
+-   If the `crypt' add-on is not used to build the library, programs
+-that use these four functions will crash when the functions are called.
+-If this is a problem, the `ecb_crypt' function described below is
+-recommended instead.
+-
+- - Function: int ecb_crypt (char * KEY, char * BLOCKS, unsigned LEN,
+-          unsigned MODE)
+-     The function `ecb_crypt' encrypts or decrypts one or more blocks
+-     using DES.  Each block is encrypted independently.
+-
+-     The BLOCKS and the KEY are stored packed in 8-bit bytes, so that
+-     the first bit of the key is the most-significant bit of `key[0]'
+-     and the 63rd bit of the key is stored as the least-significant bit
+-     of `key[7]'.  The KEY should have the correct parity.
+-
+-     LEN is the number of bytes in BLOCKS.  It should be a multiple of
+-     8 (so that there is a whole number of blocks to encrypt).  LEN is
+-     limited to a maximum of `DES_MAXDATA' bytes.
+-
+-     The result of the encryption replaces the input in BLOCKS.
+-
+-     The MODE parameter is the bitwise OR of two of the following:
+-
+-    `DES_ENCRYPT'
+-          This constant, used in the MODE parameter, specifies that
+-          BLOCKS is to be encrypted.
+-
+-    `DES_DECRYPT'
+-          This constant, used in the MODE parameter, specifies that
+-          BLOCKS is to be decrypted.
+-
+-    `DES_HW'
+-          This constant, used in the MODE parameter, asks to use a
+-          hardware device.  If no hardware device is available,
+-          encryption happens anyway, but in software.
+-
+-    `DES_SW'
+-          This constant, used in the MODE parameter, specifies that no
+-          hardware device is to be used.
+-
+-     The result of the function will be one of these values:
+-
+-    `DESERR_NONE'
+-          The encryption succeeded.
+-
+-    `DESERR_NOHWDEVICE'
+-          The encryption succeeded, but there was no hardware device
+-          available.
+-
+-    `DESERR_HWERROR'
+-          The encryption failed because of a hardware problem.  In the
+-          GNU library, this error code is also returned if the `crypt'
+-          add-on was not used to build the library.
+-
+-    `DESERR_BADPARAM'
+-          The encryption failed because of a bad parameter, for
+-          instance LEN is not a multiple of 8 or LEN is larger than
+-          `DES_MAXDATA'.
+-
+- - Function: int DES_FAILED (int ERR)
+-     This macro returns 1 if ERR is a `success' result code from
+-     `ecb_crypt' or `cbc_crypt', and 0 otherwise.
+-
+- - Function: int cbc_crypt (char * KEY, char * BLOCKS, unsigned LEN,
+-          unsigned MODE, char * IVEC)
+-     The function `cbc_crypt' encrypts or decrypts one or more blocks
+-     using DES in Cipher Block Chaining mode.
+-
+-     For encryption in CBC mode, each block is exclusive-ored with IVEC
+-     before being encrypted, then IVEC is replaced with the result of
+-     the encryption, then the next block is processed.  Decryption is
+-     the reverse of this process.
+-
+-     This has the advantage that blocks which are the same before being
+-     encrypted are very unlikely to be the same after being encrypted,
+-     making it much harder to detect patterns in the data.
+-
+-     Usually, IVEC is set to 8 random bytes before encryption starts.
+-     Then the 8 random bytes are transmitted along with the encrypted
+-     data (without themselves being encrypted), and passed back in as
+-     IVEC for decryption.  Another possibility is to set IVEC to 8
+-     zeroes initially, and have the first the block encrypted consist
+-     of 8 random bytes.
+-
+-     Otherwise, all the parameters are similar to those for `ecb_crypt'.
+-
+- - Function: void des_setparity (char * KEY)
+-     The function `des_setparity' changes the 64-bit KEY, stored packed
+-     in 8-bit bytes, to have odd parity by altering the low bits of
+-     each byte.
+-
+-   The `ecb_crypt', `cbc_crypt', and `des_setparity' functions and
+-their accompanying macros are all defined in the header
+-`rpc/des_crypt.h'.
+-
+-
+-File: libc.info,  Node: POSIX Threads,  Next: Language Features,  Prev: Cryptographic Functions,  Up: Top
+-
+-POSIX Threads
+-*************
+-
+-   This chapter describes the pthreads (POSIX threads) library.  This
+-library provides support functions for multithreaded programs: thread
+-primitives, synchronization objects, and so forth.  It also implements
+-POSIX 1003.1b semaphores (not to be confused with System V semaphores).
+-
+-   The threads operations (`pthread_*') do not use ERRNO.  Instead they
+-return an error code directly.  The semaphore operations do use ERRNO.
+-
+-* Menu:
+-
+-* Basic Thread Operations::     Creating, terminating, and waiting for threads.
+-* Thread Attributes::           Tuning thread scheduling.
+-* Cancellation::                Stopping a thread before it's done.
+-* Cleanup Handlers::            Deallocating resources when a thread is
+-                                  cancelled.
+-* Mutexes::                     One way to synchronize threads.
+-* Condition Variables::         Another way.
+-* POSIX Semaphores::            And a third way.
+-* Thread-Specific Data::        Variables with different values in
+-                                  different threads.
+-* Threads and Signal Handling:: Why you should avoid mixing the two, and
+-                                  how to do it if you must.
+-* Miscellaneous Thread Functions:: A grab bag of utility routines.
+-
+-
+-File: libc.info,  Node: Basic Thread Operations,  Next: Thread Attributes,  Up: POSIX Threads
+-
+-Basic Thread Operations
+-=======================
+-
+-   These functions are the thread equivalents of `fork', `exit', and
+-`wait'.
+-
+- - Function: int pthread_create (pthread_t * THREAD, pthread_attr_t *
+-          ATTR, void * (*START_ROUTINE)(void *), void * ARG)
+-     `pthread_create' creates a new thread of control that executes
+-     concurrently with the calling thread. The new thread calls the
+-     function START_ROUTINE, passing it ARG as first argument. The new
+-     thread terminates either explicitly, by calling `pthread_exit', or
+-     implicitly, by returning from the START_ROUTINE function. The
+-     latter case is equivalent to calling `pthread_exit' with the result
+-     returned by START_ROUTINE as exit code.
+-
+-     The ATTR argument specifies thread attributes to be applied to the
+-     new thread. *Note Thread Attributes::, for details. The ATTR
+-     argument can also be `NULL', in which case default attributes are
+-     used: the created thread is joinable (not detached) and has an
+-     ordinary (not realtime) scheduling policy.
+-
+-     On success, the identifier of the newly created thread is stored
+-     in the location pointed by the THREAD argument, and a 0 is
+-     returned. On error, a non-zero error code is returned.
+-
+-     This function may return the following errors:
+-    `EAGAIN'
+-          Not enough system resources to create a process for the new
+-          thread, or more than `PTHREAD_THREADS_MAX' threads are
+-          already active.
+-
+- - Function: void pthread_exit (void *RETVAL)
+-     `pthread_exit' terminates the execution of the calling thread.  All
+-     cleanup handlers (*note Cleanup Handlers::.) that have been set
+-     for the calling thread with `pthread_cleanup_push' are executed in
+-     reverse order (the most recently pushed handler is executed
+-     first). Finalization functions for thread-specific data are then
+-     called for all keys that have non-`NULL' values associated with
+-     them in the calling thread (*note Thread-Specific Data::.).
+-     Finally, execution of the calling thread is stopped.
+-
+-     The RETVAL argument is the return value of the thread. It can be
+-     retrieved from another thread using `pthread_join'.
+-
+-     The `pthread_exit' function never returns.
+-
+- - Function: int pthread_cancel (pthread_t THREAD)
+-     `pthread_cancel' sends a cancellation request to the thread denoted
+-     by the THREAD argument.  If there is no such thread,
+-     `pthread_cancel' fails and returns `ESRCH'.  Otherwise it returns
+-     0. *Note Cancellation::, for details.
+-
+- - Function: int pthread_join (pthread_t TH, void **thread_RETURN)
+-     `pthread_join' suspends the execution of the calling thread until
+-     the thread identified by TH terminates, either by calling
+-     `pthread_exit' or by being cancelled.
+-
+-     If THREAD_RETURN is not `NULL', the return value of TH is stored
+-     in the location pointed to by THREAD_RETURN.  The return value of
+-     TH is either the argument it gave to `pthread_exit', or
+-     `PTHREAD_CANCELED' if TH was cancelled.
+-
+-     The joined thread `th' must be in the joinable state: it must not
+-     have been detached using `pthread_detach' or the
+-     `PTHREAD_CREATE_DETACHED' attribute to `pthread_create'.
+-
+-     When a joinable thread terminates, its memory resources (thread
+-     descriptor and stack) are not deallocated until another thread
+-     performs `pthread_join' on it. Therefore, `pthread_join' must be
+-     called once for each joinable thread created to avoid memory leaks.
+-
+-     At most one thread can wait for the termination of a given thread.
+-     Calling `pthread_join' on a thread TH on which another thread is
+-     already waiting for termination returns an error.
+-
+-     `pthread_join' is a cancellation point. If a thread is canceled
+-     while suspended in `pthread_join', the thread execution resumes
+-     immediately and the cancellation is executed without waiting for
+-     the TH thread to terminate. If cancellation occurs during
+-     `pthread_join', the TH thread remains not joined.
+-
+-     On success, the return value of TH is stored in the location
+-     pointed to by THREAD_RETURN, and 0 is returned. On error, one of
+-     the following values is returned:
+-    `ESRCH'
+-          No thread could be found corresponding to that specified by
+-          TH.
+-
+-    `EINVAL'
+-          The TH thread has been detached, or another thread is already
+-          waiting on termination of TH.
+-
+-    `EDEADLK'
+-          The TH argument refers to the calling thread.
+-
+-
+-File: libc.info,  Node: Thread Attributes,  Next: Cancellation,  Prev: Basic Thread Operations,  Up: POSIX Threads
+-
+-Thread Attributes
+-=================
+-
+-   Threads have a number of attributes that may be set at creation time.
+-This is done by filling a thread attribute object ATTR of type
+-`pthread_attr_t', then passing it as second argument to
+-`pthread_create'. Passing `NULL' is equivalent to passing a thread
+-attribute object with all attributes set to their default values.
+-
+-   Attribute objects are consulted only when creating a new thread.  The
+-same attribute object can be used for creating several threads.
+-Modifying an attribute object after a call to `pthread_create' does not
+-change the attributes of the thread previously created.
+-
+- - Function: int pthread_attr_init (pthread_attr_t *ATTR)
+-     `pthread_attr_init' initializes the thread attribute object ATTR
+-     and fills it with default values for the attributes. (The default
+-     values are listed below for each attribute.)
+-
+-     Each attribute ATTRNAME (see below for a list of all attributes)
+-     can be individually set using the function
+-     `pthread_attr_setATTRNAME' and retrieved using the function
+-     `pthread_attr_getATTRNAME'.
+-
+- - Function: int pthread_attr_destroy (pthread_attr_t *ATTR)
+-     `pthread_attr_destroy' destroys the attribute object pointed to by
+-     ATTR releasing any resources associated with it.  ATTR is left in
+-     an undefined state, and you must not use it again in a call to any
+-     pthreads function until it has been reinitialized.
+-
+- - Function: int pthread_attr_setATTR (pthread_attr_t *OBJ, int VALUE)
+-     Set attribute ATTR to VALUE in the attribute object pointed to by
+-     OBJ.  See below for a list of possible attributes and the values
+-     they can take.
+-
+-     On success, these functions return 0.  If VALUE is not meaningful
+-     for the ATTR being modified, they will return the error code
+-     `EINVAL'.  Some of the functions have other failure modes; see
+-     below.
+-
+- - Function: int pthread_attr_getATTR (const pthread_attr_t *OBJ, int
+-          *VALUE)
+-     Store the current setting of ATTR in OBJ into the variable pointed
+-     to by VALUE.
+-
+-     These functions always return 0.
+-
+-   The following thread attributes are supported:
+-`detachstate'
+-     Choose whether the thread is created in the joinable state (value
+-     `PTHREAD_CREATE_JOINABLE') or in the detached state
+-     (`PTHREAD_CREATE_DETACHED').  The default is
+-     `PTHREAD_CREATE_JOINABLE'.
+-
+-     In the joinable state, another thread can synchronize on the thread
+-     termination and recover its termination code using `pthread_join',
+-     but some of the thread resources are kept allocated after the
+-     thread terminates, and reclaimed only when another thread performs
+-     `pthread_join' on that thread.
+-
+-     In the detached state, the thread resources are immediately freed
+-     when it terminates, but `pthread_join' cannot be used to
+-     synchronize on the thread termination.
+-
+-     A thread created in the joinable state can later be put in the
+-     detached thread using `pthread_detach'.
+-
+-`schedpolicy'
+-     Select the scheduling policy for the thread: one of `SCHED_OTHER'
+-     (regular, non-realtime scheduling), `SCHED_RR' (realtime,
+-     round-robin) or `SCHED_FIFO' (realtime, first-in first-out).  The
+-     default is `SCHED_OTHER'.
+-
+-     The realtime scheduling policies `SCHED_RR' and `SCHED_FIFO' are
+-     available only to processes with superuser privileges.
+-     `pthread_attr_setschedparam' will fail and return `ENOTSUP' if you
+-     try to set a realtime policy when you are unprivileged.
+-
+-     The scheduling policy of a thread can be changed after creation
+-     with `pthread_setschedparam'.
+-
+-`schedparam'
+-     Change the scheduling parameter (the scheduling priority) for the
+-     thread.  The default is 0.
+-
+-     This attribute is not significant if the scheduling policy is
+-     `SCHED_OTHER'; it only matters for the realtime policies
+-     `SCHED_RR' and `SCHED_FIFO'.
+-
+-     The scheduling priority of a thread can be changed after creation
+-     with `pthread_setschedparam'.
+-
+-`inheritsched'
+-     Choose whether the scheduling policy and scheduling parameter for
+-     the newly created thread are determined by the values of the
+-     SCHEDPOLICY and SCHEDPARAM attributes (value
+-     `PTHREAD_EXPLICIT_SCHED') or are inherited from the parent thread
+-     (value `PTHREAD_INHERIT_SCHED').  The default is
+-     `PTHREAD_EXPLICIT_SCHED'.
+-
+-`scope'
+-     Choose the scheduling contention scope for the created thread.  The
+-     default is `PTHREAD_SCOPE_SYSTEM', meaning that the threads contend
+-     for CPU time with all processes running on the machine. In
+-     particular, thread priorities are interpreted relative to the
+-     priorities of all other processes on the machine. The other
+-     possibility, `PTHREAD_SCOPE_PROCESS', means that scheduling
+-     contention occurs only between the threads of the running process:
+-     thread priorities are interpreted relative to the priorities of
+-     the other threads of the process, regardless of the priorities of
+-     other processes.
+-
+-     `PTHREAD_SCOPE_PROCESS' is not supported in LinuxThreads.  If you
+-     try to set the scope to this value `pthread_attr_setscope' will
+-     fail and return `ENOTSUP'.
+-
+-
+-File: libc.info,  Node: Cancellation,  Next: Cleanup Handlers,  Prev: Thread Attributes,  Up: POSIX Threads
+-
+-Cancellation
+-============
+-
+-   Cancellation is the mechanism by which a thread can terminate the
+-execution of another thread. More precisely, a thread can send a
+-cancellation request to another thread. Depending on its settings, the
+-target thread can then either ignore the request, honor it immediately,
+-or defer it till it reaches a cancellation point.  When threads are
+-first created by `pthread_create', they always defer cancellation
+-requests.
+-
+-   When a thread eventually honors a cancellation request, it behaves
+-as if `pthread_exit(PTHREAD_CANCELED)' was called.  All cleanup handlers
+-are executed in reverse order, finalization functions for
+-thread-specific data are called, and finally the thread stops executing.
+-If the cancelled thread was joinable, the return value
+-`PTHREAD_CANCELED' is provided to whichever thread calls PTHREAD_JOIN
+-on it. See `pthread_exit' for more information.
+-
+-   Cancellation points are the points where the thread checks for
+-pending cancellation requests and performs them.  The POSIX threads
+-functions `pthread_join', `pthread_cond_wait',
+-`pthread_cond_timedwait', `pthread_testcancel', `sem_wait', and
+-`sigwait' are cancellation points.  In addition, these system calls are
+-cancellation points:
+-
+-accept                   open                     sendmsg                  
+-close                    pause                    sendto                   
+-connect                  read                     system                   
+-fcntl                    recv                     tcdrain                  
+-fsync                    recvfrom                 wait                     
+-lseek                    recvmsg                  waitpid                  
+-msync                    send                     write                    
+-nanosleep                                                                  
+-
+-All library functions that call these functions (such as `printf') are
+-also cancellation points.
+-
+- - Function: int pthread_setcancelstate (int STATE, int *OLDSTATE)
+-     `pthread_setcancelstate' changes the cancellation state for the
+-     calling thread - that is, whether cancellation requests are
+-     ignored or not. The STATE argument is the new cancellation state:
+-     either `PTHREAD_CANCEL_ENABLE' to enable cancellation, or
+-     `PTHREAD_CANCEL_DISABLE' to disable cancellation (cancellation
+-     requests are ignored).
+-
+-     If OLDSTATE is not `NULL', the previous cancellation state is
+-     stored in the location pointed to by OLDSTATE, and can thus be
+-     restored later by another call to `pthread_setcancelstate'.
+-
+-     If the STATE argument is not `PTHREAD_CANCEL_ENABLE' or
+-     `PTHREAD_CANCEL_DISABLE', `pthread_setcancelstate' fails and
+-     returns `EINVAL'.  Otherwise it returns 0.
+-
+- - Function: int pthread_setcanceltype (int TYPE, int *OLDTYPE)
+-     `pthread_setcanceltype' changes the type of responses to
+-     cancellation requests for the calling thread: asynchronous
+-     (immediate) or deferred.  The TYPE argument is the new
+-     cancellation type: either `PTHREAD_CANCEL_ASYNCHRONOUS' to cancel
+-     the calling thread as soon as the cancellation request is
+-     received, or `PTHREAD_CANCEL_DEFERRED' to keep the cancellation
+-     request pending until the next cancellation point. If OLDTYPE is
+-     not `NULL', the previous cancellation state is stored in the
+-     location pointed to by OLDTYPE, and can thus be restored later by
+-     another call to `pthread_setcanceltype'.
+-
+-     If the TYPE argument is not `PTHREAD_CANCEL_DEFERRED' or
+-     `PTHREAD_CANCEL_ASYNCHRONOUS', `pthread_setcanceltype' fails and
+-     returns `EINVAL'.  Otherwise it returns 0.
+-
+- - Function: void pthread_testcancel (VOID)
+-     `pthread_testcancel' does nothing except testing for pending
+-     cancellation and executing it. Its purpose is to introduce explicit
+-     checks for cancellation in long sequences of code that do not call
+-     cancellation point functions otherwise.
+-
+-
+-File: libc.info,  Node: Cleanup Handlers,  Next: Mutexes,  Prev: Cancellation,  Up: POSIX Threads
+-
+-Cleanup Handlers
+-================
+-
+-   Cleanup handlers are functions that get called when a thread
+-terminates, either by calling `pthread_exit' or because of
+-cancellation. Cleanup handlers are installed and removed following a
+-stack-like discipline.
+-
+-   The purpose of cleanup handlers is to free the resources that a
+-thread may hold at the time it terminates. In particular, if a thread
+-exits or is cancelled while it owns a locked mutex, the mutex will
+-remain locked forever and prevent other threads from executing
+-normally. The best way to avoid this is, just before locking the mutex,
+-to install a cleanup handler whose effect is to unlock the mutex.
+-Cleanup handlers can be used similarly to free blocks allocated with
+-`malloc' or close file descriptors on thread termination.
+-
+-   Here is how to lock a mutex MUT in such a way that it will be
+-unlocked if the thread is canceled while MUT is locked:
+-
+-     pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
+-     pthread_mutex_lock(&mut);
+-     /* do some work */
+-     pthread_mutex_unlock(&mut);
+-     pthread_cleanup_pop(0);
+-
+-   Equivalently, the last two lines can be replaced by
+-
+-     pthread_cleanup_pop(1);
+-
+-   Notice that the code above is safe only in deferred cancellation mode
+-(see `pthread_setcanceltype'). In asynchronous cancellation mode, a
+-cancellation can occur between `pthread_cleanup_push' and
+-`pthread_mutex_lock', or between `pthread_mutex_unlock' and
+-`pthread_cleanup_pop', resulting in both cases in the thread trying to
+-unlock a mutex not locked by the current thread. This is the main
+-reason why asynchronous cancellation is difficult to use.
+-
+-   If the code above must also work in asynchronous cancellation mode,
+-then it must switch to deferred mode for locking and unlocking the
+-mutex:
+-
+-     pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
+-     pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
+-     pthread_mutex_lock(&mut);
+-     /* do some work */
+-     pthread_cleanup_pop(1);
+-     pthread_setcanceltype(oldtype, NULL);
+-
+-   The code above can be rewritten in a more compact and efficient way,
+-using the non-portable functions `pthread_cleanup_push_defer_np' and
+-`pthread_cleanup_pop_restore_np':
+-
+-     pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut);
+-     pthread_mutex_lock(&mut);
+-     /* do some work */
+-     pthread_cleanup_pop_restore_np(1);
+-
+- - Function: void pthread_cleanup_push (void (*ROUTINE) (void *), void
+-          *ARG)
+-     `pthread_cleanup_push' installs the ROUTINE function with argument
+-     ARG as a cleanup handler. From this point on to the matching
+-     `pthread_cleanup_pop', the function ROUTINE will be called with
+-     arguments ARG when the thread terminates, either through
+-     `pthread_exit' or by cancellation. If several cleanup handlers are
+-     active at that point, they are called in LIFO order: the most
+-     recently installed handler is called first.
+-
+- - Function: void pthread_cleanup_pop (int EXECUTE)
+-     `pthread_cleanup_pop' removes the most recently installed cleanup
+-     handler. If the EXECUTE argument is not 0, it also executes the
+-     handler, by calling the ROUTINE function with arguments ARG. If
+-     the EXECUTE argument is 0, the handler is only removed but not
+-     executed.
+-
+-   Matching pairs of `pthread_cleanup_push' and `pthread_cleanup_pop'
+-must occur in the same function, at the same level of block nesting.
+-Actually, `pthread_cleanup_push' and `pthread_cleanup_pop' are macros,
+-and the expansion of `pthread_cleanup_push' introduces an open brace
+-`{' with the matching closing brace `}' being introduced by the
+-expansion of the matching `pthread_cleanup_pop'.
+-
+- - Function: void pthread_cleanup_push_defer_np (void (*ROUTINE) (void
+-          *), void *ARG)
+-     `pthread_cleanup_push_defer_np' is a non-portable extension that
+-     combines `pthread_cleanup_push' and `pthread_setcanceltype'.  It
+-     pushes a cleanup handler just as `pthread_cleanup_push' does, but
+-     also saves the current cancellation type and sets it to deferred
+-     cancellation. This ensures that the cleanup mechanism is effective
+-     even if the thread was initially in asynchronous cancellation mode.
+-
+- - Function: void pthread_cleanup_pop_restore_np (int EXECUTE)
+-     `pthread_cleanup_pop_restore_np' pops a cleanup handler introduced
+-     by `pthread_cleanup_push_defer_np', and restores the cancellation
+-     type to its value at the time `pthread_cleanup_push_defer_np' was
+-     called.
+-
+-   `pthread_cleanup_push_defer_np' and `pthread_cleanup_pop_restore_np'
+-must occur in matching pairs, at the same level of block nesting.
+-
+-   The sequence
+-
+-     pthread_cleanup_push_defer_np(routine, arg);
+-     ...
+-     pthread_cleanup_pop_defer_np(execute);
+-
+-is functionally equivalent to (but more compact and efficient than)
+-
+-     {
+-       int oldtype;
+-       pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
+-       pthread_cleanup_push(routine, arg);
+-       ...
+-       pthread_cleanup_pop(execute);
+-       pthread_setcanceltype(oldtype, NULL);
+-     }
+-
+-
+-File: libc.info,  Node: Mutexes,  Next: Condition Variables,  Prev: Cleanup Handlers,  Up: POSIX Threads
+-
+-Mutexes
+-=======
+-
+-   A mutex is a MUTual EXclusion device, and is useful for protecting
+-shared data structures from concurrent modifications, and implementing
+-critical sections and monitors.
+-
+-   A mutex has two possible states: unlocked (not owned by any thread),
+-and locked (owned by one thread). A mutex can never be owned by two
+-different threads simultaneously. A thread attempting to lock a mutex
+-that is already locked by another thread is suspended until the owning
+-thread unlocks the mutex first.
+-
+-   None of the mutex functions is a cancellation point, not even
+-`pthread_mutex_lock', in spite of the fact that it can suspend a thread
+-for arbitrary durations. This way, the status of mutexes at
+-cancellation points is predictable, allowing cancellation handlers to
+-unlock precisely those mutexes that need to be unlocked before the
+-thread stops executing. Consequently, threads using deferred
+-cancellation should never hold a mutex for extended periods of time.
+-
+-   It is not safe to call mutex functions from a signal handler.  In
+-particular, calling `pthread_mutex_lock' or `pthread_mutex_unlock' from
+-a signal handler may deadlock the calling thread.
+-
+- - Function: int pthread_mutex_init (pthread_mutex_t *MUTEX, const
+-          pthread_mutexattr_t *MUTEXATTR)
+-     `pthread_mutex_init' initializes the mutex object pointed to by
+-     MUTEX according to the mutex attributes specified in MUTEXATTR.
+-     If MUTEXATTR is `NULL', default attributes are used instead.
+-
+-     The LinuxThreads implementation supports only one mutex attribute,
+-     the MUTEX KIND, which is either "fast", "recursive", or "error
+-     checking". The kind of a mutex determines whether it can be locked
+-     again by a thread that already owns it.  The default kind is
+-     "fast".
+-
+-     Variables of type `pthread_mutex_t' can also be initialized
+-     statically, using the constants `PTHREAD_MUTEX_INITIALIZER' (for
+-     fast mutexes), `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' (for
+-     recursive mutexes), and `PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP'
+-     (for error checking mutexes).
+-
+-     `pthread_mutex_init' always returns 0.
+-
+- - Function: int pthread_mutex_lock (pthread_mutex_t *mutex))
+-     `pthread_mutex_lock' locks the given mutex. If the mutex is
+-     currently unlocked, it becomes locked and owned by the calling
+-     thread, and `pthread_mutex_lock' returns immediately. If the mutex
+-     is already locked by another thread, `pthread_mutex_lock' suspends
+-     the calling thread until the mutex is unlocked.
+-
+-     If the mutex is already locked by the calling thread, the behavior
+-     of `pthread_mutex_lock' depends on the kind of the mutex. If the
+-     mutex is of the "fast" kind, the calling thread is suspended.  It
+-     will remain suspended forever, because no other thread can unlock
+-     the mutex.  If  the mutex is of the "error checking" kind,
+-     `pthread_mutex_lock' returns immediately with the error code
+-     `EDEADLK'.  If the mutex is of the "recursive" kind,
+-     `pthread_mutex_lock' succeeds and returns immediately, recording
+-     the number of times the calling thread has locked the mutex. An
+-     equal number of `pthread_mutex_unlock' operations must be
+-     performed before the mutex returns to the unlocked state.
+-
+- - Function: int pthread_mutex_trylock (pthread_mutex_t *MUTEX)
+-     `pthread_mutex_trylock' behaves identically to
+-     `pthread_mutex_lock', except that it does not block the calling
+-     thread if the mutex is already locked by another thread (or by the
+-     calling thread in the case of a "fast" mutex). Instead,
+-     `pthread_mutex_trylock' returns immediately with the error code
+-     `EBUSY'.
+-
+- - Function: int pthread_mutex_unlock (pthread_mutex_t *MUTEX)
+-     `pthread_mutex_unlock' unlocks the given mutex. The mutex is
+-     assumed to be locked and owned by the calling thread on entrance to
+-     `pthread_mutex_unlock'. If the mutex is of the "fast" kind,
+-     `pthread_mutex_unlock' always returns it to the unlocked state. If
+-     it is of the "recursive" kind, it decrements the locking count of
+-     the mutex (number of `pthread_mutex_lock' operations performed on
+-     it by the calling thread), and only when this count reaches zero
+-     is the mutex actually unlocked.
+-
+-     On "error checking" mutexes, `pthread_mutex_unlock' actually
+-     checks at run-time that the mutex is locked on entrance, and that
+-     it was locked by the same thread that is now calling
+-     `pthread_mutex_unlock'.  If these conditions are not met,
+-     `pthread_mutex_unlock' returns `EPERM', and the mutex remains
+-     unchanged.  "Fast" and "recursive" mutexes perform no such checks,
+-     thus allowing a locked mutex to be unlocked by a thread other than
+-     its owner. This is non-portable behavior and must not be relied
+-     upon.
+-
+- - Function: int pthread_mutex_destroy (pthread_mutex_t *MUTEX)
+-     `pthread_mutex_destroy' destroys a mutex object, freeing the
+-     resources it might hold. The mutex must be unlocked on entrance.
+-     In the LinuxThreads implementation, no resources are associated
+-     with mutex objects, thus `pthread_mutex_destroy' actually does
+-     nothing except checking that the mutex is unlocked.
+-
+-     If the mutex is locked by some thread, `pthread_mutex_destroy'
+-     returns `EBUSY'.  Otherwise it returns 0.
+-
+-   If any of the above functions (except `pthread_mutex_init') is
+-applied to an uninitialized mutex, they will simply return `EINVAL' and
+-do nothing.
+-
+-   A shared global variable X can be protected by a mutex as follows:
+-
+-     int x;
+-     pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+-
+-   All accesses and modifications to X should be bracketed by calls to
+-`pthread_mutex_lock' and `pthread_mutex_unlock' as follows:
+-
+-     pthread_mutex_lock(&mut);
+-     /* operate on x */
+-     pthread_mutex_unlock(&mut);
+-
+-   Mutex attributes can be specified at mutex creation time, by passing
+-a mutex attribute object as second argument to `pthread_mutex_init'.
+-Passing `NULL' is equivalent to passing a mutex attribute object with
+-all attributes set to their default values.
+-
+- - Function: int pthread_mutexattr_init (pthread_mutexattr_t *ATTR)
+-     `pthread_mutexattr_init' initializes the mutex attribute object
+-     ATTR and fills it with default values for the attributes.
+-
+-     This function always returns 0.
+-
+- - Function: int pthread_mutexattr_destroy (pthread_mutexattr_t *ATTR)
+-     `pthread_mutexattr_destroy' destroys a mutex attribute object,
+-     which must not be reused until it is reinitialized.
+-     `pthread_mutexattr_destroy' does nothing in the LinuxThreads
+-     implementation.
+-
+-     This function always returns 0.
+-
+-   LinuxThreads supports only one mutex attribute: the mutex kind,
+-which is either `PTHREAD_MUTEX_FAST_NP' for "fast" mutexes,
+-`PTHREAD_MUTEX_RECURSIVE_NP' for "recursive" mutexes, or
+-`PTHREAD_MUTEX_ERRORCHECK_NP' for "error checking" mutexes.  As the
+-`NP' suffix indicates, this is a non-portable extension to the POSIX
+-standard and should not be employed in portable programs.
+-
+-   The mutex kind determines what happens if a thread attempts to lock a
+-mutex it already owns with `pthread_mutex_lock'. If the mutex is of the
+-"fast" kind, `pthread_mutex_lock' simply suspends the calling thread
+-forever.  If the mutex is of the "error checking" kind,
+-`pthread_mutex_lock' returns immediately with the error code `EDEADLK'.
+-If the mutex is of the "recursive" kind, the call to
+-`pthread_mutex_lock' returns immediately with a success return code.
+-The number of times the thread owning the mutex has locked it is
+-recorded in the mutex. The owning thread must call
+-`pthread_mutex_unlock' the same number of times before the mutex
+-returns to the unlocked state.
+-
+-   The default mutex kind is "fast", that is, `PTHREAD_MUTEX_FAST_NP'.
+-
+- - Function: int pthread_mutexattr_setkind_np (pthread_mutexattr_t
+-          *ATTR, int KIND)
+-     `pthread_mutexattr_setkind_np' sets the mutex kind attribute in
+-     ATTR to the value specified by KIND.
+-
+-     If KIND is not `PTHREAD_MUTEX_FAST_NP',
+-     `PTHREAD_MUTEX_RECURSIVE_NP', or `PTHREAD_MUTEX_ERRORCHECK_NP',
+-     this function will return `EINVAL' and leave ATTR unchanged.
+-
+- - Function: int pthread_mutexattr_getkind_np (const
+-          pthread_mutexattr_t *ATTR, int *KIND)
+-     `pthread_mutexattr_getkind_np' retrieves the current value of the
+-     mutex kind attribute in ATTR and stores it in the location pointed
+-     to by KIND.
+-
+-     This function always returns 0.
+-
+-
+-File: libc.info,  Node: Condition Variables,  Next: POSIX Semaphores,  Prev: Mutexes,  Up: POSIX Threads
+-
+-Condition Variables
+-===================
+-
+-   A condition (short for "condition variable") is a synchronization
+-device that allows threads to suspend execution until some predicate on
+-shared data is satisfied. The basic operations on conditions are: signal
+-the condition (when the predicate becomes true), and wait for the
+-condition, suspending the thread execution until another thread signals
+-the condition.
+-
+-   A condition variable must always be associated with a mutex, to avoid
+-the race condition where a thread prepares to wait on a condition
+-variable and another thread signals the condition just before the first
+-thread actually waits on it.
+-
+- - Function: int pthread_cond_init (pthread_cond_t *COND,
+-          pthread_condattr_t *cond_ATTR)
+-     `pthread_cond_init' initializes the condition variable COND, using
+-     the condition attributes specified in COND_ATTR, or default
+-     attributes if COND_ATTR is `NULL'. The LinuxThreads implementation
+-     supports no attributes for conditions, hence the COND_ATTR
+-     parameter is actually ignored.
+-
+-     Variables of type `pthread_cond_t' can also be initialized
+-     statically, using the constant `PTHREAD_COND_INITIALIZER'.
+-
+-     This function always returns 0.
+-
+- - Function: int pthread_cond_signal (pthread_cond_t *COND)
+-     `pthread_cond_signal' restarts one of the threads that are waiting
+-     on the condition variable COND. If no threads are waiting on COND,
+-     nothing happens. If several threads are waiting on COND, exactly
+-     one is restarted, but it is not specified which.
+-
+-     This function always returns 0.
+-
+- - Function: int pthread_cond_broadcast (pthread_cond_t *COND)
+-     `pthread_cond_broadcast' restarts all the threads that are waiting
+-     on the condition variable COND. Nothing happens if no threads are
+-     waiting on COND.
+-
+-     This function always returns 0.
+-
+- - Function: int pthread_cond_wait (pthread_cond_t *COND,
+-          pthread_mutex_t *MUTEX)
+-     `pthread_cond_wait' atomically unlocks the MUTEX (as per
+-     `pthread_unlock_mutex') and waits for the condition variable COND
+-     to be signaled. The thread execution is suspended and does not
+-     consume any CPU time until the condition variable is signaled. The
+-     MUTEX must be locked by the calling thread on entrance to
+-     `pthread_cond_wait'. Before returning to the calling thread,
+-     `pthread_cond_wait' re-acquires MUTEX (as per
+-     `pthread_lock_mutex').
+-
+-     Unlocking the mutex and suspending on the condition variable is
+-     done atomically. Thus, if all threads always acquire the mutex
+-     before signaling the condition, this guarantees that the condition
+-     cannot be signaled (and thus ignored) between the time a thread
+-     locks the mutex and the time it waits on the condition variable.
+-
+-     This function always returns 0.
+-
+- - Function: int pthread_cond_timedwait (pthread_cond_t *COND,
+-          pthread_mutex_t *MUTEX, const struct timespec *ABSTIME)
+-     `pthread_cond_timedwait' atomically unlocks MUTEX and waits on
+-     COND, as `pthread_cond_wait' does, but it also bounds the duration
+-     of the wait. If COND has not been signaled before time ABSTIME,
+-     the mutex MUTEX is re-acquired and `pthread_cond_timedwait'
+-     returns the error code `ETIMEDOUT'.  The wait can also be
+-     interrupted by a signal; in that case `pthread_cond_timedwait'
+-     returns `EINTR'.
+-
+-     The ABSTIME parameter specifies an absolute time, with the same
+-     origin as `time' and `gettimeofday': an ABSTIME of 0 corresponds
+-     to 00:00:00 GMT, January 1, 1970.
+-
+- - Function: int pthread_cond_destroy (pthread_cond_t *COND)
+-     `pthread_cond_destroy' destroys the condition variable COND,
+-     freeing the resources it might hold.  If any threads are waiting
+-     on the condition variable, `pthread_cond_destroy' leaves COND
+-     untouched and returns `EBUSY'.  Otherwise it returns 0, and COND
+-     must not be used again until it is reinitialized.
+-
+-     In the LinuxThreads implementation, no resources are associated
+-     with condition variables, so `pthread_cond_destroy' actually does
+-     nothing.
+-
+-   `pthread_cond_wait' and `pthread_cond_timedwait' are cancellation
+-points. If a thread is cancelled while suspended in one of these
+-functions, the thread immediately resumes execution, relocks the mutex
+-specified by  MUTEX, and finally executes the cancellation.
+-Consequently, cleanup handlers are assured that MUTEX is locked when
+-they are called.
+-
+-   It is not safe to call the condition variable functions from a signal
+-handler. In particular, calling `pthread_cond_signal' or
+-`pthread_cond_broadcast' from a signal handler may deadlock the calling
+-thread.
+-
+-   Consider two shared variables X and Y, protected by the mutex MUT,
+-and a condition variable COND that is to be signaled whenever X becomes
+-greater than Y.
+-
+-     int x,y;
+-     pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+-     pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+-
+-   Waiting until X is greater than Y is performed as follows:
+-
+-     pthread_mutex_lock(&mut);
+-     while (x <= y) {
+-             pthread_cond_wait(&cond, &mut);
+-     }
+-     /* operate on x and y */
+-     pthread_mutex_unlock(&mut);
+-
+-   Modifications on X and Y that may cause X to become greater than Y
+-should signal the condition if needed:
+-
+-     pthread_mutex_lock(&mut);
+-     /* modify x and y */
+-     if (x > y) pthread_cond_broadcast(&cond);
+-     pthread_mutex_unlock(&mut);
+-
+-   If it can be proved that at most one waiting thread needs to be waken
+-up (for instance, if there are only two threads communicating through X
+-and Y), `pthread_cond_signal' can be used as a slightly more efficient
+-alternative to `pthread_cond_broadcast'. In doubt, use
+-`pthread_cond_broadcast'.
+-
+-   To wait for X to becomes greater than Y with a timeout of 5 seconds,
+-do:
+-
+-     struct timeval now;
+-     struct timespec timeout;
+-     int retcode;
+-     
+-     pthread_mutex_lock(&mut);
+-     gettimeofday(&now);
+-     timeout.tv_sec = now.tv_sec + 5;
+-     timeout.tv_nsec = now.tv_usec * 1000;
+-     retcode = 0;
+-     while (x <= y && retcode != ETIMEDOUT) {
+-             retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
+-     }
+-     if (retcode == ETIMEDOUT) {
+-             /* timeout occurred */
+-     } else {
+-             /* operate on x and y */
+-     }
+-     pthread_mutex_unlock(&mut);
+-
+-   Condition attributes can be specified at condition creation time, by
+-passing a condition attribute object as second argument to
+-`pthread_cond_init'.  Passing `NULL' is equivalent to passing a
+-condition attribute object with all attributes set to their default
+-values.
+-
+-   The LinuxThreads implementation supports no attributes for
+-conditions. The functions on condition attributes are included only for
+-compliance with the POSIX standard.
+-
+- - Function: int pthread_condattr_init (pthread_condattr_t *ATTR)
+- - Function: int pthread_condattr_destroy (pthread_condattr_t *ATTR)
+-     `pthread_condattr_init' initializes the condition attribute object
+-     ATTR and fills it with default values for the attributes.
+-     `pthread_condattr_destroy' destroys the condition attribute object
+-     ATTR.
+-
+-     Both functions do nothing in the LinuxThreads implementation.
+-
+-     `pthread_condattr_init' and `pthread_condattr_destroy' always
+-     return 0.
+-
+-
+-File: libc.info,  Node: POSIX Semaphores,  Next: Thread-Specific Data,  Prev: Condition Variables,  Up: POSIX Threads
+-
+-POSIX Semaphores
+-================
+-
+-   Semaphores are counters for resources shared between threads. The
+-basic operations on semaphores are: increment the counter atomically,
+-and wait until the counter is non-null and decrement it atomically.
+-
+-   Semaphores have a maximum value past which they cannot be
+-incremented.  The macro `SEM_VALUE_MAX' is defined to be this maximum
+-value.  In the GNU C library, `SEM_VALUE_MAX' is equal to `INT_MAX'
+-(*note Range of Type::.), but it may be much smaller on other systems.
+-
+-   The pthreads library implements POSIX 1003.1b semaphores.  These
+-should not be confused with System V semaphores (`ipc', `semctl' and
+-`semop').
+-
+-   All the semaphore functions and macros are defined in `semaphore.h'.
+-
+- - Function: int sem_init (sem_t *SEM, int PSHARED, unsigned int VALUE)
+-     `sem_init' initializes the semaphore object pointed to by SEM. The
+-     count associated with the semaphore is set initially to VALUE. The
+-     PSHARED argument indicates whether the semaphore is local to the
+-     current process (PSHARED is zero) or is to be shared between
+-     several processes (PSHARED is not zero).
+-
+-     On success `sem_init' returns 0.  On failure it returns -1 and sets
+-     ERRNO to one of the following values:
+-
+-    `EINVAL'
+-          VALUE exceeds the maximal counter value `SEM_VALUE_MAX'
+-
+-    `ENOSYS'
+-          PSHARED is not zero.  LinuxThreads currently does not support
+-          process-shared semaphores.  (This will eventually change.)
+-
+- - Function: int sem_destroy (sem_t * SEM)
+-     `sem_destroy' destroys a semaphore object, freeing the resources it
+-     might hold.  If any threads are waiting on the semaphore when
+-     `sem_destroy' is called, it fails and sets ERRNO to `EBUSY'.
+-
+-     In the LinuxThreads implementation, no resources are associated
+-     with semaphore objects, thus `sem_destroy' actually does nothing
+-     except checking that no thread is waiting on the semaphore.  This
+-     will change when process-shared semaphores are implemented.
+-
+- - Function: int sem_wait (sem_t * SEM)
+-     `sem_wait' suspends the calling thread until the semaphore pointed
+-     to by SEM has non-zero count. It then atomically decreases the
+-     semaphore count.
+-
+-     `sem_wait' is a cancellation point.  It always returns 0.
+-
+- - Function: int sem_trywait (sem_t * SEM)
+-     `sem_trywait' is a non-blocking variant of `sem_wait'. If the
+-     semaphore pointed to by SEM has non-zero count, the count is
+-     atomically decreased and `sem_trywait' immediately returns 0.  If
+-     the semaphore count is zero, `sem_trywait' immediately returns -1
+-     and sets errno to `EAGAIN'.
+-
+- - Function: int sem_post (sem_t * SEM)
+-     `sem_post' atomically increases the count of the semaphore pointed
+-     to by SEM. This function never blocks.
+-
+-     On processors supporting atomic compare-and-swap (Intel 486,
+-     Pentium and later, Alpha, PowerPC, MIPS II, Motorola 68k,
+-     Ultrasparc), the `sem_post' function is can safely be called from
+-     signal handlers.  This is the only thread synchronization function
+-     provided by POSIX threads that is async-signal safe.  On the Intel
+-     386 and earlier Sparc chips, the current LinuxThreads
+-     implementation of `sem_post' is not async-signal safe, because the
+-     hardware does not support the required atomic operations.
+-
+-     `sem_post' always succeeds and returns 0, unless the semaphore
+-     count would exceed `SEM_VALUE_MAX' after being incremented.  In
+-     that case `sem_post' returns -1 and sets ERRNO to `EINVAL'.  The
+-     semaphore count is left unchanged.
+-
+- - Function: int sem_getvalue (sem_t * SEM, int * SVAL)
+-     `sem_getvalue' stores in the location pointed to by SVAL the
+-     current count of the semaphore SEM.  It always returns 0.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-43 glibc-2.1.3/manual/libc.info-43
+--- ../glibc-2.1.3/manual/libc.info-43	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-43	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1182 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Thread-Specific Data,  Next: Threads and Signal Handling,  Prev: POSIX Semaphores,  Up: POSIX Threads
+-
+-Thread-Specific Data
+-====================
+-
+-   Programs often need global or static variables that have different
+-values in different threads. Since threads share one memory space, this
+-cannot be achieved with regular variables. Thread-specific data is the
+-POSIX threads answer to this need.
+-
+-   Each thread possesses a private memory block, the thread-specific
+-data area, or TSD area for short. This area is indexed by TSD keys. The
+-TSD area associates values of type `void *' to TSD keys. TSD keys are
+-common to all threads, but the value associated with a given TSD key can
+-be different in each thread.
+-
+-   For concreteness, the TSD areas can be viewed as arrays of `void *'
+-pointers, TSD keys as integer indices into these arrays, and the value
+-of a TSD key as the value of the corresponding array element in the
+-calling thread.
+-
+-   When a thread is created, its TSD area initially associates `NULL'
+-with all keys.
+-
+- - Function: int pthread_key_create (pthread_key_t *KEY, void
+-          (*destr_function) (void *))
+-     `pthread_key_create' allocates a new TSD key. The key is stored in
+-     the location pointed to by KEY. There is a limit of
+-     `PTHREAD_KEYS_MAX' on the number of keys allocated at a given
+-     time. The value initially associated with the returned key is
+-     `NULL' in all currently executing threads.
+-
+-     The DESTR_FUNCTION argument, if not `NULL', specifies a destructor
+-     function associated with the key. When a thread terminates via
+-     `pthread_exit' or by cancellation, DESTR_FUNCTION is called on the
+-     value associated with the key in that thread. The DESTR_FUNCTION
+-     is not called if a key is deleted with `pthread_key_delete' or a
+-     value is changed with `pthread_setspecific'.  The order in which
+-     destructor functions are called at thread termination time is
+-     unspecified.
+-
+-     Before the destructor function is called, the `NULL' value is
+-     associated with the key in the current thread.  A destructor
+-     function might, however, re-associate non-`NULL' values to that
+-     key or some other key.  To deal with this, if after all the
+-     destructors have been called for all non-`NULL' values, there are
+-     still some non-`NULL' values with associated destructors, then the
+-     process is repeated.  The LinuxThreads implementation stops the
+-     process after `PTHREAD_DESTRUCTOR_ITERATIONS' iterations, even if
+-     some non-`NULL' values with associated descriptors remain.  Other
+-     implementations may loop indefinitely.
+-
+-     `pthread_key_create' returns 0 unless `PTHREAD_KEYS_MAX' keys have
+-     already been allocated, in which case it fails and returns
+-     `EAGAIN'.
+-
+- - Function: int pthread_key_delete (pthread_key_t KEY)
+-     `pthread_key_delete' deallocates a TSD key. It does not check
+-     whether non-`NULL' values are associated with that key in the
+-     currently executing threads, nor call the destructor function
+-     associated with the key.
+-
+-     If there is no such key KEY, it returns `EINVAL'.  Otherwise it
+-     returns 0.
+-
+- - Function: int pthread_setspecific (pthread_key_t KEY, const void
+-          *POINTER)
+-     `pthread_setspecific' changes the value associated with KEY in the
+-     calling thread, storing the given POINTER instead.
+-
+-     If there is no such key KEY, it returns `EINVAL'.  Otherwise it
+-     returns 0.
+-
+- - Function: void * pthread_getspecific (pthread_key_t KEY)
+-     `pthread_getspecific' returns the value currently associated with
+-     KEY in the calling thread.
+-
+-     If there is no such key KEY, it returns `NULL'.
+-
+-   The following code fragment allocates a thread-specific array of 100
+-characters, with automatic reclaimation at thread exit:
+-
+-     /* Key for the thread-specific buffer */
+-     static pthread_key_t buffer_key;
+-     
+-     /* Once-only initialisation of the key */
+-     static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;
+-     
+-     /* Allocate the thread-specific buffer */
+-     void buffer_alloc(void)
+-     {
+-       pthread_once(&buffer_key_once, buffer_key_alloc);
+-       pthread_setspecific(buffer_key, malloc(100));
+-     }
+-     
+-     /* Return the thread-specific buffer */
+-     char * get_buffer(void)
+-     {
+-       return (char *) pthread_getspecific(buffer_key);
+-     }
+-     
+-     /* Allocate the key */
+-     static void buffer_key_alloc()
+-     {
+-       pthread_key_create(&buffer_key, buffer_destroy);
+-     }
+-     
+-     /* Free the thread-specific buffer */
+-     static void buffer_destroy(void * buf)
+-     {
+-       free(buf);
+-     }
+-
+-
+-File: libc.info,  Node: Threads and Signal Handling,  Next: Miscellaneous Thread Functions,  Prev: Thread-Specific Data,  Up: POSIX Threads
+-
+-Threads and Signal Handling
+-===========================
+-
+- - Function: int pthread_sigmask (int HOW, const sigset_t *NEWMASK,
+-          sigset_t *OLDMASK)
+-     `pthread_sigmask' changes the signal mask for the calling thread as
+-     described by the HOW and NEWMASK arguments. If OLDMASK is not
+-     `NULL', the previous signal mask is stored in the location pointed
+-     to by OLDMASK.
+-
+-     The meaning of the HOW and NEWMASK arguments is the same as for
+-     `sigprocmask'. If HOW is `SIG_SETMASK', the signal mask is set to
+-     NEWMASK. If HOW is `SIG_BLOCK', the signals specified to NEWMASK
+-     are added to the current signal mask.  If HOW is `SIG_UNBLOCK',
+-     the signals specified to NEWMASK are removed from the current
+-     signal mask.
+-
+-     Recall that signal masks are set on a per-thread basis, but signal
+-     actions and signal handlers, as set with `sigaction', are shared
+-     between all threads.
+-
+-     The `pthread_sigmask' function returns 0 on success, and one of the
+-     following error codes on error:
+-    `EINVAL'
+-          HOW is not one of `SIG_SETMASK', `SIG_BLOCK', or `SIG_UNBLOCK'
+-
+-    `EFAULT'
+-          NEWMASK or OLDMASK point to invalid addresses
+-
+- - Function: int pthread_kill (pthread_t THREAD, int SIGNO)
+-     `pthread_kill' sends signal number SIGNO to the thread THREAD.
+-     The signal is delivered and handled as described in *Note Signal
+-     Handling::.
+-
+-     `pthread_kill' returns 0 on success, one of the following error
+-     codes on error:
+-    `EINVAL'
+-          SIGNO is not a valid signal number
+-
+-    `ESRCH'
+-          The thread THREAD does not exist (e.g. it has already
+-          terminated)
+-
+- - Function: int sigwait (const sigset_t *SET, int *SIG)
+-     `sigwait' suspends the calling thread until one of the signals in
+-     SET is delivered to the calling thread. It then stores the number
+-     of the signal received in the location pointed to by SIG and
+-     returns. The signals in SET must be blocked and not ignored on
+-     entrance to `sigwait'. If the delivered signal has a signal handler
+-     function attached, that function is *not* called.
+-
+-     `sigwait' is a cancellation point.  It always returns 0.
+-
+-   For `sigwait' to work reliably, the signals being waited for must be
+-blocked in all threads, not only in the calling thread, since otherwise
+-the POSIX semantics for signal delivery do not guarantee that it's the
+-thread doing the `sigwait' that will receive the signal.  The best way
+-to achieve this is block those signals before any threads are created,
+-and never unblock them in the program other than by calling `sigwait'.
+-
+-   Signal handling in LinuxThreads departs significantly from the POSIX
+-standard. According to the standard, "asynchronous" (external) signals
+-are addressed to the whole process (the collection of all threads),
+-which then delivers them to one particular thread. The thread that
+-actually receives the signal is any thread that does not currently block
+-the signal.
+-
+-   In LinuxThreads, each thread is actually a kernel process with its
+-own PID, so external signals are always directed to one particular
+-thread.  If, for instance, another thread is blocked in `sigwait' on
+-that signal, it will not be restarted.
+-
+-   The LinuxThreads implementation of `sigwait' installs dummy signal
+-handlers for the signals in SET for the duration of the wait. Since
+-signal handlers are shared between all threads, other threads must not
+-attach their own signal handlers to these signals, or alternatively
+-they should all block these signals (which is recommended anyway).
+-
+-
+-File: libc.info,  Node: Miscellaneous Thread Functions,  Prev: Threads and Signal Handling,  Up: POSIX Threads
+-
+-Miscellaneous Thread Functions
+-==============================
+-
+- - Function: pthread_t pthread_self (VOID)
+-     `pthread_self' returns the thread identifier for the calling
+-     thread.
+-
+- - Function: int pthread_equal (pthread_t thread1, pthread_t thread2)
+-     `pthread_equal' determines if two thread identifiers refer to the
+-     same thread.
+-
+-     A non-zero value is returned if THREAD1 and THREAD2 refer to the
+-     same thread. Otherwise, 0 is returned.
+-
+- - Function: int pthread_detach (pthread_t TH)
+-     `pthread_detach' puts the thread TH in the detached state. This
+-     guarantees that the memory resources consumed by TH will be freed
+-     immediately when TH terminates. However, this prevents other
+-     threads from synchronizing on the termination of TH using
+-     `pthread_join'.
+-
+-     A thread can be created initially in the detached state, using the
+-     `detachstate' attribute to `pthread_create'. In contrast,
+-     `pthread_detach' applies to threads created in the joinable state,
+-     and which need to be put in the detached state later.
+-
+-     After `pthread_detach' completes, subsequent attempts to perform
+-     `pthread_join' on TH will fail. If another thread is already
+-     joining the thread TH at the time `pthread_detach' is called,
+-     `pthread_detach' does nothing and leaves TH in the joinable state.
+-
+-     On success, 0 is returned. On error, one of the following codes is
+-     returned:
+-    `ESRCH'
+-          No thread could be found corresponding to that specified by TH
+-
+-    `EINVAL'
+-          The thread TH is already in the detached state
+-
+- - Function: int pthread_atfork (void (*PREPARE)(void), void
+-          (*PARENT)(void), void (*CHILD)(void))
+-     `pthread_atfork' registers handler functions to be called just
+-     before and just after a new process is created with `fork'. The
+-     PREPARE handler will be called from the parent process, just
+-     before the new process is created. The PARENT handler will be
+-     called from the parent process, just before `fork' returns. The
+-     CHILD handler will be called from the child process, just before
+-     `fork' returns.
+-
+-     `pthread_atfork' returns 0 on success and a non-zero error code on
+-     error.
+-
+-     One or more of the three handlers PREPARE, PARENT and CHILD can be
+-     given as `NULL', meaning that no handler needs to be called at the
+-     corresponding point.
+-
+-     `pthread_atfork' can be called several times to install several
+-     sets of handlers. At `fork' time, the PREPARE handlers are called
+-     in LIFO order (last added with `pthread_atfork', first called
+-     before `fork'), while the PARENT and CHILD handlers are called in
+-     FIFO order (first added, first called).
+-
+-     If there is insufficient memory available to register the handlers,
+-     `pthread_atfork' fails and returns `ENOMEM'.  Otherwise it returns
+-     0.
+-
+-   To understand the purpose of `pthread_atfork', recall that `fork'
+-duplicates the whole memory space, including mutexes in their current
+-locking state, but only the calling thread: other threads are not
+-running in the child process. Thus, if a mutex is locked by a thread
+-other than the thread calling `fork', that mutex will remain locked
+-forever in the child process, possibly blocking the execution of the
+-child process. To avoid this, install handlers with `pthread_atfork' as
+-follows: the PREPARE handler locks the global mutexes (in locking
+-order), and the PARENT and CHILD handlers unlock them (in reverse
+-order). Alternatively, PREPARE and PARENT can be set to `NULL' and
+-CHILD to a function that calls `pthread_mutex_init' on the global
+-mutexes.
+-
+- - Function: void pthread_kill_other_threads_np (VOID)
+-     `pthread_kill_other_threads_np' is a non-portable LinuxThreads
+-     extension.  It causes all threads in the program to terminate
+-     immediately, except the calling thread which proceeds normally. It
+-     is intended to be called just before a thread calls one of the
+-     `exec' functions, e.g. `execve'.
+-
+-     Termination of the other threads is not performed through
+-     `pthread_cancel' and completely bypasses the cancellation
+-     mechanism. Hence, the current settings for cancellation state and
+-     cancellation type are ignored, and the cleanup handlers are not
+-     executed in the terminated threads.
+-
+-     According to POSIX 1003.1c, a successful `exec*' in one of the
+-     threads should automatically terminate all other threads in the
+-     program.  This behavior is not yet implemented in LinuxThreads.
+-     Calling `pthread_kill_other_threads_np' before `exec*' achieves
+-     much of the same behavior, except that if `exec*' ultimately
+-     fails, then all other threads are already killed.
+-
+- - Function: int pthread_once (pthread_once_t *once_CONTROL, void
+-          (*INIT_ROUTINE) (void))
+-     The purpose of `pthread_once' is to ensure that a piece of
+-     initialization code is executed at most once. The ONCE_CONTROL
+-     argument points to a static or extern variable statically
+-     initialized to `PTHREAD_ONCE_INIT'.
+-
+-     The first time `pthread_once' is called with a given ONCE_CONTROL
+-     argument, it calls INIT_ROUTINE with no argument and changes the
+-     value of the ONCE_CONTROL variable to record that initialization
+-     has been performed. Subsequent calls to `pthread_once' with the
+-     same `once_control' argument do nothing.
+-
+-     `pthread_once' always returns 0.
+-
+- - Function: int pthread_setschedparam (pthread_t target_THREAD, int
+-          POLICY, const struct sched_param *PARAM)
+-     `pthread_setschedparam' sets the scheduling parameters for the
+-     thread TARGET_THREAD as indicated by POLICY and PARAM. POLICY can
+-     be either `SCHED_OTHER' (regular, non-realtime scheduling),
+-     `SCHED_RR' (realtime, round-robin) or `SCHED_FIFO' (realtime,
+-     first-in first-out). PARAM specifies the scheduling priority for
+-     the two realtime policies.  See `sched_setpolicy' for more
+-     information on scheduling policies.
+-
+-     The realtime scheduling policies `SCHED_RR' and `SCHED_FIFO' are
+-     available only to processes with superuser privileges.
+-
+-     On success, `pthread_setschedparam' returns 0.  On error it returns
+-     one of the following codes:
+-    `EINVAL'
+-          POLICY is not one of `SCHED_OTHER', `SCHED_RR', `SCHED_FIFO',
+-          or the priority value specified by PARAM is not valid for the
+-          specified policy
+-
+-    `EPERM'
+-          Realtime scheduling was requested but the calling process
+-          does not have sufficient privileges.
+-
+-    `ESRCH'
+-          The TARGET_THREAD is invalid or has already terminated
+-
+-    `EFAULT'
+-          PARAM points outside the process memory space
+-
+- - Function: int pthread_getschedparam (pthread_t target_THREAD, int
+-          *POLICY, struct sched_param *PARAM)
+-     `pthread_getschedparam' retrieves the scheduling policy and
+-     scheduling parameters for the thread TARGET_THREAD and stores them
+-     in the locations pointed to by POLICY and PARAM, respectively.
+-
+-     `pthread_getschedparam' returns 0 on success, or one of the
+-     following error codes on failure:
+-    `ESRCH'
+-          The TARGET_THREAD is invalid or has already terminated.
+-
+-    `EFAULT'
+-          POLICY or PARAM point outside the process memory space.
+-
+-
+-
+-File: libc.info,  Node: Language Features,  Next: Library Summary,  Prev: POSIX Threads,  Up: Top
+-
+-C Language Facilities in the Library
+-************************************
+-
+-   Some of the facilities implemented by the C library really should be
+-thought of as parts of the C language itself.  These facilities ought to
+-be documented in the C Language Manual, not in the library manual; but
+-since we don't have the language manual yet, and documentation for these
+-features has been written, we are publishing it here.
+-
+-* Menu:
+-
+-* Consistency Checking::        Using `assert' to abort if
+-				 something "impossible" happens.
+-* Variadic Functions::          Defining functions with varying numbers
+-                                 of args.
+-* Null Pointer Constant::       The macro `NULL'.
+-* Important Data Types::        Data types for object sizes.
+-* Data Type Measurements::      Parameters of data type representations.
+-
+-
+-File: libc.info,  Node: Consistency Checking,  Next: Variadic Functions,  Up: Language Features
+-
+-Explicitly Checking Internal Consistency
+-========================================
+-
+-   When you're writing a program, it's often a good idea to put in
+-checks at strategic places for "impossible" errors or violations of
+-basic assumptions.  These kinds of checks are helpful in debugging
+-problems with the interfaces between different parts of the program,
+-for example.
+-
+-   The `assert' macro, defined in the header file `assert.h', provides
+-a convenient way to abort the program while printing a message about
+-where in the program the error was detected.
+-
+-   Once you think your program is debugged, you can disable the error
+-checks performed by the `assert' macro by recompiling with the macro
+-`NDEBUG' defined.  This means you don't actually have to change the
+-program source code to disable these checks.
+-
+-   But disabling these consistency checks is undesirable unless they
+-make the program significantly slower.  All else being equal, more error
+-checking is good no matter who is running the program.  A wise user
+-would rather have a program crash, visibly, than have it return nonsense
+-without indicating anything might be wrong.
+-
+- - Macro: void assert (int EXPRESSION)
+-     Verify the programmer's belief that EXPRESSION should be nonzero
+-     at this point in the program.
+-
+-     If `NDEBUG' is not defined, `assert' tests the value of
+-     EXPRESSION.  If it is false (zero), `assert' aborts the program
+-     (*note Aborting a Program::.) after printing a message of the form:
+-
+-          `FILE':LINENUM: FUNCTION: Assertion `EXPRESSION' failed.
+-
+-     on the standard error stream `stderr' (*note Standard Streams::.).
+-     The filename and line number are taken from the C preprocessor
+-     macros `__FILE__' and `__LINE__' and specify where the call to
+-     `assert' was written.  When using the GNU C compiler, the name of
+-     the function which calls `assert' is taken from the built-in
+-     variable `__PRETTY_FUNCTION__'; with older compilers, the function
+-     name and following colon are omitted.
+-
+-     If the preprocessor macro `NDEBUG' is defined before `assert.h' is
+-     included, the `assert' macro is defined to do absolutely nothing.
+-
+-     *Warning:* Even the argument expression EXPRESSION is not
+-     evaluated if `NDEBUG' is in effect.  So never use `assert' with
+-     arguments that involve side effects.  For example, `assert (++i >
+-     0);' is a bad idea, because `i' will not be incremented if
+-     `NDEBUG' is defined.
+-
+-   Sometimes the "impossible" condition you want to check for is an
+-error return from an operating system function.  Then it is useful to
+-display not only where the program crashes, but also what error was
+-returned.  The `assert_perror' macro makes this easy.
+-
+- - Macro: void assert_perror (int ERRNUM)
+-     Similar to `assert', but verifies that ERRNUM is zero.
+-
+-     If `NDEBUG' is defined, `assert_perror' tests the value of ERRNUM.
+-     If it is nonzero, `assert_perror' aborts the program after a
+-     printing a message of the form:
+-
+-          `FILE':LINENUM: FUNCTION: ERROR TEXT
+-
+-     on the standard error stream.  The file name, line number, and
+-     function name are as for `assert'.  The error text is the result of
+-     `strerror (ERRNUM)'.  *Note Error Messages::.
+-
+-     Like `assert', if `NDEBUG' is defined before `assert.h' is
+-     included, the `assert_perror' macro does absolutely nothing.  It
+-     does not evaluate the argument, so ERRNUM should not have any side
+-     effects.  It is best for ERRNUM to be a just simple variable
+-     reference; often it will be `errno'.
+-
+-     This macro is a GNU extension.
+-
+-   *Usage note:* The `assert' facility is designed for detecting
+-*internal inconsistency*; it is not suitable for reporting invalid
+-input or improper usage by *the user* of the program.
+-
+-   The information in the diagnostic messages printed by the `assert'
+-macro is intended to help you, the programmer, track down the cause of a
+-bug, but is not really useful for telling a user of your program why his
+-or her input was invalid or why a command could not be carried out.  So
+-you can't use `assert' or `assert_perror' to print the error messages
+-for these eventualities.
+-
+-   What's more, your program should not abort when given invalid input,
+-as `assert' would do--it should exit with nonzero status (*note Exit
+-Status::.) after printing its error messages, or perhaps read another
+-command or move on to the next input file.
+-
+-   *Note Error Messages::, for information on printing error messages
+-for problems that *do not* represent bugs in the program.
+-
+-
+-File: libc.info,  Node: Variadic Functions,  Next: Null Pointer Constant,  Prev: Consistency Checking,  Up: Language Features
+-
+-Variadic Functions
+-==================
+-
+-   ISO C defines a syntax for declaring a function to take a variable
+-number or type of arguments.  (Such functions are referred to as
+-"varargs functions" or "variadic functions".)  However, the language
+-itself provides no mechanism for such functions to access their
+-non-required arguments; instead, you use the variable arguments macros
+-defined in `stdarg.h'.
+-
+-   This section describes how to declare variadic functions, how to
+-write them, and how to call them properly.
+-
+-   *Compatibility Note:* Many older C dialects provide a similar, but
+-incompatible, mechanism for defining functions with variable numbers of
+-arguments, using `varargs.h'.
+-
+-* Menu:
+-
+-* Why Variadic::                Reasons for making functions take
+-                                 variable arguments.
+-* How Variadic::                How to define and call variadic functions.
+-* Variadic Example::            A complete example.
+-
+-
+-File: libc.info,  Node: Why Variadic,  Next: How Variadic,  Up: Variadic Functions
+-
+-Why Variadic Functions are Used
+--------------------------------
+-
+-   Ordinary C functions take a fixed number of arguments.  When you
+-define a function, you specify the data type for each argument.  Every
+-call to the function should supply the expected number of arguments,
+-with types that can be converted to the specified ones.  Thus, if the
+-function `foo' is declared with `int foo (int, char *);' then you must
+-call it with two arguments, a number (any kind will do) and a string
+-pointer.
+-
+-   But some functions perform operations that can meaningfully accept an
+-unlimited number of arguments.
+-
+-   In some cases a function can handle any number of values by
+-operating on all of them as a block.  For example, consider a function
+-that allocates a one-dimensional array with `malloc' to hold a
+-specified set of values.  This operation makes sense for any number of
+-values, as long as the length of the array corresponds to that number.
+-Without facilities for variable arguments, you would have to define a
+-separate function for each possible array size.
+-
+-   The library function `printf' (*note Formatted Output::.) is an
+-example of another class of function where variable arguments are
+-useful.  This function prints its arguments (which can vary in type as
+-well as number) under the control of a format template string.
+-
+-   These are good reasons to define a "variadic" function which can
+-handle as many arguments as the caller chooses to pass.
+-
+-   Some functions such as `open' take a fixed set of arguments, but
+-occasionally ignore the last few.  Strict adherence to ISO C requires
+-these functions to be defined as variadic; in practice, however, the GNU
+-C compiler and most other C compilers let you define such a function to
+-take a fixed set of arguments--the most it can ever use--and then only
+-*declare* the function as variadic (or not declare its arguments at
+-all!).
+-
+-
+-File: libc.info,  Node: How Variadic,  Next: Variadic Example,  Prev: Why Variadic,  Up: Variadic Functions
+-
+-How Variadic Functions are Defined and Used
+--------------------------------------------
+-
+-   Defining and using a variadic function involves three steps:
+-
+-   * *Define* the function as variadic, using an ellipsis (`...') in
+-     the argument list, and using special macros to access the variable
+-     arguments.  *Note Receiving Arguments::.
+-
+-   * *Declare* the function as variadic, using a prototype with an
+-     ellipsis (`...'), in all the files which call it.  *Note Variadic
+-     Prototypes::.
+-
+-   * *Call* the function by writing the fixed arguments followed by the
+-     additional variable arguments.  *Note Calling Variadics::.
+-
+-* Menu:
+-
+-* Variadic Prototypes::  How to make a prototype for a function
+-			  with variable arguments.
+-* Receiving Arguments::  Steps you must follow to access the
+-			  optional argument values.
+-* How Many Arguments::   How to decide whether there are more arguments.
+-* Calling Variadics::    Things you need to know about calling
+-			  variable arguments functions.
+-* Argument Macros::      Detailed specification of the macros
+-        		  for accessing variable arguments.
+-* Old Varargs::		 The pre-ISO way of defining variadic functions.
+-
+-
+-File: libc.info,  Node: Variadic Prototypes,  Next: Receiving Arguments,  Up: How Variadic
+-
+-Syntax for Variable Arguments
+-.............................
+-
+-   A function that accepts a variable number of arguments must be
+-declared with a prototype that says so.   You write the fixed arguments
+-as usual, and then tack on `...' to indicate the possibility of
+-additional arguments.  The syntax of ISO C requires at least one fixed
+-argument before the `...'.  For example,
+-
+-     int
+-     func (const char *a, int b, ...)
+-     {
+-       ...
+-     }
+-
+-outlines a definition of a function `func' which returns an `int' and
+-takes two required arguments, a `const char *' and an `int'.  These are
+-followed by any number of anonymous arguments.
+-
+-   *Portability note:* For some C compilers, the last required argument
+-must not be declared `register' in the function definition.
+-Furthermore, this argument's type must be "self-promoting": that is,
+-the default promotions must not change its type.  This rules out array
+-and function types, as well as `float', `char' (whether signed or not)
+-and `short int' (whether signed or not).  This is actually an ISO C
+-requirement.
+-
+-
+-File: libc.info,  Node: Receiving Arguments,  Next: How Many Arguments,  Prev: Variadic Prototypes,  Up: How Variadic
+-
+-Receiving the Argument Values
+-.............................
+-
+-   Ordinary fixed arguments have individual names, and you can use these
+-names to access their values.  But optional arguments have no
+-names--nothing but `...'.  How can you access them?
+-
+-   The only way to access them is sequentially, in the order they were
+-written, and you must use special macros from `stdarg.h' in the
+-following three step process:
+-
+-  1. You initialize an argument pointer variable of type `va_list' using
+-     `va_start'.  The argument pointer when initialized points to the
+-     first optional argument.
+-
+-  2. You access the optional arguments by successive calls to `va_arg'.
+-     The first call to `va_arg' gives you the first optional argument,
+-     the next call gives you the second, and so on.
+-
+-     You can stop at any time if you wish to ignore any remaining
+-     optional arguments.  It is perfectly all right for a function to
+-     access fewer arguments than were supplied in the call, but you
+-     will get garbage values if you try to access too many arguments.
+-
+-  3. You indicate that you are finished with the argument pointer
+-     variable by calling `va_end'.
+-
+-     (In practice, with most C compilers, calling `va_end' does nothing
+-     and you do not really need to call it.  This is always true in the
+-     GNU C compiler.  But you might as well call `va_end' just in case
+-     your program is someday compiled with a peculiar compiler.)
+-
+-   *Note Argument Macros::, for the full definitions of `va_start',
+-`va_arg' and `va_end'.
+-
+-   Steps 1 and 3 must be performed in the function that accepts the
+-optional arguments.  However, you can pass the `va_list' variable as an
+-argument to another function and perform all or part of step 2 there.
+-
+-   You can perform the entire sequence of the three steps multiple times
+-within a single function invocation.  If you want to ignore the optional
+-arguments, you can do these steps zero times.
+-
+-   You can have more than one argument pointer variable if you like.
+-You can initialize each variable with `va_start' when you wish, and
+-then you can fetch arguments with each argument pointer as you wish.
+-Each argument pointer variable will sequence through the same set of
+-argument values, but at its own pace.
+-
+-   *Portability note:* With some compilers, once you pass an argument
+-pointer value to a subroutine, you must not keep using the same
+-argument pointer value after that subroutine returns.  For full
+-portability, you should just pass it to `va_end'.  This is actually an
+-ISO C requirement, but most ANSI C compilers work happily regardless.
+-
+-
+-File: libc.info,  Node: How Many Arguments,  Next: Calling Variadics,  Prev: Receiving Arguments,  Up: How Variadic
+-
+-How Many Arguments Were Supplied
+-................................
+-
+-   There is no general way for a function to determine the number and
+-type of the optional arguments it was called with.  So whoever designs
+-the function typically designs a convention for the caller to tell it
+-how many arguments it has, and what kind.  It is up to you to define an
+-appropriate calling convention for each variadic function, and write all
+-calls accordingly.
+-
+-   One kind of calling convention is to pass the number of optional
+-arguments as one of the fixed arguments.  This convention works provided
+-all of the optional arguments are of the same type.
+-
+-   A similar alternative is to have one of the required arguments be a
+-bit mask, with a bit for each possible purpose for which an optional
+-argument might be supplied.  You would test the bits in a predefined
+-sequence; if the bit is set, fetch the value of the next argument,
+-otherwise use a default value.
+-
+-   A required argument can be used as a pattern to specify both the
+-number and types of the optional arguments.  The format string argument
+-to `printf' is one example of this (*note Formatted Output
+-Functions::.).
+-
+-   Another possibility is to pass an "end marker" value as the last
+-optional argument.  For example, for a function that manipulates an
+-arbitrary number of pointer arguments, a null pointer might indicate the
+-end of the argument list.  (This assumes that a null pointer isn't
+-otherwise meaningful to the function.)  The `execl' function works in
+-just this way; see *Note Executing a File::.
+-
+-
+-File: libc.info,  Node: Calling Variadics,  Next: Argument Macros,  Prev: How Many Arguments,  Up: How Variadic
+-
+-Calling Variadic Functions
+-..........................
+-
+-   You don't have to write anything special when you call a variadic
+-function.  Just write the arguments (required arguments, followed by
+-optional ones) inside parentheses, separated by commas, as usual.  But
+-you should prepare by declaring the function with a prototype, and you
+-must know how the argument values are converted.
+-
+-   In principle, functions that are *defined* to be variadic must also
+-be *declared* to be variadic using a function prototype whenever you
+-call them.  (*Note Variadic Prototypes::, for how.)  This is because
+-some C compilers use a different calling convention to pass the same set
+-of argument values to a function depending on whether that function
+-takes variable arguments or fixed arguments.
+-
+-   In practice, the GNU C compiler always passes a given set of argument
+-types in the same way regardless of whether they are optional or
+-required.  So, as long as the argument types are self-promoting, you can
+-safely omit declaring them.  Usually it is a good idea to declare the
+-argument types for variadic functions, and indeed for all functions.
+-But there are a few functions which it is extremely convenient not to
+-have to declare as variadic--for example, `open' and `printf'.
+-
+-   Since the prototype doesn't specify types for optional arguments, in
+-a call to a variadic function the "default argument promotions" are
+-performed on the optional argument values.  This means the objects of
+-type `char' or `short int' (whether signed or not) are promoted to
+-either `int' or `unsigned int', as appropriate; and that objects of
+-type `float' are promoted to type `double'.  So, if the caller passes a
+-`char' as an optional argument, it is promoted to an `int', and the
+-function should get it with `va_arg (AP, int)'.
+-
+-   Conversion of the required arguments is controlled by the function
+-prototype in the usual way: the argument expression is converted to the
+-declared argument type as if it were being assigned to a variable of
+-that type.
+-
+-
+-File: libc.info,  Node: Argument Macros,  Next: Old Varargs,  Prev: Calling Variadics,  Up: How Variadic
+-
+-Argument Access Macros
+-......................
+-
+-   Here are descriptions of the macros used to retrieve variable
+-arguments.  These macros are defined in the header file `stdarg.h'.
+-
+- - Data Type: va_list
+-     The type `va_list' is used for argument pointer variables.
+-
+- - Macro: void va_start (va_list AP, LAST-REQUIRED)
+-     This macro initializes the argument pointer variable AP to point
+-     to the first of the optional arguments of the current function;
+-     LAST-REQUIRED must be the last required argument to the function.
+-
+-     *Note Old Varargs::, for an alternate definition of `va_start'
+-     found in the header file `varargs.h'.
+-
+- - Macro: TYPE va_arg (va_list AP, TYPE)
+-     The `va_arg' macro returns the value of the next optional argument,
+-     and modifies the value of AP to point to the subsequent argument.
+-     Thus, successive uses of `va_arg' return successive optional
+-     arguments.
+-
+-     The type of the value returned by `va_arg' is TYPE as specified in
+-     the call.  TYPE must be a self-promoting type (not `char' or
+-     `short int' or `float') that matches the type of the actual
+-     argument.
+-
+- - Macro: void va_end (va_list AP)
+-     This ends the use of AP.  After a `va_end' call, further `va_arg'
+-     calls with the same AP may not work.  You should invoke `va_end'
+-     before returning from the function in which `va_start' was invoked
+-     with the same AP argument.
+-
+-     In the GNU C library, `va_end' does nothing, and you need not ever
+-     use it except for reasons of portability.
+-
+-
+-   Sometimes it is necessary to parse the list of parameters more than
+-once or one wants to remember a certain position in the parameter list.
+-To do this one will have to make a copy of the current value of the
+-argument.  But `va_list' is an opaque type and it is not guaranteed
+-that one can simply assign the value of a variable to another one of
+-type `va_list'
+-
+- - Macro: void __va_copy (va_list DEST, va_list SRC)
+-     The `__va_copy' macro allows copying of objects of type `va_list'
+-     even if this is no integral type.  The argument pointer in DEST is
+-     initialized to point to the same argument as the pointer in SRC.
+-
+-     This macro is a GNU extension but it will hopefully also be
+-     available in the next update of the ISO C standard.
+-
+-   If you want to use `__va_copy' you should always be prepared that
+-this macro is not available.  On architectures where a simple assignment
+-is invalid it hopefully is and so one should always write something like
+-this:
+-
+-     {
+-       va_list ap, save;
+-       ...
+-     #ifdef __va_copy
+-       __va_copy (save, ap);
+-     #else
+-       save = ap;
+-     #endif
+-       ...
+-     }
+-
+-
+-File: libc.info,  Node: Variadic Example,  Prev: How Variadic,  Up: Variadic Functions
+-
+-Example of a Variadic Function
+-------------------------------
+-
+-   Here is a complete sample function that accepts a variable number of
+-arguments.  The first argument to the function is the count of remaining
+-arguments, which are added up and the result returned.  While trivial,
+-this function is sufficient to illustrate how to use the variable
+-arguments facility.
+-
+-     #include <stdarg.h>
+-     #include <stdio.h>
+-     
+-     int
+-     add_em_up (int count,...)
+-     {
+-       va_list ap;
+-       int i, sum;
+-     
+-       va_start (ap, count);         /* Initialize the argument list. */
+-     
+-       sum = 0;
+-       for (i = 0; i < count; i++)
+-         sum += va_arg (ap, int);    /* Get the next argument value. */
+-     
+-       va_end (ap);                  /* Clean up. */
+-       return sum;
+-     }
+-     
+-     int
+-     main (void)
+-     {
+-       /* This call prints 16. */
+-       printf ("%d\n", add_em_up (3, 5, 5, 6));
+-     
+-       /* This call prints 55. */
+-       printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
+-     
+-       return 0;
+-     }
+-
+-
+-File: libc.info,  Node: Old Varargs,  Prev: Argument Macros,  Up: How Variadic
+-
+-Old-Style Variadic Functions
+-............................
+-
+-   Before ISO C, programmers used a slightly different facility for
+-writing variadic functions.  The GNU C compiler still supports it;
+-currently, it is more portable than the ISO C facility, since support
+-for ISO C is still not universal.  The header file which defines the
+-old-fashioned variadic facility is called `varargs.h'.
+-
+-   Using `varargs.h' is almost the same as using `stdarg.h'.  There is
+-no difference in how you call a variadic function; see *Note Calling
+-Variadics::.  The only difference is in how you define them.  First of
+-all, you must use old-style non-prototype syntax, like this:
+-
+-     tree
+-     build (va_alist)
+-          va_dcl
+-     {
+-
+-   Secondly, you must give `va_start' just one argument, like this:
+-
+-       va_list p;
+-       va_start (p);
+-
+-   These are the special macros used for defining old-style variadic
+-functions:
+-
+- - Macro: va_alist
+-     This macro stands for the argument name list required in a variadic
+-     function.
+-
+- - Macro: va_dcl
+-     This macro declares the implicit argument or arguments for a
+-     variadic function.
+-
+- - Macro: void va_start (va_list AP)
+-     This macro, as defined in `varargs.h', initializes the argument
+-     pointer variable AP to point to the first argument of the current
+-     function.
+-
+-   The other argument macros, `va_arg' and `va_end', are the same in
+-`varargs.h' as in `stdarg.h'; see *Note Argument Macros::, for details.
+-
+-   It does not work to include both `varargs.h' and `stdarg.h' in the
+-same compilation; they define `va_start' in conflicting ways.
+-
+-
+-File: libc.info,  Node: Null Pointer Constant,  Next: Important Data Types,  Prev: Variadic Functions,  Up: Language Features
+-
+-Null Pointer Constant
+-=====================
+-
+-   The null pointer constant is guaranteed not to point to any real
+-object.  You can assign it to any pointer variable since it has type
+-`void *'.  The preferred way to write a null pointer constant is with
+-`NULL'.
+-
+- - Macro: void * NULL
+-     This is a null pointer constant.
+-
+-   You can also use `0' or `(void *)0' as a null pointer constant, but
+-using `NULL' is cleaner because it makes the purpose of the constant
+-more evident.
+-
+-   If you use the null pointer constant as a function argument, then for
+-complete portability you should make sure that the function has a
+-prototype declaration.  Otherwise, if the target machine has two
+-different pointer representations, the compiler won't know which
+-representation to use for that argument.  You can avoid the problem by
+-explicitly casting the constant to the proper pointer type, but we
+-recommend instead adding a prototype for the function you are calling.
+-
+-
+-File: libc.info,  Node: Important Data Types,  Next: Data Type Measurements,  Prev: Null Pointer Constant,  Up: Language Features
+-
+-Important Data Types
+-====================
+-
+-   The result of subtracting two pointers in C is always an integer,
+-but the precise data type varies from C compiler to C compiler.
+-Likewise, the data type of the result of `sizeof' also varies between
+-compilers.  ISO defines standard aliases for these two types, so you
+-can refer to them in a portable fashion.  They are defined in the
+-header file `stddef.h'.
+-
+- - Data Type: ptrdiff_t
+-     This is the signed integer type of the result of subtracting two
+-     pointers.  For example, with the declaration `char *p1, *p2;', the
+-     expression `p2 - p1' is of type `ptrdiff_t'.  This will probably
+-     be one of the standard signed integer types (`short int', `int' or
+-     `long int'), but might be a nonstandard type that exists only for
+-     this purpose.
+-
+- - Data Type: size_t
+-     This is an unsigned integer type used to represent the sizes of
+-     objects.  The result of the `sizeof' operator is of this type, and
+-     functions such as `malloc' (*note Unconstrained Allocation::.) and
+-     `memcpy' (*note Copying and Concatenation::.) accept arguments of
+-     this type to specify object sizes.
+-
+-     *Usage Note:* `size_t' is the preferred way to declare any
+-     arguments or variables that hold the size of an object.
+-
+-   In the GNU system `size_t' is equivalent to either `unsigned int' or
+-`unsigned long int'.  These types have identical properties on the GNU
+-system, and for most purposes, you can use them interchangeably.
+-However, they are distinct as data types, which makes a difference in
+-certain contexts.
+-
+-   For example, when you specify the type of a function argument in a
+-function prototype, it makes a difference which one you use.  If the
+-system header files declare `malloc' with an argument of type `size_t'
+-and you declare `malloc' with an argument of type `unsigned int', you
+-will get a compilation error if `size_t' happens to be `unsigned long
+-int' on your system.  To avoid any possibility of error, when a
+-function argument or value is supposed to have type `size_t', never
+-declare its type in any other way.
+-
+-   *Compatibility Note:* Implementations of C before the advent of
+-ISO C generally used `unsigned int' for representing object sizes and
+-`int' for pointer subtraction results.  They did not necessarily define
+-either `size_t' or `ptrdiff_t'.  Unix systems did define `size_t', in
+-`sys/types.h', but the definition was usually a signed type.
+-
+-
+-File: libc.info,  Node: Data Type Measurements,  Prev: Important Data Types,  Up: Language Features
+-
+-Data Type Measurements
+-======================
+-
+-   Most of the time, if you choose the proper C data type for each
+-object in your program, you need not be concerned with just how it is
+-represented or how many bits it uses.  When you do need such
+-information, the C language itself does not provide a way to get it.
+-The header files `limits.h' and `float.h' contain macros which give you
+-this information in full detail.
+-
+-* Menu:
+-
+-* Width of Type::           How many bits does an integer type hold?
+-* Range of Type::           What are the largest and smallest values
+-			     that an integer type can hold?
+-* Floating Type Macros::    Parameters that measure the floating point types.
+-* Structure Measurement::   Getting measurements on structure types.
+-
+-
+-File: libc.info,  Node: Width of Type,  Next: Range of Type,  Up: Data Type Measurements
+-
+-Computing the Width of an Integer Data Type
+--------------------------------------------
+-
+-   The most common reason that a program needs to know how many bits
+-are in an integer type is for using an array of `long int' as a bit
+-vector.  You can access the bit at index N with
+-
+-     vector[N / LONGBITS] & (1 << (N % LONGBITS))
+-
+-provided you define `LONGBITS' as the number of bits in a `long int'.
+-
+-   There is no operator in the C language that can give you the number
+-of bits in an integer data type.  But you can compute it from the macro
+-`CHAR_BIT', defined in the header file `limits.h'.
+-
+-`CHAR_BIT'
+-     This is the number of bits in a `char'--eight, on most systems.
+-     The value has type `int'.
+-
+-     You can compute the number of bits in any data type TYPE like this:
+-
+-          sizeof (TYPE) * CHAR_BIT
+-
+-
+-File: libc.info,  Node: Range of Type,  Next: Floating Type Macros,  Prev: Width of Type,  Up: Data Type Measurements
+-
+-Range of an Integer Type
+-------------------------
+-
+-   Suppose you need to store an integer value which can range from zero
+-to one million.  Which is the smallest type you can use?  There is no
+-general rule; it depends on the C compiler and target machine.  You can
+-use the `MIN' and `MAX' macros in `limits.h' to determine which type
+-will work.
+-
+-   Each signed integer type has a pair of macros which give the smallest
+-and largest values that it can hold.  Each unsigned integer type has one
+-such macro, for the maximum value; the minimum value is, of course,
+-zero.
+-
+-   The values of these macros are all integer constant expressions.  The
+-`MAX' and `MIN' macros for `char' and `short int' types have values of
+-type `int'.  The `MAX' and `MIN' macros for the other types have values
+-of the same type described by the macro--thus, `ULONG_MAX' has type
+-`unsigned long int'.
+-
+-`SCHAR_MIN'
+-     This is the minimum value that can be represented by a
+-     `signed char'.
+-
+-`SCHAR_MAX'
+-`UCHAR_MAX'
+-     These are the maximum values that can be represented by a
+-     `signed char' and `unsigned char', respectively.
+-
+-`CHAR_MIN'
+-     This is the minimum value that can be represented by a `char'.
+-     It's equal to `SCHAR_MIN' if `char' is signed, or zero otherwise.
+-
+-`CHAR_MAX'
+-     This is the maximum value that can be represented by a `char'.
+-     It's equal to `SCHAR_MAX' if `char' is signed, or `UCHAR_MAX'
+-     otherwise.
+-
+-`SHRT_MIN'
+-     This is the minimum value that can be represented by a
+-     `signed short int'.  On most machines that the GNU C library runs
+-     on, `short' integers are 16-bit quantities.
+-
+-`SHRT_MAX'
+-`USHRT_MAX'
+-     These are the maximum values that can be represented by a
+-     `signed short int' and `unsigned short int', respectively.
+-
+-`INT_MIN'
+-     This is the minimum value that can be represented by a
+-     `signed int'.  On most machines that the GNU C system runs on, an
+-     `int' is a 32-bit quantity.
+-
+-`INT_MAX'
+-`UINT_MAX'
+-     These are the maximum values that can be represented by,
+-     respectively, the type `signed int' and the type `unsigned int'.
+-
+-`LONG_MIN'
+-     This is the minimum value that can be represented by a
+-     `signed long int'.  On most machines that the GNU C system runs
+-     on, `long' integers are 32-bit quantities, the same size as `int'.
+-
+-`LONG_MAX'
+-`ULONG_MAX'
+-     These are the maximum values that can be represented by a
+-     `signed long int' and `unsigned long int', respectively.
+-
+-`LONG_LONG_MIN'
+-     This is the minimum value that can be represented by a
+-     `signed long long int'.  On most machines that the GNU C system
+-     runs on, `long long' integers are 64-bit quantities.
+-
+-`LONG_LONG_MAX'
+-`ULONG_LONG_MAX'
+-     These are the maximum values that can be represented by a `signed
+-     long long int' and `unsigned long long int', respectively.
+-
+-`WCHAR_MAX'
+-     This is the maximum value that can be represented by a `wchar_t'.
+-     *Note Extended Char Intro::.
+-
+-   The header file `limits.h' also defines some additional constants
+-that parameterize various operating system and file system limits.
+-These constants are described in *Note System Configuration::.
+-
+-
+-File: libc.info,  Node: Floating Type Macros,  Next: Structure Measurement,  Prev: Range of Type,  Up: Data Type Measurements
+-
+-Floating Type Macros
+---------------------
+-
+-   The specific representation of floating point numbers varies from
+-machine to machine.  Because floating point numbers are represented
+-internally as approximate quantities, algorithms for manipulating
+-floating point data often need to take account of the precise details of
+-the machine's floating point representation.
+-
+-   Some of the functions in the C library itself need this information;
+-for example, the algorithms for printing and reading floating point
+-numbers (*note I/O on Streams::.) and for calculating trigonometric and
+-irrational functions (*note Mathematics::.) use it to avoid round-off
+-error and loss of accuracy.  User programs that implement numerical
+-analysis techniques also often need this information in order to
+-minimize or compute error bounds.
+-
+-   The header file `float.h' describes the format used by your machine.
+-
+-* Menu:
+-
+-* Floating Point Concepts::     Definitions of terminology.
+-* Floating Point Parameters::   Details of specific macros.
+-* IEEE Floating Point::         The measurements for one common
+-                                 representation.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-44 glibc-2.1.3/manual/libc.info-44
+--- ../glibc-2.1.3/manual/libc.info-44	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-44	1969-12-31 16:00:00.000000000 -0800
+@@ -1,355 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Floating Point Concepts,  Next: Floating Point Parameters,  Up: Floating Type Macros
+-
+-Floating Point Representation Concepts
+-......................................
+-
+-   This section introduces the terminology for describing floating point
+-representations.
+-
+-   You are probably already familiar with most of these concepts in
+-terms of scientific or exponential notation for floating point numbers.
+-For example, the number `123456.0' could be expressed in exponential
+-notation as `1.23456e+05', a shorthand notation indicating that the
+-mantissa `1.23456' is multiplied by the base `10' raised to power `5'.
+-
+-   More formally, the internal representation of a floating point number
+-can be characterized in terms of the following parameters:
+-
+-   * The "sign" is either `-1' or `1'.
+-
+-   * The "base" or "radix" for exponentiation, an integer greater than
+-     `1'.  This is a constant for a particular representation.
+-
+-   * The "exponent" to which the base is raised.  The upper and lower
+-     bounds of the exponent value are constants for a particular
+-     representation.
+-
+-     Sometimes, in the actual bits representing the floating point
+-     number, the exponent is "biased" by adding a constant to it, to
+-     make it always be represented as an unsigned quantity.  This is
+-     only important if you have some reason to pick apart the bit
+-     fields making up the floating point number by hand, which is
+-     something for which the GNU library provides no support.  So this
+-     is ignored in the discussion that follows.
+-
+-   * The "mantissa" or "significand", an unsigned integer which is a
+-     part of each floating point number.
+-
+-   * The "precision" of the mantissa.  If the base of the representation
+-     is B, then the precision is the number of base-B digits in the
+-     mantissa.  This is a constant for a particular representation.
+-
+-     Many floating point representations have an implicit "hidden bit"
+-     in the mantissa.  This is a bit which is present virtually in the
+-     mantissa, but not stored in memory because its value is always 1
+-     in a normalized number.  The precision figure (see above) includes
+-     any hidden bits.
+-
+-     Again, the GNU library provides no facilities for dealing with such
+-     low-level aspects of the representation.
+-
+-   The mantissa of a floating point number actually represents an
+-implicit fraction whose denominator is the base raised to the power of
+-the precision.  Since the largest representable mantissa is one less
+-than this denominator, the value of the fraction is always strictly
+-less than `1'.  The mathematical value of a floating point number is
+-then the product of this fraction, the sign, and the base raised to the
+-exponent.
+-
+-   We say that the floating point number is "normalized" if the
+-fraction is at least `1/B', where B is the base.  In other words, the
+-mantissa would be too large to fit if it were multiplied by the base.
+-Non-normalized numbers are sometimes called "denormal"; they contain
+-less precision than the representation normally can hold.
+-
+-   If the number is not normalized, then you can subtract `1' from the
+-exponent while multiplying the mantissa by the base, and get another
+-floating point number with the same value.  "Normalization" consists of
+-doing this repeatedly until the number is normalized.  Two distinct
+-normalized floating point numbers cannot be equal in value.
+-
+-   (There is an exception to this rule: if the mantissa is zero, it is
+-considered normalized.  Another exception happens on certain machines
+-where the exponent is as small as the representation can hold.  Then it
+-is impossible to subtract `1' from the exponent, so a number may be
+-normalized even if its fraction is less than `1/B'.)
+-
+-
+-File: libc.info,  Node: Floating Point Parameters,  Next: IEEE Floating Point,  Prev: Floating Point Concepts,  Up: Floating Type Macros
+-
+-Floating Point Parameters
+-.........................
+-
+-   These macro definitions can be accessed by including the header file
+-`float.h' in your program.
+-
+-   Macro names starting with `FLT_' refer to the `float' type, while
+-names beginning with `DBL_' refer to the `double' type and names
+-beginning with `LDBL_' refer to the `long double' type.  (If GCC does
+-not support `long double' as a distinct data type on a target machine
+-then the values for the `LDBL_' constants are equal to the
+-corresponding constants for the `double' type.)
+-
+-   Of these macros, only `FLT_RADIX' is guaranteed to be a constant
+-expression.  The other macros listed here cannot be reliably used in
+-places that require constant expressions, such as `#if' preprocessing
+-directives or in the dimensions of static arrays.
+-
+-   Although the ISO C standard specifies minimum and maximum values for
+-most of these parameters, the GNU C implementation uses whatever values
+-describe the floating point representation of the target machine.  So in
+-principle GNU C actually satisfies the ISO C requirements only if the
+-target machine is suitable.  In practice, all the machines currently
+-supported are suitable.
+-
+-`FLT_ROUNDS'
+-     This value characterizes the rounding mode for floating point
+-     addition.  The following values indicate standard rounding modes:
+-
+-    `-1'
+-          The mode is indeterminable.
+-
+-    `0'
+-          Rounding is towards zero.
+-
+-    `1'
+-          Rounding is to the nearest number.
+-
+-    `2'
+-          Rounding is towards positive infinity.
+-
+-    `3'
+-          Rounding is towards negative infinity.
+-
+-     Any other value represents a machine-dependent nonstandard rounding
+-     mode.
+-
+-     On most machines, the value is `1', in accordance with the IEEE
+-     standard for floating point.
+-
+-     Here is a table showing how certain values round for each possible
+-     value of `FLT_ROUNDS', if the other aspects of the representation
+-     match the IEEE single-precision standard.
+-
+-                          0      1             2             3
+-           1.00000003    1.0    1.0           1.00000012    1.0
+-           1.00000007    1.0    1.00000012    1.00000012    1.0
+-          -1.00000003   -1.0   -1.0          -1.0          -1.00000012
+-          -1.00000007   -1.0   -1.00000012   -1.0          -1.00000012
+-
+-`FLT_RADIX'
+-     This is the value of the base, or radix, of exponent
+-     representation.  This is guaranteed to be a constant expression,
+-     unlike the other macros described in this section.  The value is 2
+-     on all machines we know of except the IBM 360 and derivatives.
+-
+-`FLT_MANT_DIG'
+-     This is the number of base-`FLT_RADIX' digits in the floating point
+-     mantissa for the `float' data type.  The following expression
+-     yields `1.0' (even though mathematically it should not) due to the
+-     limited number of mantissa digits:
+-
+-          float radix = FLT_RADIX;
+-          
+-          1.0f + 1.0f / radix / radix / ... / radix
+-
+-     where `radix' appears `FLT_MANT_DIG' times.
+-
+-`DBL_MANT_DIG'
+-`LDBL_MANT_DIG'
+-     This is the number of base-`FLT_RADIX' digits in the floating point
+-     mantissa for the data types `double' and `long double',
+-     respectively.
+-
+-`FLT_DIG'
+-     This is the number of decimal digits of precision for the `float'
+-     data type.  Technically, if P and B are the precision and base
+-     (respectively) for the representation, then the decimal precision
+-     Q is the maximum number of decimal digits such that any floating
+-     point number with Q base 10 digits can be rounded to a floating
+-     point number with P base B digits and back again, without change
+-     to the Q decimal digits.
+-
+-     The value of this macro is supposed to be at least `6', to satisfy
+-     ISO C.
+-
+-`DBL_DIG'
+-`LDBL_DIG'
+-     These are similar to `FLT_DIG', but for the data types `double'
+-     and `long double', respectively.  The values of these macros are
+-     supposed to be at least `10'.
+-
+-`FLT_MIN_EXP'
+-     This is the smallest possible exponent value for type `float'.
+-     More precisely, is the minimum negative integer such that the value
+-     `FLT_RADIX' raised to this power minus 1 can be represented as a
+-     normalized floating point number of type `float'.
+-
+-`DBL_MIN_EXP'
+-`LDBL_MIN_EXP'
+-     These are similar to `FLT_MIN_EXP', but for the data types
+-     `double' and `long double', respectively.
+-
+-`FLT_MIN_10_EXP'
+-     This is the minimum negative integer such that `10' raised to this
+-     power minus 1 can be represented as a normalized floating point
+-     number of type `float'.  This is supposed to be `-37' or even less.
+-
+-`DBL_MIN_10_EXP'
+-`LDBL_MIN_10_EXP'
+-     These are similar to `FLT_MIN_10_EXP', but for the data types
+-     `double' and `long double', respectively.
+-
+-`FLT_MAX_EXP'
+-     This is the largest possible exponent value for type `float'.  More
+-     precisely, this is the maximum positive integer such that value
+-     `FLT_RADIX' raised to this power minus 1 can be represented as a
+-     floating point number of type `float'.
+-
+-`DBL_MAX_EXP'
+-`LDBL_MAX_EXP'
+-     These are similar to `FLT_MAX_EXP', but for the data types
+-     `double' and `long double', respectively.
+-
+-`FLT_MAX_10_EXP'
+-     This is the maximum positive integer such that `10' raised to this
+-     power minus 1 can be represented as a normalized floating point
+-     number of type `float'.  This is supposed to be at least `37'.
+-
+-`DBL_MAX_10_EXP'
+-`LDBL_MAX_10_EXP'
+-     These are similar to `FLT_MAX_10_EXP', but for the data types
+-     `double' and `long double', respectively.
+-
+-`FLT_MAX'
+-     The value of this macro is the maximum number representable in type
+-     `float'.  It is supposed to be at least `1E+37'.  The value has
+-     type `float'.
+-
+-     The smallest representable number is `- FLT_MAX'.
+-
+-`DBL_MAX'
+-`LDBL_MAX'
+-     These are similar to `FLT_MAX', but for the data types `double'
+-     and `long double', respectively.  The type of the macro's value is
+-     the same as the type it describes.
+-
+-`FLT_MIN'
+-     The value of this macro is the minimum normalized positive floating
+-     point number that is representable in type `float'.  It is supposed
+-     to be no more than `1E-37'.
+-
+-`DBL_MIN'
+-`LDBL_MIN'
+-     These are similar to `FLT_MIN', but for the data types `double'
+-     and `long double', respectively.  The type of the macro's value is
+-     the same as the type it describes.
+-
+-`FLT_EPSILON'
+-     This is the minimum positive floating point number of type `float'
+-     such that `1.0 + FLT_EPSILON != 1.0' is true.  It's supposed to be
+-     no greater than `1E-5'.
+-
+-`DBL_EPSILON'
+-`LDBL_EPSILON'
+-     These are similar to `FLT_EPSILON', but for the data types
+-     `double' and `long double', respectively.  The type of the macro's
+-     value is the same as the type it describes.  The values are not
+-     supposed to be greater than `1E-9'.
+-
+-
+-File: libc.info,  Node: IEEE Floating Point,  Prev: Floating Point Parameters,  Up: Floating Type Macros
+-
+-IEEE Floating Point
+-...................
+-
+-   Here is an example showing how the floating type measurements come
+-out for the most common floating point representation, specified by the
+-`IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE Std
+-754-1985)'.  Nearly all computers designed since the 1980s use this
+-format.
+-
+-   The IEEE single-precision float representation uses a base of 2.
+-There is a sign bit, a mantissa with 23 bits plus one hidden bit (so
+-the total precision is 24 base-2 digits), and an 8-bit exponent that
+-can represent values in the range -125 to 128, inclusive.
+-
+-   So, for an implementation that uses this representation for the
+-`float' data type, appropriate values for the corresponding parameters
+-are:
+-
+-     FLT_RADIX                             2
+-     FLT_MANT_DIG                         24
+-     FLT_DIG                               6
+-     FLT_MIN_EXP                        -125
+-     FLT_MIN_10_EXP                      -37
+-     FLT_MAX_EXP                         128
+-     FLT_MAX_10_EXP                      +38
+-     FLT_MIN                 1.17549435E-38F
+-     FLT_MAX                 3.40282347E+38F
+-     FLT_EPSILON             1.19209290E-07F
+-
+-   Here are the values for the `double' data type:
+-
+-     DBL_MANT_DIG                         53
+-     DBL_DIG                              15
+-     DBL_MIN_EXP                       -1021
+-     DBL_MIN_10_EXP                     -307
+-     DBL_MAX_EXP                        1024
+-     DBL_MAX_10_EXP                      308
+-     DBL_MAX         1.7976931348623157E+308
+-     DBL_MIN         2.2250738585072014E-308
+-     DBL_EPSILON     2.2204460492503131E-016
+-
+-
+-File: libc.info,  Node: Structure Measurement,  Prev: Floating Type Macros,  Up: Data Type Measurements
+-
+-Structure Field Offset Measurement
+-----------------------------------
+-
+-   You can use `offsetof' to measure the location within a structure
+-type of a particular structure member.
+-
+- - Macro: size_t offsetof (TYPE, MEMBER)
+-     This expands to a integer constant expression that is the offset
+-     of the structure member named MEMBER in a the structure type TYPE.
+-     For example, `offsetof (struct s, elem)' is the offset, in bytes,
+-     of the member `elem' in a `struct s'.
+-
+-     This macro won't work if MEMBER is a bit field; you get an error
+-     from the C compiler in that case.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-45 glibc-2.1.3/manual/libc.info-45
+--- ../glibc-2.1.3/manual/libc.info-45	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-45	1969-12-31 16:00:00.000000000 -0800
+@@ -1,6297 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Library Summary,  Next: Installation,  Prev: Language Features,  Up: Top
+-
+-Summary of Library Facilities
+-*****************************
+-
+-   This appendix is a complete list of the facilities declared within
+-the header files supplied with the GNU C library.  Each entry also
+-lists the standard or other source from which each facility is derived,
+-and tells you where in the manual you can find more information about
+-how to use it.
+-
+-`long int a64l (const char *STRING)'
+-     `stdlib.h' (XPG):  *Note Encode Binary Data::.
+-
+-`void abort (void)'
+-     `stdlib.h' (ISO):  *Note Aborting a Program::.
+-
+-`int abs (int NUMBER)'
+-     `stdlib.h' (ISO):  *Note Absolute Value::.
+-
+-`int accept (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH_PTR)'
+-     `sys/socket.h' (BSD):  *Note Accepting Connections::.
+-
+-`int access (const char *FILENAME, int HOW)'
+-     `unistd.h' (POSIX.1):  *Note Testing File Access::.
+-
+-`ACCOUNTING'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`double acos (double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`float acosf (float X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`double acosh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float acoshf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double acoshl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double acosl (long double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`int addmntent (FILE *STREAM, const struct mntent *MNT)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`int adjtime (const struct timeval *DELTA, struct timeval *OLDDELTA)'
+-     `sys/time.h' (BSD):  *Note High-Resolution Calendar::.
+-
+-`AF_FILE'
+-     `sys/socket.h' (GNU):  *Note Address Formats::.
+-
+-`AF_INET'
+-     `sys/socket.h' (BSD):  *Note Address Formats::.
+-
+-`AF_INET6'
+-     `sys/socket.h' (IPv6 Basic API):  *Note Address Formats::.
+-
+-`AF_LOCAL'
+-     `sys/socket.h' (POSIX):  *Note Address Formats::.
+-
+-`AF_UNIX'
+-     `sys/socket.h' (BSD):  *Note Address Formats::.
+-
+-`AF_UNSPEC'
+-     `sys/socket.h' (BSD):  *Note Address Formats::.
+-
+-`int aio_cancel (int FILDES, struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Cancel AIO Operations::.
+-
+-`int aio_cancel64 (int FILDES, struct aiocb *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Cancel AIO Operations::.
+-
+-`int aio_error (const struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Status of AIO Operations::.
+-
+-`int aio_error64 (const struct aiocb64 *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Status of AIO Operations::.
+-
+-`int aio_fsync (int OP, struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Synchronizing AIO Operations::.
+-
+-`int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Synchronizing AIO Operations::.
+-
+-`void aio_init (const struct aioinit *INIT)'
+-     `aio.h' (GNU):  *Note Configuration of AIO::.
+-
+-`int aio_read (struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Asynchronous Reads/Writes::.
+-
+-`int aio_read64 (struct aiocb *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Asynchronous Reads/Writes::.
+-
+-`ssize_t aio_return (const struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Status of AIO Operations::.
+-
+-`int aio_return64 (const struct aiocb64 *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Status of AIO Operations::.
+-
+-`int aio_suspend (const struct aiocb *const LIST[], int NENT, const struct timespec *TIMEOUT)'
+-     `aio.h' (POSIX.1b):  *Note Synchronizing AIO Operations::.
+-
+-`int aio_suspend64 (const struct aiocb64 *const LIST[], int NENT, const struct timespec *TIMEOUT)'
+-     `aio.h' (Unix98):  *Note Synchronizing AIO Operations::.
+-
+-`int aio_write (struct aiocb *AIOCBP)'
+-     `aio.h' (POSIX.1b):  *Note Asynchronous Reads/Writes::.
+-
+-`int aio_write64 (struct aiocb *AIOCBP)'
+-     `aio.h' (Unix98):  *Note Asynchronous Reads/Writes::.
+-
+-`unsigned int alarm (unsigned int SECONDS)'
+-     `unistd.h' (POSIX.1):  *Note Setting an Alarm::.
+-
+-`void * alloca (size_t SIZE);'
+-     `stdlib.h' (GNU, BSD):  *Note Variable Size Automatic::.
+-
+-`int alphasort (const void *A, const void *B)'
+-     `dirent.h' (BSD/SVID):  *Note Scanning Directory Content::.
+-
+-`int alphasort64 (const void *A, const void *B)'
+-     `dirent.h' (GNU):  *Note Scanning Directory Content::.
+-
+-`tcflag_t ALTWERASE'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`int ARG_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`error_t argp_err_exit_status'
+-     `argp.h' (GNU):  *Note Argp Global Variables::.
+-
+-`void argp_error (const struct argp_state *STATE, const char *FMT, ...)'
+-     `argp.h' (GNU):  *Note Argp Helper Functions::.
+-
+-`int ARGP_ERR_UNKNOWN'
+-     `argp.h' (GNU):  *Note Argp Parser Functions::.
+-
+-`void argp_failure (const struct argp_state *STATE, int STATUS, int ERRNUM, const char *FMT, ...)'
+-     `argp.h' (GNU):  *Note Argp Helper Functions::.
+-
+-`void argp_help (const struct argp *ARGP, FILE *STREAM, unsigned FLAGS, char *NAME)'
+-     `argp.h' (GNU):  *Note Argp Help::.
+-
+-`ARGP_IN_ORDER'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`ARGP_KEY_ARG'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_ARGS'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_END'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_ERROR'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_FINI'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_HELP_ARGS_DOC'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_HELP_DUP_ARGS_NOTE'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_HELP_EXTRA'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_HELP_HEADER'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_HELP_POST_DOC'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_HELP_PRE_DOC'
+-     `argp.h' (GNU):  *Note Argp Help Filter Keys::.
+-
+-`ARGP_KEY_INIT'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_NO_ARGS'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_KEY_SUCCESS'
+-     `argp.h' (GNU):  *Note Argp Special Keys::.
+-
+-`ARGP_LONG_ONLY'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`ARGP_NO_ARGS'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`ARGP_NO_ERRS'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`ARGP_NO_EXIT'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`ARGP_NO_HELP'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`error_t argp_parse (const struct argp *ARGP, int ARGC, char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)'
+-     `argp.h' (GNU):  *Note Suboptions: Argp.
+-
+-`ARGP_PARSE_ARGV0'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`const char * argp_program_bug_address'
+-     `argp.h' (GNU):  *Note Argp Global Variables::.
+-
+-`const char * argp_program_version'
+-     `argp.h' (GNU):  *Note Argp Global Variables::.
+-
+-`argp_program_version_hook'
+-     `argp.h' (GNU):  *Note Argp Global Variables::.
+-
+-`ARGP_SILENT'
+-     `argp.h' (GNU):  *Note Argp Flags::.
+-
+-`void argp_state_help (const struct argp_state *STATE, FILE *STREAM, unsigned FLAGS)'
+-     `argp.h' (GNU):  *Note Argp Helper Functions::.
+-
+-`void argp_usage (const struct argp_state *STATE)'
+-     `argp.h' (GNU):  *Note Argp Helper Functions::.
+-
+-`error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const char *STR)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const char *STR, int DELIM)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const char *BUF, size_t BUF_LEN)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`size_t argz_count (const char *ARGZ, size_t ARG_LEN)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_create (char *const ARGV[], char **ARGZ, size_t *ARGZ_LEN)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_create_sep (const char *STRING, int SEP, char **ARGZ, size_t *ARGZ_LEN)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_delete (char **ARGZ, size_t *ARGZ_LEN, char *ENTRY)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`void argz_extract (char *ARGZ, size_t ARGZ_LEN, char **ARGV)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_insert (char **ARGZ, size_t *ARGZ_LEN, char *BEFORE, const char *ENTRY)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`char * argz_next (char *ARGZ, size_t ARGZ_LEN, const char *ENTRY)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`error_t argz_replace (char **ARGZ, size_t *ARGZ_LEN, const char *STR, const char *WITH, unsigned *REPLACE_COUNT)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`void argz_stringify (char *ARGZ, size_t LEN, int SEP)'
+-     `argz.h' (GNU):  *Note Argz Functions::.
+-
+-`char * asctime (const struct tm *BROKENTIME)'
+-     `time.h' (ISO):  *Note Formatting Date and Time::.
+-
+-`char * asctime_r (const struct tm *BROKENTIME, char *BUFFER)'
+-     `time.h' (POSIX.1c):  *Note Formatting Date and Time::.
+-
+-`double asin (double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`float asinf (float X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`double asinh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float asinhf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double asinhl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double asinl (long double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`int asprintf (char **PTR, const char *TEMPLATE, ...)'
+-     `stdio.h' (GNU):  *Note Dynamic Output::.
+-
+-`void assert (int EXPRESSION)'
+-     `assert.h' (ISO):  *Note Consistency Checking::.
+-
+-`void assert_perror (int ERRNUM)'
+-     `assert.h' (GNU):  *Note Consistency Checking::.
+-
+-`double atan (double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`double atan2 (double Y, double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`float atan2f (float Y, float X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`long double atan2l (long double Y, long double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`float atanf (float X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`double atanh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float atanhf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double atanhl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double atanl (long double X)'
+-     `math.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`int atexit (void (*FUNCTION) (void))'
+-     `stdlib.h' (ISO):  *Note Cleanups on Exit::.
+-
+-`double atof (const char *STRING)'
+-     `stdlib.h' (ISO):  *Note Parsing of Floats::.
+-
+-`int atoi (const char *STRING)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`long int atol (const char *STRING)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`long long int atoll (const char *STRING)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`B0'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B110'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B115200'
+-     `termios.h' (GNU):  *Note Line Speed::.
+-
+-`B1200'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B134'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B150'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B1800'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B19200'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B200'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B230400'
+-     `termios.h' (GNU):  *Note Line Speed::.
+-
+-`B2400'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B300'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B38400'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B460800'
+-     `termios.h' (GNU):  *Note Line Speed::.
+-
+-`B4800'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B50'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B57600'
+-     `termios.h' (GNU):  *Note Line Speed::.
+-
+-`B600'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B75'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`B9600'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`int BC_BASE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`int BC_DIM_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`int bcmp (const void *A1, const void *A2, size_t SIZE)'
+-     `string.h' (BSD):  *Note String/Array Comparison::.
+-
+-`void bcopy (const void *FROM, void *TO, size_t SIZE)'
+-     `string.h' (BSD):  *Note Copying and Concatenation::.
+-
+-`int BC_SCALE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`int BC_STRING_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`int bind (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)'
+-     `sys/socket.h' (BSD):  *Note Setting Address::.
+-
+-`blkcnt64_t'
+-     `sys/types.h' (Unix98):  *Note Attribute Meanings::.
+-
+-`blkcnt_t'
+-     `sys/types.h' (Unix98):  *Note Attribute Meanings::.
+-
+-`BOOT_TIME'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`BOOT_TIME'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`tcflag_t BRKINT'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`_BSD_SOURCE'
+-     (GNU):  *Note Feature Test Macros::.
+-
+-`void * bsearch (const void *KEY, const void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)'
+-     `stdlib.h' (ISO):  *Note Array Search Function::.
+-
+-`wint_t btowc (int C)'
+-     `wchar.h' (ISO):  *Note Converting a Character::.
+-
+-`int BUFSIZ'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`void bzero (void *BLOCK, size_t SIZE)'
+-     `string.h' (BSD):  *Note Copying and Concatenation::.
+-
+-`double cabs (complex double Z)'
+-     `complex.h' (ISO):  *Note Absolute Value::.
+-
+-`float cabsf (complex float Z)'
+-     `complex.h' (ISO):  *Note Absolute Value::.
+-
+-`long double cabsl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Absolute Value::.
+-
+-`complex double cacos (complex double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex float cacosf (complex float Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex double cacosh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float cacoshf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double cacoshl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double cacosl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`void * calloc (size_t COUNT, size_t ELTSIZE)'
+-     `malloc.h', `stdlib.h' (ISO):  *Note Allocating Cleared Space::.
+-
+-`double carg (complex double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`float cargf (complex float Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`long double cargl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`complex double casin (complex double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex float casinf (complex float Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex double casinh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float casinhf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double casinhl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double casinl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex double catan (complex double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex float catanf (complex float Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`complex double catanh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float catanhf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double catanhl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double catanl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Inverse Trig Functions::.
+-
+-`nl_catd catopen (const char *CAT_NAME, int FLAG)'
+-     `nl_types.h' (X/Open):  *Note The catgets Functions::.
+-
+-`int cbc_crypt (char * KEY, char * BLOCKS, unsigned LEN, unsigned MODE, char * IVEC)'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`double cbrt (double X)'
+-     `math.h' (BSD):  *Note Exponents and Logarithms::.
+-
+-`float cbrtf (float X)'
+-     `math.h' (BSD):  *Note Exponents and Logarithms::.
+-
+-`long double cbrtl (long double X)'
+-     `math.h' (BSD):  *Note Exponents and Logarithms::.
+-
+-`complex double ccos (complex double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex float ccosf (complex float Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex double ccosh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float ccoshf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double ccoshl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double ccosl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`cc_t'
+-     `termios.h' (POSIX.1):  *Note Mode Data Types::.
+-
+-`tcflag_t CCTS_OFLOW'
+-     `termios.h' (BSD):  *Note Control Modes::.
+-
+-`double ceil (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float ceilf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double ceill (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`complex double cexp (complex double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex float cexpf (complex float Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex long double cexpl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`speed_t cfgetispeed (const struct termios *TERMIOS-P)'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`speed_t cfgetospeed (const struct termios *TERMIOS-P)'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`int cfmakeraw (struct termios *TERMIOS-P)'
+-     `termios.h' (BSD):  *Note Noncanonical Input::.
+-
+-`void cfree (void *PTR)'
+-     `stdlib.h' (Sun):  *Note Freeing after Malloc::.
+-
+-`int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)'
+-     `termios.h' (BSD):  *Note Line Speed::.
+-
+-`CHAR_BIT'
+-     `limits.h' (ISO):  *Note Width of Type::.
+-
+-`CHAR_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`CHAR_MIN'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`int chdir (const char *FILENAME)'
+-     `unistd.h' (POSIX.1):  *Note Working Directory::.
+-
+-`int CHILD_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`int chmod (const char *FILENAME, mode_t MODE)'
+-     `sys/stat.h' (POSIX.1):  *Note Setting Permissions::.
+-
+-`int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)'
+-     `unistd.h' (POSIX.1):  *Note File Owner::.
+-
+-`tcflag_t CIGNORE'
+-     `termios.h' (BSD):  *Note Control Modes::.
+-
+-`double cimag (complex double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`float cimagf (complex float Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`long double cimagl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`int clearenv (void)'
+-     `stdlib.h' (GNU):  *Note Environment Access::.
+-
+-`void clearerr (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note EOF and Errors::.
+-
+-`int CLK_TCK'
+-     `time.h' (POSIX.1):  *Note Basic CPU Time::.
+-
+-`tcflag_t CLOCAL'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`clock_t clock (void)'
+-     `time.h' (ISO):  *Note Basic CPU Time::.
+-
+-`int CLOCKS_PER_SEC'
+-     `time.h' (ISO):  *Note Basic CPU Time::.
+-
+-`clock_t'
+-     `time.h' (ISO):  *Note Basic CPU Time::.
+-
+-`complex double clog (complex double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex double clog10 (complex double Z)'
+-     `complex.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`complex float clog10f (complex float Z)'
+-     `complex.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`complex long double clog10l (complex long double Z)'
+-     `complex.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`complex float clogf (complex float Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex long double clogl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int close (int FILEDES)'
+-     `unistd.h' (POSIX.1):  *Note Opening and Closing Files::.
+-
+-`int closedir (DIR *DIRSTREAM)'
+-     `dirent.h' (POSIX.1):  *Note Reading/Closing Directory::.
+-
+-`int COLL_WEIGHTS_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`size_t confstr (int PARAMETER, char *BUF, size_t LEN)'
+-     `unistd.h' (POSIX.2):  *Note String Parameters::.
+-
+-`complex double conj (complex double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`complex float conjf (complex float Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`complex long double conjl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`int connect (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)'
+-     `sys/socket.h' (BSD):  *Note Connecting::.
+-
+-`cookie_close_function'
+-     `stdio.h' (GNU):  *Note Hook Functions::.
+-
+-`cookie_io_functions_t'
+-     `stdio.h' (GNU):  *Note Streams and Cookies::.
+-
+-`cookie_read_function'
+-     `stdio.h' (GNU):  *Note Hook Functions::.
+-
+-`cookie_seek_function'
+-     `stdio.h' (GNU):  *Note Hook Functions::.
+-
+-`cookie_write_function'
+-     `stdio.h' (GNU):  *Note Hook Functions::.
+-
+-`double copysign (double X, double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`float copysignf (float X, float Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`long double copysignl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`double cos (double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`float cosf (float X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`double cosh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float coshf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double coshl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double cosl (long double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`complex double cpow (complex double BASE, complex double POWER)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex float cpowf (complex float BASE, complex float POWER)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex long double cpowl (complex long double BASE, complex long double POWER)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex double cproj (complex double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`complex float cprojf (complex float Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`complex long double cprojl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`tcflag_t CREAD'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`double creal (complex double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`float crealf (complex float Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`long double creall (complex long double Z)'
+-     `complex.h' (ISO):  *Note Operations on Complex::.
+-
+-`int creat (const char *FILENAME, mode_t MODE)'
+-     `fcntl.h' (POSIX.1):  *Note Opening and Closing Files::.
+-
+-`int creat64 (const char *FILENAME, mode_t MODE)'
+-     `fcntl.h' (Unix98):  *Note Opening and Closing Files::.
+-
+-`tcflag_t CRTS_IFLOW'
+-     `termios.h' (BSD):  *Note Control Modes::.
+-
+-`char * crypt (const char * KEY, const char * SALT)'
+-     `crypt.h' (crypt.h):  *Note crypt::.
+-
+-`char * crypt_r (const char * KEY, const char * SALT, struct crypt_data * DATA)'
+-     `crypt.h' (GNU):  *Note crypt::.
+-
+-`tcflag_t CS5'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`tcflag_t CS6'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`tcflag_t CS7'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`tcflag_t CS8'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`complex double csin (complex double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex float csinf (complex float Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex double csinh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float csinhf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double csinhl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double csinl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`tcflag_t CSIZE'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`_CS_LFS64_CFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS64_LDFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS64_LIBS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS64_LINTFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS_CFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS_LDFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS_LIBS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_LFS_LINTFLAGS'
+-     `unistd.h' (Unix98):  *Note String Parameters::.
+-
+-`_CS_PATH'
+-     `unistd.h' (POSIX.2):  *Note String Parameters::.
+-
+-`complex double csqrt (complex double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex float csqrtf (complex float Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`complex long double csqrtl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`tcflag_t CSTOPB'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`complex double ctan (complex double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex float ctanf (complex float Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`complex double ctanh (complex double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex float ctanhf (complex float Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double ctanhl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`complex long double ctanl (complex long double Z)'
+-     `complex.h' (ISO):  *Note Trig Functions::.
+-
+-`char * ctermid (char *STRING)'
+-     `stdio.h' (POSIX.1):  *Note Identifying the Terminal::.
+-
+-`char * ctime (const time_t *TIME)'
+-     `time.h' (ISO):  *Note Formatting Date and Time::.
+-
+-`char * ctime_r (const time_t *TIME, char *BUFFER)'
+-     `time.h' (POSIX.1c):  *Note Formatting Date and Time::.
+-
+-`char * cuserid (char *STRING)'
+-     `stdio.h' (POSIX.1):  *Note Who Logged In::.
+-
+-`int daylight'
+-     `time.h' (SVID):  *Note Time Zone Functions::.
+-
+-`DBL_DIG'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_EPSILON'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MANT_DIG'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MAX'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MAX_10_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MAX_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MIN'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MIN_10_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DBL_MIN_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`DEAD_PROCESS'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`DEAD_PROCESS'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`DES_DECRYPT'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DES_ENCRYPT'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DESERR_BADPARAM'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DESERR_HWERROR'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DESERR_NOHWDEVICE'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DESERR_NONE'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`int DES_FAILED (int ERR)'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DES_HW'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`void des_setparity (char * KEY)'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`DES_SW'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`dev_t'
+-     `sys/types.h' (POSIX.1):  *Note Attribute Meanings::.
+-
+-`double difftime (time_t TIME1, time_t TIME0)'
+-     `time.h' (ISO):  *Note Simple Calendar Time::.
+-
+-`DIR'
+-     `dirent.h' (POSIX.1):  *Note Opening a Directory::.
+-
+-`div_t div (int NUMERATOR, int DENOMINATOR)'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`div_t'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`double drand48 (void)'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int drand48_r (struct drand48_data *BUFFER, double *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`double drem (double NUMERATOR, double DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`float dremf (float NUMERATOR, float DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`long double dreml (long double NUMERATOR, long double DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`int dup (int OLD)'
+-     `unistd.h' (POSIX.1):  *Note Duplicating Descriptors::.
+-
+-`int dup2 (int OLD, int NEW)'
+-     `unistd.h' (POSIX.1):  *Note Duplicating Descriptors::.
+-
+-`int E2BIG'
+-     `errno.h' (POSIX.1: Argument list too long):  *Note Error Codes::.
+-
+-`int EACCES'
+-     `errno.h' (POSIX.1: Permission denied):  *Note Error Codes::.
+-
+-`int EADDRINUSE'
+-     `errno.h' (BSD: Address already in use):  *Note Error Codes::.
+-
+-`int EADDRNOTAVAIL'
+-     `errno.h' (BSD: Cannot assign requested address):  *Note Error
+-     Codes::.
+-
+-`int EADV'
+-     `errno.h' (Linux???: Advertise error):  *Note Error Codes::.
+-
+-`int EAFNOSUPPORT'
+-     `errno.h' (BSD: Address family not supported by protocol):  *Note
+-     Error Codes::.
+-
+-`int EAGAIN'
+-     `errno.h' (POSIX.1: Resource temporarily unavailable):  *Note
+-     Error Codes::.
+-
+-`int EALREADY'
+-     `errno.h' (BSD: Operation already in progress):  *Note Error
+-     Codes::.
+-
+-`int EAUTH'
+-     `errno.h' (BSD: Authentication error):  *Note Error Codes::.
+-
+-`int EBACKGROUND'
+-     `errno.h' (GNU: Inappropriate operation for background process):
+-     *Note Error Codes::.
+-
+-`int EBADE'
+-     `errno.h' (Linux???: Invalid exchange):  *Note Error Codes::.
+-
+-`int EBADF'
+-     `errno.h' (POSIX.1: Bad file descriptor):  *Note Error Codes::.
+-
+-`int EBADFD'
+-     `errno.h' (Linux???: File descriptor in bad state):  *Note Error
+-     Codes::.
+-
+-`int EBADMSG'
+-     `errno.h' (XOPEN: Bad message):  *Note Error Codes::.
+-
+-`int EBADR'
+-     `errno.h' (Linux???: Invalid request descriptor):  *Note Error
+-     Codes::.
+-
+-`int EBADRPC'
+-     `errno.h' (BSD: RPC struct is bad):  *Note Error Codes::.
+-
+-`int EBADRQC'
+-     `errno.h' (Linux???: Invalid request code):  *Note Error Codes::.
+-
+-`int EBADSLT'
+-     `errno.h' (Linux???: Invalid slot):  *Note Error Codes::.
+-
+-`int EBFONT'
+-     `errno.h' (Linux???: Bad font file format):  *Note Error Codes::.
+-
+-`int EBUSY'
+-     `errno.h' (POSIX.1: Device or resource busy):  *Note Error Codes::.
+-
+-`int ecb_crypt (char * KEY, char * BLOCKS, unsigned LEN, unsigned MODE)'
+-     `rpc/des_crypt.h' (SUNRPC):  *Note DES Encryption::.
+-
+-`int ECHILD'
+-     `errno.h' (POSIX.1: No child processes):  *Note Error Codes::.
+-
+-`tcflag_t ECHO'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`tcflag_t ECHOCTL'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`tcflag_t ECHOE'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`tcflag_t ECHOK'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`tcflag_t ECHOKE'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`tcflag_t ECHONL'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`tcflag_t ECHOPRT'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`int ECHRNG'
+-     `errno.h' (Linux???: Channel number out of range):  *Note Error
+-     Codes::.
+-
+-`int ECOMM'
+-     `errno.h' (Linux???: Communication error on send):  *Note Error
+-     Codes::.
+-
+-`int ECONNABORTED'
+-     `errno.h' (BSD: Software caused connection abort):  *Note Error
+-     Codes::.
+-
+-`int ECONNREFUSED'
+-     `errno.h' (BSD: Connection refused):  *Note Error Codes::.
+-
+-`int ECONNRESET'
+-     `errno.h' (BSD: Connection reset by peer):  *Note Error Codes::.
+-
+-`char * ecvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)'
+-     `stdlib.h' (SVID, Unix98):  *Note System V Number Conversion::.
+-
+-`char * ecvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`int ED'
+-     `errno.h' (GNU: ?):  *Note Error Codes::.
+-
+-`int EDEADLK'
+-     `errno.h' (POSIX.1: Resource deadlock avoided):  *Note Error
+-     Codes::.
+-
+-`int EDEADLOCK'
+-     `errno.h' (Linux???: File locking deadlock error):  *Note Error
+-     Codes::.
+-
+-`int EDESTADDRREQ'
+-     `errno.h' (BSD: Destination address required):  *Note Error
+-     Codes::.
+-
+-`int EDIED'
+-     `errno.h' (GNU: Translator died):  *Note Error Codes::.
+-
+-`int EDOM'
+-     `errno.h' (ISO: Numerical argument out of domain):  *Note Error
+-     Codes::.
+-
+-`int EDOTDOT'
+-     `errno.h' (Linux???: RFS specific error):  *Note Error Codes::.
+-
+-`int EDQUOT'
+-     `errno.h' (BSD: Disk quota exceeded):  *Note Error Codes::.
+-
+-`int EEXIST'
+-     `errno.h' (POSIX.1: File exists):  *Note Error Codes::.
+-
+-`int EFAULT'
+-     `errno.h' (POSIX.1: Bad address):  *Note Error Codes::.
+-
+-`int EFBIG'
+-     `errno.h' (POSIX.1: File too large):  *Note Error Codes::.
+-
+-`int EFTYPE'
+-     `errno.h' (BSD: Inappropriate file type or format):  *Note Error
+-     Codes::.
+-
+-`int EGRATUITOUS'
+-     `errno.h' (GNU: Gratuitous error):  *Note Error Codes::.
+-
+-`int EGREGIOUS'
+-     `errno.h' (GNU: You really blew it this time):  *Note Error
+-     Codes::.
+-
+-`int EHOSTDOWN'
+-     `errno.h' (BSD: Host is down):  *Note Error Codes::.
+-
+-`int EHOSTUNREACH'
+-     `errno.h' (BSD: No route to host):  *Note Error Codes::.
+-
+-`int EIDRM'
+-     `errno.h' (XOPEN: Identifier removed):  *Note Error Codes::.
+-
+-`int EIEIO'
+-     `errno.h' (GNU: Computer bought the farm):  *Note Error Codes::.
+-
+-`int EILSEQ'
+-     `errno.h' (ISO: Invalid or incomplete multibyte or wide
+-     character):  *Note Error Codes::.
+-
+-`int EINPROGRESS'
+-     `errno.h' (BSD: Operation now in progress):  *Note Error Codes::.
+-
+-`int EINTR'
+-     `errno.h' (POSIX.1: Interrupted system call):  *Note Error Codes::.
+-
+-`int EINVAL'
+-     `errno.h' (POSIX.1: Invalid argument):  *Note Error Codes::.
+-
+-`int EIO'
+-     `errno.h' (POSIX.1: Input/output error):  *Note Error Codes::.
+-
+-`int EISCONN'
+-     `errno.h' (BSD: Transport endpoint is already connected):  *Note
+-     Error Codes::.
+-
+-`int EISDIR'
+-     `errno.h' (POSIX.1: Is a directory):  *Note Error Codes::.
+-
+-`int EISNAM'
+-     `errno.h' (Linux???: Is a named type file):  *Note Error Codes::.
+-
+-`int EL2HLT'
+-     `errno.h' (Obsolete: Level 2 halted):  *Note Error Codes::.
+-
+-`int EL2NSYNC'
+-     `errno.h' (Obsolete: Level 2 not synchronized):  *Note Error
+-     Codes::.
+-
+-`int EL3HLT'
+-     `errno.h' (Obsolete: Level 3 halted):  *Note Error Codes::.
+-
+-`int EL3RST'
+-     `errno.h' (Obsolete: Level 3 reset):  *Note Error Codes::.
+-
+-`int ELIBACC'
+-     `errno.h' (Linux???: Can not access a needed shared library):
+-     *Note Error Codes::.
+-
+-`int ELIBBAD'
+-     `errno.h' (Linux???: Accessing a corrupted shared library):  *Note
+-     Error Codes::.
+-
+-`int ELIBEXEC'
+-     `errno.h' (Linux???: Cannot exec a shared library directly):
+-     *Note Error Codes::.
+-
+-`int ELIBMAX'
+-     `errno.h' (Linux???: Attempting to link in too many shared
+-     libraries):  *Note Error Codes::.
+-
+-`int ELIBSCN'
+-     `errno.h' (Linux???: .lib section in a.out corrupted):  *Note
+-     Error Codes::.
+-
+-`int ELNRNG'
+-     `errno.h' (Linux???: Link number out of range):  *Note Error
+-     Codes::.
+-
+-`int ELOOP'
+-     `errno.h' (BSD: Too many levels of symbolic links):  *Note Error
+-     Codes::.
+-
+-`int EMEDIUMTYPE'
+-     `errno.h' (Linux???: Wrong medium type):  *Note Error Codes::.
+-
+-`int EMFILE'
+-     `errno.h' (POSIX.1: Too many open files):  *Note Error Codes::.
+-
+-`int EMLINK'
+-     `errno.h' (POSIX.1: Too many links):  *Note Error Codes::.
+-
+-`EMPTY'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`EMPTY'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int EMSGSIZE'
+-     `errno.h' (BSD: Message too long):  *Note Error Codes::.
+-
+-`int EMULTIHOP'
+-     `errno.h' (XOPEN: Multihop attempted):  *Note Error Codes::.
+-
+-`int ENAMETOOLONG'
+-     `errno.h' (POSIX.1: File name too long):  *Note Error Codes::.
+-
+-`int ENAVAIL'
+-     `errno.h' (Linux???: No XENIX semaphores available):  *Note Error
+-     Codes::.
+-
+-`void encrypt (char * BLOCK, int EDFLAG)'
+-     `crypt.h' (crypt.h):  *Note DES Encryption::.
+-
+-`void encrypt_r (char * BLOCK, int EDFLAG, struct crypt_data * DATA)'
+-     `crypt.h' (GNU):  *Note DES Encryption::.
+-
+-`void endfsent (void)'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`void endgrent (void)'
+-     `grp.h' (SVID, BSD):  *Note Scanning All Groups::.
+-
+-`void endhostent (void)'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`int endmntent (FILE *STREAM)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`void endnetent (void)'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`void endnetgrent (void)'
+-     `netdb.h' (BSD):  *Note Lookup Netgroup::.
+-
+-`void endprotoent (void)'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`void endpwent (void)'
+-     `pwd.h' (SVID, BSD):  *Note Scanning All Users::.
+-
+-`void endservent (void)'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`void endutent (void)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`void endutxent (void)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int ENEEDAUTH'
+-     `errno.h' (BSD: Need authenticator):  *Note Error Codes::.
+-
+-`int ENETDOWN'
+-     `errno.h' (BSD: Network is down):  *Note Error Codes::.
+-
+-`int ENETRESET'
+-     `errno.h' (BSD: Network dropped connection on reset):  *Note Error
+-     Codes::.
+-
+-`int ENETUNREACH'
+-     `errno.h' (BSD: Network is unreachable):  *Note Error Codes::.
+-
+-`int ENFILE'
+-     `errno.h' (POSIX.1: Too many open files in system):  *Note Error
+-     Codes::.
+-
+-`int ENOANO'
+-     `errno.h' (Linux???: No anode):  *Note Error Codes::.
+-
+-`int ENOBUFS'
+-     `errno.h' (BSD: No buffer space available):  *Note Error Codes::.
+-
+-`int ENOCSI'
+-     `errno.h' (Linux???: No CSI structure available):  *Note Error
+-     Codes::.
+-
+-`int ENODATA'
+-     `errno.h' (XOPEN: No data available):  *Note Error Codes::.
+-
+-`int ENODEV'
+-     `errno.h' (POSIX.1: No such device):  *Note Error Codes::.
+-
+-`int ENOENT'
+-     `errno.h' (POSIX.1: No such file or directory):  *Note Error
+-     Codes::.
+-
+-`int ENOEXEC'
+-     `errno.h' (POSIX.1: Exec format error):  *Note Error Codes::.
+-
+-`int ENOLCK'
+-     `errno.h' (POSIX.1: No locks available):  *Note Error Codes::.
+-
+-`int ENOLINK'
+-     `errno.h' (XOPEN: Link has been severed):  *Note Error Codes::.
+-
+-`int ENOMEDIUM'
+-     `errno.h' (Linux???: No medium found):  *Note Error Codes::.
+-
+-`int ENOMEM'
+-     `errno.h' (POSIX.1: Cannot allocate memory):  *Note Error Codes::.
+-
+-`int ENOMSG'
+-     `errno.h' (XOPEN: No message of desired type):  *Note Error
+-     Codes::.
+-
+-`int ENONET'
+-     `errno.h' (Linux???: Machine is not on the network):  *Note Error
+-     Codes::.
+-
+-`int ENOPKG'
+-     `errno.h' (Linux???: Package not installed):  *Note Error Codes::.
+-
+-`int ENOPROTOOPT'
+-     `errno.h' (BSD: Protocol not available):  *Note Error Codes::.
+-
+-`int ENOSPC'
+-     `errno.h' (POSIX.1: No space left on device):  *Note Error Codes::.
+-
+-`int ENOSR'
+-     `errno.h' (XOPEN: Out of streams resources):  *Note Error Codes::.
+-
+-`int ENOSTR'
+-     `errno.h' (XOPEN: Device not a stream):  *Note Error Codes::.
+-
+-`int ENOSYS'
+-     `errno.h' (POSIX.1: Function not implemented):  *Note Error
+-     Codes::.
+-
+-`int ENOTBLK'
+-     `errno.h' (BSD: Block device required):  *Note Error Codes::.
+-
+-`int ENOTCONN'
+-     `errno.h' (BSD: Transport endpoint is not connected):  *Note Error
+-     Codes::.
+-
+-`int ENOTDIR'
+-     `errno.h' (POSIX.1: Not a directory):  *Note Error Codes::.
+-
+-`int ENOTEMPTY'
+-     `errno.h' (POSIX.1: Directory not empty):  *Note Error Codes::.
+-
+-`int ENOTNAM'
+-     `errno.h' (Linux???: Not a XENIX named type file):  *Note Error
+-     Codes::.
+-
+-`int ENOTSOCK'
+-     `errno.h' (BSD: Socket operation on non-socket):  *Note Error
+-     Codes::.
+-
+-`int ENOTSUP'
+-     `errno.h' (POSIX.1: Not supported):  *Note Error Codes::.
+-
+-`int ENOTTY'
+-     `errno.h' (POSIX.1: Inappropriate ioctl for device):  *Note Error
+-     Codes::.
+-
+-`int ENOTUNIQ'
+-     `errno.h' (Linux???: Name not unique on network):  *Note Error
+-     Codes::.
+-
+-`char ** environ'
+-     `unistd.h' (POSIX.1):  *Note Environment Access::.
+-
+-`error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const char *NAME, const char *VALUE)'
+-     `envz.h' (GNU):  *Note Envz Functions::.
+-
+-`char * envz_entry (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)'
+-     `envz.h' (GNU):  *Note Envz Functions::.
+-
+-`char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)'
+-     `envz.h' (GNU):  *Note Envz Functions::.
+-
+-`error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const char *ENVZ2, size_t ENVZ2_LEN, int OVERRIDE)'
+-     `envz.h' (GNU):  *Note Envz Functions::.
+-
+-`void envz_strip (char **ENVZ, size_t *ENVZ_LEN)'
+-     `envz.h' (GNU):  *Note Envz Functions::.
+-
+-`int ENXIO'
+-     `errno.h' (POSIX.1: Device not configured):  *Note Error Codes::.
+-
+-`int EOF'
+-     `stdio.h' (ISO):  *Note EOF and Errors::.
+-
+-`int EOPNOTSUPP'
+-     `errno.h' (BSD: Operation not supported):  *Note Error Codes::.
+-
+-`int EOVERFLOW'
+-     `errno.h' (XOPEN: Value too large for defined data type):  *Note
+-     Error Codes::.
+-
+-`int EPERM'
+-     `errno.h' (POSIX.1: Operation not permitted):  *Note Error Codes::.
+-
+-`int EPFNOSUPPORT'
+-     `errno.h' (BSD: Protocol family not supported):  *Note Error
+-     Codes::.
+-
+-`int EPIPE'
+-     `errno.h' (POSIX.1: Broken pipe):  *Note Error Codes::.
+-
+-`int EPROCLIM'
+-     `errno.h' (BSD: Too many processes):  *Note Error Codes::.
+-
+-`int EPROCUNAVAIL'
+-     `errno.h' (BSD: RPC bad procedure for program):  *Note Error
+-     Codes::.
+-
+-`int EPROGMISMATCH'
+-     `errno.h' (BSD: RPC program version wrong):  *Note Error Codes::.
+-
+-`int EPROGUNAVAIL'
+-     `errno.h' (BSD: RPC program not available):  *Note Error Codes::.
+-
+-`int EPROTO'
+-     `errno.h' (XOPEN: Protocol error):  *Note Error Codes::.
+-
+-`int EPROTONOSUPPORT'
+-     `errno.h' (BSD: Protocol not supported):  *Note Error Codes::.
+-
+-`int EPROTOTYPE'
+-     `errno.h' (BSD: Protocol wrong type for socket):  *Note Error
+-     Codes::.
+-
+-`int EQUIV_CLASS_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`double erand48 (unsigned short int XSUBI[3])'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int erand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, double *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int ERANGE'
+-     `errno.h' (ISO: Numerical result out of range):  *Note Error
+-     Codes::.
+-
+-`int EREMCHG'
+-     `errno.h' (Linux???: Remote address changed):  *Note Error Codes::.
+-
+-`int EREMOTE'
+-     `errno.h' (BSD: Object is remote):  *Note Error Codes::.
+-
+-`int EREMOTEIO'
+-     `errno.h' (Linux???: Remote I/O error):  *Note Error Codes::.
+-
+-`int ERESTART'
+-     `errno.h' (Linux???: Interrupted system call should be restarted):
+-     *Note Error Codes::.
+-
+-`double erf (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`double erfc (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float erfcf (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double erfcl (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float erff (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double erfl (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`int EROFS'
+-     `errno.h' (POSIX.1: Read-only file system):  *Note Error Codes::.
+-
+-`int ERPCMISMATCH'
+-     `errno.h' (BSD: RPC version wrong):  *Note Error Codes::.
+-
+-`volatile int errno'
+-     `errno.h' (ISO):  *Note Checking for Errors::.
+-
+-`int ESHUTDOWN'
+-     `errno.h' (BSD: Cannot send after transport endpoint shutdown):
+-     *Note Error Codes::.
+-
+-`int ESOCKTNOSUPPORT'
+-     `errno.h' (BSD: Socket type not supported):  *Note Error Codes::.
+-
+-`int ESPIPE'
+-     `errno.h' (POSIX.1: Illegal seek):  *Note Error Codes::.
+-
+-`int ESRCH'
+-     `errno.h' (POSIX.1: No such process):  *Note Error Codes::.
+-
+-`int ESRMNT'
+-     `errno.h' (Linux???: Srmount error):  *Note Error Codes::.
+-
+-`int ESTALE'
+-     `errno.h' (BSD: Stale NFS file handle):  *Note Error Codes::.
+-
+-`int ESTRPIPE'
+-     `errno.h' (Linux???: Streams pipe error):  *Note Error Codes::.
+-
+-`int ETIME'
+-     `errno.h' (XOPEN: Timer expired):  *Note Error Codes::.
+-
+-`int ETIMEDOUT'
+-     `errno.h' (BSD: Connection timed out):  *Note Error Codes::.
+-
+-`int ETOOMANYREFS'
+-     `errno.h' (BSD: Too many references: cannot splice):  *Note Error
+-     Codes::.
+-
+-`int ETXTBSY'
+-     `errno.h' (BSD: Text file busy):  *Note Error Codes::.
+-
+-`int EUCLEAN'
+-     `errno.h' (Linux???: Structure needs cleaning):  *Note Error
+-     Codes::.
+-
+-`int EUNATCH'
+-     `errno.h' (Linux???: Protocol driver not attached):  *Note Error
+-     Codes::.
+-
+-`int EUSERS'
+-     `errno.h' (BSD: Too many users):  *Note Error Codes::.
+-
+-`int EWOULDBLOCK'
+-     `errno.h' (BSD: Operation would block):  *Note Error Codes::.
+-
+-`int EXDEV'
+-     `errno.h' (POSIX.1: Invalid cross-device link):  *Note Error
+-     Codes::.
+-
+-`int execl (const char *FILENAME, const char *ARG0, ...)'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int execle (const char *FILENAME, const char *ARG0, char *const ENV[], ...)'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int execlp (const char *FILENAME, const char *ARG0, ...)'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int execv (const char *FILENAME, char *const ARGV[])'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int execve (const char *FILENAME, char *const ARGV[], char *const ENV[])'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int execvp (const char *FILENAME, char *const ARGV[])'
+-     `unistd.h' (POSIX.1):  *Note Executing a File::.
+-
+-`int EXFULL'
+-     `errno.h' (Linux???: Exchange full):  *Note Error Codes::.
+-
+-`void _Exit (int STATUS)'
+-     `stdlib.h' (ISO):  *Note Termination Internals::.
+-
+-`void _exit (int STATUS)'
+-     `unistd.h' (POSIX.1):  *Note Termination Internals::.
+-
+-`void exit (int STATUS)'
+-     `stdlib.h' (ISO):  *Note Normal Termination::.
+-
+-`int EXIT_FAILURE'
+-     `stdlib.h' (ISO):  *Note Exit Status::.
+-
+-`int EXIT_SUCCESS'
+-     `stdlib.h' (ISO):  *Note Exit Status::.
+-
+-`double exp (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double exp10 (double X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`float exp10f (float X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`long double exp10l (long double X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`double exp2 (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float exp2f (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double exp2l (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float expf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double expl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double expm1 (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float expm1f (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double expm1l (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int EXPR_NEST_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`double fabs (double NUMBER)'
+-     `math.h' (ISO):  *Note Absolute Value::.
+-
+-`float fabsf (float NUMBER)'
+-     `math.h' (ISO):  *Note Absolute Value::.
+-
+-`long double fabsl (long double NUMBER)'
+-     `math.h' (ISO):  *Note Absolute Value::.
+-
+-`int fchmod (int FILEDES, int MODE)'
+-     `sys/stat.h' (BSD):  *Note Setting Permissions::.
+-
+-`int fchown (int FILEDES, int OWNER, int GROUP)'
+-     `unistd.h' (BSD):  *Note File Owner::.
+-
+-`int fclean (FILE *STREAM)'
+-     `stdio.h' (GNU):  *Note Cleaning Streams::.
+-
+-`int fclose (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Closing Streams::.
+-
+-`int fcloseall (void)'
+-     `stdio.h' (GNU):  *Note Closing Streams::.
+-
+-`int fcntl (int FILEDES, int COMMAND, ...)'
+-     `fcntl.h' (POSIX.1):  *Note Control Operations::.
+-
+-`char * fcvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)'
+-     `stdlib.h' (SVID, Unix98):  *Note System V Number Conversion::.
+-
+-`char * fcvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
+-     `stdlib.h' (SVID, Unix98):  *Note System V Number Conversion::.
+-
+-`int fdatasync (int FILDES)'
+-     `unistd.h' (POSIX):  *Note Synchronizing I/O::.
+-
+-`int FD_CLOEXEC'
+-     `fcntl.h' (POSIX.1):  *Note Descriptor Flags::.
+-
+-`void FD_CLR (int FILEDES, fd_set *SET)'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`double fdim (double X, double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`float fdimf (float X, float Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`long double fdiml (long double X, long double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`int FD_ISSET (int FILEDES, fd_set *SET)'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`FILE * fdopen (int FILEDES, const char *OPENTYPE)'
+-     `stdio.h' (POSIX.1):  *Note Descriptors and Streams::.
+-
+-`void FD_SET (int FILEDES, fd_set *SET)'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`fd_set'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`int FD_SETSIZE'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`int F_DUPFD'
+-     `fcntl.h' (POSIX.1):  *Note Duplicating Descriptors::.
+-
+-`void FD_ZERO (fd_set *SET)'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`void feclearexcept (int EXCEPTS)'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`FE_DIVBYZERO'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`FE_DOWNWARD'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`void fegetenv (fenv_t *ENVP)'
+-     `fenv.h' (ISO):  *Note Control Functions::.
+-
+-`void fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`int fegetround (void)'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`int feholdexcept (fenv_t *ENVP)'
+-     `fenv.h' (ISO):  *Note Control Functions::.
+-
+-`FE_INEXACT'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`FE_INVALID'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`int feof (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note EOF and Errors::.
+-
+-`FE_OVERFLOW'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`int ferror (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note EOF and Errors::.
+-
+-`void fesetenv (const fenv_t *ENVP)'
+-     `fenv.h' (ISO):  *Note Control Functions::.
+-
+-`void fesetexceptflag (const fexcept_t *FLAGP, int'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`int fesetround (int ROUND)'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`int fetestexcept (int EXCEPTS)'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`FE_TONEAREST'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`FE_TOWARDZERO'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`FE_UNDERFLOW'
+-     `fenv.h' (ISO):  *Note Status bit operations::.
+-
+-`void feupdateenv (const fenv_t *ENVP)'
+-     `fenv.h' (ISO):  *Note Control Functions::.
+-
+-`FE_UPWARD'
+-     `fenv.h' (ISO):  *Note Rounding::.
+-
+-`int fflush (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Flushing Buffers::.
+-
+-`int fgetc (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Character Input::.
+-
+-`int F_GETFD'
+-     `fcntl.h' (POSIX.1):  *Note Descriptor Flags::.
+-
+-`int F_GETFL'
+-     `fcntl.h' (POSIX.1):  *Note Getting File Status Flags::.
+-
+-`struct group * fgetgrent (FILE *STREAM)'
+-     `grp.h' (SVID):  *Note Scanning All Groups::.
+-
+-`int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
+-     `grp.h' (GNU):  *Note Scanning All Groups::.
+-
+-`int F_GETLK'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`int F_GETOWN'
+-     `fcntl.h' (BSD):  *Note Interrupt Input::.
+-
+-`int fgetpos (FILE *STREAM, fpos_t *POSITION)'
+-     `stdio.h' (ISO):  *Note Portable Positioning::.
+-
+-`int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)'
+-     `stdio.h' (Unix98):  *Note Portable Positioning::.
+-
+-`struct passwd * fgetpwent (FILE *STREAM)'
+-     `pwd.h' (SVID):  *Note Scanning All Users::.
+-
+-`int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
+-     `pwd.h' (GNU):  *Note Scanning All Users::.
+-
+-`char * fgets (char *S, int COUNT, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Line Input::.
+-
+-`FILE'
+-     `stdio.h' (ISO):  *Note Streams::.
+-
+-`int FILENAME_MAX'
+-     `stdio.h' (ISO):  *Note Limits for Files::.
+-
+-`int fileno (FILE *STREAM)'
+-     `stdio.h' (POSIX.1):  *Note Descriptors and Streams::.
+-
+-`int finite (double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int finitef (float X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int finitel (long double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`double floor (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float floorf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double floorl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`FLT_DIG'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_EPSILON'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MANT_DIG'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MAX'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MAX_10_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MAX_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MIN'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MIN_10_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_MIN_EXP'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_RADIX'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`FLT_ROUNDS'
+-     `float.h' (ISO):  *Note Floating Point Parameters::.
+-
+-`tcflag_t FLUSHO'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`double fma (double X, double Y, double Z)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`float fmaf (float X, float Y, float Z)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`long double fmal (long double X, long double Y, long double Z)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`double fmax (double X, double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`float fmaxf (float X, float Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`long double fmaxl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`FILE * fmemopen (void *BUF, size_t SIZE, const char *OPENTYPE)'
+-     `stdio.h' (GNU):  *Note String Streams::.
+-
+-`double fmin (double X, double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`float fminf (float X, float Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`long double fminl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note Misc FP Arithmetic::.
+-
+-`double fmod (double NUMERATOR, double DENOMINATOR)'
+-     `math.h' (ISO):  *Note Remainder Functions::.
+-
+-`float fmodf (float NUMERATOR, float DENOMINATOR)'
+-     `math.h' (ISO):  *Note Remainder Functions::.
+-
+-`long double fmodl (long double NUMERATOR, long double DENOMINATOR)'
+-     `math.h' (ISO):  *Note Remainder Functions::.
+-
+-`int fmtmsg (long int CLASSIFICATION, const char *LABEL, int SEVERITY, const char *TEXT, const char *ACTION, const char *TAG)'
+-     `fmtmsg.h' (XPG):  *Note Printing Formatted Messages::.
+-
+-`int fnmatch (const char *PATTERN, const char *STRING, int FLAGS)'
+-     `fnmatch.h' (POSIX.2):  *Note Wildcard Matching::.
+-
+-`FNM_CASEFOLD'
+-     `fnmatch.h' (GNU):  *Note Wildcard Matching::.
+-
+-`FNM_FILE_NAME'
+-     `fnmatch.h' (GNU):  *Note Wildcard Matching::.
+-
+-`FNM_LEADING_DIR'
+-     `fnmatch.h' (GNU):  *Note Wildcard Matching::.
+-
+-`FNM_NOESCAPE'
+-     `fnmatch.h' (POSIX.2):  *Note Wildcard Matching::.
+-
+-`FNM_PATHNAME'
+-     `fnmatch.h' (POSIX.2):  *Note Wildcard Matching::.
+-
+-`FNM_PERIOD'
+-     `fnmatch.h' (POSIX.2):  *Note Wildcard Matching::.
+-
+-`int F_OK'
+-     `unistd.h' (POSIX.1):  *Note Testing File Access::.
+-
+-`FILE * fopen (const char *FILENAME, const char *OPENTYPE)'
+-     `stdio.h' (ISO):  *Note Opening Streams::.
+-
+-`FILE * fopen64 (const char *FILENAME, const char *OPENTYPE)'
+-     `stdio.h' (Unix98):  *Note Opening Streams::.
+-
+-`FILE * fopencookie (void *COOKIE, const char *OPENTYPE, cookie_io_functions_t IO-FUNCTIONS)'
+-     `stdio.h' (GNU):  *Note Streams and Cookies::.
+-
+-`int FOPEN_MAX'
+-     `stdio.h' (ISO):  *Note Opening Streams::.
+-
+-`pid_t fork (void)'
+-     `unistd.h' (POSIX.1):  *Note Creating a Process::.
+-
+-`int forkpty (int *AMASTER, char *NAME, struct termios *TERMP, struct winsize *WINP)'
+-     `pty.h' (BSD):  *Note Pseudo-Terminal Pairs::.
+-
+-`long int fpathconf (int FILEDES, int PARAMETER)'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`int fpclassify (*float-type* X)'
+-     `math.h' (ISO):  *Note Floating Point Classes::.
+-
+-`FPE_DECOVF_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTDIV_FAULT'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTDIV_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTOVF_FAULT'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTOVF_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTUND_FAULT'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_FLTUND_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_INTDIV_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_INTOVF_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`FPE_SUBRNG_TRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`int FP_ILOGB0'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int FP_ILOGBNAN'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`fpos64_t'
+-     `stdio.h' (Unix98):  *Note Portable Positioning::.
+-
+-`fpos_t'
+-     `stdio.h' (ISO):  *Note Portable Positioning::.
+-
+-`int fprintf (FILE *STREAM, const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Output Functions::.
+-
+-`int fputc (int C, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Simple Output::.
+-
+-`int fputs (const char *S, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Simple Output::.
+-
+-`F_RDLCK'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Block Input/Output::.
+-
+-`void free (void *PTR)'
+-     `malloc.h', `stdlib.h' (ISO):  *Note Freeing after Malloc::.
+-
+-`__free_hook'
+-     `malloc.h' (GNU):  *Note Hooks for Malloc::.
+-
+-`FILE * freopen (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Opening Streams::.
+-
+-`FILE * freopen64 (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)'
+-     `stdio.h' (Unix98):  *Note Opening Streams::.
+-
+-`double frexp (double VALUE, int *EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`float frexpf (float VALUE, int *EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`long double frexpl (long double VALUE, int *EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`int fscanf (FILE *STREAM, const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Input Functions::.
+-
+-`int fseek (FILE *STREAM, long int OFFSET, int WHENCE)'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`int fseeko (FILE *STREAM, off_t OFFSET, int WHENCE)'
+-     `stdio.h' (Unix98):  *Note File Positioning::.
+-
+-`int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE)'
+-     `stdio.h' (Unix98):  *Note File Positioning::.
+-
+-`int F_SETFD'
+-     `fcntl.h' (POSIX.1):  *Note Descriptor Flags::.
+-
+-`int F_SETFL'
+-     `fcntl.h' (POSIX.1):  *Note Getting File Status Flags::.
+-
+-`int F_SETLK'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`int F_SETLKW'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`int F_SETOWN'
+-     `fcntl.h' (BSD):  *Note Interrupt Input::.
+-
+-`int fsetpos (FILE *STREAM, const fpos_t *POSITION)'
+-     `stdio.h' (ISO):  *Note Portable Positioning::.
+-
+-`int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)'
+-     `stdio.h' (Unix98):  *Note Portable Positioning::.
+-
+-`int fstat (int FILEDES, struct stat *BUF)'
+-     `sys/stat.h' (POSIX.1):  *Note Reading Attributes::.
+-
+-`int fstat64 (int FILEDES, struct stat64 *BUF)'
+-     `sys/stat.h' (Unix98):  *Note Reading Attributes::.
+-
+-`int fsync (int FILDES)'
+-     `unistd.h' (POSIX):  *Note Synchronizing I/O::.
+-
+-`long int ftell (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`off_t ftello (FILE *STREAM)'
+-     `stdio.h' (Unix98):  *Note File Positioning::.
+-
+-`off64_t ftello64 (FILE *STREAM)'
+-     `stdio.h' (Unix98):  *Note File Positioning::.
+-
+-`int ftruncate (int FD, off_t LENGTH)'
+-     `unistd.h' (POSIX):  *Note Truncating Files::.
+-
+-`int ftruncate64 (int ID, off64_t LENGTH)'
+-     `unistd.h' (Unix98):  *Note Truncating Files::.
+-
+-`int ftw (const char *FILENAME, __ftw_func_t FUNC, int DESCRIPTORS)'
+-     `ftw.h' (SVID):  *Note Working on Directory Trees::.
+-
+-`int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int DESCRIPTORS)'
+-     `ftw.h' (Unix98):  *Note Working on Directory Trees::.
+-
+-`__ftw64_func_t'
+-     `ftw.h' (GNU):  *Note Working on Directory Trees::.
+-
+-`__ftw_func_t'
+-     `ftw.h' (GNU):  *Note Working on Directory Trees::.
+-
+-`F_UNLCK'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`size_t fwrite (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Block Input/Output::.
+-
+-`F_WRLCK'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`double gamma (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float gammaf (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double gammal (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`void (*gconv_end_fct) (struct gconv_step *)'
+-     `gconv.h' (GNU):  *Note glibc iconv Implementation::.
+-
+-`int (*gconv_fct) (struct gconv_step *, struct gconv_step_data *, const char **, const char *, size_t *, int)'
+-     `gconv.h' (GNU):  *Note glibc iconv Implementation::.
+-
+-`int (*gconv_init_fct) (struct gconv_step *)'
+-     `gconv.h' (GNU):  *Note glibc iconv Implementation::.
+-
+-`char * gcvt (double VALUE, int NDIGIT, char *BUF)'
+-     `stdlib.h' (SVID, Unix98):  *Note System V Number Conversion::.
+-
+-`int getc (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Character Input::.
+-
+-`int getchar (void)'
+-     `stdio.h' (ISO):  *Note Character Input::.
+-
+-`char * getcwd (char *BUFFER, size_t SIZE)'
+-     `unistd.h' (POSIX.1):  *Note Working Directory::.
+-
+-`struct tm * getdate (const char *STRING)'
+-     `time.h' (Unix98):  *Note General Time String Parsing::.
+-
+-`getdate_err'
+-     `time.h' (Unix98):  *Note General Time String Parsing::.
+-
+-`int getdate_r (const char *STRING, struct tm *TP)'
+-     `time.h' (GNU):  *Note General Time String Parsing::.
+-
+-`ssize_t getdelim (char **LINEPTR, size_t *N, int DELIMITER, FILE *STREAM)'
+-     `stdio.h' (GNU):  *Note Line Input::.
+-
+-`gid_t getegid (void)'
+-     `unistd.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`char * getenv (const char *NAME)'
+-     `stdlib.h' (ISO):  *Note Environment Access::.
+-
+-`uid_t geteuid (void)'
+-     `unistd.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`struct fstab * getfsent (void)'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct fstab * getfsfile (const char *NAME)'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct fstab * getfsspec (const char *NAME)'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`gid_t getgid (void)'
+-     `unistd.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`struct group * getgrent (void)'
+-     `grp.h' (SVID, BSD):  *Note Scanning All Groups::.
+-
+-`int getgrent_r (struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
+-     `grp.h' (GNU):  *Note Scanning All Groups::.
+-
+-`struct group * getgrgid (gid_t GID)'
+-     `grp.h' (POSIX.1):  *Note Lookup Group::.
+-
+-`int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
+-     `grp.h' (POSIX.1c):  *Note Lookup Group::.
+-
+-`struct group * getgrnam (const char *NAME)'
+-     `grp.h' (SVID, BSD):  *Note Lookup Group::.
+-
+-`int getgrnam_r (const char *NAME, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
+-     `grp.h' (POSIX.1c):  *Note Lookup Group::.
+-
+-`int getgroups (int COUNT, gid_t *GROUPS)'
+-     `unistd.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`struct hostent * gethostbyaddr (const char *ADDR, int LENGTH, int FORMAT)'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`int gethostbyaddr_r (const char *ADDR, int LENGTH, int FORMAT, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
+-     `netdb.h' (GNU):  *Note Host Names::.
+-
+-`struct hostent * gethostbyname (const char *NAME)'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`struct hostent * gethostbyname2 (const char *NAME, int AF)'
+-     `netdb.h' (IPv6 Basic API):  *Note Host Names::.
+-
+-`int gethostbyname2_r (const char *NAME, int AF, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
+-     `netdb.h' (GNU):  *Note Host Names::.
+-
+-`int gethostbyname_r (const char *restrict NAME, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
+-     `netdb.h' (GNU):  *Note Host Names::.
+-
+-`struct hostent * gethostent (void)'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`long int gethostid (void)'
+-     `unistd.h' (BSD):  *Note Host Identification::.
+-
+-`int gethostname (char *NAME, size_t SIZE)'
+-     `unistd.h' (BSD):  *Note Host Identification::.
+-
+-`int getitimer (int WHICH, struct itimerval *OLD)'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)'
+-     `stdio.h' (GNU):  *Note Line Input::.
+-
+-`char * getlogin (void)'
+-     `unistd.h' (POSIX.1):  *Note Who Logged In::.
+-
+-`struct mntent * getmntent (FILE *STREAM)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct mntent * getmntent_r (FILE *STREAM, struct mentent *RESULT, char *BUFFER, int BUFSIZE)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct netent * getnetbyaddr (unsigned long int NET, int TYPE)'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`struct netent * getnetbyname (const char *NAME)'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`struct netent * getnetent (void)'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`int getnetgrent (char **HOSTP, char **USERP, char **DOMAINP)'
+-     `netdb.h' (BSD):  *Note Lookup Netgroup::.
+-
+-`int getnetgrent_r (char **HOSTP, char **USERP, char **DOMAINP, char *BUFFER, int BUFLEN)'
+-     `netdb.h' (GNU):  *Note Lookup Netgroup::.
+-
+-`int getopt (int ARGC, char **ARGV, const char *OPTIONS)'
+-     `unistd.h' (POSIX.2):  *Note Using Getopt::.
+-
+-`int getopt_long (int ARGC, char **ARGV, const char *SHORTOPTS, struct option *LONGOPTS, int *INDEXPTR)'
+-     `getopt.h' (GNU):  *Note Getopt Long Options::.
+-
+-`char * getpass (const char * PROMPT)'
+-     `unistd.h' (BSD):  *Note getpass::.
+-
+-`int getpeername (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
+-     `sys/socket.h' (BSD):  *Note Who is Connected::.
+-
+-`int getpgid (pid_t PID)'
+-     `unistd.h' (SVID):  *Note Process Group Functions::.
+-
+-`pid_t getpgrp (pid_t PID)'
+-     `unistd.h' (BSD):  *Note Process Group Functions::.
+-
+-`pid_t getpgrp (void)'
+-     `unistd.h' (POSIX.1):  *Note Process Group Functions::.
+-
+-`pid_t getpid (void)'
+-     `unistd.h' (POSIX.1):  *Note Process Identification::.
+-
+-`pid_t getppid (void)'
+-     `unistd.h' (POSIX.1):  *Note Process Identification::.
+-
+-`int getpriority (int CLASS, int ID)'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`struct protoent * getprotobyname (const char *NAME)'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`struct protoent * getprotobynumber (int PROTOCOL)'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`struct protoent * getprotoent (void)'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`int getpt (void)'
+-     `stdlib.h' (GNU):  *Note Allocation::.
+-
+-`struct passwd * getpwent (void)'
+-     `pwd.h' (POSIX.1):  *Note Scanning All Users::.
+-
+-`int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER, int BUFLEN, struct passwd **RESULT)'
+-     `pwd.h' (GNU):  *Note Scanning All Users::.
+-
+-`struct passwd * getpwnam (const char *NAME)'
+-     `pwd.h' (POSIX.1):  *Note Lookup User::.
+-
+-`int getpwnam_r (const char *NAME, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
+-     `pwd.h' (POSIX.1c):  *Note Lookup User::.
+-
+-`struct passwd * getpwuid (uid_t UID)'
+-     `pwd.h' (POSIX.1):  *Note Lookup User::.
+-
+-`int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
+-     `pwd.h' (POSIX.1c):  *Note Lookup User::.
+-
+-`int getrlimit (int RESOURCE, struct rlimit *RLP)'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)'
+-     `sys/resource.h' (Unix98):  *Note Limits on Resources::.
+-
+-`int getrusage (int PROCESSES, struct rusage *RUSAGE)'
+-     `sys/resource.h' (BSD):  *Note Resource Usage::.
+-
+-`char * gets (char *S)'
+-     `stdio.h' (ISO):  *Note Line Input::.
+-
+-`struct servent * getservbyname (const char *NAME, const char *PROTO)'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`struct servent * getservbyport (int PORT, const char *PROTO)'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`struct servent * getservent (void)'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`pid_t getsid (pid_t PID)'
+-     `unistd.h' (SVID):  *Note Process Group Functions::.
+-
+-`int getsockname (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
+-     `sys/socket.h' (BSD):  *Note Reading Address::.
+-
+-`int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void *OPTVAL, socklen_t *OPTLEN-PTR)'
+-     `sys/socket.h' (BSD):  *Note Socket Option Functions::.
+-
+-`int getsubopt (char **OPTIONP, const char* const *TOKENS, char **VALUEP)'
+-     `stdlib.h' (stdlib.h):  *Note Suboptions Example: Suboptions.
+-
+-`int gettimeofday (struct timeval *TP, struct timezone *TZP)'
+-     `sys/time.h' (BSD):  *Note High-Resolution Calendar::.
+-
+-`uid_t getuid (void)'
+-     `unistd.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`mode_t getumask (void)'
+-     `sys/stat.h' (GNU):  *Note Setting Permissions::.
+-
+-`struct utmp * getutent (void)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)'
+-     `utmp.h' (GNU):  *Note Manipulating the Database::.
+-
+-`struct utmp * getutid (const struct utmp *ID)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`int getutid_r (const struct utmp *ID, struct utmp *BUFFER, struct utmp **RESULT)'
+-     `utmp.h' (GNU):  *Note Manipulating the Database::.
+-
+-`struct utmp * getutline (const struct utmp *LINE)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`int getutline_r (const struct utmp *LINE, struct utmp *BUFFER, struct utmp **RESULT)'
+-     `utmp.h' (GNU):  *Note Manipulating the Database::.
+-
+-`struct utmpx * getutxent (void)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`struct utmpx * getutxid (const struct utmpx *ID)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`struct utmpx * getutxline (const struct utmpx *LINE)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int getw (FILE *STREAM)'
+-     `stdio.h' (SVID):  *Note Character Input::.
+-
+-`char * getwd (char *BUFFER)'
+-     `unistd.h' (BSD):  *Note Working Directory::.
+-
+-`gid_t'
+-     `sys/types.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR)'
+-     `glob.h' (POSIX.2):  *Note Calling Glob::.
+-
+-`GLOB_ABORTED'
+-     `glob.h' (POSIX.2):  *Note Calling Glob::.
+-
+-`GLOB_ALTDIRFUNC'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_APPEND'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_BRACE'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_DOOFFS'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_ERR'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`void globfree (glob_t *PGLOB)'
+-     `glob.h' (POSIX.2):  *Note More Flags for Globbing::.
+-
+-`GLOB_MAGCHAR'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_MARK'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_NOCHECK'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_NOESCAPE'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_NOMAGIC'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_NOMATCH'
+-     `glob.h' (POSIX.2):  *Note Calling Glob::.
+-
+-`GLOB_NOSORT'
+-     `glob.h' (POSIX.2):  *Note Flags for Globbing::.
+-
+-`GLOB_NOSPACE'
+-     `glob.h' (POSIX.2):  *Note Calling Glob::.
+-
+-`GLOB_ONLYDIR'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_PERIOD'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`glob_t'
+-     `glob.h' (POSIX.2):  *Note Calling Glob::.
+-
+-`GLOB_TILDE'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`GLOB_TILDE_CHECK'
+-     `glob.h' (GNU):  *Note More Flags for Globbing::.
+-
+-`struct tm * gmtime (const time_t *TIME)'
+-     `time.h' (ISO):  *Note Broken-down Time::.
+-
+-`struct tm * gmtime_r (const time_t *TIME, struct tm *RESULTP)'
+-     `time.h' (POSIX.1c):  *Note Broken-down Time::.
+-
+-`_GNU_SOURCE'
+-     (GNU):  *Note Feature Test Macros::.
+-
+-`int grantpt (int FILEDES)'
+-     `stdlib.h' (SVID, XPG4.2):  *Note Allocation::.
+-
+-`int gsignal (int SIGNUM)'
+-     `signal.h' (SVID):  *Note Signaling Yourself::.
+-
+-`char * hasmntopt (const struct mntent *MNT, const char *OPT)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`int hcreate (size_t NEL)'
+-     `search.h' (SVID):  *Note Hash Search Function::.
+-
+-`int hcreate_r (size_t NEL, struct hsearch_data *HTAB)'
+-     `search.h' (GNU):  *Note Hash Search Function::.
+-
+-`void hdestroy (void)'
+-     `search.h' (SVID):  *Note Hash Search Function::.
+-
+-`void hdestroy_r (struct hsearch_data *HTAB)'
+-     `search.h' (GNU):  *Note Hash Search Function::.
+-
+-`HOST_NOT_FOUND'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`ENTRY * hsearch (ENTRY ITEM, ACTION ACTION)'
+-     `search.h' (SVID):  *Note Hash Search Function::.
+-
+-`int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL, struct hsearch_data *HTAB)'
+-     `search.h' (GNU):  *Note Hash Search Function::.
+-
+-`uint32_t htonl (uint32_t HOSTLONG)'
+-     `netinet/in.h' (BSD):  *Note Byte Order::.
+-
+-`uint16_t htons (uint16_t HOSTSHORT)'
+-     `netinet/in.h' (BSD):  *Note Byte Order::.
+-
+-`double HUGE_VAL'
+-     `math.h' (ISO):  *Note Math Error Reporting::.
+-
+-`float HUGE_VALF'
+-     `math.h' (ISO):  *Note Math Error Reporting::.
+-
+-`long double HUGE_VALL'
+-     `math.h' (ISO):  *Note Math Error Reporting::.
+-
+-`tcflag_t HUPCL'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`double hypot (double X, double Y)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float hypotf (float X, float Y)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double hypotl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`tcflag_t ICANON'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`size_t iconv (iconv_t CD, const char **INBUF, size_t *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)'
+-     `iconv.h' (XPG2):  *Note Generic Conversion Interface::.
+-
+-`int iconv_close (iconv_t CD)'
+-     `iconv.h' (XPG2):  *Note Generic Conversion Interface::.
+-
+-`iconv_t iconv_open (const char *TOCODE, const char *FROMCODE)'
+-     `iconv.h' (XPG2):  *Note Generic Conversion Interface::.
+-
+-`iconv_t'
+-     `iconv.h' (XPG2):  *Note Generic Conversion Interface::.
+-
+-`tcflag_t ICRNL'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`tcflag_t IEXTEN'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`void if_freenameindex (struct if_nameindex *ptr)'
+-     `net/if.h' (IPv6 basic API):  *Note Interface Naming::.
+-
+-`char * if_indextoname (unsigned int ifindex, char *ifname)'
+-     `net/if.h' (IPv6 basic API):  *Note Interface Naming::.
+-
+-`struct if_nameindex * if_nameindex (void)'
+-     `net/if.h' (IPv6 basic API):  *Note Interface Naming::.
+-
+-`unsigned int if_nametoindex (const char *ifname)'
+-     `net/if.h' (IPv6 basic API):  *Note Interface Naming::.
+-
+-`size_t IFNAMSIZ'
+-     `net/if.h' (net/if.h):  *Note Interface Naming::.
+-
+-`tcflag_t IGNBRK'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`tcflag_t IGNCR'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`tcflag_t IGNPAR'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`int ilogb (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int ilogbf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int ilogbl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`intmax_t imaxabs (intmax_t NUMBER)'
+-     `inttypes.h' (ISO):  *Note Absolute Value::.
+-
+-`tcflag_t IMAXBEL'
+-     `termios.h' (BSD):  *Note Input Modes::.
+-
+-`imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t DENOMINATOR)'
+-     `inttypes.h' (ISO):  *Note Integer Division::.
+-
+-`imaxdiv_t'
+-     `inttypes.h' (ISO):  *Note Integer Division::.
+-
+-`struct in6_addr in6addr_any'
+-     `netinet/in.h' (IPv6 basic API):  *Note Host Address Data Type::.
+-
+-`struct in6_addr in6addr_loopback'
+-     `netinet/in.h' (IPv6 basic API):  *Note Host Address Data Type::.
+-
+-`uint32_t INADDR_ANY'
+-     `netinet/in.h' (BSD):  *Note Host Address Data Type::.
+-
+-`uint32_t INADDR_BROADCAST'
+-     `netinet/in.h' (BSD):  *Note Host Address Data Type::.
+-
+-`uint32_t INADDR_LOOPBACK'
+-     `netinet/in.h' (BSD):  *Note Host Address Data Type::.
+-
+-`uint32_t INADDR_NONE'
+-     `netinet/in.h' (BSD):  *Note Host Address Data Type::.
+-
+-`char * index (const char *STRING, int C)'
+-     `string.h' (BSD):  *Note Search Functions::.
+-
+-`uint32_t inet_addr (const char *NAME)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`int inet_aton (const char *NAME, struct in_addr *ADDR)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`uint32_t inet_lnaof (struct in_addr ADDR)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`struct in_addr inet_makeaddr (uint32_t NET, uint32_t LOCAL)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`uint32_t inet_netof (struct in_addr ADDR)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`uint32_t inet_network (const char *NAME)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`char * inet_ntoa (struct in_addr ADDR)'
+-     `arpa/inet.h' (BSD):  *Note Host Address Functions::.
+-
+-`const char * inet_ntop (int AF, const void *CP, char *BUF, size_t LEN)'
+-     `arpa/inet.h' (IPv6 basic API):  *Note Host Address Functions::.
+-
+-`int inet_pton (int AF, const char *CP, void *BUF)'
+-     `arpa/inet.h' (IPv6 basic API):  *Note Host Address Functions::.
+-
+-`float INFINITY'
+-     `math.h' (ISO):  *Note Infinity and NaN::.
+-
+-`double infnan (int ERROR)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int initgroups (const char *USER, gid_t GID)'
+-     `grp.h' (BSD):  *Note Setting Groups::.
+-
+-`INIT_PROCESS'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`INIT_PROCESS'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`void * initstate (unsigned int SEED, void *STATE, size_t SIZE)'
+-     `stdlib.h' (BSD):  *Note BSD Random::.
+-
+-`tcflag_t INLCR'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`int innetgr (const char *NETGROUP, const char *HOST, const char *USER, const char *DOMAIN)'
+-     `netdb.h' (BSD):  *Note Netgroup Membership::.
+-
+-`ino64_t'
+-     `sys/types.h' (Unix98):  *Note Attribute Meanings::.
+-
+-`ino_t'
+-     `sys/types.h' (POSIX.1):  *Note Attribute Meanings::.
+-
+-`tcflag_t INPCK'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`INT_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`INT_MIN'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`int _IOFBF'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`int _IOLBF'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`int _IONBF'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`int IPPORT_RESERVED'
+-     `netinet/in.h' (BSD):  *Note Ports::.
+-
+-`int IPPORT_USERRESERVED'
+-     `netinet/in.h' (BSD):  *Note Ports::.
+-
+-`int isalnum (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isalpha (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isascii (int C)'
+-     `ctype.h' (SVID, BSD):  *Note Classification of Characters::.
+-
+-`int isatty (int FILEDES)'
+-     `unistd.h' (POSIX.1):  *Note Is It a Terminal::.
+-
+-`int isblank (int C)'
+-     `ctype.h' (GNU):  *Note Classification of Characters::.
+-
+-`int iscntrl (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isdigit (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isfinite (*float-type* X)'
+-     `math.h' (ISO):  *Note Floating Point Classes::.
+-
+-`int isgraph (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isgreater (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`int isgreaterequal (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`tcflag_t ISIG'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`int isinf (double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isinff (float X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isinfl (long double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isless (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`int islessequal (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`int islessgreater (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`int islower (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isnan (*float-type* X)'
+-     `math.h' (ISO):  *Note Floating Point Classes::.
+-
+-`int isnan (double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isnanf (float X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isnanl (long double X)'
+-     `math.h' (BSD):  *Note Floating Point Classes::.
+-
+-`int isnormal (*float-type* X)'
+-     `math.h' (ISO):  *Note Floating Point Classes::.
+-
+-`int isprint (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int ispunct (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int isspace (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`tcflag_t ISTRIP'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`int isunordered (*real-floating* X, *real-floating* Y)'
+-     `math.h' (ISO):  *Note FP Comparison Functions::.
+-
+-`int isupper (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`int iswalnum (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswalpha (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswblank (wint_t WC)'
+-     `wctype.h' (GNU):  *Note Classification of Wide Characters::.
+-
+-`int iswcntrl (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswctype (wint_t WC, wctype_t DESC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswdigit (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswgraph (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswlower (wint_t WC)'
+-     `ctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswprint (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswpunct (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswspace (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswupper (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int iswxdigit (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`int isxdigit (int C)'
+-     `ctype.h' (ISO):  *Note Classification of Characters::.
+-
+-`ITIMER_PROF'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`ITIMER_REAL'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`ITIMER_VIRTUAL'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`tcflag_t IXANY'
+-     `termios.h' (BSD):  *Note Input Modes::.
+-
+-`tcflag_t IXOFF'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`tcflag_t IXON'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`double j0 (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float j0f (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double j0l (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`double j1 (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float j1f (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double j1l (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`jmp_buf'
+-     `setjmp.h' (ISO):  *Note Non-Local Details::.
+-
+-`double jn (int n, double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float jnf (int n, float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double jnl (int n, long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long int jrand48 (unsigned short int XSUBI[3])'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int jrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int kill (pid_t PID, int SIGNUM)'
+-     `signal.h' (POSIX.1):  *Note Signaling Another Process::.
+-
+-`int killpg (int PGID, int SIGNUM)'
+-     `signal.h' (BSD):  *Note Signaling Another Process::.
+-
+-`char * l64a (long int N)'
+-     `stdlib.h' (XPG):  *Note Encode Binary Data::.
+-
+-`long int labs (long int NUMBER)'
+-     `stdlib.h' (ISO):  *Note Absolute Value::.
+-
+-`LANG'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`LC_ALL'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`LC_COLLATE'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`LC_CTYPE'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`LC_MESSAGES'
+-     `locale.h' (XOPEN):  *Note Locale Categories::.
+-
+-`LC_MONETARY'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`LC_NUMERIC'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`void lcong48 (unsigned short int PARAM[7])'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int lcong48_r (unsigned short int PARAM[7], struct drand48_data *BUFFER)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int L_ctermid'
+-     `stdio.h' (POSIX.1):  *Note Identifying the Terminal::.
+-
+-`LC_TIME'
+-     `locale.h' (ISO):  *Note Locale Categories::.
+-
+-`int L_cuserid'
+-     `stdio.h' (POSIX.1):  *Note Who Logged In::.
+-
+-`double ldexp (double VALUE, int EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`float ldexpf (float VALUE, int EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`long double ldexpl (long double VALUE, int EXPONENT)'
+-     `math.h' (ISO):  *Note Normalization Functions::.
+-
+-`ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`ldiv_t'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`void * lfind (const void *KEY, void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)'
+-     `search.h' (SVID):  *Note Array Search Function::.
+-
+-`double lgamma (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float lgammaf (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float lgammaf_r (float X, int *SIGNP)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`long double lgammal (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double lgammal_r (long double X, int *SIGNP)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`double lgamma_r (double X, int *SIGNP)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`L_INCR'
+-     `sys/file.h' (BSD):  *Note File Positioning::.
+-
+-`int LINE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Limits::.
+-
+-`int link (const char *OLDNAME, const char *NEWNAME)'
+-     `unistd.h' (POSIX.1):  *Note Hard Links::.
+-
+-`int LINK_MAX'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`int lio_listio (int MODE, struct aiocb *const LIST[], int NENT, struct sigevent *SIG)'
+-     `aio.h' (POSIX.1b):  *Note Asynchronous Reads/Writes::.
+-
+-`int lio_listio64 (int MODE, struct aiocb *const LIST, int NENT, struct sigevent *SIG)'
+-     `aio.h' (Unix98):  *Note Asynchronous Reads/Writes::.
+-
+-`int listen (int SOCKET, unsigned int N)'
+-     `sys/socket.h' (BSD):  *Note Listening::.
+-
+-`long long int llabs (long long int NUMBER)'
+-     `stdlib.h' (ISO):  *Note Absolute Value::.
+-
+-`lldiv_t lldiv (long long int NUMERATOR, long long int DENOMINATOR)'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`lldiv_t'
+-     `stdlib.h' (ISO):  *Note Integer Division::.
+-
+-`long long int llrint (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long long int llrintf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long long int llrintl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long long int llround (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long long int llroundf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long long int llroundl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`struct lconv * localeconv (void)'
+-     `locale.h' (ISO):  *Note The Lame Way to Locale Data::.
+-
+-`struct tm * localtime (const time_t *TIME)'
+-     `time.h' (ISO):  *Note Broken-down Time::.
+-
+-`struct tm * localtime_r (const time_t *TIME, struct tm *RESULTP)'
+-     `time.h' (POSIX.1c):  *Note Broken-down Time::.
+-
+-`double log (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double log10 (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float log10f (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double log10l (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double log1p (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float log1pf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double log1pl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double log2 (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float log2f (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double log2l (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double logb (double X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`double logb (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float logbf (float X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`float logbf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double logbl (long double X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long double logbl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float logf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`void login (const struct utmp *ENTRY)'
+-     `utmp.h' (BSD):  *Note Logging In and Out::.
+-
+-`LOGIN_PROCESS'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`LOGIN_PROCESS'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int login_tty (int FILEDES)'
+-     `utmp.h' (BSD):  *Note Logging In and Out::.
+-
+-`long double logl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`int logout (const char *UT_LINE)'
+-     `utmp.h' (BSD):  *Note Logging In and Out::.
+-
+-`void logwtmp (const char *UT_LINE, const char *UT_NAME, const char *UT_HOST)'
+-     `utmp.h' (BSD):  *Note Logging In and Out::.
+-
+-`void longjmp (jmp_buf STATE, int VALUE)'
+-     `setjmp.h' (ISO):  *Note Non-Local Details::.
+-
+-`LONG_LONG_MAX'
+-     `limits.h' (GNU):  *Note Range of Type::.
+-
+-`LONG_LONG_MIN'
+-     `limits.h' (GNU):  *Note Range of Type::.
+-
+-`LONG_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`LONG_MIN'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`long int lrand48 (void)'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int lrand48_r (struct drand48_data *BUFFER, double *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`long int lrint (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int lrintf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int lrintl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int lround (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int lroundf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int lroundl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`void * lsearch (const void *KEY, void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)'
+-     `search.h' (SVID):  *Note Array Search Function::.
+-
+-`off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)'
+-     `unistd.h' (POSIX.1):  *Note File Position Primitive::.
+-
+-`off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)'
+-     `unistd.h' (Unix98):  *Note File Position Primitive::.
+-
+-`L_SET'
+-     `sys/file.h' (BSD):  *Note File Positioning::.
+-
+-`int lstat (const char *FILENAME, struct stat *BUF)'
+-     `sys/stat.h' (BSD):  *Note Reading Attributes::.
+-
+-`int lstat64 (const char *FILENAME, struct stat64 *BUF)'
+-     `sys/stat.h' (Unix98):  *Note Reading Attributes::.
+-
+-`int L_tmpnam'
+-     `stdio.h' (ISO):  *Note Temporary Files::.
+-
+-`L_XTND'
+-     `sys/file.h' (BSD):  *Note File Positioning::.
+-
+-`struct mallinfo mallinfo (void)'
+-     `malloc.h' (SVID):  *Note Statistics of Malloc::.
+-
+-`void * malloc (size_t SIZE)'
+-     `malloc.h', `stdlib.h' (ISO):  *Note Basic Allocation::.
+-
+-`__malloc_hook'
+-     `malloc.h' (GNU):  *Note Hooks for Malloc::.
+-
+-`int MAX_CANON'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`int MAX_INPUT'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`int MAXNAMLEN'
+-     `dirent.h' (BSD):  *Note Limits for Files::.
+-
+-`int MB_CUR_MAX'
+-     `stdlib.h' (ISO):  *Note Selecting the Conversion::.
+-
+-`int mblen (const char *STRING, size_t SIZE)'
+-     `stdlib.h' (ISO):  *Note Non-reentrant Character Conversion::.
+-
+-`int MB_LEN_MAX'
+-     `limits.h' (ISO):  *Note Selecting the Conversion::.
+-
+-`size_t mbrlen (const char *restrict S, size_t N, mbstate_t *PS)'
+-     `wchar.h' (ISO):  *Note Converting a Character::.
+-
+-`size_t mbrtowc (wchar_t *restrict PWC, const char *restrict S, size_t N, mbstate_t *restrict PS)'
+-     `wchar.h' (ISO):  *Note Converting a Character::.
+-
+-`int mbsinit (const mbstate_t *PS)'
+-     `wchar.h' (ISO):  *Note Keeping the state::.
+-
+-`size_t mbsnrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict PS)'
+-     `wchar.h' (GNU):  *Note Converting Strings::.
+-
+-`size_t mbsrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t LEN, mbstate_t *restrict PS)'
+-     `wchar.h' (ISO):  *Note Converting Strings::.
+-
+-`mbstate_t'
+-     `wchar.h' (ISO):  *Note Keeping the state::.
+-
+-`size_t mbstowcs (wchar_t *WSTRING, const char *STRING, size_t SIZE)'
+-     `stdlib.h' (ISO):  *Note Non-reentrant String Conversion::.
+-
+-`int mbtowc (wchar_t *restrict RESULT, const char *restrict STRING, size_t SIZE)'
+-     `stdlib.h' (ISO):  *Note Non-reentrant Character Conversion::.
+-
+-`int mcheck (void (*ABORTFN) (enum mcheck_status STATUS))'
+-     `mcheck.h' (GNU):  *Note Heap Consistency Checking::.
+-
+-`tcflag_t MDMBUF'
+-     `termios.h' (BSD):  *Note Control Modes::.
+-
+-`void * memalign (size_t BOUNDARY, size_t SIZE)'
+-     `malloc.h', `stdlib.h' (BSD):  *Note Aligned Memory Blocks::.
+-
+-`__memalign_hook'
+-     `malloc.h' (GNU):  *Note Hooks for Malloc::.
+-
+-`void * memccpy (void *TO, const void *FROM, int C, size_t SIZE)'
+-     `string.h' (SVID):  *Note Copying and Concatenation::.
+-
+-`void * memchr (const void *BLOCK, int C, size_t SIZE)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`int memcmp (const void *A1, const void *A2, size_t SIZE)'
+-     `string.h' (ISO):  *Note String/Array Comparison::.
+-
+-`void * memcpy (void *TO, const void *FROM, size_t SIZE)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN,
+-     const void *NEEDLE, size_t NEEDLE-LEN)'
+-     `string.h' (GNU):  *Note Search Functions::.
+-
+-`void * memmove (void *TO, const void *FROM, size_t SIZE)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`void * mempcpy (void *TO, const void *FROM, size_t SIZE)'
+-     `string.h' (GNU):  *Note Copying and Concatenation::.
+-
+-`void * memset (void *BLOCK, int C, size_t SIZE)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`int mkdir (const char *FILENAME, mode_t MODE)'
+-     `sys/stat.h' (POSIX.1):  *Note Creating Directories::.
+-
+-`int mkfifo (const char *FILENAME, mode_t MODE)'
+-     `sys/stat.h' (POSIX.1):  *Note FIFO Special Files::.
+-
+-`int mknod (const char *FILENAME, int MODE, int DEV)'
+-     `sys/stat.h' (BSD):  *Note Making Special Files::.
+-
+-`int mkstemp (char *TEMPLATE)'
+-     `stdlib.h' (BSD):  *Note Temporary Files::.
+-
+-`char * mktemp (char *TEMPLATE)'
+-     `stdlib.h' (Unix):  *Note Temporary Files::.
+-
+-`time_t mktime (struct tm *BROKENTIME)'
+-     `time.h' (ISO):  *Note Broken-down Time::.
+-
+-`mode_t'
+-     `sys/types.h' (POSIX.1):  *Note Attribute Meanings::.
+-
+-`double modf (double VALUE, double *INTEGER-PART)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float modff (float VALUE, float *INTEGER-PART)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double modfl (long double VALUE, long double *INTEGER-PART)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long int mrand48 (void)'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int mrand48_r (struct drand48_data *BUFFER, double *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int MSG_DONTROUTE'
+-     `sys/socket.h' (BSD):  *Note Socket Data Options::.
+-
+-`int MSG_OOB'
+-     `sys/socket.h' (BSD):  *Note Socket Data Options::.
+-
+-`int MSG_PEEK'
+-     `sys/socket.h' (BSD):  *Note Socket Data Options::.
+-
+-`void mtrace (void)'
+-     `mcheck.h' (GNU):  *Note Tracing malloc::.
+-
+-`void muntrace (void)'
+-     `mcheck.h' (GNU):  *Note Tracing malloc::.
+-
+-`int NAME_MAX'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`float NAN'
+-     `math.h' (GNU):  *Note Infinity and NaN::.
+-
+-`double nan (const char *TAGP)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`float nanf (const char *TAGP)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`long double nanl (const char *TAGP)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`int nanosleep (const struct timespec *REQUESTED_TIME, struct timespec *REMAINING)'
+-     `time.h' (POSIX.1):  *Note Sleeping::.
+-
+-`int NCCS'
+-     `termios.h' (POSIX.1):  *Note Mode Data Types::.
+-
+-`double nearbyint (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float nearbyintf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double nearbyintl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`NEW_TIME'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`NEW_TIME'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`double nextafter (double X, double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`float nextafterf (float X, float Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`long double nextafterl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`double nexttoward (double X, long double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`float nexttowardf (float X, long double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`long double nexttowardl (long double X, long double Y)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`int nftw (const char *FILENAME, __nftw_func_t FUNC, int DESCRIPTORS, int FLAG)'
+-     `ftw.h' (XPG4.2):  *Note Working on Directory Trees::.
+-
+-`int nftw64 (const char *FILENAME, __nftw64_func_t FUNC, int DESCRIPTORS, int FLAG)'
+-     `ftw.h' (Unix98):  *Note Working on Directory Trees::.
+-
+-`__nftw64_func_t'
+-     `ftw.h' (GNU):  *Note Working on Directory Trees::.
+-
+-`__nftw_func_t'
+-     `ftw.h' (GNU):  *Note Working on Directory Trees::.
+-
+-`int NGROUPS_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`int nice (int INCREMENT)'
+-     `dunno.h' (dunno.h):  *Note Priority::.
+-
+-`nlink_t'
+-     `sys/types.h' (POSIX.1):  *Note Attribute Meanings::.
+-
+-`char * nl_langinfo (nl_item ITEM)'
+-     `langinfo.h' (XOPEN):  *Note The Elegant and Fast Way::.
+-
+-`NO_ADDRESS'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`tcflag_t NOFLSH'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`tcflag_t NOKERNINFO'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`NO_RECOVERY'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`long int nrand48 (unsigned short int XSUBI[3])'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int nrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int NSIG'
+-     `signal.h' (BSD):  *Note Standard Signals::.
+-
+-`uint32_t ntohl (uint32_t NETLONG)'
+-     `netinet/in.h' (BSD):  *Note Byte Order::.
+-
+-`uint16_t ntohs (uint16_t NETSHORT)'
+-     `netinet/in.h' (BSD):  *Note Byte Order::.
+-
+-`int ntp_adjtime (struct timex *TPTR)'
+-     `sys/timex.h' (GNU):  *Note Precision Time::.
+-
+-`void * NULL'
+-     `stddef.h' (ISO):  *Note Null Pointer Constant::.
+-
+-`int O_ACCMODE'
+-     `fcntl.h' (POSIX.1):  *Note Access Modes::.
+-
+-`int O_APPEND'
+-     `fcntl.h' (POSIX.1):  *Note Operating Modes::.
+-
+-`int O_ASYNC'
+-     `fcntl.h' (BSD):  *Note Operating Modes::.
+-
+-`void obstack_1grow (struct obstack *OBSTACK-PTR, char C)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char C)'
+-     `obstack.h' (GNU):  *Note Extra Fast Growing::.
+-
+-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Obstacks Data Alignment::.
+-
+-`void * obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)'
+-     `obstack.h' (GNU):  *Note Allocation in an Obstack::.
+-
+-`obstack_alloc_failed_handler'
+-     `obstack.h' (GNU):  *Note Preparing for Obstacks::.
+-
+-`void * obstack_base (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Status of an Obstack::.
+-
+-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)'
+-     `obstack.h' (GNU):  *Note Extra Fast Growing::.
+-
+-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Obstack Chunks::.
+-
+-`void * obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     `obstack.h' (GNU):  *Note Allocation in an Obstack::.
+-
+-`void * obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+-     `obstack.h' (GNU):  *Note Allocation in an Obstack::.
+-
+-`void * obstack_finish (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)'
+-     `obstack.h' (GNU):  *Note Freeing Obstack Objects::.
+-
+-`void obstack_grow (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`int obstack_init (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Preparing for Obstacks::.
+-
+-`void obstack_int_grow (struct obstack *OBSTACK-PTR, int DATA)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_int_grow_fast (struct obstack *OBSTACK-PTR, int DATA)'
+-     `obstack.h' (GNU):  *Note Extra Fast Growing::.
+-
+-`void * obstack_next_free (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Status of an Obstack::.
+-
+-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Status of an Obstack::.
+-
+-`int obstack_printf (struct obstack *OBSTACK, const char *TEMPLATE, ...)'
+-     `stdio.h' (GNU):  *Note Dynamic Output::.
+-
+-`void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void *DATA)'
+-     `obstack.h' (GNU):  *Note Growing Objects::.
+-
+-`void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR, void *DATA)'
+-     `obstack.h' (GNU):  *Note Extra Fast Growing::.
+-
+-`int obstack_room (struct obstack *OBSTACK-PTR)'
+-     `obstack.h' (GNU):  *Note Extra Fast Growing::.
+-
+-`int obstack_vprintf (struct obstack *OBSTACK, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Output::.
+-
+-`int O_CREAT'
+-     `fcntl.h' (POSIX.1):  *Note Open-time Flags::.
+-
+-`int O_EXCL'
+-     `fcntl.h' (POSIX.1):  *Note Open-time Flags::.
+-
+-`int O_EXEC'
+-     `fcntl.h' (GNU):  *Note Access Modes::.
+-
+-`int O_EXLOCK'
+-     `fcntl.h' (BSD):  *Note Open-time Flags::.
+-
+-`off64_t'
+-     `sys/types.h' (Unix98):  *Note File Position Primitive::.
+-
+-`size_t offsetof (TYPE, MEMBER)'
+-     `stddef.h' (ISO):  *Note Structure Measurement::.
+-
+-`off_t'
+-     `sys/types.h' (POSIX.1):  *Note File Position Primitive::.
+-
+-`int O_FSYNC'
+-     `fcntl.h' (BSD):  *Note Operating Modes::.
+-
+-`int O_IGNORE_CTTY'
+-     `fcntl.h' (GNU):  *Note Open-time Flags::.
+-
+-`OLD_TIME'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`OLD_TIME'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int O_NDELAY'
+-     `fcntl.h' (BSD):  *Note Operating Modes::.
+-
+-`int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void *ARG)'
+-     `stdlib.h' (SunOS):  *Note Cleanups on Exit::.
+-
+-`tcflag_t ONLCR'
+-     `termios.h' (BSD):  *Note Output Modes::.
+-
+-`int O_NOATIME'
+-     `fcntl.h' (GNU):  *Note Operating Modes::.
+-
+-`int O_NOCTTY'
+-     `fcntl.h' (POSIX.1):  *Note Open-time Flags::.
+-
+-`tcflag_t ONOEOT'
+-     `termios.h' (BSD):  *Note Output Modes::.
+-
+-`int O_NOLINK'
+-     `fcntl.h' (GNU):  *Note Open-time Flags::.
+-
+-`int O_NONBLOCK'
+-     `fcntl.h' (POSIX.1):  *Note Open-time Flags::.
+-
+-`int O_NONBLOCK'
+-     `fcntl.h' (POSIX.1):  *Note Operating Modes::.
+-
+-`int O_NOTRANS'
+-     `fcntl.h' (GNU):  *Note Open-time Flags::.
+-
+-`int open (const char *FILENAME, int FLAGS[, mode_t MODE])'
+-     `fcntl.h' (POSIX.1):  *Note Opening and Closing Files::.
+-
+-`int open64 (const char *FILENAME, int FLAGS[, mode_t MODE])'
+-     `fcntl.h' (Unix98):  *Note Opening and Closing Files::.
+-
+-`DIR * opendir (const char *DIRNAME)'
+-     `dirent.h' (POSIX.1):  *Note Opening a Directory::.
+-
+-`int OPEN_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`FILE * open_memstream (char **PTR, size_t *SIZELOC)'
+-     `stdio.h' (GNU):  *Note String Streams::.
+-
+-`FILE * open_obstack_stream (struct obstack *OBSTACK)'
+-     `stdio.h' (GNU):  *Note Obstack Streams::.
+-
+-`int openpty (int *AMASTER, int *ASLAVE, char *NAME, struct termios *TERMP, struct winsize *WINP)'
+-     `pty.h' (BSD):  *Note Pseudo-Terminal Pairs::.
+-
+-`tcflag_t OPOST'
+-     `termios.h' (POSIX.1):  *Note Output Modes::.
+-
+-`char * optarg'
+-     `unistd.h' (POSIX.2):  *Note Using Getopt::.
+-
+-`int opterr'
+-     `unistd.h' (POSIX.2):  *Note Using Getopt::.
+-
+-`int optind'
+-     `unistd.h' (POSIX.2):  *Note Using Getopt::.
+-
+-`OPTION_ALIAS'
+-     `argp.h' (GNU):  *Note Argp Option Flags::.
+-
+-`OPTION_ARG_OPTIONAL'
+-     `argp.h' (GNU):  *Note Argp Option Flags::.
+-
+-`OPTION_DOC'
+-     `argp.h' (GNU):  *Note Argp Option Flags::.
+-
+-`OPTION_HIDDEN'
+-     `argp.h' (GNU):  *Note Argp Option Flags::.
+-
+-`OPTION_NO_USAGE'
+-     `argp.h' (GNU):  *Note Argp Option Flags::.
+-
+-`int optopt'
+-     `unistd.h' (POSIX.2):  *Note Using Getopt::.
+-
+-`int O_RDONLY'
+-     `fcntl.h' (POSIX.1):  *Note Access Modes::.
+-
+-`int O_RDWR'
+-     `fcntl.h' (POSIX.1):  *Note Access Modes::.
+-
+-`int O_READ'
+-     `fcntl.h' (GNU):  *Note Access Modes::.
+-
+-`int O_SHLOCK'
+-     `fcntl.h' (BSD):  *Note Open-time Flags::.
+-
+-`int O_SYNC'
+-     `fcntl.h' (BSD):  *Note Operating Modes::.
+-
+-`int O_TRUNC'
+-     `fcntl.h' (POSIX.1):  *Note Open-time Flags::.
+-
+-`int O_WRITE'
+-     `fcntl.h' (GNU):  *Note Access Modes::.
+-
+-`int O_WRONLY'
+-     `fcntl.h' (POSIX.1):  *Note Access Modes::.
+-
+-`tcflag_t OXTABS'
+-     `termios.h' (BSD):  *Note Output Modes::.
+-
+-`PA_CHAR'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_DOUBLE'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLAG_LONG'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLAG_LONG_DOUBLE'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLAG_LONG_LONG'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`int PA_FLAG_MASK'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLAG_PTR'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLAG_SHORT'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_FLOAT'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_INT'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_LAST'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_POINTER'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`tcflag_t PARENB'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`tcflag_t PARMRK'
+-     `termios.h' (POSIX.1):  *Note Input Modes::.
+-
+-`tcflag_t PARODD'
+-     `termios.h' (POSIX.1):  *Note Control Modes::.
+-
+-`size_t parse_printf_format (const char *TEMPLATE, size_t N, int *ARGTYPES)'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`PA_STRING'
+-     `printf.h' (GNU):  *Note Parsing a Template String::.
+-
+-`long int pathconf (const char *FILENAME, int PARAMETER)'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`int PATH_MAX'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`int pause ()'
+-     `unistd.h' (POSIX.1):  *Note Using Pause::.
+-
+-`_PC_ASYNC_IO'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_CHOWN_RESTRICTED'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_LINK_MAX'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`int pclose (FILE *STREAM)'
+-     `stdio.h' (POSIX.2, SVID, BSD):  *Note Pipe to a Subprocess::.
+-
+-`_PC_MAX_CANON'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_MAX_INPUT'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_NAME_MAX'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_NO_TRUNC'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_PATH_MAX'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_PIPE_BUF'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_PRIO_IO'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_SOCK_MAXBUF'
+-     `unistd.h' (POSIX.1g):  *Note Pathconf::.
+-
+-`_PC_SYNC_IO'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`_PC_VDISABLE'
+-     `unistd.h' (POSIX.1):  *Note Pathconf::.
+-
+-`tcflag_t PENDIN'
+-     `termios.h' (BSD):  *Note Local Modes::.
+-
+-`void perror (const char *MESSAGE)'
+-     `stdio.h' (ISO):  *Note Error Messages::.
+-
+-`int PF_FILE'
+-     `sys/socket.h' (GNU):  *Note Local Namespace Details::.
+-
+-`int PF_INET'
+-     `sys/socket.h' (BSD):  *Note Internet Namespace::.
+-
+-`int PF_LOCAL'
+-     `sys/socket.h' (POSIX):  *Note Local Namespace Details::.
+-
+-`int PF_UNIX'
+-     `sys/socket.h' (BSD):  *Note Local Namespace Details::.
+-
+-`pid_t'
+-     `sys/types.h' (POSIX.1):  *Note Process Identification::.
+-
+-`int pipe (int FILEDES[2])'
+-     `unistd.h' (POSIX.1):  *Note Creating a Pipe::.
+-
+-`int PIPE_BUF'
+-     `limits.h' (POSIX.1):  *Note Limits for Files::.
+-
+-`FILE * popen (const char *COMMAND, const char *MODE)'
+-     `stdio.h' (POSIX.2, SVID, BSD):  *Note Pipe to a Subprocess::.
+-
+-`_POSIX2_BC_BASE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`_POSIX2_BC_DIM_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`_POSIX2_BC_SCALE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`_POSIX2_BC_STRING_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`int _POSIX2_C_DEV'
+-     `unistd.h' (POSIX.2):  *Note System Options::.
+-
+-`_POSIX2_COLL_WEIGHTS_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`long int _POSIX2_C_VERSION'
+-     `unistd.h' (POSIX.2):  *Note Version Supported::.
+-
+-`_POSIX2_EQUIV_CLASS_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`_POSIX2_EXPR_NEST_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`int _POSIX2_FORT_DEV'
+-     `unistd.h' (POSIX.2):  *Note System Options::.
+-
+-`int _POSIX2_FORT_RUN'
+-     `unistd.h' (POSIX.2):  *Note System Options::.
+-
+-`_POSIX2_LINE_MAX'
+-     `limits.h' (POSIX.2):  *Note Utility Minimums::.
+-
+-`int _POSIX2_LOCALEDEF'
+-     `unistd.h' (POSIX.2):  *Note System Options::.
+-
+-`_POSIX2_RE_DUP_MAX'
+-     `limits.h' (POSIX.2):  *Note Minimums::.
+-
+-`int _POSIX2_SW_DEV'
+-     `unistd.h' (POSIX.2):  *Note System Options::.
+-
+-`_POSIX_AIO_LISTIO_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_AIO_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_ARG_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_CHILD_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`int _POSIX_CHOWN_RESTRICTED'
+-     `unistd.h' (POSIX.1):  *Note Options for Files::.
+-
+-`_POSIX_C_SOURCE'
+-     (POSIX.2):  *Note Feature Test Macros::.
+-
+-`int _POSIX_JOB_CONTROL'
+-     `unistd.h' (POSIX.1):  *Note System Options::.
+-
+-`_POSIX_LINK_MAX'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`_POSIX_MAX_CANON'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`_POSIX_MAX_INPUT'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`_POSIX_NAME_MAX'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`_POSIX_NGROUPS_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`int _POSIX_NO_TRUNC'
+-     `unistd.h' (POSIX.1):  *Note Options for Files::.
+-
+-`_POSIX_OPEN_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_PATH_MAX'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`_POSIX_PIPE_BUF'
+-     `limits.h' (POSIX.1):  *Note File Minimums::.
+-
+-`int _POSIX_SAVED_IDS'
+-     `unistd.h' (POSIX.1):  *Note System Options::.
+-
+-`_POSIX_SOURCE'
+-     (POSIX.1):  *Note Feature Test Macros::.
+-
+-`_POSIX_SSIZE_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_STREAM_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`_POSIX_TZNAME_MAX'
+-     `limits.h' (POSIX.1):  *Note Minimums::.
+-
+-`unsigned char _POSIX_VDISABLE'
+-     `unistd.h' (POSIX.1):  *Note Options for Files::.
+-
+-`long int _POSIX_VERSION'
+-     `unistd.h' (POSIX.1):  *Note Version Supported::.
+-
+-`double pow (double BASE, double POWER)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`double pow10 (double X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`float pow10f (float X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`long double pow10l (long double X)'
+-     `math.h' (GNU):  *Note Exponents and Logarithms::.
+-
+-`float powf (float BASE, float POWER)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double powl (long double BASE, long double POWER)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE, off_t OFFSET)'
+-     `unistd.h' (Unix98):  *Note I/O Primitives::.
+-
+-`ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE, off64_t OFFSET)'
+-     `unistd.h' (Unix98):  *Note I/O Primitives::.
+-
+-`int printf (const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Output Functions::.
+-
+-`printf_arginfo_function'
+-     `printf.h' (GNU):  *Note Defining the Output Handler::.
+-
+-`printf_function'
+-     `printf.h' (GNU):  *Note Defining the Output Handler::.
+-
+-`int printf_size (FILE *FP, const struct printf_info *INFO, const void *const *ARGS)'
+-     `printf.h' (GNU):  *Note Predefined Printf Handlers::.
+-
+-`int printf_size_info (const struct printf_info *INFO, size_t N, int *ARGTYPES)'
+-     `printf.h' (GNU):  *Note Predefined Printf Handlers::.
+-
+-`PRIO_MAX'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`PRIO_MIN'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`PRIO_PGRP'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`PRIO_PROCESS'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`PRIO_USER'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`char * program_invocation_name'
+-     `errno.h' (GNU):  *Note Error Messages::.
+-
+-`char * program_invocation_short_name'
+-     `errno.h' (GNU):  *Note Error Messages::.
+-
+-`void psignal (int SIGNUM, const char *MESSAGE)'
+-     `signal.h' (BSD):  *Note Signal Messages::.
+-
+-`int pthread_atfork (void (*PREPARE)(void), void (*PARENT)(void), void (*CHILD)(void))'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`int pthread_attr_destroy (pthread_attr_t *ATTR)'
+-     `pthread.h' (POSIX):  *Note Thread Attributes::.
+-
+-`int pthread_attr_getATTR (const pthread_attr_t *OBJ, int *VALUE)'
+-     `pthread.h' (POSIX):  *Note Thread Attributes::.
+-
+-`int pthread_attr_init (pthread_attr_t *ATTR)'
+-     `pthread.h' (POSIX):  *Note Thread Attributes::.
+-
+-`int pthread_attr_setATTR (pthread_attr_t *OBJ, int VALUE)'
+-     `pthread.h' (POSIX):  *Note Thread Attributes::.
+-
+-`int pthread_cancel (pthread_t THREAD)'
+-     `pthread.h' (POSIX):  *Note Basic Thread Operations::.
+-
+-`void pthread_cleanup_pop (int EXECUTE)'
+-     `pthread.h' (POSIX):  *Note Cleanup Handlers::.
+-
+-`void pthread_cleanup_pop_restore_np (int EXECUTE)'
+-     `pthread.h' (GNU):  *Note Cleanup Handlers::.
+-
+-`void pthread_cleanup_push (void (*ROUTINE) (void *), void *ARG)'
+-     `pthread.h' (POSIX):  *Note Cleanup Handlers::.
+-
+-`void pthread_cleanup_push_defer_np (void (*ROUTINE) (void *), void *ARG)'
+-     `pthread.h' (GNU):  *Note Cleanup Handlers::.
+-
+-`int pthread_condattr_init (pthread_condattr_t *ATTR)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_broadcast (pthread_cond_t *COND)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_destroy (pthread_cond_t *COND)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_init (pthread_cond_t *COND, pthread_condattr_t *cond_ATTR)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_signal (pthread_cond_t *COND)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_timedwait (pthread_cond_t *COND, pthread_mutex_t *MUTEX, const struct timespec *ABSTIME)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_cond_wait (pthread_cond_t *COND, pthread_mutex_t *MUTEX)'
+-     `pthread.h' (POSIX):  *Note Condition Variables::.
+-
+-`int pthread_create (pthread_t * THREAD, pthread_attr_t * ATTR, void * (*START_ROUTINE)(void *), void * ARG)'
+-     `pthread.h' (POSIX):  *Note Basic Thread Operations::.
+-
+-`int pthread_detach (pthread_t TH)'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`int pthread_equal (pthread_t thread1, pthread_t thread2)'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`void pthread_exit (void *RETVAL)'
+-     `pthread.h' (POSIX):  *Note Basic Thread Operations::.
+-
+-`int pthread_getschedparam (pthread_t target_THREAD, int *POLICY, struct sched_param *PARAM)'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`void * pthread_getspecific (pthread_key_t KEY)'
+-     `pthread.h' (POSIX):  *Note Thread-Specific Data::.
+-
+-`int pthread_join (pthread_t TH, void **thread_RETURN)'
+-     `pthread.h' (POSIX):  *Note Basic Thread Operations::.
+-
+-`int pthread_key_create (pthread_key_t *KEY, void (*destr_function) (void *))'
+-     `pthread.h' (POSIX):  *Note Thread-Specific Data::.
+-
+-`int pthread_key_delete (pthread_key_t KEY)'
+-     `pthread.h' (POSIX):  *Note Thread-Specific Data::.
+-
+-`int pthread_kill (pthread_t THREAD, int SIGNO)'
+-     `pthread.h' (POSIX):  *Note Threads and Signal Handling::.
+-
+-`void pthread_kill_other_threads_np (VOID)'
+-     `pthread.h' (GNU):  *Note Miscellaneous Thread Functions::.
+-
+-`int pthread_mutexattr_destroy (pthread_mutexattr_t *ATTR)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutexattr_getkind_np (const pthread_mutexattr_t *ATTR, int *KIND)'
+-     `pthread.h' (GNU):  *Note Mutexes::.
+-
+-`int pthread_mutexattr_init (pthread_mutexattr_t *ATTR)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutexattr_setkind_np (pthread_mutexattr_t *ATTR, int KIND)'
+-     `pthread.h' (GNU):  *Note Mutexes::.
+-
+-`int pthread_mutex_destroy (pthread_mutex_t *MUTEX)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutex_init (pthread_mutex_t *MUTEX, const pthread_mutexattr_t *MUTEXATTR)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutex_lock (pthread_mutex_t *mutex))'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutex_trylock (pthread_mutex_t *MUTEX)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_mutex_unlock (pthread_mutex_t *MUTEX)'
+-     `pthread.h' (POSIX):  *Note Mutexes::.
+-
+-`int pthread_once (pthread_once_t *once_CONTROL, void (*INIT_ROUTINE) (void))'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`pthread_t pthread_self (VOID)'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`int pthread_setcancelstate (int STATE, int *OLDSTATE)'
+-     `pthread.h' (POSIX):  *Note Cancellation::.
+-
+-`int pthread_setcanceltype (int TYPE, int *OLDTYPE)'
+-     `pthread.h' (POSIX):  *Note Cancellation::.
+-
+-`int pthread_setschedparam (pthread_t target_THREAD, int POLICY, const struct sched_param *PARAM)'
+-     `pthread.h' (POSIX):  *Note Miscellaneous Thread Functions::.
+-
+-`int pthread_setspecific (pthread_key_t KEY, const void *POINTER)'
+-     `pthread.h' (POSIX):  *Note Thread-Specific Data::.
+-
+-`int pthread_sigmask (int HOW, const sigset_t *NEWMASK, sigset_t *OLDMASK)'
+-     `pthread.h' (POSIX):  *Note Threads and Signal Handling::.
+-
+-`void pthread_testcancel (VOID)'
+-     `pthread.h' (POSIX):  *Note Cancellation::.
+-
+-`char * P_tmpdir'
+-     `stdio.h' (SVID):  *Note Temporary Files::.
+-
+-`ptrdiff_t'
+-     `stddef.h' (ISO):  *Note Important Data Types::.
+-
+-`char * ptsname (int FILEDES)'
+-     `stdlib.h' (SVID, XPG4.2):  *Note Allocation::.
+-
+-`int ptsname_r (int FILEDES, char *BUF, size_t LEN)'
+-     `stdlib.h' (GNU):  *Note Allocation::.
+-
+-`int putc (int C, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note Simple Output::.
+-
+-`int putchar (int C)'
+-     `stdio.h' (ISO):  *Note Simple Output::.
+-
+-`int putenv (const char *STRING)'
+-     `stdlib.h' (SVID):  *Note Environment Access::.
+-
+-`int putpwent (const struct passwd *P, FILE *STREAM)'
+-     `pwd.h' (SVID):  *Note Writing a User Entry::.
+-
+-`int puts (const char *S)'
+-     `stdio.h' (ISO):  *Note Simple Output::.
+-
+-`struct utmp * pututline (const struct utmp *UTMP)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`struct utmpx * pututxline (const struct utmpx *UTMP)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int putw (int W, FILE *STREAM)'
+-     `stdio.h' (SVID):  *Note Simple Output::.
+-
+-`ssize_t pwrite (int FILEDES, const void *BUFFER, size_t SIZE, off_t OFFSET)'
+-     `unistd.h' (Unix98):  *Note I/O Primitives::.
+-
+-`ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t SIZE, off64_t OFFSET)'
+-     `unistd.h' (Unix98):  *Note I/O Primitives::.
+-
+-`char * qecvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`char * qecvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`char * qfcvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`char * qfcvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`char * qgcvt (long double VALUE, int NDIGIT, char *BUF)'
+-     `stdlib.h' (GNU):  *Note System V Number Conversion::.
+-
+-`void qsort (void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)'
+-     `stdlib.h' (ISO):  *Note Array Sort Function::.
+-
+-`int raise (int SIGNUM)'
+-     `signal.h' (ISO):  *Note Signaling Yourself::.
+-
+-`int rand (void)'
+-     `stdlib.h' (ISO):  *Note ISO Random::.
+-
+-`int RAND_MAX'
+-     `stdlib.h' (ISO):  *Note ISO Random::.
+-
+-`int32_t random (void)'
+-     `stdlib.h' (BSD):  *Note BSD Random::.
+-
+-`int rand_r (unsigned int *SEED)'
+-     `stdlib.h' (POSIX.1):  *Note ISO Random::.
+-
+-`ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)'
+-     `unistd.h' (POSIX.1):  *Note I/O Primitives::.
+-
+-`struct dirent * readdir (DIR *DIRSTREAM)'
+-     `dirent.h' (POSIX.1):  *Note Reading/Closing Directory::.
+-
+-`int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY, struct dirent **RESULT)'
+-     `dirent.h' (GNU):  *Note Reading/Closing Directory::.
+-
+-`int readlink (const char *FILENAME, char *BUFFER, size_t SIZE)'
+-     `unistd.h' (BSD):  *Note Symbolic Links::.
+-
+-`void * realloc (void *PTR, size_t NEWSIZE)'
+-     `malloc.h', `stdlib.h' (ISO):  *Note Changing Block Size::.
+-
+-`__realloc_hook'
+-     `malloc.h' (GNU):  *Note Hooks for Malloc::.
+-
+-`int recv (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)'
+-     `sys/socket.h' (BSD):  *Note Receiving Data::.
+-
+-`int recvfrom (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
+-     `sys/socket.h' (BSD):  *Note Receiving Datagrams::.
+-
+-`int recvmsg (int SOCKET, struct msghdr *MESSAGE, int FLAGS)'
+-     `sys/socket.h' (BSD):  *Note Receiving Datagrams::.
+-
+-`int RE_DUP_MAX'
+-     `limits.h' (POSIX.2):  *Note General Limits::.
+-
+-`_REENTRANT'
+-     (GNU):  *Note Feature Test Macros::.
+-
+-`REG_BADBR'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_BADPAT'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_BADRPT'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`int regcomp (regex_t *COMPILED, const char *PATTERN, int CFLAGS)'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_EBRACE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_EBRACK'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_ECOLLATE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_ECTYPE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_EESCAPE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_EPAREN'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_ERANGE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`size_t regerror (int ERRCODE, regex_t *COMPILED, char *BUFFER, size_t LENGTH)'
+-     `regex.h' (POSIX.2):  *Note Regexp Cleanup::.
+-
+-`REG_ESPACE'
+-     `regex.h' (POSIX.2):  *Note Matching POSIX Regexps::.
+-
+-`REG_ESPACE'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_ESUBREG'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`int regexec (regex_t *COMPILED, char *STRING, size_t NMATCH, regmatch_t MATCHPTR [], int EFLAGS)'
+-     `regex.h' (POSIX.2):  *Note Matching POSIX Regexps::.
+-
+-`regex_t'
+-     `regex.h' (POSIX.2):  *Note POSIX Regexp Compilation::.
+-
+-`REG_EXTENDED'
+-     `regex.h' (POSIX.2):  *Note Flags for POSIX Regexps::.
+-
+-`void regfree (regex_t *COMPILED)'
+-     `regex.h' (POSIX.2):  *Note Regexp Cleanup::.
+-
+-`REG_ICASE'
+-     `regex.h' (POSIX.2):  *Note Flags for POSIX Regexps::.
+-
+-`int register_printf_function (int SPEC, printf_function HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)'
+-     `printf.h' (GNU):  *Note Registering New Conversions::.
+-
+-`regmatch_t'
+-     `regex.h' (POSIX.2):  *Note Regexp Subexpressions::.
+-
+-`REG_NEWLINE'
+-     `regex.h' (POSIX.2):  *Note Flags for POSIX Regexps::.
+-
+-`REG_NOMATCH'
+-     `regex.h' (POSIX.2):  *Note Matching POSIX Regexps::.
+-
+-`REG_NOSUB'
+-     `regex.h' (POSIX.2):  *Note Flags for POSIX Regexps::.
+-
+-`REG_NOTBOL'
+-     `regex.h' (POSIX.2):  *Note Matching POSIX Regexps::.
+-
+-`REG_NOTEOL'
+-     `regex.h' (POSIX.2):  *Note Matching POSIX Regexps::.
+-
+-`regoff_t'
+-     `regex.h' (POSIX.2):  *Note Regexp Subexpressions::.
+-
+-`double remainder (double NUMERATOR, double DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`float remainderf (float NUMERATOR, float DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`long double remainderl (long double NUMERATOR, long double DENOMINATOR)'
+-     `math.h' (BSD):  *Note Remainder Functions::.
+-
+-`int remove (const char *FILENAME)'
+-     `stdio.h' (ISO):  *Note Deleting Files::.
+-
+-`int rename (const char *OLDNAME, const char *NEWNAME)'
+-     `stdio.h' (ISO):  *Note Renaming Files::.
+-
+-`void rewind (FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`void rewinddir (DIR *DIRSTREAM)'
+-     `dirent.h' (POSIX.1):  *Note Random Access Directory::.
+-
+-`char * rindex (const char *STRING, int C)'
+-     `string.h' (BSD):  *Note Search Functions::.
+-
+-`double rint (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float rintf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double rintl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`int RLIM_INFINITY'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_CORE'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_CPU'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_DATA'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_FSIZE'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_MEMLOCK'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_NOFILE'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_NPROC'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_RSS'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIMIT_STACK'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`RLIM_NLIMITS'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`int rmdir (const char *FILENAME)'
+-     `unistd.h' (POSIX.1):  *Note Deleting Files::.
+-
+-`int R_OK'
+-     `unistd.h' (POSIX.1):  *Note Testing File Access::.
+-
+-`double round (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`float roundf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double roundl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`RUN_LVL'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`RUN_LVL'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`RUSAGE_CHILDREN'
+-     `sys/resource.h' (BSD):  *Note Resource Usage::.
+-
+-`RUSAGE_SELF'
+-     `sys/resource.h' (BSD):  *Note Resource Usage::.
+-
+-`int SA_NOCLDSTOP'
+-     `signal.h' (POSIX.1):  *Note Flags for Sigaction::.
+-
+-`int SA_ONSTACK'
+-     `signal.h' (BSD):  *Note Flags for Sigaction::.
+-
+-`int SA_RESTART'
+-     `signal.h' (BSD):  *Note Flags for Sigaction::.
+-
+-`_SC_2_C_DEV'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_2_FORT_DEV'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_2_FORT_RUN'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_2_LOCALEDEF'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_2_SW_DEV'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_2_VERSION'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_AIO_LISTIO_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_AIO_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_AIO_PRIO_DELTA_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`double scalb (double VALUE, int EXPONENT)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`float scalbf (float VALUE, int EXPONENT)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long double scalbl (long double VALUE, int EXPONENT)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalbln (double X, long int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalblnf (float X, long int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalblnl (long double X, long int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalbn (double X, int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalbnf (float X, int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int scalbnl (long double X, int n)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`int scandir (const char *DIR, struct dirent ***NAMELIST, int (*SELECTOR) (const struct dirent *), int (*CMP) (const void *, const void *))'
+-     `dirent.h' (BSD/SVID):  *Note Scanning Directory Content::.
+-
+-`int scandir64 (const char *DIR, struct dirent64 ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int (*CMP) (const void *, const void *))'
+-     `dirent.h' (GNU):  *Note Scanning Directory Content::.
+-
+-`int scanf (const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Input Functions::.
+-
+-`_SC_ARG_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_ASYNCHRONOUS_IO'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_ATEXIT_MAX'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_AVPHYS_PAGES'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_BC_BASE_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_BC_DIM_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_BC_SCALE_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_BC_STRING_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_CHAR_BIT'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_CHARCLASS_NAME_MAX'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_CHAR_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_CHAR_MIN'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_CHILD_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_CLK_TCK'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_COLL_WEIGHTS_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_DELAYTIMER_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_EQUIV_CLASS_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_EXPR_NEST_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_FSYNC'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_GETGR_R_SIZE_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_GETPW_R_SIZE_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`SCHAR_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`SCHAR_MIN'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`_SC_INT_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_INT_MIN'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_JOB_CONTROL'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_LINE_MAX'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_LOGIN_NAME_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_LONG_BIT'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_MAPPED_FILES'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MB_LEN_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_MEMLOCK'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MEMLOCK_RANGE'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MEMORY_PROTECTION'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MESSAGE_PASSING'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MQ_OPEN_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_MQ_PRIO_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_NGROUPS_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_ARGMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_LANGMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_MSGMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_NMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_SETMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NL_TEXTMAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_NPROCESSORS_CONF'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_NPROCESSORS_ONLN'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_NZERO'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_OPEN_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_PAGESIZE'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_PHYS_PAGES'
+-     `unistd.h' (GNU):  *Note Constants for Sysconf::.
+-
+-`_SC_PII'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_INTERNET'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_INTERNET_DGRAM'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_INTERNET_STREAM'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_OSI'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_OSI_CLTS'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_OSI_COTS'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_OSI_M'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_SOCKET'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PII_XTI'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_PRIORITIZED_IO'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_PRIORITY_SCHEDULING'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_REALTIME_SIGNALS'
+-     `unistdh.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_RTSIG_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SAVED_IDS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SCHAR_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_SCHAR_MIN'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_SELECT'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_SEMAPHORES'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SEM_NSEMS_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SEM_VALUE_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SHARED_MEMORY_OBJECTS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SHRT_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_SHRT_MIN'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_SIGQUEUE_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`SC_SSIZE_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_STREAM_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_SYNCHRONIZED_IO'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_ATTR_STACKADDR'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_ATTR_STACKSIZE'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_DESTRUCTOR_ITERATIONS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_KEYS_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_PRIO_INHERIT'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_PRIO_PROTECT'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_PRIORITY_SCHEDULING'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_PROCESS_SHARED'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREADS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_SAFE_FUNCTIONS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_STACK_MIN'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_THREAD_THREADS_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_TIMER_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_TIMERS'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_T_IOV_MAX'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_TTY_NAME_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_TZNAME_MAX'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_UCHAR_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_UINT_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_UIO_MAXIOV'
+-     `unistd.h' (POSIX.1g):  *Note Constants for Sysconf::.
+-
+-`_SC_ULONG_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_USHRT_MAX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_VERSION'
+-     `unistd.h' (POSIX.1):  *Note Constants for Sysconf::.
+-
+-`_SC_VERSION'
+-     `unistd.h' (POSIX.2):  *Note Constants for Sysconf::.
+-
+-`_SC_WORD_BIT'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_CRYPT'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_ENH_I18N'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_SHM'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_UNIX'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_VERSION'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_XCU_VERSION'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_XPG2'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_XPG3'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`_SC_XOPEN_XPG4'
+-     `unistd.h' (X/Open):  *Note Constants for Sysconf::.
+-
+-`unsigned short int * seed48 (unsigned short int SEED16V[3])'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int seed48_r (unsigned short int SEED16V[3], struct drand48_data *BUFFER)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`int SEEK_CUR'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`void seekdir (DIR *DIRSTREAM, off_t POS)'
+-     `dirent.h' (BSD):  *Note Random Access Directory::.
+-
+-`int SEEK_END'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`int SEEK_SET'
+-     `stdio.h' (ISO):  *Note File Positioning::.
+-
+-`int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS, fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)'
+-     `sys/types.h' (BSD):  *Note Waiting for I/O::.
+-
+-`int sem_destroy (sem_t * SEM)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int sem_getvalue (sem_t * SEM, int * SVAL)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int sem_init (sem_t *SEM, int PSHARED, unsigned int VALUE)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int sem_post (sem_t * SEM)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int sem_trywait (sem_t * SEM)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int sem_wait (sem_t * SEM)'
+-     `semaphore.h' (POSIX):  *Note POSIX Semaphores::.
+-
+-`int send (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)'
+-     `sys/socket.h' (BSD):  *Note Sending Data::.
+-
+-`int sendmsg (int SOCKET, const struct msghdr *MESSAGE, int FLAGS)'
+-     `sys/socket.h' (BSD):  *Note Receiving Datagrams::.
+-
+-`int sendto (int SOCKET, void *BUFFER. size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)'
+-     `sys/socket.h' (BSD):  *Note Sending Datagrams::.
+-
+-`void setbuf (FILE *STREAM, char *BUF)'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)'
+-     `stdio.h' (BSD):  *Note Controlling Buffering::.
+-
+-`int setegid (gid_t NEWGID)'
+-     `unistd.h' (POSIX.1):  *Note Setting Groups::.
+-
+-`int setenv (const char *NAME, const char *VALUE, int REPLACE)'
+-     `stdlib.h' (BSD):  *Note Environment Access::.
+-
+-`int seteuid (uid_t NEWEUID)'
+-     `unistd.h' (POSIX.1):  *Note Setting User ID::.
+-
+-`int setfsent (void)'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`int setgid (gid_t NEWGID)'
+-     `unistd.h' (POSIX.1):  *Note Setting Groups::.
+-
+-`void setgrent (void)'
+-     `grp.h' (SVID, BSD):  *Note Scanning All Groups::.
+-
+-`int setgroups (size_t COUNT, gid_t *GROUPS)'
+-     `grp.h' (BSD):  *Note Setting Groups::.
+-
+-`void sethostent (int STAYOPEN)'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`int sethostid (long int ID)'
+-     `unistd.h' (BSD):  *Note Host Identification::.
+-
+-`int sethostname (const char *NAME, size_t LENGTH)'
+-     `unistd.h' (BSD):  *Note Host Identification::.
+-
+-`int setitimer (int WHICH, struct itimerval *NEW, struct itimerval *OLD)'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`int setjmp (jmp_buf STATE)'
+-     `setjmp.h' (ISO):  *Note Non-Local Details::.
+-
+-`void setkey (const char * KEY)'
+-     `crypt.h' (crypt.h):  *Note DES Encryption::.
+-
+-`void setkey_r (const char * KEY, struct crypt_data * DATA)'
+-     `crypt.h' (GNU):  *Note DES Encryption::.
+-
+-`void setlinebuf (FILE *STREAM)'
+-     `stdio.h' (BSD):  *Note Controlling Buffering::.
+-
+-`char * setlocale (int CATEGORY, const char *LOCALE)'
+-     `locale.h' (ISO):  *Note Setting the Locale::.
+-
+-`FILE * setmntent (const char *FILE, const char *MODE)'
+-     `mntent.h' (BSD):  *Note Filesystem handling::.
+-
+-`void setnetent (int STAYOPEN)'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`int setnetgrent (const char *NETGROUP)'
+-     `netdb.h' (BSD):  *Note Lookup Netgroup::.
+-
+-`int setpgid (pid_t PID, pid_t PGID)'
+-     `unistd.h' (POSIX.1):  *Note Process Group Functions::.
+-
+-`int setpgrp (pid_t PID, pid_t PGID)'
+-     `unistd.h' (BSD):  *Note Process Group Functions::.
+-
+-`int setpriority (int CLASS, int ID, int PRIORITY)'
+-     `sys/resource.h' (BSD):  *Note Priority::.
+-
+-`void setprotoent (int STAYOPEN)'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`void setpwent (void)'
+-     `pwd.h' (SVID, BSD):  *Note Scanning All Users::.
+-
+-`int setregid (gid_t RGID, gid_t EGID)'
+-     `unistd.h' (BSD):  *Note Setting Groups::.
+-
+-`int setreuid (uid_t RUID, uid_t EUID)'
+-     `unistd.h' (BSD):  *Note Setting User ID::.
+-
+-`int setrlimit (int RESOURCE, const struct rlimit *RLP)'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)'
+-     `sys/resource.h' (Unix98):  *Note Limits on Resources::.
+-
+-`void setservent (int STAYOPEN)'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`pid_t setsid (void)'
+-     `unistd.h' (POSIX.1):  *Note Process Group Functions::.
+-
+-`int setsockopt (int SOCKET, int LEVEL, int OPTNAME, void *OPTVAL, socklen_t OPTLEN)'
+-     `sys/socket.h' (BSD):  *Note Socket Option Functions::.
+-
+-`void * setstate (void *STATE)'
+-     `stdlib.h' (BSD):  *Note BSD Random::.
+-
+-`int settimeofday (const struct timeval *TP, const struct timezone *TZP)'
+-     `sys/time.h' (BSD):  *Note High-Resolution Calendar::.
+-
+-`int setuid (uid_t NEWUID)'
+-     `unistd.h' (POSIX.1):  *Note Setting User ID::.
+-
+-`void setutent (void)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`void setutxent (void)'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t SIZE)'
+-     `stdio.h' (ISO):  *Note Controlling Buffering::.
+-
+-`SHRT_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`SHRT_MIN'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`int shutdown (int SOCKET, int HOW)'
+-     `sys/socket.h' (BSD):  *Note Closing a Socket::.
+-
+-`S_IEXEC'
+-     `sys/stat.h' (BSD):  *Note Permission Bits::.
+-
+-`S_IFBLK'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFCHR'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFDIR'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFIFO'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFLNK'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`int S_IFMT'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFREG'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`S_IFSOCK'
+-     `sys/stat.h' (BSD):  *Note Testing File Type::.
+-
+-`int SIGABRT'
+-     `signal.h' (ISO):  *Note Program Error Signals::.
+-
+-`int sigaction (int SIGNUM, const struct sigaction *ACTION, struct sigaction *OLD-ACTION)'
+-     `signal.h' (POSIX.1):  *Note Advanced Signal Handling::.
+-
+-`int sigaddset (sigset_t *SET, int SIGNUM)'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`int SIGALRM'
+-     `signal.h' (POSIX.1):  *Note Alarm Signals::.
+-
+-`int sigaltstack (const struct sigaltstack *STACK, struct sigaltstack *OLDSTACK)'
+-     `signal.h' (BSD):  *Note Signal Stack::.
+-
+-`sig_atomic_t'
+-     `signal.h' (ISO):  *Note Atomic Types::.
+-
+-`SIG_BLOCK'
+-     `signal.h' (POSIX.1):  *Note Process Signal Mask::.
+-
+-`int sigblock (int MASK)'
+-     `signal.h' (BSD):  *Note Blocking in BSD::.
+-
+-`int SIGBUS'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`int SIGCHLD'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`int SIGCLD'
+-     `signal.h' (SVID):  *Note Job Control Signals::.
+-
+-`int SIGCONT'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`int sigdelset (sigset_t *SET, int SIGNUM)'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`int sigemptyset (sigset_t *SET)'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`int SIGEMT'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`sighandler_t SIG_ERR'
+-     `signal.h' (ISO):  *Note Basic Signal Handling::.
+-
+-`int sigfillset (sigset_t *SET)'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`int SIGFPE'
+-     `signal.h' (ISO):  *Note Program Error Signals::.
+-
+-`sighandler_t'
+-     `signal.h' (GNU):  *Note Basic Signal Handling::.
+-
+-`int SIGHUP'
+-     `signal.h' (POSIX.1):  *Note Termination Signals::.
+-
+-`int SIGILL'
+-     `signal.h' (ISO):  *Note Program Error Signals::.
+-
+-`int SIGINFO'
+-     `signal.h' (BSD):  *Note Miscellaneous Signals::.
+-
+-`int SIGINT'
+-     `signal.h' (ISO):  *Note Termination Signals::.
+-
+-`int siginterrupt (int SIGNUM, int FAILFLAG)'
+-     `signal.h' (BSD):  *Note BSD Handler::.
+-
+-`int SIGIO'
+-     `signal.h' (BSD):  *Note Asynchronous I/O Signals::.
+-
+-`int SIGIOT'
+-     `signal.h' (Unix):  *Note Program Error Signals::.
+-
+-`int sigismember (const sigset_t *SET, int SIGNUM)'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`sigjmp_buf'
+-     `setjmp.h' (POSIX.1):  *Note Non-Local Exits and Signals::.
+-
+-`int SIGKILL'
+-     `signal.h' (POSIX.1):  *Note Termination Signals::.
+-
+-`void siglongjmp (sigjmp_buf STATE, int VALUE)'
+-     `setjmp.h' (POSIX.1):  *Note Non-Local Exits and Signals::.
+-
+-`int SIGLOST'
+-     `signal.h' (GNU):  *Note Operation Error Signals::.
+-
+-`int sigmask (int SIGNUM)'
+-     `signal.h' (BSD):  *Note Blocking in BSD::.
+-
+-`sighandler_t signal (int SIGNUM, sighandler_t ACTION)'
+-     `signal.h' (ISO):  *Note Basic Signal Handling::.
+-
+-`int signbit (*float-type* X)'
+-     `math.h' (ISO):  *Note FP Bit Twiddling::.
+-
+-`long long int significand (double X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int significandf (float X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`long long int significandl (long double X)'
+-     `math.h' (BSD):  *Note Normalization Functions::.
+-
+-`int sigpause (int MASK)'
+-     `signal.h' (BSD):  *Note Blocking in BSD::.
+-
+-`int sigpending (sigset_t *SET)'
+-     `signal.h' (POSIX.1):  *Note Checking for Pending Signals::.
+-
+-`int SIGPIPE'
+-     `signal.h' (POSIX.1):  *Note Operation Error Signals::.
+-
+-`int SIGPOLL'
+-     `signal.h' (SVID):  *Note Asynchronous I/O Signals::.
+-
+-`int sigprocmask (int HOW, const sigset_t *SET, sigset_t *OLDSET)'
+-     `signal.h' (POSIX.1):  *Note Process Signal Mask::.
+-
+-`int SIGPROF'
+-     `signal.h' (BSD):  *Note Alarm Signals::.
+-
+-`int SIGQUIT'
+-     `signal.h' (POSIX.1):  *Note Termination Signals::.
+-
+-`int SIGSEGV'
+-     `signal.h' (ISO):  *Note Program Error Signals::.
+-
+-`int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)'
+-     `setjmp.h' (POSIX.1):  *Note Non-Local Exits and Signals::.
+-
+-`SIG_SETMASK'
+-     `signal.h' (POSIX.1):  *Note Process Signal Mask::.
+-
+-`int sigsetmask (int MASK)'
+-     `signal.h' (BSD):  *Note Blocking in BSD::.
+-
+-`sigset_t'
+-     `signal.h' (POSIX.1):  *Note Signal Sets::.
+-
+-`int sigstack (const struct sigstack *STACK, struct sigstack *OLDSTACK)'
+-     `signal.h' (BSD):  *Note Signal Stack::.
+-
+-`int SIGSTOP'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`int sigsuspend (const sigset_t *SET)'
+-     `signal.h' (POSIX.1):  *Note Sigsuspend::.
+-
+-`int SIGSYS'
+-     `signal.h' (Unix):  *Note Program Error Signals::.
+-
+-`int SIGTERM'
+-     `signal.h' (ISO):  *Note Termination Signals::.
+-
+-`int SIGTRAP'
+-     `signal.h' (BSD):  *Note Program Error Signals::.
+-
+-`int SIGTSTP'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`int SIGTTIN'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`int SIGTTOU'
+-     `signal.h' (POSIX.1):  *Note Job Control Signals::.
+-
+-`SIG_UNBLOCK'
+-     `signal.h' (POSIX.1):  *Note Process Signal Mask::.
+-
+-`int SIGURG'
+-     `signal.h' (BSD):  *Note Asynchronous I/O Signals::.
+-
+-`int SIGUSR1'
+-     `signal.h' (POSIX.1):  *Note Miscellaneous Signals::.
+-
+-`int SIGUSR2'
+-     `signal.h' (POSIX.1):  *Note Miscellaneous Signals::.
+-
+-`int sigvec (int SIGNUM, const struct sigvec *ACTION,struct sigvec *OLD-ACTION)'
+-     `signal.h' (BSD):  *Note BSD Handler::.
+-
+-`int SIGVTALRM'
+-     `signal.h' (BSD):  *Note Alarm Signals::.
+-
+-`int sigwait (const sigset_t *SET, int *SIG)'
+-     `pthread.h' (POSIX):  *Note Threads and Signal Handling::.
+-
+-`int SIGWINCH'
+-     `signal.h' (BSD):  *Note Miscellaneous Signals::.
+-
+-`int SIGXCPU'
+-     `signal.h' (BSD):  *Note Operation Error Signals::.
+-
+-`int SIGXFSZ'
+-     `signal.h' (BSD):  *Note Operation Error Signals::.
+-
+-`double sin (double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`void sincos (double X, double *SINX, double *COSX)'
+-     `math.h' (GNU):  *Note Trig Functions::.
+-
+-`void sincosf (float X, float *SINX, float *COSX)'
+-     `math.h' (GNU):  *Note Trig Functions::.
+-
+-`void sincosl (long double X, long double *SINX, long double *COSX)'
+-     `math.h' (GNU):  *Note Trig Functions::.
+-
+-`float sinf (float X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`double sinh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float sinhf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double sinhl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double sinl (long double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`S_IREAD'
+-     `sys/stat.h' (BSD):  *Note Permission Bits::.
+-
+-`S_IRGRP'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IROTH'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IRUSR'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IRWXG'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IRWXO'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IRWXU'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`int S_ISBLK (mode_t M)'
+-     `sys/stat.h' (POSIX):  *Note Testing File Type::.
+-
+-`int S_ISCHR (mode_t M)'
+-     `sys/stat.h' (POSIX):  *Note Testing File Type::.
+-
+-`int S_ISDIR (mode_t M)'
+-     `sys/stat.h' (POSIX):  *Note Testing File Type::.
+-
+-`int S_ISFIFO (mode_t M)'
+-     `sys/stat.h' (POSIX):  *Note Testing File Type::.
+-
+-`S_ISGID'
+-     `sys/stat.h' (POSIX):  *Note Permission Bits::.
+-
+-`int S_ISLNK (mode_t M)'
+-     `sys/stat.h' (GNU):  *Note Testing File Type::.
+-
+-`int S_ISREG (mode_t M)'
+-     `sys/stat.h' (POSIX):  *Note Testing File Type::.
+-
+-`int S_ISSOCK (mode_t M)'
+-     `sys/stat.h' (GNU):  *Note Testing File Type::.
+-
+-`S_ISUID'
+-     `sys/stat.h' (POSIX):  *Note Permission Bits::.
+-
+-`S_ISVTX'
+-     `sys/stat.h' (BSD):  *Note Permission Bits::.
+-
+-`S_IWGRP'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IWOTH'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IWRITE'
+-     `sys/stat.h' (BSD):  *Note Permission Bits::.
+-
+-`S_IWUSR'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IXGRP'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IXOTH'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`S_IXUSR'
+-     `sys/stat.h' (POSIX.1):  *Note Permission Bits::.
+-
+-`size_t'
+-     `stddef.h' (ISO):  *Note Important Data Types::.
+-
+-`unsigned int sleep (unsigned int SECONDS)'
+-     `unistd.h' (POSIX.1):  *Note Sleeping::.
+-
+-`int snprintf (char *S, size_t SIZE, const char *TEMPLATE, ...)'
+-     `stdio.h' (GNU):  *Note Formatted Output Functions::.
+-
+-`SO_BROADCAST'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`int SOCK_DGRAM'
+-     `sys/socket.h' (BSD):  *Note Communication Styles::.
+-
+-`int socket (int NAMESPACE, int STYLE, int PROTOCOL)'
+-     `sys/socket.h' (BSD):  *Note Creating a Socket::.
+-
+-`int socketpair (int NAMESPACE, int STYLE, int PROTOCOL, int FILEDES[2])'
+-     `sys/socket.h' (BSD):  *Note Socket Pairs::.
+-
+-`int SOCK_RAW'
+-     `sys/socket.h' (BSD):  *Note Communication Styles::.
+-
+-`int SOCK_RDM'
+-     `sys/socket.h' (BSD):  *Note Communication Styles::.
+-
+-`int SOCK_SEQPACKET'
+-     `sys/socket.h' (BSD):  *Note Communication Styles::.
+-
+-`int SOCK_STREAM'
+-     `sys/socket.h' (BSD):  *Note Communication Styles::.
+-
+-`SO_DEBUG'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_DONTROUTE'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_ERROR'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_KEEPALIVE'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_LINGER'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`int SOL_SOCKET'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_OOBINLINE'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_RCVBUF'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_REUSEADDR'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_SNDBUF'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`SO_STYLE'
+-     `sys/socket.h' (GNU):  *Note Socket-Level Options::.
+-
+-`SO_TYPE'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`speed_t'
+-     `termios.h' (POSIX.1):  *Note Line Speed::.
+-
+-`int sprintf (char *S, const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Output Functions::.
+-
+-`double sqrt (double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`float sqrtf (float X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`long double sqrtl (long double X)'
+-     `math.h' (ISO):  *Note Exponents and Logarithms::.
+-
+-`void srand (unsigned int SEED)'
+-     `stdlib.h' (ISO):  *Note ISO Random::.
+-
+-`void srand48 (long int SEEDVAL))'
+-     `stdlib.h' (SVID):  *Note SVID Random::.
+-
+-`int srand48_r (long int SEEDVAL, struct drand48_data *BUFFER)'
+-     `stdlib.h' (GNU):  *Note SVID Random::.
+-
+-`void srandom (unsigned int SEED)'
+-     `stdlib.h' (BSD):  *Note BSD Random::.
+-
+-`int sscanf (const char *S, const char *TEMPLATE, ...)'
+-     `stdio.h' (ISO):  *Note Formatted Input Functions::.
+-
+-`sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)'
+-     `signal.h' (SVID):  *Note Basic Signal Handling::.
+-
+-`int SSIZE_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`ssize_t'
+-     `unistd.h' (POSIX.1):  *Note I/O Primitives::.
+-
+-`int stat (const char *FILENAME, struct stat *BUF)'
+-     `sys/stat.h' (POSIX.1):  *Note Reading Attributes::.
+-
+-`int stat64 (const char *FILENAME, struct stat64 *BUF)'
+-     `sys/stat.h' (Unix98):  *Note Reading Attributes::.
+-
+-`FILE * stderr'
+-     `stdio.h' (ISO):  *Note Standard Streams::.
+-
+-`STDERR_FILENO'
+-     `unistd.h' (POSIX.1):  *Note Descriptors and Streams::.
+-
+-`FILE * stdin'
+-     `stdio.h' (ISO):  *Note Standard Streams::.
+-
+-`STDIN_FILENO'
+-     `unistd.h' (POSIX.1):  *Note Descriptors and Streams::.
+-
+-`FILE * stdout'
+-     `stdio.h' (ISO):  *Note Standard Streams::.
+-
+-`STDOUT_FILENO'
+-     `unistd.h' (POSIX.1):  *Note Descriptors and Streams::.
+-
+-`char * stpcpy (char *TO, const char *FROM)'
+-     `string.h' (Unknown origin):  *Note Copying and Concatenation::.
+-
+-`char * stpncpy (char *TO, const char *FROM, size_t SIZE)'
+-     `string.h' (GNU):  *Note Copying and Concatenation::.
+-
+-`int strcasecmp (const char *S1, const char *S2)'
+-     `string.h' (BSD):  *Note String/Array Comparison::.
+-
+-`char * strcat (char *TO, const char *FROM)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`char * strchr (const char *STRING, int C)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`int strcmp (const char *S1, const char *S2)'
+-     `string.h' (ISO):  *Note String/Array Comparison::.
+-
+-`int strcoll (const char *S1, const char *S2)'
+-     `string.h' (ISO):  *Note Collation Functions::.
+-
+-`char * strcpy (char *TO, const char *FROM)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`size_t strcspn (const char *STRING, const char *STOPSET)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`char * strdup (const char *S)'
+-     `string.h' (SVID):  *Note Copying and Concatenation::.
+-
+-`char * strdupa (const char *S)'
+-     `string.h' (GNU):  *Note Copying and Concatenation::.
+-
+-`int STREAM_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`char * strerror (int ERRNUM)'
+-     `string.h' (ISO):  *Note Error Messages::.
+-
+-`char * strerror_r (int ERRNUM, char *BUF, size_t N)'
+-     `string.h' (GNU):  *Note Error Messages::.
+-
+-`size_t strftime (char *S, size_t SIZE, const char *TEMPLATE, const struct tm *BROKENTIME)'
+-     `time.h' (ISO):  *Note Formatting Date and Time::.
+-
+-`size_t strlen (const char *S)'
+-     `string.h' (ISO):  *Note String Length::.
+-
+-`int strncasecmp (const char *S1, const char *S2, size_t N)'
+-     `string.h' (BSD):  *Note String/Array Comparison::.
+-
+-`char * strncat (char *TO, const char *FROM, size_t SIZE)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`int strncmp (const char *S1, const char *S2, size_t SIZE)'
+-     `string.h' (ISO):  *Note String/Array Comparison::.
+-
+-`char * strncpy (char *TO, const char *FROM, size_t SIZE)'
+-     `string.h' (ISO):  *Note Copying and Concatenation::.
+-
+-`char * strndup (const char *S, size_t SIZE)'
+-     `string.h' (GNU):  *Note Copying and Concatenation::.
+-
+-`char * strndupa (const char *S, size_t SIZE)'
+-     `string.h' (GNU):  *Note Copying and Concatenation::.
+-
+-`size_t strnlen (const char *S, size_t MAXLEN)'
+-     `string.h' (GNU):  *Note String Length::.
+-
+-`char * strpbrk (const char *STRING, const char *STOPSET)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`char * strptime (const char *S, const char *FMT, struct tm *TP)'
+-     `time.h' (XPG4):  *Note Low-Level Time String Parsing::.
+-
+-`char * strrchr (const char *STRING, int C)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`char * strsep (char **STRING_PTR, const char *DELIMITER)'
+-     `string.h' (BSD):  *Note Finding Tokens in a String::.
+-
+-`char * strsignal (int SIGNUM)'
+-     `string.h' (GNU):  *Note Signal Messages::.
+-
+-`size_t strspn (const char *STRING, const char *SKIPSET)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`char * strstr (const char *HAYSTACK, const char *NEEDLE)'
+-     `string.h' (ISO):  *Note Search Functions::.
+-
+-`double strtod (const char *STRING, char **TAILPTR)'
+-     `stdlib.h' (ISO):  *Note Parsing of Floats::.
+-
+-`float strtof (const char *STRING, char **TAILPTR)'
+-     `stdlib.h' (GNU):  *Note Parsing of Floats::.
+-
+-`char * strtok (char *NEWSTRING, const char *DELIMITERS)'
+-     `string.h' (ISO):  *Note Finding Tokens in a String::.
+-
+-`char * strtok_r (char *NEWSTRING, const char *DELIMITERS, char **SAVE_PTR)'
+-     `string.h' (POSIX):  *Note Finding Tokens in a String::.
+-
+-`long int strtol (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`long double strtold (const char *STRING, char **TAILPTR)'
+-     `stdlib.h' (GNU):  *Note Parsing of Floats::.
+-
+-`long long int strtoll (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`long long int strtoq (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (BSD):  *Note Parsing of Integers::.
+-
+-`unsigned long int strtoul (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`unsigned long long int strtoull (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (ISO):  *Note Parsing of Integers::.
+-
+-`unsigned long long int strtouq (const char *STRING, char **TAILPTR, int BASE)'
+-     `stdlib.h' (BSD):  *Note Parsing of Integers::.
+-
+-`struct aiocb'
+-     `aio.h' (POSIX.1b):  *Note Asynchronous I/O::.
+-
+-`struct aiocb64'
+-     `aio.h' (POSIX.1b):  *Note Asynchronous I/O::.
+-
+-`struct aioinit'
+-     `aio.h' (GNU):  *Note Configuration of AIO::.
+-
+-`struct argp'
+-     `argp.h' (GNU):  *Note Argp Parsers::.
+-
+-`struct argp_child'
+-     `argp.h' (GNU):  *Note Argp Children::.
+-
+-`struct argp_option'
+-     `argp.h' (GNU):  *Note Argp Option Vectors::.
+-
+-`struct argp_state'
+-     `argp.h' (GNU):  *Note Argp Parsing State::.
+-
+-`struct dirent'
+-     `dirent.h' (POSIX.1):  *Note Directory Entries::.
+-
+-`struct exit_status'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`struct flock'
+-     `fcntl.h' (POSIX.1):  *Note File Locks::.
+-
+-`struct fstab'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct FTW'
+-     `ftw.h' (XPG4.2):  *Note Working on Directory Trees::.
+-
+-`struct gconv_step'
+-     `gconv.h' (GNU):  *Note glibc iconv Implementation::.
+-
+-`struct gconv_step_data'
+-     `gconv.h' (GNU):  *Note glibc iconv Implementation::.
+-
+-`struct group'
+-     `grp.h' (POSIX.1):  *Note Group Data Structure::.
+-
+-`struct hostent'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`struct if_nameindex'
+-     `net/if.h' (IPv6 basic API):  *Note Interface Naming::.
+-
+-`struct in6_addr'
+-     `netinet/in.h' (IPv6 basic API):  *Note Host Address Data Type::.
+-
+-`struct in_addr'
+-     `netinet/in.h' (BSD):  *Note Host Address Data Type::.
+-
+-`struct itimerval'
+-     `sys/time.h' (BSD):  *Note Setting an Alarm::.
+-
+-`struct lconv'
+-     `locale.h' (ISO):  *Note The Lame Way to Locale Data::.
+-
+-`struct linger'
+-     `sys/socket.h' (BSD):  *Note Socket-Level Options::.
+-
+-`struct mallinfo'
+-     `malloc.h' (GNU):  *Note Statistics of Malloc::.
+-
+-`struct mntent'
+-     `fstab.h' (BSD):  *Note Filesystem handling::.
+-
+-`struct msghdr'
+-     `sys/socket.h' (BSD):  *Note Receiving Datagrams::.
+-
+-`struct netent'
+-     `netdb.h' (BSD):  *Note Networks Database::.
+-
+-`struct obstack'
+-     `obstack.h' (GNU):  *Note Creating Obstacks::.
+-
+-`struct option'
+-     `getopt.h' (GNU):  *Note Getopt Long Options::.
+-
+-`struct passwd'
+-     `pwd.h' (POSIX.1):  *Note User Data Structure::.
+-
+-`struct printf_info'
+-     `printf.h' (GNU):  *Note Conversion Specifier Options::.
+-
+-`struct protoent'
+-     `netdb.h' (BSD):  *Note Protocols Database::.
+-
+-`struct rlimit'
+-     `sys/resource.h' (BSD):  *Note Limits on Resources::.
+-
+-`struct rlimit64'
+-     `sys/resource.h' (Unix98):  *Note Limits on Resources::.
+-
+-`struct rusage'
+-     `sys/resource.h' (BSD):  *Note Resource Usage::.
+-
+-`struct servent'
+-     `netdb.h' (BSD):  *Note Services Database::.
+-
+-`struct sigaction'
+-     `signal.h' (POSIX.1):  *Note Advanced Signal Handling::.
+-
+-`struct sigaltstack'
+-     `signal.h' (BSD):  *Note Signal Stack::.
+-
+-`struct sigstack'
+-     `signal.h' (BSD):  *Note Signal Stack::.
+-
+-`struct sigvec'
+-     `signal.h' (BSD):  *Note BSD Handler::.
+-
+-`struct sockaddr'
+-     `sys/socket.h' (BSD):  *Note Address Formats::.
+-
+-`struct sockaddr_in'
+-     `netinet/in.h' (BSD):  *Note Internet Address Formats::.
+-
+-`struct sockaddr_un'
+-     `sys/un.h' (BSD):  *Note Local Namespace Details::.
+-
+-`struct stat'
+-     `sys/stat.h' (POSIX.1):  *Note Attribute Meanings::.
+-
+-`struct stat64'
+-     `sys/stat.h' (LFS):  *Note Attribute Meanings::.
+-
+-`struct termios'
+-     `termios.h' (POSIX.1):  *Note Mode Data Types::.
+-
+-`struct timeval'
+-     `sys/time.h' (BSD):  *Note High-Resolution Calendar::.
+-
+-`struct timezone'
+-     `sys/time.h' (BSD):  *Note High-Resolution Calendar::.
+-
+-`struct tm'
+-     `time.h' (ISO):  *Note Broken-down Time::.
+-
+-`struct tms'
+-     `sys/times.h' (POSIX.1):  *Note Detailed CPU Time::.
+-
+-`struct utimbuf'
+-     `time.h' (POSIX.1):  *Note File Times::.
+-
+-`struct utsname'
+-     `sys/utsname.h' (POSIX.1):  *Note Hardware/Software Type ID::.
+-
+-`int strverscmp (const char *S1, const char *S2)'
+-     `string.h' (GNU):  *Note String/Array Comparison::.
+-
+-`size_t strxfrm (char *TO, const char *FROM, size_t SIZE)'
+-     `string.h' (ISO):  *Note Collation Functions::.
+-
+-`int SUN_LEN (*struct sockaddr_un ** PTR)'
+-     `sys/un.h' (BSD):  *Note Local Namespace Details::.
+-
+-`_SVID_SOURCE'
+-     (GNU):  *Note Feature Test Macros::.
+-
+-`int SV_INTERRUPT'
+-     `signal.h' (BSD):  *Note BSD Handler::.
+-
+-`int SV_ONSTACK'
+-     `signal.h' (BSD):  *Note BSD Handler::.
+-
+-`int SV_RESETHAND'
+-     `signal.h' (Sun):  *Note BSD Handler::.
+-
+-`int symlink (const char *OLDNAME, const char *NEWNAME)'
+-     `unistd.h' (BSD):  *Note Symbolic Links::.
+-
+-`int sync (void)'
+-     `unistd.h' (X/Open):  *Note Synchronizing I/O::.
+-
+-`long int sysconf (int PARAMETER)'
+-     `unistd.h' (POSIX.1):  *Note Sysconf Definition::.
+-
+-`int system (const char *COMMAND)'
+-     `stdlib.h' (ISO):  *Note Running a Command::.
+-
+-`sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)'
+-     `signal.h' (GNU):  *Note Basic Signal Handling::.
+-
+-`double tan (double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`float tanf (float X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`double tanh (double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`float tanhf (float X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double tanhl (long double X)'
+-     `math.h' (ISO):  *Note Hyperbolic Functions::.
+-
+-`long double tanl (long double X)'
+-     `math.h' (ISO):  *Note Trig Functions::.
+-
+-`int tcdrain (int FILEDES)'
+-     `termios.h' (POSIX.1):  *Note Line Control::.
+-
+-`tcflag_t'
+-     `termios.h' (POSIX.1):  *Note Mode Data Types::.
+-
+-`int tcflow (int FILEDES, int ACTION)'
+-     `termios.h' (POSIX.1):  *Note Line Control::.
+-
+-`int tcflush (int FILEDES, int QUEUE)'
+-     `termios.h' (POSIX.1):  *Note Line Control::.
+-
+-`int tcgetattr (int FILEDES, struct termios *TERMIOS-P)'
+-     `termios.h' (POSIX.1):  *Note Mode Functions::.
+-
+-`pid_t tcgetpgrp (int FILEDES)'
+-     `unistd.h' (POSIX.1):  *Note Terminal Access Functions::.
+-
+-`pid_t tcgetsid (int FILDES)'
+-     `termios.h' (Unix98):  *Note Terminal Access Functions::.
+-
+-`TCSADRAIN'
+-     `termios.h' (POSIX.1):  *Note Mode Functions::.
+-
+-`TCSAFLUSH'
+-     `termios.h' (POSIX.1):  *Note Mode Functions::.
+-
+-`TCSANOW'
+-     `termios.h' (POSIX.1):  *Note Mode Functions::.
+-
+-`TCSASOFT'
+-     `termios.h' (BSD):  *Note Mode Functions::.
+-
+-`int tcsendbreak (int FILEDES, int DURATION)'
+-     `termios.h' (POSIX.1):  *Note Line Control::.
+-
+-`int tcsetattr (int FILEDES, int WHEN, const struct termios *TERMIOS-P)'
+-     `termios.h' (POSIX.1):  *Note Mode Functions::.
+-
+-`int tcsetpgrp (int FILEDES, pid_t PGID)'
+-     `unistd.h' (POSIX.1):  *Note Terminal Access Functions::.
+-
+-`void * tdelete (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)'
+-     `search.h' (SVID):  *Note Tree Search Function::.
+-
+-`void tdestroy (void *VROOT, __free_fn_t FREEFCT)'
+-     `search.h' (GNU):  *Note Tree Search Function::.
+-
+-`off_t telldir (DIR *DIRSTREAM)'
+-     `dirent.h' (BSD):  *Note Random Access Directory::.
+-
+-`TEMP_FAILURE_RETRY (EXPRESSION)'
+-     `unistd.h' (GNU):  *Note Interrupted Primitives::.
+-
+-`char * tempnam (const char *DIR, const char *PREFIX)'
+-     `stdio.h' (SVID):  *Note Temporary Files::.
+-
+-`void * tfind (const void *KEY, void *const *ROOTP, comparison_fn_t COMPAR)'
+-     `search.h' (SVID):  *Note Tree Search Function::.
+-
+-`double tgamma (double X)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`float tgammaf (float X)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`long double tgammal (long double X)'
+-     `math.h' (XPG):  *Note Special Functions::.
+-
+-`time_t time (time_t *RESULT)'
+-     `time.h' (ISO):  *Note Simple Calendar Time::.
+-
+-`clock_t times (struct tms *BUFFER)'
+-     `sys/times.h' (POSIX.1):  *Note Detailed CPU Time::.
+-
+-`time_t'
+-     `time.h' (ISO):  *Note Simple Calendar Time::.
+-
+-`long int timezone'
+-     `time.h' (SVID):  *Note Time Zone Functions::.
+-
+-`FILE * tmpfile (void)'
+-     `stdio.h' (ISO):  *Note Temporary Files::.
+-
+-`FILE * tmpfile64 (void)'
+-     `stdio.h' (Unix98):  *Note Temporary Files::.
+-
+-`int TMP_MAX'
+-     `stdio.h' (ISO):  *Note Temporary Files::.
+-
+-`char * tmpnam (char *RESULT)'
+-     `stdio.h' (ISO):  *Note Temporary Files::.
+-
+-`char * tmpnam_r (char *RESULT)'
+-     `stdio.h' (GNU):  *Note Temporary Files::.
+-
+-`int toascii (int C)'
+-     `ctype.h' (SVID, BSD):  *Note Case Conversion::.
+-
+-`int _tolower (int C)'
+-     `ctype.h' (SVID):  *Note Case Conversion::.
+-
+-`int tolower (int C)'
+-     `ctype.h' (ISO):  *Note Case Conversion::.
+-
+-`tcflag_t TOSTOP'
+-     `termios.h' (POSIX.1):  *Note Local Modes::.
+-
+-`int _toupper (int C)'
+-     `ctype.h' (SVID):  *Note Case Conversion::.
+-
+-`int toupper (int C)'
+-     `ctype.h' (ISO):  *Note Case Conversion::.
+-
+-`wint_t towctrans (wint_t WC, wctrans_t DESC)'
+-     `wctype.h' (ISO):  *Note Wide Character Case Conversion::.
+-
+-`wint_t towlower (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Wide Character Case Conversion::.
+-
+-`wint_t towupper (wint_t WC)'
+-     `wctype.h' (ISO):  *Note Wide Character Case Conversion::.
+-
+-`double trunc (double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`int truncate (const char *NAME, off_t LENGTH)'
+-     `unistd.h' (X/Open):  *Note Truncating Files::.
+-
+-`int truncate64 (const char *NAME, off64_t LENGTH)'
+-     `unistd.h' (Unix98):  *Note Truncating Files::.
+-
+-`float truncf (float X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`long double truncl (long double X)'
+-     `math.h' (ISO):  *Note Rounding Functions::.
+-
+-`TRY_AGAIN'
+-     `netdb.h' (BSD):  *Note Host Names::.
+-
+-`void * tsearch (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)'
+-     `search.h' (SVID):  *Note Tree Search Function::.
+-
+-`char * ttyname (int FILEDES)'
+-     `unistd.h' (POSIX.1):  *Note Is It a Terminal::.
+-
+-`int ttyname_r (int FILEDES, char *BUF, size_t LEN)'
+-     `unistd.h' (POSIX.1):  *Note Is It a Terminal::.
+-
+-`void twalk (const void *ROOT, __action_fn_t ACTION)'
+-     `search.h' (SVID):  *Note Tree Search Function::.
+-
+-`char * tzname [2]'
+-     `time.h' (POSIX.1):  *Note Time Zone Functions::.
+-
+-`int TZNAME_MAX'
+-     `limits.h' (POSIX.1):  *Note General Limits::.
+-
+-`void tzset (void)'
+-     `time.h' (POSIX.1):  *Note Time Zone Functions::.
+-
+-`UCHAR_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`uid_t'
+-     `sys/types.h' (POSIX.1):  *Note Reading Persona::.
+-
+-`UINT_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`ULONG_LONG_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`ULONG_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`mode_t umask (mode_t MASK)'
+-     `sys/stat.h' (POSIX.1):  *Note Setting Permissions::.
+-
+-`int uname (struct utsname *INFO)'
+-     `sys/utsname.h' (POSIX.1):  *Note Hardware/Software Type ID::.
+-
+-`int ungetc (int C, FILE *STREAM)'
+-     `stdio.h' (ISO):  *Note How Unread::.
+-
+-`union wait'
+-     `sys/wait.h' (BSD):  *Note BSD Wait Functions::.
+-
+-`int unlink (const char *FILENAME)'
+-     `unistd.h' (POSIX.1):  *Note Deleting Files::.
+-
+-`int unlockpt (int FILEDES)'
+-     `stdlib.h' (SVID, XPG4.2):  *Note Allocation::.
+-
+-`void unsetenv (const char *NAME)'
+-     `stdlib.h' (BSD):  *Note Environment Access::.
+-
+-`void updwtmp (const char *WTMP_FILE, const struct utmp *UTMP)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`USER_PROCESS'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`USER_PROCESS'
+-     `utmpx.h' (XPG4.2):  *Note XPG Functions::.
+-
+-`USHRT_MAX'
+-     `limits.h' (ISO):  *Note Range of Type::.
+-
+-`int utime (const char *FILENAME, const struct utimbuf *TIMES)'
+-     `time.h' (POSIX.1):  *Note File Times::.
+-
+-`int utimes (const char *FILENAME, struct timeval TVP[2])'
+-     `sys/time.h' (BSD):  *Note File Times::.
+-
+-`int utmpname (const char *FILE)'
+-     `utmp.h' (SVID):  *Note Manipulating the Database::.
+-
+-`va_alist'
+-     `varargs.h' (Unix):  *Note Old Varargs::.
+-
+-`TYPE va_arg (va_list AP, TYPE)'
+-     `stdarg.h' (ISO):  *Note Argument Macros::.
+-
+-`void __va_copy (va_list DEST, va_list SRC)'
+-     `stdarg.h' (GNU):  *Note Argument Macros::.
+-
+-`va_dcl'
+-     `varargs.h' (Unix):  *Note Old Varargs::.
+-
+-`void va_end (va_list AP)'
+-     `stdarg.h' (ISO):  *Note Argument Macros::.
+-
+-`va_list'
+-     `stdarg.h' (ISO):  *Note Argument Macros::.
+-
+-`void * valloc (size_t SIZE)'
+-     `malloc.h', `stdlib.h' (BSD):  *Note Aligned Memory Blocks::.
+-
+-`int vasprintf (char **PTR, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Output::.
+-
+-`void va_start (va_list AP)'
+-     `varargs.h' (Unix):  *Note Old Varargs::.
+-
+-`void va_start (va_list AP, LAST-REQUIRED)'
+-     `stdarg.h' (ISO):  *Note Argument Macros::.
+-
+-`int VDISCARD'
+-     `termios.h' (BSD):  *Note Other Special::.
+-
+-`int VDSUSP'
+-     `termios.h' (BSD):  *Note Signal Characters::.
+-
+-`int VEOF'
+-     `termios.h' (POSIX.1):  *Note Editing Characters::.
+-
+-`int VEOL'
+-     `termios.h' (POSIX.1):  *Note Editing Characters::.
+-
+-`int VEOL2'
+-     `termios.h' (BSD):  *Note Editing Characters::.
+-
+-`int VERASE'
+-     `termios.h' (POSIX.1):  *Note Editing Characters::.
+-
+-`int versionsort (const void *A, const void *B)'
+-     `dirent.h' (GNU):  *Note Scanning Directory Content::.
+-
+-`int versionsort64 (const void *A, const void *B)'
+-     `dirent.h' (GNU):  *Note Scanning Directory Content::.
+-
+-`pid_t vfork (void)'
+-     `unistd.h' (BSD):  *Note Creating a Process::.
+-
+-`int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (ISO):  *Note Variable Arguments Output::.
+-
+-`int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Input::.
+-
+-`int VINTR'
+-     `termios.h' (POSIX.1):  *Note Signal Characters::.
+-
+-`int VKILL'
+-     `termios.h' (POSIX.1):  *Note Editing Characters::.
+-
+-`int VLNEXT'
+-     `termios.h' (BSD):  *Note Other Special::.
+-
+-`int VMIN'
+-     `termios.h' (POSIX.1):  *Note Noncanonical Input::.
+-
+-`int vprintf (const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (ISO):  *Note Variable Arguments Output::.
+-
+-`int VQUIT'
+-     `termios.h' (POSIX.1):  *Note Signal Characters::.
+-
+-`int VREPRINT'
+-     `termios.h' (BSD):  *Note Editing Characters::.
+-
+-`int vscanf (const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Input::.
+-
+-`int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Output::.
+-
+-`int vsprintf (char *S, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (ISO):  *Note Variable Arguments Output::.
+-
+-`int vsscanf (const char *S, const char *TEMPLATE, va_list AP)'
+-     `stdio.h' (GNU):  *Note Variable Arguments Input::.
+-
+-`int VSTART'
+-     `termios.h' (POSIX.1):  *Note Start/Stop Characters::.
+-
+-`int VSTATUS'
+-     `termios.h' (BSD):  *Note Other Special::.
+-
+-`int VSTOP'
+-     `termios.h' (POSIX.1):  *Note Start/Stop Characters::.
+-
+-`int VSUSP'
+-     `termios.h' (POSIX.1):  *Note Signal Characters::.
+-
+-`int VTIME'
+-     `termios.h' (POSIX.1):  *Note Noncanonical Input::.
+-
+-`int VWERASE'
+-     `termios.h' (BSD):  *Note Editing Characters::.
+-
+-`pid_t wait (int *STATUS-PTR)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion::.
+-
+-`pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct rusage *USAGE)'
+-     `sys/wait.h' (BSD):  *Note BSD Wait Functions::.
+-
+-`pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS, struct rusage *USAGE)'
+-     `sys/wait.h' (BSD):  *Note Process Completion::.
+-
+-`pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion::.
+-
+-`WCHAR_MAX'
+-     `limits.h' (GNU):  *Note Range of Type::.
+-
+-`wint_t WCHAR_MAX'
+-     `wchar.h' (ISO):  *Note Extended Char Intro::.
+-
+-`wint_t WCHAR_MIN'
+-     `wchar.h' (ISO):  *Note Extended Char Intro::.
+-
+-`wchar_t'
+-     `stddef.h' (ISO):  *Note Extended Char Intro::.
+-
+-`int WCOREDUMP (int STATUS)'
+-     `sys/wait.h' (BSD):  *Note Process Completion Status::.
+-
+-`size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t *restrict PS)'
+-     `wchar.h' (ISO):  *Note Converting a Character::.
+-
+-`size_t wcsnrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict PS)'
+-     `wchar.h' (GNU):  *Note Converting Strings::.
+-
+-`size_t wcsrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t LEN, mbstate_t *restrict PS)'
+-     `wchar.h' (ISO):  *Note Converting Strings::.
+-
+-`size_t wcstombs (char *STRING, const wchar_t *WSTRING, size_t SIZE)'
+-     `stdlib.h' (ISO):  *Note Non-reentrant String Conversion::.
+-
+-`int wctob (wint_t C)'
+-     `wchar.h' (ISO):  *Note Converting a Character::.
+-
+-`int wctomb (char *STRING, wchar_t WCHAR)'
+-     `stdlib.h' (ISO):  *Note Non-reentrant Character Conversion::.
+-
+-`wctrans_t wctrans (const char *PROPERTY)'
+-     `wctype.h' (ISO):  *Note Wide Character Case Conversion::.
+-
+-`wctrans_t'
+-     `wctype.h' (ISO):  *Note Wide Character Case Conversion::.
+-
+-`wctype_t wctype (const char *PROPERTY)'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`wctype_t'
+-     `wctype.h' (ISO):  *Note Classification of Wide Characters::.
+-
+-`wint_t WEOF'
+-     `wchar.h' (ISO):  *Note Extended Char Intro::.
+-
+-`int WEXITSTATUS (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`int WIFEXITED (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`int WIFSIGNALED (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`int WIFSTOPPED (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`wint_t'
+-     `wchar.h' (ISO):  *Note Extended Char Intro::.
+-
+-`int W_OK'
+-     `unistd.h' (POSIX.1):  *Note Testing File Access::.
+-
+-`int wordexp (const char *WORDS, wordexp_t *WORD-VECTOR-PTR, int FLAGS)'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`wordexp_t'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`void wordfree (wordexp_t *WORD-VECTOR-PTR)'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_APPEND'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`WRDE_BADCHAR'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_BADVAL'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_CMDSUB'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_DOOFFS'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`WRDE_NOCMD'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`WRDE_NOSPACE'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_REUSE'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`WRDE_SHOWERR'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`WRDE_SYNTAX'
+-     `wordexp.h' (POSIX.2):  *Note Calling Wordexp::.
+-
+-`WRDE_UNDEF'
+-     `wordexp.h' (POSIX.2):  *Note Flags for Wordexp::.
+-
+-`ssize_t write (int FILEDES, const void *BUFFER, size_t SIZE)'
+-     `unistd.h' (POSIX.1):  *Note I/O Primitives::.
+-
+-`int WSTOPSIG (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`int WTERMSIG (int STATUS)'
+-     `sys/wait.h' (POSIX.1):  *Note Process Completion Status::.
+-
+-`int X_OK'
+-     `unistd.h' (POSIX.1):  *Note Testing File Access::.
+-
+-`_XOPEN_SOURCE'
+-     (X/Open):  *Note Feature Test Macros::.
+-
+-`_XOPEN_SOURCE_EXTENDED'
+-     (X/Open):  *Note Feature Test Macros::.
+-
+-`double y0 (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float y0f (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double y0l (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`double y1 (double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float y1f (float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double y1l (long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`double yn (int n, double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`float ynf (int n, float X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+-`long double ynl (int n, long double X)'
+-     `math.h' (SVID):  *Note Special Functions::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-46 glibc-2.1.3/manual/libc.info-46
+--- ../glibc-2.1.3/manual/libc.info-46	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-46	1969-12-31 16:00:00.000000000 -0800
+@@ -1,986 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Installation,  Next: Maintenance,  Prev: Library Summary,  Up: Top
+-
+-Installing the GNU C Library
+-****************************
+-
+-   Before you do anything else, you should read the file `FAQ' found at
+-the top level of the source tree.  This file answers common questions
+-and describes problems you may experience with compilation and
+-installation.  It is updated more frequently than this manual.
+-
+-   Features can be added to GNU Libc via "add-on" bundles.  These are
+-separate tarfiles which you unpack into the top level of the source
+-tree.  Then you give `configure' the `--enable-add-ons' option to
+-activate them, and they will be compiled into the library.  As of the
+-2.1 release, two important components of glibc are distributed as
+-"official" add-ons.  Unless you are doing an unusual installation, you
+-should get them both.
+-
+-   Support for POSIX threads is maintained by someone else, so it's in a
+-separate package.  It is only available for Linux systems, but this will
+-change in the future.  Get it from the same place you got the main
+-bundle; the file is `glibc-linuxthreads-VERSION.tar.gz'.  Support for
+-the `crypt' function is distributed separately because of United States
+-export restrictions.  If you are outside the US or Canada, you must get
+-`crypt' support from a site outside the US, such as `ftp.gwdg.de'.
+-`ftp.gwdg.de' has the crypt distribution in `pub/linux/glibc'.  (Most
+-non-US mirrors of `ftp.gnu.org' will have it too.)  The file you need
+-is `glibc-crypt-VERSION.tar.gz'.
+-
+-   You will need recent versions of several GNU tools: definitely GCC
+-and GNU Make, and possibly others.  *Note Tools for Compilation::,
+-below.
+-
+-* Menu:
+-
+-* Configuring and compiling::   How to compile and test GNU libc.
+-* Running make install::        How to install it once you've got it compiled.
+-* Tools for Compilation::       You'll need these first.
+-* Supported Configurations::    What it runs on, what it doesn't.
+-* Linux::                       Specific advice for Linux systems.
+-* Reporting Bugs::              So they'll get fixed.
+-
+-
+-File: libc.info,  Node: Configuring and compiling,  Next: Running make install,  Up: Installation
+-
+-Configuring and compiling GNU Libc
+-==================================
+-
+-   GNU Libc can be compiled in the source directory but we'd advise to
+-build in a separate build directory.  For example, if you have unpacked
+-the glibc sources in `/src/gnu/glibc-2.1.0', create a directory
+-`/src/gnu/glibc-build' to put the object files in.
+-
+-   From your object directory, run the shell script `configure' found
+-at the top level of the source tree.  In the scenario above, you'd type
+-
+-     $ ../glibc-2.1.0/configure ARGS...
+-
+-   Please note that even if you're building in a separate build
+-directory, the compiliation needs to modify a few files in the source
+-directory, especially some files in the manual subdirectory.
+-
+-`configure' takes many options, but you can get away with knowing only
+-two: `--prefix' and `--enable-add-ons'.  The `--prefix' option tells
+-configure where you want glibc installed.  This defaults to
+-`/usr/local'.  The `--enable-add-ons' option tells configure to use all
+-the add-on bundles it finds in the source directory.  Since important
+-functionality is provided in add-ons, you should always give this
+-option.
+-
+-   It may also be useful to set the CC and CFLAGS variables in the
+-environment when running `configure'.  CC selects the C compiler that
+-will be used, and CFLAGS sets optimization options for the compiler.
+-
+-   Here are all the useful options known by `configure':
+-
+-`--prefix=DIRECTORY'
+-     Install machine-independent data files in subdirectories of
+-     `DIRECTORY'.  The default is to install in `/usr/local'.
+-
+-`--exec-prefix=DIRECTORY'
+-     Install the library and other machine-dependent files in
+-     subdirectories of `DIRECTORY'.  The default is to the `--prefix'
+-     directory if that option is given, or `/usr/local' otherwise.
+-
+-`--with-headers=DIRECTORY'
+-     Look for kernel header files in DIRECTORY, not `/usr/include'.
+-     Glibc needs information from the kernel's private header files.
+-     It will normally look in `/usr/include' for them, but if you give
+-     this option, it will look in DIRECTORY instead.
+-
+-     This option is primarily of use on a system where the headers in
+-     `/usr/include' come from an older version of glibc.  Conflicts can
+-     occasionally happen in this case.  Note that Linux libc5 qualifies
+-     as an older version of glibc.  You can also use this option if you
+-     want to compile glibc with a newer set of kernel headers than the
+-     ones found in `/usr/include'.
+-
+-`--enable-add-ons[=LIST]'
+-     Enable add-on packages in your source tree.  If this option is
+-     given with no list, it enables all the add-on packages it finds.
+-     If you do not wish to use some add-on package that you have
+-     present in your source tree, give this option a list of the
+-     add-ons that you *do* want used, like this:
+-     `--enable-add-ons=crypt,linuxthreads'
+-
+-`--with-binutils=DIRECTORY'
+-     Use the binutils (assembler and linker) in `DIRECTORY', not the
+-     ones the C compiler would default to.  You could use this option if
+-     the default binutils on your system cannot deal with all the
+-     constructs in the GNU C library.  (`configure' will detect the
+-     problem and suppress these constructs, so the library will still
+-     be usable, but functionality may be lost--for example, you can not
+-     build a shared libc with old binutils.)
+-
+-`--without-fp'
+-     Use this option if your computer lacks hardware floating-point
+-     support and your operating system does not emulate an FPU.
+-
+-`--disable-shared'
+-     Don't build shared libraries even if we could.  Not all systems
+-     support shared libraries; you need ELF support and (currently) the
+-     GNU linker.
+-
+-`--disable-profile'
+-     Don't build libraries with profiling information.  You may want to
+-     use this option if you don't plan to do profiling.
+-
+-`--enable-omitfp'
+-     Use maximum optimization for the normal (static and shared)
+-     libraries, and compile separate static libraries with debugging
+-     information and no optimisation.  We recommend against this.  The
+-     extra optimization doesn't gain you much, it may provoke compiler
+-     bugs, and you won't be able to trace bugs through the C library.
+-
+-`--disable-versioning'
+-     Don't compile the shared libraries with symbol version information.
+-     Doing this will make the library that's built incompatible with old
+-     binaries, so it's not recommended.
+-
+-`--enable-static-nss'
+-     Compile static versions of the NSS (Name Service Switch) libraries.
+-     This is not recommended because it defeats the purpose of NSS; a
+-     program linked statically with the NSS libraries cannot be
+-     dynamically reconfigured to use a different name database.
+-
+-`--build=BUILD-SYSTEM'
+-`--host=HOST-SYSTEM'
+-     These options are for cross-compiling.  If you give them both and
+-     BUILD-SYSTEM is different from HOST-SYSTEM, `configure' will
+-     prepare to cross-compile glibc from BUILD-SYSTEM to be used on
+-     HOST-SYSTEM.  You'll probably need the `--with-headers' option
+-     too, and you may have to override CONFIGURE's selection of the
+-     compiler and/or binutils.
+-
+-     If you give just `--host', configure will prepare for a native
+-     compile but use what you say instead of guessing what your system
+-     is.  This is most useful to change the CPU submodel.  For example,
+-     if configure guesses your machine as `i586-pc-linux-gnu' but you
+-     want to compile a library for 386es, give
+-     `--host=i386-pc-linux-gnu' or just `--host=i386-linux' and add the
+-     appropriate compiler flags (`-mcpu=i386' will do the trick) to
+-     CFLAGS.
+-
+-     If you give just `--build', configure will get confused.
+-
+-   To build the library and related programs, type `make'.  This will
+-produce a lot of output, some of which may look like errors from `make'
+-but isn't.  Look for error messages from `make' containing `***'.
+-Those indicate that something is really wrong.
+-
+-   The compilation process takes several hours even on fast hardware.
+-Expect at least two hours for the default configuration on i586 for
+-Linux.  For Hurd times are much longer.  Except for EGCS 1.1 and GCC
+-2.95 (and later versions of GCC), all supported versions of GCC have a
+-problem which causes them to take several minutes to compile certain
+-files in the iconvdata directory.  Do not panic if the compiler appears
+-to hang.
+-
+-   If you want to run a parallel make, you can't just give `make' the
+-`-j' option, because it won't be passed down to the sub-makes.
+-Instead, edit the generated `Makefile' and uncomment the line
+-
+-     # PARALLELMFLAGS = -j 4
+-
+-You can change the `4' to some other number as appropriate for your
+-system.  Instead of changing the `Makefile', you could give this option
+-directly to `make' and call it as, e.g.  `make PARALLELMFLAGS=-j4'.  If
+-you're building in the source directory, you've got to use the latter
+-approach since in this case no new `Makefile' is generated which you
+-can change.
+-
+-   To build and run some test programs which exercise some of the
+-library facilities, type `make check'.  This should complete
+-successfully; if it doesn't, do not use the built library, and report a
+-bug.  *Note Reporting Bugs::, for how to do that.  Note that some of
+-the tests assume they are not being run by `root'.  We recommend you
+-compile and test glibc as an unprivileged user.
+-
+-   To format the `GNU C Library Reference Manual' for printing, type
+-`make dvi'.  You need a working TeX installation to do this.  The
+-distribution already includes the on-line formatted version of the
+-manual, as Info files.  You can regenerate those with `make info', but
+-it shouldn't be necessary.
+-
+-
+-File: libc.info,  Node: Running make install,  Next: Tools for Compilation,  Prev: Configuring and compiling,  Up: Installation
+-
+-Installing the C Library
+-========================
+-
+-   To install the library and its header files, and the Info files of
+-the manual, type `make install'.  This will build things if necessary,
+-before installing them.  Don't rely on that; compile everything first.
+-If you are installing glibc as your primary C library, we recommend you
+-shut the system down to single-user mode first, and reboot afterward.
+-This minimizes the risk of breaking things when the library changes out
+-from underneath.
+-
+-   If you are upgrading from a previous installation of glibc 2.0 or
+-2.1, `make install' will do the entire job.  If you're upgrading from
+-Linux libc5 or some other C library, you need to rename the old
+-`/usr/include' directory out of the way before running `make install',
+-or you will end up with a mixture of header files from both libraries,
+-and you won't be able to compile anything.  You may also need to
+-reconfigure GCC to work with the new library.  The easiest way to do
+-that is to figure out the compiler switches to make it work again
+-(`-Wl,--dynamic-linker=/lib/ld-linux.so.2' should work on Linux
+-systems) and use them to recompile gcc.  You can also edit the specs
+-file (`/usr/lib/gcc-lib/TARGET/VERSION/specs'), but that is a bit of a
+-black art.
+-
+-   You can install glibc somewhere other than where you configured it
+-to go by setting the `install_root' variable on the command line for
+-`make install'.  The value of this variable is prepended to all the
+-paths for installation.  This is useful when setting up a chroot
+-environment or preparing a binary distribution.  The directory should be
+-specified with an absolute file name.
+-
+-   Glibc 2.1 includes two daemons, `nscd' and `utmpd', which you may or
+-may not want to run.  `nscd' caches name service lookups; it can
+-dramatically improve performance with NIS+, and may help with DNS as
+-well.  `utmpd' allows programs that use the old format for the `utmp'
+-file to coexist with new programs.  For more information see the file
+-`login/README.utmpd'.
+-
+-   One auxiliary program, `/usr/libexec/pt_chown', is installed setuid
+-`root'.  This program is invoked by the `grantpt' function; it sets the
+-permissions on a pseudoterminal so it can be used by the calling
+-process.  This means programs like `xterm' and `screen' do not have to
+-be setuid to get a pty.  (There may be other reasons why they need
+-privileges.)  If you are using a 2.1 or newer Linux kernel with the
+-`devptsfs' or `devfs' filesystems providing pty slaves, you don't need
+-this program; otherwise you do.  The source for `pt_chown' is in
+-`login/programs/pt_chown.c'.
+-
+-   After installation you might want to configure the timezone and
+-locale installation of your system.  The GNU C library comes with a
+-locale database which gets configured with `localedef'.  For example, to
+-set up a German locale with name `de_DE', simply issue the command
+-`localedef -i de_DE -f ISO-8859-1 de_DE'.  To configure all locales
+-that are supported by glibc, you can issue from your build directory the
+-command `make localedata/install-locales'.
+-
+-   To configure the locally used timezone, you can either set the `TZ'
+-environment variable.  The script `tzselect' helps you to select the
+-right value.  As an example for Germany, tzselect would tell you to use
+-`TZ='Europe/Berlin''.  For a system wide installation (the given paths
+-are for an installation with `--prefix=/usr'), link the timezone file
+-which is in `/usr/share/zoneinfo' to the file `/etc/localtime'.  For
+-Germany, you might execute `ln -s /usr/share/zoneinfo/Europe/Berlin
+-/etc/localtime'.
+-
+-
+-File: libc.info,  Node: Tools for Compilation,  Next: Supported Configurations,  Prev: Running make install,  Up: Installation
+-
+-Recommended Tools for Compilation
+-=================================
+-
+-   We recommend installing the following GNU tools before attempting to
+-build the GNU C library:
+-
+-   * GNU `make' 3.75
+-
+-     You need the latest version of GNU `make'.  Modifying the GNU C
+-     Library to work with other `make' programs would be so hard that we
+-     recommend you port GNU `make' instead.  *Really.*  We recommend
+-     version GNU `make' version 3.75 or 3.77.  All earlier versions
+-     have severe bugs or lack features. Version 3.76 is known to have
+-     bugs which only show up in big projects like GNU `libc'.  Version
+-     3.76.1 seems OK but some people have reported problems.
+-
+-   * EGCS 1.1.1, 1.1 or 1.0.3, or GCC 2.8.1, 2.95, 2.95.1
+-
+-     The GNU C library can only be compiled with the GNU C compiler
+-     family.  As of the 2.1 release, EGCS 1.0.3 or higher is required.
+-     GCC 2.8.1 can also be used (but see the FAQ for reasons why you
+-     might not want to).  Earlier versions simply are too buggy.  As of
+-     this writing, GCC 2.95.1 is the compiler we advise to use.
+-
+-     You can use whatever compiler you like to compile programs that
+-     use GNU libc, but be aware that both GCC 2.7 and 2.8 have bugs in
+-     their floating-point support that may be triggered by the math
+-     library.
+-
+-     On Alpha machines you need at least EGCS 1.1.1.  Earlier versions
+-     don't work reliably.
+-
+-     For PPC you might need some patches even on top of the last EGCS
+-     version.  See the FAQ.
+-
+-   * GNU `binutils' 2.9.1, 2.9.1.0.16, or later 2.9.1.0.x release
+-
+-     You must use GNU binutils (as and ld) if you want to build a shared
+-     library.  Even if you don't, we recommend you use them anyway.  No
+-     one has tested compilation with non-GNU binutils in a long time.
+-
+-     The quality of binutils releases has varied a bit recently.  The
+-     bugs are in obscure features, but glibc uses quite a few of those.
+-     2.9.1, 2.9.1.0.16, and later 2.9.1.0.x releases are known to
+-     work.  Versions after 2.8.1.0.23 may or may not work.  Older
+-     versions definitely don't.  2.9.1.0.16 or higher is required on
+-     some platforms, like PPC and Arm.
+-
+-     For PPC you might need some patches even on top of the last
+-     binutils version.  See the FAQ.
+-
+-   * GNU `texinfo' 3.12f
+-
+-     To correctly translate and install the Texinfo documentation you
+-     need this version of the `texinfo' package.  Earlier versions do
+-     not understand all the tags used in the document, and the
+-     installation mechanism for the info files is not present or works
+-     differently.
+-
+-   * GNU `awk' 3.0, or some other POSIX awk
+-
+-     Awk is used in several places to generate files.  The scripts
+-     should work with any POSIX-compliant awk implementation; `gawk'
+-     3.0 and `mawk' 1.3 are known to work.
+-
+-   * Perl 5
+-
+-     Perl is not required, but it is used if present to test the
+-     installation.  We may decide to use it elsewhere in the future.
+-
+-If you change any of the `configure.in' files you will also need
+-
+-   * GNU `autoconf' 2.12 or higher
+-
+-and if you change any of the message translation files you will need
+-
+-   * GNU `gettext' 0.10.35 or later (version 0.10.35 is a alpha release
+-     and available via ftp from alpha.gnu.org/gnu)
+-
+-You may also need these packages if you upgrade your source tree using
+-patches, although we try to avoid this.
+-
+-
+-File: libc.info,  Node: Supported Configurations,  Next: Linux,  Prev: Tools for Compilation,  Up: Installation
+-
+-Supported Configurations
+-========================
+-
+-   The GNU C Library currently supports configurations that match the
+-following patterns:
+-
+-     alpha-*-linux
+-     arm-*-linux
+-     arm-*-linuxaout
+-     arm-*-none
+-     iX86-*-gnu
+-     iX86-*-linux
+-     m68k-*-linux
+-     powerpc-*-linux
+-     sparc-*-linux
+-     sparc64-*-linux
+-
+-   Former releases of this library (version 1.09.1 and perhaps earlier
+-versions) used to run on the following configurations:
+-
+-     alpha-dec-osf1
+-     alpha-*-linuxecoff
+-     iX86-*-bsd4.3
+-     iX86-*-isc2.2
+-     iX86-*-isc3.N
+-     iX86-*-sco3.2
+-     iX86-*-sco3.2v4
+-     iX86-*-sysv
+-     iX86-*-sysv4
+-     iX86-force_cpu386-none
+-     iX86-sequent-bsd
+-     i960-nindy960-none
+-     m68k-hp-bsd4.3
+-     m68k-mvme135-none
+-     m68k-mvme136-none
+-     m68k-sony-newsos3
+-     m68k-sony-newsos4
+-     m68k-sun-sunos4.N
+-     mips-dec-ultrix4.N
+-     mips-sgi-irix4.N
+-     sparc-sun-solaris2.N
+-     sparc-sun-sunos4.N
+-
+-   Since no one has volunteered to test and fix these configurations,
+-they are not supported at the moment.  They probably don't compile;
+-they definitely don't work anymore.  Porting the library is not hard.
+-If you are interested in doing a port, please contact the glibc
+-maintainers by sending electronic mail to <bug-glibc@gnu.org>.
+-
+-   Each case of `iX86' can be `i386', `i486', `i586', or `i686'.  All
+-of those configurations produce a library that can run on this
+-processor and newer processors.  The GCC compiler by default generates
+-code that's optimized for the machine it's configured for and will use
+-the instructions available on that machine.  For example if your GCC is
+-configured for `i686', gcc will optimize for `i686' and might issue
+-some `i686' specific instructions.  To generate code for other models,
+-you have to configure for that model and give GCC the appropriate
+-`-march=' and `-mcpu=' compiler switches via CFLAGS.
+-
+-
+-File: libc.info,  Node: Linux,  Next: Reporting Bugs,  Prev: Supported Configurations,  Up: Installation
+-
+-Specific advice for Linux systems
+-=================================
+-
+-   If you are installing GNU libc on a Linux system, you need to have
+-the header files from a 2.2 kernel around for reference.  You do not
+-need to use the 2.2 kernel, just have its headers where glibc can get
+-at them.  The easiest way to do this is to unpack it in a directory
+-such as `/usr/src/linux-2.2.1'.  In that directory, run `make config'
+-and accept all the defaults.  Then run `make include/linux/version.h'.
+-Finally, configure glibc with the option
+-`--with-headers=/usr/src/linux-2.2.1/include'.  Use the most recent
+-kernel you can get your hands on.
+-
+-   An alternate tactic is to unpack the 2.2 kernel and run `make
+-config' as above.  Then rename or delete `/usr/include', create a new
+-`/usr/include', and make the usual symbolic links of
+-`/usr/include/linux' and `/usr/include/asm' into the 2.2 kernel
+-sources.  You can then configure glibc with no special options.  This
+-tactic is recommended if you are upgrading from libc5, since you need
+-to get rid of the old header files anyway.
+-
+-   Note that `/usr/include/net' and `/usr/include/scsi' should *not* be
+-symlinks into the kernel sources.  GNU libc provides its own versions
+-of these files.
+-
+-   Linux expects some components of the libc installation to be in
+-`/lib' and some in `/usr/lib'.  This is handled automatically if you
+-configure glibc with `--prefix=/usr'.  If you set some other prefix or
+-allow it to default to `/usr/local', then all the components are
+-installed there.
+-
+-   If you are upgrading from libc5, you need to recompile every shared
+-library on your system against the new library for the sake of new code,
+-but keep the old libraries around for old binaries to use.  This is
+-complicated and difficult.  Consult the Glibc2 HOWTO at
+-`http://www.imaxx.net/~thrytis/glibc' for details.
+-
+-   You cannot use `nscd' with 2.0 kernels, due to bugs in the
+-kernel-side thread support.  `nscd' happens to hit these bugs
+-particularly hard, but you might have problems with any threaded
+-program.
+-
+-
+-File: libc.info,  Node: Reporting Bugs,  Prev: Linux,  Up: Installation
+-
+-Reporting Bugs
+-==============
+-
+-   There are probably bugs in the GNU C library.  There are certainly
+-errors and omissions in this manual.  If you report them, they will get
+-fixed.  If you don't, no one will ever know about them and they will
+-remain unfixed for all eternity, if not longer.
+-
+-   It is a good idea to check first that the problem was not reported
+-before.  Bugs are documented in two places: The file `BUGS' describes a
+-number of well known bugs and the bug tracking system has a WWW
+-interface at `http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl'.  The
+-WWW interface gives you access to open and closed reports.  The closed
+-reports normally include a patch or a hint on solving the problem.
+-
+-   To report a bug, first you must find it.  Hopefully, this will be the
+-hard part.  Once you've found a bug, make sure it's really a bug.  A
+-good way to do this is to see if the GNU C library behaves the same way
+-some other C library does.  If so, probably you are wrong and the
+-libraries are right (but not necessarily).  If not, one of the libraries
+-is probably wrong.  It might not be the GNU library.  Many historical
+-Unix C libraries permit things that we don't, such as closing a file
+-twice.
+-
+-   If you think you have found some way in which the GNU C library does
+-not conform to the ISO and POSIX standards (*note Standards and
+-Portability::.), that is definitely a bug.  Report it!
+-
+-   Once you're sure you've found a bug, try to narrow it down to the
+-smallest test case that reproduces the problem.  In the case of a C
+-library, you really only need to narrow it down to one library function
+-call, if possible.  This should not be too difficult.
+-
+-   The final step when you have a simple test case is to report the bug.
+-Do this using the `glibcbug' script.  It is installed with libc, or if
+-you haven't installed it, will be in your build directory.  Send your
+-test case, the results you got, the results you expected, and what you
+-think the problem might be (if you've thought of anything).  `glibcbug'
+-will insert the configuration information we need to see, and ship the
+-report off to <bugs@gnu.org>.  Don't send a message there directly; it
+-is fed to a program that expects mail to be formatted in a particular
+-way.  Use the script.
+-
+-   If you are not sure how a function should behave, and this manual
+-doesn't tell you, that's a bug in the manual.  Report that too!  If the
+-function's behavior disagrees with the manual, then either the library
+-or the manual has a bug, so report the disagreement.  If you find any
+-errors or omissions in this manual, please report them to the Internet
+-address <bug-glibc-manual@gnu.org>.  If you refer to specific sections
+-when reporting on the manual, please include the section names for
+-easier identification.
+-
+-
+-File: libc.info,  Node: Maintenance,  Next: Contributors,  Prev: Installation,  Up: Top
+-
+-Library Maintenance
+-*******************
+-
+-* Menu:
+-
+-* Source Layout::         How to add new functions or header files
+-                             to the GNU C library.
+-* Porting::               How to port the GNU C library to
+-                             a new machine or operating system.
+-
+-
+-File: libc.info,  Node: Source Layout,  Next: Porting,  Up: Maintenance
+-
+-Adding New Functions
+-====================
+-
+-   The process of building the library is driven by the makefiles, which
+-make heavy use of special features of GNU `make'.  The makefiles are
+-very complex, and you probably don't want to try to understand them.
+-But what they do is fairly straightforward, and only requires that you
+-define a few variables in the right places.
+-
+-   The library sources are divided into subdirectories, grouped by
+-topic.
+-
+-   The `string' subdirectory has all the string-manipulation functions,
+-`math' has all the mathematical functions, etc.
+-
+-   Each subdirectory contains a simple makefile, called `Makefile',
+-which defines a few `make' variables and then includes the global
+-makefile `Rules' with a line like:
+-
+-     include ../Rules
+-
+-The basic variables that a subdirectory makefile defines are:
+-
+-`subdir'
+-     The name of the subdirectory, for example `stdio'.  This variable
+-     *must* be defined.
+-
+-`headers'
+-     The names of the header files in this section of the library, such
+-     as `stdio.h'.
+-
+-`routines'
+-`aux'
+-     The names of the modules (source files) in this section of the
+-     library.  These should be simple names, such as `strlen' (rather
+-     than complete file names, such as `strlen.c').  Use `routines' for
+-     modules that define functions in the library, and `aux' for
+-     auxiliary modules containing things like data definitions.  But the
+-     values of `routines' and `aux' are just concatenated, so there
+-     really is no practical difference.
+-
+-`tests'
+-     The names of test programs for this section of the library.  These
+-     should be simple names, such as `tester' (rather than complete file
+-     names, such as `tester.c').  `make tests' will build and run all
+-     the test programs.  If a test program needs input, put the test
+-     data in a file called `TEST-PROGRAM.input'; it will be given to
+-     the test program on its standard input.  If a test program wants
+-     to be run with arguments, put the arguments (all on a single line)
+-     in a file called `TEST-PROGRAM.args'.  Test programs should exit
+-     with zero status when the test passes, and nonzero status when the
+-     test indicates a bug in the library or error in building.
+-
+-`others'
+-     The names of "other" programs associated with this section of the
+-     library.  These are programs which are not tests per se, but are
+-     other small programs included with the library.  They are built by
+-     `make others'.
+-
+-`install-lib'
+-`install-data'
+-`install'
+-     Files to be installed by `make install'.  Files listed in
+-     `install-lib' are installed in the directory specified by `libdir'
+-     in `configparms' or `Makeconfig' (*note Installation::.).  Files
+-     listed in `install-data' are installed in the directory specified
+-     by `datadir' in `configparms' or `Makeconfig'.  Files listed in
+-     `install' are installed in the directory specified by `bindir' in
+-     `configparms' or `Makeconfig'.
+-
+-`distribute'
+-     Other files from this subdirectory which should be put into a
+-     distribution tar file.  You need not list here the makefile itself
+-     or the source and header files listed in the other standard
+-     variables.  Only define `distribute' if there are files used in an
+-     unusual way that should go into the distribution.
+-
+-`generated'
+-     Files which are generated by `Makefile' in this subdirectory.
+-     These files will be removed by `make clean', and they will never
+-     go into a distribution.
+-
+-`extra-objs'
+-     Extra object files which are built by `Makefile' in this
+-     subdirectory.  This should be a list of file names like `foo.o';
+-     the files will actually be found in whatever directory object
+-     files are being built in.  These files will be removed by
+-     `make clean'.  This variable is used for secondary object files
+-     needed to build `others' or `tests'.
+-
+-
+-File: libc.info,  Node: Porting,  Prev: Source Layout,  Up: Maintenance
+-
+-Porting the GNU C Library
+-=========================
+-
+-   The GNU C library is written to be easily portable to a variety of
+-machines and operating systems.  Machine- and operating system-dependent
+-functions are well separated to make it easy to add implementations for
+-new machines or operating systems.  This section describes the layout of
+-the library source tree and explains the mechanisms used to select
+-machine-dependent code to use.
+-
+-   All the machine-dependent and operating system-dependent files in the
+-library are in the subdirectory `sysdeps' under the top-level library
+-source directory.  This directory contains a hierarchy of
+-subdirectories (*note Hierarchy Conventions::.).
+-
+-   Each subdirectory of `sysdeps' contains source files for a
+-particular machine or operating system, or for a class of machine or
+-operating system (for example, systems by a particular vendor, or all
+-machines that use IEEE 754 floating-point format).  A configuration
+-specifies an ordered list of these subdirectories.  Each subdirectory
+-implicitly appends its parent directory to the list.  For example,
+-specifying the list `unix/bsd/vax' is equivalent to specifying the list
+-`unix/bsd/vax unix/bsd unix'.  A subdirectory can also specify that it
+-implies other subdirectories which are not directly above it in the
+-directory hierarchy.  If the file `Implies' exists in a subdirectory,
+-it lists other subdirectories of `sysdeps' which are appended to the
+-list, appearing after the subdirectory containing the `Implies' file.
+-Lines in an `Implies' file that begin with a `#' character are ignored
+-as comments.  For example, `unix/bsd/Implies' contains:
+-     # BSD has Internet-related things.
+-     unix/inet
+-
+-and `unix/Implies' contains:
+-     posix
+-
+-So the final list is `unix/bsd/vax unix/bsd unix/inet unix posix'.
+-
+-   `sysdeps' has a "special" subdirectory called `generic'.  It is
+-always implicitly appended to the list of subdirectories, so you
+-needn't put it in an `Implies' file, and you should not create any
+-subdirectories under it intended to be new specific categories.
+-`generic' serves two purposes.  First, the makefiles do not bother to
+-look for a system-dependent version of a file that's not in `generic'.
+-This means that any system-dependent source file must have an analogue
+-in `generic', even if the routines defined by that file are not
+-implemented on other platforms.  Second. the `generic' version of a
+-system-dependent file is used if the makefiles do not find a version
+-specific to the system you're compiling for.
+-
+-   If it is possible to implement the routines in a `generic' file in
+-machine-independent C, using only other machine-independent functions in
+-the C library, then you should do so.  Otherwise, make them stubs.  A
+-"stub" function is a function which cannot be implemented on a
+-particular machine or operating system.  Stub functions always return an
+-error, and set `errno' to `ENOSYS' (Function not implemented).  *Note
+-Error Reporting::.  If you define a stub function, you must place the
+-statement `stub_warning(FUNCTION)', where FUNCTION is the name of your
+-function, after its definition; also, you must include the file
+-`<stub-tag.h>' into your file.  This causes the function to be listed
+-in the installed `<gnu/stubs.h>', and makes GNU ld warn when the
+-function is used.
+-
+-   Some rare functions are only useful on specific systems and aren't
+-defined at all on others; these do not appear anywhere in the
+-system-independent source code or makefiles (including the `generic'
+-directory), only in the system-dependent `Makefile' in the specific
+-system's subdirectory.
+-
+-   If you come across a file that is in one of the main source
+-directories (`string', `stdio', etc.), and you want to write a machine-
+-or operating system-dependent version of it, move the file into
+-`sysdeps/generic' and write your new implementation in the appropriate
+-system-specific subdirectory.  Note that if a file is to be
+-system-dependent, it *must not* appear in one of the main source
+-directories.
+-
+-   There are a few special files that may exist in each subdirectory of
+-`sysdeps':
+-
+-`Makefile'
+-     A makefile for this machine or operating system, or class of
+-     machine or operating system.  This file is included by the library
+-     makefile `Makerules', which is used by the top-level makefile and
+-     the subdirectory makefiles.  It can change the variables set in the
+-     including makefile or add new rules.  It can use GNU `make'
+-     conditional directives based on the variable `subdir' (see above)
+-     to select different sets of variables and rules for different
+-     sections of the library.  It can also set the `make' variable
+-     `sysdep-routines', to specify extra modules to be included in the
+-     library.  You should use `sysdep-routines' rather than adding
+-     modules to `routines' because the latter is used in determining
+-     what to distribute for each subdirectory of the main source tree.
+-
+-     Each makefile in a subdirectory in the ordered list of
+-     subdirectories to be searched is included in order.  Since several
+-     system-dependent makefiles may be included, each should append to
+-     `sysdep-routines' rather than simply setting it:
+-
+-          sysdep-routines := $(sysdep-routines) foo bar
+-
+-`Subdirs'
+-     This file contains the names of new whole subdirectories under the
+-     top-level library source tree that should be included for this
+-     system.  These subdirectories are treated just like the
+-     system-independent subdirectories in the library source tree, such
+-     as `stdio' and `math'.
+-
+-     Use this when there are completely new sets of functions and header
+-     files that should go into the library for the system this
+-     subdirectory of `sysdeps' implements.  For example,
+-     `sysdeps/unix/inet/Subdirs' contains `inet'; the `inet' directory
+-     contains various network-oriented operations which only make sense
+-     to put in the library on systems that support the Internet.
+-
+-`Dist'
+-     This file contains the names of files (relative to the
+-     subdirectory of `sysdeps' in which it appears) which should be
+-     included in the distribution.  List any new files used by rules in
+-     the `Makefile' in the same directory, or header files used by the
+-     source files in that directory.  You don't need to list files that
+-     are implementations (either C or assembly source) of routines
+-     whose names are given in the machine-independent makefiles in the
+-     main source tree.
+-
+-`configure'
+-     This file is a shell script fragment to be run at configuration
+-     time.  The top-level `configure' script uses the shell `.' command
+-     to read the `configure' file in each system-dependent directory
+-     chosen, in order.  The `configure' files are often generated from
+-     `configure.in' files using Autoconf.
+-
+-     A system-dependent `configure' script will usually add things to
+-     the shell variables `DEFS' and `config_vars'; see the top-level
+-     `configure' script for details.  The script can check for
+-     `--with-PACKAGE' options that were passed to the top-level
+-     `configure'.  For an option `--with-PACKAGE=VALUE' `configure'
+-     sets the shell variable `with_PACKAGE' (with any dashes in PACKAGE
+-     converted to underscores) to VALUE; if the option is just
+-     `--with-PACKAGE' (no argument), then it sets `with_PACKAGE' to
+-     `yes'.
+-
+-`configure.in'
+-     This file is an Autoconf input fragment to be processed into the
+-     file `configure' in this subdirectory.  *Note Introduction:
+-     (autoconf.info)Introduction, for a description of Autoconf.  You
+-     should write either `configure' or `configure.in', but not both.
+-     The first line of `configure.in' should invoke the `m4' macro
+-     `GLIBC_PROVIDES'.  This macro does several `AC_PROVIDE' calls for
+-     Autoconf macros which are used by the top-level `configure'
+-     script; without this, those macros might be invoked again
+-     unnecessarily by Autoconf.
+-
+-   That is the general system for how system-dependencies are isolated.
+-
+-* Menu:
+-
+-* Hierarchy Conventions::       The layout of the `sysdeps' hierarchy.
+-* Porting to Unix::             Porting the library to an average
+-                                   Unix-like system.
+-
+-
+-File: libc.info,  Node: Hierarchy Conventions,  Next: Porting to Unix,  Up: Porting
+-
+-Layout of the `sysdeps' Directory Hierarchy
+--------------------------------------------
+-
+-   A GNU configuration name has three parts: the CPU type, the
+-manufacturer's name, and the operating system.  `configure' uses these
+-to pick the list of system-dependent directories to look for.  If the
+-`--nfp' option is *not* passed to `configure', the directory
+-`MACHINE/fpu' is also used.  The operating system often has a "base
+-operating system"; for example, if the operating system is `Linux', the
+-base operating system is `unix/sysv'.  The algorithm used to pick the
+-list of directories is simple: `configure' makes a list of the base
+-operating system, manufacturer, CPU type, and operating system, in that
+-order.  It then concatenates all these together with slashes in
+-between, to produce a directory name; for example, the configuration
+-`i686-linux-gnu' results in `unix/sysv/linux/i386/i686'.  `configure'
+-then tries removing each element of the list in turn, so
+-`unix/sysv/linux' and `unix/sysv' are also tried, among others.  Since
+-the precise version number of the operating system is often not
+-important, and it would be very inconvenient, for example, to have
+-identical `irix6.2' and `irix6.3' directories, `configure' tries
+-successively less specific operating system names by removing trailing
+-suffixes starting with a period.
+-
+-   As an example, here is the complete list of directories that would be
+-tried for the configuration `i686-linux-gnu' (with the `crypt' and
+-`linuxthreads' add-on):
+-
+-     sysdeps/i386/elf
+-     crypt/sysdeps/unix
+-     linuxthreads/sysdeps/unix/sysv/linux
+-     linuxthreads/sysdeps/pthread
+-     linuxthreads/sysdeps/unix/sysv
+-     linuxthreads/sysdeps/unix
+-     linuxthreads/sysdeps/i386/i686
+-     linuxthreads/sysdeps/i386
+-     linuxthreads/sysdeps/pthread/no-cmpxchg
+-     sysdeps/unix/sysv/linux/i386
+-     sysdeps/unix/sysv/linux
+-     sysdeps/gnu
+-     sysdeps/unix/common
+-     sysdeps/unix/mman
+-     sysdeps/unix/inet
+-     sysdeps/unix/sysv/i386/i686
+-     sysdeps/unix/sysv/i386
+-     sysdeps/unix/sysv
+-     sysdeps/unix/i386
+-     sysdeps/unix
+-     sysdeps/posix
+-     sysdeps/i386/i686
+-     sysdeps/i386/i486
+-     sysdeps/libm-i387/i686
+-     sysdeps/i386/fpu
+-     sysdeps/libm-i387
+-     sysdeps/i386
+-     sysdeps/wordsize-32
+-     sysdeps/ieee754
+-     sysdeps/libm-ieee754
+-     sysdeps/generic
+-
+-   Different machine architectures are conventionally subdirectories at
+-the top level of the `sysdeps' directory tree.  For example,
+-`sysdeps/sparc' and `sysdeps/m68k'.  These contain files specific to
+-those machine architectures, but not specific to any particular
+-operating system.  There might be subdirectories for specializations of
+-those architectures, such as `sysdeps/m68k/68020'. Code which is
+-specific to the floating-point coprocessor used with a particular
+-machine should go in `sysdeps/MACHINE/fpu'.
+-
+-   There are a few directories at the top level of the `sysdeps'
+-hierarchy that are not for particular machine architectures.
+-
+-`generic'
+-     As described above (*note Porting::.), this is the subdirectory
+-     that every configuration implicitly uses after all others.
+-
+-`ieee754'
+-     This directory is for code using the IEEE 754 floating-point
+-     format, where the C type `float' is IEEE 754 single-precision
+-     format, and `double' is IEEE 754 double-precision format.  Usually
+-     this directory is referred to in the `Implies' file in a machine
+-     architecture-specific directory, such as `m68k/Implies'.
+-
+-`libm-ieee754'
+-     This directory contains an implementation of a mathematical library
+-     usable on platforms which use IEEE 754 conformant floating-point
+-     arithmetic.
+-
+-`libm-i387'
+-     This is a special case.  Ideally the code should be in
+-     `sysdeps/i386/fpu' but for various reasons it is kept aside.
+-
+-`posix'
+-     This directory contains implementations of things in the library in
+-     terms of POSIX.1 functions.  This includes some of the POSIX.1
+-     functions themselves.  Of course, POSIX.1 cannot be completely
+-     implemented in terms of itself, so a configuration using just
+-     `posix' cannot be complete.
+-
+-`unix'
+-     This is the directory for Unix-like things.  *Note Porting to
+-     Unix::.  `unix' implies `posix'.  There are some special-purpose
+-     subdirectories of `unix':
+-
+-    `unix/common'
+-          This directory is for things common to both BSD and System V
+-          release 4.  Both `unix/bsd' and `unix/sysv/sysv4' imply
+-          `unix/common'.
+-
+-    `unix/inet'
+-          This directory is for `socket' and related functions on Unix
+-          systems.  `unix/inet/Subdirs' enables the `inet' top-level
+-          subdirectory.  `unix/common' implies `unix/inet'.
+-
+-`mach'
+-     This is the directory for things based on the Mach microkernel
+-     from CMU (including the GNU operating system).  Other basic
+-     operating systems (VMS, for example) would have their own
+-     directories at the top level of the `sysdeps' hierarchy, parallel
+-     to `unix' and `mach'.
+-
+-
+-File: libc.info,  Node: Porting to Unix,  Prev: Hierarchy Conventions,  Up: Porting
+-
+-Porting the GNU C Library to Unix Systems
+------------------------------------------
+-
+-   Most Unix systems are fundamentally very similar.  There are
+-variations between different machines, and variations in what
+-facilities are provided by the kernel.  But the interface to the
+-operating system facilities is, for the most part, pretty uniform and
+-simple.
+-
+-   The code for Unix systems is in the directory `unix', at the top
+-level of the `sysdeps' hierarchy.  This directory contains
+-subdirectories (and subdirectory trees) for various Unix variants.
+-
+-   The functions which are system calls in most Unix systems are
+-implemented in assembly code, which is generated automatically from
+-specifications in files named `syscalls.list'.  There are several such
+-files, one in `sysdeps/unix' and others in its subdirectories.  Some
+-special system calls are implemented in files that are named with a
+-suffix of `.S'; for example, `_exit.S'.  Files ending in `.S' are run
+-through the C preprocessor before being fed to the assembler.
+-
+-   These files all use a set of macros that should be defined in
+-`sysdep.h'.  The `sysdep.h' file in `sysdeps/unix' partially defines
+-them; a `sysdep.h' file in another directory must finish defining them
+-for the particular machine and operating system variant.  See
+-`sysdeps/unix/sysdep.h' and the machine-specific `sysdep.h'
+-implementations to see what these macros are and what they should do.
+-
+-   The system-specific makefile for the `unix' directory
+-(`sysdeps/unix/Makefile') gives rules to generate several files from
+-the Unix system you are building the library on (which is assumed to be
+-the target system you are building the library *for*).  All the
+-generated files are put in the directory where the object files are
+-kept; they should not affect the source tree itself.  The files
+-generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c'
+-(for the `stdio' section of the library).
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-47 glibc-2.1.3/manual/libc.info-47
+--- ../glibc-2.1.3/manual/libc.info-47	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-47	1969-12-31 16:00:00.000000000 -0800
+@@ -1,918 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Contributors,  Next: Copying,  Prev: Maintenance,  Up: Top
+-
+-Contributors to the GNU C Library
+-*********************************
+-
+-   The GNU C library was written originally by Roland McGrath, and is
+-currently maintained by Ulrich Drepper.  Some parts of the library were
+-contributed or worked on by other people.
+-
+-   * The `getopt' function and related code were written by Richard
+-     Stallman, David J. MacKenzie, and Roland McGrath.
+-
+-   * The merge sort function `qsort' was written by Michael J. Haertel.
+-
+-   * The quick sort function used as a fallback by `qsort' was written
+-     by Douglas C. Schmidt.
+-
+-   * The memory allocation functions `malloc', `realloc' and `free' and
+-     related code were written by Michael J. Haertel, Wolfram Gloger,
+-     and Doug Lea.
+-
+-   * Fast implementations of many of the string functions (`memcpy',
+-     `strlen', etc.) were written by Torbj"orn Granlund.
+-
+-   * The `tar.h' header file was written by David J. MacKenzie.
+-
+-   * The port to the MIPS DECStation running Ultrix 4
+-     (`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian
+-     Lance Taylor.
+-
+-   * The DES encryption function `crypt' and related functions were
+-     contributed by Michael Glad.
+-
+-   * The `ftw' and `nftw' functions were contributed by Ulrich Drepper.
+-
+-   * The startup code to support SunOS shared libraries was contributed
+-     by Tom Quinn.
+-
+-   * The `mktime' function was contributed by Paul Eggert.
+-
+-   * The port to the Sequent Symmetry running Dynix version 3
+-     (`i386-sequent-bsd') was contributed by Jason Merrill.
+-
+-   * The timezone support code is derived from the public-domain
+-     timezone package by Arthur David Olson and his many contributors.
+-
+-   * The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was
+-     contributed by Brendan Kehoe, using some code written by Roland
+-     McGrath.
+-
+-   * The port to SGI machines running Irix 4 (`mips-sgi-irix4') was
+-     contributed by Tom Quinn.
+-
+-   * The port of the Mach and Hurd code to the MIPS architecture
+-     (`mips-ANYTHING-gnu') was contributed by Kazumoto Kojima.
+-
+-   * The floating-point printing function used by `printf' and friends
+-     and the floating-point reading function used by `scanf', `strtod'
+-     and friends were written by Ulrich Drepper.  The multi-precision
+-     integer functions used in those functions are taken from GNU MP,
+-     which was contributed by Torbj"orn Granlund.
+-
+-   * The internationalization support in the library, and the support
+-     programs `locale' and `localedef', were written by Ulrich Drepper.
+-     Ulrich Drepper adapted the support code for message catalogs
+-     (`libintl.h', etc.) from the GNU `gettext' package, which he also
+-     wrote.  He also contributed the `catgets' support and the entire
+-     suite of multi-byte and wide-character support functions
+-     (`wctype.h', `wchar.h', etc.).
+-
+-   * The implementations of the `nsswitch.conf' mechanism and the files
+-     and DNS backends for it were designed and written by Ulrich
+-     Drepper and Roland McGrath, based on a backend interface defined
+-     by Peter Eriksson.
+-
+-   * The port to Linux i386/ELF (`i386-ANYTHING-linux') was contributed
+-     by Ulrich Drepper, based in large part on work done in Hongjiu
+-     Lu's Linux version of the GNU C Library.
+-
+-   * The port to Linux/m68k (`m68k-ANYTHING-linux') was contributed by
+-     Andreas Schwab.
+-
+-   * The ports to Linux/ARM (`arm-ANYTHING-linuxaout') and ARM
+-     standalone (`arm-ANYTHING-none'), as well as parts of the IPv6
+-     support code, were contributed by Philip Blundell.
+-
+-   * Richard Henderson contributed the ELF dynamic linking code and
+-     other support for the Alpha processor.
+-
+-   * David Mosberger-Tang contributed the port to Linux/Alpha
+-     (`alpha-ANYTHING-linux').
+-
+-   * The port to Linux on PowerPC (`powerpc-ANYTHING-linux') was
+-     contributed by Geoffrey Keating.
+-
+-   * Miles Bader wrote the argp argument-parsing package, and the
+-     argz/envz interfaces.
+-
+-   * Stephen R. van den Berg contributed a highly-optimized `strstr'
+-     function.
+-
+-   * Ulrich Drepper contributed the `hsearch' and `drand48' families of
+-     functions; reentrant `...`_r'' versions of the `random' family;
+-     System V shared memory and IPC support code; and several
+-     highly-optimized string functions for iX86 processors.
+-
+-   * The math functions are taken from `fdlibm-5.1' by Sun
+-     Microsystems, as modified by J.T. Conklin, Ian Lance Taylor,
+-     Ulrich Drepper, Andreas Schwab, and Roland McGrath.
+-
+-   * The `libio' library used to implement `stdio' functions on some
+-     platforms was written by Per Bothner and modified by Ulrich
+-     Drepper.
+-
+-   * Eric Youngdale and Ulrich Drepper implemented versioning of
+-     objects on  symbol level.
+-
+-   * Thorsten Kukuk provided an implementation for NIS (YP) and NIS+,
+-     securelevel 0, 1 and 2.
+-
+-   * Andreas Jaeger provided a test suite for the math library.
+-
+-   * Mark Kettenis implemented the utmpx interface and an utmp daemon.
+-
+-   * Ulrich Drepper added character conversion functions (`iconv').
+-
+-   * Thorsten Kukuk provided an implementation for a caching daemon for
+-     NSS (nscd).
+-
+-   * Tim Waugh provided an implementation of the POSIX.2 wordexp
+-     function family.
+-
+-   * Mark Kettenis provided a Hesiod NSS module.
+-
+-   * The Internet-related code (most of the `inet' subdirectory) and
+-     several other miscellaneous functions and header files have been
+-     included from 4.4 BSD with little or no modification.
+-
+-     All code incorporated from 4.4 BSD is under the following
+-     copyright:
+-
+-               Copyright (C) 1991 Regents of the University of California.
+-               All rights reserved.
+-
+-          Redistribution and use in source and binary forms, with or
+-          without modification, are permitted provided that the
+-          following conditions are met:
+-
+-            1. Redistributions of source code must retain the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer.
+-
+-            2. Redistributions in binary form must reproduce the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer in the documentation and/or other
+-               materials provided with the distribution.
+-
+-            3. All advertising materials mentioning features or use of
+-               this software must display the following acknowledgement:
+-                    This product includes software developed by the
+-                    University of California, Berkeley and its
+-                    contributors.
+-
+-            4. Neither the name of the University nor the names of its
+-               contributors may be used to endorse or promote products
+-               derived from this software without specific prior
+-               written permission.
+-
+-          THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS
+-          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+-          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+-          FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT
+-          SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-          INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-          DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-          SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-          OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+-          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-          (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+-          THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+-          OF SUCH DAMAGE.
+-
+-   * The random number generation functions `random', `srandom',
+-     `setstate' and `initstate', which are also the basis for the
+-     `rand' and `srand' functions, were written by Earl T. Cohen for
+-     the University of California at Berkeley and are copyrighted by the
+-     Regents of the University of California.  They have undergone minor
+-     changes to fit into the GNU C library and to fit the ISO C
+-     standard, but the functional code is Berkeley's.
+-
+-   * The DNS resolver code is taken directly from BIND 4.9.5, which is
+-     under both the Berkeley copyright above and also:
+-
+-          Portions Copyright (C) 1993 by Digital Equipment Corporation.
+-
+-          Permission to use, copy, modify, and distribute this software
+-          for any purpose with or without fee is hereby granted,
+-          provided that the above copyright notice and this permission
+-          notice appear in all copies, and that the name of Digital
+-          Equipment Corporation not be used in advertising or publicity
+-          pertaining to distribution of the document or software
+-          without specific, written prior permission.
+-
+-          THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP.
+-          DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+-          INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+-          FITNESS.  IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE
+-          LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+-          DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+-          DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+-          OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+-          WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+-
+-   * The code to support Sun RPC is taken verbatim from Sun's
+-     RPCSRC-4.0 distribution, and is covered by this copyright:
+-
+-               Copyright (C) 1984, Sun Microsystems, Inc.
+-
+-          Sun RPC is a product of Sun Microsystems, Inc. and is
+-          provided for unrestricted use provided that this legend is
+-          included on all tape media and as a part of the software
+-          program in whole or part.  Users may copy or modify Sun RPC
+-          without charge, but are not authorized to license or
+-          distribute it to anyone else except as part of a product or
+-          program developed by the user.
+-
+-          SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
+-          INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND
+-          FITNESS FOR A PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF
+-          DEALING, USAGE OR TRADE PRACTICE.
+-
+-          Sun RPC is provided with no support and without any
+-          obligation on the part of Sun Microsystems, Inc. to assist in
+-          its use, correction, modification or enhancement.
+-
+-          SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT
+-          TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY
+-          PATENTS BY SUN RPC OR ANY PART THEREOF.
+-
+-          In no event will Sun Microsystems, Inc. be liable for any
+-          lost revenue or profits or other special, indirect and
+-          consequential damages, even if Sun has been advised of the
+-          possibility of such damages.
+-
+-               Sun Microsystems, Inc.
+-               2550 Garcia Avenue
+-               Mountain View, California  94043
+-
+-   * Some of the support code for Mach is taken from Mach 3.0 by CMU,
+-     and is under the following copyright terms:
+-
+-               Mach Operating System
+-               Copyright (C) 1991,1990,1989 Carnegie Mellon University
+-               All Rights Reserved.
+-
+-          Permission to use, copy, modify and distribute this software
+-          and its documentation is hereby granted, provided that both
+-          the copyright notice and this permission notice appear in all
+-          copies of the software, derivative works or modified
+-          versions, and any portions thereof, and that both notices
+-          appear in supporting documentation.
+-
+-          CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
+-          IS" CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
+-          ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
+-          THIS SOFTWARE.
+-
+-          Carnegie Mellon requests users of this software to return to
+-
+-                Software Distribution Coordinator
+-                School of Computer Science
+-                Carnegie Mellon University
+-                Pittsburgh PA 15213-3890
+-
+-          or <Software.Distribution@CS.CMU.EDU> any improvements or
+-          extensions that they make and grant Carnegie Mellon the
+-          rights to redistribute these changes.
+-
+-   * The code for the database library `libdb' comes from the 2.3
+-     release of Berkeley DB. That code is under the same copyright as
+-     4.4 BSD and also:
+-
+-               Copyright (C) 1990, 1993, 1994, 1995, 1996, 1997
+-               Sleepycat Software.  All rights reserved.
+-
+-          Redistribution and use in source and binary forms, with or
+-          without modification, are permitted provided that the
+-          following conditions are met:
+-
+-            1. Redistributions of source code must retain the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer.
+-
+-            2. Redistributions in binary form must reproduce the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer in the documentation and/or other
+-               materials provided with the distribution.
+-
+-            3. Redistributions in any form must be accompanied by
+-               information on how to obtain complete source code for
+-               the DB software and any accompanying software that uses
+-               the DB software.  The source code must either be
+-               included in the distribution or be available for no more
+-               than the cost of distribution plus a nominal fee, and
+-               must be freely redistributable under reasonable
+-               conditions.  For an executable file, complete source
+-               code means the source code for all modules it contains.
+-               It does not mean source code for modules or files that
+-               typically accompany the operating system on which the
+-               executable file runs, e.g., standard library modules or
+-               system header files.
+-
+-          THIS SOFTWARE IS PROVIDED BY SLEEPYCAT SOFTWARE "AS IS" AND
+-          ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+-          TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+-          A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+-          SLEEPYCAT SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
+-          INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-          (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+-          GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+-          INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+-          WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+-          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+-          THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+-          DAMAGE.
+-
+-               Portions copyright (C) 1995, 1996
+-               The President and Fellows of Harvard University.
+-               All rights reserved.
+-
+-          Redistribution and use in source and binary forms, with or
+-          without modification, are permitted provided that the
+-          following conditions are met:
+-            1. Redistributions of source code must retain the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer.
+-
+-            2. Redistributions in binary form must reproduce the above
+-               copyright notice, this list of conditions and the
+-               following disclaimer in the documentation and/or other
+-               materials provided with the distribution.
+-
+-            3. All advertising materials mentioning features or use of
+-               this software must display the following acknowledgement:
+-                     This product includes software developed by
+-                    Harvard University  and its contributors.
+-
+-            4. Neither the name of the University nor the names of its
+-               contributors may be used to endorse or promote products
+-               derived from this software without specific prior
+-               written permission.
+-
+-          THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS "AS
+-          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+-          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+-          FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT
+-          SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+-          INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-          DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+-          SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-          OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+-          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-          (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+-          THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+-          OF SUCH DAMAGE.
+-
+-          For a license to use, redistribute or sell DB software under
+-          conditions other than those described above, or to purchase
+-          support for this software, please contact Sleepycat Software
+-          at
+-
+-                Sleepycat Software
+-                394 E. Riding Dr.
+-                Carlisle, MA 01741
+-                USA
+-                +1-508-287-4781
+-
+-          or <db@sleepycat.com>.
+-
+-
+-
+-File: libc.info,  Node: Copying,  Next: Concept Index,  Prev: Contributors,  Up: Top
+-
+-GNU LIBRARY GENERAL PUBLIC LICENSE
+-**********************************
+-
+-                         Version 2, June 1991
+-
+-     Copyright (C) 1991 Free Software Foundation, Inc.
+-     59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
+-     
+-     Everyone is permitted to copy and distribute verbatim copies
+-     of this license document, but changing it is not allowed.
+-     
+-     [This is the first released version of the library GPL.  It is
+-      numbered 2 because it goes with version 2 of the ordinary GPL.]
+-
+-Preamble
+-========
+-
+-   The licenses for most software are designed to take away your
+-freedom to share and change it.  By contrast, the GNU General Public
+-Licenses are intended to guarantee your freedom to share and change
+-free software--to make sure the software is free for all its users.
+-
+-   This license, the Library General Public License, applies to some
+-specially designated Free Software Foundation software, and to any
+-other libraries whose authors decide to use it.  You can use it for
+-your libraries, too.
+-
+-   When we speak of free software, we are referring to freedom, not
+-price.  Our General Public Licenses are designed to make sure that you
+-have the freedom to distribute copies of free software (and charge for
+-this service if you wish), that you receive source code or can get it
+-if you want it, that you can change the software or use pieces of it in
+-new free programs; and that you know you can do these things.
+-
+-   To protect your rights, we need to make restrictions that forbid
+-anyone to deny you these rights or to ask you to surrender the rights.
+-These restrictions translate to certain responsibilities for you if you
+-distribute copies of the library, or if you modify it.
+-
+-   For example, if you distribute copies of the library, whether gratis
+-or for a fee, you must give the recipients all the rights that we gave
+-you.  You must make sure that they, too, receive or can get the source
+-code.  If you link a program with the library, you must provide
+-complete object files to the recipients so that they can relink them
+-with the library, after making changes to the library and recompiling
+-it.  And you must show them these terms so they know their rights.
+-
+-   Our method of protecting your rights has two steps: (1) copyright
+-the library, and (2) offer you this license which gives you legal
+-permission to copy, distribute and/or modify the library.
+-
+-   Also, for each distributor's protection, we want to make certain
+-that everyone understands that there is no warranty for this free
+-library.  If the library is modified by someone else and passed on, we
+-want its recipients to know that what they have is not the original
+-version, so that any problems introduced by others will not reflect on
+-the original authors' reputations.
+-
+-   Finally, any free program is threatened constantly by software
+-patents.  We wish to avoid the danger that companies distributing free
+-software will individually obtain patent licenses, thus in effect
+-transforming the program into proprietary software.  To prevent this,
+-we have made it clear that any patent must be licensed for everyone's
+-free use or not licensed at all.
+-
+-   Most GNU software, including some libraries, is covered by the
+-ordinary GNU General Public License, which was designed for utility
+-programs.  This license, the GNU Library General Public License,
+-applies to certain designated libraries.  This license is quite
+-different from the ordinary one; be sure to read it in full, and don't
+-assume that anything in it is the same as in the ordinary license.
+-
+-   The reason we have a separate public license for some libraries is
+-that they blur the distinction we usually make between modifying or
+-adding to a program and simply using it.  Linking a program with a
+-library, without changing the library, is in some sense simply using
+-the library, and is analogous to running a utility program or
+-application program.  However, in a textual and legal sense, the linked
+-executable is a combined work, a derivative of the original library,
+-and the ordinary General Public License treats it as such.
+-
+-   Because of this blurred distinction, using the ordinary General
+-Public License for libraries did not effectively promote software
+-sharing, because most developers did not use the libraries.  We
+-concluded that weaker conditions might promote sharing better.
+-
+-   However, unrestricted linking of non-free programs would deprive the
+-users of those programs of all benefit from the free status of the
+-libraries themselves.  This Library General Public License is intended
+-to permit developers of non-free programs to use free libraries, while
+-preserving your freedom as a user of such programs to change the free
+-libraries that are incorporated in them.  (We have not seen how to
+-achieve this as regards changes in header files, but we have achieved
+-it as regards changes in the actual functions of the Library.)  The
+-hope is that this will lead to faster development of free libraries.
+-
+-   The precise terms and conditions for copying, distribution and
+-modification follow.  Pay close attention to the difference between a
+-"work based on the library" and a "work that uses the library".  The
+-former contains code derived from the library, while the latter only
+-works together with the library.
+-
+-   Note that it is possible for a library to be covered by the ordinary
+-General Public License rather than by this special one.
+-
+-    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+-
+-  0. This License Agreement applies to any software library which
+-     contains a notice placed by the copyright holder or other
+-     authorized party saying it may be distributed under the terms of
+-     this Library General Public License (also called "this License").
+-     Each licensee is addressed as "you".
+-
+-     A "library" means a collection of software functions and/or data
+-     prepared so as to be conveniently linked with application programs
+-     (which use some of those functions and data) to form executables.
+-
+-     The "Library", below, refers to any such software library or work
+-     which has been distributed under these terms.  A "work based on the
+-     Library" means either the Library or any derivative work under
+-     copyright law: that is to say, a work containing the Library or a
+-     portion of it, either verbatim or with modifications and/or
+-     translated straightforwardly into another language.  (Hereinafter,
+-     translation is included without limitation in the term
+-     "modification".)
+-
+-     "Source code" for a work means the preferred form of the work for
+-     making modifications to it.  For a library, complete source code
+-     means all the source code for all modules it contains, plus any
+-     associated interface definition files, plus the scripts used to
+-     control compilation and installation of the library.
+-
+-     Activities other than copying, distribution and modification are
+-     not covered by this License; they are outside its scope.  The act
+-     of running a program using the Library is not restricted, and
+-     output from such a program is covered only if its contents
+-     constitute a work based on the Library (independent of the use of
+-     the Library in a tool for writing it).  Whether that is true
+-     depends on what the Library does and what the program that uses
+-     the Library does.
+-
+-  1. You may copy and distribute verbatim copies of the Library's
+-     complete source code as you receive it, in any medium, provided
+-     that you conspicuously and appropriately publish on each copy an
+-     appropriate copyright notice and disclaimer of warranty; keep
+-     intact all the notices that refer to this License and to the
+-     absence of any warranty; and distribute a copy of this License
+-     along with the Library.
+-
+-     You may charge a fee for the physical act of transferring a copy,
+-     and you may at your option offer warranty protection in exchange
+-     for a fee.
+-
+-  2. You may modify your copy or copies of the Library or any portion
+-     of it, thus forming a work based on the Library, and copy and
+-     distribute such modifications or work under the terms of Section 1
+-     above, provided that you also meet all of these conditions:
+-
+-       a. The modified work must itself be a software library.
+-
+-       b. You must cause the files modified to carry prominent notices
+-          stating that you changed the files and the date of any change.
+-
+-       c. You must cause the whole of the work to be licensed at no
+-          charge to all third parties under the terms of this License.
+-
+-       d. If a facility in the modified Library refers to a function or
+-          a table of data to be supplied by an application program that
+-          uses the facility, other than as an argument passed when the
+-          facility is invoked, then you must make a good faith effort
+-          to ensure that, in the event an application does not supply
+-          such function or table, the facility still operates, and
+-          performs whatever part of its purpose remains meaningful.
+-
+-          (For example, a function in a library to compute square roots
+-          has a purpose that is entirely well-defined independent of the
+-          application.  Therefore, Subsection 2d requires that any
+-          application-supplied function or table used by this function
+-          must be optional: if the application does not supply it, the
+-          square root function must still compute square roots.)
+-
+-     These requirements apply to the modified work as a whole.  If
+-     identifiable sections of that work are not derived from the
+-     Library, and can be reasonably considered independent and separate
+-     works in themselves, then this License, and its terms, do not
+-     apply to those sections when you distribute them as separate
+-     works.  But when you distribute the same sections as part of a
+-     whole which is a work based on the Library, the distribution of
+-     the whole must be on the terms of this License, whose permissions
+-     for other licensees extend to the entire whole, and thus to each
+-     and every part regardless of who wrote it.
+-
+-     Thus, it is not the intent of this section to claim rights or
+-     contest your rights to work written entirely by you; rather, the
+-     intent is to exercise the right to control the distribution of
+-     derivative or collective works based on the Library.
+-
+-     In addition, mere aggregation of another work not based on the
+-     Library with the Library (or with a work based on the Library) on
+-     a volume of a storage or distribution medium does not bring the
+-     other work under the scope of this License.
+-
+-  3. You may opt to apply the terms of the ordinary GNU General Public
+-     License instead of this License to a given copy of the Library.
+-     To do this, you must alter all the notices that refer to this
+-     License, so that they refer to the ordinary GNU General Public
+-     License, version 2, instead of to this License.  (If a newer
+-     version than version 2 of the ordinary GNU General Public License
+-     has appeared, then you can specify that version instead if you
+-     wish.)  Do not make any other change in these notices.
+-
+-     Once this change is made in a given copy, it is irreversible for
+-     that copy, so the ordinary GNU General Public License applies to
+-     all subsequent copies and derivative works made from that copy.
+-
+-     This option is useful when you wish to copy part of the code of
+-     the Library into a program that is not a library.
+-
+-  4. You may copy and distribute the Library (or a portion or
+-     derivative of it, under Section 2) in object code or executable
+-     form under the terms of Sections 1 and 2 above provided that you
+-     accompany it with the complete corresponding machine-readable
+-     source code, which must be distributed under the terms of Sections
+-     1 and 2 above on a medium customarily used for software
+-     interchange.
+-
+-     If distribution of object code is made by offering access to copy
+-     from a designated place, then offering equivalent access to copy
+-     the source code from the same place satisfies the requirement to
+-     distribute the source code, even though third parties are not
+-     compelled to copy the source along with the object code.
+-
+-  5. A program that contains no derivative of any portion of the
+-     Library, but is designed to work with the Library by being
+-     compiled or linked with it, is called a "work that uses the
+-     Library".  Such a work, in isolation, is not a derivative work of
+-     the Library, and therefore falls outside the scope of this License.
+-
+-     However, linking a "work that uses the Library" with the Library
+-     creates an executable that is a derivative of the Library (because
+-     it contains portions of the Library), rather than a "work that
+-     uses the library".  The executable is therefore covered by this
+-     License.  Section 6 states terms for distribution of such
+-     executables.
+-
+-     When a "work that uses the Library" uses material from a header
+-     file that is part of the Library, the object code for the work may
+-     be a derivative work of the Library even though the source code is
+-     not.  Whether this is true is especially significant if the work
+-     can be linked without the Library, or if the work is itself a
+-     library.  The threshold for this to be true is not precisely
+-     defined by law.
+-
+-     If such an object file uses only numerical parameters, data
+-     structure layouts and accessors, and small macros and small inline
+-     functions (ten lines or less in length), then the use of the object
+-     file is unrestricted, regardless of whether it is legally a
+-     derivative work.  (Executables containing this object code plus
+-     portions of the Library will still fall under Section 6.)
+-
+-     Otherwise, if the work is a derivative of the Library, you may
+-     distribute the object code for the work under the terms of Section
+-     6.  Any executables containing that work also fall under Section 6,
+-     whether or not they are linked directly with the Library itself.
+-
+-  6. As an exception to the Sections above, you may also compile or
+-     link a "work that uses the Library" with the Library to produce a
+-     work containing portions of the Library, and distribute that work
+-     under terms of your choice, provided that the terms permit
+-     modification of the work for the customer's own use and reverse
+-     engineering for debugging such modifications.
+-
+-     You must give prominent notice with each copy of the work that the
+-     Library is used in it and that the Library and its use are covered
+-     by this License.  You must supply a copy of this License.  If the
+-     work during execution displays copyright notices, you must include
+-     the copyright notice for the Library among them, as well as a
+-     reference directing the user to the copy of this License.  Also,
+-     you must do one of these things:
+-
+-       a. Accompany the work with the complete corresponding
+-          machine-readable source code for the Library including
+-          whatever changes were used in the work (which must be
+-          distributed under Sections 1 and 2 above); and, if the work
+-          is an executable linked with the Library, with the complete
+-          machine-readable "work that uses the Library", as object code
+-          and/or source code, so that the user can modify the Library
+-          and then relink to produce a modified executable containing
+-          the modified Library.  (It is understood that the user who
+-          changes the contents of definitions files in the Library will
+-          not necessarily be able to recompile the application to use
+-          the modified definitions.)
+-
+-       b. Accompany the work with a written offer, valid for at least
+-          three years, to give the same user the materials specified in
+-          Subsection 6a, above, for a charge no more than the cost of
+-          performing this distribution.
+-
+-       c. If distribution of the work is made by offering access to copy
+-          from a designated place, offer equivalent access to copy the
+-          above specified materials from the same place.
+-
+-       d. Verify that the user has already received a copy of these
+-          materials or that you have already sent this user a copy.
+-
+-     For an executable, the required form of the "work that uses the
+-     Library" must include any data and utility programs needed for
+-     reproducing the executable from it.  However, as a special
+-     exception, the source code distributed need not include anything
+-     that is normally distributed (in either source or binary form)
+-     with the major components (compiler, kernel, and so on) of the
+-     operating system on which the executable runs, unless that
+-     component itself accompanies the executable.
+-
+-     It may happen that this requirement contradicts the license
+-     restrictions of other proprietary libraries that do not normally
+-     accompany the operating system.  Such a contradiction means you
+-     cannot use both them and the Library together in an executable
+-     that you distribute.
+-
+-  7. You may place library facilities that are a work based on the
+-     Library side-by-side in a single library together with other
+-     library facilities not covered by this License, and distribute
+-     such a combined library, provided that the separate distribution
+-     of the work based on the Library and of the other library
+-     facilities is otherwise permitted, and provided that you do these
+-     two things:
+-
+-       a. Accompany the combined library with a copy of the same work
+-          based on the Library, uncombined with any other library
+-          facilities.  This must be distributed under the terms of the
+-          Sections above.
+-
+-       b. Give prominent notice with the combined library of the fact
+-          that part of it is a work based on the Library, and explaining
+-          where to find the accompanying uncombined form of the same
+-          work.
+-
+-  8. You may not copy, modify, sublicense, link with, or distribute the
+-     Library except as expressly provided under this License.  Any
+-     attempt otherwise to copy, modify, sublicense, link with, or
+-     distribute the Library is void, and will automatically terminate
+-     your rights under this License.  However, parties who have
+-     received copies, or rights, from you under this License will not
+-     have their licenses terminated so long as such parties remain in
+-     full compliance.
+-
+-  9. You are not required to accept this License, since you have not
+-     signed it.  However, nothing else grants you permission to modify
+-     or distribute the Library or its derivative works.  These actions
+-     are prohibited by law if you do not accept this License.
+-     Therefore, by modifying or distributing the Library (or any work
+-     based on the Library), you indicate your acceptance of this
+-     License to do so, and all its terms and conditions for copying,
+-     distributing or modifying the Library or works based on it.
+-
+- 10. Each time you redistribute the Library (or any work based on the
+-     Library), the recipient automatically receives a license from the
+-     original licensor to copy, distribute, link with or modify the
+-     Library subject to these terms and conditions.  You may not impose
+-     any further restrictions on the recipients' exercise of the rights
+-     granted herein.  You are not responsible for enforcing compliance
+-     by third parties to this License.
+-
+- 11. If, as a consequence of a court judgment or allegation of patent
+-     infringement or for any other reason (not limited to patent
+-     issues), conditions are imposed on you (whether by court order,
+-     agreement or otherwise) that contradict the conditions of this
+-     License, they do not excuse you from the conditions of this
+-     License.  If you cannot distribute so as to satisfy simultaneously
+-     your obligations under this License and any other pertinent
+-     obligations, then as a consequence you may not distribute the
+-     Library at all.  For example, if a patent license would not permit
+-     royalty-free redistribution of the Library by all those who
+-     receive copies directly or indirectly through you, then the only
+-     way you could satisfy both it and this License would be to refrain
+-     entirely from distribution of the Library.
+-
+-     If any portion of this section is held invalid or unenforceable
+-     under any particular circumstance, the balance of the section is
+-     intended to apply, and the section as a whole is intended to apply
+-     in other circumstances.
+-
+-     It is not the purpose of this section to induce you to infringe any
+-     patents or other property right claims or to contest validity of
+-     any such claims; this section has the sole purpose of protecting
+-     the integrity of the free software distribution system which is
+-     implemented by public license practices.  Many people have made
+-     generous contributions to the wide range of software distributed
+-     through that system in reliance on consistent application of that
+-     system; it is up to the author/donor to decide if he or she is
+-     willing to distribute software through any other system and a
+-     licensee cannot impose that choice.
+-
+-     This section is intended to make thoroughly clear what is believed
+-     to be a consequence of the rest of this License.
+-
+- 12. If the distribution and/or use of the Library is restricted in
+-     certain countries either by patents or by copyrighted interfaces,
+-     the original copyright holder who places the Library under this
+-     License may add an explicit geographical distribution limitation
+-     excluding those countries, so that distribution is permitted only
+-     in or among countries not thus excluded.  In such case, this
+-     License incorporates the limitation as if written in the body of
+-     this License.
+-
+- 13. The Free Software Foundation may publish revised and/or new
+-     versions of the Library General Public License from time to time.
+-     Such new versions will be similar in spirit to the present version,
+-     but may differ in detail to address new problems or concerns.
+-
+-     Each version is given a distinguishing version number.  If the
+-     Library specifies a version number of this License which applies
+-     to it and "any later version", you have the option of following
+-     the terms and conditions either of that version or of any later
+-     version published by the Free Software Foundation.  If the Library
+-     does not specify a license version number, you may choose any
+-     version ever published by the Free Software Foundation.
+-
+- 14. If you wish to incorporate parts of the Library into other free
+-     programs whose distribution conditions are incompatible with these,
+-     write to the author to ask for permission.  For software which is
+-     copyrighted by the Free Software Foundation, write to the Free
+-     Software Foundation; we sometimes make exceptions for this.  Our
+-     decision will be guided by the two goals of preserving the free
+-     status of all derivatives of our free software and of promoting
+-     the sharing and reuse of software generally.
+-
+-                                NO WARRANTY
+-
+- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+-     WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
+-     LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+-     HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT
+-     WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+-     NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+-     FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
+-     QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU.  SHOULD THE
+-     LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+-     SERVICING, REPAIR OR CORRECTION.
+-
+- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+-     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+-     MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
+-     LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+-     INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+-     INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
+-     DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+-     OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
+-     OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+-     ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+-
+-                      END OF TERMS AND CONDITIONS
+-
+-How to Apply These Terms to Your New Libraries
+-==============================================
+-
+-   If you develop a new library, and you want it to be of the greatest
+-possible use to the public, we recommend making it free software that
+-everyone can redistribute and change.  You can do so by permitting
+-redistribution under these terms (or, alternatively, under the terms of
+-the ordinary General Public License).
+-
+-   To apply these terms, attach the following notices to the library.
+-It is safest to attach them to the start of each source file to most
+-effectively convey the exclusion of warranty; and each file should have
+-at least the "copyright" line and a pointer to where the full notice is
+-found.
+-
+-     ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
+-     Copyright (C) YEAR  NAME OF AUTHOR
+-     
+-     This library is free software; you can redistribute it and/or modify it
+-     under the terms of the GNU Library General Public License as published
+-     by the Free Software Foundation; either version 2 of the License, or (at
+-     your option) any later version.
+-     
+-     This library 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
+-     Library General Public License for more details.
+-     
+-     You should have received a copy of the GNU General Public License along
+-     with this program; if not, write to the Free Software Foundation, Inc.,
+-     59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+-
+-   Also add information on how to contact you by electronic and paper
+-mail.
+-
+-   You should also get your employer (if you work as a programmer) or
+-your school, if any, to sign a "copyright disclaimer" for the library,
+-if necessary.  Here is a sample; alter the names:
+-
+-     Yoyodyne, Inc., hereby disclaims all copyright interest in the library
+-     `Frob' (a library for tweaking knobs) written by James Random Hacker.
+-     
+-     SIGNATURE OF TY COON, 1 April 1990
+-     Ty Coon, President of Vice
+-
+-   That's all there is to it!
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-48 glibc-2.1.3/manual/libc.info-48
+--- ../glibc-2.1.3/manual/libc.info-48	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-48	1969-12-31 16:00:00.000000000 -0800
+@@ -1,977 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Concept Index,  Next: Type Index,  Prev: Copying,  Up: Top
+-
+-Concept Index
+-*************
+-
+-* Menu:
+-
+-* /etc/nsswitch.conf:                    NSS Configuration File.
+-* 4.N BSD Unix:                          Berkeley Unix.
+-* __va_copy:                             Copying and Concatenation.
+-* _POSIX_OPTION_ORDER environment variable.: Standard Environment.
+-* _POSIX_SAVED_IDS:                      How Change Persona.
+-* abort signal:                          Program Error Signals.
+-* aborting a program:                    Aborting a Program.
+-* absolute file name:                    File Name Resolution.
+-* absolute value functions:              Absolute Value.
+-* accepting connections:                 Accepting Connections.
+-* access permission for a file:          Access Permission.
+-* access, testing for:                   Testing File Access.
+-* accessing directories:                 Accessing Directories.
+-* address of socket:                     Socket Addresses.
+-* alarm signal:                          Alarm Signals.
+-* alarms, setting:                       Setting an Alarm.
+-* alignment (in obstacks):               Obstacks Data Alignment.
+-* alignment (with malloc):               Aligned Memory Blocks.
+-* alloca disadvantages:                  Disadvantages of Alloca.
+-* alloca function:                       Variable Size Automatic.
+-* allocating pseudo-terminals:           Allocation.
+-* allocation (obstacks):                 Allocation in an Obstack.
+-* allocation debugging:                  Allocation Debugging.
+-* allocation hooks, for malloc:          Hooks for Malloc.
+-* allocation of memory with malloc:      Basic Allocation.
+-* allocation size of string:             Representation of Strings.
+-* allocation statistics:                 Statistics of Malloc.
+-* alphabetic character <1>:              Classification of Wide Characters.
+-* alphabetic character:                  Classification of Characters.
+-* alphanumeric character <1>:            Classification of Wide Characters.
+-* alphanumeric character:                Classification of Characters.
+-* append-access files:                   File Position.
+-* argc (program argument count):         Program Arguments.
+-* argp (program argument parser):        Argp.
+-* argp parser functions:                 Argp Parser Functions.
+-* ARGP_HELP_FMT environment variable:    Argp User Customization.
+-* argument parsing with argp:            Argp.
+-* argument promotion:                    Calling Variadics.
+-* argument vectors, null-character separated: Argz and Envz Vectors.
+-* arguments (variadic functions):        Receiving Arguments.
+-* arguments, how many:                   How Many Arguments.
+-* arguments, to program:                 Program Arguments.
+-* argv (program argument vector):        Program Arguments.
+-* argz vectors (string vectors):         Argz and Envz Vectors.
+-* arithmetic expansion:                  Expansion Stages.
+-* array comparison functions:            String/Array Comparison.
+-* array copy functions:                  Copying and Concatenation.
+-* array search function:                 Array Search Function.
+-* array sort function:                   Array Sort Function.
+-* ASCII character:                       Classification of Characters.
+-* assertions:                            Consistency Checking.
+-* attributes of a file:                  Attribute Meanings.
+-* automatic allocation:                  Memory Concepts.
+-* automatic freeing:                     Variable Size Automatic.
+-* automatic storage with variable size:  Variable Size Automatic.
+-* background job:                        Concepts of Job Control.
+-* background job, launching:             Foreground and Background.
+-* base (of floating point number):       Floating Point Concepts.
+-* baud rate:                             Line Speed.
+-* Berkeley Unix:                         Berkeley Unix.
+-* Bessel functions:                      Special Functions.
+-* bias (of floating point number exponent): Floating Point Concepts.
+-* big-endian:                            Byte Order.
+-* binary I/O to a stream:                Block Input/Output.
+-* binary search function (for arrays):   Array Search Function.
+-* binary stream:                         Binary Streams.
+-* binding a socket address:              Socket Addresses.
+-* blank character <1>:                   Classification of Wide Characters.
+-* blank character:                       Classification of Characters.
+-* block I/O to a stream:                 Block Input/Output.
+-* blocked signals:                       Delivery of Signal.
+-* blocked signals, checking for:         Checking for Pending Signals.
+-* blocking signals:                      Blocking Signals.
+-* blocking signals, in a handler:        Blocking for Handler.
+-* bootstrapping, and services:           Actions in the NSS configuration.
+-* break condition, detecting:            Input Modes.
+-* break condition, generating:           Line Control.
+-* breaking a string into tokens:         Finding Tokens in a String.
+-* broken pipe signal:                    Operation Error Signals.
+-* broken-down time <1>:                  Broken-down Time.
+-* broken-down time:                      Calendar Time.
+-* BSD compatibility library:             Process Group Functions.
+-* BSD compatibility library.:            Feature Test Macros.
+-* BSD Unix:                              Berkeley Unix.
+-* buffering of streams:                  Stream Buffering.
+-* buffering, controlling:                Controlling Buffering.
+-* bugs, reporting:                       Reporting Bugs.
+-* bus error:                             Program Error Signals.
+-* butterfly:                             Misc FP Arithmetic.
+-* byte order conversion, for socket:     Byte Order.
+-* byte stream:                           Socket Concepts.
+-* calendar time:                         Calendar Time.
+-* calendar time and broken-down time:    Broken-down Time.
+-* calling variadic functions:            Calling Variadics.
+-* canonical input processing:            Canonical or Not.
+-* capacity limits, POSIX:                General Limits.
+-* carrier detect:                        Control Modes.
+-* case conversion of characters:         Case Conversion.
+-* catching signals:                      Delivery of Signal.
+-* categories for locales:                Locale Categories.
+-* change working directory:              Working Directory.
+-* changing the locale:                   Setting the Locale.
+-* changing the size of a block (malloc): Changing Block Size.
+-* changing the size of a block (obstacks): Growing Objects.
+-* channels:                              Stream/Descriptor Precautions.
+-* character case conversion:             Case Conversion.
+-* character predicates:                  Classification of Characters.
+-* character testing:                     Classification of Characters.
+-* checking for pending signals:          Checking for Pending Signals.
+-* child process <1>:                     Process Creation Concepts.
+-* child process:                         Processes.
+-* child process signal:                  Job Control Signals.
+-* chunks:                                Obstack Chunks.
+-* classes, floating-point:               Floating Point Classes.
+-* classification of characters:          Classification of Characters.
+-* cleaning up a stream:                  Linked Channels.
+-* clearing terminal input queue:         Line Control.
+-* client:                                Connections.
+-* clock ticks:                           Processor Time.
+-* close-on-exec (file descriptor flag):  Descriptor Flags.
+-* closing a file descriptor:             Opening and Closing Files.
+-* closing a socket:                      Closing a Socket.
+-* closing a stream:                      Closing Streams.
+-* collating strings:                     Collation Functions.
+-* combining locales:                     Choosing Locale.
+-* command argument syntax:               Argument Syntax.
+-* command arguments, parsing:            Parsing Program Arguments.
+-* command line arguments:                Program Arguments.
+-* command substitution:                  Expansion Stages.
+-* communication style (of a socket):     Socket Concepts.
+-* comparing strings and arrays:          String/Array Comparison.
+-* Comparison Function:                   Comparison Functions.
+-* compiling:                             Configuring and compiling.
+-* complex exponentiation functions:      Exponents and Logarithms.
+-* complex logarithm functions:           Exponents and Logarithms.
+-* complex numbers:                       Complex Numbers.
+-* complex trigonometric functions:       Trig Functions.
+-* concatenating strings:                 Copying and Concatenation.
+-* configurations, all supported:         Supported Configurations.
+-* configuring:                           Configuring and compiling.
+-* conjugate complex numbers:             Operations on Complex.
+-* connecting a socket:                   Connecting.
+-* connection:                            Connections.
+-* consistency checking:                  Consistency Checking.
+-* consistency checking, of heap:         Heap Consistency Checking.
+-* constants:                             Mathematical Constants.
+-* continue signal:                       Job Control Signals.
+-* control character <1>:                 Classification of Wide Characters.
+-* control character:                     Classification of Characters.
+-* control operations on files:           Control Operations.
+-* controlling process:                   Controlling Terminal.
+-* controlling terminal:                  Concepts of Job Control.
+-* controlling terminal, access to:       Access to the Terminal.
+-* controlling terminal, determining:     Identifying the Terminal.
+-* controlling terminal, setting:         Open-time Flags.
+-* conversion specifications (printf):    Formatted Output Basics.
+-* conversion specifications (scanf):     Formatted Input Basics.
+-* converting byte order:                 Byte Order.
+-* converting case of characters:         Case Conversion.
+-* converting file descriptor to stream:  Descriptors and Streams.
+-* converting floats to integers:         Rounding Functions.
+-* converting group ID to group name:     Lookup Group.
+-* converting group name to group ID:     Lookup Group.
+-* converting host address to name:       Host Names.
+-* converting host name to address:       Host Names.
+-* converting network name to network number: Networks Database.
+-* converting network number to network name: Networks Database.
+-* converting port number to service name: Services Database.
+-* converting service name to port number: Services Database.
+-* converting string to collation order:  Collation Functions.
+-* converting strings to numbers:         Parsing of Numbers.
+-* converting user ID to user name:       Lookup User.
+-* converting user name to user ID:       Lookup User.
+-* cookie, for custom stream:             Streams and Cookies.
+-* copying strings and arrays:            Copying and Concatenation.
+-* CPU time:                              Processor Time.
+-* create on open (file status flag):     Open-time Flags.
+-* creating a directory:                  Creating Directories.
+-* creating a FIFO special file:          FIFO Special Files.
+-* creating a pipe:                       Creating a Pipe.
+-* creating a pipe to a subprocess:       Pipe to a Subprocess.
+-* creating a process:                    Process Creation Concepts.
+-* creating a socket:                     Creating a Socket.
+-* creating a socket pair:                Socket Pairs.
+-* creating special files:                Making Special Files.
+-* cube root function:                    Exponents and Logarithms.
+-* currency symbols:                      Currency Symbol.
+-* current working directory:             Working Directory.
+-* custom streams:                        Custom Streams.
+-* customizing printf:                    Customizing Printf.
+-* data loss on sockets:                  Socket Concepts.
+-* databases:                             Name Service Switch.
+-* datagram socket:                       Datagrams.
+-* datagrams, transmitting:               Sending Datagrams.
+-* date and time:                         Calendar Time.
+-* Daylight Saving Time:                  Broken-down Time.
+-* decimal digit character:               Classification of Characters.
+-* decimal-point separator:               General Numeric.
+-* declaration (compared to definition):  Header Files.
+-* declaring variadic functions:          Calling Variadics.
+-* decompose complex numbers:             Operations on Complex.
+-* default action (for a signal):         Delivery of Signal.
+-* default action for a signal:           Basic Signal Handling.
+-* default argument promotions:           Calling Variadics.
+-* default value, and NSS:                Notes on NSS Configuration File.
+-* defining new printf conversions:       Customizing Printf.
+-* definition (compared to declaration):  Header Files.
+-* delayed suspend character:             Signal Characters.
+-* deleting a directory:                  Deleting Files.
+-* deleting a file:                       Deleting Files.
+-* delivery of signals:                   Delivery of Signal.
+-* descriptors and streams:               Stream/Descriptor Precautions.
+-* digit character <1>:                   Classification of Wide Characters.
+-* digit character:                       Classification of Characters.
+-* directories, accessing:                Accessing Directories.
+-* directories, creating:                 Creating Directories.
+-* directories, deleting:                 Deleting Files.
+-* directory:                             Directories.
+-* directory entry:                       Directories.
+-* directory hierarchy:                   Working on Directory Trees.
+-* directory stream:                      Accessing Directories.
+-* disadvantages of alloca:               Disadvantages of Alloca.
+-* DISCARD character:                     Other Special.
+-* division by zero:                      FP Exceptions.
+-* DNS server unavailable:                Actions in the NSS configuration.
+-* domain (of socket):                    Socket Concepts.
+-* domain error:                          Math Error Reporting.
+-* dot notation, for Internet addresses:  Abstract Host Addresses.
+-* DSUSP character:                       Signal Characters.
+-* duplicating file descriptors:          Duplicating Descriptors.
+-* dynamic allocation:                    Memory Concepts.
+-* EBCDIC:                                Extended Char Intro.
+-* echo of terminal input:                Local Modes.
+-* effective group ID:                    Process Persona.
+-* effective user ID:                     Process Persona.
+-* efficiency and malloc:                 Efficiency and Malloc.
+-* efficiency and obstacks:               Extra Fast Growing.
+-* efficiency of chunks:                  Obstack Chunks.
+-* EINTR, and restarting interrupted primitives: Interrupted Primitives.
+-* end of file, on a stream:              EOF and Errors.
+-* end-of-file, on a file descriptor:     I/O Primitives.
+-* environment:                           Environment Variables.
+-* environment access:                    Environment Access.
+-* environment representation:            Environment Access.
+-* environment variable:                  Environment Variables.
+-* environment vectors, null-character separated: Argz and Envz Vectors.
+-* envz vectors (environment vectors):    Argz and Envz Vectors.
+-* EOF character:                         Editing Characters.
+-* EOL character:                         Editing Characters.
+-* EOL2 character:                        Editing Characters.
+-* epoch:                                 Simple Calendar Time.
+-* ERASE character:                       Editing Characters.
+-* error codes:                           Error Reporting.
+-* error messages, in argp:               Argp Helper Functions.
+-* error reporting:                       Error Reporting.
+-* errors, mathematical:                  Math Error Reporting.
+-* establishing a handler:                Signal Actions.
+-* ethers:                                NSS Basics.
+-* EUC:                                   Extended Char Intro.
+-* EUC-JP:                                glibc iconv Implementation.
+-* exception <1>:                         Program Error Signals.
+-* exception:                             FP Exceptions.
+-* exclusive lock:                        File Locks.
+-* exec functions:                        Executing a File.
+-* executing a file:                      Executing a File.
+-* exit status:                           Exit Status.
+-* exit status value:                     Program Termination.
+-* expansion of shell words:              Word Expansion.
+-* exponent (of floating point number):   Floating Point Concepts.
+-* exponentiation functions:              Exponents and Logarithms.
+-* extending printf:                      Customizing Printf.
+-* extracting file descriptor from stream: Descriptors and Streams.
+-* fcntl function:                        Control Operations.
+-* feature test macros:                   Feature Test Macros.
+-* field splitting:                       Expansion Stages.
+-* FIFO special file:                     Pipes and FIFOs.
+-* file access permission:                Access Permission.
+-* file access time:                      File Times.
+-* file attribute modification time:      File Times.
+-* file attributes:                       Attribute Meanings.
+-* file creation mask:                    Setting Permissions.
+-* file descriptor flags:                 Descriptor Flags.
+-* file descriptor sets, for select:      Waiting for I/O.
+-* file descriptors, standard:            Descriptors and Streams.
+-* file locks:                            File Locks.
+-* file modification time:                File Times.
+-* file name:                             File Names.
+-* file name component:                   Directories.
+-* file name errors:                      File Name Errors.
+-* file name resolution:                  File Name Resolution.
+-* file name translation flags:           Open-time Flags.
+-* file names, multiple:                  Hard Links.
+-* file owner:                            File Owner.
+-* file permission bits:                  Permission Bits.
+-* file pointer:                          Streams.
+-* file position:                         File Position.
+-* file positioning on a file descriptor: File Position Primitive.
+-* file positioning on a stream:          File Positioning.
+-* file status flags:                     File Status Flags.
+-* filtering i/o through subprocess:      Pipe to a Subprocess.
+-* flag character (printf):               Output Conversion Syntax.
+-* flag character (scanf):                Input Conversion Syntax.
+-* flags for sigaction:                   Flags for Sigaction.
+-* flags, file name translation:          Open-time Flags.
+-* flags, open-time action:               Open-time Flags.
+-* floating point:                        Floating Point Numbers.
+-* floating point, IEEE:                  IEEE Floating Point.
+-* floating type measurements:            Floating Type Macros.
+-* floating-point classes:                Floating Point Classes.
+-* floating-point exception:              Program Error Signals.
+-* flow control, terminal:                Line Control.
+-* flushing a stream:                     Flushing Buffers.
+-* flushing terminal output queue:        Line Control.
+-* foreground job:                        Concepts of Job Control.
+-* foreground job, launching:             Foreground and Background.
+-* forking a process:                     Process Creation Concepts.
+-* format string, for printf:             Formatted Output.
+-* format string, for scanf:              Formatted Input.
+-* formatted input from a stream:         Formatted Input.
+-* formatted messages:                    Formatted Messages.
+-* formatted output to a stream:          Formatted Output.
+-* FP arithmetic:                         FP Bit Twiddling.
+-* freeing (obstacks):                    Freeing Obstack Objects.
+-* freeing memory allocated with malloc:  Freeing after Malloc.
+-* fully buffered stream:                 Buffering Concepts.
+-* function prototypes (variadic):        Variadic Prototypes.
+-* gamma function:                        Special Functions.
+-* gcvt_r:                                System V Number Conversion.
+-* gencat:                                The gencat program.
+-* generation of signals:                 Signal Generation.
+-* generic i/o control operations:        IOCTLs.
+-* globbing:                              Globbing.
+-* graphic character <1>:                 Classification of Wide Characters.
+-* graphic character:                     Classification of Characters.
+-* Gregorian calendar:                    Calendar Time.
+-* group:                                 NSS Basics.
+-* group database:                        Group Database.
+-* group ID:                              User and Group IDs.
+-* group name:                            User and Group IDs.
+-* group owner of a file:                 File Owner.
+-* grouping of digits:                    General Numeric.
+-* growing objects (in obstacks):         Growing Objects.
+-* handling multiple signals:             Merged Signals.
+-* hangup signal:                         Termination Signals.
+-* hard limit:                            Limits on Resources.
+-* hard link:                             Hard Links.
+-* header files:                          Header Files.
+-* heap consistency checking:             Heap Consistency Checking.
+-* heap, dynamic allocation from:         Unconstrained Allocation.
+-* heap, freeing memory from:             Freeing after Malloc.
+-* hexadecimal digit character <1>:       Classification of Wide Characters.
+-* hexadecimal digit character:           Classification of Characters.
+-* hidden bit (of floating point number mantissa): Floating Point Concepts.
+-* hierarchy, directory:                  Working on Directory Trees.
+-* high-priority data:                    Out-of-Band Data.
+-* high-resolution time:                  Calendar Time.
+-* holes in files:                        File Position Primitive.
+-* home directory:                        Standard Environment.
+-* HOME environment variable:             Standard Environment.
+-* hook functions (of custom streams):    Hook Functions.
+-* host address, Internet:                Abstract Host Addresses.
+-* hosts:                                 NSS Basics.
+-* hosts database:                        Host Names.
+-* how many arguments:                    How Many Arguments.
+-* hyperbolic functions:                  Hyperbolic Functions.
+-* identifying terminals:                 Is It a Terminal.
+-* IEEE 754:                              Floating Point Numbers.
+-* IEEE floating point:                   Floating Point Numbers.
+-* IEEE floating point representation:    IEEE Floating Point.
+-* IEEE Std 1003.1:                       POSIX.
+-* IEEE Std 1003.2:                       POSIX.
+-* ignore action for a signal:            Basic Signal Handling.
+-* illegal instruction:                   Program Error Signals.
+-* impossible events:                     Consistency Checking.
+-* independent channels:                  Independent Channels.
+-* inexact exception:                     FP Exceptions.
+-* infinity:                              Infinity and NaN.
+-* initial signal actions:                Initial Signal Actions.
+-* inode number:                          Attribute Meanings.
+-* input available signal:                Asynchronous I/O Signals.
+-* input conversions, for scanf:          Table of Input Conversions.
+-* input from multiple files:             Waiting for I/O.
+-* installation tools:                    Tools for Compilation.
+-* installing:                            Running make install.
+-* integer division functions:            Integer Division.
+-* integer type range:                    Range of Type.
+-* integer type width:                    Width of Type.
+-* interactive signals, from terminal:    Local Modes.
+-* interactive stop signal:               Job Control Signals.
+-* internal representation:               Extended Char Intro.
+-* internationalization:                  Locales.
+-* Internet host address:                 Abstract Host Addresses.
+-* Internet namespace, for sockets:       Internet Namespace.
+-* interprocess communication, with FIFO: FIFO Special Files.
+-* interprocess communication, with pipes: Creating a Pipe.
+-* interprocess communication, with signals: Kill Example.
+-* interprocess communication, with sockets: Sockets.
+-* interrupt character:                   Signal Characters.
+-* interrupt signal:                      Termination Signals.
+-* interrupt-driven input:                Interrupt Input.
+-* interrupting primitives:               Interrupted Primitives.
+-* interval timer, setting:               Setting an Alarm.
+-* INTR character:                        Signal Characters.
+-* invalid exception:                     FP Exceptions.
+-* inverse complex hyperbolic functions:  Hyperbolic Functions.
+-* inverse complex trigonometric functions: Inverse Trig Functions.
+-* inverse hyperbolic functions:          Hyperbolic Functions.
+-* inverse trigonometric functions:       Inverse Trig Functions.
+-* invocation of program:                 Program Arguments.
+-* IOCTLs:                                IOCTLs.
+-* ISO 10646:                             Extended Char Intro.
+-* ISO 2022:                              Extended Char Intro.
+-* ISO 6937:                              Extended Char Intro.
+-* ISO C:                                 ISO C.
+-* ISO-2022-JP:                           glibc iconv Implementation.
+-* ISO/IEC 9945-1:                        POSIX.
+-* ISO/IEC 9945-2:                        POSIX.
+-* job:                                   Job Control.
+-* job control:                           Job Control.
+-* job control functions:                 Functions for Job Control.
+-* job control is optional:               Job Control is Optional.
+-* job control signals:                   Job Control Signals.
+-* job control, enabling:                 Initializing the Shell.
+-* Kermit the frog:                       Search/Sort Example.
+-* kernel header files:                   Linux.
+-* KILL character:                        Editing Characters.
+-* kill signal:                           Termination Signals.
+-* killing a process:                     Signaling Another Process.
+-* LANG environment variable <1>:         Standard Environment.
+-* LANG environment variable:             The catgets Functions.
+-* launching jobs:                        Launching Jobs.
+-* LC_ALL environment variable <1>:       Standard Environment.
+-* LC_ALL environment variable:           The catgets Functions.
+-* LC_COLLATE environment variable:       Standard Environment.
+-* LC_CTYPE environment variable:         Standard Environment.
+-* LC_MESSAGES environment variable <1>:  Standard Environment.
+-* LC_MESSAGES environment variable:      The catgets Functions.
+-* LC_MONETARY environment variable:      Standard Environment.
+-* LC_NUMERIC environment variable:       Standard Environment.
+-* LC_TIME environment variable:          Standard Environment.
+-* leap second:                           Broken-down Time.
+-* length of string:                      Representation of Strings.
+-* level, for socket options:             Socket Options.
+-* library:                               Introduction.
+-* limits on resource usage:              Limits on Resources.
+-* limits, file name length:              Limits for Files.
+-* limits, floating types:                Floating Type Macros.
+-* limits, integer types:                 Range of Type.
+-* limits, link count of files:           Limits for Files.
+-* limits, number of open files:          General Limits.
+-* limits, number of processes:           General Limits.
+-* limits, number of supplementary group IDs: General Limits.
+-* limits, pipe buffer size:              Limits for Files.
+-* limits, POSIX:                         General Limits.
+-* limits, program argument size:         General Limits.
+-* limits, terminal input queue:          Limits for Files.
+-* limits, time zone name length:         General Limits.
+-* line buffered stream:                  Buffering Concepts.
+-* line speed:                            Line Speed.
+-* lines (in a text file):                Binary Streams.
+-* link:                                  Directories.
+-* link, hard:                            Hard Links.
+-* link, soft:                            Symbolic Links.
+-* link, symbolic:                        Symbolic Links.
+-* linked channels:                       Linked Channels.
+-* listening (sockets):                   Listening.
+-* little-endian:                         Byte Order.
+-* LNEXT character:                       Other Special.
+-* local namespace, for sockets:          Local Namespace.
+-* local network address number:          Abstract Host Addresses.
+-* local time:                            Calendar Time.
+-* locale categories:                     Locale Categories.
+-* locale, changing:                      Setting the Locale.
+-* locales:                               Locales.
+-* locales, parsing numbers and:          Parsing of Integers.
+-* logarithm functions:                   Exponents and Logarithms.
+-* login name:                            User and Group IDs.
+-* login name, determining:               Who Logged In.
+-* LOGNAME environment variable:          Standard Environment.
+-* long jumps:                            Non-Local Exits.
+-* long-named options:                    Argument Syntax.
+-* longjmp:                               Advantages of Alloca.
+-* loss of data on sockets:               Socket Concepts.
+-* lost resource signal:                  Operation Error Signals.
+-* lower-case character <1>:              Classification of Wide Characters.
+-* lower-case character:                  Classification of Characters.
+-* macros:                                Obstack Functions.
+-* main function:                         Program Arguments.
+-* malloc debugger:                       Allocation Debugging.
+-* malloc function:                       Unconstrained Allocation.
+-* mantissa (of floating point number):   Floating Point Concepts.
+-* matching failure, in scanf:            Formatted Input Basics.
+-* mathematical constants:                Mathematical Constants.
+-* maximum:                               Misc FP Arithmetic.
+-* maximum field width (scanf):           Input Conversion Syntax.
+-* measurements of floating types:        Floating Type Macros.
+-* memory allocation:                     Memory Allocation.
+-* merging of signals:                    Merged Signals.
+-* MIN termios slot:                      Noncanonical Input.
+-* minimum:                               Misc FP Arithmetic.
+-* minimum field width (printf):          Output Conversion Syntax.
+-* mixing descriptors and streams:        Stream/Descriptor Precautions.
+-* modem disconnect:                      Control Modes.
+-* modem status lines:                    Control Modes.
+-* monetary value formatting:             The Lame Way to Locale Data.
+-* multibyte character:                   Extended Char Intro.
+-* multiple names for one file:           Hard Links.
+-* multiplexing input:                    Waiting for I/O.
+-* multiply-add:                          Misc FP Arithmetic.
+-* name of running program:               Error Messages.
+-* name of socket:                        Socket Addresses.
+-* Name Service Switch:                   Name Service Switch.
+-* name space:                            Reserved Names.
+-* names of signals:                      Standard Signals.
+-* namespace (of socket):                 Socket Concepts.
+-* NaN <1>:                               FP Bit Twiddling.
+-* NaN:                                   Infinity and NaN.
+-* Netgroup:                              Netgroup Data.
+-* netgroup:                              NSS Basics.
+-* network byte order:                    Byte Order.
+-* network number:                        Abstract Host Addresses.
+-* network protocol:                      Socket Concepts.
+-* networks:                              NSS Basics.
+-* networks database:                     Networks Database.
+-* nisplus, and booting:                  Actions in the NSS configuration.
+-* nisplus, and completeness:             Actions in the NSS configuration.
+-* NLSPATH environment variable <1>:      Standard Environment.
+-* NLSPATH environment variable:          The catgets Functions.
+-* non-blocking open:                     Open-time Flags.
+-* non-local exit, from signal handler:   Longjmp in Handler.
+-* non-local exits:                       Non-Local Exits.
+-* noncanonical input processing:         Canonical or Not.
+-* normalization functions (floating-point): Normalization Functions.
+-* normalized floating point number:      Floating Point Concepts.
+-* not a number:                          Infinity and NaN.
+-* NSS:                                   Name Service Switch.
+-* nsswitch.conf:                         NSS Configuration File.
+-* null character:                        Representation of Strings.
+-* null pointer constant:                 Null Pointer Constant.
+-* number of arguments passed:            How Many Arguments.
+-* number syntax, parsing:                Parsing of Numbers.
+-* numeric value formatting:              The Lame Way to Locale Data.
+-* obstack status:                        Status of an Obstack.
+-* obstacks:                              Obstacks.
+-* open-time action flags:                Open-time Flags.
+-* opening a file:                        I/O Concepts.
+-* opening a file descriptor:             Opening and Closing Files.
+-* opening a pipe:                        Creating a Pipe.
+-* opening a pseudo-terminal pair:        Pseudo-Terminal Pairs.
+-* opening a socket:                      Creating a Socket.
+-* opening a socket pair:                 Socket Pairs.
+-* opening a stream:                      Opening Streams.
+-* Optimization:                          FP Function Optimizations.
+-* optimizing NSS:                        Notes on NSS Configuration File.
+-* option parsing with argp:              Argp.
+-* optional arguments:                    Variadic Functions.
+-* optional POSIX features:               System Options.
+-* orphaned process group:                Orphaned Process Groups.
+-* out-of-band data:                      Out-of-Band Data.
+-* output conversions, for printf:        Table of Output Conversions.
+-* output possible signal:                Asynchronous I/O Signals.
+-* overflow exception:                    FP Exceptions.
+-* owner of a file:                       File Owner.
+-* packet:                                Socket Concepts.
+-* page boundary:                         Aligned Memory Blocks.
+-* parent directory:                      File Name Resolution.
+-* parent process <1>:                    Process Creation Concepts.
+-* parent process:                        Processes.
+-* parity checking:                       Input Modes.
+-* parsing a template string:             Parsing a Template String.
+-* parsing numbers (in formatted input):  Parsing of Numbers.
+-* parsing numbers and locales:           Parsing of Integers.
+-* parsing program arguments:             Parsing Program Arguments.
+-* parsing tokens from a string:          Finding Tokens in a String.
+-* passwd:                                NSS Basics.
+-* password database:                     User Database.
+-* PATH environment variable:             Standard Environment.
+-* pause function:                        Waiting for a Signal.
+-* peeking at input:                      Unreading.
+-* pending signals:                       Delivery of Signal.
+-* pending signals, checking for:         Checking for Pending Signals.
+-* permission to access a file:           Access Permission.
+-* persona:                               Process Persona.
+-* pi (trigonometric constant):           Trig Functions.
+-* pipe:                                  Pipes and FIFOs.
+-* pipe signal:                           Operation Error Signals.
+-* pipe to a subprocess:                  Pipe to a Subprocess.
+-* port number:                           Ports.
+-* positioning a file descriptor:         File Position Primitive.
+-* positioning a stream:                  File Positioning.
+-* positive difference:                   Misc FP Arithmetic.
+-* POSIX:                                 POSIX.
+-* POSIX capacity limits:                 General Limits.
+-* POSIX optional features:               System Options.
+-* POSIX.1:                               POSIX.
+-* POSIX.2:                               POSIX.
+-* power functions:                       Exponents and Logarithms.
+-* precision (of floating point number):  Floating Point Concepts.
+-* precision (printf):                    Output Conversion Syntax.
+-* predicates on arrays:                  String/Array Comparison.
+-* predicates on characters:              Classification of Characters.
+-* predicates on strings:                 String/Array Comparison.
+-* primitives, interrupting:              Interrupted Primitives.
+-* printing character <1>:                Classification of Wide Characters.
+-* printing character:                    Classification of Characters.
+-* priority of a process:                 Priority.
+-* process <1>:                           Processes.
+-* process:                               Process Startup.
+-* process completion:                    Process Completion.
+-* process group functions:               Functions for Job Control.
+-* process group ID:                      Launching Jobs.
+-* process group leader:                  Launching Jobs.
+-* process groups:                        Job Control.
+-* process ID:                            Process Creation Concepts.
+-* process image:                         Process Creation Concepts.
+-* process lifetime:                      Process Creation Concepts.
+-* process priority:                      Priority.
+-* process signal mask:                   Process Signal Mask.
+-* process termination:                   Program Termination.
+-* processor time:                        Processor Time.
+-* profiling alarm signal:                Alarm Signals.
+-* profiling timer:                       Setting an Alarm.
+-* program argument syntax:               Argument Syntax.
+-* program arguments:                     Program Arguments.
+-* program arguments, parsing:            Parsing Program Arguments.
+-* program error signals:                 Program Error Signals.
+-* program name:                          Error Messages.
+-* program startup:                       Program Arguments.
+-* program termination:                   Program Termination.
+-* program termination signals:           Termination Signals.
+-* programming your own streams:          Custom Streams.
+-* project complex numbers:               Operations on Complex.
+-* protocol (of socket):                  Socket Concepts.
+-* protocol family:                       Socket Concepts.
+-* protocols:                             NSS Basics.
+-* protocols database:                    Protocols Database.
+-* prototypes for variadic functions:     Variadic Prototypes.
+-* pseudo-random numbers:                 Pseudo-Random Numbers.
+-* pseudo-terminals:                      Pseudo-Terminals.
+-* punctuation character <1>:             Classification of Wide Characters.
+-* punctuation character:                 Classification of Characters.
+-* pushing input back:                    Unreading.
+-* quick sort function (for arrays):      Array Sort Function.
+-* QUIT character:                        Signal Characters.
+-* quit signal:                           Termination Signals.
+-* quote removal:                         Expansion Stages.
+-* race conditions, relating to job control: Launching Jobs.
+-* race conditions, relating to signals:  Signals in Handler.
+-* radix (of floating point number):      Floating Point Concepts.
+-* raising signals:                       Generating Signals.
+-* random numbers:                        Pseudo-Random Numbers.
+-* random-access files:                   File Position.
+-* range error:                           Math Error Reporting.
+-* range of integer type:                 Range of Type.
+-* read lock:                             File Locks.
+-* reading from a directory:              Accessing Directories.
+-* reading from a file descriptor:        I/O Primitives.
+-* reading from a socket:                 Transferring Data.
+-* reading from a stream, by blocks:      Block Input/Output.
+-* reading from a stream, by characters:  Character Input.
+-* reading from a stream, formatted:      Formatted Input.
+-* real group ID:                         Process Persona.
+-* real user ID:                          Process Persona.
+-* real-time timer:                       Setting an Alarm.
+-* receiving datagrams:                   Receiving Datagrams.
+-* record locking:                        File Locks.
+-* redirecting input and output:          Duplicating Descriptors.
+-* reentrant functions:                   Nonreentrancy.
+-* reentrant NSS functions:               NSS Module Names.
+-* relative file name:                    File Name Resolution.
+-* removal of quotes:                     Expansion Stages.
+-* removing a file:                       Deleting Files.
+-* removing macros that shadow functions: Macro Definitions.
+-* renaming a file:                       Renaming Files.
+-* reporting bugs:                        Reporting Bugs.
+-* reporting errors:                      Error Reporting.
+-* REPRINT character:                     Editing Characters.
+-* reserved names:                        Reserved Names.
+-* resource limits:                       Limits on Resources.
+-* restarting interrupted primitives:     Interrupted Primitives.
+-* restrictions on signal handler functions: Nonreentrancy.
+-* root directory:                        File Name Resolution.
+-* rpc:                                   NSS Basics.
+-* running a command:                     Running a Command.
+-* saved set-group-ID:                    How Change Persona.
+-* saved set-user-ID:                     How Change Persona.
+-* scanning the group list:               Scanning All Groups.
+-* scanning the user list:                Scanning All Users.
+-* scatter-gather:                        Scatter-Gather.
+-* search function (for arrays):          Array Search Function.
+-* search functions (for strings):        Search Functions.
+-* seed (for random numbers):             Pseudo-Random Numbers.
+-* seeking on a file descriptor:          File Position Primitive.
+-* seeking on a stream:                   File Positioning.
+-* segmentation violation:                Program Error Signals.
+-* sending a datagram:                    Sending Datagrams.
+-* sending signals:                       Generating Signals.
+-* sequential-access files:               File Position.
+-* server:                                Connections.
+-* services:                              NSS Basics.
+-* services database:                     Services Database.
+-* session <1>:                           Concepts of Job Control.
+-* session:                               Job Control.
+-* session leader:                        Concepts of Job Control.
+-* setting an alarm:                      Setting an Alarm.
+-* setuid programs:                       How Change Persona.
+-* setuid programs and file access:       Testing File Access.
+-* severity class <1>:                    Adding Severity Classes.
+-* severity class:                        Printing Formatted Messages.
+-* shadow:                                NSS Basics.
+-* shadowing functions with macros:       Macro Definitions.
+-* shared lock:                           File Locks.
+-* shell:                                 Concepts of Job Control.
+-* shift state:                           Keeping the state.
+-* shrinking objects:                     Growing Objects.
+-* shutting down a socket:                Closing a Socket.
+-* sigaction flags:                       Flags for Sigaction.
+-* sigaction function:                    Advanced Signal Handling.
+-* SIGCHLD, handling of:                  Stopped and Terminated Jobs.
+-* sign (of floating point number):       Floating Point Concepts.
+-* signal <1>:                            Signal Handling.
+-* signal:                                FP Exceptions.
+-* signal action:                         Delivery of Signal.
+-* signal actions:                        Signal Actions.
+-* signal flags:                          Flags for Sigaction.
+-* signal function:                       Basic Signal Handling.
+-* signal handler function:               Defining Handlers.
+-* signal mask:                           Process Signal Mask.
+-* signal messages:                       Signal Messages.
+-* signal names:                          Standard Signals.
+-* signal number:                         Standard Signals.
+-* signal set:                            Signal Sets.
+-* signals, generating:                   Generating Signals.
+-* significand (of floating point number): Floating Point Concepts.
+-* SIGTTIN, from background job:          Access to the Terminal.
+-* SIGTTOU, from background job:          Access to the Terminal.
+-* size of string:                        Representation of Strings.
+-* SJIS:                                  Extended Char Intro.
+-* socket:                                Sockets.
+-* socket address (name) binding:         Socket Addresses.
+-* socket domain:                         Socket Concepts.
+-* socket namespace:                      Socket Concepts.
+-* socket option level:                   Socket Options.
+-* socket options:                        Socket Options.
+-* socket pair:                           Socket Pairs.
+-* socket protocol:                       Socket Concepts.
+-* socket shutdown:                       Closing a Socket.
+-* socket, client actions:                Connecting.
+-* socket, closing:                       Closing a Socket.
+-* socket, connecting:                    Connecting.
+-* socket, creating:                      Creating a Socket.
+-* socket, initiating a connection:       Connecting.
+-* sockets, accepting connections:        Accepting Connections.
+-* sockets, listening:                    Listening.
+-* sockets, server actions:               Listening.
+-* soft limit:                            Limits on Resources.
+-* soft link:                             Symbolic Links.
+-* sort function (for arrays):            Array Sort Function.
+-* sparse files:                          File Position Primitive.
+-* special files:                         Making Special Files.
+-* special functions:                     Special Functions.
+-* specified action (for a signal):       Delivery of Signal.
+-* square root function:                  Exponents and Logarithms.
+-* stable sorting:                        Array Sort Function.
+-* standard dot notation, for Internet addresses: Abstract Host Addresses.
+-* standard environment variables:        Standard Environment.
+-* standard error file descriptor:        Descriptors and Streams.
+-* standard error stream:                 Standard Streams.
+-* standard file descriptors:             Descriptors and Streams.
+-* standard input file descriptor:        Descriptors and Streams.
+-* standard input stream:                 Standard Streams.
+-* standard output file descriptor:       Descriptors and Streams.
+-* standard output stream:                Standard Streams.
+-* standard streams:                      Standard Streams.
+-* standards:                             Standards and Portability.
+-* START character:                       Start/Stop Characters.
+-* startup of program:                    Program Arguments.
+-* stateful <1>:                          glibc iconv Implementation.
+-* stateful <2>:                          iconv Examples.
+-* stateful <3>:                          Generic Conversion Interface.
+-* stateful <4>:                          Converting Strings.
+-* stateful <5>:                          Converting a Character.
+-* stateful:                              Keeping the state.
+-* static allocation:                     Memory Concepts.
+-* STATUS character:                      Other Special.
+-* status codes:                          Error Reporting.
+-* status of a file:                      Attribute Meanings.
+-* status of obstack:                     Status of an Obstack.
+-* sticky bit:                            Permission Bits.
+-* STOP character:                        Start/Stop Characters.
+-* stop signal:                           Job Control Signals.
+-* stopped job:                           Concepts of Job Control.
+-* stopped jobs, continuing:              Continuing Stopped Jobs.
+-* stopped jobs, detecting:               Stopped and Terminated Jobs.
+-* storage allocation:                    Memory Allocation.
+-* stream (sockets):                      Socket Concepts.
+-* stream, for I/O to a string:           String Streams.
+-* streams and descriptors:               Stream/Descriptor Precautions.
+-* streams, and file descriptors:         Descriptors and Streams.
+-* streams, standard:                     Standard Streams.
+-* string:                                Representation of Strings.
+-* string allocation:                     Representation of Strings.
+-* string collation functions:            Collation Functions.
+-* string comparison functions:           String/Array Comparison.
+-* string concatenation functions:        Copying and Concatenation.
+-* string copy functions:                 Copying and Concatenation.
+-* string length:                         Representation of Strings.
+-* string literal:                        Representation of Strings.
+-* string search functions:               Search Functions.
+-* string stream:                         String Streams.
+-* string vectors, null-character separated: Argz and Envz Vectors.
+-* string, representation of:             Representation of Strings.
+-* style of communication (of a socket):  Socket Concepts.
+-* subshell:                              Initializing the Shell.
+-* substitution of variables and commands: Expansion Stages.
+-* successive signals:                    Merged Signals.
+-* summer time:                           Broken-down Time.
+-* SunOS:                                 Berkeley Unix.
+-* supplementary group IDs:               Process Persona.
+-* SUSP character:                        Signal Characters.
+-* suspend character:                     Signal Characters.
+-* SVID:                                  SVID.
+-* symbolic link:                         Symbolic Links.
+-* symbolic link, opening:                Open-time Flags.
+-* synchronizing <1>:                     Synchronizing AIO Operations.
+-* synchronizing:                         Synchronizing I/O.
+-* syntax error messages, in argp:        Argp Helper Functions.
+-* syntax, for program arguments:         Argument Syntax.
+-* syntax, for reading numbers:           Parsing of Numbers.
+-* System V Unix:                         SVID.
+-* TCP (Internet protocol):               Protocols Database.
+-* template, for printf:                  Formatted Output.
+-* template, for scanf:                   Formatted Input.
+-* TERM environment variable:             Standard Environment.
+-* terminal flow control:                 Line Control.
+-* terminal identification:               Is It a Terminal.
+-* terminal input queue:                  I/O Queues.
+-* terminal input queue, clearing:        Line Control.
+-* terminal input signal:                 Job Control Signals.
+-* terminal line control functions:       Line Control.
+-* terminal line speed:                   Line Speed.
+-* terminal mode data types:              Mode Data Types.
+-* terminal mode functions:               Mode Functions.
+-* terminal output queue:                 I/O Queues.
+-* terminal output queue, flushing:       Line Control.
+-* terminal output signal:                Job Control Signals.
+-* terminated jobs, detecting:            Stopped and Terminated Jobs.
+-* termination signal:                    Termination Signals.
+-* testing access permission:             Testing File Access.
+-* testing exit status of child process:  Process Completion.
+-* text stream:                           Binary Streams.
+-* ticks, clock:                          Processor Time.
+-* tilde expansion:                       Expansion Stages.
+-* TIME termios slot:                     Noncanonical Input.
+-* time zone:                             TZ Variable.
+-* time zone database:                    TZ Variable.
+-* time, calendar:                        Calendar Time.
+-* time, elapsed CPU:                     Processor Time.
+-* time, high precision:                  Precision Time.
+-* timer, profiling:                      Setting an Alarm.
+-* timer, real-time:                      Setting an Alarm.
+-* timer, virtual:                        Setting an Alarm.
+-* timers, setting:                       Setting an Alarm.
+-* timing error in signal handling:       Remembering a Signal.
+-* TMPDIR environment variable:           Temporary Files.
+-* tokenizing strings:                    Finding Tokens in a String.
+-* tools, for installing library:         Tools for Compilation.
+-* transmitting datagrams:                Sending Datagrams.
+-* tree, directory:                       Working on Directory Trees.
+-* triangulation:                         glibc iconv Implementation.
+-* trigonometric functions:               Trig Functions.
+-* type measurements, floating:           Floating Type Macros.
+-* type measurements, integer:            Width of Type.
+-* type modifier character (printf):      Output Conversion Syntax.
+-* type modifier character (scanf):       Input Conversion Syntax.
+-* typeahead buffer:                      I/O Queues.
+-* TZ environment variable:               Standard Environment.
+-* UCS2:                                  Extended Char Intro.
+-* UCS4:                                  Extended Char Intro.
+-* umask:                                 Setting Permissions.
+-* unbuffered stream:                     Buffering Concepts.
+-* unconstrained storage allocation:      Unconstrained Allocation.
+-* undefining macros that shadow functions: Macro Definitions.
+-* underflow exception:                   FP Exceptions.
+-* Unicode:                               Extended Char Intro.
+-* Unix, Berkeley:                        Berkeley Unix.
+-* Unix, System V:                        SVID.
+-* unlinking a file:                      Deleting Files.
+-* unordered comparison:                  FP Comparison Functions.
+-* unreading characters:                  Unreading.
+-* upgrading from libc5:                  Linux.
+-* upper-case character <1>:              Classification of Wide Characters.
+-* upper-case character:                  Classification of Characters.
+-* urgent data signal:                    Asynchronous I/O Signals.
+-* urgent socket condition:               Out-of-Band Data.
+-* usage limits:                          Limits on Resources.
+-* usage messages, in argp:               Argp Helper Functions.
+-* user accounting database:              User Accounting Database.
+-* user database:                         User Database.
+-* user ID:                               User and Group IDs.
+-* user ID, determining:                  Who Logged In.
+-* user name:                             User and Group IDs.
+-* user signals:                          Miscellaneous Signals.
+-* usual file name errors:                File Name Errors.
+-* UTF-7:                                 Extended Char Intro.
+-* UTF-8:                                 Extended Char Intro.
+-* va_copy:                               Copying and Concatenation.
+-* variable number of arguments:          Variadic Functions.
+-* variable substitution:                 Expansion Stages.
+-* variable-sized arrays:                 GNU C Variable-Size Arrays.
+-* variadic function argument access:     Receiving Arguments.
+-* variadic function prototypes:          Variadic Prototypes.
+-* variadic functions:                    Variadic Functions.
+-* variadic functions, calling:           Calling Variadics.
+-* virtual time alarm signal:             Alarm Signals.
+-* virtual timer:                         Setting an Alarm.
+-* volatile declarations:                 Nonreentrancy.
+-* waiting for a signal:                  Waiting for a Signal.
+-* waiting for completion of child process: Process Completion.
+-* waiting for input or output:           Waiting for I/O.
+-* WERASE character:                      Editing Characters.
+-* whitespace character <1>:              Classification of Wide Characters.
+-* whitespace character:                  Classification of Characters.
+-* wide character:                        Extended Char Intro.
+-* width of integer type:                 Width of Type.
+-* wildcard expansion:                    Expansion Stages.
+-* word expansion:                        Word Expansion.
+-* working directory:                     Working Directory.
+-* write lock:                            File Locks.
+-* writing to a file descriptor:          I/O Primitives.
+-* writing to a socket:                   Transferring Data.
+-* writing to a stream, by blocks:        Block Input/Output.
+-* writing to a stream, by characters:    Simple Output.
+-* writing to a stream, formatted:        Formatted Output.
+-* zero divide:                           FP Exceptions.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-49 glibc-2.1.3/manual/libc.info-49
+--- ../glibc-2.1.3/manual/libc.info-49	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-49	1969-12-31 16:00:00.000000000 -0800
+@@ -1,160 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Type Index,  Next: Function Index,  Prev: Concept Index,  Up: Top
+-
+-Type Index
+-**********
+-
+-* Menu:
+-
+-* __ftw64_func_t:                        Working on Directory Trees.
+-* __ftw_func_t:                          Working on Directory Trees.
+-* __nftw64_func_t:                       Working on Directory Trees.
+-* __nftw_func_t:                         Working on Directory Trees.
+-* blkcnt64_t:                            Attribute Meanings.
+-* blkcnt_t:                              Attribute Meanings.
+-* cc_t:                                  Mode Data Types.
+-* clock_t:                               Basic CPU Time.
+-* comparison_fn_t:                       Comparison Functions.
+-* cookie_close_function:                 Hook Functions.
+-* cookie_io_functions_t:                 Streams and Cookies.
+-* cookie_read_function:                  Hook Functions.
+-* cookie_seek_function:                  Hook Functions.
+-* cookie_write_function:                 Hook Functions.
+-* dev_t:                                 Attribute Meanings.
+-* DIR:                                   Opening a Directory.
+-* div_t:                                 Integer Division.
+-* enum mcheck_status:                    Heap Consistency Checking.
+-* fd_set:                                Waiting for I/O.
+-* FILE:                                  Streams.
+-* fpos64_t:                              Portable Positioning.
+-* fpos_t:                                Portable Positioning.
+-* gid_t:                                 Reading Persona.
+-* glob_t:                                Calling Glob.
+-* iconv_t:                               Generic Conversion Interface.
+-* imaxdiv_t:                             Integer Division.
+-* ino64_t:                               Attribute Meanings.
+-* ino_t:                                 Attribute Meanings.
+-* jmp_buf:                               Non-Local Details.
+-* ldiv_t:                                Integer Division.
+-* lldiv_t:                               Integer Division.
+-* mbstate_t:                             Keeping the state.
+-* mode_t:                                Attribute Meanings.
+-* nlink_t:                               Attribute Meanings.
+-* off64_t:                               File Position Primitive.
+-* off_t:                                 File Position Primitive.
+-* pid_t:                                 Process Identification.
+-* printf_arginfo_function:               Defining the Output Handler.
+-* printf_function:                       Defining the Output Handler.
+-* ptrdiff_t:                             Important Data Types.
+-* regex_t:                               POSIX Regexp Compilation.
+-* regmatch_t:                            Regexp Subexpressions.
+-* regoff_t:                              Regexp Subexpressions.
+-* sig_atomic_t:                          Atomic Types.
+-* sighandler_t:                          Basic Signal Handling.
+-* sigjmp_buf:                            Non-Local Exits and Signals.
+-* sigset_t:                              Signal Sets.
+-* size_t:                                Important Data Types.
+-* speed_t:                               Line Speed.
+-* ssize_t:                               I/O Primitives.
+-* struct aiocb:                          Asynchronous I/O.
+-* struct aiocb64:                        Asynchronous I/O.
+-* struct aioinit:                        Configuration of AIO.
+-* struct argp:                           Argp Parsers.
+-* struct argp_child:                     Argp Children.
+-* struct argp_option:                    Argp Option Vectors.
+-* struct argp_state:                     Argp Parsing State.
+-* struct dirent:                         Directory Entries.
+-* struct ENTRY:                          Hash Search Function.
+-* struct exit_status:                    Manipulating the Database.
+-* struct flock:                          File Locks.
+-* struct fstab:                          Filesystem handling.
+-* struct FTW:                            Working on Directory Trees.
+-* struct gconv_step:                     glibc iconv Implementation.
+-* struct gconv_step_data:                glibc iconv Implementation.
+-* struct group:                          Group Data Structure.
+-* struct hostent:                        Host Names.
+-* struct if_nameindex:                   Interface Naming.
+-* struct in6_addr:                       Host Address Data Type.
+-* struct in_addr:                        Host Address Data Type.
+-* struct iovec:                          Scatter-Gather.
+-* struct itimerval:                      Setting an Alarm.
+-* struct lconv:                          The Lame Way to Locale Data.
+-* struct linger:                         Socket-Level Options.
+-* struct mallinfo:                       Statistics of Malloc.
+-* struct mntent:                         Filesystem handling.
+-* struct netent:                         Networks Database.
+-* struct ntptimeval:                     Precision Time.
+-* struct obstack:                        Creating Obstacks.
+-* struct option:                         Getopt Long Options.
+-* struct passwd:                         User Data Structure.
+-* struct printf_info:                    Conversion Specifier Options.
+-* struct protoent:                       Protocols Database.
+-* struct rlimit:                         Limits on Resources.
+-* struct rlimit64:                       Limits on Resources.
+-* struct rusage:                         Resource Usage.
+-* struct servent:                        Services Database.
+-* struct sigaction:                      Advanced Signal Handling.
+-* struct sigaltstack:                    Signal Stack.
+-* struct sigstack:                       Signal Stack.
+-* struct sigvec:                         BSD Handler.
+-* struct sockaddr:                       Address Formats.
+-* struct sockaddr_in:                    Internet Address Formats.
+-* struct sockaddr_in6:                   Internet Address Formats.
+-* struct sockaddr_un:                    Local Namespace Details.
+-* struct stat:                           Attribute Meanings.
+-* struct stat64:                         Attribute Meanings.
+-* struct termios:                        Mode Data Types.
+-* struct timeval:                        High-Resolution Calendar.
+-* struct timex:                          Precision Time.
+-* struct timezone:                       High-Resolution Calendar.
+-* struct tm:                             Broken-down Time.
+-* struct tms:                            Detailed CPU Time.
+-* struct utimbuf:                        File Times.
+-* struct utmp:                           Manipulating the Database.
+-* struct utmpx:                          XPG Functions.
+-* struct utsname:                        Hardware/Software Type ID.
+-* tcflag_t:                              Mode Data Types.
+-* time_t:                                Simple Calendar Time.
+-* uid_t:                                 Reading Persona.
+-* union wait:                            BSD Wait Functions.
+-* va_list:                               Argument Macros.
+-* VISIT:                                 Tree Search Function.
+-* wchar_t:                               Extended Char Intro.
+-* wctrans_t:                             Wide Character Case Conversion.
+-* wctype_t:                              Classification of Wide Characters.
+-* wint_t:                                Extended Char Intro.
+-* wordexp_t:                             Calling Wordexp.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-5 glibc-2.1.3/manual/libc.info-5
+--- ../glibc-2.1.3/manual/libc.info-5	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-5	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1317 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Alloca Example,  Next: Advantages of Alloca,  Up: Variable Size Automatic
+-
+-`alloca' Example
+-----------------
+-
+-   As an example of use of `alloca', here is a function that opens a
+-file name made from concatenating two argument strings, and returns a
+-file descriptor or minus one signifying failure:
+-
+-     int
+-     open2 (char *str1, char *str2, int flags, int mode)
+-     {
+-       char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
+-       stpcpy (stpcpy (name, str1), str2);
+-       return open (name, flags, mode);
+-     }
+-
+-Here is how you would get the same results with `malloc' and `free':
+-
+-     int
+-     open2 (char *str1, char *str2, int flags, int mode)
+-     {
+-       char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
+-       int desc;
+-       if (name == 0)
+-         fatal ("virtual memory exceeded");
+-       stpcpy (stpcpy (name, str1), str2);
+-       desc = open (name, flags, mode);
+-       free (name);
+-       return desc;
+-     }
+-
+-   As you can see, it is simpler with `alloca'.  But `alloca' has
+-other, more important advantages, and some disadvantages.
+-
+-
+-File: libc.info,  Node: Advantages of Alloca,  Next: Disadvantages of Alloca,  Prev: Alloca Example,  Up: Variable Size Automatic
+-
+-Advantages of `alloca'
+-----------------------
+-
+-   Here are the reasons why `alloca' may be preferable to `malloc':
+-
+-   * Using `alloca' wastes very little space and is very fast.  (It is
+-     open-coded by the GNU C compiler.)
+-
+-   * Since `alloca' does not have separate pools for different sizes of
+-     block, space used for any size block can be reused for any other
+-     size.  `alloca' does not cause storage fragmentation.
+-
+-   * Nonlocal exits done with `longjmp' (*note Non-Local Exits::.)
+-     automatically free the space allocated with `alloca' when they exit
+-     through the function that called `alloca'.  This is the most
+-     important reason to use `alloca'.
+-
+-     To illustrate this, suppose you have a function
+-     `open_or_report_error' which returns a descriptor, like `open', if
+-     it succeeds, but does not return to its caller if it fails.  If
+-     the file cannot be opened, it prints an error message and jumps
+-     out to the command level of your program using `longjmp'.  Let's
+-     change `open2' (*note Alloca Example::.) to use this subroutine:
+-
+-          int
+-          open2 (char *str1, char *str2, int flags, int mode)
+-          {
+-            char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
+-            stpcpy (stpcpy (name, str1), str2);
+-            return open_or_report_error (name, flags, mode);
+-          }
+-
+-     Because of the way `alloca' works, the storage it allocates is
+-     freed even when an error occurs, with no special effort required.
+-
+-     By contrast, the previous definition of `open2' (which uses
+-     `malloc' and `free') would develop a storage leak if it were
+-     changed in this way.  Even if you are willing to make more changes
+-     to fix it, there is no easy way to do so.
+-
+-
+-File: libc.info,  Node: Disadvantages of Alloca,  Next: GNU C Variable-Size Arrays,  Prev: Advantages of Alloca,  Up: Variable Size Automatic
+-
+-Disadvantages of `alloca'
+--------------------------
+-
+-   These are the disadvantages of `alloca' in comparison with `malloc':
+-
+-   * If you try to allocate more storage than the machine can provide,
+-     you don't get a clean error message.  Instead you get a fatal
+-     signal like the one you would get from an infinite recursion;
+-     probably a segmentation violation (*note Program Error Signals::.).
+-
+-   * Some non-GNU systems fail to support `alloca', so it is less
+-     portable.  However, a slower emulation of `alloca' written in C is
+-     available for use on systems with this deficiency.
+-
+-
+-File: libc.info,  Node: GNU C Variable-Size Arrays,  Prev: Disadvantages of Alloca,  Up: Variable Size Automatic
+-
+-GNU C Variable-Size Arrays
+---------------------------
+-
+-   In GNU C, you can replace most uses of `alloca' with an array of
+-variable size.  Here is how `open2' would look then:
+-
+-     int open2 (char *str1, char *str2, int flags, int mode)
+-     {
+-       char name[strlen (str1) + strlen (str2) + 1];
+-       stpcpy (stpcpy (name, str1), str2);
+-       return open (name, flags, mode);
+-     }
+-
+-   But `alloca' is not always equivalent to a variable-sized array, for
+-several reasons:
+-
+-   * A variable size array's space is freed at the end of the scope of
+-     the name of the array.  The space allocated with `alloca' remains
+-     until the end of the function.
+-
+-   * It is possible to use `alloca' within a loop, allocating an
+-     additional block on each iteration.  This is impossible with
+-     variable-sized arrays.
+-
+-   *Note:* If you mix use of `alloca' and variable-sized arrays within
+-one function, exiting a scope in which a variable-sized array was
+-declared frees all blocks allocated with `alloca' during the execution
+-of that scope.
+-
+-
+-File: libc.info,  Node: Character Handling,  Next: String and Array Utilities,  Prev: Memory Allocation,  Up: Top
+-
+-Character Handling
+-******************
+-
+-   Programs that work with characters and strings often need to
+-classify a character--is it alphabetic, is it a digit, is it
+-whitespace, and so on--and perform case conversion operations on
+-characters.  The functions in the header file `ctype.h' are provided
+-for this purpose.
+-
+-   Since the choice of locale and character set can alter the
+-classifications of particular character codes, all of these functions
+-are affected by the current locale.  (More precisely, they are affected
+-by the locale currently selected for character classification--the
+-`LC_CTYPE' category; see *Note Locale Categories::.)
+-
+-   The ISO C standard specifies two different sets of functions.  The
+-one set works on `char' type characters, the other one on `wchar_t'
+-wide character (*note Extended Char Intro::.).
+-
+-* Menu:
+-
+-* Classification of Characters::       Testing whether characters are
+-			                letters, digits, punctuation, etc.
+-
+-* Case Conversion::                    Case mapping, and the like.
+-* Classification of Wide Characters::  Character class determination for
+-                                        wide characters.
+-* Using Wide Char Classes::            Notes on using the wide character
+-                                        classes.
+-* Wide Character Case Conversion::     Mapping of wide characters.
+-
+-
+-File: libc.info,  Node: Classification of Characters,  Next: Case Conversion,  Up: Character Handling
+-
+-Classification of Characters
+-============================
+-
+-   This section explains the library functions for classifying
+-characters.  For example, `isalpha' is the function to test for an
+-alphabetic character.  It takes one argument, the character to test,
+-and returns a nonzero integer if the character is alphabetic, and zero
+-otherwise.  You would use it like this:
+-
+-     if (isalpha (c))
+-       printf ("The character `%c' is alphabetic.\n", c);
+-
+-   Each of the functions in this section tests for membership in a
+-particular class of characters; each has a name starting with `is'.
+-Each of them takes one argument, which is a character to test, and
+-returns an `int' which is treated as a boolean value.  The character
+-argument is passed as an `int', and it may be the constant value `EOF'
+-instead of a real character.
+-
+-   The attributes of any given character can vary between locales.
+-*Note Locales::, for more information on locales.
+-
+-   These functions are declared in the header file `ctype.h'.
+-
+- - Function: int islower (int C)
+-     Returns true if C is a lower-case letter.  The letter need not be
+-     from the Latin alphabet, any alphabet representable is valid.
+-
+- - Function: int isupper (int C)
+-     Returns true if C is an upper-case letter.  The letter need not be
+-     from the Latin alphabet, any alphabet representable is valid.
+-
+- - Function: int isalpha (int C)
+-     Returns true if C is an alphabetic character (a letter).  If
+-     `islower' or `isupper' is true of a character, then `isalpha' is
+-     also true.
+-
+-     In some locales, there may be additional characters for which
+-     `isalpha' is true--letters which are neither upper case nor lower
+-     case.  But in the standard `"C"' locale, there are no such
+-     additional characters.
+-
+- - Function: int isdigit (int C)
+-     Returns true if C is a decimal digit (`0' through `9').
+-
+- - Function: int isalnum (int C)
+-     Returns true if C is an alphanumeric character (a letter or
+-     number); in other words, if either `isalpha' or `isdigit' is true
+-     of a character, then `isalnum' is also true.
+-
+- - Function: int isxdigit (int C)
+-     Returns true if C is a hexadecimal digit.  Hexadecimal digits
+-     include the normal decimal digits `0' through `9' and the letters
+-     `A' through `F' and `a' through `f'.
+-
+- - Function: int ispunct (int C)
+-     Returns true if C is a punctuation character.  This means any
+-     printing character that is not alphanumeric or a space character.
+-
+- - Function: int isspace (int C)
+-     Returns true if C is a "whitespace" character.  In the standard
+-     `"C"' locale, `isspace' returns true for only the standard
+-     whitespace characters:
+-
+-    `' ''
+-          space
+-
+-    `'\f''
+-          formfeed
+-
+-    `'\n''
+-          newline
+-
+-    `'\r''
+-          carriage return
+-
+-    `'\t''
+-          horizontal tab
+-
+-    `'\v''
+-          vertical tab
+-
+- - Function: int isblank (int C)
+-     Returns true if C is a blank character; that is, a space or a tab.
+-     This function is a GNU extension.
+-
+- - Function: int isgraph (int C)
+-     Returns true if C is a graphic character; that is, a character
+-     that has a glyph associated with it.  The whitespace characters
+-     are not considered graphic.
+-
+- - Function: int isprint (int C)
+-     Returns true if C is a printing character.  Printing characters
+-     include all the graphic characters, plus the space (` ') character.
+-
+- - Function: int iscntrl (int C)
+-     Returns true if C is a control character (that is, a character that
+-     is not a printing character).
+-
+- - Function: int isascii (int C)
+-     Returns true if C is a 7-bit `unsigned char' value that fits into
+-     the US/UK ASCII character set.  This function is a BSD extension
+-     and is also an SVID extension.
+-
+-
+-File: libc.info,  Node: Case Conversion,  Next: Classification of Wide Characters,  Prev: Classification of Characters,  Up: Character Handling
+-
+-Case Conversion
+-===============
+-
+-   This section explains the library functions for performing
+-conversions such as case mappings on characters.  For example, `toupper'
+-converts any character to upper case if possible.  If the character
+-can't be converted, `toupper' returns it unchanged.
+-
+-   These functions take one argument of type `int', which is the
+-character to convert, and return the converted character as an `int'.
+-If the conversion is not applicable to the argument given, the argument
+-is returned unchanged.
+-
+-   *Compatibility Note:* In pre-ISO C dialects, instead of returning
+-the argument unchanged, these functions may fail when the argument is
+-not suitable for the conversion.  Thus for portability, you may need to
+-write `islower(c) ? toupper(c) : c' rather than just `toupper(c)'.
+-
+-   These functions are declared in the header file `ctype.h'.
+-
+- - Function: int tolower (int C)
+-     If C is an upper-case letter, `tolower' returns the corresponding
+-     lower-case letter.  If C is not an upper-case letter, C is
+-     returned unchanged.
+-
+- - Function: int toupper (int C)
+-     If C is a lower-case letter, `toupper' returns the corresponding
+-     upper-case letter.  Otherwise C is returned unchanged.
+-
+- - Function: int toascii (int C)
+-     This function converts C to a 7-bit `unsigned char' value that
+-     fits into the US/UK ASCII character set, by clearing the high-order
+-     bits.  This function is a BSD extension and is also an SVID
+-     extension.
+-
+- - Function: int _tolower (int C)
+-     This is identical to `tolower', and is provided for compatibility
+-     with the SVID.  *Note SVID::.
+-
+- - Function: int _toupper (int C)
+-     This is identical to `toupper', and is provided for compatibility
+-     with the SVID.
+-
+-
+-File: libc.info,  Node: Classification of Wide Characters,  Next: Using Wide Char Classes,  Prev: Case Conversion,  Up: Character Handling
+-
+-Character class determination for wide characters
+-=================================================
+-
+-   The second amendment to ISO C89 defines functions to classify wide
+-character.  Although the original ISO C89 standard already defined the
+-type `wchar_t' but no functions operating on them were defined.
+-
+-   The general design of the classification functions for wide
+-characters is more general.  It allows to extend the set of available
+-classification beyond the set which is always available.  The POSIX
+-standard specifies a way how the extension can be done and this is
+-already implemented in the GNU C library implementation of the
+-`localedef' program.
+-
+-   The character class functions are normally implemented using bitsets.
+-I.e., for the character in question the appropriate bitset is read from
+-a table and a test is performed whether a certain bit is set in this
+-bitset.  Which bit is tested for is determined by the class.
+-
+-   For the wide character classification functions this is made visible.
+-There is a type representing the classification, a function to retrieve
+-this value for a specific class, and a function to test using the
+-classification value whether a given character is in this class.  On top
+-of this the normal character classification functions as used for
+-`char' objects can be defined.
+-
+- - Data type: wctype_t
+-     The `wctype_t' can hold a value which represents a character class.
+-     The ony defined way to generate such a value is by using the
+-     `wctype' function.
+-
+-     This type is defined in `wctype.h'.
+-
+- - Function: wctype_t wctype (const char *PROPERTY)
+-     The `wctype' returns a value representing a class of wide
+-     characters which is identified by the string PROPERTY.  Beside
+-     some standard properties each locale can define its own ones.  In
+-     case no property with the given name is known for the current
+-     locale for the `LC_CTYPE' category the function returns zero.
+-
+-     The properties known in every locale are:
+-
+-     `"alnum"'         `"alpha"'         `"cntrl"'         `"digit"'         
+-     `"graph"'         `"lower"'         `"print"'         `"punct"'         
+-     `"space"'         `"upper"'         `"xdigit"'                          
+-
+-     This function is declared in `wctype.h'.
+-
+-   To test the membership of a character to one of the non-standard
+-classes the ISO C standard defines a completely new function.
+-
+- - Function: int iswctype (wint_t WC, wctype_t DESC)
+-     This function returns a nonzero value if WC is in the character
+-     class specified by DESC.  DESC must previously be returned by a
+-     successful call to `wctype'.
+-
+-     This function is declared in `wctype.h'.
+-
+-   The make it easier to use the commonly used classification functions
+-they are defined in the C library.  There is no need to use `wctype' is
+-the property string is one of the known character classes.  In some
+-situations it is desirable to construct the property string and then it
+-gets important that `wctype' can also handle the standard classes.
+-
+- - Function: int iswalnum (wint_t WC)
+-     This function returns a nonzero value if WC is an alphanumeric
+-     character (a letter or number); in other words, if either
+-     `iswalpha' or `iswdigit' is true of a character, then `iswalnum'
+-     is also true.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("alnum"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswalpha (wint_t WC)
+-     Returns true if WC is an alphabetic character (a letter).  If
+-     `iswlower' or `iswupper' is true of a character, then `iswalpha'
+-     is also true.
+-
+-     In some locales, there may be additional characters for which
+-     `iswalpha' is true--letters which are neither upper case nor lower
+-     case.  But in the standard `"C"' locale, there are no such
+-     additional characters.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("alpha"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswcntrl (wint_t WC)
+-     Returns true if WC is a control character (that is, a character
+-     that is not a printing character).
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("cntrl"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswdigit (wint_t WC)
+-     Returns true if WC is a digit (e.g., `0' through `9').  Please
+-     note that this function does not only return a nonzero value for
+-     *decimal* digits, but for all kinds of digits.  A consequence is
+-     that code like the following will *not* work unconditionally for
+-     wide characters:
+-
+-          n = 0;
+-          while (iswctype (*wc))
+-            {
+-              n *= 10;
+-              n += *wc++ - L'0';
+-            }
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("digit"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswgraph (wint_t WC)
+-     Returns true if WC is a graphic character; that is, a character
+-     that has a glyph associated with it.  The whitespace characters
+-     are not considered graphic.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("graph"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswlower (wint_t WC)
+-     Returns true if WC is a lower-case letter.  The letter need not be
+-     from the Latin alphabet, any alphabet representable is valid.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("lower"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswprint (wint_t WC)
+-     Returns true if WC is a printing character.  Printing characters
+-     include all the graphic characters, plus the space (` ') character.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("print"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswpunct (wint_t WC)
+-     Returns true if WC is a punctuation character.  This means any
+-     printing character that is not alphanumeric or a space character.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("punct"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswspace (wint_t WC)
+-     Returns true if WC is a "whitespace" character.  In the standard
+-     `"C"' locale, `iswspace' returns true for only the standard
+-     whitespace characters:
+-
+-    `L' ''
+-          space
+-
+-    `L'\f''
+-          formfeed
+-
+-    `L'\n''
+-          newline
+-
+-    `L'\r''
+-          carriage return
+-
+-    `L'\t''
+-          horizontal tab
+-
+-    `L'\v''
+-          vertical tab
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("space"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswupper (wint_t WC)
+-     Returns true if WC is an upper-case letter.  The letter need not be
+-     from the Latin alphabet, any alphabet representable is valid.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("upper"))
+-
+-     It is declared in `wctype.h'.
+-
+- - Function: int iswxdigit (wint_t WC)
+-     Returns true if WC is a hexadecimal digit.  Hexadecimal digits
+-     include the normal decimal digits `0' through `9' and the letters
+-     `A' through `F' and `a' through `f'.
+-
+-     This function can be implemented using
+-
+-          iswctype (wc, wctype ("xdigit"))
+-
+-     It is declared in `wctype.h'.
+-
+-   The GNu C library provides also a function which is not defined in
+-the ISO C standard but which is available as a version for single byte
+-characters as well.
+-
+- - Function: int iswblank (wint_t WC)
+-     Returns true if WC is a blank character; that is, a space or a tab.
+-     This function is a GNU extension.  It is declared in `wchar.h'.
+-
+-
+-File: libc.info,  Node: Using Wide Char Classes,  Next: Wide Character Case Conversion,  Prev: Classification of Wide Characters,  Up: Character Handling
+-
+-Notes on using the wide character classes
+-=========================================
+-
+-   The first note is probably nothing astonishing but still
+-occasionally a cause of problems.  The `iswXXX' functions can be
+-implemented using macros and in fact, the GNU C library does this.
+-They are still available as real functions but when the `wctype.h'
+-header is included the macros will be used.  This is nothing new
+-compared to the `char' type versions of these functions.
+-
+-   The second notes covers something which is new.  It can be best
+-illustrated by a (real-world) example.  The first piece of code is an
+-excerpt from the original code.  It is truncated a bit but the intention
+-should be clear.
+-
+-     int
+-     is_in_class (int c, const char *class)
+-     {
+-       if (strcmp (class, "alnum") == 0)
+-         return isalnum (c);
+-       if (strcmp (class, "alpha") == 0)
+-         return isalpha (c);
+-       if (strcmp (class, "cntrl") == 0)
+-         return iscntrl (c);
+-       ...
+-       return 0;
+-     }
+-
+-   Now with the `wctype' and `iswctype' one could avoid the `if'
+-cascades.  But rewriting the code as follows is wrong:
+-
+-     int
+-     is_in_class (int c, const char *class)
+-     {
+-       wctype_t desc = wctype (class);
+-       return desc ? iswctype ((wint_t) c, desc) : 0;
+-     }
+-
+-   The problem is that it is not guarateed that the wide character
+-representation of a single-byte character can be found using casting.
+-In fact, usually this fails miserably.  The correct solution for this
+-problem is to write the code as follows:
+-
+-     int
+-     is_in_class (int c, const char *class)
+-     {
+-       wctype_t desc = wctype (class);
+-       return desc ? iswctype (btowc (c), desc) : 0;
+-     }
+-
+-   *Note Converting a Character::, for more information on `btowc'.
+-Please note that this change probably does not improve the performance
+-of the program a lot since the `wctype' function still has to make the
+-string comparisons.  But it gets really interesting if the
+-`is_in_class' function would be called more than once using the same
+-class name.  In this case the variable DESC could be computed once and
+-reused for all the calls.  Therefore the above form of the function is
+-probably not the final one.
+-
+-
+-File: libc.info,  Node: Wide Character Case Conversion,  Prev: Using Wide Char Classes,  Up: Character Handling
+-
+-Mapping of wide characters.
+-===========================
+-
+-   As for the classification functions the ISO C standard also
+-generalizes the mapping functions.  Instead of only allowing the two
+-standard mappings the locale can contain others.  Again, the
+-`localedef' program already supports generating such locale data files.
+-
+- - Data Type: wctrans_t
+-     This data type is defined as a scalar type which can hold a value
+-     representing the locale-dependent character mapping.  There is no
+-     way to construct such a value beside using the return value of the
+-     `wctrans' function.
+-
+-     This type is defined in `wctype.h'.
+-
+- - Function: wctrans_t wctrans (const char *PROPERTY)
+-     The `wctrans' function has to be used to find out whether a named
+-     mapping is defined in the current locale selected for the
+-     `LC_CTYPE' category.  If the returned value is non-zero it can
+-     afterwards be used in calls to `towctrans'.  If the return value is
+-     zero no such mapping is known in the current locale.
+-
+-     Beside locale-specific mappings there are two mappings which are
+-     guaranteed to be available in every locale:
+-
+-     `"tolower"'                        `"toupper"'                        
+-
+-     This function is declared in `wctype.h'.
+-
+- - Function: wint_t towctrans (wint_t WC, wctrans_t DESC)
+-     The `towctrans' function maps the input character WC according to
+-     the rules of the mapping for which DESC is an descriptor and
+-     returns the so found value.  The DESC value must be obtained by a
+-     successful call to `wctrans'.
+-
+-     This function is declared in `wctype.h'.
+-
+-   The ISO C standard also defines for the generally available mappings
+-convenient shortcuts so that it is not necesary to call `wctrans' for
+-them.
+-
+- - Function: wint_t towlower (wint_t WC)
+-     If WC is an upper-case letter, `towlower' returns the corresponding
+-     lower-case letter.  If WC is not an upper-case letter, WC is
+-     returned unchanged.
+-
+-     `towlower' can be implemented using
+-
+-          towctrans (wc, wctrans ("tolower"))
+-
+-     This function is declared in `wctype.h'.
+-
+- - Function: wint_t towupper (wint_t WC)
+-     If WC is a lower-case letter, `towupper' returns the corresponding
+-     upper-case letter.  Otherwise WC is returned unchanged.
+-
+-     `towupper' can be implemented using
+-
+-          towctrans (wc, wctrans ("toupper"))
+-
+-     This function is declared in `wctype.h'.
+-
+-   The same warnings given in the last section for the use of the wide
+-character classiffication function applies here.  It is not possible to
+-simply cast a `char' type value to a `wint_t' and use it as an argument
+-for `towctrans' calls.
+-
+-
+-File: libc.info,  Node: String and Array Utilities,  Next: Character Set Handling,  Prev: Character Handling,  Up: Top
+-
+-String and Array Utilities
+-**************************
+-
+-   Operations on strings (or arrays of characters) are an important
+-part of many programs.  The GNU C library provides an extensive set of
+-string utility functions, including functions for copying,
+-concatenating, comparing, and searching strings.  Many of these
+-functions can also operate on arbitrary regions of storage; for
+-example, the `memcpy' function can be used to copy the contents of any
+-kind of array.
+-
+-   It's fairly common for beginning C programmers to "reinvent the
+-wheel" by duplicating this functionality in their own code, but it pays
+-to become familiar with the library functions and to make use of them,
+-since this offers benefits in maintenance, efficiency, and portability.
+-
+-   For instance, you could easily compare one string to another in two
+-lines of C code, but if you use the built-in `strcmp' function, you're
+-less likely to make a mistake.  And, since these library functions are
+-typically highly optimized, your program may run faster too.
+-
+-* Menu:
+-
+-* Representation of Strings::   Introduction to basic concepts.
+-* String/Array Conventions::    Whether to use a string function or an
+-				 arbitrary array function.
+-* String Length::               Determining the length of a string.
+-* Copying and Concatenation::   Functions to copy the contents of strings
+-				 and arrays.
+-* String/Array Comparison::     Functions for byte-wise and character-wise
+-				 comparison.
+-* Collation Functions::         Functions for collating strings.
+-* Search Functions::            Searching for a specific element or substring.
+-* Finding Tokens in a String::  Splitting a string into tokens by looking
+-				 for delimiters.
+-* Encode Binary Data::          Encoding and Decoding of Binary Data.
+-* Argz and Envz Vectors::       Null-separated string vectors.
+-
+-
+-File: libc.info,  Node: Representation of Strings,  Next: String/Array Conventions,  Up: String and Array Utilities
+-
+-Representation of Strings
+-=========================
+-
+-   This section is a quick summary of string concepts for beginning C
+-programmers.  It describes how character strings are represented in C
+-and some common pitfalls.  If you are already familiar with this
+-material, you can skip this section.
+-
+-   A "string" is an array of `char' objects.  But string-valued
+-variables are usually declared to be pointers of type `char *'.  Such
+-variables do not include space for the text of a string; that has to be
+-stored somewhere else--in an array variable, a string constant, or
+-dynamically allocated memory (*note Memory Allocation::.).  It's up to
+-you to store the address of the chosen memory space into the pointer
+-variable.  Alternatively you can store a "null pointer" in the pointer
+-variable.  The null pointer does not point anywhere, so attempting to
+-reference the string it points to gets an error.
+-
+-   By convention, a "null character", `'\0'', marks the end of a
+-string.  For example, in testing to see whether the `char *' variable P
+-points to a null character marking the end of a string, you can write
+-`!*P' or `*P == '\0''.
+-
+-   A null character is quite different conceptually from a null pointer,
+-although both are represented by the integer `0'.
+-
+-   "String literals" appear in C program source as strings of
+-characters between double-quote characters (`"').  In ISO C, string
+-literals can also be formed by "string concatenation": `"a" "b"' is the
+-same as `"ab"'.  Modification of string literals is not allowed by the
+-GNU C compiler, because literals are placed in read-only storage.
+-
+-   Character arrays that are declared `const' cannot be modified
+-either.  It's generally good style to declare non-modifiable string
+-pointers to be of type `const char *', since this often allows the C
+-compiler to detect accidental modifications as well as providing some
+-amount of documentation about what your program intends to do with the
+-string.
+-
+-   The amount of memory allocated for the character array may extend
+-past the null character that normally marks the end of the string.  In
+-this document, the term "allocated size" is always used to refer to the
+-total amount of memory allocated for the string, while the term
+-"length" refers to the number of characters up to (but not including)
+-the terminating null character.
+-
+-   A notorious source of program bugs is trying to put more characters
+-in a string than fit in its allocated size.  When writing code that
+-extends strings or moves characters into a pre-allocated array, you
+-should be very careful to keep track of the length of the text and make
+-explicit checks for overflowing the array.  Many of the library
+-functions *do not* do this for you!  Remember also that you need to
+-allocate an extra byte to hold the null character that marks the end of
+-the string.
+-
+-
+-File: libc.info,  Node: String/Array Conventions,  Next: String Length,  Prev: Representation of Strings,  Up: String and Array Utilities
+-
+-String and Array Conventions
+-============================
+-
+-   This chapter describes both functions that work on arbitrary arrays
+-or blocks of memory, and functions that are specific to null-terminated
+-arrays of characters.
+-
+-   Functions that operate on arbitrary blocks of memory have names
+-beginning with `mem' (such as `memcpy') and invariably take an argument
+-which specifies the size (in bytes) of the block of memory to operate
+-on.  The array arguments and return values for these functions have
+-type `void *', and as a matter of style, the elements of these arrays
+-are referred to as "bytes".  You can pass any kind of pointer to these
+-functions, and the `sizeof' operator is useful in computing the value
+-for the size argument.
+-
+-   In contrast, functions that operate specifically on strings have
+-names beginning with `str' (such as `strcpy') and look for a null
+-character to terminate the string instead of requiring an explicit size
+-argument to be passed.  (Some of these functions accept a specified
+-maximum length, but they also check for premature termination with a
+-null character.)  The array arguments and return values for these
+-functions have type `char *', and the array elements are referred to as
+-"characters".
+-
+-   In many cases, there are both `mem' and `str' versions of a
+-function.  The one that is more appropriate to use depends on the exact
+-situation.  When your program is manipulating arbitrary arrays or
+-blocks of storage, then you should always use the `mem' functions.  On
+-the other hand, when you are manipulating null-terminated strings it is
+-usually more convenient to use the `str' functions, unless you already
+-know the length of the string in advance.
+-
+-
+-File: libc.info,  Node: String Length,  Next: Copying and Concatenation,  Prev: String/Array Conventions,  Up: String and Array Utilities
+-
+-String Length
+-=============
+-
+-   You can get the length of a string using the `strlen' function.
+-This function is declared in the header file `string.h'.
+-
+- - Function: size_t strlen (const char *S)
+-     The `strlen' function returns the length of the null-terminated
+-     string S.  (In other words, it returns the offset of the
+-     terminating null character within the array.)
+-
+-     For example,
+-          strlen ("hello, world")
+-              => 12
+-
+-     When applied to a character array, the `strlen' function returns
+-     the length of the string stored there, not its allocated size.
+-     You can get the allocated size of the character array that holds a
+-     string using the `sizeof' operator:
+-
+-          char string[32] = "hello, world";
+-          sizeof (string)
+-              => 32
+-          strlen (string)
+-              => 12
+-
+-     But beware, this will not work unless STRING is the character
+-     array itself, not a pointer to it.  For example:
+-
+-          char string[32] = "hello, world";
+-          char *ptr = string;
+-          sizeof (string)
+-              => 32
+-          sizeof (ptr)
+-              => 4  /* (on a machine with 4 byte pointers) */
+-
+-     This is an easy mistake to make when you are working with
+-     functions that take string arguments; those arguments are always
+-     pointers, not arrays.
+-
+-
+- - Function: size_t strnlen (const char *S, size_t MAXLEN)
+-     The `strnlen' function returns the length of the null-terminated
+-     string S is this length is smaller than MAXLEN.  Otherwise it
+-     returns MAXLEN.  Therefore this function is equivalent to `(strlen
+-     (S) < n ? strlen (S) : MAXLEN)' but it is more efficient.
+-
+-          char string[32] = "hello, world";
+-          strnlen (string, 32)
+-              => 12
+-          strnlen (string, 5)
+-              => 5
+-
+-     This function is a GNU extension.
+-
+-
+-File: libc.info,  Node: Copying and Concatenation,  Next: String/Array Comparison,  Prev: String Length,  Up: String and Array Utilities
+-
+-Copying and Concatenation
+-=========================
+-
+-   You can use the functions described in this section to copy the
+-contents of strings and arrays, or to append the contents of one string
+-to another.  These functions are declared in the header file `string.h'.
+-
+-   A helpful way to remember the ordering of the arguments to the
+-functions in this section is that it corresponds to an assignment
+-expression, with the destination array specified to the left of the
+-source array.  All of these functions return the address of the
+-destination array.
+-
+-   Most of these functions do not work properly if the source and
+-destination arrays overlap.  For example, if the beginning of the
+-destination array overlaps the end of the source array, the original
+-contents of that part of the source array may get overwritten before it
+-is copied.  Even worse, in the case of the string functions, the null
+-character marking the end of the string may be lost, and the copy
+-function might get stuck in a loop trashing all the memory allocated to
+-your program.
+-
+-   All functions that have problems copying between overlapping arrays
+-are explicitly identified in this manual.  In addition to functions in
+-this section, there are a few others like `sprintf' (*note Formatted
+-Output Functions::.) and `scanf' (*note Formatted Input Functions::.).
+-
+- - Function: void * memcpy (void *TO, const void *FROM, size_t SIZE)
+-     The `memcpy' function copies SIZE bytes from the object beginning
+-     at FROM into the object beginning at TO.  The behavior of this
+-     function is undefined if the two arrays TO and FROM overlap; use
+-     `memmove' instead if overlapping is possible.
+-
+-     The value returned by `memcpy' is the value of TO.
+-
+-     Here is an example of how you might use `memcpy' to copy the
+-     contents of an array:
+-
+-          struct foo *oldarray, *newarray;
+-          int arraysize;
+-          ...
+-          memcpy (new, old, arraysize * sizeof (struct foo));
+-
+- - Function: void * mempcpy (void *TO, const void *FROM, size_t SIZE)
+-     The `mempcpy' function is nearly identical to the `memcpy'
+-     function.  It copies SIZE bytes from the object beginning at
+-     `from' into the object pointed to by TO.  But instead of returning
+-     the value of `to' it returns a pointer to the byte following the
+-     last written byte in the object beginning at TO.  I.e., the value
+-     is `((void *) ((char *) TO + SIZE))'.
+-
+-     This function is useful in situations where a number of objects
+-     shall be copied to consecutive memory positions.
+-
+-          void *
+-          combine (void *o1, size_t s1, void *o2, size_t s2)
+-          {
+-            void *result = malloc (s1 + s2);
+-            if (result != NULL)
+-              mempcpy (mempcpy (result, o1, s1), o2, s2);
+-            return result;
+-          }
+-
+-     This function is a GNU extension.
+-
+- - Function: void * memmove (void *TO, const void *FROM, size_t SIZE)
+-     `memmove' copies the SIZE bytes at FROM into the SIZE bytes at TO,
+-     even if those two blocks of space overlap.  In the case of
+-     overlap, `memmove' is careful to copy the original values of the
+-     bytes in the block at FROM, including those bytes which also
+-     belong to the block at TO.
+-
+- - Function: void * memccpy (void *TO, const void *FROM, int C, size_t
+-          SIZE)
+-     This function copies no more than SIZE bytes from FROM to TO,
+-     stopping if a byte matching C is found.  The return value is a
+-     pointer into TO one byte past where C was copied, or a null
+-     pointer if no byte matching C appeared in the first SIZE bytes of
+-     FROM.
+-
+- - Function: void * memset (void *BLOCK, int C, size_t SIZE)
+-     This function copies the value of C (converted to an `unsigned
+-     char') into each of the first SIZE bytes of the object beginning
+-     at BLOCK.  It returns the value of BLOCK.
+-
+- - Function: char * strcpy (char *TO, const char *FROM)
+-     This copies characters from the string FROM (up to and including
+-     the terminating null character) into the string TO.  Like
+-     `memcpy', this function has undefined results if the strings
+-     overlap.  The return value is the value of TO.
+-
+- - Function: char * strncpy (char *TO, const char *FROM, size_t SIZE)
+-     This function is similar to `strcpy' but always copies exactly
+-     SIZE characters into TO.
+-
+-     If the length of FROM is more than SIZE, then `strncpy' copies
+-     just the first SIZE characters.  Note that in this case there is
+-     no null terminator written into TO.
+-
+-     If the length of FROM is less than SIZE, then `strncpy' copies all
+-     of FROM, followed by enough null characters to add up to SIZE
+-     characters in all.  This behavior is rarely useful, but it is
+-     specified by the ISO C standard.
+-
+-     The behavior of `strncpy' is undefined if the strings overlap.
+-
+-     Using `strncpy' as opposed to `strcpy' is a way to avoid bugs
+-     relating to writing past the end of the allocated space for TO.
+-     However, it can also make your program much slower in one common
+-     case: copying a string which is probably small into a potentially
+-     large buffer.  In this case, SIZE may be large, and when it is,
+-     `strncpy' will waste a considerable amount of time copying null
+-     characters.
+-
+- - Function: char * strdup (const char *S)
+-     This function copies the null-terminated string S into a newly
+-     allocated string.  The string is allocated using `malloc'; see
+-     *Note Unconstrained Allocation::.  If `malloc' cannot allocate
+-     space for the new string, `strdup' returns a null pointer.
+-     Otherwise it returns a pointer to the new string.
+-
+- - Function: char * strndup (const char *S, size_t SIZE)
+-     This function is similar to `strdup' but always copies at most
+-     SIZE characters into the newly allocated string.
+-
+-     If the length of S is more than SIZE, then `strndup' copies just
+-     the first SIZE characters and adds a closing null terminator.
+-     Otherwise all characters are copied and the string is terminated.
+-
+-     This function is different to `strncpy' in that it always
+-     terminates the destination string.
+-
+-     `strndup' is a GNU extension.
+-
+- - Function: char * stpcpy (char *TO, const char *FROM)
+-     This function is like `strcpy', except that it returns a pointer to
+-     the end of the string TO (that is, the address of the terminating
+-     null character) rather than the beginning.
+-
+-     For example, this program uses `stpcpy' to concatenate `foo' and
+-     `bar' to produce `foobar', which it then prints.
+-
+-          #include <string.h>
+-          #include <stdio.h>
+-          
+-          int
+-          main (void)
+-          {
+-            char buffer[10];
+-            char *to = buffer;
+-            to = stpcpy (to, "foo");
+-            to = stpcpy (to, "bar");
+-            puts (buffer);
+-            return 0;
+-          }
+-
+-     This function is not part of the ISO or POSIX standards, and is not
+-     customary on Unix systems, but we did not invent it either.
+-     Perhaps it comes from MS-DOG.
+-
+-     Its behavior is undefined if the strings overlap.
+-
+- - Function: char * stpncpy (char *TO, const char *FROM, size_t SIZE)
+-     This function is similar to `stpcpy' but copies always exactly
+-     SIZE characters into TO.
+-
+-     If the length of FROM is more then SIZE, then `stpncpy' copies
+-     just the first SIZE characters and returns a pointer to the
+-     character directly following the one which was copied last.  Note
+-     that in this case there is no null terminator written into TO.
+-
+-     If the length of FROM is less than SIZE, then `stpncpy' copies all
+-     of FROM, followed by enough null characters to add up to SIZE
+-     characters in all.  This behaviour is rarely useful, but it is
+-     implemented to be useful in contexts where this behaviour of the
+-     `strncpy' is used.  `stpncpy' returns a pointer to the *first*
+-     written null character.
+-
+-     This function is not part of ISO or POSIX but was found useful
+-     while developing the GNU C Library itself.
+-
+-     Its behaviour is undefined if the strings overlap.
+-
+- - Macro: char * strdupa (const char *S)
+-     This function is similar to `strdup' but allocates the new string
+-     using `alloca' instead of `malloc' (*note Variable Size
+-     Automatic::.).  This means of course the returned string has the
+-     same limitations as any block of memory allocated using `alloca'.
+-
+-     For obvious reasons `strdupa' is implemented only as a macro; you
+-     cannot get the address of this function.  Despite this limitation
+-     it is a useful function.  The following code shows a situation
+-     where using `malloc' would be a lot more expensive.
+-
+-          #include <paths.h>
+-          #include <string.h>
+-          #include <stdio.h>
+-          
+-          const char path[] = _PATH_STDPATH;
+-          
+-          int
+-          main (void)
+-          {
+-            char *wr_path = strdupa (path);
+-            char *cp = strtok (wr_path, ":");
+-          
+-            while (cp != NULL)
+-              {
+-                puts (cp);
+-                cp = strtok (NULL, ":");
+-              }
+-            return 0;
+-          }
+-
+-     Please note that calling `strtok' using PATH directly is invalid.
+-
+-     This function is only available if GNU CC is used.
+-
+- - Macro: char * strndupa (const char *S, size_t SIZE)
+-     This function is similar to `strndup' but like `strdupa' it
+-     allocates the new string using `alloca' *note Variable Size
+-     Automatic::..  The same advantages and limitations of `strdupa'
+-     are valid for `strndupa', too.
+-
+-     This function is implemented only as a macro, just like `strdupa'.
+-
+-     `strndupa' is only available if GNU CC is used.
+-
+- - Function: char * strcat (char *TO, const char *FROM)
+-     The `strcat' function is similar to `strcpy', except that the
+-     characters from FROM are concatenated or appended to the end of
+-     TO, instead of overwriting it.  That is, the first character from
+-     FROM overwrites the null character marking the end of TO.
+-
+-     An equivalent definition for `strcat' would be:
+-
+-          char *
+-          strcat (char *to, const char *from)
+-          {
+-            strcpy (to + strlen (to), from);
+-            return to;
+-          }
+-
+-     This function has undefined results if the strings overlap.
+-
+-   Programmers using the `strcat' function (or the following `strncat'
+-function for that matter) can easily be recognize as lazy.  In almost
+-all situations the lengths of the participating strings are known.  Or
+-at least, one could know them if one keeps track of the results of the
+-various function calls.  But then it is very inefficient to use
+-`strcat'.  A lot of time is wasted finding the end of the destination
+-string so that the actual copying can start.  This is a common example:
+-
+-     /* This function concats arbitrary many strings.  The last
+-        parameter must be `NULL'.  */
+-     char *
+-     concat (const char *str, ...)
+-     {
+-       va_list ap, ap2;
+-       size_t total = 1;
+-       const char *s;
+-       char *result;
+-     
+-       va_start (ap, str);
+-       /* Actually `va_copy', but this is the name more gcc versions
+-          understand.  */
+-       __va_copy (ap2, ap);
+-     
+-       /* Determine how much space we need.  */
+-       for (s = str; s != NULL; s = va_arg (ap, const char *))
+-         total += strlen (s);
+-     
+-       va_end (ap);
+-     
+-       result = (char *) malloc (total);
+-       if (result != NULL)
+-         {
+-           result[0] = '\0';
+-     
+-           /* Copy the strings.  */
+-           for (s = str; s != NULL; s = va_arg (ap2, const char *))
+-             strcat (result, s);
+-         }
+-     
+-       va_end (ap2);
+-     
+-       return result;
+-     }
+-
+-   This looks quite simple, especially the second loop where the strings
+-are actually copied.  But these innocent lines hide a major performance
+-penalty.  Just imagine that ten strings of 100 bytes each have to be
+-concatenated.  For the second string we search the already stored 100
+-bytes for the end of the string so that we can append the next string.
+-For all strings in total the comparisons necessary to find the end of
+-the intermediate results sums up to 5500!  If we combine the copying
+-with the search for the allocation we can write this function more
+-efficent:
+-
+-     char *
+-     concat (const char *str, ...)
+-     {
+-       va_list ap;
+-       size_t allocated = 100;
+-       char *result = (char *) malloc (allocated);
+-       char *wp;
+-     
+-       if (allocated != NULL)
+-         {
+-           char *newp;
+-     
+-           va_start (ap, atr);
+-     
+-           wp = result;
+-           for (s = str; s != NULL; s = va_arg (ap, const char *))
+-             {
+-               size_t len = strlen (s);
+-     
+-               /* Resize the allocated memory if necessary.  */
+-               if (wp + len + 1 > result + allocated)
+-                 {
+-                   allocated = (allocated + len) * 2;
+-                   newp = (char *) realloc (result, allocated);
+-                   if (newp == NULL)
+-                     {
+-                       free (result);
+-                       return NULL;
+-                     }
+-                   wp = newp + (wp - result);
+-                   result = newp;
+-                 }
+-     
+-               wp = mempcpy (wp, s, len);
+-             }
+-     
+-           /* Terminate the result string.  */
+-           *wp++ = '\0';
+-     
+-           /* Resize memory to the optimal size.  */
+-           newp = realloc (result, wp - result);
+-           if (newp != NULL)
+-             result = newp;
+-     
+-           va_end (ap);
+-         }
+-     
+-       return result;
+-     }
+-
+-   With a bit more knowledge about the input strings one could fine-tune
+-the memory allocation.  The difference we are pointing to here is that
+-we don't use `strcat' anymore.  We always keep track of the length of
+-the current intermediate result so we can safe us the search for the
+-end of the string and use `mempcpy'.  Please note that we also don't
+-use `stpcpy' which might seem more natural since we handle with
+-strings.  But this is not necessary since we already know the length of
+-the string and therefore can use the faster memory copying function.
+-
+-   Whenever a programmer feels the need to use `strcat' she or he
+-should think twice and look through the program whether the code cannot
+-be rewritten to take advantage of already calculated results.  Again: it
+-is almost always unnecessary to use `strcat'.
+-
+- - Function: char * strncat (char *TO, const char *FROM, size_t SIZE)
+-     This function is like `strcat' except that not more than SIZE
+-     characters from FROM are appended to the end of TO.  A single null
+-     character is also always appended to TO, so the total allocated
+-     size of TO must be at least `SIZE + 1' bytes longer than its
+-     initial length.
+-
+-     The `strncat' function could be implemented like this:
+-
+-          char *
+-          strncat (char *to, const char *from, size_t size)
+-          {
+-            strncpy (to + strlen (to), from, size);
+-            return to;
+-          }
+-
+-     The behavior of `strncat' is undefined if the strings overlap.
+-
+-   Here is an example showing the use of `strncpy' and `strncat'.
+-Notice how, in the call to `strncat', the SIZE parameter is computed to
+-avoid overflowing the character array `buffer'.
+-
+-     #include <string.h>
+-     #include <stdio.h>
+-     
+-     #define SIZE 10
+-     
+-     static char buffer[SIZE];
+-     
+-     main ()
+-     {
+-       strncpy (buffer, "hello", SIZE);
+-       puts (buffer);
+-       strncat (buffer, ", world", SIZE - strlen (buffer) - 1);
+-       puts (buffer);
+-     }
+-
+-The output produced by this program looks like:
+-
+-     hello
+-     hello, wo
+-
+- - Function: void bcopy (const void *FROM, void *TO, size_t SIZE)
+-     This is a partially obsolete alternative for `memmove', derived
+-     from BSD.  Note that it is not quite equivalent to `memmove',
+-     because the arguments are not in the same order and there is no
+-     return value.
+-
+- - Function: void bzero (void *BLOCK, size_t SIZE)
+-     This is a partially obsolete alternative for `memset', derived from
+-     BSD.  Note that it is not as general as `memset', because the only
+-     value it can store is zero.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-50 glibc-2.1.3/manual/libc.info-50
+--- ../glibc-2.1.3/manual/libc.info-50	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-50	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1181 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Function Index,  Next: Variable Index,  Prev: Type Index,  Up: Top
+-
+-Function and Macro Index
+-************************
+-
+-* Menu:
+-
+-* __va_copy:                             Argument Macros.
+-* _Exit:                                 Termination Internals.
+-* _exit:                                 Termination Internals.
+-* _tolower:                              Case Conversion.
+-* _toupper:                              Case Conversion.
+-* a64l:                                  Encode Binary Data.
+-* abort:                                 Aborting a Program.
+-* abs:                                   Absolute Value.
+-* accept:                                Accepting Connections.
+-* access:                                Testing File Access.
+-* acos:                                  Inverse Trig Functions.
+-* acosf:                                 Inverse Trig Functions.
+-* acosh:                                 Hyperbolic Functions.
+-* acoshf:                                Hyperbolic Functions.
+-* acoshl:                                Hyperbolic Functions.
+-* acosl:                                 Inverse Trig Functions.
+-* addmntent:                             Filesystem handling.
+-* addseverity:                           Adding Severity Classes.
+-* adjtime:                               High-Resolution Calendar.
+-* aio_cancel:                            Cancel AIO Operations.
+-* aio_cancel64:                          Cancel AIO Operations.
+-* aio_error:                             Status of AIO Operations.
+-* aio_error64:                           Status of AIO Operations.
+-* aio_fsync:                             Synchronizing AIO Operations.
+-* aio_fsync64:                           Synchronizing AIO Operations.
+-* aio_init:                              Configuration of AIO.
+-* aio_read:                              Asynchronous Reads/Writes.
+-* aio_read64:                            Asynchronous Reads/Writes.
+-* aio_return:                            Status of AIO Operations.
+-* aio_return64:                          Status of AIO Operations.
+-* aio_suspend:                           Synchronizing AIO Operations.
+-* aio_suspend64:                         Synchronizing AIO Operations.
+-* aio_write:                             Asynchronous Reads/Writes.
+-* aio_write64:                           Asynchronous Reads/Writes.
+-* alarm:                                 Setting an Alarm.
+-* alloca:                                Variable Size Automatic.
+-* alphasort:                             Scanning Directory Content.
+-* alphasort64:                           Scanning Directory Content.
+-* argp_error:                            Argp Helper Functions.
+-* argp_failure:                          Argp Helper Functions.
+-* argp_help:                             Argp Help.
+-* argp_parse:                            Argp.
+-* argp_state_help:                       Argp Helper Functions.
+-* argp_usage:                            Argp Helper Functions.
+-* argz_add:                              Argz Functions.
+-* argz_add_sep:                          Argz Functions.
+-* argz_append:                           Argz Functions.
+-* argz_count:                            Argz Functions.
+-* argz_create:                           Argz Functions.
+-* argz_create_sep:                       Argz Functions.
+-* argz_delete:                           Argz Functions.
+-* argz_extract:                          Argz Functions.
+-* argz_insert:                           Argz Functions.
+-* argz_next:                             Argz Functions.
+-* argz_replace:                          Argz Functions.
+-* argz_stringify:                        Argz Functions.
+-* asctime:                               Formatting Date and Time.
+-* asctime_r:                             Formatting Date and Time.
+-* asin:                                  Inverse Trig Functions.
+-* asinf:                                 Inverse Trig Functions.
+-* asinh:                                 Hyperbolic Functions.
+-* asinhf:                                Hyperbolic Functions.
+-* asinhl:                                Hyperbolic Functions.
+-* asinl:                                 Inverse Trig Functions.
+-* asprintf:                              Dynamic Output.
+-* assert:                                Consistency Checking.
+-* assert_perror:                         Consistency Checking.
+-* atan:                                  Inverse Trig Functions.
+-* atan2:                                 Inverse Trig Functions.
+-* atan2f:                                Inverse Trig Functions.
+-* atan2l:                                Inverse Trig Functions.
+-* atanf:                                 Inverse Trig Functions.
+-* atanh:                                 Hyperbolic Functions.
+-* atanhf:                                Hyperbolic Functions.
+-* atanhl:                                Hyperbolic Functions.
+-* atanl:                                 Inverse Trig Functions.
+-* atexit:                                Cleanups on Exit.
+-* atof:                                  Parsing of Floats.
+-* atoi:                                  Parsing of Integers.
+-* atol:                                  Parsing of Integers.
+-* atoll:                                 Parsing of Integers.
+-* bcmp:                                  String/Array Comparison.
+-* bcopy:                                 Copying and Concatenation.
+-* bind:                                  Setting Address.
+-* bindtextdomain:                        Locating gettext catalog.
+-* bsearch:                               Array Search Function.
+-* btowc:                                 Converting a Character.
+-* bzero:                                 Copying and Concatenation.
+-* cabs:                                  Absolute Value.
+-* cabsf:                                 Absolute Value.
+-* cabsl:                                 Absolute Value.
+-* cacos:                                 Inverse Trig Functions.
+-* cacosf:                                Inverse Trig Functions.
+-* cacosh:                                Hyperbolic Functions.
+-* cacoshf:                               Hyperbolic Functions.
+-* cacoshl:                               Hyperbolic Functions.
+-* cacosl:                                Inverse Trig Functions.
+-* calloc:                                Allocating Cleared Space.
+-* carg:                                  Operations on Complex.
+-* cargf:                                 Operations on Complex.
+-* cargl:                                 Operations on Complex.
+-* casin:                                 Inverse Trig Functions.
+-* casinf:                                Inverse Trig Functions.
+-* casinh:                                Hyperbolic Functions.
+-* casinhf:                               Hyperbolic Functions.
+-* casinhl:                               Hyperbolic Functions.
+-* casinl:                                Inverse Trig Functions.
+-* catan:                                 Inverse Trig Functions.
+-* catanf:                                Inverse Trig Functions.
+-* catanh:                                Hyperbolic Functions.
+-* catanhf:                               Hyperbolic Functions.
+-* catanhl:                               Hyperbolic Functions.
+-* catanl:                                Inverse Trig Functions.
+-* catclose:                              The catgets Functions.
+-* catgets:                               The catgets Functions.
+-* catopen:                               The catgets Functions.
+-* cbc_crypt:                             DES Encryption.
+-* cbrt:                                  Exponents and Logarithms.
+-* cbrtf:                                 Exponents and Logarithms.
+-* cbrtl:                                 Exponents and Logarithms.
+-* ccos:                                  Trig Functions.
+-* ccosf:                                 Trig Functions.
+-* ccosh:                                 Hyperbolic Functions.
+-* ccoshf:                                Hyperbolic Functions.
+-* ccoshl:                                Hyperbolic Functions.
+-* ccosl:                                 Trig Functions.
+-* ceil:                                  Rounding Functions.
+-* ceilf:                                 Rounding Functions.
+-* ceill:                                 Rounding Functions.
+-* cexp:                                  Exponents and Logarithms.
+-* cexpf:                                 Exponents and Logarithms.
+-* cexpl:                                 Exponents and Logarithms.
+-* cfgetispeed:                           Line Speed.
+-* cfgetospeed:                           Line Speed.
+-* cfmakeraw:                             Noncanonical Input.
+-* cfree:                                 Freeing after Malloc.
+-* cfsetispeed:                           Line Speed.
+-* cfsetospeed:                           Line Speed.
+-* cfsetspeed:                            Line Speed.
+-* chdir:                                 Working Directory.
+-* chmod:                                 Setting Permissions.
+-* chown:                                 File Owner.
+-* cimag:                                 Operations on Complex.
+-* cimagf:                                Operations on Complex.
+-* cimagl:                                Operations on Complex.
+-* clearenv:                              Environment Access.
+-* clearerr:                              EOF and Errors.
+-* clock:                                 Basic CPU Time.
+-* clog:                                  Exponents and Logarithms.
+-* clog10:                                Exponents and Logarithms.
+-* clog10f:                               Exponents and Logarithms.
+-* clog10l:                               Exponents and Logarithms.
+-* clogf:                                 Exponents and Logarithms.
+-* clogl:                                 Exponents and Logarithms.
+-* close:                                 Opening and Closing Files.
+-* closedir:                              Reading/Closing Directory.
+-* confstr:                               String Parameters.
+-* conj:                                  Operations on Complex.
+-* conjf:                                 Operations on Complex.
+-* conjl:                                 Operations on Complex.
+-* connect:                               Connecting.
+-* copysign:                              FP Bit Twiddling.
+-* copysignf:                             FP Bit Twiddling.
+-* copysignl:                             FP Bit Twiddling.
+-* cos:                                   Trig Functions.
+-* cosf:                                  Trig Functions.
+-* cosh:                                  Hyperbolic Functions.
+-* coshf:                                 Hyperbolic Functions.
+-* coshl:                                 Hyperbolic Functions.
+-* cosl:                                  Trig Functions.
+-* cpow:                                  Exponents and Logarithms.
+-* cpowf:                                 Exponents and Logarithms.
+-* cpowl:                                 Exponents and Logarithms.
+-* cproj:                                 Operations on Complex.
+-* cprojf:                                Operations on Complex.
+-* cprojl:                                Operations on Complex.
+-* creal:                                 Operations on Complex.
+-* crealf:                                Operations on Complex.
+-* creall:                                Operations on Complex.
+-* creat:                                 Opening and Closing Files.
+-* creat64:                               Opening and Closing Files.
+-* crypt:                                 crypt.
+-* crypt_r:                               crypt.
+-* csin:                                  Trig Functions.
+-* csinf:                                 Trig Functions.
+-* csinh:                                 Hyperbolic Functions.
+-* csinhf:                                Hyperbolic Functions.
+-* csinhl:                                Hyperbolic Functions.
+-* csinl:                                 Trig Functions.
+-* csqrt:                                 Exponents and Logarithms.
+-* csqrtf:                                Exponents and Logarithms.
+-* csqrtl:                                Exponents and Logarithms.
+-* ctan:                                  Trig Functions.
+-* ctanf:                                 Trig Functions.
+-* ctanh:                                 Hyperbolic Functions.
+-* ctanhf:                                Hyperbolic Functions.
+-* ctanhl:                                Hyperbolic Functions.
+-* ctanl:                                 Trig Functions.
+-* ctermid:                               Identifying the Terminal.
+-* ctime:                                 Formatting Date and Time.
+-* ctime_r:                               Formatting Date and Time.
+-* cuserid:                               Who Logged In.
+-* dcgettext:                             Translation with gettext.
+-* DES_DECRYPT:                           DES Encryption.
+-* DES_ENCRYPT:                           DES Encryption.
+-* DES_FAILED:                            DES Encryption.
+-* DES_HW:                                DES Encryption.
+-* des_setparity:                         DES Encryption.
+-* DES_SW:                                DES Encryption.
+-* DESERR_BADPARAM:                       DES Encryption.
+-* DESERR_HWERROR:                        DES Encryption.
+-* DESERR_NOHWDEVICE:                     DES Encryption.
+-* DESERR_NONE:                           DES Encryption.
+-* dgettext:                              Translation with gettext.
+-* difftime:                              Simple Calendar Time.
+-* div:                                   Integer Division.
+-* drand48:                               SVID Random.
+-* drand48_r:                             SVID Random.
+-* drem:                                  Remainder Functions.
+-* dremf:                                 Remainder Functions.
+-* dreml:                                 Remainder Functions.
+-* DTTOIF:                                Directory Entries.
+-* dup:                                   Duplicating Descriptors.
+-* dup2:                                  Duplicating Descriptors.
+-* ecb_crypt:                             DES Encryption.
+-* ecvt:                                  System V Number Conversion.
+-* ecvt_r:                                System V Number Conversion.
+-* encrypt:                               DES Encryption.
+-* encrypt_r:                             DES Encryption.
+-* endfsent:                              Filesystem handling.
+-* endgrent:                              Scanning All Groups.
+-* endhostent:                            Host Names.
+-* endmntent:                             Filesystem handling.
+-* endnetent:                             Networks Database.
+-* endnetgrent:                           Lookup Netgroup.
+-* endprotoent:                           Protocols Database.
+-* endpwent:                              Scanning All Users.
+-* endservent:                            Services Database.
+-* endutent:                              Manipulating the Database.
+-* endutxent:                             XPG Functions.
+-* envz_add:                              Envz Functions.
+-* envz_entry:                            Envz Functions.
+-* envz_get:                              Envz Functions.
+-* envz_merge:                            Envz Functions.
+-* envz_strip:                            Envz Functions.
+-* erand48:                               SVID Random.
+-* erand48_r:                             SVID Random.
+-* erf:                                   Special Functions.
+-* erfc:                                  Special Functions.
+-* erfcf:                                 Special Functions.
+-* erfcl:                                 Special Functions.
+-* erff:                                  Special Functions.
+-* erfl:                                  Special Functions.
+-* execl:                                 Executing a File.
+-* execle:                                Executing a File.
+-* execlp:                                Executing a File.
+-* execv:                                 Executing a File.
+-* execve:                                Executing a File.
+-* execvp:                                Executing a File.
+-* exit:                                  Normal Termination.
+-* exp:                                   Exponents and Logarithms.
+-* exp10:                                 Exponents and Logarithms.
+-* exp10f:                                Exponents and Logarithms.
+-* exp10l:                                Exponents and Logarithms.
+-* exp2:                                  Exponents and Logarithms.
+-* exp2f:                                 Exponents and Logarithms.
+-* exp2l:                                 Exponents and Logarithms.
+-* expf:                                  Exponents and Logarithms.
+-* expl:                                  Exponents and Logarithms.
+-* expm1:                                 Exponents and Logarithms.
+-* expm1f:                                Exponents and Logarithms.
+-* expm1l:                                Exponents and Logarithms.
+-* fabs:                                  Absolute Value.
+-* fabsf:                                 Absolute Value.
+-* fabsl:                                 Absolute Value.
+-* fchmod:                                Setting Permissions.
+-* fchown:                                File Owner.
+-* fclean:                                Cleaning Streams.
+-* fclose:                                Closing Streams.
+-* fcloseall:                             Closing Streams.
+-* fcntl:                                 Control Operations.
+-* fcvt:                                  System V Number Conversion.
+-* fcvt_r:                                System V Number Conversion.
+-* FD_CLR:                                Waiting for I/O.
+-* FD_ISSET:                              Waiting for I/O.
+-* FD_SET:                                Waiting for I/O.
+-* FD_ZERO:                               Waiting for I/O.
+-* fdatasync:                             Synchronizing I/O.
+-* fdim:                                  Misc FP Arithmetic.
+-* fdimf:                                 Misc FP Arithmetic.
+-* fdiml:                                 Misc FP Arithmetic.
+-* fdopen:                                Descriptors and Streams.
+-* feclearexcept:                         Status bit operations.
+-* fegetenv:                              Control Functions.
+-* fegetexceptflag:                       Status bit operations.
+-* fegetround:                            Rounding.
+-* feholdexcept:                          Control Functions.
+-* feof:                                  EOF and Errors.
+-* ferror:                                EOF and Errors.
+-* fesetenv:                              Control Functions.
+-* fesetexceptflag:                       Status bit operations.
+-* fesetround:                            Rounding.
+-* fetestexcept:                          Status bit operations.
+-* feupdateenv:                           Control Functions.
+-* fflush:                                Flushing Buffers.
+-* fgetc:                                 Character Input.
+-* fgetgrent:                             Scanning All Groups.
+-* fgetgrent_r:                           Scanning All Groups.
+-* fgetpos:                               Portable Positioning.
+-* fgetpos64:                             Portable Positioning.
+-* fgetpwent:                             Scanning All Users.
+-* fgetpwent_r:                           Scanning All Users.
+-* fgets:                                 Line Input.
+-* fileno:                                Descriptors and Streams.
+-* finite:                                Floating Point Classes.
+-* finitef:                               Floating Point Classes.
+-* finitel:                               Floating Point Classes.
+-* floor:                                 Rounding Functions.
+-* floorf:                                Rounding Functions.
+-* floorl:                                Rounding Functions.
+-* fma:                                   Misc FP Arithmetic.
+-* fmaf:                                  Misc FP Arithmetic.
+-* fmal:                                  Misc FP Arithmetic.
+-* fmax:                                  Misc FP Arithmetic.
+-* fmaxf:                                 Misc FP Arithmetic.
+-* fmaxl:                                 Misc FP Arithmetic.
+-* fmemopen:                              String Streams.
+-* fmin:                                  Misc FP Arithmetic.
+-* fminf:                                 Misc FP Arithmetic.
+-* fminl:                                 Misc FP Arithmetic.
+-* fmod:                                  Remainder Functions.
+-* fmodf:                                 Remainder Functions.
+-* fmodl:                                 Remainder Functions.
+-* fmtmsg:                                Printing Formatted Messages.
+-* fnmatch:                               Wildcard Matching.
+-* fopen:                                 Opening Streams.
+-* fopen64:                               Opening Streams.
+-* fopencookie:                           Streams and Cookies.
+-* fork:                                  Creating a Process.
+-* forkpty:                               Pseudo-Terminal Pairs.
+-* fpathconf:                             Pathconf.
+-* fpclassify:                            Floating Point Classes.
+-* fprintf:                               Formatted Output Functions.
+-* fputc:                                 Simple Output.
+-* fputs:                                 Simple Output.
+-* fread:                                 Block Input/Output.
+-* free:                                  Freeing after Malloc.
+-* freopen:                               Opening Streams.
+-* freopen64:                             Opening Streams.
+-* frexp:                                 Normalization Functions.
+-* frexpf:                                Normalization Functions.
+-* frexpl:                                Normalization Functions.
+-* fscanf:                                Formatted Input Functions.
+-* fseek:                                 File Positioning.
+-* fseeko:                                File Positioning.
+-* fseeko64:                              File Positioning.
+-* fsetpos:                               Portable Positioning.
+-* fsetpos64:                             Portable Positioning.
+-* fstat:                                 Reading Attributes.
+-* fstat64:                               Reading Attributes.
+-* fsync:                                 Synchronizing I/O.
+-* ftell:                                 File Positioning.
+-* ftello:                                File Positioning.
+-* ftello64:                              File Positioning.
+-* ftruncate <1>:                         File Size.
+-* ftruncate:                             Truncating Files.
+-* ftruncate64:                           Truncating Files.
+-* ftw:                                   Working on Directory Trees.
+-* ftw64:                                 Working on Directory Trees.
+-* fwrite:                                Block Input/Output.
+-* gamma:                                 Special Functions.
+-* gammaf:                                Special Functions.
+-* gammal:                                Special Functions.
+-* gcvt:                                  System V Number Conversion.
+-* getc:                                  Character Input.
+-* getchar:                               Character Input.
+-* getcwd:                                Working Directory.
+-* getdate:                               General Time String Parsing.
+-* getdate_r:                             General Time String Parsing.
+-* getdelim:                              Line Input.
+-* getegid:                               Reading Persona.
+-* getenv:                                Environment Access.
+-* geteuid:                               Reading Persona.
+-* getfsent:                              Filesystem handling.
+-* getfsfile:                             Filesystem handling.
+-* getfsspec:                             Filesystem handling.
+-* getgid:                                Reading Persona.
+-* getgrent:                              Scanning All Groups.
+-* getgrent_r:                            Scanning All Groups.
+-* getgrgid:                              Lookup Group.
+-* getgrgid_r:                            Lookup Group.
+-* getgrnam:                              Lookup Group.
+-* getgrnam_r:                            Lookup Group.
+-* getgroups:                             Reading Persona.
+-* gethostbyaddr:                         Host Names.
+-* gethostbyaddr_r:                       Host Names.
+-* gethostbyname:                         Host Names.
+-* gethostbyname2:                        Host Names.
+-* gethostbyname2_r:                      Host Names.
+-* gethostbyname_r:                       Host Names.
+-* gethostent:                            Host Names.
+-* gethostid:                             Host Identification.
+-* gethostname:                           Host Identification.
+-* getitimer:                             Setting an Alarm.
+-* getline:                               Line Input.
+-* getlogin:                              Who Logged In.
+-* getmntent:                             Filesystem handling.
+-* getmntent_r:                           Filesystem handling.
+-* getnetbyaddr:                          Networks Database.
+-* getnetbyname:                          Networks Database.
+-* getnetent:                             Networks Database.
+-* getnetgrent:                           Lookup Netgroup.
+-* getnetgrent_r:                         Lookup Netgroup.
+-* getopt:                                Using Getopt.
+-* getopt_long:                           Getopt Long Options.
+-* getpass:                               getpass.
+-* getpeername:                           Who is Connected.
+-* getpgid:                               Process Group Functions.
+-* getpgrp:                               Process Group Functions.
+-* getpid:                                Process Identification.
+-* getppid:                               Process Identification.
+-* getpriority:                           Priority.
+-* getprotobyname:                        Protocols Database.
+-* getprotobynumber:                      Protocols Database.
+-* getprotoent:                           Protocols Database.
+-* getpt:                                 Allocation.
+-* getpwent:                              Scanning All Users.
+-* getpwent_r:                            Scanning All Users.
+-* getpwnam:                              Lookup User.
+-* getpwnam_r:                            Lookup User.
+-* getpwuid:                              Lookup User.
+-* getpwuid_r:                            Lookup User.
+-* getrlimit:                             Limits on Resources.
+-* getrlimit64:                           Limits on Resources.
+-* getrusage:                             Resource Usage.
+-* gets:                                  Line Input.
+-* getservbyname:                         Services Database.
+-* getservbyport:                         Services Database.
+-* getservent:                            Services Database.
+-* getsid:                                Process Group Functions.
+-* getsockname:                           Reading Address.
+-* getsockopt:                            Socket Option Functions.
+-* getsubopt:                             Suboptions.
+-* gettext:                               Translation with gettext.
+-* gettimeofday:                          High-Resolution Calendar.
+-* getuid:                                Reading Persona.
+-* getumask:                              Setting Permissions.
+-* getutent:                              Manipulating the Database.
+-* getutent_r:                            Manipulating the Database.
+-* getutid:                               Manipulating the Database.
+-* getutid_r:                             Manipulating the Database.
+-* getutline:                             Manipulating the Database.
+-* getutline_r:                           Manipulating the Database.
+-* getutxent:                             XPG Functions.
+-* getutxid:                              XPG Functions.
+-* getutxline:                            XPG Functions.
+-* getw:                                  Character Input.
+-* getwd:                                 Working Directory.
+-* glob:                                  Calling Glob.
+-* globfree:                              More Flags for Globbing.
+-* gmtime:                                Broken-down Time.
+-* gmtime_r:                              Broken-down Time.
+-* grantpt:                               Allocation.
+-* gsignal:                               Signaling Yourself.
+-* hasmntopt:                             Filesystem handling.
+-* hcreate:                               Hash Search Function.
+-* hcreate_r:                             Hash Search Function.
+-* hdestroy:                              Hash Search Function.
+-* hdestroy_r:                            Hash Search Function.
+-* hsearch:                               Hash Search Function.
+-* hsearch_r:                             Hash Search Function.
+-* htonl:                                 Byte Order.
+-* htons:                                 Byte Order.
+-* hypot:                                 Exponents and Logarithms.
+-* hypotf:                                Exponents and Logarithms.
+-* hypotl:                                Exponents and Logarithms.
+-* iconv:                                 Generic Conversion Interface.
+-* iconv_close:                           Generic Conversion Interface.
+-* iconv_open:                            Generic Conversion Interface.
+-* if_freenameindex:                      Interface Naming.
+-* if_indextoname:                        Interface Naming.
+-* if_nameindex:                          Interface Naming.
+-* if_nametoindex:                        Interface Naming.
+-* IFTODT:                                Directory Entries.
+-* ilogb:                                 Exponents and Logarithms.
+-* ilogbf:                                Exponents and Logarithms.
+-* ilogbl:                                Exponents and Logarithms.
+-* imaxabs:                               Absolute Value.
+-* imaxdiv:                               Integer Division.
+-* index:                                 Search Functions.
+-* inet_addr:                             Host Address Functions.
+-* inet_aton:                             Host Address Functions.
+-* inet_lnaof:                            Host Address Functions.
+-* inet_makeaddr:                         Host Address Functions.
+-* inet_netof:                            Host Address Functions.
+-* inet_network:                          Host Address Functions.
+-* inet_ntoa:                             Host Address Functions.
+-* inet_ntop:                             Host Address Functions.
+-* inet_pton:                             Host Address Functions.
+-* infnan:                                Floating Point Classes.
+-* initgroups:                            Setting Groups.
+-* initstate:                             BSD Random.
+-* innetgr:                               Netgroup Membership.
+-* ioctl:                                 IOCTLs.
+-* isalnum:                               Classification of Characters.
+-* isalpha:                               Classification of Characters.
+-* isascii:                               Classification of Characters.
+-* isatty:                                Is It a Terminal.
+-* isblank:                               Classification of Characters.
+-* iscntrl:                               Classification of Characters.
+-* isdigit:                               Classification of Characters.
+-* isfinite:                              Floating Point Classes.
+-* isgraph:                               Classification of Characters.
+-* isgreater:                             FP Comparison Functions.
+-* isgreaterequal:                        FP Comparison Functions.
+-* isinf:                                 Floating Point Classes.
+-* isinff:                                Floating Point Classes.
+-* isinfl:                                Floating Point Classes.
+-* isless:                                FP Comparison Functions.
+-* islessequal:                           FP Comparison Functions.
+-* islessgreater:                         FP Comparison Functions.
+-* islower:                               Classification of Characters.
+-* isnan:                                 Floating Point Classes.
+-* isnanf:                                Floating Point Classes.
+-* isnanl:                                Floating Point Classes.
+-* isnormal:                              Floating Point Classes.
+-* isprint:                               Classification of Characters.
+-* ispunct:                               Classification of Characters.
+-* isspace:                               Classification of Characters.
+-* isunordered:                           FP Comparison Functions.
+-* isupper:                               Classification of Characters.
+-* iswalnum:                              Classification of Wide Characters.
+-* iswalpha:                              Classification of Wide Characters.
+-* iswblank:                              Classification of Wide Characters.
+-* iswcntrl:                              Classification of Wide Characters.
+-* iswctype:                              Classification of Wide Characters.
+-* iswdigit:                              Classification of Wide Characters.
+-* iswgraph:                              Classification of Wide Characters.
+-* iswlower:                              Classification of Wide Characters.
+-* iswprint:                              Classification of Wide Characters.
+-* iswpunct:                              Classification of Wide Characters.
+-* iswspace:                              Classification of Wide Characters.
+-* iswupper:                              Classification of Wide Characters.
+-* iswxdigit:                             Classification of Wide Characters.
+-* isxdigit:                              Classification of Characters.
+-* ITIMER_PROF:                           Setting an Alarm.
+-* ITIMER_REAL:                           Setting an Alarm.
+-* ITIMER_VIRTUAL:                        Setting an Alarm.
+-* j0:                                    Special Functions.
+-* j0f:                                   Special Functions.
+-* j0l:                                   Special Functions.
+-* j1:                                    Special Functions.
+-* j1f:                                   Special Functions.
+-* j1l:                                   Special Functions.
+-* jn:                                    Special Functions.
+-* jnf:                                   Special Functions.
+-* jnl:                                   Special Functions.
+-* jrand48:                               SVID Random.
+-* jrand48_r:                             SVID Random.
+-* kill:                                  Signaling Another Process.
+-* killpg:                                Signaling Another Process.
+-* l64a:                                  Encode Binary Data.
+-* labs:                                  Absolute Value.
+-* lcong48:                               SVID Random.
+-* lcong48_r:                             SVID Random.
+-* ldexp:                                 Normalization Functions.
+-* ldexpf:                                Normalization Functions.
+-* ldexpl:                                Normalization Functions.
+-* ldiv:                                  Integer Division.
+-* lfind:                                 Array Search Function.
+-* lgamma:                                Special Functions.
+-* lgamma_r:                              Special Functions.
+-* lgammaf:                               Special Functions.
+-* lgammaf_r:                             Special Functions.
+-* lgammal:                               Special Functions.
+-* lgammal_r:                             Special Functions.
+-* link:                                  Hard Links.
+-* lio_listio:                            Asynchronous Reads/Writes.
+-* lio_listio64:                          Asynchronous Reads/Writes.
+-* listen:                                Listening.
+-* llabs:                                 Absolute Value.
+-* lldiv:                                 Integer Division.
+-* llrint:                                Rounding Functions.
+-* llrintf:                               Rounding Functions.
+-* llrintl:                               Rounding Functions.
+-* llround:                               Rounding Functions.
+-* llroundf:                              Rounding Functions.
+-* llroundl:                              Rounding Functions.
+-* localeconv:                            The Lame Way to Locale Data.
+-* localtime:                             Broken-down Time.
+-* localtime_r:                           Broken-down Time.
+-* log:                                   Exponents and Logarithms.
+-* log10:                                 Exponents and Logarithms.
+-* log10f:                                Exponents and Logarithms.
+-* log10l:                                Exponents and Logarithms.
+-* log1p:                                 Exponents and Logarithms.
+-* log1pf:                                Exponents and Logarithms.
+-* log1pl:                                Exponents and Logarithms.
+-* log2:                                  Exponents and Logarithms.
+-* log2f:                                 Exponents and Logarithms.
+-* log2l:                                 Exponents and Logarithms.
+-* logb <1>:                              Normalization Functions.
+-* logb:                                  Exponents and Logarithms.
+-* logbf <1>:                             Normalization Functions.
+-* logbf:                                 Exponents and Logarithms.
+-* logbl <1>:                             Normalization Functions.
+-* logbl:                                 Exponents and Logarithms.
+-* logf:                                  Exponents and Logarithms.
+-* login:                                 Logging In and Out.
+-* login_tty:                             Logging In and Out.
+-* logl:                                  Exponents and Logarithms.
+-* logout:                                Logging In and Out.
+-* logwtmp:                               Logging In and Out.
+-* longjmp:                               Non-Local Details.
+-* lrand48:                               SVID Random.
+-* lrand48_r:                             SVID Random.
+-* lrint:                                 Rounding Functions.
+-* lrintf:                                Rounding Functions.
+-* lrintl:                                Rounding Functions.
+-* lround:                                Rounding Functions.
+-* lroundf:                               Rounding Functions.
+-* lroundl:                               Rounding Functions.
+-* lsearch:                               Array Search Function.
+-* lseek:                                 File Position Primitive.
+-* lseek64:                               File Position Primitive.
+-* lstat:                                 Reading Attributes.
+-* lstat64:                               Reading Attributes.
+-* main:                                  Program Arguments.
+-* mallinfo:                              Statistics of Malloc.
+-* malloc:                                Basic Allocation.
+-* mallopt:                               Malloc Tunable Parameters.
+-* matherr:                               FP Exceptions.
+-* mblen:                                 Non-reentrant Character Conversion.
+-* mbrlen:                                Converting a Character.
+-* mbrtowc:                               Converting a Character.
+-* mbsinit:                               Keeping the state.
+-* mbsnrtowcs:                            Converting Strings.
+-* mbsrtowcs:                             Converting Strings.
+-* mbstowcs:                              Non-reentrant String Conversion.
+-* mbtowc:                                Non-reentrant Character Conversion.
+-* mcheck:                                Heap Consistency Checking.
+-* memalign:                              Aligned Memory Blocks.
+-* memccpy:                               Copying and Concatenation.
+-* memchr:                                Search Functions.
+-* memcmp:                                String/Array Comparison.
+-* memcpy:                                Copying and Concatenation.
+-* memmem:                                Search Functions.
+-* memmove:                               Copying and Concatenation.
+-* mempcpy:                               Copying and Concatenation.
+-* memset:                                Copying and Concatenation.
+-* mkdir:                                 Creating Directories.
+-* mkfifo:                                FIFO Special Files.
+-* mknod:                                 Making Special Files.
+-* mkstemp:                               Temporary Files.
+-* mktemp:                                Temporary Files.
+-* mktime:                                Broken-down Time.
+-* mmap:                                  Memory-mapped I/O.
+-* modf:                                  Rounding Functions.
+-* modff:                                 Rounding Functions.
+-* modfl:                                 Rounding Functions.
+-* mprobe:                                Heap Consistency Checking.
+-* mrand48:                               SVID Random.
+-* mrand48_r:                             SVID Random.
+-* mremap:                                Memory-mapped I/O.
+-* msync:                                 Memory-mapped I/O.
+-* mtrace:                                Tracing malloc.
+-* munmap:                                Memory-mapped I/O.
+-* muntrace:                              Tracing malloc.
+-* nan:                                   FP Bit Twiddling.
+-* nanf:                                  FP Bit Twiddling.
+-* nanl:                                  FP Bit Twiddling.
+-* nanosleep:                             Sleeping.
+-* nearbyint:                             Rounding Functions.
+-* nearbyintf:                            Rounding Functions.
+-* nearbyintl:                            Rounding Functions.
+-* nextafter:                             FP Bit Twiddling.
+-* nextafterf:                            FP Bit Twiddling.
+-* nextafterl:                            FP Bit Twiddling.
+-* nexttoward:                            FP Bit Twiddling.
+-* nexttowardf:                           FP Bit Twiddling.
+-* nexttowardl:                           FP Bit Twiddling.
+-* nftw:                                  Working on Directory Trees.
+-* nftw64:                                Working on Directory Trees.
+-* nice:                                  Priority.
+-* nl_langinfo:                           The Elegant and Fast Way.
+-* notfound:                              Actions in the NSS configuration.
+-* nrand48:                               SVID Random.
+-* nrand48_r:                             SVID Random.
+-* NSS_STATUS_NOTFOUND:                   NSS Modules Interface.
+-* NSS_STATUS_SUCCESS:                    NSS Modules Interface.
+-* NSS_STATUS_TRYAGAIN:                   NSS Modules Interface.
+-* NSS_STATUS_UNAVAIL:                    NSS Modules Interface.
+-* ntohl:                                 Byte Order.
+-* ntohs:                                 Byte Order.
+-* ntp_adjtime:                           Precision Time.
+-* ntp_gettime:                           Precision Time.
+-* obstack_1grow:                         Growing Objects.
+-* obstack_1grow_fast:                    Extra Fast Growing.
+-* obstack_alignment_mask:                Obstacks Data Alignment.
+-* obstack_alloc:                         Allocation in an Obstack.
+-* obstack_base:                          Status of an Obstack.
+-* obstack_blank:                         Growing Objects.
+-* obstack_blank_fast:                    Extra Fast Growing.
+-* obstack_chunk_alloc:                   Preparing for Obstacks.
+-* obstack_chunk_free:                    Preparing for Obstacks.
+-* obstack_chunk_size:                    Obstack Chunks.
+-* obstack_copy:                          Allocation in an Obstack.
+-* obstack_copy0:                         Allocation in an Obstack.
+-* obstack_finish:                        Growing Objects.
+-* obstack_free:                          Freeing Obstack Objects.
+-* obstack_grow:                          Growing Objects.
+-* obstack_grow0:                         Growing Objects.
+-* obstack_init:                          Preparing for Obstacks.
+-* obstack_int_grow:                      Growing Objects.
+-* obstack_int_grow_fast:                 Extra Fast Growing.
+-* obstack_next_free:                     Status of an Obstack.
+-* obstack_object_size <1>:               Status of an Obstack.
+-* obstack_object_size:                   Growing Objects.
+-* obstack_printf:                        Dynamic Output.
+-* obstack_ptr_grow:                      Growing Objects.
+-* obstack_ptr_grow_fast:                 Extra Fast Growing.
+-* obstack_room:                          Extra Fast Growing.
+-* obstack_vprintf:                       Variable Arguments Output.
+-* offsetof:                              Structure Measurement.
+-* on_exit:                               Cleanups on Exit.
+-* open:                                  Opening and Closing Files.
+-* open64:                                Opening and Closing Files.
+-* open_memstream:                        String Streams.
+-* open_obstack_stream:                   Obstack Streams.
+-* opendir:                               Opening a Directory.
+-* openpty:                               Pseudo-Terminal Pairs.
+-* parse_printf_format:                   Parsing a Template String.
+-* pathconf:                              Pathconf.
+-* pause:                                 Using Pause.
+-* pclose:                                Pipe to a Subprocess.
+-* perror:                                Error Messages.
+-* pipe:                                  Creating a Pipe.
+-* popen:                                 Pipe to a Subprocess.
+-* pow:                                   Exponents and Logarithms.
+-* pow10:                                 Exponents and Logarithms.
+-* pow10f:                                Exponents and Logarithms.
+-* pow10l:                                Exponents and Logarithms.
+-* powf:                                  Exponents and Logarithms.
+-* powl:                                  Exponents and Logarithms.
+-* pread:                                 I/O Primitives.
+-* pread64:                               I/O Primitives.
+-* printf:                                Formatted Output Functions.
+-* printf_size:                           Predefined Printf Handlers.
+-* printf_size_info:                      Predefined Printf Handlers.
+-* psignal:                               Signal Messages.
+-* pthread_atfork:                        Miscellaneous Thread Functions.
+-* pthread_attr_destroy:                  Thread Attributes.
+-* pthread_attr_get:                      Thread Attributes.
+-* pthread_attr_getinheritsched:          Thread Attributes.
+-* pthread_attr_getschedparam:            Thread Attributes.
+-* pthread_attr_getschedpolicy:           Thread Attributes.
+-* pthread_attr_getscope:                 Thread Attributes.
+-* pthread_attr_init:                     Thread Attributes.
+-* pthread_attr_set:                      Thread Attributes.
+-* pthread_attr_setinheritsched:          Thread Attributes.
+-* pthread_attr_setschedparam:            Thread Attributes.
+-* pthread_attr_setschedpolicy:           Thread Attributes.
+-* pthread_attr_setscope:                 Thread Attributes.
+-* pthread_cancel:                        Basic Thread Operations.
+-* pthread_cleanup_pop:                   Cleanup Handlers.
+-* pthread_cleanup_pop_restore_np:        Cleanup Handlers.
+-* pthread_cleanup_push:                  Cleanup Handlers.
+-* pthread_cleanup_push_defer_np:         Cleanup Handlers.
+-* pthread_cond_broadcast:                Condition Variables.
+-* pthread_cond_destroy:                  Condition Variables.
+-* pthread_cond_init:                     Condition Variables.
+-* pthread_cond_signal:                   Condition Variables.
+-* pthread_cond_timedwait:                Condition Variables.
+-* pthread_cond_wait:                     Condition Variables.
+-* pthread_condattr_destroy:              Condition Variables.
+-* pthread_condattr_init:                 Condition Variables.
+-* pthread_create:                        Basic Thread Operations.
+-* pthread_detach:                        Miscellaneous Thread Functions.
+-* pthread_equal:                         Miscellaneous Thread Functions.
+-* pthread_exit:                          Basic Thread Operations.
+-* pthread_getschedparam:                 Miscellaneous Thread Functions.
+-* pthread_getspecific:                   Thread-Specific Data.
+-* pthread_join:                          Basic Thread Operations.
+-* pthread_key_create:                    Thread-Specific Data.
+-* pthread_key_delete:                    Thread-Specific Data.
+-* pthread_kill:                          Threads and Signal Handling.
+-* pthread_kill_other_threads_np:         Miscellaneous Thread Functions.
+-* pthread_mutex_destroy:                 Mutexes.
+-* pthread_mutex_init:                    Mutexes.
+-* pthread_mutex_lock:                    Mutexes.
+-* pthread_mutex_trylock:                 Mutexes.
+-* pthread_mutex_unlock:                  Mutexes.
+-* pthread_mutexattr_destroy:             Mutexes.
+-* pthread_mutexattr_getkind_np:          Mutexes.
+-* pthread_mutexattr_init:                Mutexes.
+-* pthread_mutexattr_setkind_np:          Mutexes.
+-* pthread_once:                          Miscellaneous Thread Functions.
+-* pthread_self:                          Miscellaneous Thread Functions.
+-* pthread_setcancelstate:                Cancellation.
+-* pthread_setcanceltype:                 Cancellation.
+-* pthread_setschedparam:                 Miscellaneous Thread Functions.
+-* pthread_setspecific:                   Thread-Specific Data.
+-* pthread_sigmask:                       Threads and Signal Handling.
+-* pthread_testcancel:                    Cancellation.
+-* ptsname:                               Allocation.
+-* ptsname_r:                             Allocation.
+-* putc:                                  Simple Output.
+-* putchar:                               Simple Output.
+-* putenv:                                Environment Access.
+-* putpwent:                              Writing a User Entry.
+-* puts:                                  Simple Output.
+-* pututline:                             Manipulating the Database.
+-* pututxline:                            XPG Functions.
+-* putw:                                  Simple Output.
+-* pwrite:                                I/O Primitives.
+-* pwrite64:                              I/O Primitives.
+-* qecvt:                                 System V Number Conversion.
+-* qecvt_r:                               System V Number Conversion.
+-* qfcvt:                                 System V Number Conversion.
+-* qfcvt_r:                               System V Number Conversion.
+-* qgcvt:                                 System V Number Conversion.
+-* qsort:                                 Array Sort Function.
+-* raise:                                 Signaling Yourself.
+-* rand:                                  ISO Random.
+-* rand_r:                                ISO Random.
+-* random:                                BSD Random.
+-* read:                                  I/O Primitives.
+-* readdir:                               Reading/Closing Directory.
+-* readdir_r:                             Reading/Closing Directory.
+-* readlink:                              Symbolic Links.
+-* readv:                                 Scatter-Gather.
+-* realloc:                               Changing Block Size.
+-* recv:                                  Receiving Data.
+-* recvfrom:                              Receiving Datagrams.
+-* regcomp:                               POSIX Regexp Compilation.
+-* regerror:                              Regexp Cleanup.
+-* regexec:                               Matching POSIX Regexps.
+-* regfree:                               Regexp Cleanup.
+-* register_printf_function:              Registering New Conversions.
+-* remainder:                             Remainder Functions.
+-* remainderf:                            Remainder Functions.
+-* remainderl:                            Remainder Functions.
+-* remove:                                Deleting Files.
+-* rename:                                Renaming Files.
+-* rewind:                                File Positioning.
+-* rewinddir:                             Random Access Directory.
+-* rindex:                                Search Functions.
+-* rint:                                  Rounding Functions.
+-* rintf:                                 Rounding Functions.
+-* rintl:                                 Rounding Functions.
+-* rmdir:                                 Deleting Files.
+-* round:                                 Rounding Functions.
+-* roundf:                                Rounding Functions.
+-* roundl:                                Rounding Functions.
+-* S_ISBLK:                               Testing File Type.
+-* S_ISCHR:                               Testing File Type.
+-* S_ISDIR:                               Testing File Type.
+-* S_ISFIFO:                              Testing File Type.
+-* S_ISLNK:                               Testing File Type.
+-* S_ISREG:                               Testing File Type.
+-* S_ISSOCK:                              Testing File Type.
+-* scalb:                                 Normalization Functions.
+-* scalbf:                                Normalization Functions.
+-* scalbl:                                Normalization Functions.
+-* scalbln:                               Normalization Functions.
+-* scalblnf:                              Normalization Functions.
+-* scalblnl:                              Normalization Functions.
+-* scalbn:                                Normalization Functions.
+-* scalbnf:                               Normalization Functions.
+-* scalbnl:                               Normalization Functions.
+-* scandir:                               Scanning Directory Content.
+-* scandir64:                             Scanning Directory Content.
+-* scanf:                                 Formatted Input Functions.
+-* seed48:                                SVID Random.
+-* seed48_r:                              SVID Random.
+-* seekdir:                               Random Access Directory.
+-* select:                                Waiting for I/O.
+-* sem_destroy:                           POSIX Semaphores.
+-* sem_getvalue:                          POSIX Semaphores.
+-* sem_init:                              POSIX Semaphores.
+-* sem_post:                              POSIX Semaphores.
+-* sem_trywait:                           POSIX Semaphores.
+-* sem_wait:                              POSIX Semaphores.
+-* send:                                  Sending Data.
+-* sendto:                                Sending Datagrams.
+-* setbuf:                                Controlling Buffering.
+-* setbuffer:                             Controlling Buffering.
+-* setegid:                               Setting Groups.
+-* setenv:                                Environment Access.
+-* seteuid:                               Setting User ID.
+-* setfsent:                              Filesystem handling.
+-* setgid:                                Setting Groups.
+-* setgrent:                              Scanning All Groups.
+-* setgroups:                             Setting Groups.
+-* sethostent:                            Host Names.
+-* sethostid:                             Host Identification.
+-* sethostname:                           Host Identification.
+-* setitimer:                             Setting an Alarm.
+-* setjmp:                                Non-Local Details.
+-* setkey:                                DES Encryption.
+-* setkey_r:                              DES Encryption.
+-* setlinebuf:                            Controlling Buffering.
+-* setlocale:                             Setting the Locale.
+-* setmntent:                             Filesystem handling.
+-* setnetent:                             Networks Database.
+-* setnetgrent:                           Lookup Netgroup.
+-* setpgid:                               Process Group Functions.
+-* setpgrp:                               Process Group Functions.
+-* setpriority:                           Priority.
+-* setprotoent:                           Protocols Database.
+-* setpwent:                              Scanning All Users.
+-* setregid:                              Setting Groups.
+-* setreuid:                              Setting User ID.
+-* setrlimit:                             Limits on Resources.
+-* setrlimit64:                           Limits on Resources.
+-* setservent:                            Services Database.
+-* setsid:                                Process Group Functions.
+-* setsockopt:                            Socket Option Functions.
+-* setstate:                              BSD Random.
+-* settimeofday:                          High-Resolution Calendar.
+-* setuid:                                Setting User ID.
+-* setutent:                              Manipulating the Database.
+-* setutxent:                             XPG Functions.
+-* setvbuf:                               Controlling Buffering.
+-* shutdown:                              Closing a Socket.
+-* sigaction:                             Advanced Signal Handling.
+-* sigaddset:                             Signal Sets.
+-* sigaltstack:                           Signal Stack.
+-* sigblock:                              Blocking in BSD.
+-* sigdelset:                             Signal Sets.
+-* sigemptyset:                           Signal Sets.
+-* sigfillset:                            Signal Sets.
+-* siginterrupt:                          BSD Handler.
+-* sigismember:                           Signal Sets.
+-* siglongjmp:                            Non-Local Exits and Signals.
+-* sigmask:                               Blocking in BSD.
+-* signal:                                Basic Signal Handling.
+-* signbit:                               FP Bit Twiddling.
+-* significand:                           Normalization Functions.
+-* significandf:                          Normalization Functions.
+-* significandl:                          Normalization Functions.
+-* sigpause:                              Blocking in BSD.
+-* sigpending:                            Checking for Pending Signals.
+-* sigprocmask:                           Process Signal Mask.
+-* sigsetjmp:                             Non-Local Exits and Signals.
+-* sigsetmask:                            Blocking in BSD.
+-* sigstack:                              Signal Stack.
+-* sigsuspend:                            Sigsuspend.
+-* sigvec:                                BSD Handler.
+-* sigwait:                               Threads and Signal Handling.
+-* sin:                                   Trig Functions.
+-* sincos:                                Trig Functions.
+-* sincosf:                               Trig Functions.
+-* sincosl:                               Trig Functions.
+-* sinf:                                  Trig Functions.
+-* sinh:                                  Hyperbolic Functions.
+-* sinhf:                                 Hyperbolic Functions.
+-* sinhl:                                 Hyperbolic Functions.
+-* sinl:                                  Trig Functions.
+-* sleep:                                 Sleeping.
+-* snprintf:                              Formatted Output Functions.
+-* socket:                                Creating a Socket.
+-* socketpair:                            Socket Pairs.
+-* sprintf:                               Formatted Output Functions.
+-* sqrt:                                  Exponents and Logarithms.
+-* sqrtf:                                 Exponents and Logarithms.
+-* sqrtl:                                 Exponents and Logarithms.
+-* srand:                                 ISO Random.
+-* srand48:                               SVID Random.
+-* srand48_r:                             SVID Random.
+-* srandom:                               BSD Random.
+-* sscanf:                                Formatted Input Functions.
+-* ssignal:                               Basic Signal Handling.
+-* stat:                                  Reading Attributes.
+-* stat64:                                Reading Attributes.
+-* stpcpy:                                Copying and Concatenation.
+-* stpncpy:                               Copying and Concatenation.
+-* strcasecmp:                            String/Array Comparison.
+-* strcat:                                Copying and Concatenation.
+-* strchr:                                Search Functions.
+-* strcmp:                                String/Array Comparison.
+-* strcoll:                               Collation Functions.
+-* strcpy:                                Copying and Concatenation.
+-* strcspn:                               Search Functions.
+-* strdup:                                Copying and Concatenation.
+-* strdupa:                               Copying and Concatenation.
+-* strerror:                              Error Messages.
+-* strerror_r:                            Error Messages.
+-* strfmon:                               Formatting Numbers.
+-* strftime:                              Formatting Date and Time.
+-* strlen:                                String Length.
+-* strncasecmp:                           String/Array Comparison.
+-* strncat:                               Copying and Concatenation.
+-* strncmp:                               String/Array Comparison.
+-* strncpy:                               Copying and Concatenation.
+-* strndup:                               Copying and Concatenation.
+-* strndupa:                              Copying and Concatenation.
+-* strnlen:                               String Length.
+-* strpbrk:                               Search Functions.
+-* strptime:                              Low-Level Time String Parsing.
+-* strrchr:                               Search Functions.
+-* strsep:                                Finding Tokens in a String.
+-* strsignal:                             Signal Messages.
+-* strspn:                                Search Functions.
+-* strstr:                                Search Functions.
+-* strtod:                                Parsing of Floats.
+-* strtof:                                Parsing of Floats.
+-* strtok:                                Finding Tokens in a String.
+-* strtok_r:                              Finding Tokens in a String.
+-* strtol:                                Parsing of Integers.
+-* strtol_l:                              Parsing of Integers.
+-* strtold:                               Parsing of Floats.
+-* strtoll:                               Parsing of Integers.
+-* strtoll_l:                             Parsing of Integers.
+-* strtoq:                                Parsing of Integers.
+-* strtoul:                               Parsing of Integers.
+-* strtoul_l:                             Parsing of Integers.
+-* strtoull:                              Parsing of Integers.
+-* strtoull_l:                            Parsing of Integers.
+-* strtouq:                               Parsing of Integers.
+-* strverscmp:                            String/Array Comparison.
+-* strxfrm:                               Collation Functions.
+-* success:                               Actions in the NSS configuration.
+-* SUN_LEN:                               Local Namespace Details.
+-* symlink:                               Symbolic Links.
+-* sync:                                  Synchronizing I/O.
+-* sysconf:                               Sysconf Definition.
+-* system:                                Running a Command.
+-* sysv_signal:                           Basic Signal Handling.
+-* tan:                                   Trig Functions.
+-* tanf:                                  Trig Functions.
+-* tanh:                                  Hyperbolic Functions.
+-* tanhf:                                 Hyperbolic Functions.
+-* tanhl:                                 Hyperbolic Functions.
+-* tanl:                                  Trig Functions.
+-* tcdrain:                               Line Control.
+-* tcflow:                                Line Control.
+-* tcflush:                               Line Control.
+-* tcgetattr:                             Mode Functions.
+-* tcgetpgrp:                             Terminal Access Functions.
+-* tcgetsid:                              Terminal Access Functions.
+-* tcsendbreak:                           Line Control.
+-* tcsetattr:                             Mode Functions.
+-* tcsetpgrp:                             Terminal Access Functions.
+-* tdelete:                               Tree Search Function.
+-* tdestroy:                              Tree Search Function.
+-* telldir:                               Random Access Directory.
+-* TEMP_FAILURE_RETRY:                    Interrupted Primitives.
+-* tempnam:                               Temporary Files.
+-* textdomain:                            Locating gettext catalog.
+-* tfind:                                 Tree Search Function.
+-* tgamma:                                Special Functions.
+-* tgammaf:                               Special Functions.
+-* tgammal:                               Special Functions.
+-* time:                                  Simple Calendar Time.
+-* times:                                 Detailed CPU Time.
+-* tmpfile:                               Temporary Files.
+-* tmpfile64:                             Temporary Files.
+-* tmpnam:                                Temporary Files.
+-* tmpnam_r:                              Temporary Files.
+-* toascii:                               Case Conversion.
+-* tolower:                               Case Conversion.
+-* toupper:                               Case Conversion.
+-* towctrans:                             Wide Character Case Conversion.
+-* towlower:                              Wide Character Case Conversion.
+-* towupper:                              Wide Character Case Conversion.
+-* trunc:                                 Rounding Functions.
+-* truncate <1>:                          File Size.
+-* truncate:                              Truncating Files.
+-* truncate64:                            Truncating Files.
+-* truncf:                                Rounding Functions.
+-* truncl:                                Rounding Functions.
+-* tryagain:                              Actions in the NSS configuration.
+-* tsearch:                               Tree Search Function.
+-* ttyname:                               Is It a Terminal.
+-* ttyname_r:                             Is It a Terminal.
+-* twalk:                                 Tree Search Function.
+-* tzset:                                 Time Zone Functions.
+-* umask:                                 Setting Permissions.
+-* uname:                                 Hardware/Software Type ID.
+-* unavail:                               Actions in the NSS configuration.
+-* ungetc:                                How Unread.
+-* unlink:                                Deleting Files.
+-* unlockpt:                              Allocation.
+-* unsetenv:                              Environment Access.
+-* updwtmp:                               Manipulating the Database.
+-* utime:                                 File Times.
+-* utimes:                                File Times.
+-* utmpname:                              Manipulating the Database.
+-* va_alist:                              Old Varargs.
+-* va_arg:                                Argument Macros.
+-* va_dcl:                                Old Varargs.
+-* va_end:                                Argument Macros.
+-* va_start <1>:                          Old Varargs.
+-* va_start:                              Argument Macros.
+-* valloc:                                Aligned Memory Blocks.
+-* vasprintf:                             Variable Arguments Output.
+-* versionsort:                           Scanning Directory Content.
+-* versionsort64:                         Scanning Directory Content.
+-* vfork:                                 Creating a Process.
+-* vfprintf:                              Variable Arguments Output.
+-* vfscanf:                               Variable Arguments Input.
+-* vprintf:                               Variable Arguments Output.
+-* vscanf:                                Variable Arguments Input.
+-* vsnprintf:                             Variable Arguments Output.
+-* vsprintf:                              Variable Arguments Output.
+-* vsscanf:                               Variable Arguments Input.
+-* wait:                                  Process Completion.
+-* wait3:                                 BSD Wait Functions.
+-* wait4:                                 Process Completion.
+-* waitpid:                               Process Completion.
+-* WCOREDUMP:                             Process Completion Status.
+-* wcrtomb:                               Converting a Character.
+-* wcsnrtombs:                            Converting Strings.
+-* wcsrtombs:                             Converting Strings.
+-* wcstombs:                              Non-reentrant String Conversion.
+-* wctob:                                 Converting a Character.
+-* wctomb:                                Non-reentrant Character Conversion.
+-* wctrans:                               Wide Character Case Conversion.
+-* wctype:                                Classification of Wide Characters.
+-* WEXITSTATUS:                           Process Completion Status.
+-* WIFEXITED:                             Process Completion Status.
+-* WIFSIGNALED:                           Process Completion Status.
+-* WIFSTOPPED:                            Process Completion Status.
+-* wordexp:                               Calling Wordexp.
+-* wordfree:                              Calling Wordexp.
+-* write:                                 I/O Primitives.
+-* writev:                                Scatter-Gather.
+-* WSTOPSIG:                              Process Completion Status.
+-* WTERMSIG:                              Process Completion Status.
+-* y0:                                    Special Functions.
+-* y0f:                                   Special Functions.
+-* y0l:                                   Special Functions.
+-* y1:                                    Special Functions.
+-* y1f:                                   Special Functions.
+-* y1l:                                   Special Functions.
+-* yn:                                    Special Functions.
+-* ynf:                                   Special Functions.
+-* ynl:                                   Special Functions.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-51 glibc-2.1.3/manual/libc.info-51
+--- ../glibc-2.1.3/manual/libc.info-51	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-51	1969-12-31 16:00:00.000000000 -0800
+@@ -1,900 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Variable Index,  Next: File Index,  Prev: Function Index,  Up: Top
+-
+-Variable and Constant Macro Index
+-*********************************
+-
+-* Menu:
+-
+-* (:                                     glibc iconv Implementation.
+-* __free_hook:                           Hooks for Malloc.
+-* __malloc_hook:                         Hooks for Malloc.
+-* __memalign_hook:                       Hooks for Malloc.
+-* __realloc_hook:                        Hooks for Malloc.
+-* _BSD_SOURCE:                           Feature Test Macros.
+-* _Complex_I:                            Complex Numbers.
+-* _FILE_OFFSET_BITS:                     Feature Test Macros.
+-* _GNU_SOURCE:                           Feature Test Macros.
+-* _IOFBF:                                Controlling Buffering.
+-* _IOLBF:                                Controlling Buffering.
+-* _IONBF:                                Controlling Buffering.
+-* _LARGEFILE64_SOURCE:                   Feature Test Macros.
+-* _LARGEFILE_SOURCE:                     Feature Test Macros.
+-* _PATH_FSTAB:                           Filesystem handling.
+-* _PATH_MNTTAB:                          Filesystem handling.
+-* _PATH_MOUNTED:                         Filesystem handling.
+-* _PATH_UTMP:                            Manipulating the Database.
+-* _PATH_WTMP:                            Manipulating the Database.
+-* _POSIX2_C_DEV:                         System Options.
+-* _POSIX2_C_VERSION:                     Version Supported.
+-* _POSIX2_FORT_DEV:                      System Options.
+-* _POSIX2_FORT_RUN:                      System Options.
+-* _POSIX2_LOCALEDEF:                     System Options.
+-* _POSIX2_SW_DEV:                        System Options.
+-* _POSIX_C_SOURCE:                       Feature Test Macros.
+-* _POSIX_CHOWN_RESTRICTED:               Options for Files.
+-* _POSIX_JOB_CONTROL:                    System Options.
+-* _POSIX_NO_TRUNC:                       Options for Files.
+-* _POSIX_SAVED_IDS:                      System Options.
+-* _POSIX_SOURCE:                         Feature Test Macros.
+-* _POSIX_VDISABLE <1>:                   Options for Files.
+-* _POSIX_VDISABLE:                       Special Characters.
+-* _POSIX_VERSION:                        Version Supported.
+-* _REENTRANT:                            Feature Test Macros.
+-* _SVID_SOURCE:                          Feature Test Macros.
+-* _THREAD_SAFE:                          Feature Test Macros.
+-* _XOPEN_SOURCE:                         Feature Test Macros.
+-* _XOPEN_SOURCE_EXTENDED:                Feature Test Macros.
+-* ABDAY_1:                               The Elegant and Fast Way.
+-* ABDAY_2:                               The Elegant and Fast Way.
+-* ABDAY_3:                               The Elegant and Fast Way.
+-* ABDAY_4:                               The Elegant and Fast Way.
+-* ABDAY_5:                               The Elegant and Fast Way.
+-* ABDAY_6:                               The Elegant and Fast Way.
+-* ABDAY_7:                               The Elegant and Fast Way.
+-* ABMON_1:                               The Elegant and Fast Way.
+-* ABMON_10:                              The Elegant and Fast Way.
+-* ABMON_11:                              The Elegant and Fast Way.
+-* ABMON_12:                              The Elegant and Fast Way.
+-* ABMON_2:                               The Elegant and Fast Way.
+-* ABMON_3:                               The Elegant and Fast Way.
+-* ABMON_4:                               The Elegant and Fast Way.
+-* ABMON_5:                               The Elegant and Fast Way.
+-* ABMON_6:                               The Elegant and Fast Way.
+-* ABMON_7:                               The Elegant and Fast Way.
+-* ABMON_8:                               The Elegant and Fast Way.
+-* ABMON_9:                               The Elegant and Fast Way.
+-* ACCOUNTING:                            Manipulating the Database.
+-* AF_FILE:                               Address Formats.
+-* AF_INET:                               Address Formats.
+-* AF_INET6:                              Internet Namespace.
+-* AF_LOCAL:                              Address Formats.
+-* AF_UNIX:                               Address Formats.
+-* AF_UNSPEC:                             Address Formats.
+-* aliases:                               NSS Basics.
+-* ALT_DIGITS:                            The Elegant and Fast Way.
+-* ALTWERASE:                             Local Modes.
+-* AM_STR:                                The Elegant and Fast Way.
+-* ARG_MAX:                               General Limits.
+-* argp_err_exit_status:                  Argp Global Variables.
+-* ARGP_ERR_UNKNOWN:                      Argp Parser Functions.
+-* ARGP_HELP_BUG_ADDR:                    Argp Help Flags.
+-* ARGP_HELP_DOC:                         Argp Help Flags.
+-* ARGP_HELP_EXIT_ERR:                    Argp Help Flags.
+-* ARGP_HELP_EXIT_OK:                     Argp Help Flags.
+-* ARGP_HELP_LONG:                        Argp Help Flags.
+-* ARGP_HELP_LONG_ONLY:                   Argp Help Flags.
+-* ARGP_HELP_POST_DOC:                    Argp Help Flags.
+-* ARGP_HELP_PRE_DOC:                     Argp Help Flags.
+-* ARGP_HELP_SEE:                         Argp Help Flags.
+-* ARGP_HELP_SHORT_USAGE:                 Argp Help Flags.
+-* ARGP_HELP_STD_ERR:                     Argp Help Flags.
+-* ARGP_HELP_STD_HELP:                    Argp Help Flags.
+-* ARGP_HELP_STD_USAGE:                   Argp Help Flags.
+-* ARGP_HELP_USAGE:                       Argp Help Flags.
+-* ARGP_IN_ORDER:                         Argp Flags.
+-* ARGP_KEY_ARG:                          Argp Special Keys.
+-* ARGP_KEY_ARGS:                         Argp Special Keys.
+-* ARGP_KEY_END:                          Argp Special Keys.
+-* ARGP_KEY_ERROR:                        Argp Special Keys.
+-* ARGP_KEY_FINI:                         Argp Special Keys.
+-* ARGP_KEY_HELP_ARGS_DOC:                Argp Help Filter Keys.
+-* ARGP_KEY_HELP_DUP_ARGS_NOTE:           Argp Help Filter Keys.
+-* ARGP_KEY_HELP_EXTRA:                   Argp Help Filter Keys.
+-* ARGP_KEY_HELP_HEADER:                  Argp Help Filter Keys.
+-* ARGP_KEY_HELP_POST_DOC:                Argp Help Filter Keys.
+-* ARGP_KEY_HELP_PRE_DOC:                 Argp Help Filter Keys.
+-* ARGP_KEY_INIT:                         Argp Special Keys.
+-* ARGP_KEY_NO_ARGS:                      Argp Special Keys.
+-* ARGP_KEY_SUCCESS:                      Argp Special Keys.
+-* ARGP_LONG_ONLY:                        Argp Flags.
+-* ARGP_NO_ARGS:                          Argp Flags.
+-* ARGP_NO_ERRS:                          Argp Flags.
+-* ARGP_NO_EXIT:                          Argp Flags.
+-* ARGP_NO_HELP:                          Argp Flags.
+-* ARGP_PARSE_ARGV0:                      Argp Flags.
+-* argp_program_bug_address:              Argp Global Variables.
+-* argp_program_version:                  Argp Global Variables.
+-* argp_program_version_hook:             Argp Global Variables.
+-* ARGP_SILENT:                           Argp Flags.
+-* B0:                                    Line Speed.
+-* B110:                                  Line Speed.
+-* B115200:                               Line Speed.
+-* B1200:                                 Line Speed.
+-* B134:                                  Line Speed.
+-* B150:                                  Line Speed.
+-* B1800:                                 Line Speed.
+-* B19200:                                Line Speed.
+-* B200:                                  Line Speed.
+-* B230400:                               Line Speed.
+-* B2400:                                 Line Speed.
+-* B300:                                  Line Speed.
+-* B38400:                                Line Speed.
+-* B460800:                               Line Speed.
+-* B4800:                                 Line Speed.
+-* B50:                                   Line Speed.
+-* B57600:                                Line Speed.
+-* B600:                                  Line Speed.
+-* B75:                                   Line Speed.
+-* B9600:                                 Line Speed.
+-* BC_BASE_MAX:                           Utility Limits.
+-* BC_DIM_MAX:                            Utility Limits.
+-* BC_SCALE_MAX:                          Utility Limits.
+-* BC_STRING_MAX:                         Utility Limits.
+-* BOOT_TIME <1>:                         XPG Functions.
+-* BOOT_TIME:                             Manipulating the Database.
+-* BRKINT:                                Input Modes.
+-* BUFSIZ:                                Controlling Buffering.
+-* CCTS_OFLOW:                            Control Modes.
+-* CHAR_MAX:                              Range of Type.
+-* CHAR_MIN:                              Range of Type.
+-* CHILD_MAX:                             General Limits.
+-* CIGNORE:                               Control Modes.
+-* CLK_TCK:                               Basic CPU Time.
+-* CLOCAL:                                Control Modes.
+-* CLOCKS_PER_SEC:                        Basic CPU Time.
+-* COLL_WEIGHTS_MAX:                      Utility Limits.
+-* COREFILE:                              Program Error Signals.
+-* CREAD:                                 Control Modes.
+-* CRNCYSTR:                              The Elegant and Fast Way.
+-* CRTS_IFLOW:                            Control Modes.
+-* CS5:                                   Control Modes.
+-* CS6:                                   Control Modes.
+-* CS7:                                   Control Modes.
+-* CS8:                                   Control Modes.
+-* CSIZE:                                 Control Modes.
+-* CSTOPB:                                Control Modes.
+-* CURRENCY_SYMBOL:                       The Elegant and Fast Way.
+-* D_FMT:                                 The Elegant and Fast Way.
+-* D_T_FMT:                               The Elegant and Fast Way.
+-* DAY_1:                                 The Elegant and Fast Way.
+-* DAY_2:                                 The Elegant and Fast Way.
+-* DAY_3:                                 The Elegant and Fast Way.
+-* DAY_4:                                 The Elegant and Fast Way.
+-* DAY_5:                                 The Elegant and Fast Way.
+-* DAY_6:                                 The Elegant and Fast Way.
+-* DAY_7:                                 The Elegant and Fast Way.
+-* daylight:                              Time Zone Functions.
+-* DBL_DIG:                               Floating Point Parameters.
+-* DBL_EPSILON:                           Floating Point Parameters.
+-* DBL_MANT_DIG:                          Floating Point Parameters.
+-* DBL_MAX:                               Floating Point Parameters.
+-* DBL_MAX_10_EXP:                        Floating Point Parameters.
+-* DBL_MAX_EXP:                           Floating Point Parameters.
+-* DBL_MIN:                               Floating Point Parameters.
+-* DBL_MIN_10_EXP:                        Floating Point Parameters.
+-* DBL_MIN_EXP:                           Floating Point Parameters.
+-* DEAD_PROCESS <1>:                      XPG Functions.
+-* DEAD_PROCESS:                          Manipulating the Database.
+-* DECIMAL_POINT:                         The Elegant and Fast Way.
+-* E2BIG:                                 Error Codes.
+-* EACCES:                                Error Codes.
+-* EADDRINUSE:                            Error Codes.
+-* EADDRNOTAVAIL:                         Error Codes.
+-* EADV:                                  Error Codes.
+-* EAFNOSUPPORT:                          Error Codes.
+-* EAGAIN:                                Error Codes.
+-* EALREADY:                              Error Codes.
+-* EAUTH:                                 Error Codes.
+-* EBACKGROUND:                           Error Codes.
+-* EBADE:                                 Error Codes.
+-* EBADF <1>:                             Line Control.
+-* EBADF:                                 Error Codes.
+-* EBADFD:                                Error Codes.
+-* EBADMSG:                               Error Codes.
+-* EBADR:                                 Error Codes.
+-* EBADRPC:                               Error Codes.
+-* EBADRQC:                               Error Codes.
+-* EBADSLT:                               Error Codes.
+-* EBFONT:                                Error Codes.
+-* EBUSY:                                 Error Codes.
+-* ECHILD:                                Error Codes.
+-* ECHO:                                  Local Modes.
+-* ECHOCTL:                               Local Modes.
+-* ECHOE:                                 Local Modes.
+-* ECHOK:                                 Local Modes.
+-* ECHOKE:                                Local Modes.
+-* ECHONL:                                Local Modes.
+-* ECHOPRT:                               Local Modes.
+-* ECHRNG:                                Error Codes.
+-* ECOMM:                                 Error Codes.
+-* ECONNABORTED:                          Error Codes.
+-* ECONNREFUSED:                          Error Codes.
+-* ECONNRESET:                            Error Codes.
+-* ED:                                    Error Codes.
+-* EDEADLK:                               Error Codes.
+-* EDEADLOCK:                             Error Codes.
+-* EDESTADDRREQ:                          Error Codes.
+-* EDIED:                                 Error Codes.
+-* EDOM:                                  Error Codes.
+-* EDOTDOT:                               Error Codes.
+-* EDQUOT:                                Error Codes.
+-* EEXIST:                                Error Codes.
+-* EFAULT:                                Error Codes.
+-* EFBIG:                                 Error Codes.
+-* EFTYPE:                                Error Codes.
+-* EGRATUITOUS:                           Error Codes.
+-* EGREGIOUS:                             Error Codes.
+-* EHOSTDOWN:                             Error Codes.
+-* EHOSTUNREACH:                          Error Codes.
+-* EIDRM:                                 Error Codes.
+-* EIEIO:                                 Error Codes.
+-* EILSEQ:                                Error Codes.
+-* EINPROGRESS:                           Error Codes.
+-* EINTR:                                 Error Codes.
+-* EINVAL <1>:                            Line Control.
+-* EINVAL:                                Error Codes.
+-* EIO:                                   Error Codes.
+-* EISCONN:                               Error Codes.
+-* EISDIR:                                Error Codes.
+-* EISNAM:                                Error Codes.
+-* EL2HLT:                                Error Codes.
+-* EL2NSYNC:                              Error Codes.
+-* EL3HLT:                                Error Codes.
+-* EL3RST:                                Error Codes.
+-* ELIBACC:                               Error Codes.
+-* ELIBBAD:                               Error Codes.
+-* ELIBEXEC:                              Error Codes.
+-* ELIBMAX:                               Error Codes.
+-* ELIBSCN:                               Error Codes.
+-* ELNRNG:                                Error Codes.
+-* ELOOP:                                 Error Codes.
+-* EMEDIUMTYPE:                           Error Codes.
+-* EMFILE:                                Error Codes.
+-* EMLINK:                                Error Codes.
+-* EMPTY <1>:                             XPG Functions.
+-* EMPTY:                                 Manipulating the Database.
+-* EMSGSIZE:                              Error Codes.
+-* EMULTIHOP:                             Error Codes.
+-* ENAMETOOLONG:                          Error Codes.
+-* ENAVAIL:                               Error Codes.
+-* ENEEDAUTH:                             Error Codes.
+-* ENETDOWN:                              Error Codes.
+-* ENETRESET:                             Error Codes.
+-* ENETUNREACH:                           Error Codes.
+-* ENFILE:                                Error Codes.
+-* ENOANO:                                Error Codes.
+-* ENOBUFS:                               Error Codes.
+-* ENOCSI:                                Error Codes.
+-* ENODATA:                               Error Codes.
+-* ENODEV:                                Error Codes.
+-* ENOENT:                                Error Codes.
+-* ENOEXEC:                               Error Codes.
+-* ENOLCK:                                Error Codes.
+-* ENOLINK:                               Error Codes.
+-* ENOMEDIUM:                             Error Codes.
+-* ENOMEM:                                Error Codes.
+-* ENOMSG:                                Error Codes.
+-* ENONET:                                Error Codes.
+-* ENOPKG:                                Error Codes.
+-* ENOPROTOOPT:                           Error Codes.
+-* ENOSPC:                                Error Codes.
+-* ENOSR:                                 Error Codes.
+-* ENOSTR:                                Error Codes.
+-* ENOSYS:                                Error Codes.
+-* ENOTBLK:                               Error Codes.
+-* ENOTCONN:                              Error Codes.
+-* ENOTDIR:                               Error Codes.
+-* ENOTEMPTY:                             Error Codes.
+-* ENOTNAM:                               Error Codes.
+-* ENOTSOCK:                              Error Codes.
+-* ENOTSUP:                               Error Codes.
+-* ENOTTY <1>:                            Line Control.
+-* ENOTTY:                                Error Codes.
+-* ENOTUNIQ:                              Error Codes.
+-* environ:                               Environment Access.
+-* ENXIO:                                 Error Codes.
+-* EOF:                                   EOF and Errors.
+-* EOPNOTSUPP:                            Error Codes.
+-* EOVERFLOW:                             Error Codes.
+-* EPERM:                                 Error Codes.
+-* EPFNOSUPPORT:                          Error Codes.
+-* EPIPE:                                 Error Codes.
+-* EPROCLIM:                              Error Codes.
+-* EPROCUNAVAIL:                          Error Codes.
+-* EPROGMISMATCH:                         Error Codes.
+-* EPROGUNAVAIL:                          Error Codes.
+-* EPROTO:                                Error Codes.
+-* EPROTONOSUPPORT:                       Error Codes.
+-* EPROTOTYPE:                            Error Codes.
+-* EQUIV_CLASS_MAX:                       Utility Limits.
+-* ERA:                                   The Elegant and Fast Way.
+-* ERA_D_FMT:                             The Elegant and Fast Way.
+-* ERA_D_T_FMT:                           The Elegant and Fast Way.
+-* ERA_T_FMT:                             The Elegant and Fast Way.
+-* ERA_YEAR:                              The Elegant and Fast Way.
+-* ERANGE:                                Error Codes.
+-* EREMCHG:                               Error Codes.
+-* EREMOTE:                               Error Codes.
+-* EREMOTEIO:                             Error Codes.
+-* ERESTART:                              Error Codes.
+-* EROFS:                                 Error Codes.
+-* ERPCMISMATCH:                          Error Codes.
+-* errno:                                 Checking for Errors.
+-* ESHUTDOWN:                             Error Codes.
+-* ESOCKTNOSUPPORT:                       Error Codes.
+-* ESPIPE:                                Error Codes.
+-* ESRCH:                                 Error Codes.
+-* ESRMNT:                                Error Codes.
+-* ESTALE:                                Error Codes.
+-* ESTRPIPE:                              Error Codes.
+-* ethers:                                NSS Basics.
+-* ETIME:                                 Error Codes.
+-* ETIMEDOUT:                             Error Codes.
+-* ETOOMANYREFS:                          Error Codes.
+-* ETXTBSY:                               Error Codes.
+-* EUCLEAN:                               Error Codes.
+-* EUNATCH:                               Error Codes.
+-* EUSERS:                                Error Codes.
+-* EWOULDBLOCK:                           Error Codes.
+-* EXDEV:                                 Error Codes.
+-* EXFULL:                                Error Codes.
+-* EXIT_FAILURE:                          Exit Status.
+-* EXIT_SUCCESS:                          Exit Status.
+-* EXPR_NEST_MAX:                         Utility Limits.
+-* EXTA:                                  Line Speed.
+-* EXTB:                                  Line Speed.
+-* F_DUPFD:                               Duplicating Descriptors.
+-* F_GETFD:                               Descriptor Flags.
+-* F_GETFL:                               Getting File Status Flags.
+-* F_GETLK:                               File Locks.
+-* F_GETOWN:                              Interrupt Input.
+-* F_OK:                                  Testing File Access.
+-* F_RDLCK:                               File Locks.
+-* F_SETFD:                               Descriptor Flags.
+-* F_SETFL:                               Getting File Status Flags.
+-* F_SETLK:                               File Locks.
+-* F_SETLKW:                              File Locks.
+-* F_SETOWN:                              Interrupt Input.
+-* F_UNLCK:                               File Locks.
+-* F_WRLCK:                               File Locks.
+-* FD_CLOEXEC:                            Descriptor Flags.
+-* FD_SETSIZE:                            Waiting for I/O.
+-* FE_DFL_ENV:                            Control Functions.
+-* FE_DIVBYZERO:                          Status bit operations.
+-* FE_DOWNWARD:                           Rounding.
+-* FE_INEXACT:                            Status bit operations.
+-* FE_INVALID:                            Status bit operations.
+-* FE_NOMASK_ENV:                         Control Functions.
+-* FE_OVERFLOW:                           Status bit operations.
+-* FE_TONEAREST:                          Rounding.
+-* FE_TOWARDZERO:                         Rounding.
+-* FE_UNDERFLOW:                          Status bit operations.
+-* FE_UPWARD:                             Rounding.
+-* FILENAME_MAX:                          Limits for Files.
+-* FLT_DIG:                               Floating Point Parameters.
+-* FLT_EPSILON:                           Floating Point Parameters.
+-* FLT_MANT_DIG:                          Floating Point Parameters.
+-* FLT_MAX:                               Floating Point Parameters.
+-* FLT_MAX_10_EXP:                        Floating Point Parameters.
+-* FLT_MAX_EXP:                           Floating Point Parameters.
+-* FLT_MIN:                               Floating Point Parameters.
+-* FLT_MIN_10_EXP:                        Floating Point Parameters.
+-* FLT_MIN_EXP:                           Floating Point Parameters.
+-* FLT_RADIX:                             Floating Point Parameters.
+-* FLT_ROUNDS:                            Floating Point Parameters.
+-* FLUSHO:                                Local Modes.
+-* FOPEN_MAX:                             Opening Streams.
+-* FP_FAST_FMA:                           Misc FP Arithmetic.
+-* FP_ILOGB0:                             Exponents and Logarithms.
+-* FP_ILOGBNAN:                           Exponents and Logarithms.
+-* FP_INFINITE:                           Floating Point Classes.
+-* FP_NAN:                                Floating Point Classes.
+-* FP_NORMAL:                             Floating Point Classes.
+-* FP_SUBNORMAL:                          Floating Point Classes.
+-* FP_ZERO:                               Floating Point Classes.
+-* FPE_DECOVF_TRAP:                       Program Error Signals.
+-* FPE_FLTDIV_TRAP:                       Program Error Signals.
+-* FPE_FLTOVF_TRAP:                       Program Error Signals.
+-* FPE_FLTUND_TRAP:                       Program Error Signals.
+-* FPE_INTDIV_TRAP:                       Program Error Signals.
+-* FPE_INTOVF_TRAP:                       Program Error Signals.
+-* FPE_SUBRNG_TRAP:                       Program Error Signals.
+-* FRAC_DIGITS:                           The Elegant and Fast Way.
+-* FSTAB:                                 Filesystem handling.
+-* FSTAB_RO:                              Filesystem handling.
+-* FSTAB_RQ:                              Filesystem handling.
+-* FSTAB_RW:                              Filesystem handling.
+-* FSTAB_SW:                              Filesystem handling.
+-* FSTAB_XX:                              Filesystem handling.
+-* FTW_CHDIR:                             Working on Directory Trees.
+-* FTW_D:                                 Working on Directory Trees.
+-* FTW_DEPTH:                             Working on Directory Trees.
+-* FTW_DNR:                               Working on Directory Trees.
+-* FTW_DP:                                Working on Directory Trees.
+-* FTW_F:                                 Working on Directory Trees.
+-* FTW_MOUNT:                             Working on Directory Trees.
+-* FTW_NS:                                Working on Directory Trees.
+-* FTW_PHYS:                              Working on Directory Trees.
+-* FTW_SL:                                Working on Directory Trees.
+-* FTW_SLN:                               Working on Directory Trees.
+-* getdate_err:                           General Time String Parsing.
+-* group:                                 NSS Basics.
+-* GROUPING:                              The Elegant and Fast Way.
+-* h_errno:                               Host Names.
+-* HOST_NOT_FOUND:                        Host Names.
+-* hosts:                                 NSS Basics.
+-* HUGE_VAL:                              Math Error Reporting.
+-* HUGE_VALF:                             Math Error Reporting.
+-* HUGE_VALL:                             Math Error Reporting.
+-* HUPCL:                                 Control Modes.
+-* I:                                     Complex Numbers.
+-* ICANON:                                Local Modes.
+-* ICRNL:                                 Input Modes.
+-* IEXTEN:                                Local Modes.
+-* IFNAMSIZ:                              Interface Naming.
+-* IGNBRK:                                Input Modes.
+-* IGNCR:                                 Input Modes.
+-* IGNPAR:                                Input Modes.
+-* IMAXBEL:                               Input Modes.
+-* in6addr_any:                           Host Address Data Type.
+-* in6addr_loopback:                      Host Address Data Type.
+-* INADDR_ANY:                            Host Address Data Type.
+-* INADDR_BROADCAST:                      Host Address Data Type.
+-* INADDR_LOOPBACK:                       Host Address Data Type.
+-* INADDR_NONE:                           Host Address Data Type.
+-* INFINITY:                              Infinity and NaN.
+-* INIT_PROCESS <1>:                      XPG Functions.
+-* INIT_PROCESS:                          Manipulating the Database.
+-* INLCR:                                 Input Modes.
+-* INPCK:                                 Input Modes.
+-* INT_CURR_SYMBOL:                       The Elegant and Fast Way.
+-* INT_FRAC_DIGITS:                       The Elegant and Fast Way.
+-* INT_MAX:                               Range of Type.
+-* INT_MIN:                               Range of Type.
+-* IPPORT_RESERVED:                       Ports.
+-* IPPORT_USERRESERVED:                   Ports.
+-* ISIG:                                  Local Modes.
+-* ISTRIP:                                Input Modes.
+-* IXANY:                                 Input Modes.
+-* IXOFF:                                 Input Modes.
+-* IXON:                                  Input Modes.
+-* L_ctermid:                             Identifying the Terminal.
+-* L_cuserid:                             Who Logged In.
+-* L_INCR:                                File Positioning.
+-* L_SET:                                 File Positioning.
+-* L_tmpnam:                              Temporary Files.
+-* L_XTND:                                File Positioning.
+-* LANG:                                  Locale Categories.
+-* LANGUAGE:                              Locale Categories.
+-* LC_ALL:                                Locale Categories.
+-* LC_COLLATE:                            Locale Categories.
+-* LC_CTYPE:                              Locale Categories.
+-* LC_MESSAGES:                           Locale Categories.
+-* LC_MONETARY:                           Locale Categories.
+-* LC_NUMERIC:                            Locale Categories.
+-* LC_TIME:                               Locale Categories.
+-* LDBL_DIG:                              Floating Point Parameters.
+-* LDBL_EPSILON:                          Floating Point Parameters.
+-* LDBL_MANT_DIG:                         Floating Point Parameters.
+-* LDBL_MAX:                              Floating Point Parameters.
+-* LDBL_MAX_10_EXP:                       Floating Point Parameters.
+-* LDBL_MAX_EXP:                          Floating Point Parameters.
+-* LDBL_MIN:                              Floating Point Parameters.
+-* LDBL_MIN_10_EXP:                       Floating Point Parameters.
+-* LDBL_MIN_EXP:                          Floating Point Parameters.
+-* LINE_MAX:                              Utility Limits.
+-* LINK_MAX:                              Limits for Files.
+-* LIO_NOP:                               Asynchronous I/O.
+-* LIO_READ:                              Asynchronous I/O.
+-* LIO_WRITE:                             Asynchronous I/O.
+-* LOGIN_PROCESS <1>:                     XPG Functions.
+-* LOGIN_PROCESS:                         Manipulating the Database.
+-* LONG_LONG_MAX:                         Range of Type.
+-* LONG_LONG_MIN:                         Range of Type.
+-* LONG_MAX:                              Range of Type.
+-* LONG_MIN:                              Range of Type.
+-* M_1_PI:                                Mathematical Constants.
+-* M_2_PI:                                Mathematical Constants.
+-* M_2_SQRTPI:                            Mathematical Constants.
+-* M_E:                                   Mathematical Constants.
+-* M_LN10:                                Mathematical Constants.
+-* M_LN2:                                 Mathematical Constants.
+-* M_LOG10E:                              Mathematical Constants.
+-* M_LOG2E:                               Mathematical Constants.
+-* M_PI:                                  Mathematical Constants.
+-* M_PI_2:                                Mathematical Constants.
+-* M_PI_4:                                Mathematical Constants.
+-* M_SQRT1_2:                             Mathematical Constants.
+-* M_SQRT2:                               Mathematical Constants.
+-* MAP_ANON:                              Memory-mapped I/O.
+-* MAP_ANONYMOUS:                         Memory-mapped I/O.
+-* MAP_FIXED:                             Memory-mapped I/O.
+-* MAP_PRIVATE:                           Memory-mapped I/O.
+-* MAP_SHARED:                            Memory-mapped I/O.
+-* MAX_CANON:                             Limits for Files.
+-* MAX_INPUT:                             Limits for Files.
+-* MAXNAMLEN:                             Limits for Files.
+-* MB_CUR_MAX:                            Selecting the Conversion.
+-* MB_LEN_MAX:                            Selecting the Conversion.
+-* MDMBUF:                                Control Modes.
+-* MINSIGSTKSZ:                           Signal Stack.
+-* MM_APPL:                               Printing Formatted Messages.
+-* MM_CONSOLE:                            Printing Formatted Messages.
+-* MM_ERROR:                              Printing Formatted Messages.
+-* MM_FIRM:                               Printing Formatted Messages.
+-* MM_HALT:                               Printing Formatted Messages.
+-* MM_HARD:                               Printing Formatted Messages.
+-* MM_INFO:                               Printing Formatted Messages.
+-* MM_NOSEV:                              Printing Formatted Messages.
+-* MM_NRECOV:                             Printing Formatted Messages.
+-* MM_NULLACT:                            Printing Formatted Messages.
+-* MM_NULLLBL:                            Printing Formatted Messages.
+-* MM_NULLMC:                             Printing Formatted Messages.
+-* MM_NULLSEV:                            Printing Formatted Messages.
+-* MM_NULLTAG:                            Printing Formatted Messages.
+-* MM_NULLTXT:                            Printing Formatted Messages.
+-* MM_OPSYS:                              Printing Formatted Messages.
+-* MM_PRINT:                              Printing Formatted Messages.
+-* MM_RECOVER:                            Printing Formatted Messages.
+-* MM_SOFT:                               Printing Formatted Messages.
+-* MM_UTIL:                               Printing Formatted Messages.
+-* MM_WARNING:                            Printing Formatted Messages.
+-* MNTOPT_DEFAULTS:                       Filesystem handling.
+-* MNTOPT_NOAUTO:                         Filesystem handling.
+-* MNTOPT_NOSUID:                         Filesystem handling.
+-* MNTOPT_RO:                             Filesystem handling.
+-* MNTOPT_RW:                             Filesystem handling.
+-* MNTOPT_SUID:                           Filesystem handling.
+-* MNTTYPE_IGNORE:                        Filesystem handling.
+-* MNTTYPE_NFS:                           Filesystem handling.
+-* MNTTYPE_SWAP:                          Filesystem handling.
+-* MON_1:                                 The Elegant and Fast Way.
+-* MON_10:                                The Elegant and Fast Way.
+-* MON_11:                                The Elegant and Fast Way.
+-* MON_12:                                The Elegant and Fast Way.
+-* MON_2:                                 The Elegant and Fast Way.
+-* MON_3:                                 The Elegant and Fast Way.
+-* MON_4:                                 The Elegant and Fast Way.
+-* MON_5:                                 The Elegant and Fast Way.
+-* MON_6:                                 The Elegant and Fast Way.
+-* MON_7:                                 The Elegant and Fast Way.
+-* MON_8:                                 The Elegant and Fast Way.
+-* MON_9:                                 The Elegant and Fast Way.
+-* MON_DECIMAL_POINT:                     The Elegant and Fast Way.
+-* MON_GROUPING:                          The Elegant and Fast Way.
+-* MON_THOUSANDS_SEP:                     The Elegant and Fast Way.
+-* MS_ASYNC:                              Memory-mapped I/O.
+-* MS_SYNC:                               Memory-mapped I/O.
+-* MSG_DONTROUTE:                         Socket Data Options.
+-* MSG_OOB:                               Socket Data Options.
+-* MSG_PEEK:                              Socket Data Options.
+-* N_CS_PRECEDES:                         The Elegant and Fast Way.
+-* N_SEP_BY_SPACE:                        The Elegant and Fast Way.
+-* N_SIGN_POSN:                           The Elegant and Fast Way.
+-* NAME_MAX:                              Limits for Files.
+-* NAN:                                   Infinity and NaN.
+-* NCCS:                                  Mode Data Types.
+-* NDEBUG:                                Consistency Checking.
+-* NEGATIVE_SIGN:                         The Elegant and Fast Way.
+-* netgroup:                              NSS Basics.
+-* networks:                              NSS Basics.
+-* NEW_TIME <1>:                          XPG Functions.
+-* NEW_TIME:                              Manipulating the Database.
+-* NGROUPS_MAX:                           General Limits.
+-* NL_ARGMAX:                             Output Conversion Syntax.
+-* NO_ADDRESS:                            Host Names.
+-* NO_RECOVERY:                           Host Names.
+-* NOEXPR:                                The Elegant and Fast Way.
+-* NOFLSH:                                Local Modes.
+-* NOKERNINFO:                            Local Modes.
+-* NOSTR:                                 The Elegant and Fast Way.
+-* NSIG:                                  Standard Signals.
+-* NSS_STATUS_NOTFOUND:                   NSS Modules Interface.
+-* NSS_STATUS_SUCCESS:                    NSS Modules Interface.
+-* NSS_STATUS_TRYAGAIN:                   NSS Modules Interface.
+-* NSS_STATUS_UNAVAIL:                    NSS Modules Interface.
+-* NULL:                                  Null Pointer Constant.
+-* O_ACCMODE:                             Access Modes.
+-* O_APPEND:                              Operating Modes.
+-* O_ASYNC:                               Operating Modes.
+-* O_CREAT:                               Open-time Flags.
+-* O_EXCL:                                Open-time Flags.
+-* O_EXEC:                                Access Modes.
+-* O_EXLOCK:                              Open-time Flags.
+-* O_FSYNC:                               Operating Modes.
+-* O_IGNORE_CTTY:                         Open-time Flags.
+-* O_NDELAY:                              Operating Modes.
+-* O_NOATIME:                             Operating Modes.
+-* O_NOCTTY:                              Open-time Flags.
+-* O_NOLINK:                              Open-time Flags.
+-* O_NONBLOCK <1>:                        Operating Modes.
+-* O_NONBLOCK:                            Open-time Flags.
+-* O_NOTRANS:                             Open-time Flags.
+-* O_RDONLY:                              Access Modes.
+-* O_RDWR:                                Access Modes.
+-* O_READ:                                Access Modes.
+-* O_SHLOCK:                              Open-time Flags.
+-* O_SYNC:                                Operating Modes.
+-* O_TRUNC:                               Open-time Flags.
+-* O_WRITE:                               Access Modes.
+-* O_WRONLY:                              Access Modes.
+-* obstack_alloc_failed_handler:          Preparing for Obstacks.
+-* OLD_TIME <1>:                          XPG Functions.
+-* OLD_TIME:                              Manipulating the Database.
+-* ONLCR:                                 Output Modes.
+-* ONOEOT:                                Output Modes.
+-* OPEN_MAX:                              General Limits.
+-* OPOST:                                 Output Modes.
+-* optarg:                                Using Getopt.
+-* opterr:                                Using Getopt.
+-* optind:                                Using Getopt.
+-* OPTION_ALIAS:                          Argp Option Flags.
+-* OPTION_ARG_OPTIONAL:                   Argp Option Flags.
+-* OPTION_DOC:                            Argp Option Flags.
+-* OPTION_HIDDEN:                         Argp Option Flags.
+-* OPTION_NO_USAGE:                       Argp Option Flags.
+-* optopt:                                Using Getopt.
+-* OXTABS:                                Output Modes.
+-* P_CS_PRECEDES:                         The Elegant and Fast Way.
+-* P_SEP_BY_SPACE:                        The Elegant and Fast Way.
+-* P_SIGN_POSN:                           The Elegant and Fast Way.
+-* P_tmpdir:                              Temporary Files.
+-* PA_CHAR:                               Parsing a Template String.
+-* PA_DOUBLE:                             Parsing a Template String.
+-* PA_FLAG_LONG:                          Parsing a Template String.
+-* PA_FLAG_LONG_DOUBLE:                   Parsing a Template String.
+-* PA_FLAG_LONG_LONG:                     Parsing a Template String.
+-* PA_FLAG_MASK:                          Parsing a Template String.
+-* PA_FLAG_PTR:                           Parsing a Template String.
+-* PA_FLAG_SHORT:                         Parsing a Template String.
+-* PA_FLOAT:                              Parsing a Template String.
+-* PA_INT:                                Parsing a Template String.
+-* PA_LAST:                               Parsing a Template String.
+-* PA_POINTER:                            Parsing a Template String.
+-* PA_STRING:                             Parsing a Template String.
+-* PARENB:                                Control Modes.
+-* PARMRK:                                Input Modes.
+-* PARODD:                                Control Modes.
+-* passwd:                                NSS Basics.
+-* PATH_MAX:                              Limits for Files.
+-* PENDIN:                                Local Modes.
+-* PF_CCITT:                              Misc Namespaces.
+-* PF_FILE:                               Local Namespace Details.
+-* PF_IMPLINK:                            Misc Namespaces.
+-* PF_INET:                               Internet Namespace.
+-* PF_ISO:                                Misc Namespaces.
+-* PF_LOCAL:                              Local Namespace Details.
+-* PF_NS:                                 Misc Namespaces.
+-* PF_ROUTE:                              Misc Namespaces.
+-* PF_UNIX:                               Local Namespace Details.
+-* PI:                                    Mathematical Constants.
+-* PIPE_BUF:                              Limits for Files.
+-* PM_STR:                                The Elegant and Fast Way.
+-* POSITIVE_SIGN:                         The Elegant and Fast Way.
+-* PRIO_MAX:                              Priority.
+-* PRIO_MIN:                              Priority.
+-* PRIO_PGRP:                             Priority.
+-* PRIO_PROCESS:                          Priority.
+-* PRIO_USER:                             Priority.
+-* program_invocation_name:               Error Messages.
+-* program_invocation_short_name:         Error Messages.
+-* PROT_EXEC:                             Memory-mapped I/O.
+-* PROT_READ:                             Memory-mapped I/O.
+-* PROT_WRITE:                            Memory-mapped I/O.
+-* protocols:                             NSS Basics.
+-* R_OK:                                  Testing File Access.
+-* RADIXCHAR:                             The Elegant and Fast Way.
+-* RAND_MAX:                              ISO Random.
+-* RE_DUP_MAX:                            General Limits.
+-* RLIM_INFINITY:                         Limits on Resources.
+-* RLIM_NLIMITS:                          Limits on Resources.
+-* RLIMIT_CORE:                           Limits on Resources.
+-* RLIMIT_CPU:                            Limits on Resources.
+-* RLIMIT_DATA:                           Limits on Resources.
+-* RLIMIT_FSIZE:                          Limits on Resources.
+-* RLIMIT_NOFILE:                         Limits on Resources.
+-* RLIMIT_OFILE:                          Limits on Resources.
+-* RLIMIT_RSS:                            Limits on Resources.
+-* RLIMIT_STACK:                          Limits on Resources.
+-* rpc:                                   NSS Basics.
+-* RUN_LVL <1>:                           XPG Functions.
+-* RUN_LVL:                               Manipulating the Database.
+-* S_IEXEC:                               Permission Bits.
+-* S_IFBLK:                               Testing File Type.
+-* S_IFCHR:                               Testing File Type.
+-* S_IFDIR:                               Testing File Type.
+-* S_IFIFO:                               Testing File Type.
+-* S_IFLNK:                               Testing File Type.
+-* S_IFMT:                                Testing File Type.
+-* S_IFREG:                               Testing File Type.
+-* S_IFSOCK:                              Testing File Type.
+-* S_IREAD:                               Permission Bits.
+-* S_IRGRP:                               Permission Bits.
+-* S_IROTH:                               Permission Bits.
+-* S_IRUSR:                               Permission Bits.
+-* S_IRWXG:                               Permission Bits.
+-* S_IRWXO:                               Permission Bits.
+-* S_IRWXU:                               Permission Bits.
+-* S_ISGID:                               Permission Bits.
+-* S_ISUID:                               Permission Bits.
+-* S_ISVTX:                               Permission Bits.
+-* S_IWGRP:                               Permission Bits.
+-* S_IWOTH:                               Permission Bits.
+-* S_IWRITE:                              Permission Bits.
+-* S_IWUSR:                               Permission Bits.
+-* S_IXGRP:                               Permission Bits.
+-* S_IXOTH:                               Permission Bits.
+-* S_IXUSR:                               Permission Bits.
+-* SA_NOCLDSTOP:                          Flags for Sigaction.
+-* SA_ONSTACK:                            Flags for Sigaction.
+-* SA_RESTART:                            Flags for Sigaction.
+-* SCHAR_MAX:                             Range of Type.
+-* SCHAR_MIN:                             Range of Type.
+-* SEEK_CUR:                              File Positioning.
+-* SEEK_END:                              File Positioning.
+-* SEEK_SET:                              File Positioning.
+-* SEM_VALUE_MAX:                         POSIX Semaphores.
+-* services:                              NSS Basics.
+-* shadow:                                NSS Basics.
+-* SHRT_MAX:                              Range of Type.
+-* SHRT_MIN:                              Range of Type.
+-* SIG_BLOCK:                             Process Signal Mask.
+-* SIG_DFL:                               Basic Signal Handling.
+-* SIG_ERR:                               Basic Signal Handling.
+-* SIG_IGN:                               Basic Signal Handling.
+-* SIG_SETMASK:                           Process Signal Mask.
+-* SIG_UNBLOCK:                           Process Signal Mask.
+-* SIGABRT:                               Program Error Signals.
+-* SIGALRM:                               Alarm Signals.
+-* SIGBUS:                                Program Error Signals.
+-* SIGCHLD:                               Job Control Signals.
+-* SIGCLD:                                Job Control Signals.
+-* SIGCONT:                               Job Control Signals.
+-* SIGEMT:                                Program Error Signals.
+-* SIGFPE:                                Program Error Signals.
+-* SIGHUP:                                Termination Signals.
+-* SIGILL:                                Program Error Signals.
+-* SIGINFO:                               Miscellaneous Signals.
+-* SIGINT:                                Termination Signals.
+-* SIGIO:                                 Asynchronous I/O Signals.
+-* SIGIOT:                                Program Error Signals.
+-* SIGKILL:                               Termination Signals.
+-* SIGLOST:                               Operation Error Signals.
+-* signgam:                               Special Functions.
+-* SIGPIPE:                               Operation Error Signals.
+-* SIGPOLL:                               Asynchronous I/O Signals.
+-* SIGPROF:                               Alarm Signals.
+-* SIGQUIT:                               Termination Signals.
+-* SIGSEGV:                               Program Error Signals.
+-* SIGSTKSZ:                              Signal Stack.
+-* SIGSTOP:                               Job Control Signals.
+-* SIGSYS:                                Program Error Signals.
+-* SIGTERM:                               Termination Signals.
+-* SIGTRAP:                               Program Error Signals.
+-* SIGTSTP:                               Job Control Signals.
+-* SIGTTIN:                               Job Control Signals.
+-* SIGTTOU:                               Job Control Signals.
+-* SIGURG:                                Asynchronous I/O Signals.
+-* SIGUSR1:                               Miscellaneous Signals.
+-* SIGUSR2:                               Miscellaneous Signals.
+-* SIGVTALRM:                             Alarm Signals.
+-* SIGWINCH:                              Miscellaneous Signals.
+-* SIGXCPU:                               Operation Error Signals.
+-* SIGXFSZ:                               Operation Error Signals.
+-* SOCK_DGRAM:                            Communication Styles.
+-* SOCK_RAW:                              Communication Styles.
+-* SOCK_STREAM:                           Communication Styles.
+-* SOL_SOCKET:                            Socket-Level Options.
+-* SS_DISABLE:                            Signal Stack.
+-* SS_ONSTACK:                            Signal Stack.
+-* SSIZE_MAX:                             General Limits.
+-* stderr:                                Standard Streams.
+-* STDERR_FILENO:                         Descriptors and Streams.
+-* stdin:                                 Standard Streams.
+-* STDIN_FILENO:                          Descriptors and Streams.
+-* stdout:                                Standard Streams.
+-* STDOUT_FILENO:                         Descriptors and Streams.
+-* STREAM_MAX:                            General Limits.
+-* SV_INTERRUPT:                          BSD Handler.
+-* SV_ONSTACK:                            BSD Handler.
+-* SV_RESETHAND:                          BSD Handler.
+-* sys_siglist:                           Signal Messages.
+-* T_FMT:                                 The Elegant and Fast Way.
+-* T_FMT_AMPM:                            The Elegant and Fast Way.
+-* TCIFLUSH:                              Line Control.
+-* TCIOFF:                                Line Control.
+-* TCIOFLUSH:                             Line Control.
+-* TCION:                                 Line Control.
+-* TCOFLUSH:                              Line Control.
+-* TCOOFF:                                Line Control.
+-* TCOON:                                 Line Control.
+-* TCSADRAIN:                             Mode Functions.
+-* TCSAFLUSH:                             Mode Functions.
+-* TCSANOW:                               Mode Functions.
+-* TCSASOFT:                              Mode Functions.
+-* THOUSANDS_SEP:                         The Elegant and Fast Way.
+-* THOUSEP:                               The Elegant and Fast Way.
+-* timezone:                              Time Zone Functions.
+-* TMP_MAX:                               Temporary Files.
+-* TOSTOP:                                Local Modes.
+-* TRY_AGAIN:                             Host Names.
+-* tzname:                                Time Zone Functions.
+-* TZNAME_MAX:                            General Limits.
+-* UCHAR_MAX:                             Range of Type.
+-* UINT_MAX:                              Range of Type.
+-* ULONG_LONG_MAX:                        Range of Type.
+-* ULONG_MAX:                             Range of Type.
+-* USER_PROCESS <1>:                      XPG Functions.
+-* USER_PROCESS:                          Manipulating the Database.
+-* USHRT_MAX:                             Range of Type.
+-* VDISCARD:                              Other Special.
+-* VDSUSP:                                Signal Characters.
+-* VEOF:                                  Editing Characters.
+-* VEOL:                                  Editing Characters.
+-* VEOL2:                                 Editing Characters.
+-* VERASE:                                Editing Characters.
+-* VINTR:                                 Signal Characters.
+-* VKILL:                                 Editing Characters.
+-* VLNEXT:                                Other Special.
+-* VMIN:                                  Noncanonical Input.
+-* VQUIT:                                 Signal Characters.
+-* VREPRINT:                              Editing Characters.
+-* VSTART:                                Start/Stop Characters.
+-* VSTATUS:                               Other Special.
+-* VSTOP:                                 Start/Stop Characters.
+-* VSUSP:                                 Signal Characters.
+-* VTIME:                                 Noncanonical Input.
+-* VWERASE:                               Editing Characters.
+-* W_OK:                                  Testing File Access.
+-* WCHAR_MAX <1>:                         Range of Type.
+-* WCHAR_MAX:                             Extended Char Intro.
+-* WCHAR_MIN:                             Extended Char Intro.
+-* WEOF:                                  Extended Char Intro.
+-* X_OK:                                  Testing File Access.
+-* YESEXPR:                               The Elegant and Fast Way.
+-* YESSTR:                                The Elegant and Fast Way.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-52 glibc-2.1.3/manual/libc.info-52
+--- ../glibc-2.1.3/manual/libc.info-52	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-52	1969-12-31 16:00:00.000000000 -0800
+@@ -1,287 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: File Index,  Prev: Variable Index,  Up: Top
+-
+-Program and File Index
+-**********************
+-
+-* Menu:
+-
+-* -lbsd-compat <1>:                      Process Group Functions.
+-* -lbsd-compat:                          Feature Test Macros.
+-* /etc/group:                            Group Database.
+-* /etc/hosts:                            Host Names.
+-* /etc/localtime:                        TZ Variable.
+-* /etc/networks:                         Networks Database.
+-* /etc/passwd:                           User Database.
+-* /etc/protocols:                        Protocols Database.
+-* /etc/services:                         Services Database.
+-* /share/lib/zoneinfo:                   TZ Variable.
+-* argp.h:                                Argp.
+-* argz.h:                                Argz Functions.
+-* arpa/inet.h:                           Host Address Functions.
+-* assert.h:                              Consistency Checking.
+-* bsd-compat <1>:                        Process Group Functions.
+-* bsd-compat:                            Feature Test Macros.
+-* cd:                                    Working Directory.
+-* chgrp:                                 File Owner.
+-* chown:                                 File Owner.
+-* complex.h <1>:                         Operations on Complex.
+-* complex.h <2>:                         Complex Numbers.
+-* complex.h:                             Mathematics.
+-* ctype.h <1>:                           Case Conversion.
+-* ctype.h <2>:                           Classification of Characters.
+-* ctype.h:                               Character Handling.
+-* dirent.h <1>:                          Random Access Directory.
+-* dirent.h <2>:                          Reading/Closing Directory.
+-* dirent.h <3>:                          Opening a Directory.
+-* dirent.h <4>:                          Directory Entries.
+-* dirent.h:                              Reserved Names.
+-* envz.h:                                Envz Functions.
+-* errno.h <1>:                           Error Codes.
+-* errno.h <2>:                           Checking for Errors.
+-* errno.h:                               Error Reporting.
+-* fcntl.h <1>:                           Interrupt Input.
+-* fcntl.h <2>:                           File Locks.
+-* fcntl.h <3>:                           File Status Flags.
+-* fcntl.h <4>:                           Descriptor Flags.
+-* fcntl.h <5>:                           Duplicating Descriptors.
+-* fcntl.h <6>:                           Control Operations.
+-* fcntl.h <7>:                           Opening and Closing Files.
+-* fcntl.h:                               Reserved Names.
+-* float.h:                               Floating Point Parameters.
+-* fnmatch.h:                             Wildcard Matching.
+-* gcc:                                   ISO C.
+-* gconv.h:                               glibc iconv Implementation.
+-* grp.h <1>:                             Group Data Structure.
+-* grp.h <2>:                             Setting Groups.
+-* grp.h:                                 Reserved Names.
+-* hostid:                                Host Identification.
+-* hostname:                              Host Identification.
+-* iconv.h:                               Generic Conversion Interface.
+-* kill:                                  Termination Signals.
+-* limits.h <1>:                          Width of Type.
+-* limits.h <2>:                          Limits for Files.
+-* limits.h <3>:                          General Limits.
+-* limits.h <4>:                          Selecting the Conversion.
+-* limits.h:                              Reserved Names.
+-* locale.h <1>:                          The Lame Way to Locale Data.
+-* locale.h:                              Setting the Locale.
+-* localtime:                             TZ Variable.
+-* ls:                                    File Attributes.
+-* malloc.h <1>:                          Statistics of Malloc.
+-* malloc.h <2>:                          Hooks for Malloc.
+-* malloc.h:                              Malloc Tunable Parameters.
+-* math.h <1>:                            Rounding Functions.
+-* math.h <2>:                            Normalization Functions.
+-* math.h <3>:                            Absolute Value.
+-* math.h <4>:                            Floating Point Classes.
+-* math.h:                                Mathematics.
+-* mcheck.h:                              Heap Consistency Checking.
+-* mkdir:                                 Creating Directories.
+-* netdb.h <1>:                           Networks Database.
+-* netdb.h <2>:                           Protocols Database.
+-* netdb.h <3>:                           Services Database.
+-* netdb.h:                               Host Names.
+-* netinet/in.h <1>:                      Byte Order.
+-* netinet/in.h <2>:                      Ports.
+-* netinet/in.h <3>:                      Host Address Data Type.
+-* netinet/in.h:                          Internet Address Formats.
+-* obstack.h:                             Creating Obstacks.
+-* printf.h <1>:                          Conversion Specifier Options.
+-* printf.h:                              Registering New Conversions.
+-* pwd.h <1>:                             User Data Structure.
+-* pwd.h:                                 Reserved Names.
+-* setjmp.h <1>:                          Non-Local Exits and Signals.
+-* setjmp.h:                              Non-Local Details.
+-* sh:                                    Running a Command.
+-* signal.h <1>:                          BSD Signal Handling.
+-* signal.h <2>:                          Checking for Pending Signals.
+-* signal.h <3>:                          Process Signal Mask.
+-* signal.h <4>:                          Signal Sets.
+-* signal.h <5>:                          Signaling Another Process.
+-* signal.h <6>:                          Signaling Yourself.
+-* signal.h <7>:                          Flags for Sigaction.
+-* signal.h <8>:                          Advanced Signal Handling.
+-* signal.h <9>:                          Basic Signal Handling.
+-* signal.h <10>:                         Standard Signals.
+-* signal.h:                              Reserved Names.
+-* stdarg.h <1>:                          Argument Macros.
+-* stdarg.h:                              Receiving Arguments.
+-* stddef.h:                              Important Data Types.
+-* stdio.h <1>:                           Who Logged In.
+-* stdio.h <2>:                           Identifying the Terminal.
+-* stdio.h <3>:                           Signal Messages.
+-* stdio.h <4>:                           Temporary Files.
+-* stdio.h <5>:                           Deleting Files.
+-* stdio.h <6>:                           Descriptors and Streams.
+-* stdio.h <7>:                           Streams and Cookies.
+-* stdio.h <8>:                           String Streams.
+-* stdio.h <9>:                           Controlling Buffering.
+-* stdio.h <10>:                          Flushing Buffers.
+-* stdio.h <11>:                          Portable Positioning.
+-* stdio.h <12>:                          File Positioning.
+-* stdio.h <13>:                          EOF and Errors.
+-* stdio.h <14>:                          Formatted Input Functions.
+-* stdio.h <15>:                          Variable Arguments Output.
+-* stdio.h <16>:                          Formatted Output Functions.
+-* stdio.h <17>:                          Block Input/Output.
+-* stdio.h <18>:                          Character Input.
+-* stdio.h <19>:                          Simple Output.
+-* stdio.h <20>:                          Opening Streams.
+-* stdio.h <21>:                          Standard Streams.
+-* stdio.h:                               Streams.
+-* stdlib.h <1>:                          Running a Command.
+-* stdlib.h <2>:                          Aborting a Program.
+-* stdlib.h <3>:                          Exit Status.
+-* stdlib.h <4>:                          Environment Access.
+-* stdlib.h <5>:                          Parsing of Floats.
+-* stdlib.h <6>:                          Parsing of Integers.
+-* stdlib.h <7>:                          Integer Division.
+-* stdlib.h <8>:                          Absolute Value.
+-* stdlib.h <9>:                          BSD Random.
+-* stdlib.h <10>:                         ISO Random.
+-* stdlib.h <11>:                         Allocation.
+-* stdlib.h <12>:                         Array Sort Function.
+-* stdlib.h <13>:                         Array Search Function.
+-* stdlib.h <14>:                         Non-reentrant Character Conversion.
+-* stdlib.h <15>:                         Selecting the Conversion.
+-* stdlib.h <16>:                         Variable Size Automatic.
+-* stdlib.h <17>:                         Aligned Memory Blocks.
+-* stdlib.h <18>:                         Allocating Cleared Space.
+-* stdlib.h <19>:                         Changing Block Size.
+-* stdlib.h <20>:                         Freeing after Malloc.
+-* stdlib.h:                              Basic Allocation.
+-* string.h <1>:                          Signal Messages.
+-* string.h <2>:                          Finding Tokens in a String.
+-* string.h <3>:                          Search Functions.
+-* string.h <4>:                          Collation Functions.
+-* string.h <5>:                          String/Array Comparison.
+-* string.h <6>:                          Copying and Concatenation.
+-* string.h:                              String Length.
+-* sys/param.h:                           Host Identification.
+-* sys/resource.h <1>:                    Priority.
+-* sys/resource.h <2>:                    Limits on Resources.
+-* sys/resource.h:                        Resource Usage.
+-* sys/socket.h <1>:                      Socket-Level Options.
+-* sys/socket.h <2>:                      Socket Option Functions.
+-* sys/socket.h <3>:                      Sending Datagrams.
+-* sys/socket.h <4>:                      Socket Data Options.
+-* sys/socket.h <5>:                      Receiving Data.
+-* sys/socket.h <6>:                      Sending Data.
+-* sys/socket.h <7>:                      Socket Pairs.
+-* sys/socket.h <8>:                      Closing a Socket.
+-* sys/socket.h <9>:                      Creating a Socket.
+-* sys/socket.h <10>:                     Internet Namespace.
+-* sys/socket.h <11>:                     Local Namespace Details.
+-* sys/socket.h <12>:                     Reading Address.
+-* sys/socket.h <13>:                     Setting Address.
+-* sys/socket.h <14>:                     Address Formats.
+-* sys/socket.h:                          Communication Styles.
+-* sys/stat.h <1>:                        FIFO Special Files.
+-* sys/stat.h <2>:                        Making Special Files.
+-* sys/stat.h <3>:                        Setting Permissions.
+-* sys/stat.h <4>:                        Permission Bits.
+-* sys/stat.h <5>:                        Testing File Type.
+-* sys/stat.h <6>:                        Attribute Meanings.
+-* sys/stat.h <7>:                        Creating Directories.
+-* sys/stat.h:                            Reserved Names.
+-* sys/time.h <1>:                        Setting an Alarm.
+-* sys/time.h <2>:                        High-Resolution Calendar.
+-* sys/time.h:                            File Times.
+-* sys/times.h <1>:                       Detailed CPU Time.
+-* sys/times.h:                           Reserved Names.
+-* sys/timex.h:                           Precision Time.
+-* sys/types.h <1>:                       Setting Groups.
+-* sys/types.h <2>:                       Setting User ID.
+-* sys/types.h <3>:                       Reading Persona.
+-* sys/types.h <4>:                       Terminal Access Functions.
+-* sys/types.h <5>:                       Process Group Functions.
+-* sys/types.h <6>:                       Process Identification.
+-* sys/types.h:                           Waiting for I/O.
+-* sys/un.h:                              Local Namespace Details.
+-* sys/utsname.h:                         Hardware/Software Type ID.
+-* sys/wait.h <1>:                        BSD Wait Functions.
+-* sys/wait.h <2>:                        Process Completion Status.
+-* sys/wait.h:                            Process Completion.
+-* termios.h <1>:                         Terminal Modes.
+-* termios.h:                             Reserved Names.
+-* time.h <1>:                            TZ Variable.
+-* time.h <2>:                            Formatting Date and Time.
+-* time.h <3>:                            Simple Calendar Time.
+-* time.h <4>:                            Basic CPU Time.
+-* time.h:                                File Times.
+-* umask:                                 Setting Permissions.
+-* unistd.h <1>:                          Options for Files.
+-* unistd.h <2>:                          System Options.
+-* unistd.h <3>:                          Host Identification.
+-* unistd.h <4>:                          Who Logged In.
+-* unistd.h <5>:                          Setting Groups.
+-* unistd.h <6>:                          Setting User ID.
+-* unistd.h <7>:                          Reading Persona.
+-* unistd.h <8>:                          Terminal Access Functions.
+-* unistd.h <9>:                          Process Group Functions.
+-* unistd.h <10>:                         Executing a File.
+-* unistd.h <11>:                         Creating a Process.
+-* unistd.h <12>:                         Process Identification.
+-* unistd.h <13>:                         Termination Internals.
+-* unistd.h <14>:                         Using Getopt.
+-* unistd.h <15>:                         Setting an Alarm.
+-* unistd.h <16>:                         Is It a Terminal.
+-* unistd.h <17>:                         Creating a Pipe.
+-* unistd.h <18>:                         Testing File Access.
+-* unistd.h <19>:                         File Owner.
+-* unistd.h <20>:                         Deleting Files.
+-* unistd.h <21>:                         Symbolic Links.
+-* unistd.h <22>:                         Hard Links.
+-* unistd.h <23>:                         Working Directory.
+-* unistd.h <24>:                         Duplicating Descriptors.
+-* unistd.h <25>:                         Descriptors and Streams.
+-* unistd.h <26>:                         I/O Primitives.
+-* unistd.h:                              Opening and Closing Files.
+-* utime.h:                               File Times.
+-* utmp.h <1>:                            Logging In and Out.
+-* utmp.h:                                Manipulating the Database.
+-* utmpx.h:                               XPG Functions.
+-* varargs.h:                             Old Varargs.
+-* wchar.h <1>:                           Converting Strings.
+-* wchar.h <2>:                           Converting a Character.
+-* wchar.h <3>:                           Keeping the state.
+-* wchar.h:                               Extended Char Intro.
+-* wctype.h <1>:                          Wide Character Case Conversion.
+-* wctype.h:                              Classification of Wide Characters.
+-* zoneinfo:                              TZ Variable.
+-
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-6 glibc-2.1.3/manual/libc.info-6
+--- ../glibc-2.1.3/manual/libc.info-6	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-6	1969-12-31 16:00:00.000000000 -0800
+@@ -1,998 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: String/Array Comparison,  Next: Collation Functions,  Prev: Copying and Concatenation,  Up: String and Array Utilities
+-
+-String/Array Comparison
+-=======================
+-
+-   You can use the functions in this section to perform comparisons on
+-the contents of strings and arrays.  As well as checking for equality,
+-these functions can also be used as the ordering functions for sorting
+-operations.  *Note Searching and Sorting::, for an example of this.
+-
+-   Unlike most comparison operations in C, the string comparison
+-functions return a nonzero value if the strings are *not* equivalent
+-rather than if they are.  The sign of the value indicates the relative
+-ordering of the first characters in the strings that are not
+-equivalent:  a negative value indicates that the first string is "less"
+-than the second, while a positive value indicates that the first string
+-is "greater".
+-
+-   The most common use of these functions is to check only for equality.
+-This is canonically done with an expression like `! strcmp (s1, s2)'.
+-
+-   All of these functions are declared in the header file `string.h'.
+-
+- - Function: int memcmp (const void *A1, const void *A2, size_t SIZE)
+-     The function `memcmp' compares the SIZE bytes of memory beginning
+-     at A1 against the SIZE bytes of memory beginning at A2.  The value
+-     returned has the same sign as the difference between the first
+-     differing pair of bytes (interpreted as `unsigned char' objects,
+-     then promoted to `int').
+-
+-     If the contents of the two blocks are equal, `memcmp' returns `0'.
+-
+-   On arbitrary arrays, the `memcmp' function is mostly useful for
+-testing equality.  It usually isn't meaningful to do byte-wise ordering
+-comparisons on arrays of things other than bytes.  For example, a
+-byte-wise comparison on the bytes that make up floating-point numbers
+-isn't likely to tell you anything about the relationship between the
+-values of the floating-point numbers.
+-
+-   You should also be careful about using `memcmp' to compare objects
+-that can contain "holes", such as the padding inserted into structure
+-objects to enforce alignment requirements, extra space at the end of
+-unions, and extra characters at the ends of strings whose length is less
+-than their allocated size.  The contents of these "holes" are
+-indeterminate and may cause strange behavior when performing byte-wise
+-comparisons.  For more predictable results, perform an explicit
+-component-wise comparison.
+-
+-   For example, given a structure type definition like:
+-
+-     struct foo
+-       {
+-         unsigned char tag;
+-         union
+-           {
+-             double f;
+-             long i;
+-             char *p;
+-           } value;
+-       };
+-
+-you are better off writing a specialized comparison function to compare
+-`struct foo' objects instead of comparing them with `memcmp'.
+-
+- - Function: int strcmp (const char *S1, const char *S2)
+-     The `strcmp' function compares the string S1 against S2, returning
+-     a value that has the same sign as the difference between the first
+-     differing pair of characters (interpreted as `unsigned char'
+-     objects, then promoted to `int').
+-
+-     If the two strings are equal, `strcmp' returns `0'.
+-
+-     A consequence of the ordering used by `strcmp' is that if S1 is an
+-     initial substring of S2, then S1 is considered to be "less than"
+-     S2.
+-
+- - Function: int strcasecmp (const char *S1, const char *S2)
+-     This function is like `strcmp', except that differences in case are
+-     ignored.  How uppercase and lowercase characters are related is
+-     determined by the currently selected locale.  In the standard `"C"'
+-     locale the characters "A and "a do not match but in a locale which
+-     regards these characters as parts of the alphabet they do match.
+-
+-     `strcasecmp' is derived from BSD.
+-
+- - Function: int strncasecmp (const char *S1, const char *S2, size_t N)
+-     This function is like `strncmp', except that differences in case
+-     are ignored.  Like `strcasecmp', it is locale dependent how
+-     uppercase and lowercase characters are related.
+-
+-     `strncasecmp' is a GNU extension.
+-
+- - Function: int strncmp (const char *S1, const char *S2, size_t SIZE)
+-     This function is the similar to `strcmp', except that no more than
+-     SIZE characters are compared.  In other words, if the two strings
+-     are the same in their first SIZE characters, the return value is
+-     zero.
+-
+-   Here are some examples showing the use of `strcmp' and `strncmp'.
+-These examples assume the use of the ASCII character set.  (If some
+-other character set--say, EBCDIC--is used instead, then the glyphs are
+-associated with different numeric codes, and the return values and
+-ordering may differ.)
+-
+-     strcmp ("hello", "hello")
+-         => 0    /* These two strings are the same. */
+-     strcmp ("hello", "Hello")
+-         => 32   /* Comparisons are case-sensitive. */
+-     strcmp ("hello", "world")
+-         => -15  /* The character `'h'' comes before `'w''. */
+-     strcmp ("hello", "hello, world")
+-         => -44  /* Comparing a null character against a comma. */
+-     strncmp ("hello", "hello, world", 5)
+-         => 0    /* The initial 5 characters are the same. */
+-     strncmp ("hello, world", "hello, stupid world!!!", 5)
+-         => 0    /* The initial 5 characters are the same. */
+-
+- - Function: int strverscmp (const char *S1, const char *S2)
+-     The `strverscmp' function compares the string S1 against S2,
+-     considering them as holding indices/version numbers.  Return value
+-     follows the same conventions as found in the `strverscmp'
+-     function.  In fact, if S1 and S2 contain no digits, `strverscmp'
+-     behaves like `strcmp'.
+-
+-     Basically, we compare strings normally (character by character),
+-     until we find a digit in each string - then we enter a special
+-     comparison mode, where each sequence of digits is taken as a
+-     whole.  If we reach the end of these two parts without noticing a
+-     difference, we return to the standard comparison mode.  There are
+-     two types of numeric parts: "integral" and "fractional" (those
+-     begin with a '0'). The types of the numeric parts affect the way
+-     we sort them:
+-
+-        * integral/integral: we compare values as you would expect.
+-
+-        * fractional/integral: the fractional part is less than the
+-          integral one.  Again, no surprise.
+-
+-        * fractional/fractional: the things become a bit more complex.
+-          If the common prefix contains only leading zeroes, the
+-          longest part is less than the other one; else the comparison
+-          behaves normally.
+-
+-          strverscmp ("no digit", "no digit")
+-              => 0    /* same behaviour as strcmp. */
+-          strverscmp ("item#99", "item#100")
+-              => <0   /* same prefix, but 99 < 100. */
+-          strverscmp ("alpha1", "alpha001")
+-              => >0   /* fractional part inferior to integral one. */
+-          strverscmp ("part1_f012", "part1_f01")
+-              => >0   /* two fractional parts. */
+-          strverscmp ("foo.009", "foo.0")
+-              => <0   /* idem, but with leading zeroes only. */
+-
+-     This function is especially useful when dealing with filename
+-     sorting, because filenames frequently hold indices/version numbers.
+-
+-     `strverscmp' is a GNU extension.
+-
+- - Function: int bcmp (const void *A1, const void *A2, size_t SIZE)
+-     This is an obsolete alias for `memcmp', derived from BSD.
+-
+-
+-File: libc.info,  Node: Collation Functions,  Next: Search Functions,  Prev: String/Array Comparison,  Up: String and Array Utilities
+-
+-Collation Functions
+-===================
+-
+-   In some locales, the conventions for lexicographic ordering differ
+-from the strict numeric ordering of character codes.  For example, in
+-Spanish most glyphs with diacritical marks such as accents are not
+-considered distinct letters for the purposes of collation.  On the
+-other hand, the two-character sequence `ll' is treated as a single
+-letter that is collated immediately after `l'.
+-
+-   You can use the functions `strcoll' and `strxfrm' (declared in the
+-header file `string.h') to compare strings using a collation ordering
+-appropriate for the current locale.  The locale used by these functions
+-in particular can be specified by setting the locale for the
+-`LC_COLLATE' category; see *Note Locales::.
+-
+-   In the standard C locale, the collation sequence for `strcoll' is
+-the same as that for `strcmp'.
+-
+-   Effectively, the way these functions work is by applying a mapping to
+-transform the characters in a string to a byte sequence that represents
+-the string's position in the collating sequence of the current locale.
+-Comparing two such byte sequences in a simple fashion is equivalent to
+-comparing the strings with the locale's collating sequence.
+-
+-   The function `strcoll' performs this translation implicitly, in
+-order to do one comparison.  By contrast, `strxfrm' performs the
+-mapping explicitly.  If you are making multiple comparisons using the
+-same string or set of strings, it is likely to be more efficient to use
+-`strxfrm' to transform all the strings just once, and subsequently
+-compare the transformed strings with `strcmp'.
+-
+- - Function: int strcoll (const char *S1, const char *S2)
+-     The `strcoll' function is similar to `strcmp' but uses the
+-     collating sequence of the current locale for collation (the
+-     `LC_COLLATE' locale).
+-
+-   Here is an example of sorting an array of strings, using `strcoll'
+-to compare them.  The actual sort algorithm is not written here; it
+-comes from `qsort' (*note Array Sort Function::.).  The job of the code
+-shown here is to say how to compare the strings while sorting them.
+-(Later on in this section, we will show a way to do this more
+-efficiently using `strxfrm'.)
+-
+-     /* This is the comparison function used with `qsort'. */
+-     
+-     int
+-     compare_elements (char **p1, char **p2)
+-     {
+-       return strcoll (*p1, *p2);
+-     }
+-     
+-     /* This is the entry point--the function to sort
+-        strings using the locale's collating sequence. */
+-     
+-     void
+-     sort_strings (char **array, int nstrings)
+-     {
+-       /* Sort `temp_array' by comparing the strings. */
+-       qsort (array, nstrings,
+-              sizeof (char *), compare_elements);
+-     }
+-
+- - Function: size_t strxfrm (char *TO, const char *FROM, size_t SIZE)
+-     The function `strxfrm' transforms STRING using the collation
+-     transformation determined by the locale currently selected for
+-     collation, and stores the transformed string in the array TO.  Up
+-     to SIZE characters (including a terminating null character) are
+-     stored.
+-
+-     The behavior is undefined if the strings TO and FROM overlap; see
+-     *Note Copying and Concatenation::.
+-
+-     The return value is the length of the entire transformed string.
+-     This value is not affected by the value of SIZE, but if it is
+-     greater or equal than SIZE, it means that the transformed string
+-     did not entirely fit in the array TO.  In this case, only as much
+-     of the string as actually fits was stored.  To get the whole
+-     transformed string, call `strxfrm' again with a bigger output
+-     array.
+-
+-     The transformed string may be longer than the original string, and
+-     it may also be shorter.
+-
+-     If SIZE is zero, no characters are stored in TO.  In this case,
+-     `strxfrm' simply returns the number of characters that would be
+-     the length of the transformed string.  This is useful for
+-     determining what size string to allocate.  It does not matter what
+-     TO is if SIZE is zero; TO may even be a null pointer.
+-
+-   Here is an example of how you can use `strxfrm' when you plan to do
+-many comparisons.  It does the same thing as the previous example, but
+-much faster, because it has to transform each string only once, no
+-matter how many times it is compared with other strings.  Even the time
+-needed to allocate and free storage is much less than the time we save,
+-when there are many strings.
+-
+-     struct sorter { char *input; char *transformed; };
+-     
+-     /* This is the comparison function used with `qsort'
+-        to sort an array of `struct sorter'. */
+-     
+-     int
+-     compare_elements (struct sorter *p1, struct sorter *p2)
+-     {
+-       return strcmp (p1->transformed, p2->transformed);
+-     }
+-     
+-     /* This is the entry point--the function to sort
+-        strings using the locale's collating sequence. */
+-     
+-     void
+-     sort_strings_fast (char **array, int nstrings)
+-     {
+-       struct sorter temp_array[nstrings];
+-       int i;
+-     
+-       /* Set up `temp_array'.  Each element contains
+-          one input string and its transformed string. */
+-       for (i = 0; i < nstrings; i++)
+-         {
+-           size_t length = strlen (array[i]) * 2;
+-           char *transformed;
+-           size_t transformed_length;
+-     
+-           temp_array[i].input = array[i];
+-     
+-           /* First try a buffer perhaps big enough.  */
+-           transformed = (char *) xmalloc (length);
+-     
+-           /* Transform `array[i]'.  */
+-           transformed_length = strxfrm (transformed, array[i], length);
+-     
+-           /* If the buffer was not large enough, resize it
+-              and try again.  */
+-           if (transformed_length >= length)
+-             {
+-               /* Allocate the needed space. +1 for terminating
+-                  `NUL' character.  */
+-               transformed = (char *) xrealloc (transformed,
+-                                                transformed_length + 1);
+-     
+-               /* The return value is not interesting because we know
+-                  how long the transformed string is.  */
+-               (void) strxfrm (transformed, array[i],
+-                               transformed_length + 1);
+-             }
+-     
+-           temp_array[i].transformed = transformed;
+-         }
+-     
+-       /* Sort `temp_array' by comparing transformed strings. */
+-       qsort (temp_array, sizeof (struct sorter),
+-              nstrings, compare_elements);
+-     
+-       /* Put the elements back in the permanent array
+-          in their sorted order. */
+-       for (i = 0; i < nstrings; i++)
+-         array[i] = temp_array[i].input;
+-     
+-       /* Free the strings we allocated. */
+-       for (i = 0; i < nstrings; i++)
+-         free (temp_array[i].transformed);
+-     }
+-
+-   *Compatibility Note:*  The string collation functions are a new
+-feature of ISO C 89.  Older C dialects have no equivalent feature.
+-
+-
+-File: libc.info,  Node: Search Functions,  Next: Finding Tokens in a String,  Prev: Collation Functions,  Up: String and Array Utilities
+-
+-Search Functions
+-================
+-
+-   This section describes library functions which perform various kinds
+-of searching operations on strings and arrays.  These functions are
+-declared in the header file `string.h'.
+-
+- - Function: void * memchr (const void *BLOCK, int C, size_t SIZE)
+-     This function finds the first occurrence of the byte C (converted
+-     to an `unsigned char') in the initial SIZE bytes of the object
+-     beginning at BLOCK.  The return value is a pointer to the located
+-     byte, or a null pointer if no match was found.
+-
+- - Function: char * strchr (const char *STRING, int C)
+-     The `strchr' function finds the first occurrence of the character
+-     C (converted to a `char') in the null-terminated string beginning
+-     at STRING.  The return value is a pointer to the located
+-     character, or a null pointer if no match was found.
+-
+-     For example,
+-          strchr ("hello, world", 'l')
+-              => "llo, world"
+-          strchr ("hello, world", '?')
+-              => NULL
+-
+-     The terminating null character is considered to be part of the
+-     string, so you can use this function get a pointer to the end of a
+-     string by specifying a null character as the value of the C
+-     argument.
+-
+- - Function: char * index (const char *STRING, int C)
+-     `index' is another name for `strchr'; they are exactly the same.
+-     New code should always use `strchr' since this name is defined in
+-     ISO C while `index' is a BSD invention which never was available
+-     on System V derived systems.
+-
+-   One useful, but unusual, use of the `strchr' or `index' function is
+-when one wants to have a pointer pointing to the NUL byte terminating a
+-string.  This is often written in this way:
+-
+-       s += strlen (s);
+-
+-This is almost optimal but the addition operation duplicated a bit of
+-the work already done in the `strlen' function.  A better solution is
+-this:
+-
+-       s = strchr (s, '\0');
+-
+-   There is no restriction on the second parameter of `strchr' so it
+-could very well also be the NUL character.  Those readers thinking very
+-hard about this might now point out that the `strchr' function is more
+-expensive than the `strlen' function since we have two abort criteria.
+-This is right.  But when using the GNU C library is used this `strchr'
+-call gets optimized in a special way so that this version actually is
+-faster.
+-
+- - Function: char * strrchr (const char *STRING, int C)
+-     The function `strrchr' is like `strchr', except that it searches
+-     backwards from the end of the string STRING (instead of forwards
+-     from the front).
+-
+-     For example,
+-          strrchr ("hello, world", 'l')
+-              => "ld"
+-
+- - Function: char * rindex (const char *STRING, int C)
+-     `rindex' is another name for `strrchr'; they are exactly the same.
+-     New code should always use `strrchr' since this name is defined in
+-     ISO C while `rindex' is a BSD invention which never was available
+-     on System V derived systems.
+-
+- - Function: char * strstr (const char *HAYSTACK, const char *NEEDLE)
+-     This is like `strchr', except that it searches HAYSTACK for a
+-     substring NEEDLE rather than just a single character.  It returns
+-     a pointer into the string HAYSTACK that is the first character of
+-     the substring, or a null pointer if no match was found.  If NEEDLE
+-     is an empty string, the function returns HAYSTACK.
+-
+-     For example,
+-          strstr ("hello, world", "l")
+-              => "llo, world"
+-          strstr ("hello, world", "wo")
+-              => "world"
+-
+- - Function: void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN,
+-          const void *NEEDLE, size_t NEEDLE-LEN)
+-     This is like `strstr', but NEEDLE and HAYSTACK are byte arrays
+-     rather than null-terminated strings.  NEEDLE-LEN is the length of
+-     NEEDLE and HAYSTACK-LEN is the length of HAYSTACK.
+-
+-     This function is a GNU extension.
+-
+- - Function: size_t strspn (const char *STRING, const char *SKIPSET)
+-     The `strspn' ("string span") function returns the length of the
+-     initial substring of STRING that consists entirely of characters
+-     that are members of the set specified by the string SKIPSET.  The
+-     order of the characters in SKIPSET is not important.
+-
+-     For example,
+-          strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
+-              => 5
+-
+- - Function: size_t strcspn (const char *STRING, const char *STOPSET)
+-     The `strcspn' ("string complement span") function returns the
+-     length of the initial substring of STRING that consists entirely
+-     of characters that are *not* members of the set specified by the
+-     string STOPSET.  (In other words, it returns the offset of the
+-     first character in STRING that is a member of the set STOPSET.)
+-
+-     For example,
+-          strcspn ("hello, world", " \t\n,.;!?")
+-              => 5
+-
+- - Function: char * strpbrk (const char *STRING, const char *STOPSET)
+-     The `strpbrk' ("string pointer break") function is related to
+-     `strcspn', except that it returns a pointer to the first character
+-     in STRING that is a member of the set STOPSET instead of the
+-     length of the initial substring.  It returns a null pointer if no
+-     such character from STOPSET is found.
+-
+-     For example,
+-
+-          strpbrk ("hello, world", " \t\n,.;!?")
+-              => ", world"
+-
+-
+-File: libc.info,  Node: Finding Tokens in a String,  Next: Encode Binary Data,  Prev: Search Functions,  Up: String and Array Utilities
+-
+-Finding Tokens in a String
+-==========================
+-
+-   It's fairly common for programs to have a need to do some simple
+-kinds of lexical analysis and parsing, such as splitting a command
+-string up into tokens.  You can do this with the `strtok' function,
+-declared in the header file `string.h'.
+-
+- - Function: char * strtok (char *NEWSTRING, const char *DELIMITERS)
+-     A string can be split into tokens by making a series of calls to
+-     the function `strtok'.
+-
+-     The string to be split up is passed as the NEWSTRING argument on
+-     the first call only.  The `strtok' function uses this to set up
+-     some internal state information.  Subsequent calls to get
+-     additional tokens from the same string are indicated by passing a
+-     null pointer as the NEWSTRING argument.  Calling `strtok' with
+-     another non-null NEWSTRING argument reinitializes the state
+-     information.  It is guaranteed that no other library function ever
+-     calls `strtok' behind your back (which would mess up this internal
+-     state information).
+-
+-     The DELIMITERS argument is a string that specifies a set of
+-     delimiters that may surround the token being extracted.  All the
+-     initial characters that are members of this set are discarded.
+-     The first character that is *not* a member of this set of
+-     delimiters marks the beginning of the next token.  The end of the
+-     token is found by looking for the next character that is a member
+-     of the delimiter set.  This character in the original string
+-     NEWSTRING is overwritten by a null character, and the pointer to
+-     the beginning of the token in NEWSTRING is returned.
+-
+-     On the next call to `strtok', the searching begins at the next
+-     character beyond the one that marked the end of the previous token.
+-     Note that the set of delimiters DELIMITERS do not have to be the
+-     same on every call in a series of calls to `strtok'.
+-
+-     If the end of the string NEWSTRING is reached, or if the remainder
+-     of string consists only of delimiter characters, `strtok' returns
+-     a null pointer.
+-
+-   *Warning:* Since `strtok' alters the string it is parsing, you
+-should always copy the string to a temporary buffer before parsing it
+-with `strtok'.  If you allow `strtok' to modify a string that came from
+-another part of your program, you are asking for trouble; that string
+-might be used for other purposes after `strtok' has modified it, and it
+-would not have the expected value.
+-
+-   The string that you are operating on might even be a constant.  Then
+-when `strtok' tries to modify it, your program will get a fatal signal
+-for writing in read-only memory.  *Note Program Error Signals::.
+-
+-   This is a special case of a general principle: if a part of a program
+-does not have as its purpose the modification of a certain data
+-structure, then it is error-prone to modify the data structure
+-temporarily.
+-
+-   The function `strtok' is not reentrant.  *Note Nonreentrancy::, for
+-a discussion of where and why reentrancy is important.
+-
+-   Here is a simple example showing the use of `strtok'.
+-
+-     #include <string.h>
+-     #include <stddef.h>
+-     
+-     ...
+-     
+-     const char string[] = "words separated by spaces -- and, punctuation!";
+-     const char delimiters[] = " .,;:!-";
+-     char *token, *cp;
+-     
+-     ...
+-     
+-     cp = strdupa (string);                /* Make writable copy.  */
+-     token = strtok (cp, delimiters);      /* token => "words" */
+-     token = strtok (NULL, delimiters);    /* token => "separated" */
+-     token = strtok (NULL, delimiters);    /* token => "by" */
+-     token = strtok (NULL, delimiters);    /* token => "spaces" */
+-     token = strtok (NULL, delimiters);    /* token => "and" */
+-     token = strtok (NULL, delimiters);    /* token => "punctuation" */
+-     token = strtok (NULL, delimiters);    /* token => NULL */
+-
+-   The GNU C library contains two more functions for tokenizing a string
+-which overcome the limitation of non-reentrancy.
+-
+- - Function: char * strtok_r (char *NEWSTRING, const char *DELIMITERS,
+-          char **SAVE_PTR)
+-     Just like `strtok', this function splits the string into several
+-     tokens which can be accessed by successive calls to `strtok_r'.
+-     The difference is that the information about the next token is
+-     stored in the space pointed to by the third argument, SAVE_PTR,
+-     which is a pointer to a string pointer.  Calling `strtok_r' with a
+-     null pointer for NEWSTRING and leaving SAVE_PTR between the calls
+-     unchanged does the job without hindering reentrancy.
+-
+-     This function is defined in POSIX-1 and can be found on many
+-     systems which support multi-threading.
+-
+- - Function: char * strsep (char **STRING_PTR, const char *DELIMITER)
+-     This function is just `strtok_r' with the NEWSTRING argument
+-     replaced by the SAVE_PTR argument.  The initialization of the
+-     moving pointer has to be done by the user.  Successive calls to
+-     `strsep' move the pointer along the tokens separated by DELIMITER,
+-     returning the address of the next token and updating STRING_PTR to
+-     point to the beginning of the next token.
+-
+-     If the input string contains more than one character from
+-     DELIMITER in a row `strsep' returns an empty string for each pair
+-     of characters from DELIMITER.  This means that a program normally
+-     should test for `strsep' returning an empty string before
+-     processing it.
+-
+-     This function was introduced in 4.3BSD and therefore is widely
+-     available.
+-
+-   Here is how the above example looks like when `strsep' is used.
+-
+-     #include <string.h>
+-     #include <stddef.h>
+-     
+-     ...
+-     
+-     const char string[] = "words separated by spaces -- and, punctuation!";
+-     const char delimiters[] = " .,;:!-";
+-     char *running;
+-     char *token;
+-     
+-     ...
+-     
+-     running = strdupa (string);
+-     token = strsep (&running, delimiters);    /* token => "words" */
+-     token = strsep (&running, delimiters);    /* token => "separated" */
+-     token = strsep (&running, delimiters);    /* token => "by" */
+-     token = strsep (&running, delimiters);    /* token => "spaces" */
+-     token = strsep (&running, delimiters);    /* token => "" */
+-     token = strsep (&running, delimiters);    /* token => "" */
+-     token = strsep (&running, delimiters);    /* token => "" */
+-     token = strsep (&running, delimiters);    /* token => "and" */
+-     token = strsep (&running, delimiters);    /* token => "" */
+-     token = strsep (&running, delimiters);    /* token => "punctuation" */
+-     token = strsep (&running, delimiters);    /* token => "" */
+-     token = strsep (&running, delimiters);    /* token => NULL */
+-
+-
+-File: libc.info,  Node: Encode Binary Data,  Next: Argz and Envz Vectors,  Prev: Finding Tokens in a String,  Up: String and Array Utilities
+-
+-Encode Binary Data
+-==================
+-
+-   To store or transfer binary data in environments which only support
+-text one has to encode the binary data by mapping the input bytes to
+-characters in the range allowed for storing or transfering.  SVID
+-systems (and nowadays XPG compliant systems) provide minimal support for
+-this task.
+-
+- - Function: char * l64a (long int N)
+-     This function encodes a 32-bit input value using characters from
+-     the basic character set.  It returns a pointer to a 6 character
+-     buffer which contains an encoded version of N.  To encode a series
+-     of bytes the user must copy the returned string to a destination
+-     buffer.  It returns the empty string if N is zero, which is
+-     somewhat bizarre but mandated by the standard.
+-     *Warning:* Since a static buffer is used this function should not
+-     be used in multi-threaded programs.  There is no thread-safe
+-     alternative to this function in the C library.
+-     *Compatibility Note:* The XPG standard states that the return
+-     value of `l64a' is undefined if N is negative.  In the GNU
+-     implementation, `l64a' treats its argument as unsigned, so it will
+-     return a sensible encoding for any nonzero N; however, portable
+-     programs should not rely on this.
+-
+-     To encode a large buffer `l64a' must be called in a loop, once for
+-     each 32-bit word of the buffer.  For example, one could do
+-     something like this:
+-
+-          char *
+-          encode (const void *buf, size_t len)
+-          {
+-            /* We know in advance how long the buffer has to be. */
+-            unsigned char *in = (unsigned char *) buf;
+-            char *out = malloc (6 + ((len + 3) / 4) * 6 + 1);
+-            char *cp = out;
+-          
+-            /* Encode the length. */
+-            /* Using `htonl' is necessary so that the data can be
+-               decoded even on machines with different byte order. */
+-          
+-            cp = mempcpy (cp, l64a (htonl (len)), 6);
+-          
+-            while (len > 3)
+-              {
+-                unsigned long int n = *in++;
+-                n = (n << 8) | *in++;
+-                n = (n << 8) | *in++;
+-                n = (n << 8) | *in++;
+-                len -= 4;
+-                if (n)
+-                  cp = mempcpy (cp, l64a (htonl (n)), 6);
+-                else
+-                      /* `l64a' returns the empty string for n==0, so we 
+-                         must generate its encoding ("......") by hand. */
+-                  cp = stpcpy (cp, "......");
+-              }
+-            if (len > 0)
+-              {
+-                unsigned long int n = *in++;
+-                if (--len > 0)
+-                  {
+-                    n = (n << 8) | *in++;
+-                    if (--len > 0)
+-                      n = (n << 8) | *in;
+-                  }
+-                memcpy (cp, l64a (htonl (n)), 6);
+-                cp += 6;
+-              }
+-            *cp = '\0';
+-            return out;
+-          }
+-
+-     It is strange that the library does not provide the complete
+-     functionality needed but so be it.
+-
+-
+-   To decode data produced with `l64a' the following function should be
+-used.
+-
+- - Function: long int a64l (const char *STRING)
+-     The parameter STRING should contain a string which was produced by
+-     a call to `l64a'.  The function processes at least 6 characters of
+-     this string, and decodes the characters it finds according to the
+-     table below.  It stops decoding when it finds a character not in
+-     the table, rather like `atoi'; if you have a buffer which has been
+-     broken into lines, you must be careful to skip over the
+-     end-of-line characters.
+-
+-     The decoded number is returned as a `long int' value.
+-
+-   The `l64a' and `a64l' functions use a base 64 encoding, in which
+-each character of an encoded string represents six bits of an input
+-word.  These symbols are used for the base 64 digits:
+-
+-       0    1    2    3    4    5    6    7    
+-0      `.'  `/'  `0'  `1'  `2'  `3'  `4'  `5'  
+-8      `6'  `7'  `8'  `9'  `A'  `B'  `C'  `D'  
+-16     `E'  `F'  `G'  `H'  `I'  `J'  `K'  `L'  
+-24     `M'  `N'  `O'  `P'  `Q'  `R'  `S'  `T'  
+-32     `U'  `V'  `W'  `X'  `Y'  `Z'  `a'  `b'  
+-40     `c'  `d'  `e'  `f'  `g'  `h'  `i'  `j'  
+-48     `k'  `l'  `m'  `n'  `o'  `p'  `q'  `r'  
+-56     `s'  `t'  `u'  `v'  `w'  `x'  `y'  `z'  
+-
+-   This encoding scheme is not standard.  There are some other encoding
+-methods which are much more widely used (UU encoding, MIME encoding).
+-Generally, it is better to use one of these encodings.
+-
+-
+-File: libc.info,  Node: Argz and Envz Vectors,  Prev: Encode Binary Data,  Up: String and Array Utilities
+-
+-Argz and Envz Vectors
+-=====================
+-
+-   "argz vectors" are vectors of strings in a contiguous block of
+-memory, each element separated from its neighbors by null-characters
+-(`'\0'').
+-
+-   "Envz vectors" are an extension of argz vectors where each element
+-is a name-value pair, separated by a `'='' character (as in a Unix
+-environment).
+-
+-* Menu:
+-
+-* Argz Functions::              Operations on argz vectors.
+-* Envz Functions::              Additional operations on environment vectors.
+-
+-
+-File: libc.info,  Node: Argz Functions,  Next: Envz Functions,  Up: Argz and Envz Vectors
+-
+-Argz Functions
+---------------
+-
+-   Each argz vector is represented by a pointer to the first element, of
+-type `char *', and a size, of type `size_t', both of which can be
+-initialized to `0' to represent an empty argz vector.  All argz
+-functions accept either a pointer and a size argument, or pointers to
+-them, if they will be modified.
+-
+-   The argz functions use `malloc'/`realloc' to allocate/grow argz
+-vectors, and so any argz vector creating using these functions may be
+-freed by using `free'; conversely, any argz function that may grow a
+-string expects that string to have been allocated using `malloc' (those
+-argz functions that only examine their arguments or modify them in
+-place will work on any sort of memory).  *Note Unconstrained
+-Allocation::.
+-
+-   All argz functions that do memory allocation have a return type of
+-`error_t', and return `0' for success, and `ENOMEM' if an allocation
+-error occurs.
+-
+-   These functions are declared in the standard include file `argz.h'.
+-
+- - Function: error_t argz_create (char *const ARGV[], char **ARGZ,
+-          size_t *ARGZ_LEN)
+-     The `argz_create' function converts the Unix-style argument vector
+-     ARGV (a vector of pointers to normal C strings, terminated by
+-     `(char *)0'; *note Program Arguments::.) into an argz vector with
+-     the same elements, which is returned in ARGZ and ARGZ_LEN.
+-
+- - Function: error_t argz_create_sep (const char *STRING, int SEP, char
+-          **ARGZ, size_t *ARGZ_LEN)
+-     The `argz_create_sep' function converts the null-terminated string
+-     STRING into an argz vector (returned in ARGZ and ARGZ_LEN) by
+-     splitting it into elements at every occurance of the character SEP.
+-
+- - Function: size_t argz_count (const char *ARGZ, size_t ARG_LEN)
+-     Returns the number of elements in the argz vector ARGZ and
+-     ARGZ_LEN.
+-
+- - Function: void argz_extract (char *ARGZ, size_t ARGZ_LEN, char
+-          **ARGV)
+-     The `argz_extract' function converts the argz vector ARGZ and
+-     ARGZ_LEN into a Unix-style argument vector stored in ARGV, by
+-     putting pointers to every element in ARGZ into successive
+-     positions in ARGV, followed by a terminator of `0'.  ARGV must be
+-     pre-allocated with enough space to hold all the elements in ARGZ
+-     plus the terminating `(char *)0' (`(argz_count (ARGZ, ARGZ_LEN) +
+-     1) * sizeof (char *)' bytes should be enough).  Note that the
+-     string pointers stored into ARGV point into ARGZ--they are not
+-     copies--and so ARGZ must be copied if it will be changed while
+-     ARGV is still active.  This function is useful for passing the
+-     elements in ARGZ to an exec function (*note Executing a File::.).
+-
+- - Function: void argz_stringify (char *ARGZ, size_t LEN, int SEP)
+-     The `argz_stringify' converts ARGZ into a normal string with the
+-     elements separated by the character SEP, by replacing each `'\0''
+-     inside ARGZ (except the last one, which terminates the string)
+-     with SEP.  This is handy for printing ARGZ in a readable manner.
+-
+- - Function: error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const
+-          char *STR)
+-     The `argz_add' function adds the string STR to the end of the argz
+-     vector `*ARGZ', and updates `*ARGZ' and `*ARGZ_LEN' accordingly.
+-
+- - Function: error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const
+-          char *STR, int DELIM)
+-     The `argz_add_sep' function is similar to `argz_add', but STR is
+-     split into separate elements in the result at occurances of the
+-     character DELIM.  This is useful, for instance, for adding the
+-     components of a Unix search path to an argz vector, by using a
+-     value of `':'' for DELIM.
+-
+- - Function: error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const
+-          char *BUF, size_t BUF_LEN)
+-     The `argz_append' function appends BUF_LEN bytes starting at BUF
+-     to the argz vector `*ARGZ', reallocating `*ARGZ' to accommodate
+-     it, and adding BUF_LEN to `*ARGZ_LEN'.
+-
+- - Function: error_t argz_delete (char **ARGZ, size_t *ARGZ_LEN, char
+-          *ENTRY)
+-     If ENTRY points to the beginning of one of the elements in the
+-     argz vector `*ARGZ', the `argz_delete' function will remove this
+-     entry and reallocate `*ARGZ', modifying `*ARGZ' and `*ARGZ_LEN'
+-     accordingly.  Note that as destructive argz functions usually
+-     reallocate their argz argument, pointers into argz vectors such as
+-     ENTRY will then become invalid.
+-
+- - Function: error_t argz_insert (char **ARGZ, size_t *ARGZ_LEN, char
+-          *BEFORE, const char *ENTRY)
+-     The `argz_insert' function inserts the string ENTRY into the argz
+-     vector `*ARGZ' at a point just before the existing element pointed
+-     to by BEFORE, reallocating `*ARGZ' and updating `*ARGZ' and
+-     `*ARGZ_LEN'.  If BEFORE is `0', ENTRY is added to the end instead
+-     (as if by `argz_add').  Since the first element is in fact the
+-     same as `*ARGZ', passing in `*ARGZ' as the value of BEFORE will
+-     result in ENTRY being inserted at the beginning.
+-
+- - Function: char * argz_next (char *ARGZ, size_t ARGZ_LEN, const char
+-          *ENTRY)
+-     The `argz_next' function provides a convenient way of iterating
+-     over the elements in the argz vector ARGZ.  It returns a pointer
+-     to the next element in ARGZ after the element ENTRY, or `0' if
+-     there are no elements following ENTRY.  If ENTRY is `0', the first
+-     element of ARGZ is returned.
+-
+-     This behavior suggests two styles of iteration:
+-
+-              char *entry = 0;
+-              while ((entry = argz_next (ARGZ, ARGZ_LEN, entry)))
+-                ACTION;
+-
+-     (the double parentheses are necessary to make some C compilers
+-     shut up about what they consider a questionable `while'-test) and:
+-
+-              char *entry;
+-              for (entry = ARGZ;
+-                   entry;
+-                   entry = argz_next (ARGZ, ARGZ_LEN, entry))
+-                ACTION;
+-
+-     Note that the latter depends on ARGZ having a value of `0' if it
+-     is empty (rather than a pointer to an empty block of memory); this
+-     invariant is maintained for argz vectors created by the functions
+-     here.
+-
+- - Function: error_t argz_replace (char **ARGZ, size_t *ARGZ_LEN,
+-          const char *STR, const char *WITH, unsigned *REPLACE_COUNT)
+-     Replace any occurances of the string STR in ARGZ with WITH,
+-     reallocating ARGZ as necessary.  If REPLACE_COUNT is non-zero,
+-     `*REPLACE_COUNT' will be incremented by number of replacements
+-     performed.
+-
+-
+-File: libc.info,  Node: Envz Functions,  Prev: Argz Functions,  Up: Argz and Envz Vectors
+-
+-Envz Functions
+---------------
+-
+-   Envz vectors are just argz vectors with additional constraints on
+-the form of each element; as such, argz functions can also be used on
+-them, where it makes sense.
+-
+-   Each element in an envz vector is a name-value pair, separated by a
+-`'='' character; if multiple `'='' characters are present in an
+-element, those after the first are considered part of the value, and
+-treated like all other non-`'\0'' characters.
+-
+-   If *no* `'='' characters are present in an element, that element is
+-considered the name of a "null" entry, as distinct from an entry with an
+-empty value: `envz_get' will return `0' if given the name of null
+-entry, whereas an entry with an empty value would result in a value of
+-`""'; `envz_entry' will still find such entries, however.  Null entries
+-can be removed with `envz_strip' function.
+-
+-   As with argz functions, envz functions that may allocate memory (and
+-thus fail) have a return type of `error_t', and return either `0' or
+-`ENOMEM'.
+-
+-   These functions are declared in the standard include file `envz.h'.
+-
+- - Function: char * envz_entry (const char *ENVZ, size_t ENVZ_LEN,
+-          const char *NAME)
+-     The `envz_entry' function finds the entry in ENVZ with the name
+-     NAME, and returns a pointer to the whole entry--that is, the argz
+-     element which begins with NAME followed by a `'='' character.  If
+-     there is no entry with that name, `0' is returned.
+-
+- - Function: char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const
+-          char *NAME)
+-     The `envz_get' function finds the entry in ENVZ with the name NAME
+-     (like `envz_entry'), and returns a pointer to the value portion of
+-     that entry (following the `'='').  If there is no entry with that
+-     name (or only a null entry), `0' is returned.
+-
+- - Function: error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const
+-          char *NAME, const char *VALUE)
+-     The `envz_add' function adds an entry to `*ENVZ' (updating `*ENVZ'
+-     and `*ENVZ_LEN') with the name NAME, and value VALUE.  If an entry
+-     with the same name already exists in ENVZ, it is removed first.
+-     If VALUE is `0', then the new entry will the special null type of
+-     entry (mentioned above).
+-
+- - Function: error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const
+-          char *ENVZ2, size_t ENVZ2_LEN, int OVERRIDE)
+-     The `envz_merge' function adds each entry in ENVZ2 to ENVZ, as if
+-     with `envz_add', updating `*ENVZ' and `*ENVZ_LEN'.  If OVERRIDE is
+-     true, then values in ENVZ2 will supersede those with the same name
+-     in ENVZ, otherwise not.
+-
+-     Null entries are treated just like other entries in this respect,
+-     so a null entry in ENVZ can prevent an entry of the same name in
+-     ENVZ2 from being added to ENVZ, if OVERRIDE is false.
+-
+- - Function: void envz_strip (char **ENVZ, size_t *ENVZ_LEN)
+-     The `envz_strip' function removes any null entries from ENVZ,
+-     updating `*ENVZ' and `*ENVZ_LEN'.
+-
+-
+-File: libc.info,  Node: Character Set Handling,  Next: Locales,  Prev: String and Array Utilities,  Up: Top
+-
+-Character Set Handling
+-**********************
+-
+-   Character sets used in the early days of computing had only six,
+-seven, or eight bits for each character: there was never a case where
+-more than eight bits (one byte) were used to represent a single
+-character.  The limitations of this approach became more apparent as
+-more people grappled with non-Roman character sets, where not all the
+-characters that make up a language's character set can be represented
+-by 2^8 choices.  This chapter shows the functionality which was added
+-to the C library to correctly support multiple character sets.
+-
+-* Menu:
+-
+-* Extended Char Intro::              Introduction to Extended Characters.
+-* Charset Function Overview::        Overview about Character Handling
+-                                      Functions.
+-* Restartable multibyte conversion:: Restartable multibyte conversion
+-                                      Functions.
+-* Non-reentrant Conversion::         Non-reentrant Conversion Function.
+-* Generic Charset Conversion::       Generic Charset Conversion.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-7 glibc-2.1.3/manual/libc.info-7
+--- ../glibc-2.1.3/manual/libc.info-7	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-7	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1041 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Extended Char Intro,  Next: Charset Function Overview,  Up: Character Set Handling
+-
+-Introduction to Extended Characters
+-===================================
+-
+-   A variety of solutions to overcome the differences between character
+-sets with a 1:1 relation between bytes and characters and character
+-sets with ratios of 2:1 or 4:1 exist. The remainder of this section
+-gives a few examples to help understand the design decisions made while
+-developing the functionality of the C library.
+-
+-   A distinction we have to make right away is between internal and
+-external representation.  "Internal representation" means the
+-representation used by a program while keeping the text in memory.
+-External representations are used when text is stored or transmitted
+-through whatever communication channel.  Examples of external
+-representations include files lying in a directory that are going to be
+-read and parsed.
+-
+-   Traditionally there was no difference between the two
+-representations.  It was equally comfortable and useful to use the same
+-one-byte representation internally and externally.  This changes with
+-more and larger character sets.
+-
+-   One of the problems to overcome with the internal representation is
+-handling text which is externally encoded using different character
+-sets.  Assume a program which reads two texts and compares them using
+-some metric.  The comparison can be usefully done only if the texts are
+-internally kept in a common format.
+-
+-   For such a common format (= character set) eight bits are certainly
+-no longer enough.  So the smallest entity will have to grow: "wide
+-characters" will now be used.  Instead of one byte, two or four will be
+-used instead.  (Three are not good to address in memory and more than
+-four bytes seem not to be necessary).
+-
+-   As shown in some other part of this manual, there exists a
+-completely new family of functions which can handle texts of this kind
+-in memory.  The most commonly used character set for such internal wide
+-character representations are Unicode and ISO 10646.  The former is a
+-subset of the latter and used when wide characters are chosen to by 2
+-bytes (= 16 bits) wide.  The standard names of the encodings used in
+-these cases are UCS2 (= 16 bits) and UCS4 (= 32 bits).
+-
+-   To represent wide characters the `char' type is not suitable.  For
+-this reason the ISO C standard introduces a new type which is designed
+-to keep one character of a wide character string.  To maintain the
+-similarity there is also a type corresponding to `int' for those
+-functions which take a single wide character.
+-
+- - Data type: wchar_t
+-     This data type is used as the base type for wide character strings.
+-     I.e., arrays of objects of this type are the equivalent of `char[]'
+-     for multibyte character strings.  The type is defined in
+-     `stddef.h'.
+-
+-     The ISO C89 standard, where this type was introduced, does not say
+-     anything specific about the representation.  It only requires that
+-     this type is capable to store all elements of the basic character
+-     set.  Therefore it would be legitimate to define `wchar_t' and
+-     `char'.  This might make sense for embedded systems.
+-
+-     But for GNU systems this type is always 32 bits wide.  It is
+-     therefore capable to represent all UCS4 value therefore covering
+-     all of ISO 10646.  Some Unix systems define `wchar_t' as a 16 bit
+-     type and thereby follow Unicode very strictly.  This is perfectly
+-     fine with the standard but it also means that to represent all
+-     characters from Unicode and ISO 10646 one has to use surrogate
+-     character which is in fact a multi-wide-character encoding.  But
+-     this contradicts the purpose of the `wchar_t' type.
+-
+- - Data type: wint_t
+-     `wint_t' is a data type used for parameters and variables which
+-     contain a single wide character.  As the name already suggests it
+-     is the equivalent to `int' when using the normal `char' strings.
+-     The types `wchar_t' and `wint_t' have often the same
+-     representation if their size if 32 bits wide but if `wchar_t' is
+-     defined as `char' the type `wint_t' must be defined as `int' due
+-     to the parameter promotion.
+-
+-     This type is defined in `wchar.h' and got introduced in the second
+-     amendment to ISO C 89.
+-
+-   As there are for the `char' data type there also exist macros
+-specifying the minimum and maximum value representable in an object of
+-type `wchar_t'.
+-
+- - Macro: wint_t WCHAR_MIN
+-     The macro `WCHAR_MIN' evaluates to the minimum value representable
+-     by an object of type `wint_t'.
+-
+-     This macro got introduced in the second amendment to ISO C89.
+-
+- - Macro: wint_t WCHAR_MAX
+-     The macro `WCHAR_MIN' evaluates to the maximum value representable
+-     by an object of type `wint_t'.
+-
+-     This macro got introduced in the second amendment to ISO C89.
+-
+-   Another special wide character value is the equivalent to `EOF'.
+-
+- - Macro: wint_t WEOF
+-     The macro `WEOF' evaluates to a constant expression of type
+-     `wint_t' whose value is different from any member of the extended
+-     character set.
+-
+-     `WEOF' need not be the same value as `EOF' and unlike `EOF' it
+-     also need *not* be negative.  I.e., sloppy code like
+-
+-          {
+-            int c;
+-            ...
+-            while ((c = getc (fp)) < 0)
+-              ...
+-          }
+-
+-     has to be rewritten to explicitly use `WEOF' when wide characters
+-     are used.
+-
+-          {
+-            wint_t c;
+-            ...
+-            while ((c = wgetc (fp)) != WEOF)
+-              ...
+-          }
+-
+-     This macro was introduced in the second amendment to ISO C89 and is
+-     defined in `wchar.h'.
+-
+-   These internal representations present problems when it comes to
+-storing and transmittal, since a single wide character consists of more
+-than one byte they are effected by byte-ordering.  I.e., machines with
+-different endianesses would see different value accessing the same data.
+-This also applies for communication protocols which are all byte-based
+-and therefore the sender has to decide about splitting the wide
+-character in bytes.  A last (but not least important) point is that wide
+-characters often require more storage space than an customized byte
+-oriented character set.
+-
+-   For all the above reasons, an external encoding which is different
+-from the internal encoding is often used if the latter is UCS2 or UCS4.
+-The external encoding is byte-based and can be chosen appropriately for
+-the environment and for the texts to be handled.  There exist a variety
+-of different character sets which can be used for this external
+-encoding. Information which will not be exhaustively presented
+-here-instead, a description of the major groups will suffice.  All of
+-the ASCII-based character sets [_bkoz_: do you mean Roman character
+-sets? If not, what do you mean here?]  fulfill one requirement: they are
+-"filesystem safe".  This means that the character `'/'' is used in the
+-encoding *only* to represent itself.  Things are a bit different for
+-character sets like EBCDIC (Extended Binary Coded Decimal Interchange
+-Code, a character set family used by IBM) but if the operation system
+-does not understand EBCDIC directly the parameters to system calls have
+-to be converted first anyhow.
+-
+-   * The simplest character sets are one-byte character sets.  There
+-     can be only up to 256 characters (for 8 bit character sets) which
+-     is not sufficient to cover all languages but might be sufficient
+-     to handle a specific text.  Another reason to choose this is
+-     because of constraints from interaction with other programs (which
+-     might not be 8-bit clean).
+-
+-   * The ISO 2022 standard defines a mechanism for extended character
+-     sets where one character *can* be represented by more than one
+-     byte.  This is achieved by associating a state with the text.
+-     Embedded in the text can be characters which can be used to change
+-     the state.  Each byte in the text might have a different
+-     interpretation in each state.  The state might even influence
+-     whether a given byte stands for a character on its own or whether
+-     it has to be combined with some more bytes.
+-
+-     In most uses of ISO 2022 the defined character sets do not allow
+-     state changes which cover more than the next character.  This has
+-     the big advantage that whenever one can identify the beginning of
+-     the byte sequence of a character one can interpret a text
+-     correctly.  Examples of character sets using this policy are the
+-     various EUC character sets (used by Sun's operations systems,
+-     EUC-JP, EUC-KR, EUC-TW, and EUC-CN) or SJIS (Shift JIS, a Japanese
+-     encoding).
+-
+-     But there are also character sets using a state which is valid for
+-     more than one character and has to be changed by another byte
+-     sequence.  Examples for this are ISO-2022-JP, ISO-2022-KR, and
+-     ISO-2022-CN.
+-
+-   * Early attempts to fix 8 bit character sets for other languages
+-     using the Roman alphabet lead to character sets like ISO 6937.
+-     Here bytes representing characters like the acute accent do not
+-     produce output themselves: one has to combine them with other
+-     characters to get the desired result.  E.g., the byte sequence
+-     `0xc2 0x61' (non-spacing acute accent, following by lower-case
+-     `a') to get the "small a with acute" character.  To get the acute
+-     accent character on its on one has to write `0xc2 0x20' (the
+-     non-spacing acute followed by a space).
+-
+-     This type of characters sets is quite frequently used in embedded
+-     systems such as video text.
+-
+-   * Instead of converting the Unicode or ISO 10646 text used internally
+-     it is often also sufficient to simply use an encoding different
+-     than UCS2/UCS4.  The Unicode and ISO 10646 standards even specify
+-     such an encoding: UTF-8.  This encoding is able to represent all
+-     of ISO 10464 31 bits in a byte string of length one to seven.
+-
+-     There were a few other attempts to encode ISO 10646 such as UTF-7
+-     but UTF-8 is today the only encoding which should be used.  In
+-     fact, UTF-8 will hopefully soon be the only external which has to
+-     be supported.  It proves to be universally usable and the only
+-     disadvantage is that it favor Roman languages very much by making
+-     the byte string representation of other scripts (Cyrillic, Greek,
+-     Asian scripts) longer than necessary if using a specific character
+-     set for these scripts.  Methods like the Unicode compression
+-     scheme can alleviate these problems.
+-
+-   The question remaining is: how to select the character set or
+-encoding to use.  The answer: you cannot decide about it yourself, it
+-is decided by the developers of the system or the majority of the
+-users.  Since the goal is interoperability one has to use whatever the
+-other people one works with use.  If there are no constraints the
+-selection is based on the requirements the expected circle of users
+-will have.  I.e., if a project is expected to only be used in, say,
+-Russia it is fine to use KOI8-R or a similar character set.  But if at
+-the same time people from, say, Greece are participating one should use
+-a character set which allows all people to collaborate.
+-
+-   The most widely useful solution seems to be: go with the most general
+-character set, namely ISO 10646.  Use UTF-8 as the external encoding
+-and problems about users not being able to use their own language
+-adequately are a thing of the past.
+-
+-   One final comment about the choice of the wide character
+-representation is necessary at this point.  We have said above that the
+-natural choice is using Unicode or ISO 10646.  This is not specified in
+-any standard, though.  The ISO C standard does not specify anything
+-specific about the `wchar_t' type.  There might be systems where the
+-developers decided differently.  Therefore one should as much as
+-possible avoid making assumption about the wide character representation
+-although GNU systems will always work as described above.  If the
+-programmer uses only the functions provided by the C library to handle
+-wide character strings there should not be any compatibility problems
+-with other systems.
+-
+-
+-File: libc.info,  Node: Charset Function Overview,  Next: Restartable multibyte conversion,  Prev: Extended Char Intro,  Up: Character Set Handling
+-
+-Overview about Character Handling Functions
+-===========================================
+-
+-   A Unix C library contains three different sets of functions in two
+-families to handle character set conversion.  The one function family
+-is specified in the ISO C standard and therefore is portable even
+-beyond the Unix world.
+-
+-   The most commonly known set of functions, coming from the ISO C89
+-standard, is unfortunately the least useful one.  In fact, these
+-functions should be avoided whenever possible, especially when
+-developing libraries (as opposed to applications).
+-
+-   The second family of functions got introduced in the early Unix
+-standards (XPG2) and is still part of the latest and greatest Unix
+-standard: Unix 98.  It is also the most powerful and useful set of
+-functions.  But we will start with the functions defined in the second
+-amendment to ISO C89.
+-
+-
+-File: libc.info,  Node: Restartable multibyte conversion,  Next: Non-reentrant Conversion,  Prev: Charset Function Overview,  Up: Character Set Handling
+-
+-Restartable Multibyte Conversion Functions
+-==========================================
+-
+-   The ISO C standard defines functions to convert strings from a
+-multibyte representation to wide character strings.  There are a number
+-of peculiarities:
+-
+-   * The character set assumed for the multibyte encoding is not
+-     specified as an argument to the functions.  Instead the character
+-     set specified by the `LC_CTYPE' category of the current locale is
+-     used; see *Note Locale Categories::.
+-
+-   * The functions handling more than one character at a time require
+-     NUL terminated strings as the argument.  I.e., converting blocks
+-     of text does not work unless one can add a NUL byte at an
+-     appropriate place.  The GNU C library contains some extensions the
+-     standard which allow specifying a size but basically they also
+-     expect terminated strings.
+-
+-   Despite these limitations the ISO C functions can very well be used
+-in many contexts.  In graphical user interfaces, for instance, it is not
+-uncommon to have functions which require text to be displayed in a wide
+-character string if it is not simple ASCII.  The text itself might come
+-from a file with translations and the user should decide about the
+-current locale which determines the translation and therefore also the
+-external encoding used.  In such a situation (and many others) the
+-functions described here are perfect.  If more freedom while performing
+-the conversion is necessary take a look at the `iconv' functions (*note
+-Generic Charset Conversion::.).
+-
+-* Menu:
+-
+-* Selecting the Conversion::     Selecting the conversion and its properties.
+-* Keeping the state::            Representing the state of the conversion.
+-* Converting a Character::       Converting Single Characters.
+-* Converting Strings::           Converting Multibyte and Wide Character
+-                                  Strings.
+-* Multibyte Conversion Example:: A Complete Multibyte Conversion Example.
+-
+-
+-File: libc.info,  Node: Selecting the Conversion,  Next: Keeping the state,  Up: Restartable multibyte conversion
+-
+-Selecting the conversion and its properties
+--------------------------------------------
+-
+-   We already said above that the currently selected locale for the
+-`LC_CTYPE' category decides about the conversion which is performed by
+-the functions we are about to describe.  Each locale uses its own
+-character set (given as an argument to `localedef') and this is the one
+-assumed as the external multibyte encoding.  The wide character
+-character set always is UCS4, at least on GNU systems.
+-
+-   A characteristic of each multibyte character set is the maximum
+-number of bytes which can be necessary to represent one character.  This
+-information is quite important when writing code which uses the
+-conversion functions.  In the examples below we will see some examples.
+-The ISO C standard defines two macros which provide this information.
+-
+- - Macro: int MB_LEN_MAX
+-     This macro specifies the maximum number of bytes in the multibyte
+-     sequence for a single character in any of the supported locales.
+-     It is a compile-time constant and it is defined in `limits.h'.
+-
+- - Macro: int MB_CUR_MAX
+-     `MB_CUR_MAX' expands into a positive integer expression that is the
+-     maximum number of bytes in a multibyte character in the current
+-     locale.  The value is never greater than `MB_LEN_MAX'.  Unlike
+-     `MB_LEN_MAX' this macro need not be a compile-time constant and in
+-     fact, in the GNU C library it is not.
+-
+-     `MB_CUR_MAX' is defined in `stdlib.h'.
+-
+-   Two different macros are necessary since strictly ISO C89 compilers
+-do not allow variable length array definitions but still it is desirable
+-to avoid dynamic allocation.  This incomplete piece of code shows the
+-problem:
+-
+-     {
+-       char buf[MB_LEN_MAX];
+-       ssize_t len = 0;
+-     
+-       while (! feof (fp))
+-         {
+-           fread (&buf[len], 1, MB_CUR_MAX - len, fp);
+-           /* ... process buf */
+-           len -= used;
+-         }
+-     }
+-
+-   The code in the inner loop is expected to have always enough bytes in
+-the array BUF to convert one multibyte character.  The array BUF has to
+-be sized statically since many compilers do not allow a variable size.
+-The `fread' call makes sure that always `MB_CUR_MAX' bytes are
+-available in BUF.  Note that it isn't a problem if `MB_CUR_MAX' is not
+-a compile-time constant.
+-
+-
+-File: libc.info,  Node: Keeping the state,  Next: Converting a Character,  Prev: Selecting the Conversion,  Up: Restartable multibyte conversion
+-
+-Representing the state of the conversion
+-----------------------------------------
+-
+-   In the introduction of this chapter it was said that certain
+-character sets use a "stateful" encoding.  I.e., the encoded values
+-depend in some way on the previous bytes in the text.
+-
+-   Since the conversion functions allow converting a text in more than
+-one step we must have a way to pass this information from one call of
+-the functions to another.
+-
+- - Data type: mbstate_t
+-     A variable of type `mbstate_t' can contain all the information
+-     about the "shift state" needed from one call to a conversion
+-     function to another.
+-
+-     This type is defined in `wchar.h'.  It got introduced in the second
+-     amendment to ISO C89.
+-
+-   To use objects of this type the programmer has to define such objects
+-(normally as local variables on the stack) and pass a pointer to the
+-object to the conversion functions.  This way the conversion function
+-can update the object if the current multibyte character set is
+-stateful.
+-
+-   There is no specific function or initializer to put the state object
+-in any specific state.  The rules are that the object should always
+-represent the initial state before the first use and this is achieved by
+-clearing the whole variable with code such as follows:
+-
+-     {
+-       mbstate_t state;
+-       memset (&state, '\0', sizeof (state));
+-       /* from now on STATE can be used.  */
+-       ...
+-     }
+-
+-   When using the conversion functions to generate output it is often
+-necessary to test whether the current state corresponds to the initial
+-state.  This is necessary, for example, to decide whether or not to emit
+-escape sequences to set the state to the initial state at certain
+-sequence points.  Communication protocols often require this.
+-
+- - Function: int mbsinit (const mbstate_t *PS)
+-     This function determines whether the state object pointed to by PS
+-     is in the initial state or not.  If PS is a null pointer or the
+-     object is in the initial state the return value is nonzero.
+-     Otherwise it is zero.
+-
+-     This function was introduced in the second amendment to ISO C89 and
+-     is declared in `wchar.h'.
+-
+-   Code using this function often looks similar to this:
+-
+-     {
+-       mbstate_t state;
+-       memset (&state, '\0', sizeof (state));
+-       /* Use STATE.  */
+-       ...
+-       if (! mbsinit (&state))
+-         {
+-           /* Emit code to return to initial state.  */
+-           const char empty[] = "";
+-           const char **srcp = &empty;
+-           wcsrtombs (outbuf, &srcp, outbuflen, &state);
+-         }
+-       ...
+-     }
+-
+-   The code to emit the escape sequence to get back to the initial
+-state is interesting.  The `wcsrtombs' function can be used to
+-determine the necessary output code (*note Converting Strings::.).
+-Please note that on GNU systems it is not necessary to perform this
+-extra action for the conversion from multibyte text ot wide character
+-text since the wide character encoding is not stateful.  But there is
+-nothing mentioned in any standard which prohibits making `wchar_t'
+-using a stateful encoding.
+-
+-
+-File: libc.info,  Node: Converting a Character,  Next: Converting Strings,  Prev: Keeping the state,  Up: Restartable multibyte conversion
+-
+-Converting Single Characters
+-----------------------------
+-
+-   The most fundamental of the conversion functions are those dealing
+-with single characters.  Please note that this does not always mean
+-single bytes.  But since there is very often a subset of the multibyte
+-character set which consists of single byte sequences there are
+-functions to help with converting bytes.  One very important and often
+-applicable scenario is where ASCII is a subpart of the multibyte
+-character set.  I.e., all ASCII characters stand for itself and all
+-other characters have at least a first byte which is beyond the range 0
+-to 127.
+-
+- - Function: wint_t btowc (int C)
+-     The `btowc' function ("byte to wide character") converts a valid
+-     single byte character C in the initial shift state into the wide
+-     character equivalent using the conversion rules from the currently
+-     selected locale of the `LC_CTYPE' category.
+-
+-     If `(unsigned char) C' is no valid single byte multibyte character
+-     or if C is `EOF' the function returns `WEOF'.
+-
+-     Please note the restriction of C being tested for validity only in
+-     the initial shift state.  There is no `mbstate_t' object used from
+-     which the state information is taken and the function also does
+-     not use any static state.
+-
+-     This function was introduced in the second amendment of ISO C89 and
+-     is declared in `wchar.h'.
+-
+-   Despite the limitation that the single byte value always is
+-interpreted in the initial state this function is actually useful most
+-of the time.  Most characters are either entirely single-byte character
+-sets or they are extension to ASCII.  But then it is possible to write
+-code like this (not that this specific example is very useful):
+-
+-     wchar_t *
+-     itow (unsigned long int val)
+-     {
+-       static wchar_t buf[30];
+-       wchar_t *wcp = &buf[29];
+-       *wcp = L'\0';
+-       while (val != 0)
+-         {
+-           *--wcp = btowc ('0' + val % 10);
+-           val /= 10;
+-         }
+-       if (wcp == &buf[29])
+-         *--wcp = L'0';
+-       return wcp;
+-     }
+-
+-   Why is it necessary to use such a complicated implementation and not
+-simply cast `'0' + val % 10' to a wide character?  The answer is that
+-there is no guarantee that one can perform this kind of arithmetic on
+-the character of the character set used for `wchar_t' representation.
+-In other situations the bytes are not constant at compile time and so
+-the compiler cannot do the work.  In situations like this it is
+-necessary `btowc'.
+-
+-There also is a function for the conversion in the other direction.
+-
+- - Function: int wctob (wint_t C)
+-     The `wctob' function ("wide character to byte") takes as the
+-     parameter a valid wide character.  If the multibyte representation
+-     for this character in the initial state is exactly one byte long
+-     the return value of this function is this character.  Otherwise
+-     the return value is `EOF'.
+-
+-     This function was introduced in the second amendment of ISO C89 and
+-     is declared in `wchar.h'.
+-
+-   There are more general functions to convert single character from
+-multibyte representation to wide characters and vice versa.  These
+-functions pose no limit on the length of the multibyte representation
+-and they also do not require it to be in the initial state.
+-
+- - Function: size_t mbrtowc (wchar_t *restrict PWC, const char
+-          *restrict S, size_t N, mbstate_t *restrict PS)
+-     The `mbrtowc' function ("multibyte restartable to wide character")
+-     converts the next multibyte character in the string pointed to by
+-     S into a wide character and stores it in the wide character string
+-     pointed to by PWC.  The conversion is performed according to the
+-     locale currently selected for the `LC_CTYPE' category.  If the
+-     conversion for the character set used in the locale requires a
+-     state the multibyte string is interpreted in the state represented
+-     by the object pointed to by PS.  If PS is a null pointer an static,
+-     internal state variable used only by the `mbrtowc' variable is
+-     used.
+-
+-     If the next multibyte character corresponds to the NUL wide
+-     character the return value of the function is 0 and the state
+-     object is afterwards in the initial state.  If the next N or fewer
+-     bytes form a correct multibyte character the return value is the
+-     number of bytes starting from S which form the multibyte
+-     character.  The conversion state is updated according to the bytes
+-     consumed in the conversion.  In both cases the wide character
+-     (either the `L'\0'' or the one found in the conversion) is stored
+-     in the string pointer to by PWC iff PWC is not null.
+-
+-     If the first N bytes of the multibyte string possibly form a valid
+-     multibyte character but there are more than N bytes needed to
+-     complete it the return value of the function is `(size_t) -2' and
+-     no value is stored.  Please note that this can happen even if N
+-     has a value greater or equal to `MB_CUR_MAX' since the input might
+-     contain redundant shift sequences.
+-
+-     If the first `n' bytes of the multibyte string cannot possibly form
+-     a valid multibyte character also no value is stored, the global
+-     variable `errno' is set to the value `EILSEQ' and the function
+-     returns `(size_t) -1'.  The conversion state is afterwards
+-     undefined.
+-
+-     This function was introduced in the second amendment to ISO C89 and
+-     is declared in `wchar.h'.
+-
+-   Using this function is straight forward.  A function which copies a
+-multibyte string into a wide character string while at the same time
+-converting all lowercase character into uppercase could look like this
+-(this is not the final version, just an example; it has no error
+-checking, and leaks sometimes memory):
+-
+-     wchar_t *
+-     mbstouwcs (const char *s)
+-     {
+-       size_t len = strlen (s);
+-       wchar_t *result = malloc ((len + 1) * sizeof (wchar_t));
+-       wchar_t *wcp = result;
+-       wchar_t tmp[1];
+-       mbstate_t state;
+-       memset (&state, '\0', sizeof (state));
+-       size_t nbytes;
+-       while ((nbytes = mbrtowc (tmp, s, len, &state)) > 0)
+-         {
+-           if (nbytes >= (size_t) -2)
+-             /* Invalid input string.  */
+-             return NULL;
+-           *result++ = towupper (tmp[0]);
+-           len -= nbytes;
+-           s += nbytes;
+-         }
+-       return result;
+-     }
+-
+-   The use of `mbrtowc' should be clear.  A single wide character is
+-stored in `TMP[0]' and the number of consumed bytes is stored in the
+-variable NBYTES.  In case the the conversion was successful the
+-uppercase variant of the wide character is stored in the RESULT array
+-and the pointer to the input string and the number of available bytes
+-is adjusted.
+-
+-   The only non-obvious thing about the function might be the way
+-memory is allocated for the result.  The above code uses the fact that
+-there can never be more wide characters in the converted results than
+-there are bytes in the multibyte input string.  This method yields to a
+-pessimistic guess about the size of the result and if many wide
+-character strings have to be constructed this way or the strings are
+-long, the extra memory required allocated because the input string
+-contains multibzte characters might be significant.  It would be
+-possible to resize the allocated memory block to the correct size before
+-returning it.  A better solution might be to allocate just the right
+-amount of space for the result right away.  Unfortunately there is no
+-function to compute the length of the wide character string directly
+-from the multibyte string.  But there is a function which does part of
+-the work.
+-
+- - Function: size_t mbrlen (const char *restrict S, size_t N, mbstate_t
+-          *PS)
+-     The `mbrlen' function ("multibyte restartable length") computes
+-     the number of at most N bytes starting at S which form the next
+-     valid and complete multibyte character.
+-
+-     If the next multibyte character corresponds to the NUL wide
+-     character the return value is 0.  If the next N bytes form a valid
+-     multibyte character the number of bytes belonging to this multibyte
+-     character byte sequence is returned.
+-
+-     If the the first N bytes possibly form a valid multibyte character
+-     but it is incomplete the return value is `(size_t) -2'.  Otherwise
+-     the multibyte character sequence is invalid and the return value
+-     is `(size_t) -1'.
+-
+-     The multibyte sequence is interpreted in the state represented by
+-     the object pointer to by PS.  If PS is a null pointer an state
+-     object local to `mbrlen' is used.
+-
+-     This function was introduced in the second amendment to ISO C89 and
+-     is declared in `wchar.h'.
+-
+-   The tentative reader now will of course note that `mbrlen' can be
+-implemented as
+-
+-     mbrtowc (NULL, s, n, ps != NULL ? ps : &internal)
+-
+-   This is true and in fact is mentioned in the official specification.
+-Now, how can this function be used to determine the length of the wide
+-character string created from a multibyte character string?  It is not
+-directly usable but we can define a function `mbslen' using it:
+-
+-     size_t
+-     mbslen (const char *s)
+-     {
+-       mbstate_t state;
+-       size_t result = 0;
+-       size_t nbytes;
+-       memset (&state, '\0', sizeof (state));
+-       while ((nbytes = mbrlen (s, MB_LEN_MAX, &state)) > 0)
+-         {
+-           if (nbytes >= (size_t) -2)
+-             /* Something is wrong.  */
+-             return (size_t) -1;
+-           s += nbytes;
+-           ++result;
+-         }
+-       return result;
+-     }
+-
+-   This function simply calls `mbrlen' for each multibyte character in
+-the string and counts the number of function calls.  Please note that
+-we here use `MB_LEN_MAX' as the size argument in the `mbrlen' call.
+-This is OK since a) this value is larger then the length of the longest
+-multibyte character sequence and b) because we know that the string S
+-ends with a NUL byte which cannot be part of any other multibyte
+-character sequence but the one representing the NUL wide character.
+-Therefore the `mbrlen' function will never read invalid memory.
+-
+-   Now that this function is available (just to make this clear, this
+-function is *not* part of the GNU C library) we can compute the number
+-of wide character required to store the converted multibyte character
+-string S using
+-
+-     wcs_bytes = (mbslen (s) + 1) * sizeof (wchar_t);
+-
+-   Please note that the `mbslen' function is quite inefficient.  The
+-implementation of `mbstouwcs' implemented using `mbslen' would have to
+-perform the conversion of the multibyte character input string twice
+-and this conversion might be quite expensive.  So it is necessary to
+-think about the consequences of using the easier but imprecise method
+-before doing the work twice.
+-
+- - Function: size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t
+-          *restrict PS)
+-     The `wcrtomb' function ("wide character restartable to multibyte")
+-     converts a single wide character into a multibyte string
+-     corresponding to that wide character.
+-
+-     If S is a null pointer the function resets the the state stored in
+-     the objects pointer to by PS (or the internal `mbstate_t' object)
+-     to the initial state.  This can also be achieved by a call like
+-     this:
+-
+-          wcrtombs (temp_buf, L'\0', ps)
+-
+-     since if S is a null pointer `wcrtomb' performs as if it writes
+-     into an internal buffer which is guaranteed to be large enough.
+-
+-     If WC is the NUL wide character `wcrtomb' emits, if necessary, a
+-     shift sequence to get the state PS into the initial state followed
+-     by a single NUL byte is stored in the string S.
+-
+-     Otherwise a byte sequence (possibly including shift sequences) is
+-     written into the string S.  This of only happens if WC is a valid
+-     wide character, i.e., it has a multibyte representation in the
+-     character set selected by locale of the `LC_CTYPE' category.  If
+-     WC is no valid wide character nothing is stored in the strings S,
+-     `errno' is set to `EILSEQ', the conversion state in PS is
+-     undefined and the return value is `(size_t) -1'.
+-
+-     If no error occurred the function returns the number of bytes
+-     stored in the string S.  This includes all byte representing shift
+-     sequences.
+-
+-     One word about the interface of the function: there is no parameter
+-     specifying the length of the array S.  Instead the function
+-     assumes that there are at least `MB_CUR_MAX' bytes available since
+-     this is the maximum length of any byte sequence representing a
+-     single character.  So the caller has to make sure that there is
+-     enough space available, otherwise buffer overruns can occur.
+-
+-     This function was introduced in the second amendment to ISO C and
+-     is declared in `wchar.h'.
+-
+-   Using this function is as easy as using `mbrtowc'.  The following
+-example appends a wide character string to a multibyte character string.
+-Again, the code is not really useful (and correct), it is simply here to
+-demonstrate the use and some problems.
+-
+-     char *
+-     mbscatwc (char *s, size_t len, const wchar_t *ws)
+-     {
+-       mbstate_t state;
+-       /* Find the end of the existing string.  */
+-       char *wp = strchr (s, '\0');
+-       len -= wp - s;
+-       memset (&state, '\0', sizeof (state));
+-       do
+-         {
+-           size_t nbytes;
+-           if (len < MB_CUR_LEN)
+-             {
+-               /* We cannot guarantee that the next
+-                  character fits into the buffer, so
+-                  return an error.  */
+-               errno = E2BIG;
+-               return NULL;
+-             }
+-           nbytes = wcrtomb (wp, *ws, &state);
+-           if (nbytes == (size_t) -1)
+-             /* Error in the conversion.  */
+-             return NULL;
+-           len -= nbytes;
+-           wp += nbytes;
+-         }
+-       while (*ws++ != L'\0');
+-       return s;
+-     }
+-
+-   First the function has to find the end of the string currently in the
+-array S.  The `strchr' call does this very efficiently since a
+-requirement for multibyte character representations is that the NUL byte
+-never is used except to represent itself (and in this context, the end
+-of the string).
+-
+-   After initializing the state object the loop is entered where the
+-first task is to make sure there is enough room in the array S.  We
+-abort if there are not at least `MB_CUR_LEN' bytes available.  This is
+-not always optimal but we have no other choice.  We might have less
+-than `MB_CUR_LEN' bytes available but the next multibyte character
+-might also be only one byte long.  At the time the `wcrtomb' call
+-returns it is too late to decide whether the buffer was large enough or
+-not.  If this solution is really unsuitable there is a very slow but
+-more accurate solution.
+-
+-       ...
+-       if (len < MB_CUR_LEN)
+-         {
+-           mbstate_t temp_state;
+-           memcpy (&temp_state, &state, sizeof (state));
+-           if (wcrtomb (NULL, *ws, &temp_state) > len)
+-             {
+-               /* We cannot guarantee that the next
+-                  character fits into the buffer, so
+-                  return an error.  */
+-               errno = E2BIG;
+-               return NULL;
+-             }
+-         }
+-       ...
+-
+-   Here we do perform the conversion which might overflow the buffer so
+-that we are afterwards in the position to make an exact decision about
+-the buffer size.  Please note the `NULL' argument for the destination
+-buffer in the new `wcrtomb' call; since we are not interested in the
+-converted text at this point this is a nice way to express this.  The
+-most unusual thing about this piece of code certainly is the
+-duplication of the conversion state object.  But think about this: if a
+-change of the state is necessary to emit the next multibyte character
+-we want to have the same shift state change performed in the real
+-conversion.  Therefore we have to preserve the initial shift state
+-information.
+-
+-   There are certainly many more and even better solutions to this
+-problem.  This example is only meant for educational purposes.
+-
+-
+-File: libc.info,  Node: Converting Strings,  Next: Multibyte Conversion Example,  Prev: Converting a Character,  Up: Restartable multibyte conversion
+-
+-Converting Multibyte and Wide Character Strings
+------------------------------------------------
+-
+-   The functions described in the previous section only convert a single
+-character at a time.  Most operations to be performed in real-world
+-programs include strings and therefore the ISO C standard also defines
+-conversions on entire strings.  However, the defined set of functions
+-is quite limited, thus the GNU C library contains a few extensions
+-which can help in some important situations.
+-
+- - Function: size_t mbsrtowcs (wchar_t *restrict DST, const char
+-          **restrict SRC, size_t LEN, mbstate_t *restrict PS)
+-     The `mbsrtowcs' function ("multibyte string restartable to wide
+-     character string") converts an NUL terminated multibyte character
+-     string at `*SRC' into an equivalent wide character string,
+-     including the NUL wide character at the end.  The conversion is
+-     started using the state information from the object pointed to by
+-     PS or from an internal object of `mbsrtowcs' if PS is a null
+-     pointer.  Before returning the state object to match the state
+-     after the last converted character.  The state is the initial
+-     state if the terminating NUL byte is reached and converted.
+-
+-     If DST is not a null pointer the result is stored in the array
+-     pointed to by DST, otherwise the conversion result is not
+-     available since it is stored in an internal buffer.
+-
+-     If LEN wide characters are stored in the array DST before reaching
+-     the end of the input string the conversion stops and LEN is
+-     returned.  If DST is a null pointer LEN is never checked.
+-
+-     Another reason for a premature return from the function call is if
+-     the input string contains an invalid multibyte sequence.  In this
+-     case the global variable `errno' is set to `EILSEQ' and the
+-     function returns `(size_t) -1'.
+-
+-     In all other cases the function returns the number of wide
+-     characters converted during this call.  If DST is not null
+-     `mbsrtowcs' stores in the pointer pointed to by SRC a null pointer
+-     (if the NUL byte in the input string was reached) or the address
+-     of the byte following the last converted multibyte character.
+-
+-     This function was introduced in the second amendment to ISO C and
+-     is declared in `wchar.h'.
+-
+-   The definition of this function has one limitation which has to be
+-understood.  The requirement that DST has to be a NUL terminated string
+-provides problems if one wants to convert buffers with text.  A buffer
+-is normally no collection of NUL terminated strings but instead a
+-continuous collection of lines, separated by newline characters.  Now
+-assume a function to convert one line from a buffer is needed.  Since
+-the line is not NUL terminated the source pointer cannot directly point
+-into the unmodified text buffer.  This means, either one inserts the NUL
+-byte at the appropriate place for the time of the `mbsrtowcs' function
+-call (which is not doable for a read-only buffer or in a multi-threaded
+-application) or one copies the line in an extra buffer where it can be
+-terminated by a NUL byte.  Note that it is not in general possible to
+-limit the number of characters to convert by setting the parameter LEN
+-to any specific value.  Since it is not known how many bytes each
+-multibyte character sequence is in length one always could do only a
+-guess.
+-
+-   There is still a problem with the method of NUL-terminating a line
+-right after the newline character which could lead to very strange
+-results.  As said in the description of the MBSRTOWCS function above the
+-conversion state is guaranteed to be in the initial shift state after
+-processing the NUL byte at the end of the input string.  But this NUL
+-byte is not really part of the text.  I.e., the conversion state after
+-the newline in the original text could be something different than the
+-initial shift state and therefore the first character of the next line
+-is encoded using this state.  But the state in question is never
+-accessible to the user since the conversion stops after the NUL byte
+-(which resets the state).  Most stateful character sets in use today
+-require that the shift state after a newline is the initial state-but
+-this is not a strict guarantee.  Therefore simply NUL terminating a
+-piece of a running text is not always an adequate solution and therefore
+-never should be used in generally used code.
+-
+-   The generic conversion interface (*note Generic Charset
+-Conversion::.)  does not have this limitation (it simply works on
+-buffers, not strings), and the GNU C library contains a set of
+-functions which take additional parameters specifying the maximal
+-number of bytes which are consumed from the input string.  This way the
+-problem of `mbsrtowcs''s example above could be solved by determining
+-the line length and passing this length to the function.
+-
+- - Function: size_t wcsrtombs (char *restrict DST, const wchar_t
+-          **restrict SRC, size_t LEN, mbstate_t *restrict PS)
+-     The `wcsrtombs' function ("wide character string restartable to
+-     multibyte string") converts the NUL terminated wide character
+-     string at `*SRC' into an equivalent multibyte character string and
+-     stores the result in the array pointed to by DST.  The NUL wide
+-     character is also converted.  The conversion starts in the state
+-     described in the object pointed to by PS or by a state object
+-     locally to `wcsrtombs' in case PS is a null pointer.  If DST is a
+-     null pointer the conversion is performed as usual but the result
+-     is not available.  If all characters of the input string were
+-     successfully converted and if DST is not a null pointer the
+-     pointer pointed to by SRC gets assigned a null pointer.
+-
+-     If one of the wide characters in the input string has no valid
+-     multibyte character equivalent the conversion stops early, sets
+-     the global variable `errno' to `EILSEQ', and returns `(size_t) -1'.
+-
+-     Another reason for a premature stop is if DST is not a null
+-     pointer and the next converted character would require more than
+-     LEN bytes in total to the array DST.  In this case (and if DEST is
+-     not a null pointer) the pointer pointed to by SRC is assigned a
+-     value pointing to the wide character right after the last one
+-     successfully converted.
+-
+-     Except in the case of an encoding error the return value of the
+-     function is the number of bytes in all the multibyte character
+-     sequences stored in DST.  Before returning the state in the object
+-     pointed to by PS (or the internal object in case PS is a null
+-     pointer) is updated to reflect the state after the last
+-     conversion.  The state is the initial shift state in case the
+-     terminating NUL wide character was converted.
+-
+-     This function was introduced in the second amendment to ISO C and
+-     is declared in `wchar.h'.
+-
+-   The restriction mentions above for the `mbsrtowcs' function applies
+-also here.  There is no possibility to directly control the number of
+-input characters.  One has to place the NUL wide character at the
+-correct place or control the consumed input indirectly via the available
+-output array size (the LEN parameter).
+-
+- - Function: size_t mbsnrtowcs (wchar_t *restrict DST, const char
+-          **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict
+-          PS)
+-     The `mbsnrtowcs' function is very similar to the `mbsrtowcs'
+-     function.  All the parameters are the same except for NMC which is
+-     new.  The return value is the same as for `mbsrtowcs'.
+-
+-     This new parameter specifies how many bytes at most can be used
+-     from the multibyte character string.  I.e., the multibyte
+-     character string `*SRC' need not be NUL terminated.  But if a NUL
+-     byte is found within the NMC first bytes of the string the
+-     conversion stops here.
+-
+-     This function is a GNU extensions.  It is meant to work around the
+-     problems mentioned above.  Now it is possible to convert buffer
+-     with multibyte character text piece for piece without having to
+-     care about inserting NUL bytes and the effect of NUL bytes on the
+-     conversion state.
+-
+-   A function to convert a multibyte string into a wide character string
+-and display it could be written like this (this is not a really useful
+-example):
+-
+-     void
+-     showmbs (const char *src, FILE *fp)
+-     {
+-       mbstate_t state;
+-       int cnt = 0;
+-       memset (&state, '\0', sizeof (state));
+-       while (1)
+-         {
+-           wchar_t linebuf[100];
+-           const char *endp = strchr (src, '\n');
+-           size_t n;
+-     
+-           /* Exit if there is no more line.  */
+-           if (endp == NULL)
+-             break;
+-     
+-           n = mbsnrtowcs (linebuf, &src, endp - src, 99, &state);
+-           linebuf[n] = L'\0';
+-           fprintf (fp, "line %d: \"%S\"\n", linebuf);
+-         }
+-     }
+-
+-   There is no problem with the state after a call to `mbsnrtowcs'.
+-Since we don't insert characters in the strings which were not in there
+-right from the beginning and we use STATE only for the conversion of
+-the given buffer there is no problem with altering the state.
+-
+- - Function: size_t wcsnrtombs (char *restrict DST, const wchar_t
+-          **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict
+-          PS)
+-     The `wcsnrtombs' function implements the conversion from wide
+-     character strings to multibyte character strings.  It is similar to
+-     `wcsrtombs' but it takes, just like `mbsnrtowcs', an extra
+-     parameter which specifies the length of the input string.
+-
+-     No more than NWC wide characters from the input string `*SRC' are
+-     converted.  If the input string contains a NUL wide character in
+-     the first NWC character to conversion stops at this place.
+-
+-     This function is a GNU extension and just like `mbsnrtowcs' is
+-     helps in situations where no NUL terminated input strings are
+-     available.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-8 glibc-2.1.3/manual/libc.info-8
+--- ../glibc-2.1.3/manual/libc.info-8	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-8	1969-12-31 16:00:00.000000000 -0800
+@@ -1,889 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: Multibyte Conversion Example,  Prev: Converting Strings,  Up: Restartable multibyte conversion
+-
+-A Complete Multibyte Conversion Example
+----------------------------------------
+-
+-   The example programs given in the last sections are only brief and do
+-not contain all the error checking etc.  Presented here is a complete
+-and documented example.  It features the `mbrtowc' function but it
+-should be easy to derive versions using the other functions.
+-
+-     int
+-     file_mbsrtowcs (int input, int output)
+-     {
+-       /* Note the use of `MB_LEN_MAX'.
+-          `MB_CUR_MAX' cannot portably be used here.  */
+-       char buffer[BUFSIZ + MB_LEN_MAX];
+-       mbstate_t state;
+-       int filled = 0;
+-       int eof = 0;
+-     
+-       /* Initialize the state.  */
+-       memset (&state, '\0', sizeof (state));
+-     
+-       while (!eof)
+-         {
+-           ssize_t nread;
+-           ssize_t nwrite;
+-           char *inp = buffer;
+-           wchar_t outbuf[BUFSIZ];
+-           wchar_t *outp = outbuf;
+-     
+-           /* Fill up the buffer from the input file.  */
+-           nread = read (input, buffer + filled, BUFSIZ);
+-           if (nread < 0)
+-             {
+-               perror ("read");
+-               return 0;
+-             }
+-           /* If we reach end of file, make a note to read no more. */
+-           if (nread == 0)
+-             eof = 1;
+-     
+-           /* `filled' is now the number of bytes in `buffer'. */
+-           filled += nread;
+-     
+-           /* Convert those bytes to wide characters-as many as we can. */
+-           while (1)
+-             {
+-               size_t thislen = mbrtowc (outp, inp, filled, &state);
+-               /* Stop converting at invalid character;
+-                  this can mean we have read just the first part
+-                  of a valid character.  */
+-               if (thislen == (size_t) -1)
+-                 break;
+-               /* We want to handle embedded NUL bytes
+-                  but the return value is 0.  Correct this.  */
+-               if (thislen == 0)
+-                 thislen = 1;
+-               /* Advance past this character. */
+-               inp += thislen;
+-               filled -= thislen;
+-               ++outp;
+-             }
+-     
+-           /* Write the wide characters we just made.  */
+-           nwrite = write (output, outbuf,
+-                           (outp - outbuf) * sizeof (wchar_t));
+-           if (nwrite < 0)
+-             {
+-               perror ("write");
+-               return 0;
+-             }
+-     
+-           /* See if we have a *real* invalid character. */
+-           if ((eof && filled > 0) || filled >= MB_CUR_MAX)
+-             {
+-               error (0, 0, "invalid multibyte character");
+-               return 0;
+-             }
+-     
+-           /* If any characters must be carried forward,
+-              put them at the beginning of `buffer'. */
+-           if (filled > 0)
+-             memmove (inp, buffer, filled);
+-         }
+-     
+-       return 1;
+-     }
+-
+-
+-File: libc.info,  Node: Non-reentrant Conversion,  Next: Generic Charset Conversion,  Prev: Restartable multibyte conversion,  Up: Character Set Handling
+-
+-Non-reentrant Conversion Function
+-=================================
+-
+-   The functions described in the last chapter are defined in the second
+-amendment to ISO C89.  But the original ISO C89 standard also contained
+-functions for character set conversion.  The reason that they are not
+-described in the first place is that they are almost entirely useless.
+-
+-   The problem is that all the functions for conversion defined in
+-ISO C89 use a local state.  This implies that multiple conversions at
+-the same time (not only when using threads) cannot be done, and that you
+-cannot first convert single characters and then strings since you cannot
+-tell the conversion functions which state to use.
+-
+-   These functions are therefore usable only in a very limited set of
+-situations.  One must complete converting the entire string before
+-starting a new one and each string/text must be converted with the same
+-function (there is no problem with the library itself; it is guaranteed
+-that no library function changes the state of any of these functions).
+-*For the above reasons it is highly requested that the functions from
+-the last section are used in place of non-reentrant conversion
+-functions.*
+-
+-* Menu:
+-
+-* Non-reentrant Character Conversion::  Non-reentrant Conversion of Single
+-                                         Characters.
+-* Non-reentrant String Conversion::     Non-reentrant Conversion of Strings.
+-* Shift State::                         States in Non-reentrant Functions.
+-
+-
+-File: libc.info,  Node: Non-reentrant Character Conversion,  Next: Non-reentrant String Conversion,  Up: Non-reentrant Conversion
+-
+-Non-reentrant Conversion of Single Characters
+----------------------------------------------
+-
+- - Function: int mbtowc (wchar_t *restrict RESULT, const char *restrict
+-          STRING, size_t SIZE)
+-     The `mbtowc' ("multibyte to wide character") function when called
+-     with non-null STRING converts the first multibyte character
+-     beginning at STRING to its corresponding wide character code.  It
+-     stores the result in `*RESULT'.
+-
+-     `mbtowc' never examines more than SIZE bytes.  (The idea is to
+-     supply for SIZE the number of bytes of data you have in hand.)
+-
+-     `mbtowc' with non-null STRING distinguishes three possibilities:
+-     the first SIZE bytes at STRING start with valid multibyte
+-     character, they start with an invalid byte sequence or just part
+-     of a character, or STRING points to an empty string (a null
+-     character).
+-
+-     For a valid multibyte character, `mbtowc' converts it to a wide
+-     character and stores that in `*RESULT', and returns the number of
+-     bytes in that character (always at least 1, and never more than
+-     SIZE).
+-
+-     For an invalid byte sequence, `mbtowc' returns -1.  For an empty
+-     string, it returns 0, also storing `'\0'' in `*RESULT'.
+-
+-     If the multibyte character code uses shift characters, then
+-     `mbtowc' maintains and updates a shift state as it scans.  If you
+-     call `mbtowc' with a null pointer for STRING, that initializes the
+-     shift state to its standard initial value.  It also returns
+-     nonzero if the multibyte character code in use actually has a
+-     shift state.  *Note Shift State::.
+-
+- - Function: int wctomb (char *STRING, wchar_t WCHAR)
+-     The `wctomb' ("wide character to multibyte") function converts the
+-     wide character code WCHAR to its corresponding multibyte character
+-     sequence, and stores the result in bytes starting at STRING.  At
+-     most `MB_CUR_MAX' characters are stored.
+-
+-     `wctomb' with non-null STRING distinguishes three possibilities
+-     for WCHAR: a valid wide character code (one that can be translated
+-     to a multibyte character), an invalid code, and `L'\0''.
+-
+-     Given a valid code, `wctomb' converts it to a multibyte character,
+-     storing the bytes starting at STRING.  Then it returns the number
+-     of bytes in that character (always at least 1, and never more than
+-     `MB_CUR_MAX').
+-
+-     If WCHAR is an invalid wide character code, `wctomb' returns -1.
+-     If WCHAR is `L'\0'', it returns `0', also storing `'\0'' in
+-     `*STRING'.
+-
+-     If the multibyte character code uses shift characters, then
+-     `wctomb' maintains and updates a shift state as it scans.  If you
+-     call `wctomb' with a null pointer for STRING, that initializes the
+-     shift state to its standard initial value.  It also returns
+-     nonzero if the multibyte character code in use actually has a
+-     shift state.  *Note Shift State::.
+-
+-     Calling this function with a WCHAR argument of zero when STRING is
+-     not null has the side-effect of reinitializing the stored shift
+-     state *as well as* storing the multibyte character `'\0'' and
+-     returning 0.
+-
+-   Similar to `mbrlen' there is also a non-reentrant function which
+-computes the length of a multibyte character.  It can be defined in
+-terms of `mbtowc'.
+-
+- - Function: int mblen (const char *STRING, size_t SIZE)
+-     The `mblen' function with a non-null STRING argument returns the
+-     number of bytes that make up the multibyte character beginning at
+-     STRING, never examining more than SIZE bytes.  (The idea is to
+-     supply for SIZE the number of bytes of data you have in hand.)
+-
+-     The return value of `mblen' distinguishes three possibilities: the
+-     first SIZE bytes at STRING start with valid multibyte character,
+-     they start with an invalid byte sequence or just part of a
+-     character, or STRING points to an empty string (a null character).
+-
+-     For a valid multibyte character, `mblen' returns the number of
+-     bytes in that character (always at least `1', and never more than
+-     SIZE).  For an invalid byte sequence, `mblen' returns -1.  For an
+-     empty string, it returns 0.
+-
+-     If the multibyte character code uses shift characters, then `mblen'
+-     maintains and updates a shift state as it scans.  If you call
+-     `mblen' with a null pointer for STRING, that initializes the shift
+-     state to its standard initial value.  It also returns a nonzero
+-     value if the multibyte character code in use actually has a shift
+-     state.  *Note Shift State::.
+-
+-     The function `mblen' is declared in `stdlib.h'.
+-
+-
+-File: libc.info,  Node: Non-reentrant String Conversion,  Next: Shift State,  Prev: Non-reentrant Character Conversion,  Up: Non-reentrant Conversion
+-
+-Non-reentrant Conversion of Strings
+------------------------------------
+-
+-   For convenience reasons the ISO C89 standard defines also functions
+-to convert entire strings instead of single characters.  These functions
+-suffer from the same problems as their reentrant counterparts from the
+-second amendment to ISO C89; see *Note Converting Strings::.
+-
+- - Function: size_t mbstowcs (wchar_t *WSTRING, const char *STRING,
+-          size_t SIZE)
+-     The `mbstowcs' ("multibyte string to wide character string")
+-     function converts the null-terminated string of multibyte
+-     characters STRING to an array of wide character codes, storing not
+-     more than SIZE wide characters into the array beginning at WSTRING.
+-     The terminating null character counts towards the size, so if SIZE
+-     is less than the actual number of wide characters resulting from
+-     STRING, no terminating null character is stored.
+-
+-     The conversion of characters from STRING begins in the initial
+-     shift state.
+-
+-     If an invalid multibyte character sequence is found, this function
+-     returns a value of -1.  Otherwise, it returns the number of wide
+-     characters stored in the array WSTRING.  This number does not
+-     include the terminating null character, which is present if the
+-     number is less than SIZE.
+-
+-     Here is an example showing how to convert a string of multibyte
+-     characters, allocating enough space for the result.
+-
+-          wchar_t *
+-          mbstowcs_alloc (const char *string)
+-          {
+-            size_t size = strlen (string) + 1;
+-            wchar_t *buf = xmalloc (size * sizeof (wchar_t));
+-          
+-            size = mbstowcs (buf, string, size);
+-            if (size == (size_t) -1)
+-              return NULL;
+-            buf = xrealloc (buf, (size + 1) * sizeof (wchar_t));
+-            return buf;
+-          }
+-
+-
+- - Function: size_t wcstombs (char *STRING, const wchar_t *WSTRING,
+-          size_t SIZE)
+-     The `wcstombs' ("wide character string to multibyte string")
+-     function converts the null-terminated wide character array WSTRING
+-     into a string containing multibyte characters, storing not more
+-     than SIZE bytes starting at STRING, followed by a terminating null
+-     character if there is room.  The conversion of characters begins in
+-     the initial shift state.
+-
+-     The terminating null character counts towards the size, so if SIZE
+-     is less than or equal to the number of bytes needed in WSTRING, no
+-     terminating null character is stored.
+-
+-     If a code that does not correspond to a valid multibyte character
+-     is found, this function returns a value of -1.  Otherwise, the
+-     return value is the number of bytes stored in the array STRING.
+-     This number does not include the terminating null character, which
+-     is present if the number is less than SIZE.
+-
+-
+-File: libc.info,  Node: Shift State,  Prev: Non-reentrant String Conversion,  Up: Non-reentrant Conversion
+-
+-States in Non-reentrant Functions
+----------------------------------
+-
+-   In some multibyte character codes, the *meaning* of any particular
+-byte sequence is not fixed; it depends on what other sequences have come
+-earlier in the same string.  Typically there are just a few sequences
+-that can change the meaning of other sequences; these few are called
+-"shift sequences" and we say that they set the "shift state" for other
+-sequences that follow.
+-
+-   To illustrate shift state and shift sequences, suppose we decide that
+-the sequence `0200' (just one byte) enters Japanese mode, in which
+-pairs of bytes in the range from `0240' to `0377' are single
+-characters, while `0201' enters Latin-1 mode, in which single bytes in
+-the range from `0240' to `0377' are characters, and interpreted
+-according to the ISO Latin-1 character set.  This is a multibyte code
+-which has two alternative shift states ("Japanese mode" and "Latin-1
+-mode"), and two shift sequences that specify particular shift states.
+-
+-   When the multibyte character code in use has shift states, then
+-`mblen', `mbtowc' and `wctomb' must maintain and update the current
+-shift state as they scan the string.  To make this work properly, you
+-must follow these rules:
+-
+-   * Before starting to scan a string, call the function with a null
+-     pointer for the multibyte character address--for example, `mblen
+-     (NULL, 0)'.  This initializes the shift state to its standard
+-     initial value.
+-
+-   * Scan the string one character at a time, in order.  Do not "back
+-     up" and rescan characters already scanned, and do not intersperse
+-     the processing of different strings.
+-
+-   Here is an example of using `mblen' following these rules:
+-
+-     void
+-     scan_string (char *s)
+-     {
+-       int length = strlen (s);
+-     
+-       /* Initialize shift state.  */
+-       mblen (NULL, 0);
+-     
+-       while (1)
+-         {
+-           int thischar = mblen (s, length);
+-           /* Deal with end of string and invalid characters.  */
+-           if (thischar == 0)
+-             break;
+-           if (thischar == -1)
+-             {
+-               error ("invalid multibyte character");
+-               break;
+-             }
+-           /* Advance past this character.  */
+-           s += thischar;
+-           length -= thischar;
+-         }
+-     }
+-
+-   The functions `mblen', `mbtowc' and `wctomb' are not reentrant when
+-using a multibyte code that uses a shift state.  However, no other
+-library functions call these functions, so you don't have to worry that
+-the shift state will be changed mysteriously.
+-
+-
+-File: libc.info,  Node: Generic Charset Conversion,  Prev: Non-reentrant Conversion,  Up: Character Set Handling
+-
+-Generic Charset Conversion
+-==========================
+-
+-   The conversion functions mentioned so far in this chapter all had in
+-common that they operate on character sets which are not directly
+-specified by the functions.  The multibyte encoding used is specified by
+-the currently selected locale for the `LC_CTYPE' category.  The wide
+-character set is fixed by the implementation (in the case of GNU C
+-library it always is UCS4 encoded ISO 10646.
+-
+-   This has of course several problems when it comes to general
+-character conversion:
+-
+-   * For every conversion where neither the source or destination
+-     character set is the character set of the locale for the
+-     `LC_CTYPE' category, one has to change the `LC_CTYPE' locale using
+-     `setlocale'.
+-
+-     This introduces major problems for the rest of the programs since
+-     several more functions (e.g., the character classification
+-     functions, *note Classification of Characters::.) use the
+-     `LC_CTYPE' category.
+-
+-   * Parallel conversions to and from different character sets are not
+-     possible since the `LC_CTYPE' selection is global and shared by all
+-     threads.
+-
+-   * If neither the source nor the destination character set is the
+-     character set used for `wchar_t' representation there is at least
+-     a two-step process necessary to convert a text using the functions
+-     above.  One would have to select the source character set as the
+-     multibyte encoding, convert the text into a `wchar_t' text, select
+-     the destination character set as the multibyte encoding and
+-     convert the wide character text to the multibyte (= destination)
+-     character set.
+-
+-     Even if this is possible (which is not guaranteed) it is a very
+-     tiring work.  Plus it suffers from the other two raised points
+-     even more due to the steady changing of the locale.
+-
+-   The XPG2 standard defines a completely new set of functions which has
+-none of these limitations.  They are not at all coupled to the selected
+-locales and they but no constraints on the character sets selected for
+-source and destination.  Only the set of available conversions is
+-limiting them.  The standard does not specify that any conversion at all
+-must be available.  It is a measure of the quality of the
+-implementation.
+-
+-   In the following text first the interface to `iconv', the conversion
+-function, will be described.  Comparisons with other implementations
+-will show what pitfalls lie on the way of portable applications.  At
+-last, the implementation is described as far as interesting to the
+-advanced user who wants to extend the conversion capabilities.
+-
+-* Menu:
+-
+-* Generic Conversion Interface::    Generic Character Set Conversion Interface.
+-* iconv Examples::                  A complete `iconv' example.
+-* Other iconv Implementations::     Some Details about other `iconv'
+-                                     Implementations.
+-* glibc iconv Implementation::      The `iconv' Implementation in the GNU C
+-                                     library.
+-
+-
+-File: libc.info,  Node: Generic Conversion Interface,  Next: iconv Examples,  Up: Generic Charset Conversion
+-
+-Generic Character Set Conversion Interface
+-------------------------------------------
+-
+-   This set of functions follows the traditional cycle of using a
+-resource: open-use-close.  The interface consists of three functions,
+-each of which implement one step.
+-
+-   Before the interfaces are described it is necessary to introduce a
+-datatype.  Just like other open-use-close interface the functions
+-introduced here work using a handles and the `iconv.h' header defines a
+-special type for the handles used.
+-
+- - Data Type: iconv_t
+-     This data type is an abstract type defined in `iconv.h'.  The user
+-     must not assume anything about the definition of this type, it
+-     must be completely opaque.
+-
+-     Objects of this type can get assigned handles for the conversions
+-     using the `iconv' functions.  The objects themselves need not be
+-     freed but the conversions for which the handles stand for have to.
+-
+-The first step is the function to create a handle.
+-
+- - Function: iconv_t iconv_open (const char *TOCODE, const char
+-          *FROMCODE)
+-     The `iconv_open' function has to be used before starting a
+-     conversion.  The two parameters this function takes determine the
+-     source and destination character set for the conversion and if the
+-     implementation has the possibility to perform such a conversion the
+-     function returns a handle.
+-
+-     If the wanted conversion is not available the function returns
+-     `(iconv_t) -1'.  In this case the global variable `errno' can have
+-     the following values:
+-
+-    `EMFILE'
+-          The process already has `OPEN_MAX' file descriptors open.
+-
+-    `ENFILE'
+-          The system limit of open file is reached.
+-
+-    `ENOMEM'
+-          Not enough memory to carry out the operation.
+-
+-    `EINVAL'
+-          The conversion from FROMCODE to TOCODE is not supported.
+-
+-     It is not possible to use the same descriptor in different threads
+-     to perform independent conversions.  Within the data structures
+-     associated with the descriptor there is information about the
+-     conversion state.  This must not be messed up by using it in
+-     different conversions.
+-
+-     An `iconv' descriptor is like a file descriptor as for every use a
+-     new descriptor must be created.  The descriptor does not stand for
+-     all of the conversions from FROMSET to TOSET.
+-
+-     The GNU C library implementation of `iconv_open' has one
+-     significant extension to other implementations.  To ease the
+-     extension of the set of available conversions the implementation
+-     allows to store the necessary files with data and code in
+-     arbitrary many directories.  How this extensions have to be
+-     written will be explained below (*note glibc iconv
+-     Implementation::.).  Here it is only important to say that all
+-     directories mentioned in the `GCONV_PATH' environment variable are
+-     considered if they contain a file `gconv-modules'.  These
+-     directories need not necessarily be created by the system
+-     administrator.  In fact, this extension is introduced to help users
+-     writing and using own, new conversions.  Of course this does not
+-     work for security reasons in SUID binaries; in this case only the
+-     system directory is considered and this normally is
+-     `PREFIX/lib/gconv'.  The `GCONV_PATH' environment variable is
+-     examined exactly once at the first call of the `iconv_open'
+-     function.  Later modifications of the variable have no effect.
+-
+-     This function got introduced early in the X/Open Portability Guide,
+-     version 2.  It is supported by all commercial Unices as it is
+-     required for the Unix branding.  However, the quality and
+-     completeness of the implementation varies widely.  The function is
+-     declared in `iconv.h'.
+-
+-   The `iconv' implementation can associate large data structure with
+-the handle returned by `iconv_open'.  Therefore it is crucial to free
+-all the resources once all conversions are carried out and the
+-conversion is not needed anymore.
+-
+- - Function: int iconv_close (iconv_t CD)
+-     The `iconv_close' function frees all resources associated with the
+-     handle CD which must have been returned by a successful call to
+-     the `iconv_open' function.
+-
+-     If the function call was successful the return value is 0.
+-     Otherwise it is -1 and `errno' is set appropriately.  Defined
+-     error are:
+-
+-    `EBADF'
+-          The conversion descriptor is invalid.
+-
+-     This function was introduced together with the rest of the `iconv'
+-     functions in XPG2 and it is declared in `iconv.h'.
+-
+-   The standard defines only one actual conversion function.  This has
+-therefore the most general interface: it allows conversion from one
+-buffer to another.  Conversion from a file to a buffer, vice versa, or
+-even file to file can be implemented on top of it.
+-
+- - Function: size_t iconv (iconv_t CD, const char **INBUF, size_t
+-          *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)
+-     The `iconv' function converts the text in the input buffer
+-     according to the rules associated with the descriptor CD and
+-     stores the result in the output buffer.  It is possible to call the
+-     function for the same text several times in a row since for
+-     stateful character sets the necessary state information is kept in
+-     the data structures associated with the descriptor.
+-
+-     The input buffer is specified by `*INBUF' and it contains
+-     `*INBYTESLEFT' bytes.  The extra indirection is necessary for
+-     communicating the used input back to the caller (see below).  It is
+-     important to note that the buffer pointer is of type `char' and the
+-     length is measured in bytes even if the input text is encoded in
+-     wide characters.
+-
+-     The output buffer is specified in a similar way.  `*OUTBUF' points
+-     to the beginning of the buffer with at least `*OUTBYTESLEFT' bytes
+-     room for the result.  The buffer pointer again is of type `char'
+-     and the length is measured in bytes.  If OUTBUF or `*OUTBUF' is a
+-     null pointer the conversion is performed but no output is
+-     available.
+-
+-     If INBUF is a null pointer the `iconv' function performs the
+-     necessary action to put the state of the conversion into the
+-     initial state.  This is obviously a no-op for non-stateful
+-     encodings, but if the encoding has a state such a function call
+-     might put some byte sequences in the output buffer which perform
+-     the necessary state changes.  The next call with INBUF not being a
+-     null pointer then simply goes on from the initial state.  It is
+-     important that the programmer never makes any assumption on
+-     whether the conversion has to deal with states or not.  Even if
+-     the input and output character sets are not stateful the
+-     implementation might still have to keep states.  This is due to the
+-     implementation chosen for the GNU C library as it is described
+-     below.  Therefore an `iconv' call to reset the state should always
+-     be performed if some protocol requires this for the output text.
+-
+-     The conversion stops for three reasons.  The first is that all
+-     characters from the input buffer are converted.  This actually can
+-     mean two things: really all bytes from the input buffer are
+-     consumed or there are some bytes at the end of the buffer which
+-     possibly can form a complete character but the input is
+-     incomplete.  The second reason for a stop is when the output
+-     buffer is full.  And the third reason is that the input contains
+-     invalid characters.
+-
+-     In all these cases the buffer pointers after the last successful
+-     conversion, for input and output buffer, are stored in INBUF and
+-     OUTBUF and the available room in each buffer is stored in
+-     INBYTESLEFT and OUTBYTESLEFT.
+-
+-     Since the character sets selected in the `iconv_open' call can be
+-     almost arbitrary there can be situations where the input buffer
+-     contains valid characters which have no identical representation
+-     in the output character set.  The behavior in this situation is
+-     undefined.  The *current* behavior of the GNU C library in this
+-     situation is to return with an error immediately.  This certainly
+-     is not the most desirable solution.  Therefore future versions
+-     will provide better ones but they are not yet finished.
+-
+-     If all input from the input buffer is successfully converted and
+-     stored in the output buffer the function returns the number of
+-     conversions performed.  In all other cases the return value is
+-     `(size_t) -1' and `errno' is set appropriately.  In this case the
+-     value pointed to by INBYTESLEFT is nonzero.
+-
+-    `EILSEQ'
+-          The conversion stopped because of an invalid byte sequence in
+-          the input.  After the call `*INBUF' points at the first byte
+-          of the invalid byte sequence.
+-
+-    `E2BIG'
+-          The conversion stopped because it ran out of space in the
+-          output buffer.
+-
+-    `EINVAL'
+-          The conversion stopped because of an incomplete byte sequence
+-          at the end of the input buffer.
+-
+-    `EBADF'
+-          The CD argument is invalid.
+-
+-     This function was introduced in the XPG2 standard and is declared
+-     in the `iconv.h' header.
+-
+-   The definition of the `iconv' function is quite good overall.  It
+-provides quite flexible functionality.  The only problems lie in the
+-boundary cases which are incomplete byte sequences at the end of the
+-input buffer and invalid input.  A third problem, which is not really a
+-design problem, is the way conversions are selected.  The standard does
+-not say anything about the legitimate names, a minimal set of available
+-conversions.  We will see how this negatively impacts other
+-implementations, as is demonstrated below.
+-
+-
+-File: libc.info,  Node: iconv Examples,  Next: Other iconv Implementations,  Prev: Generic Conversion Interface,  Up: Generic Charset Conversion
+-
+-A complete `iconv' example
+---------------------------
+-
+-   The example below features a solution for a common problem.  Given
+-that one knows the internal encoding used by the system for `wchar_t'
+-strings one often is in the position to read text from a file and store
+-it in wide character buffers.  One can do this using `mbsrtowcs' but
+-then we run into the problems discussed above.
+-
+-     int
+-     file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail)
+-     {
+-       char inbuf[BUFSIZ];
+-       size_t insize = 0;
+-       char *wrptr = (char *) outbuf;
+-       int result = 0;
+-       iconv_t cd;
+-     
+-       cd = iconv_open ("UCS4", charset);
+-       if (cd == (iconv_t) -1)
+-         {
+-           /* Something went wrong.  */
+-           if (errno == EINVAL)
+-             error (0, 0, "conversion from `%s' to `UCS4' no available",
+-                    charset);
+-           else
+-             perror ("iconv_open");
+-     
+-           /* Terminate the output string.  */
+-           *outbuf = L'\0';
+-     
+-           return -1;
+-         }
+-     
+-       while (avail > 0)
+-         {
+-           size_t nread;
+-           size_t nconv;
+-           char *inptr = inbuf;
+-     
+-           /* Read more input.  */
+-           nread = read (fd, inbuf + insize, sizeof (inbuf) - insize);
+-           if (nread == 0)
+-             {
+-               /* When we come here the file is completely read.
+-                  This still could mean there are some unused
+-                  characters in the `inbuf'.  Put them back.  */
+-               if (lseek (fd, -insize, SEEK_CUR) == -1)
+-                 result = -1;
+-               break;
+-             }
+-           insize += nread;
+-     
+-           /* Do the conversion.  */
+-           nconv = iconv (cd, &inptr, &insize, &wrptr, &avail);
+-           if (nconv == (size_t) -1)
+-             {
+-               /* Not everything went right.  It might only be
+-                  an unfinished byte sequence at the end of the
+-                  buffer.  Or it is a real problem.  */
+-               if (errno == EINVAL)
+-                 /* This is harmless.  Simply move the unused
+-                    bytes to the beginning of the buffer so that
+-                    they can be used in the next round.  */
+-                 memmove (inbuf, inptr, insize);
+-               else
+-                 {
+-                   /* It is a real problem.  Maybe we ran out of
+-                      space in the output buffer or we have invalid
+-                      input.  In any case back the file pointer to
+-                      the position of the last processed byte.  */
+-                   lseek (fd, -insize, SEEK_CUR);
+-                   result = -1;
+-                   break;
+-                 }
+-             }
+-         }
+-     
+-       /* Terminate the output string.  */
+-       *((wchar_t *) wrptr) = L'\0';
+-     
+-       if (iconv_close (cd) != 0)
+-         perror ("iconv_close");
+-     
+-       return (wchar_t *) wrptr - outbuf;
+-     }
+-
+-   This example shows the most important aspects of using the `iconv'
+-functions.  It shows how successive calls to `iconv' can be used to
+-convert large amounts of text.  The user does not have to care about
+-stateful encodings as the functions take care of everything.
+-
+-   An interesting point is the case where `iconv' return an error and
+-`errno' is set to `EINVAL'.  This is not really an error in the
+-transformation.  It can happen whenever the input character set
+-contains byte sequences of more than one byte for some character and
+-texts are not processed in one piece.  In this case there is a chance
+-that a multibyte sequence is cut.  The caller than can simply read the
+-remainder of the takes and feed the offending bytes together with new
+-character from the input to `iconv' and continue the work.  The
+-internal state kept in the descriptor is *not* unspecified after such
+-an event as it is the case with the conversion functions from the ISO C
+-standard.
+-
+-   The example also shows the problem of using wide character strings
+-with `iconv'.  As explained in the description of the `iconv' function
+-above the function always takes a pointer to a `char' array and the
+-available space is measured in bytes.  In the example the output buffer
+-is a wide character buffer.  Therefore we use a local variable WRPTR of
+-type `char *' which is used in the `iconv' calls.
+-
+-   This looks rather innocent but can lead to problems on platforms
+-which have tight restriction on alignment.  Therefore the caller of
+-`iconv' has to make sure that the pointers passed are suitable for
+-access of characters from the appropriate character set.  Since in the
+-above case the input parameter to the function is a `wchar_t' pointer
+-this is the case (unless the user violates alignment when computing the
+-parameter).  But in other situations, especially when writing generic
+-functions where one does not know what type of character set one uses
+-and therefore treats text as a sequence of bytes, it might become
+-tricky.
+-
+-
+-File: libc.info,  Node: Other iconv Implementations,  Next: glibc iconv Implementation,  Prev: iconv Examples,  Up: Generic Charset Conversion
+-
+-Some Details about other `iconv' Implementations
+-------------------------------------------------
+-
+-   This is not really the place to discuss the `iconv' implementation
+-of other systems but it is necessary to know a bit about them to write
+-portable programs.  The above mentioned problems with the specification
+-of the `iconv' functions can lead to portability issues.
+-
+-   The first thing to notice is that due to the large number of
+-character sets in use it is certainly not practical to encode the
+-conversions directly in the C library.  Therefore the conversion
+-information must come from files outside the C library.  This is
+-usually done in one or both of the following ways:
+-
+-   * The C library contains a set of generic conversion functions which
+-     can read the needed conversion tables and other information from
+-     data files.  These files get loaded when necessary.
+-
+-     This solution is problematic as it requires a great deal of effort
+-     to apply to all character sets (potentially an infinite set).  The
+-     differences in the structure of the different character sets is so
+-     large that many different variants of the table processing
+-     functions must be developed.  On top of this the generic nature of
+-     these functions make them slower than specifically implemented
+-     functions.
+-
+-   * The C library only contains a framework which can dynamically load
+-     object files and execute the therein contained conversion
+-     functions.
+-
+-     This solution provides much more flexibility.  The C library itself
+-     contains only very little code and therefore reduces the general
+-     memory footprint.  Also, with a documented interface between the C
+-     library and the loadable modules it is possible for third parties
+-     to extend the set of available conversion modules.  A drawback of
+-     this solution is that dynamic loading must be available.
+-
+-   Some implementations in commercial Unices implement a mixture of
+-these these possibilities, the majority only the second solution.  Using
+-loadable modules moves the code out of the library itself and keeps the
+-door open for extensions and improvements.  But this design is also
+-limiting on some platforms since not many platforms support dynamic
+-loading in statically linked programs.  On platforms without his
+-capability it is therefore not possible to use this interface in
+-statically linked programs.  The GNU C library has on ELF platforms no
+-problems with dynamic loading in in these situations and therefore this
+-point is mood.  The danger is that one gets acquainted with this and
+-forgets about the restrictions on other systems.
+-
+-   A second thing to know about other `iconv' implementations is that
+-the number of available conversions is often very limited.  Some
+-implementations provide in the standard release (not special
+-international or developer releases) at most 100 to 200 conversion
+-possibilities.  This does not mean 200 different character sets are
+-supported.  E.g., conversions from one character set to a set of, say,
+-10 others counts as 10 conversion.  Together with the other direction
+-this makes already 20.  One can imagine the thin coverage these platform
+-provide.  Some Unix vendors even provide only a handful of conversions
+-which renders them useless for almost all uses.
+-
+-   This directly leads to a third and probably the most problematic
+-point.  The way the `iconv' conversion functions are implemented on all
+-known Unix system and the availability of the conversion functions from
+-character set A to B and the conversion from B to C does *not* imply
+-that the conversion from A to C is available.
+-
+-   This might not seem unreasonable and problematic at first but it is a
+-quite big problem as one will notice shortly after hitting it.  To show
+-the problem we assume to write a program which has to convert from A to
+-C.  A call like
+-
+-     cd = iconv_open ("C", "A");
+-
+-does fail according to the assumption above.  But what does the program
+-do now?  The conversion is really necessary and therefore simply giving
+-up is no possibility.
+-
+-   This is a nuisance.  The `iconv' function should take care of this.
+-But how should the program proceed from here on?  If it would try to
+-convert to character set B first the two `iconv_open' calls
+-
+-     cd1 = iconv_open ("B", "A");
+-
+-and
+-
+-     cd2 = iconv_open ("C", "B");
+-
+-will succeed but how to find B?
+-
+-   Unfortunately, the answer is: there is no general solution.  On some
+-systems guessing might help.  On those systems most character sets can
+-convert to and from UTF8 encoded ISO 10646 or Unicode text.  Beside
+-this only some very system-specific methods can help.  Since the
+-conversion functions come from loadable modules and these modules must
+-be stored somewhere in the filesystem, one *could* try to find them and
+-determine from the available file which conversions are available and
+-whether there is an indirect route from A to C.
+-
+-   This shows one of the design errors of `iconv' mentioned above.  It
+-should at least be possible to determine the list of available
+-conversion programmatically so that if `iconv_open' says there is no
+-such conversion, one could make sure this also is true for indirect
+-routes.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.info-9 glibc-2.1.3/manual/libc.info-9
+--- ../glibc-2.1.3/manual/libc.info-9	2000-01-05 19:18:25.000000000 -0800
++++ glibc-2.1.3/manual/libc.info-9	1969-12-31 16:00:00.000000000 -0800
+@@ -1,1029 +0,0 @@
+-This is Info file libc.info, produced by Makeinfo version 1.68 from the
+-input file libc.texinfo.
+-
+-INFO-DIR-SECTION GNU libraries
+-START-INFO-DIR-ENTRY
+-* Libc: (libc).                 C library.
+-END-INFO-DIR-ENTRY
+-
+-   This file documents the GNU C library.
+-
+-   This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C
+-Library Reference Manual', for Version 2.1 Beta.
+-
+-   Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software
+-Foundation, Inc.
+-
+-   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.
+-
+-   Permission is granted to copy and distribute modified versions of
+-this manual under the conditions for verbatim copying, provided also
+-that the section entitled "GNU Library General Public License" is
+-included exactly as in the original, and provided that the entire
+-resulting derived work is distributed under the terms of a permission
+-notice identical to this one.
+-
+-   Permission is granted to copy and distribute translations of this
+-manual into another language, under the above conditions for modified
+-versions, except that the text of the translation of the section
+-entitled "GNU Library General Public License" must be approved for
+-accuracy by the Foundation.
+-
+-
+-File: libc.info,  Node: glibc iconv Implementation,  Prev: Other iconv Implementations,  Up: Generic Charset Conversion
+-
+-The `iconv' Implementation in the GNU C library
+------------------------------------------------
+-
+-   After reading about the problems of `iconv' implementations in the
+-last section it is certainly good to note that the implementation in
+-the GNU C library has none of the problems mentioned above.  What
+-follows is a step-by-step analysis of the points raised above.  The
+-evaluation is based on the current state of the development (as of
+-January 1999).  The development of the `iconv' functions is not
+-complete, but basic funtionality has solidified.
+-
+-   The GNU C library's `iconv' implementation uses shared loadable
+-modules to implement the conversions.  A very small number of
+-conversions are built into the library itself but these are only rather
+-trivial conversions.
+-
+-   All the benefits of loadable modules are available in the GNU C
+-library implementation.  This is especially appealing since the
+-interface is well documented (see below) and it therefore is easy to
+-write new conversion modules.  The drawback of using loadable objects
+-is not a problem in the GNU C library, at least on ELF systems.  Since
+-the library is able to load shared objects even in statically linked
+-binaries this means that static linking needs not to be forbidden in
+-case one wants to use `iconv'.
+-
+-   The second mentioned problem is the number of supported conversions.
+-Currently, the GNU C library supports more than 150 character sets.  The
+-way the implementation is designed the number of supported conversions
+-is greater than 22350 (150 times 149).  If any conversion from or to a
+-character set is missing it can easily be added.
+-
+-   Particularly impressive as it may be, this high number is due to the
+-fact that the GNU C library implementation of `iconv' does not have the
+-third problem mentioned above.  I.e., whenever there is a conversion
+-from a character set A to B and from B to C it is always possible to
+-convert from A to C directly.  If the `iconv_open' returns an error and
+-sets `errno' to `EINVAL' this really means there is no known way,
+-directly or indirectly, to perform the wanted conversion.
+-
+-   This is achieved by providing for each character set a conversion
+-from and to UCS4 encoded ISO 10646.  Using ISO 10646 as an intermediate
+-representation it is possible to "triangulate", i.e., converting with
+-an intermediate representation.
+-
+-   There is no inherent requirement to provide a conversion to
+-ISO 10646 for a new character set and it is also possible to provide
+-other conversions where neither source nor destination character set is
+-ISO 10646.  The currently existing set of conversions is simply meant to
+-cover all conversions which might be of interest.
+-
+-   All currently available conversions use the triangulation method
+-above, making conversion run unnecessarily slow.  If, e.g., somebody
+-often needs the conversion from ISO-2022-JP to EUC-JP, a quicker
+-solution would involve direct conversion between the two character
+-sets, skipping the input to ISO 10646 first.  The two character sets of
+-interest are much more similar to each other than to ISO 10646.
+-
+-   In such a situation one can easy write a new conversion and provide
+-it as a better alternative.  The GNU C library `iconv' implementation
+-would automatically use the module implementing the conversion if it is
+-specified to be more efficient.
+-
+-Format of `gconv-modules' files
+-...............................
+-
+-   All information about the available conversions comes from a file
+-named `gconv-modules' which can be found in any of the directories along
+-the `GCONV_PATH'.  The `gconv-modules' files are line-oriented text
+-files, where each of the lines has one of the following formats:
+-
+-   * If the first non-whitespace character is a `#' the line contains
+-     only comments and is ignored.
+-
+-   * Lines starting with `alias' define an alias name for a character
+-     set.  There are two more words expected on the line.  The first one
+-     defines the alias name and the second defines the original name of
+-     the character set.  The effect is that it is possible to use the
+-     alias name in the FROMSET or TOSET parameters of `iconv_open' and
+-     achieve the same result as when using the real character set name.
+-
+-     This is quite important as a character set has often many different
+-     names.  There is normally always an official name but this need not
+-     correspond to the most popular name.  Beside this many character
+-     sets have special names which are somehow constructed.  E.g., all
+-     character sets specified by the ISO have an alias of the form
+-     `ISO-IR-NNN' where NNN is the registration number.  This allows
+-     programs which know about the registration number to construct
+-     character set names and use them in `iconv_open' calls.  More on
+-     the available names and aliases follows below.
+-
+-   * Lines starting with `module' introduce an available conversion
+-     module.  These lines must contain three or four more words.
+-
+-     The first word specifies the source character set, the second word
+-     the destination character set of conversion implemented in this
+-     module.  The third word is the name of the loadable module.  The
+-     filename is constructed by appending the usual shared object
+-     suffix (normally `.so') and this file is then supposed to be found
+-     in the same directory the `gconv-modules' file is in.  The last
+-     word on the line, which is optional, is a numeric value
+-     representing the cost of the conversion.  If this word is missing
+-     a cost of 1 is assumed.  The numeric value itself does not matter
+-     that much; what counts are the relative values of the sums of
+-     costs for all possible conversion paths.  Below is a more precise
+-     description of the use of the cost value.
+-
+-   Returning to the example above where one has written a module to
+-directly convert from ISO-2022-JP to EUC-JP and back.  All what has to
+-be done is to put the new module, be its name ISO2022JP-EUCJP.so, in a
+-directory and add a file `gconv-modules' with the following content in
+-the same directory:
+-
+-     module  ISO-2022-JP//   EUC-JP//        ISO2022JP-EUCJP    1
+-     module  EUC-JP//        ISO-2022-JP//   ISO2022JP-EUCJP    1
+-
+-   To see why this is sufficient, it is necessary to understand how the
+-conversion used by `iconv' (and described in the descriptor) is
+-selected.  The approach to this problem is quite simple.
+-
+-   At the first call of the `iconv_open' function the program reads all
+-available `gconv-modules' files and builds up two tables: one
+-containing all the known aliases and another which contains the
+-information about the conversions and which shared object implements
+-them.
+-
+-Finding the conversion path in `iconv'
+-......................................
+-
+-   The set of available conversions form a directed graph with weighted
+-edges.  The weights on the edges are the costs specified in the
+-`gconv-modules' files.  The `iconv_open' function uses an algorithm
+-suitable for search for the best path in such a graph and so constructs
+-a list of conversions which must be performed in succession to get the
+-transformation from the source to the destination character set.
+-
+-   Explaining why the above `gconv-modules' files allows the `iconv'
+-implementation to resolve the specific ISO-2022-JP to EUC-JP conversion
+-module instead of the conversion coming with the library itself is
+-straighforward.  Since the later conversion takes two steps (from
+-ISO-2022-JP to ISO 10646 and then from ISO 10646 to EUC-JP) the cost is
+-1+1 = 2.  But the above `gconv-modules' file specifies that the new
+-conversion modules can perform this conversion with only the cost of 1.
+-
+-   A mysterious piece about the `gconv-modules' file above (and also
+-the file coming with the GNU C library) are the names of the character
+-sets specified in the `module' lines.  Why do almost all the names end
+-in `//'?  And this is not all: the names can actually be regular
+-expressions.  At this point of time this mystery should not be
+-revealed, unless you have the relevant spell-casting materials: ashes
+-from an original DOS 6.2 boot disk burnt in effigy, a crucifix blessed
+-by St. Emacs, assorted herbal roots from Central America, sand from
+-Cebu, etc.  Sorry!  *The part of the implementation where this is used
+-is not yet finished.  For now please simply follow the existing
+-examples.  It'll become clearer once it is. -drepper*
+-
+-   A last remark about the `gconv-modules' is about the names not
+-ending with `//'.  There often is a character set named `INTERNAL'
+-mentioned.  From the discussion above and the chosen name it should
+-have become clear that this is the name for the representation used in
+-the intermediate step of the triangulation.  We have said that this is
+-UCS4 but actually it is not quite right.  The UCS4 specification also
+-includes the specification of the byte ordering used.  Since a UCS4
+-value consists of four bytes a stored value is effected by byte
+-ordering.  The internal representation is *not* the same as UCS4 in
+-case the byte ordering of the processor (or at least the running
+-process) is not the same as the one required for UCS4.  This is done
+-for performance reasons as one does not want to perform unnecessary
+-byte-swapping operations if one is not interested in actually seeing
+-the result in UCS4.  To avoid trouble with endianess the internal
+-representation consistently is named `INTERNAL' even on big-endian
+-systems where the representations are identical.
+-
+-`iconv' module data structures
+-..............................
+-
+-   So far this section described how modules are located and considered
+-to be used.  What remains to be described is the interface of the
+-modules so that one can write new ones.  This section describes the
+-interface as it is in use in January 1999.  The interface will change
+-in future a bit but hopefully only in an upward compatible way.
+-
+-   The definitions necessary to write new modules are publically
+-available in the non-standard header `gconv.h'.  The following text will
+-therefore describe the definitions from this header file.  But first it
+-is necessary to get an overview.
+-
+-   From the perspective of the user of `iconv' the interface is quite
+-simple: the `iconv_open' function returns a handle which can be used in
+-calls to `iconv' and finally the handle is freed with a call to
+-`iconv_close'.  The problem is: the handle has to be able to represent
+-the possibly long sequences of conversion steps and also the state of
+-each conversion since the handle is all which is passed to the `iconv'
+-function.  Therefore the data structures are really the elements to
+-understanding the implementation.
+-
+-   We need two different kinds of data structures.  The first describes
+-the conversion and the second describes the state etc.  There are
+-really two type definitions like this in `gconv.h'.
+-
+- - Data type: struct gconv_step
+-     This data structure describes one conversion a module can perform.
+-     For each function in a loaded module with conversion functions
+-     there is exactly one object of this type.  This object is shared
+-     by all users of the conversion.  I.e., this object does not
+-     contain any information corresponding to an actual conversion.  It
+-     only describes the conversion itself.
+-
+-    `struct gconv_loaded_object *shlib_handle'
+-    `const char *modname'
+-    `int counter'
+-          All these elements of the structure are used internally in
+-          the C library to coordinate loading and unloading the shared.
+-          One must not expect any of the other elements be available
+-          or initialized.
+-
+-    `const char *from_name'
+-    `const char *to_name'
+-          `from_name' and `to_name' contain the names of the source and
+-          destination character sets.  They can be used to identify the
+-          actual conversion to be carried out since one module might
+-          implement conversions for more than one character set and/or
+-          direction.
+-
+-    `gconv_fct fct'
+-    `gconv_init_fct init_fct'
+-    `gconv_end_fct end_fct'
+-          These elements contain pointers to the functions in the
+-          loadable module.  The interface will be explained below.
+-
+-    `int min_needed_from'
+-    `int max_needed_from'
+-    `int min_needed_to'
+-    `int max_needed_to;'
+-          These values have to be filled in the init function of the
+-          module.  The `min_needed_from' value specifies how many bytes
+-          a character of the source character set at least needs.  The
+-          `max_needed_from' specifies the maximum value which also
+-          includes possible shift sequences.
+-
+-          The `min_needed_to' and `max_needed_to' values serve the same
+-          purpose but this time for the destination character set.
+-
+-          It is crucial that these values are accurate since otherwise
+-          the conversion functions will have problems or not work at
+-          all.
+-
+-    `int stateful'
+-          This element must also be initialized by the init function.
+-          It is nonzero if the source character set is stateful.
+-          Otherwise it is zero.
+-
+-    `void *data'
+-          This element can be used freely by the conversion functions
+-          in the module.  It can be used to communicate extra
+-          information from one call to another.  It need not be
+-          initialized if not needed at all.  If this element gets
+-          assigned a pointer to dynamically allocated memory
+-          (presumably in the init function) it has to be made sure that
+-          the end function deallocates the memory.  Otherwise the
+-          application will leak memory.
+-
+-          It is important to be aware that this data structure is
+-          shared by all users of this specification conversion and
+-          therefore the `data' element must not contain data specific
+-          to one specific use of the conversion function.
+-
+- - Data type: struct gconv_step_data
+-     This is the data structure which contains the information specific
+-     to each use of the conversion functions.
+-
+-    `char *outbuf'
+-    `char *outbufend'
+-          These elements specify the output buffer for the conversion
+-          step.  The `outbuf' element points to the beginning of the
+-          buffer and `outbufend' points to the byte following the last
+-          byte in the buffer.  The conversion function must not assume
+-          anything about the size of the buffer but it can be safely
+-          assumed the there is room for at least one complete character
+-          in the output buffer.
+-
+-          Once the conversion is finished and the conversion is the
+-          last step the `outbuf' element must be modified to point
+-          after last last byte written into the buffer to signal how
+-          much output is available.  If this conversion step is not the
+-          last one the element must not be modified.  The `outbufend'
+-          element must not be modified.
+-
+-    `int is_last'
+-          This element is nonzero if this conversion step is the last
+-          one.  This information is necessary for the recursion.  See
+-          the description of the conversion function internals below.
+-          This element must never be modified.
+-
+-    `int invocation_counter'
+-          The conversion function can use this element to see how many
+-          calls of the conversion function already happened.  Some
+-          character sets require when generating output a certain
+-          prolog and by comparing this value with zero one can find out
+-          whether it is the first call and therefore the prolog should
+-          be emitted or not.  This element must never be modified.
+-
+-    `int internal_use'
+-          This element is another one rarely used but needed in certain
+-          situations.  It got assigned a nonzero value in case the
+-          conversion functions are used to implement `mbsrtowcs' et.al.
+-          I.e., the function is not used directly through the `iconv'
+-          interface.
+-
+-          This sometimes makes a difference as it is expected that the
+-          `iconv' functions are used to translate entire texts while the
+-          `mbsrtowcs' functions are normally only used to convert single
+-          strings and might be used multiple times to convert entire
+-          texts.
+-
+-          But in this situation we would have problem complying with
+-          some rules of the character set specification.  Some
+-          character sets require a prolog which must appear exactly
+-          once for an entire text.  If a number of `mbsrtowcs' calls
+-          are used to convert the text only the first call must add the
+-          prolog.  But since there is no communication between the
+-          different calls of `mbsrtowcs' the conversion functions have
+-          no possibility to find this out.  The situation is different
+-          for sequences of `iconv' calls since the handle allows to
+-          access the needed information.
+-
+-          This element is mostly used together with
+-          `invocation_counter' in a way like this:
+-
+-               if (!data->internal_use && data->invocation_counter == 0)
+-                 /* Emit prolog.  */
+-                 ...
+-
+-          This element must never be modified.
+-
+-    `mbstate_t *statep'
+-          The `statep' element points to an object of type `mbstate_t'
+-          (*note Keeping the state::.).  The conversion of an stateful
+-          character set must use the object pointed to by this element
+-          to store information about the conversion state.  The
+-          `statep' element itself must never be modified.
+-
+-    `mbstate_t __state'
+-          This element *never* must be used directly.  It is only part
+-          of this structure to have the needed space allocated.
+-
+-`iconv' module interfaces
+-.........................
+-
+-   With the knowledge about the data structures we now can describe the
+-conversion functions itself.  To understand the interface a bit of
+-knowledge about the functionality in the C library which loads the
+-objects with the conversions is necessary.
+-
+-   It is often the case that one conversion is used more than once.
+-I.e., there are several `iconv_open' calls for the same set of character
+-sets during one program run.  The `mbsrtowcs' et.al. functions in the
+-GNU C library also use the `iconv' functionality which increases the
+-number of uses of the same functions even more.
+-
+-   For this reason the modules do not get loaded exclusively for one
+-conversion.  Instead a module once loaded can be used by arbitrary many
+-`iconv' or `mbsrtowcs' calls at the same time.  The splitting of the
+-information between conversion function specific information and
+-conversion data makes this possible.  The last section showed the two
+-data structure used to do this.
+-
+-   This is of course also reflected in the interface and semantic of the
+-functions the modules must provide.  There are three functions which
+-must have the following names:
+-
+-`gconv_init'
+-     The `gconv_init' function initializes the conversion function
+-     specific data structure.  This very same object is shared by all
+-     conversion which use this conversion and therefore no state
+-     information about the conversion itself must be stored in here.
+-     If a module implements more than one conversion the `gconv_init'
+-     function will be called multiple times.
+-
+-`gconv_end'
+-     The `gconv_end' function is responsible to free all resources
+-     allocated by the `gconv_init' function.  If there is nothing to do
+-     this function can be missing.  Special care must be taken if the
+-     module implements more than one conversion and the `gconv_init'
+-     function does not allocate the same resources for all conversions.
+-
+-`gconv'
+-     This is the actual conversion function.  It is called to convert
+-     one block of text.  It gets passed the conversion step information
+-     initialized by `gconv_init' and the conversion data, specific to
+-     this use of the conversion functions.
+-
+-   There are three data types defined for the three module interface
+-function and these define the interface.
+-
+- - Data type: int (*gconv_init_fct) (struct gconv_step *)
+-     This specifies the interface of the initialization function of the
+-     module.  It is called exactly once for each conversion the module
+-     implements.
+-
+-     As explained int the description of the `struct gconv_step' data
+-     structure above the initialization function has to initialize
+-     parts of it.
+-
+-    `min_needed_from'
+-    `max_needed_from'
+-    `min_needed_to'
+-    `max_needed_to'
+-          These elements must be initialized to the exact numbers of
+-          the minimum and maximum number of bytes used by one character
+-          in the source and destination character set respectively.  If
+-          the characters all have the same size the minimum and maximum
+-          values are the same.
+-
+-    `stateful'
+-          This element must be initialized to an nonzero value if the
+-          source character set is stateful.  Otherwise it must be zero.
+-
+-     If the initialization function needs to communication some
+-     information to the conversion function this can happen using the
+-     `data' element of the `gconv_step' structure.  But since this data
+-     is shared by all the conversion is must not be modified by the
+-     conversion function.  How this can be used is shown in the example
+-     below.
+-
+-          #define MIN_NEEDED_FROM         1
+-          #define MAX_NEEDED_FROM         4
+-          #define MIN_NEEDED_TO           4
+-          #define MAX_NEEDED_TO           4
+-          
+-          int
+-          gconv_init (struct gconv_step *step)
+-          {
+-            /* Determine which direction.  */
+-            struct iso2022jp_data *new_data;
+-            enum direction dir = illegal_dir;
+-            enum variant var = illegal_var;
+-            int result;
+-          
+-            if (__strcasecmp (step->from_name, "ISO-2022-JP//") == 0)
+-              {
+-                dir = from_iso2022jp;
+-                var = iso2022jp;
+-              }
+-            else if (__strcasecmp (step->to_name, "ISO-2022-JP//") == 0)
+-              {
+-                dir = to_iso2022jp;
+-                var = iso2022jp;
+-              }
+-            else if (__strcasecmp (step->from_name, "ISO-2022-JP-2//") == 0)
+-              {
+-                dir = from_iso2022jp;
+-                var = iso2022jp2;
+-              }
+-            else if (__strcasecmp (step->to_name, "ISO-2022-JP-2//") == 0)
+-              {
+-                dir = to_iso2022jp;
+-                var = iso2022jp2;
+-              }
+-          
+-            result = GCONV_NOCONV;
+-            if (dir != illegal_dir)
+-              {
+-                new_data = (struct iso2022jp_data *)
+-                  malloc (sizeof (struct iso2022jp_data));
+-          
+-                result = GCONV_NOMEM;
+-                if (new_data != NULL)
+-                  {
+-                    new_data->dir = dir;
+-                    new_data->var = var;
+-                    step->data = new_data;
+-          
+-                    if (dir == from_iso2022jp)
+-          	    {
+-                        step->min_needed_from = MIN_NEEDED_FROM;
+-                        step->max_needed_from = MAX_NEEDED_FROM;
+-                        step->min_needed_to = MIN_NEEDED_TO;
+-                        step->max_needed_to = MAX_NEEDED_TO;
+-          	    }
+-                    else
+-                      {
+-                        step->min_needed_from = MIN_NEEDED_TO;
+-                        step->max_needed_from = MAX_NEEDED_TO;
+-                        step->min_needed_to = MIN_NEEDED_FROM;
+-                        step->max_needed_to = MAX_NEEDED_FROM + 2;
+-                      }
+-          
+-                    /* Yes, this is a stateful encoding.  */
+-                    step->stateful = 1;
+-          
+-                    result = GCONV_OK;
+-                  }
+-              }
+-          
+-            return result;
+-          }
+-
+-     The function first checks which conversion is wanted.  The module
+-     from which this function is taken implements four different
+-     conversion and which one is selected can be determined by
+-     comparing the names.  The comparison should always be done without
+-     paying attention to the case.
+-
+-     Then a data structure is allocated which contains the necessary
+-     information about which conversion is selected.  The data structure
+-     `struct iso2022jp_data' is locally defined since outside the module
+-     this data is not used at all.  Please note that if all four
+-     conversions this modules supports are requested there are four
+-     data blocks.
+-
+-     One interesting thing is the initialization of the `min_' and
+-     `max_' elements of the step data object.  A single ISO-2022-JP
+-     character can consist of one to four bytes.  Therefore the
+-     `MIN_NEEDED_FROM' and `MAX_NEEDED_FROM' macros are defined this
+-     way.  The output is always the `INTERNAL' character set (aka UCS4)
+-     and therefore each character consists of exactly four bytes.  For
+-     the conversion from `INTERNAL' to ISO-2022-JP we have to take into
+-     account that escape sequences might be necessary to switch the
+-     character sets.  Therefore the `max_needed_to' element for this
+-     direction gets assigned `MAX_NEEDED_FROM + 2'.  This takes into
+-     account the two bytes needed for the escape sequences to single
+-     the switching.  The asymmetry in the maximum values for the two
+-     directions can be explained easily: when reading ISO-2022-JP text
+-     escape sequences can be handled alone.  I.e., it is not necessary
+-     to process a real character since the effect of the escape
+-     sequence can be recorded in the state information.  The situation
+-     is different for the other direction.  Since it is in general not
+-     known which character comes next one cannot emit escape sequences
+-     to change the state in advance.  This means the escape sequences
+-     which have to be emitted together with the next character.
+-     Therefore one needs more room then only for the character itself.
+-
+-     The possible return values of the initialization function are:
+-
+-    `GCONV_OK'
+-          The initialization succeeded
+-
+-    `GCONV_NOCONV'
+-          The requested conversion is not supported in the module.
+-          This can happen if the `gconv-modules' file has errors.
+-
+-    `GCONV_NOMEM'
+-          Memory required to store additional information could not be
+-          allocated.
+-
+-   The functions called before the module is unloaded is significantly
+-easier.  It often has nothing at all to do in which case it can be left
+-out completely.
+-
+- - Data type: void (*gconv_end_fct) (struct gconv_step *)
+-     The task of this function is it to free all resources allocated in
+-     the initialization function.  Therefore only the `data' element of
+-     the object pointed to by the argument is of interest.  Continuing
+-     the example from the initialization function, the finalization
+-     function looks like this:
+-
+-          void
+-          gconv_end (struct gconv_step *data)
+-          {
+-            free (data->data);
+-          }
+-
+-   The most important function is the conversion function itself.  It
+-can get quite complicated for complex character sets.  But since this
+-is not of interest here we will only describe a possible skeleton for
+-the conversion function.
+-
+- - Data type: int (*gconv_fct) (struct gconv_step *, struct
+-          gconv_step_data *, const char **, const char *, size_t *, int)
+-     The conversion function can be called for two basic reason: to
+-     convert text or to reset the state.  From the description of the
+-     `iconv' function it can be seen why the flushing mode is
+-     necessary.  What mode is selected is determined by the sixth
+-     argument, an integer.  If it is nonzero it means that flushing is
+-     selected.
+-
+-     Common to both mode is where the output buffer can be found.  The
+-     information about this buffer is stored in the conversion step
+-     data.  A pointer to this is passed as the second argument to this
+-     function.  The description of the `struct gconv_step_data'
+-     structure has more information on this.
+-
+-     What has to be done for flushing depends on the source character
+-     set.  If it is not stateful nothing has to be done.  Otherwise the
+-     function has to emit a byte sequence to bring the state object in
+-     the initial state.  Once this all happened the other conversion
+-     modules in the chain of conversions have to get the same chance.
+-     Whether another step follows can be determined from the `is_last'
+-     element of the step data structure to which the first parameter
+-     points.
+-
+-     The more interesting mode is when actually text has to be
+-     converted.  The first step in this case is to convert as much text
+-     as possible from the input buffer and store the result in the
+-     output buffer.  The start of the input buffer is determined by the
+-     third argument which is a pointer to a pointer variable
+-     referencing the beginning of the buffer.  The fourth argument is a
+-     pointer to the byte right after the last byte in the buffer.
+-
+-     The conversion has to be performed according to the current state
+-     if the character set is stateful.  The state is stored in an
+-     object pointed to by the `statep' element of the step data (second
+-     argument).  Once either the input buffer is empty or the output
+-     buffer is full the conversion stops.  At this point the pointer
+-     variable referenced by the third parameter must point to the byte
+-     following the last processed byte.  I.e., if all of the input is
+-     consumed this pointer and the fourth parameter have the same value.
+-
+-     What now happens depends on whether this step is the last one or
+-     not.  If it is the last step the only thing which has to be done
+-     is to update the `outbuf' element of the step data structure to
+-     point after the last written byte.  This gives the caller the
+-     information on how much text is available in the output buffer.
+-     Beside this the variable pointed to by the fifth parameter, which
+-     is of type `size_t', must be incremented by the number of
+-     characters (*not bytes*) which were written in the output buffer.
+-     Then the function can return.
+-
+-     In case the step is not the last one the later conversion
+-     functions have to get a chance to do their work.  Therefore the
+-     appropriate conversion function has to be called.  The information
+-     about the functions is stored in the conversion data structures,
+-     passed as the first parameter.  This information and the step data
+-     are stored in arrays so the next element in both cases can be
+-     found by simple pointer arithmetic:
+-
+-          int
+-          gconv (struct gconv_step *step, struct gconv_step_data *data,
+-                 const char **inbuf, const char *inbufend, size_t *written,
+-                 int do_flush)
+-          {
+-            struct gconv_step *next_step = step + 1;
+-            struct gconv_step_data *next_data = data + 1;
+-            ...
+-
+-     The `next_step' pointer references the next step information and
+-     `next_data' the next data record.  The call of the next function
+-     therefore will look similar to this:
+-
+-            next_step->fct (next_step, next_data, &outerr, outbuf, written, 0)
+-
+-     But this is not yet all.  Once the function call returns the
+-     conversion function might have some more to do.  If the return
+-     value of the function is `GCONV_EMPTY_INPUT' this means there is
+-     more room in the output buffer.  Unless the input buffer is empty
+-     the conversion functions start all over again and processes the
+-     rest of the input buffer.  If the return value is not
+-     `GCONV_EMPTY_INPUT' something went wrong and we have to recover
+-     from this.
+-
+-     A requirement for the conversion function is that the input buffer
+-     pointer (the third argument) always points to the last character
+-     which was put in the converted form in the output buffer.  This is
+-     trivial true after the conversion performed in the current step.
+-     But if the conversion functions deeper down the stream stop
+-     prematurely not all characters from the output buffer are consumed
+-     and therefore the input buffer pointers must be backed of to the
+-     right position.
+-
+-     This is easy to do if the input and output character sets have a
+-     fixed width for all characters.  In this situation we can compute
+-     how many characters are left in the output buffer and therefore
+-     can correct the input buffer pointer appropriate with a similar
+-     computation.  Things are getting tricky if either character set
+-     has character represented with variable length byte sequences and
+-     it gets even more complicated if the conversion has to take care
+-     of the state.  In these cases the conversion has to be performed
+-     once again, from the known state before the initial conversion.
+-     I.e., if necessary the state of the conversion has to be reset and
+-     the conversion loop has to be executed again.  The difference now
+-     is that it is known how much input must be created and the
+-     conversion can stop before converting the first unused character.
+-     Once this is done the input buffer pointers must be updated again
+-     and the function can return.
+-
+-     One final thing should be mentioned.  If it is necessary for the
+-     conversion to know whether it is the first invocation (in case a
+-     prolog has to be emitted) the conversion function should just
+-     before returning to the caller increment the `invocation_counter'
+-     element of the step data structure.  See the description of the
+-     `struct gconv_step_data' structure above for more information on
+-     how this can be used.
+-
+-     The return value must be one of the following values:
+-
+-    `GCONV_EMPTY_INPUT'
+-          All input was consumed and there is room left in the output
+-          buffer.
+-
+-    `GCONV_OUTPUT_FULL'
+-          No more room in the output buffer.  In case this is not the
+-          last step this value is propagated down from the call of the
+-          next conversion function in the chain.
+-
+-    `GCONV_INCOMPLETE_INPUT'
+-          The input buffer is not entirely empty since it contains an
+-          incomplete character sequence.
+-
+-     The following example provides a framework for a conversion
+-     function.  In case a new conversion has to be written the holes in
+-     this implementation have to be filled and that is it.
+-
+-          int
+-          gconv (struct gconv_step *step, struct gconv_step_data *data,
+-                 const char **inbuf, const char *inbufend, size_t *written,
+-                 int do_flush)
+-          {
+-            struct gconv_step *next_step = step + 1;
+-            struct gconv_step_data *next_data = data + 1;
+-            gconv_fct fct = next_step->fct;
+-            int status;
+-          
+-            /* If the function is called with no input this means we have
+-               to reset to the initial state.  The possibly partly
+-               converted input is dropped.  */
+-            if (do_flush)
+-              {
+-                status = GCONV_OK;
+-          
+-                /* Possible emit a byte sequence which put the state object
+-                   into the initial state.  */
+-          
+-                /* Call the steps down the chain if there are any but only
+-                   if we successfully emitted the escape sequence.  */
+-                if (status == GCONV_OK && ! data->is_last)
+-                  status = fct (next_step, next_data, NULL, NULL,
+-                                written, 1);
+-              }
+-            else
+-              {
+-                /* We preserve the initial values of the pointer variables.  */
+-                const char *inptr = *inbuf;
+-                char *outbuf = data->outbuf;
+-                char *outend = data->outbufend;
+-                char *outptr;
+-          
+-                /* This variable is used to count the number of characters
+-                   we actually converted.  */
+-                size_t converted = 0;
+-          
+-                do
+-                  {
+-                    /* Remember the start value for this round.  */
+-                    inptr = *inbuf;
+-                    /* The outbuf buffer is empty.  */
+-                    outptr = outbuf;
+-          
+-                    /* For stateful encodings the state must be safe here.  */
+-          
+-                    /* Run the conversion loop.  `status' is set
+-                       appropriately afterwards.  */
+-          
+-                    /* If this is the last step leave the loop, there is
+-                       nothing we can do.  */
+-                    if (data->is_last)
+-                      {
+-                        /* Store information about how many bytes are
+-                           available.  */
+-                        data->outbuf = outbuf;
+-          
+-                       /* Remember how many characters we converted.  */
+-                       *written += converted;
+-          
+-                       break;
+-                     }
+-          
+-                    /* Write out all output which was produced.  */
+-                    if (outbuf > outptr)
+-                      {
+-                        const char *outerr = data->outbuf;
+-                        int result;
+-          
+-                        result = fct (next_step, next_data, &outerr,
+-                                      outbuf, written, 0);
+-          
+-                        if (result != GCONV_EMPTY_INPUT)
+-                          {
+-                            if (outerr != outbuf)
+-                              {
+-                                /* Reset the input buffer pointer.  We
+-                                   document here the complex case.  */
+-                                size_t nstatus;
+-          
+-                                /* Reload the pointers.  */
+-                                *inbuf = inptr;
+-                                outbuf = outptr;
+-          
+-                                /* Possibly reset the state.  */
+-          
+-                                /* Redo the conversion, but this time
+-                                   the end of the output buffer is at
+-                                   `outerr'.  */
+-                              }
+-          
+-                            /* Change the status.  */
+-                            status = result;
+-                          }
+-                        else
+-                          /* All the output is consumed, we can make
+-                              another run if everything was ok.  */
+-                          if (status == GCONV_FULL_OUTPUT)
+-                            status = GCONV_OK;
+-                     }
+-                  }
+-                while (status == GCONV_OK);
+-          
+-                /* We finished one use of this step.  */
+-                ++data->invocation_counter;
+-              }
+-          
+-            return status;
+-          }
+-
+-   This information should be sufficient to write new modules.  Anybody
+-doing so should also take a look at the available source code in the GNU
+-C library sources.  It contains many examples of working and optimized
+-modules.
+-
+-
+-File: libc.info,  Node: Locales,  Next: Message Translation,  Prev: Character Set Handling,  Up: Top
+-
+-Locales and Internationalization
+-********************************
+-
+-   Different countries and cultures have varying conventions for how to
+-communicate.  These conventions range from very simple ones, such as the
+-format for representing dates and times, to very complex ones, such as
+-the language spoken.
+-
+-   "Internationalization" of software means programming it to be able
+-to adapt to the user's favorite conventions.  In ISO C,
+-internationalization works by means of "locales".  Each locale
+-specifies a collection of conventions, one convention for each purpose.
+-The user chooses a set of conventions by specifying a locale (via
+-environment variables).
+-
+-   All programs inherit the chosen locale as part of their environment.
+-Provided the programs are written to obey the choice of locale, they
+-will follow the conventions preferred by the user.
+-
+-* Menu:
+-
+-* Effects of Locale::           Actions affected by the choice of
+-                                 locale.
+-* Choosing Locale::             How the user specifies a locale.
+-* Locale Categories::           Different purposes for which you can
+-                                 select a locale.
+-* Setting the Locale::          How a program specifies the locale
+-                                 with library functions.
+-* Standard Locales::            Locale names available on all systems.
+-* Locale Information::          How to access the information for the locale.
+-* Formatting Numbers::          A dedicated function to format numbers.
+-
+-
+-File: libc.info,  Node: Effects of Locale,  Next: Choosing Locale,  Up: Locales
+-
+-What Effects a Locale Has
+-=========================
+-
+-   Each locale specifies conventions for several purposes, including the
+-following:
+-
+-   * What multibyte character sequences are valid, and how they are
+-     interpreted (*note Character Set Handling::.).
+-
+-   * Classification of which characters in the local character set are
+-     considered alphabetic, and upper- and lower-case conversion
+-     conventions (*note Character Handling::.).
+-
+-   * The collating sequence for the local language and character set
+-     (*note Collation Functions::.).
+-
+-   * Formatting of numbers and currency amounts (*note General
+-     Numeric::.).
+-
+-   * Formatting of dates and times (*note Formatting Date and Time::.).
+-
+-   * What language to use for output, including error messages (*note
+-     Message Translation::.).
+-
+-   * What language to use for user answers to yes-or-no questions.
+-
+-   * What language to use for more complex user input.  (The C library
+-     doesn't yet help you implement this.)
+-
+-   Some aspects of adapting to the specified locale are handled
+-automatically by the library subroutines.  For example, all your program
+-needs to do in order to use the collating sequence of the chosen locale
+-is to use `strcoll' or `strxfrm' to compare strings.
+-
+-   Other aspects of locales are beyond the comprehension of the library.
+-For example, the library can't automatically translate your program's
+-output messages into other languages.  The only way you can support
+-output in the user's favorite language is to program this more or less
+-by hand.  The C library provides functions to handle translations for
+-multiple languages easily.
+-
+-   This chapter discusses the mechanism by which you can modify the
+-current locale.  The effects of the current locale on specific library
+-functions are discussed in more detail in the descriptions of those
+-functions.
+-
+-
+-File: libc.info,  Node: Choosing Locale,  Next: Locale Categories,  Prev: Effects of Locale,  Up: Locales
+-
+-Choosing a Locale
+-=================
+-
+-   The simplest way for the user to choose a locale is to set the
+-environment variable `LANG'.  This specifies a single locale to use for
+-all purposes.  For example, a user could specify a hypothetical locale
+-named `espana-castellano' to use the standard conventions of most of
+-Spain.
+-
+-   The set of locales supported depends on the operating system you are
+-using, and so do their names.  We can't make any promises about what
+-locales will exist, except for one standard locale called `C' or
+-`POSIX'.  Later we will describe how to construct locales XXX.
+-
+-   A user also has the option of specifying different locales for
+-different purposes--in effect, choosing a mixture of multiple locales.
+-
+-   For example, the user might specify the locale `espana-castellano'
+-for most purposes, but specify the locale `usa-english' for currency
+-formatting.  This might make sense if the user is a Spanish-speaking
+-American, working in Spanish, but representing monetary amounts in US
+-dollars.
+-
+-   Note that both locales `espana-castellano' and `usa-english', like
+-all locales, would include conventions for all of the purposes to which
+-locales apply.  However, the user can choose to use each locale for a
+-particular subset of those purposes.
+-
+-
+-File: libc.info,  Node: Locale Categories,  Next: Setting the Locale,  Prev: Choosing Locale,  Up: Locales
+-
+-Categories of Activities that Locales Affect
+-============================================
+-
+-   The purposes that locales serve are grouped into "categories", so
+-that a user or a program can choose the locale for each category
+-independently.  Here is a table of categories; each name is both an
+-environment variable that a user can set, and a macro name that you can
+-use as an argument to `setlocale'.
+-
+-`LC_COLLATE'
+-     This category applies to collation of strings (functions `strcoll'
+-     and `strxfrm'); see *Note Collation Functions::.
+-
+-`LC_CTYPE'
+-     This category applies to classification and conversion of
+-     characters, and to multibyte and wide characters; see *Note
+-     Character Handling::, and *Note Character Set Handling::.
+-
+-`LC_MONETARY'
+-     This category applies to formatting monetary values; see *Note
+-     General Numeric::.
+-
+-`LC_NUMERIC'
+-     This category applies to formatting numeric values that are not
+-     monetary; see *Note General Numeric::.
+-
+-`LC_TIME'
+-     This category applies to formatting date and time values; see
+-     *Note Formatting Date and Time::.
+-
+-`LC_MESSAGES'
+-     This category applies to selecting the language used in the user
+-     interface for message translation (*note The Uniforum approach::.;
+-     *note Message catalogs a la X/Open::.).
+-
+-`LC_ALL'
+-     This is not an environment variable; it is only a macro that you
+-     can use with `setlocale' to set a single locale for all purposes.
+-     Setting this environment variable overwrites all selections by the
+-     other `LC_*' variables or `LANG'.
+-
+-`LANG'
+-     If this environment variable is defined, its value specifies the
+-     locale to use for all purposes except as overridden by the
+-     variables above.
+-
+-   When developing the message translation functions it was felt that
+-the functionality provided by the variables above is not sufficient.
+-E.g., it should be possible to specify more than one locale name.  For
+-an example take a Swedish user who better speaks German than English,
+-the programs messages by default are written in English.  Then it
+-should be possible to specify that the first choice for the language is
+-Swedish, the second choice is German, and if this also fails English is
+-used.  This is possible with the variable `LANGUAGE'.  For further
+-description of this GNU extension see *Note Using gettextized
+-software::.
+-
+diff -Naur ../glibc-2.1.3/manual/libc.pg glibc-2.1.3/manual/libc.pg
+--- ../glibc-2.1.3/manual/libc.pg	2000-01-05 19:19:29.000000000 -0800
++++ glibc-2.1.3/manual/libc.pg	1969-12-31 16:00:00.000000000 -0800
+@@ -1,274 +0,0 @@
+-\entry{gcc}{2}{\code {gcc}}
+-\entry{dirent.h}{7}{\code {dirent.h}}
+-\entry{fcntl.h}{7}{\code {fcntl.h}}
+-\entry{grp.h}{7}{\code {grp.h}}
+-\entry{limits.h}{7}{\code {limits.h}}
+-\entry{pwd.h}{7}{\code {pwd.h}}
+-\entry{signal.h}{7}{\code {signal.h}}
+-\entry{sys/stat.h}{7}{\code {sys/stat.h}}
+-\entry{sys/times.h}{7}{\code {sys/times.h}}
+-\entry{termios.h}{7}{\code {termios.h}}
+-\entry{-lbsd-compat}{8}{\code {-lbsd-compat}}
+-\entry{bsd-compat}{8}{\code {bsd-compat}}
+-\entry{errno.h}{15}{\code {errno.h}}
+-\entry{errno.h}{15}{\code {errno.h}}
+-\entry{errno.h}{16}{\code {errno.h}}
+-\entry{errno.h}{16}{\code {errno.h}}
+-\entry{stdlib.h}{32}{\code {stdlib.h}}
+-\entry{stdlib.h}{34}{\code {stdlib.h}}
+-\entry{stdlib.h}{34}{\code {stdlib.h}}
+-\entry{stdlib.h}{35}{\code {stdlib.h}}
+-\entry{stdlib.h}{36}{\code {stdlib.h}}
+-\entry{malloc.h}{37}{\code {malloc.h}}
+-\entry{mcheck.h}{37}{\code {mcheck.h}}
+-\entry{malloc.h}{39}{\code {malloc.h}}
+-\entry{malloc.h}{41}{\code {malloc.h}}
+-\entry{obstack.h}{47}{\code {obstack.h}}
+-\entry{stdlib.h}{57}{\code {stdlib.h}}
+-\entry{ctype.h}{61}{\code {ctype.h}}
+-\entry{ctype.h}{61}{\code {ctype.h}}
+-\entry{ctype.h}{63}{\code {ctype.h}}
+-\entry{wctype.h}{64}{\code {wctype.h}}
+-\entry{wctype.h}{64}{\code {wctype.h}}
+-\entry{wctype.h}{64}{\code {wctype.h}}
+-\entry{wctype.h}{65}{\code {wctype.h}}
+-\entry{wctype.h}{65}{\code {wctype.h}}
+-\entry{wctype.h}{65}{\code {wctype.h}}
+-\entry{wctype.h}{65}{\code {wctype.h}}
+-\entry{wctype.h}{66}{\code {wctype.h}}
+-\entry{wctype.h}{66}{\code {wctype.h}}
+-\entry{wctype.h}{66}{\code {wctype.h}}
+-\entry{wctype.h}{66}{\code {wctype.h}}
+-\entry{wctype.h}{66}{\code {wctype.h}}
+-\entry{wctype.h}{67}{\code {wctype.h}}
+-\entry{wctype.h}{67}{\code {wctype.h}}
+-\entry{wctype.h}{68}{\code {wctype.h}}
+-\entry{wctype.h}{68}{\code {wctype.h}}
+-\entry{wctype.h}{69}{\code {wctype.h}}
+-\entry{wctype.h}{69}{\code {wctype.h}}
+-\entry{wctype.h}{69}{\code {wctype.h}}
+-\entry{string.h}{72}{\code {string.h}}
+-\entry{string.h}{73}{\code {string.h}}
+-\entry{string.h}{81}{\code {string.h}}
+-\entry{string.h}{83}{\code {string.h}}
+-\entry{string.h}{86}{\code {string.h}}
+-\entry{string.h}{88}{\code {string.h}}
+-\entry{argz.h}{93}{\code {argz.h}}
+-\entry{envz.h}{95}{\code {envz.h}}
+-\entry{wchar.h}{98}{\code {wchar.h}}
+-\entry{wchar.h}{99}{\code {wchar.h}}
+-\entry{limits.h}{102}{\code {limits.h}}
+-\entry{stdlib.h}{102}{\code {stdlib.h}}
+-\entry{wchar.h}{102}{\code {wchar.h}}
+-\entry{wchar.h}{103}{\code {wchar.h}}
+-\entry{wchar.h}{104}{\code {wchar.h}}
+-\entry{wchar.h}{105}{\code {wchar.h}}
+-\entry{wchar.h}{105}{\code {wchar.h}}
+-\entry{wchar.h}{107}{\code {wchar.h}}
+-\entry{wchar.h}{108}{\code {wchar.h}}
+-\entry{wchar.h}{110}{\code {wchar.h}}
+-\entry{wchar.h}{111}{\code {wchar.h}}
+-\entry{stdlib.h}{116}{\code {stdlib.h}}
+-\entry{iconv.h}{120}{\code {iconv.h}}
+-\entry{iconv.h}{121}{\code {iconv.h}}
+-\entry{iconv.h}{122}{\code {iconv.h}}
+-\entry{gconv.h}{129}{\code {gconv.h}}
+-\entry{locale.h}{143}{\code {locale.h}}
+-\entry{locale.h}{146}{\code {locale.h}}
+-\entry{stdlib.h}{178}{\code {stdlib.h}}
+-\entry{stdlib.h}{178}{\code {stdlib.h}}
+-\entry{fnmatch.h}{187}{\code {fnmatch.h}}
+-\entry{stdio.h}{211}{\code {stdio.h}}
+-\entry{stdio.h}{211}{\code {stdio.h}}
+-\entry{stdio.h}{212}{\code {stdio.h}}
+-\entry{stdio.h}{215}{\code {stdio.h}}
+-\entry{stdio.h}{216}{\code {stdio.h}}
+-\entry{stdio.h}{221}{\code {stdio.h}}
+-\entry{stdio.h}{230}{\code {stdio.h}}
+-\entry{stdio.h}{232}{\code {stdio.h}}
+-\entry{printf.h}{237}{\code {printf.h}}
+-\entry{printf.h}{238}{\code {printf.h}}
+-\entry{stdio.h}{249}{\code {stdio.h}}
+-\entry{stdio.h}{250}{\code {stdio.h}}
+-\entry{stdio.h}{252}{\code {stdio.h}}
+-\entry{stdio.h}{255}{\code {stdio.h}}
+-\entry{stdio.h}{257}{\code {stdio.h}}
+-\entry{stdio.h}{257}{\code {stdio.h}}
+-\entry{stdio.h}{259}{\code {stdio.h}}
+-\entry{stdio.h}{262}{\code {stdio.h}}
+-\entry{unistd.h}{271}{\code {unistd.h}}
+-\entry{fcntl.h}{271}{\code {fcntl.h}}
+-\entry{unistd.h}{275}{\code {unistd.h}}
+-\entry{stdio.h}{282}{\code {stdio.h}}
+-\entry{unistd.h}{283}{\code {unistd.h}}
+-\entry{sys/types.h}{289}{\code {sys/types.h}}
+-\entry{fcntl.h}{305}{\code {fcntl.h}}
+-\entry{unistd.h}{306}{\code {unistd.h}}
+-\entry{fcntl.h}{306}{\code {fcntl.h}}
+-\entry{fcntl.h}{307}{\code {fcntl.h}}
+-\entry{fcntl.h}{309}{\code {fcntl.h}}
+-\entry{fcntl.h}{314}{\code {fcntl.h}}
+-\entry{fcntl.h}{317}{\code {fcntl.h}}
+-\entry{cd}{319}{\code {cd}}
+-\entry{unistd.h}{319}{\code {unistd.h}}
+-\entry{dirent.h}{321}{\code {dirent.h}}
+-\entry{dirent.h}{322}{\code {dirent.h}}
+-\entry{dirent.h}{322}{\code {dirent.h}}
+-\entry{dirent.h}{324}{\code {dirent.h}}
+-\entry{unistd.h}{331}{\code {unistd.h}}
+-\entry{unistd.h}{332}{\code {unistd.h}}
+-\entry{unistd.h}{333}{\code {unistd.h}}
+-\entry{unistd.h}{334}{\code {unistd.h}}
+-\entry{stdio.h}{334}{\code {stdio.h}}
+-\entry{mkdir}{335}{\code {mkdir}}
+-\entry{sys/stat.h}{336}{\code {sys/stat.h}}
+-\entry{ls}{336}{\code {ls}}
+-\entry{sys/stat.h}{336}{\code {sys/stat.h}}
+-\entry{sys/stat.h}{342}{\code {sys/stat.h}}
+-\entry{chown}{343}{\code {chown}}
+-\entry{chgrp}{343}{\code {chgrp}}
+-\entry{unistd.h}{343}{\code {unistd.h}}
+-\entry{sys/stat.h}{344}{\code {sys/stat.h}}
+-\entry{umask}{346}{\code {umask}}
+-\entry{sys/stat.h}{346}{\code {sys/stat.h}}
+-\entry{unistd.h}{348}{\code {unistd.h}}
+-\entry{unistd.h}{349}{\code {unistd.h}}
+-\entry{time.h}{349}{\code {time.h}}
+-\entry{utime.h}{349}{\code {utime.h}}
+-\entry{sys/time.h}{350}{\code {sys/time.h}}
+-\entry{sys/stat.h}{352}{\code {sys/stat.h}}
+-\entry{stdio.h}{353}{\code {stdio.h}}
+-\entry{unistd.h}{357}{\code {unistd.h}}
+-\entry{sys/stat.h}{360}{\code {sys/stat.h}}
+-\entry{sys/socket.h}{364}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{366}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{367}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{367}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{369}{\code {sys/socket.h}}
+-\entry{sys/un.h}{370}{\code {sys/un.h}}
+-\entry{sys/socket.h}{371}{\code {sys/socket.h}}
+-\entry{netinet/in.h}{372}{\code {netinet/in.h}}
+-\entry{netinet/in.h}{375}{\code {netinet/in.h}}
+-\entry{arpa/inet.h}{376}{\code {arpa/inet.h}}
+-\entry{/etc/hosts}{377}{\code {/etc/hosts}}
+-\entry{netdb.h}{377}{\code {netdb.h}}
+-\entry{netinet/in.h}{381}{\code {netinet/in.h}}
+-\entry{/etc/services}{381}{\code {/etc/services}}
+-\entry{netdb.h}{381}{\code {netdb.h}}
+-\entry{netinet/in.h}{383}{\code {netinet/in.h}}
+-\entry{/etc/protocols}{383}{\code {/etc/protocols}}
+-\entry{netdb.h}{384}{\code {netdb.h}}
+-\entry{sys/socket.h}{386}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{387}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{387}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{392}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{393}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{394}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{401}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{406}{\code {sys/socket.h}}
+-\entry{sys/socket.h}{407}{\code {sys/socket.h}}
+-\entry{/etc/networks}{408}{\code {/etc/networks}}
+-\entry{netdb.h}{408}{\code {netdb.h}}
+-\entry{unistd.h}{411}{\code {unistd.h}}
+-\entry{termios.h}{413}{\code {termios.h}}
+-\entry{stdlib.h}{434}{\code {stdlib.h}}
+-\entry{math.h}{439}{\code {math.h}}
+-\entry{complex.h}{439}{\code {complex.h}}
+-\entry{stdlib.h}{451}{\code {stdlib.h}}
+-\entry{stdlib.h}{452}{\code {stdlib.h}}
+-\entry{math.h}{459}{\code {math.h}}
+-\entry{math.h}{468}{\code {math.h}}
+-\entry{stdlib.h}{468}{\code {stdlib.h}}
+-\entry{math.h}{469}{\code {math.h}}
+-\entry{math.h}{471}{\code {math.h}}
+-\entry{complex.h}{476}{\code {complex.h}}
+-\entry{complex.h}{477}{\code {complex.h}}
+-\entry{stdlib.h}{478}{\code {stdlib.h}}
+-\entry{stdlib.h}{480}{\code {stdlib.h}}
+-\entry{stdlib.h}{482}{\code {stdlib.h}}
+-\entry{time.h}{487}{\code {time.h}}
+-\entry{sys/times.h}{488}{\code {sys/times.h}}
+-\entry{time.h}{489}{\code {time.h}}
+-\entry{sys/time.h}{490}{\code {sys/time.h}}
+-\entry{time.h}{495}{\code {time.h}}
+-\entry{time.h}{507}{\code {time.h}}
+-\entry{/etc/localtime}{508}{\code {/etc/localtime}}
+-\entry{localtime}{508}{\code {localtime}}
+-\entry{/share/lib/zoneinfo}{509}{\code {/share/lib/zoneinfo}}
+-\entry{zoneinfo}{509}{\code {zoneinfo}}
+-\entry{sys/timex.h}{511}{\code {sys/timex.h}}
+-\entry{unistd.h}{514}{\code {unistd.h}}
+-\entry{sys/time.h}{514}{\code {sys/time.h}}
+-\entry{sys/resource.h}{517}{\code {sys/resource.h}}
+-\entry{sys/resource.h}{518}{\code {sys/resource.h}}
+-\entry{sys/resource.h}{521}{\code {sys/resource.h}}
+-\entry{setjmp.h}{524}{\code {setjmp.h}}
+-\entry{setjmp.h}{525}{\code {setjmp.h}}
+-\entry{signal.h}{529}{\code {signal.h}}
+-\entry{kill}{532}{\code {kill}}
+-\entry{string.h}{538}{\code {string.h}}
+-\entry{stdio.h}{538}{\code {stdio.h}}
+-\entry{signal.h}{538}{\code {signal.h}}
+-\entry{signal.h}{540}{\code {signal.h}}
+-\entry{signal.h}{543}{\code {signal.h}}
+-\entry{signal.h}{556}{\code {signal.h}}
+-\entry{signal.h}{557}{\code {signal.h}}
+-\entry{signal.h}{561}{\code {signal.h}}
+-\entry{signal.h}{562}{\code {signal.h}}
+-\entry{signal.h}{565}{\code {signal.h}}
+-\entry{signal.h}{572}{\code {signal.h}}
+-\entry{unistd.h}{577}{\code {unistd.h}}
+-\entry{argp.h}{584}{\code {argp.h}}
+-\entry{stdlib.h}{610}{\code {stdlib.h}}
+-\entry{stdlib.h}{614}{\code {stdlib.h}}
+-\entry{stdlib.h}{616}{\code {stdlib.h}}
+-\entry{unistd.h}{616}{\code {unistd.h}}
+-\entry{sh}{619}{\code {sh}}
+-\entry{stdlib.h}{619}{\code {stdlib.h}}
+-\entry{sys/types.h}{620}{\code {sys/types.h}}
+-\entry{unistd.h}{620}{\code {unistd.h}}
+-\entry{unistd.h}{621}{\code {unistd.h}}
+-\entry{unistd.h}{622}{\code {unistd.h}}
+-\entry{sys/wait.h}{624}{\code {sys/wait.h}}
+-\entry{sys/wait.h}{627}{\code {sys/wait.h}}
+-\entry{sys/wait.h}{627}{\code {sys/wait.h}}
+-\entry{stdio.h}{646}{\code {stdio.h}}
+-\entry{unistd.h}{646}{\code {unistd.h}}
+-\entry{sys/types.h}{646}{\code {sys/types.h}}
+-\entry{-lbsd-compat}{647}{\code {-lbsd-compat}}
+-\entry{bsd-compat}{647}{\code {bsd-compat}}
+-\entry{unistd.h}{648}{\code {unistd.h}}
+-\entry{sys/types.h}{648}{\code {sys/types.h}}
+-\entry{unistd.h}{663}{\code {unistd.h}}
+-\entry{sys/types.h}{663}{\code {sys/types.h}}
+-\entry{unistd.h}{664}{\code {unistd.h}}
+-\entry{sys/types.h}{664}{\code {sys/types.h}}
+-\entry{unistd.h}{665}{\code {unistd.h}}
+-\entry{sys/types.h}{665}{\code {sys/types.h}}
+-\entry{grp.h}{666}{\code {grp.h}}
+-\entry{stdio.h}{670}{\code {stdio.h}}
+-\entry{unistd.h}{670}{\code {unistd.h}}
+-\entry{utmp.h}{671}{\code {utmp.h}}
+-\entry{utmpx.h}{676}{\code {utmpx.h}}
+-\entry{utmp.h}{678}{\code {utmp.h}}
+-\entry{/etc/passwd}{678}{\code {/etc/passwd}}
+-\entry{pwd.h}{679}{\code {pwd.h}}
+-\entry{/etc/group}{681}{\code {/etc/group}}
+-\entry{grp.h}{682}{\code {grp.h}}
+-\entry{hostname}{689}{\code {hostname}}
+-\entry{hostid}{689}{\code {hostid}}
+-\entry{unistd.h}{689}{\code {unistd.h}}
+-\entry{sys/param.h}{689}{\code {sys/param.h}}
+-\entry{sys/utsname.h}{690}{\code {sys/utsname.h}}
+-\entry{limits.h}{697}{\code {limits.h}}
+-\entry{unistd.h}{698}{\code {unistd.h}}
+-\entry{limits.h}{709}{\code {limits.h}}
+-\entry{unistd.h}{710}{\code {unistd.h}}
+-\entry{unistd.h}{711}{\code {unistd.h}}
+-\entry{assert.h}{743}{\code {assert.h}}
+-\entry{stdarg.h}{746}{\code {stdarg.h}}
+-\entry{stdarg.h}{748}{\code {stdarg.h}}
+-\entry{varargs.h}{750}{\code {varargs.h}}
+-\entry{stddef.h}{751}{\code {stddef.h}}
+-\entry{limits.h}{752}{\code {limits.h}}
+-\entry{float.h}{755}{\code {float.h}}
+diff -Naur ../glibc-2.1.3/manual/libc.pgs glibc-2.1.3/manual/libc.pgs
+--- ../glibc-2.1.3/manual/libc.pgs	2000-01-05 19:19:03.000000000 -0800
++++ glibc-2.1.3/manual/libc.pgs	1969-12-31 16:00:00.000000000 -0800
+@@ -1,98 +0,0 @@
+-\initial {-}
+-\entry {\code {-lbsd-compat}}{8, 647}
+-\initial {/}
+-\entry {\code {/etc/group}}{681}
+-\entry {\code {/etc/hosts}}{377}
+-\entry {\code {/etc/localtime}}{508}
+-\entry {\code {/etc/networks}}{408}
+-\entry {\code {/etc/passwd}}{678}
+-\entry {\code {/etc/protocols}}{383}
+-\entry {\code {/etc/services}}{381}
+-\entry {\code {/share/lib/zoneinfo}}{509}
+-\initial {A}
+-\entry {\code {argp.h}}{584}
+-\entry {\code {argz.h}}{93}
+-\entry {\code {arpa/inet.h}}{376}
+-\entry {\code {assert.h}}{743}
+-\initial {B}
+-\entry {\code {bsd-compat}}{8, 647}
+-\initial {C}
+-\entry {\code {cd}}{319}
+-\entry {\code {chgrp}}{343}
+-\entry {\code {chown}}{343}
+-\entry {\code {complex.h}}{439, 476, 477}
+-\entry {\code {ctype.h}}{61, 63}
+-\initial {D}
+-\entry {\code {dirent.h}}{7, 321, 322, 324}
+-\initial {E}
+-\entry {\code {envz.h}}{95}
+-\entry {\code {errno.h}}{15, 16}
+-\initial {F}
+-\entry {\code {fcntl.h}}{7, 271, 305, 306, 307, 309, 314, 317}
+-\entry {\code {float.h}}{755}
+-\entry {\code {fnmatch.h}}{187}
+-\initial {G}
+-\entry {\code {gcc}}{2}
+-\entry {\code {gconv.h}}{129}
+-\entry {\code {grp.h}}{7, 666, 682}
+-\initial {H}
+-\entry {\code {hostid}}{689}
+-\entry {\code {hostname}}{689}
+-\initial {I}
+-\entry {\code {iconv.h}}{120, 121, 122}
+-\initial {K}
+-\entry {\code {kill}}{532}
+-\initial {L}
+-\entry {\code {limits.h}}{7, 102, 697, 709, 752}
+-\entry {\code {locale.h}}{143, 146}
+-\entry {\code {localtime}}{508}
+-\entry {\code {ls}}{336}
+-\initial {M}
+-\entry {\code {malloc.h}}{37, 39, 41}
+-\entry {\code {math.h}}{439, 459, 468, 469, 471}
+-\entry {\code {mcheck.h}}{37}
+-\entry {\code {mkdir}}{335}
+-\initial {N}
+-\entry {\code {netdb.h}}{377, 381, 384, 408}
+-\entry {\code {netinet/in.h}}{372, 375, 381, 383}
+-\initial {O}
+-\entry {\code {obstack.h}}{47}
+-\initial {P}
+-\entry {\code {printf.h}}{237, 238}
+-\entry {\code {pwd.h}}{7, 679}
+-\initial {S}
+-\entry {\code {setjmp.h}}{524, 525}
+-\entry {\code {sh}}{619}
+-\entry {\code {signal.h}}{7, 529, 538, 540, 543, 556, 557, 561, 562, 565, 572}
+-\entry {\code {stdarg.h}}{746, 748}
+-\entry {\code {stddef.h}}{751}
+-\entry {\code {stdio.h}}{211, 212, 215, 216, 221, 230, 232, 249, 250, 252, 255, 257, 259, 262, 282, 334, 353, 538, 646, 670}
+-\entry {\code {stdlib.h}}{32, 34, 35, 36, 57, 102, 116, 178, 434, 451, 452, 468, 478, 480, 482, 610, 614, 616, 619}
+-\entry {\code {string.h}}{72, 73, 81, 83, 86, 88, 538}
+-\entry {\code {sys/param.h}}{689}
+-\entry {\code {sys/resource.h}}{517, 518, 521}
+-\entry {\code {sys/socket.h}}{364, 366, 367, 369, 371, 386, 387, 392, 393, 394, 401, 406, 407}
+-\entry {\code {sys/stat.h}}{7, 336, 342, 344, 346, 352, 360}
+-\entry {\code {sys/time.h}}{350, 490, 514}
+-\entry {\code {sys/times.h}}{7, 488}
+-\entry {\code {sys/timex.h}}{511}
+-\entry {\code {sys/types.h}}{289, 620, 646, 648, 663, 664, 665}
+-\entry {\code {sys/un.h}}{370}
+-\entry {\code {sys/utsname.h}}{690}
+-\entry {\code {sys/wait.h}}{624, 627}
+-\initial {T}
+-\entry {\code {termios.h}}{7, 413}
+-\entry {\code {time.h}}{349, 487, 489, 495, 507}
+-\initial {U}
+-\entry {\code {umask}}{346}
+-\entry {\code {unistd.h}}{271, 275, 283, 306, 319, 331, 332, 333, 334, 343, 348, 349, 357, 411, 514, 577, 616, 620, 621, 622, 646, 648, 663, 664, 665, 670, 689, 698, 710, 711}
+-\entry {\code {utime.h}}{349}
+-\entry {\code {utmp.h}}{671, 678}
+-\entry {\code {utmpx.h}}{676}
+-\initial {V}
+-\entry {\code {varargs.h}}{750}
+-\initial {W}
+-\entry {\code {wchar.h}}{98, 99, 102, 103, 104, 105, 107, 108, 110, 111}
+-\entry {\code {wctype.h}}{64, 65, 66, 67, 68, 69}
+-\initial {Z}
+-\entry {\code {zoneinfo}}{509}
+diff -Naur ../glibc-2.1.3/manual/libc.tp glibc-2.1.3/manual/libc.tp
+--- ../glibc-2.1.3/manual/libc.tp	2000-01-05 19:19:29.000000000 -0800
++++ glibc-2.1.3/manual/libc.tp	1969-12-31 16:00:00.000000000 -0800
+@@ -1,120 +0,0 @@
+-\entry{enum mcheck{\_}status}{38}{\code {enum mcheck_status}}
+-\entry{struct mallinfo}{41}{\code {struct mallinfo}}
+-\entry{struct obstack}{47}{\code {struct obstack}}
+-\entry{wctype{\_}t}{64}{\code {wctype_t}}
+-\entry{wctrans{\_}t}{68}{\code {wctrans_t}}
+-\entry{wchar{\_}t}{97}{\code {wchar_t}}
+-\entry{wint{\_}t}{98}{\code {wint_t}}
+-\entry{mbstate{\_}t}{102}{\code {mbstate_t}}
+-\entry{iconv{\_}t}{119}{\code {iconv_t}}
+-\entry{struct gconv{\_}step}{129}{\code {struct gconv_step}}
+-\entry{struct gconv{\_}step{\_}data}{130}{\code {struct gconv_step_data}}
+-\entry{struct lconv}{146}{\code {struct lconv}}
+-\entry{comparison{\_}fn{\_}t}{177}{\code {comparison_fn_t}}
+-\entry{struct ENTRY}{183}{\code {struct ENTRY}}
+-\entry{VISIT}{185}{\code {VISIT}}
+-\entry{glob{\_}t}{188}{\code {glob_t}}
+-\entry{regex{\_}t}{193}{\code {regex_t}}
+-\entry{regmatch{\_}t}{196}{\code {regmatch_t}}
+-\entry{regoff{\_}t}{196}{\code {regoff_t}}
+-\entry{wordexp{\_}t}{199}{\code {wordexp_t}}
+-\entry{FILE}{211}{\code {FILE}}
+-\entry{struct printf{\_}info}{238}{\code {struct printf_info}}
+-\entry{printf{\_}function}{239}{\code {printf_function}}
+-\entry{printf{\_}arginfo{\_}function}{240}{\code {printf_arginfo_function}}
+-\entry{fpos{\_}t}{255}{\code {fpos_t}}
+-\entry{fpos64{\_}t}{255}{\code {fpos64_t}}
+-\entry{cookie{\_}io{\_}functions{\_}t}{263}{\code {cookie_io_functions_t}}
+-\entry{cookie{\_}read{\_}function}{264}{\code {cookie_read_function}}
+-\entry{cookie{\_}write{\_}function}{264}{\code {cookie_write_function}}
+-\entry{cookie{\_}seek{\_}function}{264}{\code {cookie_seek_function}}
+-\entry{cookie{\_}close{\_}function}{264}{\code {cookie_close_function}}
+-\entry{ssize{\_}t}{275}{\code {ssize_t}}
+-\entry{off{\_}t}{282}{\code {off_t}}
+-\entry{off64{\_}t}{282}{\code {off64_t}}
+-\entry{struct iovec}{285}{\code {struct iovec}}
+-\entry{fd{\_}set}{289}{\code {fd_set}}
+-\entry{struct aiocb}{293}{\code {struct aiocb}}
+-\entry{struct aiocb64}{295}{\code {struct aiocb64}}
+-\entry{struct aioinit}{304}{\code {struct aioinit}}
+-\entry{struct flock}{314}{\code {struct flock}}
+-\entry{struct dirent}{321}{\code {struct dirent}}
+-\entry{DIR}{322}{\code {DIR}}
+-\entry{{\_}{\_}ftw{\_}func{\_}t}{327}{\code {__ftw_func_t}}
+-\entry{{\_}{\_}ftw64{\_}func{\_}t}{328}{\code {__ftw64_func_t}}
+-\entry{{\_}{\_}nftw{\_}func{\_}t}{328}{\code {__nftw_func_t}}
+-\entry{{\_}{\_}nftw64{\_}func{\_}t}{328}{\code {__nftw64_func_t}}
+-\entry{struct FTW}{328}{\code {struct FTW}}
+-\entry{struct stat}{336}{\code {struct stat}}
+-\entry{struct stat64}{338}{\code {struct stat64}}
+-\entry{mode{\_}t}{339}{\code {mode_t}}
+-\entry{ino{\_}t}{339}{\code {ino_t}}
+-\entry{ino64{\_}t}{339}{\code {ino64_t}}
+-\entry{dev{\_}t}{339}{\code {dev_t}}
+-\entry{nlink{\_}t}{340}{\code {nlink_t}}
+-\entry{blkcnt{\_}t}{340}{\code {blkcnt_t}}
+-\entry{blkcnt64{\_}t}{340}{\code {blkcnt64_t}}
+-\entry{struct utimbuf}{350}{\code {struct utimbuf}}
+-\entry{struct sockaddr}{366}{\code {struct sockaddr}}
+-\entry{struct if{\_}nameindex}{368}{\code {struct if_nameindex}}
+-\entry{struct sockaddr{\_}un}{370}{\code {struct sockaddr_un}}
+-\entry{struct sockaddr{\_}in}{372}{\code {struct sockaddr_in}}
+-\entry{struct sockaddr{\_}in6}{372}{\code {struct sockaddr_in6}}
+-\entry{struct in{\_}addr}{375}{\code {struct in_addr}}
+-\entry{struct in6{\_}addr}{375}{\code {struct in6_addr}}
+-\entry{struct hostent}{377}{\code {struct hostent}}
+-\entry{struct servent}{381}{\code {struct servent}}
+-\entry{struct protoent}{384}{\code {struct protoent}}
+-\entry{struct linger}{408}{\code {struct linger}}
+-\entry{struct netent}{408}{\code {struct netent}}
+-\entry{struct termios}{413}{\code {struct termios}}
+-\entry{tcflag{\_}t}{414}{\code {tcflag_t}}
+-\entry{cc{\_}t}{414}{\code {cc_t}}
+-\entry{speed{\_}t}{424}{\code {speed_t}}
+-\entry{div{\_}t}{478}{\code {div_t}}
+-\entry{ldiv{\_}t}{478}{\code {ldiv_t}}
+-\entry{lldiv{\_}t}{479}{\code {lldiv_t}}
+-\entry{imaxdiv{\_}t}{479}{\code {imaxdiv_t}}
+-\entry{clock{\_}t}{488}{\code {clock_t}}
+-\entry{struct tms}{488}{\code {struct tms}}
+-\entry{time{\_}t}{489}{\code {time_t}}
+-\entry{struct timeval}{490}{\code {struct timeval}}
+-\entry{struct timezone}{490}{\code {struct timezone}}
+-\entry{struct tm}{492}{\code {struct tm}}
+-\entry{struct ntptimeval}{511}{\code {struct ntptimeval}}
+-\entry{struct ntptimeval}{511}{\code {struct ntptimeval}}
+-\entry{struct timex}{511}{\code {struct timex}}
+-\entry{struct timex}{511}{\code {struct timex}}
+-\entry{struct itimerval}{514}{\code {struct itimerval}}
+-\entry{struct rusage}{517}{\code {struct rusage}}
+-\entry{struct rlimit}{519}{\code {struct rlimit}}
+-\entry{struct rlimit64}{520}{\code {struct rlimit64}}
+-\entry{jmp{\_}buf}{524}{\code {jmp_buf}}
+-\entry{sigjmp{\_}buf}{525}{\code {sigjmp_buf}}
+-\entry{sighandler{\_}t}{538}{\code {sighandler_t}}
+-\entry{struct sigaction}{541}{\code {struct sigaction}}
+-\entry{sig{\_}atomic{\_}t}{554}{\code {sig_atomic_t}}
+-\entry{sigset{\_}t}{561}{\code {sigset_t}}
+-\entry{struct sigaltstack}{570}{\code {struct sigaltstack}}
+-\entry{struct sigstack}{571}{\code {struct sigstack}}
+-\entry{struct sigvec}{572}{\code {struct sigvec}}
+-\entry{struct option}{580}{\code {struct option}}
+-\entry{struct argp}{585}{\code {struct argp}}
+-\entry{struct argp{\_}option}{586}{\code {struct argp_option}}
+-\entry{struct argp{\_}state}{592}{\code {struct argp_state}}
+-\entry{struct argp{\_}child}{594}{\code {struct argp_child}}
+-\entry{pid{\_}t}{620}{\code {pid_t}}
+-\entry{union wait}{628}{\code {union wait}}
+-\entry{uid{\_}t}{663}{\code {uid_t}}
+-\entry{gid{\_}t}{663}{\code {gid_t}}
+-\entry{struct exit{\_}status}{671}{\code {struct exit_status}}
+-\entry{struct utmp}{671}{\code {struct utmp}}
+-\entry{struct utmpx}{676}{\code {struct utmpx}}
+-\entry{struct passwd}{679}{\code {struct passwd}}
+-\entry{struct group}{682}{\code {struct group}}
+-\entry{struct utsname}{690}{\code {struct utsname}}
+-\entry{struct fstab}{691}{\code {struct fstab}}
+-\entry{struct mntent}{693}{\code {struct mntent}}
+-\entry{va{\_}list}{748}{\code {va_list}}
+-\entry{ptrdiff{\_}t}{751}{\code {ptrdiff_t}}
+-\entry{size{\_}t}{751}{\code {size_t}}
+diff -Naur ../glibc-2.1.3/manual/libc.tps glibc-2.1.3/manual/libc.tps
+--- ../glibc-2.1.3/manual/libc.tps	2000-01-05 19:19:03.000000000 -0800
++++ glibc-2.1.3/manual/libc.tps	1969-12-31 16:00:00.000000000 -0800
+@@ -1,138 +0,0 @@
+-\initial {{\_}}
+-\entry {\code {__ftw_func_t}}{327}
+-\entry {\code {__ftw64_func_t}}{328}
+-\entry {\code {__nftw_func_t}}{328}
+-\entry {\code {__nftw64_func_t}}{328}
+-\initial {B}
+-\entry {\code {blkcnt_t}}{340}
+-\entry {\code {blkcnt64_t}}{340}
+-\initial {C}
+-\entry {\code {cc_t}}{414}
+-\entry {\code {clock_t}}{488}
+-\entry {\code {comparison_fn_t}}{177}
+-\entry {\code {cookie_close_function}}{264}
+-\entry {\code {cookie_io_functions_t}}{263}
+-\entry {\code {cookie_read_function}}{264}
+-\entry {\code {cookie_seek_function}}{264}
+-\entry {\code {cookie_write_function}}{264}
+-\initial {D}
+-\entry {\code {dev_t}}{339}
+-\entry {\code {DIR}}{322}
+-\entry {\code {div_t}}{478}
+-\initial {E}
+-\entry {\code {enum mcheck_status}}{38}
+-\initial {F}
+-\entry {\code {fd_set}}{289}
+-\entry {\code {FILE}}{211}
+-\entry {\code {fpos_t}}{255}
+-\entry {\code {fpos64_t}}{255}
+-\initial {G}
+-\entry {\code {gid_t}}{663}
+-\entry {\code {glob_t}}{188}
+-\initial {I}
+-\entry {\code {iconv_t}}{119}
+-\entry {\code {imaxdiv_t}}{479}
+-\entry {\code {ino_t}}{339}
+-\entry {\code {ino64_t}}{339}
+-\initial {J}
+-\entry {\code {jmp_buf}}{524}
+-\initial {L}
+-\entry {\code {ldiv_t}}{478}
+-\entry {\code {lldiv_t}}{479}
+-\initial {M}
+-\entry {\code {mbstate_t}}{102}
+-\entry {\code {mode_t}}{339}
+-\initial {N}
+-\entry {\code {nlink_t}}{340}
+-\initial {O}
+-\entry {\code {off_t}}{282}
+-\entry {\code {off64_t}}{282}
+-\initial {P}
+-\entry {\code {pid_t}}{620}
+-\entry {\code {printf_arginfo_function}}{240}
+-\entry {\code {printf_function}}{239}
+-\entry {\code {ptrdiff_t}}{751}
+-\initial {R}
+-\entry {\code {regex_t}}{193}
+-\entry {\code {regmatch_t}}{196}
+-\entry {\code {regoff_t}}{196}
+-\initial {S}
+-\entry {\code {sig_atomic_t}}{554}
+-\entry {\code {sighandler_t}}{538}
+-\entry {\code {sigjmp_buf}}{525}
+-\entry {\code {sigset_t}}{561}
+-\entry {\code {size_t}}{751}
+-\entry {\code {speed_t}}{424}
+-\entry {\code {ssize_t}}{275}
+-\entry {\code {struct aiocb}}{293}
+-\entry {\code {struct aiocb64}}{295}
+-\entry {\code {struct aioinit}}{304}
+-\entry {\code {struct argp}}{585}
+-\entry {\code {struct argp_child}}{594}
+-\entry {\code {struct argp_option}}{586}
+-\entry {\code {struct argp_state}}{592}
+-\entry {\code {struct dirent}}{321}
+-\entry {\code {struct ENTRY}}{183}
+-\entry {\code {struct exit_status}}{671}
+-\entry {\code {struct flock}}{314}
+-\entry {\code {struct fstab}}{691}
+-\entry {\code {struct FTW}}{328}
+-\entry {\code {struct gconv_step}}{129}
+-\entry {\code {struct gconv_step_data}}{130}
+-\entry {\code {struct group}}{682}
+-\entry {\code {struct hostent}}{377}
+-\entry {\code {struct if_nameindex}}{368}
+-\entry {\code {struct in_addr}}{375}
+-\entry {\code {struct in6_addr}}{375}
+-\entry {\code {struct iovec}}{285}
+-\entry {\code {struct itimerval}}{514}
+-\entry {\code {struct lconv}}{146}
+-\entry {\code {struct linger}}{408}
+-\entry {\code {struct mallinfo}}{41}
+-\entry {\code {struct mntent}}{693}
+-\entry {\code {struct netent}}{408}
+-\entry {\code {struct ntptimeval}}{511}
+-\entry {\code {struct obstack}}{47}
+-\entry {\code {struct option}}{580}
+-\entry {\code {struct passwd}}{679}
+-\entry {\code {struct printf_info}}{238}
+-\entry {\code {struct protoent}}{384}
+-\entry {\code {struct rlimit}}{519}
+-\entry {\code {struct rlimit64}}{520}
+-\entry {\code {struct rusage}}{517}
+-\entry {\code {struct servent}}{381}
+-\entry {\code {struct sigaction}}{541}
+-\entry {\code {struct sigaltstack}}{570}
+-\entry {\code {struct sigstack}}{571}
+-\entry {\code {struct sigvec}}{572}
+-\entry {\code {struct sockaddr}}{366}
+-\entry {\code {struct sockaddr_in}}{372}
+-\entry {\code {struct sockaddr_in6}}{372}
+-\entry {\code {struct sockaddr_un}}{370}
+-\entry {\code {struct stat}}{336}
+-\entry {\code {struct stat64}}{338}
+-\entry {\code {struct termios}}{413}
+-\entry {\code {struct timeval}}{490}
+-\entry {\code {struct timex}}{511}
+-\entry {\code {struct timezone}}{490}
+-\entry {\code {struct tm}}{492}
+-\entry {\code {struct tms}}{488}
+-\entry {\code {struct utimbuf}}{350}
+-\entry {\code {struct utmp}}{671}
+-\entry {\code {struct utmpx}}{676}
+-\entry {\code {struct utsname}}{690}
+-\initial {T}
+-\entry {\code {tcflag_t}}{414}
+-\entry {\code {time_t}}{489}
+-\initial {U}
+-\entry {\code {uid_t}}{663}
+-\entry {\code {union wait}}{628}
+-\initial {V}
+-\entry {\code {va_list}}{748}
+-\entry {\code {VISIT}}{185}
+-\initial {W}
+-\entry {\code {wchar_t}}{97}
+-\entry {\code {wctrans_t}}{68}
+-\entry {\code {wctype_t}}{64}
+-\entry {\code {wint_t}}{98}
+-\entry {\code {wordexp_t}}{199}
+diff -Naur ../glibc-2.1.3/manual/libc.vr glibc-2.1.3/manual/libc.vr
+--- ../glibc-2.1.3/manual/libc.vr	2000-01-05 19:19:29.000000000 -0800
++++ glibc-2.1.3/manual/libc.vr	1969-12-31 16:00:00.000000000 -0800
+@@ -1,860 +0,0 @@
+-\entry{{\_}POSIX{\_}SOURCE}{7}{\code {_POSIX_SOURCE}}
+-\entry{{\_}POSIX{\_}C{\_}SOURCE}{8}{\code {_POSIX_C_SOURCE}}
+-\entry{{\_}BSD{\_}SOURCE}{8}{\code {_BSD_SOURCE}}
+-\entry{{\_}SVID{\_}SOURCE}{8}{\code {_SVID_SOURCE}}
+-\entry{{\_}XOPEN{\_}SOURCE}{8}{\code {_XOPEN_SOURCE}}
+-\entry{{\_}XOPEN{\_}SOURCE{\_}EXTENDED}{8}{\code {_XOPEN_SOURCE_EXTENDED}}
+-\entry{{\_}LARGEFILE{\_}SOURCE}{9}{\code {_LARGEFILE_SOURCE}}
+-\entry{{\_}LARGEFILE64{\_}SOURCE}{9}{\code {_LARGEFILE64_SOURCE}}
+-\entry{{\_}FILE{\_}OFFSET{\_}BITS}{9}{\code {_FILE_OFFSET_BITS}}
+-\entry{{\_}GNU{\_}SOURCE}{10}{\code {_GNU_SOURCE}}
+-\entry{{\_}REENTRANT}{10}{\code {_REENTRANT}}
+-\entry{{\_}THREAD{\_}SAFE}{10}{\code {_THREAD_SAFE}}
+-\entry{errno}{15}{\code {errno}}
+-\entry{EPERM}{16}{\code {EPERM}}
+-\entry{ENOENT}{16}{\code {ENOENT}}
+-\entry{ESRCH}{16}{\code {ESRCH}}
+-\entry{EINTR}{16}{\code {EINTR}}
+-\entry{EIO}{16}{\code {EIO}}
+-\entry{ENXIO}{17}{\code {ENXIO}}
+-\entry{E2BIG}{17}{\code {E2BIG}}
+-\entry{ENOEXEC}{17}{\code {ENOEXEC}}
+-\entry{EBADF}{17}{\code {EBADF}}
+-\entry{ECHILD}{17}{\code {ECHILD}}
+-\entry{EDEADLK}{17}{\code {EDEADLK}}
+-\entry{ENOMEM}{17}{\code {ENOMEM}}
+-\entry{EACCES}{17}{\code {EACCES}}
+-\entry{EFAULT}{17}{\code {EFAULT}}
+-\entry{ENOTBLK}{17}{\code {ENOTBLK}}
+-\entry{EBUSY}{17}{\code {EBUSY}}
+-\entry{EEXIST}{18}{\code {EEXIST}}
+-\entry{EXDEV}{18}{\code {EXDEV}}
+-\entry{ENODEV}{18}{\code {ENODEV}}
+-\entry{ENOTDIR}{18}{\code {ENOTDIR}}
+-\entry{EISDIR}{18}{\code {EISDIR}}
+-\entry{EINVAL}{18}{\code {EINVAL}}
+-\entry{EMFILE}{18}{\code {EMFILE}}
+-\entry{ENFILE}{18}{\code {ENFILE}}
+-\entry{ENOTTY}{18}{\code {ENOTTY}}
+-\entry{ETXTBSY}{18}{\code {ETXTBSY}}
+-\entry{EFBIG}{19}{\code {EFBIG}}
+-\entry{ENOSPC}{19}{\code {ENOSPC}}
+-\entry{ESPIPE}{19}{\code {ESPIPE}}
+-\entry{EROFS}{19}{\code {EROFS}}
+-\entry{EMLINK}{19}{\code {EMLINK}}
+-\entry{EPIPE}{19}{\code {EPIPE}}
+-\entry{EDOM}{19}{\code {EDOM}}
+-\entry{ERANGE}{19}{\code {ERANGE}}
+-\entry{EAGAIN}{19}{\code {EAGAIN}}
+-\entry{EWOULDBLOCK}{20}{\code {EWOULDBLOCK}}
+-\entry{EINPROGRESS}{20}{\code {EINPROGRESS}}
+-\entry{EALREADY}{20}{\code {EALREADY}}
+-\entry{ENOTSOCK}{20}{\code {ENOTSOCK}}
+-\entry{EMSGSIZE}{20}{\code {EMSGSIZE}}
+-\entry{EPROTOTYPE}{20}{\code {EPROTOTYPE}}
+-\entry{ENOPROTOOPT}{20}{\code {ENOPROTOOPT}}
+-\entry{EPROTONOSUPPORT}{20}{\code {EPROTONOSUPPORT}}
+-\entry{ESOCKTNOSUPPORT}{20}{\code {ESOCKTNOSUPPORT}}
+-\entry{EOPNOTSUPP}{21}{\code {EOPNOTSUPP}}
+-\entry{EPFNOSUPPORT}{21}{\code {EPFNOSUPPORT}}
+-\entry{EAFNOSUPPORT}{21}{\code {EAFNOSUPPORT}}
+-\entry{EADDRINUSE}{21}{\code {EADDRINUSE}}
+-\entry{EADDRNOTAVAIL}{21}{\code {EADDRNOTAVAIL}}
+-\entry{ENETDOWN}{21}{\code {ENETDOWN}}
+-\entry{ENETUNREACH}{21}{\code {ENETUNREACH}}
+-\entry{ENETRESET}{21}{\code {ENETRESET}}
+-\entry{ECONNABORTED}{21}{\code {ECONNABORTED}}
+-\entry{ECONNRESET}{21}{\code {ECONNRESET}}
+-\entry{ENOBUFS}{21}{\code {ENOBUFS}}
+-\entry{EISCONN}{21}{\code {EISCONN}}
+-\entry{ENOTCONN}{22}{\code {ENOTCONN}}
+-\entry{EDESTADDRREQ}{22}{\code {EDESTADDRREQ}}
+-\entry{ESHUTDOWN}{22}{\code {ESHUTDOWN}}
+-\entry{ETOOMANYREFS}{22}{\code {ETOOMANYREFS}}
+-\entry{ETIMEDOUT}{22}{\code {ETIMEDOUT}}
+-\entry{ECONNREFUSED}{22}{\code {ECONNREFUSED}}
+-\entry{ELOOP}{22}{\code {ELOOP}}
+-\entry{ENAMETOOLONG}{22}{\code {ENAMETOOLONG}}
+-\entry{EHOSTDOWN}{22}{\code {EHOSTDOWN}}
+-\entry{EHOSTUNREACH}{22}{\code {EHOSTUNREACH}}
+-\entry{ENOTEMPTY}{22}{\code {ENOTEMPTY}}
+-\entry{EPROCLIM}{23}{\code {EPROCLIM}}
+-\entry{EUSERS}{23}{\code {EUSERS}}
+-\entry{EDQUOT}{23}{\code {EDQUOT}}
+-\entry{ESTALE}{23}{\code {ESTALE}}
+-\entry{EREMOTE}{23}{\code {EREMOTE}}
+-\entry{EBADRPC}{23}{\code {EBADRPC}}
+-\entry{ERPCMISMATCH}{23}{\code {ERPCMISMATCH}}
+-\entry{EPROGUNAVAIL}{23}{\code {EPROGUNAVAIL}}
+-\entry{EPROGMISMATCH}{23}{\code {EPROGMISMATCH}}
+-\entry{EPROCUNAVAIL}{23}{\code {EPROCUNAVAIL}}
+-\entry{ENOLCK}{23}{\code {ENOLCK}}
+-\entry{EFTYPE}{23}{\code {EFTYPE}}
+-\entry{EAUTH}{24}{\code {EAUTH}}
+-\entry{ENEEDAUTH}{24}{\code {ENEEDAUTH}}
+-\entry{ENOSYS}{24}{\code {ENOSYS}}
+-\entry{ENOTSUP}{24}{\code {ENOTSUP}}
+-\entry{EILSEQ}{24}{\code {EILSEQ}}
+-\entry{EBACKGROUND}{24}{\code {EBACKGROUND}}
+-\entry{EDIED}{24}{\code {EDIED}}
+-\entry{ED}{24}{\code {ED}}
+-\entry{EGREGIOUS}{24}{\code {EGREGIOUS}}
+-\entry{EIEIO}{24}{\code {EIEIO}}
+-\entry{EGRATUITOUS}{25}{\code {EGRATUITOUS}}
+-\entry{EBADMSG}{25}{\code {EBADMSG}}
+-\entry{EIDRM}{25}{\code {EIDRM}}
+-\entry{EMULTIHOP}{25}{\code {EMULTIHOP}}
+-\entry{ENODATA}{25}{\code {ENODATA}}
+-\entry{ENOLINK}{25}{\code {ENOLINK}}
+-\entry{ENOMSG}{25}{\code {ENOMSG}}
+-\entry{ENOSR}{25}{\code {ENOSR}}
+-\entry{ENOSTR}{25}{\code {ENOSTR}}
+-\entry{EOVERFLOW}{25}{\code {EOVERFLOW}}
+-\entry{EPROTO}{25}{\code {EPROTO}}
+-\entry{ETIME}{25}{\code {ETIME}}
+-\entry{ERESTART}{25}{\code {ERESTART}}
+-\entry{ECHRNG}{25}{\code {ECHRNG}}
+-\entry{EL2NSYNC}{25}{\code {EL2NSYNC}}
+-\entry{EL3HLT}{25}{\code {EL3HLT}}
+-\entry{EL3RST}{25}{\code {EL3RST}}
+-\entry{ELNRNG}{25}{\code {ELNRNG}}
+-\entry{EUNATCH}{25}{\code {EUNATCH}}
+-\entry{ENOCSI}{25}{\code {ENOCSI}}
+-\entry{EL2HLT}{25}{\code {EL2HLT}}
+-\entry{EBADE}{25}{\code {EBADE}}
+-\entry{EBADR}{25}{\code {EBADR}}
+-\entry{EXFULL}{26}{\code {EXFULL}}
+-\entry{ENOANO}{26}{\code {ENOANO}}
+-\entry{EBADRQC}{26}{\code {EBADRQC}}
+-\entry{EBADSLT}{26}{\code {EBADSLT}}
+-\entry{EDEADLOCK}{26}{\code {EDEADLOCK}}
+-\entry{EBFONT}{26}{\code {EBFONT}}
+-\entry{ENONET}{26}{\code {ENONET}}
+-\entry{ENOPKG}{26}{\code {ENOPKG}}
+-\entry{EADV}{26}{\code {EADV}}
+-\entry{ESRMNT}{26}{\code {ESRMNT}}
+-\entry{ECOMM}{26}{\code {ECOMM}}
+-\entry{EDOTDOT}{26}{\code {EDOTDOT}}
+-\entry{ENOTUNIQ}{26}{\code {ENOTUNIQ}}
+-\entry{EBADFD}{26}{\code {EBADFD}}
+-\entry{EREMCHG}{26}{\code {EREMCHG}}
+-\entry{ELIBACC}{26}{\code {ELIBACC}}
+-\entry{ELIBBAD}{26}{\code {ELIBBAD}}
+-\entry{ELIBSCN}{26}{\code {ELIBSCN}}
+-\entry{ELIBMAX}{26}{\code {ELIBMAX}}
+-\entry{ELIBEXEC}{26}{\code {ELIBEXEC}}
+-\entry{ESTRPIPE}{26}{\code {ESTRPIPE}}
+-\entry{EUCLEAN}{26}{\code {EUCLEAN}}
+-\entry{ENOTNAM}{26}{\code {ENOTNAM}}
+-\entry{ENAVAIL}{26}{\code {ENAVAIL}}
+-\entry{EISNAM}{26}{\code {EISNAM}}
+-\entry{EREMOTEIO}{26}{\code {EREMOTEIO}}
+-\entry{ENOMEDIUM}{26}{\code {ENOMEDIUM}}
+-\entry{EMEDIUMTYPE}{26}{\code {EMEDIUMTYPE}}
+-\entry{program{\_}invocation{\_}name}{28}{\code {program_invocation_name}}
+-\entry{program{\_}invocation{\_}short{\_}name}{28}{\code {program_invocation_short_name}}
+-\entry{{\_}{\_}malloc{\_}hook}{39}{\code {__malloc_hook}}
+-\entry{{\_}{\_}realloc{\_}hook}{39}{\code {__realloc_hook}}
+-\entry{{\_}{\_}free{\_}hook}{39}{\code {__free_hook}}
+-\entry{{\_}{\_}memalign{\_}hook}{39}{\code {__memalign_hook}}
+-\entry{obstack{\_}alloc{\_}failed{\_}handler}{48}{\code {obstack_alloc_failed_handler}}
+-\entry{WCHAR{\_}MIN}{98}{\code {WCHAR_MIN}}
+-\entry{WCHAR{\_}MAX}{98}{\code {WCHAR_MAX}}
+-\entry{WEOF}{98}{\code {WEOF}}
+-\entry{MB{\_}LEN{\_}MAX}{102}{\code {MB_LEN_MAX}}
+-\entry{MB{\_}CUR{\_}MAX}{102}{\code {MB_CUR_MAX}}
+-\entry{(*gconv{\_}init{\_}fct)}{132}{\code {(*gconv_init_fct)}}
+-\entry{(*gconv{\_}end{\_}fct)}{135}{\code {(*gconv_end_fct)}}
+-\entry{(*gconv{\_}fct)}{135}{\code {(*gconv_fct)}}
+-\entry{LC{\_}COLLATE}{142}{\code {LC_COLLATE}}
+-\entry{LC{\_}CTYPE}{142}{\code {LC_CTYPE}}
+-\entry{LC{\_}MONETARY}{142}{\code {LC_MONETARY}}
+-\entry{LC{\_}NUMERIC}{142}{\code {LC_NUMERIC}}
+-\entry{LC{\_}TIME}{142}{\code {LC_TIME}}
+-\entry{LC{\_}MESSAGES}{142}{\code {LC_MESSAGES}}
+-\entry{LC{\_}ALL}{143}{\code {LC_ALL}}
+-\entry{LANG}{143}{\code {LANG}}
+-\entry{LANGUAGE}{143}{\code {LANGUAGE}}
+-\entry{ABDAY{\_}1}{150}{\code {ABDAY_1}}
+-\entry{ABDAY{\_}2}{150}{\code {ABDAY_2}}
+-\entry{ABDAY{\_}3}{150}{\code {ABDAY_3}}
+-\entry{ABDAY{\_}4}{150}{\code {ABDAY_4}}
+-\entry{ABDAY{\_}5}{150}{\code {ABDAY_5}}
+-\entry{ABDAY{\_}6}{150}{\code {ABDAY_6}}
+-\entry{ABDAY{\_}7}{150}{\code {ABDAY_7}}
+-\entry{DAY{\_}1}{150}{\code {DAY_1}}
+-\entry{DAY{\_}2}{150}{\code {DAY_2}}
+-\entry{DAY{\_}3}{150}{\code {DAY_3}}
+-\entry{DAY{\_}4}{150}{\code {DAY_4}}
+-\entry{DAY{\_}5}{150}{\code {DAY_5}}
+-\entry{DAY{\_}6}{150}{\code {DAY_6}}
+-\entry{DAY{\_}7}{150}{\code {DAY_7}}
+-\entry{ABMON{\_}1}{150}{\code {ABMON_1}}
+-\entry{ABMON{\_}2}{150}{\code {ABMON_2}}
+-\entry{ABMON{\_}3}{150}{\code {ABMON_3}}
+-\entry{ABMON{\_}4}{150}{\code {ABMON_4}}
+-\entry{ABMON{\_}5}{150}{\code {ABMON_5}}
+-\entry{ABMON{\_}6}{150}{\code {ABMON_6}}
+-\entry{ABMON{\_}7}{150}{\code {ABMON_7}}
+-\entry{ABMON{\_}8}{150}{\code {ABMON_8}}
+-\entry{ABMON{\_}9}{150}{\code {ABMON_9}}
+-\entry{ABMON{\_}10}{150}{\code {ABMON_10}}
+-\entry{ABMON{\_}11}{150}{\code {ABMON_11}}
+-\entry{ABMON{\_}12}{150}{\code {ABMON_12}}
+-\entry{MON{\_}1}{150}{\code {MON_1}}
+-\entry{MON{\_}2}{151}{\code {MON_2}}
+-\entry{MON{\_}3}{151}{\code {MON_3}}
+-\entry{MON{\_}4}{151}{\code {MON_4}}
+-\entry{MON{\_}5}{151}{\code {MON_5}}
+-\entry{MON{\_}6}{151}{\code {MON_6}}
+-\entry{MON{\_}7}{151}{\code {MON_7}}
+-\entry{MON{\_}8}{151}{\code {MON_8}}
+-\entry{MON{\_}9}{151}{\code {MON_9}}
+-\entry{MON{\_}10}{151}{\code {MON_10}}
+-\entry{MON{\_}11}{151}{\code {MON_11}}
+-\entry{MON{\_}12}{151}{\code {MON_12}}
+-\entry{AM{\_}STR}{151}{\code {AM_STR}}
+-\entry{PM{\_}STR}{151}{\code {PM_STR}}
+-\entry{D{\_}T{\_}FMT}{151}{\code {D_T_FMT}}
+-\entry{D{\_}FMT}{151}{\code {D_FMT}}
+-\entry{T{\_}FMT}{151}{\code {T_FMT}}
+-\entry{T{\_}FMT{\_}AMPM}{151}{\code {T_FMT_AMPM}}
+-\entry{ERA}{151}{\code {ERA}}
+-\entry{ERA{\_}YEAR}{151}{\code {ERA_YEAR}}
+-\entry{ERA{\_}D{\_}T{\_}FMT}{152}{\code {ERA_D_T_FMT}}
+-\entry{ERA{\_}D{\_}FMT}{152}{\code {ERA_D_FMT}}
+-\entry{ERA{\_}T{\_}FMT}{152}{\code {ERA_T_FMT}}
+-\entry{ALT{\_}DIGITS}{152}{\code {ALT_DIGITS}}
+-\entry{INT{\_}CURR{\_}SYMBOL}{152}{\code {INT_CURR_SYMBOL}}
+-\entry{CURRENCY{\_}SYMBOL}{152}{\code {CURRENCY_SYMBOL}}
+-\entry{CRNCYSTR}{152}{\code {CRNCYSTR}}
+-\entry{MON{\_}DECIMAL{\_}POINT}{152}{\code {MON_DECIMAL_POINT}}
+-\entry{MON{\_}THOUSANDS{\_}SEP}{152}{\code {MON_THOUSANDS_SEP}}
+-\entry{MON{\_}GROUPING}{152}{\code {MON_GROUPING}}
+-\entry{POSITIVE{\_}SIGN}{152}{\code {POSITIVE_SIGN}}
+-\entry{NEGATIVE{\_}SIGN}{152}{\code {NEGATIVE_SIGN}}
+-\entry{INT{\_}FRAC{\_}DIGITS}{152}{\code {INT_FRAC_DIGITS}}
+-\entry{FRAC{\_}DIGITS}{153}{\code {FRAC_DIGITS}}
+-\entry{P{\_}CS{\_}PRECEDES}{153}{\code {P_CS_PRECEDES}}
+-\entry{P{\_}SEP{\_}BY{\_}SPACE}{153}{\code {P_SEP_BY_SPACE}}
+-\entry{N{\_}CS{\_}PRECEDES}{153}{\code {N_CS_PRECEDES}}
+-\entry{N{\_}SEP{\_}BY{\_}SPACE}{153}{\code {N_SEP_BY_SPACE}}
+-\entry{P{\_}SIGN{\_}POSN}{153}{\code {P_SIGN_POSN}}
+-\entry{N{\_}SIGN{\_}POSN}{153}{\code {N_SIGN_POSN}}
+-\entry{DECIMAL{\_}POINT}{153}{\code {DECIMAL_POINT}}
+-\entry{RADIXCHAR}{153}{\code {RADIXCHAR}}
+-\entry{THOUSANDS{\_}SEP}{153}{\code {THOUSANDS_SEP}}
+-\entry{THOUSEP}{153}{\code {THOUSEP}}
+-\entry{GROUPING}{153}{\code {GROUPING}}
+-\entry{YESEXPR}{153}{\code {YESEXPR}}
+-\entry{NOEXPR}{153}{\code {NOEXPR}}
+-\entry{YESSTR}{153}{\code {YESSTR}}
+-\entry{NOSTR}{154}{\code {NOSTR}}
+-\entry{stdin}{211}{\code {stdin}}
+-\entry{stdout}{211}{\code {stdout}}
+-\entry{stderr}{211}{\code {stderr}}
+-\entry{FOPEN{\_}MAX}{213}{\code {FOPEN_MAX}}
+-\entry{NL{\_}ARGMAX}{223}{\code {NL_ARGMAX}}
+-\entry{PA{\_}FLAG{\_}MASK}{234}{\code {PA_FLAG_MASK}}
+-\entry{PA{\_}INT}{234}{\code {PA_INT}}
+-\entry{PA{\_}CHAR}{234}{\code {PA_CHAR}}
+-\entry{PA{\_}STRING}{234}{\code {PA_STRING}}
+-\entry{PA{\_}POINTER}{234}{\code {PA_POINTER}}
+-\entry{PA{\_}FLOAT}{234}{\code {PA_FLOAT}}
+-\entry{PA{\_}DOUBLE}{235}{\code {PA_DOUBLE}}
+-\entry{PA{\_}LAST}{235}{\code {PA_LAST}}
+-\entry{PA{\_}FLAG{\_}PTR}{235}{\code {PA_FLAG_PTR}}
+-\entry{PA{\_}FLAG{\_}SHORT}{235}{\code {PA_FLAG_SHORT}}
+-\entry{PA{\_}FLAG{\_}LONG}{235}{\code {PA_FLAG_LONG}}
+-\entry{PA{\_}FLAG{\_}LONG{\_}LONG}{235}{\code {PA_FLAG_LONG_LONG}}
+-\entry{PA{\_}FLAG{\_}LONG{\_}DOUBLE}{235}{\code {PA_FLAG_LONG_DOUBLE}}
+-\entry{EOF}{250}{\code {EOF}}
+-\entry{SEEK{\_}SET}{254}{\code {SEEK_SET}}
+-\entry{SEEK{\_}CUR}{254}{\code {SEEK_CUR}}
+-\entry{SEEK{\_}END}{254}{\code {SEEK_END}}
+-\entry{L{\_}SET}{254}{\code {L_SET}}
+-\entry{L{\_}INCR}{254}{\code {L_INCR}}
+-\entry{L{\_}XTND}{254}{\code {L_XTND}}
+-\entry{{\_}IOFBF}{258}{\code {_IOFBF}}
+-\entry{{\_}IOLBF}{258}{\code {_IOLBF}}
+-\entry{{\_}IONBF}{258}{\code {_IONBF}}
+-\entry{BUFSIZ}{258}{\code {BUFSIZ}}
+-\entry{MM{\_}PRINT}{264}{\code {MM_PRINT}}
+-\entry{MM{\_}CONSOLE}{264}{\code {MM_CONSOLE}}
+-\entry{MM{\_}HARD}{265}{\code {MM_HARD}}
+-\entry{MM{\_}SOFT}{265}{\code {MM_SOFT}}
+-\entry{MM{\_}FIRM}{265}{\code {MM_FIRM}}
+-\entry{MM{\_}APPL}{265}{\code {MM_APPL}}
+-\entry{MM{\_}UTIL}{265}{\code {MM_UTIL}}
+-\entry{MM{\_}OPSYS}{265}{\code {MM_OPSYS}}
+-\entry{MM{\_}RECOVER}{265}{\code {MM_RECOVER}}
+-\entry{MM{\_}NRECOV}{265}{\code {MM_NRECOV}}
+-\entry{MM{\_}NULLLBL}{265}{\code {MM_NULLLBL}}
+-\entry{MM{\_}NULLSEV}{265}{\code {MM_NULLSEV}}
+-\entry{MM{\_}NULLMC}{265}{\code {MM_NULLMC}}
+-\entry{MM{\_}NULLTXT}{265}{\code {MM_NULLTXT}}
+-\entry{MM{\_}NULLACT}{266}{\code {MM_NULLACT}}
+-\entry{MM{\_}NULLTAG}{266}{\code {MM_NULLTAG}}
+-\entry{MM{\_}NOSEV}{266}{\code {MM_NOSEV}}
+-\entry{MM{\_}HALT}{266}{\code {MM_HALT}}
+-\entry{MM{\_}ERROR}{266}{\code {MM_ERROR}}
+-\entry{MM{\_}WARNING}{266}{\code {MM_WARNING}}
+-\entry{MM{\_}INFO}{266}{\code {MM_INFO}}
+-\entry{STDIN{\_}FILENO}{283}{\code {STDIN_FILENO}}
+-\entry{STDOUT{\_}FILENO}{283}{\code {STDOUT_FILENO}}
+-\entry{STDERR{\_}FILENO}{283}{\code {STDERR_FILENO}}
+-\entry{PROT{\_}READ}{286}{\code {PROT_READ}}
+-\entry{PROT{\_}WRITE}{286}{\code {PROT_WRITE}}
+-\entry{PROT{\_}EXEC}{286}{\code {PROT_EXEC}}
+-\entry{MAP{\_}PRIVATE}{286}{\code {MAP_PRIVATE}}
+-\entry{MAP{\_}SHARED}{287}{\code {MAP_SHARED}}
+-\entry{MAP{\_}FIXED}{287}{\code {MAP_FIXED}}
+-\entry{MAP{\_}ANONYMOUS}{287}{\code {MAP_ANONYMOUS}}
+-\entry{MAP{\_}ANON}{287}{\code {MAP_ANON}}
+-\entry{MS{\_}SYNC}{288}{\code {MS_SYNC}}
+-\entry{MS{\_}ASYNC}{288}{\code {MS_ASYNC}}
+-\entry{FD{\_}SETSIZE}{289}{\code {FD_SETSIZE}}
+-\entry{LIO{\_}READ}{294}{\code {LIO_READ}}
+-\entry{LIO{\_}WRITE}{294}{\code {LIO_WRITE}}
+-\entry{LIO{\_}NOP}{294}{\code {LIO_NOP}}
+-\entry{F{\_}DUPFD}{306}{\code {F_DUPFD}}
+-\entry{F{\_}GETFD}{307}{\code {F_GETFD}}
+-\entry{F{\_}SETFD}{308}{\code {F_SETFD}}
+-\entry{FD{\_}CLOEXEC}{308}{\code {FD_CLOEXEC}}
+-\entry{O{\_}RDONLY}{309}{\code {O_RDONLY}}
+-\entry{O{\_}WRONLY}{309}{\code {O_WRONLY}}
+-\entry{O{\_}RDWR}{309}{\code {O_RDWR}}
+-\entry{O{\_}READ}{309}{\code {O_READ}}
+-\entry{O{\_}WRITE}{309}{\code {O_WRITE}}
+-\entry{O{\_}EXEC}{310}{\code {O_EXEC}}
+-\entry{O{\_}ACCMODE}{310}{\code {O_ACCMODE}}
+-\entry{O{\_}CREAT}{310}{\code {O_CREAT}}
+-\entry{O{\_}EXCL}{310}{\code {O_EXCL}}
+-\entry{O{\_}NONBLOCK}{310}{\code {O_NONBLOCK}}
+-\entry{O{\_}NOCTTY}{311}{\code {O_NOCTTY}}
+-\entry{O{\_}IGNORE{\_}CTTY}{311}{\code {O_IGNORE_CTTY}}
+-\entry{O{\_}NOLINK}{311}{\code {O_NOLINK}}
+-\entry{O{\_}NOTRANS}{311}{\code {O_NOTRANS}}
+-\entry{O{\_}TRUNC}{311}{\code {O_TRUNC}}
+-\entry{O{\_}SHLOCK}{311}{\code {O_SHLOCK}}
+-\entry{O{\_}EXLOCK}{312}{\code {O_EXLOCK}}
+-\entry{O{\_}APPEND}{312}{\code {O_APPEND}}
+-\entry{O{\_}NONBLOCK}{312}{\code {O_NONBLOCK}}
+-\entry{O{\_}NDELAY}{312}{\code {O_NDELAY}}
+-\entry{O{\_}ASYNC}{312}{\code {O_ASYNC}}
+-\entry{O{\_}FSYNC}{312}{\code {O_FSYNC}}
+-\entry{O{\_}SYNC}{312}{\code {O_SYNC}}
+-\entry{O{\_}NOATIME}{313}{\code {O_NOATIME}}
+-\entry{F{\_}GETFL}{313}{\code {F_GETFL}}
+-\entry{F{\_}SETFL}{313}{\code {F_SETFL}}
+-\entry{F{\_}GETLK}{315}{\code {F_GETLK}}
+-\entry{F{\_}SETLK}{315}{\code {F_SETLK}}
+-\entry{F{\_}SETLKW}{316}{\code {F_SETLKW}}
+-\entry{F{\_}RDLCK}{316}{\code {F_RDLCK}}
+-\entry{F{\_}WRLCK}{317}{\code {F_WRLCK}}
+-\entry{F{\_}UNLCK}{317}{\code {F_UNLCK}}
+-\entry{F{\_}GETOWN}{317}{\code {F_GETOWN}}
+-\entry{F{\_}SETOWN}{317}{\code {F_SETOWN}}
+-\entry{FTW{\_}F}{327}{\code {FTW_F}}
+-\entry{FTW{\_}D}{327}{\code {FTW_D}}
+-\entry{FTW{\_}NS}{327}{\code {FTW_NS}}
+-\entry{FTW{\_}DNR}{327}{\code {FTW_DNR}}
+-\entry{FTW{\_}SL}{327}{\code {FTW_SL}}
+-\entry{FTW{\_}DP}{328}{\code {FTW_DP}}
+-\entry{FTW{\_}SLN}{328}{\code {FTW_SLN}}
+-\entry{FTW{\_}PHYS}{330}{\code {FTW_PHYS}}
+-\entry{FTW{\_}MOUNT}{330}{\code {FTW_MOUNT}}
+-\entry{FTW{\_}CHDIR}{330}{\code {FTW_CHDIR}}
+-\entry{FTW{\_}DEPTH}{330}{\code {FTW_DEPTH}}
+-\entry{S{\_}IFMT}{342}{\code {S_IFMT}}
+-\entry{S{\_}IFDIR}{342}{\code {S_IFDIR}}
+-\entry{S{\_}IFCHR}{342}{\code {S_IFCHR}}
+-\entry{S{\_}IFBLK}{342}{\code {S_IFBLK}}
+-\entry{S{\_}IFREG}{343}{\code {S_IFREG}}
+-\entry{S{\_}IFLNK}{343}{\code {S_IFLNK}}
+-\entry{S{\_}IFSOCK}{343}{\code {S_IFSOCK}}
+-\entry{S{\_}IFIFO}{343}{\code {S_IFIFO}}
+-\entry{S{\_}IRUSR}{344}{\code {S_IRUSR}}
+-\entry{S{\_}IREAD}{344}{\code {S_IREAD}}
+-\entry{S{\_}IWUSR}{344}{\code {S_IWUSR}}
+-\entry{S{\_}IWRITE}{344}{\code {S_IWRITE}}
+-\entry{S{\_}IXUSR}{344}{\code {S_IXUSR}}
+-\entry{S{\_}IEXEC}{344}{\code {S_IEXEC}}
+-\entry{S{\_}IRWXU}{344}{\code {S_IRWXU}}
+-\entry{S{\_}IRGRP}{344}{\code {S_IRGRP}}
+-\entry{S{\_}IWGRP}{344}{\code {S_IWGRP}}
+-\entry{S{\_}IXGRP}{344}{\code {S_IXGRP}}
+-\entry{S{\_}IRWXG}{344}{\code {S_IRWXG}}
+-\entry{S{\_}IROTH}{345}{\code {S_IROTH}}
+-\entry{S{\_}IWOTH}{345}{\code {S_IWOTH}}
+-\entry{S{\_}IXOTH}{345}{\code {S_IXOTH}}
+-\entry{S{\_}IRWXO}{345}{\code {S_IRWXO}}
+-\entry{S{\_}ISUID}{345}{\code {S_ISUID}}
+-\entry{S{\_}ISGID}{345}{\code {S_ISGID}}
+-\entry{S{\_}ISVTX}{345}{\code {S_ISVTX}}
+-\entry{R{\_}OK}{349}{\code {R_OK}}
+-\entry{W{\_}OK}{349}{\code {W_OK}}
+-\entry{X{\_}OK}{349}{\code {X_OK}}
+-\entry{F{\_}OK}{349}{\code {F_OK}}
+-\entry{L{\_}tmpnam}{354}{\code {L_tmpnam}}
+-\entry{TMP{\_}MAX}{354}{\code {TMP_MAX}}
+-\entry{P{\_}tmpdir}{355}{\code {P_tmpdir}}
+-\entry{SOCK{\_}STREAM}{364}{\code {SOCK_STREAM}}
+-\entry{SOCK{\_}DGRAM}{364}{\code {SOCK_DGRAM}}
+-\entry{SOCK{\_}RAW}{365}{\code {SOCK_RAW}}
+-\entry{AF{\_}LOCAL}{366}{\code {AF_LOCAL}}
+-\entry{AF{\_}UNIX}{366}{\code {AF_UNIX}}
+-\entry{AF{\_}FILE}{366}{\code {AF_FILE}}
+-\entry{AF{\_}INET}{366}{\code {AF_INET}}
+-\entry{AF{\_}UNSPEC}{366}{\code {AF_UNSPEC}}
+-\entry{IFNAMSIZ}{368}{\code {IFNAMSIZ}}
+-\entry{PF{\_}LOCAL}{369}{\code {PF_LOCAL}}
+-\entry{PF{\_}UNIX}{369}{\code {PF_UNIX}}
+-\entry{PF{\_}FILE}{369}{\code {PF_FILE}}
+-\entry{PF{\_}INET}{371}{\code {PF_INET}}
+-\entry{AF{\_}INET6}{371}{\code {AF_INET6}}
+-\entry{INADDR{\_}LOOPBACK}{375}{\code {INADDR_LOOPBACK}}
+-\entry{INADDR{\_}ANY}{375}{\code {INADDR_ANY}}
+-\entry{INADDR{\_}BROADCAST}{375}{\code {INADDR_BROADCAST}}
+-\entry{INADDR{\_}NONE}{375}{\code {INADDR_NONE}}
+-\entry{in6addr{\_}loopback}{375}{\code {in6addr_loopback}}
+-\entry{in6addr{\_}any}{375}{\code {in6addr_any}}
+-\entry{h{\_}errno}{378}{\code {h_errno}}
+-\entry{HOST{\_}NOT{\_}FOUND}{379}{\code {HOST_NOT_FOUND}}
+-\entry{TRY{\_}AGAIN}{379}{\code {TRY_AGAIN}}
+-\entry{NO{\_}RECOVERY}{379}{\code {NO_RECOVERY}}
+-\entry{NO{\_}ADDRESS}{379}{\code {NO_ADDRESS}}
+-\entry{IPPORT{\_}RESERVED}{381}{\code {IPPORT_RESERVED}}
+-\entry{IPPORT{\_}USERRESERVED}{381}{\code {IPPORT_USERRESERVED}}
+-\entry{PF{\_}NS}{386}{\code {PF_NS}}
+-\entry{PF{\_}ISO}{386}{\code {PF_ISO}}
+-\entry{PF{\_}CCITT}{386}{\code {PF_CCITT}}
+-\entry{PF{\_}IMPLINK}{386}{\code {PF_IMPLINK}}
+-\entry{PF{\_}ROUTE}{386}{\code {PF_ROUTE}}
+-\entry{MSG{\_}OOB}{394}{\code {MSG_OOB}}
+-\entry{MSG{\_}PEEK}{394}{\code {MSG_PEEK}}
+-\entry{MSG{\_}DONTROUTE}{394}{\code {MSG_DONTROUTE}}
+-\entry{SOL{\_}SOCKET}{407}{\code {SOL_SOCKET}}
+-\entry{NCCS}{414}{\code {NCCS}}
+-\entry{TCSANOW}{414}{\code {TCSANOW}}
+-\entry{TCSADRAIN}{414}{\code {TCSADRAIN}}
+-\entry{TCSAFLUSH}{414}{\code {TCSAFLUSH}}
+-\entry{TCSASOFT}{414}{\code {TCSASOFT}}
+-\entry{INPCK}{416}{\code {INPCK}}
+-\entry{IGNPAR}{416}{\code {IGNPAR}}
+-\entry{PARMRK}{417}{\code {PARMRK}}
+-\entry{ISTRIP}{417}{\code {ISTRIP}}
+-\entry{IGNBRK}{417}{\code {IGNBRK}}
+-\entry{BRKINT}{417}{\code {BRKINT}}
+-\entry{IGNCR}{417}{\code {IGNCR}}
+-\entry{ICRNL}{417}{\code {ICRNL}}
+-\entry{INLCR}{417}{\code {INLCR}}
+-\entry{IXOFF}{418}{\code {IXOFF}}
+-\entry{IXON}{418}{\code {IXON}}
+-\entry{IXANY}{418}{\code {IXANY}}
+-\entry{IMAXBEL}{418}{\code {IMAXBEL}}
+-\entry{OPOST}{418}{\code {OPOST}}
+-\entry{ONLCR}{419}{\code {ONLCR}}
+-\entry{OXTABS}{419}{\code {OXTABS}}
+-\entry{ONOEOT}{419}{\code {ONOEOT}}
+-\entry{CLOCAL}{419}{\code {CLOCAL}}
+-\entry{HUPCL}{419}{\code {HUPCL}}
+-\entry{CREAD}{419}{\code {CREAD}}
+-\entry{CSTOPB}{419}{\code {CSTOPB}}
+-\entry{PARENB}{420}{\code {PARENB}}
+-\entry{PARODD}{420}{\code {PARODD}}
+-\entry{CSIZE}{420}{\code {CSIZE}}
+-\entry{CS5}{420}{\code {CS5}}
+-\entry{CS6}{420}{\code {CS6}}
+-\entry{CS7}{420}{\code {CS7}}
+-\entry{CS8}{420}{\code {CS8}}
+-\entry{CCTS{\_}OFLOW}{420}{\code {CCTS_OFLOW}}
+-\entry{CRTS{\_}IFLOW}{420}{\code {CRTS_IFLOW}}
+-\entry{MDMBUF}{420}{\code {MDMBUF}}
+-\entry{CIGNORE}{420}{\code {CIGNORE}}
+-\entry{ICANON}{421}{\code {ICANON}}
+-\entry{ECHO}{421}{\code {ECHO}}
+-\entry{ECHOE}{421}{\code {ECHOE}}
+-\entry{ECHOPRT}{421}{\code {ECHOPRT}}
+-\entry{ECHOK}{421}{\code {ECHOK}}
+-\entry{ECHOKE}{422}{\code {ECHOKE}}
+-\entry{ECHONL}{422}{\code {ECHONL}}
+-\entry{ECHOCTL}{422}{\code {ECHOCTL}}
+-\entry{ISIG}{422}{\code {ISIG}}
+-\entry{IEXTEN}{422}{\code {IEXTEN}}
+-\entry{NOFLSH}{422}{\code {NOFLSH}}
+-\entry{TOSTOP}{422}{\code {TOSTOP}}
+-\entry{ALTWERASE}{423}{\code {ALTWERASE}}
+-\entry{FLUSHO}{423}{\code {FLUSHO}}
+-\entry{NOKERNINFO}{423}{\code {NOKERNINFO}}
+-\entry{PENDIN}{423}{\code {PENDIN}}
+-\entry{B0}{424}{\code {B0}}
+-\entry{B50}{424}{\code {B50}}
+-\entry{B75}{424}{\code {B75}}
+-\entry{B110}{424}{\code {B110}}
+-\entry{B134}{424}{\code {B134}}
+-\entry{B150}{424}{\code {B150}}
+-\entry{B200}{424}{\code {B200}}
+-\entry{B300}{424}{\code {B300}}
+-\entry{B600}{424}{\code {B600}}
+-\entry{B1200}{424}{\code {B1200}}
+-\entry{B1800}{424}{\code {B1800}}
+-\entry{B2400}{424}{\code {B2400}}
+-\entry{B4800}{424}{\code {B4800}}
+-\entry{B9600}{424}{\code {B9600}}
+-\entry{B19200}{424}{\code {B19200}}
+-\entry{B38400}{424}{\code {B38400}}
+-\entry{B57600}{424}{\code {B57600}}
+-\entry{B115200}{424}{\code {B115200}}
+-\entry{B230400}{424}{\code {B230400}}
+-\entry{B460800}{424}{\code {B460800}}
+-\entry{EXTA}{424}{\code {EXTA}}
+-\entry{EXTB}{424}{\code {EXTB}}
+-\entry{{\_}POSIX{\_}VDISABLE}{425}{\code {_POSIX_VDISABLE}}
+-\entry{VEOF}{425}{\code {VEOF}}
+-\entry{VEOL}{425}{\code {VEOL}}
+-\entry{VEOL2}{425}{\code {VEOL2}}
+-\entry{VERASE}{426}{\code {VERASE}}
+-\entry{VWERASE}{426}{\code {VWERASE}}
+-\entry{VKILL}{426}{\code {VKILL}}
+-\entry{VREPRINT}{426}{\code {VREPRINT}}
+-\entry{VINTR}{427}{\code {VINTR}}
+-\entry{VQUIT}{427}{\code {VQUIT}}
+-\entry{VSUSP}{427}{\code {VSUSP}}
+-\entry{VDSUSP}{427}{\code {VDSUSP}}
+-\entry{VSTART}{428}{\code {VSTART}}
+-\entry{VSTOP}{428}{\code {VSTOP}}
+-\entry{VLNEXT}{428}{\code {VLNEXT}}
+-\entry{VDISCARD}{428}{\code {VDISCARD}}
+-\entry{VSTATUS}{429}{\code {VSTATUS}}
+-\entry{VMIN}{429}{\code {VMIN}}
+-\entry{VTIME}{429}{\code {VTIME}}
+-\entry{TCIFLUSH}{431}{\code {TCIFLUSH}}
+-\entry{TCOFLUSH}{431}{\code {TCOFLUSH}}
+-\entry{TCIOFLUSH}{431}{\code {TCIOFLUSH}}
+-\entry{TCOOFF}{432}{\code {TCOOFF}}
+-\entry{TCOON}{432}{\code {TCOON}}
+-\entry{TCIOFF}{432}{\code {TCIOFF}}
+-\entry{TCION}{432}{\code {TCION}}
+-\entry{EBADF}{432}{\code {EBADF}}
+-\entry{ENOTTY}{432}{\code {ENOTTY}}
+-\entry{EINVAL}{432}{\code {EINVAL}}
+-\entry{M{\_}E}{439}{\code {M_E}}
+-\entry{M{\_}LOG2E}{439}{\code {M_LOG2E}}
+-\entry{M{\_}LOG10E}{439}{\code {M_LOG10E}}
+-\entry{M{\_}LN2}{439}{\code {M_LN2}}
+-\entry{M{\_}LN10}{439}{\code {M_LN10}}
+-\entry{M{\_}PI}{439}{\code {M_PI}}
+-\entry{M{\_}PI{\_}2}{439}{\code {M_PI_2}}
+-\entry{M{\_}PI{\_}4}{439}{\code {M_PI_4}}
+-\entry{M{\_}1{\_}PI}{439}{\code {M_1_PI}}
+-\entry{M{\_}2{\_}PI}{439}{\code {M_2_PI}}
+-\entry{M{\_}2{\_}SQRTPI}{439}{\code {M_2_SQRTPI}}
+-\entry{M{\_}SQRT2}{439}{\code {M_SQRT2}}
+-\entry{M{\_}SQRT1{\_}2}{439}{\code {M_SQRT1_2}}
+-\entry{PI}{440}{\code {PI}}
+-\entry{FP{\_}ILOGB0}{444}{\code {FP_ILOGB0}}
+-\entry{FP{\_}ILOGBNAN}{444}{\code {FP_ILOGBNAN}}
+-\entry{signgam}{449}{\code {signgam}}
+-\entry{RAND{\_}MAX}{452}{\code {RAND_MAX}}
+-\entry{FP{\_}NAN}{459}{\code {FP_NAN}}
+-\entry{FP{\_}INFINITE}{459}{\code {FP_INFINITE}}
+-\entry{FP{\_}ZERO}{459}{\code {FP_ZERO}}
+-\entry{FP{\_}SUBNORMAL}{460}{\code {FP_SUBNORMAL}}
+-\entry{FP{\_}NORMAL}{460}{\code {FP_NORMAL}}
+-\entry{INFINITY}{463}{\code {INFINITY}}
+-\entry{NAN}{463}{\code {NAN}}
+-\entry{FE{\_}INEXACT}{464}{\code {FE_INEXACT}}
+-\entry{FE{\_}DIVBYZERO}{464}{\code {FE_DIVBYZERO}}
+-\entry{FE{\_}UNDERFLOW}{464}{\code {FE_UNDERFLOW}}
+-\entry{FE{\_}OVERFLOW}{464}{\code {FE_OVERFLOW}}
+-\entry{FE{\_}INVALID}{464}{\code {FE_INVALID}}
+-\entry{HUGE{\_}VAL}{466}{\code {HUGE_VAL}}
+-\entry{HUGE{\_}VALF}{466}{\code {HUGE_VALF}}
+-\entry{HUGE{\_}VALL}{466}{\code {HUGE_VALL}}
+-\entry{FE{\_}TONEAREST}{466}{\code {FE_TONEAREST}}
+-\entry{FE{\_}UPWARD}{466}{\code {FE_UPWARD}}
+-\entry{FE{\_}DOWNWARD}{466}{\code {FE_DOWNWARD}}
+-\entry{FE{\_}TOWARDZERO}{466}{\code {FE_TOWARDZERO}}
+-\entry{FE{\_}DFL{\_}ENV}{468}{\code {FE_DFL_ENV}}
+-\entry{FE{\_}NOMASK{\_}ENV}{468}{\code {FE_NOMASK_ENV}}
+-\entry{FP{\_}FAST{\_}FMA}{476}{\code {FP_FAST_FMA}}
+-\entry{{\_}Complex{\_}I}{476}{\code {_Complex_I}}
+-\entry{I}{477}{\code {I}}
+-\entry{CLOCKS{\_}PER{\_}SEC}{488}{\code {CLOCKS_PER_SEC}}
+-\entry{CLK{\_}TCK}{488}{\code {CLK_TCK}}
+-\entry{getdate{\_}err}{505}{\code {getdate_err}}
+-\entry{tzname}{509}{\code {tzname}}
+-\entry{timezone}{509}{\code {timezone}}
+-\entry{daylight}{510}{\code {daylight}}
+-\entry{RLIMIT{\_}CPU}{520}{\code {RLIMIT_CPU}}
+-\entry{RLIMIT{\_}FSIZE}{520}{\code {RLIMIT_FSIZE}}
+-\entry{RLIMIT{\_}DATA}{520}{\code {RLIMIT_DATA}}
+-\entry{RLIMIT{\_}STACK}{520}{\code {RLIMIT_STACK}}
+-\entry{RLIMIT{\_}CORE}{520}{\code {RLIMIT_CORE}}
+-\entry{RLIMIT{\_}RSS}{521}{\code {RLIMIT_RSS}}
+-\entry{RLIMIT{\_}NOFILE}{521}{\code {RLIMIT_NOFILE}}
+-\entry{RLIMIT{\_}OFILE}{521}{\code {RLIMIT_OFILE}}
+-\entry{RLIM{\_}NLIMITS}{521}{\code {RLIM_NLIMITS}}
+-\entry{RLIM{\_}INFINITY}{521}{\code {RLIM_INFINITY}}
+-\entry{PRIO{\_}MIN}{521}{\code {PRIO_MIN}}
+-\entry{PRIO{\_}MAX}{521}{\code {PRIO_MAX}}
+-\entry{PRIO{\_}PROCESS}{522}{\code {PRIO_PROCESS}}
+-\entry{PRIO{\_}PGRP}{522}{\code {PRIO_PGRP}}
+-\entry{PRIO{\_}USER}{522}{\code {PRIO_USER}}
+-\entry{NSIG}{529}{\code {NSIG}}
+-\entry{COREFILE}{530}{\code {COREFILE}}
+-\entry{SIGFPE}{530}{\code {SIGFPE}}
+-\entry{FPE{\_}INTOVF{\_}TRAP}{530}{\code {FPE_INTOVF_TRAP}}
+-\entry{FPE{\_}INTDIV{\_}TRAP}{530}{\code {FPE_INTDIV_TRAP}}
+-\entry{FPE{\_}SUBRNG{\_}TRAP}{530}{\code {FPE_SUBRNG_TRAP}}
+-\entry{FPE{\_}FLTOVF{\_}TRAP}{531}{\code {FPE_FLTOVF_TRAP}}
+-\entry{FPE{\_}FLTDIV{\_}TRAP}{531}{\code {FPE_FLTDIV_TRAP}}
+-\entry{FPE{\_}FLTUND{\_}TRAP}{531}{\code {FPE_FLTUND_TRAP}}
+-\entry{FPE{\_}DECOVF{\_}TRAP}{531}{\code {FPE_DECOVF_TRAP}}
+-\entry{SIGILL}{531}{\code {SIGILL}}
+-\entry{SIGSEGV}{531}{\code {SIGSEGV}}
+-\entry{SIGBUS}{531}{\code {SIGBUS}}
+-\entry{SIGABRT}{532}{\code {SIGABRT}}
+-\entry{SIGIOT}{532}{\code {SIGIOT}}
+-\entry{SIGTRAP}{532}{\code {SIGTRAP}}
+-\entry{SIGEMT}{532}{\code {SIGEMT}}
+-\entry{SIGSYS}{532}{\code {SIGSYS}}
+-\entry{SIGTERM}{532}{\code {SIGTERM}}
+-\entry{SIGINT}{532}{\code {SIGINT}}
+-\entry{SIGQUIT}{533}{\code {SIGQUIT}}
+-\entry{SIGKILL}{533}{\code {SIGKILL}}
+-\entry{SIGHUP}{533}{\code {SIGHUP}}
+-\entry{SIGALRM}{533}{\code {SIGALRM}}
+-\entry{SIGVTALRM}{534}{\code {SIGVTALRM}}
+-\entry{SIGPROF}{534}{\code {SIGPROF}}
+-\entry{SIGIO}{534}{\code {SIGIO}}
+-\entry{SIGURG}{534}{\code {SIGURG}}
+-\entry{SIGPOLL}{534}{\code {SIGPOLL}}
+-\entry{SIGCHLD}{534}{\code {SIGCHLD}}
+-\entry{SIGCLD}{535}{\code {SIGCLD}}
+-\entry{SIGCONT}{535}{\code {SIGCONT}}
+-\entry{SIGSTOP}{535}{\code {SIGSTOP}}
+-\entry{SIGTSTP}{535}{\code {SIGTSTP}}
+-\entry{SIGTTIN}{535}{\code {SIGTTIN}}
+-\entry{SIGTTOU}{535}{\code {SIGTTOU}}
+-\entry{SIGPIPE}{536}{\code {SIGPIPE}}
+-\entry{SIGLOST}{536}{\code {SIGLOST}}
+-\entry{SIGXCPU}{536}{\code {SIGXCPU}}
+-\entry{SIGXFSZ}{537}{\code {SIGXFSZ}}
+-\entry{SIGUSR1}{537}{\code {SIGUSR1}}
+-\entry{SIGUSR2}{537}{\code {SIGUSR2}}
+-\entry{SIGWINCH}{537}{\code {SIGWINCH}}
+-\entry{SIGINFO}{537}{\code {SIGINFO}}
+-\entry{sys{\_}siglist}{538}{\code {sys_siglist}}
+-\entry{SIG{\_}DFL}{539}{\code {SIG_DFL}}
+-\entry{SIG{\_}IGN}{539}{\code {SIG_IGN}}
+-\entry{SIG{\_}ERR}{540}{\code {SIG_ERR}}
+-\entry{SA{\_}NOCLDSTOP}{543}{\code {SA_NOCLDSTOP}}
+-\entry{SA{\_}ONSTACK}{543}{\code {SA_ONSTACK}}
+-\entry{SA{\_}RESTART}{544}{\code {SA_RESTART}}
+-\entry{SIG{\_}BLOCK}{562}{\code {SIG_BLOCK}}
+-\entry{SIG{\_}UNBLOCK}{562}{\code {SIG_UNBLOCK}}
+-\entry{SIG{\_}SETMASK}{562}{\code {SIG_SETMASK}}
+-\entry{SIGSTKSZ}{570}{\code {SIGSTKSZ}}
+-\entry{MINSIGSTKSZ}{570}{\code {MINSIGSTKSZ}}
+-\entry{SS{\_}DISABLE}{570}{\code {SS_DISABLE}}
+-\entry{SS{\_}ONSTACK}{570}{\code {SS_ONSTACK}}
+-\entry{SV{\_}ONSTACK}{572}{\code {SV_ONSTACK}}
+-\entry{SV{\_}INTERRUPT}{572}{\code {SV_INTERRUPT}}
+-\entry{SV{\_}RESETHAND}{572}{\code {SV_RESETHAND}}
+-\entry{opterr}{577}{\code {opterr}}
+-\entry{optopt}{577}{\code {optopt}}
+-\entry{optind}{577}{\code {optind}}
+-\entry{optarg}{577}{\code {optarg}}
+-\entry{argp{\_}program{\_}version}{585}{\code {argp_program_version}}
+-\entry{argp{\_}program{\_}bug{\_}address}{585}{\code {argp_program_bug_address}}
+-\entry{argp{\_}program{\_}version{\_}hook}{585}{\code {argp_program_version_hook}}
+-\entry{argp{\_}err{\_}exit{\_}status}{585}{\code {argp_err_exit_status}}
+-\entry{OPTION{\_}ARG{\_}OPTIONAL}{587}{\code {OPTION_ARG_OPTIONAL}}
+-\entry{OPTION{\_}HIDDEN}{587}{\code {OPTION_HIDDEN}}
+-\entry{OPTION{\_}ALIAS}{587}{\code {OPTION_ALIAS}}
+-\entry{OPTION{\_}DOC}{587}{\code {OPTION_DOC}}
+-\entry{OPTION{\_}NO{\_}USAGE}{588}{\code {OPTION_NO_USAGE}}
+-\entry{ARGP{\_}ERR{\_}UNKNOWN}{589}{\code {ARGP_ERR_UNKNOWN}}
+-\entry{ARGP{\_}KEY{\_}ARG}{589}{\code {ARGP_KEY_ARG}}
+-\entry{ARGP{\_}KEY{\_}ARGS}{589}{\code {ARGP_KEY_ARGS}}
+-\entry{ARGP{\_}KEY{\_}END}{590}{\code {ARGP_KEY_END}}
+-\entry{ARGP{\_}KEY{\_}NO{\_}ARGS}{590}{\code {ARGP_KEY_NO_ARGS}}
+-\entry{ARGP{\_}KEY{\_}INIT}{590}{\code {ARGP_KEY_INIT}}
+-\entry{ARGP{\_}KEY{\_}SUCCESS}{590}{\code {ARGP_KEY_SUCCESS}}
+-\entry{ARGP{\_}KEY{\_}ERROR}{590}{\code {ARGP_KEY_ERROR}}
+-\entry{ARGP{\_}KEY{\_}FINI}{590}{\code {ARGP_KEY_FINI}}
+-\entry{ARGP{\_}PARSE{\_}ARGV0}{594}{\code {ARGP_PARSE_ARGV0}}
+-\entry{ARGP{\_}NO{\_}ERRS}{594}{\code {ARGP_NO_ERRS}}
+-\entry{ARGP{\_}NO{\_}ARGS}{595}{\code {ARGP_NO_ARGS}}
+-\entry{ARGP{\_}IN{\_}ORDER}{595}{\code {ARGP_IN_ORDER}}
+-\entry{ARGP{\_}NO{\_}HELP}{595}{\code {ARGP_NO_HELP}}
+-\entry{ARGP{\_}NO{\_}EXIT}{595}{\code {ARGP_NO_EXIT}}
+-\entry{ARGP{\_}LONG{\_}ONLY}{595}{\code {ARGP_LONG_ONLY}}
+-\entry{ARGP{\_}SILENT}{595}{\code {ARGP_SILENT}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}PRE{\_}DOC}{596}{\code {ARGP_KEY_HELP_PRE_DOC}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}POST{\_}DOC}{596}{\code {ARGP_KEY_HELP_POST_DOC}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}HEADER}{596}{\code {ARGP_KEY_HELP_HEADER}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}EXTRA}{596}{\code {ARGP_KEY_HELP_EXTRA}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}DUP{\_}ARGS{\_}NOTE}{596}{\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}}
+-\entry{ARGP{\_}KEY{\_}HELP{\_}ARGS{\_}DOC}{596}{\code {ARGP_KEY_HELP_ARGS_DOC}}
+-\entry{ARGP{\_}HELP{\_}USAGE}{596}{\code {ARGP_HELP_USAGE}}
+-\entry{ARGP{\_}HELP{\_}SHORT{\_}USAGE}{597}{\code {ARGP_HELP_SHORT_USAGE}}
+-\entry{ARGP{\_}HELP{\_}SEE}{597}{\code {ARGP_HELP_SEE}}
+-\entry{ARGP{\_}HELP{\_}LONG}{597}{\code {ARGP_HELP_LONG}}
+-\entry{ARGP{\_}HELP{\_}PRE{\_}DOC}{597}{\code {ARGP_HELP_PRE_DOC}}
+-\entry{ARGP{\_}HELP{\_}POST{\_}DOC}{597}{\code {ARGP_HELP_POST_DOC}}
+-\entry{ARGP{\_}HELP{\_}DOC}{597}{\code {ARGP_HELP_DOC}}
+-\entry{ARGP{\_}HELP{\_}BUG{\_}ADDR}{597}{\code {ARGP_HELP_BUG_ADDR}}
+-\entry{ARGP{\_}HELP{\_}LONG{\_}ONLY}{597}{\code {ARGP_HELP_LONG_ONLY}}
+-\entry{ARGP{\_}HELP{\_}EXIT{\_}ERR}{597}{\code {ARGP_HELP_EXIT_ERR}}
+-\entry{ARGP{\_}HELP{\_}EXIT{\_}OK}{597}{\code {ARGP_HELP_EXIT_OK}}
+-\entry{ARGP{\_}HELP{\_}STD{\_}ERR}{597}{\code {ARGP_HELP_STD_ERR}}
+-\entry{ARGP{\_}HELP{\_}STD{\_}USAGE}{597}{\code {ARGP_HELP_STD_USAGE}}
+-\entry{ARGP{\_}HELP{\_}STD{\_}HELP}{597}{\code {ARGP_HELP_STD_HELP}}
+-\entry{environ}{611}{\code {environ}}
+-\entry{EXIT{\_}SUCCESS}{614}{\code {EXIT_SUCCESS}}
+-\entry{EXIT{\_}FAILURE}{615}{\code {EXIT_FAILURE}}
+-\entry{L{\_}ctermid}{646}{\code {L_ctermid}}
+-\entry{aliases}{651}{\code {aliases}}
+-\entry{ethers}{651}{\code {ethers}}
+-\entry{group}{651}{\code {group}}
+-\entry{hosts}{651}{\code {hosts}}
+-\entry{netgroup}{651}{\code {netgroup}}
+-\entry{networks}{651}{\code {networks}}
+-\entry{protocols}{651}{\code {protocols}}
+-\entry{passwd}{651}{\code {passwd}}
+-\entry{rpc}{651}{\code {rpc}}
+-\entry{services}{651}{\code {services}}
+-\entry{shadow}{652}{\code {shadow}}
+-\entry{NSS{\_}STATUS{\_}TRYAGAIN}{656}{\code {NSS_STATUS_TRYAGAIN}}
+-\entry{NSS{\_}STATUS{\_}UNAVAIL}{656}{\code {NSS_STATUS_UNAVAIL}}
+-\entry{NSS{\_}STATUS{\_}NOTFOUND}{656}{\code {NSS_STATUS_NOTFOUND}}
+-\entry{NSS{\_}STATUS{\_}SUCCESS}{656}{\code {NSS_STATUS_SUCCESS}}
+-\entry{L{\_}cuserid}{671}{\code {L_cuserid}}
+-\entry{EMPTY}{672}{\code {EMPTY}}
+-\entry{RUN{\_}LVL}{672}{\code {RUN_LVL}}
+-\entry{BOOT{\_}TIME}{672}{\code {BOOT_TIME}}
+-\entry{OLD{\_}TIME}{672}{\code {OLD_TIME}}
+-\entry{NEW{\_}TIME}{672}{\code {NEW_TIME}}
+-\entry{INIT{\_}PROCESS}{672}{\code {INIT_PROCESS}}
+-\entry{LOGIN{\_}PROCESS}{672}{\code {LOGIN_PROCESS}}
+-\entry{USER{\_}PROCESS}{672}{\code {USER_PROCESS}}
+-\entry{DEAD{\_}PROCESS}{673}{\code {DEAD_PROCESS}}
+-\entry{ACCOUNTING}{673}{\code {ACCOUNTING}}
+-\entry{{\_}PATH{\_}UTMP}{675}{\code {_PATH_UTMP}}
+-\entry{{\_}PATH{\_}WTMP}{675}{\code {_PATH_WTMP}}
+-\entry{EMPTY}{676}{\code {EMPTY}}
+-\entry{RUN{\_}LVL}{676}{\code {RUN_LVL}}
+-\entry{BOOT{\_}TIME}{676}{\code {BOOT_TIME}}
+-\entry{OLD{\_}TIME}{677}{\code {OLD_TIME}}
+-\entry{NEW{\_}TIME}{677}{\code {NEW_TIME}}
+-\entry{INIT{\_}PROCESS}{677}{\code {INIT_PROCESS}}
+-\entry{LOGIN{\_}PROCESS}{677}{\code {LOGIN_PROCESS}}
+-\entry{USER{\_}PROCESS}{677}{\code {USER_PROCESS}}
+-\entry{DEAD{\_}PROCESS}{677}{\code {DEAD_PROCESS}}
+-\entry{{\_}PATH{\_}FSTAB}{691}{\code {_PATH_FSTAB}}
+-\entry{{\_}PATH{\_}MNTTAB}{691}{\code {_PATH_MNTTAB}}
+-\entry{FSTAB}{691}{\code {FSTAB}}
+-\entry{{\_}PATH{\_}MOUNTED}{691}{\code {_PATH_MOUNTED}}
+-\entry{FSTAB{\_}RW}{692}{\code {FSTAB_RW}}
+-\entry{FSTAB{\_}RQ}{692}{\code {FSTAB_RQ}}
+-\entry{FSTAB{\_}RO}{692}{\code {FSTAB_RO}}
+-\entry{FSTAB{\_}SW}{692}{\code {FSTAB_SW}}
+-\entry{FSTAB{\_}XX}{692}{\code {FSTAB_XX}}
+-\entry{MNTTYPE{\_}IGNORE}{694}{\code {MNTTYPE_IGNORE}}
+-\entry{MNTTYPE{\_}NFS}{694}{\code {MNTTYPE_NFS}}
+-\entry{MNTTYPE{\_}SWAP}{694}{\code {MNTTYPE_SWAP}}
+-\entry{MNTOPT{\_}DEFAULTS}{694}{\code {MNTOPT_DEFAULTS}}
+-\entry{MNTOPT{\_}RO}{694}{\code {MNTOPT_RO}}
+-\entry{MNTOPT{\_}RW}{694}{\code {MNTOPT_RW}}
+-\entry{MNTOPT{\_}SUID}{694}{\code {MNTOPT_SUID}}
+-\entry{MNTOPT{\_}NOSUID}{695}{\code {MNTOPT_NOSUID}}
+-\entry{MNTOPT{\_}NOAUTO}{695}{\code {MNTOPT_NOAUTO}}
+-\entry{ARG{\_}MAX}{697}{\code {ARG_MAX}}
+-\entry{CHILD{\_}MAX}{697}{\code {CHILD_MAX}}
+-\entry{OPEN{\_}MAX}{697}{\code {OPEN_MAX}}
+-\entry{STREAM{\_}MAX}{697}{\code {STREAM_MAX}}
+-\entry{TZNAME{\_}MAX}{697}{\code {TZNAME_MAX}}
+-\entry{NGROUPS{\_}MAX}{698}{\code {NGROUPS_MAX}}
+-\entry{SSIZE{\_}MAX}{698}{\code {SSIZE_MAX}}
+-\entry{RE{\_}DUP{\_}MAX}{698}{\code {RE_DUP_MAX}}
+-\entry{{\_}POSIX{\_}JOB{\_}CONTROL}{698}{\code {_POSIX_JOB_CONTROL}}
+-\entry{{\_}POSIX{\_}SAVED{\_}IDS}{698}{\code {_POSIX_SAVED_IDS}}
+-\entry{{\_}POSIX2{\_}C{\_}DEV}{699}{\code {_POSIX2_C_DEV}}
+-\entry{{\_}POSIX2{\_}FORT{\_}DEV}{699}{\code {_POSIX2_FORT_DEV}}
+-\entry{{\_}POSIX2{\_}FORT{\_}RUN}{699}{\code {_POSIX2_FORT_RUN}}
+-\entry{{\_}POSIX2{\_}LOCALEDEF}{699}{\code {_POSIX2_LOCALEDEF}}
+-\entry{{\_}POSIX2{\_}SW{\_}DEV}{699}{\code {_POSIX2_SW_DEV}}
+-\entry{{\_}POSIX{\_}VERSION}{699}{\code {_POSIX_VERSION}}
+-\entry{{\_}POSIX2{\_}C{\_}VERSION}{700}{\code {_POSIX2_C_VERSION}}
+-\entry{LINK{\_}MAX}{709}{\code {LINK_MAX}}
+-\entry{MAX{\_}CANON}{709}{\code {MAX_CANON}}
+-\entry{MAX{\_}INPUT}{709}{\code {MAX_INPUT}}
+-\entry{NAME{\_}MAX}{710}{\code {NAME_MAX}}
+-\entry{PATH{\_}MAX}{710}{\code {PATH_MAX}}
+-\entry{PIPE{\_}BUF}{710}{\code {PIPE_BUF}}
+-\entry{MAXNAMLEN}{710}{\code {MAXNAMLEN}}
+-\entry{FILENAME{\_}MAX}{710}{\code {FILENAME_MAX}}
+-\entry{{\_}POSIX{\_}CHOWN{\_}RESTRICTED}{711}{\code {_POSIX_CHOWN_RESTRICTED}}
+-\entry{{\_}POSIX{\_}NO{\_}TRUNC}{711}{\code {_POSIX_NO_TRUNC}}
+-\entry{{\_}POSIX{\_}VDISABLE}{711}{\code {_POSIX_VDISABLE}}
+-\entry{BC{\_}BASE{\_}MAX}{713}{\code {BC_BASE_MAX}}
+-\entry{BC{\_}DIM{\_}MAX}{713}{\code {BC_DIM_MAX}}
+-\entry{BC{\_}SCALE{\_}MAX}{713}{\code {BC_SCALE_MAX}}
+-\entry{BC{\_}STRING{\_}MAX}{713}{\code {BC_STRING_MAX}}
+-\entry{COLL{\_}WEIGHTS{\_}MAX}{714}{\code {COLL_WEIGHTS_MAX}}
+-\entry{EXPR{\_}NEST{\_}MAX}{714}{\code {EXPR_NEST_MAX}}
+-\entry{LINE{\_}MAX}{714}{\code {LINE_MAX}}
+-\entry{EQUIV{\_}CLASS{\_}MAX}{714}{\code {EQUIV_CLASS_MAX}}
+-\entry{SEM{\_}VALUE{\_}MAX}{735}{\code {SEM_VALUE_MAX}}
+-\entry{NDEBUG}{743}{\code {NDEBUG}}
+-\entry{NULL}{750}{\code {NULL}}
+-\entry{SCHAR{\_}MIN}{752}{\code {SCHAR_MIN}}
+-\entry{SCHAR{\_}MAX}{752}{\code {SCHAR_MAX}}
+-\entry{UCHAR{\_}MAX}{752}{\code {UCHAR_MAX}}
+-\entry{CHAR{\_}MIN}{752}{\code {CHAR_MIN}}
+-\entry{CHAR{\_}MAX}{753}{\code {CHAR_MAX}}
+-\entry{SHRT{\_}MIN}{753}{\code {SHRT_MIN}}
+-\entry{SHRT{\_}MAX}{753}{\code {SHRT_MAX}}
+-\entry{USHRT{\_}MAX}{753}{\code {USHRT_MAX}}
+-\entry{INT{\_}MIN}{753}{\code {INT_MIN}}
+-\entry{INT{\_}MAX}{753}{\code {INT_MAX}}
+-\entry{UINT{\_}MAX}{753}{\code {UINT_MAX}}
+-\entry{LONG{\_}MIN}{753}{\code {LONG_MIN}}
+-\entry{LONG{\_}MAX}{753}{\code {LONG_MAX}}
+-\entry{ULONG{\_}MAX}{753}{\code {ULONG_MAX}}
+-\entry{LONG{\_}LONG{\_}MIN}{753}{\code {LONG_LONG_MIN}}
+-\entry{LONG{\_}LONG{\_}MAX}{753}{\code {LONG_LONG_MAX}}
+-\entry{ULONG{\_}LONG{\_}MAX}{753}{\code {ULONG_LONG_MAX}}
+-\entry{WCHAR{\_}MAX}{753}{\code {WCHAR_MAX}}
+-\entry{FLT{\_}ROUNDS}{755}{\code {FLT_ROUNDS}}
+-\entry{FLT{\_}RADIX}{756}{\code {FLT_RADIX}}
+-\entry{FLT{\_}MANT{\_}DIG}{756}{\code {FLT_MANT_DIG}}
+-\entry{DBL{\_}MANT{\_}DIG}{756}{\code {DBL_MANT_DIG}}
+-\entry{LDBL{\_}MANT{\_}DIG}{756}{\code {LDBL_MANT_DIG}}
+-\entry{FLT{\_}DIG}{756}{\code {FLT_DIG}}
+-\entry{DBL{\_}DIG}{756}{\code {DBL_DIG}}
+-\entry{LDBL{\_}DIG}{756}{\code {LDBL_DIG}}
+-\entry{FLT{\_}MIN{\_}EXP}{756}{\code {FLT_MIN_EXP}}
+-\entry{DBL{\_}MIN{\_}EXP}{757}{\code {DBL_MIN_EXP}}
+-\entry{LDBL{\_}MIN{\_}EXP}{757}{\code {LDBL_MIN_EXP}}
+-\entry{FLT{\_}MIN{\_}10{\_}EXP}{757}{\code {FLT_MIN_10_EXP}}
+-\entry{DBL{\_}MIN{\_}10{\_}EXP}{757}{\code {DBL_MIN_10_EXP}}
+-\entry{LDBL{\_}MIN{\_}10{\_}EXP}{757}{\code {LDBL_MIN_10_EXP}}
+-\entry{FLT{\_}MAX{\_}EXP}{757}{\code {FLT_MAX_EXP}}
+-\entry{DBL{\_}MAX{\_}EXP}{757}{\code {DBL_MAX_EXP}}
+-\entry{LDBL{\_}MAX{\_}EXP}{757}{\code {LDBL_MAX_EXP}}
+-\entry{FLT{\_}MAX{\_}10{\_}EXP}{757}{\code {FLT_MAX_10_EXP}}
+-\entry{DBL{\_}MAX{\_}10{\_}EXP}{757}{\code {DBL_MAX_10_EXP}}
+-\entry{LDBL{\_}MAX{\_}10{\_}EXP}{757}{\code {LDBL_MAX_10_EXP}}
+-\entry{FLT{\_}MAX}{757}{\code {FLT_MAX}}
+-\entry{DBL{\_}MAX}{757}{\code {DBL_MAX}}
+-\entry{LDBL{\_}MAX}{757}{\code {LDBL_MAX}}
+-\entry{FLT{\_}MIN}{757}{\code {FLT_MIN}}
+-\entry{DBL{\_}MIN}{758}{\code {DBL_MIN}}
+-\entry{LDBL{\_}MIN}{758}{\code {LDBL_MIN}}
+-\entry{FLT{\_}EPSILON}{758}{\code {FLT_EPSILON}}
+-\entry{DBL{\_}EPSILON}{758}{\code {DBL_EPSILON}}
+-\entry{LDBL{\_}EPSILON}{758}{\code {LDBL_EPSILON}}
+diff -Naur ../glibc-2.1.3/manual/libc.vrs glibc-2.1.3/manual/libc.vrs
+--- ../glibc-2.1.3/manual/libc.vrs	2000-01-05 19:19:03.000000000 -0800
++++ glibc-2.1.3/manual/libc.vrs	1969-12-31 16:00:00.000000000 -0800
+@@ -1,869 +0,0 @@
+-\initial {(}
+-\entry {\code {(*gconv_end_fct)}}{135}
+-\entry {\code {(*gconv_fct)}}{135}
+-\entry {\code {(*gconv_init_fct)}}{132}
+-\initial {{\_}}
+-\entry {\code {__free_hook}}{39}
+-\entry {\code {__malloc_hook}}{39}
+-\entry {\code {__memalign_hook}}{39}
+-\entry {\code {__realloc_hook}}{39}
+-\entry {\code {_BSD_SOURCE}}{8}
+-\entry {\code {_Complex_I}}{476}
+-\entry {\code {_FILE_OFFSET_BITS}}{9}
+-\entry {\code {_GNU_SOURCE}}{10}
+-\entry {\code {_IOFBF}}{258}
+-\entry {\code {_IOLBF}}{258}
+-\entry {\code {_IONBF}}{258}
+-\entry {\code {_LARGEFILE_SOURCE}}{9}
+-\entry {\code {_LARGEFILE64_SOURCE}}{9}
+-\entry {\code {_PATH_FSTAB}}{691}
+-\entry {\code {_PATH_MNTTAB}}{691}
+-\entry {\code {_PATH_MOUNTED}}{691}
+-\entry {\code {_PATH_UTMP}}{675}
+-\entry {\code {_PATH_WTMP}}{675}
+-\entry {\code {_POSIX_C_SOURCE}}{8}
+-\entry {\code {_POSIX_CHOWN_RESTRICTED}}{711}
+-\entry {\code {_POSIX_JOB_CONTROL}}{698}
+-\entry {\code {_POSIX_NO_TRUNC}}{711}
+-\entry {\code {_POSIX_SAVED_IDS}}{698}
+-\entry {\code {_POSIX_SOURCE}}{7}
+-\entry {\code {_POSIX_VDISABLE}}{425, 711}
+-\entry {\code {_POSIX_VERSION}}{699}
+-\entry {\code {_POSIX2_C_DEV}}{699}
+-\entry {\code {_POSIX2_C_VERSION}}{700}
+-\entry {\code {_POSIX2_FORT_DEV}}{699}
+-\entry {\code {_POSIX2_FORT_RUN}}{699}
+-\entry {\code {_POSIX2_LOCALEDEF}}{699}
+-\entry {\code {_POSIX2_SW_DEV}}{699}
+-\entry {\code {_REENTRANT}}{10}
+-\entry {\code {_SVID_SOURCE}}{8}
+-\entry {\code {_THREAD_SAFE}}{10}
+-\entry {\code {_XOPEN_SOURCE}}{8}
+-\entry {\code {_XOPEN_SOURCE_EXTENDED}}{8}
+-\initial {A}
+-\entry {\code {ABDAY_1}}{150}
+-\entry {\code {ABDAY_2}}{150}
+-\entry {\code {ABDAY_3}}{150}
+-\entry {\code {ABDAY_4}}{150}
+-\entry {\code {ABDAY_5}}{150}
+-\entry {\code {ABDAY_6}}{150}
+-\entry {\code {ABDAY_7}}{150}
+-\entry {\code {ABMON_1}}{150}
+-\entry {\code {ABMON_10}}{150}
+-\entry {\code {ABMON_11}}{150}
+-\entry {\code {ABMON_12}}{150}
+-\entry {\code {ABMON_2}}{150}
+-\entry {\code {ABMON_3}}{150}
+-\entry {\code {ABMON_4}}{150}
+-\entry {\code {ABMON_5}}{150}
+-\entry {\code {ABMON_6}}{150}
+-\entry {\code {ABMON_7}}{150}
+-\entry {\code {ABMON_8}}{150}
+-\entry {\code {ABMON_9}}{150}
+-\entry {\code {ACCOUNTING}}{673}
+-\entry {\code {AF_FILE}}{366}
+-\entry {\code {AF_INET}}{366}
+-\entry {\code {AF_INET6}}{371}
+-\entry {\code {AF_LOCAL}}{366}
+-\entry {\code {AF_UNIX}}{366}
+-\entry {\code {AF_UNSPEC}}{366}
+-\entry {\code {aliases}}{651}
+-\entry {\code {ALT_DIGITS}}{152}
+-\entry {\code {ALTWERASE}}{423}
+-\entry {\code {AM_STR}}{151}
+-\entry {\code {ARG_MAX}}{697}
+-\entry {\code {argp_err_exit_status}}{585}
+-\entry {\code {ARGP_ERR_UNKNOWN}}{589}
+-\entry {\code {ARGP_HELP_BUG_ADDR}}{597}
+-\entry {\code {ARGP_HELP_DOC}}{597}
+-\entry {\code {ARGP_HELP_EXIT_ERR}}{597}
+-\entry {\code {ARGP_HELP_EXIT_OK}}{597}
+-\entry {\code {ARGP_HELP_LONG}}{597}
+-\entry {\code {ARGP_HELP_LONG_ONLY}}{597}
+-\entry {\code {ARGP_HELP_POST_DOC}}{597}
+-\entry {\code {ARGP_HELP_PRE_DOC}}{597}
+-\entry {\code {ARGP_HELP_SEE}}{597}
+-\entry {\code {ARGP_HELP_SHORT_USAGE}}{597}
+-\entry {\code {ARGP_HELP_STD_ERR}}{597}
+-\entry {\code {ARGP_HELP_STD_HELP}}{597}
+-\entry {\code {ARGP_HELP_STD_USAGE}}{597}
+-\entry {\code {ARGP_HELP_USAGE}}{596}
+-\entry {\code {ARGP_IN_ORDER}}{595}
+-\entry {\code {ARGP_KEY_ARG}}{589}
+-\entry {\code {ARGP_KEY_ARGS}}{589}
+-\entry {\code {ARGP_KEY_END}}{590}
+-\entry {\code {ARGP_KEY_ERROR}}{590}
+-\entry {\code {ARGP_KEY_FINI}}{590}
+-\entry {\code {ARGP_KEY_HELP_ARGS_DOC}}{596}
+-\entry {\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}}{596}
+-\entry {\code {ARGP_KEY_HELP_EXTRA}}{596}
+-\entry {\code {ARGP_KEY_HELP_HEADER}}{596}
+-\entry {\code {ARGP_KEY_HELP_POST_DOC}}{596}
+-\entry {\code {ARGP_KEY_HELP_PRE_DOC}}{596}
+-\entry {\code {ARGP_KEY_INIT}}{590}
+-\entry {\code {ARGP_KEY_NO_ARGS}}{590}
+-\entry {\code {ARGP_KEY_SUCCESS}}{590}
+-\entry {\code {ARGP_LONG_ONLY}}{595}
+-\entry {\code {ARGP_NO_ARGS}}{595}
+-\entry {\code {ARGP_NO_ERRS}}{594}
+-\entry {\code {ARGP_NO_EXIT}}{595}
+-\entry {\code {ARGP_NO_HELP}}{595}
+-\entry {\code {ARGP_PARSE_ARGV0}}{594}
+-\entry {\code {argp_program_bug_address}}{585}
+-\entry {\code {argp_program_version}}{585}
+-\entry {\code {argp_program_version_hook}}{585}
+-\entry {\code {ARGP_SILENT}}{595}
+-\initial {B}
+-\entry {\code {B0}}{424}
+-\entry {\code {B110}}{424}
+-\entry {\code {B115200}}{424}
+-\entry {\code {B1200}}{424}
+-\entry {\code {B134}}{424}
+-\entry {\code {B150}}{424}
+-\entry {\code {B1800}}{424}
+-\entry {\code {B19200}}{424}
+-\entry {\code {B200}}{424}
+-\entry {\code {B230400}}{424}
+-\entry {\code {B2400}}{424}
+-\entry {\code {B300}}{424}
+-\entry {\code {B38400}}{424}
+-\entry {\code {B460800}}{424}
+-\entry {\code {B4800}}{424}
+-\entry {\code {B50}}{424}
+-\entry {\code {B57600}}{424}
+-\entry {\code {B600}}{424}
+-\entry {\code {B75}}{424}
+-\entry {\code {B9600}}{424}
+-\entry {\code {BC_BASE_MAX}}{713}
+-\entry {\code {BC_DIM_MAX}}{713}
+-\entry {\code {BC_SCALE_MAX}}{713}
+-\entry {\code {BC_STRING_MAX}}{713}
+-\entry {\code {BOOT_TIME}}{672, 676}
+-\entry {\code {BRKINT}}{417}
+-\entry {\code {BUFSIZ}}{258}
+-\initial {C}
+-\entry {\code {CCTS_OFLOW}}{420}
+-\entry {\code {CHAR_MAX}}{753}
+-\entry {\code {CHAR_MIN}}{752}
+-\entry {\code {CHILD_MAX}}{697}
+-\entry {\code {CIGNORE}}{420}
+-\entry {\code {CLK_TCK}}{488}
+-\entry {\code {CLOCAL}}{419}
+-\entry {\code {CLOCKS_PER_SEC}}{488}
+-\entry {\code {COLL_WEIGHTS_MAX}}{714}
+-\entry {\code {COREFILE}}{530}
+-\entry {\code {CREAD}}{419}
+-\entry {\code {CRNCYSTR}}{152}
+-\entry {\code {CRTS_IFLOW}}{420}
+-\entry {\code {CS5}}{420}
+-\entry {\code {CS6}}{420}
+-\entry {\code {CS7}}{420}
+-\entry {\code {CS8}}{420}
+-\entry {\code {CSIZE}}{420}
+-\entry {\code {CSTOPB}}{419}
+-\entry {\code {CURRENCY_SYMBOL}}{152}
+-\initial {D}
+-\entry {\code {D_FMT}}{151}
+-\entry {\code {D_T_FMT}}{151}
+-\entry {\code {DAY_1}}{150}
+-\entry {\code {DAY_2}}{150}
+-\entry {\code {DAY_3}}{150}
+-\entry {\code {DAY_4}}{150}
+-\entry {\code {DAY_5}}{150}
+-\entry {\code {DAY_6}}{150}
+-\entry {\code {DAY_7}}{150}
+-\entry {\code {daylight}}{510}
+-\entry {\code {DBL_DIG}}{756}
+-\entry {\code {DBL_EPSILON}}{758}
+-\entry {\code {DBL_MANT_DIG}}{756}
+-\entry {\code {DBL_MAX}}{757}
+-\entry {\code {DBL_MAX_10_EXP}}{757}
+-\entry {\code {DBL_MAX_EXP}}{757}
+-\entry {\code {DBL_MIN}}{758}
+-\entry {\code {DBL_MIN_10_EXP}}{757}
+-\entry {\code {DBL_MIN_EXP}}{757}
+-\entry {\code {DEAD_PROCESS}}{673, 677}
+-\entry {\code {DECIMAL_POINT}}{153}
+-\initial {E}
+-\entry {\code {E2BIG}}{17}
+-\entry {\code {EACCES}}{17}
+-\entry {\code {EADDRINUSE}}{21}
+-\entry {\code {EADDRNOTAVAIL}}{21}
+-\entry {\code {EADV}}{26}
+-\entry {\code {EAFNOSUPPORT}}{21}
+-\entry {\code {EAGAIN}}{19}
+-\entry {\code {EALREADY}}{20}
+-\entry {\code {EAUTH}}{24}
+-\entry {\code {EBACKGROUND}}{24}
+-\entry {\code {EBADE}}{25}
+-\entry {\code {EBADF}}{17, 432}
+-\entry {\code {EBADFD}}{26}
+-\entry {\code {EBADMSG}}{25}
+-\entry {\code {EBADR}}{25}
+-\entry {\code {EBADRPC}}{23}
+-\entry {\code {EBADRQC}}{26}
+-\entry {\code {EBADSLT}}{26}
+-\entry {\code {EBFONT}}{26}
+-\entry {\code {EBUSY}}{17}
+-\entry {\code {ECHILD}}{17}
+-\entry {\code {ECHO}}{421}
+-\entry {\code {ECHOCTL}}{422}
+-\entry {\code {ECHOE}}{421}
+-\entry {\code {ECHOK}}{421}
+-\entry {\code {ECHOKE}}{422}
+-\entry {\code {ECHONL}}{422}
+-\entry {\code {ECHOPRT}}{421}
+-\entry {\code {ECHRNG}}{25}
+-\entry {\code {ECOMM}}{26}
+-\entry {\code {ECONNABORTED}}{21}
+-\entry {\code {ECONNREFUSED}}{22}
+-\entry {\code {ECONNRESET}}{21}
+-\entry {\code {ED}}{24}
+-\entry {\code {EDEADLK}}{17}
+-\entry {\code {EDEADLOCK}}{26}
+-\entry {\code {EDESTADDRREQ}}{22}
+-\entry {\code {EDIED}}{24}
+-\entry {\code {EDOM}}{19}
+-\entry {\code {EDOTDOT}}{26}
+-\entry {\code {EDQUOT}}{23}
+-\entry {\code {EEXIST}}{18}
+-\entry {\code {EFAULT}}{17}
+-\entry {\code {EFBIG}}{19}
+-\entry {\code {EFTYPE}}{23}
+-\entry {\code {EGRATUITOUS}}{25}
+-\entry {\code {EGREGIOUS}}{24}
+-\entry {\code {EHOSTDOWN}}{22}
+-\entry {\code {EHOSTUNREACH}}{22}
+-\entry {\code {EIDRM}}{25}
+-\entry {\code {EIEIO}}{24}
+-\entry {\code {EILSEQ}}{24}
+-\entry {\code {EINPROGRESS}}{20}
+-\entry {\code {EINTR}}{16}
+-\entry {\code {EINVAL}}{18, 432}
+-\entry {\code {EIO}}{16}
+-\entry {\code {EISCONN}}{21}
+-\entry {\code {EISDIR}}{18}
+-\entry {\code {EISNAM}}{26}
+-\entry {\code {EL2HLT}}{25}
+-\entry {\code {EL2NSYNC}}{25}
+-\entry {\code {EL3HLT}}{25}
+-\entry {\code {EL3RST}}{25}
+-\entry {\code {ELIBACC}}{26}
+-\entry {\code {ELIBBAD}}{26}
+-\entry {\code {ELIBEXEC}}{26}
+-\entry {\code {ELIBMAX}}{26}
+-\entry {\code {ELIBSCN}}{26}
+-\entry {\code {ELNRNG}}{25}
+-\entry {\code {ELOOP}}{22}
+-\entry {\code {EMEDIUMTYPE}}{26}
+-\entry {\code {EMFILE}}{18}
+-\entry {\code {EMLINK}}{19}
+-\entry {\code {EMPTY}}{672, 676}
+-\entry {\code {EMSGSIZE}}{20}
+-\entry {\code {EMULTIHOP}}{25}
+-\entry {\code {ENAMETOOLONG}}{22}
+-\entry {\code {ENAVAIL}}{26}
+-\entry {\code {ENEEDAUTH}}{24}
+-\entry {\code {ENETDOWN}}{21}
+-\entry {\code {ENETRESET}}{21}
+-\entry {\code {ENETUNREACH}}{21}
+-\entry {\code {ENFILE}}{18}
+-\entry {\code {ENOANO}}{26}
+-\entry {\code {ENOBUFS}}{21}
+-\entry {\code {ENOCSI}}{25}
+-\entry {\code {ENODATA}}{25}
+-\entry {\code {ENODEV}}{18}
+-\entry {\code {ENOENT}}{16}
+-\entry {\code {ENOEXEC}}{17}
+-\entry {\code {ENOLCK}}{23}
+-\entry {\code {ENOLINK}}{25}
+-\entry {\code {ENOMEDIUM}}{26}
+-\entry {\code {ENOMEM}}{17}
+-\entry {\code {ENOMSG}}{25}
+-\entry {\code {ENONET}}{26}
+-\entry {\code {ENOPKG}}{26}
+-\entry {\code {ENOPROTOOPT}}{20}
+-\entry {\code {ENOSPC}}{19}
+-\entry {\code {ENOSR}}{25}
+-\entry {\code {ENOSTR}}{25}
+-\entry {\code {ENOSYS}}{24}
+-\entry {\code {ENOTBLK}}{17}
+-\entry {\code {ENOTCONN}}{22}
+-\entry {\code {ENOTDIR}}{18}
+-\entry {\code {ENOTEMPTY}}{22}
+-\entry {\code {ENOTNAM}}{26}
+-\entry {\code {ENOTSOCK}}{20}
+-\entry {\code {ENOTSUP}}{24}
+-\entry {\code {ENOTTY}}{18, 432}
+-\entry {\code {ENOTUNIQ}}{26}
+-\entry {\code {environ}}{611}
+-\entry {\code {ENXIO}}{17}
+-\entry {\code {EOF}}{250}
+-\entry {\code {EOPNOTSUPP}}{21}
+-\entry {\code {EOVERFLOW}}{25}
+-\entry {\code {EPERM}}{16}
+-\entry {\code {EPFNOSUPPORT}}{21}
+-\entry {\code {EPIPE}}{19}
+-\entry {\code {EPROCLIM}}{23}
+-\entry {\code {EPROCUNAVAIL}}{23}
+-\entry {\code {EPROGMISMATCH}}{23}
+-\entry {\code {EPROGUNAVAIL}}{23}
+-\entry {\code {EPROTO}}{25}
+-\entry {\code {EPROTONOSUPPORT}}{20}
+-\entry {\code {EPROTOTYPE}}{20}
+-\entry {\code {EQUIV_CLASS_MAX}}{714}
+-\entry {\code {ERA}}{151}
+-\entry {\code {ERA_D_FMT}}{152}
+-\entry {\code {ERA_D_T_FMT}}{152}
+-\entry {\code {ERA_T_FMT}}{152}
+-\entry {\code {ERA_YEAR}}{151}
+-\entry {\code {ERANGE}}{19}
+-\entry {\code {EREMCHG}}{26}
+-\entry {\code {EREMOTE}}{23}
+-\entry {\code {EREMOTEIO}}{26}
+-\entry {\code {ERESTART}}{25}
+-\entry {\code {EROFS}}{19}
+-\entry {\code {ERPCMISMATCH}}{23}
+-\entry {\code {errno}}{15}
+-\entry {\code {ESHUTDOWN}}{22}
+-\entry {\code {ESOCKTNOSUPPORT}}{20}
+-\entry {\code {ESPIPE}}{19}
+-\entry {\code {ESRCH}}{16}
+-\entry {\code {ESRMNT}}{26}
+-\entry {\code {ESTALE}}{23}
+-\entry {\code {ESTRPIPE}}{26}
+-\entry {\code {ethers}}{651}
+-\entry {\code {ETIME}}{25}
+-\entry {\code {ETIMEDOUT}}{22}
+-\entry {\code {ETOOMANYREFS}}{22}
+-\entry {\code {ETXTBSY}}{18}
+-\entry {\code {EUCLEAN}}{26}
+-\entry {\code {EUNATCH}}{25}
+-\entry {\code {EUSERS}}{23}
+-\entry {\code {EWOULDBLOCK}}{20}
+-\entry {\code {EXDEV}}{18}
+-\entry {\code {EXFULL}}{26}
+-\entry {\code {EXIT_FAILURE}}{615}
+-\entry {\code {EXIT_SUCCESS}}{614}
+-\entry {\code {EXPR_NEST_MAX}}{714}
+-\entry {\code {EXTA}}{424}
+-\entry {\code {EXTB}}{424}
+-\initial {F}
+-\entry {\code {F_DUPFD}}{306}
+-\entry {\code {F_GETFD}}{307}
+-\entry {\code {F_GETFL}}{313}
+-\entry {\code {F_GETLK}}{315}
+-\entry {\code {F_GETOWN}}{317}
+-\entry {\code {F_OK}}{349}
+-\entry {\code {F_RDLCK}}{316}
+-\entry {\code {F_SETFD}}{308}
+-\entry {\code {F_SETFL}}{313}
+-\entry {\code {F_SETLK}}{315}
+-\entry {\code {F_SETLKW}}{316}
+-\entry {\code {F_SETOWN}}{317}
+-\entry {\code {F_UNLCK}}{317}
+-\entry {\code {F_WRLCK}}{317}
+-\entry {\code {FD_CLOEXEC}}{308}
+-\entry {\code {FD_SETSIZE}}{289}
+-\entry {\code {FE_DFL_ENV}}{468}
+-\entry {\code {FE_DIVBYZERO}}{464}
+-\entry {\code {FE_DOWNWARD}}{466}
+-\entry {\code {FE_INEXACT}}{464}
+-\entry {\code {FE_INVALID}}{464}
+-\entry {\code {FE_NOMASK_ENV}}{468}
+-\entry {\code {FE_OVERFLOW}}{464}
+-\entry {\code {FE_TONEAREST}}{466}
+-\entry {\code {FE_TOWARDZERO}}{466}
+-\entry {\code {FE_UNDERFLOW}}{464}
+-\entry {\code {FE_UPWARD}}{466}
+-\entry {\code {FILENAME_MAX}}{710}
+-\entry {\code {FLT_DIG}}{756}
+-\entry {\code {FLT_EPSILON}}{758}
+-\entry {\code {FLT_MANT_DIG}}{756}
+-\entry {\code {FLT_MAX}}{757}
+-\entry {\code {FLT_MAX_10_EXP}}{757}
+-\entry {\code {FLT_MAX_EXP}}{757}
+-\entry {\code {FLT_MIN}}{757}
+-\entry {\code {FLT_MIN_10_EXP}}{757}
+-\entry {\code {FLT_MIN_EXP}}{756}
+-\entry {\code {FLT_RADIX}}{756}
+-\entry {\code {FLT_ROUNDS}}{755}
+-\entry {\code {FLUSHO}}{423}
+-\entry {\code {FOPEN_MAX}}{213}
+-\entry {\code {FP_FAST_FMA}}{476}
+-\entry {\code {FP_ILOGB0}}{444}
+-\entry {\code {FP_ILOGBNAN}}{444}
+-\entry {\code {FP_INFINITE}}{459}
+-\entry {\code {FP_NAN}}{459}
+-\entry {\code {FP_NORMAL}}{460}
+-\entry {\code {FP_SUBNORMAL}}{460}
+-\entry {\code {FP_ZERO}}{459}
+-\entry {\code {FPE_DECOVF_TRAP}}{531}
+-\entry {\code {FPE_FLTDIV_TRAP}}{531}
+-\entry {\code {FPE_FLTOVF_TRAP}}{531}
+-\entry {\code {FPE_FLTUND_TRAP}}{531}
+-\entry {\code {FPE_INTDIV_TRAP}}{530}
+-\entry {\code {FPE_INTOVF_TRAP}}{530}
+-\entry {\code {FPE_SUBRNG_TRAP}}{530}
+-\entry {\code {FRAC_DIGITS}}{153}
+-\entry {\code {FSTAB}}{691}
+-\entry {\code {FSTAB_RO}}{692}
+-\entry {\code {FSTAB_RQ}}{692}
+-\entry {\code {FSTAB_RW}}{692}
+-\entry {\code {FSTAB_SW}}{692}
+-\entry {\code {FSTAB_XX}}{692}
+-\entry {\code {FTW_CHDIR}}{330}
+-\entry {\code {FTW_D}}{327}
+-\entry {\code {FTW_DEPTH}}{330}
+-\entry {\code {FTW_DNR}}{327}
+-\entry {\code {FTW_DP}}{328}
+-\entry {\code {FTW_F}}{327}
+-\entry {\code {FTW_MOUNT}}{330}
+-\entry {\code {FTW_NS}}{327}
+-\entry {\code {FTW_PHYS}}{330}
+-\entry {\code {FTW_SL}}{327}
+-\entry {\code {FTW_SLN}}{328}
+-\initial {G}
+-\entry {\code {getdate_err}}{505}
+-\entry {\code {group}}{651}
+-\entry {\code {GROUPING}}{153}
+-\initial {H}
+-\entry {\code {h_errno}}{378}
+-\entry {\code {HOST_NOT_FOUND}}{379}
+-\entry {\code {hosts}}{651}
+-\entry {\code {HUGE_VAL}}{466}
+-\entry {\code {HUGE_VALF}}{466}
+-\entry {\code {HUGE_VALL}}{466}
+-\entry {\code {HUPCL}}{419}
+-\initial {I}
+-\entry {\code {I}}{477}
+-\entry {\code {ICANON}}{421}
+-\entry {\code {ICRNL}}{417}
+-\entry {\code {IEXTEN}}{422}
+-\entry {\code {IFNAMSIZ}}{368}
+-\entry {\code {IGNBRK}}{417}
+-\entry {\code {IGNCR}}{417}
+-\entry {\code {IGNPAR}}{416}
+-\entry {\code {IMAXBEL}}{418}
+-\entry {\code {in6addr_any}}{375}
+-\entry {\code {in6addr_loopback}}{375}
+-\entry {\code {INADDR_ANY}}{375}
+-\entry {\code {INADDR_BROADCAST}}{375}
+-\entry {\code {INADDR_LOOPBACK}}{375}
+-\entry {\code {INADDR_NONE}}{375}
+-\entry {\code {INFINITY}}{463}
+-\entry {\code {INIT_PROCESS}}{672, 677}
+-\entry {\code {INLCR}}{417}
+-\entry {\code {INPCK}}{416}
+-\entry {\code {INT_CURR_SYMBOL}}{152}
+-\entry {\code {INT_FRAC_DIGITS}}{152}
+-\entry {\code {INT_MAX}}{753}
+-\entry {\code {INT_MIN}}{753}
+-\entry {\code {IPPORT_RESERVED}}{381}
+-\entry {\code {IPPORT_USERRESERVED}}{381}
+-\entry {\code {ISIG}}{422}
+-\entry {\code {ISTRIP}}{417}
+-\entry {\code {IXANY}}{418}
+-\entry {\code {IXOFF}}{418}
+-\entry {\code {IXON}}{418}
+-\initial {L}
+-\entry {\code {L_ctermid}}{646}
+-\entry {\code {L_cuserid}}{671}
+-\entry {\code {L_INCR}}{254}
+-\entry {\code {L_SET}}{254}
+-\entry {\code {L_tmpnam}}{354}
+-\entry {\code {L_XTND}}{254}
+-\entry {\code {LANG}}{143}
+-\entry {\code {LANGUAGE}}{143}
+-\entry {\code {LC_ALL}}{143}
+-\entry {\code {LC_COLLATE}}{142}
+-\entry {\code {LC_CTYPE}}{142}
+-\entry {\code {LC_MESSAGES}}{142}
+-\entry {\code {LC_MONETARY}}{142}
+-\entry {\code {LC_NUMERIC}}{142}
+-\entry {\code {LC_TIME}}{142}
+-\entry {\code {LDBL_DIG}}{756}
+-\entry {\code {LDBL_EPSILON}}{758}
+-\entry {\code {LDBL_MANT_DIG}}{756}
+-\entry {\code {LDBL_MAX}}{757}
+-\entry {\code {LDBL_MAX_10_EXP}}{757}
+-\entry {\code {LDBL_MAX_EXP}}{757}
+-\entry {\code {LDBL_MIN}}{758}
+-\entry {\code {LDBL_MIN_10_EXP}}{757}
+-\entry {\code {LDBL_MIN_EXP}}{757}
+-\entry {\code {LINE_MAX}}{714}
+-\entry {\code {LINK_MAX}}{709}
+-\entry {\code {LIO_NOP}}{294}
+-\entry {\code {LIO_READ}}{294}
+-\entry {\code {LIO_WRITE}}{294}
+-\entry {\code {LOGIN_PROCESS}}{672, 677}
+-\entry {\code {LONG_LONG_MAX}}{753}
+-\entry {\code {LONG_LONG_MIN}}{753}
+-\entry {\code {LONG_MAX}}{753}
+-\entry {\code {LONG_MIN}}{753}
+-\initial {M}
+-\entry {\code {M_1_PI}}{439}
+-\entry {\code {M_2_PI}}{439}
+-\entry {\code {M_2_SQRTPI}}{439}
+-\entry {\code {M_E}}{439}
+-\entry {\code {M_LN10}}{439}
+-\entry {\code {M_LN2}}{439}
+-\entry {\code {M_LOG10E}}{439}
+-\entry {\code {M_LOG2E}}{439}
+-\entry {\code {M_PI}}{439}
+-\entry {\code {M_PI_2}}{439}
+-\entry {\code {M_PI_4}}{439}
+-\entry {\code {M_SQRT1_2}}{439}
+-\entry {\code {M_SQRT2}}{439}
+-\entry {\code {MAP_ANON}}{287}
+-\entry {\code {MAP_ANONYMOUS}}{287}
+-\entry {\code {MAP_FIXED}}{287}
+-\entry {\code {MAP_PRIVATE}}{286}
+-\entry {\code {MAP_SHARED}}{287}
+-\entry {\code {MAX_CANON}}{709}
+-\entry {\code {MAX_INPUT}}{709}
+-\entry {\code {MAXNAMLEN}}{710}
+-\entry {\code {MB_CUR_MAX}}{102}
+-\entry {\code {MB_LEN_MAX}}{102}
+-\entry {\code {MDMBUF}}{420}
+-\entry {\code {MINSIGSTKSZ}}{570}
+-\entry {\code {MM_APPL}}{265}
+-\entry {\code {MM_CONSOLE}}{264}
+-\entry {\code {MM_ERROR}}{266}
+-\entry {\code {MM_FIRM}}{265}
+-\entry {\code {MM_HALT}}{266}
+-\entry {\code {MM_HARD}}{265}
+-\entry {\code {MM_INFO}}{266}
+-\entry {\code {MM_NOSEV}}{266}
+-\entry {\code {MM_NRECOV}}{265}
+-\entry {\code {MM_NULLACT}}{266}
+-\entry {\code {MM_NULLLBL}}{265}
+-\entry {\code {MM_NULLMC}}{265}
+-\entry {\code {MM_NULLSEV}}{265}
+-\entry {\code {MM_NULLTAG}}{266}
+-\entry {\code {MM_NULLTXT}}{265}
+-\entry {\code {MM_OPSYS}}{265}
+-\entry {\code {MM_PRINT}}{264}
+-\entry {\code {MM_RECOVER}}{265}
+-\entry {\code {MM_SOFT}}{265}
+-\entry {\code {MM_UTIL}}{265}
+-\entry {\code {MM_WARNING}}{266}
+-\entry {\code {MNTOPT_DEFAULTS}}{694}
+-\entry {\code {MNTOPT_NOAUTO}}{695}
+-\entry {\code {MNTOPT_NOSUID}}{695}
+-\entry {\code {MNTOPT_RO}}{694}
+-\entry {\code {MNTOPT_RW}}{694}
+-\entry {\code {MNTOPT_SUID}}{694}
+-\entry {\code {MNTTYPE_IGNORE}}{694}
+-\entry {\code {MNTTYPE_NFS}}{694}
+-\entry {\code {MNTTYPE_SWAP}}{694}
+-\entry {\code {MON_1}}{150}
+-\entry {\code {MON_10}}{151}
+-\entry {\code {MON_11}}{151}
+-\entry {\code {MON_12}}{151}
+-\entry {\code {MON_2}}{151}
+-\entry {\code {MON_3}}{151}
+-\entry {\code {MON_4}}{151}
+-\entry {\code {MON_5}}{151}
+-\entry {\code {MON_6}}{151}
+-\entry {\code {MON_7}}{151}
+-\entry {\code {MON_8}}{151}
+-\entry {\code {MON_9}}{151}
+-\entry {\code {MON_DECIMAL_POINT}}{152}
+-\entry {\code {MON_GROUPING}}{152}
+-\entry {\code {MON_THOUSANDS_SEP}}{152}
+-\entry {\code {MS_ASYNC}}{288}
+-\entry {\code {MS_SYNC}}{288}
+-\entry {\code {MSG_DONTROUTE}}{394}
+-\entry {\code {MSG_OOB}}{394}
+-\entry {\code {MSG_PEEK}}{394}
+-\initial {N}
+-\entry {\code {N_CS_PRECEDES}}{153}
+-\entry {\code {N_SEP_BY_SPACE}}{153}
+-\entry {\code {N_SIGN_POSN}}{153}
+-\entry {\code {NAME_MAX}}{710}
+-\entry {\code {NAN}}{463}
+-\entry {\code {NCCS}}{414}
+-\entry {\code {NDEBUG}}{743}
+-\entry {\code {NEGATIVE_SIGN}}{152}
+-\entry {\code {netgroup}}{651}
+-\entry {\code {networks}}{651}
+-\entry {\code {NEW_TIME}}{672, 677}
+-\entry {\code {NGROUPS_MAX}}{698}
+-\entry {\code {NL_ARGMAX}}{223}
+-\entry {\code {NO_ADDRESS}}{379}
+-\entry {\code {NO_RECOVERY}}{379}
+-\entry {\code {NOEXPR}}{153}
+-\entry {\code {NOFLSH}}{422}
+-\entry {\code {NOKERNINFO}}{423}
+-\entry {\code {NOSTR}}{154}
+-\entry {\code {NSIG}}{529}
+-\entry {\code {NSS_STATUS_NOTFOUND}}{656}
+-\entry {\code {NSS_STATUS_SUCCESS}}{656}
+-\entry {\code {NSS_STATUS_TRYAGAIN}}{656}
+-\entry {\code {NSS_STATUS_UNAVAIL}}{656}
+-\entry {\code {NULL}}{750}
+-\initial {O}
+-\entry {\code {O_ACCMODE}}{310}
+-\entry {\code {O_APPEND}}{312}
+-\entry {\code {O_ASYNC}}{312}
+-\entry {\code {O_CREAT}}{310}
+-\entry {\code {O_EXCL}}{310}
+-\entry {\code {O_EXEC}}{310}
+-\entry {\code {O_EXLOCK}}{312}
+-\entry {\code {O_FSYNC}}{312}
+-\entry {\code {O_IGNORE_CTTY}}{311}
+-\entry {\code {O_NDELAY}}{312}
+-\entry {\code {O_NOATIME}}{313}
+-\entry {\code {O_NOCTTY}}{311}
+-\entry {\code {O_NOLINK}}{311}
+-\entry {\code {O_NONBLOCK}}{310, 312}
+-\entry {\code {O_NOTRANS}}{311}
+-\entry {\code {O_RDONLY}}{309}
+-\entry {\code {O_RDWR}}{309}
+-\entry {\code {O_READ}}{309}
+-\entry {\code {O_SHLOCK}}{311}
+-\entry {\code {O_SYNC}}{312}
+-\entry {\code {O_TRUNC}}{311}
+-\entry {\code {O_WRITE}}{309}
+-\entry {\code {O_WRONLY}}{309}
+-\entry {\code {obstack_alloc_failed_handler}}{48}
+-\entry {\code {OLD_TIME}}{672, 677}
+-\entry {\code {ONLCR}}{419}
+-\entry {\code {ONOEOT}}{419}
+-\entry {\code {OPEN_MAX}}{697}
+-\entry {\code {OPOST}}{418}
+-\entry {\code {optarg}}{577}
+-\entry {\code {opterr}}{577}
+-\entry {\code {optind}}{577}
+-\entry {\code {OPTION_ALIAS}}{587}
+-\entry {\code {OPTION_ARG_OPTIONAL}}{587}
+-\entry {\code {OPTION_DOC}}{587}
+-\entry {\code {OPTION_HIDDEN}}{587}
+-\entry {\code {OPTION_NO_USAGE}}{588}
+-\entry {\code {optopt}}{577}
+-\entry {\code {OXTABS}}{419}
+-\initial {P}
+-\entry {\code {P_CS_PRECEDES}}{153}
+-\entry {\code {P_SEP_BY_SPACE}}{153}
+-\entry {\code {P_SIGN_POSN}}{153}
+-\entry {\code {P_tmpdir}}{355}
+-\entry {\code {PA_CHAR}}{234}
+-\entry {\code {PA_DOUBLE}}{235}
+-\entry {\code {PA_FLAG_LONG}}{235}
+-\entry {\code {PA_FLAG_LONG_DOUBLE}}{235}
+-\entry {\code {PA_FLAG_LONG_LONG}}{235}
+-\entry {\code {PA_FLAG_MASK}}{234}
+-\entry {\code {PA_FLAG_PTR}}{235}
+-\entry {\code {PA_FLAG_SHORT}}{235}
+-\entry {\code {PA_FLOAT}}{234}
+-\entry {\code {PA_INT}}{234}
+-\entry {\code {PA_LAST}}{235}
+-\entry {\code {PA_POINTER}}{234}
+-\entry {\code {PA_STRING}}{234}
+-\entry {\code {PARENB}}{420}
+-\entry {\code {PARMRK}}{417}
+-\entry {\code {PARODD}}{420}
+-\entry {\code {passwd}}{651}
+-\entry {\code {PATH_MAX}}{710}
+-\entry {\code {PENDIN}}{423}
+-\entry {\code {PF_CCITT}}{386}
+-\entry {\code {PF_FILE}}{369}
+-\entry {\code {PF_IMPLINK}}{386}
+-\entry {\code {PF_INET}}{371}
+-\entry {\code {PF_ISO}}{386}
+-\entry {\code {PF_LOCAL}}{369}
+-\entry {\code {PF_NS}}{386}
+-\entry {\code {PF_ROUTE}}{386}
+-\entry {\code {PF_UNIX}}{369}
+-\entry {\code {PI}}{440}
+-\entry {\code {PIPE_BUF}}{710}
+-\entry {\code {PM_STR}}{151}
+-\entry {\code {POSITIVE_SIGN}}{152}
+-\entry {\code {PRIO_MAX}}{521}
+-\entry {\code {PRIO_MIN}}{521}
+-\entry {\code {PRIO_PGRP}}{522}
+-\entry {\code {PRIO_PROCESS}}{522}
+-\entry {\code {PRIO_USER}}{522}
+-\entry {\code {program_invocation_name}}{28}
+-\entry {\code {program_invocation_short_name}}{28}
+-\entry {\code {PROT_EXEC}}{286}
+-\entry {\code {PROT_READ}}{286}
+-\entry {\code {PROT_WRITE}}{286}
+-\entry {\code {protocols}}{651}
+-\initial {R}
+-\entry {\code {R_OK}}{349}
+-\entry {\code {RADIXCHAR}}{153}
+-\entry {\code {RAND_MAX}}{452}
+-\entry {\code {RE_DUP_MAX}}{698}
+-\entry {\code {RLIM_INFINITY}}{521}
+-\entry {\code {RLIM_NLIMITS}}{521}
+-\entry {\code {RLIMIT_CORE}}{520}
+-\entry {\code {RLIMIT_CPU}}{520}
+-\entry {\code {RLIMIT_DATA}}{520}
+-\entry {\code {RLIMIT_FSIZE}}{520}
+-\entry {\code {RLIMIT_NOFILE}}{521}
+-\entry {\code {RLIMIT_OFILE}}{521}
+-\entry {\code {RLIMIT_RSS}}{521}
+-\entry {\code {RLIMIT_STACK}}{520}
+-\entry {\code {rpc}}{651}
+-\entry {\code {RUN_LVL}}{672, 676}
+-\initial {S}
+-\entry {\code {S_IEXEC}}{344}
+-\entry {\code {S_IFBLK}}{342}
+-\entry {\code {S_IFCHR}}{342}
+-\entry {\code {S_IFDIR}}{342}
+-\entry {\code {S_IFIFO}}{343}
+-\entry {\code {S_IFLNK}}{343}
+-\entry {\code {S_IFMT}}{342}
+-\entry {\code {S_IFREG}}{343}
+-\entry {\code {S_IFSOCK}}{343}
+-\entry {\code {S_IREAD}}{344}
+-\entry {\code {S_IRGRP}}{344}
+-\entry {\code {S_IROTH}}{345}
+-\entry {\code {S_IRUSR}}{344}
+-\entry {\code {S_IRWXG}}{344}
+-\entry {\code {S_IRWXO}}{345}
+-\entry {\code {S_IRWXU}}{344}
+-\entry {\code {S_ISGID}}{345}
+-\entry {\code {S_ISUID}}{345}
+-\entry {\code {S_ISVTX}}{345}
+-\entry {\code {S_IWGRP}}{344}
+-\entry {\code {S_IWOTH}}{345}
+-\entry {\code {S_IWRITE}}{344}
+-\entry {\code {S_IWUSR}}{344}
+-\entry {\code {S_IXGRP}}{344}
+-\entry {\code {S_IXOTH}}{345}
+-\entry {\code {S_IXUSR}}{344}
+-\entry {\code {SA_NOCLDSTOP}}{543}
+-\entry {\code {SA_ONSTACK}}{543}
+-\entry {\code {SA_RESTART}}{544}
+-\entry {\code {SCHAR_MAX}}{752}
+-\entry {\code {SCHAR_MIN}}{752}
+-\entry {\code {SEEK_CUR}}{254}
+-\entry {\code {SEEK_END}}{254}
+-\entry {\code {SEEK_SET}}{254}
+-\entry {\code {SEM_VALUE_MAX}}{735}
+-\entry {\code {services}}{651}
+-\entry {\code {shadow}}{652}
+-\entry {\code {SHRT_MAX}}{753}
+-\entry {\code {SHRT_MIN}}{753}
+-\entry {\code {SIG_BLOCK}}{562}
+-\entry {\code {SIG_DFL}}{539}
+-\entry {\code {SIG_ERR}}{540}
+-\entry {\code {SIG_IGN}}{539}
+-\entry {\code {SIG_SETMASK}}{562}
+-\entry {\code {SIG_UNBLOCK}}{562}
+-\entry {\code {SIGABRT}}{532}
+-\entry {\code {SIGALRM}}{533}
+-\entry {\code {SIGBUS}}{531}
+-\entry {\code {SIGCHLD}}{534}
+-\entry {\code {SIGCLD}}{535}
+-\entry {\code {SIGCONT}}{535}
+-\entry {\code {SIGEMT}}{532}
+-\entry {\code {SIGFPE}}{530}
+-\entry {\code {SIGHUP}}{533}
+-\entry {\code {SIGILL}}{531}
+-\entry {\code {SIGINFO}}{537}
+-\entry {\code {SIGINT}}{532}
+-\entry {\code {SIGIO}}{534}
+-\entry {\code {SIGIOT}}{532}
+-\entry {\code {SIGKILL}}{533}
+-\entry {\code {SIGLOST}}{536}
+-\entry {\code {signgam}}{449}
+-\entry {\code {SIGPIPE}}{536}
+-\entry {\code {SIGPOLL}}{534}
+-\entry {\code {SIGPROF}}{534}
+-\entry {\code {SIGQUIT}}{533}
+-\entry {\code {SIGSEGV}}{531}
+-\entry {\code {SIGSTKSZ}}{570}
+-\entry {\code {SIGSTOP}}{535}
+-\entry {\code {SIGSYS}}{532}
+-\entry {\code {SIGTERM}}{532}
+-\entry {\code {SIGTRAP}}{532}
+-\entry {\code {SIGTSTP}}{535}
+-\entry {\code {SIGTTIN}}{535}
+-\entry {\code {SIGTTOU}}{535}
+-\entry {\code {SIGURG}}{534}
+-\entry {\code {SIGUSR1}}{537}
+-\entry {\code {SIGUSR2}}{537}
+-\entry {\code {SIGVTALRM}}{534}
+-\entry {\code {SIGWINCH}}{537}
+-\entry {\code {SIGXCPU}}{536}
+-\entry {\code {SIGXFSZ}}{537}
+-\entry {\code {SOCK_DGRAM}}{364}
+-\entry {\code {SOCK_RAW}}{365}
+-\entry {\code {SOCK_STREAM}}{364}
+-\entry {\code {SOL_SOCKET}}{407}
+-\entry {\code {SS_DISABLE}}{570}
+-\entry {\code {SS_ONSTACK}}{570}
+-\entry {\code {SSIZE_MAX}}{698}
+-\entry {\code {stderr}}{211}
+-\entry {\code {STDERR_FILENO}}{283}
+-\entry {\code {stdin}}{211}
+-\entry {\code {STDIN_FILENO}}{283}
+-\entry {\code {stdout}}{211}
+-\entry {\code {STDOUT_FILENO}}{283}
+-\entry {\code {STREAM_MAX}}{697}
+-\entry {\code {SV_INTERRUPT}}{572}
+-\entry {\code {SV_ONSTACK}}{572}
+-\entry {\code {SV_RESETHAND}}{572}
+-\entry {\code {sys_siglist}}{538}
+-\initial {T}
+-\entry {\code {T_FMT}}{151}
+-\entry {\code {T_FMT_AMPM}}{151}
+-\entry {\code {TCIFLUSH}}{431}
+-\entry {\code {TCIOFF}}{432}
+-\entry {\code {TCIOFLUSH}}{431}
+-\entry {\code {TCION}}{432}
+-\entry {\code {TCOFLUSH}}{431}
+-\entry {\code {TCOOFF}}{432}
+-\entry {\code {TCOON}}{432}
+-\entry {\code {TCSADRAIN}}{414}
+-\entry {\code {TCSAFLUSH}}{414}
+-\entry {\code {TCSANOW}}{414}
+-\entry {\code {TCSASOFT}}{414}
+-\entry {\code {THOUSANDS_SEP}}{153}
+-\entry {\code {THOUSEP}}{153}
+-\entry {\code {timezone}}{509}
+-\entry {\code {TMP_MAX}}{354}
+-\entry {\code {TOSTOP}}{422}
+-\entry {\code {TRY_AGAIN}}{379}
+-\entry {\code {tzname}}{509}
+-\entry {\code {TZNAME_MAX}}{697}
+-\initial {U}
+-\entry {\code {UCHAR_MAX}}{752}
+-\entry {\code {UINT_MAX}}{753}
+-\entry {\code {ULONG_LONG_MAX}}{753}
+-\entry {\code {ULONG_MAX}}{753}
+-\entry {\code {USER_PROCESS}}{672, 677}
+-\entry {\code {USHRT_MAX}}{753}
+-\initial {V}
+-\entry {\code {VDISCARD}}{428}
+-\entry {\code {VDSUSP}}{427}
+-\entry {\code {VEOF}}{425}
+-\entry {\code {VEOL}}{425}
+-\entry {\code {VEOL2}}{425}
+-\entry {\code {VERASE}}{426}
+-\entry {\code {VINTR}}{427}
+-\entry {\code {VKILL}}{426}
+-\entry {\code {VLNEXT}}{428}
+-\entry {\code {VMIN}}{429}
+-\entry {\code {VQUIT}}{427}
+-\entry {\code {VREPRINT}}{426}
+-\entry {\code {VSTART}}{428}
+-\entry {\code {VSTATUS}}{429}
+-\entry {\code {VSTOP}}{428}
+-\entry {\code {VSUSP}}{427}
+-\entry {\code {VTIME}}{429}
+-\entry {\code {VWERASE}}{426}
+-\initial {W}
+-\entry {\code {W_OK}}{349}
+-\entry {\code {WCHAR_MAX}}{98, 753}
+-\entry {\code {WCHAR_MIN}}{98}
+-\entry {\code {WEOF}}{98}
+-\initial {X}
+-\entry {\code {X_OK}}{349}
+-\initial {Y}
+-\entry {\code {YESEXPR}}{153}
+-\entry {\code {YESSTR}}{153}
+diff -Naur ../glibc-2.1.3/manual/libcbook.texi glibc-2.1.3/manual/libcbook.texi
+--- ../glibc-2.1.3/manual/libcbook.texi	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/manual/libcbook.texi	1998-02-07 12:17:00.000000000 -0800
+@@ -0,0 +1,3 @@
++\input texinfo
++@finalout
++@include libc.texinfo
+diff -Naur ../glibc-2.1.3/manual/longopt.c.texi glibc-2.1.3/manual/longopt.c.texi
+--- ../glibc-2.1.3/manual/longopt.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/longopt.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,94 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <getopt.h>
+-
+-/* @r{Flag set by @samp{--verbose}.} */
+-static int verbose_flag;
+-
+-int
+-main (argc, argv)
+-     int argc;
+-     char **argv;
+-@{
+-  int c;
+-
+-  while (1)
+-    @{
+-      static struct option long_options[] =
+-        @{
+-          /* @r{These options set a flag.} */
+-          @{"verbose", 0, &verbose_flag, 1@},
+-          @{"brief", 0, &verbose_flag, 0@},
+-          /* @r{These options don't set a flag.
+-             We distinguish them by their indices.} */
+-          @{"add", 1, 0, 0@},
+-          @{"append", 0, 0, 0@},
+-          @{"delete", 1, 0, 0@},
+-          @{"create", 0, 0, 0@},
+-          @{"file", 1, 0, 0@},
+-          @{0, 0, 0, 0@}
+-        @};
+-      /* @r{@code{getopt_long} stores the option index here.} */
+-      int option_index = 0;
+-
+-      c = getopt_long (argc, argv, "abc:d:",
+-                       long_options, &option_index);
+-
+-      /* @r{Detect the end of the options.} */
+-      if (c == -1)
+-        break;
+-
+-      switch (c)
+-        @{
+-        case 0:
+-          /* @r{If this option set a flag, do nothing else now.} */
+-          if (long_options[option_index].flag != 0)
+-            break;
+-          printf ("option %s", long_options[option_index].name);
+-          if (optarg)
+-            printf (" with arg %s", optarg);
+-          printf ("\n");
+-          break;
+-
+-        case 'a':
+-          puts ("option -a\n");
+-          break;
+-
+-        case 'b':
+-          puts ("option -b\n");
+-          break;
+-
+-        case 'c':
+-          printf ("option -c with value `%s'\n", optarg);
+-          break;
+-
+-        case 'd':
+-          printf ("option -d with value `%s'\n", optarg);
+-          break;
+-
+-        case '?':
+-          /* @r{@code{getopt_long} already printed an error message.} */
+-          break;
+-
+-        default:
+-          abort ();
+-        @}
+-    @}
+-
+-  /* @r{Instead of reporting @samp{--verbose}
+-     and @samp{--brief} as they are encountered,
+-     we report the final status resulting from them.} */
+-  if (verbose_flag)
+-    puts ("verbose flag is set");
+-
+-  /* @r{Print any remaining command line arguments (not options).} */
+-  if (optind < argc)
+-    @{
+-      printf ("non-option ARGV-elements: ");
+-      while (optind < argc)
+-        printf ("%s ", argv[optind++]);
+-      putchar ('\n');
+-    @}
+-
+-  exit (0);
+-@}
+diff -Naur ../glibc-2.1.3/manual/memopen.c.texi glibc-2.1.3/manual/memopen.c.texi
+--- ../glibc-2.1.3/manual/memopen.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/memopen.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,17 +0,0 @@
+-#include <stdio.h>
+-
+-static char buffer[] = "foobar";
+-
+-int
+-main (void)
+-@{
+-  int ch;
+-  FILE *stream;
+-
+-  stream = fmemopen (buffer, strlen (buffer), "r");
+-  while ((ch = fgetc (stream)) != EOF)
+-    printf ("Got %c\n", ch);
+-  fclose (stream);
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/memstrm.c.texi glibc-2.1.3/manual/memstrm.c.texi
+--- ../glibc-2.1.3/manual/memstrm.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/memstrm.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,19 +0,0 @@
+-#include <stdio.h>
+-
+-int
+-main (void)
+-@{
+-  char *bp;
+-  size_t size;
+-  FILE *stream;
+-
+-  stream = open_memstream (&bp, &size);
+-  fprintf (stream, "hello");
+-  fflush (stream);
+-  printf ("buf = `%s', size = %d\n", bp, size);
+-  fprintf (stream, ", world");
+-  fclose (stream);
+-  printf ("buf = `%s', size = %d\n", bp, size);
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/mkfsock.c.texi glibc-2.1.3/manual/mkfsock.c.texi
+--- ../glibc-2.1.3/manual/mkfsock.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/mkfsock.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,44 +0,0 @@
+-#include <stddef.h>
+-#include <stdio.h>
+-#include <errno.h>
+-#include <stdlib.h>
+-#include <sys/socket.h>
+-#include <sys/un.h>
+-
+-int
+-make_named_socket (const char *filename)
+-@{
+-  struct sockaddr_un name;
+-  int sock;
+-  size_t size;
+-
+-  /* @r{Create the socket.} */
+-  sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
+-  if (sock < 0)
+-    @{
+-      perror ("socket");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Bind a name to the socket.} */
+-  name.sun_family = AF_LOCAL;
+-  strncpy (name.sun_path, filename, sizeof (name.sun_path));
+-
+-  /* @r{The size of the address is
+-     the offset of the start of the filename,
+-     plus its length,
+-     plus one for the terminating null byte.
+-     Alternativly you can just do:
+-     size = SUN_LEN (&name);
+-} */
+-  size = (offsetof (struct sockaddr_un, sun_path)
+-          + strlen (name.sun_path) + 1);
+-
+-  if (bind (sock, (struct sockaddr *) &name, size) < 0)
+-    @{
+-      perror ("bind");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  return sock;
+-@}
+diff -Naur ../glibc-2.1.3/manual/mkisock.c.texi glibc-2.1.3/manual/mkisock.c.texi
+--- ../glibc-2.1.3/manual/mkisock.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/mkisock.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,31 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <sys/socket.h>
+-#include <netinet/in.h>
+-
+-int 
+-make_socket (uint16_t port)
+-@{
+-  int sock;
+-  struct sockaddr_in name;
+-
+-  /* @r{Create the socket.} */
+-  sock = socket (PF_INET, SOCK_STREAM, 0);
+-  if (sock < 0)
+-    @{
+-      perror ("socket");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Give the socket a name.} */
+-  name.sin_family = AF_INET;
+-  name.sin_port = htons (port);
+-  name.sin_addr.s_addr = htonl (INADDR_ANY);
+-  if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
+-    @{
+-      perror ("bind");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  return sock;
+-@}
+diff -Naur ../glibc-2.1.3/manual/pipe.c.texi glibc-2.1.3/manual/pipe.c.texi
+--- ../glibc-2.1.3/manual/pipe.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/pipe.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,66 +0,0 @@
+-#include <sys/types.h>
+-#include <unistd.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-/* @r{Read characters from the pipe and echo them to @code{stdout}.} */
+-
+-void 
+-read_from_pipe (int file)
+-@{
+-  FILE *stream;
+-  int c;
+-  stream = fdopen (file, "r");
+-  while ((c = fgetc (stream)) != EOF)
+-    putchar (c);
+-  fclose (stream);
+-@}
+-
+-/* @r{Write some random text to the pipe.} */
+-
+-void 
+-write_to_pipe (int file)
+-@{
+-  FILE *stream;
+-  stream = fdopen (file, "w");
+-  fprintf (stream, "hello, world!\n");
+-  fprintf (stream, "goodbye, world!\n");
+-  fclose (stream);
+-@}
+-
+-int
+-main (void)
+-@{
+-  pid_t pid;
+-  int mypipe[2];
+-
+-@group
+-  /* @r{Create the pipe.} */
+-  if (pipe (mypipe))
+-    @{
+-      fprintf (stderr, "Pipe failed.\n");
+-      return EXIT_FAILURE;
+-    @}
+-@end group
+-
+-  /* @r{Create the child process.} */
+-  pid = fork ();
+-  if (pid == (pid_t) 0)
+-    @{
+-      /* @r{This is the child process.} */
+-      read_from_pipe (mypipe[0]);
+-      return EXIT_SUCCESS;
+-    @}
+-  else if (pid < (pid_t) 0)
+-    @{
+-      /* @r{The fork failed.} */
+-      fprintf (stderr, "Fork failed.\n");
+-      return EXIT_FAILURE;
+-    @}
+-  else
+-    @{
+-      /* @r{This is the parent process.} */
+-      write_to_pipe (mypipe[1]);
+-      return EXIT_SUCCESS;
+-    @}
+-@}
+diff -Naur ../glibc-2.1.3/manual/popen.c.texi glibc-2.1.3/manual/popen.c.texi
+--- ../glibc-2.1.3/manual/popen.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/popen.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,33 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-void 
+-write_data (FILE * stream)
+-@{
+-  int i;
+-  for (i = 0; i < 100; i++)
+-    fprintf (stream, "%d\n", i);
+-  if (ferror (stream))
+-    @{
+-      fprintf (stderr, "Output to stream failed.\n");
+-      exit (EXIT_FAILURE);
+-    @}
+-@}
+-
+-@group
+-int
+-main (void)
+-@{
+-  FILE *output;
+-
+-  output = popen ("more", "w");
+-  if (!output)
+-    @{
+-      fprintf (stderr, "Could not run more.\n");
+-      return EXIT_FAILURE;
+-    @}
+-  write_data (output);
+-  pclose (output);
+-  return EXIT_SUCCESS;
+-@}
+-@end group
+diff -Naur ../glibc-2.1.3/manual/rprintf.c.texi glibc-2.1.3/manual/rprintf.c.texi
+--- ../glibc-2.1.3/manual/rprintf.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/rprintf.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,67 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <printf.h>
+-
+-@group
+-typedef struct
+-@{
+-  char *name;
+-@}
+-Widget;
+-@end group
+-
+-int
+-print_widget (FILE *stream,
+-              const struct printf_info *info,
+-              const void *const *args)
+-@{
+-  const Widget *w;
+-  char *buffer;
+-  int len;
+-
+-  /* @r{Format the output into a string.} */
+-  w = *((const Widget **) (args[0]));
+-  len = asprintf (&buffer, "<Widget %p: %s>", w, w->name);
+-  if (len == -1)
+-    return -1;
+-
+-  /* @r{Pad to the minimum field width and print to the stream.} */
+-  len = fprintf (stream, "%*s",
+-                 (info->left ? -info->width : info->width),
+-                 buffer);
+-
+-  /* @r{Clean up and return.} */
+-  free (buffer);
+-  return len;
+-@}
+-
+-
+-int
+-print_widget_arginfo (const struct printf_info *info, size_t n,
+-                      int *argtypes)
+-@{
+-  /* @r{We always take exactly one argument and this is a pointer to the
+-     structure..} */
+-  if (n > 0)
+-    argtypes[0] = PA_POINTER;
+-  return 1;
+-@}
+-
+-
+-int
+-main (void)
+-@{
+-  /* @r{Make a widget to print.} */
+-  Widget mywidget;
+-  mywidget.name = "mywidget";
+-
+-  /* @r{Register the print function for widgets.} */
+-  register_printf_function ('W', print_widget, print_widget_arginfo);
+-
+-  /* @r{Now print the widget.} */
+-  printf ("|%W|\n", &mywidget);
+-  printf ("|%35W|\n", &mywidget);
+-  printf ("|%-35W|\n", &mywidget);
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/search.c.texi glibc-2.1.3/manual/search.c.texi
+--- ../glibc-2.1.3/manual/search.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/search.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,93 +0,0 @@
+-#include <stdlib.h>
+-#include <stdio.h>
+-#include <string.h>
+-
+-/* @r{Define an array of critters to sort.} */
+-
+-struct critter
+-  @{
+-    const char *name;
+-    const char *species;
+-  @};
+-
+-struct critter muppets[] =
+-  @{
+-    @{"Kermit", "frog"@},
+-    @{"Piggy", "pig"@},
+-    @{"Gonzo", "whatever"@},
+-    @{"Fozzie", "bear"@},
+-    @{"Sam", "eagle"@},
+-    @{"Robin", "frog"@},
+-    @{"Animal", "animal"@},
+-    @{"Camilla", "chicken"@},
+-    @{"Sweetums", "monster"@},
+-    @{"Dr. Strangepork", "pig"@},
+-    @{"Link Hogthrob", "pig"@},
+-    @{"Zoot", "human"@},
+-    @{"Dr. Bunsen Honeydew", "human"@},
+-    @{"Beaker", "human"@},
+-    @{"Swedish Chef", "human"@}
+-  @};
+-
+-int count = sizeof (muppets) / sizeof (struct critter);
+-
+-
+-
+-/* @r{This is the comparison function used for sorting and searching.} */
+-
+-int 
+-critter_cmp (const struct critter *c1, const struct critter *c2)
+-@{
+-  return strcmp (c1->name, c2->name);
+-@}
+-
+-
+-/* @r{Print information about a critter.} */
+-
+-void 
+-print_critter (const struct critter *c)
+-@{
+-  printf ("%s, the %s\n", c->name, c->species);
+-@}
+-
+-
+-@group
+-/* @r{Do the lookup into the sorted array.} */
+-
+-void 
+-find_critter (const char *name)
+-@{
+-  struct critter target, *result;
+-  target.name = name;
+-  result = bsearch (&target, muppets, count, sizeof (struct critter),
+-                    critter_cmp);
+-  if (result)
+-    print_critter (result);
+-  else
+-    printf ("Couldn't find %s.\n", name);
+-@}
+-@end group
+-
+-/* @r{Main program.} */
+-
+-int
+-main (void)
+-@{
+-  int i;
+-
+-  for (i = 0; i < count; i++)
+-    print_critter (&muppets[i]);
+-  printf ("\n");
+-
+-  qsort (muppets, count, sizeof (struct critter), critter_cmp);
+-
+-  for (i = 0; i < count; i++)
+-    print_critter (&muppets[i]);
+-  printf ("\n");
+-
+-  find_critter ("Kermit");
+-  find_critter ("Gonzo");
+-  find_critter ("Janice");
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/select.c.texi glibc-2.1.3/manual/select.c.texi
+--- ../glibc-2.1.3/manual/select.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/select.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,40 +0,0 @@
+-@group
+-#include <stdio.h>
+-#include <unistd.h>
+-#include <sys/types.h>
+-#include <sys/time.h>
+-@end group
+-
+-@group
+-int 
+-input_timeout (int filedes, unsigned int seconds)
+-@{
+-  fd_set set;
+-  struct timeval timeout;
+-@end group
+-
+-  /* @r{Initialize the file descriptor set.} */
+-  FD_ZERO (&set);
+-  FD_SET (filedes, &set);
+-
+-  /* @r{Initialize the timeout data structure.} */
+-  timeout.tv_sec = seconds;
+-  timeout.tv_usec = 0;
+-
+-@group
+-  /* @r{@code{select} returns 0 if timeout, 1 if input available, -1 if error.} */
+-  return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
+-                                     &set, NULL, NULL,
+-                                     &timeout));
+-@}
+-@end group
+-
+-@group
+-int
+-main (void)
+-@{
+-  fprintf (stderr, "select returned %d.\n",
+-           input_timeout (STDIN_FILENO, 5));
+-  return 0;
+-@}
+-@end group
+diff -Naur ../glibc-2.1.3/manual/setjmp.c.texi glibc-2.1.3/manual/setjmp.c.texi
+--- ../glibc-2.1.3/manual/setjmp.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/setjmp.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,32 +0,0 @@
+-#include <setjmp.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-
+-jmp_buf main_loop;
+-
+-void 
+-abort_to_main_loop (int status)
+-@{
+-  longjmp (main_loop, status);
+-@}
+-
+-int
+-main (void)
+-@{
+-  while (1)
+-    if (setjmp (main_loop))
+-      puts ("Back at main loop....");
+-    else
+-      do_command ();
+-@}
+-
+-
+-void 
+-do_command (void)
+-@{
+-  char buffer[128];
+-  if (fgets (buffer, 128, stdin) == NULL)
+-    abort_to_main_loop (-1);
+-  else
+-    exit (EXIT_SUCCESS);
+-@}
+diff -Naur ../glibc-2.1.3/manual/sigh1.c.texi glibc-2.1.3/manual/sigh1.c.texi
+--- ../glibc-2.1.3/manual/sigh1.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/sigh1.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,36 +0,0 @@
+-#include <signal.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-/* @r{This flag controls termination of the main loop.} */
+-volatile sig_atomic_t keep_going = 1;
+-
+-/* @r{The signal handler just clears the flag and re-enables itself.} */
+-void 
+-catch_alarm (int sig)
+-@{
+-  keep_going = 0;
+-  signal (sig, catch_alarm);
+-@}
+-
+-void 
+-do_stuff (void)
+-@{
+-  puts ("Doing stuff while waiting for alarm....");
+-@}
+-
+-int
+-main (void)
+-@{
+-  /* @r{Establish a handler for SIGALRM signals.} */
+-  signal (SIGALRM, catch_alarm);
+-
+-  /* @r{Set an alarm to go off in a little while.} */
+-  alarm (2);
+-
+-  /* @r{Check the flag once in a while to see when to quit.} */
+-  while (keep_going)
+-    do_stuff ();
+-
+-  return EXIT_SUCCESS;
+-@}
+diff -Naur ../glibc-2.1.3/manual/sigusr.c.texi glibc-2.1.3/manual/sigusr.c.texi
+--- ../glibc-2.1.3/manual/sigusr.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/sigusr.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,61 +0,0 @@
+-@group
+-#include <signal.h>
+-#include <stdio.h>
+-#include <sys/types.h>
+-#include <unistd.h>
+-@end group
+-
+-/* @r{When a @code{SIGUSR1} signal arrives, set this variable.} */
+-volatile sig_atomic_t usr_interrupt = 0;
+-
+-void 
+-synch_signal (int sig)
+-@{
+-  usr_interrupt = 1;
+-@}
+-
+-/* @r{The child process executes this function.} */
+-void 
+-child_function (void)
+-@{
+-  /* @r{Perform initialization.} */
+-  printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());
+-
+-  /* @r{Let parent know you're done.} */
+-  kill (getppid (), SIGUSR1);
+-
+-  /* @r{Continue with execution.} */
+-  puts ("Bye, now....");
+-  exit (0);
+-@}
+-
+-int
+-main (void)
+-@{
+-  struct sigaction usr_action;
+-  sigset_t block_mask;
+-  pid_t child_id;
+-
+-  /* @r{Establish the signal handler.} */
+-  sigfillset (&block_mask);
+-  usr_action.sa_handler = synch_signal;
+-  usr_action.sa_mask = block_mask;
+-  usr_action.sa_flags = 0;
+-  sigaction (SIGUSR1, &usr_action, NULL);
+-
+-  /* @r{Create the child process.} */
+-  child_id = fork ();
+-  if (child_id == 0)
+-    child_function ();          /* @r{Does not return.} */
+-
+-@group
+-  /* @r{Busy wait for the child to send a signal.} */
+-  while (!usr_interrupt)
+-    ;
+-@end group
+-
+-  /* @r{Now continue execution.} */
+-  puts ("That's all, folks!");
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/stpcpy.c.texi glibc-2.1.3/manual/stpcpy.c.texi
+--- ../glibc-2.1.3/manual/stpcpy.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/stpcpy.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,13 +0,0 @@
+-#include <string.h>
+-#include <stdio.h>
+-
+-int
+-main (void)
+-@{
+-  char buffer[10];
+-  char *to = buffer;
+-  to = stpcpy (to, "foo");
+-  to = stpcpy (to, "bar");
+-  puts (buffer);
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/strdupa.c.texi glibc-2.1.3/manual/strdupa.c.texi
+--- ../glibc-2.1.3/manual/strdupa.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/strdupa.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,19 +0,0 @@
+-#include <paths.h>
+-#include <string.h>
+-#include <stdio.h>
+-
+-const char path[] = _PATH_STDPATH;
+-
+-int
+-main (void)
+-@{
+-  char *wr_path = strdupa (path);
+-  char *cp = strtok (wr_path, ":");
+-
+-  while (cp != NULL)
+-    @{
+-      puts (cp);
+-      cp = strtok (NULL, ":");
+-    @}
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/strftim.c.texi glibc-2.1.3/manual/strftim.c.texi
+--- ../glibc-2.1.3/manual/strftim.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/strftim.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,31 +0,0 @@
+-#include <time.h>
+-#include <stdio.h>
+-
+-#define SIZE 256
+-
+-int
+-main (void)
+-@{
+-  char buffer[SIZE];
+-  time_t curtime;
+-  struct tm *loctime;
+-
+-  /* @r{Get the current time.} */
+-  curtime = time (NULL);
+-
+-  /* @r{Convert it to local time representation.} */
+-  loctime = localtime (&curtime);
+-
+-  /* @r{Print out the date and time in the standard format.} */
+-  fputs (asctime (loctime), stdout);
+-
+-@group
+-  /* @r{Print it out in a nice format.} */
+-  strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime);
+-  fputs (buffer, stdout);
+-  strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime);
+-  fputs (buffer, stdout);
+-
+-  return 0;
+-@}
+-@end group
+diff -Naur ../glibc-2.1.3/manual/strncat.c.texi glibc-2.1.3/manual/strncat.c.texi
+--- ../glibc-2.1.3/manual/strncat.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/strncat.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,14 +0,0 @@
+-#include <string.h>
+-#include <stdio.h>
+-
+-#define SIZE 10
+-
+-static char buffer[SIZE];
+-
+-main ()
+-@{
+-  strncpy (buffer, "hello", SIZE);
+-  puts (buffer);
+-  strncat (buffer, ", world", SIZE - strlen (buffer) - 1);
+-  puts (buffer);
+-@}
+diff -Naur ../glibc-2.1.3/manual/subopt.c.texi glibc-2.1.3/manual/subopt.c.texi
+--- ../glibc-2.1.3/manual/subopt.c.texi	1999-07-18 18:01:09.000000000 -0700
++++ glibc-2.1.3/manual/subopt.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,75 +0,0 @@
+-#include <stdio.h>
+-#include <stdlib.h>
+-
+-int do_all;
+-const char *type;
+-int read_size;
+-int write_size;
+-int read_only;
+-
+-enum
+-@{
+-  RO_OPTION = 0,
+-  RW_OPTION,
+-  READ_SIZE_OPTION,
+-  WRITE_SIZE_OPTION
+-@};
+-
+-const char *mount_opts[] =
+-@{
+-  [RO_OPTION] = "ro",
+-  [RW_OPTION] = "rw",
+-  [READ_SIZE_OPTION] = "rsize",
+-  [WRITE_SIZE_OPTION] = "wsize"
+-@};
+-
+-int
+-main (int argc, char *argv[])
+-@{
+-  char *subopts, *value;
+-  int opt;
+-
+-  while ((opt = getopt (argc, argv, "at:o:")) != -1)
+-    switch (opt)
+-      @{
+-      case 'a':
+-        do_all = 1;
+-        break;
+-      case 't':
+-        type = optarg;
+-        break;
+-      case 'o':
+-        subopts = optarg;
+-        while (*subopts != '\0')
+-          switch (getsubopt (&subopts, mount_opts, &value))
+-            @{
+-            case RO_OPTION:
+-              read_only = 1;
+-              break;
+-            case RW_OPTION:
+-              read_only = 0;
+-              break;
+-            case READ_SIZE_OPTION:
+-              if (value == NULL)
+-                abort ();
+-              read_size = atoi (value);
+-              break;
+-            case WRITE_SIZE_OPTION:
+-              if (value == NULL)
+-                abort ();
+-              write_size = atoi (value);
+-              break;
+-            default:
+-              /* @r{Unknown suboption.} */
+-              printf ("Unknown suboption `%s'\n", value);
+-              break;
+-            @}
+-        break;
+-      default:
+-        abort ();
+-      @}
+-
+-  /* @r{Do the real work.} */
+-
+-  return 0;
+-@}
+diff -Naur ../glibc-2.1.3/manual/termios.c.texi glibc-2.1.3/manual/termios.c.texi
+--- ../glibc-2.1.3/manual/termios.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/termios.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,60 +0,0 @@
+-#include <unistd.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <termios.h>
+-
+-/* @r{Use this variable to remember original terminal attributes.} */
+-
+-struct termios saved_attributes;
+-
+-void 
+-reset_input_mode (void)
+-@{
+-  tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
+-@}
+-
+-void 
+-set_input_mode (void)
+-@{
+-  struct termios tattr;
+-  char *name;
+-
+-  /* @r{Make sure stdin is a terminal.} */
+-  if (!isatty (STDIN_FILENO))
+-    @{
+-      fprintf (stderr, "Not a terminal.\n");
+-      exit (EXIT_FAILURE);
+-    @}
+-
+-  /* @r{Save the terminal attributes so we can restore them later.} */
+-  tcgetattr (STDIN_FILENO, &saved_attributes);
+-  atexit (reset_input_mode);
+-
+-@group
+-  /* @r{Set the funny terminal modes.} */
+-  tcgetattr (STDIN_FILENO, &tattr);
+-  tattr.c_lflag &= ~(ICANON|ECHO); /* @r{Clear ICANON and ECHO.} */
+-  tattr.c_cc[VMIN] = 1;
+-  tattr.c_cc[VTIME] = 0;
+-  tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
+-@}
+-@end group
+-
+-int
+-main (void)
+-@{
+-  char c;
+-
+-  set_input_mode ();
+-
+-  while (1)
+-    @{
+-      read (STDIN_FILENO, &c, 1);
+-      if (c == '\004')          /* @r{@kbd{C-d}} */
+-        break;
+-      else
+-        putchar (c);
+-    @}
+-
+-  return EXIT_SUCCESS;
+-@}
+diff -Naur ../glibc-2.1.3/manual/testopt.c.texi glibc-2.1.3/manual/testopt.c.texi
+--- ../glibc-2.1.3/manual/testopt.c.texi	1999-07-18 18:01:08.000000000 -0700
++++ glibc-2.1.3/manual/testopt.c.texi	1969-12-31 16:00:00.000000000 -0800
+@@ -1,51 +0,0 @@
+-@group
+-#include <unistd.h>
+-#include <stdio.h>
+-
+-int 
+-main (int argc, char **argv)
+-@{
+-  int aflag = 0;
+-  int bflag = 0;
+-  char *cvalue = NULL;
+-  int index;
+-  int c;
+-
+-  opterr = 0;
+-@end group
+-
+-@group
+-  while ((c = getopt (argc, argv, "abc:")) != -1)
+-    switch (c)
+-      @{
+-      case 'a':
+-        aflag = 1;
+-        break;
+-      case 'b':
+-        bflag = 1;
+-        break;
+-      case 'c':
+-        cvalue = optarg;
+-        break;
+-      case '?':
+-        if (isprint (optopt))
+-          fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+-        else
+-          fprintf (stderr,
+-                   "Unknown option character `\\x%x'.\n",
+-                   optopt);
+-        return 1;
+-      default:
+-        abort ();
+-      @}
+-@end group
+-
+-@group
+-  printf ("aflag = %d, bflag = %d, cvalue = %s\n",
+-          aflag, bflag, cvalue);
+-
+-  for (index = optind; index < argc; index++)
+-    printf ("Non-option argument %s\n", argv[index]);
+-  return 0;
+-@}
+-@end group
+diff -Naur ../glibc-2.1.3/math/math_private.h glibc-2.1.3/math/math_private.h
+--- ../glibc-2.1.3/math/math_private.h	1998-11-27 03:33:46.000000000 -0800
++++ glibc-2.1.3/math/math_private.h	1998-11-30 07:01:06.000000000 -0800
+@@ -11,7 +11,7 @@
+ 
+ /*
+  * from: @(#)fdlibm.h 5.1 93/09/24
+- * $Id: math_private.h,v 1.8 1998/11/27 11:33:46 drepper Exp $
++ * $Id: math_private.h,v 1.1.1.1 1998/11/30 15:01:06 gafton Exp $
+  */
+ 
+ #ifndef _MATH_PRIVATE_H_
+diff -Naur ../glibc-2.1.3/math/test-math.c glibc-2.1.3/math/test-math.c
+--- ../glibc-2.1.3/math/test-math.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/math/test-math.c	1998-02-07 12:20:22.000000000 -0800
+@@ -0,0 +1,150 @@
++#include <stdio.h>
++#include <math.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <string.h>
++
++void print_trig_stuff __P ((void));
++
++int
++main (int argc, char *argv[])
++{
++  const char str[] = "123.456";
++  double x,h,li,lr,a,lrr;
++
++  if (signbit (argc < 1 ? -0.0 : 0.0))
++    /* I don't make this an error for now.  --drepper */
++    fputs ("\n*** Your compiler has a bug.  Consider upgrading\n\n", stderr);
++
++  x = atof (str);
++
++  printf ("%g %g\n", x, pow (10.0, 3.0));
++
++  x = sinh(2.0);
++
++  printf("sinh(2.0) = %g\n", x);
++
++  x = sinh(3.0);
++
++  printf("sinh(3.0) = %g\n", x);
++
++  h = hypot(2.0,3.0);
++
++  printf("h=%g\n", h);
++
++  a = atan2(3.0, 2.0);
++
++  printf("atan2(3,2) = %g\n", a);
++
++  lr = pow(h,4.0);
++
++  printf("pow(%g,4.0) = %g\n", h, lr);
++
++  lrr = lr;
++
++  li = 4.0 * a;
++
++  lr = lr / exp(a*5.0);
++
++  printf("%g / exp(%g * 5) = %g\n", lrr, a, lr);
++
++  lrr = li;
++
++  li += 5.0 * log(h);
++
++  printf("%g + 5*log(%g) = %g\n", lrr, h, li);
++
++  printf("cos(%g) = %g,  sin(%g) = %g\n", li, cos(li), li, sin(li));
++
++  x = drem(10.3435,6.2831852);
++
++  printf("drem(10.3435,6.2831852) = %g\n", x);
++
++  x = drem(-10.3435,6.2831852);
++
++  printf("drem(-10.3435,6.2831852) = %g\n", x);
++
++  x = drem(-10.3435,-6.2831852);
++
++  printf("drem(-10.3435,-6.2831852) = %g\n", x);
++
++  x = drem(10.3435,-6.2831852);
++
++  printf("drem(10.3435,-6.2831852) = %g\n", x);
++
++
++  printf("x%8.6gx\n", .5);
++  printf("x%-8.6gx\n", .5);
++  printf("x%6.6gx\n", .5);
++
++  {
++    double x = atof ("-1e-17-");
++    printf ("%g %c= %g %s!\n",
++	    x,
++	    x == -1e-17 ? '=' : '!',
++	    -1e-17,
++	    x == -1e-17 ? "Worked" : "Failed");
++  }
++
++  print_trig_stuff ();
++
++  return 0;
++}
++
++
++const double RAD[5] = { 0, M_PI/2, M_PI, (3*M_PI)/2, 2*M_PI };
++
++#define PRINT_IT_1_ARG(_func, _arg, _value) \
++    (_value) = (_func) ((_arg)); \
++    if (errno) { \
++      errno = 0; \
++      printf ("%s = ERROR %s\n", #_func, strerror (errno)); \
++    } else \
++      printf ("%s(%g) = %g\n", #_func, _arg, (_value)); \
++
++#define PRINT_IT_2_ARG(_func, _arg1, _arg2, _value) \
++    (_value) = (_func) ((_arg1),(_arg2)); \
++    if (errno) { \
++      errno = 0; \
++      printf ("%s = ERROR %s\n", #_func, strerror (errno)); \
++    } else \
++      printf ("%s(%g, %g) = %g\n", #_func, _arg1, _arg2, (_value)); \
++
++void
++print_trig_stuff(void)
++{
++  double value, arg1, arg2;
++  int i;
++
++  puts ("\n\nMath Test");
++
++  errno = 0;			/* automatically reset on error condition */
++  for (i=0; i<4; i++)
++    {
++      PRINT_IT_1_ARG (sin, RAD[i], value);
++      PRINT_IT_1_ARG (cos, RAD[i], value);
++      PRINT_IT_1_ARG (tan, RAD[i], value);
++      PRINT_IT_1_ARG (asin, RAD[i], value);
++      PRINT_IT_1_ARG (acos, RAD[i], value);
++      PRINT_IT_1_ARG (atan, RAD[i], value);
++      PRINT_IT_2_ARG (atan2, RAD[i], -RAD[i % 4], value);
++    }
++
++  arg1 = 16;
++  arg2 = 3;
++  PRINT_IT_1_ARG (exp, arg1, value);
++  PRINT_IT_1_ARG (log, arg1, value);
++  PRINT_IT_1_ARG (log10, arg1, value);
++  PRINT_IT_2_ARG (pow, arg1, arg2, value);
++  PRINT_IT_1_ARG (sqrt, arg1, value);
++  PRINT_IT_1_ARG (cbrt, arg1, value);
++  PRINT_IT_2_ARG (hypot, arg1, arg2, value);
++  PRINT_IT_1_ARG (expm1, arg1, value);
++  PRINT_IT_1_ARG (log1p, arg1, value);
++  PRINT_IT_1_ARG (sinh, arg1, value);
++  PRINT_IT_1_ARG (cosh, arg1, value);
++  PRINT_IT_1_ARG (tanh, arg1, value);
++  PRINT_IT_1_ARG (asinh, arg1, value);
++  PRINT_IT_1_ARG (acosh, arg1, value);
++  PRINT_IT_1_ARG (atanh, arg1, value);
++}
+diff -Naur ../glibc-2.1.3/misc/ioctltst.c glibc-2.1.3/misc/ioctltst.c
+--- ../glibc-2.1.3/misc/ioctltst.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/misc/ioctltst.c	1998-02-07 12:20:35.000000000 -0800
+@@ -0,0 +1,55 @@
++#include <stdio.h>
++#include <errno.h>
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#include <net/if.h>
++#include <netinet/in.h>
++
++/*
++ * open a socket, get the process group information of the socket, and use the
++ * socket to get the network interface configuration list
++ */
++main(int argc, char *argv[])
++{
++  int sock;
++  int ioctl_result;
++
++  /* get a socket */
++  sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
++  if (sock < 0)
++    {
++      perror("Cannot create socket");
++      exit(1);
++    }
++
++  /* use ioctl() to get the process group information */
++  {
++    int get_process_group;
++
++    ioctl_result = ioctl(sock, SIOCGPGRP, (char *) &get_process_group);
++
++    if (ioctl_result < 0)
++      {
++        int my_errno = errno;
++
++        fprintf(stderr, "errno %d ", my_errno);
++        perror("ioctl(get process group)");
++      }
++  }
++
++  /* use ioctl() to get the interface configuration list */
++  {
++    static struct ifconf ifc;	/* init to 0 */
++
++    ioctl_result = ioctl(sock, SIOCGIFCONF, (char *) &ifc);
++
++    if (ioctl_result < 0)
++      {
++        int my_errno = errno;
++
++        fprintf(stderr, "errno %d ", my_errno);
++        perror("ioctl(get interface configuration list)");
++      }
++  }
++}
+diff -Naur ../glibc-2.1.3/misc/nlist.h glibc-2.1.3/misc/nlist.h
+--- ../glibc-2.1.3/misc/nlist.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/misc/nlist.h	1998-02-07 12:20:36.000000000 -0800
+@@ -0,0 +1,48 @@
++/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef	_NLIST_H
++#define	_NLIST_H	1
++
++#include <features.h>
++
++__BEGIN_DECLS
++
++/* Structure describing a symbol-table entry.  */
++struct nlist
++{
++  char *n_name;
++  unsigned char n_type;
++  char n_other;
++  short int n_desc;
++  unsigned long int n_value;
++};
++
++#define	N_NLIST_DECLARED
++#include <a.out.h>
++
++
++/* Search the executable FILE for symbols matching those in NL,
++   which is terminated by an element with a NULL `n_un.n_name' member,
++   and fill in the elements of NL.  */
++extern int nlist __P ((__const char *__file, struct nlist * __nl));
++
++
++__END_DECLS
++
++#endif /* nlist.h  */
+diff -Naur ../glibc-2.1.3/misc/syslog.c glibc-2.1.3/misc/syslog.c
+--- ../glibc-2.1.3/misc/syslog.c	2000-02-11 15:49:57.000000000 -0800
++++ glibc-2.1.3/misc/syslog.c	2000-02-01 14:15:08.000000000 -0800
+@@ -281,6 +281,13 @@
+ 					__set_errno (old_errno);
+ 					continue;
+ 				}
++				if (LogType == SOCK_STREAM
++				    && saved_errno == ECONNREFUSED) {
++				    /* retry with next SOCK_DGRAM: */
++				    LogType = SOCK_DGRAM;
++				    __set_errno (old_errno);
++				    continue;
++				}
+ 			} else
+ 				connected = 1;
+ 		}
+diff -Naur ../glibc-2.1.3/nis/Versions glibc-2.1.3/nis/Versions
+--- ../glibc-2.1.3/nis/Versions	1998-07-28 06:50:25.000000000 -0700
++++ glibc-2.1.3/nis/Versions	1999-12-27 08:16:06.000000000 -0800
+@@ -54,6 +54,9 @@
+     __nisbind_destroy;    __nisbind_next;
+     readColdStartFile;    writeColdStartFile;
+   }
++  GLIBC_2.1.2 {
++    xdr_ypall;
++  }
+ }
+ 
+ libnss_compat {
+diff -Naur ../glibc-2.1.3/nis/yp_xdr.c glibc-2.1.3/nis/yp_xdr.c
+--- ../glibc-2.1.3/nis/yp_xdr.c	1998-08-18 16:25:46.000000000 -0700
++++ glibc-2.1.3/nis/yp_xdr.c	1999-12-27 08:16:07.000000000 -0800
+@@ -28,6 +28,7 @@
+  */
+ 
+ #include <rpcsvc/yp.h>
++#include <rpcsvc/ypclnt.h>
+ 
+ bool_t
+ xdr_ypstat (XDR *xdrs, ypstat *objp)
+@@ -298,3 +299,47 @@
+     return FALSE;
+   return TRUE;
+ }
++
++bool_t
++xdr_ypall(XDR *xdrs, struct ypall_callback *incallback)
++{
++    struct ypresp_key_val out;
++    char key[YPMAXRECORD], val[YPMAXRECORD];
++
++    /*
++     * Set up key/val struct to be used during the transaction.
++     */
++    memset(&out, 0, sizeof out);
++    out.key.keydat_val = key;
++    out.key.keydat_len = sizeof(key);
++    out.val.valdat_val = val;
++    out.val.valdat_len = sizeof(val);
++
++    for (;;) {
++	bool_t more, status;
++
++	/* Values pending? */
++	if (!xdr_bool(xdrs, &more))
++	    return FALSE;           /* can't tell! */
++	if (!more)
++	    return TRUE;            /* no more */
++
++	/* Transfer key/value pair. */
++	status = xdr_ypresp_key_val(xdrs, &out);
++
++	/*
++	 * If we succeeded, call the callback function.
++	 * The callback will return TRUE when it wants
++	 * no more values.  If we fail, indicate the
++	 * error.
++	 */
++	if (status) {
++	    if ((*incallback->foreach)(out.stat,
++				       (char *)out.key.keydat_val, out.key.keydat_len,
++				       (char *)out.val.valdat_val, out.val.valdat_len,
++				       incallback->data))
++		return TRUE;
++	} else
++	    return FALSE;
++    }
++}
+diff -Naur ../glibc-2.1.3/nscd/connections.c glibc-2.1.3/nscd/connections.c
+--- ../glibc-2.1.3/nscd/connections.c	2000-02-22 23:02:58.000000000 -0800
++++ glibc-2.1.3/nscd/connections.c	2000-02-18 15:52:59.000000000 -0800
+@@ -515,3 +515,17 @@
+ 
+   nscd_run ((void *) 0);
+ }
++
++/* Handle the HUP signal which will force a dump of the cache */
++void
++sighup_handler (int signum)
++{
++    /* Prune the password database */
++    prune_cache (&dbs[pwddb], LONG_MAX);
++    
++    /* Prune the group database */
++    prune_cache (&dbs[grpdb], LONG_MAX);
++
++    /* Prune the host database */
++    prune_cache (&dbs[hstdb], LONG_MAX);
++}
+diff -Naur ../glibc-2.1.3/nscd/nscd.c glibc-2.1.3/nscd/nscd.c
+--- ../glibc-2.1.3/nscd/nscd.c	1999-10-04 12:51:37.000000000 -0700
++++ glibc-2.1.3/nscd/nscd.c	1999-12-27 07:50:23.000000000 -0800
+@@ -102,6 +102,9 @@
+   options, parse_opt, NULL, doc,
+ };
+ 
++/* The SIGHUP handler is extern to this file */
++extern void sighup_handler(int signum);
++
+ int
+ main (int argc, char **argv)
+ {
+@@ -150,12 +153,13 @@
+       /* Ignore job control signals.  */
+       signal (SIGTTOU, SIG_IGN);
+       signal (SIGTTIN, SIG_IGN);
+-      signal (SIGTSTP, SIG_IGN);
++      signal (SIGTSTP, SIG_IGN);      
+     }
+ 
+   signal (SIGINT, termination_handler);
+   signal (SIGQUIT, termination_handler);
+   signal (SIGTERM, termination_handler);
++  signal (SIGHUP, sighup_handler);
+   signal (SIGPIPE, SIG_IGN);
+ 
+   /* Cleanup files created by a previous `bind'.  */
+diff -Naur ../glibc-2.1.3/nscd/nscd.init glibc-2.1.3/nscd/nscd.init
+--- ../glibc-2.1.3/nscd/nscd.init	1999-08-17 13:04:10.000000000 -0700
++++ glibc-2.1.3/nscd/nscd.init	2000-01-04 14:21:27.000000000 -0800
+@@ -74,7 +74,7 @@
+ 	RETVAL=$?
+ 	;;
+   reload)
+-  	killproc -HUP nscd
++  	killproc nscd -HUP
+ 	RETVAL=$?
+         ;;
+     *)
+diff -Naur ../glibc-2.1.3/po/.cvsignore glibc-2.1.3/po/.cvsignore
+--- ../glibc-2.1.3/po/.cvsignore	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/po/.cvsignore	2000-02-18 16:03:43.000000000 -0800
+@@ -0,0 +1 @@
++*.mo
+diff -Naur ../glibc-2.1.3/po/cs.mo glibc-2.1.3/po/cs.mo
+--- ../glibc-2.1.3/po/cs.mo	2000-01-05 19:28:54.000000000 -0800
++++ glibc-2.1.3/po/cs.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,458 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������*��	������4������J���d���`���X���ſ��.������0���M������~�����������������������������������������������������2�����������������-�������-���
+-������8���L���W������������������������������������������������������2������P������p����������������������������������������#������,������I������X������d���/���w���/�������=�������.������%���D������j���)�������&��������������.�������1���!���6���S���-��������������"�������(����������������9������R������r�����������������1��������������&������&���.���&���U���&���|���&��������������,�������,���������@������_������{���1�������#�������$�������1������2���D���&���w���%��������������,����������������'������:������W�������t���5���������I��� ���d���-��������������-��������������R����������J���M���]�����������������
+-�������*�������!���������>������[������]������y���"��������������&�������'����������������)������9���$���X���/���}����������!��������������
����������������(���
���<������J������i����������
��������������/��������������,���������8���-���<������j���,�������5������� ����������������"������=���!���R���0���t���%�������4�������'����������(������A������X���+���v���+�������.�������&�������8���$���!���]����������������"���������������������'���������3���?���H���F���������������������$����������%���8���>������w���������*�������G�������.������7���L����������0���������������������������������������������������2������P������d���&�����������������������������������D���	���'���N���:���v�����������������������������������������
���J���$���%���o���3�������.��������������#������4���+���=���`����������-��������������)����������(���'���D������l����������*�������'�����������������
�������������0����������0����������������5������J������[������q���$�������%��������������0�������.������0���I���1���z���.��������������#�������������R���1�������������������������������"�������������� ������ ���0���%���Q������w���
+-��������������"�������������������������������������"���3���;������o�����������������������������������������������$���$���;������`���9���s���%������������������������	������������=���
���V������d������q���
+-���������������������6���������������������������'���,���"���T������w������������������������"�������)�������������'���0���X���X����������<�����������������������,���'���A������i������~���&����������������������������
����������	���>���
������L���%���g����������,�������
��������������
��������������%���������<������Z������t���'��������������4����������������������.������J���$���i�����������������*���������������������!���������4������M������Y������p���"�������$�������-������������� ���������>������Y������u���'���������������������)�������������(���$��� ���M������n������}���"����������������������������)����������������9������F������\������o���%��������������0�����������������������������1������A������X������p�����������������	����������������������������,����������������'���"���A���8���d���&���������������������������������%���6������\������y���!����������������������������!����������������,��� ���A������b������}�������������������������������#����������������:������Y������u�������������������������������"���������)���&���G������n������z��������������������������������������:�������7���+���,���c���!���������������������*�������������4���1���3���f����������{���������������������!��������������0���������=���!���T���*���v������������������������'�������'���������,������I������a���.���w������������������������/�������������*���"������M���7���k���
�������������������������������������������.��� ���C���!���d������������������������#�������<�������
���������,���/���A�������q������������
+-���%���$������J������\���I��s���������������������'����������(���/�2���X�2�����"����������������������/�&���B�%���i�>����������
+-����������#�����#�������:� ���W����x�"���������������
���������������������+����C����[����q�������������������������������������������!�#���*�N���N�(�����(�����+�����%����$���A����f�&�����,�����!�����&����� �������?����K����\����a����f����}�!�����U��������
�"����-���<�<���j�:�����@�����?���#	����c	����}	�����	�'����	�'����	�(����	�#���
+-����?
+-����O
+-����_
+-����
+-�����
+-�+����
+-�7����
+-�4�������N�3���k�2����������F�����(���4�8���]� �����!�����"�����!�����'���
�.���F
�=���u
� ����
�!����
�#����
�����
���8����F�(���Y�!�����6����������"�����5�������R�$���j�'�����*����������&�����-����*���M����x������.�����%������������&����B�A���_�0�����1�����(����;���-�"���i�#�����&�����4�����"����"���/�#���R�<���v�=�����!���������&���-�(���T�4���}�!�����/���������1����L���J�M���������� ���� ���"����C����S�=���l����������������&�����"���!�(���D�9���m�3���������������(����!���/�(���Q�/���z�5�����)��������
+-�)���#�)���M�(���w�!�����0����������%���	����/�+���>�+���j�,�����7����� �����%�������B�K���W�K�����I��������9�(���M�1���v�+�����+�����)�����)���*�$���T�/���y�������������������������'���'�)���O�!���y������C����������D����B���T�7�����:�����@���
+- ����K ����e �&���� �-���� �/���� �/���!�&���7!����^!����y!�����!�����!�����!�����!�����!����"����"����-"����@"�+���S"�-���"�*����"�����"�!����"�F���#� ���X#����y#�=����#�+����#�/���$�+���1$����]$����m$�*���~$�=����$�>����$����&%�'���:%� ���b%�>����%�B����%�)���&�<���/&�"���l&�"����&�.����&�A����&�&���#'�"���J'�P���m'�@����'�<����'�-���<(�$���j(�6����(�!����(�����(�/����)�
���0)�6���>)�*���u)�����)�����)�,����)�����)�,���*����8*����U*�:���o*�����*�$����*�*����*�$���+�&���:+�%���a+�����+�����+�*����+�0����+����,����=,����],�6���|,�0����,�'����,�2���-����?-����_-����{-�+����-�9����-�*����-����%.����6.�F���H.�����.�)����.�(����.�D���/�(���G/�5���p/�2����/�(����/�7���0�6���:0�)���q0�!����0�-����0�!����0�#���
1�"���11�C���T1�?����1�L����1�E���%2�U���k2�#����2�+����2�(���3�+���:3�*���f3�#����3�/����3�-����3�.���4�,���B4�B���o4�:����4�'����4����5�1���55�8���g5�E����5�'����5����6����%6����86�!���G6�"���i6�&����6�����6�$����6�����6����7�6���!7����X7�$���m7�3����7�����7�*����7����8����8����)8�*���;8����f8�(���8�!����8�����8�'����8����9����9����09����C9����V9����r9�$����9�����9�%����9�"����9�#���:�=���::�<���x:�^����:�J���;�:���_;�����;�"����;�&����;�����<����<����:<����Q<�5���f<�����<�
����<�!����<�����<�!����<�!���=�!���==�.���_=�!����=�!����=�!����=�<����=�(���1>��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-11-09 13:01+01:00
+-Last-Translator: Vladimir Michl <Vladimir.Michl@seznam.cz>
+-Language-Team: Czech <cs@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-2
+-Content-Transfer-Encoding: 8bit
+-�		P��stupov� pr�va : �		Atributy         : �	%s [-abkCLNTM][-Dn�zev[=hodnota]] [-i velikost] [-I [-K sekundy]]
+-           [-Y cesta] vst_soubor
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o v�st_soubor]
+-           [vst_soubor]
+-�	%s [-n netid]* [-o v�st_soubor] [vst_soubor]
+-�	%s [-s nettype]* [-o v�st_soubor] [vst_soubor]
+-�	P��stupov� pr�va: �	Vstupn� data typu %s
+-�	N�zev         : %s
+-�	Ve�ejn� kl��  : �	Typ             : %s
+-�	Univerz�ln� adresy (%u)
+-�	[%d]	N�zev            : %s
+-�	[%u] - [%u bajt�] �
+-%s cache:
+-
+-%15s  cache je povolena
+-%15Zd  navrhovan� velikost
+-%15ld  sekund �ivotnost pozitivn�ch z�znam�
+-%15ld  sekund �ivotnost negativn�ch z�znam�
+-%15ld  �sp�ch� cache pro pozitivn� z�znamy
+-%15ld  �sp�ch� cache pro negativn� z�znamy
+-%15ld  ne�sp�ch� cache pro pozitivn� z�znamy
+-%15ld  ne�sp�ch� cache pro negativn� z�znamy
+-%15ld%% �sp�nost cache
+-%15s  zkontrolujte zm�ny v /etc/%s
+-�
+-�lenov� skupin :
+-�
+-�ivotnost       : �       rpcinfo -b ��slo_programu ��slo_verze
+-�       rpcinfo -d ��slo_programu ��slo_verze
+-�       rpcinfo -p [ po��ta� ]
+-�       rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verze ]
+-�      ne�     ano�    D�lka dat = %u
+-�    Explicitn� �lenov�:
+-�    Explicitn� ne�lenov�:
+-�    Implicitn� �lenov�:
+-�    Implicitn� ne�lenov�:
+-�    ��dn� explicitn� �lenov�
+-�    ��dn� explicitn� ne�lenov�
+-�    ��dn� implicitn� �lenov�
+-�    ��dn� implicitn� ne�lenov�
+-�    ��dn� rekurzivn� �lenov�
+-�    ��dn� rekurzivn� ne�lenov�
+-�    Rekurzivn� �lenov�:
+-�   program verz proto   port
+-�  nebo: � (pravidlo z "%s", ��dek %d)� [P�EP�NA�...]� dokon�eno
+-�"%s", ��dek %d: %s���dek "Zone %s" a volba -l se navz�jem vylu�uj����dek "Zone %s" a volba -p se navz�jem vylu�uj��"vst_soubor" je vy�adov�n p�i pou�it� p��znak� tvorby vzoru.
+-�%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu�%.*s: Nezn�m� parameter ARGP_HELP_FMT�%s v �asov�m p�smu bez pravidel�%s%s%s:%u: %s%sP�edpoklad `%s' nespln�n.
+-�%s%s%s:%u: %s%sNeo�ek�van� chyba: %s.
+-�%s%sNezn�m� sign�l %d
+-�%s: p�i p�etypov�n� %d do�lo k chyb� znam�nka
+-�%s: <mb_cur_max> mus� b�t v�t�� ne� <mb_cur_min>
+-�%s: preprocesor jazyka C skon�il s v�stupn�m k�dem %d
+-�%s: preprocesor jazyka C ukon�en sign�lem %d
+-�%s: %s nelze vytvo�it: %s
+-�%s: Adres�� %s nelze vytvo�it: %s
+-�%s: Odkaz na %s z %s nelze vytvo�it: %s
+-�%s: %s nelze otev��t: %s
+-�%s: %s nelze smazat: %s
+-�%s: Chyba p�i uzav�r�n� %s: %s
+-�%s: Chyba p�i �ten� %s
+-�%s: Chyba p�i z�pisu %s
+-�%s: Chyba p�i z�pisu na �%s: ��dek Leap v souboru nep�estupn�ch sekund %s
+-�%s: Pam� vy�erp�na: %s
+-�%s: P�ep�na� -L zad�n v�ce ne� jednou
+-�%s: P�ep�na� -d zad�n v�ce ne� jednou
+-�%s: P�ep�na� -l zad�n v�ce ne� jednou
+-�%s: P�ep�na� -p zad�n v�ce ne� jednou
+-�%s: P�ep�na� -y zad�n v�ce ne� jednou
+-�%s: P��li� mnoho argument�
+-�%s: �as posledn� zm�ny souboru nelze zjistit�%s: p��kaz byl '%s', a jeho v�sledek byl %d
+-�%s: chyba ve stavov�m automatu�%s: nezn�m� p�ep�na� -- %c
+-�%s: nezn�m� p�ep�na� -- %c
+-�%s: p�ep�na� `%c%s' mus� b�t zad�n bez argumentu
+-�%s: p�ep�na� `%s' nen� jednozna�n�
+-�%s: p�ep�na� `%s' vy�aduje argument
+-�%s: p�ep�na� `--%s' mus� b�t zad�n bez argumentu
+-�%s: p�ep�na� `-W %s' mus� b�t zad�n bez argumentu
+-�%s: p�ep�na� `-W %s' nen� jednozna�n�
+-�%s: p�ep�na� vy�aduje argument -- %c
+-�%s: v�stup by p�epsal %s
+-�%s: fat�ln� chyba: Nep��pustn� l_hodnota %d
+-�%s: p�ed�asn� konec souboru�%s: nelze otev��t �%s: nezn�m� p�ep�na� `%c%s'
+-�%s: nezn�m� p�ep�na� `--%s'
+-�%s: Pou�it�: %s [ -s ] [ -v ] [ -l lok�ln�_�as ]
+-      [ -p posixov�_pravidla ] [ -d adres�� ] [ -L p�estupn�ch_sekund ]
+-      [ -y typ_roku ] [ soubor ... ]
+-�%s: Pou�it�: %s [ -v ] [ -c limit ] �asov�_p�smo ...
+-�%s: b�hem z�pisu v�stupu: �(CHYBA PROGRAMU) Nezn�m� verze!?�(CHYBA PROGRAMU) P�ep�na� m�l b�t rozpozn�n!?�(Nezn�m� objekt)
+-�(nezn�m� chyba p�i ov��ov�n� toto�nosti - %d)�(?)�*** Ze souboru `%s' byly odstran�ny lad�c� informace: podrobn� anal�za
+-nen� mo�n�
+-�*standardn� vstup*�-o V�STUPN�_SOUBOR [VSTUPN�_SOUBOR]...
+-[ V�STUPN�_SOUBOR [VSTUPN�_SOUBOR]...]�Po�kozen� sekce .lib v a.out�; podverze = %lu, verze = %lu�; d�vod = �<%s> a <%s> jsou zak�zan� n�zvy pro rozsah�znak <SP> nesm� ve t��d� `%s' b�t�znak <SP> ve t��d� `%s' nen��?�Ne�sp�n� ukon�en (SIGABRT)�P��stupov� pr�va: �Pou�it� po�kozen� sd�len� knihovny�Adresa ji� je u��v�na�T��da adres nen� po��ta�em podporov�na�T��da adres nen� protokolem podporov�na�Chyba p�i zve�ejn�n��Bud�k (SIGALRM)�P��li� dlouh� seznam argument��Pokus o odstran�n� nepr�zdn� tabulky�Pokus o pou�it� p��li� mnoha sd�len�ch knihoven�Ov��en� toto�nosti bylo �sp�n��Ov��en� toto�nosti bylo ne�sp�n��POCHYBN� OBJEKT
+-�Chybn� adresa�Chybn� deskriptor souboru�Chybn� form�t fontu�Chybn� zpr�va�Chybn� vol�n� syst�mu (SIGSYS)�Chybn� hodnota ai_flags�P�esn� soulad s POSIX�Bin�rn� data
+-�Vy�adov�no blokov� za��zen��Probl�m p�i vol�n� poll pro v�esm�rov� vys�l�n��P�eru�ena roura (SIGPIPE)�Chyba na sb�rnici (neplatn� adresa) (SIGBUS)�CDS�P�ekro�en �asov� limit pro procesor (SIGXCPU)��ivotnost cache vypr�ela�K pot�ebn� sd�len� knihovn� nelze p�istoupit�K serveru obsluhuj�c�mu tuto dom�nu se nelze p�ipojit�S portmapperem nelze komunikovat�S ypbind nelze komunikovat�S ypserv nelze komunikovat�Nelze alokovat pam��Po�adovanou adresu nelze p�i�adit�Soket pro v�esm�rov� rpc vys�l�n� nelze vytvo�it�Sd�lenou knihovnu nelze p��mo spustit�V�ce ne� jeden p��znak tvorby souboru nelze pou��t!
+-�Odpov�� na v�esm�rov� vys�l�n� nep�i�la�Slu�bu nelze registrovat�Spojen� bylo p�eru�eno�V�esm�rov� paket nelze poslat�Volbu SO_BROADCAST pro soket nelze nastavit�V�ce ne� jeden vstupn� soubor nelze zadat!
+-�P��znaky netid a inetd nelze pou��t sou�asn�!
+-�P��znak netid nelze bez TIRPC pou��t!
+-�P�i pou�it� nov�ho stylu nelze p��znaky tabulky pou��t!
+-���slo kan�lu mimo povolen� rozsah�Odd�lova� znak�     : %c
+-�Potomek skon�il (SIGCHLD)�Opr�vn�n� klienta je neposta�uj�c��Sloupce             :
+-�Chyba komunikace p�i vys�lan��Kompiluje definice n�rodn�ho prost�ed�.�Po��ta� koupil farmu�V�po�et velkosti tabulky pro t��dy znak� (m��e chv�li trvat)...�V�po�et velkosti tabulky pro informace o �azen� (m��e chv�li trvat)...�Spojen� odm�tnuto�Spojen� zru�eno druhou stranou�Spojen� bylo p��li� dlouho neaktivn��Je pokra�ov�no (SIGCONT)�Konvertuje zadan� soubory z jednoho k�dov�n� do druh�ho.�P�ev�d� kl��e na mal� p�smena�  Copyright (C) %s Free Software Foundation, Inc.
+-  Toto je voln� programov� vybaven�; podm�nky pro kop�rov�n� a roz�i�ov�n�
+-naleznete ve zdrojov�ch textech. Toto programov� vybaven� je zcela BEZ Z�RUKY,
+-a to i bez z�ruky PRODEJNOSTI nebo VHODNOSTI PRO N�JAK� KONKR�TN� ��EL.
+-��urn�lov� (log) soubor "%s" nelze vytvo�it�Vytvo�� hlavi�kov� soubor N�ZEV pro jazyk C obsahuj�c� definice symbol��Vytvo�� v�stupn� soubor i p�i v�skytu varov�n��Vytv��� jednoduch� datab�ze typu DB z textov�ho vstupu.��as vytvo�en�   : %s�DES z�znam pro s��ov� jm�no %s nen� jednozna�n�
+-�ADRES��
+-�DNANS�DNS�Datab�ze pro tabulku neexistuje�Datab�ze ji� je pou��v�na�Implicitn� p��st. pr�va :
+-�C�lovou adresu je nutn� zadat�Za��zen� nen� proud�Za��zen� nen� nakonfigurov�no�Za��zen� nebo zdroj ji� jsou pou��v�ny�Diffie-Hellmann (bit�: %d)
+-�Adres��         : %s
+-�Adres�� nen� pr�zdn��P�ekro�ena diskov� kv�ta�Nespou�t� samostatn� proces a vypisuje zpr�vy na aktu�ln�m termin�lu�B�hem tvorby datab�ze nevypisuje zpr�vy�Nepou��v� existuj�c� katalog, vytvo�� nov� v�stupn� soubor�Dom�na nen� p�ipojena�EMT past (SIGEMT)�Z�ZNAM
+-��ifrovan� data
+-�Nesoulad z�znamu s tabulkou�Chyba v subsyst�mu RPC�Chyba p�i p��stupu k souboru studen�ho startu NIS+. Je NIS+ nainstalov�no?�Chyba z nezn�m�ho chybov�ho syst�mu: �Chyba b�hem komunikace s procedurou zp�tn�ho vol�n��Chyba: soubor .netrc je �iteln� i pro ostatn�.�Pln� st�edisko�Chybn� form�t spustiteln�ho souboru�FAT�LN� CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'�SOUBOR obsahuj�c� mapov�n� symbolick�ch n�zv� na UCS4 hodnoty�Chyba (bl��e nespecifikovan�)�Deskriptor souboru se nach�z� v chybn�m stavu�Soubor ji� existuje�Vz�jemn� zablokov�n� p�i zamykan� souboru�P��li� dlouh� jm�no souboru�P�ekro�en limit d�lky souboru (SIGXFS2)�Soubor je p��li� velk��Chyba z�et�zen� prvn�/dal���V�jimka matematick�ho koprocesoru (SIGFPE)�Adres�� vy�aduje �plnou resynchronizaci�Funkce nen� implementov�na�SKUPINA
+-�Smet� v ARGP_HELP_FMT: %s�  Generuje katalog zpr�v.\vJe-li VSTUPN�_SOUBOR -, vstup bude na�ten ze
+-standardn�ho vstupu. Je-li V�STUPN�_SOUBOR -, v�stup bude zaps�n na standardn�
+-v�stup.
+-�Obecn� chyba syst�mu�Z�sk�n� ur�it�ch informac� o n�rodn�m prost�ed�.�Vyp��e kr�tk� n�vod na pou�it��Vyp��e tuto n�pov�du�Dobrovoln� chyba�Skupina         : %s
+-�P��znaky skupiny :�Z�znam skupiny pro skupinu "%s.%s":
+-�Po�k�n� SECS sekund (implicitn� 3600)�Odpojen termin�l (SIGHUP)�"%d" nebylo v cache pam�ti pro skupiny nalezeno!�"%d" nebylo v cache pam�i pro hesla nalezeno!�"%s" nebylo v cache pam�ti pro skupiny nalezeno!�"%s" nebylo v cache pam�i pro po��ta�e nalezeno!�"%s" nebylo v cache pam�i pro hesla nalezeno!�Po��ta� nen� v provozu�N�zev po��ta�e se nepoda�ilo nal�zt�Vstup/V�stup mo�n� (SIGIO)�VSTUPN�_SOUBOR V�STUPN�_SOUBOR
+--o V�STUPN�_SOUBOR VSTUPN�_SOUBOR
+--u VSTUPN�_SOUBOR�IOT past (SIGIOT)�IVY�Identifik�tor odstran�n�Nedovolen� instrukce (SIGILL)�Nedovolen� typ objektu pro operaci�Nedovolen� nastaven� pozice�Nevhodn� typ nebo form�t souboru�Pro toto za��zen� nevhodn� ioctl�Nevhodn� operace pro proces na pozad����dost o informaci (SIGINFO)�Informace:�Vstupn� soubory:�Zad�n� vstupn�/v�stupn�ho form�tu:�Chyba vstupu/v�stupu�Vnit�n� chyba NIS�Vnit�n� chyba ypbind�P�eru�en� (SIGINT)�P�eru�en� vol�n� syst�mu�P�eru�en� vol�n� syst�mu by m�lo b�t znovu spu�t�no�Pro operaci neplatn� objekt�Nep��pustn� argument�Neplatn� zp�tn� odkaz�Nep��pustn� n�zev t��dy znak��Neplatn� opr�vn�n� klienta�Neplatn� ov��en� klienta�Pro �azen� nep��pustn� znak�Nep��pustn� obsah \{\}�Odkaz mezi za��zen�mi nen� p��pustn��Nep��pustn� v�m�na�Nep��pustn� nebo nekompletn� v�cebajtov� nebo �irok� znak�Nep��pustn� p�edchoz� regul�rn� v�raz�Nep��pustn� konec rozsahu�Nep��pustn� regul�rn� v�raz�Neplatn� k�d ��dosti�Nep��pustn� deskriptor ��dosti�Neplatn� ov��en� serveru�Neplatn� slot�je adres��em�je soubor zadan�ho typu�Kerberos.
+-�Zabit (SIGKILL)�ODKAZ
+-�LOK�LN� z�znam pro UID %d v adres��i %s nen� unik�tn�
+-��rove� 2 - zastaveno��rove� 2 - nen� synchronizov�no��rove� 3 - zastaveno��rove� 3 - nastaveno na v�choz� hodnoty�Odkaz odkazuje na nedovolen� n�zev�Odkaz byl zni�en���slo odkazu mimo rozsah�Typ odkazovan�ho objektu : �Odkazuje na : %s
+-�Jm�no m�stn� dom�ny nen� nastaveno�Chyba p�i p�id�lov�n� m�stn�ch prost�edk��Po��ta� nen� v s�ti�Chybn� formovan� nebo nep��pustn� n�zev�  Argumenty po�adovan� dlouh�mi p�ep�na�i, jsou tak� po�adov�ny jejich kr�tk�mi formami.�Hlavn� server:
+-�Hlavn� server je zanepr�zdn�n, �pln� p�enos byl p�epl�nov�n.�Alokace pam�ti nebyla �sp�n��Pam� vy�erp�na�P��li� dlouh� zpr�va�Chyb�j�c� nebo chybn� formovan� atribut��as zm�ny       : %s�Zm�na nebyla provedena�Operace zm�ny nebyla provedena �sp�n��Zm�na v�stupn�ho form�tu:�Pokus o spojen� p�es v�ce uzl��N�ZEV�N�ZEV
+-[-a|-m]�NIS�Rozd�ln� verze NIS klienta a serveru - slu�bu nelze poskytnout�NIS map datab�ze je chybn��NIS+ operace nebyla provedena �sp�n��NIS+ server nen� dostupn��Slu�ba NIS+ nen� dostupn� nebo nainstalovan����DN� OBJEKT
+-�PO�ET�N�zev : '%s'
+-�NSC (Name Service Cache) d�mon.�Jm�no nen� t�mto serverem obsluhov�no�Jm�no v s�ti nen� jednozna�n��Nezn�m� jm�no nebo slu�ba�Jm�no/z�znam nejsou jednozna�n��Pojmenovan� objekt nen� prohled�vateln��Je t�eba ov��ova�e�S�� zru�ila spojen� (probl�m se vzd�len�m po��ta�em)�S��ov�n� je mimo provoz�S�� nen� dostupn��CSI struktura nen� dostupn��XENIX semafory nejsou dostupn��Jm�no po��ta�e nem� p�i�azenu adresu�Jm�no nem� p�i�azenu adresu���dn� anode�Pro V/V vyrovn�vac� pam� nen� voln� pam����dn� potomek neexistuje�Data nejsou k dispozici�Na serveru nen� m�sto pro soubory�Z�mky nejsou k dispozici���dn� shoda�M�dium nebylo nalezeno���dn� zpr�va ��dan�ho typu���dn� dal�� z�znamy v map datab�zi�P�edchoz� regul�rn� v�raz neexistuje���dn� vzd�len� programy nejsou registrov�ny.
+-�K po��ta�i neexistuje cesta�Na za��zen� ji� nen� voln� m�sto�Takov� za��zen� neexistuje�nen� souborem ani adres��em�Tento kl�� v map� neexistuje�Tato mapa se v dom�n� serveru nenach�z��Tento proces neexistuje�Spat�en prostor n�zv� mimo NIS+�Neopraviteln� chyba p�i vyhodnocen� n�zvu���dn�.
+-�Nebylo nalezeno, takov� jm�no neexistuje�Nejde o pojmenovan� XENIX soubor�nen� adres��em�Nebylo nalezeno�Nen� hlavn� server pro tuto dom�nu�Nen� vlastn�kem�Po�et sloupc�       : %d
+-�Po�et objekt�     : %u
+-���seln� rozsah mimo defini�n� obor funkce���seln� v�sledek mimo rozsah�Objekt #%d:
+-�N�zev objektu   : %s
+-�Typ objektu     : �Objekt je vzd�len��Objekt se stejn�m n�zvem ji� existuje�Lich� po�et uvozovek�Tento p�ep�na� je dostupn� pouze superu�ivateli!�Operace ji� prob�h��Operace nen� povolena�Operace nen� podporov�na�Operace prob�h��Operace byla p�eru�ena�Ji� nejsou voln� proudy���zen� v�stupu:�V�b�r v�stupu:�Vlastn�k        : %s
+-�SOUKROM�
+-�Bal�k nen� nainstalov�n�Chyba anal�zy: %s���ste�n� �sp�ch�Do�l� objekt nen� na serveru t�mt� objektem�P��stup odm�tnut�V�padek nap�jen� (SIGPWR)�P�ed�asn� konec regul�rn�ho v�razu�Vyp��e obsah datab�zov�ho souboru, jeden z�znam na ��dek�Vyp��e statistiky aktu�ln� konfigurace�Vyp��e v�ce informac� o pr�b�hu�Vyp��e ozna�en� verze programu�Pravd�podobn� �sp�ch�Pravd�podobn� nebylo nalezeno�Profilovac� �asova� vypr�el (SIGPROF)�Ovlada� protokolu nep�ipojen�Chyba protokolu�Rodina protokol� nen� podporov�na�Protokol nen� k dispozici�Protokol nen� podporov�n�Protokol nepodporuje sokety�Zak�zan� ot�zka pro danou tabulku�Konec (SIGQUIT)�RFS-specifick� chyba�Chybn� RPC procedura pro program�Selhal RPC p�i NIS operaci�RPC program nen� k dispozici�Chybn� verze RPC programu�RPC struktura je chybn��Chybn� verze RPC�RPC: (nezn�m� chybov� k�d)�RPC: Chyba p�i ov��ov�n� toto�nosti�RPC: V�sledek nelze dek�dovat�RPC: Argumenty nelze zak�dovat�RPC: Chyba (bl��e neur�en�)�RPC: Nekompatibiln� verze RPC�RPC: Chyba portmapperu�RPC: Procedura nen� k dispozici�RPC: Program nen� registrov�n�RPC: Program nen� k dispozici�RPC: Nesouhlas� program nebo verze�RPC: Chyba vzd�len�ho syst�mu�RPC: Server nem��e dek�dovat argumenty�RPC: �sp�ch�RPC: �asova� vypr�el�RPC: Nelze p�ijmout�RPC: Nelze vyslat�RPC: Nezn�m� po��ta��RPC: Nezn�m� protokol�RSA (bit�: %d)
+-�RTLD_NEXT je pou�ito pro k�d, kter� nen� dynamicky zaveden�P�e�ten� a vyps�n� profilovac�ch dat sd�len�ho objektu.�Na�ten� �daj� o konfiguraci ze souboru N�ZEV�Syst�m soubor� je pouze pro �ten��Real-timeov� sign�l %d�Regul�rn� v�raz je p��li� velk��Chyba vstupu/v�stupu na vzd�len�m po��ta�i�Vzd�len� adresa byla zm�nila�Odstra�te heslo nebo zaka�te �ten� souboru ostatn�m.�Znovuotev�en� sd�len�ho objektu `%s' nebylo �sp�n��Kopie:
+-�  Chyby v programu oznamujte na adrese %s (pouze anglicky),
+-p�ipom�nky k p�ekladu zas�lejte na adresu <cs@li.org> (�esky).
+-�  Chyby v programu oznamujte pomoc� skriptu `glibcbug' na adresu <bugs@gnu.org>
+-(pouze anglicky), p�ipom�nky k p�ekladu zas�lejte na <cs@li.org> (�esky).
+-�Chybn� argumenty ��dosti�Resolver vrac� stav 0 (bez chyby)�Vnit�n� chyba resolveru�Bylo zabr�n�no vz�jemn�mu zablokov�n� prost�edk��Prost�edek byl ztracen�Prost�edek je do�asn� nep��stupn��V�sledky zasl�ny procedu�e zp�tn�ho vol�n��SD�LEN�_OBJEKT [PROF_DATA]�SUNYP�Prohled�vac� cesta  : %s
+-�Neopr�vn�n� p��stup do pam�ti (SIGSEGV)�Server je zanepr�zdn�n, zkuste to znovu�Pam� serveru byla vy�erp�na�Server odm�tl opr�vn�n��Server odm�tl ov��en��Jm�no serveru nen� pro ai_socktype podporov�no�Nastav� n�zev programu�Zastaven� serveru�Sign�l 0�Soketov� operace na objektu, kter� nen� soketem�Typ soket nen� podporov�n�Software zp�sobil ukon�en� spojen� (abort)�Lituji, nejste superu�ivatel
+-�Na�te zdrojovou definici n�rodn�ho prost�ed� ze SOUBORu�Chyba srmount�Poru�en z�sobn�k (SIGSTKFLT)"�Zastaral� odkaz na NFS soubor�Spust� PO�ET vl�ken�Stav              : %s
+-�Pozastaven (SIGTSTP)�Pozastaven (SIGSTOP)�Pozastaven (tty input) (SIGTTIN)�Pozastaven (tty output) (SIGTTOU)�Chyba proudov� roury�Struktura pot�ebuje opravu��sp�ch�Potla�� varovn� a informa�n� zpr�vy�Symbolick� n�zvy znak� budou �teny ze SOUBORu (znakov� sady)�Chyba syst�mu�Syst�mov� informace:�P�id�len� syst�mov�ho prost�edku nebylo �sp�n��Syst�mov� adres�� pro znakov� sady:       : %s
+-                      reperto�ry znak�    : %s
+-                      lokaliza�n� soubory : %s
+-%s�TABULKA
+-�Typ tabulky         : %s
+-�Do�asn� chyba p�i vyhodnocov�n� jm�na�Ukon�en (SIGTERM)�Soubor ji� je pou��v�n�  N�sleduj�c� seznam obsahuje v�echny zn�m� znakov� sady. To nutn� neznamen�,
+-�e v�echny kombinace t�chto n�zv� mohou b�t pou�ity pro argumenty Z a DO.
+-Jedna znakov� sada m��e b�t uvedena pod v�cer�mi n�zvy (p�ezd�vkami).
+-  N�kter� z n�zv� nejsou oby�ejn� �et�zce, ale regul�rn� v�razy, kter�
+-ur�uj� mo�n� parametry programu.
+-
+-  ��ivotnost    : ��asova� vypr�el�P��li� mnoho atribut��P��li� mnoho �rovn� symbolick�ch odkaz��P��li� mnoho odkaz��P�ekro�en limit po�tu otev�en�ch soubor��V cel�m syst�mu je p��li� mnoho otev�en�ch soubor��P�ekro�en limit po�tu proces� aktu�ln�ho u�ivatele�P��li� mnoho odkaz� - nelze spojit�P��li� mnoho u�ivatel��Trasovac�/lad�c� past (SIGTRAP)�Koncov� zp�tn� lom�tko�P�ekladatel zem�el�Koncov� komunika�n� bod je u� p�ipojen�Koncov� komunika�n� bod nen� p�ipojen�V�ce informac� z�sk�te p��kazy `%s --help' nebo `%s --usage'.
+-�Zkou�� se %s...
+-�Typ  : %s
+-�NEZN�M��Toto�nost NIS+ klienta nelze ov��it�Toto�nost NIS+ serveru nelze ov��it�Zp�tn� vol�n� nelze vytvo�it�Na serveru nelze vytvo�it proces�Nezn�m� (typ = %d, bit� = %d)
+-�Nezn�m� kl��ov� slovo v .netrc: %s�Nezn�m� chybov� k�d slu�by NIS�Nezn�m� datab�ze: %s
+-�Nezn�m� chyba�Nezn�m� chyba �Nezn�m� po��ta��Nezn�m� objekt�Nezn�m� volba: %s %s %s�Nezn�m� chyba resolveru�Nezn�m� chyba serveru�Nezn�m� sign�l %d�Nezn�m� chyba syst�mu�Nezn�m� chyba ypbind�Nep�rov� ( or \(�Nep�rov� ) or \)�Nep�rov� [ or [^�Nep�rov� \{�Nezn�m� prom�nn� `%s'�Nal�hav� V/V situace (SIGURG)�Pou�it�:�Pou�it�: %s jm�no_prom�nn� [cesta]
+-�Pou�it�: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verze ]
+-�U�ivatelem definovan� sign�l 1 (SIGUSR1)�U�ivatelem definovan� sign�l 2 (SIGUSR2)�Hodnota je p��li� velk� pro dan� datov� typ�Virtu�ln� �asova� vypr�el (SIGVTALRM)�Vykonan� p��kaz dal podivn� v�sledek�Okno se zm�nilo (SIGWINCH)�Vyps�n� n�zv� dostupn�ch znakov�ch sad�Vyps�n� n�zv� dostupn�ch n�rodn�ch prost�ed��Vyps�n� n�zv� vybran�ch kategori��Vyps�n� n�zv� vybran�ch kl��ov�ch slov�Zaps�n� v�stup do souboru SOUBOR�Autor: %s.
+-�Chybn� typ m�dia�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Ano, 42 je smysl �ivota�Tentokr�t jste to skute�n� zvoral�Koncov� �as pokra�ovac�ho ��dku Zone nen� v�t�� ne� koncov� �as p�edch�zej�c�ho ��dku�[SOUBOR...]�Definice `%1$s' nekon�� `END %1$s'�`%s' nejsou spr�vn� profilovac� data pro `%s'�`-1' mus� b�t posledn�m �dajem v polo�ce `%s' kategorie `%s'�`...' m��e b�t pou�ito jen v polo�k�ch `...' a `UNDEFINED'�Za prvn�m argumentem pro `collating-element' je o�ek�v�no `from'��et�zec `z-�eho' v deklaraci prvku �azen� obsahuje nezn�m� znak�ai_family nen� podporov�n�ai_socktype nen� podporov�n�ji� b���argument pro <%s> mus� b�t jednoznakov��argument pro `%s' mus� b�t jednoznakov��auth_none.c - Fat�ln� chyba marshallingu�authunix_create: nedostatek pam�ti
+-�chybn� argument�chybn� vlastn�k�pr�zdn� polo�ka OD v ��dku Link�pr�zdn� polo�ka DO v ��dku Link�blok uvoln�n dvakr�t
+-�pochybn� mcheck_status, knihovna je chybn�
+-�v�esm�rov� vys�l�n�: ioctl (�ten� konfigurace rozhran�)�v�esm�rov� vys�l�n�: ioctl (�ten� p��znak� rozhran�)�p�ete�en� vyrovn�vac� pam�ti�cache_set: ne�lo alokovat vyrovn�vac� pam� pro rpc�cache_set: alokace nov� polo�ky cache se nezda�ila�cache_set: ob� nenalezena�zkratku �asov�ho p�sma pro pou�it� ihned po �asov�m �daji nelze nel�zt���slo procedury %d nelze znovu p�id�lit
+-�nelze vykonat `stat' pro soubor n�rodn�ho prost�ed� `%s'�pam� pro symboly nelze alokovat�intern� deskriptor nelze vytvo�it�intern� deskriptory nelze vytvo�it�soket nem��e p�ij�mat spojen�: %s�preprocesor jazyka C nelze nal�zt: %s 
+-���dn� preprocesor jazyka C (cpp) nelze nal�zt
+-���dost star� verze (%d) nelze zpracovat; aktu�ln� verze je %d�prvek �azen� `%.*s' nelze vlo�it�do v�sledn� tabulky nelze vkl�dat�nov� symbol �azen� nelze vlo�it: %s�profilovac� data nelze na��st�nelze otev��t�`%s' nelze otev��t�datab�zov� soubor `%s' nelze otev��t: %s�vstupn� soubor `%s' nelze otev��t�soubor `%s' definice n�rodn�ho prost�ed� nelze otev��t�v�stupn� soubor nelze otev��t�v�stupn� soubor `%s' nelze otev��t�v�stupn� soubor `%s' pro kategorii `%s' nelze otev��t�soket nelze otev��t: %s�zadan� po�ad� �azen� nelze zpracovat�adres�� `%s' znakov�ch sad nelze na��st�konfigura�n� soubor nelze na��st (fat�ln�)�od klienta nelze ��st�hlavi�ku ze souboru `%s' nelze p�e��st�adres�� `%s' n�rodn�ch prost�ed� nelze na��st�soubor `%s' n�rodn�ho prost�ed� nelze ��st�reperto�r znak� `%s' nelze ��st�statistick� �daje nelze na��st�stat() nelze na soubor `%s' vykonat stat(): %s�v�stupn� soubory nelze do `%s' zapsat�v�sledek nelze zapsat: %s�statistiku nelze zapsat: %s�ke klientovi nelze zapisovat��daje kategorie po�adov�ny v�ce ne� jednou - to by se nem�lo st�t�znak %s'%s' ve t��d� `%s' mus� b�t ve t��d� `%s'�znak %s'%s' ve t��d� `%s' nesm� b�t ve t��d� `%s'�znak <SP> nen� ve znakov� sad� definov�n�znak `%s', pot�ebn� jako implicitn� hodnota, nen� definov�n�t��da znak� `%s' ji� je definov�na�znakov� sada `%s' ji� je definov�na�soubor `%s' znakov� sady nebyl nalezen�clnt_raw.c - Fat�ln� chyba p�i serializaci hlavi�ky.�clnttcp_create: nedostatek pam�ti
+-�clntudp_create: nedostatek pam�ti
+-�clntunix_create: nedostatek pam�ti
+-�prvek �azen� `%.*s' uveden v�ce ne� jednou - ��dek ignorov�n�symbol �azen� `%.*s' uveden v�ce ne� jednou - ��dek ignorov�n�po `%s' je o�ek�v�n symbol �azen��p�ipojen� na adresou %s: �o�ek�v�na konstanta nebo identifik�tor�konverze z `%s' do `%s' nen� podporov�na�konverze zastavena kv�li probl�mu p�i z�pisu v�stupu�rpc server nebylo mo�no vytvo�it
+-�program %d verze %d nebylo mo�no zaregistrovat
+-�datab�ze [kl�� ...]�implicitn� soubor `%s' znakov� sady nebyl nalezen�p��znak sm�ru v �et�zci (%d) polo�ky `era' v kategorii `%s' nen� '+' ani '-'�p��znak sm�ru v �et�zci (%d) polo�ky `era' v kategorii `%s' nen� jednoznakov��duplicitn� n�zev znaku `%s'�duplicitn� definice prvku �azen��duplicitn� definice znaku `%.*s'�duplicitn� kl���duplicitn� definice sady�duplicitn� ozna�en� �asov�ho p�sma %s (soubor "%s", ��dek %d)�duplicitn� identifik�tor zpr�vy�duplicitn� ��slo zpr�vy�pr�zdn� znakov� �et�zec�pr�zdn� v�hov� n�zev - ��dek ignorov�n�enablecache: cache ji� je povolena�enablecache: cache nebylo mo�no alokovat�enablecache: nebylo mo�no alokovat m�sto pro data v cache�enablecache: nebylo mo�no alokovat frontu pro cache�v�stupn� k�dov�n��k�dov�n� vstupn�ho textu�koncov� bod `...' je v�t�� ne� po��te�n��chyba b�hem uzav�r�n� vstupu `%s'�chyba b�hem uzav�r�n� v�stupn�ho souboru�chyba b�hem uzav�r�n� souboru profilovac�ch dat�chyba b�hem vkl�d�n� prvku �azen� do ha�ovac� tabulky�chyba b�hem vkl�d�n� do hashovac� tabulky�chyba b�hem �ten� vstupu�jako argument pro `copy' o�ek�v�n �et�zec�o�ek�van� pokra�ovac� ��dek nebyl nalezen�sd�len� objekt `%s' se nepoda�ilo zav�st�data symbol� se nepoda�ila na��st�soubor profilovac�ch dat se nepoda�ilo mmap-ovat�konverze se nezda�ila�chyba b�hem z�pisu dat kategorie `%s'�fcntl: F_SETFD�polo�ka `%s' kategorie `%s' nen� definov�na�polo�ka `%s' kategorie `%s' nen� definov�na�soubor '%s' ji� existuje a mohl b�t p�eps�n
+-�hodnota z-�eho pro `collating-element' mus� b�t �et�zec�funkce fstat() skon�ila s chybou�smet� na konci specifikace k�du znaku�smet� na konci ��sla�smet� na konci hodnoty posunut� v �et�zci (%d) polo�ky `era' kategorie `%s'�smet� na konci po��te�n�ho data v �et�zci (%d) polo�ky `era' kategorie `%s'�smet� na konci koncov�ho data v �et�zci (%d) polo�ky `era' kategorie `%s'�vytvo�� graf vol�n��vytvo�� jednoduch� profil s po�ty a tiky�get_myaddress: ioctl (�ten� konfigurace rozhran�)�Z�sk�v� z�znamy z administrativn� datab�ze.�handle_request: ��dost p�ijata (verze = %d)�pevn� odkaz nevytvo�en, pou�it symbolick��na soubor se odkazuje v�ce pevn�ch odkaz��chybn� polo�ka KOREKCE na ��dku Leap�chybn� polo�ka Rolling/Stationary na ��dku Leap�nepovolen� znak v �et�zci�nepovolen� znak v souboru: �nepovolen� prvek �azen��nepovolen� definice�zad�no nep��pustn� k�dov�n��chybn� escape-sekvence na konci �et�zce�nepovolen� vstupn� sekvence na pozici %ld�nepovolen� n�zvy pro rozsah znak��nepovolen� nettype: '%s'
+-�chybn� hodnota posunut� v �et�zci (%d) polo�ky `era' kategorie `%s'�nepovolen� ��slo sady�neplatn� po��te�n� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�neplatn� koncov� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�implementa�n� omezen�: maxim�ln� po�et t��d znak� je %d�implementa�n� omezen�: maxim�ln� po�et znakov�ch sad je %d�nekompletn� znak nebo shift sekvence na konci vyrovn�vac� pam�ti�chybn� form�tovan� soubor�vstupn� ��dek nezn�meho typu�vnit�n� chyba (nep��pustn� deskriptor)�vnit�n� chyba - addtype vol�n s chybn�m isdst�vnit�n� chyba - addtype vol�n s chybn�m ttisgmt�vnit�n� chyba - addtype vol�n s chybn�m ttisstd�vnit�n� chyba ve funkci %s na ��dku %u�neplatn� posunut� v��i UTC�neplatn� form�t zkratky�neplatn� den m�s�ce�neplatn� koncov� rok�neplatn� p�estupn� rok�neplatn� m�d pro dlopen()�neplatn� n�zev m�s�ce�neplatn� ulo�en� �as�neplatn� po��te�n� rok�neplatn� denn� �as�neplatn� n�zev dne�d�lka kl��e v ��dosti je p��li� dlouh�: %Zd���dek za '...'  mus� obsahovat definici znaku���dek p�ed '...' neobsahuje definici znaku���dek je p��li� dlouh��vyp��e v�echny zn�m� znakov� sady�soubor `%s' n�rodn�ho prost�ed� pou�it� v p��kazu `copy' nebyl nalezen�funkce lstat() skon�ila s chybou�deformovan� ��dek - ignorov�n�chyba p�i mapov�n� tabulky �et�zc� z hlavi�ky sekce do pam�ti�chyba p�i mapov�n� hlavi�ek sekc� do pam�ti�pam� p�ed za��tkem p�id�len�ho bloku p�eps�na
+-�pam� za koncem p�id�len�ho bloku p�eps�na
+-�pam� vy�erp�na�pam� vy�erp�na
+-�pam� je konzistentn�, knihovna je chybn�
+-��et�zec (%d) polo�ky `era' kategorie `%s' je chybn�ho form�tu��et�zec (%d) polo�ky `era' kategorie `%s' neobsahuje jm�no �ry�bezejmenn� pravidlo�p�vodn� ani c�lov� k�dov�n� nen� zad�no�netname2user: (nis+ lookup): %s
+-�netname2user: DES z�znam pro %s v adres��i %s nen� jednozna�n��netname2user: LOK�LN� z�znam pro %s v adres��i %s nen� jednozna�n��netname2user: '%s' nen� seznam id skupin.�netname2user: hlavn� (principal) n�zev '%s' je p��li� dlouh��netname2user: nem�l bych m�t uid 0�dosud neregistrovan� program (%d)
+-�hodnota <Uxxxx> nebo <Uxxxxxxxx> nebyla zad�na�v polo�ce `%s' v kategorii `%s' nen� korektn� regul�rn� v�raz: %s�pravidlu nevyhovuje ��dn� den v m�s�ci�chyb� definice symbolu `UNDEFINED'�n�zev souboru pro profilovac� data nebyl zad�n a sd�len� objekt `%s' nem� soname�p�i pou�it� `copy' nen� dovoleno pou��t ��dn� jin� kl��ov� slovo�v�stupn� soubor nebyl vytvo�en, proto�e se vyskytla varov�n��reperto�r znak� nebyl zad�n: nelze pokra�ovat���dn� symbolick� jm�no nebylo zad�no���dn� symbolick� jm�no nebylo pro konec rozsahu zad�no�symbol `%s' nem� definovanou v�hu�nen� oby�ejn�m souborem�konfigurace nscd:
+-
+-%15d  lad�c� �rove� serveru
+-�nscd neb��!
+-�definici CHARMAP mohou n�sledovat pouze definice WIDTH�p�vodn� k�dov�n� nebylo pomoc� `-f' zad�no�v�stupn� soubor�pmap_getmaps probl�m s rpc�poll: chyba protokolu b�hem p��pravy okruhu
+-�chyba preprocesoru�vyp��e seznam symbol� a po�et jejich pou�it��vypisuje informace o pr�b�hu�probl�my b�hem �ten� `%s'�profilovac� data `%s' nesouhlas� se sd�len�m objektem `%s'�program %lu nen� dostupn�
+-�program %lu verze %lu nen� dostupn�
+-�program %lu verze %lu je p�ipraven a �ek�
+-�rcmd: poll (nastavov�n� stderr): %m
+-�rcmd: soket: Voln� port nebyl nalezen
+-�rcmd: write (nastavov�n� stderr): %m
+-�registerrpc: nedostatek pam�ti
+-�p�estupn� sekunda opakov�na�soubor `%s' reperto�ru znak� nebyl nalezen�rpcgen: chyba p�i vkl�d�n� do seznamu argument�
+-�rpcgen: p��li� mnoho definic
+-�rpcinfo: %s je nezn�m� po��ta�
+-�rpcinfo: %s je nezn�m� slu�ba
+-�rpcinfo: Registraci programu %s verze %s nelze zru�it
+-�rpcinfo: v�esm�rov� vys�l�n� nebylo �sp�n�: %s
+-�rpcinfo: s portmapperem se nelze spojit�stejn� jm�no pravidla je pou�ito ve v�ce souborech�ne�pln� �ten� kl��e ��dosti: %s�ne�pln� �ten� ��dosti: `%s'�ne�pln� z�pis v %s(): %s�soket: chyba protokolu p�i p��prav� okruhu
+-�po�ad� �azen� `forward' a `backward' se navz�jem vylu�uj��uveden� v�hy pro symbol �azen� nem� v�znam�standardn� vstup�standardn� v�stup�nepovolen� po��te�n� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�po��te�n� rok v�t�� ne� koncov��po��te�n� rok je pro ulo�en� p��li� velk��po��te�n� rok je pro ulo�en� p��li� mal��nepovolen� koncov� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�svc_run: funkce select skon�ila s chybou�svc_tcp.c - p�i getsockname nebo listen vznikla chyba�svc_tcp.c - p�i vytv��en� tcp soketu vznikla chyba�svc_tcp: makefd_xprt: nedostatek pam�ti
+-�svc_unix.c - p�i vytv��en� AF_UNIX soketu vznikla chyba�svc_unix.c - p�i getsockname nebo listen vznikla chyba�svc_unix: makefd_xprt: nedostatek pam�ti
+-�svctcp_create: nedostatek pam�ti
+-�svcudp_create - p�i getsockname vznikla chyba�svcudp_create: nedostatek pam�ti
+-�svcudp_create: soket nelze vytvo�it�svcunix_create: nedostatek pam�ti
+-�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici prvku�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje jin� prvek�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici jin�ho symbolu�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici symbolu�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje symbolick� jm�no ve znakov� sad��syntaktick� chyba v definici %s: %s�syntaktick� chyba v direktiv� `order_start'�syntaktick� chyba v definici t��dy znak��syntaktick� chyba v definici konverze znak��syntaktick� chyba v definici po�ad� �azen��syntaktick� chyba v definici �azen��syntaktick� chyba v definici kategorie LC_CTYPE�syntaktick� chyba v definici nov� t��dy znak��syntaktick� chyba v definici nov� znakov� sady�syntaktick� chyba v definici n�rodn�ch zpr�v�syntaktick� chyba v definici n�rodn�ho prost�ed� pro pen�n� �daje�syntaktick� chyba v definici n�rodn�ho prost�ed� pro ��sla�syntaktick� chyba ve specifikaci po�ad��syntaktick� chyba v prologu: %s�syntaktick� chyba v definici reperto�ru znak�: %s�syntaktick� chyba v definici n�rodn�ho prost�ed� pro �as�syntaktick� chyba: nen� uvnit� sekce pro definici n�rodn�ho prost�ed��k�dov�n� c�le nebylo pomoc� `-t' zad�no�toto je prvn� definice��as men�� ne� nula�p�ete�en� �asu�v k�du znaku je p��li� m�lo bajt��v k�du znaku je p��li� mnoho bajt��definov�no p��li� mnoho znakov�ch t��d�p��li� mnoho p�estupn�ch sekund�p��li� mnoho lok�ln�ch �asov�ch typ��p��li� mnoho p�echod�?!�p��li� mnoho vah�p��li� mnoho nebo p��li� dlouh� zkratky �asov�ho p�sma�smet� na konci ��dku�probl�my p�i odpov�d�n� programu %d
+-�dva ��dky za sebou obsahuj�c� `...' nejsou povoleny�zad�n jeden rok�vyrovn�vac� pam� pro vstup nelze alokovat�argumenty nelze uvolnit�nen� definov�no�nezn�m� znak `%s'�nezn�m� znak v polo�ce `%s' kategorie `%s'�nezn�m� direktiva �azen��nezn�m� direktiva `%s' - ��dek ignorov�n�nezn�m� chyba funkce iconv() (%d)�nezn�m� sada `%s'�nezn�m� symbol `%.*s' - ��dek ignorov�n��asov� p�smo bez pravidel�neukon�en� zpr�va�neukon�en� �et�zec�neukon�en� �et�zec�neukon�en� symbolick� jm�no�escape sekvence nen� cel��horn� mez rozsahu je men�� ne� doln��Pou�it�: %s vstupn�_soubor
+-�pou�it� 29. �nora v nep�estupn�m roce�hodnota pro %s mus� b�t cel� ��slo�honota pro <%s> mus� b�t mezi 1 a 4�hodnota polo�ky `%s' kategorie `%s' nesm� b�t pr�zdn� �et�zec�hodnota <mb_cur_max> mus� b�t v�t�� ne� hodnota <mb_cur_min>�hodnota polo�ky `int_curr_symbol' kategorie `LC_MONETARY' neodpov�d� platn�mu jm�nu v ISO 4217�hodnota polo�ky `int_curr_symbol' kategorie `LC_MONETARY' m� chybnou d�lku�hodnoty polo�ky `%s' kategorie `%s' mus� b�t men�� ne� 127�b�hem p�ij�m�n� spojen�: %s�b�hem alokace z�znamu cache pam�ti�b�hem alokace z�znamu ha�ovac� tabulky�b�hem alokace kopie kl��e�b�hem otv�r�n� star�ho katalogu�b�hem p��pravy v�stupu�b�hem �ten� datab�ze�b�hem funkce stat() na soubor profilovac�ch informac��b�hem z�pisu datab�ze�ne�pln� z�pis�zapisovateln� nejen pro vlastn�ka�chybn� po�et argument���patn� po�et polo�ek v ��dku Leap��patn� po�et polo�ek v ��dku Link��patn� po�et polo�ek v ��dku Rule��patn� po�et polo�ek v pokra�ovac�m ��dku Zone��patn� po�et polo�ek v ��dku Zone�xdr_reference: nedostatek pam�ti
+-�xdrrec_create: nedostatek pam�ti
+-�yp_update: n�zev po��ta�e nelze konvertovat na s��ov� n�zev
+-�yp_update: adresu serveru nelze zjistit
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/de.mo glibc-2.1.3/po/de.mo
+--- ../glibc-2.1.3/po/de.mo	2000-02-24 18:13:09.000000000 -0800
++++ glibc-2.1.3/po/de.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,476 +0,0 @@
+-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n��
+-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_��	����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c��
���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d��	���kd�����ud�����yd��
����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i��	���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j�����
+-k�����k��$���/k��
+-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	���n��	���n��	���n��	���#n��	���-n��	���7n��	���An��	���Kn��	���Un��	���_n��	���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To��
���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir��
���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s��	����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu��	���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w��
+-����w������w������w��2���x�����5x�����Dx�����]x��
���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{��
+-����{������{������{������{������{�����	|�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i��������������������������������������
������������	���������'���!���?���	���a���
���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.��������������
���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉��������������
������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������
���������������)������?������T������l������t����������������������������������ڌ��*������(���
������6������C���"���W�������z����������������	������������$���/���
+-���T������_������n���������
���*������8���!���L������n������}�����������������"���������������������
+-���������'���-���#���U���6���y���
�������
+-����������ɑ��"���ё��"�������������"���1������T������t�����������������
����������ɒ�����ؒ������������������
������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!���	��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)���	���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę��������	����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C���
���m������{���+�����������������ޤ������������
+-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%���
���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0����������������
������ ������<������Q������e������z�����������������������������������#�������5������G���S���
�������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G���
�������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ�����������
+-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H�����������������
���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5���
���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#��������������	������������0���(������Y���$���u�����������������#������������������������	������������:������U���4���n������������������������'�������B������D���]���j�������K���
���?���Y���	���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������(��>������g������{���T�������P�������3���5���4���i�����������������������������������������������"������<������P����������������0������0���O����������N�������
+-�������������������������� ���6������W��� ���r��� �������&������� �������&������� ���#���&���D������k�����������������!����������������������������7�������7���0���>���h���1�������)�������������/������,���O������|���0�������6�������3�������0���3���!���d���1�������-�������)������� ������@���1���-���r���%��������������)�������:������*���F���(���q���(�������(�������(�������(���������>���-���V���/�������6�������)�������������,���3���(���`���+�������,�������-�������+������/���<���)���l���#��������������$������������������������;���2�������'�������'���(���>���P����������3��������������E����������2���B���D���2�������+��������������;�������?���/���9���o������������������������8�������"������5���$���@���Z���@������������������������������)������G���3���e���,�������E�������-���������:��� ���O���
���p������~���(�������������������������������������������6������S������s����������
�������!��������������(���������� ������3���"���7������Z���?���r���7�������)�������.������(���C���(���l���&�������5�������5�������7���(���F���`���2�������#�������0�������9���/���%���i���7�������;�������G������;���K���>�������4��������������������+���*������V��� ���m���"�������'�������T�������Z���.����������<�������/�������������?������*���^�����������&���t���9�������A�������:���������R���)���f���9����������������������������-����������������'������E���!���`���'�������������� �������'����������
������(������<���6���[���6�������F�������@������I���Q���!����������������������������9�������������
+-���&���
+-���1���
+-���<���
+-���G���
+-���R���
+-���]���
+-���h���
+-���s���
+-���~���
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-������
+-���
���	������	���"���	���,���	���6���	���@���	���J���	���T���	���^������h���H�������%�������6�������:���(������c���"���}���I��������������>�������4���/���5���d�������������������������������)������'���8������`���,���v����������C�������1����������-���$���4�������Y���������&���(���!���O������q������������������������(�������/�������	������(������+���F���(���r���'�������+��������������#���������/������B���F���[��������������������������������������4���������=���1���R���-�������.���������������������������'���������:������Q������e���
�������/�������B�������������������&���6���(���]���!���������������������)����������	���%������<���D���2�������4��������������������������!���;������]���#���m������������������������
+-���������������������K����������;��� ���N������o�����������������4�������,����������������.���,���A���-���n���4�������!����������������������E�������'�������!��������)�����I��$���c��������������"�����������������������������&�H���*�*���s������%�����:������������*����1����>�/���Y�(�����*�����)�����*�������2�8���I�9����������!���������� ����(���;�$���d������+���������������4�������� ����8����W�$���l�)�����6�����!�����0�������E�3���a������9�����%�����#����,���7����d������.���������������������������(����;����Q� ���a������!�����#������������������	����	�t���4	�>����	�<����	����%
+-����2
+-����F
+-����W
+-�0���m
+-�%����
+-�:����
+-�%����
+-����%�!���D����f�$�����;�����&���������/���-�&���]�&�������������������������&��������
����$
�>���:
����y
�����
�*����
�<����
�+�������>����X����t������0�����!����������+����!���<�$���^�&�����8�����	����������(����#���.����R�#���p����������������%�����'����&���4�3���[�,������������������������#���4�"���X�/���{���������������������������� ����;�C���J�@�������������������!���"�)���D�'���n�C�����5�����	����&����A���A�#�����)�����$����������5����"���J�*���m������,������������������������<���&�+���c�-�����-�����2������������7����I�&���R�!���y�3�����H�����/�������H����Y�!���e� ����������
+-������������������������!���'����I�1���P�>���������������0��������������������
+-����������)����������?��������?������'�������0�&���C����j����y�!����������!����������������������0� ���M����n�:����������	�����	�����7�����7���& �0���^ �3���� � ���� �4���� ����!����4!����N!����a!����u!�����!�����!�"����!�����!�����!����"����)"�&���H"�#���o"�&����"�����"�����"�����"����#�$���#�O���>#�/����#�����#�����#�1����#�'���*$�*���R$� ���}$�-����$�*����$�.����$�4���&%�&���[%�����%�����%�����%�����%�����%�M����%�)���&�`���F&�
+-����&�?����&�B����&�2���5'�C���h'�B����'�@����'�S���0(�"����(�"����(�����(�6����(�3���)�+���K)�)���w)�����)�����)�"����)� ����)�*���*�<���@*�<���}*�8����*�����*�<���+�*���?+�)���j+�X����+�1����+�5���,�6���U,�(����,�)����,�H����,�*���(-�(���S-�C���|-�-����-�*����-�8���.�$���R.����w.�����.�+����.�'����.�2����/�"���3/�'���V/�>���~/� ����/�?����/�K���0�7���j0�����0�$����0�,����0�&���1�*���71����b1�7����1�*����1�%����1�&���2����22�V���R2�p����2�^���3�@���y3�}����3�k���84�H����4�,����4�6���5�;���Q5�:����5�(����5�(����5�)���6�U���D6�T����6�-����6�"���7�"���@7�7���c7�?����7� ����7�7����7����48�J���N8�g����8�k���9�1���m9�-����9�)����9�����9����:�/���%:�0���U:�,����:�����:�:����:�$���;�&���&;�/���M;�+���};�����;�%����;�=����;�7���'<�+���_<�'����<�7����<�=����<�(���)=����R=�,���p=�3����=�)����=�!����=�4���>�#���R>�6���v>�����>�:����>�9����>�:���1?�.���l?�,����?�(����?�d����?�c���V@�b����@����A�:���:A�=���uA�7����A�4����A�@��� B����aB�0���|B�8����B�.����B�!���C����7C����QC����fC�1����C�+����C�&����C����	D�Z���$D����D�Q����D�P����D�K���9E�H����E�<����E����F�.���&F�'���UF�I���}F�K����F�K���G�+���_G�����G�����G�����G�����G�����G����H����H����5H����QH����hH�#���|H�6����H�N����H�M���&I����tI�.����I�O����I�-���	J� ���7J�?���XJ�2����J�;����J�G���K�!���OK�E���qK�Q����K�O���	L����YL�9���iL� ����L�J����L�L���M�.���\M�1����M�5����M�&����M�,���N�O���GN�.����N� ����N�\����N�S���DO�E����O�:����O� ���P�=���:P�<���xP�����P�.����P�����P�F���Q�4���SQ�����Q�����Q�+����Q�$����Q�C����Q�1���CR����uR�D����R�%����R�8����R�.���6S�7���eS�.����S�8����S�%���T����+T�4���KT�+����T�����T�*����T�*����T�N���U�*���kU�,����U�0����U�5����U� ���*V����KV�-���dV�;����V�J����V����W����)W�T���9W�+����W�-����W�.����W�V���X�%���nX�5����X�6����X�.���Y�;���0Y�6���lY�/����Y�'����Y�,����Y�'���(Z�5���PZ�(����Z�V����Z�a���[�Z���h[������[�'���D\�+���l\�,����\�4����\�5����\�-���0]�7���^]�8����]�8����]�@���^�A���I^�@����^�>����^����_�2���&_�A���Y_�<����_�2����_����`�
���)`����7`�'���I`�&���q`�!����`�����`�����`�����`�����`�0���a�%���Ha�3���na�<����a�����a�2����a�5���/b����eb����ub�5����b� ����b�4����b����c����8c�4���Mc�����c�%����c�����c�����c�'����c�0���%d�C���Vd�����d�9����d�(����d�5���e�H���Le�K����e�r����e�W���Tf�M����f�	����f� ���g�$���%g�8���Jg�$����g�"����g�����g�����g�<���h�!���>h�.���`h�A����h�����h�+����h�+���i�+���Fi�<���ri�+����i�'����i�'���j�B���+j�5���nj������������:��c����������������
+-�����������}�������������H��8��	���������������1����������������������C���������������������������������
���������V�������������R���������V��z����������������������a������m��������������+���������
+-����������������
�������	��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"��������
�����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������	�������=������2��?��������*���������������u����������������z������������������$������J��^�����������
���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������
+-����������������������������d���o�������������'������������V��E������t��_��������������������������
+-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y���	����������Q��?��������������'����		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Can't unlink  %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing �%s: Error writing %s
+-�%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open %s: %m
+-�%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights :
+-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : `%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns   : %d
+-�Number of objects : %u
+-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE�TABLE
+-�TABLE,yes�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: GNU libc 2.1.3
+-POT-Creation-Date: 2000-02-16 10:39-0800
+-PO-Revision-Date: 2000-02-20 09:38+01:00
+-Last-Translator: Jochen Hein <jochen@jochen.org>
+-Language-Team: German <de@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�		Zugriffsrechte : �		Attribute      : �	%s [-abkCLNTM][-DName[=Wert]] [-i Gr��e] [-I [-K Sekunden]] [-Y Pfad] Eingabedatei
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o Ausgabedatei] [Eingabedatei]
+-�	%s [-n Netz-ID]* [-o Ausgabedatei] [Eingabedatei]
+-�	%s [-s Netz-Typ]* [-o Ausgabedatei] [Eingabedatei]
+-�	Zugriffsrechte : �	Dateneingabe vom Typ %s
+-�	Name         : %s
+-�	Public Key   : �	Typ            : %s
+-�	Universelle Adressen (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u Bytes] �
+-%s Cache:
+-
+-%15s  Cache ist eingeschaltet
+-%15Zd  vorgeschlagene Gr��e
+-%15ld  Time to Live f�r positive Eintr�ge in Sekunden
+-%15ld  Time to Live f�r negative Eintr�ge in Sekunden
+-%15ld  Cache-Hits bei positiven Eintr�gen
+-%15ld  Cache-Hits bei positiven Eintr�gen
+-%15ld  Cache-Misses bei positiven Eintr�gen
+-%15ld  Cache-Misses bei negativen Eintr�gen
+-%15ld%% Cache-Hit Verh�ltnis
+-%15s  Pr�fe /etc/%s auf �nderungen
+-�
+-Gruppen Mitglieder :
+-�
+-Time to Live        : �       rpcinfo -b Programmnummer Versionsnummer
+-�       rpcinfo -d Programmnummer Versionsnummer
+-�       rpcinfo -p [ Rechner ]
+-�       rpcinfo [ -n Portnummer ] -t Rechner Programmnummer [ Versionsnummer ]
+-�      nein�     ja�    L�nge der Daten = %u
+-�    Explizite Mitglieder:
+-�    Explizite Nicht-Mitglieder:
+-�    Implizite Mitglieder:
+-�    Implizite Nicht-Mitglieder:
+-�    Keine expliziten Mitglieder
+-�    Keine expliziten Nicht-Mitglieder
+-�    Keine impliziten Mitglieder
+-�    Keine impliziten Nicht-Mitglieder
+-�    Keine rekursiven Mitglieder
+-�    Keine rekursiven Nicht-Mitglieder
+-�    Rekursive Mitglieder:
+-�   Program Vers Proto   Port
+-�  oder: � (Regel aus Datei �%s�, Zeile %d)� [Option...]� fertig
+-��%s�, Zeile %d: %s��Zone %s�-Zeile und die Option �-l� schliessen sich aus��Zone %s�-Zeile und die Option �-p� schliessen sich aus��infile� ist f�r die Template-Generierungs-Flags erforderlich
+-�%.*s: ARGP_HELP_FMT Parameter verlangt einen Wert�%.*s: Unbekannter ARGP_HELP_FMT Parameter�%s in einer regellosen Zone�%s%s%s:%u: %s%sZusicherung �%s� nicht erf�llt.
+-�%s%s%s:%u: %s%sNicht erwarteter Fehler: %s.
+-�%s%sUnbekanntes Signal %d
+-�%s: Vorzeichenerweiterung von %d fehlgeschlagen
+-�%s: �<mb_cur_max>� mu� gr��er als �<mb_cur_min>� sein
+-�%s: C Pr�prozessor fehlgeschlagen mit Exit-Code %d
+-�%s: C Pr�prozessor fehlgeschlagen mit Signal %d
+-�%s: Kann �%s� nicht erzeugen: %s
+-�%s: Kann das Verzeichnis �%s� nicht erzeugen: %s
+-�%s: Kann nicht von �%s� nach �%s� linken: %s
+-�%s: Kann die Datei �%s� nicht �ffnen: %s
+-�%s: Kann �%s� nicht l�schen: %s
+-�%s: Kann den Verzeichniseintrag �%s� nicht l�schen (unlink): %s
+-�%s: Fehler beim Schlie�en der Datei �%s�: %s
+-�%s: Fehler beim Lesen der Datei �%s�
+-�%s: Fehler beim Schreiben �%s: Fehler beim Schreiben der Datei �%s�
+-�%s: Schalt-Zeile in einer nicht-Schaltsekunden-Datei �%s�
+-�%s: Kein Hauptspeicher mehr verf�gbar: %s
+-�%s: Mehr als eine �-L� Option angegeben
+-�%s: Mehr als eine �-d� Option angegeben
+-�%s: Mehr als eine �-l� Option angegeben
+-�%s: Mehr als eine �-p� Option angegeben
+-�%s: Mehr als eine �-y� Option angegeben
+-�%s: Zu viele Argumente
+-�%s: kann die Modifikationszeit nicht bekommen�%s: Das Kommando war �%s�, das Ergebnis war %d
+-�%s: Fehler im (intern verwendeten) endlichen Automaten�%s: Die Option ist nicht erlaubt -- �%c�
+-�%s: Ung�ltige Option -- �%c�
+-�%s: Die Option �%c%s� erlaubt kein Argument
+-�%s: Die Option �%s� ist nicht eindeutig
+-�%s: Die Option �%s� erfordert ein Argument
+-�%s: Die Option �--%s� erlaubt kein Argument
+-�%s: Die Option �-W %s� erlaubt kein Argument
+-�%s: Die Option �-W %s� ist nicht eindeutig
+-�%s: Diese Option ben�tigt ein Argument -- �%c�
+-�%s: Die Ausgabe w�rde �%s� �berschreiben
+-�%s: Panik: ung�ltiger �l_value� %d
+-�%s: Unerwartetes Ende der Datei�%s: Fehler beim �ffnen von �%s�: %m
+-�%s: Unbekannte Option �%c%s�
+-�%s: Unbekannte Option �--%s�
+-�%s: Syntax ist %s [ -s ] [ -v ] [ -l Ortszeit ] [ -p Posix-Regeln ] [ -d Verzeichnis ]
+-	[ -L Schaltsekunden ] [ -y Jahrestyp ] [ Dateiname ... ]
+-�%s: Syntax: %s [ -v ] [ -c cutoff ] Zonenname ...
+-�%s: Beim Schreiben der Ausgabe �%s�: %m�(PROGRAM ERROR) Keine Version bekannt!?�(PROGRAM ERROR) Option sollte eigentlich erkannt worden sein!?�(Unbekanntes Objekt)
+-�(unbekannter Fehler bei der Authentifizierung - %d)�Unbekanntes Signal�*** Die Datei �%s� ist gestrippt: keine detaillierte Analyse m�glich
+-�*Standardeingabe*�-o Ausgabedatei [Eingabedatei]...
+-[Ausgabedatei [Eingabedatei]...]��.lib�-Sektion in der �a.out�-Datei ist besch�digt�; untere Version = %lu, obere Version = %lu�; Ursache = �<%s> und <%s> sind ung�ltige Namen f�r einen Zeichenbereich�Das Zeichen �<SP>� darf nicht in der Klasse �%s� enthalten sein�Das Zeichen �<SP>� ist nicht in der Klasse �%s� enthalten�?�Abgebrochen�Zugriffsrechte: �Zugriff auf eine fehlerhafte oder defekte Shared Library�Die Adresse wird bereits verwendet�Die Adre�familie f�r Hostnamen wird nicht unterst�tzt�Die Adre�familie wird von der Protokollfamilie nicht unterst�tzt�Die Adre�familie wird von der Protokollfamilie nicht unterst�tzt�Konflikt mit Bekanntmachung�Der Wecker klingelt��berlauf der �anode�-Tabelle�Die Argumentliste ist zu lang�Die Argumentliste ist zu lang�Das Argument ist au�erhalb des Definitionsbereiches�Versuch, eine nicht-leere Tabelle zu l�schen�Versuche mehr Shared Libraries einzubinden als das Systemlimit zul��t�Versuch zu viele Shared Libraries einzubinden�Authentifizierung OK�Fehler bei der Authentifizierung�BOGUS OBJEKT
+-�Ung�ltige Adresse�Ung�ltiger Deskriptor zum Datenaustausch�Ung�ltiger Dateideskriptor�Ung�ltiger Dateideskriptor�Ung�ltiges Font-Dateiformat�Ung�ltige Nachricht�Ung�ltiger Aufruf-Code�Ung�ltiger Aufruf-Deskriptor�Ung�ltiger Betriebssystemaufruf�Ung�ltiger Wert f�r �ai_flags��Sei strikt POSIX-konform�Bin�re Daten
+-�Es ist ein Block-Device notwendig�Poll-Problem beim Broadcast�Daten�bergabe unterbrochen (broken pipe)�Bus-Zugriffsfehler�CDS�Rechenzeitbegrenzung �berschritten�Der Cache ist verfallen�Auf eine ben�tigte Shared Library kann nicht zugegriffen werden�Eine Shared Library kann nicht direkt ausgef�hrt werden�Kein Server f�r diese NIS-Domain gefunden�Keine Kommunikation mit dem Portmapper m�glich�Keine Kommunikation mit �ypbind� m�glich�Keine Kommunikation mit �ypserv� m�glich�Nicht gen�gend Hauptspeicher verf�gbar�Die angeforderte Adresse kann nicht zugewiesen werden�Kann den Socket f�r den Broadcast-RPC nicht erstellen�Eine Shared Library kann nicht direkt ausgef�hrt werden�Mehr als ein File-Generation-Flag angegeben, es ist nur eins erlaubt!
+-�Kann die Antwort auf den Broadcast nicht empfangen�Kann den Service nicht registrieren�Kein Senden nach dem Beenden des Sockets m�glich�Ein Senden nach dem Beenden des Sockets ist nicht m�glich�Kann das Broadcast-Paket nicht senden�Kann die Option �SO_BROADCAST� nicht beim Socket setzen�Es darf nicht mehr als eine Eingabedatei angegeben werden!
+-�Kann das �netid�-Flag nicht zusammen mit dem �inetd�-Flag verarbeiten!
+-�Das �netid�-Flag kann nicht ohne �TIRPC� verwendet werden!
+-�Das �table�-flags kann nicht mit �newstyle� verwendet werden!
+-�Die Kanalnummer ist au�erhalb des g�ltigen Bereiches�Trennzeichen : %c
+-�Der Kind-Proze� ist beendet�Die Best�tigung des Clients ist zu unsicher�Spalten             :
+-�Kommunikationsfehler beim Senden�Umwandeln der Lokale-Spezifikation�Der Computer hat den Bauernhof erworben�Berechnung der Gr��e der Tabelle der Zeichenklassen: Dies kann einige Zeit dauern...�Berechnung der Gr��e der Tabelle der Sortierinformationen: Dies kann einige Zeit dauern...�Verbindungsaufbau abgelehnt�Die Verbindung wurde vom Kommunikationspartner zur�ckgesetzt�Die Wartezeit f�r die Verbindung ist abgelaufen�Fortgesetzt�Konvertiert die Kodierung von Dateien in eine andere Kodierung.��bersetze den Schl�ssel in Kleinbuchstaben�Copyright � %s Free Software Foundation, Inc.
+-Dies ist freie Software; in den Quellen befinden sich die Lizenzbedingungen.
+-Es gibt KEINERLEI Garantie; nicht einmal f�r die TAUGLICHKEIT oder
+-VERWENDBARKEIT F�R EINEN ANGEGEBENEN ZWECK.
+-�Kann die Logdatei �%s� nicht erstellen�Erzeuge die C Headerdatei NAME mit den Symboldefinitionen�Die Ausgabedatei wird erzeugt, obwohl Warnungen ausgegeben wurden�Erstellt eine einfach DB Datenbank aus einer Text-Eingabe.�Erstellungszeit: %s�Ung�ltiger Link �ber Ger�tegrenzen hinweg�Der DES-Eintrag f�r den netname �%s� ist nicht eindeutig
+-�VERZEICHNIS
+-�DNANS�DNS�Die Datenbank f�r die Tabelle existiert nicht�Die Databank ist belegt�Verklemmung erkannt/vermieden�Standard-Zugriffsrechte :
+-�Es ist eine Zieladresse notwendig�Das Ger�t oder die Ressource ist belegt�Das Ger�t ist kein Stream�Das Ger�t ist nicht konfiguriert�Das Ger�t oder die Ressource ist belegt�Diffie-Hellmann (%d Bits)
+-�Verzeichnis   : %s
+-�Das Verzeichnis ist nicht leer�Der zugewiesene Plattenplatz (Quota) ist �berschritten�Der zugewiesene Plattenplatz (Quota) ist �berschritten�F�hre kein �fork()� aus und zeige Nachrichten auf dem aktuellen tty an�Gebe keine Nachrichten aus, w�hrend die Datenbank aufgebaut wird�Verwende nicht den existierenden Katalog; erzwinge eine neue Ausgabedatei�Die Domain wurde nicht zugewiesen�EMT-Trap�ENTRY
+-�Verschl�sselte Daten
+-�Die Typen des Eintrages/der Tabelle passen nicht zusammen�Fehler 0�Fehler 100�Fehler 101�Fehler 102�Fehler 103�Fehler 104�Fehler 105�Fehler 106�Fehler 107�Fehler 108�Fehler 109�Fehler 110�Fehler 111�Fehler 112�Fehler 113�Fehler 114�Fehler 115�Fehler 116�Fehler 117�Fehler 118�Fehler 119�Fehler 136�Fehler 142�Fehler 58�Fehler 59�Fehler 72�Fehler 73�Fehler 75�Fehler 76�Fehler 91�Fehler 92�Fehler im RPC Subsystem: �Fehler beim Zugriff auf die NIS+ Kaltstart-Datei.  Ist NIS+ installiert?�Fehler in unbekanntem Fehler-System: �Fehler bei der Kommunikation mit der Callback-Prozedur�Fehler: Die Datei �.netrc� ist f�r andere Benutzer lesbar.�Vermittlung ist �berf�llt�Fehler im Format der Programmdatei�Fataler Fehler: Das System definiert das Symbol �_POSIX2_LOCALEDEF� nicht�Datei�FILE enth�lt Zuordnungen von symbolischen Namen zu UCS4-Werten�Fehlgeschlagen (Fehler nicht genau zu spezifizieren)�Die Dateizugriffsnummer ist ein schlechter Verfassung�Die Datei existiert bereits�Verklemmung beim Datei-Locking�Verklemmung beim Datei-Locking�Der Dateiname ist zu lang�Die maximale Dateigr��e ist �berschritten��berlauf der Datei-Deskriptoren-Tabelle�Die Datei ist zu gro��Die Verkettung mittels First/Next ist defekt�Gleitkomma-Ausnahme�Vollst�ndige Resynchronisation f�r das Verzeichnis ist erforderlich�Die angeforderte Funktion ist nicht implementiert�GROUP
+-�Unsinnige Daten in ARGP_HELP_FMT: %s�Generiere einen Message-Katalog.\vWenn als INPUT-FILE - angegeben wird, wird von der Standardeingabe gelesen.  Wenn die OUTPUT-FILE
+-- ist, wird auf die Standardausgabe geschrieben.
+-�Allgemeiner Systemfehler�Hole Lokale-spezifische Informationen.�Gibt kurze Bedienungshinweise aus�Gibt diese Hilfe aus�Irgendein Fehler�Gruppe        : %s
+-�Gruppen Flags:�Gruppen-Eintrag f�r die Gruppe �%s.%s�:
+-�Warte f�r SECS Sekunden (Standardwert ist 3600)�Aufgelegt�Habe �%d� nicht im Group-Cache gefunden!�Habe �%d� nicht im Password-Cache gefunden!�Habe �%s� nicht im Group-Cache gefunden!�Habe �%s� nicht im Host-Cache gefunden!�Habe �%s� nicht im Password-Cache gefunden!�Der Rechner ist nicht aktiv�Fehler beim Aufl�sen des Hostnamens�Ein-/Ausgabefehler�Ein-/Ausgabe ist m�glich�Eingabedatei Ausgabedatei
+--o Ausgabedatei Eingabedatei
+--u Eingabedatei�Ein-/Ausgabe-Trap (IOT)�IVY�Bezeichner wurde entfernt�Ung�ltige Byte-Folge�Ung�ltiger Maschinenbefehl�Ung�ltiger Objekt-Typ f�r die angeforderte Operation�Nicht erlaubter Seek�Unpassender Dateityp oder unpassendes Dateiformat�Unpassender IOCTL (I/O-Control) f�r das Ger�t�Unpassende Operation f�r den Hintergrundproze��Informationsanfrage�Information:�Eingabedateien:�Beschreibung des Ein-/Ausgabe-Formates:�Eingabe-/Ausgabefehler�Interner NIS-Fehler�Interner Fehler in �ypbind��Unterbrechung�Unterbrechung w�hrend des Betriebssystemaufrufs�Der unterbrochene Betriebssystemaufruf sollte neu gestartet werden�Das Argument ist ung�ltig�Ung�ltiger Verweis zur�ck�Ung�ltiger Name f�r eine Zeichenklasse�Die Best�tigung des Clients ist ung�ltig�Ung�ltige �berpr�fung des Clients�Ung�ltiges Sortierzeichen�Ung�ltiger Inhalt von �\{\}��Ung�ltiger Link �ber Ger�tegrenzen hinweg�Ung�ltiger Austausch�Ung�ltiges Objekt f�r diese Operation�Ung�ltiges oder unvollst�ndiges Multi-Byte oder Wide-Zeichen�Der vorherige regul�re Ausdruck ist nicht korrekt.�Das Ende des angegebenen Intervalls ist nicht g�ltig�Ung�ltiger regul�rer Ausdruck�Ung�ltiger Aufruf-Code�Ung�ltiger Aufruf-Deskriptor�Ung�ltige �berpr�fung des Servers�Ung�ltiger Slot�Der angegebene Cache wird verworfen�Ist ein Verzeichnis�Ist eine �named file��Ist eine �named type file��Kerberos.
+-�Get�tet�LINK
+-�Der LOCAL Eintrag f�r die UID �%d� im Verzeichnis �%s� ist nicht eindeutig
+-�Level 2 angehalten�Level 2 ist nicht synchronisiert�Level 3 angehalten�Level 3 zur�ckgesetzt�Der Link wurde besch�digt�Die Link-Nummer ist au�erhalb des g�ltigen Bereiches�Der Link verweist auf einen ung�ltigen Namen�Verbundener Objekt-Typ : �Verbunden zu : %s
+-�Der lokale Domain-Name ist nicht eingetragen�Lokaler Fehler bei der Ressourcenreservierung�Die Maschine ist nicht an das Netzwerk angeschlossen�Ung�ltiger oder fehlerhafter Name�Obligatorische oder optionale Argumente von langen Optionen sind ebenfalls obligatorische bzw. optionale Argumente f�r jede zugeh�rige kurze Option.�Master Server :
+-�Der Master-Server ist besch�ftigt, vollst�ndiger Dump neu eingeplant.�Fehler beim Anfordern von Hauptspeicher�Kein Hauptspeicher mehr verf�gbar�Die Nachrichtentabelle ist voll�Die Nachricht ist zu lang�Fehlendes oder fehlerhaftes Attribut�Mod. Zeit     : %s�Modifikation fehlgeschlagen�Die Ver�nderung ist fehlgeschlagen�Modifiziere Ausgabe-Format:�Ein �Multihop� wurde versucht�NAME�Name
+-[-a|-m]�NIS�NIS Client/Server Versionen passen nicht zusammen - kein Service m�glich�Die Datenbank mit der NIS-Map ist ung�ltig�NIS+ Operation fehlgeschlagen�Die NIS+ Server sind nicht erreichbar�Der NIS+ Dienst ist nicht verf�gbar oder nicht installiert�KEIN OBJEKT
+-�NUMMER�Name : �%s�
+-�Name Service Cache Daemon.�Der Name wird nicht von diesem Server verwaltet�Der Name ist im Netzwerk nicht eindeutig�Der Name oder der Dienst ist nicht bekannt�Der Name bzw. Eintrag ist nicht eindeutig�Das benannte Objekt ist nicht durchsuchbar�Authentikator ben�tigt�Das Netzwerk hat die Verbindung nach einem Reset beendet�Das Netzwerk hat die Verbindung nach einem Reset verloren�Das Netzwerk ist nicht aktiv�Das Netzwerk ist nicht erreichbar�Keine �CSI�-Struktur verf�gbar�Keine XENIX-Semaphoren verf�gbar�Zu diesem Hostnamen geh�rt keine Adresse�Zu diesem Namen geh�rt keine Adresse�Keine Anode�Kein Hauptspeicher f�r den Puffer verf�gbar�Keine Kind-Prozesse�Keine Daten verf�gbar�Auf dem Server ist kein Speicherplatz mehr verf�gbar�Keine Sperren verf�gbar�Keine �bereinstimmung gefunden�Kein Medium gefunden�Keine Nachricht des gew�nschten Typs�Keine weiteren S�tze in der Map-Datenbank�Es wurde bisher noch kein regul�rer Ausdruck definiert�Keine Datensatz-Sperren verf�gbar�Es sind keine entfernten Programme registriert.
+-�Keine Route zum Zielrechner�Auf dem Ger�t ist kein Speicherplatz mehr verf�gbar�Kein passendes Ger�t gefunden�Kein passendes Ger�t bzw. keine passende Adresse gefunden�Datei oder Verzeichnis nicht gefunden�Kein passender Schl�ssel in der Map�Keine passende Map in der Domain des Servers�Kein passender Proze� gefunden�Kein NIS+ Namespace gefunden�Nicht-behebbarer Fehler in der Namensaufl�sung�Keine.
+-�Keine XENIX �named type� Datei�Das ist keine �data message��Ist kein Verzeichnis�Keine �named file��Ist kein Stream-Ger�t�Nicht verf�gbar�Nicht genugend (Speicher-) Platz�Nicht gefunden�Nicht gefunden, kein solcher Name�Kein Master-Server f�r diese Domain�Bin nicht der Eigent�mer�Nicht unterst�tzt�Anzahl der Spalten  : %d
+-�Anzahl der Objekte: %u
+-�Die Anzahl der symbolischen Link, die beim Durchgehen des Pfades gefunden wurden, �berschreitet den Wert MAXSYMLINKS�Das numerische Argument ist au�erhalb des Definitionsbereiches�Das numerische Ergebnis ist au�erhalb des g�ltigen Bereiches�Objekt #%d:
+-�Objekt-Name   : %s
+-�Objekt-Typ    : �Das Objekt ist remote�Ein Objekt mit demselben Namen existiert bereits�Ungerade Anzahl von Anf�hrungszeichen�Nur der Systemverwalter �root� darf diese Option benutzen!�Die Operation wird bereits ausgef�hrt�Die Operation wird abgebrochen�Die Operation ist nicht anwendbar�Die Operation ist nicht erlaubt�Die Operation wird nicht unterst�tzt�Die Operation wird am Transporkt-Endpunkt nicht unterst�tzt�Die Operation ist jetzt in Bearbeitung�Die Operation w�rde blockieren�Die Option wird vom Protokoll nicht unterst�tzt�Keine Stream-Ressourcen mehr verf�gbar�Keine Stream-Ressourcen mehr verf�gbar�Ausgabesteuerung:�Ausgabeselektion:�Eigent�mer    : %s
+-�PRIVAT
+-�Das Zusatzpacket ist nicht installiert�Syntax-Fehler: %s�Teilweise erfolgreich�Das �bergebene Objekt ist nicht dasselbe Objekt auf dem Server�Keine Berechtigung�Fehler in der Stromversorgung�Unerwartetes Ende des regul�ren Ausdruckes�Drucke den Inhalt der Datenbank-Datei, je Eintrag eine Zeile�Drucke die aktuelle Konfigurationsstatistik�Gibt mehr Nachrichten aus�Gib die Programmversion aus�M�glicherweise erfolgreich�M�glicherweise nicht gefunden�Zeitnehmer zur Laufzeitbestimmung ist abgelaufen�Das Protokoll ist nicht verf�gbar�Protokollfehler�Die Protokollfamilie wird nicht unterst�tzt�Das Protokoll ist nicht verf�gbar�Das Protokoll wird nicht unterst�tzt�Das Protokoll pa�t nicht zu dem Socket�Die Abfrage ist f�r die angegebene Tabelle nicht erlaubt�Verlassen�RFS-spezifischer Fehler�RPC: ung�ltige Prozedur f�r das Programm�RPC: Fehler bei einer NIS-Operation�RPC: Programm nicht verf�gbar�RPC: Die Programmversion ist falsch�RPC: Die Struktur ist ung�ltig�RPC: falsche Version�RPC: (Unbekannter Fehlercode)�RPC: Fehler bei der Authentifizierung�RPC: Kann das Ergebnis nicht dekodieren�RPC: Kann die Argumente nicht kodieren�RPC: Fehlgeschlagen (Fehler nicht zu spezifizieren)�RPC: Die RPC-Versionen sind nicht kompatibel�RPC: Fehler des Portmappers�RPC: Prozedur nicht verf�gbar�RPC: Programm nicht registriert�RPC: Programm nicht verf�gbar�RPC: Programm/Version nicht passend�RPC: Fehler des entfernten Systems�RPC: Server kann die Argumente nicht dekodieren�RPC: Erfolgreich�RPC: Wartezeit abgelaufen�RPC: Kann nicht empfangen�RPC: Kann nicht senden�RPC: Unbekannter Rechner�RPC: Unbekanntes Protokoll�RSA (%d Bits)
+-��RTLD_NEXT� wird in Code verwendet, der nicht dynamisch geladen ist�Lese und gib die Profiling-Informationen von Shared Objects aus.�Lese die Konfiguration aus NAME�Das Dateisystem ist nur lesbar�Real-Time Signal %d�Der regul�re Ausdruck ist zu gro��Ein-/Ausgabefehler des entfernten Systems�Die entfernte Adresse hat sich ge�ndert�Das Pa�wort l�schen oder die Datei f�r andere nicht lesbar anlegen.�Erneutes �ffnen des Shared Objects �%s� ist mi�lungen�Replik :
+-�Fehlermeldungen bitte an �%s� senden.
+-�Fehler bitte mit dem �glibcbug�-Skript an <bugs@gnu.org> melden.
+-�Die Request-Argumente sind ung�ltig�Reserviert f�r eine zuk�nftige Verwendung�Fehler 0 des Resolvers (Kein Fehler)�Interner Fehler des Resolvers�Verklemmung beim Zugriff auf eine Ressource vermieden�Die Ressource ist verlorengegangen�Die Ressource ist zur Zeit nicht verf�gbar�Das Ergebnis ist zu gro��Ergebnisse an die Callback-Prozedur gesendet�SHOBJ [PROFDATA]�SUNYP�Suchpfad            : %s
+-�Speicherzugriffsfehler�Der Server ist zur Zeit besch�ftigt, bitte nochmal versuchen�Der Hauptspeicher des Servers ist ersch�pft�Der Server hat die Best�tigung zur�ckgewiesen�Der Server hat die �berpr�fung zur�ckgewiesen��Servname� wird f�r �ai_soctype� nicht unterst�tzt�Setzt den Programm-Namen�Stoppt den Server�Signal 0�Socket-Operation an einem nicht-Socket�Socket-Typ wird nicht unterst�tzt�Das Programm verursachte den Abbruch der Verbindung�Sorry, diese Funktion kann nur vom Systemverwalter durchgef�hrt werden.
+-�Die Quell-Definitionen stehen in der Datei FILE��Srmount�-Fehler�Stackfehler�Veraltete NFS-Dateizugriffsnummer�Starte die Anzahl NUMBER Threads�Status            : %s
+-�Angehalten�Angehalten (Signal)�Angehalten (tty-Eingabe)�Angehalten (tty-Ausgabe)�Fehler in Stream-Pipe�Die Struktur mu� bereinigt werden�Erfolg�Unterdr�cke Warnungen und informative Nachrichten�Symbolische Namen f�r Zeichen sind in der Datei FILE definiert�Systemfehler�System-Information:�Fehler bei der Beschaffung einer Systemressource�System-Verzeichnis f�r character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABELLE�TABELLE
+-�TABELLE,ja�Tabellentyp         : %s
+-�Tempor�rer Fehler bei der Namensaufl�sung�Beendet�Das Programm kann nicht ausgef�hrt oder ver�ndert werden (busy)�Die folgende Liste enth�lt alle bekannten Zeichensatzkodierungen.  Das
+-bedeutet nicht, da� zwischen allen Kombinationen dieser Namen als FROM
+-und TO Paramter konvertiert werden kann.  Eine Zeichensatzkodierung kann
+-unter verschiedenen Namen aufgef�hrt sein (sog. Aliasnamen).
+-
+-Einige Namen sind keine normalen Zeichenketten sondern Regul�re Ausdr�cke
+-und diese passen zu einer Reihe von Namen, die als Parameter angegeben
+-werden k�nnen.
+-
+-  �Time-to-Live : �Der virtuelle Zeitnehmer ist abgelaufen�Zu viele Attribute�Zu viele Ebenen aus symbolischen Links�Zu viele Links�Zu viele offene Dateien�Zu viele offene Dateien im System�Zu viele Prozesse�Zu viele Referenzen: can't splice�Zu viele Benutzer�Trace/Breakpoint ausgel�st�Angeh�ngter Backslash (�\�)�Der �bersetzer ist gestorben�Der Socket ist bereits verbunden�Der Socket ist nicht verbunden��%s --help� oder �%s --usage� gibt weitere Informationen.
+-�Versuche �%s�...
+-�Typ : %s
+-�UNBEKANNT�Die Echtheit des NIS+-Clients kann nicht gepr�ft werden�Die Echtheit des NIS+-Servers kann nicht gepr�ft werden�Die Callback-Prozedur kann nicht erstellt werden�Es kann kein Proze� auf dem Server gestartet werden�Unbekannt (Typ = %d, Bits = %d)
+-�Unbekanntes Schl�sselwort �%s� in der Datei �.netrc��Unbekannter NIS-Fehlercode�Unbekannte Datenbank: %s
+-�Unbekannter Fehler�Unbekannter Fehler �Unbekannter Rechner�Unbekanntes Objekt�Unbekannte Option: %s %s %s�Unbekannter Fehler des �Resolvers��Unbekannter Fehler des Servers�Unbekanntes Signal %d�Unbekannter Systemfehler�Unbekannter Fehler im �ypbind���(� oder �\(� ohne schlie�ende Klammer��)� oder �\)� ohne �ffnende Klammer��[� oder �[^� ohne schlie�ende Klammer��\{� ohne schlie�ende Klammer�Unbekannte Variable �%s��Dringende Ein-/Ausgabebedingung�Syntax:�Syntax: %s Variablenname [Pfadname]
+-�Syntax: rpcinfo [ -n Portnummer ] -u Rechner Programmnummer [ Versionsnummer ]
+-�Verwende f�r jeden Benutzer einen eigenen Cache�Benutzerdefiniertes Signal 1�Benutzerdefiniertes Signal 2�Der Wert ist zu gro� f�r den definierten Datentyp�Der virtuelle Zeitnehmer ist abgelaufen�Wildes Ergebnis aus der Kommandoausf�hrung�Die Fenstergr��e wurde ver�ndert�Gibt die Namen der verf�gbaren �charmaps� aus�Gibt die Namen der verf�gbaren Lokalen aus�Gibt die Namen von ausgew�hlten Kategorien aus�Gibt die Namen von ausgew�hlten Schl�sselw�rtern aus�Schreibe die Ausgabe in die Datei NAME�Implementiert von %s.
+-�Falscher Medien-Typ�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Ja, 42 ist die Antwort auf die Frage nach dem Leben, dem Sein und allem sonst�Diesmal hast Du es wirklich kaputtgemacht�Die Ende-Zeit der Fortsetzungszeile ist nicht sp�ter als die Ende-Zeit der vorangegangenen Zeile�[Datei...]�__get_myaddress: ioctl (Holen der Schnittstellen-Konfiguration)�Die Definition von �%1$s� ist nicht durch �END %1$s� abgeschlossen��%s� ist keine g�ltige Profiledaten-Datei f�r �%s���-1� mu� der letzte Eintrag im �%s�-Feld in der �%s�-Kategorie sein��...� darf nur in �...� und �UNDEFINED� Eintr�gen verwendet werden��from� erwartet nach dem ersten Argument von �collating-element��Der �from�-String in der Deklaration des Sortierelements enth�lt unbekannte Zeichen��ai_family� wird nicht unterst�tzt��ai_family� wird nicht unterst�tzt�ist bereits gestartet�Das Argument f�r �<%s>� mu� ein einzelnes Zeichen sein�Das Argument zu �%s� mu� ein einzelnes Zeichen sein�auth_none.c - Fatales �marshalling�-Problem�authunix_create: Hauptspeicher ersch�pft
+-�Das Argument ist ung�ltig�Ung�ltiger Eigent�mer�Leeres FROM-Feld in der Link-Zeile�Leeres TO-Feld in der Link-Zeile�Speicherblock zum zweiten Mal freigegeben
+-�Eigenartiger �mcheck_status�, die Bibliothek enth�lt Fehler
+-�Broadcast: ioctl (Holen der Konfiguration der Schnittstelle)�Broadcast: ioctl (Holen der Parameter der Schnittstelle)�Puffer�berlauf�cache_set: Kann keinen neuen RPC-Puffer �rcp_buffer� anlegen�cache_set: Das Opfer wurde nicht alloziert�cache_set: Das Opfer wurde nicht gefunden�Kann die Abk�rzung der Zeitzone zur Verwendung direkt nach der Ende-Zeit nicht bestimmen�Kann die Prozedurnummer %d nicht erneut zuweisen
+-�Kann den Status der Lokale-Datei �%s� nicht bestimmen�Nicht gen�gend Hauptspeicher f�r Symboldaten verf�gbar�Kann keinen internen Deskriptor erzeugen�Kann keine internen Deskriptoren erzeugen�Der Socken kann nicht zum Annehmen von Verbindungen aktiviert werden: %s�Kann den C Pr�prozessor nicht finden: %s 
+-�Kann keinen C Pr�prozessor finden (cpp)
+-�Kann die alte Version %d nicht verarbeiten; aktuelle Version ist %d�Kann das Sortierelement �%.*s� nicht einf�gen�Kann nicht in die Ergebnistabelle einf�gen�Kann die neue Sortiersymboldefinition nicht einf�gen: %s�Kann die Profiling-Daten nicht laden��ffnen fehlgeschlagen��ffnen von �%s� fehlgeschlagen�Kann die Ausgabedatei �%s� nicht �ffnen: %s�Kann die Eingabedatei �%s� nicht �ffnen�Kann die Lokale-Definitionsdatei �%s� nicht �ffnen�Kann die Ausgabedatei nicht �ffnen�Kann die Ausgabedatei �%s� nicht �ffnen�Kann die Ausgabedatei �%s� f�r die Kategorie �%s� nicht �ffnen�Kann den Socket nicht �ffnen: %s�Kann die Spezifikation der Sortierreihenfolge nicht verarbeiten�Das Verzeichnis �%s� der Zeichensatz-Definitionen kann nicht gelesen werden�Kann die Konfigurationsdatei nicht lesen; das ist fatal�Kann nicht vom Client lesen�Kann den Header von �%s� nicht lesen�Kann das Lokale-Verzeichnis �%s� nicht lesen�Kann die Lokale-Datei �%s� nicht lesen�Kann die �repertoire�-Map �%s� nicht lesen�Kann keine Statistikdaten lesen�Kann den Status (stat()) der Datei �%s� nicht lesen: %s�Kann die Ausgabedatei �%s� nicht schreiben�Kann das Ergebnis nicht schreiben: %s�Kann die Statistik nicht schreiben: %s�Kann nicht zum Client schreiben�Die Daten einer Kategorie sind mehrfach angefordert worden, das sollte nicht passieren�Das Zeichen �%s�, das in der Zeichenklasse �%s� enthalten ist, mu� auch in der Zeichenklasse �%s� enthalten sein�Das Zeichen �%s� in der Zeichenklasse �%s� darf nicht in der Zeichenklasse �%s� enthalten sein�Das Zeichen �<SP>� ist in der Zeichen-Definition nicht enthalten�Das Zeichen L�%s� (Index %Zd), das in der Zeichenklasse �%s� enthalten ist, mu� auch in der Zeichenklasse �%s� enthalten sein�Das Zeichen L�%s� (Index %Zd) in der Zeichenklasse �%s� darf nicht in der Zeichenklasse �%s� enthalten sein�Das Zeichen �%s� ist nicht definiert, wird aber als Vorgabewert ben�tigt�Die Zeichenklasse �%s� ist bereits definiert�Die Zeichensatzbeschreibung �%s� ist bereits definiert�Die Zeichensatzbeschreibungsdatei �%s� wurde nicht gefunden�clnt_raw.c - Fataler Fehler bei der Header-Serialisierung.�clnttcp_create: Hauptspeicher ersch�pft
+-�clntudp_create: Hauptspeicher ersch�pft
+-�clntunix_create: Hauptspeicher ersch�pft
+-�Das Sortierungselement �%.*s� ist mehr als einmal angegeben: Die Zeile wird ignoriert�Das Sortierungssymbol �%.*s� ist mehr als einmal angegeben; die Zeile wird ignoriert�Nach �%s� wird ein Sortierungssymbol erwartet�Verbindungsaufbau zur Adresse %s: �Konstante oder Bezeichner erwartet�Konvertierung von �%s� nach �%s� wird nicht unterst�tzt�Die Konvertierung wurde wegen Problemen bei der Ausgabe beendet�Kann keinen RPC-Server erzeugen
+-�Kann das Programm �%d� Version �%d� nicht registrieren
+-�Datenbank [Schl�ssel ...]�Die Default-Zeichensatzbeschreibung in der Datei �%s� wurde nicht gefunden�Der Richtungsanzeiger in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist weder �+� noch �-��Der Richtungsanzeiger in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist kein einzelnes Zeichen�Der Name des Zeichens �%s� ist mehrfach angegeben�Mehrfache Definition des Sortierungselementes�Mehrfache Definition des Eintrages �%.*s��Doppelter Schl�ssel�Doppelte �set�-Definition�Doppelter Zonenname �%s� (Datei �%s�, Zeile %d)�Der Nachrichtenbezeichner ist mehrfach vorhanden�Die Nachrichtennummer ist mehrfach vorhanden�Leere Zeichenkette�Leerer Name des Sortiergewichtes: Die Zeile wird ignoriert�enablecache: Cache ist bereits aktiv�enablecache: Kann keinen Cache anlegen�enablecache: Kann die Cache-Daten nicht anlegen�enablecache: Kann keinen FIFO-Cache anlegen�Kodierung f�r die Ausgabe�Kodierung f�r den urspr�nglichen Text�Das Ende eines Auslassungsintervalls ist gr��er als der Start�Fehler beim Feststellen der Identit�t des Aufrufers: %s�Fehler beim Schlie�en der Eingabedatei �%s��Fehler beim Schlie�en der Ausgabedatei �Fehler beim Schlie�en der Datei mit den Profiling-Daten�Fehler beim Einf�gen des Sortierelementes in die Hash-Tabelle�Fehler beim Einf�gen in die Hash-Tabelle�Fehler beim Lesen der Eingabe�F�r �copy� wird ein String-Argument erwartet�Die erwartete Fortsetzungszeile ist nicht vorhanden�Fehler beim Laden des Shared Objects �%s��Fehler beim Laden der Symboldaten�Fehler beim �mmap� der Datei mit den Profiling-Daten�Fehler beim Start der Konvertierung�Fehler beim Schreiben der Daten f�r die Kategorie �%s��fcntl: F_SETFD�Der Eintrag �%s� in der Kategorie �%s� ist nicht definiert�Die Datei �%s� existiert bereits und w�rde �berschrieben
+-�Der �From�-Wert eines Sortierelementes mu� ein String sein�Fehler beim Holen des Datei-Status mit �fstat��Murks am Ende einer Zeichensatzspezifikation�Am Ende der Zahl sind unsinnige Eintr�ge�Unsinnige Eintr�ge am Ende des Offset-Wertes in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Unsinnige Eintr�ge am Ende des Start-Datums in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Unsinnige Eintrage am Ende des Stop-Datums in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Erzeuge einen Aufruf-Graphen�Erzeuge ein 'flaches' Profile mit Aufrufzahlen und -zeiten�get_myaddress: ioctl (Holen der Schnittstellen-Konfiguration)�getent - lese Eintr�ge aus administrativen Datenbanken.�handle_request: Anforderung empfangen (Version = %d)�Hardlink fehlgeschlagen, es wird ein symbolischer Link verwendet�Ist irgendwo ein Hard-Link�ung�ltiges �CORRECTION�-Feld in der �Leap�-Zeile�ung�ltiges �Rolling/Stationary�-Feld in der �Leap�-Zeile�Ung�ltige Zeichenkonstante in der Zeichenkette�Ung�ltiges Zeichen in der Datei: �Ung�ltiges Sortierelement�Ung�ltige Definition�Ung�ltige Kodierung angegeben�ung�ltige Escape-Sequenz am Ende der Zeichenkette�ung�ltige Eingabe-Sequenz an der Stelle %ld�ung�ltige Namen f�r den Zeichenbereich�ung�ltiger nettype : �%s�
+-�ung�ltige Nummer f�r den Offset in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��ung�ltige �set�-Nummer�ung�ltiges Start-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��ung�ltiges Ende-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��Limit der Implementation: Es sind nicht mehr als %d Zeichen-Klassen erlaubt�Limit der Implementation: Es sind nicht mehr als %d Zeichen-Maps erlaubt�unvollst�ndige Zeichen- oder Shift-Folge am Ende des Puffers�ung�ltig formatierte Datei�Die Eingabezeile ist von einem unbekannten Typ�interner Fehler (ung�ltiger Descriptor)�Interner Fehler - �addtype� wurde mit einer ung�ltigen �isdst� aufgerufen�Interner Fehler - �addtype� wurde mit einem ung�ltigen �ttisgmt� aufgerufen�Interner Fehler - �addtype� wurde mit einem ung�ltigen �ttisstd� aufgerufen�Interner Fehler in der Datei �%s�, Zeile %u�ung�ltiger UTC-Offset�ung�ltiges Abk�rzungsformat�Ung�ltiger Tag des Monats�Ung�ltiges Ende-Jahr�Ung�ltiges Schaltjahr�Ung�ltiger Mode f�r dlopen()�ung�ltiger Monatsname�Ung�ltige gespeicherte Zeit�Ung�ltiges Anfangsjahr�Ung�ltige Tageszeit�ung�ltiger Name f�r einen Wochentag�Die Schl�ssell�nge in der Anforderung ist zu lang: %Zd�Die Zeile nach einem Auslassungintervall mu� eine Zeichen-Definition enthalten�Die Zeile vor einem Auslassungsintervall mu� eine Zeichen-Konstante enthalten�Die Zeile ist zu lang�Gib alle bekannten Zeichensatz-Kodierungen aus�Die Lokale-Datei �%s�, die im �copy�-Befehl verwendet wird, ist nicht vorhanden�Fehler beim Holen des Link-Status mit �lstat��ung�ltige Eingabezeile ignoriert�Das Mappen der Section-Header String-Tabelle ist fehlgeschlagen�Das Mapping der Section-Headers ist fehlgeschlagen�Der Speicher vor dem allozierten Block wurde �berschrieben
+-�Der Speicher nach dem Ende des allozierten Blockes wurde �berschrieben
+-�Kein Hauptspeicher mehr verf�gbar�Die Speicherverwaltung ist konsistent, die Bibliothek enth�lt Fehler
+-�fehlendes �era�-Format in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��fehlender �era�-Name in der Zeichenkette %d im �era� Feld in der Kategorie �%s��Regel ohne Name�Weder die urspr�ngliche noch die Ziel-Kodierung angegeben�netname2user: (NIS+ Lookup): %s
+-�netname2user: DES Eintrag f�r �%s� im Verzeichnis �%s� ist nicht eindeutig�netname2user: LOCAL Eintrag f�r �%s� im Verzeichnis �%s� ist nicht eindeutig�netname2user: fehlende Group-ID Liste in �%s�.�netname2user: der Principal-Name �%s� ist zu lang�netname2user: Sollte nicht die Benutzernummer 0 haben�Das Programm %d wurde nie registriert
+-�Kein <Uxxxx> oder <Uxxxxxxxx> Wert angegeben�Kein g�ltiger regul�rer Ausdruck f�r den Eintrag �%s� in der Kategorie �%s�: %s�Kein Tag des Monats pa�t zur angegebenen Regel�Keine Definition f�r �UNDEFINED��Kein Dateiname f�r Profiling-Datenn angegeben und das Shared Object �%s� hat keinen �soname��Es d�rfen keine anderen Schl�sselworte angegeben werden, wenn �copy� verwendet wird�Es wurde keine Ausgabedatei erzeugt, weil Warnungen ausgegeben wurden�keine �repertoire�-Map angegeben: Verarbeitung abgebrochen�Kein symbolischer Name angegeben�Kein symbolischer Name f�r das Ende des Intervalles angegeben�Kein Sortiergewicht (�Weight�) f�r das Symbol �%s� definiert�Keine regul�re Datei�nscd Konfiguration:
+-
+-%15d  Server Debug Level
+-�nscd l�uft nicht!
+-�Nur �WIDTH�-Definitionen d�rfen nach einer �CHARMAP�-Definition folgen�Die urspr�ngliche Kodierung nicht mit �-f� angegeben�Ausgabedatei�pmap_getmaps RPC Problem�poll: Protokollfehler im Verbindungsaufbau
+-�Fehler beim Aufruf des Pr�prozessors�Gib eine Liste der gez�hlten Pfade und der Anzahl der Benutzung aus�Gebe Informationen �ber den Bearbeitungsstand aus�Probleme beim Lesen von �%s��Die Datei �%s� mit Profiling-Daten pa�t nicht zum Shared Object �%s��Das Programm %lu ist nicht verf�gbar
+-�Das Programm %lu ist in der Version %lu nicht verf�gbar
+-�Program %lu Version %lu ist bereit und wartet
+-�rcmd: poll (Vorbereiten der Standardfehlerausgabe): %m
+-�rcmd: Socket: Alle Ports sind zur Zeit belegt
+-�rcmd: write (Vorbereiten der Standardfehlerausgabe): %m
+-�registerrpc: Hauptspeicher ersch�pft
+-�Wiederholung der �Leap�-Sekunde�Die �repertoire� Map-Datei �%s� wurde nicht gefunden�rpcgen: Kodierungsfehler bei der �arglist�
+-�rpcgen: Zu viele Defines
+-�rpcinfo: �%s� ist ein unbekannter Rechner
+-�rpcinfo: �%s� ist ein unbekannter Service
+-�rpcinfo; Kann die Registrierung des Programms �%s� Version �%s� nicht l�schen
+-�rpcinfo: Broadcast ist fehlgeschlagen: %s
+-�rpcinfo: Kann den Portmapper nicht erreichen�Dieselbe Regel ist in mehreren Dateien enthalten�Kurzer Read beim Lesen des Anforderungsschl�ssels: %s�Kurzer Read beim Lesezugriff: %s�Kurzer Write in �%s�: %s�socket: Protokollfehler im Verbindungsaufbau
+-�Die Anweisungen �forward� und �backward� schlie�en sich aus�Die Angabe eines Sortiergewichtes f�r ein Sortiersymbol ist nicht sinnvoll�Standardeingabe�Standardausgabe�Das Start-Datum in der Zeichenkette %d im �era�-Feld der Kategorie �%s� ist ung�ltig�Das Start-Jahr ist gr��er als das Ende-Jahr�Das Startjahr ist zu gro� f�r die Darstellung�Das Startjahr ist zu klein f�r die Darstellung�Das Ende-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist ung�ltig�svc_run - �select� ist fehlgeschlagen�svc_tcp.c - �getsockname� oder �listen� nicht m�glich�svc_tcp.c - Problem bei der Erstellung des TCP-Sockets�svc_tcp: makefd_xprt: Hauptspeicher ersch�pft
+-�svc_unix.c - Problem bei der Erstellung des AF_UNIX-Sockets�svc_unix.c - �getsockname� oder �listen� nicht m�glich�svc_unix: makefd_xprt: Hauptspeicher ersch�pft
+-�svctcp_create: Hauptspeicher ersch�pft
+-�svcudp_create - �getsockname� fehlgeschlagen�svcudp_create: Hauptspeicher ersch�pft
+-�svcudp_create: Problem bei der Erstellung des Sockets�svcunix_create: Hauptspeicher ersch�pft
+-�Das Symbol f�r das Mehr-Zeichen Sortierelement �%.*s� wiederholt die Elementdefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� wiederholt eine andere Symboldefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� wiederholt eine Symboldefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� kollidiert mit einem symbolischen Namen in der Zeichensatzbeschreibung�Syntaxfehler in der �%s�-Definition: %s�Syntaxfehler in der �order_start�-Anweisung�Syntaxfehler in der Zeichenklassendefinition�Syntaxfehler in der Zeichensatzumwandlungsdefinition�Syntaxfehler in der Definition der Sortierreihenfolge�Syntaxfehler in der Definition der Sortierung�Syntaxfehler in der Definition der �LC_CTYPE�-Kategorie�Syntaxfehler in der Definition einer neuen Zeichenklasse�Syntaxfehler in der Definition eines neuen Zeichensatzes�Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �message��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �monetary��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �numeric��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �order��Syntaxfehler im Prolog: %s�Syntaxfehler in der �epertoire� Map-Definition: %s�Syntaxfehler in der Lokale-Definition zur Zeit (Abschnitt �time�)�Syntaxfehler: nicht in einem Abschnitt der Lokale-Definition�Die Zielkodierung ist nicht mittels �-t� angegeben�Dies ist die erste Definition�Zeit vor Null��berlauf der Zeit�Zu wenige Bytes in der Zeichenkodierung�Zu viele Bytes in der Zeichenkodierung�Zu viele Zeichenklassen definiert�Zu viele Schaltsekunden�Zu viele Ortszeittypen�Zu viele �berg�nge?!�Zu viele Sortiergewichte�Zu viele oder zu lange Abk�rzungen f�r Zeitzonen�Am Zeilenende sind unsinnige Eintr�ge�Schwierigkeiten bei der Antwort an das Programm %d
+-�Zwei aufeinanderfolgende Zeilen mit �...� sind nicht erlaubt�Ein einzelnes Jahr angegeben�Fehler beim Allozieren des Puffers f�r die Eingabe�Fehler beim Freigeben des Speichers f�r die Argumente�nicht definiert�unbekanntes Zeichen �%s��Ung�ltiges Zeichen im Feld �%s� in der Kategorie �%s��unbekannte �collation�-Anweisung�unbekannte Anweisung �%s�: Die Zeile wurde ignoriert�unbekannter iconv()-Fehler %d�Unbekanntes Set �%s��Unbekanntes Symbol �%.*s�: Die Zeile wurde ignoriert�Zeitzone ohne Regeln�Die Nachricht ist nicht abgeschlossen�Zeichenkette wird nicht beendet�Zeichenkette wird nicht beendet�Der symbolische Name wird nicht beendet�Der Name des Sortiergewichtes wird nicht beendet�Das obere Ende des Intervalls ist nicht kleiner als das untere Ende�Syntax: %s Eingabedatei
+-�Der 29. Februar wurde in einem nicht-Schaltjahr verwendet�Der Wert f�r �%s� mu� eine Ganzzahl sein�Der Wert f�r �<%s>� mu� zwischen eins und vier liegen�Der Eintrag f�r das Feld �%s� in der Kategorie �%s� darf nicht leer sein�Der Wert von �<mb_cur_max>� mu� gr��er als der Wert von �<mb_cur_min>� sein�Der Wert im Feld �int_curr_symbol� in der Kategorie �LC_MONETARY� geh�rt nicht zu einem g�ltigen Namen in ISO-4217�Der Wert im Feld �int_curr_symbol� in der Kategorie �LC_MONETARY� hat die falsche L�nge�Der Wert f�r den Eintrag �%s� in der Kategorie �%s� mu� kleiner als 127 sein.�Warnung: �Beim Annehmen der Verbindung: %s�Beim Anfordern eines Cache-Eintrages�Fehler beim Allozieren des Eintrages in die Hash-Tabelle�Beim Anfordern einer Schl�ssel-Kopie�beim �ffnen der alten Katalogdatei�beim Aufbereiten der Ausgabe�beim Lesen der Datenbank�beim Holen des Dateistatus der Datei mit den Profiling-Daten�beim Schreiben der Datenbankdatei�Der 'Write' wurde nur unvollst�ndig ausgef�hrt�ist auch f�r andere Benutzer als den Dateieigent�mer beschreibbar�Falsche Anzahl an Argumenten�Falsche Anzahl an Feldern in der Leap-Zeile�Falsche Anzahl der Felder in der Link-Zeile�Falsche Anzahl der Felder in der Rule-Zeile�Falsche Anzahl der Felder in der Zeitzonen-Fortsetzungszeile�Falsche Anzahl an Feldern in der Zone-Zeile�xdr_reference: Hauptspeicher ersch�pft
+-�xdrrec_create: Hauptspeicher ersch�pft
+-�yp_update: Kann den Rechnername nicht in einen Netzname umwandeln
+-�yp_update: Kann die Adresse des Servers nicht finden
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/el.mo glibc-2.1.3/po/el.mo
+--- ../glibc-2.1.3/po/el.mo	1999-07-18 18:19:41.000000000 -0700
++++ glibc-2.1.3/po/el.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,282 +0,0 @@
+-������J�����l�����$������1��"���	1��"���,1�����O1��:���k1������1������1������1������1��3����1��3���,2�����`2��&���t2��%����2������2��%����2��3����2�����23��"���K3��!���n3������3������3������3������3������3��"���4��*���)4�����T4��&���n4��&����4��&����4��&����4��&���
+-5��$���15�����V5�����q5������5��,����5������5��%����5��,���6��-���C6�� ���q6��&����6������6������6������6�����7������27��2����7��#����7��	���8�����8�����.8��'���N8�����v8��(���8�� ����8������8������8��$����8������8��(���9�����89�����H9�����T9��/���k9������9������9������9������9������9������9�����:�����:�����):�����B:��	���N:�����X:��&���p:��-����:��!����:������:�����;�����#;�����:;��&���Z;��%����;��!����;������;��-����;�����<��%���,<�����R<�����n<�����{<������<������<��@����<��D���=�����Q=�����d=�����}=��	����=�������=�����d>�����{>������>������>������>������>������>������>�����?�����$?�����-?�����6?��)���V?��
����?������?��1����?������?������?�����
+-@�����@�����2@�����E@�����^@�����m@������@������@������@������@������@������@������@�����A�����A�����A�����2A�����FA��!���SA�����uA��.����A������A������A������A������A��	���B�����B��+���5B�����aB�����rB������B������B������B������B������B�����C�����&C��1���7C��$���iC������C������C������C������C������C�����D�����D�����D�����4D�����;D�����JD�����cD��
���rD������D������D������D��!����D������D�����	E�����E�����+E��9���>E�����xE������E������E��#����E������E������E�����
+-F�����%F�����CF�����cF�����lF������F������F������F������F������F������F������F�����G�����1G�����QG�����bG�����zG������G������G������G������G������G�� ���H�����#H�����AH�����RH�����pH������H������H��!����H������H������H�����I�����)I�����?I��
���QI��#���_I������I������I������I������I������I������I�����J�����2J�����7J�����JJ�����hJ������J������J������J������J������J������J�����K�����*K�����FK��!���fK������K������K������K������K������K�����L��"���(L�����KL�����XL�����gL�����~L������L������L��-����L������L������L�����M�����*M��2���AM��;���tM������M������M������M������M��
���N�� ���"N�����CN�����VN�����qN������N������N������N�� ����N��
����N������N�����O�����O�����%O�����6O�����JO�����_O�����rO������O��"����O��
+-����O������O��
����O��!����O������P�����P�����#P�����AP��"���TP�����wP������P������P������P������P��'����P��#����P��&���Q��
���AQ�����OQ�����iQ������Q������Q������Q������Q������Q������Q������Q�����R�����R�����(R�����:R�����GR�����bR��W��wR��V���T�����&W������Y��#����[��:����[������[�����\��%���&\�����L\��"���b\������\������\������\������\������\��F����\��.���1]��6���`]��8����]��;����]��I���^��+���V^��+����^��'����^������^��	����^������^�����_�����'_��%���9_��.���__��&����_������_��C����_��#���`�����9`��&���X`�����`��1����`������`��"����`������a��'���a�����Da��.���aa��"����a��(����a��!����a������a��!���b��9���=b��4���wb��8����b��+����b��8���c��$���Jc��"���oc��!����c��.����c��<����c��;��� d��$���\d������d������d��"����d��)����d��N���e��U���Te������e��&����e��)����e��
���f�����'f��+���@f�����lf������f������f��"����f��%����f��*���
g��*���8g��0���cg��7����g��#����g��!����g��$���h��,���7h�����dh��'���sh��%����h��2����h������h��.���i�����0i��K���Ii��L����i��L����i��2���/j�����bj��%���xj��-����j��$����j������j�����k�����k��(���5k��!���^k��F����k������k��B����k��B���l��?���`l��<����l������l������l��.���m��0���Bm��0���sm������m������m������m������m�����n�����n�����/n�����Bn�����Un�����kn�����n��5����n��G����n��
���o��5��� o�����Vo�����co��'���zo��,����o������o������o��&����o��?���p��=���Yp��
����p������p��A����p�����q�����q��7���;q��3���sq������q��'����q��!����q�����r��C���r�����]r�����yr��)����r��*����r��%����r�����s��$���2s�����Ws�����ss������s������s��>����s�����t��!���*t��#���Lt�� ���pt��*����t��*����t��=����t��H���%u�����nu�����}u��E����u��&����u��(����u��'���#v��E���Kv������v��$����v��(����v��'����v����� w��"���>w��&���aw��P����w��V����w��U���0x��O����x��V����x��!���-y��'���Oy��*���wy��/����y��*����y��$����y��/���"z��1���Rz��/����z��)����z��*����z��)���	{��#���3{�����W{��&���r{��4����{������{������{��
����{��#���
+-|��$���.|��"���S|�����v|������|������|������|��.����|������|�����}��3���:}�����n}��	����}������}��0����}������}��$����}�����~��#���$~�����H~�����T~�����i~�����}~������~��4����~������~�������'���#��B���K��D������j������K���>���?�������7���ʀ�����������������9������P������g�����������������#�������#���߁��#������0���'���#���X���*���|���%�������=��͂��9������9���E���������N�������$���������������1������9���<���M���<����������Dž��)���݅��*���������2���&���G���=���n���-�������9���چ��5������,���J���-���w���'�������$���͇��#������0������F���G����������2�������2���ވ��2������2���D���2���w���.�������#���ى���������������-���9���%���g���)�������-�������.������(������*���=���"���h����������#�������#���ȋ���������>�������"���Ɍ��	�������������+���	���)���5���
+-���_���5���j���+����������̍��	���΍��:���؍��'������<���;������x���	�������,�������>�����������������������(������<���+���[���������������������������̏���������������"������H���8���L�������/���ΐ��+�������+���*���#���V���4���z���6�������=������/���$���+���T���H�������,���ɒ��<�������,���3���"���`���8�������%�������������R������Y���T�����������������
���ߔ����������������+���ە��#���������+������K������d���#��������������$���Ö��������
+-�������������%������5���7������m���%���~���5������� ���ڗ��'����������#���0���5������f���$��������������$����������ݘ�� ����������������0������9���'���R������z���
+-������������������������ƙ�����֙��&������������/���-������]������p�������������������������������7���ך�����������$���%���=���(���c���0�����������������ݛ��$����������!���5���5���(���k��������������������Ɯ��������+�������
���,������:������J���	���j������t���������������������������ϝ��)������'������ ���4��� ���U������v�����������������N�������)������&���0������W���.���o���������� �������)���ן��'������)���)������S���(���`�����������������!���à���������������������=���&���(���d���-������� �������$���ܡ��%������#���'���4���K����������&����������Ģ��'���آ��/�������"���0������S������p�����������������-���ȣ��'�������'������!���F������h�����������������#�������%���Τ��*�������������*���2���!���]���������.����������Υ�����ե��!������"������$���5���-���Z���������� �������!���Ħ��������8�������6���8���%���o���!�����������������ק��&�������������(���7���&���`���A�������
���ɨ�����ר������������������������2���C���I�����������������#���ʩ�� ������L������O���\����������,���ê��(������!���������;���%���J���&���p���%�������!����������߫��!������&������'���/������W������f���$���u���	������������������������ͬ���������������������#���������C������P������i���-����������������ɭ��+������������2���2������e��������������������������Į��&���ٮ��&�������4���'������\������o������������������������"���ѯ������������������������8������N������`������r���
��������������"���������԰��+�����j�����0��z���-�������R���ټ��"���,���"���O���7���r����������-���ʽ������������������������4���"���K���k���n���,���ھ��M������M���U���B�������Y������;���@���;���|���%�������������������������������������9���6���Y���-�������*��������������m������8���v���7�������,�������,������6���A������x���5�������(�������/�������'������=���C���-�������6�������(�������&������)���6���K���`���C�������G�������4���8���E���m���$�������%�������+�������8���*���W���c���V�������)���������<���$���W���'���|���:�������f�������i���F����������"�������'����������������#���-���:������h����������)�������8�������2������<���6���7���s���G�������=�������)���1���(���[���+�������:��������������.�������.���)���C���X����������=��������������k������d���w���h�������0���E������v���7�������?�������0���������9������V������i���:�������)�������\����������I���T���`���X�������@������?���O�����������������2�������4�������4���1���"���f���������� �������������������������������������(������>������X������p���=�������C�������������I���������i���!���z���/�������6�������������������1���,���R���^���R�������������"������C���;���.�������������R�������<���!������^���.���y���)��������������@�������%���-���%���S���1���y���1�������&�������%������%���*������P������p���"�������#�������C�������������3���5���5���i���"�������3�������3�������Q���*���R���|�����������������^�������5���O���8�������7�������]����������T���(���s���)�������-�������!�������%������-���<���X���j���U�������T������W���n���^�������'���%���9���M���/�������3�������-�������'������4���A���8���v���6�������/�������1������0���H���'���y���"�������)�������9����������(������E������W���+���h���2�������#�������(�������$���������9������X���9���n���*�������,�������:����������;������Q������Y���6���r����������&��������������(����������$������0������H��� ���g����������:�������"�������)������2���.���S���a���M�������s������Q���w���Q�������H������ ���d���(��������������"�������)�������<���������U���$���n���$�������$�������.�������$������D���1���0���v����������n����������9��S��1����������������������)�������������q���p���1�����/���c���������"���L�������d���f�������0�������������������������
+-�������������������������������� ������<�������������������������I�����������;������(��Y���U������������������@�����������������������'���������������������-������H��������������F��z�������o���������������'����������a�������n��H������C������F��������������m��j���_���>�����������������������������,������g�������������.��������������������������B�����������6������0���i�������?�������M��4�������������������������3�����������s��������������������������������������P�����E������`�����������������G�������I��-��l������������:���������������������A�����=������#��[��������������������+�� �������������������������������������������*�������������;��k���u���o��F��>���������������
��������������p�������������������������@������"����������Q������7����������t������������������������?������=����������������*������V���B�����v��f������������E���H��7���������������������-��������7���������2������3������������������9������W��3������?�����������������������.���r��d�������������������������$�������������m���������%������u��K�������%�������������\��D��t������O����������G������������������������X��J��Z������������������������������������	��8�����������������5���.��r������q������������=�������2������y������:���������������������������[����������������4����������/������������������������������������������{���c�������Q��`��z��+���h������������������������������������������^��������������������s�����h������R���������J��������������S���&��C�������������U��:������>�����"��������������(���|������K��������� ��������������������������i��������������������x���~��������J���	�������!��,����������������������T���������������������5������e�������������a�������������b���������������,������������j�����������������Y��P���L���������������������������������������������������������������D���N�����������C����������������&���<��l��}�����������������I�����������/������������������6��_���������1��������2�������*��D�����6���������������X�������������������+���������]������8���~���T��������(����������G��w������������������]������������W���V������������������������������A���������O���������������������������!���������������������������������������������������)��R��4����������������������g��k����������'�������v������Z����������������������������������������������������������y��
������\���#����������������������@����������8��#��N��^������;������������������
������������������������x��M�������{�����������������������������������������0��<���A��}��$�����������E��9���������|���������������������5��w��$���������	��!������������
+-��b������
+-��������������������&������e�������������B������������)���%�������       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�   program vers proto   port
+-� (rule from "%s", line %d)� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�(unknown authentication error - %d)�(unknown)�*standard input*�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Accessing a corrupted shared library�Address already in use�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempting to link in too many shared libraries�Authentication OK�Authentication error�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Block device required�Broadcast select problem�Broken pipe�Bus error�CPU time limit exceeded�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Channel number out of range�Child exited�Client credential too weak�Communication error on send�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Cputime limit exceeded�Database is busy�Destination address required�Device not a stream�Device not configured�Device or resource busy�Directory not empty�Disc quota exceeded�Domain not bound�EMT trap�Error %d�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�Filesize limit exceeded�Floating point exception�Function not implemented�Gratuitous error�Hangup�Host is down�Host name lookup failure�I/O possible�IOT trap�Identifier removed�Illegal Instruction�Illegal instruction�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Killed�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Local domain name not set�Local resource allocation failure�Machine is not on the network�Memory exhausted�Message too long�Multihop attempted�NIS client/server version mismatch - can't supply service�NIS map data base is bad�Name not unique on network�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with name�No anode�No buffer space available�No child processes�No data available�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such file or directory�No such key in map�No such map in server's domain�No such process�Not a XENIX named type file�Not a directory�Numerical argument out of domain�Numerical result out of range�Object is remote�Odd number of quotation marks�Operation already in progress�Operation not permitted�Operation not supported�Operation not supported by device�Operation now in progress�Operation would block�Out of streams resources�Package not installed�Permission denied�Power failure�Premature end of regular expression�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RTLD_NEXT used in code not dynamically loaded�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Segmentation fault�Server rejected credential�Server rejected verifier�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Srmount error�Stack fault�Stale NFS file handle�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�System resource allocation failure�Terminated�Text file busy�Timer expired�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/BPT trap�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' for more information.
+-�Trying %s...
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown error �Unknown host�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...
+-       %s [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]
+-Mandatory arguments to long options are mandatory for short options too.
+-  -H, --header=NAME   create C header file NAME containing symbol definitions
+-  -h, --help          display this help and exit
+-      --new           do not use existing catalog, force new output file
+-  -o, --output=NAME   write output to file NAME
+-  -V, --version       output version information and exit
+-If INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE
+-       %s [OPTION]... -o OUTPUT-FILE INPUT-FILE
+-       %s [OPTION]... -u INPUT-FILE
+-Mandatory arguments to long options are mandatory for short options too.
+-  -f, --fold-case     convert key to lower case
+-  -h, --help          display this help and exit
+-  -o, --output=NAME   write output to file NAME
+-      --quiet         don't print messages while building database
+-  -u, --undo          print content of database file, one entry a line
+-  -V, --version       output version information and exit
+-If INPUT-FILE is -, input is read from standard input.
+-�Usage: %s [OPTION]... name
+-Mandatory arguments to long options are mandatory for short options too.
+-  -c, --force               create output even if warning messages were issued
+-  -h, --help                display this help and exit
+-  -f, --charmap=FILE        symbolic character names defined in FILE
+-  -i, --inputfile=FILE      source definitions are found in FILE
+-  -u, --code-set-name=NAME  specify code set for mapping ISO 10646 elements
+-  -v, --verbose             print more messages
+-  -V, --version             output version information and exit
+-      --posix               be strictly POSIX conform
+-
+-System's directory for character maps: %s
+-                       locale files  : %s
+-�Usage: %s [OPTION]... name
+-Mandatory arguments to long options are mandatory for short options too.
+-  -h, --help            display this help and exit
+-  -V, --version         output version information and exit
+-
+-  -a, --all-locales     write names of available locales
+-  -m, --charmaps        write names of available charmaps
+-
+-  -c, --category-name   write names of selected categories
+-  -k, --keyword-name    write names of selected keywords
+-�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Written by %s.
+-�Wrong medium type�YPBINDPROC_DOMAIN: %s
+-�You really blew it this time�Zone continuation line end time is not after end time of previous line�`%1$s' definition does not end with `END %1$s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice�bogus mcheck_status, library is buggy�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot open�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot process order specification�cannot read character map directory `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot write output files to `%s'�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�end point of ellipsis range is bigger then start�error while inserting collation element into hash table�error while inserting to hash table�expect string argument for `copy'�expected continuation line not found�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�get_myaddress: ioctl (get interface configuration)�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal names for character range�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid GMT offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�memory clobbered before allocated block�memory clobbered past end of allocated block�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�never registered prog %d
+-�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�only WIDTH definitions are allowed to follow the CHARMAP definition�problems while reading `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: select (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�rpcinfo: can't contact portmapper: �same rule name in multiple files�select: protocol failure in circuit setup
+-�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp: makefd_xprt: out of memory
+-�svctcp_.c - cannot getsockname or listen�svctcp_.c - udp socket creation problem�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: socket creation problem�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�values for field `%s' in category `%s' must not be zero�while opening UTMP file�while opening old catalog file�while preparing output�while reading database�while writing database file�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.0.7
+-POT-Creation-Date: 1998-07-26 08:57-0700
+-PO-Revision-Date: 1999-01-24 20:21+0000
+-Last-Translator: Mavroyanopoulos Nikos <nmav@i-net.paiko.gr>
+-Language-Team: Greek <S.Xenitellis@rhbnc.ac.uk>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-7
+-Content-Transfer-Encoding: 8-bit
+-�       rpcinfo -b '�����. ������������' '�����. �������'
+-�       rpcinfo -d '�����. ������������' '�����. �������'
+-�       rpcinfo -p [ ������� ]
+-�       rpcinfo [-n ���� ] -t ������� '�����. ������������' ['�����. �������']
+-�   ��������� ���. ����������   ����
+-� (������� ��� "%s", ������ %d)� �����
+-�"%s", ������ %d: %s�"���� %s" ������ ��� ������� -l ����� ��������� �������������"���� %s" ������ ��� ������� -p ����� ��������� �������������%s �� ���������� �����%s%s%s:%u: %s%s� ���������� %s' �������.
+-�%s%s%s:%u: %s%s�� ����������� ������: %s.
+-�%s%s������� ���� %d
+-�%s: %d ��� ��������� ���������� �����
+-�%s: <mb_cur_max> ������ �� ����� ���������� ��� <mb_cur_min>
+-�%s: ��� ����� ������� �� ������������ %s: %s
+-�%s: ��� ����� ������� �� ������������ � ��������� %s: %s
+-�%s: ��� ����� ������� �� �������� �� %s �� �� %s: %s
+-�%s: ��� ����� ������� �� �������� �� %s: %s
+-�%s: ��� ����� ������� �� ��������� �� %s: %s
+-�%s: ������ ���� �� �������� ��� %s: %s
+-�%s: ������ ���� ��� �������� ��� %s
+-�%s: ������ ���� ��� ������� ��� %s
+-�%s: ������ ���� ��� ������� ���� �������� ����� �%s: ������ ����������(leap) ��� ������ �� ���������� ������������� %s
+-�%s: � ����� �����������: %s
+-�%s: ������������ ��� ��� -L �������� ������������
+-�%s: ������������ ��� ��� -d �������� ������������
+-�%s: ������������ ��� ��� -l �������� ������������
+-�%s: ������������ ��� ��� -p �������� ������������
+-�%s: ������������ ��� ��� -y �������� ������������
+-�%s: � ������ ���� '%s', �� ���������� ���� %d
+-�%s: ������ ��� ��������� �����������%s: �� �������� ������� -- %c
+-�%s: �� ������ ������� -- %c
+-�%s: � ������� `%c%s' ��� ��������� ���������
+-�%s: � ������� `%s' ����� �����������
+-�%s: � ������� `%s' ������� ��� ���������
+-�%s: � ������� `--%s' ��� ��������� ���������
+-�%s: � ������� `-W %s' ��� ��������� ���������
+-�%s: � ������� `-W %s' ����� �����������
+-�%s: � ������� ������� ��� ��������� -- %c
+-�%s: �������: �� ������ l_value %d
+-�%s: ������ ����� ��������%s: �� ������������ ������� `%c%s'
+-�%s: �� ������������ ������� `--%s'
+-�%s: � ����� ����� %s [ -s ] [ -v ] [ -l ������ ��� ] [ -p posix ������� ]
+-	[ -d ��������� ] [ -L ������������ ���������� ] [ -y ����� ����� ] [ ������ ... ]
+-�%s: � ����� ����� %s [ -v ] [ -c ������� ] �������� ����� ...
+-�(������� ������ ������������ - %d)�(�������)�*�������� �������*��� ����� .lib ��� a.out ����� ��������������; ����� ������ = %lu, ������ ������ = %lu�; ����� = �� <SP> ���������� ��� ������ �� ����� ���� ����� `%s'�� <SP> ���������� ��� ����� ���� ����� `%s'�?������������������������� ��� ������������� �������������� ������������ ��������� �������� ����� ��� �� ������� ���������� ����������� ��� ������������� ��� �� ����������������� ���������������������� ��������� ��� ���������� ����� ���� ����������������� �������� �� ���� ������ ��������������� ����������������������� �������������� ���������������������� �������������������� ����������� ����������������� ���������� ������� ������������������������ ���������������� ����� ��������������������� ������� �������������� ��� select ������������������� ��������������� ���� ������(bus)������������ �� ���� ������ ��� CPU���� ����� ������ � ���������� ���� ��������� ��������������� ��������������� ����� ������ � �������� �� ��� ���������� ��� ���������� ����� ��� ��������� ����� ������ � ����������� �� �� portmapper���� ����� ������ � ����������� �� �� ypbind���� ����� ������ � ����������� �� �� ypserv���� ����� ������ �� ��������� ��������� ����� ������ � �������� ��� ��������� �������������� ����� ������ � ���������� �������� ��� ������� rpc���� ����� ������ � ����� �������� ��������������� ��������������� ����� ������ � ���� ���������� ���� ����������� ����� ������ � ���������� ��� ������������� ����� ������ � �������� ���� �� �������� ��� ���� ����� ���������������� ����� ������ � �������� ������� ������������ ����� ������ � ������ ��� �������� �������� SO_BROADCAST�� ������� ��� �������� ����� ��� ��� �� ������ ��������� ��������� ��������������� �������������� ��� ��������������� ����� ���� �������������� ������������ ���� ��� ���������� ����������� ���� ��� ������������������� �������� ������ ��� ������� ����������, ������ ��
+-������������ ����...������������ �������� ������ ��� ��� ����������� ���������, ������ ��
+-������������ ����...��������� ���������� ������� ������� ��� �� ���������� ���������������������Copyright (C) %s Free Software Foundation, Inc.
+-���� ����� �������� ���������� ����� ��� ������ ������ ��� ����� ����������.
+-��� ������� �������� ���� ����� ��� ��������I������� � ������������� ���
+-������ ������������ �����.
+-��� ���� ������ ���� ����������� ������������� ���� ��������� ����� ����������������������� ��������� ������������ ������� ��� ����� ������ ������� ��� ���� ������������������� � ����� ����� ��������������� ��������� ��� ����� ����������������� �� ���� ������ ��� ������� ������ ��� ��������EMT ������������ %d������� �� ������� ������� ���������: �������: �� .netrc ������ ����� ���������� ��� ������.���������� ������������� ��� ���������� ��� �������������������: �� ������� ��� ������ �� `_POSIX2_LOCALEDEF'��������� (�� ����������� ������)�� ����������� ������� �� ���� ������������ ������ ���������� �������� ������� �������� �� ������ �������������� ������ ����� ������������������� �� ���� �������� ������������ ������ ������������������ �� ���� �������� ���������������� ������� �������������� ���������� ��� ���� ������������������������ ����������������� ������� �� ������������������� ���������� �������� ����������������� � �������/�������IOT �������������������� ������������������� ��������������� ��������������� �������������������� ����� ������� � ���������������������� ioctl ��� ������������������ ���������� ��� ��������� ������������������ ������������������ �������/���������������� ������ NIS���������� ������ ypbind������������������� ����� ������������ ���������� ����� ���������� �� ������ �� ��������������� ������ ������������� ������ ����-������������ ������� ���������� �������� ��������� ������ �������������� ������������������ ������� �����������(verifier) ������������������ ������� ���������� ������������ ������ ����������� ��� \{\}��� ������� ��������� ������ ����������� ������ ������������ ������ � ����������� multibyte � ������ ������������� ������ ������������� �������� ���������� ������ ����� ��������� ������ �������� ���������� ������� ������� ���������� ������� ����������� ���������� ������� �����������(verifier) ������������� ������ ��������� ��������������� ��� ������� ����� ������������������������� 2 ����������������� 2 ��� ��������������������� 3 ����������������� 3 �������������� ��������� �������� ������� ��������� ����� ��� ��� �� �������� ���� ������� �� ����� ������� �������������� ��������� ������� �������� �������� ��� ����� ��� �������� ����� ���������������������� ������ ����������������� multihop�������������� ������� ���������/��������������� NIS - ��� ���������
+-� �������������� ���� � ���� ��������� ��� ����� NIS��� ����� ��� ����� �������� ��� ����������������� ��������������� ������ ����� ��� ������� ���� ��� ������������ ������ �� ������������� ������ ��� ����� ���������������� ����� ��������� � CSI ����(structure)���� ����� ���������� �� XENIX ��������������� ��������� ��� ��������� �� �� ������������ anode���� ������� ���������� ����� ����������������� ��������� ������������� �������� ��������� ������������ �������� ��������� ����������������� ������������� ������� ����������� ������ ���������� ��������� �������� ����� ������������ ��� ����� ��� ����� ������������� ������� ����������� �������� �������������� ������������� ��������� ��� ��������.
+-���� ������� �������� ��� ����������� ������ ������� ����� ��� ����������� ������� ������ ������ � ������������� ������� ������ ������ ��� ��������� ������� ������� ������ ���� ����� ��� �������������� ������� ������ ������������� ����� XENIX ����� �������� ����������� ����� �������������������� ���������� ��� ��� ��� �������� ���������� ���������� ����� ��� ��� �� �������� ����������� ����� ���������������������� ������� ������������� ���������� ���������� ����� ���������� ��� ������������� ���������� ��� ��������������� ���������� ��� ������������� ��� �� ��������� ���������� ��������� ���� �� ���������� ���������� �� ������ �� ������(block)���� ��������� ����� ����(streams)��� ������ ��� �������������������� ������������������ ������������������ ����� ��� ��������� ���������� ������������� ��������������� ������� ������ ����������� ��� ���� ������������������� ������������� ���������� ����������� ��� ����������������� ����� ��������� �� ������������� ���������� ��� ������������������� ����� ���������� ��� ��� �������(socket)�������������������� �� RFS �������RPC ���� ���������� ��� ������������������ RPC �� ���������� ��� NIS��� ��������� RPC ��� ����� ����������� ������ ��� RPC ������������ ��� ����� ������� RPC ���� ��� ����� ������� ������ ��� RPC ��� ����� ������RPC: (�������� ������� ���������)�RPC: ������ �������������RPC: ��� ����� ������� �� ���������������� �� �����������RPC: ��� ����� ������� �� �������������� �� �����������RPC: �������� (�� ����������� ������)�RPC: �� �������� �������� ��� RPC�RPC: �������� ����������� ������RPC: �� ��������� �����������RPC: �� ��������� ��� ���� ������������RPC: �� ��������� ����������RPC: �������������� ������������/��������RPC: ������ ��������������� �����������RPC: � ����������� ��� ������ �� ���������������� ��� ������������RPC: ���������RPC: ���� �������RPC: �������� ������RPC: �������� ����������RPC: ������� ����� �����������RPC: ������� ������������ RTLD_NEXT ��� ��������������� ���� ������ ��� ��������� �������������������-���� ������� ������������ ������ �������� ��������������������� ������ �������/�������� ������������� ��������� ������������������� �� ����������� � ����� �� ������ ��-���������� ��� ���� ������.���������� �������� ��������������� �� `glibcbug' ��������� ��� <bugs@gnu.org>.
+-����� ������ ����������������� ������� ����������� 0 (������ ������)���������� ������ ��� ������� ����������������������� �������� ������ ������� ����� �������� ����� ����� ��������� �� ����������������� ���������� (segmentation fault)�� ����������� �������� ���������������� ����������� �������� ��������������� 0����������� �������� �� ��-��������� ����� ��� �������� ��� ���������������� ��������� ��������� ������� ��������������� srmount������� ���������� ������� ��� NFS ��������� ��������������������������� (����)���������� (������� tty)���������� (������ tty)������� ��������� ������ ���� ���������� ��������������������������� ��������� ����� ������������������������������ �������� �� ������� ������������� ���������������� ����� ������� ���������� �������������������� ������ �������������������� ����� ������� ����������������� ����� ������� ������ ��� ������������������ ������ ��������������������� ������ ������������ �������� ��������������������� ������ �������������� Trace/BPT������� Trace/breakpoint���������� ��������� ��������� ����������� �������� ���� ��������� ����� ��� ������������� ���� ��������� ��� ����� ��������������������� `%s --help' ��� ������������ �����������.
+-������������ %s...
+-�������� .netrc ������� %s��������� ������� ��������� NIS�������� ������ �������� ����� ������������������ ������ ������� ������������������� ������ ������������������ ���� %d�������� ������ ������������������ ������ ypbind����������� ( � \(����������� ) � \)����������� [ � [^����������� \{��� ������������ ��������� `%s'���������� ��������� �������/������������: %s [�������]... -o ������-����� [������-�������]...
+-       %s [�������]... [������-������ [������-�������]...]
+-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ���
+-�������� ��������.
+-  -H, --header=�����  �������������� ��� ������ ������������ C �������� �����
+-                       ����������� ���� �������� ��� ��������
+-  -h, --help          �������� ����� ��� �������� ��� �����������
+-      --new           ��� ��������������� ������� ���������, ������������� ��� ������ ������
+-  -o, --output=�����  �������� � ������ ��� ������ �����
+-  -V, --version       �������� ����������� ������� ��� �����������
+-��� �� ������-������� ����� -, � ������� ���������� ��� ��� �������� ������.
+-��� �� ������-������ ����� -, � ������ �������� ���� �������� �����.
+-������: %s [�������]... ������-������� ������-������
+-       %s [�������]... -o ������-������ ������-�������
+-       %s [�������]... -u ������-�������
+-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ���
+-�������� ��������.
+-  -f, --fold-case     ���������� �� ������ �� ���� ��������
+-  -h, --help          �������� ����� ��� �������� ��� �����������
+-  -o, --output=�����  �������� � ������ ��� ������ �����
+-      --quiet         �� ��� ������������ �������� ����� ������������� � ����
+-                       ���������
+-  -u, --undo          �������� ��� ������������ ��� ������� ��� �����
+-                       ���������, ��� ���������� ��� ������
+-  -V, --version       �������� ����������� ������� ��� �����������
+-��� �� ������-������� ����� -, � ������� ���������� ��� ��� �������� ������.
+-������: %s [�������]... �����
+-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ���
+-�������� ��������.
+-  -c, --force               ������������� ������ ����� ��� �� ��������
+-                             �������������� ���������
+-  -h, --help                �������� ����� ��� �������� ��� �����������
+-  -f, --charmap=������      ��������� ������� ���������� �������� ��� ������
+-  -i, --inputfile=������    �� ������� ����� ���������� ��� ������
+-  -u, --code-set-name=����� ����������� ��� ������� ��� ������������
+-                             ��� ISO 10646 ���������
+-  -v, --verbose             �������� ������������ ���������
+-  -V, --version             �������� ����������� ������� ��� �����������
+-      --posix               ������� ��������� �� POSIX
+-
+-� ��������� ���������� ��� ������ ����������: %s
+-                               ������ locale: %s
+-������: %s [�������]... �����
+-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ���
+-�������� ��������.
+-  -h, --help            �������� ����� ��� �������� ��� �����������
+-  -V, --version         �������� ����������� ������� ��� �����������
+-
+-  -a, --all-locales     ��������� �� ������� ��� ���������� locales
+-  -m, --charmaps        ��������� �� �������� ��� ���������� ������ ����������
+-
+-  -c, --category-name   ��������� �� �������� ��� ����������� ����������
+-  -k, --keyword-name    ��������� �� ������� ��� ����������� ������-��������
+-������: %s �����_���������� [�����_���������]
+-������: rpcinfo [ -n �����. ����� ] -u �������  �����. �������. [ �����. ������� ]
+-������������� ��� ��� ������ ���� 1������������� ��� ��� ������ ���� 2�� ���� ����� ���� ������ ��� ����������� ���� ����������� ��������� ������������� ����������� ���������� ��� ��� �������� ��� ���������� �������� ���������������� ��� %s.
+-���������� ����� ������YPBINDPROC_DOMAIN: %s
+-����������� ��� ������ ���� �� ������ ������ ������ ��� ������� ��������� ��� ����� ��� ����� ���� ��� �� ����� ������ ��� ������������ ��������� ������� `%1$s' ��� ��������� �� `END %1$s'�`-1' ������ �� ����� � ��������� ���������� ��� `%s' ����� ��� `%s' ������������ `...' ������ �� ��������������� ���� �� `...' ��� `UNDEFINED' ����������������������� `from' ���� ��� ����� ��������� ��� `collating-element'�� ������� ���������� `from' ��� ������ ��� ��������� ��������� ��������
+-������� ����������� ���������� ��� <%s> ������ �� ����� ���� ����� ������������ ���������� ��� `%s' ������ �� ����� ���� ����� �����������auth_none.c - ������� ����� �������������� ������������ ���������������� ����� FROM �� ������ Link������ ����� TO �� ������ Link��� ����� ������������ ��� ������������� mcheck_status, � ���������� ����� �������������broadcast: ioctl (���� ��������� �����������)�broadcast: ioctl (���� ��������� ��������)�cache_set: �� ���� ��� ����������� ����� ������� �� ���������� � ���������� ��� ����� ���� ���
+-�� �������������� ������ ���� �� 'until time'���� ����� ������� �� ��������� � ������� ����������� %d
+-���� ����� ������� �� ����� `stat' �� locale ������ `%s'��������� ��������� �������� ��������� `%.*s'��������� ��������� ���� ������ ���������������������� ��������� ���� ������� �������� ���������: %s��������� ������������������� ���������� ������� ������ ��������� `%s': %s��������� ���������� ������� ������� `%s'��������� ���������� ������� ������� locale `%s'��������� ���������� ������� ������ `%s'��������� ���������� ������� ����� `%s' ��� ��� ��������� `%s'��������� ������������ ��� ������������ ��������������� ��������� ��������� ��� ����� ���������� `%s'��������� ��������� ��������� locale `%s'��������� ��������� ������� locale `%s'��������� �������� ������� ������ ��� `%s'��� �������� ���������� ��������� ���� ��� ��� ����: ��� �� ������ �� �������� ���������� %s'%s' ���� ����� `%s' ������ �� ����� ���� ����� `%s'�� ���������� %s'%s' ���� ����� `%s' ��� ������ �� ����� ���� ����� `%s'�� ���������� <SP> ��� �������� ���� ����� ������������ ���������� `%s' ��� �������� ��� ���������� ��� �������������� ������ ����� ���������� `%s' �������� ����� ������ ���������� `%s' �������� ������ ������ ����� ���������� `%s' ��� ��������clnt_raw.c - ������� ������ ��������������� ��������������� �������� ��������� `%.*s' ����������� ������������ ��� ��� �����:
+-��������� � ��������� ������� ��������� `%.*s' ����������� ������������ ��� ��� �����:
+-��������� � ����������������� ������� ��������� ���� �� `%s'�������� ��� ��������� %s: ��������� ����������� rpc ����������
+-��������� ����������� �����. %d ���. %d
+-��� �������������� ������ ����� ���������� `%s' ��� ��������� ������������� ������ ��� ������������� %d ��� ����� `era' ����
+-��������� `%s' ��� ����� '+' ���� '-'�� ������������� ������ ��� ������������� %d ��� ����� `era' ����
+-��������� `%s' ��� ����� ���� ���������������� ����� ��������� `%s'������� ������� ��������� ���������������� ������� ��� ��� ��������� `%.*s'������ ������������� ������� ������������� ����� ����� %s (������ "%s", ������ %d)������� ������������� ���������������� ������� ��������������� �������� ��������: ������ ����������enablecache: � ���������� ����� ����� ��� ���������������enablecache: �������� ��������� ����������� �������enablecache: �������� ��������� ��������� ����������� �������enablecache: �������� ��������� fifo ����������� ��������� ������ ������ ��� ������ ��� �������� ����� ���������� ��� �� ������������� ���� ��� �������� ��������� ��������� ���� hash ������������� ���� ��� �������� ���� hash ����������������� ������� ���������� ��� `copy'����������� ������ ��������� ��� ��� ���������������� ���� ��� ������� ��������� ��� ��� ��������� `%s'�fcntl: F_SETFD��� ����� `%s' ���� ��������� `%s' ��� ����������� ����� `%s' ���� ��������� `%s' ��� ���������� ���� from ��� `��������� ���������' ������ �� ����� ���������������� fstat ����������������� ��� ����� ��� ��������������� ��� ������ �������������������� ��� ����� ��� ����������������� ��� ����� ����������������(offset) ����� ��� ������������� %d
+-��� ����� `era' ���� ��������� `%s'���������� ��� ����� ��� ����������� ������� ��� ������������� %d
+-��� ����� `era' ���� ��������� `%s'���������� ��� ����� ��� ����������� ����������� ��� ������������� %d
+-��� ����� `era' ���� ��������� `%s'�get_myaddress: ioctl (���� ����������� ��������)�������� ����������� �������� ������ CORRECTION ����� ��� ������ ���������� (Leap)��� ������ Rolling/Stationary ����� ��� ������ ���������� (Leap)��� ������� �������� ���������� ��� ���������������� ������ �������� ������������ ������� �������������� �� ������ ��������������� ������ ���������� �������� ��� ����� ��� ����������������� ������ ������� ��� �� ����� ������������� ������� ������� ��� ������������ ��o ������������� %d ��� ����� `era' ���� ��������� `%s'��� ������� ������� ������ ������ ���������� ������� ��� ������������� %d ��� ����� `era'���� ��������� `%s'��� ������ ���������� ����������� ��� ������������� %d ��� ����� `era'���� ��������� `%s'����� ����������: ��� ������������ ���� ��� %d ������� ��������������� ����������: ��� ������������ ���� ��� %d ������ ����������������� ����� ������������������� ��������� �������� ��������������� ������ - ������� � addtype �� ���� isdst���������� ������ - ������� � addtype �� ���� ttisgmt���������� ������ - ������� � addtype �� ���� ttisstd���������� ������ ��� %s, ������ %u��� ������� GMT ����������������� ������ ���������� �������������� ������ ���� ��� ������� ������� ������ �������� ������� ������ ����������� ������ ����� ������� ������ ������� ������ ������� ������ ���������� ������ ��� ��� �������� ������ ����� ����������� ������ ���� ��� ������� ������ �� �������� ������ ����������� ������ ���� ��� ������� ��� �������� ������ ��� ������� �������������� ������ ��������� locale ������ `%s', ��� ��������������� ���� `copy' ������ ��� ���������� lstat ������������������������ ������ ����������� ����� ���������� ���� ��� �� ���������� ������� ����� ���������� ���� �� ����� ��� ����������� ������� ����� ������������� ����� �����������
+-�� ����� ����� �������, � ���������� ���� ��������������� � ���������� ������ ��� ������������� %d ��� `era' ��������� ��������� `%s'������� �� ����� ��� ������ ��� ������������� %d ��� `era' ��������� ��������� `%s'�������� ����� ���������� ��� �������� �� ��������� %d
+-��� ����� �������� ������� ��� �� ����� `%s' ���� ��������� `%s': %s������ ���� ��� ���� ��� �������� �� ��� �������������� ������� ��� `UNDEFINED'������ ���� ���� ������ ��� �� ������ �� ����������� ���� ��������������� �� `copy'���� ��������� ������ ������ ������ ��������� ������������������� ������ ��������� ��������� ������ ��������� ����� ��� �� ����� ���������� �������� �������� ��� �� ������� `%s'���� ����� �������� ����������� ������� WIDTH ������������ �� ���������� ��� CHARMAP ����������������� ���� ��� �������� ��� `%s'��� ��������� %lu ��� ����� ���������
+-��� ��������� %lu ������� %lu ��� ����� ���������
+-��� ��������� %lu ������� %lu ������ ��� ��������
+-�rcmd: select (������� ��� stderr): %m
+-�rcmd: socket: ���� �� ����� �� �����
+-�rcmd: write (������� ��� stderr): %m
+-�registerrpc: ����� �����������
+-�repeated leap second moment�rpcinfo: %s ����� ������� �������
+-�rpcinfo: %s ����� ������� ��������
+-�rpcinfo: �������� ��������� ������� ��� �� ��������� %s ������� %s
+-�rpcinfo: ������� �������: %s
+-�rpcinfo: �������� ������������ �� ����������� ������rpcinfo: �������� ������������ �� ����������� �����: �� ����� ������� �� �������� �������select: �������� ���������� ��� ������� ����������
+-�socket: �������� ���������� ��� ������� ����������
+-��� ������������ ����������� `forward' ��� `backward' ����� �������� ���������������� �������������� ��� ��������� ����������� ��� ������� ��������� ��� ������ �������������� ���������������� �������� ���������� ������� ��� ����� ������ ��� ������������� %d ��� ����� `era' ���� ��������� `%s'��� ���� ������� ����� ����������� �� ���� ������������� ������ ������� ����� ���� ������� ��� �� ��������������� ������ ������� ����� ���� ������ ��� �� ��������������� ���������� ����������� ��� ����� ������ ���� ������� %d ��� ����� `era' ���� ��������� `%s'�svc_run: - �������� ��� select�svc_tcp: makefd_xprt: ����� �����������
+-�svctcp_.c - �������� getsockname � listen�svctcp_.c - �������� ����������� �������� udp�svctcp_create: ����� �����������
+-�svcudp_create -  �������� getsockname�svcudp_create - �������� ����������� ���������������� ��� ������������� ��������� ��������� `%.*s' ����������� ��� ��������� ����������������� ��� ������������� ��������� ��������� `%.*s' ����������� ���� ����������������������� ��� ������������� ��������� ��������� `%.*s' ����������� ���� ���������������������� ��� ������������� ��������� ��������� `%.*s' ����������� ��� ��������� ���������������� ��� ������������� ��������� ��������� `%.*s' ����������� �� �������������� ��� charset����������� ������ ��� ������ ��� %s: %s����������� ������ ���� `order_start' ������������� ����������������� ������ ���� ������ ������ ��������������������� ������ ���� ������ ���������� ��������������������� ������ ���� �������� ����� ������������������ ������ ���� �������� ������������������ ������ ���� ������ ��� LC_TYPE ��������������������� ������ ���� ������ ��� ���� ������ ��������������������� ������ ���� ������ ��� ��� ����� ��������������������� ������ ���� ������� locale �������������������� ������ ���� ������ ������������ locale����������� ������ ���� ������ ����������� locale����������� ������ ���� ��������� ����������������� ������ ���� �������: %s����������� ������ ���� ������ locale ��������������� ������: ��� ����� ���� �� ����� locale ������������� ����� � ������ ����������� ���� �� ����������������� ��������� ���� bytes ���� ������������ �������������������� ����� bytes ���� ������������ ������������������� ������ ������� ��������������������� ����� ������������ ��������������������� ������ ����� ������� ��������������� ������ ����������;!����������� ����� ��������������� ������, � ���� ������, ������������ ����� ��������������� ��������� ��� ����� ��� ���������������� ���� ��� �������� ��� ��������� %d
+-���� ����������� ��� ����������� ������� �� ��������� `...'��������� ����� ����������������������� ���������� `%s'��������� ���������� ��� ����� `%s' ��� ���������� `%s'�������� ������� ����������������o ������� `%s': ������ ����������������� ��� `%s'�������� ������� `%.*s': ������ ���������������� ������� ������������� ��������� ������������o ���������������� ������������� ��������� �������� ������������� ����� ��������� ����� ���� ��� ����� ��� ����� ��������� ��� ���� ����������� ��� 2/29 �� ����� �� ��������� ���� ��� �� %s ������ �� ����� ���������� ���� ��� <%s> ������ �� ��������� ������ 1 ��� 4�� ���� ��� �� ����� `%s' ���� ��������� `%s' ��� ������ �� ����� ���� ��������������� ���� ��� <mb_cur_max> ������ �� ����� ���������� ��� ����� ��� <mb_cur_min>�� ���� ��� ������ `int_curr_symbol' ���� ��������� `LC_MONETARY' ����������� �� ������ ����� ������� �� �� ISO 4217�� ���� ��� ������ `int_curr_symbol' ���� ��������� `LC_MONETARY' ���� ����� �������� ����� ��� �� ����� `%s' ���� ��������� `%s' ������ �� ����� ���������� ��� 127��� ����� ��� �� ����� `%s' ���� ��������� `%s' ��� ������ �� ����� ���������� �� ������� ��� UTMP ������������ �� ������� ������ ������� �������������� ��� ������������ ����������� ��� �������� ������ �������������� ��� ������� ������� ������ ������������ ������ ����� ��������� ��� ��� ������ ����� ��� ��������������� ������� ���������������� ������� ������ ��� ������ Leap������ ������� ������ ��� ������ Link������ ������� ������ ��� ������ Rule������ ������� ������ ��� ������ ��������� Zone������ ������� ������ ��� ������ Zone�yp_update: �������� ���������� �������� ���������� �� ����� �������
+-�yp_update: �������� ����� ���������� ����������
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/es.mo glibc-2.1.3/po/es.mo
+--- ../glibc-2.1.3/po/es.mo	1999-07-18 18:19:41.000000000 -0700
++++ glibc-2.1.3/po/es.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,490 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������-��	������7������O���`���b���[���ÿ��<������>���\������������������������������������������������������3������G����������������"���*���"���M������p���<��������������������������������������������,������C���!���]���$������!�������$�������!�������$���
������2��� ���I������j������o������������������������<�������<�������R���/���2�������)��������������1�������%���+������Q���*���k���6�������<�������0���
+-������;���+���Y���.�������������� �����������������������%���,���?���]���l����������3�������3������3���K���3������3��������������0������+���3���"���_�����������������0��������������)������0���0���1���a���!�������)�������!����������������!������@��� ���V��� ���w�����������@���7������x���5�������>�������������+���"������N���I���b����������L�������+������*���8���
+-���c���A���n���/�������)����������
+-���������������:���+������f���<�������>�������������������)������&���I���8���p��������������������������������������$���������B������R������m���1��������������%�������%�������������
���$������2���#���6������Z���9���o���G�������1�������0���#���0���T����������+�������E�������;������=���N���/������� �������;�������(������>���B���5�������5�������+�������?���������Y������x����������-���������������������$������-���8���S���f���X�������������-���%������S������p���K���y������������������,�������P�������0���=���B���n����������-��������������������������(���������5���%���S���+���y��� �������������������������������������.��� ���J���9���k���=�������A�������"���%���
���H������V������_���"���o����������K��������������,������7���E������}��� �������5�������G����������.���#���L������p���'�������!�������'�����������������
������+���8���F����������������$������������������o���-�����������������������������������������'���&���0���N���������-�������3�������.�������/��� ���3���P������������������������S�������
���.������<��� ���@������a������t����������&�������.�������4����������5������M������Z���,���o��������������������������������������=������!���L������n����������$�������"�������!����������������&���.���A������p���?�������+�����������������	������)���.���G���"���v������������������������	���������������������@����������@������Q������i������z���#����������������������������������0������,���H������u���#������������������F���B���Z���!���������������������$����������������&���'���?������g�������������������������������d�������/���#������S���)���n���7����������������������������(�������#���%������I������i���!�������$��������������-����������������0���%���F���%���l���.�������.��������������(���������-������H���+���a���"����������������������������(���	���,���2���*���_���&�������"��������������$�������������.���3������b���4���x���/�������	�������$�������'���������4������H���/���\������������������������2�������!���������(������5������M������`���$���t����������%�������'�����������������������6������I���,���d���������������������������������������������
������=���������]������n���'�������J�������5����������-������B������b������q������������������������"��������������������-���#���&���Q������x����������+���������������������#����������#������C���"���]����������)�������,�������"�������#������#���<��� ���`�����������������(��������������2����������3������C������Y������r������������������������K�������>������$���W���#���|����������(�������!�������������=���#���.���a�����������������A�������-�������2���%��)���X��$������������#������,����������������� ����:�,���P����}�!�����"�����&����� �������)����<�'���D����l�)����������0�������������!���&����H����^����v����}�%�����%����������#�����
+-���"�0���-�5���^�����������.���������������������*�����	����� ���������������������+�(���@����i����|�*����������,��������	�'���	�"���A	����d	�!���~	�0����	�8����	����
+-
+-�
+-���
+-����'
+-�(���3
+-�)���\
+-�'����
+-�+����
+-�#����
+-�&����
+-����%����>����]����o����������������-�����������������'�,���E����r�������������������������������-���
+-
�I���8
�����
�����
�5����
�&����
�-�������M�A���d�.�����3�����7���	�)���A����k����|����������������#����������\��������P�.���]�@�����Q�����@����H���`�f������������(����A�1���U�1�����:�����!������������(�#���?�!���c������>�����4�����3�������H�=���`�:�����%�����P�����1���P�7�����5�����'�����(����;���A�1���}�6�����I�����1���0�.���b�E�����,�������������.���-�,���\�:�����&�����+�����B����!���Z�3���|�;�����A��������.�$���K�,���p�+�����#�����*�����5����1���N�%�����*����������?�����?���1�A���q�;�����K�����)���;�,���e�5�����4����� ����� ����!���?�M���a�D�����)���������,���;�)���h�J�����!�����/��������/ �D���G �b���� �h���� �!���X!�*���z!�(����!�����!� ����!�4����!�"���4"����W"����s"�/����"�(����"�3����"�>���#�<���Z#�����#�����#�I����#���� $�$���@$�2���e$�C����$�&����$����%�:���%�1���W%�)����%�%����%�:����%�*���&�2���?&����r&�3����&�4����&�4����&�N���'����n'�E���'�#����'�j����'�f���T(�d����(���� )�2���<)�8���o)�=����)�0����)�2���*�"���J*�9���m*�;����*�����*�"����+����#+����<+�$���N+�>���s+�.����+�1����+����,�V���+,�����,�O����,�M����,�J���:-�J����-�D����-�"���.�$���8.�!���].�;���.�=����.�=����.����7/����U/�!���q/�����/�����/�����/�����/�����/����	0����)0����B0�&���X0�>���0�O����0�[���1����j1�.����1�H����1�����1�+���	2�B���52�/���x2�6����2�@����2���� 3����03�6���A3�N���x3�P����3����4�:���)4�"���d4�D����4�F����4�5���5�9���I5�$����5�'����5�0����5�P���6�(���R6�"���{6�l����6�?���7�L���K7�M����7�-����7�E���8�0���Z8�����8�<����8�����8�I����8�>���F9�����9�����9�3����9�����9�9����:�'���::����b:�W����:�#����:�/����:�3���.;�7���b;�0����;�8����;����<����"<�5���><�8���t<�����<�%����<�)����<�F���=�*���`=�:����=�(����=�?����=�5���/>� ���e>�5����>�=����>�M����>����H?����Y?�S���i?�&����?�:����?�:���@�P���Z@�����@�A����@�-���A�&���3A�2���ZA�B����A�'����A�����A�6���B����OB�/���oB� ����B�e����B�_���&C�^����C�^����C�t���DD�,����D�/����D�3���E�?���JE�5����E�.����E�9����E�A���)F�B���kF�9����F�7����F�8��� G�/���YG�#����G�7����G�8����G�L���H�;���kH�0����H�����H�����H�<���I�0���?I�)���pI� ����I�����I�����I�����I�;���	J�(���EJ�+���nJ�:����J�����J�4����J�#��� K����DK����PK�<���jK�$����K�1����K�����K����L�,���8L����eL����uL�!����L�$����L�����L�����L�?���M�'���KM�!���sM�/����M�)����M�D����M�I���4N�u���~N�]����N�M���RO�����O�.����O�5����O�,��� P�'���MP����uP�����P�;����P�����P�����Q�5���Q����KQ�:���kQ�8����Q�;����Q�F���R�6���bR�����R�����R�F����R�;��� S��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: GNU libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1998-12-12 21:19+0100
+-Last-Translator: Santiago Vila Doncel <sanvila@unex.es>
+-Language-Team: Spanish <es@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�		Derechos de Acceso : �		Atributos     : �	%s [-abkCLNTM][-Dnombre[=valor]] [-i tama�o] [-I [-K segundos]] [-Y camino] fichero_de_entrada
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o fichero_de_salida] [fichero_de_entrada]
+-�	%s [-n netid]* [-o fichero_de_salida] [fichero_de_entrada]
+-�	%s [-s tipored]* [-o fichero_de_salida] [fichero_de_entrada]
+-�	Derechos de acceso: �	Entrada de tipo %s
+-�	Nombre     : %s
+-�	Clave P�blica : �	Tipo         : %s
+-�	Direcci�n universal (%u)
+-�	[%d]	Nombre        : %s
+-�	[%u] - [%u bytes] �
+-%s cach�:
+-
+-%15s  el cach� est� activado
+-%15Zd  tama�o sugerido
+-%15ld  segundos de vida para las entradas positivas
+-%15ld  segundos de vida para las entradas negativas
+-%15ld  aciertos de cach� en las entradas positivas
+-%15ld  aciertos de cach� en las entradas negativas
+-%15ld  fallos de cach� en las entradas positivas
+-%15ld  fallos de cach� en las entradas negativas
+-%15ld%% tasa de aciertos de cach�
+-%15s  compruebe /etc/%s para cambios
+-�
+-Miembros del Grupo :
+-�
+-Tiempo de Vida  : �       rpcinfo -b n�mprog n�mvers
+-�       rpcinfo -d n�mprog n�mvers
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n n�mpuerto ] -t host n�mprog [ n�mvers ]
+-�      no�      si�   Longitud de los datos = %u
+-�  Miembros expl�citos:
+-� No-miembros expl�citos:
+-� Miembros impl�citos:
+-� No-miembros impl�citos:
+-� No hay ning�n miembro expl�cito
+-� No hay ning�n no-miembro expl�cito
+-� No hay ning�n miembro impl�cito
+-� No hay ning�n no-miembro impl�cito
+-� No hay ning�n miembro recursivo
+-� No hay ning�n no-miembro recursivo
+-� Miembros recursivos:
+-�   programa vers proto   puerto
+-� o: � (regla desde "%s", l�nea %d)� [OPCI�N...]� hecho
+-�"%s", l�nea %d: %s�la l�nea "Zone %s" y la opci�n -l son mutuamente excluyentes�la l�nea "Zone %s" y la opci�n -p son mutuamente excluyentes�se necesita un "fichero_de_entrada" para las opciones de generaci�n
+-de plantillas
+-�%.*s: El argumento ARGP_HELP_FMT requiere un valor�%.*s: Par�metro ARGP_HELP_FMT desconocido�%s en una zona sin reglas�%s%s%s:%u: %s%sLa declaraci�n `%s' no se cumple.
+-�%s%s%s:%u: %s%sError inesperado: %s.
+-�%s%sSe�al desconocida %d
+-�%s: %d no extendi� el signo correctamente
+-�%s: <mb_cur_max> debe ser m�s grande que <mb_cur_min>
+-�%s: El preprocesador de C fall� con un c�digo de retorno %d
+-�%s: El preprocesador de C fall� con la se�al %d
+-�%s: No se puede crear %s: %s
+-�%s: No se puede crear el directorio %s: %s
+-�%s: No se pudo crear un enlace de %s a %s: %s
+-�%s: No se puede abrir %s: %s
+-�%s: No se puede eliminar %s: %s
+-�%s: Error al cerrar %s: %s
+-�%s: Error al leer %s
+-�%s: Error al escribir %s
+-�%s: Error al escribir en la salida est�ndar �%s: L�nea de segundos intercalares en un fichero que no es el de
+-ajuste de a�os bisiestos %s
+-�%s: Memoria agotada: %s
+-�%s: La opci�n -L se ha especificado m�s de una vez
+-�%s: La opci�n -d se ha especificado m�s de una vez
+-�%s: La opci�n -l se ha especificado m�s de una vez
+-�%s: La opci�n -p se ha especificado m�s de una vez
+-�%s: La opci�n -y se ha especificado m�s de una vez
+-�%s: Demasiados argumentos
+-�%s: no se puede obtener la fecha de modificaci�n�%s: la orden fue `%s', el resultado fue %d
+-�%s: error en la m�quina de estados�%s: opci�n ilegal -- %c
+-�%s: opci�n inv�lida -- %c
+-�%s: la opci�n `%c%s' no admite ning�n argumento
+-�%s: la opci�n `%s' es ambigua
+-�%s: la opci�n `%s' requiere un argumento
+-�%s: la opci�n `--%s' no admite ning�n argumento
+-�%s: la opci�n `-W %s' no admite ning�n argumento
+-�%s: la opci�n `-W %s' es ambigua
+-�%s: la opci�n requiere un argumento --%c
+-�%s: la salida sobreescribir�a %s
+-�%s: grave: valor_l %d inv�lido
+-�%s: fin de fichero no esperado�%s: no se pudo abrir �%s: opci�n no reconocida `%c%s'
+-�%s: opci�n no reconocida `--%s'
+-�%s: el modo de empleo es %s [ -s ] [ -v ] [ -l hora_local ] [ -p reglasposix ]
+- [ -d directorio ] [ -L segundos_intercalares ] [ -y tipoa�o ] [ fichero ... ]
+-�%s: el modo de empleo es %s [ -v ] [ -c cutoff ] nombrezona ...
+-�%s: al escribir el resultado: �(ERROR DEL PROGRAMA) ��No se conoce ninguna versi�n!?�(ERRROR DEL PROGRAMA) ��La opci�n deber�a haberse reconocido!?�(Objeto desconocido)
+-�(error de autentificaci�n desconocido - %d)�(se�al desconocida)�*** El fichero `%s' est� `stripped': no es posible un an�lisis detallado
+-�*entrada est�ndar*�-o FICHERO-SALIDA [FICHERO-ENTRADA]...
+-[FICHERO-SALIDA [FICHERO-ENTRADA]...]�la secci�n .lib en el a.out est� corrompida�; versi�n menor = %lu, versi�n mayor = %lu�; causa = �<%s> y <%s> son nombres no permitidos para el rango de caracteres�El car�cter <SP> no debe estar en la clase `%s'�El car�cter <SP> no est� en la clase `%s'�?�Abortado�Derechos de acceso : �Accediendo a una biblioteca compartida que est� corrompida�La direcci�n ya se est� usando�Esta familia de direcciones no est� soportada para el `host'�Esta familia de direcciones no est� soportada por el protocolo�Error de anuncio�Temporizador�La lista de argumentos es demasiado larga�Se intent� eliminar una tabla no vac�a�Se intentaron enlazar demasiadas bibliotecas compartidas�Autentificaci�n v�lida�Error de autentificaci�n�OBJETO INV�LIDO
+-�Direcci�n incorrecta�Descriptor de fichero err�neo�Formato de fichero fuente incorrecto�Mensaje err�neo�Llamada al sistema err�nea�Valor err�neo para ai_flags�Act�a estrictamente de acuerdo con la norma POSIX�Datos binarios
+-�Se requiere un dispositivo de bloques�Problema en el `poll' del `broadcast'�Tuber�a rota�Error del bus�CDS�Rebasado el l�mite de tiempo de CPU�El cach� ha expirado�No se puede acceder a una biblioteca compartida necesaria�Ha fallado la llamada a bind() con el servidor que sirve a este dominio�No se puede comunicar con el asignador de puertos�No se puede establecer comunicaci�n con `ypbind'�No se puede establecer comunicaci�n con `ypserv'�No se pudo asignar memoria�No se puede asignar la direcci�n solicitada�No se puede crear `socket' para enviar un mensaje `broadcast' del rpc�No se puede ejecutar una biblioteca compartida directamente�No se puede tener m�s de una opci�n de generaci�n de fichero
+-�No se puede recibir la respuesta al `broadcast'�No se pudo registrar el servicio�No se puede enviar tras la destrucci�n del punto de destino�No se pudo enviar el mensaje `broadcast'�No se pudo especificar la opci�n SO_BROADCAST para el `socket'�No se puede especificar m�s de un fichero de entrada
+-�No se puede usar la opci�n netid con la opci�n inetd
+-�No se puede usar la opci�n netid sin TIRPC
+-�No se pueden usar las opciones de la tabla con el nuevo estilo
+-�N�mero de canal fuera de rango�Separador de Caracteres : %c
+-�El proceso hijo termin��Las credenciales del cliente son poco fiables�Columnas            :
+-�Error de comunicaci�n al enviar�Compila una especificaci�n de locale�Anda, vete a casa y t�mate un vasito de leche�El c�lculo del tama�o de la tabla de clases de caracteres podr�a tardar un
+-rato ...�El c�lculo del tama�o de la tabla de informaci�n de secuencias podr�a tardar
+-un rato ...�Conexi�n rehusada�Conexi�n reinicializada por la m�quina remota�Expir� el tiempo de conexi�n�Contin�a�Convierte la codificaci�n de los ficheros dados de una codificaci�n a otra.�Convierte la clave a min�sculas�Copyright (C) %s Free Software Foundation, Inc.
+-Esto es software libre; vea el c�digo fuente para las condiciones de copia.
+-No hay NINGUNA garant�a; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN
+-FIN DETERMINADO.
+-�No se pudo crear el fichero de registro "%s"�Crea un fichero de cabecera C, NOMBRE, que contiene las definiciones de s�mbolos�Crea la salida incluso si hubo mensajes de aviso�Crea una base de datos DB simple a partir de una entrada de texto.�Fecha de creaci�n : %s�La entrada DES para el nombre %s no es �nica
+-�DIRECTORIO
+-�DNANS�DNS�No existe la base de datos para la tabla�La base de datos est� ocupada�Derechos de acceso predeterminados :
+-�Se debe especificar la direcci�n de destino�El dispositivo no es un `stream'�Dispositivo no configurado�Dispositivo o recurso ocupado�Diffie-Hellmann (%d bits)
+-�Directorio    : %s
+-�El directorio no est� vac�o�Se ha excedido la cuota de disco�No se divide y muestra los mensajes en la terminal actual�No muestra ning�n mensaje mientras construye la base de datos�No utiliza el cat�logo existente, crea un nuevo fichero de salida�No se pudo conectar con el dominio�`trap' de EMT�ENTRADA
+-�Datos cifrados
+-�Discordancia de tipo Entrada/Tabla�Error en el subsistema RPC�Error al acceder al fichero de comienzo frio de NIS+. �Est� NIS+ instalado?�Error de sistema desconocido: �Error al hablar con el proceso de `callback'�Error: el fichero .netrc es legible por otros usuarios.�Intercambio lleno�Formato de ejecutable incorrecto�Error fatal: el sistema no define `_POSIX2_LOCALEDEF'�El FICHERO contiene una asignaci�n de nombres simb�licos a valores UCS4�Fall� (error no especificado)�Descriptor de fichero en mal estado�El fichero existe�error `deadlock' al bloquear el fichero�Nombre de fichero demasiado largo�Superado el l�mite de tama�o de fichero�Fichero demasiado grande�Cadena Primero/Siguiente rota�Excepci�n de coma flotante�Se necesita una resincronizaci�n completa del directorio�Funci�n no implementada�GRUPO
+-�Inconsistencias en ARGP_HELP_FMT: %s�Genera un cat�logo de mensajes.\vSi FICHERO-ENTRADA es -, la entrada se lee
+-de la entrada est�ndar. Si FICHERO-SALIDA es -, el resultado se escribe en la
+-salida est�ndar.
+-�Error del sistema gen�rico�Obtiene la informaci�n espec�fica del locale.�Da un mensaje corto de uso�Da esta lista de ayuda�Error injustificado�Grupo         : %s
+-�Opciones de Grupo :�Entrada de grupo para el grupo "%s.%s"
+-�Cuelga durante SECS segundos (por omisi�n, 3600)�Colgar (hangup)�No se ha encontrado "%d" en el cach� de grupo�No se ha encontrado "%d" en el cach� de contrase�as�No se ha encontrado "%s" en el cach� de grupos�No se ha encontrado "%s" en el cach� de `hosts'�No se ha encontrado "%s" en el cach� de contrase�as�El `host' no est� operativo�Nombre de `host' no encontrado�Operaci�n de E/S permitida�FICHERO-ENTRADA FICHERO-SALIDA
+--o FICHERO-SALIDA FICHERO-ENTRADA
+--u FICHERO-ENTRADA�`trap' de IOT�IVY�El identificador se ha eliminado�Instrucci�n ilegal�Objeto ilegal para la operaci�n�Desplazamiento ilegal�Formato o tipo de fichero no apropiado�Funci�n ioctl no apropiada para el dispositivo�Operaci�n no v�lida para un proceso en segundo plano�Petici�n de informaci�n�Informaci�n:�Ficheros de Entrada:�Especificaci�n de formato de Entrada/Salida:�Error de entrada/salida�Error interno de NIS�Error interno en ypbind�Interrupci�n�Llamada al sistema interrumpida�La llamada al sistema interrumpida deber�a volverse a iniciar�Objeto inv�lido para la operaci�n�Argumento inv�lido�Referencia hacia atr�s inv�lida�Nombre de clase de car�cter inv�lido�Credenciales del cliente inv�lidas�Verificaci�n del cliente inv�lida�Car�cter de uni�n inv�lido�Contenido de \{\} inv�lido�Enlace cruzado entre dispositivos no permitido�Intercambio inv�lido�El car�cter multibyte o extendido est� incompleto o es inv�lido�La expresi�n regular precedente es inv�lida�Final de rango inv�lido�La expresi�n regular es err�nea�C�digo de petici�n incorrecto�El descriptor de fichero solicitado es err�neo�Verificaci�n del servidor inv�lido�`slot' incorrecto�Es un directorio�Es un fichero de tipo `named'�Cerbero.
+-�Terminado (killed)�ENLACE
+-�La entrada LOCAL para el UID %d en el directorio %s no es �nica
+-�Nivel 2 detenido�Nivel 2 no sincronizado�Nivel 3 detenido�Nivel 3 restablecido�En enlace apunta a un nombre ilegal�El enlace se ha cortado�N�mero de enlace fuera de rango�Tipo de objeto enlazado : �Enlazado a : %s
+-�No se ha establecido el nombre del dominio local�La asignaci�n de recursos locales ha fallado�La m�quina no est� en red�Nombre mal escrito, o nombre ilegal�Los argumentos obligatorios u opcionales para las opciones largas son
+-tambi�n obligatorios u opcionales para las opciones cortas correspondientes.�Servidor Maestro :
+-�El servidor maestro est� ocupado, el volcado completo se postpone.�Fallo en la asignaci�n de memoria�Memoria agotada�Mensaje demasiado largo�Falta un atributo o est� mal escrito�Fecha de modificaci�n: %s�Fallo en la modificaci�n�La operaci�n de modificaci�n ha fallado�Modifica el formato de salida:�Se ha intentado un `multihop'�NOMBRE�NOMBRE
+-[-a|-m]�NIS�Discordancia en las versiones de NIS del cliente y el servidor.
+-No se puede suministrar el servicio.�La base de datos de la tabla NIS no es correcta�Fall� la operaci�n de NIS+�No se puede acceder a los servidores NIS+�El servicio NIS+ no est� disponible o no est� instalado�NO HAY NING�N OBJETO
+-�N�MERO�Nombre : `%s'
+-�Daemon de Cach� del Servicio de Nombres.�Nombre no servido por este servidor�El nombre no es �nico en la red�Nombre o servicio desconocido�El par nombre/entrada no es �nico�El objeto nombrado no es localizable�Se necesita un autentificador�La conexi�n de red se perdi� al reinicializar�La red no est� activa�La red es inaccesible�No quedan estructuras CSI disponibles�No quedan sem�foros XENIX disponibles�No existe ninguna direcci�n asociada al nombre�No existe ninguna direcci�n asociada al nombre�No hay ning�n �nodo�No queda espacio para memoria intermedia�No hay ning�n proceso hijo�No hay datos disponibles�No queda espacio de ficheros en el servidor�No se pueden bloquear m�s ficheros�No hay ninguna coincidencia�No se ha encontrado el medio�Ning�n mensaje del tipo deseado�No hay m�s registros en la base de datos�No existe ninguna expresi�n regular anterior�No hay ning�n programa remoto registrado.
+-�No existe ninguna ruta hasta el `host'�No queda espacio en el dispositivo�No existe tal dispositivo�No existe el fichero o el directorio�No exite esta clave en la tabla�No existe esa tabla en el dominio del servidor�No existe tal proceso�Se ha encontrado un nombre de espacio que no es NIS+�Fallo irrecuperable en la resoluci�n del nombre�Ninguno.
+-�No se encontr�, no existe ese nombre�No es un fichero XENIX del tipo `named'�No es un directorio�No se ha encontrado�No existe un servidor maestro para este dominio�No es el propietario�N�mero de Columnas  : %d
+-�N�mero de objetos : %u
+-�Argumento num�rico fuera del dominio de la funci�n�Resultado num�rico fuera de rango�Objeto #%d:
+-�Nombre del Objeto : %s
+-�Tipo del Objeto : �El objeto es remoto�Existe un objeto con el mismo nombre�N�mero impar de comillas�Solamente root puede usar esta opci�n�La operaci�n ya se est� llevando a cabo�Operaci�n no permitida�La operaci�n no est� soportada�Operaci�n en curso�La operaci�n se bloquear�a�Alcanzado el l�mite de recursos de `streams'�Control del resultado:�Selecci�n del resultado:�Propietario   : %s
+-�PRIVADO
+-�El paquete no est� instalado�Error de an�lisis: %s��xito parcial�El objeto pasado no es el mismo objeto que hay en el servidor�Permiso denegado�Fallo de alimentaci�n�Fin no esperado de la expresi�n regular�Muestra el contenido de un fichero de base de datos, una entrada por l�nea�Muestra una estad�stica sobre la configuraci�n actual�Muestra m�s mensajes�Muestra la versi�n del programa��xito probable�Probablemente no se encontr��El tiempo de CPU expir��Protocolo no disponible�Error de protocolo�Familia de protocolos no soportada�Protocolo no disponible�Protocolo no soportado�Tipo de protocolo incorrecto para el `socket'�Consulta ilegal para la tabla nombrada�Abandona�error espec�fico de RFS�RPC: procedimiento err�neo para el programa�Fallo RPC en una operaci�n NIS�Programa RPC no disponible�Versi�n del programa RPC incorrecta�la estructura RPC es incorrecta�versi�n de RPC incorrecta�RPC: (c�digo de error desconocido)�RPC: Error de autentificaci�n�RPC: No se pudo descodificar la respuesta�RPC: No se pudieron codificar los argumentos�RPC: Fall� (error no especificado)�RPC: Versiones incompatibles de RPC�RPC: Fallo del asignador de puertos�RPC: Procedimiento no disponible�RPC: Programa no registrado�RPC: Programa no disponible�RPC: La versi�n del programa no coincide�RPC: Error del sistema remoto�RPC: El servidor no puede descifrar los argumentos�RPC: Conseguido�RPC: El tiempo expir��RPC: No se puede recibir�RPC: No se puede enviar�RPC: `Host' desconocido�RPC: Protocolo desconocido�RSA (%d bits)
+-�Se ha usado RTLD_NEXT en una parte del c�digo que no se carg� din�micamente�Lee y visualiza los datos de `profiling' del objeto compartido�Lee datos de configuraci�n de NOMBRE�Sistema de ficheros de s�lo lectura�Se�al de tiempo real %d�La expresi�n regular es demasiado grande�Error de E/S en la m�quina remota�La direcci�n remota ha cambiado�Elimine la contrase�a o haga el fichero no legible por otros.�La reapertura del objeto compartido `%s' fall��Replicado :
+-�Comunicar `bugs' a %s.
+-�Comunicar `bugs' usando el programa `glibcbug' a <bugs@gnu.org>.
+-�Los argumentos de la petici�n son incorrectos�Error del determinador de nombres 0 (ning�n error)�Error interno del determinador de nombres�Se ha evitado un bloqueo de recursos�Recurso perdido�Recurso no disponible temporalmente�Resultados enviados al proceso de `callback'�SHOBJ [DATOSPROF]�SUNYP�Ruta de b�squeda    : %s
+-�Violaci�n de segmento�El servidor est� ocupado, int�ntelo de nuevo�Memoria agotada en el servidor�El servidor rechaz� la credencial�El servidor rechaz� el verificador�No se admite servname para ai_socktype�Establece el nombre del programa�Apagar el servidor�Se�al 0�Operaci�n de `socket' en un `no-socket'�Tipo de `socket' no soportado�El programa provoc� el fin de la conexi�n�Lo siento. Usted no es root
+-�Las definiciones fuente se encuentran en FICHERO�Error de `srmount'�Fallo en la pila�`handle' de fichero NFS en desuso�Comienza N�MERO hilos�Estado            : %s
+-�Parado�Parado (por una se�al)�Parado (requiere entrada de terminal)�Parado (requiere salida por terminal)�Error de tuber�a de `streams'�La estructura necesita una limpieza�Conseguido�Suprime los avisos y los mensajes de informaci�n�Nombres simb�licos de caracteres definidos en FICHERO�Error del sistema�Informaci�n del sistema:�Fallo en la asignaci�n de recursos del sistema�Directorio del sistema para asignaciones de caracteres : %s
+-                            asignaciones de repertorios: %s
+-                            ruta de b�squeda de locales: %s
+-%s�TABLA
+-�Tipo de Tabla       : %s
+-�Fallo temporal en la resoluci�n del nombre�Terminado�El fichero de texto est� ocupado�La siguiente lista contiene todos los conjuntos de caracteres conocidos.
+-Esto no quiere decir necesariamente que todas las combinaciones de estos
+-nombres se puedan usar como par�metros FROM y TO en la l�nea de �rdenes.
+-Un determinado conjunto de caracteres puede aparecer con varios nombres
+-(aliases).
+-Algunos de los nombres no son cadenas normales sino expresiones regulares y
+-pueden corresponderse con una variedad de nombres que pueden darse como
+-par�metros al programa.
+-
+-  �Tiempo de vida : �El temporizador lleg� al final�Demasiados atributos�Demasiados niveles de enlaces simb�licos�Demasiados enlaces�Demasiados ficheros abiertos�Demasiados ficheros abiertos en el sistema�Demasiados procesos�Demasiadas referencias: no se pueden solapar�Demasiados usuarios�`trap' para punto de parada/seguimiento�Barra invertida extra al final `\'�El traductor ha terminado�El otro extremo ya est� conectado�El otro extremo de la conexi�n no est� conectado�Pruebe `%s --help' o `%s --usage' para m�s informaci�n.
+-�Intentando %s...
+-�Tipo : %s
+-�DESCONOCIDO�No se puede autentificar el cliente NIS+�No se puede autentificar el servidor NIS+�No se puede crear la llamada de regreso�No se puede crear el proceso en el servidor�Desconocido (tipo = %d, bits = %d)
+-�Palabra clave %s desconocida en .netrc�Error de NIS desconocido�Base de datos desconocida: %s
+-�Error desconocido�Error desconocido �`Host' desconocido�Objeto desconocido�Opci�n desconocida: %s %s %s�Error del determinador de nombres desconocido�Error del servidor desconocido�Se�al desconocida %d�Error del sistema desconocido�Error desconocido en la llamada a `ypbind()'�( � \( desemparejados�) � \) desemparejados�[ � ^[ desemparejados�\{ desemparejado�Variable no reconocida `%s'�Condici�n urgente de E/S�Modo de empleo:�Modo de empleo: %s nombre_de_variable [ruta]
+-�Modo de empleo: rpcinfo [ -n n�mpuerto ] -u host progrn�m [ numversi�n ]
+-�Se�al definida por el usuario 1�Se�al definida por el usuario 2�Valor demasiado grande para el tipo de datos definido�El temporizador virtual lleg� al final�Resultado salvaje en la ejecuci�n de la orden�La ventana ha cambiado�Escribe los nombres de las asignaciones de caracteres disponibles�Escribe los nombres de los locales disponibles�Escribe los nombres de las categor�as seleccionadas�Escribe los nombres de las palabras clave seleccionadas�Escribe el resultado en el fichero NOMBRE�Escrito por %s.
+-�Tipo de medio err�neo�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�S�, 42 es el significado de la vida�Esta vez s� que lo has roto�La l�nea de continuaci�n de la zona no est� despu�s del tiempo de final
+-de la l�nea anterior�[FICHERO...]�La definici�n `%1$s' no termina con `END %1$s'�`%s' no es un fichero de datos para `profile' correcto para `%s'�`-1' tiene que ser la �ltima especificaci�n en el campo `%s' de la categor�a
+-`%s'�`...' debe usarse �nicamente en las entradas `...' y `UNDEFINED'�Se esperaba `from' despu�s del primer argumento para `collating-element'�La cadena de caracteres `from' en la declaraci�n de elemento de uni�n contiene
+-un car�cter desconocido�No se admite ai_familiy�No se admite ai_socktype�ya est� funcionando�el argumento para <%s> debe ser un �nico car�cter�el argumento para `%s' debe ser un �nico car�cter�auth_none.c - Problema muy grave con autorizaci�n marshall�authunix_create: memoria agotada
+-�Argumento err�neo�propietario incorrecto�Campo FROM vac�o en la l�nea `Link'�Campo TO vac�o en la l�nea `Link'�bloque liberado dos veces
+-�valor de mcheck_status incorrecto, la biblioteca tiene un bug
+-�broadcast: iotcl (lee la configuraci�n del interfaz)�broadcast: iotcl (lee las propiedades del interfaz)�desbordamiento de b�fer�cache_set: no se pudo asignar espacio para un nuevo b�fer rpc�cache_set: fall� la asignaci�n de espacio para el objetivo�cache_set: no se encontr� el objetivo�No se puede determinar la abreviaci�n de zona horaria que se usar� justo
+-despu�s�no se puede reasignar el procedimiento n�mero %d
+-�la llamada a `stat' fall� en el fichero de locales `%s'�no se pudo asignar espacio para los datos del s�mbolo�no se puede crear un descriptor interno�no se pueden crear descriptores internos�no se puede activar el `socket' para aceptar conexiones: %s�no se puede encontrar el preprocesador de C: %s 
+-�no se puede encontrar ning�n preprocesador de C (cpp)
+-�no se pueden manejar peticiones de la versi�n %d, la versi�n
+-actual es %d�no se puede insertar el elemento de uni�n `%.*s' �no se puede insertar el la tabla de resultados�no se puede insertar la nueva definici�n para el s�mbolo de uni�n: %s�no se pueden cargar los datos de `profiling'�no se puede abrir�no se puede abrir `%s'�no se puede abrir el fichero de datos `%s': %s�no se puede abrir el fichero de entrada `%s'�no se puede abrir el fichero de definici�n de locales `%s'�no se puede abrir el fichero de salida�no se puede abrir el fichero de salida `%s'�no se puede abrir el fichero de salida `%s' para la categor�a `%s'�no se puede abrir el `socket': %s�no se pueden procesar las especificaciones de orden�no se puede leer el directorio de tablas de caracteres `%s'�no se puede leer el fichero de configuraci�n; este error es fatal�no se puede leer del cliente�no se puede leer la cabecera de `%s'�No se puede leer el directorio de locales %s�no se puede leer el fichero de locales `%s'�no se puede leer la asignaci�n `%s'�no se pueden leer los datos de estad�stica�no se puede ejecutar stat() sobre el fichero `%s': %s�no se puede escribir en el fichero de salida `%s'�no se puede escribir el resultado: %s�no se pueden escribir las estad�sticas: %s�no se puede escribir al cliente�categor�a de datos reclamada m�s de una vez, no deber�a ocurrir�el car�cter %s'%s' en la clase `%s' debe estar en la clase `%s'�el car�cter %s'%s' en la clase `%s' no debe estar en la clase `%s�el car�cter <SP> no est� definido en la tabla de caracteres�el car�cter `%s' no est� definido cuando se necesit� como valor por defecto�la clase de car�cter `%s' ya fue definida�la tabla de caracteres `%s' ya est� definida�el fichero de tabla de caracteres `%s' no se encontr��clnt_raw.c - Error grave en la secuencia de cabecera�clnttcp_create: memoria agotada
+-�clntudp_create: memoria agotada
+-�clntunix_create: memoria agotada
+-�el elemento de uni�n `%.*s' aparece m�s de una vez: pasando por alto la l�nea�s�mbolo de uni�n `%.*s' aparece m�s de una vez: descartando la l�nea�s�mbolo de uni�n esperado despu�s de `%s'�conexi�n a la direcci�n %s: �se esperaba una constante o un identificador�no se admite la conversi�n de `%s' a `%s'�la conversi�n se ha detenido debido a un problema al escribir el resultado�no se pudo crear un servidor rpc
+-�no se pudo registrar el programa %d versi�n %d
+-�basededatos [clave ...]�no se encontr� el fichero de tabla de caracteres predeterminado `%s'�el indicador de direcci�n en la cadena %d en el campo `era' de la categor�a
+-`%s' no es '+' ni  '-'�el indicador de direcci�n en la cadena %d en el campo `era' de la categor�a
+-`%s' no es un �nico car�cter�nombre de car�cter duplicado `%s'�definici�n duplicada del elemento de uni�n�definici�n duplicada del car�cter `%.*s'�clave duplicada�definici�n de conjunto duplicada�nombre de zona %s duplicado (fichero "%s", l�nea %d)�identificador de mensaje duplicado�n�mero de mensaje duplicado�cadena de caracteres vac�a�nombre de peso vac�o: la l�nea se pasa por alto�enablecache: el cach� ya estaba activado�enablecache: no se pudo crear espacio para el cach��enablecache: no se pudo crear espacio para los datos del cach��enablecache: no se pudo crear espacio para la pila del cach��codificaci�n para el resultado�codificaci�n del texto original�el punto de final para el rango de la elipsis es mayor que el de comienzo�error al cerrar la entrada `%s'�error al cerrar el fichero de salida�error al cerrar el fichero de datos de `profiling'�error cuando se insertaba el elemento de uni�n en la tabla enlazada�error al insertar en la tabla enlazada�error al leer la entrada�se espera un argumento de cadena de caracteres para `copy'�la l�nea de continuaci�n esperada no se encuentra�fallo al cargar el objeto compartido `%s'�fallo al cargar los datos del s�mbolo�no se pudo hacer mmap con el fichero de datos de `profile'�fallo al comenzar el proceso de conversi�n�error al escribir los datos para la categor�a `%s'�fcntl: F_SETFD�el campo `%s' en la categor�a `%s' no est� definido�el campo `%s' en la categor�a `%s' no se ha definido�el fichero `%s' ya existe y podr�a ser sobreescrito
+-�el valor `from-value' del elemento de uni�n ha de ser una cadena de caracteres�fstat ha fallado�inconsistencia al final de la especificaci�n del c�digo de caracteres�inconsistencias al final del n�mero�incongruencias al final del valor de desplazamiento en la cadena %d en el
+-campo `era' de la categor�a `%s'�incongruencias al final de la fecha de comienzo en la cadena %d en el
+-campo `era' de la categor�a `%s'�incongruencias al final de la fecha de parada en la cadena %d en el
+-campo `era' de la categor�a `%s'�genera el grafo de llamadas�genera un `profile' plano con contadores y `ticks'�get_myaddress: ioctl (lee la configuraci�n del interfaz)�getent - obtiene entradas de la base de datos administrativa.�handle_request: petici�n recibida (Versi�n = %d)�el enlace duro fall�, se usar� un enlace simb�lico�hay un enlace duro en alguna parte�El campo CORRECTION en la l�nea de a�o bisiesto es ilegal�Campo Rolling/Stationary ilegal en la l�nea de a�o bisiesto�car�cter ilegal en la cadena�car�cter no v�lido en el fichero: �elemento de uni�n ilegal�definici�n ilegal�especificada una codificaci�n ilegal�secuencia de escape ilegal al final de la cadena de caracteres�secuencia de entrada ilegal en la posici�n %ld�nombres no permitidos para el rango de caracteres�tipodered ilegal :`%s'
+-�n�mero de desplazamiento ilegal en la cadena %d en el campo `era' de la
+-categor�a `%s'�n�mero de conjunto ilegal�fecha de comienzo ilegal en la cadena %d en el campo `era' de la
+-categor�a `%s'�fecha de parada ilegal en la cadena %d en el campo `era' de la
+-categor�a `%s'�l�mite de la implementaci�n: no se permiten m�s de %d clases de caracteres�l�mite de la implementaci�n: no se permiten m�s de %d tablas de caracteres�car�cter o secuencia de desplazamiento incompleta al final del b�fer�fichero formateado incorrectamente�l�nea de entrada de tipo desconocido�error interno (descriptor ilegal)�error interno - se llam� a `addtype' con un `isdst' err�neo�error interno - se llam� a `addtype' con un `ttisgmt' err�neo�error interno - se llam� a `addtype' con un `ttisstd' err�neo�error interno en %s, l�nea %u�desplazamiento UTC inv�lido�formato de abreviaci�n incorrecto�d�a del mes inv�lido�a�o de final inv�lido�a�o bisiesto inv�lido�modo inv�lido para dlopen()�nombre de mes incorrecto�la hora almacenada no es v�lida�a�o de comienzo inv�lido�hora del d�a inv�lida�nombre del d�a de la semana incorrecto�la longitud de la clave en la petici�n es demasiado larga: %Zd�la l�nea de despu�s de la elipsis tiene que contener una definici�n de car�cter�la l�nea posterior a la elipsis no contiene una definici�n para una constante
+-de caracteres�l�nea demasiado larga�lista todos los juegos de caracteres conocidos�fichero de locales `%s', que se usa en una orden `copy', no se encuentra�lstat ha fallado�una l�nea incorrecta no se tendr� en cuenta�fall� la asignaci�n de la tabla de cadenas de cabeceras de secci�n�fall� la asignaci�n de las cabeceras de secci�n�memoria alterada antes del bloque de memoria asignado
+-�memoria alterada pasado el final del bloque de memoria asignado
+-�memoria agotada�memoria agotada
+-�la memoria es consistente, la biblioteca tiene un bug
+-�falta el formato de era en la cadena %d en el campo `era' de la
+-categor�a `%s'�falta el nombre de la era en la cadena %d en el campo `era' de la
+-categor�a `%s'�regla sin nombre�no se ha especificado la codificaci�n original ni la final�netname2user: (b�squeda nis+): %s
+-�netname2user: la entrada DES para %s en el directorio %s no es �nica�netname2user: la entrada LOCAL para %s en el directorio %s no es �nica�netname2user: falta la lista de ids de grupo en `%s'.�netname2user: el nombre principal `%s' es demasiado largo�netname2user: no deber�a tener uid 0�el programa %d no fue registrado nunca
+-�no se ha dado ning�n valor <Uxxxx> o <Uxxxxxxxx>�falta una expresi�n regular correcta para el campo `%s' en la categor�a `%s':
+-%s�ning�n d�a del mes coincide con la regla�no hay definici�n para `UNDEFINED'�no se ha dado un nombre de fichero para los datos de `profiling'
+-y el objeto compartido `%s' no tiene soname�ninguna otra palabra clave debe ser especificada al usar `copy'�no se ha producido ning�n fichero de salida debido a la existencia de avisos�no se ha especificado ninguna asignaci�n de repertorio: no se puede continuar�no se ha especificado ning�n nombre simb�lico�no se ha especificado ning�n nombre simb�lico para el final del rango�no hay ning�n peso definido para el s�mbolo `%s'�no es un fichero regular�configuraci�n nscd:
+-
+-%15d  nivel de depuraci�n del servidor
+-�nscd no est� en ejecuci�n
+-�solamente se permiten ANCHO definiciones despu�s de la definici�n CHARMAP�la codificaci�n original no se ha especificado utilizando `-f'�fichero de salida�pmap_getmaps problema de rpc�poll: fallo de protocolo al configurar el circuito
+-�error del preprocesador�muestra la lista de contadores de ruta y su n�mero de uso�muestra informaci�n sobre el desarrollo�problemas mientras se le�a `%s'�el fichero de datos para `profiling' %s no se corresponde con el
+-objeto compartido `%s'�el programa %lu no est� disponible
+-�el programa %lu versi�n %lu no est� disponible
+-�el programa %lu versi�n %lu est� listo y esperando
+-�rcmd: poll (activando la salida de error est�ndar): %m
+-�rcmd: socket: Se est�n usando todos los puertos
+-�rcmd: write (activando la salida de error est�ndar): %m
+-�registerrpc: memoria agotada
+-�segundo intercalar repetido�el fichero de tabla de caracteres `%s' no se encontr��rpcgen: error de codificaci�n de la lista de argumentos
+-�rpcgen: demasiados defines
+-�rpcinfo: el `host' %s es desconocido
+-�rpcinfo: el servicio `%s' es desconocido
+-�rpcinfo: No se pudo borrar el registro para el programa %s versi�n %s
+-�rpcinfo: el `broadcast' no tuvo �xito: %s
+-�rpcinfo: no se puede comunicar con el asignador de puertos�mismo nombre de regla en varios ficheros�se acabaron los datos mientras se le�a la clave de petici�n: %s�lectura insuficiente mientras se le�a la petici�n: %s�escritura insuficiente en %s: %s�socket: fallo de protocolo al configurar el circuito
+-�los �rdenes `forward' y `backward' son mutuamente excluyentes�la especificaci�n para el orden de peso del s�mbolo de uni�n no tiene sentido�entrada est�ndar�salida est�ndar�la fecha de comienzo es ilegal en la cadena %d del campo `era' de la
+-categor�a `%s'�a�o de comienzo mayor que a�o de final�el a�o de comienzo es demasiado alto para ser representado�el a�o de comienzo es demasiado bajo para ser representado�la fecha de final es ilegal en la cadena %d del campo `era' de la
+-categor�a `%s'�svc_run: - select fall��svc_tcp.c - fallo en la ejecuci�n de `getsockname()' o `listen()'�svc_tcp.c - problema al crear el `socket' tcp�svc_tcp: makefd_xprt: memoria agotada
+-�svc_unix.c - problema al crear el `socket' AF_UNIX�svc_unix.c - fallo en la ejecuci�n de `getsockname()' o `listen()'�svc_unix: makefd_xprt: memoria agotada
+-�svctcp_create: memoria agotada
+-�svcudp_create - fallo en la ejecuci�n de `getsockname'�svcudp_create: memoria agotada
+-�svcudp_create: problemas para crear el `socket'�svcunix_create: memoria agotada
+-�el s�mbolo para el elemento de uni�n para multi-car�cter `%.*s' repite la
+-definici�n de otro elemento�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n
+-de otro elemento�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n
+-de otro s�mbolo�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n
+-de otro s�mbolo�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite otro nombre
+-de s�mbolo en el conjunto de caracteres�error de sintaxis en la definici�n de %s: %s�error de sintaxis en la directiva `order_start'�error de sintaxis en el nombre de clase de car�cter�error de sintaxis en la definici�n de la conversi�n de car�cter�error de sintaxis en la definici�n del orden de uni�n�error de sintaxis en la definici�n de la uni�n�error de sintaxis en una definici�n de categor�a LC_CTYPE�error de sintaxis en la definici�n de una nueva clase de car�cter�error de sintaxis en la definici�n de un nueva tabla de caracteres�error de sintaxis en la definici�n de local para mensajes�error de sintaxis en la definici�n de local para moneda�error de sintaxis en la definici�n de local para n�meros�error de sintaxis en la especificaci�n de orden�error de sintaxis en el pr�logo: %s�error de sintaxis en la definici�n de la asignaci�n: %s�error de sintaxis en la definici�n de local para la hora�error de sintaxis: no est� dentro de una secci�n de definici�n para un local�no se ha especificado la codificaci�n final utilizando `-t'�esta es la primera vez que aparece la definici�n�hora antes de cero�desbordamiento horario�insuficiente n�mero de bytes en la codificaci�n del car�cter�demasiados bytes en la codificaci�n del car�cter�demasiadas clases de caracteres definidas�demasiados segundos intercalares�demasiados tipos de hora local���demasiadas transiciones?!��demasiados pesos!�demasiadas abreviaturas de zona horaria, o demasiado largas�hay inconsistencias al final de la l�nea�dificultades para responder al programa %d
+-�no est�n permitidas dos l�neas en una misma fila con `...'�tecleado un �nico a�o�no se puede asignar espacio para el b�fer de entrada�no se pueden liberar los argumentos�sin definir�car�cter desconocido `%s'�car�cter no reconocido en el campo `%s' de la categor�a `%s'�la directiva de uni�n es desconocida�directiva desconocida `%s': l�nea pasada por alto�error de iconv() desconocido %d�conjunto `%s' desconocido�s�mbolo desconocido `%.*s': l�nea descartada�zona sin reglas�mensaje sin terminar�cadena de caracteres sin terminar�constante de caracteres sin terminar�nombre simb�lico sin terminar�nombre de peso sin terminar�el l�mite superior del rango no es menor que el l�mite inferior�modo de empleo:  %s fichero_de_entrada
+-�uso de 2/29 en un a�o no bisiesto�el valor para %s tiene que ser un n�mero entero�el valor para <%s> debe estar entre 1 y 4�el valor para el campo `%s' en la categor�a `%s' no debe estar vac�o�el valor de <mb_cur_max> tiene que ser mayor que el valor de <mb_cur_min>�el valor del campo `int_curr_symbol' en la categor�a `LC_MONETARY' no se
+-corresponde con un nombre v�lido en ISO 4217�el valor del campo `int_curr_symbol' en la categor�a `LC_MONETARY' tiene
+-una longitud err�nea�los valores para el campo `%s' en la categor�a `%s' deben ser menores
+-que 127�al aceptar la conexi�n: %s�al asignar espacio para la entrada en el cach��al asignar espacio para la entrada en la tabla `hash'�al asignar espacio para la copia de la clave�al abrir el fichero de cat�logo antiguo�al preparar la salida�al leer el fichero de datos�al ejecutar `stat' sobre el fichero de datos de `profiling'�al escribir la base de datos�escritura incompleta�puede ser modificado por otros adem�s del propietario�n�mero incorrecto de argumentos�n�mero incorrecto de campos en la l�nea de bisiesto (Leap)�n�mero incorrecto de campos en la l�nea de enlace (Link)�n�mero incorrecto de argumentos en la l�nea de regla (Rule)�n�mero de campos incorrecto en la l�nea de continuaci�n de zona (Zone)�n�mero de campos incorrecto en la l�nea de zona (Zone)�xdr_reference: memoria agotada
+-�xdrrec_create: memoria agotada
+-�yp_update: no se puede convertir el nombre del `host' a nombre de red
+-�yp_update: no se puede encontrar la direcci�n del servidor
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/fr.mo glibc-2.1.3/po/fr.mo
+--- ../glibc-2.1.3/po/fr.mo	1999-08-18 18:02:29.000000000 -0700
++++ glibc-2.1.3/po/fr.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,486 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������;��	������E������Y���T���l���Y�������>������@���Z����������������������������������������������� ������:������O������$������:���(���L���(���u����������C�����������������������������/������H������e������~���������� �������������� ����������������3������S���)���k������������������������
+-��������������>�������>���"���M���a���4�������%����������
+-���+���*���%���V������|���A�������8�������8������8���H����������'�������/��������������������*���*������U������r���,�������M����������
+-���(���#���(���L���(���u���(�������(��������������+������1���4���&���f�����������������0��������������(������/���<���0���l���!�������)��������������2���������9������W������n������������������<���@���$���}���(�������9�������������)������	���@���D���J����������T�������)�������*��� ���
���K���7���Y���7�������0���������������������������0���������F���6���\���1����������������������������)���	���E���3������y����������
���������������������#���������������� ���,���5���3���b�����������������+��������������
������������������
���,���0���:���>���k���2���������������������������$���9���6���^���3�������=�������D���������L���D���k���+�������5�������.������<���A���4���~���:�������%������������� ���2������S������q���/������� �������!�������]�������i���Y����������-�������4������	���8���>���B���'����������������������L�������C�������C���B����������5����������������������������.����������������7������T���+���s���������� ������������������������
+-���$���(���V���M���F�������P����������<���
+-���[������f������n���3��������������U�������0���,���4���]���A���������������������=������P���F����������3��������������,����������(���0���A������r�����������������9��������������������)����������A���������'������*���B������m������������������������)�������-�������������,���;���4���h���,�������8�������4������$���8���)���]����������\�������
+-���������������������������&���,������S���%���d���'�������7������������������������
���*��� ������K������b������x�����������������3��������������������������$���9������^������z���"��������������"��������������C���
+-���(���N������w������������������������ ����������	���������$���*���
+-���O������Z������k���?���r����������������������������������������$������=������\������p���-���}���(�������)��������������}�������������0������������������������	��� ���������<������U���$���k���!�������9����������������������������M�������/���N������~���*�������1�����������������������	���'���������>���&���^�������������������������������;����������1������N������n��� �������-�������#����������������������:������Q���-���j�������������������������������>�������&���3���,���Z���0�������+��������������&������!���)���1���K������}���"�������2�������������� �������#���������;���
+-���S���+���^������������������������+�������4���������7������C������W������g����������&�������/�����������������������(������@��� ���^���1��������������������������������������������������4���/���C������s����������(�������G�������6���������H��� ���c�����������������<�������%�������������#���#������G������`���(���w���&���������������������#������� ���
������.��� ���K���%���l������������������������ �������#������!���(���"���J���!���m���&�������&�������&�������/������$���4���.���Y����������(�������'�������*����������������"������9���C���H���;�������(�������3����������%��� ���=���'���^���)�������Q�������,��������/��!���>��Q���`��(������,����������&���%����L�'���]�,�������������������������!������������7�#���W�/���{����������������/���������1���3����e�=�������������������� �������#����;����B����Q����o� �����%����������7�����;�������P����_�(���t����������9����@�*���Z�������������������������������$�����
��������
+-	�(���#	����L	�%���^	�����	�%����	� ����	�����	�&����	�+���
+-�>���A
+-�����
+-�
+-����
+-�����
+-�'����
+-�(����
+-� ����
+-�.�������D����d��������������������������
�����������������1����K����]����u������������������������
����
����6
�+���=
�=���i
�����
�����
�1����
�$����;���:����v�6�����/�����-�����,���!�&���N����u���������������������%�����-�����n���������5�����4�����A�����H���:�@�����T������������1����J�3���\�3�����-�����!������������&�.���;�,���j������;�����;�����C���&����j�8�����)����������T����-���W�:�����(�����$�����'����:���6�'���q�)�����P�����0����;���E�F�����2�������������
+-�5����'���T�0���|�#�����(�����:��������5�1���T�>�����8��������������>���4�.���s�*�����(�����.�����4���%�"���Z�%���}������J�����@����G���M�6�����B�����&����%���6�5���\�5����� ����� �����!���
+-�F���,�F���s�*�����"�����#����4���,�A���a������2����������2��� �h���A �l���� �"���!�4���:!�.���o!�����!� ����!�5����!�(���"����/"����N"� ���h"�����"�&����"�1����"�3���#����6#����L#�>���g#�4����#�0����#�>���$�O���K$�3����$�%����$�+����$�+���!%�+���M%�)���y%�A����%�-����%�6���&����J&�-���Y&�%����&�1����&�@����&���� '�4���;'����p'�a����'�S����'�S���B(�����(�N����(�?����)�D���@)�,����)�?����)�����)�9���*�>���B*�-����*�!����*�����*�����*����+�5���+�1���S+�,����+�����+�Y����+����%,�G���;,�G����,�I����,�H���-�@���^-�����-�����-�$����-�G���.�I���J.�I����.� ����.�����.����/����</����R/����h/�����/�����/�����/�����/�����/�����/�:���0�D���W0�Z����0�����0�)���	1�H���31����|1�����1�6����1�)����1�%���2�,���72����d2����t2�6����2�N����2�?���3����K3�3���Z3�(����3�G����3�I����3�E���I4�.����4�+����4�+����4�,���5�C���C5�*����5�%����5�Y����5�D���26�E���w6�6����6�����6�8���7�(���I7����r7�7����7�����7�^����7�3���E8����y8� ����8�:����8�����8�A����8�(���A9�#���j9�R����9�'����9�6���	:�8���@:�)���y:�*����:�-����:�����:�$���;�5���?;�5���u;�����;� ����;�#����;�I���
<� ���W<�0���x<�)����<�<����<�7���=����H=�=���f=�H����=�Q����=����?>����O>�J���_>�-����>�1����>�1���
+-?�J���<?�����?�J����?�0����?�&���!@�7���H@�K����@�'����@�����@�B���A����WA�-���wA� ����A�w����A�y���>B�z����B�w���3C������C�.���3D�1���bD�?����D�?����D�?���E�4���TE�G����E�H����E�G���F�9���bF�E����F�J����F�;���-G�!���iG�D����G�L����G�J���H�.���hH� ����H�����H�����H�0����H�,��� I�,���MI����zI�7����I�����I�����I�8���J�%���:J�%���`J�>����J�����J�+����J�#���	K����-K����6K�6���MK�"����K�&����K�����K�����K�%����K����#L����3L����EL�!���WL����yL�����L�T����L�����L�.���M�$���IM�2���nM�J����M�N����M�~���;N�Z����N�M���O�&���cO�+����O�7����O�'����O�1���P�#���HP�(���lP�B����P�0����P����	Q�7���Q����UQ�4���rQ�4����Q�4����Q�D���R�4���VR�����R�����R�H����R�0���S��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: GNU libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-08-13 08:52-0500
+-Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA>
+-Language-Team: French <traduc@traduc.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�		Droits d'acc�s : �		Attributs     : �	%s [-abkCLNTM][-Dname[=valeur]] [-i taille] [-I [-K secondes]] [-Y chemin] fichier
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o fichier_de_sortie] [fichier_d_entr�e]
+-�	%s [-n id_r�seau]* [-o fichier_de_sortie] [fichier_d_entr�e]
+-�	%s [-s type_r�seau]* [-o fichier_de_sortie] [fichier_d_entr�e]
+-�		Droits d'acc�s : �	Donn�es entr�es de type %s
+-�	Nom        : %s
+-�	Cl� publique : �	Type         : %s
+-�	Adresses universelles (%u)
+-�	[%d]	Nom           : %s
+-�	[%u] - [%u octets] �
+-%s m�moire cache:
+-
+-%15s  m�moire cache est activ�e
+-%15Zd  taille sugg�r�e
+-%15ld  dur�e de vie en secondes pour les entr�es positives
+-%15ld  dur�e de vie en secondes pour les entr�es n�gatives
+-%15ld  succ�s de rep�rage sur les entr�es positives
+-%15ld  succ�s de rep�rage sur les entr�es n�gatives
+-%15ld  �chec de rep�rage sur les entr�es positives
+-%15ld  �chec de rep�rage sur les entr�es n�gatives
+-%15ld%% taux de rep�rage
+-%15s  v�rifier /etc/%s pour les changements
+-�
+-Membres du groupe :
+-�
+-Dur�e de vie  : �       rpcinfo -b no_program no_version
+-�       rpcinfo -d no_program no_version
+-�       rpcinfo -p [ h�te ]
+-�       rpcinfo [ -n no_de_port ] -t h�te no_program [ no_version ]
+-�     non�     oui�    Longueur des donn�es = %u
+-�    Membres explicites:
+-�    Non-membres explicites:
+-�    Membres implicites:
+-�    Non-membres implicites:
+-�    Pas de membre explicite
+-�    Pas de non-membre explicite
+-�    Pas de membre implicite
+-�    Pas de non-membre implicite
+-�    Pas de membre r�cursif
+-�    Pas de non-membre r�cursif
+-�    Membres r�cursifs:
+-�   program no_version protocole  no_port
+-�  ou: � (r�gles de "%s", ligne %d)� [OPTION...]� compl�t�
+-�"%s", ligne %d: %s�La ligne "Zone %s" et l'option -l sont mutuellement exclusifs.�La ligne "Zone %s" et l'option -p sont mutuellement exclusifs.�"fichier_d_entr�e" est requis pour la g�n�ration du gabarit des indicateurs.
+-�%.*s: le param�tre ARGP_HELP_FMT requiert une valeur�%.*s: param�tre ARGP_HELP_FMT inconnu�%s est dans une zone sans r�gle�%s%s%s:%u: %s%s l'assertion `%s' a �chou�.
+-�%s%s%s:%u: %s%s erreur impr�vue: %s.
+-�%s%ssignal inconnu %d.
+-�%s: %d n'a pas fait correctement l'expansion de la valeur sign�e
+-�%s: <mb_cur_max> doit �tre plus grande que <mb_cur_min>
+-�%s: �chec du pr�processeur C -- code de terminaison: %d
+-�%s: �chec du pr�processeur C -- code de terminaison: %d
+-�%s: ne peut cr�er %s: %s
+-�%s: ne peut cr�er le r�pertoire %s: %s
+-�%s: ne peut �tablir un lien entre %s et %s: %s
+-�%s: ne peut ouvrir %s: %s
+-�%s: ne peut enlever %s: %s
+-�%s: erreur lors de la fermeture de %s: %s
+-�%s: erreur de lecture de %s
+-�%s: erreur d'�criture de %s
+-�%s: erreur d'�criture sur la sortie standard�%s: ligne de type `Leap' dans un fichier qui n'a pas
+-de d�lai en secondes %s
+-�%s: m�moire �puis�e: %s
+-�%s: option -L sp�cifi�e plus d'une fois
+-�%s: option -d sp�cifi�e plus d'une fois
+-�%s: option -l sp�cifi�e plus d'une fois
+-�%s: option -p sp�cifi�e plus d'une fois
+-�%s: option -y sp�cifi�e plus d'une fois
+-�%s: trop de param�tres
+-�%s: ne peut obtenir la date de modification�%s: la commande �tait '%s', le r�sultat �tait %d
+-�%s: erreur de l'automate � �tats finis�%s: option ill�gale -- %c
+-�%s: option invalide -- %c
+-�%s: l'option `%c%s' ne permet pas de param�tre.
+-�%s: l'option `%s' est ambigu�
+-�%s: l'option `%s' requiert un param�tre
+-�%s: l'option `--%s' ne permet pas de param�tre
+-�%s: l'option `-W %s' ne permet pas de param�tre
+-�%s: l'option `-W %s' est ambigu�
+-�%s: l'option requiert un param�tre -- %c
+-�%s: la sortie �craserait %s
+-�%s: panique: valeur %d de type `l_value' invalide
+-�%s: fin pr�matur�e du fichier�%s: incapable d'ouvrir�%s: option non reconnue `%c%s'
+-�%s: option non reconnue `--%s'
+-�%s: usage: %s [ -s ] [ -v ] [ -l temps_local ] [ -p r�gles_posix ] [ -d r�pertoire ]
+-	[ -L secondes_�coul�es ] [ -y type_ann�e ] [ fichier ... ]
+-�%s: usage: %s [ -v ] [ -c seuil ] nom_du_fuseau_horaire ...
+-�%s: lors de l'�criture sur la sortie�(ERREUR DU PROGRAMME) Version inconnue!?�(ERREUR DU PROGRAMME) L'option aurait d�e �tre reconnue!?�(Objet inconnu)
+-�(erreur inconnue d'authentification - %d)�(inconnu)�*** Le fichier `%s' a �t� �lagu�: aucune analyse d�taill�e possible
+-�*entr�e standard*�-o FICHIER_DE_SORTIE [FICHIER_D_ENTR�E]...
+-[FICHIER_DE_SORTIE [FICHIER_D_ENTR�E]...]�La section .lib dans a.out est corrompue.�; version basse = %lu, version haute = %lu�; pourquoi = �<%s> et <%s> sont des noms ill�gaux pour un intervalle.�Le caract�re <SP> ne doit pas �tre dans la classe `%s'.�Le caract�re <SP> n'est pas dans la classe `%s'.�?�Abandon�Droits d'acc�s :�Acc�s d'une librairie partag�e qui est corrompue�Adresse d�j� utilis�e�Famille d'adresses non support�e pour le nom de l'h�te�Famille d'adresses non support�e par le protocole�Erreur d'annonce�Minuterie d'alerte�Liste de param�tres trop longue�Tentative de retrait d'une table non vide�Tentative d'�dition de liens � partir de trop de librairies partag�es�Succ�s d'authentification�Erreur d'authentification�OBJET ERRON�
+-�Mauvaise adresse�Mauvais descripteur de fichier�Mauvais format du fichier de fontes�Message invalide�Appel syst�me erron��Mauvaise valeur pour l'indicateur `ai_flags'�Doit se conformer de fa�on stricte � la norme POSIX�Valeur binaire
+-�Bloc de p�riph�rique requis�Probl�me de scrutation lors de la diffusion�Relais bris� (pipe)�Erreur du bus�CDS�Temps UCT limite expir��Cache expir�e�Ne peut acc�der � la librairie partag�e demand�e�Ne peut �tablir un lien avec le serveur qui dessert ce domaine�Ne peut communiquer avec le convertisseur de ports�Ne peut communiquer par ypbind�Ne peut communiquer par ypserv�Ne peut allouer de la m�moire�Ne peut attribuer l'adresse demand�e�Ne peut cr�er un socket pour une diffusion de type RPC�Ne peut ex�cuter une librairie partag�e directement�Ne peut avoir plus d'un fichier de g�n�ration de s�maphores!
+-�Ne peut recevoir l'accus� r�ception � la requ�te faite par diffusion�Ne peut enregistrer le service�Ne peut transmettre suite � la fermeture du noeud final de transport�Ne peut transmettre le paquet par diffusion�Ne peut initialiser l'option `SO_BROADCAST' du socket�Ne peut sp�cifier plus d'un fichier d'entr�e!
+-�Ne utiliser le s�maphore `netid' avec le s�maphore `inetd'!
+-�Ne peut utiliser le s�maphore `netid' sans `TIRPC'!
+-�Ne peut utiliser la table des s�maphores avec `newstyle'!
+-�Num�ro de canal en dehors des limites�Caract�re de s�paration : %c
+-�Le processus `enfant' a termin�.�Identit� du client peu fiable�Colonnes            :
+-�Erreur de communication lors de la transmission�Compiler la sp�cification locale�L'ordinateur a achet� la ferme...�Le calcul de la taille de la table des classes de caract�res
+-peut prendre un certain temps...�Le calcul de la taille de la table pour le fusionnement des informations
+-peut prendre un certain temps...�Connexion refus�e�Connexion r�-initialis�e par le correspondant�Connexion termin�e par expiration du d�lai d'attente�Poursuite�Conversion de l'encodage des fichiers d'un encodage � l'autre.�Conversion des caract�res en minuscules�Copyright � %s Free Software Foundation, Inc.
+-Ce logiciel est gratuit; voir les sources pour les conditions de
+-reproduction. AUCUNE garantie n'est donn�e; tant pour des raisons
+-COMMER�IALES que pour R�PONDRE � UN BESOIN PARTICULIER.
+-�Ne peut cr�er le journal "%s"�Cr�ation du NOM du fichier d'en-t�te C contenant les d�finitions de symboles�Cr�er la sortie m�me si des messages d'avertissement sont affich�es�Cr�er une base de donn�es DB simple � partir des entr�es textuelles�Date de cr�ation : %s�Entr�e DES pour le nom de r�seau %s n'est pas unique
+-�R�PERTOIRE
+-�DNANS�DNS�La base de donn�es de la table est inexistante�La base de donn�es est occup�e.�Droits d'acc�s par d�faut :
+-�Adresse de destination requise�Le p�riph�rique n'est pas de type `stream'.�P�riph�rique non configur��P�riph�rique ou ressource occup��Diffie-Hellmann (%d bits)
+-�R�pertoire    : %s
+-�Le r�pertoire n'est pas vide.�D�bordement du quota d'espace disque�Ne pas cloner le processus par fork() et ne pas afficher de message sur le tty courant�Ne pas afficher de message lors de la g�n�ration de la base de donn�es�Ne pas utiliser le catalogue existant, forcer la g�n�ration d'un nouveau fichier�Le domaine n'est pas d�limit�.�Trappe EMT�ENTR�E
+-�Donn�es encrypt�es
+-�Mauvais appariement de type des entr�es de la table�Erreur dans le sous-syst�me RPC�Erreur lors de l'acc�s au fichier de d�marrage � froid de NIS+. NIS+ est-il install�?�Erreur provenant d'une erreur syst�me inconnue: �Erreur lors d'�change par la proc�dure de callback()�Erreur: le fichier .netrc est lisible par tous les autres usagers�L'�changeur est plein.�Erreur de format pour exec()�ERREUR FATALE: le syst�me ne peut d�finir `_POSIX2_LOCALEDEF'�FICHIER contient la table d'adressage des noms symboliques vers les valeurs UCS4��chec (erreur non sp�cifi�e)�Le descripteur du fichier est dans un mauvais �tat.�Le fichier existe.�Erreur de verrou bloquant l'acc�s au fichier�Nom de fichier trop long�D�bordement de la taille permise pour un fichier�Fichier trop gros�Cha�ne Premier/Suivant bris�e�Exception en point flottant�Resynchronisation compl�te est requise pour ce r�pertoire�Fonction non implant�e�GROUPE
+-�Rebut dans le param�tre ARGP_HELP_FMT: %s�G�n�rer le catalogue de messages.\vSi le FICHIER_D_ENTR�E est -, l'entr�e est lue � partir de l'entr�e standard. Si le FICHIER_DE_SORTIE
+-est -, la sortie est affich�e sur la sortie standard.
+-�Erreur syst�me g�n�rique�Trouver l'information locale sp�cifique�Donner un court message expliquant l'usage�Donner cette liste d'aide�Erreur gratuite�Groupe         : %s
+-�Groupe de s�maphores :�Entr�e de groupe pour le groupe "%s.%s":
+-�Raccrocher apr�s N secondes (3600 par d�faut)�Fin de la connexion (raccroch�)�N'a pas trouv� "%d" dans la cache du groupe!�N'a pas trouv� "%d" dans la cache des mots de passe!�N'a pas trouv� "%s" dans la cache du groupe!�N'a pas trouv� "%s" dans la cache de la liste des h�tes!�N'a pas trouv� "%s" dans la cache des mots de passe!�L'h�te cible est arr�t� ou en panne.�Erreur de rep�rage du nom de l'h�te cible�E/S possible�FICHIER_D_ENTR�E FICHIER_DE_SORTIE
+--o FICHIER_DE_SORTIE FICHIER_D_ENTR�E
+--u FICHIER_D_ENTR�E�Trappe IOT�IVY�Identificateur �limin��Instruction ill�gale�Objet ill�gal pour ce type d'op�ration�Rep�rage ill�gal�Type de fichier ou format inappropri��Ioctl() inappropr� pour un p�riph�rique�Op�ration inappropri�e pour un processus d'arri�re-plan�Requ�te d'information�Information:�Fichiers d'entr�e:�Sp�cification des formats d'entr�e/sortie:�Erreur d'entr�e/sortie�Erreur interne de NIS�Erreur interne de ypbind�Interruption�Appel syst�me interrompu�Appel syst�me interrompu, il aurait d� �tre relanc��Objet invalide pour l'op�ration�Param�tre invalide�R�f�rence arri�re invalide�Nom de classe de caract�res invalide�Identit� du client invalide�V�rificateur du client invalide�Caract�re de fusionnement invalide�Contenu invalide de \{\}�Lien crois� de p�riph�que invalide��change invalide�Cha�ne multi-octets ou �tendue de caract�res invalide ou incompl�te�Expression r�guli�re pr�c�dente invalide�Fin d'intervalle invalide�Expression r�guli�re invalide�Code de requ�te invalide�Descripteur de requ�te invalide�V�rificateur du serveur invalide�Dalot invalide�est un r�pertoire�est un type de fichier nomm� (named)�Kerberos.
+-�Processus arr�t��LIENS
+-�Entr�e LOCALE du UID %d dans le r�pertoire %s n'est pas unique
+-�Niveau 2 en halte�Niveau 2 non synchronis��Niveau 3 en halte�Niveau 3 r�initialis��Lien pointe sur un nom ill�gal�Le lien a �t� endommag�.�Num�ro du lien hors intervalle�Type d'objet li� : �Li�s � : %s
+-�Le nom du domaine local n'est pas initialis�.��chec d'allocation de ressources locales�La machine cible n'est pas sur le r�seau.�Nom mal compos� ou nom ill�gal�Les param�tres obligatoires ou optionnels pour les options de formes longues
+-le sont aussi pour les options de forme courtes.�Serveur ma�tre :
+-�Serveur ma�tre occup�, vidange compl�te report�e��chec d'allocation m�moire�M�moire �puis�e�Message trop long�Attribut manquant ou mal compos��Date de modification: %s��chec de modification��chec de l'op�ration de modification�Format de sortie de modification:�Tentative de connexion par des noeuds multiples de relais�NOM�NOM
+-[-a|-m]�NIS�Non concordance de la version client/serveur NIS - ne peut fournir le service�La table de la base de donn�es NIS est erron�e.��chec de l'op�ration NIS+�Les serveurs NIS+ ne sont pas accessibles.�Le service NIS+ n'est pas disponible ou install�.�PAS D'OBJET
+-�NUM�RO�Nom  : '%s'
+-�`Daemon' de la cache du service de noms�Nom pas desservi par ce serveur�Le nom n'est pas unique sur le r�seau.�Nom ou service inconnu�Nom entr�e n'est pas unique�Objet nomm� n'est pas rep�rable�Besoin d'un authentificateur�Le r�seau a rompu la connexion lors de la r�initialisation.�Le r�seau ne fonctionne pas.�Le r�seau n'est pas accessible.�Aucune structure CSI disponible�Aucun s�maphore XENIX disponible�Aucune adresse associ�e avec le nom de l'h�te�Aucune adresse associ�e avec le nom�Aucune `anode' disponible�Aucun espace tampon disponible�Aucun processus enfant�Aucune donn�e disponible�Aucun espace disque disponible sur le serveur�Aucun verrou disponible�Pas de concordance�Aucun medium trouv��Aucun message du type d�sir��Aucun autre enregistrement dans la table de la base de donn�es�Aucune expression r�guli�re pr�c�dente�Aucun programme enregistr� sur l'h�te cible
+-�Aucun chemin d'acc�s pour atteindre l'h�te cible�Aucun espace disponible sur le p�riph�rique�Aucun p�riph�rique de ce type�Aucun fichier ou r�pertoire de ce type�Cette cl� n'est pas dans la table�Cette table n'est pas dans le domaine du serveur.�Aucun processus de ce type�Espace des noms non-NIS+ rencontr���chec non r�cup�rable lors de la r�solution du nom�Aucun.
+-�Pas rep�r�, aucun nom de ce type�Aucun fichier de type `XENIX named'�N'est pas un r�pertoire�Pas rep�r��N'est pas un serveur ma�tre pour ce domaine�N'est pas le propri�taire�Nombre de colonnes  : %d
+-�Nombre d'objets   : %u
+-�Le param�tre num�rique est hors du domaine.�Le r�sultat num�rique est en dehors de l'intervalle.�Objet #%d:
+-�Nom de l'objet: %s
+-�Type d'objet  :�L'objet est t�l�-accessible.�Objet ayant le m�me nom existe�Nombre impair de caract�res apostrophe�Seul ROOT est autoris� � utiliser cette option!�Op�ration d�j� en cours�Op�ration non permise�Op�ration non support�e�Op�ration maintenant en cours�L'op�ration pourrait se bloquer.�Aucune autre ressource de type streams disponible�Contr�le de sortie:�S�lection de sortie:�Propri�taire  : %s
+-�PRIV�
+-�Le package n'est pas install�.�Erreur d'analyse syntaxique: %s�Succ�s partiel�L'objet fourni n'est pas le m�me sur le serveur�Permission non accord�e�Panne d'alimentation�Fin pr�matur�e de l'expression r�guli�re�Afficher le contenu du fichier de base de donn�es, une entr�e par ligne�Afficher les statistiques de la configuration courante�Afficher d'autres messages�Afficher la version du programme�Succ�s probable�Probablement pas rep�r��Expiration de la minuterie durant l'�tablissement du profile�Pilote du protocole n'est pas attach��Erreur de protocole�Famille de protocoles non support�e�Protocole non disponible�Protocole non support��Mauvais type pour un socket de protocole�Requ�te ill�gale pour la table `named'�Quitter�Erreur sp�cifique � `RFS'�Mauvaise proc�dure RPC du programme��chec RPC durant l'op�ration NIS�Programme RPC non disponible�Version de programme RPC erron�e�La d�claration struct RPC est erron�e�Mauvaise version RPC�RPC: (code d'erreur inconnu)�RPC: erreur d'authentification�RPC: ne peut d�coder le r�sultat�RPC: ne peut encoder les param�tres�RPC: �chec (erreur non sp�cifi�e)�RPC: versions incompatibles de RPC�RPC: �chec de conversion de ports�RPC: la proc�dure n'est pas disponible�RPC: le programme n'est pas enregistr��RPC: le programme n'est pas disponible�RPC: non concordance de programme ou de version�RPC: erreur syst�me sur l'h�te cible�RPC: le serveur ne peut d�coder les param�tres�RPC: succ�s�RPC: expiration du d�lai de la minuterie�RPC: incapable d'effectuer la r�ception�RPC: incapable d'effectuer la transmission�RPC: h�te inconnu�RPC: protocole inconnu�RSA (%d bits)
+-�Le `RTLD_NEXT' utilis� dans le code n'est pas charg� dynamiquement.�Lire et afficher les donn�es partag�es d'objet de profilage�Lire les donn�es de configuration du NOM�Syst�me de fichiers accessible en lecture seulement�Signal de Temps-R�el %d�Expression r�guli�re trop grosse�Erreur d'entr�e/sortie sur l'h�te cible�L'adresse de l'h�te cible a �t� modifi�e.�Retirer le mot de passe ou rendre les fichiers illisibles pour les autres usagers��chec de r�ouverture de l'objet partag� `%s'�Duplication :
+-�Rapporter toutes anomalies � %s.
+-�Rapporter toutes anomalies via le script `glibcbug' � l'adresse:
+-<bugs@gnu.org>.
+-�Le param�tre de la requ�te est invalide.�Code d'erreur 0 du `resolver' (pas d'erreur)�Erreur interne du `resolver'�Blocage �vit� des acc�s aux ressources�Ressource perdue�Ressource temporairement non disponible�R�sultats transmis � la proc�dure callback()�SHOBJ [PROFDATA]�SUNYP�Chemin de recherche : %s
+-�Erreur de segmentation�Serveur occup�, essayer plus tard�M�moire du serveur �puis�e�Le serveur a rejet� l'identit�.�Le server a rejet� la v�rification.�Servname() n'est pas support�e pour ai_socktype�Initialiser le nom du programme�Arr�ter le serveur�Signal 0�Op�ration de type socket sur un type non socket�Type de socket non support��Le logiciel a provoqu� l'abandon de la connexion.�D�sol�. Vous n'�tes pas ROOT
+-�Les d�finitions des sources ont �t� rep�r�es dans le FICHIER.�Erreur srmount()�Erreur sur la pile�Panne d'acc�s au fichier NFS�D�marrage du NOMBRE de `threads'�Statut            : %s
+-�Arr�t��Signal d'arr�t�Arr�t� (via l'entr�e sur tty)�Arr�t� (via la sortie sur tty)�Erreur de relais de type streams�La structure a besoin d'un nettoyage.�Succ�s�Supprimer les messages d'avertissement et d'information�Les noms symboliques des caract�res d�finis dans le FICHIER�Erreur syst�me�Information syst�me:��chec d'allocation de ressources syst�me�R�pertoire syst�me de la table des caract�res : %s
+-                   de la table des r�pertoires: %s
+-                   du chemin des localisations: %s
+-%s�TABLE
+-�Type de table       : %s
+-��chec temporaire dans la r�solution du nom�Compl�t��Fichier texte occup��La liste suivante contient tous les jeux des codes de caract�res connus. Ceci
+-ne signifie pas n�cessairement que toutes les combinaisons de ces noms peuvent
+-�tre utilis�es dans les param�tres FROM et TO des commandes. Un jeu de codes de
+-caract�res peut �tre affich� avec diff�rents noms (aliases).
+-Quelques uns des noms ne contiennent pas de cha�nes ordinaires mais plut�t
+-des expressions r�guli�res qui concordent avec une vari�t� de noms qui
+-peuvent �tre pass�s en param�tres au programme.
+-
+- �Dur�e de vie restante : �Expiration de la minuterie�Trop d'attributs�Trop de niveaux de liens symboliques�Trop de liens�Trop de fichiers ouverts�Trop de fichiers ouverts dans le syst�me�Trop de processus�Trop de r�f�rences: ne peut segmenter�Trop d'usagers�Trappe pour point d'arr�t et de trace�Barre oblique inverse en suffixe�Panne du traducteur�Noeud final de transport d�j� connect��Noeud final de transport n'est pas connect��Pour en savoir davantage, faites: `%s --help ou `%s --usage'.
+-�On tente %s...
+-�Type : %s
+-�INCONNU�Incapable d'authentifier le client NIS+�Incapable d'authentifier le serveur NIS+�Incapable de cr�er un callback()�Incapable de cr�er un processus sur le serveur�Inconnu (type = %d, bits = %d)
+-�Mot cl� inconnu %s dans .netrc�Code d'erreur NIS inconnu�Base de donn�es inconnue: `%s'
+-�Erreur inconnue�Erreur inconnue �H�te inconnu�Objet inconnu�Option inconnue: %s %s %s�Erreur inconnue du `resolver'�Erreur du serveur inconnu�Signal inconnu %d�Erreur syst�me inconnue�Erreur inconnue de ypbind��chec du pairage de ( ou de \(��chec du pairage de ) ou de \)��chec du pairage de [ ou de [^��chec du pairage de \{�Variable non reconnue `%s'�Condition d'E/S urgente�Usage:�Usage: %s nom_de_variable [chemin_d_acc�s]
+-�Usage: rpcinfo [ -n no_port ] -u h�te no_prog [ no_version ]
+-�Signal #1 d�fini par l'usager�Signal #2 d�fini par l'usager�Valeur trop grande pour le type d�fini de donn�es�Expiration de la minuterie virtuelle�R�sultat anarchique r�sultant de l'ex�cution de la commande�La fen�tre a chang�e.��criture des noms disponibles des tables de caract�res��criture des noms disponibles des localisations��criture des noms s�lectionn�s des cat�gories��criture des noms s�lectionn�s des mots cl�s��criture sur la sortie dans le FICHIER��crits par %s.
+-�Mauvais type de medium�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Oui, 42 est la cl� du sens de la vie.�Vous avez vraiment tout g�cher cette fois-ci.�Temps final de la ligne de continuation du fuseau horaire est ant�rieur
+-au temps final de la ligne pr�c�dente.�[FICHIER...]�`%1$s' la d�finition ne se termine pas par `END %1$s'�`%s' est un fichier de profilage incorrect pour `%s'�`-1' doit �tre la derni�re entr�e du champ `%s' de cat�gorie `%s'�`...' doit �tre utilis� seulement avec les entr�es `...' et  `UNDEFINED'�`from' attendu apr�s le premier param�tre de `collating-element'�La cha�ne `FROM' d�clarant un �l�ment de fusionnement contient un caract�re inconnu.�ai_family non support�e�ai_socktype non support��d�j� en ex�cution�Le param�tre de <%s> doit �tre un caract�re simple.�Le param�tre de `%s' doit �tre un caract�re simple.�auth_none.c - probl�me fatal de mise en ordre�authunix_create: m�moire �puis�e
+-�Mauvais param�tre�Mauvais propri�taire�Champ `FROM' vide dans la ligne de type `Link'�Champ `TO' vide dans la ligne de type `Link'�Bloc lib�r� deux fois
+-�Statut de `mcheck_status' erron�, la librarie est erron�e.
+-�Diffusion: ioctl (a obtenu la configuration de l'interface)�Diffusion: ioctl (a obtenu la valeur des s�maphores de l'interface)�D�bordement du tampon�cache_set: ne peut allouer une nouveau tampon rpc_buffer�cache_set: �chec d'allocation de `victim'�cache_set: `victim' non rep�r��Ne peut d�terminer l'abr�viation du fuseau horaire � utiliser
+-juste apr�s telle date�Ne peut r�assigner le num�ro de proc�dure %d
+-�Ne peut �valuer par `stat' le fichier de localisation `%s'�Ne peut allouer les donn�es des symboles�Ne peut cr�er un descripteur interne�Ne peut cr�er les descripteurs internes�Ne peut activer le socket pour accepter des connexions: %s�Ne peut trouver le pr�processeur C: %s
+-�Ne peut trouver un pr�processeur C (cpp)
+-�Ne peut traiter une requ�te d'une vieille version %d; la version courante est %d�Ne peut ins�rer l'�l�ment de fusionnement `%.*s'�Ne peut effectuer une insertion dans la table des r�sultats�Ne peut ins�rer une nouvelle d�finition de symbole de fusionnement: %s�Ne peut charger le fichier de donn�es de profilage�Ne peut ouvrir�Ne peut ouvrir `%s'�Ne peut ouvrir le fichier de base de donn�es `%s': %s�Ne peut ouvrir le fichier d'entr�e `%s'�Ne peut ouvrir le fichier des localisations `%s'�Ne peut ouvrir le fichier de sortie�Ne peut ouvrir le fichier de sortie `%s'�Ne peut ouvrir le fichier de sortie `%s' de cat�gorie `%s'�Ne peut ouvrir le socket: `%s'�Ne peut traiter la sp�cification d'ordonnancement�Ne peut lire via le r�pertoire de la table des caract�res `%s'�Ne peut lire le fichier de configuration; cela est fatal�Ne peut lire du client�Ne peut lire l'en-t�te de `%s'�Ne peut lire via le r�pertoire des d�finitions localis�es `%s'�Ne peut lire le fichier des localisations `%s'�Ne peut lire la table des r�pertoires `%s'�Ne peut lire les donn�es de statistiques�Ne peut �valuer par stat() le fichier `%s': %s�Ne peut �crire dans les fichiers de sortie vers `%s'�Ne peut �crire les r�sultats: `%s'�Ne peut �crire les statistiques: `%s'�Ne peut �crire vers le client�Cat�gorie de donn�es requises plus d'une fois: n'aurait pas d� se produire�Caract�re %s'%s' de la classe `%s' doit �tre dans la classe `%s'�Caract�re %s'%s' de la classe `%s' ne doit pas �tre dans la classe `%s'�Caract�re <SP> non d�fini dans la table des caract�res�Caract�re `%s' non d�fini alors qu'attendu comme valeur par d�faut�Classe de caract�res `%s' d�j� d�finie�Table de caract�res `%s' d�j� d�finie�Fichier de la table des caract�res `%s' non rep�rable�clnt_raw.c - Erreur fatale de s�rialisation d'en-t�te�clnttcp_create: m�moire �puis�e
+-�clntudp_create: m�moire �puis�e
+-�clntunix_create: m�moire �puis�e
+-��l�ment de fusionnement `%.*s' appara�t plus d'une fois: ligne ignor�e�Symbole de fusionnement `%.*s' appara�t plus d'une fois: ligne ignor�e�Symbole de fusionnement attendu apr�s `%s'�Connexion �tablie � l'adresse %s: �Constante ou identificateur attendu�La conversion de `%s' vers `%s' n'est pas support�e.�Conversion arr�t�e en raison d'un probl�me d'�criture � la sortie�Ne peut cr�er un serveur RPC
+-�Ne peut enregistrer le programme %d de version %d
+-�base de donn�es [cl� ...]�Fichier de la table des caract�res `%s' non rep�r��L'indicateur de direction dans la cha�ne %d du champ `era' de
+-cat�gorie `%s' n'est pas un `+' ni un `-'.�L'indicateur de direction dans la cha�ne %d du champ `era' de
+-cat�gorie `%s' n'est pas un caract�res simple.�Duplicit� du nom de caract�re `%s'�Duplicit� de la d�finition d'�l�ment de fusionnement�Duplicit� de la d�finition du caract�re `%.*s'�Duplicit� de cl��Duplicit� de jeux de d�finitions�Duplicit� du nom de zone  %s (fichier "%s", ligne %d)�Duplicit� de l'identificateur de message�Duplicit� du num�ro de message�Cha�ne vide de caract�res�Nom du poids vide: ligne ignor�e�enablecache: cache d�j� activ�e�enablecache: ne peut allouer une cache�enablecache: ne peut allouer une cache de donn�es�enablecache: ne peut allouer une cache de type fifo�encodage de la sortie�encodage du texte original�Noeud final de l'intervalle d'ellipse plus grand que l'initial�Erreur lors de la fermeture du fichier d'entr�e `%s'�Erreur lors de la fermeture du fichier de sortie�Erreur lors de la fermeture du fichier de donn�es de profilage�Erreur durant l'insertion d'un �l�ment de fusionnement dans la table de hachage�Erreur lors de l'insertion dans la table de hachage�Erreur lors de la lecture de l'entr�e�Cha�ne attendue pour le param�tre de `copy'�Ligne de continuation attendue, non rep�r�e��chec de chargement de l'objet partag� `%s'��chec du chargement de donn�es de symbole��chec de la proc�dure mmap sur le fichier de donn�es de profilage��chec de d�marrage du processus de conversion��chec lors de l'�criture des donn�es de cat�gorie `%s'�fcntl: F_SETFD�Champ `%s' de cat�gorie `%s' n'est pas d�fini�Champ `%s' de cat�gorie `%s' ind�fini�Le fichier '%s' existe d�j� et peut �tre �cras�.
+-�La valeur de d�part de `collating-element' doit �tre une cha�ne.��chec d'�valuation fstat()�Rebut � la fin du caract�re du code de sp�cification�Rebut � la fin des chiffres�Rebut � la fin de la valeur du saut d'adresse dans la cha�ne %d 
+-du champ `era' de cat�gorie `%s'�Rebut � la fin de la date finale dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'�Rebut � la fin de la date finale dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'�g�n�rer un appel de graphe�G�n�rer un ficher de profilage plat avec les d�comptes et les marques de temps�get_myaddress: ioctl (a obtenu la configuration de l'interface)�getent() - obtenir les entr�es de la base de donn�es administratives�handle_request: requ�te re�ue (Version = %d)��chec de cr�ation du lien direct, cr�ation d'un lien symbolique�lien direct rencontr��CORRECTION ill�gale du champ dans la ligne de type `Leap'�Champ `Rolling/Stationary' ill�gal sur la ligne de type `Leap'�Caract�re ill�gal de constante dans la cha�ne�Caract�re ill�gal dans le fichier��l�ment de fusionnement ill�gal�D�finition ill�gale�Encodage fourni ill�gal�S�quence d'�chappement ill�gale � la fin de la cha�ne�S�quence d'�chappement ill�gale � la position %ld�Nom ill�gal pour un intervalle de caract�res�`nettype' ill�gal :'%s'
+-�Nombre ill�gal pour la valeur de saut dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'.�Num�ro de jeu ill�gal�Date finale ill�gale dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'�Date finale ill�gale dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'�Limite d'implantation: pas plus de %d classes de caract�res sont permises�Limite d'implantation: pas plus de %d tables de caract�res sont permises�Caract�re ou s�quence de changement incomplet � la fin du tampon�Fichier incorrectement format��Ligne d'entr�e de type inconnu�Erreur interne (descripteur ill�gal)�Erreur interne - addtype() appell� avec un mauvais bloc de type `isdst'�Erreur interne - addtype() appell� avec un mauvais bloc de type `ttisgmt'�Erreur interne - addtype() appell� avec un mauvais bloc de type `ttisstd'�Erreur interne dans %s, ligne %u�Adressage relatif GMT invalide�Format d'abr�viation invalide�Jour du mois invalide�Ann�e finale invalide�Ann�e bissextile invalide�mode invalide pour dlopen()�Nom de mois invalide�Temps sauvegard� invalide�Ann�e initiale invalide�Heure du jour invalide�Nom du jour de semaine invalide�La longueur de la cl� dans la requ�te est trop longue: %Zd�La ligne apr�s l'ellipse doit contenir la d�finition d'un caract�re.�La ligne avant l'ellipse ne doit pas contenir la d�finition d'une constante de caract�res.�Ligne trop longue�Liste tous les jeux de code de caract�res�Fichier localis� `%s', utilis� dans la d�claration de `copy', non rep�r���chec d'�valuation lstat()�Ligne incorrecte ignor�e��chec d'adressage de la cha�ne de la section d'en-t�te��chec d'adressage de la section d'en-t�te�M�moire �cras�e avant le bloc allou�
+-�M�moire �cras�e apr�s la fin du bloc allou�
+-�M�moire �puis�e�M�moire �puis�e
+-�La m�moire est consistente, la librairie est fautive.
+-�Format de type era manquant dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'�Nom manquant dans la cha�ne %d du champ `era' de cat�gorie `%s'�R�gle sans nom�Ni l'encodage d'origine et cible n'ont �t� sp�cifi��netname2user(): (consultation NIS+): %s
+-�netname2user(): entr�e DES de %s dans le r�pertoire %s n'est pas unique�netname2user(): entr�e LOCAL de %s dans le r�pertoire %s n'est pas unique�netname2user(): identificateur de liste de groupes manquant dans '%s'�netname2user: nom principal '%s' est trop long�netname2user: ne devrait pas avoir le UID 0�Le programme %d n'a jamais �t� enregistr�.
+-�Aucune valeur <Uxxxx> ou <Uxxxxxxxx> fournie�Expression r�guli�re incorrecte du champ `%s' de cat�gorie `%s': %s�Pas de jour dans les r�gles de concordance�Pas de d�finition de type `UNDEFINED'�Aucun fichier de donn�es de profilage fourni et l'objet partag� `%s' n'a pas le nom donn��Aucun autre mot cl� ne doit �tre sp�cifi� lorsque `copy' est utilis��Aucun fichier de sortie g�n�r� en raison d'un avertissement d�j� �mis�Aucune table de r�pertoire sp�cifi�e: ne peut proc�der�Aucun nom symbolique fourni�Pas de nom symbolique fourni pour la fin de l'intervalle�Pas de poids d�fini pour le symbole `%s'�N'est pas un fichier r�gulier�Configuration nscd:
+-
+-%15d  niveau serveur de d�boggage
+-�nscd n'est pas en ex�cution!
+-�Seules les d�finitions de type `WIDTH' sont permises suite
+-� une d�finition de type `CHARMAP'.�Encodage d'origine non sp�cifi� utilisation de `-f'�fichier de sortie�probl�me RPC avec pmap_getmaps()�poll: �chec du protocole dans la configuration du circuit
+-�Erreur du pr�processeur�Afficher le d�compte des chemins et le nombre de leur utilisation�Afficher des informations de progression�Probl�me lors de la lecture de `%s'�Le fichier de donn�es de profilage `%s' ne concorde pas avec l'objet partag� `%s'.�Le programme %lu n'est pas disponible.
+-�Le programme %lu de version %lu n'est pas disponible.
+-�Le programme %lu de version %lu est pr�t et en attente.
+-�rcmd: poll (configuration de stderr): %m
+-�rcmd: socket: tous les ports sont occup�s
+-�rcmd: �criture (configuration de stderr): %m
+-�registerrpc: m�moire �puis�e
+-�R�p�tition du d�lai une seconde fois�Fichier de la table des caract�res `%s' non rep�rable�rpcgen: erreur dans la liste de param�tres de codage
+-�rpcgen: trop de d�finitions
+-�rpcinfo: %s est un h�te inconnu
+-�rpcinfo: %s est un service inconnu
+-�rpcinfo: ne peut �liminer l'enregistrement du programme %s de version %s
+-�rpcinfo: �chec de diffusion: %s
+-�rpcinfo: ne peut contacter l'aiguilleur de ports�M�me nom de r�gle dans plusieurs fichiers�Lecture �court�e lors de la lecture de la cl� de requ�te: %s�Lecture �court�e lors de la lecture de la requ�te: `%s'��criture �court�e dans %s: %s�socket: �chec de protocole dans la configuration du circuit.
+-�Les options de tri `forward' et `backward' sont mutuellement exclusives.�La sp�cification de tri par le poids des symboles de
+-fusionnement n'a aucun sens.�entr�e standard�sortie standard�Date initiale ill�gale dans la cha�ne %d du champ `era'
+-de cat�gorie `%s'.�Ann�e initiale plus grande que l'ann�e finale�Ann�e de d�part trop grande pour �tre repr�sent�e�Ann�e de d�part trop petite pour �tre repr�sent�e�Date finale ill�gale dans la cha�ne %d du champ `era'\n"
+-de cat�gorie `%s'�svc_run: - �chec de s�lection�svc_tcp.c - ne peut rep�rer le nom du socket par getsockname() ou listen()�svc_tcp.c - probl�me de cr�ation d'un socket TCP�svc_tcp: makefd_xprt: m�moire �puis�e
+-�svc_unix.c - probl�me de cr�ation d'un socket `AF_UNIX'�svc_unix.c - ne peut rep�rer le nom du socket par getsockname() ou listen()�svc_unix: makefd_xprt: m�moire �puis�e
+-�svctcp_create: m�moire �puis�e
+-�svcudp_create - ne peut rep�rer le nom du socket par getsockname()�svctcp_create: m�moire �puis�e
+-�svcudp_create: probl�me de cr�ation du socket�svcunix_create: m�moire �puis�e
+-�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' 
+-provoque la duplication de la d�finition d'un �l�ment.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' 
+-provoque la duplication d'autres d�finitions d'�l�ments.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' 
+-provoque la duplication d'autres d�finitions de symboles.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' 
+-provoque la duplication de la d�finition d'un symbole.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' 
+-provoque la duplication d'un nom symbolique dans le jeu de caract�res.�Erreur de syntaxe dans la d�finition de %s: %s�Erreur de syntaxe dans la directive `order_start'�Erreur de syntaxe dans la d�finition de la classe de caract�res�Erreur de syntaxe dans la d�finition du caract�re de conversion�Erreur de syntaxe dans l'ordre de la d�finition du fusionnement�Erreur de syntaxe dans la d�finition du fusionnement�Erreur de syntaxe dans la d�finition d'une cat�gorie de type `LC_CTYPE'�Erreur de syntaxe dans la d�finition d'une nouvelle classe de caract�res�Erreur de syntaxe dans la d�finition d'une nouvelle table de caract�res�Erreur de syntaxe dans la d�finition localis�e du message�Erreur de syntaxe dans la d�finition localis�e des valeurs mon�taires�Erreur de syntaxe dans la d�finition localis�e de repr�sentation num�rique�Erreur de syntaxe dans la sp�ficication de l'ordonnancement�Erreur de syntaxe du prologue: %s�Erreur de syntaxe dans le r�pertoire de la table des d�finitions: %s�Erreur de syntaxe dans la d�finition localis�e de la repr�sentation du temps�Erreur de syntaxe: pas � l'int�rieur d'une section de d�finition localis�e�encodage cible non sp�cifi�e par l'option `-t'�Ceci est la premi�re d�finition.�Temps d�fini avant le z�ro�D�bordement du temps allou��Trop peu d'octets pour l'encodage des caract�res�Trop d'octets pour l'encodage des caract�res�Trop de d�finitions de classes de caract�res�Trop de d�lai en secondes�Trop de types localis�s pour la repr�sentation du temps�Trop de transitions d�finies?!�Trop de poids d�finis�Trop ou de trop longues abr�viations de fuseaux horaires�Suffixe en rebut � la fin de la ligne�Probl�me � r�pondre au programme %d.
+-�Deux lignes cons�cutives contenant `...' ne sont pas permises.�Une seule ann�e fournie�incapable d'allouer un tampon pour l'entr�e�incapable de lib�rer des param�tres�ind�fini�Caract�re inconnu `%s'�Caract�re inconnu dans le champ `%s' de cat�gorie `%s'�Directive de fusionnement inconnue�Directive inconnue `%s': ligne ignor�e�erreur inconnue de iconv() %d�Jeu inconnu `%s'�Symbole inconnu `%.*s': ligne ignor�e�Zone sans r�gle�Message incomplet�Cha�ne incompl�te�Cha�ne d'une constante incompl�te�Nom symbolique incomplet�Nom de poids incomplet�La limite sup�rieure de l'intervalle n'est pas plus petite
+-que la limite inf�rieure.�usage: %s fichier_d_entr�e
+-�Utiliser 2/29 pour les ann�es non-bissextiles.�La valeur de %s doit �tre un entier.�La valeur de <%s> doit �tre comprise entre 1 et 4.�La valeur du champ `%s' de cat�gorie `%s' ne doit pas �tre un cha�ne vide.�La valeur de <mb_cur_max> doit �tre plus grande que la valeur de
+-<mb_cur_min>.�La valeur du champ `int_curr_symbol' de cat�gorie `LC_MONETARY' ne doit pas correspondre � un nom valide de la norme ISO 4217.�La valeur du champ `int_curr_symbol' de cat�gorie `LC_MONETARY' n'a pas la bonne longueur.�Les valeurs du champ `%s' de cat�gorie `%s' doivent �tre plus petite que 127.�lors de l'acceptation de connexion: %s�lors de l'allocation d'entr�e dans la cache�lors de l'allocation d'entr�es dans la table de hachage�lors de l'allocation d'une copie de cl��lors de l'ouverture du vieux fichier du catalogue�lors de la pr�paration de la sortie�lors de la lecture de la base de donn�es�lors de l'�valuation par `stat' du fichier de donn�es de profilage�lors de l'�criture du fichier de base de donn�es��criture incompl�te�accessible en �criture par d'autres que le propri�taire�Mauvais nombre de param�tres�Mauvais nombre de champs sur la ligne de type `Leap'�Mauvais nombre de champs sur la ligne de type `Link'�Mauvais nombre de champs sur la ligne de type `Rule'�Mauvais nombre de champs sur la ligne de type continuation de `Zone'�Mauvais nombre de champs sur la ligne de type `Zone'�xdr_reference: m�moire �puis�e
+-�xdrrec_create: m�moire �puis�e
+-�yp_update: ne peut convertir le nom de l'h�te � un nom r�seau (netname)
+-�yp_update: ne peut obtenir l'adresse du serveur
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/gl.mo glibc-2.1.3/po/gl.mo
+--- ../glibc-2.1.3/po/gl.mo	2000-02-24 18:13:10.000000000 -0800
++++ glibc-2.1.3/po/gl.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,453 +0,0 @@
+-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n��
+-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_��	����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c��
���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d��	���kd�����ud�����yd��
����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i��	���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j�����
+-k�����k��$���/k��
+-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	���n��	���n��	���n��	���#n��	���-n��	���7n��	���An��	���Kn��	���Un��	���_n��	���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To��
���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir��
���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s��	����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu��	���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w��
+-����w������w������w��2���x�����5x�����Dx�����]x��
���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{��
+-����{������{������{������{������{�����	|�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i��������������������������������������
������������	���������'���!���?���	���a���
���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.��������������
���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉��������������
������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������
���������������)������?������T������l������t����������������������������������ڌ��*������(���
������6������C���"���W�������z����������������	������������$���/���
+-���T������_������n���������
���*������8���!���L������n������}�����������������"���������������������
+-���������'���-���#���U���6���y���
�������
+-����������ɑ��"���ё��"�������������"���1������T������t�����������������
����������ɒ�����ؒ������������������
������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!���	��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)���	���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę��������	����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C���
���m������{���+�����������������ޤ������������
+-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%���
���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0����������������
������ ������<������Q������e������z�����������������������������������#�������5������G���S���
�������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G���
�������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ�����������
+-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H�����������������
���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5���
���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#��������������	������������0���(������Y���$���u�����������������#������������������������	������������:������U���4���n������������������������'�������B������D���]���j�������K���
���?���Y���	���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������:��>������y����������Q�������D�������&���@���(���g������������������������������������������������������2������F�������������
���"������"���B������e���?��������������������������������������
������*������C������`���#��������������#��������������#���������,������E������c������j������������������������8�������8�������L������1���j���)��������������2�������$���������7���1���Q���3�������6�������,�������������*���9���&���d�����������������)�����������������
������!������7���C���P����������#�������#�������#�������#������#���>������b���4���}���-���������������������������*���5������`���(���}���*�������+��������������)���������G���"���g��������������������������������������.��������������.�������1���������4���*���K���
���v���I��������������N������� ���0���)���Q���
+-���{���.�������,�������&����������	���������������1���*������\���:���u���1�������=�������
��� ������.��� ���;���#���\���#�������#�������(�������9�������4���+������`������y�����������������$�������!��������������/���������I������\���!���z�����������������$��������������$������$���1������V������h������}�����������������:�������<�������9���)���+���c���"������� ��������������%�������5������<���L���;�������.������� �������2������A���H���+�������3�������3�������7������0���V���9�������!��������������������)���������@������W���$���w����������P�������T���	������^���&���q�����������������8���������������������.�������J���
���8���X���A���������������������1���	������;������G������M���'���Q������y���+�������!�������!����������������������7������S������r�������������������������������8�������4������?���T����������
���������������������!�����������������������������������������&������/������8������A������J������S������\������e������n������w�������������������������������������������������������������������������������������������������������������������������K������%���k���-�������1��������������������.���$������S���<���\����������$��������������$�������,������ ���C���%���d���#����������������������������6����������7������P������W�������q������
���)���&���'���P������x�������������������������������)�������������$������*���@���$���k���(�������*��������������"���������� ������,���V���8���
��������������������� ��������������*�������������'���4���$���\���;����������������������������+����������$������:������N������e������r���8��������������"�������&������ ���*���!���K���!���m����������.��������������#�������4������'���I������q�����������������!�������"����������������������<������L������b���
+-���������������������;�������������������������������������!������3������R������q���������� �������!�����������������������������������7�����������������������������5���&���M������t����������"�����������������������������������������P������%���`����������&�������0�����������������������
���#������"���>������a������|����������$��������������+�������(��� ������I������]���&���w���#�������0�������$�������������$���)������N������e���(�������������
��������������%�������0�����)���@��(���j��'������������$������������#����"���:����]�'���w������&�����,���������'�������8����T����h��������������������������)���������
���.����<����U�Y���m�"����� ����������������1����D�"���W����z������%�����������������������4���3����h������#���������������������������&����8����A����W�
���k�2���y�����������$�����H�����0���<����m� ��������������������'���������#���(����L����e�*���}�$���������������$��������	����0	�"���L	����o	�����	�!����	�����	�)����	�(���
+-�"���9
+-�"���\
+-����
+-� ����
+-�����
+-�����
+-�(����
+-�����3���8�
+-���l����w��������������������������3�����9���4�%���n�"����������"�������������
�?���
�,���^
�����
�����
�?����
�"����
��������-����M� ���h������$����������*��������������������1�!���C����e� ���z�!�����'������������������"�������@����]����|�(����������
�����#���������������������&����5����R����m�"����������+�����0������������!�%���9�����_������������������%���(�	���N����X����q��������.����=�'���R����z������'����������(���������%���#����I����g�)�����*�����A���������
+-���)����4�'���@�(���h������(�����#�����������������9����X����i����{���������������������������������.����I����]����q��������������������������8�����*���&����Q����o�2����������)���������5����+���G�.���s�*�����!��������������������������"����9����X�\���w�	�����;�����-����<���H�B�����8�����D����T���F����������������+�����+���	�*���5�"���`��������������������������*���	 �8���4 �6���m ����� �3���� �7���� � ���(!�H���I!�/����!�.����!�+����!�'���"�(���E"�3���n"�*����"�,����"�G����"�4���B#�+���w#�C����#�%����#����
$����$�7���6$�,���n$�:����$�%����$�*����$�@���'%����h%�-����%�9����%�9����%����*&�#���E&�,���i&�*����&�)����&�&����&�2���'�2���E'�$���x'�)����'�����'�>����'�6���&(�:���](�0����(�D����(�H���)�G���W)�$����)�#����)�/����)�7���*�!���P*�!���r*�"����*�E����*�E����*�3���C+����w+�-����+�'����+�:����+�#���$,�)���H,����r,�;����,�T����,�Z���-����x-�.����-�'����-�����-� ����-�2��� .�#���S.����w.�����.�#����.�����.�7����.�A���*/�?���l/�����/�����/�?����/�-���!0����O0�"���m0�,����0�7����0�����0����1�*���+1�4���V1�-����1�+����1�;����1�1���!2�3���S2�����2�)����2�2����2�=����2����13�4���J3����3�N����3�G����3�E���+4����q4�)����4�8����4�;����4�0���*5�;���[5�����5�$����5�,����5�'���	6����16����O6����m6����6�)����6�+����6�(����6����7�O���27�����7�B����7�>����7�H���8�G���g8�2����8�����8�#���9� ���&9�6���G9�8���~9�8����9�����9����:�!���):����K:����a:����u:�����:�����:�����:�����:�����:����	;�4���";�F���W;�W����;�����;�A���<�D���M<�����<�����<�;����<�*���=�+���1=�-���]=�����=�.����=�I����=�F���>����\>�C���k>�����>�>����>�@���?�J���O?�1����?�#����?�����?�*���
+-@�O���5@�$����@�&����@�W����@�7���)A�;���aA�>����A�����A�0����A�*���*B����UB�>���nB�����B�>����B�8���C����DC����VC�7���sC�����C�:����C�$����C����!D�J���7D�#����D�/����D�/����D�%���E�4���,E�&���aE�����E�)����E�6����E�4���F����=F�%���]F�%����F�>����F�$����F�,���
G�1���:G�6���lG�-����G�#����G�9����G�L���/H�O���|H�����H�����H�F����H�$���3I�8���XI�9����I�L����I�$���J�6���=J�+���tJ�'����J�0����J�7����J�(���1K� ���ZK�0���{K� ����K�*����K�!����K�Z���L�\���uL�Y����L�l���,M�$����M�*����M�4����M�9���N�+���XN�+����N�3����N�9����N�9���O�3���XO�1����O�0����O�)����O����P�7���8P�4���pP�F����P�:����P����'Q����DQ����XQ�5���oQ�.����Q�)����Q�#����Q����"R����AR����\R�<���mR�����R�"����R�4����R����S�5���)S�!���_S�����S�����S�4����S�#����S�)���T����+T����JT�)���dT�����T�����T�����T�����T�����T����U�9���U����VU�)���sU�!����U�%����U�G����U�?���-V�j���mV�[����V�D���4W����yW�����W�+����W�0����W�)����W�'���%X����MX����aX�(���xX�)����X�����X�-����X����Y�(���.Y�(���WY�(����Y�;����Y�(����Y� ���Z� ���/Z�;���PZ�4����Z������������:��c����������������
+-�����������}�������������H��8��	���������������1����������������������C���������������������������������
���������V�������������R���������V��z����������������������a������m��������������+���������
+-����������������
�������	��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"��������
�����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������	�������=������2��?��������*���������������u����������������z������������������$������J��^�����������
���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������
+-����������������������������d���o�������������'������������V��E������t��_��������������������������
+-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y���	����������Q��?��������������'����		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Can't unlink  %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing �%s: Error writing %s
+-�%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open %s: %m
+-�%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights :
+-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : `%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns   : %d
+-�Number of objects : %u
+-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE�TABLE
+-�TABLE,yes�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1.3
+-POT-Creation-Date: 2000-02-16 10:39-0800
+-PO-Revision-Date: 2000-02-21 10:04+0200
+-Last-Translator: Jacobo Tarrio <jtarrio@iname.com>
+-Language-Team: Galician <gpul-traduccion@ceu.fi.udc.es>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=iso-8859-1
+-Content-Transfer-Encoding: 8bit
+-�		Dereitos de Acceso : �		Atributos          : �	%s [-abkCLNTM][-Dnome[=valor]] [-i tama�o] [-I [-K segundos]] [-Y rota] entrada
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o sa�da] [entrada]
+-�	%s [-n idrede]* [-o sa�da] [entrada]
+-�	%s [-s tiporede]* [-o sa�da] [entrada]
+-�	Dereitos de Acceso: �	Datos da entrada do tipo %s
+-�	Nome       : %s
+-�	Chave p�blica : �	Tipo         : %s
+-�	Enderezos universais (%u)
+-�	[%d]	Nome          : %s
+-�	[%u] - [%u bytes] �
+-%s cach�:
+-
+-%s15s  a cach� est� activada
+-%15Zd  tama�o aconsellado
+-%15ld  segundos de vida para as entradas positivas
+-%15ld  segundos de vida para as entradas negativas
+-%15ld  acertos de cach� para entradas positivas
+-%15ld  acertos cach� para entradas negativas
+-%15ld  fallos de cach� para entradas positivas
+-%15ld  fallos de cach� para entradas negativas
+-%15ld%%  tasa de acertos de cach�
+-%15s  comprobe /etc/%s para ve-los cambios
+-�
+-Membros do Grupo :
+-�
+-Tempo de Vida : �       rpcinfo -b numprog numvers
+-�       rpcinfo -d numprog numvers
+-�       rpcinfo -p [ servidor ]
+-�       rpcinfo [ -n numporto ] -t servidor numprog [ numvers ]
+-�     non�      si�    Lonxitude de Datos = %u
+-�    Membros expl�citos:
+-�    Non-membros expl�citos:
+-�    Membros impl�citos:
+-�    Non-membros impl�citos:
+-�    Non hai membros expl�citos
+-�    Non hai non-membros expl�citos
+-�    Non hai membros impl�citos
+-�    Non hai non-membros impl�citos
+-�    Non hai membros recursivos
+-�    Non hai non-membros recursivos
+-�    Membros recursivos:
+-�  programa vers proto  porto
+-�  ou: � (regra de "%s", li�a %d)� [OPCI�N...]� feito
+-�"%s", li�a %d: %s�A li�a "Zone %s" e a opci�n -l son mutuamente exclusivas�A li�a "Zone %s" e a opci�n -p son mutuamente exclusivas�Prec�sase dun ficheiro de "entrada" para as opci�ns de xeraci�n de patr�ns.
+-�%.*s: O par�metro ARGP_HELP_FMT precisa dun valor�%.*s: Par�metro ARGP_HELP_FMT desco�ecido�%s nunha zona sen regras�%s%s%s:%u: %s%sNon se cumpr�u a aseveraci�n `%s'.
+-�%s%s%s:%u: %s%sErro inesperado: %s.
+-�%s%sSinal desco�ecido %d
+-�%s: %d non foi estendido con signo correctamente
+-�%s: <mb_cur_max> debe ser meirande ca <mb_cur_min>
+-�%s: O preprocesador de C fallou co c�digo de sa�da %d
+-�%s: O preprocesador de C fallou co sinal %d
+-�%s: Non se pode crear %s: %s
+-�%s: Non se pode crea-lo directorio %s: %s
+-�%s: Non se pode enlazar %s con %s: %s
+-�%s: Non se pode abrir %s: %s
+-�%s: Non se pode borrar %s: %s
+-�%s: Non se pode elimina-lo enlace %s: %s
+-�%s: Erro ao pechar %s: %s
+-�%s: Erro ao ler %s
+-�%s: Erro ao escribir �%s: Erro ao escribir %s
+-�%s: Li�a de axuste no ficheiro %s, que non � de axuste de segundos
+-�%s: Memoria esgotada: %s
+-�%s: Indicouse m�is dunha opci�n -L
+-�%s: Indicouse m�is dunha opci�n -d
+-�%s: Indicouse m�is dunha opci�n -l
+-�%s: Indicouse m�is dunha opci�n -p
+-�%s: Indicouse ma�s dunha opci�n -y
+-�%s: Demasiados par�metros
+-�%s: non se puido obte-la data de �ltima modificaci�n�%s: o comando foi '%s', e o resultado foi %d
+-�%s: erro na m�quina de estados�%s: opci�n ilegal -- %c
+-�%s: opci�n incorrecta -- %c
+-�%s: a opci�n `%c%s' non acepta par�metros
+-�%s: a opci�n `%s' � ambigua
+-�%s: a opci�n `%s' precisa dun par�metro
+-�%s: a opci�n `--%s' non acepta par�metros
+-�%s: a opci�n `-W %s' non acepta par�metros
+-�%s: a opci�n `-W %s' � ambigua
+-�%s: a opci�n precisa dun par�metro -- %c
+-�%s: a sa�da sobreescribir�a %s
+-�%s: p�nico: l_value %d incorrecto
+-�%s: fin de ficheiro prematuro�%s: non puiden abrir %s: %m
+-�%s: opci�n desco�ecida `%c%s'
+-�%s: opci�n desco�ecida `--%s'
+-�%s: �sase %s [ -s ] [ -v ] [ -l horalocal ] [ -p regrasposix ] [ -d directorio ]
+-	 [ -L axuste ] [ -y tipoano ] [ ficheiro ... ]
+-�%s: �sase %s [ -v ] [ -c corte ] nomezona ...
+-�%s: ao escribir � sa�da %s: %m�(ERRO DE PROGRAMA) ��Non se co�ece a versi�n!?�(ERRO DE PROGRAMA) ��Deber�ase co�ece-la opci�n!?�(Obxecto desco�ecido)
+-�(erro de autentificaci�n desco�ecido - %d)�(desco�ecido)�*** O ficheiro `%s' est� recortado: non � posible unha an�lise detallada
+-�*entrada est�ndar*�-o FICHEIRO-SA�DA [FICHEIRO-ENTRADA]...
+-[FICHEIRO-SA�DA [FICHEIRO-ENTRADA]...]�secci�n .lib do a.out corrompida�; versi�n baixa = %lu, versi�n alta = %lu�; causa = �<%s> e <%s> son nomes incorrectos para o rango�O car�cter <SP> non debe estar na clase `%s'�O car�cter <SP> non est� na clase `%s'�?�Abortado�Dereitos de Acceso : �Accedendo a unha biblioteca compartida corrompida�Estase usando o enderezo�Familia de enderezos para o nome do servidor non soportada�O protocolo non soporta esta familia de enderezos�A familia de protocolos non soporta esta familia de enderezos�Anunciar erro�Temporizador�Desbordamento da t�boa de anodes�Lista de par�metros demasiado longa�Lista de par�metros demasiado longa�O argumento non est� no seu dominio�Intentouse borrar unha t�boa non baleira�Intentouse sobrepasa-lo l�mite de bibliotecas compartidas�Intentouse cargar demasiadas bibliotecas compartidas�Autentificaci�n correcta�Erro na autentificaci�n�OBXECTO FALSO
+-�Enderezo incorrecto�Descriptor de intercambio incorrecto�Descriptor de ficheiro incorrecto�N�mero de ficheiro incorrecto�Formato do ficheiro de tipo de letra incorrecto�Mensaxe incorrecta�C�digo de petici�n incorrecto�Descriptor de petici�n incorrecto�Chamada ao sistema incorrecta�Valor de ai_flags incorrecto�Ser estrictamente conforme con POSIX�Datos binarios
+-�Prec�sase dun dispositivo de bloques�Problema cunha chamada multidifusi�n�Canalizaci�n rota�Erro no bus de datos�CDS�L�mite de tempo de CPU superado�A cach� caducou�Non se pode acceder a unha biblioteca compartida necesaria�Non se pode executar unha biblioteca compartida directamente�Non se pode conectar co servidor que serve a este dominio�Non se pode comunicar co mapeador de portos�Non se pode comunicar con `ypbind'�Non se pode comunicar con ypserv�Non se pode reservar memoria�Non se pode asigna-lo enderezo pedido�Non se pode crear un socket para un rpc multidifusi�n�Non se pode executar unha biblioteca compartida directamente�Non se pode ter m�is dunha opci�n de xeraci�n de ficheiros
+-�Non se pode recibi-la resposta � multidifusi�n�Non se pode rexistra-lo servicio�Non se pode enviar despois de desconecta-lo socket�Non se pode enviar despois de desconecta-lo destino do transporte�Non se pode enviar un paquete multidifusi�n�Non se pode activa-la opci�n SO_BROADCAST do socket��Non se pode indicar m�is dun ficheiro de entrada!
+-��Non se pode utiliza-la opci�n netid coa opci�n inetd!
+-��Non se pode utiliza-la opci�n netid sen TIRPC!
+-��Non se poden utiliza-las opci�ns de t�boa con newstyle!
+-�N�mero de canal f�ra do seu rango�Separador de Caracteres : %c
+-�O proceso fillo sa�u�A credencial do cliente � demasiado feble�Columnas            :
+-�Erro de comunicaci�ns ao enviar�Compile a especificaci�n do `locale'�O ordenador mercou a granxa�O c�lculo do tama�o da t�boa para as clases de caracteres pode levar un pouco...�O c�lculo do tama�o da t�boa para a informaci�n de ordenaci�n pode levar un pouco...�Conexi�n rexeitada�Conexi�n reiniciada polo outro estremo�A conexi�n espirou�Continuaci�n�Converti-los ficheiros dados dunha codificaci�n a outra.�Converti-la clave a min�sculas�Copyright (C) %s Free Software Foundation, Inc.
+-Isto � software libre; vexa o c�digo fonte polas condici�ns de copia. NON hai
+-garant�a; nin sequera de COMERCIABILIDADE ou APTITUDE PARA UN FIN DETERMINADO.
+-�Non se puido crea-lo ficheiro de rexistro "%s"�Crea-lo ficheiro de cabeceira C NOME que cont�n as definici�ns de s�mbolos�Crea-la sa�da incluso se se produciron mensaxes de aviso�Crear unha base de datos DB simple a partires da entrada textual.�Hora de Creaci�n : %s�Enlace a trav�s de dispositivos�A entrada DES para o nome de rede %s non � �nica
+-�DIRECTORIO
+-�DNANS�DNS�A base de datos para a t�boa non existe�A base de datos est� ocupada�Situaci�n de interbloqueo detectada/evitada�Dereitos de acceso por Omisi�n :
+-�Prec�sase dun enderezo de destino�Dispositivo ocupado�O dispositivo non � de fluxo�Dispositivo non configurado�Dispositivo ou recurso ocupado�Diffie-Hellmann (%d bits)
+-�Directorio    : %s
+-�Directorio non baleiro�Cota de disco superada�Cota de disco superada�Non bifurcar e visualiza-las mensaxes no terminal actual�Non visualizar mensaxes ao construi-la base de datos�Non usa-lo cat�logo existente, forzar un ficheiro de sa�da novo�Non se conectou co dominio�Trampa de EMT�ENTRADA
+-�Datos encriptados
+-�Diferentes tipos de entrada/t�boa�Erro 0�Erro 100�Erro 101�Erro 102�Erro 103�Erro 104�Erro 105�Erro 106�Erro 107�Erro 108�Erro 109�Erro 110�Erro 111�Erro 112�Erro 113�Erro 114�Erro 115�Erro 116�Erro 117�Erro 118�Erro 119�Erro 136�Erro 142�Erro 58�Erro 59�Erro 72�Erro 73�Erro 75�Erro 76�Erro 91�Erro 92�Erro no subsistema RPC�Erro ao acceder ao ficheiro de arranque en fr�o de NIS+.  �Instalouse NIS+?�Erro no sistema de erro desco�ecido: �Erro ao falar ao procedemento de retrochamada�Erro: o ficheiro .netrc pode ser lido por outros.�Ficheiro de intercambio cheo.�Exec erro de formato�FATAL: o sistema non define `_POSIX2_LOCALDEF'�FICHEIRO�O FICHEIRO cont�n mapeado de nomes simb�licos a valores UCS4�Fallo (erro non especificado)�Descriptor de ficheiro en mal estado�O ficheiro xa existe�Interbloqueo en bloqueos de ficheiro�Erro de interbloqueo en bloqueos de ficheiro�Nome de ficheiro demasiado longo�L�mite de tama�o de ficheiro superado�Desbordamento da t�boa de ficheiros�Ficheiro demasiado grande�Primeira/seguinte cadea rota�Excepci�n de coma frotante�Prec�sase unha resincronizaci�n completa do directorio�Funci�n non implementada�GRUPO
+-�Lixo en ARGP_HELP_FMT: %s�Xera-lo cat�logo de mensaxes.
+-Se o FICHEIRO-ENTRADA � -, a entrada lese da entrada est�ndar. Se o
+-FICHEIRO-SA�DA � -, a sa�da escr�bese na sa�da est�ndar.
+-�Erro de sistema xen�rico�Obter informaci�n espec�fica do `locale'.�Devolver unha mensaxe curta sobre o uso�Devolver esta lista de axuda�Erro inxustificado�Grupo         : %s
+-�Opci�ns do Grupo :�Entrada do grupo "%s.%s":
+-�Agardar SEGS segundos (por omisi�n, 3600)�Colgar��Non atopei "%d" na cach� de grupos!��Non atopei "%d" na cach� de contrasinais!��Non atopei "%s" na cach� de grupos!��Non atopei "%s" na cach� de servidores!��Non atopei "%s" na cach� de contrasinais!�O servidor est� inactivo�Fallo ao busca-lo nome do servidor�Erro de E/S�E/S posible�FICHEIRO-ENTRADA FICHEIRO-SA�DA
+--o FICHEIRO-SA�DA FICHEIRO-ENTRADA
+--u FICHEIRO-ENTRADA�Trampa de IOT�IVY�Identificador borrado�Secuencia de bytes non permitida�Instrucci�n non permitida�Tipo de obxecto non permitido na operaci�n�B�squeda non permitida�Tipo ou formato de ficheiro inapropiado�ioctl inapropiado para o dispositivo�Operaci�n inapropiada para un proceso que traballa de fondo�Petici�n de informaci�n�Informaci�n:�Ficheiros de Entrada:�Especificaci�n do formato de Entrada/Sa�da:�Erro de Entrada/sa�da�Erro interno de NIS�Erro interno de ypbind�Interrupci�n�Chamada ao sistema interrompida�A chamada ao sistema interrompida deber�a ser recomezada�Par�metro incorrecto�Referencia cara a atr�s incorrecta�Nome da clase de caracteres incorrecto�Credencial do cliente incorrecta�Verificador do cliente incorrecto�Car�cter de ordenaci�n incorrecto�Contido de \{\} incorrecto�Enlace entre dispositivos distintos incorrecto�Intercambio incorrecto�Obxecto incorrecto para a operaci�n�Car�cter ancho ou multibyte incorrecto ou incompleto�Expresi�n regular precedente incorrecta�Final do rango incorrecto�Expresi�n regular incorrecta�C�digo de petici�n incorrecto�Descriptor de petici�n incorrecto�Verificador de servidor incorrecto�Ra�ura incorrecta�Invalida-la cach� especificada�� un directorio�� un ficheiro de nome�� un ficheiro de tipo con nome�Kerberos.
+-�Matado�ENLACE
+-�A entrada LOCAL para o UID %d no directorio %s non � �nica
+-�Nivel 2 detido�Nivel 2 non sincronizado�Nivel 3 detido�Nivel 3 reiniciado�O enlace foi roto�N�mero de enlace f�ra de rango�O enlace leva a un nome ilegal�Tipo do Obxecto Enlazado : �Enlazado a : %s
+-�Nome de dominio local non fixado�Fallo ao reservar recursos locais�A m�quina non est� na rede�Nome mal formado, ou ilegal�Os par�metros obrigatorios ou opcionais das opci�ns longas son tam�n obrigatorios ou opcionais para calquera opci�n curta que se corresponda.�Servidor Mestre :
+-�Servidor mestre ocupado, volcado completo reprogramado.�Fallo ao reservar memoria�Memoria esgotada�T�boas de mensaxes cheas�Mensaxe demasiado longa�Falta un atributo, ou est� mal formado�Hora de Modificaci�n : %s�Fallo ao modificar�Fallo na operaci�n de modificaci�n�Modifica-lo formato de sa�da:�Tentouse un multisalto�NOME�NOME
+-[-a|-m]�NIS�Non coinciden as versi�ns do cliente e o servidor NIS - non se pode dar servicio�A base de datos de mapas NIS est� mal�Fallou unha operaci�n NIS+�Non se pode chegar aos servidores NIS+�O servicio NIS+ non est� dispo�ible ou instalado�SEN OBXECTO
+-�N�MERO�Nome : `%s'
+-�Demo de Cache de Servicio de Nomes.�Nome non servido por este servidor�O nome non � �nico na rede�Nome ou servicio desco�ecido�O nome/entrada non � �nico�Non se pode busca-lo obxecto nomeado�Preciso dun autentificador�A rede cortou a conexi�n debido ao reinicio�A rede cortou a conexi�n por un reinicio�A rede non funciona�Non se pode chegar � rede�Non hai unha estructura CSI dispo�ible�Non hai sem�foros XENIX dispo�ibles�Non hai un enderezo asociado ao nome de servidor�Non hai un enderezo asociado ao nome�Non hai un anodo�Non hai espacio dispo�ible no buffer�Non hai procesos fillo�Non hai datos dispo�ibles�Non hai espacio de ficheiros no servidor�Non hai bloqueos dispo�ibles�Nada coincide�Non se atopou o medio�Non hai unha mensaxe do tipo desexado�Non hai m�is rexistros na base de datos de mapas�Non hai unha expresi�n regular precedente�Non hai bloqueos de rexistro dispo�ibles�Non hai programas remotos rexistrados.
+-�Non hai unha rota ao servidor�Non hai espacio libre no dispositivo�Non hai tal dispositivo�Non hai tal dispositivo ou enderezo�Non hai tal ficheiro ou directorio�Non hai tal clave no mapa�Non hai tal mapa no dominio do servidor�Non hai tal proceso�Non se atopou un espacio de nomes NIS+�Fallo non recuperable na resoluci�n de nomes�Ning�n.
+-�Non � un ficheiro de tipo nomeado XENIX�Non � unha mensaxe de datos�Non � un directorio�Non � un ficheiro de nome�Non � un dispositivo de fluxo�Non dispo�ible�Non hai espacio abondo�Non atopado�Non atopado, non hai tal nome�Non hai servidor mestre para este dominio�Non � o propietario�Non soportado�N�mero de Columnas : %d
+-�N�mero de obxectos: %u
+-�O n�mero de enlaces simb�licos atopados durante o percorrido pola rota supera MAXSYMLINKS�Par�metro num�rico f�ra do dominio�Resultado num�rico f�ra de rango�Obxecto n� %d:
+-�Nome do Obxecto : %s
+-�Tipo do Obxecto : �O obxecto � remoto�Xa existe un obxecto co mesmo nome�N�mero de comi�as impar��S� root pode usar esa opci�n!�A operaci�n xa se est� levando a cabo�Operaci�n cancelada�Operaci�n non aplicable�Operaci�n non permitida�Operaci�n non soportada�Operaci�n non soportada no punto final do transporte�Operaci�n lev�ndose a cabo�A operaci�n bloquear�ase�Opci�n non soportada polo protocolo�Acab�ronse os recursos de fluxo�Acab�ronse os recursos de fluxo�Control de sa�da:�Selecci�n de sa�da:�Propietario : %s
+-�PRIVADO
+-�Paquete non instalado�Erro na an�lise: %s��xito parcial�O obxecto pasado non � o mesmo obxecto no servidor�Permiso denegado�Fallo de enerx�a�Final prematura da expresi�n regular�Visualiza-lo contido do ficheiro de base de datos, unha entrada por li�a�Visualiza-la estat�stica da configuraci�n actual�Visualizar m�is mensaxes�Visualiza-la versi�n do programa��xito probable�Probablemente non atopado�Rematado o tempo de perfilado�Controlador de protocolos non conectado�Erro de protocolo�Familia de protocolos non soportada�Protocolo non dispo�ible�Protocolo non soportado�Tipo incorrecto de protocolo para o socket�Petici�n ilegal para a t�boa nomeada�Abandoar�Erro espec�fico de RFS�Mal procedemento RPC para o programa�Fallo de RPC na operaci�n NIS�Programa RPC non dispo�ible�Versi�n incorrecta do programa RPC�A estructura RPC � incorrecta�Versi�n de RPC incorrecta�RPC: (c�digo de erro desco�ecido)�RPC: Erro de autentificaci�n�RPC: Non se pode descodifica-lo resultado�RPC: Non se pode codifica-los par�metros�RPC: Fallo (erro non especificado)�RPC: Versi�ns de RPC incompatibles�RPC: Fallo do portmapper�RPC: Procedemento non dispo�ible�RPC: Programa non rexistrado�RPC: Programa non dispo�ible�RPC: Non coinciden os programas/versi�ns�RPC: Erro do sistema remoto�RPC: O servidor non pode descodifica-los par�metros�RPC: �xito�RPC: Tempo esgotado�RPC: Non se pode recibir�RPC: Non se pode enviar�RPC: Servidor desco�ecido�RPC: Protocolo desco�ecido�RSA (%d bits)
+-��sase RTLD_NEXT en c�digo non cargado dinamicamente�Ler e visualiza-los datos do perfil do obxecto compartido�Le-los datos de configuraci�n de NOME�Sistema de ficheiros de s� lectura�Sinal de tempo real %d�Expresi�n regular demasiado grande�Erro de E/S remota�O enderezo remoto cambiou�Elimina-lo contrasinal ou face-lo ficheiro ilexible por outros.�A apertura do obxecto compartido `%s' fallou�Replicar :
+-�Informe dos erros a %s.
+-�Informe dos erros usando o script `glibcbug' a <bugs@gnu.org>.
+-�Par�metros da petici�n incorrectos�Reservado para uso futuro�Erro do resolvedor 0 (sen erro)�Erro interno do resolvedor�Interbloqueo de recursos evitado�Recurso perdido�Recurso non dispo�ible temporalmente�Resultado demasiado grande�Resultado enviado ao procedemento callback�SOBJ [PROFDATA]�SUNYP�Rota de B�squeda : %s
+-�Fallo de segmento�Servidor ocupado, probe outra vez�Servidor sen memoria�O servidor rexeitou a credencial�O servidor rexeitou o verificador�Servname non soportado para ai_socktype�Establece-lo nome do programa�Apaga-lo servidor�Sinal 0�Operaci�n de socket nun non-socket�Tipo de socket non soportado�Un programa abortou a conexi�n�S�ntocho. Non es root
+-�As definici�ns de fonte at�panse en FICH�Erro de srmount�Fallo de pila�Manexador de ficheiro NFS trabucado�Comezar N�MERO f�os�Estado : %s
+-�Detido�Detido (sinal)�Detido (entrada do terminal)�Detido (sa�da do terminal)�Erro de canalizaci�n de fluxo�A estructura precisa dunha limpeza��xito�Elimina-las mensaxes de aviso e informaci�n�Nomes de caracteres simb�licos definidos en FICH�Erro de sistema�Informaci�n do sistema:�Fallo ao reservar recursos do sistema�Directorio do sistema para mapas de caracteres : %s
+-                           mapas de repertorios: %s
+-                           locale              : %s
+-%s�T�BOA�T�BOA
+-�T�BOA,si�Tipo de T�boa : %s
+-�Fallo temporal na resoluci�n de nomes�Terminado�Ficheiro de texto en uso�A seguinte lista cont�n t�dolos xogos de caracteres co�ecidos.  Isto non
+-significa necesariamente que t�dalas combinaci�ns deses nomes poidan ser usadas
+-para os par�metros de li�a de comandos DE e A.  Un xogo de caracteres pode ser
+-listado con distintos nomes (alias).
+-  Alg�ns dos nomes non son cadeas normais, sen�n expresi�ns regulares e
+-coinciden cunha variedade de nomes que poden ser dados como par�metros do
+-programa
+-
+-  �Tempo de vida : �Acabou o tempo�Demasiados atributos�Demasiados niveis de enlaces simb�licos�Demasiados enlaces�Demasiados ficheiros abertos�Demasiados ficheiros abertos no sistema�Demasiados procesos�Demasiadas referencias: non se pode unir�Demasiados usuarios�Trampa de seguemento/punto de ruptura�Barra invertida extra � final�O proceso traductor morreu�O destino do transporte xa est� conectado�O destino do transporte non est� conectado�Escriba `%s --help' ou `%s --usage' para obter m�is informaci�n.
+-�Probando %s...
+-�Tipo : %s
+-�DESCO�ECIDO�Non se pode autentifica-lo cliente NIS+�Non se pode autentifica-lo servidor NIS+�Non se pode crea-lo callback�Non se pode crear un proceso no servidor�Desco�ecido (tipo = %d, bits = %d)
+-�Clave %s desco�ecida no .netrc�C�digo de erro NIS desco�ecido�Base de datos desco�ecida: %s
+-�Erro desco�ecido�Erro desco�ecido �Servidor desco�ecido�Obxecto desco�ecido�Opci�n desco�ecida: %s %s %s�Erro do resolvedor desco�ecido�Erro do servidor desco�ecido�Sinal %d desco�ecida�Erro de sistema desco�ecido�Erro de ypbind desco�ecido�( ou \( sen parella�) ou \) sen parella�[ ou [^ sen parella�\{ sen parella�Variable `%s' non reco�ecida�Condici�n de E/S urxente�Uso:�Uso: %s nome_variable [nome]
+-�Uso: rpcinfo [ -n numport ] -u host numprog [ numvers ]
+-�Usar unha cach� separada para cada usuario�Sinal 1 definido polo usuario�Sinal 2 definido polo usuario�Valor grande de m�is para o tipo de datos definido�Tempo virtual esgotado�Resultado salvaxe da execuci�n do comando�A vent� cambiou�Escribi-los nomes dos mapas de caracteres dispo�ibles�Escribi-los nomes dos `locales' dispo�ibles�Escribi-los nomes das categor�as seleccionadas�Escribi-los nomes das claves seleccionadas�Escribi-la sa�da no ficheiro NOME�Escrito por %s.
+-�Tipo de medio incorecto�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Si, 42 � o significado da vida�Si que a fastidiaches esta vez�A hora final da li�a de continuaci�n de fuso horario non segue � hora final da li�a anterior�[FICH...]�__get_myaddress: ioctl (obte-la configuraci�n da interface)�A definici�n `%1$s' non remata con `END %1$s'�`%s' non � un ficheiro de datos de perf�s correcto para `%s'�`-1' debe se-la derradeira entrada do campo '%s' na categor�a `%s'�`...' debe ser usado s� nas entradas `...' e `UNDEFINED'�Esper�base un `from' tralo primeiro par�metro de `collating-element'�A cadea `from' da delaraci�n de elemento de ordeaci�n cont�n un car�cter desco�ecido�ai_family non soportado�ai_socktype non soportado�xa en execuci�n�o par�metro de <%s> debe ser un s� car�cter�o par�metro de `%s' debe ser un s� car�cter�auth_none.c - Problema fatal de ordenaci�n�authunix_create: memoria esgotada
+-�par�metro incorrecto�propietario incorrecto�campo FROM baleiro na li�a Link�campo TO baleiro na li�a Link�bloque liberado d�as veces
+-�mcheck_status falso, a librer�a ten erros
+-�multidifusi�n: ioctl (obte-la configuraci�n do interfaz)�multidifusi�n: ioctl (obte-los par�metros do interfaz)�desbordamento do buffer�cache_set: non se puido reserver un novo rpc_buffer�cache_set: fallou a reserva de espacio para o obxectivo�cache_set: obxectivo non atopado�non podo determina-la abreviatura do fuso horario a usar despois da hora�non se pode reasigna-lo procedemento n�mero %d
+-�non se pode avalia-lo ficheiro de locales `%s'�non se poden localiza-los datos de s�mbolos�non se pode crear un descriptor interno�non se poden crear descriptores internos�non se pode facer que o socket acepte conexi�ns: %s�non podo atopa-lo preprocesador de C: %s 
+-�non podo atopar un preprocesador de C (cpp)
+-�non se pode manexa-la antiga petici�n versi�n %d; a versi�n actual � %d�non se pode inserta-lo elemento de ordenaci�n `%.*s'�non se pode insertar na t�boa de resultados�non se pode inserta-la nova definici�n de s�mbolo de ordenaci�n: %s�non se pode carga-los datos de perf�s�non se pode abrir�non se pode abrir `%s'�non se pode abri-lo ficheiro de bases de datos `%s': %s�non se pode abri-lo ficheiro de entrada `%s'�non se pode abri-lo ficheiro de definici�n de locales `%s'�non se pode abri-lo ficheiro de sa�da�non se pode abri-lo ficheiro de sa�da `%s'�non se pode abri-lo ficheiro de sa�da `%s' para a categor�a `%s'�non se pode abrir un socket: %s�non se pode procesa-la especificaci�n de orde�non se pode ler no directorio de mapas de caracteres `%s'�non se pode le-lo ficheiro de configuraci�n; isto � fatal�non se pode ler do cliente�non se pode le-la cabeceira de `%s'�non se pode le-lo directorio de locales `%s'�non se pode le-lo ficheiro de locales `%s'�non se pode le-lo mapa de repertorio `%s'�non se poden le-los datos estat�sticos�non se pode facer stat() sobre o ficheiro `%s': %s�non se poden escribi-los ficheiros de sa�da a `%s'�non se pode escribi-lo resultado: %s�non se poden escribi-las estat�sticas: %s�non se pode escribir no cliente�datos de categor�a pedidos m�is dunha vez: non deber�a ocorrer�o car�cter '%s' na clase `%s' debe estar na clase `%s'�o car�cter '%s' na clase `%s' non debe estar na clase `%s'�car�cter <SP> non definido no mapa de caracteres�o car�cter L'%s' (�ndice %Zd) na clase `%s' debe estar na clase `%s'�o car�cter L'%s' (�ndice %Zd) na clase `%s' non debe estar na clase `%s'�car�cter `%s' non definido, cando fac�a falta por ser valor por omisi�n�clase de caracteres `%s' xa definida�mapa de caracteres `%s' xa definido�ficheiro de mapa de caracteres `%s' non atopado�clnt_raw.c - Erro fatal de serializaci�n de cabeceiras.�clnttcp_create: memoria esgotada
+-�clntudp_create: memoria esgotada
+-�clntunix_create: memoria esgotada
+-�o elemento de ordenaci�n `%.*s' aparece m�is dunha vez: li�a ignorada�o elemento de ordenaci�n `%.*s' aparece m�is dunha vez: li�a ignorada�esper�base un s�mbolo de ordenaci�n despois de `%s'�conectarse ao enderezo %s: �esper�base unha constante ou un identificador�conversi�n de `%s' a `%s' non soportada�conversi�n detida debido a un problema escribindo na sa�da�non se puido crear un servidor rpc
+-�non se puido rexistra-lo prog %d vers %d
+-�base-de-datos [clave ...]�ficheiro de mapa de caracteres por defecto `%s' non atopado�a opci�n de direcci�n na cadea %d no campo `era' na categor�a `%s' non � '+' nin '-'�a opci�n de direcci�n na cadea %d no campo `era' na categor�a `%s' non � un �nico car�cter�nome do car�cter `%s' duplicado�definici�n do elemento de ordenaci�n duplicada�definici�n do car�cter `%.*s' duplicada�clave duplicada�definici�n de conxunto duplicada�fuso horario %s duplicado (ficheiro "%s", li�a %d)�identificador de mensaxes duplicado�n�mero de mensaxe duplicado�cadea de caracteres baleira�nome de peso baleiro: li�a ignorada�enablecache: cach� xa activada�enablecache: non se puido reservar espacio para a cach��enablecache: non se puido reservar espacio para os datos da cach��enablecache: non se puido reservar espacio para o fifo da cach��codificaci�n de sa�da�codificaci�n do texto orixinal�o final do rango dos puntos suspensivos � maior que o principio�erro ao obte-lo identificador do chamante: %s�erro ao pecha-la entrada `%s'�erro ao pecha-lo ficheiro de sa�da�erro ao pecha-lo ficheiro de datos de perf�s�erro ao inserta-lo elemento de ordenaci�n na t�boa hash�erro ao insertar na t�boa hash�erro ao ler da entrada�esp�rase un par�metro de cadea para `copy'�non se atopou a li�a de continuaci�n que se esperaba�non se puido carga-lo obxecto compartido `%s'�non se puideron carga-los datos de s�mbolos�non se puido facer mmap sobre o ficheiro de datos de perf�s�non se puido comeza-lo procesamento de conversi�n�non se puideron escribi-los datos da categor�a `%s'�fcntl: F_SETFD�campo `%s' na categor�a `%s' non definido�o ficheiro `%s' xa existe e pode ser sobreescrito
+-�o valor-dende do `elemento-de-ordenaci�n' debe ser unha cadea�fallou a chamada a fstat�lixo � fin da especificaci�n do c�digo de caracteres�lixo � fin do n�mero�lixo � fin do valor desprazamento na cadea %d no campo `era' da categor�a `%s'�lixo � fin da data inicial na cadea %d no campo `era' da categor�a `%s'�lixo � fin da data final na cadea %d no campo `era' da categor�a `%s'�xera-lo grafo de chamadas�xerar un perfil plano con contas e tempos�get_myaddress: ioctl (obte-la configuraci�n do interfaz)�getent - obte-las entradas da base de datos administrativa.�handle_request: petici�n recibida (Version = %d)�non se pode facer un enlace duro, �sase un enlace simb�lico�ten un enlace duro nalg�n sitio�campo CORRECTION ilegal na li�a Leap�campo Rolling/Stationary ilegal na li�a Leap�constante de caracteres ilegal na cadea�car�cter ilegal no ficheiro: �elemento de ordenaci�n ilegal�definici�n ilegal�codificaci�n dada ilegal�secuencia de escape ilegal � fin da cadea�secuencia de entrada ilegal na posici�n %ld�nomes ilegais para o rango de caracteres�tipo de rede ilegal :`%s'
+-�n�mero ilegal para o desprazamento na cadea %d no campo `era' da categor�a `%s'�n�mero de conxunto ilegal�data de inicio ilegal na cadea %d no campo `era' da categor�a `%s'�data final ilegal na cadea %d no campo `era' da categor�a `%s'�l�mite da implementaci�n: non se admiten m�is de %d clases de caracteres�l�mite da implementaci�n: non se admiten m�is de %d mapas de caracteres�secuencia de caracteres incompleta � fin do buffer�ficheiro con formato incorrecto�li�a de entrada de tipo desco�ecido�erro interno (descriptor ilegal)�erro interno - chamouse a addtype cun isdst incorrecto�erro interno - chamouse a addtype cun ttisgmt incorrecto�erro interno - chamouse a addtype cun ttisstd incorrecto�erro interno en %s, li�a %u�desprazamento UTC incorrecto�formato de abreviatura incorrecto�d�a do mes incorrecto�ano final incorecto�ano bisesto incorrecto�modo incorrecto para dlopen()�nome do mes incorrecto�hora gravada incorrecta�ano de inicio incorrecto�hora do d�a incorrecta�d�a da semana incorrecto�lonxitude da clave da petici�n demasiado grande: %Zd�a li�a tralos puntos suspensivos debe conte-la definici�n dun car�cter�a li�a antes dos puntos suspensivos non cont�n a definici�n dunha constante de car�cter�li�a demasiado longa�listar t�dolos conxuntos de caracteres codificados que se co�ecen�non se atopou o ficheiro de locale `%s', usado na instrucci�n `copy'�fallou a chamada a lstat�ign�rase unha li�a mal formada�fallou o mapeado da t�boa de cadeas da cabeceira da secci�n�fallou o mapeado das cabeceiras da secci�n�memoria alterada antes do bloque reservado
+-�memoria alterada despois do bloque reservado
+-�memoria esgotada�a memoria � consistente, a librer�a ten erros
+-�non se atopou un formato era na cadea %d no campo `era' da categor�a `%s'�non se atopou un nome era na cadea %d no campo `era' da categor�a `%s'�regra sen nome�non se especificou unha codificaci�n nin do orixinal nin do destino�netname2user: (busca nis+): %s
+-�netname2user: a entrada DES de %s no directorio %s non � �nica�netname2user: a entrada LOCAL de %s no directorio %s non � �nica�netname2user: non se atopou unha lista de identificadores de grupo en `%s'�netname2user: nome principal `%s' demasiado longo�netname2user: non deber�a ter uid 0�prog %d nunca rexistrado
+-�non se deu un valor <Uxxxx> ou <Uxxxxxxxx>�non hai unha expresi�n regular correcta para o campo `%s' da categor�a `%s': %s�ning�n d�a do mes coincide coa regra�non hai unha definici�n de `UNDEFINED'�non se deu un nome de ficheiro para os datos de perfil e o obxecto `%s' non ten so-nome�non se debe especificar outra clave cando se usa `copy'�non se produc�u un ficheiro de sa�da porque se deron avisos�non se especificou un mapa de repertorio: non se pode proceder�non se deu un nome simb�lico�non se deu un nome simb�lico para a fin do rango�non se defin�u un peso para o s�mbolo `%s'�non � un ficheiro normal�configuraci�n de nscd:
+-
+-%15d  nivel de depuraci�n do servidor
+-��Non se est� a executar nscd!
+-�s� se permiten definici�ns WIDTH seguindo � definici�n CHARMAP�a codificaci�n orixinal non foi especificada usando `-f'�ficheiro de sa�da�pmap_getmaps problema de rpc�poll: fallo de protocolo no establecemento do circuito
+-�erro de preprocesador�visualiza-la lista de rotas de conta e o seu n�mero de uso�visualiza-la informaci�n do progreso�problemas ao ler `%s'�o ficheiro de datos de perfil `%s' non coincide co obxecto compartido `%s'�o programa %lu non est� dispo�ible
+-�o programa %lu versi�n %lu non est� dispo�ible
+-�programa %lu versi�n %lu preparado e agardando
+-�rcmd: poll (configurando stderr): %m
+-�rcmp: socket: T�dolos portos est�n sendo utilizados
+-�rcmd: write (configurando stderr): %m
+-�registerrpc: memoria esgotada
+-�momento de segundo de correcci�n repetido�o ficheiro de mapa de repertorios `%s' non foi atopado�rpcgen: erro de codificaci�n da lista de par�metros
+-�rpcgen: demasiadas definici�ns
+-�rpcinfo: o servidor %s � desco�ecido
+-�rpcinfo: o servicio %s � desco�ecido
+-�rpcinfo: Non se puido borra-lo rexistro do prog %s versi�n %s
+-�rpcinfo: fallou a multidifusi�n: %s
+-�rpcinfo: non se pode contactar co portmapper�o mesmo nome de regra aparece en varios ficheiros�lectura demasiado curta ao le-la clave de petici�n: %s�lectura demasiado curta ao le-la petici�n: %s�escritura demasiado curta en %s: %s�socket: fallo do protocolo no establecemento do circuito
+-�as direcci�ns de ordenaci�n `forward' e `backward' son mutuamente exclu�ntes�a especificaci�n do peso na ordenaci�n do s�mbolo de ordenaci�n non ten sentido�entrada est�ndar�sa�da est�ndar�a data de comezo � ilegal na cadea %d no campo `era' da categor�a `%s'�o ano de comezo � maior c� ano final�o ano de comezo � demasiado grande para ser representado�o ano de comezo � demasiado pequeno para ser representado�a data de finalizaci�n � ilegal na cadea %d no campo `era' da categor�a `%s'�svc_run: - fallou a chamada a select�svc_tcp.c - non se pode chamar a getsockname ou listen�svc_tcp.c - problema ao crear un socket tcp�svc_tcp: makefd_xprt: memoria esgotada
+-�svc_unix.c - problema ao crear un socket AF_UNIX�svc_unix.c - non se pode chamar a getsockname ou listen�svc_unix: makefd_xprt: memoria esgotada
+-�svctcp_create: memoria esgotada
+-�svcudp_create - non se pode chamar a getsockname�svcudp_create: memoria esgotada
+-�svcudp_create: problema ao crear un socket�svcunix_create: memoria esgotada
+-�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n dun elemento�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n doutro s�mbolo�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n dun s�mbolo�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica un nome simb�lico no conxunto de caracteres�erro de sintaxe na definici�n %s: %s�erro de sintaxe na directiva `order_start'�erro de sintaxe na definici�n da clase de caracteres�erro de sintaxe na definici�n de conversi�n de caracteres�erro de sintaxe na definici�n de ordenaci�n�erro de sintaxe na definici�n de ordenaci�n�erro de sintaxe na definici�n da categor�a LC_CTYPE�erro de sintaxe na definici�n da nova clase de caracteres�erro de sintaxe na definici�n dun novo mapa de caracteres�erro de sintaxe na definici�n do locale de mensaxes�erro de sintaxe na definici�n do locale monetario�erro de sintaxe na definici�n do locale num�rico�erro de sintaxe na especificaci�n de orde�erro de sintaxe no pr�logo: %s�erro de sintaxe na definici�n do mapa de repertorio: %s�erro de sintaxe na definici�n do locale de data/hora�erro de sintaxe: non est� dentro dunha secci�n de definici�n de locale�a codificaci�n do destino non foi especificada usando `-t'�esta � a primeira definici�n�tempo antes de cero�desbordamento de tempo�demasiados poucos bytes na codificaci�n de caracteres�demasiados bytes na codificaci�n de caracteres�demasiadas clases de caracteres definidas�demasiados segundos de compensaci�n�demasiados tipos de hora local�!�demasiadas transici�ns?!�demasiados pesos�demasiadas abreviaturas de fuso horario, ou demasiado longas�lixo na fin da li�a�problemas ao respostar ao prog %d
+-�non se permiten d�as li�as nunha fila contendo `...'�ano �nico con tipo�non se pode reservar espacio para o buffer de entrada�non se pode libera-los par�metros�non definido�car�cter `%s' desco�ecido�car�cter desco�ecido no campo `%s' da categor�a `%s'�directiva de ordenaci�n desco�ecida�directiva `%s' desco�ecida: li�a ignorada�erro %d de iconv() desco�ecido�conxunto `%s' desco�ecido�s�mbolo `%.*s' desco�ecido: li�a ignorada�fuso sen regras�mensaxe non rematada�cadea non rematada�constante de cadea non rematada�nome simb�lico non rematado�nome de peso non rematado�o l�mite superior do rango non � menor c� l�mite inferior�uso: %s ficheiro-de-entrada
+-�uso do 29 de febreiro nun ano non bisesto�o valor de %s debe ser un enteiro�o valor de <%s> debe caer entre 1 e 4�o valor do campo `%s' da categor�a `%s' non debe ser unha cadea baleira�o valor de <mb_cur_max> debe ser maior c� valor de <mb_cur_min>�o valor do campo `int_curr_symbol' da categor�a `LC_MONETARY' non corresponde a un nome v�lido en ISO 4217�o valor do campo `int_curr_symbol' da categor�a `LC_MONETARY' ten unha lonxitude incorrecta�os valores do campo `%s' da categor�a `%s' deben ser menores que 127�aviso: �ao aceptar unha conexi�n: %s�ao reservar espacio para a entrada de cach��ao reservar espacio para a entrada da t�boa hash�ao reservar espacio para a copia da clave�ao abrir un antigo ficheiro de cat�logo�ao prepara-la sa�da�ao le-la base de datos�ao avalia-lo ficheiro de datos de perf�s�ao escribir no ficheiro de bases de datos�escritura incompleta�escribible por algu�n distinto do propietario�n�mero de par�metros incorrecto�n�mero de campos na li�a Leap incorrecto�n�mero de campos na li�a Link incorrecto�n�mero de campos na li�a Rule incorrecto�n�mero de campos na li�a de continuaci�n de Zone incorrecto�n�mero de campos na li�a Zone incorrecto�xdr_reference: memoria esgotada
+-�xdrrec_create: memoria esgotada
+-�yp_update: non se pode converti-lo servidor a nome de rede
+-�yp_update: non se pode obte-lo enderezo do servidor
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/it.mo glibc-2.1.3/po/it.mo
+--- ../glibc-2.1.3/po/it.mo	2000-02-24 18:13:10.000000000 -0800
++++ glibc-2.1.3/po/it.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,514 +0,0 @@
+-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n��
+-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_��	����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c��
���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d��	���kd�����ud�����yd��
����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i��	���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j�����
+-k�����k��$���/k��
+-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	����m��	���n��	���n��	���n��	���#n��	���-n��	���7n��	���An��	���Kn��	���Un��	���_n��	���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To��
���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir��
���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s��	����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu��	���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w��
+-����w������w������w��2���x�����5x�����Dx�����]x��
���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{��
+-����{������{������{������{������{�����	|�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i��������������������������������������
������������	���������'���!���?���	���a���
���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.��������������
���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉��������������
������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������
���������������)������?������T������l������t����������������������������������ڌ��*������(���
������6������C���"���W�������z����������������	������������$���/���
+-���T������_������n���������
���*������8���!���L������n������}�����������������"���������������������
+-���������'���-���#���U���6���y���
�������
+-����������ɑ��"���ё��"�������������"���1������T������t�����������������
����������ɒ�����ؒ������������������
������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!���	��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)���	���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę��������	����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C���
���m������{���+�����������������ޤ������������
+-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%���
���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0����������������
������ ������<������Q������e������z�����������������������������������#�������5������G���S���
�������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G���
�������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ�����������
+-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H�����������������
���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5���
���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#��������������	������������0���(������Y���$���u�����������������#������������������������	������������:������U���4���n������������������������'�������B������D���]���j�������K���
���?���Y���	���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������ ��>������_������w���O�������E�������&��� ���(���G������p������������������������
������������������������
���w�� �����������������"�������"�������������:���#������^������g������p�������������������������������������� ���������'��� ���D������e��� �����������������������������������
����������
+-���������:���$���9���_���>�������3�������)���������6���(���R���$���{����������,�������6�������=��� ���4���^����������+�������,�������������!���*���"���L������o������������������������5����������	���.���#���.���R���.�������.�������.�������������-���$���)���R���!���|�����������������+�������������)���&���+���P���,���|��� �������*�������!�������"���������:������V���$���u���$���������������1���H������z���4�������>�������������+���#���
���O���D���]����������<�������#�������'���������<���1���H���3���z���)����������������������������-����������'���2���<���2���o���A���������������������"�������"���#���"���F������i���/�������D�������1����������,������>���
���W������e���!���z�����������������#��������������������#���2������V������u�����������������%��������������
+-�������	���
+-���������#������
���<���9���J���8�������;�������(�������!���"���!���D������f���+�������0�������8�������:������.���T���"�������/�������A�������*������7���C���1���{���3�������-�������<������'���L������t����������$��������������$�������&���������-���\���L���c����������
���(���#������L���
+-���f���<���q����������m������&���<���;���c���A�������1����������������,���*���A���
+-���l������w������}���%��������������.������� �������(���������7������L������l�����������������������������������������	���0���$���+���U���<����������������������������
�������%�������������
+-���!���
+-���,���
+-���7���
+-���B���
+-���M���
+-���X���
+-���c���
+-���n���
+-���y���
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-�������
+-������	������	������	���'���	���1���	���;���	���E���	���O���	���Y������c���P������,�������*�������,���(���
���U������c���4���}����������<������� �������0���������F���$���U���.���z����������)�������������������� ���!������B���0���[�����������������������������������g���5�������#���������������������������������'���+���-���S����������+�������/�������+�������+������/���<������l���,���y���
�������
�������>����������������
+-������������%������?���)���S���
���}���&�������(�������7����������������-������<���'���K������s�������������������������������:���������� ���#���5���)���Y���!�������"�������"�����������������������(���#���;���3���_���*����������������������������#������!���A������c������s������������������������
+-���������������������:����������������1������M������_������y���%������� ���������������������0������*���9������d������~���m�������������6������#���O������s������������������������������������������������������<������P������U������b���L���f���(���������������������5���������H������Z������a���(���n���!����������������������������$���
������2���6���I���6�������
��������������"�������&������1���+���'���]���
�������$���������������������"���������������0�����G��(���e��1������)������&������$�������6�$���U����z�#���������������%���������#���*�.���N�	���}�����������������������������	��������3����?�)���]���������������������`�����$���<����a�
��������������������$����������$�������3����K����a����|������3���������������"�������;����Z����y�������������������������������4�������:����J�(���\�<�����2���������� �������,����?����Y�#���t������#���������������*���	�&���.	����U	����Z	�)���r	�#����	�����	�$����	����
+-����
+-�#���8
+-����\
+-�*���z
+-�)����
+-�%����
+-�"����
+-��������3����R����p�*����������1�����
�����������,����F����_����u�
�����4�����=�����&���
����9
����U
�"���j
�����
�!����
�@����
�1�������7����D�>���[�$����������%����������!����
���<�'���J����r�,������������������������������ ����%���7�&���]�$���������������	�����&���������1���'����Y�%���r������������������������������������������,����D�(���^������0�����-��������������.��������J�����������
+-���������1����	���Q����[����n����8�
���H����V� ���g���������������������(�����
��������
����&����7�$���M�$���r�=����������
+-����������&�����&���#����J�)���i�"�����&�����#����������������-����A����R����f���������������������������������&����9����L����[����{������"�����9�����&������������=�1���\������-����������2�����.����)���F�-���p�������������������������������"����/���&�m���V�	�����C�����0����?���C�B�����;�����:����c���=����������������2�����2��� �,���G �"���t ����� ����� �$���� �"���� ����!�.���'!�;���V!�0����!�����!�3����!�.���"����:"�\���Y"�2����"�7����"�'���!#�)���I#�(���s#�<����#�+����#�'���$�R���-$�4����$�5����$�F����$�*���2%����]%����p%�0����%�(����%�C����%�$���&&�)���K&�?���u&�!����&�-����&�>���'�>���D'�����'�$����'�7����'�2����'�*���2(�%���](�)����(�-����(�$����(�'����)����()�D���H)�A����)�E����)�4���*�O���J*�S����*�F����*�%���5+�$���[+�+����+�9����+�!����+�!���,�"���*,�F���M,�F����,�+����,����-�'���&-�&���N-�K���u-�!����-�/����-����.�7���).�`���a.�e����.����(/�-���H/�,���v/�����/�����/�.����/�#���0����&0����B0�$���]0� ����0�*����0�4����0�5���1����91����O1�@���l1�'����1�����1�"����1�3���2�C���J2�(����2�����2�%����2�����2�-���3�'���C3�9���k3�/����3�2����3����4�1���4�7���I4�D����4�
����4�<����4����5�e���15�`����5�`����5� ���Y6�*���z6�?����6�0����6�6���7�*���M7� ���x7�*����7�2����7�)����7����!8����?8����_8����t8�*����8�.����8�+����8����9�Y���,9�����9�M����9�K����9�B���=:�A����:�=����:�!����;�"���";�%���E;�2���k;�4����;�4����;����<����&<�$���A<����f<����}<�����<�����<�����<�����<�����<����=����=�8���6=�B���o=�E����=�����=�/���
+->�F���:>�
����>�����>�I����>�,����>�/���?�6���O?�����?�,����?�P����?�M���@����c@�M���r@� ����@�>����@�@��� A�2���aA�/����A�"����A�+����A�5���B�P���IB�.����B�"����B�l����B�>���YC�9����C�=����C����D�9���.D�(���hD�����D�;����D�����D�D����D�6���DE����{E�����E�4����E�����E�5����E�!���+F����MF�R���dF�#����F�8����F�;���G�(���PG�)���yG�)����G�����G�(����G�$���H�)���:H����dH�!���{H�&����H�Y����H����I�-���>I�!���lI�8����I�.����I� ����I�6���J�@���NJ�I����J�����J�����J�M����J�'���FK�4���nK�5����K�S����K����-L�1���GL�0���yL�'����L�5����L�2���M�(���;M� ���dM�,����M� ����M�/����M�!���N�b���%N�h����N�`����N�W���RO�.����O�0����O�?���
+-P�D���JP�>����P�5����P�-���Q�E���2Q�D���xQ�G����Q�C���R�B���IR�1����R�"����R�=����R�C���S�I���cS�<����S�����S����T���� T�-���3T�'���aT�#����T�����T�����T�����T�����T�3���U����9U�%���YU�7���U�����U�*����U�"����U����V����(V�9���CV�#���}V�)����V� ����V�����V�)���W����/W����AW����YW����oW�����W�����W�@����W����X�"���X�"���:X�0���]X�Q����X�I����X�n���*Y�Y����Y�J����Y����>Z����KZ����iZ�!����Z�����Z�$����Z�����Z�����Z�)���[����>[����][�)���n[�����[�'����[�'����[�'���\�8���.\�'���g\� ����\� ����\�4����\�7���]������������:��c����������������
+-�����������}�������������H��8��	���������������1����������������������C���������������������������������
���������V�������������R���������V��z����������������������a������m��������������+���������
+-����������������
�������	��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"��������
�����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������	�������=������2��?��������*���������������u����������������z������������������$������J��^�����������
���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������
+-����������������������������d���o�������������'������������V��E������t��_��������������������������
+-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y���	����������Q��?��������������'����		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Can't unlink  %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing �%s: Error writing %s
+-�%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open %s: %m
+-�%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights :
+-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : `%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns   : %d
+-�Number of objects : %u
+-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE�TABLE
+-�TABLE,yes�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1.3
+-POT-Creation-Date: 2000-02-16 10:39-0800
+-PO-Revision-Date: 2000-02-20 22:17+01:00
+-Last-Translator: Marco d'Itri <md@linux.it>
+-Language-Team: Italian <it@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�		Diritti di Accesso : �		Attributi     : �	%s [-abkCLNTM][-Dnome[=valore]] [-i dimes] [-I [-K secondi]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Diritti di accesso: �	Dati della voce di tipo %s
+-�	Nome       : %s
+-�	Chiave pubblica : �	Tipo   : %s
+-�	Indirizzi universali (%u)
+-�	[%d]	Nome          : %s
+-�	[%u] - [%u byte] �
+-cache %s:
+-
+-%15s  la cache � abilitata
+-%15Zd  dimensioni suggerite
+-%15ld  secondi di vita per le voci positive
+-%15ld  secondi di vita per le voci negative
+-%15ld  cache hit sulle voci positive
+-%15ld  cache hit sulle voci negative
+-%15ld  cache miss sulle voci positive
+-%15ld  cache miss sulle voci negative
+-%15ld%% hit rate della cache
+-%15s  controlla i cambiamenti di /etc/%s
+-�
+-Membri del gruppo :
+-�
+-Tempo da vivere: �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�      si�Lunghezza dati = %u
+-�    Membri espliciti:
+-�    Non-membri espliciti:
+-�    Membri impliciti:
+-�    Non-membri impliciti:
+-�    Nessun membro esplicito
+-�    Nessun non-membro esplicito
+-�    Nessun membro implicito
+-�    Nessun non-membro implicito
+-�    Nessun membro ricorsivo
+-�    Nessun non-membro ricorsivo
+-�     Membri ricorsivi:
+-� programma vers proto   porta
+-�   o: � (regola da "%s", riga %d)� [OPZIONE...]� fatto
+-�"%s", riga %d: %s�La riga "Zone %s" e l'opzione -l sono mutuamente esclusive�La riga Zone %s" e l'opzione -p sono mutuamente esclusive�"infile" � necessario per i flag di generazione del template.
+-�%.*s: Il parametro ARGP_HELP_FMT richiede un valore�%.*s: Parametro ARGP_HELP_FMT sconosciuto�%s in una zona senza regole�%s%s%s:%u: %s%sAsserzione `%s' fallita.
+-�%s%s%s:%u: %s%sErrore inatteso: %s.
+-�%s%sSegnale %d sconosciuto
+-�%s: %d non ha esteso correttamente il segno
+-�%s: <mb_cur_max> deve essere maggiore di <mb_cur_min>
+-�%s: il preprocessore C ha fallito con il codice di uscita %d
+-�%s: il preprocessore C ha fallito con il segnale %d
+-�%s: Impossibile creare %s: %s
+-�%s: Impossibile creare la directory %s: %s
+-�%s: Impossibile fare un link da %s a %s: %s
+-�%s: Impossibile aprire %s: %s
+-�%s: Impossibile rimuovere %s: %s
+-�%s: Impossibile cancellare %s: %s
+-�%s: Errore chiudendo %s: %s
+-�%s: Errore leggendo %s
+-�%s: Errore scrivendo �%s: Errore scrivendo %s
+-�%s: riga leap nel file non di secondi intercalari %s
+-�%s: Memoria esaurita: %s
+-�%s: � stata specificata pi� di una opzione -L
+-�%s: � stata specificata pi� di una opzione -d
+-�%s: � stata specificata pi� di una opzione -l
+-�%s: � stata specificata pi� di una opzione -p
+-�%s: � stata specificata pi� di una opzione -y
+-�%s: Troppi argomenti
+-�%s: impossibile ottenere l'orario di modifica�%s: il comando era '%s', il risultato %d
+-�%s: errore nella macchina a stati�%s: opzione non permessa -- %c
+-�%s: opzione non valida -- %c
+-�%s: l'opzione `%c%s' non accetta argomenti
+-�%s: l'opzione `%s' � ambigua
+-�%s: l'opzione `%s' richiede un argomento
+-�%s: l'opzione `--%s' non accetta argomenti
+-�%s: l'opzione `-W %s' non accetta argomenti
+-�%s: l'opzione `-W %s' � ambigua
+-�%s: l'opzione richiede un argomento -- %c
+-�%s: l'output sovrascriverebbe %s
+-�%s: panico: l_value %d non valido
+-�%s: fine del file prematura�%s: impossibile aprire %s: %m
+-�%s: opzione `%c%s' non riconosciuta
+-�%s: opzione `--%s' non riconosciuta
+-�%s: l'uso � %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ]
+-	[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ nomefile ... ]
+-�%s: l'uso � %s [ -v ] [ -c cutoff ] nomezona ...
+-�%s: scrivendo l'output %s: %m�(ERRORE DEL PROGRAMMA) Nessuna versione conosciuta!?�(PROGRAM ERROR) L'opzione avrebbe dovuto essere riconosciuta!?�(Oggetto sconosciuto)
+-�(errore di autenticazione sconosciuto - %d)�(sconosciuto)�*** Il file `%s' � stripped: impossibile fare l'analisi dettagliata
+-�*standard input*�-o FILE-OUTPUT [FILE-INPUT]...
+-[FILE-OUTPUT [FILE-INPUT]...]�sezione .lib nell'a.out danneggiata�; low version = %lu, high version = %lu�; motivo = �<%s> e <%s> non sono nomi leciti per l'intervallo�Il carattere <SP> non deve essere nella classe `%s'�Il carattere <SP> non � nella classe `%s'�?�Abortito�Diritti di Accesso : �Accesso ad una libreria condivisa danneggiata�Indirizzo gi� in uso�Famiglia dell'indirizzo non gestita per l'hostname�Famiglia dell'indirizzo non gestita dal protocollo�Famiglia dell'indirizzo non gestita dalla famiglia del protocollo�Advertise error�Alarm clock�Overflow della tabella degli anode�Lista degli argomenti troppo lunga�Lista degli argomenti troppo lunga�Argomento fuori dal dominio�Si � tentato di rimuovere una tabella non vuota�Si � tentato di linkare pi� librerie condivise del limite di sistema�Si � tentato di linkare troppe librerie condivise�Autenticazione OK�Errore di autenticazione�BOGUS OBJECT
+-�Indirizzo non valido�Descrittore di scambio non valido�Descrittore di file non valido�Descrittore di file non valido�Formato del file di font non valido�Messaggio non valido�Codice di richiesta non valido�Descrittore di richiesta non valido�Chiamata di sistema non valida�Valore di ai_flags non valido�Conformit� POSIX rigorosa�Dati binari
+-�� necessario un dispositivo a blocchi�Problema di poll del broadcast�Pipe rotta�Bus error�CDS�Superato il limite del tempo di CPU�Cache scaduta�Impossibile accedere ad una libreria condivisa necessaria�Impossibile eseguire direttamente una libreria condivisa�Impossibile fare il bind al server che serve questo dominio�Impossibile comunicare con il portmapper�Impossibile comunicare con ypbind�Impossibile comunicare con ypserv�Impossibile allocare memoria�Impossibile assegnare l'indirizzo richiesto�Impossibile creare il socket per l'rpc broadcast�Impossibile eseguire direttamente una libreria condivisa�Impossibile avere pi� di un flag di generazione del file!
+-�Impossibile ricevere una risposta al broadcast�Impossibile registrare il servizio�Impossibile inviare dopo lo shutdown del socket�Impossibile inviare dopo lo shutdown dell'estremit� del trasporto�Impossibile inviare il pacchetto broadcast�Impossibile impostare l'opzione del socket SO_BROADCAST�Impossibile specificare pi� di un file di input!
+-�Impossibile usare il flag netid con il flag inetd!
+-�Impossibile usare il flag netid senza TIRPC!
+-�Impossibile usare il flag della tabella con il nuovo stile!
+-�Numero del canale fuori dall'intervallo�Separatore dei caratteri: %c
+-�Il figlio � uscito�Credenziale del client troppo debole�Colonne:            :
+-�Errore di comunicazione durante send�Compila la specifica di localizzazione�Il computer ha tirato le cuoia�Calcolo le dimensioni della tabella per le classi di caratteri.
+-Pu� essere una cosa lunga...�Calcolo le dimensioni della tabella per le informazioni di collazione.
+-Pu� essere una cosa lunga...�Connessione rifiutata�Connessione abbattuta dal corrispondente�Timeout della connessione�Continuato�Converte in un'altra codifica la codifica dei file indicati.�Converte la chiave in minuscolo�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-Questo � software libero; si veda il sorgente per le condizioni di copiatura.
+-NON c'� alcuna garanzia; neppure di COMMERCIABILIT� o IDONEIT� AD UN
+-PARTICOLARE SCOPO.
+-�impossibile creare il file di log "%s"�Crea un header C NOME contenente le definizioni dei simboli�Crea l'output anche se sono stati emessi messaggi di avvertimento�Crea un semplice database DB dall'input testuale.�Orario di creazione : %s�Link tra dispositivi�La voce DES per il netname %s non � unica
+-�DIRECTORY
+-�DNANS�DNS�Non esiste un database per la tabella�Il database � occupato�Individuata/evitata una situazione di deadlock�Diritti di accesso predefiniti:
+-�� necessario l'indirizzo di destinazione�Dispositivo occupato�Il dispositivo non � uno stream�Dispositivo non configurato�Dispositivo o risorsa occupata�Diffie-Hellmann (%d bit)
+-�Directory     : %s
+-�La directory non � vuota�Superata la quota di disco�Superata la quota di disco�Non fa fork e stampa i messaggi sul tty corrente�Non stampa messaggi mentre crea il database�Non usa il catalogo esistente, forza un nuovo file di output�Dominio non collegato�trap EMT�ENTRY
+-�Dati cifrati
+-�I tipi di voce/tabella non coincidono�Errore 0�Errore 100�Errore 101�Errore 102�Errore 103�Errore 104�Errore 105�Errore 106�Errore 107�Errore 108�Errore 108�Errore 110�Errore 111�Errore 112�Errore 113�Errore 114�Errore 115�Errore 116�Errore 117�Errore 118�Errore 119�Errore 136�Errore 142�Errore 58�Errore 59�Errore 72�Errore 73�Errore 75�Errore 76�Errore 91�Errore 92�Errore nel sottosistema RPC�Errore nell'accesso al file per la partenza a freddo di NIS+.
+-NIS+ � installato?�Errore in un sistema di errore sconosciuto: �Errore parlando alla procedura di callback�Errore: il file .netrc � leggibile da altri.�Scambio pieno�Errore di formato di exec�FATALE: il sistema non definisce `_POSIX2_LOCALEDEF'�FILE�FILE contiene la mappatura dai nomi simbolici ai valori UCS4�Fallito (errore non specificato)�Il descrittore di file � in uno stato non valido�Il file esiste�Deadlock durante il locking del file�Errore di deadlock durante il locking del file�Nome del file troppo lungo�Superato il limite di dimensione del file�Overflow della tabella dei file�File troppo grande�La prima/prossima catena � rotta�Errore di virgola mobile�� necessario un resync completo per la directory�Funzione non implementata�GRUPPO
+-�Spazzatura in ARGP_HELP_FMT: %s�Genera un catalogo di messaggi.\vSe INPUT-FILE � -, l'input � letto dallo standard input. Se OUTPUT-FILE
+-� -, l'output � scritto sullo standard output.
+-�Errore di sistema generico�Legge le informazioni specifiche alla localizzazione.�D� un breve messaggio di istruzioni�D� questa lista di aiuto�Errore gratuito�Gruppo        : %s
+-�Flag del gruppo: �Voce del gruppo per il gruppo "%s.%s":
+-�Si blocca per SECS secondi (predefiniti 3600)�Hangup�Non ho trovato "%d" nella cache dei gruppi!�Non ho trovato "%d" nella cache delle password!�Non ho trovato "%s" nella cache dei gruppi!�Non ho trovato "%s" nella cache degli host!�Non ho trovato "%s" nella cache delle password!�L'host � gi��Errore durante la ricerca del nome dell'host�Errore di I/O�I/O possibile�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�trap IOT�IVY�Identificatore rimosso�Sequenza di byte illecita�Istruzione illecita�Tipo di oggetto illecito per l'operazione�Seek illecito�Tipo di file o formato non appropriato�IOCTL non appropriata per il dispositivo�Operazione non appropriata per un processo sullo sfondo�Richiesta di informazioni�Informazioni: �File di input:�Specifiche del formato di input/output:�Errore di input/output�Errore interno di NIS�Errore interno di ypbind�Interruzione�Chiamata di sistema interrotta�La chiamata di sistema interrotta deve essere ricominciata�Argomento non valido�Riferimento all'indietro non valido�Nome della classe di caratteri non valido�Credenziali del client non valide�Verificatore del client non valido�Carattere di collazione non valido�Contenuto di \{\} non valido�Link tra dispositivi non valido�Scambio non valido�Oggetto non valido per l'operazione�Carattere largo o multibyte non valido o incompleto�Espressione regolare precedente non valida�Fine dell'intervallo non valida�Espressione regolare non valida�Codice di richiesta non valido�Descrittore di richiesta non valido�Verificatore di server non valido�Slot non valido�Invalida la cache indicata�� una directory�� un file con nome�� un tipo di file con nome�Kerberos.
+-�Ucciso�LINK
+-�La voce LOCAL per l'UID %d nella directory %s non � unica
+-�Livello 2 fermato�Livello 2 non sincronizzato�Livello 3 fermato�Livello 3 reinizializzato�Il link � stato tagliato�Numero del link fuori dall'intervallo�Il link punta a un nome illecito�Tipo di oggetto collegato : �Collegato a : %s
+-�Il nome del dominio locale non � stato impostato�Errore di allocazione delle risorse locali�La macchina non � in rete�Nome malformato o illecito�Gli argomenti obbligatori o opzionali delle opzioni lunghe lo sono anche
+-per le corrispondenti opzioni corte.�Master Server :
+-�Il master server � occupato, dump integrale rimandato.�Errore di allocazione della memoria�Memoria esaurita�Tabelle dei messaggi piene�Messaggio troppo lungo�Attributo mancante o malformato�Orario di modifica: %s�Modifica fallita�Operazione di modifica fallita�Modifica il formato di output:�Tentato un multihop�NOME�NOME
+-[-a|-m]�NIS�versioni di client/server NIS incompatibili - non si pu� fornire il servizio�Il database della mappa NIS non � valido�Operazione NIS+ fallita�Server NIS+ non raggiungibile�Il servizio NIS+ non � disponibile o non � installato�OGGETTO MANCANTE
+-�NUMERO�Nome : `%s'
+-�Demone di caching del servizio dei nomi.�Nome non servito da questo server�Il nome non � unico sulla rete�Nome o servizio sconosciuto�Il nome/voce non � unico�L'oggetto indicato non � ricercabile�Serve un autenticatore�La rete ha lasciato cadere la connessione per il reset�La rete ha lasciato cadere la connessione per il reset�La rete � gi��La rete non � raggiungibile�La struttura CSI non � disponibile�Non ci sono semafori XENIX disponibili�Non ci sono indirizzi associati al nome dell'host�Non ci sono indirizzi associati al nome�Manca l'anode�Non c'� spazio di buffer disponibile�Non ci sono processi figli�Non ci sono dati disponibili�Non c'� spazio per file sul server�Non ci sono lock disponibili�Nessuna corrispondenza�Non � stato trovato un medium�Non ci sono messaggi del tipo desiderato�Non ci sono altri record nel database della mappa�Manca una precedente espressione regolare�Non ci sono lock di record disponibili�Nessun programma remoto registrato.
+-�Non c'� una route verso l'host�Non � rimasto spazio sul dispositivo�Dispositivo inesistente�Dispositivo o indirizzo inesistente�File o directory inesistente�La chiave non � nella mappa�La mappa non � nel dominio del server�Processo inesistente�Incontrato un namespace non di NIS+�Errore irreparabile nella risoluzione dei nomi�Nessuno.
+-�Non � un file con nome di XENIX�Non � un messaggio di dati�Non � una directory�Non � un file con nome�Non � un dispositivo stream�Non disponibile�Non c'� abbastanza spazio�Non trovato�Non trovato, nome inesistente�Non � un server master per questo dominio�Non � il proprietario�Non gestito�Numero di Colonne   : %d
+-�Numero di oggetti : %u
+-�Il numero di link simbolici incontrati durante l'attraversamento del percorso eccede MAXSYMLINKS�Argomento numerico fuori dal dominio�Risultato numerico fuori scala�Oggetto #%d:
+-�Nome dell'oggetto: %s
+-�Tipo dell'oggetto: �L'oggetto � remoto�Esiste un oggetto con lo stesso nome�Numero dispari di virgolette�Solo root puo` usare questa opzione!�Operazione gi� in corso�Operazione cancellata�Operazione non applicabile�Operazione non permessa�Operazione non gestita�Operazione non gestita dall'estremit� del trasporto�L'operazione ora � in corso�L'operazione si bloccherebbe�Opzione non gestita dal protocollo�Risorse degli streams esaurite�Risorse degli streams esaurite�Controllo dell'output:�Selezione dell'output:�Proprietario  : %s
+-�PRIVATO
+-�Pacchetto non installato�Errore di parsing: %s�Successo parziale�L'oggetto passato non � lo stesso oggetto sul server�Permesso negato�Manca la corrente�Fine prematura dell'espressione regolare�Stampa il contenuto del file del database, una voce per riga�Stampa le statistiche della configurazione attuale�Stampa altri messaggi�Stampa la versione del programma�Probabile successo�Probabilmente non trovato�Timer di profiling scaduto�Driver del protocollo non collegato�Errore di protocollo�Famiglia del protocollo non gestita�Protocollo non disponibile�Protocollo non gestito�Tipo di protocollo sbagliato per il socket�Query illecita per la tabella indicata�Quit�Errore specifico di RFS�Procedura RPC non valida per il programma�Errore di RPC su una operazione NIS�Programma RPC non disponibile�Versione sbagliata del programma RPC�La struct RPC non � valida�Versione di RPC sbagliata�RPC: (codice di errore sconosciuto)�RPC: Errore di autenticazione�RPC: Impossibile decodificare il risultato�RPC: Impossibile codificare gli argomenti�RPC: Fallito (errore non specificato)�RPC: Versioni di RPC incompatibili�RPC: Errore del portmapper�RPC: Procedura non disponibile�RPC: Programma non registrato�RPC: Programma non disponibile�RPC: Programma/versione non corrispondenti�RPC: Errore del sistema remoto�RPC: Il server non pu� decodificare gli argomenti�RPC: Successo�RPC: Tempo scaduto�RPC: Impossibile ricevere�RPC: Impossibile inviare�RPC: Host sconosciuto�RPC: Protocollo sconosciuto�RSA (%d bit)
+-�RTLD_NEXT usato in codice non caricato dinamicamente�Legge e mostra i dati di profilazione degli oggetti condivisi�Legge i dati di configurazione da NOME�File system di sola lettura�Segnale real-time %d�Espressione regolare troppo grande�Errore di I/O remoto�� cambiato l'indirizzo del remoto�Rimuovere la password o rendere il file illeggibile dagli altri.�Fallita la riapertura dell'oggetto condiviso `%s'�Replica   :
+-�Segnalare i bug a %s.
+-�Segnalare i bug a <bugs@gnu.org> usando lo script `glibcbug'.
+-�Argomenti della richiesta non validi�Riservato per usi futuri�Errore 0 del resolver (nessun errore)�Errore interno del resolver�Evitato un deadlock sulle risorse�Risorsa persa�Risorsa temporaneamente non disponibile�Risultato troppo grande�Risultati inviati alla procedura di callback�SHOBJ [PROFDATA]�SUNYP�Percorso di ricerca : %s
+-�Segmentation fault�Server occupato, riprovare�Il server ha esaurito la memoria�Il server ha rifiutato le credenziali�Il server ha rifiutato il verificatore�Servname non gestito per ai_socktype�Imposta il nome del programma�Disattiva il server�Segnale 0�Operazione per socket su un non socket�Tipo di socket non gestito�Il programma ha causato la fine della connessione�Spiacente, non sei root
+-�Le definizioni sorgente sono nel FILE�Errore di srmount�Stack fault�Vecchio file handle NFS�Lancia NUMERO thread�Stato             : %s
+-�Fermato�Fermato (segnale)�Fermato (input da tty)�Fermato (output da tty)�Errore di pipe di streams�La struttura ha bisogno di essere pulita�Successo�Sopprime messaggi di avvertimento e informazione�Nomi simbolici dei caratteri definiti in FILE�Errore di sistema�Informazioni sul sistema:�Errore di allocazione delle risorse di sistema�Directory di sistema per le mappe dei caratteri: %s
+-                     repertoire maps           : %s
+-                     percorso di localizzazione: %s
+-%s�TABELLA�TABELLA
+-�TABELLA,si�Tipo di tabella     : %s
+-�Errore temporaneo durante la risoluzione del nome�Terminato�File text occupato�La seguente lista contiene tutti i set di caratteri codificati noti. Questo
+-non significa necessariamente che tutte le combinazioni di questi nomi possono
+-essere usate per i parametri di linea di comando FROM e TO. Un set di
+-caratteri codificato pu� essere elencato con diversi nomi diversi (alias).
+-Alcuni nomi non sono semplici stringhe ma espressioni regolari e corrispondono
+-a una variet� di nomi che possono essere dati come parametri al programma.
+-
+-  �Tempo di vita: �Timer scaduto�Troppi attributi�Troppi livelli di link simbolici�Troppi link�Troppi file aperti�Troppi file aperti nel sistema�Troppi processi�Troppi riferimenti: impossibile dividere�Troppi utenti�Trap di trace/breakpoint�Backslash finale�Il traduttore � morto�Estremit� del trasporto gi� connesso�Estremit� del trasporto non connesso�Usare `%s --help' o `%s --usage' per ulteriori informazioni.
+-�Proviamo %s...
+-�Tipo : %s
+-�SCONOSCIUTO�Impossibile autenticare il client NIS+�Impossibile autenticare il server NIS+�Impossibile creare il callback�Impossibile creare il processo sul server�Sconosciuto (tipo = %d, bit = %d)
+-�Parola chiave di .netrc sconosciuta %s�Codice di errore di NIS sconosciuto�Databae sconosciuto: %s
+-�Errore sconosciuto�Errore sconosciuto �Host sconosciuto�Oggetto sconosciuto�Opzione sconosciuta: %s %s %s�Errore conosciuto del resolver�Errore sconosciuto del server�Segnale %d sconosciuto�Errore di sistema sconosciuto�Errore sconosciuto di ypbind�( o \( sbilanciato�) o \) sbilanciato�[ o [^ sbilanciato�\{ sbilanciato�Variabile `%s' non riconosciuta�Condizione di I/O urgente�Uso:�Uso: %s nome_variabile [percorso]
+-�Uso: rpcinfo [ -n numporta ] -u host numprog [ numvers ]
+-�Usa una cache separata per ogni utente�Segnale 1 definito dall'utente�Segnale 2 definito dall'utente�Valore troppo grande per il tipo di dato definito�Virtual timer expired�Risultato assurdo dall'esecuzione del comando�Finestra cambiata�Scrive i nomi delle mappe di caratteri disponibili�Scrive i nomi delle localizzazioni disponibili�Scrive i nomi delle categorie selezionate�Scrive i nomi delle parole chiave selezionate�Scrive l'output nel file NOME�Scritto da %s.
+-�Tipo di medium errato�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�S�, 42 � il significato della vita�Questa volta hai davvero combinato un pasticcio�Il tempo finale della riga di continuazione della zona
+-non � successivo al tempo finale della riga precedente�[FILE...]�__get_myaddress: ioctl (ottiene la configurazione dell'interfaccia)�la definizione `%1$s' non finisce con `END %1$s'�`%s' non � un file con i dati di profilazione corretti per `%s'�`-1' deve essere l'ultima voce del campo `%s' nella categoria `%s'�`...' deve essere usata solo nelle voci `...' e `UNDEFINED'�manca `from' dopo il primo argomento a `collating-element'�la stringa `from' nella dichiarazione dell'elemento di collazione
+-contiene un carattere sconosciuto�ai_family non gestita�ai_socktype non gestito�gi� in esecuzione�l'argomento di <%s> deve essere un unico carattere�l'argomento di `%s' deve essere un unico carattere�auth_none.c - Problema fatale di marshalling�authunix_create: memoria esaurita
+-�argomenti non validi�proprietario non valido�campo FROM vuoto in una riga di Link�campo TO vuoto in una riga di Link�blocco liberato due volte
+-�mcheck_status insensato, la libreria � bacata
+-�broadcast: ioctl (leggi la configurazione dell'interfaccia)�broadcast: ioctl (leggi i flag dell'interfaccia)�overflow del buffer�cache_set: impossibile allocare un nuovo rpc_buffer�cache_set: fallita l'allocazione della vittima�cache_set: vittima non trovata�impossibile determinare l'abbreviazione del fuso orario
+-da usare subito dopo il tempo finale�impossibile riassegnare il numero di procedura %d
+-�impossibile fare `stat' sul file di localizzazione `%s'�impossibile allocare i dati dei simboli�impossibile creare il descrittore interno�impossibile creare i descrittori interni�impossibile abilitare il socket ad accettare connessioni: %s�impossibile trovare il preprocessore C: %s
+-�impossibile trovare un preprocessore C
+-�impossibile gestire una vecchia richiesta di versione %d;
+-la versione attuale � %d�impossibile inserire l'elemento di collazione `%.*s'�impossibile l'inserimento nella tabella dei risultati�impossibile inserire la nuova definizione di simbolo di collazione: %s�impossibile leggere i dati di profilazione�impossibile aprire�impossibile aprire `%s'�impossibile aprire il file del database `%s': %s�impossibile aprire il file di input `%s'�impossibile aprire il file di definizione della localizzazione `%s'�impossibile aprire il file di output�impossibile aprire il file di output `%s'�impossibile aprire il file di output `%s' per la categoria `%s'�impossibile aprire il socket `%s'�impossibile elaborare le specifiche di ordine�impossibile leggere la directory delle mappe di caratteri `%s'�impossibile leggere il file di configurazione. Questo � fatale�impossibile leggere dal client�impossibile leggere l'header da `%s'�impossibile leggere la directory di localizzazione `%s'�impossibile leggere il file di localizzazione `%s'�impossibile leggere la repertoire map `%s'�impossibile leggere i dati statistici�impossibile fare stat() sul file `%s': %s�impossibile scrivere i file di output su `%s'�impossibile scrivere i risultati: %s�impossibile scrivere le statistiche: %s�impossibile scrivere sul client�dati di categoria richiesti pi� di una volta: non dovrebbe succedere�il carattere '%s' nella classe `%s' deve essere nella classe `%s'�il carattere '%s' nella classe `%s' non deve essere nella classe `%s'�carattere <SP> non definito nella mappa di caratteri�il carattere L'%s' (indice %Zd) nella classe `%s' deve essere nella classe `%s'�il carattere L'%s' (indice %Zd) nella classe `%s' non deve essere nella classe `%s'�carattere `%s' non definito sebbene necessario come valore predefinito�classe di caratteri `%s' gi� definita�mappa di caratteri `%s' gi� definita�file di mappa di caratteri `%s' non trovato�clnt_raw.c - Errore fatale di serializzazione dell'header�clnttcp_create: memoria esaurita
+-�clntudp_create: memoria esaurita
+-�clntunix_create: memoria esaurita
+-�l'elemento di collazione `%.*s' appare pi� di una volta: riga ignorata�il simbolo di collazione `%.*s' appare pi� di una volta: riga ignorata�simbolo di collazione non trovato dopo `%s'�connessione all'indirizzo %s: �attesa una costante o un identificatore�conversione da `%s' a `%s' non gestita�conversione fermata a causa di un problema durante la scrittura dell'output�impossibile creare un server rpc
+-�impossibile registrare il programma %d vers %d
+-�database [chiave ...]�file di mappa di caratteri `%s' predefinito non trovato�il flag di direzione nella stringa %d, nel campo `era'
+-della categoria `%s', non � n� '+' n� '-'�il flag di direzione nella stringa %d, nel campo `era'
+-della categoria `%s', non � un unico carattere�nome di carattere `%s' ripetuto�definizione di eleento di collazione ripetuta�definizione ripetuta per il carattere `%.*s'�chiave ripetuta�definizione di insieme ripetuta�nome di zona %s duplicato (file "%s", riga %d)�identificatore del messaggio doppio�numero del messaggio doppio�stringa di caratteri vuota�nome del peso assente: riga ignorata�enablecache: cache gi� abilitata�enablecache: impossibile allocare la cache�enablecache: impossibile allocare i dati della cache�enablecache: impossibile allocare il fifo della cache�codifica per l'output�codifica del testo originale�punto terminale dell'intervallo dei puntini maggiore dell'inizio�errore ottenendo l'id dei chiamanti: %s�errore chiudendo l'input `%s'�errore chiudendo il file di output�errore chiudendo il file con i dati di profilazione�errore di inserimento dell'elemento di collazione nellatabella hash�errore di inserimento nella tabella hash�errore leggendo l'output�manca un argomento stringa per `copy'�manca la riga di continuazione�impossibile caricare l'oggetto condiviso `%s'�impossibile caricare i dati dei simboli�impossibile fare mmap del file con i dati di profilazione�impossibile iniziare il processo di conversione�errore di scrittura dei dati per la categoria `%s'�fcntl: F_SETFD�il campo `%s' nella categoria `%s' non � definito�il file `%s' esiste gi� e potrebbe essere sovrascritto
+-�il valore di partenza di `collating-element' deve essere una stringa�fstat fallito�spazzatura alla fine della specifica del codice di carattere�spazzatura alla fine del numero�spazzatura alla fine del valore di scostamento nella stringa %d,
+-nel campo `era' della categoria `%s'�spazzatura alla fine della data di inizio nella stringa %d,
+-nel campo `era' della categoria `%s'�spazzatura alla fine della data terminale nella stringa %d,
+-nel campo `era' della categoria `%s'�genera il grafico delle chiamate�genera un profilo piatto con totali e tick�get_myaddress: ioctl (leggi la configurazione dell'interfaccia)�getent - legge voci dal database amministrativo.�handle_request: ricevuta una richiesta (Versione = %d)�hard link fallito, usato un link simbolico�ha un hard link da qualche parte�campo CORRECTION illecito in una riga Leap�campo Rolling/Stationary illecito in una riga Leap�costante carattere illecita nella stringa�carattere illecito nel file: �elemento di collazione illecito�definizione illecita�codifica ottenuta illecita�sequenza di escape illecita a fine stringa�sequenza di escape illecita alla posizione %ld�nomi illeciti per l'intervallo di caratteri�nettype illecito:`%s'
+-�numero illecito per lo scostamento nella stringa %d,
+-nel campo `era' della categoria `%s'�numero dell'insieme illecito�data iniziale illecita nella stringa %d,
+-nel campo `era' della categoria `%s'�data finale illecita nella stringa %d,
+-nel campo `era' della categoria `%s'�limite di implementazione: permesse al piu` %d classi di caratteri�limite di implementazione: permesse al piu` %d mappe di caratteri�carattere o sequenza di shift incompleti alla fine del buffer�file formattato non correttamente�linea di input di tipo sconosciuto�errore interno (descrittore illecito)�errore interno - addtype chiamata con isdst errato�errore interno - addtype chiamata con ttisgmt errato�errore interno - addtype chiamata con ttisstd errato�errore interno in %s, riga %u�scostamento UTC non valido�formato di abbreviazione non ammesso�giorno del mese errato�anno finale errato�anno bisestile errato�modo di dlopen() non valido�nome del meso errato�orario salvato errato�anno iniziale errato�ora del giorno errata�giorno della settimana errato�lunghezza della chiave troppo lunga nella richiesta: %Zd�la riga dopo i puntini deve contenere una definizione di carattere�la riga prima dei puntini deve contenere una definizione di carattere�riga troppo lunga�elenca tutti i set di caratteri codificati noti�file di localizzazione `%s', usato nell'istruzione `copy', non trovato�lstat fallito�riga malformata ignorata�fallita la mappatura della tabella delle stringhe degli header di sezione�fallita la mappatura degli header di sezione�memoria sovrascritta prima del blocco allocato
+-�memoria sovrascritta dopo la fine del blocco allocato
+-�memoria esaurita�la memoria � coerente, la libreria � bacata
+-�manca il formato dell'era nella stringa %d,
+-nel campo `era' della categoria `%s'�manca il nome dell'era nella stringa %d,
+-nel campo `era' della categoria `%s'�regola anonima�non sono state specificate n� la codifica originale n� quella di destinazione�netname2user: (nis+ lookup): %s
+-�netname2user: la voce DES di %s nella directory %s non � unica�netname2user: la voce LOCAL di %s nella directory %s non � unica�netname2user: manca la lista dei group id in `%s'.�netname2user: nome principale `%s' troppo lungo�netname2user: non deve avere uid 0�il programma %d non � mai stato registrato
+-�non � stato dato un valore tipo <Uxxxx> o <Uxxxxxxxx>�nessuna espressione regolare corretta per il campo `%s'
+-della categoria `%s': %s�nessun giorno del mese corrisponde alla regola�nessuna definizione di `UNDEFINED'�non � stato indicato il nome del file per i dati di profilazione e l'oggetto
+-condiviso `%s' non ha un soname�nessun'altra parola chiave va specificata quando si usa `copy'�nessun file di uscita prodotto a causa degli avvertimenti�non � stata indicata la repertoire map: impossibile procedere�nessun nome simbolico fornito�nessun nome simbolico fornito per la fine dell'intervallo�nessun peso definito per il simbolo `%s'�non � un file regolare�configurazione di nscd:
+-
+-%15d  livello di debug del server
+-�nscd non � in esecuzione!
+-�una definizione CHARMAP pu� essere seguita solo da definizioni WIDTH�non � stata specificata con `-f' la codifica originale�file di output�problema rpc di pmap_getmaps�poll: problema di protocollo impostando il circuito
+-�errore del preprocessore�stampa la lista dei count path e il loro numero d'uso�stampa informazioni sui progressi�problemi leggendo `%s'�Il file con i dati di profilazione `%s' non corrisponde all'oggetto
+-condiviso `%s'�il programma %lu non � disponibile
+-�la versione %2$lu del programma %1$lu non � disponibile
+-�la versione %2$lu del programma %1$lu � pronta e in attesa
+-�rcmd: poll (impostazione di stderr): %m
+-�rcmd: socket: tutte le porte sono in uso
+-�rcmd: write (impostazione di stderr): %m
+-�registerrpc: memoria esaurita
+-�momento del secondo intercalare ripetuto�repertoire map file `%s' non trovato�rpcgen: errore di codifica della arglist
+-�rpcgen: troppi define
+-�rpcinfo: %s � l'host sconosciuto
+-�rpcinfo: %s � il servizio sconosciuto
+-�rpcinfo: impossibile cancellare la registrazione per la versione %2$s
+-del programma %1$s
+-�rpcinfo: broadcast fallito: %s
+-�rpcinfo: impossibile contattare il portmapper�stesso nome di regola in pi� file�lettura troppo corta leggendo la chiave di richiesta: %s�lettura troppo corta leggendo la richiesta: %s�scrittura troppo corta in %s: %s�socket: problema di protocollo impostando il circuito
+-�gli ordinamenti `forward' e `backward' sono mutuamente esclusivi�non ha senso specificare pesi di ordinamento per il simbolo di collazione�standard input�standard output�data iniziale illecita nella stringa %d,
+-nel campo `era' della categoria `%s'�anno iniziale maggiore dell'anno finale�anno iniziale troppo grande per essere rappresentato�anno iniziale troppo piccolo per essere rappresentato�la data di stop non � permessa nella stringa %d in campo `era' della
+-categoria `%s'�svc_run: - select fallita�svc_tcp.c - impossibile fare getsockname o listen�svc_tcp.c - problema di creazione del socket tcp�svc_tcp: makefd_xprt: memoria esaurita
+-�svc_unix.c - problema di creazione del socket AF_UNIX�svc_unix.c - impossibile fare getsockname o listen�svc_unix: makefd_xprt: memoria esaurita
+-�svctcp_create: memoria esaurita
+-�svcudp_create - impossibile fare getsockname�svcudp_create: memoria esaurita
+-�svcudp_create: problema di creazione del socket�svcunix_create: memoria esaurita
+-�il simbolo per l'elemento di collazione multicarattere `%.*s'
+-replica la definizione dell'elemento�il simbolo per l'elemento di collazione multicarattere `%.*s'
+-replica la definizione di un altro simbolo�il simbolo per l'elemento di collazione multicarattere `%.*s'
+-replica la definizione del simbolo�il simbolo per l'elemento di collazione multicarattere `%.*s'
+-replica il nome simbolico�errore di sintassi nella definizione di %s: %s�errore di sintassi nella direttiva `order_start'�errore di sintassi nella definizione della classe del carattere�errore di sintassi nella definizione della conversione del carattere�errore di sintassi nella definizione dell'ordine di collazione�errore di sintassi nella definizione della collazione�errore di sintassi nella categoria di LC_TYPE�errore di sintassi nella definizione di una nuova classe di caratteri�errore di sintassi nella definizione di una nuova mappa di caratteri�errore di sintassi nella definizione dalla localizzazione del messaggio�errore di sintassi nella definizione dalla localizzazione monetaria�errore di sintassi nella definizione dalla localizzazione numerica�errore di sintassi nella specifica di ordinamento�errore di sintassi nel prologo: %s�errore di sintassi nella definizione della repertoire map: %s�errore di sintassi nella definizione della localizzazione del tempo�errore di sintassi: fuori da una sezione di definizione di localizzazione�non � stata specificata con `-t' la codifica di destinazione�questa � la prima definizione�tempo precedente a zero�overflow del tempo�troppo pochi byte nella codifica di carattere�troppi byte nella codifica di carattere�definite troppe classi di carattere�troppi secondi intercalari�troppi tipi di tempi locali�troppe transizioni?!�troppi pesi�troppe o troppo lunghe abbreviazioni di fuso orario�spazzatura alla fine della riga�problema rispondendo al programma %d
+-�non sono permesse due righe di seguito contenenti `...'�digitato un solo anno�impossibile allocare il buffer per l'input�impossibile liberare gli argomenti�non definito�carattere sconosciuto `%s'�carattere sconosciuto nel campo `%s' della categoria `%s'�direttiva di collazione sconosciuta�direttiva `%s' sconosciuta: riga ignorata�errore di iconv() sconosciuto %d�insieme `%s' sconosciuto�simbolo `%.*s' sconosciuto: riga ignorata�zona senza regole�messaggio non terminato�stringa non terminata�costante stringa non terminata�nome simbolico non terminato�nome di peso non terminato�limite superiore dell'intervallo non minore del limite inferiore�uso: %s infile
+-�uso del 29/2 in anno non bisestile�il valore di %s deve essere intero�il valore di <%s> deve essere compreso fra 1 e 4�il valore per il campo `%s' della categoria `%s'
+-non deve essere la stringa vuota�il valore di <mb_cur_max> deve essere maggiore del valore di <mb_cur_min>�il valore del campo `int_curr_symbol' della categoria `LC_MONETARY'
+-non corriposnde ad un nome ISO 4217 valido�il valore del campo `int_curr_symbol' della categoria `LC_MONETARY'
+-� di lunghezza errata�i valori dei campi `%s' della categoria `%s' devono essere
+-inferiori a 127�attenzione: �accettando la connessione: %s�allocando la voce di cache�allocando voce della tabella hash�allocando la copia della chiave�aprendo il file del vecchio catalogo�preparando l'output�leggendo il database�facendo stat del database di profilazione�scrivendo il file del database�write incompleta�scrivibile da altri oltre il proprietario�numero di argomenti sbagliato�numero di campi errato su una riga Leap�numero di campi errato su una riga Link�numero di campi errato su una riga Rule�numero di campi errato su una riga Zone di continuazione�numero di campi errato su una riga Zone�xdr_reference: memoria esaurita
+-�xdrrec_create: memoria esaurita
+-�yp_update: impossibile convertire l'host in netname
+-�yp_update: impossibile ottenere l'indirizzo del server
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/ko.mo glibc-2.1.3/po/ko.mo
+--- ../glibc-2.1.3/po/ko.mo	1999-07-18 18:19:41.000000000 -0700
++++ glibc-2.1.3/po/ko.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,453 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������'��	������1������D���G���W���H�������*������,���������@������M������f������x�������������������������������`������
���<���
���J���(���X���(��������������C����������������������!������7������K������a������u�����������������������������������������������-������?������]������f���	���������������������*�������*�������6�������*���/���"���Z������}���$�������%��������������,�������0���'���/���X���,��������������'�������%����������"������?���!���^�����������������$�������.�������������%���)���%���O���%���u���%�������%��������������"�������'��� ������H������b������y���+��������������"�������+�������,���+��� ���X���&���y��� �������������� ����������������������0�������P���5�������������'���,���+���T������������������������K�������������6���������O���"���l���	�������%�������)�����������������������
+-������������������>���(���X����������	���������������������$�������1�������	���&���	���0������:������K������W������j���
�������������������������������������������������������	���������������!������6���+���I���.���u���&��������������������������� ������/���@���)���p���.�������+��������������*������$���<���+���a���,�������4�������-�������4���������R������j���
���|��� �����������������������������������<������;���?���
���{������������������������>���������������������!�������-�������"���"���'���E������m���1�������	���������������������%�����������������	������������0������E������\������r������������������������(�������/�������8���)������b������{�����������������!��������������:������������� ���2���1���S���
��������������;�������@������������� ���9������Z������l��������������������������������������&����������������/������5���o���U������������������������������
���+������9���
���M��� ���[������|����������(�������(�������(�������*������(���H������q�����������������7���������������������
�������
������� ���������)������5������R������m���	��������������
+-���������������������
����������������������������(���������,���
���H������V������i��������������������������������������
������/���������@������W������h������x�����������������
���������������������
+-���������������������@�������
���?������M���
���f������t�������������������������������
+-��������������������"���"������E���p���a���
+-�������1���������������� ������0������E������a������t���������������������������������������������=�������&���������=������L���@���k�������������������������������'�������$������!���3������U���+���t����������&������������������������
+-���!���&���!���H������j���������������������������������������������������
���������+���)���J������t���!��������������������������������������
+-��� ��� ������A������V���'���q���������������������������������������������
���������'������A������Y������q�������������������������������!��������������&���������-������A������V������k����������������
+-�������
+-����������������������������
�������
�������1���������:���
���F������T���3���s��������������������������������������!���������� ���	���<������F������]������n������������������������������� �����������������������������:������T������f����������������� ������������������������������ ������:������X������r����������%�������	�������������������������������������������1���0���@���+���q��������������������������������������������9������(���W�����������������C�����������������������������+������F������V������v�������������������������������/����������������������8���.���U��������������������������������������%�������#���������+������I���	���V������`������u�����������������
��������������������������������������
���.������)���A������k������w����������q�������������������!���.������P������W���c��i���������������������������������������0������F������e���$���z�������������������������������&�������&������>���3���
���r���
+-�������������� ��������������������� �������"���������(������D������]������|������������������������������������������������������������2������I������b������{��������������������������������������D����������;������N���#���a����������'�������
�������&�������"������� ���������<������Z������o�������������������������������'��������������N�������	���K���*���U���2�������:�������2�������@���!���6���b������������������������'�������'������-���3������a���������
����������������������������3�������'�����)���?��
���i��-���w��#������������C������(���-�'���V� ���~� ����� �����-�����#����)���3�>���]�*����������2�����$�������;����J�+���`������&���������������0�������?����Z�*���y�&���������� �����'����!���4�*���V������&�����%�����������������!�F���=�D�����G�����)����/���;�"���k� �����!�����'�����������������3�B���Q�B�����(���������	����	�*���,	�7���W	�����	�)����	�����	�&����	�R���
+-�T���e
+-�����
+-�#����
+-�����
+-�	��������#���+����O����d�	���w�"�����(�����&�����+�����+��� ����L����X�(���g�����������,�����,�����%���*
����P
�"���m
�����
� ����
�����
�)����
�����'���0����X�1���g�1�����2�����6�����
+-���5�(���@����i�S�����V�����V���3������+�����-�����,�����)���$�(���N����w� �����(����� �����������������&����8�+���O�$���{�����������B���������@���+�@���l�:�����9�����*���"����M����e����~�+�����-�����-�������� ����;����O����d����|�
���������������������������������
+-�����-���=�7���k������ �����9�����
+-��������+���9����e�%�����*���������������2�����=���'�=���e�
�����0����������G����I���I�/�����&�����(���������1���3�/���e�!����������H�����3����:���N�3����������"�����-��������%�#���6����Z�4���w�)�����	����������"�����
����+���'����S� ���d�?�����!�����*�����3�������F�!���f� ���������������%�������������&���5�&���\�7�����!�����&�����#��� ����( ����G ����e �$���} �4���� �@���� �	���!�	���"!�N���,!�"���{!�/����!�/����!�J����!����I"�*���`"�����"�"����"�#����"�+����"�#���#����A#�"���]#�����#�����#�����#�C����#�H���$�H���d$�C����$�G����$����9%�%���X%�!���~%�����%�����%�����%�'����%�#���&�(���B&�%���k&�#����&�#����&�����&�����&�"���	'�#���,'�&���P'�)���w'�����'�
����'�
����'�'����'�'����'�"���&(����I(����Z(����t(�����(�����(�#����(�&����(�,���)����.)�%���M)����s)�
����)�����)�6����)�����)�!���*����#*����>*�!���S*�
���u*�����*�����*�����*�����*�����*�)����*����#+����9+����R+�+���q+�7����+�5����+�V���,�D���b,�2����,�����,� ����,�#���-����:-����R-����o-�����-�"����-�����-�����-�#����-����.�"���3.�"���V.�"���y.�/����.�"����.�����.����/�2���'/�(���Z/��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: GNU libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1998-12-04 06:52+0900
+-Last-Translator: Changwoo Ryu <cwryu@adam.kaist.ac.kr>
+-Language-Team: Korean <ko@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=EUC-KR
+-Content-Transfer-Encoding: 8-bit
+-�		���� ����     : �		�Ӽ�          : �	%s [-abkCLNTM][-D�̸�[=��]] [-i ũ��] [-I [-K ��]] [-Y ���] �Է�����
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o �������] [�Է�����]
+-�	%s [-n ��Ʈid]* [-o �������] [�Է�����]
+-�	%s [-s ��ƮŸ��]* [-o �������] [�Է�����]
+-�	���� ����: �	Ÿ�� %s�� entry ����Ÿ
+-�	�̸�       : %s
+-�	���� Ű    : �	Ÿ��         : %s
+-�	���� �ּ� (%u)
+-�	[%d]	�̸�          : %s
+-�	[%u] - [%u ����Ʈ] �
+-%s ij��:
+-
+-%15s  ���� ij�� �����
+-%15Zd  ��ŭ�� ������ ũ��
+-%15ld  �ʵ��� positive entry ����
+-%15ld  �ʵ��� negative entry ����
+-%15ld  �� positive entriy�� ���� ij�� ��Ʈ
+-%15ld  �� negative entriy�� ���� ij�� ��Ʈ
+-%15ld  �� positive entriy�� ���� ij�� �̽�
+-%15ld  �� negative entriy�� ���� ij�� �̽�
+-%15ld%% ij�� ��Ʈ��
+-%15s  check /etc/%s for changes
+-�
+-�׷� ��� :
+-�
+-���� �ð� : �       rpcinfo -b ���α׷���ȣ ������ȣ
+-�       rpcinfo -d ���α׷���ȣ ������ȣ
+-�       rpcinfo -p [ ȣ��Ʈ ]
+-�       rpcinfo [ -n ��Ʈ��ȣ ] -t ȣ��Ʈ ���α׷���ȣ [ ������ȣ ]
+-�      �ƴϿ��     ���    ����Ÿ ���� = %u
+-�    �������� ���:
+-�    �������� ����:
+-�    �Ϲ����� ���:
+-�    �Ϲ����� ����:
+-�    �������� ����� �ƴ�
+-�    �������� ������ �ƴ�
+-�    �Ϲ����� ������ �ƴ�
+-�    �Ϲ����� ����� �ƴ�
+-�    ������� ����� �ƴ�
+-�    ������� ������ �ƴ�
+-�    ����� ���:
+-�   ���α׷� ���� ����   ��Ʈ
+-�  Ȥ��: � ("%s"�� �ִ� ��Ģ, �� %d)�[�ɼ�...]� �Ϸ�
+-�"%s", �� %d: %s�"���� %s" ��� -l �ɼ��� ��ȣ ��Ÿ���Դϴ��"���� %s" ��� -p �ɼ��� ��ȣ ��Ÿ���Դϴ�����ø� ���� �÷��׸� ���ؼ��� "�Է�����"�� �ʿ��մϴ�
+-�%.*s: ARGP_HELP_FMT �μ��� ���� �ʿ��մϴ��%.*s: �˼� ���� ARGP_HELP_FMT �������Ģ���� ������ %s�� �����%s%s%s:%u: %s%sAssertion `%s' ����.
+-�%s%s%s:%u: %s%s����ġ ���� ����: %s.
+-�%s%s�� �� ���� ��ȣ %d
+-�%s: %d�� ��ȣ Ȯ���� ����� ���� �ʾҽ��ϴ�
+-�%s: <mb_cur_max>�� <mb_cur_min>���� Ŀ�� �մϴ�
+-�%s: C ��ó���Ⱑ ���� �ڵ� %d�� �����Ͽ����ϴ�
+-�%s: C ��ó���Ⱑ �ñ׳� %d�� �����Ͽ����ϴ�
+-�%s: %s�� ���� �� �����ϴ�: %s
+-�%s: %s ���丮�� ���� �� �����ϴ�: %s
+-�%s: %s�� %s�� ��ũ�� �� �����ϴ�: %s
+-�%s: %s�� �� �� �����ϴ�: %s
+-�%s: %s�� ���� �� �����ϴ�: %s
+-�%s: %s�� �ݴ� ���� ���� �߻�: %s
+-�%s: %s�� �д� ���� ���� �߻�
+-�%s: %s�� ���� ���� ���� �߻�
+-�%s: ǥ�� ��¿� ���� ���� ���� �߻� �%s: ���� ������ �ƴ� %s ���Ͽ� Leap ���� ����
+-�%s: �޸𸮰� �ٴڳ�: %s
+-�%s: �ϳ� �̻��� -L �ɼ��� �����Ǿ���
+-�%s: �ϳ� �̻��� -d �ɼ��� �����Ǿ���
+-�%s: �ϳ� �̻��� -l �ɼ��� �����Ǿ���
+-�%s: �ϳ� �̻��� -p �ɼ��� �����Ǿ���
+-�%s: �ϳ� �̻��� -y �ɼ��� �����Ǿ���
+-�%s: ���ڰ� �ʹ� ����
+-�%s: ���� �ð��� �˾Ƴ� �� �����ϴ��%s: ������ '%s'����, ����� %d�����ϴ�
+-�%s: ���� ��迡 ���� �߻��%s: �߸��� �ɼ� -- %c
+-�%s: �������� �ɼ� -- %c
+-�%s: `%c%s' �ɼ��� �μ��� ������� �ʽ��ϴ�
+-�%s: `%s'�� ��ȣ�� �ɼ��Դϴ�
+-�%s: `%s' �ɼ��� �μ��� �ʿ��մϴ�
+-�%s: `--%s' �ɼ��� �μ��� ������� �ʽ��ϴ�
+-�%s: `-W %s' �ɼ��� �μ��� ������� �ʽ��ϴ�
+-�%s: `-W %s'�� ��ȣ�� �ɼ��Դϴ�
+-�%s: �� �ɼ��� �μ��� �ʿ��մϴ� -- %c
+-�%s: ����� %s�� ��� ���Դϴ�
+-�%s: panic: �������� ���װ� %d
+-�%s: ������ �ϰ���� ���� ä �����%s: �� �� �����%s: �ν��� �� ���� �ɼ� `%c%s'
+-�%s: �ν��� �� ���� �ɼ� `--%s'
+-�%s: ������ %s [ -s ] [ -v ] [ -l �����ð� ] [ -p ���Ľ���Ģ ] [ -d ���丮 ]
+-	[ -L ���� ] [ -y  ���������� ] [ �����̸� ... ] �Դϴ�
+-�%s: ������ %s [ -v ] [ -c ���� ] ������ ... �Դϴ�
+-�%s: ����ϴ� ���� ���� �߻� �(���α׷� ����) ������ �� �� �����ϴ�!?�(���α׷� ����) �ɼ��� �˼� �־�� �մϴ�!?�(�� �� ���� ������Ʈ)
+-�(�� �� ���� ���� ���� - %d)�(�� �� ����)�*** `%s' ������ ����������� ���ŵǾ����ϴ�: �� �ڼ��� �м��� �Ұ����մϴ�
+-�*ǥ�� �Է�*�-o ���-���� [�Է�-����]...
+-[���-���� [�Է�-����]...]�a.out�� .lib ���� �ջ�Ǿ����; ���� ���� = %lu, ���� ���� = %lu�; ���� = ������� ������ �߸��� �̸� <%s>�� <%s>�<SP> ���ڴ� `%s' Ŭ������ ������ �ȵ˴ϴ��<SP> ���ڴ� `%s' Ŭ������ �����?������������ ���� : ��ջ�� ���� ���̺귯���� ��������ּҰ� �̹� ��� ���Դϴ��ȣ��Ʈ�̸��� ���� �ּұ��� �������� ������ּұ��� �Ծ࿡�� �������� ��������� ������ڸ��� �ð���μ� ������ �ʹ� ��ϴ��������� ���� ���̺��� ������� �õ���ʹ� ���� ���� ���̺귯���� ��ũ�Ϸ��� �õ��Ͽ�������� ��������� ��������͸� ������Ʈ
+-��߸��� �ּ���߸��� ���� �������߸��� ��Ʈ ���� ������߸��� �޽�����߸��� �ý��� ȣ����߸��� ai_flags�� ��������ϰ� POSIX�� ��������� ����Ÿ
+-����� ��ġ�� �ʿ������ε�ij��Ʈ ���� ������������� ����������� �����CDS�CPU �ð� ���� �ʰ����ij���� �ð� �ʰ�����ʿ��� ���� ���̺귯���� ������ �� �����ϴ���� �������� �����ϴ� ������ ������ �� �����ϴ��rpcinfo: ��Ʈ���ۿ� ����� �� �����ϴ��ypbind�� ����� �� �����ϴ��ypserv�� ����� �� �����ϴ���޸𸮸� �Ҵ��� �� �����ϴ����û�� �ּҸ� ������ �� �����ϴ����ε�ij��Ʈ rpc�� ���� ������ ���� �� �����ϴ������ ���̺귯���� ���� ������ �� �����ϴ���Ѱ� �̻��� ���� ���� �÷��׸� �� �� �����ϴ�
+-���ε�ij��Ʈ�� ���� ������ ���� �� �����ϴ�����񽺸� ����� �� �����ϴ������ ���������� ���� �Ŀ� ���� �� �����ϴ����ε�ij��Ʈ ��Ŷ�� ���� �� �����ϴ������ �ɼ� SO_BROADCAST�� ������ �� �����ϴ���Ѱ� �̻��� �Է� ������ ������ �� �����ϴ�!
+-���Ʈid �÷��׸� inetd �÷��׿� �Բ� �� �� �����ϴ�!
+-���Ʈid �÷��׸� TIRPC�� �Բ� �� �� �����ϴ�!
+-����ο� ��Ÿ�Ͽ����� ���̺� �÷��׸� �� �� �����ϴ�!
+-������� ��� ä�� ��ȣ����� ������ : %c
+-��ڽ��� ������Ŭ���̾�Ʈ �ڰ� �ο��� �ʹ� �������                  :
+-����� �� ��� ����������� ������ ���������ǻ�Ͱ� ������ ����ϴ������ Ŭ������ ǥ ũ�� ����� �ð��� �ణ �ɸ� �� �ֽ��ϴ�...����� ������ ǥ ũ�� ����� �ð��� �ణ �ɸ� �� �ֽ��ϴ�... ������� �źε�������� ������� ���� ����������� �ð� �ʰ����ӵ���־��� ������ ���ڵ��� �� ���ڵ����� �Ǵٸ� ���ڵ����� ��ȯ��.�Ű�� �ҹ��ڷ� ��ȯ���Copyright (C) %s Free Software Foundation, Inc.
+-�� ���α׷��� ���� ����Ʈ�����Դϴ�; ���������� �ҽ��� �����Ͻʽÿ�.  ��ǰ��
+-�̳� Ư�� ������ ���� ���ռ��� ����Ͽ� ��� ������ ���� �ʽ��ϴ�.
+-���� ���� `%s'�� ���� �� �����ϴ����ȣ ���Ǹ� ��� �ִ� C ��� ���� NAME�� �������� �޼����� ���� ��쿡�� �������ؽ�Ʈ �Է¿��� ������ DB ����Ÿ�� ������������ �ð� : %s���Ʈname %s�� ���� DES entry�� �������� �ʽ��ϴ�
+-����丮
+-�DNANS�DNS����̺��� ���� ����Ÿ���̽��� �����ϴ�������ͺ��̽��� �۾� ���Դϴ���⺻ ���� ���� :
+-������� �ּҰ� �ʿ������ġ�� ��Ʈ���� �ƴ����ġ�� �������� �ʾ������ġ�� �ڿ��� ���� ���Diffie-Hellman (%d ��Ʈ)
+-����丮      : %s
+-����丮�� ������� �������ũ �Ҵ緮�� �ʰ����fork���� �ʰ� ���� tty�� �޼����� ǥ���������Ÿ���̽��� ����� ���� �޼��� ǥ������ ������̹� �����ϴ� ����� ������� �ʰ�, ���ο� ���Ͽ� �������������� �ٿ����� �����EMT Ʈ���ENTRY
+-���ȣȭ�� ����Ÿ
+-�Entry/���̺� Ÿ���� ���� �ʽ��ϴ��RPC ���� �ý��ۿ� ����: �NIS+ ���� ���Ͽ� �����ϴ� �� ����.  NIS+�� ��ġ�Ǿ����ϱ�?��� �� ���� ���� �ý��ۿ� ����: ��ݹ� ���ν����� ����ϴ� �� ���������: .netrc ������ �ٸ� ����� ���� �� �ֽ��ϴ�.���ȯ�� �������Exec ���� ������߿�: �ý��ۿ� `_POSIX2_LOCALEDEF'�� ���ǵǾ� ���� �ʽ��ϴ�������� ��ȣ�� ǥ�õ� �̸����� UCS4 �������� ������ ���� �ֽ��ϴ������ (�������� ���� ����)����� ����ڰ� �߸��� ���¿� ����������� �����մϴ������ ��� �������� ��������� �̸��� �ʹ� ��ϴ������ ũ�� ������ �ʰ���������� �ʹ� Ů�ϴ��First/Next ������ ��������ε� �Ҽ��� ��������丮�� ���� ������ resync�� �ʿ�����Լ��� �������� �ʾ�����׷�
+-�ARGP_HELP_FMT�� ������� ��: %s��޼��� ����� ����ϴ�\v�Է� ������ - �̸� ǥ�� �Է��� �а� �˴ϴ�.  ��� ������ - �̸� ǥ�� ��¿� ����մϴ�
+-��Ϲ� �ý��� �����Ư�� ������ ���� ������ ����������� ���� �޼����� ǥ������� ���� ����Ʈ�� ǥ������������� ������׷�          : %s
+-��׷� �÷��� :�"%s.%s" �׷��� ���� �׷� entry:
+-�SECS�� ���� ���� (�⺻�� 3600)���������׷� ij������ "%d"�� ã�� �� �������ϴ�!���ȣ ij������ "%d"�� ã�� �� �������ϴ�!��׷� ij������ "%s"�� ã�� �� �������ϴ�!�ȣ��Ʈ ij������ "%s"�� ã�� �� �������ϴ�!���ȣ ij������ "%s"�� ã�� �� �������ϴ�!�ȣ��Ʈ�� �׾����ϴ��ȣ��Ʈ �̸� Ž�� ���������� ������Է�-���� ���-����
+--o ���-���� �Է�-����
+--u �Է�-�����IOT Ʈ���IVY��ĺ��� ���ŵ���߸��� ���ɾ���۾��ϴ� �� �߸��� ������Ʈ Ÿ����߸��� Ž����������� ���� Ÿ�� �Ǵ� �������ġ�� ���� �������� ioctl���� ���μ����� �������� ��������� ��û�����:��Է� ����:���/��� ���� ����:��Է�/��� ��������� NIS ��������� ypbind ��������ͷ�Ʈ��ߴܵ� �ý��� ȣ����ߴܵ� �ý��� ȣ���� ����۵Ǿ�� �մϴ���۾��ϴ� �� �߸��� ������Ʈ��������� �μ���������� �Ĺ� ������������� ���� Ŭ���� �̸���������� Ŭ���̾�Ʈ �ڰ� �ο���������� Ŭ���̾�Ʈ ��������������� ���� �����\{\}�� �������� ���빰�� ������������� ��ġ�� ������������� ��ȯ��������ϰų� �ҿ����� ���߹���Ʈ �Ǵ� ���� ������ռ� ���Խ��� ����������������� ���� ����������� ���Խ���������� ��û �ڵ���߸��� ��û �������������� ���� ��������������� ��������丮�Դϴ��named Ÿ�� �����Դϴ��Kerberos.
+-��׾��������
+-����丮 %2$s�� UID %1$d�� ���� LOCAL entry�� �������� �ʽ��ϴ�
+-���� 2 �ܾ������� 2�� ����ȭ���� �������� 3 �ܾ������� 3 ������� ������ �߸��� �̸��� �������ũ�� �ջ�Ǿ����ϴ�������� ��� ��ũ ��ȣ������ ������Ʈ Ÿ�� : �%s�� ����
+-����� �����θ��� �������� �ʾ�������� �ڿ� �Ҵ� �������谡 ��Ʈ��ũ �� ���� �ʽ��ϴ���߸��� ����, Ȥ�� Ʋ�� �̸���� �ɼǿ��� ���� �� �ʿ��ϰų� �������� ���ڴ� �� �� �ɼǿ� �ش��ϴ� ª�� �ɼǿ����� �� �ʿ��ϰų� �������Դϴ�.��� ���� :
+-��� ������ �۾����̹Ƿ�, ������ ������ ����˴ϴ�.��޸� �Ҵ� ������޸𸮰� �ٴڳ���޽����� �ʹ� ��ϴ���Ӽ��� ���ų� ������ Ʋ��������� �ð�     : %s������ϴ� �� ��������� �۾��� �����Ͽ������� ���� ����:��������� hop�� �õ�����̸���̸�
+-[-a|-m]�NIS�NIS Ŭ���̾�Ʈ/���� ���� ����ġ - ���񽺸� ������ �� �����ϴ��NIS ���� �����ͺ��̽��� �߸��Ǿ����ϴ��NIS+ ���� �����NIS+ ������ ������ �� �����ϴ��NIS+ ���񽺸� ����� �� ���ų� NIS+ ���񽺰� ��ġ���� �ʾҽ��ϴ��������Ʈ�� ����
+-�������̸� : '%s'
+-�Name ���� ij�� ����.��� �������� name ���񽺰� ���� �ʽ��ϴ���̸��� ��Ʈ��ũ �󿡼� �������� �����Name Ȥ�� ���񽺸� �� �� �����ϴ��Name/entry�� �������� �ʽ��ϴ���̸��� �ش�Ǵ� ������Ʈ�� ã�� �� �����ϴ�������Ⱑ �ʿ������Ʈ���� reset������ ������ �������ϴ����Ʈ��ũ�� �׾����ϴ����Ʈ��ũ�� ���� �Ұ����մϴ����� ������ CSI ������ �������� ������ XENIX ������� �����ȣ��Ʈ�̸��� �����Ǵ� �ּҰ� ������̸��� �����Ǵ� �ּҰ� �����anode�� �������� ������ ���� ������ ������ڽ� ���μ����� �������� ������ �ڷᰡ ����������� ���� ������ �������밡���� �����ġ�� ������´� ¦ ������Ű����� ����������� ���� ���� �޽����� ��������� �����ͺ��̽��� �� �̻��� ����� ����������� ���Խ��� ��������� ���α׷��� ��ϵ��� �ʾ���.
+-�ȣ��Ʈ�� �� ��Ʈ�� �������ġ�� ���� ������ ������׷� ��ġ�� ������׷� �����̳� ���丮�� ����������� �׷� Ű�� ����������� �����ο� �׷� ������ ������׷� ���μ����� �����NIS+�� �ƴ� namespace �߰��name resolution���� ������ �� ���� ���������.
+-�ã�� �� ����.  �׷� �̸��� �����XENIX named Ÿ�� ������ �ƴ�����丮�� �ƴմϴ��ã�� �� ������� �������� �� ������ �ƴ�������ڰ� �ƴ������ ��             : %d
+-�������Ʈ�� ��     : %u
+-������� ��� ��ġ �μ�������� ��� ��ġ ����������Ʈ #%d:
+-�������Ʈ �̸� : %s
+-�������Ʈ Ÿ�� : ����� ��ü�Դϴ������ �̸��� ������Ʈ�� �����մϴ������ǥ�� Ȧ�� ���Դϴ��root���� �� �ɼ��� ����� �� �ֽ��ϴ�!��̹� ���� ���� ����������� ������ ����������� �������� ��������� ���� ���� ����������� ���� ���Դϴ����Ʈ�� �ڿ� �������� ����:���� ����:�������        : %s
+-�����
+-���Ű���� ��ġ���� ������Ľ� ����: %s��κ����� ���������� ������Ʈ�� ������ ���� ������Ʈ�� �ƴմϴ���㰡 �źε�������� ����������Խ��� �ϰ���� ���� ä ���������Ÿ ���̽� ������ ������ ���ٿ� �� �׸� ǥ��������� ���� ���¸� ǥ������� ���� �޽��� ǥ������α׷� ���� ǥ����Ƹ��� ������Ƹ��� ������������ϸ� Ÿ�̸��� �ð��� �ʰ�����Ծ� �����⿡ ������� ������Ծ� ������Ծ౺�� �������� ������Ծ� ��� �Ұ�����Ծ��� �������� ��������Ͽ� ���� �Ծ��� �߸�����̸� ���̺��� �߸��� ����������RFS�� ���ѵ� �����RPC ���α׷��� ���ν����� �߸����NIS ���� �� RPC �������RPC ���α׷� ��� �Ұ����RPC ���α׷� ������ �߸����RPC ������ �߸��Ǿ����ϴ��RPC ������ �߸����RPC: (�� �� ���� ���� �ڵ�)�RPC: ���� �����RPC: ����� �ص��� �� �����ϴ��RPC: �μ��� ��ȣȭ�� �� �����ϴ��RPC: ���� (�������� ���� ����)�RPC: ȣȯ���� �ʴ� RPC �����RPC: ��Ʈ ���� �����RPC: ���ν��� ��� �Ұ����RPC: ���α׷��� ��ϵ��� �����RPC: ���α׷� ��� �Ұ����RPC: ���α׷�/���� ����ġ�RPC: ���� �ý��� �����RPC: ������ �μ��� �ص��� �� �����ϴ��RPC: �����RPC: �ð� �ʰ��RPC: ���� �� �����RPC: ���� �� �����RPC: �� �� ���� ȣ��Ʈ�RPC: �� �� ���� �Ծ��RSA (%d ��Ʈ)
+-��������� ������� ���� �ڵ忡 RTLD_NEXT�� ��������� ������Ʈ �������ϸ� ����Ÿ�� �а� ǥ���`�̸�'���� ���� ����Ÿ�� �б���б����� ���� �ý������-�ð� �ñ׳� %d����Խ��� �ʹ� Ů�ϴ������ ����� ��������� �ּҰ� �ٲ�������ȣ�� ����ų� �ٸ� ����� ���� �� ���� ������ ����ϴ�.����� ������Ʈ `%s'�� �ٽ� ���� �� ��������ߺ���    :
+-����׸� %s�� �˷��ֽʽÿ�.
+-����״� `glibcbug' ��ũ��Ʈ�� �̿��� <bugs@gnu.org>�� �����Ͻʽÿ�.
+-���û�� �μ��� �߸�����ذ�� ���� 0 (�����ƴ�)��ذ�� ���� ������ڿ� �������¸� ���߽��ϴ���ڿ��� �ս�������ڿ��� �Ͻ������� ��� �Ұ�������ݹ� ���ν����� ����� �������SHOBJ [PROFDATA]�SUNYP�ã�� ���           : %s
+-����׸����̼� ����������� �ٸ� ���� �ϰ� �ֽ��ϴ�, �ٽ� �õ��ϼ�������� �޸� ����������� �ڰ� �ο��� �ź��߽��ϴ�������� �����⸦ �ź��߽��ϴ��ai_socktype������ servname�� �������� �ʽ��ϴ�����α׷� �̸� ����������� �˴ٿ������ȣ 0�����ϻ��� ���� ��������� Ÿ���� �������� �ʽ��ϴ������Ʈ��� ���� �ߴ��� �ʷ��߽��ϴ���˼��մϴ�. ����� root�� �ƴմϴ�
+-�`����'�� �ҽ� ���ǰ� �ֽ��ϴ��Srmount ��������� ����������� NFS ���� �ڵ��`����'���� �����带 �����������              : %s
+-�������������� (��ȣ)������� (tty �Է�)������� (tty ���)���Ʈ�� ������ ����������� û�Ұ� �ʿ��մϴ���������� �޼����� ���� ���� �޼����� ǥ������ �����`����'�� ��ȣ�� ǥ�õ� ���� �̸��� ���ǵ���ý��� ������ý��� ����:��ý��� �ڿ� �Ҵ� ������ý����� ���丮, ���� ����    : %s
+-                   �����丮 ����: %s
+-                   ������ ���  : %s
+-%s����̺�
+-����̺� Ÿ��         : %s
+-�name resolution���� �Ͻ����� ��������������� ���� ��� ������� ����Ʈ�� �˷��� ��� ���ڼ� �ڵ尡 ��� �ֽ��ϴ�.  ������ ������
+-FROM�� TO �μ��� ������ ��� ���ڼ� �̸��� ������ ����� �� �ִ� ����
+-�ƴմϴ�.  �Ѱ��� ���ڼ� �ڵ�� ��� �ٸ� �̸�(����)�� �Բ� ���ŵǾ�
+-���� ���� �ֽ��ϴ�.
+-  �� �̸����� ��� ���� ���ڿ��� �ƴ϶� ���Խ��̰�, �� ���Խ���
+-���α׷��� ���ڷ� �־��� ���������� �̸��� �ش�˴ϴ�
+-
+-
+-  ������Ǵ� �ð� : �Ÿ�̸� �ð� �ʰ�����Ӽ��� �ʹ� �������ȣ ������ �ܰ谡 �ʹ� ����������� �ʹ� ��������� ������ �ʹ� ������ý��ۿ� ���� ������ �ʹ� ��������μ����� �ʹ� ����������� �ʹ� ����: ������ �� �����ϴ������ڰ� �ʹ� ���������/�ߴ��� ���������ٴ� �����������ȯ�Ⱑ �׾�������� ���������� �̹� ����Ǿ� �ֽ��ϴ������ ���������� ����Ǿ� ���� �ʽ��ϴ���� ���� ������ ������ `%s --help' Ȥ�� `%s --usage' �Ͻʽÿ�.
+-�%s �õ���...
+-�Ÿ�� : %s
+-��˼������NIS+ Ŭ���̾�Ʈ�� ������ �� �����NIS+ ������ ������ �� ������ݹ��� ���� �� ������������� ���μ����� ���� �� ������˼����� (Ÿ�� = %d, ��Ʈ�� = %d)
+-��� �� ���� .netrc Ű���� %s��� �� ���� NIS ���� �ڵ���� �� ���� ����Ÿ���̽�: `%s'
+-��� �� ���� ������� �� ���� ������� �� ���� ȣ��Ʈ��� �� ���� ������Ʈ��� �� ���� �ɼ�: %s %s %s��� �� ���� �ذ�� ������� �� ���� ���� ������� �� ���� ��ȣ %d��� �� ���� �ý��� ������� �� ���� ypbind �����¦�� ���� �ʴ� ( �Ǵ� \(�¦�� ���� �ʴ� ) �Ǵ� \)�¦�� ���� �ʴ� [ �Ǵ� [^�¦�� ���� �ʴ� \{��ν��� �� ���� ���� `%s'��ñ��� ����� ��Ȳ�����:�����: %s ������ [��θ�]
+-�����: rpcinfo [ -n ��Ʈ��ȣ ] -u ȣ��Ʈ ���α׷���ȣ [ ������ȣ ]
+-������ ���� ��ȣ 1������ ��ȣ ��ȣ 2����ǵ� �ڷ������� ���⿣ �ʹ� ū ������� Ÿ�̸� �ð� �ʰ������ ���࿡�� �� �ڴ���� ����� ������������� ��������� ������ ���������� �̸����� ��������� ������ �������� �̸��� ǥ�������� ������ ������ �̸��� ǥ��������õ� Ű������ �̸��� ǥ�����`�̸�' ���Ϸ� ������%s�� ��������ϴ�.
+-��߸��� �Ű�ü Ÿ���X500�XCHS�YPBINDPROC_DOMAIN: %s
+-���, 42�� ���������� �����Ѵٴ� ���մϴ���̹��� ������ �������Ƚ��ϴ����ӵǴ� Zone �ٿ� �ִ� �� �ð��� �� �ٿ� �ִ� ���ð����� ���� �ð��� �ƴմϴ��[����...]�`%1$s' ���ǰ� `END %1$s'�� ������ �ʽ��ϴ��`%s'�� `%s'�� �´� �������� ����Ÿ ������ �ƴմϴ��`-1'�� `%2$s' ������ `%1$s' �ʵ��� ������ entry���� �մϴ��`...'�� `...'�� `UNDEFINED' �׸񿡸� ������ �մϴ��`collating-element'�� ���� ù��° �μ� �ڿ� `from'�� �;� �մϴ���������� ��� ������� `from' ���ڿ��� �� �� ���� �����ai_family�� �������� �ʽ��ϴ��ai_socktype�� �������� �ʽ��ϴ���̹� �������<%s>�� ���� �μ��� ���� ���ڿ��� �մϴ��`%s'�� ���� �μ��� ���� ���ڿ��� �մϴ��auto_none.c - ġ������ ����(marshalling) �����authunix_create: �޸� ����
+-��߸��� �μ���߸��� �������Link �ٿ� FROM �ʵ尡 �����Link �ٿ� TO �ʵ尡 ����������� �ι� �������
+-����͸� mcheck_status, ���̺귯���� ���װ� �ֽ��ϴ�
+-�broadcast: ioctl (�������̽� ���� ����)�broadcast: ioctl (�������̽� �÷��� ����)����� �귯��ħ�cache_set: �� rpc_buffer�� �Ҵ��� �� �����ϴ��cache_set: �������� �Ҵ����� �������cache_set: �������� ã�� ����������� ����ð� ���Ŀ� ����ϱ� ���� �ð��� �� ������ �� �����ϴ�����ν��� ��ȣ %d�� �������� �� �����ϴ�
+-������� ���� `%s'�� `stat'�� �� �����ϴ����ȣ ����Ÿ�� �Ҵ��� �� �����ϴ�������� ����ڸ� ���� �� �����ϴ�������� ����ڸ� ���� �� �����ϴ�������� ������ �޾Ƶ��̵��� �� �� �����ϴ�: %s�C ��ó���⸦ ã�� �� �����ϴ�: %s 
+-�� C ��ó���⵵ (cpp) ã�� �� �����ϴ�
+-������� ��û ���� %d�� ó���� �� �����ϴ�; ���� ������ %d�Դϴ������ ���� ��� `%.*s'�� ������ �� �����ϴ�����ǥ�� ������ �� �����ϴ�����ο� �������� ��ȣ ���Ǹ� ������ �� �����ϴ�: %s��������ϸ� ����Ÿ�� ���� �� �����ϴ���� �� �����ϴ��`%s'�� �� �� �����ϴ�������ͺ��̽� ���� `%s'�� �� �� �����ϴ�: %s��Է� ���� `%s'�� �� �� �����ϴ�������� ���� ���� `%s'�� �� �� �����ϴ����� ������ �� �� �����ϴ����� ���� `%s'�� �� �� �����ϴ����� ���� `%s'�� ���� `%s'�� ���� �� �� �����ϴ������ `%s'�� �� �� �����ϴ������ ������ ó���� �� �����ϴ������ ���� ���丮 `%s'�� ���� �� �����ϴ������ ������ ���� �� �����ϴ�; ġ�������Ŭ���̾�Ʈ���� ���� �� �����ϴ��`%s'���� ����� ���� �� �����ϴ�������� ���丮 `%s'�� ���� �� �����ϴ�������� ���� `%s'�� �� �� �����ϴ�������丮 ���� ���� `%s'�� ���� �� �����ϴ����� ����Ÿ�� ���� �� �����ϴ��`%s'���Ͽ� stat()�� �� �� �����ϴ�: %s���� ������ `%s'�� ����� �� �����ϴ������� �� �� �����ϴ�: %s���踦 �� �� �����ϴ�: %s�Ŭ���̾�Ʈ�� �� �� �����ϴ������ ����Ÿ�� �ѹ� �̻� ��û�Ǿ����ϴ�: �̷� ���� �Ͼ���� �� �˴ϴ��`%3$s' Ŭ������ %1$s'%2$s' ���ڴ� `%4$s' Ŭ������ ��� �־�� �մϴ��`%3$s' Ŭ������ %1$s'%2$s' ���ڴ� `%4$s' Ŭ������ ��� ������ �� �˴ϴ������ <SP>�� ���� �������� ���ǵ��� �ʾ�������� `%s'�� ����ġ�� �ʿ������� ���ǵ��� �ʾ�������� Ŭ���� `%s'�� �̹� ���ǵǾ�������� ���� `%s'�� �̹� ���ǵǾ�������� ���� ���� `%s'�� ã�� �������clnt_raw.c - ġ������ ��� ����ȭ ����.�clnttcp_create: �޸� ����
+-�clntudp_create: �޸� ����
+-�clntunix_create: �޸� ����
+-����� ���� ��� `%.*s'�� �ѹ� �̻� ��Ÿ�����ϴ�: �� ���� �����մϴ������ ���� ��ȣ `%.*s'�� �ѹ� �̻� ��Ÿ�����ϴ�: �� ���� �����մϴ������ ���� �ɺ��� `%s' ������ �;� �մϴ���ּ� %s�� ����: ���� Ȥ�� �ĺ��ڰ� �;� ���`%s'���� `%s'���� ��ȯ�� �������� �ʽ��ϴ��������Ͽ� ���� �߻��� ������ ��ȯ�۾��� �ߴܵǾ����ϴ��rpc ������ ���� �� �����ϴ�
+-����α׷� %d ���� %d�� ����� �� �����ϴ�
+-�����Ÿ���̽� [Ű...]��⺻ ���� ���� ���� `%s'�� ã�� �������`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� `%1$d'�� ���� �÷��װ� '+'�� '-'�� �ƴմϴ��`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� `%1$d'�� ���� �÷��װ� �Ѱ��� ���ڰ� �ƴմϴ������ �̸� `%s'�� �ߺ������������ ��� ���ǰ� �ߺ��Ǿ����ϴ������ `%.*s'�� �ߺ� ��������ߺ��� Ű��ߺ��� ���� ������ߺ��� ������ %s (���� "%s", �� %d)��ߺ��� �޽��� �ĺ�����ߺ��� �޽��� ��ȣ��� ���ڿ���� weight �̸�: �� ���� ���õ˴ϴ��enablecache: ij���� �̹� Ȱ��ȭ�Ǿ� �����enablecache: ij���� �Ҵ��� �� �����ϴ��enablecache: ij�� �ڷḦ �Ҵ��� �� �����ϴ��enablecache: ij�� fifo�� �Ҵ��� �� �����ϴ����� ���ڵ���� ���� ���ڵ��������ǥ ������ ������ ���������� Ů�ϴ���Է� `%s'�� �ݴ� ���� ���� �߻����� ������ �ݴ� ���� ���� �߻���������ϸ� ����Ÿ ������ �ݴ� ���� ���� �߻���ؽ� ���̺��� �������� ��Ҹ� ������ �� ������ؽ� ���̺��� �����ϴ� ���� ���� �߻���Է��� �д� ���߿� ���� �߻��`copy'�� ���� ���ڿ� �μ��� �ʿ���������ߴ� ���� ���� ã�� ����������� ������Ʈ `%s'�� �дµ� �������ȣ ����Ÿ�� �д� �� ������������ϸ� ����Ÿ ������ mmap�ϴ� �� �������ȯ�۾��� �����ϴµ� ��������� `%s'�� �ڷḦ ���� �� �����߽��ϴ��fcntl: F_SETFD�`%2$s' ���ֿ��� `%1$s' �ʵ尡 ���ǵ��� �ʾҽ��ϴ��`%2$s' ���ֿ��� `%1$s' �ʵ尡 ���ǵ��� �ʾҽ��ϴ��`%s' ������ �̹� �����ϹǷ�, ���� ������ �ֽ��ϴ�
+-�`collating-element'�� from-value�� ���ڿ��̾�� �մϴ��fstat ��������� �ڵ� ������ ���� ������� ���� ����������� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ������ ���� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥ ���� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥ ���� ���� ������� ���� �����ȣ�� �׷����� �����Ƚ���� ƽ���� ����� �÷� ���������� ������get_myaddress: ioctl (�������̽� ������ ����)�getent - ���� ����Ÿ���̽����� entry�� ����.�handle_request: ��û�� �޾��� (���� = %d)��ϵ� ��ũ ����, �ɺ��� ��ũ�� ���˴ϴ����򰡿� �ϵ� ��ũ���Leap �ٿ� �߸��� CORRECTION �ʵ��Leap �ٿ� �߸��� Rolling/Stationary �ʵ�����ڿ��� �߸��� ���� ����� ��������Ͽ� �߸��� ���ڰ� ������߸��� �������� �������ǰ� �߸��Ǿ�����߸��� ��ȣȭ�� �־�������ڿ� ���� �߸��� �̽������� �������� �����%ld ��ġ�� �߸��� �Է� �������� ����������� ������ �߸��� �̸���߸��� ��ƮŸ�� :'%s'
+-�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ������ ũ������� ��ȣ�� �߸��Ǿ����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ���� ��¥�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ���� ��¥��������� ����: %d�� ���ں��� ū Ŭ������ ������ �ʽ��ϴ���������� ����: %d �� �̻��� ���� ������ ������ �ʽ��ϴ�������� ���� �ҿ����� ���� Ȥ�� ����Ʈ ������߸��� ������ ���� ������� �� ���� ������ �Է�������� ���� (�߸��� �����)����� ���� - Ʋ�� isdst�� addtype�� ȣ����������� ���� - Ʋ�� ttisgmt�� addtype�� ȣ����������� ���� - Ʋ�� ttisstd�� addtype�� ȣ�������%s, �� %u�� ���� ���� �߻��UTC �ɼ��� ������������ ������ ������������� ��¥ ���� ��������������� �ذ� ����������������� �����dlopen()�� �߸��� ������ �̸��� ������������� �ð��� ��������������ϴ� �ذ� ����������������� �Ϸ��� �ð���������� ���� �̸����û�� Ű�� ���̰� �ʹ� ��: %Zd�������ǥ �����ٿ��� ���� ���ǰ� �־�� �մϴ��������ǥ ���ٿ��� ���� ����� ���� ���ǰ� �־�� �մϴ������ �ʹ� ��ϴ���˷��� ��� ���ڼ� �ڵ带 �������`copy' ���忡�� ���̴� ������ ���� `%s'�� ã�� ���߽��ϴ��lstat ������߸��� ���¸� ���� ���� ���õ������ ����� ���ڿ� ���̺��� �����ϴµ� ��������� ����� �����ϴ� �� ����������� �Ҵ��ϱ� ���� �޸𸮰� �Ѽյ�
+-������� �Ҵ��� ������ ���� �޸𸮰� �Ѽյ�
+-��޸𸮰� �ٴڳ���޸𸮰� �ٴڳ�
+-��޸𸮴� �߰�������, ���̺귯���� ���װ� �����ϴ�
+-�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d�� era ������ �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d�� era �̸��� ������̸����� ��Ģ��� ���ڵ��� ��� ���ڵ� ��� �������� �ʾҽ��ϴ��netname2user: (nis+ ã��): %s
+-�netname2user: ���丮 %2$s�� %1$s�� ���� DES entry�� �������� �ʽ��ϴ��netname2user: ���丮 %2$s�� %1$s�� ���� LOCAL entry�� �������� �ʽ��ϴ��netname2user: '%s'�� �׷� �ĺ��� ����Ʈ�� ����.�netname2user: �ֿ� �̸� '%s'�� �ʹ� ���netname2user: uid�� 0���� �� �� �����ϴ������ ��ϵ��� ���� ���α׷� %d
+-�<Uxxxx> Ȥ�� <Uxxxxxxxx> ���� �־����� �ʾҽ��ϴ��`%2$s' ������ `%1$s' �ʵ忡 �߸��� ���Խ�: %3$s���Ģ�� ���յǴ� ���� �� �ȿ� �����`UNDEFINED'�� ���ǰ� ������������ϸ� ����Ÿ�� ���� �̸��� ����, ���� ������Ʈ `%s'�� soname�� �����`copy'�� ���� �� �ٸ� Ű���带 �����ϸ� �� �˴ϴ������� ����Ǿ��� ������ ��� ������ ��������� �ʾҽ��ϴ�������丮 ������ ���ǵ��� �ʾ���: ����� �� �����ϴ����ȣ���� �־����� ����������� ������ ��ȣ �̸��� �����ϴ��`%s' ��ȣ�� ���� �߿䵵�� ���ǵ��� �ʾҽ��ϴ���Ϲ� ������ �ƴ��nscd ����:
+-
+-%15d  ���� ����� ����
+-�nscd�� ������� �ʾҽ��ϴ�!
+-�CHARMAP ���� �ٷ� �������� WIDTH ���Ǹ��� �����մϴ��`-f'�� ����� �� ���ڵ��� �������� �ʾ������� �����pmap_genmaps rcp �����poll: ȸ�� ������ �Ծ��� �������
+-���ó���� ������ܰ��� ��ϰ� �� �� �ܰ��� ��� Ƚ���� ǥ������� ������ ǥ���`%s'�� �д� ���� ������ �߻�������������ϸ� ����Ÿ ���� `%s'�� ���� ������Ʈ`%s'�� ���� �ʽ��ϴ�����α׷� %lu�� ��� �Ұ����մϴ�
+-����α׷� %lu ���� %lu�� ��� �Ұ����մϴ�
+-����α׷� %lu ���� %lu�� �غ�Ǿ� ��ٸ��� �ֽ��ϴ�
+-�rcmd: poll (ǥ�ؿ��� ����): %m
+-�rcmd: socket: ��� ��Ʈ�� �����
+-�rcmd: write (ǥ�ؿ��� ����): %m
+-�registerrpc: �޸� ����
+-������� ũ�Ⱑ �ߺ��Ǿ���������丮 ���� ���� `%s'�� ã�� �������rcpgen: arglist �ڵ� ����
+-�rpcgen: �ʹ� ���� ����
+-�rpcinfo: %s�� �� �� ���� ȣ��Ʈ�Դϴ�
+-�rpcinfo: %s�� �� �� ���� �����Դϴ�
+-�rpcinfo: ���α׷� %s ���� %s�� ����� ���� �� �����ϴ�
+-�rpcinfo: ��ε�ij��Ʈ ������: %s
+-�rpcinfo: ��Ʈ���ۿ� ������ �� �����ϴ������ ���Ͽ� ���� �̸��� ��Ģ�� �������û�� Ű�� �� ���� ������: %s��䱸������ �� ���� ������: %s�%s�� �� ���� ������: %s�socket: ȸ�� ������ �Ծ��� �������
+-����� ���� `forward'�� `backward'�� ���� ��Ÿ���Դϴ���������� ��ȣ�� ���� ���� �߿䵵�� �����ص� �ƹ� �ǹ̰� �����ϴ��ǥ�� �Է��ǥ�� ���������ϴ� ��¥�� ���� `%2$s'�� `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��Ǿ����ϴ�������ϴ� �ذ� ������ �غ��� Ů�ϴ������ ������ �ʹ� ���� ���� ǥ���� �� �����ϴ������ ������ �ʹ� ���� ���� ǥ���� �� �����ϴ��`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥�� �߸��Ǿ����ϴ��svc_run: - select �����svc_tcp.c - getsockname Ȥ�� listen �Ұ����svc_tcp_c - tcp ���� ���� �����svc_tcp: makefd_xprt: �޸� ����
+-�svc_unix.c - AF_UNIX ���� ���� �����svc_unix.c - getsockname Ȥ�� listen �Ұ����svc_unix: makefc_xprt: �޸� ����
+-�svctcp_create: �޸� ����
+-�svcudp_create - getsockname �Ұ����svcudp_create: �޸� ����
+-�svcudp_create: ���� ���� �����svcunix_create: �޸� ����
+-����� ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� ��� ���ǰ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ٸ� ��� ���ǿ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ٸ� �ɺ� ���ǿ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ɺ� ���ǰ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� ���ڼ��� ��ȣ�� �ߺ��˴ϴ��%s ���Ǻο� ���� ���� ����: %s�`order_start' �����ڿ� ���� ���� ��������� Ŭ���� ���ǿ� ���� ���� ��������� ��ȯ ���ǿ� ���� ���� ��������� ���� ���ǿ� ���� ��������� ���� ���ǿ� ���� �����LC_CTYPE ������ ���Ǻο� ���� ���� ��������ο� ���� Ŭ���� ���ǿ� ���� ��������ο� ���� ���� ���Ǻο� ���� ���� ������޽��� ������ ���Ǻο� ���� ���� �����ȭ�� ������ ���Ǻο� ���� ���� ��������� ������ ���Ǻο� ���� ���� ��������� ������ �� ���� ������Ӹ����� ���� �ַ�: %s������丮 ���� ���ǿ� ���� ����: %s��ð� ������ ���Ǻο� ���� ���� ��������� �ַ�: ������ ���� �κ��� �ƴմϴ��`-t'�� ����� ��� ���ڵ� ������ �����ϴ���̰��� ù��° �����Դϴ��0 ������ �ð���ð� �귯��ħ����� ��ȣȭ�� �ʿ��� ����Ʈ�� �ʹ� ��������� ��ȣȭ�� �ʿ��� ����Ʈ�� �ʹ� ��������� Ŭ������ �ʹ� ���� ���ǵǾ�������ʰ� �ʹ� ������������� ������ �ʹ� ������ʹ� ���� ����?!��ʹ� ���� �߿䵵��ʹ� ���ų� �ʹ� �� �ð��� ���������� ���� ������� ���� �پ� ��������α׷� %d�� �����ϴ� �� ������ ����
+-�`...'�� ��� �ִ� �࿡ ������ �� �� �����ϴ���Ѱ��� ������ Ÿ�����Ǿ����ϴ���Է��� ���� ���۸� �Ҵ��� �� �����ϴ�����ڸ� ��� �� �����ϴ�����ǵ��� ������� �� ���� ���� `%s'�`%2$s' ������ `%1$s' �ʵ忡 �� �� ���� ���ڰ� �ֽ��ϴ���� �� ���� ���� ���� ���ù���� �� ���� ������ `%s': �� ���õ���� �� ���� iconv() ���� %d��� �� ���� ���� `%s'��� �� ���� ��ȣ `%.*s': �� ���õ����Ģ���� ������������ ���� �޽����������� ���� ���ڿ��������� ���� ���ڿ� ����������� ���� ��ȣ �̸��������� ���� weight �̸�������� ������ ���Ѻ��� ���� �ʾƾ� �մϴ������:  %s �Է�����
+-���⿡ 2�� 29���� ������%s�� ���� ���� �������� �մϴ��<%s>�� ���� ���� 1�� 4 ���̿� �־�� �մϴ��`%s' ������ `%s' �ʵ��� ���� �� ���ڿ��� �Ǹ� �� �˴ϴ��<mb_cur_max>�� ���� <mb_cur_min>�� ������ Ŀ�� �մϴ��`LC_MONETARY' ������ `int_curr_symbol' �ʵ��� ���� ISO 4217�� ���Ǵ� �̸��� �ƴմϴ��`LC_MONETARY' ������ `int_curr_symbol' �ʵ��� ���� ���̰� Ʋ�Ƚ��ϴ��`%s' ������ `%s' �ʵ��� ���� 127���� �۾ƾ� �մϴ�������� �޾Ƶ��̴� ����: %s�ij���� ���� �׸��� �Ҵ��ϴ� ������ؽ� ���̺��� entry�� �Ҵ��ϴ� �����Ű ���縦 �Ҵ��ϴ� ����������� ��� ������ ���� ���������� �غ��ϴ� ����������ͺ��̽��� �д� ������������ϸ� ����Ÿ ������ ���� ����������� ���̽� ������ ���� ����������� ���� ���߽��ϴ�������ڰ� �ƴ� ����� ������ �� ������μ��� ������ �߸��Ǿ����Leap �ٿ� �ʵ��� ������ �߸��Ǿ����Link �ٿ� �ʵ��� ������ �߸��Ǿ����Rule �ٿ� �ʵ��� ������ �߸��Ǿ����Zone continuation �ٿ� �ʵ��� ������ �߸��Ǿ����Zone �ٿ� �ʵ��� ������ �߸��Ǿ����xdr_reference: �޸� ����
+-�xdrrec_create: �޸� ����
+-�yp_update: ȣ��Ʈ�� ��Ʈ�̸����� �ٲ� �� �����ϴ�
+-�yp_update: ���� �ּҸ� ���� �� �����ϴ�
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/nl.mo glibc-2.1.3/po/nl.mo
+--- ../glibc-2.1.3/po/nl.mo	1999-07-18 18:19:41.000000000 -0700
++++ glibc-2.1.3/po/nl.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,274 +0,0 @@
+-������J�����l�����$������1��"���	1��"���,1�����O1��:���k1������1������1������1������1��3����1��3���,2�����`2��&���t2��%����2������2��%����2��3����2�����23��"���K3��!���n3������3������3������3������3������3��"���4��*���)4�����T4��&���n4��&����4��&����4��&����4��&���
+-5��$���15�����V5�����q5������5��,����5������5��%����5��,���6��-���C6�� ���q6��&����6������6������6������6�����7������27��2����7��#����7��	���8�����8�����.8��'���N8�����v8��(���8�� ����8������8������8��$����8������8��(���9�����89�����H9�����T9��/���k9������9������9������9������9������9������9�����:�����:�����):�����B:��	���N:�����X:��&���p:��-����:��!����:������:�����;�����#;�����:;��&���Z;��%����;��!����;������;��-����;�����<��%���,<�����R<�����n<�����{<������<������<��@����<��D���=�����Q=�����d=�����}=��	����=�������=�����d>�����{>������>������>������>������>������>������>�����?�����$?�����-?�����6?��)���V?��
����?������?��1����?������?������?�����
+-@�����@�����2@�����E@�����^@�����m@������@������@������@������@������@������@������@�����A�����A�����A�����2A�����FA��!���SA�����uA��.����A������A������A������A������A��	���B�����B��+���5B�����aB�����rB������B������B������B������B������B�����C�����&C��1���7C��$���iC������C������C������C������C������C�����D�����D�����D�����4D�����;D�����JD�����cD��
���rD������D������D������D��!����D������D�����	E�����E�����+E��9���>E�����xE������E������E��#����E������E������E�����
+-F�����%F�����CF�����cF�����lF������F������F������F������F������F������F������F�����G�����1G�����QG�����bG�����zG������G������G������G������G������G�� ���H�����#H�����AH�����RH�����pH������H������H��!����H������H������H�����I�����)I�����?I��
���QI��#���_I������I������I������I������I������I������I�����J�����2J�����7J�����JJ�����hJ������J������J������J������J������J������J�����K�����*K�����FK��!���fK������K������K������K������K������K�����L��"���(L�����KL�����XL�����gL�����~L������L������L��-����L������L������L�����M�����*M��2���AM��;���tM������M������M������M������M��
���N�� ���"N�����CN�����VN�����qN������N������N������N�� ����N��
����N������N�����O�����O�����%O�����6O�����JO�����_O�����rO������O��"����O��
+-����O������O��
����O��!����O������P�����P�����#P�����AP��"���TP�����wP������P������P������P������P��'����P��#����P��&���Q��
���AQ�����OQ�����iQ������Q������Q������Q������Q������Q������Q������Q�����R�����R�����(R�����:R�����GR�����bR��W��wR��V���T�����&W������Y��#����[��:����[������[�����\��%���&\�����L\��"���b\������\������\������\������\������\��F����\��.���1]��6���`]��8����]��;����]��I���^��+���V^��+����^��'����^������^��	����^������^�����_�����'_��%���9_��.���__��&����_������_��C����_��#���`�����9`��&���X`�����`��1����`������`��"����`������a��'���a�����Da��.���aa��"����a��(����a��!����a������a��!���b��9���=b��4���wb��8����b��+����b��8���c��$���Jc��"���oc��!����c��.����c��<����c��;��� d��$���\d������d������d��"����d��)����d��N���e��U���Te������e��&����e��)����e��
���f�����'f��+���@f�����lf������f������f��"����f��%����f��*���
g��*���8g��0���cg��7����g��#����g��!����g��$���h��,���7h�����dh��'���sh��%����h��2����h������h��.���i�����0i��K���Ii��L����i��L����i��2���/j�����bj��%���xj��-����j��$����j������j�����k�����k��(���5k��!���^k��F����k������k��B����k��B���l��?���`l��<����l������l������l��.���m��0���Bm��0���sm������m������m������m������m�����n�����n�����/n�����Bn�����Un�����kn�����n��5����n��G����n��
���o��5��� o�����Vo�����co��'���zo��,����o������o������o��&����o��?���p��=���Yp��
����p������p��A����p�����q�����q��7���;q��3���sq������q��'����q��!����q�����r��C���r�����]r�����yr��)����r��*����r��%����r�����s��$���2s�����Ws�����ss������s������s��>����s�����t��!���*t��#���Lt�� ���pt��*����t��*����t��=����t��H���%u�����nu�����}u��E����u��&����u��(����u��'���#v��E���Kv������v��$����v��(����v��'����v����� w��"���>w��&���aw��P����w��V����w��U���0x��O����x��V����x��!���-y��'���Oy��*���wy��/����y��*����y��$����y��/���"z��1���Rz��/����z��)����z��*����z��)���	{��#���3{�����W{��&���r{��4����{������{������{��
����{��#���
+-|��$���.|��"���S|�����v|������|������|������|��.����|������|�����}��3���:}�����n}��	����}������}��0����}������}��$����}�����~��#���$~�����H~�����T~�����i~�����}~������~��4����~������~�������'���#��B���K��D������j������K���>���?�������7���ʀ�����������������9������P������g�����������������#�������#���߁��#������0���'���#���X���*���|���%�������'��͂��0�������/���&������V���K���r���������� ���܄���������������+������+���D������p���%�������%����������х��,������3���������K���!���i���$�������������� ���̆�����������
+-������!���(���<���?���e����������"�������"������"������"���)���"���L���(���o��������������������̈��)������������$���-���)���R���*���|���"�������%���ʉ��"����������������3������O�������k���6������#���9���
+-���]������h������z���.����������ċ��2���Ћ��)���������-���
+-���/���.���:������i���,��������������	����������ƌ��,������������������
���2������@���"���]����������������������������������׍��������������?���
���3���M���$������� ������� ���ǎ��������"������'���(���3���P���(��������������/���ɏ�� �������,���������G������c���#���p���������� �������:���Ґ��B���
������P������e����������	������������������u���������������������������ג���������
���������������3������H������Q������Y���.���y�����������������;���˓��������$��� ������E������U������p���#��������������#����������ޔ������������������0������9������T������s����������������������������������ѕ��*������!���
���-���/������]������q�������������������������������6���Җ�����	������������3���!���L��� ���n�����������������+�������������.������*���0������[������p�����������������"��������������
+-����������������������������*������G������V������c������}��� ��������������*���ٙ�����������������&���?���:������z�����������������1���Ϛ�����������������3���!���R��� ���t���
+-������������������������ћ������������������������&���!���D������f���-�����������������͜��������������!��� ������B������R������r���"���{���#���������������؝������������������/���(���J������s���������������������������ڞ��
������(����������#��� ���<���
���]���!���k�����������������"�������������������&����������$������;������Z������w������������������������!���֠�� �������(������#���B������f������}���!��������������)���ߡ�� ���	���/���*������Z������f������{��������������������Т��1���������������6������S������c���=���~���A�����������������������7������M���
+-���d������o����������"������� ����	���������������
���)���*������T������a������m������������������������������������ ���������������
+-������&������3������K���+���[�����������������%����������٦��+���������������*������9������W��� ���o���-�������/�������*���������������(������H������_������o���������������������������Ĩ�����ڨ�����������������,������J������c������|������������������������ֱ��%������G������ ���Y��� ���z���+����������Ǵ��-���ߴ�����
������������4������G���'���^���R�������,���ٵ��<������>���C���:�������F�������%������%���*���)���P������z���������������������������ٷ��-�������2���%���-���X���$�������I�������/�������&���%���*���L���$���w���:����������׹��)������"������-���4���#���b���7�������/�������"������������"���0���$���S���>���x���0�������5������*������<���I���#�������"�������$���ͼ��-������B��� ���B���c���&������� ���ͽ��������,������.���9���Q���h���S����������������%���#���D������h������x���,�������!����������ܿ��"������!������%���6���*���\���*�������4�������9�������'���!���$���I���'���n���.��������������.�������*������7���.������f���1���s����������O�������F������L���\���5��������������,�������2���"���"���U������x�����������������/��������������H���������`���A���t���A�������=�������=���6������t����������9�������;�������;���&������b�����������������������������������������������������'������F������`���3���{���8�������
�������@����������7������D���8���^���:���������������������,������B���>���@��������������!�������D�������3���8������l���L�������>�������������.���5���+���d����������?��������������"������-���$���(���R���(���{���$�������&�������,�������!���������?���!���^���F������� �������0�������2������'���L���,���t���-�������;�������D���������P������`���B���q���!�������.�������-������@���3������t���)�������1�������'�������.������'���A���&���i���T�������\�������[���B���T�������b�������%���V���,���|���*�������-�������1������,���4���4���a���5�������4�������-������/���/���/���_���*��������������*�������4���������:���
���U���
���c���#���q���!�������$������������������������������%���*���7���!���b���(�������<��������������������������0���)���!���Z���1���|����������(���������������������������#���.������R���=���q���-�������$�������*������A���-���G���o���q�������X���)���E�������=����������������������>������[������n���,��������������'�������%�������%���!���/���G���%���w���/�������,��������������n����������9��S��1����������������������)�������������q���p���1�����/���c���������"���L�������d���f�������0�������������������������
+-�������������������������������� ������<�������������������������I�����������;������(��Y���U������������������A�����������������������'���������������������-������H��������������F��z�������o���������������'����������a�������n��H������C������F��������������m��j���_���>�����������������������������,������g�������������.��������������������������B�����������6������0���i�������?�������M��4�������������������������3�����������s��������������������������������������P�����E������`�����������������G�������I��-��l������������:���������������������A�����=������#��[��������������������+�� �������������������������������������������*�������������;��k���u������F��>���������������
��������������p�������������������������@������"����������Q������7����������t������������������������?������=����������������*������V���B�����v��f������������E���H��7���������������������-��������7���������2������3������������������9������W��3������?�����������������������.���r��d�������������������������$�������������m���������%������u��K�������%�������������\��D��t������O����������G������������������������X��J��Z�����@�����������������������������	��8�����������������5���.��r������q������������=�������2������y������:���������������������������[����������������4����������/������������������������������������������{���c�������Q��`��z��+���h������������������������������������������^���������������������s�����h������R���������J��������������S���&��C�������������U��:������>�����"��������������(���|������K��������� ��������������������������i��������������������x���~��������J���	�������!��,����������������������T���������������������5������e���������!��a�������������b���������������,������������j�����������������Y��P���L���������������������������������������������������������������D���N�����������C����������������&���<��l��}�����������������I�����������/������������������6��_���������1��������2�������*��D�����6���������������X�������������������+���������]������8���~���T��������(����������G��w������������������]������������W���V������������������������������A���������O��������������������������������������������������������������������������������)��R��4����������������������g��k����������'�������v������Z����������������������������������������������������������y��
������\���#����������������������@����������8��#��N��^������;������������������
������������������������x��M�������{������������������������������o���������0��<�������}��$�����������E��9���������|���������������������5��w��$���������	��!������������
+-��b������
+-��������������������&������e�������������B������������)���%�������       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�   program vers proto   port
+-� (rule from "%s", line %d)� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�(unknown authentication error - %d)�(unknown)�*standard input*�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Accessing a corrupted shared library�Address already in use�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempting to link in too many shared libraries�Authentication OK�Authentication error�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Block device required�Broadcast select problem�Broken pipe�Bus error�CPU time limit exceeded�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Channel number out of range�Child exited�Client credential too weak�Communication error on send�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Cputime limit exceeded�Database is busy�Destination address required�Device not a stream�Device not configured�Device or resource busy�Directory not empty�Disc quota exceeded�Domain not bound�EMT trap�Error %d�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�Filesize limit exceeded�Floating point exception�Function not implemented�Gratuitous error�Hangup�Host is down�Host name lookup failure�I/O possible�IOT trap�Identifier removed�Illegal Instruction�Illegal instruction�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Killed�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Local domain name not set�Local resource allocation failure�Machine is not on the network�Memory exhausted�Message too long�Multihop attempted�NIS client/server version mismatch - can't supply service�NIS map data base is bad�Name not unique on network�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with name�No anode�No buffer space available�No child processes�No data available�No locks available�No match�No medium found�No message of desired type�No more records in map databank�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such file or directory�No such key in map�No such map in server's domain�No such process�Not a XENIX named type file�Not a directory�Numerical argument out of domain�Numerical result out of range�Object is remote�Odd number of quotation marks�Operation already in progress�Operation not permitted�Operation not supported�Operation not supported by device�Operation now in progress�Operation would block�Out of streams resources�Package not installed�Permission denied�Power failure�Premature end of regular expression�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RTLD_NEXT used in code not dynamically loaded�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Segmentation fault�Server rejected credential�Server rejected verifier�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Srmount error�Stack fault�Stale NFS file handle�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�System resource allocation failure�Terminated�Text file busy�Timer expired�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/BPT trap�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' for more information.
+-�Trying %s...
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown error �Unknown host�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...
+-       %s [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]
+-Mandatory arguments to long options are mandatory for short options too.
+-  -H, --header=NAME   create C header file NAME containing symbol definitions
+-  -h, --help          display this help and exit
+-      --new           do not use existing catalog, force new output file
+-  -o, --output=NAME   write output to file NAME
+-  -V, --version       output version information and exit
+-If INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE
+-       %s [OPTION]... -o OUTPUT-FILE INPUT-FILE
+-       %s [OPTION]... -u INPUT-FILE
+-Mandatory arguments to long options are mandatory for short options too.
+-  -f, --fold-case     convert key to lower case
+-  -h, --help          display this help and exit
+-  -o, --output=NAME   write output to file NAME
+-      --quiet         don't print messages while building databank
+-  -u, --undo          print content of databank file, one entry a line
+-  -V, --version       output version information and exit
+-If INPUT-FILE is -, input is read from standard input.
+-�Usage: %s [OPTION]... name
+-Mandatory arguments to long options are mandatory for short options too.
+-  -c, --force               create output even if warning messages were issued
+-  -h, --help                display this help and exit
+-  -f, --charmap=FILE        symbolic character names defined in FILE
+-  -i, --inputfile=FILE      source definitions are found in FILE
+-  -u, --code-set-name=NAME  specify code set for mapping ISO 10646 elements
+-  -v, --verbose             print more messages
+-  -V, --version             output version information and exit
+-      --posix               be strictly POSIX conform
+-
+-System's directory for character maps: %s
+-                       locale files  : %s
+-�Usage: %s [OPTION]... name
+-Mandatory arguments to long options are mandatory for short options too.
+-  -h, --help            display this help and exit
+-  -V, --version         output version information and exit
+-
+-  -a, --all-locales     write names of available locales
+-  -m, --charmaps        write names of available charmaps
+-
+-  -c, --category-name   write names of selected categories
+-  -k, --keyword-name    write names of selected keywords
+-�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Written by %s.
+-�Wrong medium type�YPBINDPROC_DOMAIN: %s
+-�You really blew it this time�Zone continuation line end time is not after end time of previous line�`%1$s' definition does not end with `END %1$s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice�bogus mcheck_status, library is buggy�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot open�cannot open databank file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot process order specification�cannot read character map directory `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot write output files to `%s'�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�end point of ellipsis range is bigger then start�error while inserting collation element into hash table�error while inserting to hash table�expect string argument for `copy'�expected continuation line not found�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�get_myaddress: ioctl (get interface configuration)�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal names for character range�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid GMT offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�memory clobbered before allocated block�memory clobbered past end of allocated block�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�never registered prog %d
+-�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�only WIDTH definitions are allowed to follow the CHARMAP definition�problems while reading `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: select (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�rpcinfo: can't contact portmapper: �same rule name in multiple files�select: protocol failure in circuit setup
+-�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp: makefd_xprt: out of memory
+-�svctcp_.c - cannot getsockname or listen�svctcp_.c - udp socket creation problem�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: socket creation problem�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�values for field `%s' in category `%s' must not be zero�while opening UTMP file�while opening old catalog file�while preparing output�while reading databank�while writing databank file�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.0.7
+-POT-Creation-Date: 1998-07-26 08:57-0700
+-PO-Revision-Date: 1998-12-12 15:50+0100
+-Last-Translator: Andr� van Dijk <ady@unseen.demon.nl>
+-Language-Team: Dutch <nl@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�       rpcinfo -b programma nummer versienummer
+-�       rpcinfo -d programmanummer versienummer
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n poortnummer ] -t host programmanummer [ versienummer ]
+-�   program vers proto   port
+-� (voorwaarde uit "%s", regel %d)� klaar
+-�"%s", regel %d: %s�"Zone %s" regel en -l optie gaan niet samen�"Zone %s" regel en -p optie gaan niet samen�%s in regelloze zone�%s%s%s:%u: %s%sAssertie `%s' faalde.
+-�%s%s%s:%u: %s%sOnverwachte fout: %s.
+-�%s%sOnbekend signaal %d
+-�%s: %d heeft `extend' niet juist gesigneerd
+-�%s: <mb_cur_max> moet groter zijn dan <mb_cur_min>
+-�%s: Kan %s niet aanmaken: %s
+-�%s: Kan map %s niet aanmaken: %s
+-�%s: Kan %s niet koppelen met %s: %s
+-�%s: Kan %s niet openen: %s
+-�%s: Kan %s niet verwijderen: %s
+-�%s: Fout bij sluiten %s: %s
+-�%s: Fout bij lezen %s
+-�%s: Fout bij schrijven %s
+-�%s: Fout bij schrijven standaarduitvoer �%s: Schrikkelregel in niet schrikkelseconde bestand %s (FIXME)
+-�%s: Geheugen uitgeput: %s
+-�%s: Meer dan een -L optie gegeven
+-�%s: Meer dan een -d optie gegeven
+-�%s: Meer dan een -l optie gegeven
+-�%s: Meer dan een -p optie gegeven
+-�%s: Meer dan een -y optie gegeven
+-�%s: commando was '%s', resultaat was %d
+-�%s: fout in state machine�%s: onjuiste optie -- %c
+-�%s: onjuiste optie -- %c
+-�%s: optie `%c%s' staat geen argument toe
+-�%s: optie `%s' is ambiguous
+-�%s: optie `%s' vereist een argument
+-�%s: optie `--%s' staat geen argument toe
+-�%s: optie `-W %s' staat geen argument toe
+-�%s: optie `-W %s' is dubbelzinnig
+-�%s: optie vereist een argument -- %c
+-�%s: paniek: Onjuiste `l_value' %d
+-�%s: voorbarig einde van bestand�%s: onbekende optie `%c%s'
+-�%s: onbekende optie `--%s'
+-�%s: gebruik is %s [ -s ] [ -v ] 
+-[ -l lokale tijd ] [ -p posixregels ] [ -d directory ]
+-[ -L schrikkelseconden ] [ -y jaartype ] [ bestandsnaam ... ]
+-�%s: gebruik is %s [ -v ] [ -c afbreken ] zonenaam ...
+-�(onbekende authenticatie fout - %d)�(onbekend)�*standaardinvoer*�.lib deel in a.out corrupt�; lage versie = %lu, hoge versie = %lu (FIXME)�; waarom = �<SP> teken mag geen onderdeel zijn van klasse `%s'�<SP> teken geen onderdeel van klasse `%s'�?�Afgebroken�Benaderen van een beschadigde deel-bibliotheek�Adres reeds in gebruik�Adres familie niet ondersteund door protocol�Advertise fout�Alarmklok�Argumentenlijst is te lang�Tracht in te veel deelbibliotheken te linken�Authenticatie OK�Authenticatie fout�Onjuist adres�Onjuiste bestandsbeschrijver�Onjuist lettertype bestandsformaat�Onjuiste melding�Onjuiste systeemaanroep�Blokapparaat vereist�Omroep selectie probleem�Onderbroken pijp�Bus fout�CPU tijdlimiet overschreden�Kan geen toegang verkrijgen tot benodigd deelbibliotheekbestand�Kan geen verbinding maken met server van dit domein�Kan niet communiceren met portmapper�Kan niet communiceren met ypbind�Kan niet communiceren met ypserv�Kan geen geheugen reserveren�Kan gevraagde adres niet toewijzen�Kan geen `socket' maken voor omroep rpc�Kan een deelbibliotheek niet rechtstreeks uitvoeren�Kan geen antwoord ontvangen om te zenden�Kan dienst niet registreren�Kan niet zenden na afsluiting transporteindpunt�Kan omroep pakket niet verzenden�Kan socket optie SO_BROADCAST niet instellen�Kanaal nummer buiten domein�Kind gestopt�Klant credential is te zwak (FIXME)�Communicatie fout bij zenden�Computer heeft het loodje gelegd�Berekenen tabelgrootte voor tekenklassen kan even duren...�Berekenen tabelgrootte voor collation informatie kan even duren...�Verbinding geweigerd�Verbinding reset door `peer'�Verbinding timed out�Voorgezet�Kopierecht (C) %s Free Software Foundation, Inc.
+-Dit is vrije programmatuur; zie de bron-code voor copieervoorwaarden.
+-Er is GEEN garantie; zelfs niet voor VERKOOPBAARHEID of GESCHIKTHEID
+-VOOR EEN BEPAALD DOEL.
+-�CPU-tijdslimiet overschreden�Database is bezig�Bestemmingsadres vereist�Apparaat is geen `stream'�Apparaat niet geconfigureerd�Apparaat of bron bezig�Map niet leeg�Schijf quota overschreden�Domein niet gebonden�EMT trap�Fout %d�Fout in onbekend fout systeem: �Fout: .netrc bestand is leesbaar voor anderen.�Uitwisseling vol�Exec formaat fout�FATAAL: systeem heeft `_POSIX2_LOCALEDEF' niet gedefinieerd�Gefaald (onbekende fout)�Bestandsbeschrijver in slechte staat�Bestand bestaat�Bestandsslot deadlock fout�Bestandsnaam te lang�Bestandsgrootte limiet overschreden�Bestand te groot�Bestandsgrootte limiet overschreden�Drijvende komma uitzondering�Functie niet ge�mplementeerd�Gratuitous (FIXME) fout�Ophangen�Computer is buiten werking�Fout bij opzoeken computernaam�I/O mogelijk�IOT trap (FIXME)�Identifier verwijderd�Ongeldige instructie�Ongeldige instructie�Ongeldig spoelen�Ongeschikt bestandstype of bestandsformaat�Ongeschikte `ioctl' voor apparaat�Ongeschikte bewerking voor achtergrond proces�Informatie-aanvraag�Invoer/uitvoer fout�Interne NIS fout�Interne ypbind fout�Onderbreking�Onderbroken systeemaanroep�Onderbroken systeemaanroep moet opnieuw gestart worden�Onjuist argument�Onjuiste terugverwijzing�Onjuiste tekenklassenaam�Onjuiste klant credential (FIXME)�Ongeldige klant verifier (FIXME)�Ongeldig sorteerteken�Ongeldige inhoud van \{\}�Ongeldige apparaat overschrijende koppeling�Onjuiste uitwisseling�Ongeldig of incompleet multibyte of wijd teken�Ongeldige voorafgaande reguliere expressie�Onjuist bereik einde�Onjuiste reguliere expressie�Ongeldige vraag code�Onjuiste vraag beschrijver�Onjuiste `server' verifier (FIXME)�Onjuist slot�Is een map�Is een benoemd bestandstype�Gedood�Nivo 2 gestopt�Nivo 2 niet gesynchroniseerd�Nivo 3 gestopt�Nivo 3 reset�Verwijzing is onderbroken�Verwijzingsnummer buiten bereik�Lokale domeinnaam niet ingesteld�Lokale brontoewijzingsfout�Machine is niet aangesloten op het netwerk�Geheugen uitgeput�Melding te lang�Multihop geprobeerd�NIS klant/server versie verschillend - kan geen diensten bieden�NIS map databank is slecht�Naam is niet uniek op netwerk�Heb een authenticator nodig�Netwerk heeft verbinding verbroken bij herstellen�Netwerk is buiten werking�Netwerk is onbereikbaar�Geen CSI structuur beschikbaar�Geen XENIX semaphoren beschikbaar�Geen adres geassocieerd met naam�Geen anode�Geen bufferruimte beschikbaar�Geen kindprocessen�Geen data beschikbaar�Geen sloten beschikbaar�Geen overeenkomst�Geen medium gevonden�Geen melding van gewenst type�Niet meer records in map databank�Geen vorige reguliere expressie�Geen `op-afstand' programma's geregistreerd.
+-�Geen route naar computer�Geen ruimte meer op apparaat�Onbekend bestand of map�Sleutel bestaat niet in kaart�Kaart bestat niet in serverdomein�Onbekend proces�Geen XENIX benoemd type bestand�Geen map�Numeriek argument is buiten domein�Numeriek resultaat is buiten domein�Object is niet lokaal�Oneven aantal aanhalingstekens�Bewerking al in voorbereiding�Bewerking niet toegestaan�Bewerking niet ondersteund�Bewerking niet ondersteund door apparaat�Bewerking in voorbereiding�Bewerking zou blokkeren�Geen streams bronnen meer�Pakket niet ge�nstalleerd�Toegang geweigerd�Stroomstoring�Voortijdig einde van reguliere expressie�Profiling timer verlopen�Protocol driver niet aangesloten�Protocol fout�Protocol familie niet ondersteund�Protocol niet beschikbaar�Protocol niet ondersteund�Protocol verkeerd type voor socket�Stop�RFS specifieke fout�RPC verkeerde procedure voor programma�RPC fout bij NIS actie�RPC programma niet beschikbaar�RPC programma versie onjuist�RPC structuur is onjuist�RPC versie onjuist�RPC: (onbekende fout code)�RPC: Authenticatie fout�RPC: Kan resultaat niet decoderen�RPC: Kan argumenten niet coderen�RPC: Gefaald (niet gespecificeerde fout)�RPC: Niet uitwisselbare RPC-versies�RPC: Port mapper faalt�RPC: Procedure niet beschikbaar�RPC: Programma niet geregistreerd�RPC: Programma niet beschikbaar�RPC: Programma/versie niet overeenkomstig�RPC: Remote systeem fout (FIXME)�RPC: Server kan argument niet decoderen (FIXME)�RPC: Succes�RPC: Tijd verstreken�RPC: Niet in staat te ontvangen�RPC: Niet in staat te zenden�RPC: Onbekende computer�RPC: Onbekend protocol�RTLD_NEXT gebruikt in niet dynamisch geladen code�Alleen-lezen bestandssysteem�Reguliere expressie te groot�Remote I/O fout�Op-afstand adres gewijzigd�Verwijder wachtwoord of maak bestand onleesbaar voor anderen.�Meld fouten met het `glibcbug' script aan <bugs@gnu.ai.mit.edu>.
+-�Verkeerde verzoek argumenten�Resolver Fout 0 (geen fout)�Resolver interne fout�Bron deadlock vermeden�Bron kwijt�Bron tijdelijk niet beschikbaar�Segmentatie fout�Server rejected credential (FIXME)�Server rejected verifier (FIXME)�Signaal 0�Socket operatie op niet-socket�Socket type niet ondersteund�Software veroorzaakte afbreken verbinding�Srmount fout�Stapel fout�Stale NFS file handle (FIMXE)�Gestopt�Gestopt (signaal)�Gestopt (tty invoer)�Gestopt (tty uitvoer)�Stromen pijp fout�Struktuur heeft schoonmaak nodig�Succes�Systeembron toewijzingsfout�Getermineerd�Tekstbestand in gebruik�Timer afgelopen�Te veel nivo's van symbolische verwijzingen�Te veel verwijzingen�Te veel open bestanden�Te veel geopende bestanden op systeem�Te veel processen�Te veel referenties: kan `splice' niet doen�Te veel gebruikers�Trace/BPT trap�Trace/breakpoint trap (FIXME)�Aanhangende `backslash'�Vertaler overleden (da's jammer)�Er is al verbinding met het transporteindpunt�Er is geen verbinding met het transporteindpunt�Probeer `%s --help' voor meer informatie.
+-�Probeer %s...
+-�Onbekend .netrc sleutelwoord %s�Onbekende NIS foutcode�Onbekende fout �Onbekende computer�Onbekende resolver-fout�Onbekende server-fout�Onbekend signaal %d�Onbekende systeemfout�Onbekende ypbind-fout�Niet corresponderende ( of \(�Niet corresponderende ) of \)�Niet corresponderende [ of [^�Niet corresponderende \{�Onbekende variabele `%s'�Dringende I/O conditie�Gebruik: %s [OPTIE]... -o UITVOER-BESTAND [INVOER-BESTAND]...
+-         %s [OPTIE]... [UITVOER-BESTAND [INVOER-BESTAND]...]
+-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties.
+-  -H, --header=NAAM   maak C header bestand NAAM met symbooldefinities
+-  -h, --help          toon hulp-tekst en be�indig programma
+-      --new           gebruik niet een bestaande catalog, maak een nieuwe
+-  -o, --output=NAAM   schrijf uitvoer naar bestand NAAM
+-  -V, --version       toon versie-informatie en be�indig programma
+-Als INVOER-BESTAND is -, lees invoer uit standardinvoer.  Als UITVOER-BESTAND
+-is -, schrijf uitvoer naar standaarduitvoer.
+-�Gebruik: %s [OPTIE]... INVOER-BESTAND UITVOER-BESTAND
+-         %s [OPTIE]... -o UITVOER-BESTAND [INVOER-BESTAND]
+-         %s [OPTIE]... -u INVOER-BESTAND
+-Verplichte argument bij lange opties zijn ook verplicht bij korte opties.
+-  -f, --fold-case     converteer sleutel naar kleine letters
+-  -h, --help          toon hulp-tekst en be�indig programma
+-  -o, --output=NAAM   schrijf uitvoer naar bestand NAAM
+-      --quiet         toon geen meldingen bij aanmaken databank
+-  -u, --undo          toon inhoud van databank bestand, een item per regel
+-  -V, --version       toon versie-informatie en be�indig programma
+-Als INVOER-BESTAND is -, lees invoer uit standardinvoer.
+-Meld fouten via <bug-glibc@prep.ai.mit.edu>.
+-�Aanroep: %s [OPTIE]... naam
+-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties.
+-  -c, --force               maak uitvoer zelfs als waarschuwing werden gegeven
+-  -h, --help                toon hulptekst en be�indig programma
+-  -f, --charmap=BESTAND     symbolische tekennamen gedefinieerd in BESTAND
+-  -i, --inputfile=BESTAND   bron definities zijn gevonden in BESTAND
+-  -u, --code-set-name=NAAM  specificeer codeset voor mappen ISO 10646 elementen
+-  -v, --verbose             toon meer meldingen
+-  -V, --version             toon versie-informatie en be�indig programma
+-      --posix               volg de POSIX afspraken
+-
+-Systeemmap voor tekenset: %s
+-        locale bestanden: %s
+-Meld fouten aan <bug-glibc@prep.ai.mit.edu>.
+-�Aanroep: %s [OPTIE]... naam
+-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties.
+-  -h, --help           toon hulptekst en be�indig programma
+-  -V, --version        toon versie-informatie en be�indig programma
+-
+-  -a, --all-locales     toon namen van beschikbare localen
+-  -m, --charmaps        toon namen van beschikbare tekensets
+-
+-  -c, --category-name   toon namen van geselecteerde categorie�n
+-  -k, --keyword-name    toon namen van geselecteerde sleutelwoorden
+-Meld fouten aan <bug-glibc@prep.ai.mit.edu>.
+-�Gebruik: %s variabele_naam [padnaam]
+-�Gebruik: rpcinfo [ -n portnummer ] -u host prognummer [ versienummer ]
+-�Gebruiker gedefinieerd signaal 1�Gebruiker gedefinieerd signaal 2�Waarde te groot voor gedefinieerd data-type�Virtuele timer verlopen�Wild resultaat afkomstig uit commando uitvoer�Venster veranderd�Geschreven door %s.
+-�Onjuist mediumtype�YPBINDPROC_DOMAIN: %s
+-�Deze keer heb je het echt goed verknalt�Zone voortgangsregel eindigingstijd is niet na eindigingstijd van voorgaande regel�`%1$s' definitie eindigt niet met `END %1$s'�`-1' moet de laatste ingang zijn `%s' veld in `%s' categorie�`...' mag alleen gebruikt worden `...' en `UNDEFINED' ingangen�verwacht `from' na eerste argument van `collating-element'�`from' string in vergelijkende element declaratie bevat onbekend teken�argument van <%s> moet ��n teken zijn�argument van `%s' moet ��n teken zijn�auth_none.c - Fataal marshalling probleem�onjuist argument�onjuiste eigenaar�leeg FROM veld op `Link' regel�leeg TO veld op `Link' regel�blok is twee keer vrijgegeven�bogus mcheck_status, bibliotheek is maar zozo�broadcast: ioctl (verkrijg interface configuratie)�broadcast: ioctl (verkrijg interface vlaggen)�cache_set: slachtoffer niet gevonden�kan tijdzone-afkorting (te gebruiken na tijdsaanduiding) niet achterhalen�kan procedure nummer %d niet opnieuw toewijzen
+-�kan locale bestand niet benaderen `%s'�kan collation element `%.*s' niet invoegen�kan niet invoegen in resultaat tabel�kan geen nieuw vergelijking symbool definitie invoegen: %s�kan niet openen�kan databank bestand `%s' niet openen: %s�kan invoerbestand `%s' niet openen�kan locale definitie bestand `%s' niet openen�kan uitvoerbestand `%s' niet openen�kan uitvoerbestand `%s' niet openen voor categorie `%s'�kan de gespecificeerde volgorde niet afhandelen�kan tekenkaart map `%s' niet lezen�kan locale map `%s' niet lezen�kan locale bestand `%s' niet lezen�kan uitvoer niet schrijven naar `%s'�categorie data meer dan eens gevraagd: zou niet mogen gebeuren�teken %s'%s' in klasse `%s' hoort in klasse `%s'�teken %s'%s' in klasse `%s' hoort niet in klasse `%s'�teken <SP> niet gedefinieerd in tekenkaart�teken `%s' niet gedefinieerd maar nodig als standaard waarde�tekenklasse `%s' is al gedefinieerd�tekenkaart `%s' is al gedefinieerd�tekenkaartbestand `%s' niet gevonden�clnt_raw.c - Fataal header serializatie fout.�vergelijkings element `%.*s' komt meer dan eens voor: negeer regel�vergelijkings symbool `%.*s' komt meer dan eens voor: negeer regel�vergelijkings symbool verwacht na `%s'�verbinding maken naar adres %s: �kan geen rpc server aanmaken
+-�kan programma %d versie %d niet registreren
+-�standaard tekenkaartbestand `%s' niet gevonden�richtingsvlag in string %d in tijdperkveld in categorie `%s' is niet '+' noch '-'�richtingsvlag in string %d in tijperkveld in categorie `%s' is niet een enkel teken�dubbele tekennaam `%s'�dubbel sorteerelementdefinitie�dubbele definitie voor teken `%.*s'�dubbele sleutel�tweede set definitie�dubbele zonenaam %s (bestand "%s", regel %d)�gedupliceerde meldings identifier�dubbel meldingnummer�lege gewicht naam: regel genegeerd�enablecache: cache is al mogelijk�enablecache: kan geen cache alloceren�enablecache: kan geen cache data alloceren�enablecache: kan geen cache fifo alloceren�eindpunt van ellipsis bereik is groter dan startpunt�fout tijdens invoegen vergelijkings element in hash tabel�fout tijdens bij invoegen in hash tabel�verwacht string argument voor `copy'�verwachte voortgangsregel niet gevonden�gefaald bij schrijven data voor categorie `%s'�fcntl: F_SETFD�veld `%s' uit categorie `%s' niet gedefinieerd�veld `%s' uit category `%s' ongedefinieerd�van-waarde van `collating-element' moet een string zijn�fstat faalde�rommel aan het einde van de tekencodespecificatie�rommel aan het einde van nummer�rommel aan einde van offset waarde in string %d in `era' veld in categorie `%s'�rommel aan einde van begin datum in %d in `era' veld in categorie `%s'�rommel aan einde van eind datum in string %d in `era' veld in categorie `%s'�get_myaddress: ioctl (haal interface configuratie op)�ergens hard gekoppeld�ongeldige CORRECTION veld op schrikkel regel�ongeldig Rolling/Stationary veld op schrikkelregel�ongeldige tekenconstante in string�ongelding vergelijkings element�ongeldige definitie�ongeldige codering gegeven�ongeldige escape reeks aan het einde van string�ongeldige namen voor tekenreeks�ongeldig nummer voor offset in string %d in `era' veld in categorie `%s'�ongeldig set nummer�ongeldig begin datum in string %d in `era' veld in categorie `%s'�ongeldige eind datum in string %d in `era' veld in categorie `%s'�implementatielimiet: niet meer dan %d tekenklassen toegestaan�implementatielimiet: niet meer dan %d tekenkaarten toegestaan�onjuist geformateerd bestand�invoer regel van onbekend type�interne fout - `addtype' aangeroepen met onjuiste `isdst'�interne fout - `addtype' aangeroepen met onjuiste `ttisgmt'�interne fout - `addtype' aangeroepen met onjuiste `ttisstd'�interne fout in %s, regel %u�onjuiste GMT offset�onjuist afkortingsformaat�ongeldige dag van de maand�ongeldig ending jaar (FIXME)�ongeldig schrikkeljaar�ongeldige maandnaam�ongeldig bewaarde tijd�ongeldig starting jaar (FIXME)�ongeldige tijd van de dag�ongeldig naam voor weekdag�regel na ellipsis moet een teken definitie bevatten�regel voor ellipsis bevat geen constante teken definitie�regel te lang�locale bestand `%s', gebruikt in `copy' statement, niet gevonden�lstat faalde�verkeerde regel genegeerd�geheugen clobbered voordat blok gereserveerd was (FIXME)�geheugen `clobbered' na het einde van een gealloceerd blok�geen geheugen meer beschikbaar�geen geheugen meer beschikbaar
+-�geheugen is consistent, bibliotheek is buggy�ontbrekend era formaat in string %d in `era' veld in category `%s'�ontbrekende era naam in string %d in `era' veld in category `%s'�naamloze regel�nooit geregistreerd programma %d
+-�geen correct reguliere expressie voor veld `%s' in category `%s': %s�geen enkele dag van de maand voldoet aan voorwaarde�geen definitie van `UNDEFINED'�geen ander sleutelwoord mag worden gespecificeerd wanneer `copy' is gebruikt�geen uitvoer bestand gemaakt omdat waarschuwingen zijn gegeven�geen symbolische naam gegeven�geen symbolisch naam gegeven voor einde bereik�geen gewicht gedefinieerd voor symbool `%s'�geen gewoon bestand�alleen WIDTH definities zijn toegestaan na de CHARMAP definitie�problemem tijdens lezen `%s'�programma %lu is niet beschikbaar
+-�programma %lu versie %lu is niet beschikbaar
+-�programma %lu versie %lu klaar en wacht
+-�rcmd: selecteer (setting up stderr): %m
+-�rcmd: socket: Alle ports in gebruik
+-�rcmd: schrijf (setting up stderr): %m
+-�registerrpc: geen geheugen meer beschikbaar
+-�herhalend schrikkelseconde moment�rpcinfo: %s is onbekende host
+-�rpcinfo: %s is onbekende service
+-�rpcinfo: Kan geen registratie verwijderen voor programma %s versie %s
+-�rpcinfo: uitzending mislukt: %s
+-�rpcinfo: kan geen kontakt krijgen met portmapper�rpcinfo: kan geen kontakt krijgen met portmapper: �zelfde regel naam in meerdere bestanden�select: protocol mislukt in opstart circuit
+-�socket: protocol mislukt in opstart circuit.
+-�sorteervolgorde `forward' en `backward' zijn niet eenduidig�specificatie van sorteergewich voor collation symbool heeft geen zin�standaardinvoer�standaarduitvoer�begindatum is ongeldig in string %d in `era' veld in category `%s'�beginjaar is groter dan eindejaar�beginjaar is te groot om weergegeven te worden�beginjaar is te laag om weergegeven te worden�einddatum is onjuist in string %d in `era' veld in category `%s'�svc_run: - select mislukt�svc_tcp: makefd_xprt: geen geheugen meer
+-�svctcp_.c - `getsockname' of `listen' lukken niet�svctcp_.c - udp socket aanmaak probleem�svctcp_create: geen geheugen meer beschikbaar
+-�svcudp_create - `getsockname' lukt niet�svcudp_create: socket aanmaak probleem�symbool voor multikarakter vergelijkings element `%.*s' dupliceerd
+-element definitie�symbool voor multikarakter vergelijkings element `%.*s' dupliceert
+-andere element definities�symbool voor multikarakter vergelijkings element `%.*s' dupliceert
+-andere symbool definitie�symbool voor multikarakters vergelijkings element `%.*s' dupliceerd symbooldefinitie�symbool voor multikarakter vergelijkings element `%.*s' dupliceerd symbolische naam in karakterset�syntactische fout in %s definitie: %s�syntactische fout in `order_start' directief�syntactische fout in tekenklasse definitie�syntactische fout in tekenomzettingsdefinitie�syntactische fout in collating volgorde definitie�syntactische fout in vergelijkings definitie�syntactische fout in definitie van LC_CTYPE category�syntactische fout in definitie van nieuwe tekenklasse�syntactische fout in definitie van nieuwe tekenkaart�syntactische fout in melding locale definitie�syntactische fout in monetaire locale definitie�syntactische fout in numerieke locale definitie�syntactische fout in volgorde specificatie�syntactische fout in prolog: %s�syntactische fout in tijd locale definitie�syntactische fout: niet in een locale definitie deel�dit is de eerste definitie�tijd voor nul�tijd overflow�te weinig bytes in karaktercodering�te veel bytes in karaktercodering�te veel karakterklassen gedefinieerd�te veel schrikkelseconden�te veel lokale tijd typen�te veel overgangen?!�te veel gewichten�te veel, of te lange, tijdzone afkortingen�rommel aan het einde van de regel�moeite met antwoorden naar programma %d
+-�twee regels in een rij bevattende `...' zijn niet toegestaan�typed enkel jaar (FIMXE)�ongedefinieerd�onbekend karakter `%s'�onbekend karakter in veld `%s' uit category `%s'�onbekende vergelijkings afgeleide�onbekende richtlijn `%s': regel genegeerd (FIXME)�onbekende set `%s'�onbekend symbool `%.*s': regel genegeerd�regelloze zone�niet getermineerde melding�niet getermineerde string�niet getermineerde symbolische naam�niet getermineerde gewichtnaam�grootste limiet in bereik is niet kleiner dan kleinste limiet�gebruik van 29 februari in niet schrikkeljaar�waarde voor %s moet een integer zijn�waarde voor <%s> moet tussen 1 en 4 liggen�waarde voor veld `%s' in categorie `%s' mag geen lege string zijn�waarde van <mb_cur_max> moet groter zijn dan de waarde van <mb_cur_min>�waarde van veld `int_curr_symbol' in categorie `LC_MONETARY'
+-korrespondeert niet met een geldige naam in ISO 4217�de lengte van waarde van veld `int_curr_symbol' in categorie
+-`LC_MONETARY' is niet juist�waarden voor veld `%s' uit categorie `%s' moeten kleiner zijn dan 127�waarden voor veld `%s' uit categorie `%s' mogen geen nul zijn�bij openen UTMP bestand�bij openen oud catalogusbestand�tijdens voorbereiden uitvoer�bij lezen databank�bij schrijven databankbestand�overschrijfbaar door anderen dan de eigenaar�onjuist aantal argumenten�onjuist aantal velden op schrikkelregel�onjuist aantal velden op `Link' regel�onjuist aantal velden op `Rule' regel�onjuist aantal velden op `Zone' voortgangsregel�onjuist aantal velden op `Zone' regel�yp_update: kan host niet omzetten naar netnaam
+-�yp_update: kan geen server adres verkrijgen
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/no.mo glibc-2.1.3/po/no.mo
+--- ../glibc-2.1.3/po/no.mo	1999-07-18 18:19:42.000000000 -0700
++++ glibc-2.1.3/po/no.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,448 +0,0 @@
+-������m������������6������8I�����9I�����LI��M���_I��E����I��&����I��(���J�����CJ�����TJ�����lJ�����~J������J������J������J������J��n���J�����YL�����kL��"���}L��"����L������L��:����L�����M�����#M�����,M�����BM�����YM�����sM������M������M������M������M������M�����N�����(N�����EN�����]N�����{N������N������N������N������N��3����N��3����N��4���+O��.���`O��%����O������O��&����O��%����O�����P��%���-P��3���SP��,����P��)����P������P��"����P��!���Q�����<Q�����SQ�����lQ������Q������Q��"����Q��*����Q������R��&���R��&���AR��&���hR��&����R��&����R������R�� ����R��$���S�����;S�����VS�����pS��,����S������S��%����S��,����S��-���(T�� ���VT��&���wT������T������T������T������T�����
+-U�����*U������JU��2����U�����V��"���"V��4���EV�����zV��#����V��	����V��=����V������V��<���	W�����FW��'���fW������W��)����W��(����W�� ����W�����X�����
X�����X��$���&X�����KX��)���bX��(����X������X������X������X��#����X��/���Y�����<Y�����NY��
���cY�����qY�����}Y������Y������Y������Y������Y������Y������Y������Z�����Z��	���"Z�����,Z�����0Z��
���HZ��&���VZ��-���}Z��!����Z������Z������Z�����	[����� [��&���@[��%���g[��0����[��!����[������[��-����[�����&\��%���C\��)���i\��'����\��%����\��&����\�����]�����$]�����>]�����K]�����f]�����}]������]������]��@����]��D���^�����U^�����h^������^��	����^��=����^������^�������^������_��2����_��-���`�����@`��$���S`��
+-���x`������`������`��!����`������`������`������`������`�����
+-a����� a�����8a�����Sa�����ga�����{a��3����a��-����a��2����a�����$b�����5b�����>b�����Eb�����Ub�����ob��<����b������b��)����b��
���
c�����c��1���-c��8���_c������c������c������c������c������c�����d�����$d�����3d�����Kd��"���dd������d������d������d�������d�����Se�� ���he������e������e������e������e��
����e������e��$���f�����0f��"���7f��%���Zf��"����f��"����f��%����f������f������f�����g��>���g�����^g�����gg�����kg�����~g��!����g������g��!����g������g��.���h�����1h�����Eh�����Rh��"���_h������h������h������h��	����h������h��+����h�����i�����)i�����:i�����Qi�����ni������i������i������i������i������i��1����i��$���1j�����Vj�����hj������j������j������j������j������j������j��
+-����j�����k�����k��2���k�����Gk�����Vk�����ok��
���~k������k������k������k������k������k������k��!���l�����9l�����Wl��s���wl������l�����m�����m�����'m�����Fm�����Ym�����mm������m������m������m������m������m��9����m������m�����n�����,n��,���En��
+-���rn�����}n������n������n������n������n������n��#����n�����o�����%o�����<o�����Wo��#���uo������o������o������o������o������o�����p�����p�����,p�����5p�����Ep�����`p������p������p������p������p������p������p�����q�����$q�����Cq��*���Sq�����~q������q������q������q��	����q��	����q������q������q�� ���r�����0r�����Nr�����[r�����or������r������r������r��(����r������r�����s�����+s�����Cs�����]s�����ss������s������s������s������s������s��.����s�����t��
��� t��#���.t��0���Rt��%����t������t������t������t������t������t�����u�����*u�����Hu�����_u�����vu������u������u������u������u������u�����v�����v�����.v�����@v�����Zv�����tv������v������v��!����v������v�����w�����w�����;w�����Tw�����rw��"����w������w������w������w������w������w�����x�����x��-���,x��-���Zx��!����x������x������x������x������x��2���y��#���6y�����Zy�����gy��;���{y������y������y������y�����z��
���z�� ���)z�����Jz�����Pz�����jz�����}z������z������z������z��&����z�����{�����{�����.{�����7{�����V{�� ���p{������{��$����{��
����{������{������{������{�����|�����,|�����4|�����E|�����Y|�����n|������|������|��*����|��(����|������|�����}��"���}�����:}�����A}��$���[}��
+-����}������}������}�����F��
���V�����d��!���x��������������������������"��������������� ������6������I���'���Y���#�������6�������
���܀��
+-�������������"�������"��� ������C���"���]���������������������������с��
���������������������������� ������9������P������e������w���������������������������ł�����ׂ���������������������#������:���?������z����������%����������̃��"������������ ������"���5��� ���X������y�����������������������������������������ք���������F������	���Y���.���c���-�������6�������8�������;���0���I���l�������������Ά��������+�������+���$���'���P������x����������	�����������������͇��������&�������.���#���&���R���,���y�������������ň��C������#���%������I������h���!�������"�������.���ɉ�� �������%������;���?���&���{����������1���Š��������������������"���,������O���'���k�����������������.���ȋ���������"������(���1���-���Z�����������������!����������ߌ���������������!���4������V������n����������9�������4���ۍ��8������+���I���8���u���$�������"���ӎ��!�������.���������G������f����������<�������;������$���������C������[���*���{���7����������ސ��"���������� ���)���3���N���]���U�������������&��� ���)���G���
���q���������+����������Ē���������������������"���.���%���Q���*���w���*����������͓��������0����������,������K���+���k���7�������#���ϔ��������!������$���3���!���X������z���&�������%�������,������������'������%���F���0���l���2����������Ж��.���ݖ��������K���%���L���q���L�������������2������2���R���/�������$����������ژ��%������-������$���D������i������������������������(���ə��&������!���������;���F���R����������B�������B������?���2���<���r�������������ʛ��#������.���	���0���8���0���i��������������������˜������������������������%������?������R������e������{����������#�������5���ȝ��G�������
���F���#���T���5���x�����������������!���Ҟ��(�������-���������K������\���'���n���?�������=���֟��
������.���"��� ���Q���9���r���;�������,������#���������9���%���S���A���y�������������ء��7�������3���-������a���'���x���!����������¢��.���Ӣ��������C������*���Y����������������������������������ף��:���������.���)���L���*���v���#����������Ť��$���������
+-������&������B������\������y���>����������إ��!������� ������$���:������_���*���u���=�������H���ަ�����'������6���E���F���&�������(�������'���ܧ��E���������J���(���c���'�������$�������,���٨��)������%���0������V���"���t����������&����������ܩ��P�������V���L���U�������O�������V���I���!�������'���«��*������/������*���E���$���p���/�������1���Ŭ��/�������)���'���*���Q���)���|���#����������ʭ��-������&������4���:���(���o�����������������
���Ʈ��#���Ԯ��$�������"���������@������V������p����������.����������ǯ��������3���������8���#���J������n���	��������������0����������ٰ��$����������������3���#���D������h������t���������������������������ձ��4���������#������6������S���'���s���B�������D���޲��j���#���K�������?���ڳ�����������9���!���V������x��������������������ȴ��"���ߴ�����������������/������M���#���g���#�������#�������0���ӵ��#���������(������F���*���d���%�������(���������޷���������W������C���f���%�������&���и������������������(������?������S������j���������������������������d������x��� ������� ����������λ��7������	���"������,������4������I��� ���e����������������� �������%������������$���(������M���#���l�����������������	���Ƚ�����ҽ���������������������1������1���H���3���z���/�������$���޾��������7������!���P������r���&�������1�������-������*���������:���(���X���-�������������������������������������!���&���?���6���f����������%�������%�������%������%���(���%���N������t���#�������+���������������������������'���-������U���#���t���'�������(�������!�������$������!���0������R������r��������������������������������1���d����������#�������/����������	���$���������?���:���H����������(��������������)�������������,������(���;���"���d������������������������#��������������-�������.���������N������_������l���,�������0������������������������	������������(������>������^������n����������������������������������������������������"�������"������.���9���+���h���#����������������������������%������.���5���,���d���.�������%��������������;������!���?���(���a���(�������-�������(�������(���
+-���$���3������X������r���!�����������������������������������?������M���O����������$�������"�������
+-�������A������"���D�������g��� ���E���%���f���)��������������*���������������������������#���������,������A������a������s��������������������������������������������;���,���/���h���=��������������
��������������������)���������=���>���X���������� ��������������!�������3������:���5������p��� ��������������%��������������#����������������&���&���A���)���h������������������������{����������Q���'���e�������������������������������
�������#�������#���������4���(���E���)���n���(�������'�������)����������������'���	���C���&���M���	���t������~����������������� ������������������������
+-���%���#���!���I������k���	���x���������������������������������������������#����������
������*������;������Q������h������������������������"��������������5�������#���4������X������o������������������������
���������������������
+-������������������5���"������X������g������������������������������� �����������������
+-��������� ���9������Z������y���}����������������)������9���#���J������n����������������������������������������������������6����������#������A���"���W���4���z������������������������"�����������������������-���+���J������v����������"�������#�������%�������"���������9���"���E������h������}��������������������������������������������!���)��� ���K������l�������������������������������$�������������!���)������K��� ���S������t�����������������	���������������������,�������*���������B������O������c������t��� ��������������,�������'����������������2���#���N������r���������������������������������������������6���
+-������A���
���N���$���\���;�������+������������������������������.���!���J���
���l���"���z��� ������� �������*�������	���
+-���������"���'������J���#���e������������������������������������������������ ������>���"���^���������� ���������������������&�������������'���;������c������p��������������������������������������2�������+���'������S������s������������������������4�������%������
+-���4������?���C���W���&�������!��������������0���������2���#���?������c������i��������������������������������������%����������%������8������H���-���Q���������(��������������#�������������	���������������4������H������`������h������y�������������������������������-�������!������
+-���;������F��� ���Y������z�����������������	���������������������	���������������������%������������������������������� ���-���4������b������t�����������������/�������+�������9������
���I���	���W������a���*���h���*�������#�������/����������������1������L������`������u�����������������
���������������������������������������������������"������8������N���
���d������r����������������� �������6��������������������/���*������Z���)���z����������'�������#�������"���������&������@���
���P������^������c������h���������&�������T�������������-���!���+���O���3���{���4�������>�������L���#������p�����������������)�������)����������
+-��� ���*������K���	���\��� ���f�����������������/�������0�������)���!���.���K���"���z����������D�������&�������(���&������O���#���l���&�������3�������"�������)������K���8���/�������#�������<�������#������
���9������G���"���Z������}���'���������������������*������������-���0��-���^��0������������������,�������������<�&���Y� �����!�����#����������7����3���:�9���n�&�����8�����"����!���+����M�2���l����������� �����C�����B���D�)����������#�����+�����?����"���X�&���{������"�����L�����N���(����w�-�����#���������������*�������:����Z����s������0�����1�����6����6���:����q������>��������������	�-���	�;���H	�"����	�����	�#����	�(����	�$���
+-����6
+-�/���U
+-�.����
+-�+����
+-�����
+-�'����
+-�#����5���;�3���q������*����������K�����G���C�G����������5�����1���
�2���M
�%����
�����
�)����
�1����
����!����?����U����s������'�����'��������������G�������e�:���y�:�����A�����>���1����p������ �����.�����0�����0���"����S����n������������������������������������������(����=�(���Q�+���z�;����������$�����+�������B����O�&���h�+�����+���������������,����:���5�8���p�
�����0�����!�����;���
+-�=���F�.�����"����������+�����<����&���Y������2�����/���������2����#���R����v�0����������B�����,�������=����C����\����m������8�����!�����-�����'���-�#���U�!���y�-����������������������%�"���D�?���g������%����������-�������4�2���O�@�����J������������ �B���1����t�'�����'�����B��������%�3���>�0���r�%�����5�����4�����&���4����[�*���z������/����������M����W���b�U�����L��� �Q���] �"���� �'���� �&���� �,���!!�3���N!�)����!�/����!�)����!�)���"�*���0"�)���["�+����"�%����"�����"�,����"�&���#�,���D#�'���q#� ����#�����#�����#�����#�����#����$����/$����G$����b$����y$�.����$�)����$�����$�3����%����4%�,���N%����{%�	����%�����%�'����%�����%�%����%����!&����8&�$���I&����n&����}&�����&�����&�����&�����&�4����&����'����2'����M'�%���k'�@����'�B����'�b���(�L���x(�?����(�$���)�%���*)�&���P)����w)�#����)�����)�����)�#����)����*����+*����A*����\*� ���s*� ����*� ����*�-����*� ���+����%+����D+�1���c+�(����+����������������������|��������������Q�����&����������������������������������������������������������������"���F���������/��e��t�����I�����������������V������������������������������������Q�����������������������I��������l�������������'��� ������	��]���������_���������������������
+-����������������������<������5����������������������%���g��Y��w�����������������8��
�����������������������6��+����������y����������e��
+-������G������������������������������������������J��6�����������5��H��0������������k���������M����������N��C������V������j��������k�����������������c����������������������������������������,���C��d��3��������^�������������T�������������f��*��������<���8����������T��������	��d��@��q��0��J��B�����������p���������P�����)���������������%����������Z��[��|������������X�������p���������������;��g�������o��i��]������.��������������������������F������6�������������O������������*���������������������������������3��$��B����������Z�������D��n��������������������������������������������-���������`������:��Y���/������������������������������������������2�������7�����S��z��"��\������	���!�������������������������#�����������y��������w������������U���H���L��z��'������m��%��=���I��U���������:��������������������j��������������������������e������E�������^���������A��
����������5������(�����������������f���o����������=��r���\��b��i������k�������������-���O��{��`��
���4������������9����������k��������B�������������������������������,����������������������f���������������u������������0��x��������������:��1������&�������������������H������������������P�����K���������������������L���L��������������������������X��������������v������������1������
��d����������&���K���$������������������������������������Y��������������������_���I�����n��7������8��h��N������������������\���;������������������������������u���B��M���������������������������^������r��������R������~���������
+-�� �������������������Z�����)�����m��9�������������������|��X�����������������E�������������������������1������(��"����������������������������;�����*��D��}���������������������������������������������������������{������������������������W�������m���������������������������������N��������y��Q��(������8���������������������A������������������O�����K���������>��_������������t��������������&�����[����������������,������7����������������������@���]�������*���������������������������i���J��-�����o������p�������������<��E��������a������,������?������j��M��������������������.��P�����������"���������c�������Y��z���������(�����������x��g��������w���������v���������������������������������R����������~�������Z�����������������������3��0���������������������`����������h���'��s����������2�����G�������5������F��������������c������C�������������?��%��q���b����������������.��������������������W��A�����K��g����������������9�������s���:��������������m������������������j���>�������h����������@������>�������������������e���P��u������a�����[���������W��\�����l���������������q��������/������������#��������������O��2���������V��S��#���������������������������������������+�������������������D��6�����������d���������������������������������U�����R����������������������������������#����������������l��������������������������������9��!���������������������������������X����������������7���h��!��������b���F����`������H��
+-�����!��i�����r��������T������[��������$�������������f������S���{������	����������=��U����������������s������������@��L��c�����<��������~�������^������n�����b��x������2�����������4����������������������������V�������������.���)������D���$���������������������a�����������������]��l����������������C����������G����������������v�����+��������;������?���_��?��������������}��������������������������T��E���M���������N�����������������������}�������������=�����������J���'��4��R��/���>���-������ ������������4������Q������+������������������G�������������������������t���������)��������a���W������S��1��������������������3�������������� ���A�������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name not unique on network�Name or service not known�Name/entry isn't unique�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�preprocessor error�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-01-16 14:00+0100
+-Last-Translator: Eivind Tagseth <eivindt@multinet.no>
+-Language-Team: Norwegian <no@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8bit
+-�		Tilgangsrettigheter :�		Attrbiutter         :�	%s [-abkCLNTM] [-Dnavn[=verdi]] [-i st�rrelse] [-I [-K sekunder]] [-Y s�kesti] innfil
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o utfil] [innfil]
+-�	%s [-n nettid]* [-o utfil] [innfil]
+-�	%s [-s nettype]* [-o utfil] [innfil]
+-�	Tilgangsrettigheter: �	Innslagsdata av type %s
+-�	Navn            : %s
+-�	Offentlig n�kkel: �	Type            : %s
+-�	Universale adresser (%u)
+-�	[%d]	Navn          : %s
+-�	[%u] - [%u bytes] �
+-%s hurtigbuffer (cache):
+-
+-%15s  hurtigbuffer er p�
+-%15Zd  foresl�tt st�rrelse
+-%15ld  sekunders levetid for positive innslag
+-%15ld  sekunders levetid for negative innslag
+-%15ld  treff i hurtigbuffer for positive innslag
+-%15ld  treff i hurtigbuffer for negative innslag
+-%15ld  bom i hurtigbuffer for positive innslag
+-%15ld  bom i hurtigbuffer for negative innslag
+-%15ld%% treffrate for hurtigbuffer
+-%15s  sjekk /etc/%s for endringer
+-�
+-Gruppemedlemmer :
+-�
+-Levetid         : �       rpcinfo -b prognr versnr
+-�       rpcinfo -d prognr versnr
+-�       rpcinfo -p [ vert ]
+-�       rpcinfo [ -n portnr ] -t vert prognr [ versnr ]
+-�      nei�     ja�    Datalengde = %u
+-�    Eksplisitte medlemmer:
+-�    Eksplisitte ikke-medlemmer:
+-�    Implisitte medlemmer:
+-�    Implisitte ikke-medlemmer:
+-�    Ingen eksplisitte medlemmer
+-�    Ingen eksplisitte ikke-medlemmer
+-�    Ingen implisitte medlemmer
+-�    Ingen implisitte ikke-medlemmer
+-�    Ingen rekursive medlemmer
+-�    Ingen rekursive ikke-medlemmer
+-�    Rekursive medlemmer:
+-�   program vers proto   port
+-�  eller: � (regel fra �%s�, linje %d)� [FLAGG...]� ferdig
+-��%s�, linje %d: %s��Zone %s�-linje og flagget -l utelukker hverandre��Zone %s�-linje og flagget -p utelukker hverandre��innfil� er n�dvendig for flagg for malgenerering.
+-�%.*s: ARGP_HELP_FMT-parameteren krever en verdi�%.*s: Ukjent ARGP_HELP_FMT-parameter�%s i sone uten regel�%s%s%s:%u: %s%sForutsetningen (assertion) �%s� feilet.
+-�%s%s%s:%u: %s%sUventet feil: %s.
+-�%s%sUkjent signal %d
+-�%s: fortegnsutvidelsen av %d ble feil
+-�%s: <mb_cur_max> m� v�re st�rre enn <mb_cur_min>
+-�%s: C-preprosessoren feilet med sluttkode %d
+-�%s: C-preprosessoren feilet med signal %d
+-�%s: Kan ikke opprette %s: %s
+-�%s: Kan ikke opprette filkatalog %s: %s
+-�%s: Kan ikke opprette link fra %s til %s: %s
+-�%s: Kan ikke �pne %s: %s
+-�%s: Kan ikke fjerne %s: %s
+-�%s: Feil ved lukking av %s: %s
+-�%s: Feil ved lesing fra %s
+-�%s: Feil ved skriving til %s
+-�%s: Feil ved skriving til standard ut �%s: �Leap�-linje i fil %s som ikke er skuddsekundsfil
+-�%s: Minnet oppbrukt: %s
+-�%s: Mer enn ett -L-flagg spesifisert
+-�%s: Mer enn ett -d-flagg spesifisert
+-�%s: Mer enn ett -l-flagg spesifisert
+-�%s: Mer enn ett -p-flagg spesifisert
+-�%s: Mer enn ett -y-flagg spesifisert
+-�%s: For mange argumenter
+-�%s: kan ikke finne modifiseringstid�%s: kommandoen var '%s', resultatet ble %d
+-�%s: feil i tilstandsmaskinen�%s: ulovlig flagg -- %c
+-�%s: ugyldig flagg -- %c
+-�%s: flagget �%c%s� tar ikke argumenter
+-�%s: flagget �%s� er flertydig
+-�%s: flagget �%s� m� ha et argument
+-�%s: flagget �--%s� tar ikke argumenter
+-�%s: flagget �-W %s� tar ikke argumenter
+-�%s: flagget �-W %s� er flertydig
+-�%s: flagget m� ha et argument -- %c
+-�%s: utskrift wille overskrive %s
+-�%s: panikk: ugyldig l_value %d
+-�%s: for tidlig slutt p� filen�%s: kan ikke �pne �%s: ukjent flagg �%c%s�
+-�%s: ukjent flagg �--%s�
+-�%s: bruk er %s [ -s ] [ -v ] [ -l lokaltid ] [ -p posixregler ] [ -d katalog ]
+-	[ -L skuddsekunder ] [ -y �rkontrollprogram ] [ filnavn ... ]
+-�%s: bruk er %s [ -v ] [ -c grense ] sonenavn ...
+-�%s: under skriving av utdata: �(PROGRAMFEIL) Ingen versjon kjent!?�(PROGRAMFEIL) Flagg skulle ha blitt gjenkjent!?�(Ukjent objekt)
+-�(ukjent feil ved autentisering - %d)�(ukjent)�*** Filen �%s� er strippet: ingen detaljert analyse mulig
+-�*standard inn*�-o UTFIL [INNFIL]...
+-[UTFIL [INNFIL]...]�.lib-seksjon i a.out skadet�; nedre versjon = %lu, �vre versjon = %lu�; hvorfor = �<%s> og <%s> er ulovlige navn for tegnomr�de�tegnet <SP> kan ikke v�re i klassen �%s��tegnet <SP> er ikke i klassen �%s��?�Avbrutt (SIGABRT)�Tilgangsrettigheter: �Aksesserer et skadet delt bibliotek�Adressen er allerede i bruk�Adressefamilien for vertsnavn er ikke st�ttet�Adressefamilien er ikke st�ttet av protokollen�Annonseringsfeil�Alarmen gikk�Argumentlisten er for lang�Fors�k p� � fjerne en tabell som ikke er tom�Fors�ker � linke inn for mange delte biblioteker�Autentisering OK�Autentiseringsfeil�FALSKT OBJEKT
+-�Ugyldig adresse�Ugyldig fildeskriptor�Ugyldig format p� typesnittsfil�Ugyldig melding�Ugyldig systemkall�Ugyldig verdi for ai_flags�V�r strengt POSIX-konform�Bin�re data
+-�Blokk-enhet kreves�R�ret ble brutt�Bussfeil�CDS�Begrensning av CPU-tid overskredet�Tidsgrense for hurtigbuffer l�p ut�Kan ikke aksessere et n�dvendig delt bibliotek�Kan ikke koble til tjener for dette domenet�Kan ikke kommunisere med portmapper�Kan ikke kommunisere med ypbind�Kan ikke kommunisere med ypserv�Kan ikke tildele minne�Kan ikke benytte den �nskede adressen�Kan ikke opprette socket for kringkastings-rpc�Kan ikke eksekvere et delt bibliotek direkte�Kan ikke ha mer enn ett fil-genereringsflagg!
+-�Kan ikke ta imot svar p� kringkasting�Kan ikke registrere tjeneste�Kan ikke sende etter at transportendepunktet har koblet ned�Kan ikke sende kringkastingspakke�Kan ikke sette socket-flagg SO_BROADCAST�Kan ikke spesifisere mer enn en innfil!
+-�Kan ikke bruke nettid-flagg med inetd-flagg!
+-�Kan ikke bruke nettid-flagg uten TIRPC!
+-�Kan ikke bruke tabellflagg med ny stil!
+-�Kanalnummer utenfor gyldig intervall�Tegn-separator      : %c
+-�Barnet avsluttet�Klientens referanser er for svake�Kolonner            :
+-�Kommunikasjonsfeil ved sending�Kompiler lokal-spesifikasjon�Datamaskinen tok ferie�Beregning av tabellst�rrelse for tegnklasser kan ta en stund...�Beregning av tabellst�rrelse for sammenligningsinformasjon kan ta en stund...�Oppkobling nektes�Forbindelsen brutt i den andre enden�Oppkoblingen overskred tidsgrensen�Fortsetter�Konverter innkoding av gitte filer fra en innkoding til en annen.�Konverter n�kkel til sm� bokstaver�Copyright (C) %s Free Software Foundation, Inc.
+-Dette er gratis programvare.  Se kildekoden for kopieringsbetingelser.
+-Programvaren har ingen garanti, ikke en gang for SALGBARHET eller EGNETHET
+-TIL NOEN SPESIELL OPPGAVE.
+-�Kunne ikke opprette loggfil �%s��Lag utdata selv om advarsler ble gitt�Lag en enkel DB-database fra tekst-input.�Opprettelsestid: %s�DES-innslag for nettnavn %s er ikke unikt
+-�KATALOG
+-�DNANS�DNS�Database for tabell eksisterer ikke�Databasen er opptatt�Forvalgte tilgangsrettigheter:
+-�M�ladresse kreves�Enheten er ikke en stream�Enheten er ikke konfigurert�Enheten eller ressursen opptatt�Diffie-Hellmannn (%d bits)
+-�Katalog       : %s
+-�Filkatalogen er ikke tom�Diskkvoten er overskredet�Ikke spalt ut ny prossess og vis meldinger p� n�v�rende tty�Ikke skriv meldinger under bygging av databasen�Ikke bruk eksisterende katalog, tving opprettelse av ny utfil�Domenet er ikke bundet�Emulatorfelle�INNSLAG
+-�Kryptert data
+-�Innslag-/tabell-type stemmer ikke overens�Feil i undersystem til RPC�Feil ved aksessering av NIS+ kaldstartfil. Er NIS+ installert?�Feil i ukjent feilsystem: �Feil: .netrc kan leses av andre.�Veksel full�Ugyldig format p� eksekverbar fil�FATALT: systemet definerer ikke �_POSIX2_LOCALEDEF��FIL inneholder mapping fra symbolske navn til UCS4-verdier�Feilet (uspesifisert feil)�Fildeskriptor i ugyldig tilstand�Filen eksisterer�Fill�sing feilet p� grunn av vrangl�s�For langt filnavn�Grense for filst�rrelse overskredet�For stor fil�F�rste/neste-kjede �delagt�Unntakstilfelle ved flyttallsoperasjon�Full resynkoronisering trengs for katalog�Funksjonen er ikke implementert�GRUPPE
+-�S�ppel i ARGP_HELP_FMT: %s�Generer meldingskatalog.\vHvis INNFIL er - lese inndata fra standard inn.  Hvis UTFIL
+-er - skrives utdata til standard ut.
+-�Generell systemfeil�Hent informasjon spesifikk for lokalet.�Gi en kort bruksmelding�Gi denne hjelpelisten�Umotivert feil�Gruppe        : %s
+-�Gruppeflagg :�Gruppeinnslag for �%s.%s�-gruppen:
+-�Heng i SEK sekunder (forvalgt 3600)�Legg p� (SIGHUP)�Har ikke funnet �%d� i gruppe-n�rbuffer!�Har ikke funnet �%d� i passord-n�rbuffer!�Har ikke funnet �%s� i gruppe-n�rbuffer!�Har ikke funnet �%s� i verts-n�rbuffer!�Har ikke funnet �%s� i passord-n�rbuffer!�Vertsmaskin er nede�Oppslag av vertsnavn feilet�I/O mulig�INNFIL UTFIL
+--o UTFIL INNFIL
+--u INNFIL�IOT-felle�IVY�Identifikator tatt bort�Ulovlig instruksjon (SIGILL)�Ulovlig objekttype for operasjon�Ulovlig s�keoperasjon�Uegnet filtype eller format�Uegnet �ioctl� for enhet�Uegnet operasjon for bakgrunnsprosess�Informasjonsforesp�rsel (SIGINFO)�Informasjon:�Innfiler:�Inn-/ut-formatspesifikasjon:�Inn/ut-feil�Intern NIS-feil�Intern ypbind-feil�Avbrutt�Avbrutt systemkall�Avbrutt systemkall burde startes om�Ugyldig objekt for operasjon�Ugyldig argument�Ugyldig bak-referanse�Ugyldig tegnklassenavn�Ugyldige klientreferanser�Ugyldig klientverifikator�Ugyldig sammenligningstegn�Ugyldig bruk av \{\}�Ugyldig link over adskilte enheter�Ugyldig veksel�Ugyldig eller ufullstendig multibyte eller bredt tegn�Ugyldig foreg�ende regul�rt uttrykk�Ugyldig intervallslutt�Ugyldig regul�rt uttrykk�Ugyldig tilgangskode�Ugyldig foresp�rseldeskriptor�Ugyldig tjenerverifikator�Ugyldig plass�Er en filkatalog�Er en navngitt filtype�Kerberos.
+-�Drept�LINK
+-�LOKALT innslag for UID %d i katalog %s er ikke unikt
+-�Niv� 2 stoppet�Niv� 2 ikke synkronisert�Niv� 3 stoppet�Niv� 3 startet om�Link peker til ugyldig navn�Linken har blitt skadet�Linknummer utenfor gyldig omr�de�Linket objekttype: �Linket til: %s
+-�Lokalt domenenavn er ikke satt�Tildelingsfeil for lokal ressurs�Maskinen er ikke p� nettverket�Feilaktig eller ulovlig navn�Obligatoriske eller frivillige argumenter til lange flagg er ogs� obligatoriske eller frivillige for tilsvarende korte flagg.�Minneallokeringsfeil�Minnet oppbrukt�For lang melding�Atributt mangler eller er feilaktig�Endringstid   : %s�Endring feilet�Endringsoperasjon feilet�Endre format for utdata:�Fors�kte viderehopp�NAVN�NAVN
+-[-a|-m]�NIS�NIS klient/tjener versjonsforskjell - kan ikke betjene�NIS' kart-database er korrupt�NIS+-operasjon feilet�NIS+-tjenere er ikke tilgjengelige�NIS+-tjeneste er utilgjengelig eller ikke installert�IKKE NOE OBJEKT
+-�NUMMER�Navn : �%s�
+-�Navnet er ikke unikt p� nettverket�Navn eller tjeneste ukjent�Navn/innslag er ikke unikt�M� ha noen til � autentisere�Nettverket tok ned forbindelsen ved omstart�Nettverket er nede�Nettverket er ikke tilgjengelig�Ingen CSI-strukturer tilgjengelige�Ingen XENIX-semaforer tilgjengelige�Ingen adresse assosiert med vertsnavn�Ingen adresse assosiert med navnet�Ingen anode�Ikke mer buffer-plass tilgjengelig�Ingen barneprosesser�Ingen data er tilgjengelige�Ikke mer plass p� enheten�Ingen l�ser tilgjengelige�Ingen treff�Medium ikke funnet�Ingen meldinger av �nsket type�Ingen flere poster i tabellen�Intet foreg�ende regul�rt uttrykk�Ingen fjernprogram registrerte.
+-�Ingen rute til vertsmaskinen�Ikke mer plass p� enheten�Ingen slik enhet�Ingen slik fil eller filkatalog�Ingen slik n�kkel i tabellen�Ingen slik tabell i tjenerens domene�Ingen slik prosess�Uoverkommelig feil i navneoppslag�Ingen.
+-�Ikke funnet, ikke noe slikt navn�Ikke en XENIX navngitt fil�Ikke en filkatalog�Ikke funnet�Ikke eier�Antall kolonner     : %d
+-�Antall objekter   : %u
+-�Numerisk argument er utenfor definert omr�de�Numerisk resultat er utenfor gyldig omr�de�Objekt #%d:
+-�Objektnavn    : %s
+-�Objekttype    : �Er et fjernobjekt�Objekt med samme navn eksisterer�Odde antall siteringstegn�Bare root har lov til � bruke dette flagget!�Operasjonen er allerede under utf�relse�Operasjonen er ikke tillatt�Operasjonen er ikke st�ttet�Operasjonen er n� under bearbeiding�Operasjonen ville ha blokkert�Ikke flere streams-ressurser�Eier          : %s
+-�PRIVAT
+-�Pakken er ikke installert�Feil under tolkning: %s�Delvis suksess�Overf�rt objekt er ikke det samme objektet p� tjeneren�Ikke tilgang�Str�mmen gikk�For tidlig slutt p� regul�rt uttrykk�Skriv ut innholdet av en databasefil, ett innslag per linje�Skriv ut n�v�rende konfigurasjonsstatistikk�Skriv flere meldinger�Skriv programversjon�Sannsynligvis ikke funnet�Profileringstiden tok slutt�Protokolldriver er ikke tilkoblet�Protokollfeil�Protokoll-familien er ikke st�ttet�Protokollen er ikke tilgjengelig�Protokollen er ikke tilgjengelig�Protokollen er ikke riktig type for socket�Avsluttet�RFS-spesifikk feil�RPC: ugyldig prosedyre for program�RPC-feil ved NIS-operasjon�RPC-programmet er ikke tilgjengelig�RPC: feil programversjon�RPC-strukturen er ugyldig�feil RPC-versjon�RPC: (ukjent feilkode)�RPC: Feil ved autentisering�RPC: Kan ikke dekode resultatet�RPC: Kan ikke kode argumentet�RPC: Feilet (uspesifisert feil)�RPC: Inkompatible versjoner av RPC�RPC: Feil i portmapper�RPC: Prosedyre ikke tilgjengelig�RPC: Programmet ikke registrert�RPC: Programmet utilgjengelig�RPC: Program/versjon-uoverensstemmelse�RPC: Systemfeil hos mottaker�RPC: Tjener kan ikke dekode argumentene�RPC: Suksess�RPC: Tidsgrensen overskredet�RPC: Kan ikke ta imot�RPC: Kan ikke sende�RPC: Ukjent vertsmaskin�RPC: Ukjent protokoll�RSA (%d bits)
+-�RTLD_NEXT brukt i kode som ikke er dynamisk lastet�Led og vis profileringsdata for delt objekt�Led konfigurasjonsdata fra NAME�Filsystem med kun lesetilgang�Regul�rt uttrykk for stort�I/O-feil p� fjern maskin�Fjernadresse endret�Ta bort passord, eller gj�r filen ulesbar for andre.�Gjen�pning av delt objekt �%s� feilet�Replik�r:
+-�Rapporter bugs til %s.
+-�Rapporter feil ved � bruke skriptet �glibcbug� til <bugs@gnu.org>.
+-�Argumenter for foresp�rsel er ugyldige�Navnetjeneste-feil 0 (ingen feil)�Intern feil i navnetjenesten�Klarte � unng� vrangl�s ved tildeling av ressurs�Ressurs tapt�Ressursen midlertidig utilgjengelig�SUNYP�S�kesti             : %s
+-�Minnesegmentsfeil�Tjener opptatt, pr�v igjen�Tjener tom for minne�Tjener forkastet referansene�Tjener forkastet verifikator�Servname ikke st�ttet for ai_socktype�Sett programnavnet�Sl� av tjeneren�Signal 0�Socket-operasjon p� noe som ikke er en socket�Socket-typen er ikke st�ttet�Programvare for�rsaket forbindelsesbrudd�Beklager.  Du er ikke root
+-�Kildedefinisjoner ikke funnet i FIL�Srmount-feil�Stakkfeil�Foreldet NFS-filh�ndtak�Start ANTALL tr�der�Status            : %s
+-�Stoppet�Stoppet (signal)�Stoppet (ville lese fra tty)�Stoppet (ville skrive til tty)�Streams-r�rfeil�Strukturen trenger opprydding�Suksess�Undertrykk advarsler og informasjonsmeldinger�Symbolske tegnnavn definert i FIL�Systemfeil�Systeminformasjon:�Kunne ikke tildele systemressurs�TABELL
+-�Tabelltype          : %s
+-�Midlertidig feil i navneoppslag�Terminert�Programfil opptatt�Den f�lgende listen inneholder alle de kjente kodede tegnsettene.  Dette
+-betyr ikke n�dvendigvis at alle kombinasjoner av disse navnene kan bli brukt
+-som FRA- og TIL-kommandolinjeparametre.  Et kodet tegnsett kan v�re listet
+-med flere forskjellige navn (alias).
+-  Noen av navnene er ikke vanlige strenger men er isteden regul�re uttrykk
+-og de tilsvarer en variasjon av navn som kan bli gitt som parametre til
+-programmet.
+-
+-  �Levetid: �Tidsgrense l�p ut�For mange attributter�For mange niv�er med symbolske linker�For mange linker�For mange �pne filer�For mange �pne filer i systemet�For mange prosesser�For mange referanser: kan ikke spleise sammen�For mange brukere�Sporings-/stoppunkts-felle�Etterf�lgende backslash�Tolken d�de�Transport-endepunktene er allerede sammenkoblet�Transport-endepunktene er ikke sammenkoblet�Pr�v �%s --help� eller �%s --usage� for mer informasjon.
+-�Pr�ver %s...
+-�Type: %s
+-�UKJENT�Ikke i stand til � autentisere NIS+-klient�Ikke i stand til � autentisere NIS+-tjener�Ikke i stand til � lage tilbakekall�Ikke i stand til � opprette prosess p� tjeneren�Ukjent (type = %d, bits = %d)
+-�Ukjent .netrc-n�kkelord %s�Ukjent NIS-feilkode�Ukjent database: %s
+-�Ukjent feil�Ukjent feil �Ukjent vert�Ukjent objekt�Ukjent flagg: %s %s %s�Ukjent navnetjeneste-feil�Ukjent tjener-feil�Ukjent signal %d�Ukjent systemfeil�Ukjent ypbind-feil�Ubalansert ( eller \(�Ubalansert ) eller \)�Ubalansert [ eller [^�Ubalansert \{�Ukjent variabel �%s��Kritisk I/O-tilstand�Bruk:�Bruk: %s variabelnavn [s�kesti]
+-�Bruk: rpcinfo [ -n portnr ] -u vert prognr [ versnr ]
+-�Brukerdefinert signal 1�Brukerdefinert signal 2�Verdien er for stor for den definerte datatypen�Virtuell tidsgrense overskredet�Vilt resultat fra eksekvering av kommando�Vinduet ble endret�Skriv navnene til tilgjengelige lokaler�Skriv navnene til valgte kategorier�Skriv navnene til valgte n�kkelord�Skriv utdata til fil NAVN�Skrevet av %s.
+-�Gal mediatype�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Ja, 42 er meningen med livet�Denne gangen rotet du det virkelig til�Sluttiden p� fortsetningslinjen til en sone kommer f�r sluttiden p� foreg�ende linje�[FIL...]��%1$s� definisjon slutter ikke med �END %1$s���%s� er ikke korrekt profildatafil for �%s���-1� m� v�re siste post i felt �%s� i kategori �%s���...� kan bare brukes i postene �...� og �UNDEFINED���from� forventet etter f�rste argument til �collating-element���from�-streng i deklarasjon av sammenligningsselement inneholder ukjent tegn�ai_family er ikke st�ttet�ai_socktype er ikke st�ttet�kj�rer allerede�argument til <%s> m� v�re ett enkelt tegn�argument til �%s� m� v�re ett enkelt tegn�auth_none.c - Fatal kodingsfeil�authunix_create: ikke mer minne
+-�ugyldig argument�feil eier�tomt �FROM�-felt p� �Link�-linje�tomt �TO�-felt p� �Link�-linje�blokk frigjort to ganger
+-�feilaktig mcheck_status, biblioteket er bugget
+-�broadcast: ioctl (hent grensesnittkonfigurasjon)�broadcast: ioctl (hent grensesnittsflagg)�cache_set: kunne ikke allokere nytt rpc-buffer�cache_set: offer-allokering feilet�cache_set: offer ikke funnet�kan ikke avgj�re tidssoneforkortning for bruk rett etter �until�-tid�kan ikke omfordele prosedyrenummer %d
+-�kan ikke utf�re �stat� p� lokalefil �%s��kan ikke allokere symboldata�kan ikke opprette intern deskriptor�kan ikke opprette interne deskriptorer�kan ikke f� socket til � akseptere forbindelser: %s�kan ikke finn C-preprosessor: %s 
+-�kan ikek finne noen C-preprosessor (cpp)
+-�kan ikke h�ndtere gammel foresp�rsel av versjon %d. N�v�rende versjon er %d�kan ikke sette inn sammenligningselement �%.*s��kan ikke sette inn i resultattabell�kan ikke sette inn ny definisjon av sammenligningssymbol: %s�kan ikke laste inn profileringsdata�kan ikke �pne�kan ikke �pne �%s��kan ikke �pne databasefil �%s�: %s�kan ikke �pne innfil �%s��kan ikke �pne lokaledefinisjonsfil �%s��kan ikke �pne utfil�kan ikke �pne utfil �%s��kan ikke �pne utfil �%s� for kategori �%s��kan ikke �pne socket: %s�kan ikke behandle spesifikasjon av rekkef�lge�kan ikke lese filkatalogen for tegnkart, �%s��kan ikke lese konfigurasjonsfil; dette er fatalt�kan ikke lese fra klient�kan ikke lese hode fra �%s��kan ikke lese filkatalogen for lokaler, �%s��kan ikke lese lokalefil �%s��kan ikke lese statisitkkdata�kan ikke utf�re stat() p� fil �%s�: %s�kan ikke skrive utfiler til �%s��kan ikke skrive ut resultat: �%s��kan ikke skrive ut statistikk: �%s��kan ikke skrive til klient�kategoridata forespurt mer enn en gang: burde ikke skje�tegnet %s'%s' i klassen �%s� m� v�re i klassen �%s��tegnet %s'%s' i klassen �%s� kan ikke v�re i klassen �%s��tegnet <SP> ikke definert i tegnkartet�tegnet �%s� ikke definert, men beh�ves som standardverdi�tegnklassen �%s� allerede definert�tegnkartet �%s� allerede definert�tegnkartfilen �%s� ikke funnet�clnt_raw.c - Fatal feil ved serialisering av hode.�cnlttcp_create: ikke mer minne
+-�cnltudp_create: ikke mer minne
+-�cnlsunix_create: ikke mer minne
+-�sammenligningselement �%.*s� finnes mer enn en gang: linje ignorert�sammenligningssymbol �%.*s� finnes mer enn en gang: linje ignorert�sammenligningssymbol forventet etter �%s��koble til adresse %s: �konstant eller identifikator ventet�konvertering fra �%s� til �%s� ikke st�ttet�konvertering stoppet p� grunn av problem ved skriving av utdata�kunne ikke opprette en rpc-tjener
+-�kunne ikke registrere prog %d vers %d
+-�database [n�kkel ...]�standard tegnkart �%s� ikke funnet�retningsflagg i streng %d i �era�-felt i kategori �%s� er
+-ikke �+� eller �-��retningsflagg i streng %d i �era�-felt i kategori �%s� er
+-ikke ett enkelt tegn�duplisert tegnnavn �%s��duplisert definisjon av sammenligningselement�duplisert definisjon av tegn �%.*s��duplisert n�kkel�duplisert definition av sett�duplisert sonenavn %s (fil �%s�, linje %d)�duplisert meldingsidentifikator�duplisert meldingsnummer�tom tegnstreng�tomt vektnavn: linje ignorert�enablecache: cache/hurtigminne allerede sl�tt p��enablecache: kunne ikke tildele cache/hurtigminne�enablecache: kunne ikke tildele cache/hurtigminne-data�enablecache: kunne ikke tildele cache/hurtigminne-fifo�innkoding for utdata�innkoding av original tekst�sluttverdien for ellipseintervallet er st�rre enn startverdien�feil ved lukking av input �%s��feil ved lukking av utfil�feil ved lukking av datafilen for profilering�feil ved innsetting av sammenligningselement i hashtabellen�feil ved innsetting i hashtabellen�feil under lesing av inndata�forventet strengargument for �copy��forventet fortsettelseslinje ikke funnet�klarte ikke � laste delt objekt �%s��klarte ikke � laste symboldata�klarte ikke � mmap'e filen med profileringsdata�klarte ikke � starte konverteringsprosessering�feil ved skriving av data for kategori �%s��fcntl: F_SETFD�felt �%s� i kategori �%s� ikke definert�felt �%s� i kategori �%s� udefinert�filen �%s� eksisterer fra f�r og kan bli overskrevet
+-�fra-verdi for �collating-element� m� v�re en streng�fstat feilet�s�ppel p� slutten av tegnkodespesifikasjon�s�ppel p� slutten av tall�s�ppel p� slutten av tilleggsverdi i streng %d i �era�-felt i kategori �%s��s�ppel p� slutten av startdato i streng %d i �era�-felt i kategori �%s��s�ppel p� slutten av sluttdato i streng %d i �era�-felt i kategori �%s��generer kall-graf�get_myaddress: ioctl (hent grensesnittskonfigurasjon)�getent - hent innslag fra administrativ database.�handle_request: foresp�rsel mottatt (versjon = %d)�hard link feilet, symbolsk link brukt�hardlinket et eller annet sted�ulovlig �CORRECTION�-felt p� �Leap�-linje�ulovlig �Rolling/Stationary�-felt p� �Leap�-linje�ulovlig tegnkonstant i streng�ulovlig tegn i file: �ulovlig sammenligningselement�ulovlig definisjon�ulovlig koding gitt�ulovlig tegnsekvens ved slutt av streng�ulovlig inndatasekvens ved posisjon %ld�ulovlig navn for tegnomr�de�ulovlig nettype: �%s�
+-�ulovlig tall for tilleggsverdi i streng %d i �era�-felt i kategori �%s��ulovlig sett-nummer�ulovlig startdato i streng %d i �era�-felt i kategori �%s��ulovlig sluttdato i streng %d i �era�-felt i kategori �%s��implementasjonsbegrensning: ikke flere enn %d tegnklasser tillatt�implementasjonsbegrensning: ikke flere enn %d tegnkart tillatt�feilaktig formattert fil�innlinje av ukjent type�intern feil (ulovlig deskriptor)�intern feil - addtype kalt med feilaktig isdst�intern feil - addtype kalt med feilaktig ttisgmt�intern feil - addtype kalt med feilaktig ttisstd�intern feil i %s, linje %u�ugyldig UTC-forskyvning�ugyldig forkortningsformat�ugyldig dag i m�neden�ugyldig slutt�r�ugyldig skudd�r�ugyldig modus for dlopen()�ugyldig m�nedsnavn�ugyldig lagret tid�ugyldig start�r�ugyldig tid p� dagen�ugyldig ukedagsnavn�n�kkellengde i foresp�rsel for lang: %Zd�linje etter ... m� inneholde tegndefinisjon�linje foran ... inneholder ikke definisjon for tegnkonstant�for lang linje�list opp alle kjente kodede tegnsett�lokalefil �%s�, brukt i �copy�, ikke funnet�lstat feilet�feilaktig linje ignorert�mapping av seksjonsoverskrifter feilet�omr�det foran tildelt minneblokk tilgriset
+-�omr�det etter tildelt minneblokk tilgriset
+-�minnet oppbrukt�minnet oppbrukt
+-�minnet er konsistent, biblioteket er bugget
+-�eraformat i streng %d i �era�-felt i kategori �%s� mangler�eranavn i streng %d i �era�-felt i kategori �%s� mangler�navnl�s regel�verken original- eller m�l-innkoding spesifisert�netname2user: (nis+-oppslag): %s
+-�netname2user: DES-innslag for %s i katalog %s er ikke unikt�netname2user: LOKAL-innslag for %s i katalog %s er ikke unikt�netname2user: manglende gruppeid-liste i �%s�.�netname2user: skulle ikke ha uid 0�aldri registrert prog %d
+-�ingen <Uxxxx>- eller <Uxxxxxxxx>-verdi gitt�feilaktig regul�rt uttrykk for felt �%s� i kategori �%s�: %s�ingen dag i m�neden passer til regelen�ingen definisjon av �UNDEFINED��ingen andre n�kkelord skal angis n�r �copy� brukes�p� grunn av advarsler ble ingen utfil opprettet�ikke noe symbolsk navn gitt�ikke noe symbolsk navn gitt for slutten p� omr�det�ingen vekt definert for symbol �%s��ikke en vanlig fil�nscd-konfigurasjon:
+-
+-%15d  debugniv� for tjener
+-�nscd kj�rer ikke!
+-�bare definisjon av �WIDTH� f�r komme etter definisjon av �CHARMAP��original innkoding ikke spesifisert med �-f��utfil�pmap_getmaps rpc-problem�preprosessorfeil�skriv framdriftsinformasjon�problem ved lesing av �%s��profileringsdatafil �%s� passer ikke med del objekt �%s��program %lu er ikke tilgjengelig
+-�program %lu versjon %lu er ikke tilgjengelig
+-�program %lu versjon %lu klar og venter
+-�rcmd: poll (setter opp stderr): %m
+-�rcmd: socket: Alle porter i bruk
+-�rcmd: write: (setter opp standard error): %m
+-�registerrpc: ikke mer minne
+-�repetert skuddsekundstidspunkt�rpcgen: for mange definisjoner
+-�rpcinfo: %s er en ukjent vert
+-�rpcinfo: %s er en ukjent tjeneste
+-�rpcinfo: Kunne ikke ta bort registrering av prog %s versjon %s
+-�rpcinfo: broadcast feilet: %s
+-�rpcinfo: kan ikke kontakte portmapper�samme regel i flere filer�avkortet lesing ved lesing av foresp�rsel: %s�avkortet skriving i %s: %s�socket: protokollfeil i oppsetting av forbindelse
+-�sorteringsrekkef�lge �forward� og �backward� utelukker hverandre�spesifikasjon av sorteringsvekter for sammenligningssymbol gir ikke mening�standard innkanal�standard utkanal�startdato er ikke tillatt i streng %d i �era�-felt i kategori �%s��start�r er st�rre enn slutt�r�start�r for h�yt til � bli representert�start�r for lavt til � bli representert�sluttdato er ikke tillatt i streng %d i �era�-felt i kategori �%s��svc_run: - select feilet�svc_tcp.c - kan ikke kalle getsockname eller listen�svc_tcp.c - problem med oppretting av tdp-socket�svc_tcp: makefd_xprt: ikke mer minne
+-�svc_unix.c - problem med oppretting av AF_UNIX-socket�svc_unix.c - kan ikke kalle getsockname eller listen�svc_unix: makefd_xprt: ikke mer minne
+-�svctcp_create: ikke mer minne
+-�svcudp_create - kan ikke kalle getsockname�svcudp_create: ikke mer minne
+-�svcudp_create: problem ved oppretting av socket�svcunix_create: ikke mer minne
+-�symbol for flertegnssammenligningselement �%.*s� dupliserer elementdefinisjon�symbol for flertegnssammenligningsselement �%.*s� dupliserer en annen
+-elementdefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer en annen
+-symboldefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer
+-symboldefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer
+-symbolnavn i tegnsett�syntaksfeil i definisjon av %s: %s�syntaksfeil i n�kkelordet �order_start��syntaksfeil i definisjon av tegnklasse�syntaksfeil i definisjon av tegnkonvertering�syntaksfeil i definisjon av sammenligningssortering�syntaksfeil i definisjon av sammenligning�syntaksfeil i definisjon av kategorien LC_CTYPE�syntaksfeil i definisjon av ny tegnklasse�syntaksfeil i definisjon av nytt tegnkart�syntaksfeil i definisjon av meldingslokale�syntaksfeil i definisjon av monet�rlokale�syntaksfeil i definisjon av numerisk lokale�syntaksfeil i sorteringsspesifikasjon�syntaksfeil i prolog: %s�syntaksfeil i ferdeighetskart-definisjon: %s�syntaksfeil i definisjon av tidslokale�syntaksfeil: ikke inne i en lokaledefinisjon�m�l-innkoding ikke spesifisert med �-t��dette er den f�rste definisjonen�tid f�r null�for stor tidsverdi�for f� bytes i tegnkoding�for mange tegn i tegnkoding�for mange tegnklasser definert�for mange skuddsekunder�for mange lokale tidstyper�for mange overganger?!�for mange vekter�for mange eller for lange tidssoneforkortelser�etterf�lgende s�ppel p� slutten av linjen�problem med � svare prog %d
+-�to linjer etter hverandre med �...� er ikke tillatt�satte type p� bare ett �r�ikke istand til � allokere buffer to inndata�kan ikke frigj�re argumenter�udefinert�ukjent tegn �%s��ukjent tegn i felt �%s� i kategori �%s��ukjent sammenligningssn�kkelord�ukjent n�kkelord �%s�: linje ignorert�ukjent iconv()-feil %d�ukjent sett �%s��ukjent symbol �%.*s�: linje ignorert�vanskelig sone�uavsluttet melding�uavsluttet streng�uavsluttet strengkonstant�uavsluttet symbolisk navn�uavsluttet vektnavn��vre grense i omr�de er ikke mindre enn nedre grense�bruk:   %s innfil
+-�bruker 29/2 i ikke-skudd�r�verdien p� %s m� v�re heltall�verdien p� <%s> m� v�re mellom 1 og 4�verdien p� felt �%s� i kategori �%s� kan ikke v�re en tom streng�verdien p� <mb_cur_max> m� v�re st�rre enn verdien p� <mb_cur_min>�verdien p� feltet �int_curr_symbol� i kategorien LC_MONETARY er ikke gyldig i henhold til ISO 4217�verdien p� feltet �int_curr_symbol� i kategorien LC_MONETARY har feil lengde�verdien p� feltet �%s� i kategorien �%s� m� v�re lavere enn 127�under akseptering av forbindelse: %s�under allokering av n�rbuffer-innslag�under allokering av hashtabell-innslag�under allokering av n�kkelkopi�da den gamle katalogfilen ble �pnet�da utdata ble forberedt�da databasen ble lest�under stat() av profileringsdatafil�under skriving til databasefil�skriving ufullstendig�skrivbar av andre enn eier�feil antall argumenter�feil antall felt p� �Leap�-linje�feil antall felt p� �Link�-linje�feil antall felt p� �Rule�-linje�feil antall felt p� �Zone�-fortsettelseslinje�feil antall felt p� �Zone�-linje�xdr_reference: ikke mer minne
+-�xdrrec_create: ikke mer minne
+-�yp_update: kan ikke konvertere vert til nettnavn
+-�yp_update: kan ikke hente tjeneradresse
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/pl.mo glibc-2.1.3/po/pl.mo
+--- ../glibc-2.1.3/po/pl.mo	2000-02-17 20:10:14.000000000 -0800
++++ glibc-2.1.3/po/pl.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,458 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������&��	������0������C���X���V���F�������*�������+���!������M������^������u�����������������������������������������������������������(�������(�������������A���������_������h������p����������!���������������������"������&���(������O���#���o����������"������������������������������������3������?������L���3���_���3�������9�������4������%���6���.���\���2�������'��������������$�������3���#���.���W���0��������������&�������#���������� ���%���>������d�����������������'�������?�������������%���+���%���Q���%���w���%�������%��������������1���������4������T������t����������*�������$�������"�������*������+���G���'���s���#�������������� �����������������������5������P�������k���3�������$���-���!���R���1���t���������� �������
+-�������L����������2���.���H���#���w���,��������������7�������.������ ���7������X���	���Z������d���-���u����������8�������.����������#������;������B���&���\���6��������������������������������������������������<������M������h����������
��������������"��������������
+-�������������"���
+-������-���.���J���4���y���*�������$�������$����������#���+���<���0���h���>�������;�������������&���4���/���[���&�������5�������(�������,������(���>���9���g������������������������$�������������"���'���"���J������m���>�������=�������������%������+���B������n���=���z������������������/�������E�������.���5���+���d����������+��������������������������������������������������6������S���"���s��������������������������������������<������7���U���9�����������������������������������'���������3���O���J���"�������,�������1�������������!���1���4���S���=���������������������
������0���������@���"���U������x���)�������(�������0����������������*������1�������Q����������%�������0���"������S������n����������
��������������(��������������.�������/��� ���.���P���0������/��������������(�������������-���,������Z������f������j����������#�������������� ������� �������+���������@������S������_���%���p������������������������
+-��������������,����������,������K������X������o�������������������������������%�������������%���$���(���J������s���������������������������������������������������
+-���������'������4���8���@������y������������������������#�����������������������2������M���!���`���5�������$��������������z����������x���H�������#�����������������������������;������N���%���k����������(��������������
��������������E����������5������L������k���:�������
��������������
�������*�������+���������<���!���\������~���*��������������$����������������������,���$���F���$���k����������
+-��������������������������������������������%������4���!���@������b����������*����������������������������!���������4���$���P������u���0�������+��������������!�������+���������>������R���+���a������������������������!����������������������� ������4���3���E��� ���y����������!��������������������������� ���'������H������c������~�����������������	����������������������������8����������9������F���+���W���)�������*������������������������������%������C���'���`����������"���������������������#�������$���������1������9������B������a��������������������������������������������������"���(���$���K������p������������������������������� �������������*���:������e���"���q��������������������������������������6�������5���6��� ���l���"�������������� �������������� ������1���1���9���c���
�������$�������M����������������:������X������r�����������������-�����������������
+-������������-������H������h�����������������%������������������������
���-���������D���0���`����������'��������������
+-�����������������
+-������"���
+-���6������A������U������p��� ���������������������$�������0����������)������8���7���O���h���������������������+������
+-���?������J������b���
���������������������� �����=�����L��#���e��������(�������������������������������!����A�B���a������
+-����������-�����-�����/���#�7���S������#���������������
���������
�������%����5�+���N����z��������������������������������������"����=�	���O�&���Y�D���������������.���������"���:����]�%���l�&�����#�����)������������&����2����I����N����S�0���j������>�����	�����7�����9���4�;���n�7�����<�����E����"���e�����������*�����*�����%���	����5	����T	����d	����}	�����	�����	�/����	�2����	�,���1
+-����^
+-�:���s
+-�A����
+-�E����
+-�K���6�,�����2�����1�����3����3���H�=���|�1�����2�����H���
�5���h
�-����
�=����
�2���
+-����=����V�3���t�*�����2�����*����*���1�=���\�$�����5�����+�����A���!�(���c�,�����/�����(�����0����0���C�6���t�4�����$�����'����.���-�:���\�.�����3�����+�����:���&�'���a�)�����(�����2������������-����K�@���j�@�����%���������#���,�-���P�L���~�"�����'���������,���'�R���T�Z�����&����&���)�"���P����s������.�����!��������������#���!�#���E�'���i�.�����3��������������,���$�,���Q�1���~�<�����C�����.���1�1���`�/�����#�����4�����*����&���F�!���m�0����������0�����0�����/���1�D���a������'����������K�����J���G�H����������-�����;���!�1���]�.�����6����������#����*���*����U����u����������������.�����)�����$���) ����N �H���f ����� �G���� �D���!�@���P!�?����!�B����!����"����/"�*���M"�3���x"�5����"�5����"����#����7#����V#����r#�����#�����#�����#�����#�����#����
$����*$����B$�*���_$�0����$�A����$�����$�(���%�6���5%����l%����{%�6����%�.����%�6����&�3���7&����k&�����&�-����&�<����&�:���'����F'�.���X'�&����'�=����'�A����'�5���.(�.���d(�)����(�(����(�3����(�H���)�)���c)�����)�T����)�:����)�.���8*�:���g*�����*�)����*�$����*����	+�=���"+����`+�:���|+�,����+�
����+�����+�/���,����;,�.���M,�)���|,�(����,�C����,����-�(���1-�)���Z-�+����-�%����-�,����-����.����.�*���<.�!���g.�����.�����.�����.�5����.�#���/�*���6/�,���a/�/����/�*����/�����/�9����/�C���80�6���|0�����0�����0�G����0�&���#1����J1����f1�D����1�����1�7����1�/���2�#���E2�4���i2�8����2�$����2�����2�0���3����J3�.���g3�����3�b����3�d���4�c���|4�a����4�m���B5�"����5�*����5�&����5�+���%6�1���Q6�&����6�.����6�.����6�-���7�1���67�+���h7�0����7�)����7�����7�/���
8�*���=8�8���h8�&����8�����8�����8�����8����9����!9�#���?9����c9����9�����9�����9�-����9�����9�(���:�5���+:����a:�;���w:�&����:�����:�����:�(����:����&;�*���C;����n;�����;�)����;�����;�����;�����;����<����<����9<�1���R<�����<�!����<�$����<�&����<�@���=�>���I=�]����=�I����=�>���0>�#���o>�/����>�.����>�����>�#���?����5?����U?�-���k?�����?�����?�'����?�����?����@����*@����F@�'���b@�����@�����@�����@�@����@�4���!A��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1.2
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-09-11 22:25+02:00
+-Last-Translator: Pawe� Krawczyk <kravietz@ceti.pl>
+-Language-Team: Polish <pl@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-2
+-Content-Transfer-Encoding: 8-bit
+-�		Prawa dost�pu : �		Atrybuty      : �	%s [a-bkCLNTM][-Dnazwa[=warto��]] [-i wielko��] [-I [-K sekundy]] [-Y �cie�ka] plik_we
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o plik_wy] [plik_we]
+-�	%s [-s id_sieci]* [-o plik_wy] [plik_we]
+-�	%s [-s typ_sieci]* [-o plik_wy] [plik_we]
+-�	Prawa dost�pu: �	Dane rekordu typu %s
+-�	Nazwa      :%s
+-�	Klucz publiczny : �	Typ          : %s
+-�	Adresy uniwersalne (%u)
+-�	[%d]	Nazwa         : %s
+-�	[%u] - [%u bajt�w] �
+-cache %s:
+-
+-%15s  cache jest w��czony
+-%15Zd  zalecany rozmiar
+-%15ld  sekund czasu przez kt�ry b�d� utrzymywane wpisy pozytywne
+-%15ld  sekund czasu przez kt�ry b�d� utrzymywane wpisy negatywne
+-%15ld  trafionych wpis�w pozytywnych
+-%15ld  trafionych wpis�w negatywnych
+-%15ld  nietrafiownych wpis�w pozytywnych
+-%15ld  nietrafionych wpis�w negatywnych
+-%15ld%% procent trafie�
+-%15s  sprawd� zmiany w /etc/%s
+-�
+-Cz�onkowie grupy :
+-�
+-Czas �ycia  : �       rpcinfo -b nr_programu nr_wersji
+-�       rpcinfo -d nr_programu nr_wersji
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n nr_portu ] -t host nr_programu [ nr_wersji ]
+-�     nie�    tak�   Rozmiar danych = %u
+-�    Cz�onkowie zadeklarowani:
+-�   Nie-cz�onkowie zadeklarowani:
+-�    Cz�onkowie domniemani:
+-�    Nie-cz�onkowie domniemani:
+-�    Brak zadeklarowanych cz�onk�w
+-�    Brak zadeklarowanych nie-cz�onk�w
+-�    Brak domniemanych cz�onk�w
+-�    Brak domniemanych nie-cz�onk�w
+-�    Brak rekursywnych cz�onk�w
+-�   Brak rekursywnych nie-cz�onk�w
+-�    Cz�onkowie rekursywni:
+-�   program wer. proto   port
+-�  lub: � (regu�a z "%s", linia %d)� [OPCJA...]� zako�czone
+-�"%s", linia %d: %s�Linia "Zone %s" i opcja -l wykluczaj� si� wzajemnie�Linia "Zone %s" i opcja -p wykluczaj� si� wzajemnie�flagi generowania szablon�w wymagaj� podania "pliku_we".
+-�%.*s: parametr ARGP_HELP_FMT wymaga podania warto�ci�%.*s: Nieznany parametr ARGP_HELP_FMT�%s w strefie dla kt�rej nie zdefiniowano regu��%s%s%s:%u: %s%sWarunek `%s' nie zosta� spe�niony.
+-�%s%s%s:%u %s%sNiespodziewany b��d: %s.
+-�%s%sNieznany sygna� %d
+-�%s: %d niepoprawnie rozszerzy� znak
+-�%s: <mb_cur_max> musi by� wi�kszy ni� <mb_cur_min>
+-�%s: preprocesor C zako�czy� prac� z b��dem %d
+-�%s: preprocesor C zako�czy� prac� z sygna�em %d
+-�%s: Nie mog� stworzy� %s: %s
+-�%s: Nie mog� stworzy� katalogu %s: %s
+-�%s: Nie mog� dowi�za� %s do %s: %s
+-�%s: Nie mog� otworzy� %s: %s
+-�%s: Usuni�cie %s jest niemo�liwe: %s
+-�%s: B��d przy zamykaniu %s: %s
+-�%s: B��d odczytu %s
+-�%s: B��d zapisu %s
+-�%s: B��d zapisu na standardowe wyj�cie �%s: linia Leap nie znajduje si� w pliku sekund przest�pnych %s
+-�%s: Brak pami�ci: %s
+-�%s: Podano wi�cej ni� jedn� opcj� -L
+-�%s: Podano wi�cej ni� jedn� opcj� -d
+-�%s: Podano wi�cej ni� jedn� opcj� -l
+-�%s: Podano wi�cej ni� jedn� opcj� -p
+-�%s: Podano wi�cej ni� jedn� opcj� -y
+-�%s : Za du�o argument�w
+-�%s: sprawdzenie czasu modyfikacji jest niemo�liwe�%s: polecenie `%s' zwr�ci�o %d
+-�%s: b��d w automacie sko�czonym�%s: niew�a�ciwa opcja -- %c
+-�%s: b��dna opcja -- %c
+-�%s: opcja `%c%s' nie mo�e mie� argument�w
+-�%s: opcja `%s' jest niejednoznaczna
+-�%s: opcja `%s' musi mie� argument
+-�%s: opcja `--%s' nie mo�e mie� argument�w
+-�%s: opcja `-W %s' nie mo�e mie� argument�w
+-�%s: opcja `-W %s' jest niejednoznaczna
+-�%s: opcja musi mie� argument -- %c
+-�%s: wyj�cie nadpisze %s
+-�%s: panika: B��dna l-warto�� %d
+-�%s: przedwczesny koniec pliku�%s: otwarcie jest niemo�liwe �%s: nieznana opcja `%c%s'
+-�%s: nieznana opcja `--%s'
+-�%s: sk�adnia: %s [ -s ] [ -v ] [ -l czas_lokalny ] [ -p regu�y_POSIX ]
+-	[ -d katalog ] [ -L sek_przest�pne ] [ -y yearistype ]
+-	[ plik ... ]
+-�%s: sk�adnia: %s [ -v ] [ -c rok ] nazwa_strefy...
+-�%s: podczas zapisywania na wyj�cie: �(B��D PROGRAMU) Nieznana wersja!?�(B��D PROGRAMU) Opcja powinna zosta� rozpoznana?!�(Nieznany obiekt)
+-�(nieznany b��d autoryzacji - %d)�(nieznany)�*** Symbole zosta�y usuni�te z pliku `%s', dok�adna analiza jest niemo�liwa
+-�*standardowe wej�cie*�-o PLIK-WY [PLIK-WE]...
+-[PLIK-WY [PLIK-WE]...]�sekcja .lib w a.out jest uszkodzona�; wersja poboczna = %lu, wersja g��wna = %lu�; bo = �<%s> i <%s> nie s� niepoprawnymi nazwami dla przedzia�u�znak <SP> nie mo�e znajdowa� si� w klasie `%s'�znak <SP> nie jest w klasie `%s'�?�Przerwane�Prawa dost�pu : �Pr�ba u�ycia uszkodzonej biblioteki dzielonej�Adres jest ju� w u�yciu�Rodzina adres�w dla tej nazwy hosta nie jest obs�ugiwana�Rodzina adres�w nie obs�ugiwana przez protok��B��d podczas og�aszania�Budzik�Lista argument�w za d�uga�Pr�ba skasowania tablicy z zawarto�ci��Pr�ba ��czenia ze zbyt wieloma bibliotekami dzielonymi�Uwierzytelnienie OK�B��d uwierzytelnienia�NIEISTNIEJ�CY OBIEKT
+-�B��dny adres�B��dny deskryptor pliku�B��dny format pliku czcionek�B��dny komunikat�B��dne wywo�anie systemowe�B��dna warto�� dla ai_flags�Przestrzegaj �ci�le POSIX�Dane binarne
+-�Wymagane urz�dzenie blokowe�Problem podczas pr�by rozg�aszania�Przerwany potok�B��d szyny�CDS�Przekroczony limit czasu procesora�Dezaktualizacja bufora cache�Brak dost�pu do wymaganej biblioteki dzielonej�Po��czenie z serwerem dla tej domeny jest niemo�liwe�Komunikacja z portmapperem jest niemo�liwa�Komunikacja z ypbind jest niemo�liwa�Komunikacja z ypserv jest niemo�liwa�Brak pami�ci do alokacji�Przypisanie ��danego adresu jest niemo�liwe�Stworzenie gniazda dla transmisji rpc niemo�liwe�Bezpo�rednie uruchomienie biblioteki dzielonej jest niemo�liwe�Nie mo�na poda� wi�cej ni� jednej flagi generowania pliku!
+-�Brak odpowiedzi na rozg�aszanie�Zarejestrowanie us�ugi jest niemo�liwe�Wysy�anie po zamkni�ciu gniazda jest niemo�liwe�Wys�anie pakietu transmisji niemo�liwe�Ustawienie opcji gniazda SO_BROADCAST jest niemo�liwe�Mo�na poda� tylko jeden plik wej�ciowy!
+-�Nie mo�na u�ywa� flagi netid z flag� inetd!
+-�Flagi netid mo�na u�ywa� tylko z TIRPC!
+-�Nowa sk�adnia opcji nie pozwala na u�ywanie flagi table!
+-�Numer kana�u poza zakresem�Separator znak�w : %c
+-�Potomek zako�czy� prac��Wierzytelno�� klienta jest zbyt ma�a�Kolmny              :
+-�B��d komunikacji podczas wysy�ania�Skompiluj specyfikacj� lokalizacji�Komputer wyjecha� na wakacje�Obliczanie rozmiaru tablicy klas znak�w mo�e chwil� potrwa�...�Obliczanie rozmiaru tablicy sortowania mo�e chwil� potrwa�...�Po��czenie odrzucone�Po��czenie zerwane przez drug� stron��Przekroczony czas oczekiwania na po��czenie�Kontynuacja�Konwertuje podanych plik�w mi�dzy r�nymi metodami kodowania.�Konwertuj klucz na ma�e znaki�Copyright (C) %s Free Software Foundation, Inc.
+-Oprogramowanie darmowe. Warunki kopiowania zamieszczone s� w kodzie �r�d�owym.
+-Nie podlega �adnej gwarancji, nawet gwarancji przydatno�ci do jakiegokolwiek
+-zastosowania lub sprzeda�y.
+-�Stworzenie pliku dziennika "%s" jest niemo�liwe�Tworzy plik nag��wkowy C o nazwie NAZWA zawieraj�cy definicje symboli�brak pliku wyj�ciowego - wyst�pi�y ostrze�enia�Tworzy prost� baz� DB z wej�cia tekstowego.�Czas stworzenia : %s�Pozycja DES dla sieci %s nie jest unikalna
+-�KATALOG
+-�DNANS�DNS�Brak bazy danych dla tej tabeli�Baza danych jest zaj�ta�Domy�lne prawa dost�pu :
+-�Wymagany jest adres docelowy�Urz�dzenie nie jest strumieniem�Urz�dzenie nie jest skonfigurowane�Urz�dzenie lub zasoby s� zaj�te�Diffie-Hellmann (%d bit�w)
+-�Katalog       : %s
+-�Katalog nie jest pusty�Przekroczony limit dyskowy�Nie pracuje w tle i wy�wietla komunikaty na bie��cy terminal�Nie wy�wietla komunikat�w podczas budowania bazy danych�Zamiast do istniej�cego katalogu zapisuje do nowego pliku�Domena nie zosta�a zwi�zana�pu�apka EMT�POZYCJA
+-�Zaszyfrowane dane
+-�Typy wpisu/tablicy nie pasuj� do siebie�B��d w podsystemie RPM�Znalezienie pliku startowego NIS+ jest niemo�liwe. Czy NIS+ jest zainstalowany?�B��d w nieznanym systemie b��d�w: �Wyst�pi� b��d podczas odwo�ania do callbacka�B��d: plik .netrc mo�e by� czytany przez ka�dego.�Przepe�niona wymiana�B��dny format pliku wykonywalnego�PRZERWANIE: system nie definiuje `_POSIX2_LOCALEDEF'�PLIK zawiera odwzorowania nazw symbolicznych na warto�ci UCS4�Nieudane (nieustalony b��d)�Deskryptor pliku w z�ym stanie�Plik istnieje�Podczas blokowania pliku wyst�pi�o zakleszczenie�Za d�uga nazwa pliku�Przekroczony limit wielko�ci pliku�Plik jest za du�y��a�cuch pierwszy/nast�pny jest uszkodzony�B��d w obliczeniach zmiennoprzecinkowych�Katalog wymaga powt�rzenia pe�nej synchronizacji�Niezaimplementowana funkcja�GRUPA
+-�B��dne dane w ARGP_HELP_FMT: %s�Generuje katalog komunikat�w.
+-Je�li PLIK-WE to -, dane s� czytane ze standardowego wej�cia. Je�li PLIK-WY
+-to -, dane s� zapisywane na standardowe wyj�cie.
+-�B��d systemowy�Wy�wietla dane dotycz�ce lokalizacji.�Wy�wietla kr�tkie informacje o sk�adni polecenia�Wy�wietla ten tekst pomocy�Nieoczekiwany b��d�Grupa         : %s
+-�Flagi grupy :�Wpis dla grupy "%s.%s":
+-�Czekaj przez SEK sekund (domy�lnie 3600)�Roz��czenie�Nie znaleziono "%d" w pami�ci podr�cznej grup!�Nie znaleziono "%d" w pami�ci podr�cznej hase�!�Nie znaleziono "%s" w pami�ci podr�cznej grup!�Nie znaleziono "%s" w pami�ci podr�cznej host�w!�Nie znaleziono "%s" w pami�ci podr�cznej hase�!�Host nie odpowiada�Odnalezienie nazwy hosta jest niemo�liwe�We/Wy dozwolone�PLIK-WE PLIK-WY
+--o PLIK-WY PLIK-WE
+--u PLIK-WE�pu�apka IOT�IVY�Identyfikator zosta� usuni�ty�B��dna instrukcja�B��dny typ obiektu dla tej operacji�B��dne przesuni�cie�Niew�a�ciwy typ lub format pliku�Niew�a�ciwy dost�p do urz�dzenia�Dzia�anie niedopuszczalne dla procesu w tle���danie informacji�Informacja:�Pliki wej�ciowe:�Specyfikacja formatu wej�cia/wyj�cia:�B��d wej�cia/wyj�cia�B��d wewn�trzny NIS�B��d wewn�trzny ypbind�Przerwanie�Przerwane wywo�anie systemowe�Nale�y wznowi� przerwane wywo�anie systemowe�B��dny obiekt dla tej operacji�Z�y argument�B��dny odno�nik wstecz�B��dna nazwa klasy znaku�B��dne uwierzytelnienie klienta�B��dny weryfikator klienta�B��dny znak sortowany�B��dna zawarto�� \{\}�B��dne dowi�zanie mi�dzy urz�dzeniami�B��dna wymiana�B��dny lub niepe�ny znak wielobajtowy�B��dne poprzedzaj�ce wyra�enie regularne�B��dny koniec zakresu�B��dne wyra�enie regularne�Z�y kod ��dania�B��dny deskryptor ��dania�B��dny weryfikator serwera�B��dny kana��Jest katalogiem�Jest plikiem nazwanym�Kerberos.
+-�Unicestwiony�DOWI�ZANIE
+-�Wpis LOKALNY dla UID %d w katalogu %s nie jest unikalny
+-�Poziom 2 zatrzymany�Poziom 2 brak synchronizacji�Poziom 3 zatrzymany�Poziom 3 wyzerowany�Dowi�zanie wskazuje na b��dn� nazw��Po��czenie zosta�o przerwane�Numer dowi�zania poza zakresem�Typ dowi�zanego obiektu : �Dowi�zany do : %s
+-�Lokalna domena nie jest ustawiona�Wyst�pi� b��d podczas przydzielania lokalnych zasob�w�Maszyna nie znajduje si� w tej sieci�Zniekszta�cona lub b��dna nazwa�Argumenty obowi�zkowe lub opcjonalne dla d�ugich opcji s� r�wnie� obowi�zkowe lub lokalne dla odpowiednich kr�tkich opcji.�Serwer nadrz�dny :
+-�Serwer nadrz�dny jest zaj�ty, pe�ny zrzut danych przesuni�ty na p�niej.�Wyst�pi� b��d przydzielania pami�ci�Pami�� wyczerpana�Komunikat za d�ugi�Brakuj�cy lub b��dny atrybut�Modyfikacja   : %s�Modyfikacja nie powiod�a si��Operacja modyfikacji nie powiod�a si��Modyfikuje format wyj�ciowy:�Pr�ba przej�cia przez zbyt wiele ruter�w�NAZWA�NAZWA
+-[-a|-m]�NIS�Niezgodno�� wersji mi�dzy klientem i serwerem NIS - us�uga niemo�liwa�Mapa NIS zawiera b��dy�Operacja NIS+ nie powiod�a si��Serwery NIS+ s� niedost�pne�Us�uga NIS+ jest niedost�pna lub nie zosta�a zainstalowana�BRAK OBIEKTU
+-�LICZBA�Nazwa : '%s'
+-�Demon buforuj�cy us�ugi odwzorowania nazw.�Nazwa nie jest obs�ugiwana przez ten serwer�Nazwa nie jest unikalna w sieci�Ta nazwa lub us�uga jest nieznana�Nazwa/zapis nie jest unikalny�Wskazany obiekt nie mo�e by� przeszukiwany�Wymagane uwierzytelnienie�Sie� przerwa�a po��czenie po resecie�Sie� nie dzia�a�Sie� jest niedost�pna�Struktura CSI niedost�pna�Brak dost�pnych semafor�w XENIXowych�Brak adresu zwi�zanego z nazw� hosta�Brak adresu zwi�zanego z nazw��Brak anody�Brak miejsca w buforze�Brak proces�w potomnych�Brak danych�Brak miejsca na serwerze�Brak dost�pnych blokad�Nic nie pasuje�Brak medium�Brak komunikatu o po��danym typie�Nie ma wi�cej rekord�w w mapie�Brak wyra�enia regularnego�Brak zarejestrowanych zdalnych program�w.
+-�Brak drogi do systemu�Brak miejsca na urz�dzeniu�Nie ma takiego urz�dzenia�Nie ma takiego pliku ani katalogu�Brak takiego klucza w mapie�Nie ma takiej mapy w domenie serwera�Nie ma takiego procesu�Napotkano nazwy nie nale��ce do przestrzeni NIS+�Wyst�pi� krytyczny b��d w odwzorowaniu nazw�Brak.
+-�Nie znaleziono, brak takiej nazwy�To nie jest nazwanego pliku w wersji XENIXa�To nie jest katalog�Nie znaleziono�To nie jest serwer nadrz�dny dla tej domeny�To nie jest w�a�ciciel�Liczba kolumn       : %d
+-�L. obiekt�w   : %u
+-�Argument numeryczny poza zakresem�Wynik numeryczny poza zakresem�Obiekt #%d:
+-�Nazwa obiektu : %s
+-�Typ obiektu   : �Zdalny obiekt jest obiektem podmontowanym przez NFS�Istnieje ju� obiekt o tej nazwie�Nieparzysta liczba cudzys�ow�w�Tylko root mo�e u�ywa� tej opcji!�Operacja jest ju� wykonywana�Operacja niedozwolona�Operacja nie obs�ugiwana�Operacja jest w�a�nie wykonywana�Operacja spowoduje blokad��Brak dodatkowych strumieni�Kontrola wyj�cia:�Wyb�r wyj�cia:�W�a�ciciel    : %s
+-�PRYWATNY
+-�Pakiet nie jest zainstalowany�B��d parsowania: %s�Cz�ciowy sukces�Uzyskany obiekt nie jest taki sam jak obiekt na serwerze�Brak dost�pu�Awaria zasilania�Niespodziewany koniec wyra�enia regularnego�Wy�wietla rekordy bazy linijka po linijce�Wy�wietla aktualne statystyki konfiguracji�Wy�wietla wi�cej komunikat�w�Wy�wietla wersj� programu�Prawdopodobnie sukces�Prawdopodobnie nie znaleziony�Koniec stopera profiluj�cego�Sterownik protoko�u nie jest pod��czony�B��d protoko�u�Nie obs�ugiwana rodzina protoko��w�Protok� niedost�pny�Protok� nie obs�ugiwany�Typ protoko�u nie pasuje do gniazda�B��dne zapytanie dla podanej tablicy�Wyj�cie�B��d RFS�RPC z�a procedura dla programu�B��d RPC podczas operacji NIS�RPC program niedost�pny�RPC z�a wersja programu�RPC b��dna struktura�RPC z�a wersja�RPC: (nieznany kod b��du)�RPC: B��d uwierzytelniania�RPC: Nie mog� zdekodowa� wyniku�RPC: Nie mog� zakodowa� argument�w�RPC: Nieudane (niesprecyzowany b��d)�RPC: Niekompatybilne wersje RPC�RPC: Awaria portmappera�RPC: Niedost�pna procedura�RPC: Niezarejestrowany program�RPC: Niedost�pny program�RPC: Niezgodno�� programu/wersji�RPC: B��d w odleg�ym systemie�RPC: Serwer nie mo�e zdekodowa� argument�w�RPC: Sukces�RPC: Czas oczekiwania przekroczony�RPC: Niemo�liwy odbi�r�RPC: Niemo�liwe wysy�anie�RPC: Nieznany host�RCP: Nieznany protok��RSA (%d bit�w)
+-�RTLD_NEXT wyst�pi�o w kodzie nie �adowanym dynamicznie�Czyta i wy�wietla dane profiluj�ce obiektu dzielonego�Czyta konfiguracj� z pliku NAZWA�System plik�w wy��cznie do odczytu�Sygna� w czasie rzeczywistym %d�Wyra�enie regularne jest za du�e�B��d we/wy w odleg�ym systemie�Zmieni� si� adres drugiego ko�ca�Usu� has�o lub uczy� plik niedost�pnym dla innych�Nie powiod�o si� ponowne otwarcie dzielonego obiektu `%s'�Replikacja :
+-�Prosimy zg�asza� b��dy na adres %s.
+-�Prosimy zg�asza� b��dy za pomoc� skryptu `glibcbug' na adres <bugs@gnu.org>.
+-�Argumenty ��dania s� b��dne�B��d 0 resolvera (bez b��d�w)�B��d wewn�trzny resolvera�Unikni�to zakleszczenia zasob�w�Zasoby zosta�y stracone�Zasoby chwilowo niedost�pne�Wyniki zosta�y wys�ane do procedury callbacka�OBJ_DZIEL [DANE_PROF]�SUNYP��cie�ka przeszukiwania : %s
+-�Naruszenie ochrony pami�ci�Serwer zaj�ty, spr�buj ponownie�Brak pami�ci dla serwera�Serwer odrzuci� wierzytelno���Serwer odrzuci� weryfikacj��Nazwa nie obs�ugiwana dla ai_socktype�Okre�la nazw� programu�Ko�czy prac� serwera�Sygna� 0�Operacja na obiekcie, kt�ry nie jest gniazdem�Nie obs�ugiwany typ gniazda�Oprogramowanie spowodowa�o przerwanie po��czenia�Niestety nie jeste� rootem
+-�Definicje �r�d�owe znajduj� si� w PLIKU�B��d srmount�B��d stosu�Nieaktualny uchwyt pliku NFS�Uruchamia LICZB� w�tk�w�Stan          : %s
+-�Zatrzymany�Zatrzymany (sygna�)�Zatrzymany (wej�cie z tty)�Zatrzymany (wyj�cie na tty)�B��d potoku biblioteki strumieni�Struktura wymaga wyczyszczenia�Sukces�Nie wy�wietla ostrze�e� i informacji�Nazwy symboliczne znak�w s� zdefiniowane w PLIKU�B��d systemowy�Informacja o systemie:�Wyst�pi� b��d podczas przydzielania zasob�w systemowych�Katalog systemowy map znak�w : %s
+-             map repertuar�w : %s
+-          �cie�ka lokalizacji: %s
+-%s�TABLICA
+-�Typ tablicy         : %s
+-�Odwzorowanie nazwy jest chwilowo niemo�liwe�Zako�czony�Plik wykonywalny zaj�ty�Poni�sza lista zawiera wszystkie zakodowane zestawy znak�w. Nie oznacza to,
+-�e wszystkie kombinacje zestaw�w mog� by� u�ywane jako parametry OD i DO. Jeden
+-zestaw znak�w mo�e znajdowa� si� na li�cie pod wieloma nazwami (aliasami).
+-  Niekt�re nazwy nie s� zwyk�ymi napisami, tylko wyra�eniami regularnymi
+-pasuj�cymi do okre�lonego zbioru nazw. One tak�e mog� by� u�ywane jako
+-parametry programu.
+-
+-  �Czas �ycia : �Koniec stopera�Za du�o atrybut�w�Za du�o wzajemnych symlink�w�Za du�o link�w�Za du�o otwartych plik�w�Za du�o otwartych plik�w w systemie�Za du�o proces�w�Za du�o odniesie�: dowi�zanie niemo�liwe�Za du�o u�ytkownik�w�Pu�apka debuggera/breakpoint�Ko�cz�cy znak `\'�Translator przerwa� prac��Drugi koniec jest ju� po��czony�Drugi koniec nie jest po��czony�Napisz `%s --help' lub `%s --usage' by uzyska� wi�cej informacji.
+-�Pr�buj� %s...
+-�Typ  : %s
+-�NIEZNANY�Uwierzytelnienie klienta NIS+ jest niemo�liwe�Uwierzytelnienie serwera NIS+ jest niemo�liwe�Utworzenie procedury callbacka nie jest mo�liwe�Uruchomienie nowego procesu na serwerze jest niemo�liwe�Nieznany (typ = %d, bity = %d)
+-�Nieznane s�owo kluczowe w .netrc %s�Nieznany kod b��du NIS�Nieznana baza `%s'
+-�Nieznany b��d�Nieznany b��d �Nieznany host�Nieznany obiekt�Nieznana opcja: %s %s %s�Nieznany b��d biblioteki odwzoruj�cej nazwy�Nieznany b��d serwera�Nieznany sygna� %d�Nieznany b��d systemowy�Nieznany b��d ypbind�Niesparowane ( lub \(�Niesparowane ) lub \)�Niesparowane [ lub [^�Niesparowane \{�Nierozpoznana zmienna `%s'�Nag�y wypadek I/O�Sk�adnia:�Sk�adnia: %s nazwa_zmiennej [�cie�ka]
+-�Sk�adnia: rpcinfo [ -n nr_portu ] -u host nr_programu [ nr_wersji ]
+-�Sygna� u�ytkownika 1�Sygna� u�ytkownika 2�Warto�� za du�a dla zdefiniowanego typu danych�Wirtualny stoper wyczerpany�Osobliwy wynik wykonania polecenia�Okno zmienione�Wy�wietla nazwy dost�pnych map znak�w�Wy�wietla nazwy dost�pnych lokalizacji�Wy�wietla nazwy wybranych kategorii�Wy�wietla nazwy wybranych s��w kluczowych�Zapisuje wyniki do pliku NAZWA�Autor: %s.
+-�Niew�a�ciwy typ medium�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Tak, 42 jest odpowiedzi� na pytanie o sens �ycia�Tym razem da�e� popali��Koniec czasu nie znajduje si� po ko�cu czasu poprzedniej linii�[PLIK...]�definicja `%1$s' musi ko�czy� si� wyra�eniem `END %1$s'�`%s' nie zawiera poprawnych danych profiluj�cych dla `%s'�`-1' musi by� ostatnim elementem w polu `%s' kategorii `%s'�`...' mo�e by� u�yte wy��cznie dla  `...' i `UNDEFINED'�`from' spodziewane po pierwszym argumencie `collate-element'��a�cuch `from' w deklaracji elementu sortowania zawiera nieznany znak�Nie obs�ugiwana rodzina protoko��w�Nie obs�ugiwany typ gniazda�jest ju� uruchomiony�argument <%s> musi by� pojedynczym znakiem�argument `%s' musi by� pojedynczym znakiem�auth_none.c - Problem z prze��czaniem�authunix_create: brak pami�ci
+-�b��dny argument�nieodpowiedni w�a�ciciel�puste pole FROM w linii Link�puste pole TO w linii Link�blok zwalniany dwa razy
+-�b��dny mcheck_status, biblioteka zawiera b��dy
+-�transmisja: ioctl (info o konfiguracji interfejsu)�transmisja: ioctl (info o flagach interjesu)�przepe�nienie bufora�cache_set: przydzielenie nowego rpc_buffer jest niemo�liwe�cache_set: przydzielenie pami�ci dla nowego wpisu jest niemo�liwe�cache_set: nie znaleziono wpisu mo�liwego do powt�rnego wykorzystania�okre�lenie skr�tu strefy czasowej po ko�cu przedzia�u czasu jest niemo�liwe�przypisanie procedury nr %d jest niemo�liwe
+-�znalezienie pliku lokalizacji `%s' jest niemo�liwe�przydzielenie pami�ci dla symboli jest niemo�liwe�stworzenie wewn�trznego deskryptora jest niemo�liwe�stworzenie wewn�trznego deskryptora jest niemo�liwe�otwarcie gniazda do przyjmowania po��cze� jest niemo�liwe: %s�odnalezienie preprocesora C jest niemo�liwe: %s 
+-�odnalezienie preprocesora C (cpp) jest niemo�liwe
+-�obs�uga ��da� w starej wersji %d nie jest mo�liwa; aktualna wersja to %d�wstawienie elementu sortowania `%.*s' jest niemo�liwe�wstawienie do tablicy wynik�w jest niemo�liwe�wstawienie definicji nowego symbolu sortowania niemo�liwe: %s�za�adowanie danych do profilowania jest niemo�liwe�otwarcie jest niemo�liwe�otwarcie `%s' jest niemo�liwe�otwarcie pliku bazy danych `%s' jest niemo�liwe: %s�otwarcie wej�ciowego pliku `%s' niemo�liwe�otwarcie pliku definicji lokalnych `%s' niemo�liwe�otwarcie wyj�ciowego pliku jest niemo�liwe�otwarcie wyj�ciowego pliku `%s' niemo�liwe�otwarcie wyj�ciowego pliku `%s' dla kategorii `%s' niemo�liwe�otwarcie gniazda jest niemo�liwe: %s�przetwarzanie specyfikacji kolejno�ci jest niemo�liwe�odczyt katalogu mapy znak�w `%s' niemo�liwy�przeczytanie pliku konfiguracyjnego jest niemo�liwe: koniec pracy�odczyt danych od klienta jest niemo�liwy�przeczytanie nag��wka z `%s' jest niemo�liwe�odczyt katalogu lokalizacji %s' jest niemo�liwy�odczyt pliku lokalizacji `%s' niemo�liwy�odczytanie mapy repertuar�w `%s' jest niemo�liwe�odczytanie danych statystycznych jest niemo�liwe�znalezienie pliku bazy danych `%s' jest niemo�liwe: %s�zapisanie plik�w wyj�ciowych do `%s' jest niemo�liwe�zapisanie wyniku jest niemo�liwe: %s�zapisanie statystyk jest niemo�liwe: %s�zwracanie odpowiedzi klientowi jest niemo�liwe�wielokrotne ��danie kategorii danych: nie powinno wyst�pi��znak %s'%s' z klasy`%s' musi by� w klasie `%s'�znak %s'%s' z klasy `%s' nie mo�e by� w klasie `%s'�znak <SP> nie zdefiniowany w tablicy znak�w�znak `%s', wymagany jako domy�lny, nie zosta� zdefiniowany�klasa znak�w `%s' jest ju� zdefiniowana�tablica znak�w `%s' jest ju� zdefiniowana�nie znaleziono pliku tablicy znak�w `%s'�clnt_raw.c - Krytyczny b��d serializacji nag��wka.�clnttcp_create: brak pami�ci
+-�clntudp_create: brak pami�ci
+-�clntunix_create: brak pami�ci
+-�element sortowania `%.*s' wyst�pi� wielokrotnie: linia pomini�ta�element sortowania `%.*s' wyst�pi� wielokrotnie: linia pomini�ta�oczekiwano symbolu sortowania po `%s'�po��czenie do adresu %s: �spodziewana sta�a lub identyfikator�konwersja z `%s' do `%s' nie jest obs�ugiwana�konwersja zosta�a przerwana poniewa� wyst�pi�y problemy z zapisaniem wynik�w�stworzenie serwera rpc niemo�liwe
+-�rejestracja prog %d wer. %d niemo�liwa
+-�baza [klucz ...]�nie znaleziono domy�lnej tablicy znak�w `%s'�znacznik kierunku w �a�cuchu %d w polu `era' w kategorii `%s' nie jest '+'
+-lub '-'�znacznik kierunku w �a�cuchu %d w polu `era' w kategorii `%s' nie jest
+-pojedynczym znakiem�dwukrotne wyst�pienie nazwy znaku `%s'�podw�jna definicja elementu sortowania�wielokrotna definicja znaku `%.*s'�dwukrotne wyst�pienie klucza�podw�jna definicja zbioru�podw�jna nazwa strefy %s (plik "%s", linia %d)�podw�jny identyfikator komunikatu�podw�jny numer komunikatu�pusty napis�pusta nazwa wagi: linia zignorowana�enablecache: bufor jest ju� aktywny�enablecache: niemo�liwa alokacja bufora�enablecache: niemo�liwa alokacja danych bufora�enablecache: niemo�liwa alokacja kolejki dla bufora�kodowanie wynik�w�kodowanie oryginalnego tekstu�koniec zakresu wyrzutni wi�kszy niz pocz�tek�wyst�pi� b��d podczas zamykania wej�cia `%s'�wyst�pi� b��d podczas zamykania pliku wyj�ciowego�wyst�pi� b��d podczas zamykania pliku z danymi profiluj�cymi�b��d podczas wstawiania elementu sortowanego do tablicy mieszaj�cej�b��d podczas wstawiania do tablicy mieszaj�cej�wyst�pi� b��d podczas czytania danych wej�ciowych�spodziewanym argumentem dla `copy' jest �a�cuch�brak spodziewanej linii kontynuacji�Nie powiod�o si� za�adowanie dzielonego obiektu `%s'�Nie uda�o si� za�adowa� danych o symbolach�Nie uda� si� mmap danych profiluj�cych�Nie uda�o si� rozpocz�� konwersji�niepowodzenie przy zapisie danych kategorii `%s'�fcntl: F_SETFD�pole `%s' w kategorii `%s' nie jest zdefiniowane�pole `%s' w kategorii `%s' nie jest zdefiniowane�plik '%s' ju� istnieje i mo�e zosta� nadpisany
+-�argument from-value definicji `collating-element' musi by� �a�cuchem�fstat nie powi�d� si���mieci na ko�cu specyfikacji kodu znaku��mieci na ko�cu liczby��mieci na ko�cu warto�ci offset w �a�cuchu %d w polu `era' w kategorii `%s'��mieci na ko�cu pierwszej daty w �a�cuchu %d w polu `era' w kategorii `%s'��mieci na ko�cu drugiej daty w �a�cuchu %d w polu `era' w kategorii `%s'�generuje wykres odwo�a��generuje prosty profil z licznikami i czasami�get_myaddress: ioctl (informacja o konfiguracji interfejsu)�getent - wy�wietla wpisy z bazy administracyjnej.�handle_request: odebrano ��danie (Wersja = %d)�stworzenie dowi�zania nie powiod�o si�, u�yto symlinka�gdzie� dowi�zany�b��dne pole CORRECTION w linii Leap�b��dne ple Rolling/Stationary w linii Leap�b��dna sta�a znakowa w �a�cuchu�b��dn znak w pliku: �b��dny element sortowania�niepoprawna definicja�niepoprawne kodowanie�niepoprawna sekwencja escape na ko�cu �a�cucha�b��dna sekwencja wej�ciowa na pozycji %ld�niepoprawne nazwy dla zakresu znak�w�b��dny typ sieci :'%s'
+-�nieprawid�owa warto�� offset w �a�cuchu %d w polu `era' w kategorii `%s'�b��dny numer zbioru�nieprawid�owa pierwsza data w �a�cuchu %d w polu `era' w kategorii `%s'�nieprawid�owa druga data w �a�cuchu %d w polu `era' w kategorii `%s'�ograniczenie implementacji: dozwolone maksymalnie %d klas znak�w�ograniczenie implementacji: dozwolone maksymalnie %d map znak�w�na ko�cu bufora wyst�pi� niekompletny znak lub sekwencja steruj�ca�nieprawid�owy format pliku�nieznany typ linii wej�ciowej�b��d wewn�trzny (nieprawid�owy deskryptor)�b��d wewn�trzny - addtype wywo�ane ze b��dnym isdst�b��d wewn�trzny - addtype wywo�ane ze b��dnym ttisgmt�b��d wewn�trzny - addtype wywo�ane ze b��dnym ttisstd�b��d wewn�trzny w %s, linia %u�nieprawid�owe przesuni�cie UTC�nieprawid�owy format skr�tu�nieprawid�owy dzie� miesi�ca�nieprawid�owy rok ko�cowy�nieprawid�owy rok przest�pny�b��dny typ dla dlopen()�nieprawid�owy miesi�c�b��dny czas oszcz�dno�ci�nieprawid�owy rok pocz�tkowy�nieprawid�owa pora dnia�nieprawid�owy dzie� tygodnia�d�ugo�� klucza w ��daniu jest za du�a: %Zd�linia za wyrzutni� musi zawiera� definicj� znaku�linia przed wyrzutni� nie mo�e zawiera� definicji sta�ej znakowej�za d�uga linia�wy�wietla wszystkie znane zestawy znak�w�brak pliku lokalizacji `%s' u�ytego w wyra�eniu `copy'�nieudany lstat�b��dna linia zosta�a pomini�ta�nie powiod�o si� odwzorowanie tablicy nag��wk�w sekcji�nie powiod�o si� odwzorowanie nag��wk�w sekcji�pami�� zosta�a uszkodzona przed przydzielonym blokiem
+-�pami�� zosta�a uszkodzona za przydzielonym blokiem
+-�pami�� zosta�a wyczerpana�pami�� zosta�a wyczerpana
+-�pami�� jest zwarta, biblioteka zawiera b��dy
+-�brak formatu ery w �a�cuchu %d w polu `era' w kategorii `%s'�brak nazwy ery w �a�cuchu %d w polu `era' w kategorii `%s'�bezimienna regu�a�nie podano kodowania �r�d�owego ani docelowego�netname2user: (odwzorowanie nis+): %s
+-�netname2user: wpis DES dla %s w katalogu %s nie jest unikalny�netname2user: wpis LOKALNY dla %s w katalogu %s nie jest unikalny�netname2user: brak listy identyfikator�w grup w '%s'.�name2user: nazwa nadzorcy '%s' jest zbyt d�uga�netname2user: UID 0 nie powinien wyst�pi��program %d nie by� nigdy zarejestrowany
+-�nie podano �adnych warto�ci <Uxxxx> lub <Uxxxxxxxx>�brak poprawnego wyra�enia regularnego dla pola `%s' w kategorii `%s': %s��aden z dni miesi�ca nie pasuje do regu�y�brak definicji `UNDEFINED'�nie podano nazwy pliku dla danych profiluj�cych a obiekt dzielony `%s' nie ma soname��adne s�owo kluczowe nie powinno wyst�powa� razem z `copy'�brak pliku wyj�ciowego - wyst�pi�y ostrze�enia�nie podano �adnej mapy repertuar�w: kontynuacja niemo�liwa�brak nazwy symbolicznej�brak nazwy symbolicznej dla ko�ca zakresu�brak definicji wagi dla symbolu `%s'�nie jest zwyk�ym plikiem�konfiguracja nscd:
+-
+-%15d  poziom komunikat�w diagnostycznych
+-�nscd nie jest uruchomiony!
+-�po definicji CHARMAP mog� wyst�powa� tylko definicje WIDTH�nie podano kodowania �r�d�owego w opcji `-f'�plik wynikowy�problem rpc pmap_getmaps�poll: b��d protoko�u podczas zestawiania p�tli
+-�b��d preprocesora�wy�wietla list� �cie�ek zliczania i ich numery�wy�wietla informacje o post�pie konwersji�wyst�pi�y problemy podczas czytania `%s'�dane profiluj�ce w pliku `%s' nie pasuj� do obiektu dzielonego `%s'�program %lu jest niedost�pny
+-�program %lu wersja %lu jest niedost�pny
+-�program %lu wersja %lu gotowy i oczekuje
+-�rcmd: poll (podczas ustawiania stderr): %m
+-�rcmd: socket: Wszystkie porty zaj�te
+-�rcmd: write (podczas ustawiania stderr): %m
+-�registerrpc: brak pami�ci
+-�powt�rzone sekundy przest�pne�nie znaleziono pliku mapy repertuar�w `%s'�rpcgen: b��dne kodowanie arglist
+-�rpcgen: za du�o definicji
+-�rpcinfo: nieznany host %s
+-�rpcinfo: nieznana us�uga %s
+-�rpcinfo: Nie mog� usun�� rejestracji prog %s wer. %s
+-�rpcinfo: rozg�aszanie nieudane: %s
+-�rpcinfo: kontakt z portmapperem niemo�liwy�ta sama nazwa nazwa regu�y w r�nych plikach�brak danych podczas czytania klucza ��dania: %s�brak danych podczas czytania ��dania: `%s'�b��d zapisu w %s: %s�socket: protok� zawi�d� podczas konfiguracji po��czenia
+-�porz�dki sortowania `forward' i `backward' wykluczaj� si� wzajemnie�specyfikacja wagi dla elementu sortowania nie ma sensu�standardowe wej�cie�standardowe wyj�cie�nieprawid�owa pierwsza data w �a�cuchu %d w polu `era' w kategorii `%s'�pierwszy rok jest p�niejszy ni� drugi�pierwszy rok jest zbyt du�y�pierwszy rok jest zbyt ma�y�nieprawid�owa druga data w �a�cuchu %d w polu `era' w kategorii `%s'�svc_run - b��d select�svc_tcp.c - wykonanie getsockname lub listen niemo�liwe�svc_tcp.c - problemy przy tworzeniu gniazda tcp�svc_tcp: makefd_xprt: brak pami�ci
+-�svc_unix.c - problemy przy tworzeniu gniazda AF_UNIX�svc_unix.c - wykonanie getsockname lub listen niemo�liwe�svc_unix: makefd_xprt: brak pami�ci
+-�svctcp_create: brak pami�ci
+-�svcudp_create - wykonanie getsockname niemo�liwe�svcudp_create: brak pami�ci
+-�svcudp_create: problemy przy tworzeniu gniazda�svcunix_create: brak pami�ci
+-�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� tego elementu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� innego elementu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� innego symbolu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� tego symbolu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela nazw� symboliczn� z zestawu znak�w�b��d sk�adniowy w definicji %s: %s�b��d sk�adniowy w dyrektywie `order_start'�b��d sk�adniowy definicji klasy znak�w�b��d sk�adniowy w definicji konwersji znaku�b��d sk�adniowy w definicji kolejno�ci sortowania�b��d sk�adniowy w definicji sortowania�b��d sk�adniowy w definicji kategorii LC_CTYPE�b��d sk�adniowy w definicji nowej klasy znak�w�b��d sk�adniowy w definicji nowej mapy znak�w�b��d sk�adniowy w definicji lokalnych komunikat�w�b��d sk�adniowy w definicji lokalnej waluty�b��d sk�adniowy w lokalnej definicji numerycznej�b��d sk�adniowy w specyfikacji kolejno�ci�b��d sk�adniowy w prologu: %s�b��d sk�adniowy w definicji mapy repertuaru: %s�b��d sk�adniowy w lokalnej definicji czasu�b��d sk�adniowy: nie wewn�trz sekcji definicji lokalnych�nie podano docelowego kodowania w `-t'�to pierwsza definicja�czas przed zerem�przepe�nienie czasu�za ma�o bajt�w w kodzie znaku�za du�o bajt�w w kodzie znaku�zdefiniowane zbyt wiele klas znak�w�za du�o sekund przest�pnych�za du�o lokalnych typ�w czasu�za duzo konwersji?!�za du�o wag�za d�ugie lub za du�o skr�t�w stref czasowych��miecie na ko�cu linii�problem przy odpowiadaniu programowi %d
+-�dwie kolejne linie zawieraj�ce `...' nie s� dozwolone�podany pojedy�czy rok�przydzielenie bufora dla danych wej�ciowych by�o niemo�liwe�zwolnienie argument�w nie powiod�o si��niezdefiniowana�nieznany znak `%s'�nieznany znak w polu `%s' kategorii `%s'�nieznana dyrektywa sortuj�ca�nieznana dyrektywa `%s': linia zignorowana�nieznany b��d iconv() %d�nieznany zestaw `%s'�nieznany symbol `%.*s': linia zignorowana�strefa bez regu��niezako�czony komunikat�niezako�czony �a�cuch�niezako�czony napis�niezako�czona nazwa symboliczna�niezako�czona nazwa wagi�g�rna granica zakresu nie jest mniejsza ni� dolna�sk�adnia: %s plik_we
+-�u�ycie 2/29 w roku nieprzest�pnym�warto�� %s musi by� liczb� ca�kowit��warto�� <%s> musi by� z zakresu 1 do 4�warto�� pola `%s' w kategorii `%s' nie mo�e by� pustym �a�cuchem�warto�� <mb_cur_max> musi by� wi�ksza ni� warto�� <mb_cur_min>�zawarto�� pola `int_curr_symbol' w kategorii `LC_MONETARY' nie jest zgodna z nazwami ISO 4217�zawarto�� pola `int_curr_symbol' w kategorii `LC_MONETARY' ma z�� d�ugo���warto�ci pola `%s' w kategorii `%s' musz� by� mniejsze ni� 127�podczas przyjmowania po��czenia: %s�podczas dokonywania wpisu do pami�ci podr�cznej�b��d podczas wstawiania do tablicy mieszaj�cej�podczas tworzenia kopii klucza�podczas otwierania starego katalogu�podczas przygotowywania wynik�w�podczas czytania bazy�podczas szukania pliku z danymi profiluj�cymi�podczas zapisywania pliku bazy�zapis nie by� kompletny�zapisywalny nie tylko przez w�a�ciciela�z�a liczba argument�w�z�a liczba p�l w linii Leap�z�a liczba p�l w linii Link�z�a liczba p�l w linii Rule�z�a liczba p�l w linii kontynuacji Zone�z�a liczba p�l w linii Zone�xdr_reference: brak pami�ci
+-�xdrrec_create: brak pami�ci
+-�yp_update: konwersja nazwy hosta na nazw� sieci jest niemo�liwa
+-�yp_update: uzyskanie adresu serwera jest niemo�liwe
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/pt_BR.mo glibc-2.1.3/po/pt_BR.mo
+--- ../glibc-2.1.3/po/pt_BR.mo	1999-08-18 18:02:29.000000000 -0700
++++ glibc-2.1.3/po/pt_BR.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,448 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������R��	������\������s���Y�������T������7���9���9���q����������������������������������������������1������K���M��_�����������������"�������"�������������;���8������t������|������������������������������������������������������1������J������f������~����������%����������������������������������������8���!���8���Z���F�������-�������*���������3���&���M���$���t����������.�������1�������4������*���J��� ���u���,�������3������� �������"���������;������U������h���&�������:��������������+�������+���(���'���T���'���|���'��������������4�������'���������@������_������w���*��������������#�������*�������+���%������Q���$���n���!������� ���������������������!������!���1�������S���/�������������(���3���7���\����������(��������������S����������8���I���I����������'��������������6�������+������%���I������o������q������z���1��������������7�������1���
���
���?������M������]���5���}���4���������������������
���
������������-���"���K������n�����������������&���������������������!������
���1������?������R������V������l���5���{���4�������.�������*������*���@������k���/�������1�������B�������?���0���0���p���"�������D�������+���	���2���5���:���h���;�������/�������<������!���L������n����������!��������������������� �������������G���4���W���|���������� ����������������"���F���+���%���r�����������+���\���B�������8�������8���������=���7���U���
+-���������������������$�������������������������������������9���#���U������y������������������������4�������4������9���=��� ���w������������������������$��������������>�������'���9���*���a���*���������������������-�������:���	������D���"���b����������&��������������"��������������"���������2���/���M������}����������������������������S���-���p���!��������������
���������������������%������+���=���
+-���i���&���t���'�������&�������)�������(���������=��� ���Q������r���Q����������������������������������%���������,���'���;���#���c���1����������������������������*����������������4������E������\������h���3����������������������������#���
+-������.������M������m���������� ��������������$�������%����������"������;������V��� ���t��� �������
���������������������
+-���������������������6���������<������V������o������~������������������������$�������������)��� ���"���J������m���������������������)���C���<��������������������������������������������������� ���'������H������^������c������p���K���t���$���������������������4���������O������[������b������o���#���������������������������� ����������!��� ���>������_������s����������"�������$�������$�������	������"���&������I������a���$���z������������������������!�������+�������!���'���&���I������p���'��������������#��������������*���������-������B���(���`���������� ����������������������������*�������
��� ������.������H���"���`���"������������������������������������������������,���������J������c������z�����������������������������������������������������$��� ���9������Z���/���j�����������������"�������C�������(���#������L������b������|�������������������������������"����������������6���$���N���$���s�����������������#��������������������� ���������/������F���"���[������~���%�������$�������#�������!���������)������C������b���������"��������������2����������������������-������E������\������s����������5�������3������� ������(���)������R������i�����������������5�������.����������������%���?���D���"�������"���������������������������$������*���6������a������r������x����������!���������������������������+��� ������L������i������|���(��������������'�������#�������*���������>������N���%���]���"������������������������������������������������� ���������2���(���:���2���c�����������������(����������������������������%�������	���������������������������������������!��������������"���*����M�'���^���������������������+�����,�����9���&����`�
+-���p����{�"�����#����������%�����$����'���4����\����|���������������������������������$����B����X����u����������������������������������
�#����9���6����p������1����������*��������'�<���7�4���t�*�����-�����#�������&����7����O����T����Y����p�#�����J����������+����8���4�?���m�;�����@�����R���*	�.���}	�'����	�����	�0����	�0���
+-�+���F
+-�+���r
+-�����
+-�
����
+-�"����
+-� ����
+-�����6����2���U�+����������2�����$����� ����7���?�5���w�-����������&�����)���"
�7���L
�+����
�6����
�K����
�4���3�.���h�B�����#��������������7���)�,���a�5�����%�����*�����>����"���T�.���w�5�����4���������$���/�(���T�&���}�*�����#�����0�����2���$�%���W�(���}�&�����K�����8����<���R�0�����A�����#����#���&�3���J�5���~�*�����*�����*���
+-�G���5�F���}�(����������#����+���/�8���[�'�����+����������7����M���:�V����������-�����(���-����V����f�2�����$���������������"�������8�*���V�3�����/����������!�����5��� ����V����q�(�����=��������������*���-�'���X�2�����%�����5�����*����+���:����f�)���u�)�����.�����:��������3�4���B����w�R�����K�����K���.����z�$�����6�����6�����1���&�.���X�%�����.�����6�����(��� ����< ����\ ����z ����� �-���� �*���� �&���� ����#!�E���9!����!�A����!�A����!�K���"�I���i"�?����"� ����"�%���#����:#�2���Z#�4����#�4����#�����#����$����.$����M$����a$����t$�����$�����$�����$�����$�����$�����$�/���%�3���K%�E���%�����%�1����%�@���	&����J&����Y&�<���q&�)����&�+����&�1���'����6'����G'�4���Y'�>����'�<����'����
+-(�-���(� ���G(�=���h(�?����(�3����(�-���)�$���H)����m)�+����)�D����)�!����)����*�a���:*�F����*�B����*�9���&+����`+�0���{+�)����+�����+�4����+���� ,�K���8,�1����,�����,�����,�5����,����-�3���3-����g-�����-�L����-�!����-�,���
+-.�,���7.�%���d.�%����.�&����.�'����.�"����.�(���"/�*���K/����v/�#����/�&����/�A����/����0�(���=0�)���f0�.����0�����0�����0�7����0�K���%1�@���q1�����1�����1�A����1����2�,���02�-���]2�D����2�����2�=����2�3���'3�0���[3�3����3�����3�1����3�)���4�*���:4�)���e4�)����4�*����4�X����4�X���=5�[����5�W����5�A���J6�#����6�)����6�4����6�7���7�3���G7�*���{7�2����7�=����7�:���8�/���R8�-����8�,����8�)����8����9�)���%9�,���O9�A���|9�0����9�����9����:���� :�'���1:�'���Y:�&����:�����:�����:�����:�����:�9���;����>;�!���U;�:���w;�����;�%����;�����;�
+-���
<����<�3���3<�#���g<�*����<�����<�����<�+����<����=����+=����B=����W=����l=�����=�<����=�����=�����=�!���>�&���9>�D���`>�B����>�j����>�S���S?�H����?�����?�"���@�(���3@����\@�+���z@�����@�����@�3����@�%���A����2A� ���EA����fA�(����A�(����A�(����A�:����B�(���;B�)���dB�)����B�6����B�7����B��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-06-29 18:07-0300
+-Last-Translator: Rodrigo Parra Novo <rodarvus@conectiva.com.br>
+-Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8-bit
+-�		Direitos de Acesso: �		Atributos         : �%s [-abkCLNTM][-Dname[=valor]] [-i tamanho] [-I [-K segundos]] [-Y rota] arquivo_entrada
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o arquivo-sa�da] [arquivo-entrada]
+-�	%s [-n id-rede]* [-o arquivo-sa�da] [arquivo-entrada]
+-�	%s [-s tipo-rede]* [-o arquivo-sa�da] [arquivo-entrada]
+-�	Direitos acesso: �	Entrada de dados de tipo %s
+-�	Nome         : %s
+-�	Chave p�blica: �	Tipo           : %s
+-�	Endere�o universal (%u)
+-�	[%d]	Nome          : %s
+-�	[%u] - [%u bytes] �
+-cache %s:
+-
+-%15s  cache est� habilitado
+-%15Zd  tamanho sugerido%15ld  segundos de vida para entradas positivas
+-%15ld  segundos de vida para entradas negativas
+-%15ld  hits do cache para entradas positivas
+-%15ld  hits do cache para entradas negativas
+-%15ld%% quantidade de hits no cache
+-%15s  verifique o arquivo /etc/%s para mudan�as
+-�
+-Membros do Grupo : 
+-�
+-Tempo de Vida  : �       rpcinfo -b n�mprog n�mvers
+-�       rpcinfo -b n�mprog n�mvers
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n n�mporta ] -t host n�mprog [ n�mvers ]
+-�    n�o�    sim�  Tamanho dados = %u
+-�  Membros expl�citos:
+-� N�o-membros expl�citos:
+-�  Membros impl�citos:
+-� N�o-membros impl�citos:
+-� Membros n�o expl�citos
+-�N�o-membros n�o expl�citos
+-� Membros n�o impl�citos
+-�N�o-membros n�o impl�citos
+-�Membros n�o recursivos
+-�N�o-membros n�o recursivos
+-�   Membros recursivos:
+-�   programa vers�o protocolo   porta
+-�  ou: � (regra de "%s", linha %d)� [OP��O...]� feito
+-�"%s", linha %d: %s�A linha "Zone %s" e a op��o -l s�o mutuamente exclusivas�A linha "Zone %s" e a op��o -p s�o mutuamente exclusivas�"arquivo-entrada" � necess�rio para gera��o de indicadores do modelo.
+-�%.*s: ARGP_HELP_FMT par�metro requer um valor�%.*s: Par�metro ARGP_HELP_FMT desconhecido�%s em uma zona sem regras�%s%s%s:%u: %s%sAssertiva `%s' falhou.
+-�%s%s%s:%u: %s%sErro inesperado: %s.
+-�%s%sSinal desconhecido %d
+-�%s: %d n�o fez extens�o de sinal corretamente
+-�%s: <mb_cur_max> deve ser maior que <mb_cur_min>
+-�%s: Pr�-processador C falhou com c�digo de sa�da %d
+-�%s: Pr�-processador C falhou com sinal %d
+-�%s: N�o � poss�vel criar %s: %s
+-�%s: N�o � poss�vel criar o diret�rio %s: %s
+-�%s: N�o � poss�vel criar um link de %s para %s: %s
+-�%s: N�o � poss�vel abrir %s: %s
+-�%s: N�o � poss�vel remover %s: %s
+-�%s: Erro fechando %s: %s
+-�%s: Erro lendo %s
+-�%s: Erro escrevendo %s
+-�%s: Erro escrevendo para sa�da padr�o �%s: linha Leap no arquivo %s, que n�o � arquivo de ajuste
+-�%s: Mem�ria esgotada: %s
+-�%s: Mais que uma op��o -L foi especificada
+-�%s: Mais que uma op��o -d foi especificada
+-�%s: Mais que uma op��o -l especificada
+-�%s: Mais que uma op��o -p especificada
+-�%s: Mais que uma op��o -y especificada
+-�%s: Muitos par�metros
+-�%s: n�o � poss�vel processar modifica��es de hor�rio�%s: comando era '%s', resultado era %d
+-�%s: erro na m�quina de estados�%s: op��o ilegal -- %c
+-�%s: op��o inv�lida -- %c
+-�%s: op��o `%c%s' n�o permite um argumento
+-�%s: op��o `%s' � amb�gua
+-�%s: op��o `%s' requer um argumento
+-�%s: op��o `--%s' n�o permite um argumento
+-�%s: op��o `-W %s' n�o permite um argumento
+-�%s: op��o `-W %s' � amb�gua
+-�%s: op��o requer um argumento -- %c
+-�%s: sa�da poder� sobrescrever %s
+-�%s: p�nico: l_value inv�lido %d
+-�%s: fim de arquivo prematuro�%s: N�o foi poss�vel abrir �%s: op��o n�o reconhecida `%c%s'
+-�%s: op��o n�o reconhecida `--%s'
+-�%s: uso � %s [ -s ] [ -v ] [ -l tempolocal ] [ -p regrasposix ] [ -d diret�rio ]
+-	[ -L segundosajuste ] [ -y tipoano ] [ nome do arquivo ... ]
+-�%s: uso � %s [ -v ] [ -c cutoff ] nomezona ...
+-�%s: enquanto escrevendo sa�da: �(ERRO DE PROGRAMA) Vers�o desconhecida!?�(ERRO DE PROGRAMA) Op��o deveria ter sido reconhecida!?�(Objeto  desconhecido)
+-�(erro de autentica��o desconhecido - %d)�(desconhecido)�*** O arquivo  `%s' est� sem s�mbolos (stripped): a an�lise detalhada � imposs�vel
+-�*entrada padr�o*�-o ARQUIVO-SA�DA [ARQUIVO-ENTRADA]...
+-[ARQUIVO-SA�DA [ARQUIVO-ENTRADA...]�se��o .lib corrompida em a.out�; vers�o baixa = %lu, vers�o alta = %lu�; porque = �<%s> e <%s> s�o nomes ilegais para faixa de caracteres�<SP> caracter n�o deve estar na classe `%s'�<SP> caracter n�o est� na classe `%s'�?�Abortado�Direitos de Acesso : �Acessando uma biblioteca compartilhado corrompida�Endere�o j� em uso�Fam�lia de endere�os n�o suportada para nome de m�quina�Fam�lia de endere�os n�o suportada pelo protocolo�Erro de aviso�Alarme de tempo�Lista de argumentos muito longa�Tentativa de remo��o de uma tabela que n�o est� vazia�Tentando o link em muitas bibliotecas compartilhadas�Autentica��o OK�Erro de autentica��o�OBJETO FALSO
+-�Endere�o inv�lido�Descritor de arquivo inv�lido�Formato do arquivo fonte inv�lido �Mensagem inv�lida�Chamada de sistema inv�lida�Valor inv�lido para ai_flags�Se extremamente compat�vel com o POSIX�Dados bin�rios
+-�Dispositivo de bloco requerido�Problema em select para broadcast�Pipe quebrado�Erro no barramento�CDS�Tempo de CPU excedido�Tempo expirado�N�o foi poss�vel acessar uma biblioteca compartilhada�N�o posso executar bind com o servidor deste dom�nio�N�o foi poss�vel comunicar-se com o portmapper�N�o foi poss�vel comunicar-se com o ypbind�N�o foi poss�vel comunicar-se com o ypserv�N�o foi poss�vel alocar mem�ria�N�o foi poss�vel acessar o endere�o requisitado�N�o � poss�vel criar socket para rpc de broadcast�N�o foi poss�vel executar uma biblioteca compartilhado diretamente�N�o � poss�vel ter mais de um indicador de gera��o de arquivo!
+-�N�o foi poss�vel receber resposta para broadcast�N�o foi poss�vel registrar servi�o�N�o � poss�vel enviar ap�s desligamento do ponto final de transporte�N�o foi poss�vel enviar pacote de broadcast�N�o foi poss�vel usar op��o do socket SO_BROADCAST�Nao � poss�vel especificar mais de um arquivo de entrada!
+-�N�o � poss�vel user tabela de indicadores com novo estilo!
+-�N�o � poss�vel usar indicador netid sem TIRPC!
+-�N�o � poss�vel usar indicadores de tabelas com novo estilo!
+-�N�mero do canal fora do intervalo�Separador de caracteres "%c
+-�Filho finalizado�Credencial do cliente muito fraca�Colunas             :
+-�Erro de communica��o ao enviar�Compila especifica��o localizada�O computador comprou a fazenda�O c�lculo do tamanho da tabela de classes de caracteres pode demorar...�O c�lculo do tamanho da tabela de informa��es de compara��o (collation) pode demorar...�Conex�o recusada�Conex�o fechada pela outra ponta�Tempo esgotado para conex�o�Continua�Converte codifica��o dos arquivos dados de uma codifica��o para outra.�Converte chave para letras min�sculas�Copyright (C) %s Free Software Foundation, Inc.
+-Este � um software free; leia os fontes para condic�es de c�pia. N�o existe
+-garantia; nem para com�rcio ou adequac�o para prop�stios particulares.
+-�n�o � poss�vel ler arquivo de registro "%s"�Cria arquivo NOME com cabe�alho C contendo defini��es de s�mbolos �Cria sa�da mesmo que mensagens de aviso forem produzidas�Cria um base de dados DB simples de uma entrada textual.�Hor�rio de cria��o : %s�Entrada DES para nome de rede (netname) %s n�o � �nica
+-�DIRET�RIO
+-�DNANS�DNS�Base de dados para tabela n�o existe�Base de dados est� ocupada�Direitos de Acesso padr�o :
+-�Endere�o de destino requerido�Dispositivo n�o � um stream�Dispositivo n�o configurado�Dispositivo ou recurso est� ocupado�Diffie-Hellmann (%d bits)
+-�Diret�rio     : %s
+-�Diret�rio n�o vazio�Cota de disco excedida�N�o divide (fork) e mostre mensagens na tty corrente�N�o mostra mensagens enquanto constr�i base de dados�N�o usar cat�logo existente, for�ar novo arquivo de sa�da�Dom�nio n�o limitado (not bound)�trap EMT�ENTRADA
+-�Dado criptografado
+-�Tipo de entrada/tabela incompat�veis�Erro no subsistema RPC�Erro acessando arquivo inicial do NIS+. O NIS+ est� instalado?�Falha no erro desconhecido do sistema: �Erro durante a chamada a processo callback�Erro: arquivo .netrc � leg�vel por outros.�Troca completa�Erro no formato exec�FATAL: sistema n�o define `_POSIX2_LOCALEDEF'�ARQUIVO cont�m mapas de nomes simb�licos para valores UCS4�Falha (erro n�o especificado)�Descritor de arquivo em mal estado�Arquivo existe�Erro de bloqueio em arquivo (deadlock)�Nome de arquivo muito longo�Excedido tamanho limite de arquivo�Arquivo muito grande�Primeira/pr�xima corrente quebrada�Exce��o de ponto flutuante�Resincronismo total necess�rio para o diret�rio�Fun��o n�o implementada�GRUPO
+-�Lixo em ARGP_HELP_FMT: %s�Gera cat�logo de mensagens.\vSe ARQUIVO-DE-ENTRADA � -, a entrada � lidada entrada padr�o.  Se ARQUIVO-DE-SA�DA
+-� -, a sa�da � escrita para a sa�da padr�o.
+-�Erro desconhecido de sistema�Pegar informa��es espec�ficas de localiza��o.�Retorna uma mensagem de uso curta�Retorna este arquivo de ajuda�Erro gratuito�Grupo         : %s
+-�Indicadores de Grupo :�Entrada de Grupo para grupo "%s.%s":
+-�Pendurar por SEG segundos (o padr�o � 3600)�Desconex�o�N�o encontrado "%d" no cache de grupo!�N�o encontrado "%d" no cache de senhas!�N�o encontrado "%s" no cache de grupo!�N�o encontrado "%s" no cache de m�quinas!�N�o encontrado "%s" no cache de senhas! �Host est� desligado�Falha na procura do nome de host�poss�vel E/S�ARQUIVO-ENTRADA ARQUIVO-SA�DA
+--o ARQUIVO-SA�DA ARQUIVO-ENTRADA
+--u ARQUIVO-ENTRADA�trap IOT�IVY�Identificador removido�Instru��o ilegal�Tipo ilegal de objeto para a opera��o�Procura ilegal�Tipo ou formato de arquivo inapropriado�ioctl inapropriado para dispositivo�Opera��o inapropriada para processo em background�Requesi��o de informa��o�Informa��o:�Arquivos de entrada:�Especifica��o de formato de Entrada/Sa�da:�Erro de entrada/sa�da�Erro NIS interno�Erro interno de ypbind�Interrup��o�Chamada de sistema interrompida�Chamada de sistema interrompida deve ser reiniciada�Objeto inv�lido para opera��o�Argumento inv�lido�Refer�ncia anterior inv�lida�Nome de classe de caracter inv�lido�Credencial de cliente inv�lido�Verificador de cliente inv�lido�Caracter de compara��o inv�lido�Conte�do inv�lido de \{\}�Link entre dispositivos inv�lido�Troca inv�lida�Multibyte ou caracter largo inv�lido�Express�o regular precedente inv�lida�Intervalo final inv�lida�Express�o regular inv�lida�C�digo de requisi��o inv�lido�Descritor de requisi��o inv�lido�Verificador de servidor inv�lido�Slot inv�lido�� um diret�rio�� um arquivo tipo nome�vel�Kerberos.
+-�Morto�LINK
+-�Entrada LOCAL para UID %d no diret�rio %s n�o � �nica
+-�Parada de sistema n�vel 2�N�vel 2 n�o sincronizado�N�vel 3 parado�N�vel 3 resetado�V�nculo aponta para nome ilegal�Link foi cortado�N�mero de link fora da faixa�Tipo de Objeto Vinculado (linked) : �Vinculado (linked) para : %s
+-�N�o foi configurado nome de dom�nio local�Falha na aloca��o de recurso local�A maquina n�o est� na rede�Nome malformado ou ilegal�Par�metros obrigat�rios ou opcionais para op��es longas s�o tamb�m obrigat�rios ou opcionais para qualquer op��o curta correspondente.�Servidor Mestre :
+-�Servidor Mestre ocupado, descarregamento completo (dump) remarcado.�Falha de aloca��o de mem�ria�Mem�ria esgotada�Mensagem muito longa�Atributo perdido ou malformado�Hor�rio  Mod. : %s�Modifica��o falhou�Opera��o de modifica��o falhou�Formato de modifica��o de sa�da:�Tentativa de Multihop�NOME�NOME
+-[-a|-m]�NIS�Vers�es cliente/servidor NIS n�o conferem - n�o � poss�vel oferecer servi�o�Base de dados de mapas NIS est� ruim�Opera��o NIS+ falhou�Servidores NIS+ fora do alcance�Servi�o NIS+ est� indispon�vel ou n�o est� instalado�SEM OBJETO
+-�N�MERO�Nome : `%s'
+-�Servidor de Cache de Nomes.�Nome n�o servidor por este servidor�O nome n�o � �nico na rede�Nome ou servi�o desconhecido�Nome/entrada n�o � �nico�Objeto nomeado n�o � pesquis�vel�� necess�rio um autenticador�A rede desconectou-se ao resetar�A rede n�o responde�A rede est� fora de alcance�N�o h� estrutura CSI dispon�vel�N�o h� sem�foros XENIX dispon�veis�N�o h� endere�o associado com o nome�N�o h� endere�o associado com o nome�Sem anode�N�o h� espa�o de buffer dispon�vel�N�o h� processos filhos�N�o h� dados dispon�veis�N�o h� espa�o dispon�vel no servidor�N�o h� locks dispon�veis�N�o confere�M�dia n�o encontrada�N�o h� mensagens do tipo desejado�N�o h� mais registros no banco de dados map�N�o h� express�o regular anterior�N�o h� programas remotos registrados.
+-�N�o h� rota para o host�N�o h� espa�o dispon�vel no dispositivo�Dispositivo inexistente�Arquivo ou diret�rio n�o encontrado�Chave no est� no mapa�Mapa n�o encontrado no dom�nio do servidor�Processo inexistente�Namespace NIS+ n�o encontrado�Falha irrecuper�vel na resolu��o de nome�nenhum.
+-�N�o encontrado, nome inexistente�N�o � um arquivo nome�vel XENIX�N�o � um diret�rio�N�o encontrado�N�o � um servidor mestre para este dom�nio�Dono inv�lido�N�mero de Colunas   : %d
+-�N�mero de objetos : %u
+-�Argumento num�rico fora de dom�nio�Resultado num�rico fora de alcance�Objeto #%d:
+-�Nome do Objeto: %s
+-�Tipo do Objeto: �Objeto � remoto�Objeto com o mesmo nome existe�N�mero �mpar de aspas�Somente o superusu�rio pode usar esta op��o!�Opera��o j� em progresso�Opera��o n�o permitida�Opera��o n�o suportada �Opera��o agora em progresso�Operation causaria bloqueio�Sem recursos de streams�Controle de Sa�da:�Sele��o de Sa�da:�Dono          : %s
+-�PRIVADO
+-�Pacote n�o instalado�Erro de verifica��o (parser): %s�Sucesso Parcial�Objeto passado n�o � o mesmo objeto no servidor�Permiss�o negada�Falha de energia�Fim prematuro da express�o regular�Mostra o conte�do da base de dados do arquivo, um entrada por linha�Mostra estat�stica da configura��o atual�Mostra mais mensagens�Mostra vers�o do programa�Sucesso prov�vel�Provavelmente n�o encontrado�Tempo expirado para profiling�Driver de protocolo n�o anexado�Erro de protocolo�Fam�lia de protocolo n�o suportada�Protocolo n�o dispon�vel�Protocolo n�o suportado�Tipo errado de protocolo para socket�Pergunta ilegal para tabela nominada�Sair�Erro espec�fico de RFS�Procedimento RPC ruim para programa�Falha RPC na opera��o NIS�Programa RPC n�o dispon�vel�Vers�o incorreta de programa RPC�Estrutura RPC inv�lida�Vers�o RPC incorreta�RPC: (c�digo de erro desconhecido)�RPC: Erro de autentica��o�RPC: Imposs�vel decodificar resultado�RPC: imposs�vel codificar argumentos�RPC: Falhou (erro n�o especificado)�RPC: Vers�es incompat�veis de RPC�RPC: Falha no Port mapper�RPC: Procedimento indispon�vel�RPC: Programa n�o registrado�RPC: Programa indispon�vel�RPC: Programa/vers�o incompat�veis�RPC: Erro remoto de sistema�RPC: O servidor n�o pode decodificar os argumentos�RPC: Sucesso�RPC: Tempo esgotado�RPC: Imposs�vel receber�RPC: Imposs�vel enviar�RPC: Host desconhecido�RPC: Protocolo desconhecido�RSA (%d bits)
+-�RTLD_NEXT usado em c�digo n�o dinamicamente carregado�L� e mostra perfil de dados do objeto compartilhado�L� configura��o de dados de NOME�Sistema de arquivos somente para leitura�Sinal de tempo-real %d�Express�o regular muito longa�Erro de E/S remota�Endere�o remoto alterado�Remova senha ou torne arquivo n�o-leg�vel por outros.�Reabertura de objeto compartilhado `%s' falhou�Duplicado :
+-�Reporte erros (bugs) para %s.
+-�Reportar erros usando o script `glibcbug' para <bugs@gnu.org>.
+-�Argumentos de requisi��o inv�lidos�Erro de resolvedor 0 (n�o h� erro)�Erro interno do resolvedor�Evitado deadlock de recurso�Recurso perdido�Recurso temporariamente indispon�vel�Resultados enviados para processo chamador�SHOBJ [PROFDATA]�SUNYP�Rota de Busca       :%s
+-�Falha de segmenta��o�Servidor ocupado, tente novamente�Mem�ria do servidor exaurida�Servidor rejeitou credencial�Servidor rejeitou verificador�`Servname' n�o suportado para `ai_socktype'�Configura o nome do programa�Encerra o servidor�Sinal 0�Opera��o socket em um arquivo n�o-socket�Tipo socket n�o suportado�T�rmino de conex�o causada por software�Lamento. Voc� n�o � o superusu�rio
+-�Defini��es fonte s�o encontrada no ARQUIVO�Erro de Srmount�Falha de pilha�Manipulador de arquivo NFS corrompido�Iniciar N�MERO de linhas (threads)�Posi��o           : %s
+-�Parado�Parado (sinal)�Parado (entrada tty)�Parado (sa�da tty)�Erro de pipe streams�A estrutura necessita de limpeza�Sucesso�Suprime avisos e mensagens de informa��o�Nomes de caracteres simb�licos definido en ARQUIVO�Erro de sistema�Informa��o do Sistema:�Falha de aloca��o de recursos do sistema�Diret�rio do sistema para mapas de caracteres: %s
+-                          mapas de repert�rio: %s
+-                          rota de localiza��o: %s
+-%s�TABELA
+-�Tipo de Tabela      : %s
+-�Falha tempor�rio na resolu��o de nome�Terminado��rea de texto ocupada�A lista seguinte cont�m todos os conjuntos de codifica��o de caracteres 
+-conhecidos.  Isto n�o quer dizer necess�riamente que todas as combina��es
+-destes nomes podem ser utilizadas nos par�metros FROM e TO.  Um conjunto
+-de caracteres pode ser listado com v�rios nomes diferentes (apelidos).
+-  Alguns destes nomes n�o strings simples mas sim, express�es regulares, e
+-eles combinam com uma variedade de nomes que podem ser dados como par�metrosao programa.
+-
+-  �Tempo de vida : �Tempo expirado�Muitos atributos�Muitos n�veis de links simb�licos�Muitos links�Muitos arquivos abertos�Muitos arquivos abertos no sistema�Muitos processos�Muitas refer�ncias: n�o � poss�vel unir�Muitos usu�rios�Trace/breakpoint trap�Contrabarra final�Tradutor morto�Ponto final de transporte j� est� conectado�Ponto final de transporte n�o est� conectado�Tente `%s --help' ou `%s --usage' para mais informa��es.
+-�Tentando %s...
+-�Tipo : %s
+-�DESCONHECIDO�Imposs�vel autenticar cliente NIS+�Imposs�vel autenticar servidor NIS+�Imposs�vel criar chamador�Imposs�vel criar processo no servidor�Desconhecido (tipo = %d, bits = %d)
+-�Palavra-chave em .netrc desconhecida %s�C�digo de erro NIS desconhecido�Base de dados desconhecida: %s
+-�Erro desconhecido�Erro desconhecido �Host desconhecido�Objeto desconhecido�Op��o desconhecida: %s %s %s�Erro desconhecido do resolvedor�Erro desconhecido de servidor�Sinal desconhecido %d�Erro desconhecido de sistema�Erro desconhecido de ypbind�( ou \( descasados�) ou \) descasados�[ ou [^ descasados�\{ descasado�Vari�vel n�o reconhecida `%s'�Condi��o urgente de E/S�Uso:�Uso: %s nome_da_vari�vel [caminho]
+-�Uso: rpcinfo [ -n n�mporta ] -u host n�mprog [ n�mvers ]
+-�Sinal 1 definido pelo usu�rio�Sinal 2 definido pelo usu�rio�Valor muito extenso para o tipo de dados definido�Temporizador virtual expirado�Resultado insensato da execu��o do comando�Janela alterada�Escreve nomes dos mapas de caracteres (charmaps) dispon�veis�Escreve nomes das localiza��es (locales) dispon�veis�Escreve nomes das categorias selecionadasd�Escreve nomes das palavras-chave selecionadas�Escreve a sa�da para o arquivo NOME�Escrito por %s.
+-�Tipo de m�dia incorreta�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Sim, 42 � o sentido da vida�Voc� realmente o destruiu desta vez�Tempo final da linha de zona n�o est� ap�s o tempo final da linha anterior�[ARQUIVO...]�`%1$s' defini��o n�o termina com `END %1$s'�`%s' n�o � o arquivo deperfil de dados correto para `%s'�`-1' deve ser o �ltimo registro no `%s' campo na `%s' categoria�`...' deve ser usado apenas em `...' e entradas `UNDEFINED'�`from' esperado ap�s primeiro argumento para `collating-element'�string `from' na declara��o de elemento de compara��o cont�m caracter desconhecido�Fam�lia de protocolo (ai_family) n�o suportada�Tipo socket (ai_socktype) n�o suportado�j� est� rodando�argumento para <%s> deve ser um caracter simples�argumento para `%s' deve ser um caracter simples�auth_none.c - Problema fatal de marshalling�authunix_create: n�o h� mem�ria suficiente
+-�argumento inv�lido�dono inv�lido�campo FROM em branco na linha Link�campo TO em branco na linha Link�bloco liberado duas vezes
+-�mcheck_status inv�lido, biblioteca est� com problemas
+-�broadcast: ioctl (obter configura��o de interface)�broadcast: ioctl (obter flags de interface)�estouro de buffer�cache_set: n�o foi poss�vel alocar novo rpc_buffer�cache_set: aloca��o de v�tima falhou�cache_set: v�tima n�o localizada�n�o � poss�vel determinar abrevia��o para zona de tempo�n�o � poss�vel reassinalar n�mero de procedimento %d
+-�n�o � poss�vel acessar arquivo de locale `%s'�N�o foi poss�vel alocar mem�ria�n�o � poss�vel criar descritor interno�n�o � possivel criar descritores internos�imposs�vel habilitar soquete para aceitar conec��es: %s�imposs�vel encontrar pr�-processador C: %s
+-�imposs�vel encontrar qualquer pr�-processador C (cpp)
+-�imposs�vel lidar com requisi��es de vers�es antigas %d; a vers�o atual � %d�n�o � poss�vel inserir elemento de compara��o `%.*s'�n�o � poss�vel inserir na tabela de resultados�n�o � poss�vel inserir nova defini��o de s�mbolo de compara��o: %s�imposs�vel carregar perfis de dados�imposs�vel abrir�n�o � poss�vel abrir `%s'�n�o � poss�vel abrir arquivo de banco de dados `%s': %s�n�o � poss�vel abrir arquivo de entrada `%s'�n�o � poss�vel abrir arquivo de defini��o locale `%s'�n�o � poss�vel abrir arquivo de sa�da�n�o � poss�vel abrir arquivo de sa�da `%s'�n�o � poss�vel abrir arquivo de sa�da `%s' para categoria `%s'�n�o � poss�vel abrir soquete: `%s'�n�o � poss�vel processar specifica��o de ordem�n�o � poss�vel ler diret�rio de mapa de caracter `%s'�imposs�vel ler arquivo de configura��o; isto � fatal�n�o � poss�vel ler do cliente�n�o � poss�vel ler cabe�alho de `%s'�n�o � poss�vel ler diret�rio locale `%s'�n�o � poss�vel ler arquivo locale `%s'�n�o � poss�vel ler mapa de repert�rio `%s'�imposs�vel ler dados de estat�stica�n�o � poss�vel ler atributos do arquivo `%s': %s�n�o � poss�vel escrever arquivo de sa�da para `%s'�n�o � poss�vel escrever resultado: %s�n�o � poss�vel escrever estatisticas: %s�n�o � poss�vel escrever para o cliente�categoria de dados requisitada mais que uma vez: isto n�o deveria acontecer�caracter %s'%s' na classe `%s' deve estar na classe `%s'�caracter %s'%s' na classe `%s' n�o deve estar na classe `%s'�caracter <SP> n�o definido no mapa de caracteres�caracter `%s' n�o definido enquanto necess�rio como valor default�classe de caracter `%s' j� definida�mapa de caracteres `%s' j� definido�arquivo de mapa de caracter `%s' n�o foi localizado�clnt_raw.c - Erro fatal no cabe�alho de serializa��o.�clnttcp_create: n�o h� mem�ria suficiente
+-�clntudp_create: n�o h� mem�ria suficiente
+-�clntunix_reate: n�o h� mem�ria suficiente
+-�o elemento de compara��o `%.*s' aparece mais que uma vez: ignorar linha�o s�mbolo de compara��o `%.*s' aparece mais que uma vez: ignorar linha�s�mbolo de compara��o esperado ap�s `%s'�connectar-se ao endere�o %s: �identificador ou constante esperado�convers�o de `%s' para `%s' n�o � suportada�a convers�o parou devido a problemas de escrita na sa�da�n�o foi poss�vel criar um servidor rpc
+-�n�o foi poss�vel registrar prog %d vers %d
+-�base de dados [chave ...]�arquivo default de mapa de caracter `%s' n�o localizado�flag de dire��o na string %d no campo `era', categoria `%s', n�o � '+'nem '_'�flag de dire��o na string %d no campo `era', categoria `%s', n�o � um caracter simples�nome de caracter duplicado `%s'�defini��o de elemento de compara��o duplicada�defini��o para caracter duplicada `%.*s'�chave duplicada�defini��o de conjunto duplicada�nome de zona duplicado %s (arquivo "%s", linha %d)�identificador de mensagens duplicado�n�mero de mensagem duplicado�cadeia de caractere vazia�nome do peso vazio: linha ignorada�enablecache: cache j� ativado�enablecache: n�o foi poss�vel alocar cache�enablecache: n�o foi poss�vel alocar dados do cache�enablecache: n�o foi poss�vel alocar cache fifo�codifica��o para a sa�da�codifica��o para o texto original�o ponto final da �rea da elipse � maior que o in�cio �erro fechando entrada `%s'�erro fechando arquivo de sa�da�erro fechando arquivo de dados de perfil�erro enquanto inserindo elemento de compara��o na tabela hash�erro ao inserir na tabela hash�enquanto lendo entrada�esperado argumento tipo string para `copy'�linha de continua��o n�o foi localizada�falha no carregamento do objeto compartilhado `%s'�falha para carregar dados de s�mbolos�falha para mapear (mmap) o arquivo de dados do perfil�falha para iniciar o processo de convers�o�falha ao escrever dados para categoria `%s'�fcntl: F_SETFD�campo `%s' na categoria `%s' n�o definido�campo `%s' na categoria `%s' n�o definido�arquivo `%s' j� existe e pode ser sobrescrito
+-�valor `from' do elemento de compara��o deve ser uma string�falha em fstat�lixo no final da especifica��o do c�digo de caracter�lixo no final do n�mero�lixo no final do valor do deslocamento na string %d no campo `era', categoria `%s'�lixo no final da data de in�cio na string %d no campo `era', categoria `%s'�lixo no final da data de parada na string %d no campo `era', categoria `%s'�gera gr�fico de chamadas�gera perfil com contadores e `ticks'�get_myaddress: ioctl (obt�m configura��o de interface)�getent - pega entrada da base de dados administrativa.�handle_request: requisi��o recebida (Vers�o = %d)�v�nculo (link( falhou, v�nculo simb�lico usado�vinculo (hard linked)  em alg�m lugar�Campo CORRECTION ilegal em linha Leap (ajuste)�campo Rolling/Stationary ilegal em linha Leap (ajuste)�constante de caracteres ilegal na string�caracteres ilegais no arquivo: �elemento de compara��o ilegal�defini��o ilegal�dada codifica��o ilegal�sequ�ncia de escape ilegal no final da string�sequ�ncia de entrada ilegal na posi��o %ld�nomes ilegais para faixa de caracteres�nettype ilegal: `%s'
+-�n�mero ilegal para offset na string %d no campo `era', categoria `%s'�n�mero de conjunto ilegal�data de in�cio ilegal na string %d no campo `era', categoria `%s'�data de parada ilegal na string %d no campo `era', categoria `%s'�limite de implementac�o: n�o s�o permitidas mais que %d classes de caracter�limite de implementac�o: n�o s�o permitidos mais que %d mapas de caracter�caractere incompleto ou mudan�a de seq�encia no final do buffer�arquivo formatado incorretamente�linha de entrada de tipo desconhecido�erro interno (descritor ilegal)�erro interno - addtype chamado com isdst incorreto�erro interno - addtype chamado com ttisgmt incorreto�erro interno - addtype chamado com ttisstd incorreto�erro interno em %s, linha %u�deslocamento UTC inv�lido�formato de abrevia��o inv�lido�dia do m�s inv�lido�ano final inv�lido�ano bissexto inv�lido�modo inv�lido para dlopen()�nome do m�s inv�lido�tempo gravado inv�lido�ano inicial inv�lido�hora do dia inv�lida�nome de dia de semana inv�lido�tamanho de chave na requisi��o muito longa: %Zd�linha ap�s elipse deve conter defini��o de caracter�linha antes da elipse n�o cont�m defini��o para constante de caracter�linha muito longa�lista todas as cole��es de caracteres codificados�arquivo locale `%s', usado na declara��o `copy' , n�o encontrado�falha em lstat�linha inv�lida ignorada�mapeamento da tabela de cadeias do cabe�alho da se��o falhou�mapeamento dos cabe�alhos da se��o falhou�mem�ria sobrescrita antes do bloco alocado
+-�mem�ria sobrescrita ap�s o fim do bloco allocado
+-�mem�ria esgotada�mem�ria esgotada
+-�a mem�ria est� consistente, problemas na biblioteca
+-�formato era ausente na string %d no campo `era', categoria`%s'�nome era ausente na string %d no campo `era', categoria `%s'�regra sem nome�codifica��o original nem destino especificada�netname2user: (nis+ lookup): %s
+-�netname2user: entrada DES para %s no diret�rio %s n�o � �nica�netname2user: entrada LOCAL para %s no diret�rio %s n�o � �nica�netname2user: lista de id do grupo perdida em `%s'.�netname2user: nome principal `%s' muito longo�netname2user: n�o deve possuir uid 0�nunca registrado prog %d
+-�Valores <Uxxxx> ou <Uxxxxxxxx> n�o entrados�n�o h� express�o regular correta para campo `%s', categoria `%s': %s�nehum dia do m�s satisfaz a norma�n�o h� defini��o de `UNDEFINED'�nome de arquivo para perfil de dados n�o informado e objetos compartilhados `%s' n�o tem `soname'�nehuma outra palavra-chave deve ser especificada quando `copy' � usado�nenhum arquivo de sa�da foi produzido porque avisos foram emitidos�mapa de repert�rio n�o especificado: n�o posso prosseguir�nenhum nome simb�lico dado�nenhum nome simb�lico dado para fim do intervalo�n�o foi definido peso para o s�mbolo `%s'�n�o � arquivo normal�configura��o nscd:
+-
+-%15d n�vel de debug do servidor
+-�nscd n�o est� rodando!
+-�apenas defini��es de WIDTH s�o permitidas em seguida � defini��o de CHARMAP�codifica��o original n�o especificada usando `-f'�arquivo de sa�da�problemas de pmap_getmaps rpc�poll: falha de protocolo na configura��o do circuito
+-�Erro de pr�-processador�mostra lista de n�mero de rotas e seu n�mero de uso�mostra informa��es de progresso�problems lendo `%s'�arquivo de dados de perfil `%s' n�o coincide com objetos compartilhados `%s'�programa %lu n�o est� dispon�vel
+-�programa %lu vers�o %lu n�o est� dispon�vel
+-�programa %lu vers�o %lu pronto e aguardando
+-�rcmd: poll (configurando stderr): %m
+-�rcmd: socket: Todas as portas em uso
+-�rcmd: write (configurando stderr): %m
+-�registerrpc: n�o h� mem�ria suficiente
+-�ajuste repetido em segundo momento�arquivo de mapas `%s' n�o foi localizado�rpcgen: erro na codifica��o de par�metros
+-�rpcgen: muitas defini��es
+-�rpcinfo: %s � um host desconhecido
+-�rpcinfo: %s � um servi�o desconhecido
+-�rpcinfo: N�o foi poss�vel apagar registro para prog %s vers�o %s
+-�rpcinfo: broadcast falhou: %s
+-�rpcinfo: imposs�vel contactar portmapper�mesmo nome de regra em m�ltiplos arquivos�falha na leitura lendo chave de requisi��o: %s�problems lendo `%s'�Erro escrevendo em %s: %s�socket: falha de protocolo na configura��o do circuito
+-�as ordens de classifica��o `forward' e `backward' s�o mutuamente exclusivas�especifica��o de peso para s�mbolo de compara��o n�o faz sentido�entrada padr�o�sa�da padr�o�data inicial � ilegal na string %d no campo `era', categoria `%s'�ano inicial maior que ano final�ano inicial muito alto para ser representado�ano inicial muito baixo para ser representado�data de t�rmino � ilegal na string %d no campo `era', categoria `%s'�svc_run: - select falhou�svc_tcp_.c - n�o � poss�vel receber `getsocknome' ou `listen'�svc_tcp_.c - problema na cria��o do soquete AF_UNIX�svc_tcp: makefd_xprt: n�o h� mem�ria suficiente
+-�svc_tcp_.c - problema na cria��o do soquete AF_UNIX�svc_tcp_.c - mem�ria exaurida�svc_unix: makefd_xprt: n�o h� mem�ria suficiente
+-�svctcp_create: n�o h� mem�ria suficiente
+-�svcudp_create - n�o � poss�vel getsockname�svcucp_create: n�o h� mem�ria suficiente
+-�svcudp_create: problema na cria��o socket�svcunix_create: n�o h� mem�ria suficiente
+-�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do elemento�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do elemento�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica outra defini��o de s�mbolo�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do s�mbolo�s�mbolo para elemento de compara��o multicaracter `%.*s duplicado�erro de sintaxe na defini��o %s: %s�erro de sintaxe na diretiva `order_start'�erro de sintaxe na defini��o de classe de caracteres�erro de sintaxe na defini��o de convers�o de caracteres�erro de sintaxe na defini��o de ordem de compara��o�erro de sintaxe na defini��o de compara��o�erro de sintaxe na defini��o da categoria LC_CTYPE�erro de sintaxe na defini��o de uma nova classe de caracteres�erro de sintaxe na defini��o de um novo mapa de caracteres�erro de sintaxe na defini��o da mensagem locale�erro de sintaxe na defini��o monet�ria locale�erro de sintaxe na defini��o num�rica locale�erro de sintaxe na especifica��o de ordem�erro de sintaxe em prolog: %s�erro de sintaxe no mapa de repert�rio: %s�erro de sintaxe na defini��o de tempo locale�erro de sintaxe: n�o est� dentro de uma defini��o de se��o locale�codifica��o destino n�o especificada usando `-t'�esta � a primeira defini��o�tempo menor que zero�estouro de tempo�poucos bytes na codifica��o do caracter�muitos bytes na codifica��o do caracter�muitas classes de caracteres definidas�excessivos ajustes em segundos�muitos tipos de tempo local�muitas transi��es?!�muitos pesos�abrevia��es de zona de tempo excessivas ou muito extensas�lixo no final da linha�problemas respondendo ao prog %d
+-�duas linhas em uma lista contendo `...' n�o s�o permitidas�digitado ano simples�incapaz de alocar espa�o para entrada�n�o consegui liberar par�metros�indefinido�caracter desconhecido `%s'�caracter desconhecido no campo `%s', categoria `%s'�diretiva de compara��o desconhecida�diretiva desconhecida `%s': linha ignorada�erro iconv() desconhecido: %d�conjunto desconhecido `%s'�s�mbolo desconhecido `%.*s': linha ignorada�zona sem regras�mensagem n�o terminada�string n�o terminada�string n�o terminada�nome simb�lico n�o terminado�nome do peso n�o terminado�o limite inferior do intervalo � maior que o limite superior�uso: %s arquivo_entrada
+-�use 2/29 em ano n�o bissexto�valor para %s deve ser um inteiro�valor para <%s> deve estar entre 1 e 4�valor para campo `%s', categoria `%s', n�o deve ser uma string vazia�o valor de <mb_cur_max> deve ser maior que o valor de <mb_cur_min>�o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' n�o corresponde a um nome v�lido na ISO 4217�o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' possui tamanho errado�os valores para o campo `%s' na categoria `%s' devem ser menores que 127�enquanto aceitando conec��o: %s�enquanto alocando entrada de cache�enquanto alocando entrada na tabela hash�enquanto alocando chave c�pia�enquanto abrindo antigo arquivo de cat�logo�enquanto preparando sa�da�enquanto lendo database�enquanto escrevendo arquivo data de dados de perfil�enquanto escrevendo arquivo data base�escrita incompleta�permiss�o de escrita para outros�n�mero incorreto de argumentos�n�mero incorreto de campos na linha Leap�n�mero incorreto de campos na linha Link�n�mero incorreto de campos na linha Rule�n�mero incorreto de campos na linha de continua��o de Zone�n�mero incorreto de campos na linha Zone�xdr_reference: n�o h� mem�ria suficiente
+-�xdrrec_create: n�o h� mem�ria suficiente
+-�yp_update: n�o � poss�vel converter host para netname
+-�yp_update: n�o � poss�vel obter o endere�o do servidor
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/sk.mo glibc-2.1.3/po/sk.mo
+--- ../glibc-2.1.3/po/sk.mo	1999-07-18 18:19:42.000000000 -0700
++++ glibc-2.1.3/po/sk.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,451 +0,0 @@
+-������������t������8�������K������K������K��M����K��E���5L��&���{L��(����L������L������L������L�����M�����M�����)M�����DM�����^M��n��rM������N������N��"���O��"���(O�����KO��:���gO������O������O������O������O������O������O�����P�����,P�����EP�����aP�����zP������P������P������P������P�����Q�����
+-Q�����%Q�����2Q�����9Q��3���KQ��3���Q��4����Q��.����Q��%���R�����=R��&���QR��%���xR������R��%����R��3����R��,���S��)���<S�����fS��"���S��!����S������S������S������S�����T�����$T��"���:T��*���]T������T��&����T��&����T��&����T��&���U��&���>U�����eU�� ���}U��$����U������U������U������U��,���V�����?V��%���]V��,����V��-����V�� ����V��&����V�����&W�����EW�����dW�����~W������W������W�������W��2���\X������X��"����X��4����X�����Y��#���Y��	���8Y��=���BY������Y��<����Y������Y��'����Y�����Z��)���Z��(���IZ�� ���rZ������Z������Z������Z��$����Z������Z��)����Z��(���[�����=[�����M[�����Y[��#���p[��/����[������[������[��
����[������[�����\�����\�����.\�����:\�����J\�����a\�����{\������\������\������\��	����\������\������\��
����\��&����\��-���]��!���J]�����l]������]������]������]��&����]��%���^��0���,^��!���]^�����^��-����^������^��%����^��)���_��'���2_��%���Z_��&����_������_������_������_������_�����`�����`�����8`�����U`��@���n`��D����`������`�����a����� a��	���5a��=���?a�����}a�������a�����_b��7���~b��2����b��-����b�����c��$���*c��
+-���Oc�����Zc�����`c��!���dc������c������c������c������c������c������c�����d�����*d�����>d�����Rd��3���fd��-����d��2����d������d�����e�����e�����e�����,e�����Fe��<���]e������e��$����e��)����e��
���	f�����f��1���)f��8���[f������f������f������f������f������f�����g����� g�����/g�����Gg��"���`g������g������g������g�������g�����Oh�� ���dh������h������h������h������h��
����h������h��$���i�����,i��"���3i��%���Vi��"���|i��"����i��%����i������i������i�����j��>���j�����Zj�����cj�����gj�����zj��!����j������j��!����j������j��.����j�����-k�����Ak�����Nk��"���[k�����~k������k������k��	����k������k��+����k�����l�����%l�����6l�����Ml�����jl������l������l������l������l������l��1����l��$���-m�����Rm�����dm�����m������m������m������m������m������m��
+-����m�����n�����
+-n��2���n�����Cn�����Rn�����kn��
���zn������n������n������n������n������n������n��!���o�����5o�����So��s���so������o��*����o�����#p�����=p�����Np�����_p�����~p������p������p������p������p������p������p������p��9����p�����6q�����Nq�����dq��,���}q��
+-����q������q������q������q������q�����r�����r�����8r�����Pr�����or��#����r������r������r������r������r��#���s�����*s�����Js�����Ss�����ms������s������s������s������s������s������s������s�����t�����0t�����Pt�����at�����yt������t������t������t������t������t��*���u�����.u�����5u�����Mu�����iu��	���yu��!����u��	����u������u������u�� ����u�����v����� v�����-v�����Av�����Rv�����cv������v��(����v������v������v������v�����w�����/w�����Ew�����^w�����nw������w������w������w������w������w��.����w�����x��
���x��#���"x��0���Fx��%���wx������x������x������x������x������x�����y����� y�����/y�����My�����dy�����{y������y������y������y������y������y�����z�����%z�����?z�����Qz�����cz�����}z������z������z������z��!����z�����{�����'{�����B{�����^{�����w{������{��"����{������{������{������{�����|�����|�����*|�����@|��-���O|��-���}|��!����|������|������|������|�����}�����#}��2���:}��#���m}������}������}��;����}������}�����~����� ~�����8~��
���R~�� ���`~������~������~������~������~������~������~������~����������*��&���C�����j������������������������� ������������$������
���5������C������O������e������z����������������������������������Ԁ���������������*������(���3������\������i���"���}��������������$������+���$���E���
+-���j������u�������������0���
���@������N���!���b���������������������������ń��"���؄������������
+-������ ������3���'���C���#���k���6�������
���ƅ��
+-���ԅ�����߅��"������"���
+-������-���"���G������j������������������������
���ц�����߆������������������
+-������#������:������O������a������v����������������������������������·���������������#������:���)������d������z���%��������������"���̈��������!������� ��� ���"���A��� ���d����������������������������������Ɖ�����ˉ��������������F������	���e���.���o���-�������6���̊��8������;���<���I���x������‹�����ڋ��������+������+���0���'���\�����������������	�����������������ٌ���������&������.���/���&���^����������,������������������C�������#���A������e����������!�������"���Ž��.������ ������%���5���;���[���&��������������1���ޏ�����������+���"���7������Z���'���v�����������������.���Ӑ��������"������(���<���-���e�����������������!���ȑ�����������������'������C���!���_������������������������9���̒��4������8���;���+���t���8�������$���ٓ��"�������!���!���.���C������r����������<�������;������$���*������O������g���*�������7�������������"���	������,���)���?���N���i���U�������������&���,���)���S���
���}����������+����������З��������������������"���:���%���]���*�������*����������٘��������0���������8������W���+���w���7�������#���ۙ���������!������$���?���!���d����������&�������%���Ț��,������������'���*���%���R���0���x���2����������ܛ��.������������K���1���L���}���L���ʜ��������+���+���2���W���2�������/�������$������������%���(���-���N���$���|��������������������מ��������(������&���*���!���Q������s���F����������џ��B������B���'���?���j���<�������7���������������:���#���U���.���y���0�������0���١�����
+-������(������;������W������l���������������������������¢�����բ���������������#������5���8���G���n���
�������#���ģ��5���������������+���-���B���!���p���(�������-��������������������'������?���4���=���t���
�������.������� ������9������;���J���,�������*�������#���ަ��������%������A���B�����������������I�������7������3���@���+���t����������'�������!���ߨ��������.���������A���C���T���*����������é�����ϩ��(������������1���$������V������q���:����������Ȫ��)������*������#���;������_���$��������������������"���ܫ������������������7������T���>���t����������!���Ҭ�� �������(������$���>������c���*���y���=�������H���������+������:���E���J���&�������(�������'������E���������N���(���g���'�������$�������,���ݯ��)���
+-���%���4������Z���"���x����������&�������������P�������V���P���U�������O�������V���M���!�������'���Ʋ��*������/������*���I���$���t���/�������1���ɳ��/�������)���+���*���U���)�������#����������δ��-������&������4���>���(���s�����������������
���ʵ��#���ص��$�������"���!������D������Z������t����������.����������˶��������3���������<���#���N������r���	��������������0����������ݷ��$����������������7���#���H������l������x���������������������������ٸ��4���������'������:������W���'���w���B�������D������j���'���K�������?���޺�����������=���!���Z������|��������������������̻��"���������������"������3������Q���#���k���#�������#�������0���׼��#���������,������J���*���h���%�������1������������������W������K���o���,�������.���������������+������C������X������j����������������������������������V������k���.�������.��������������M�������	���K������U������^������u�������������������������������!���������#���!���C������e���!���������������������	��������������������������������0���0���0���a���>�������.�������%����������&���*���>���&���i����������*�������2�������.������(���4���!���]���)������4������� �������"������� ���"������C������\���*���u���8��������������!�������!������!���8���!���Z���!���|����������!�������%�����������������������9���,���Q���"���~���!�������,�������-�������%������"���D������g���,��������������������������������������#���3��������������!������/���%������U���-���g���	�������U��������������I���������R���*���p���
+-�������-�������"����������������������������� ���'���4������\���*���p���+����������������������������&�������+���'������S������i����������
�������������� �������
������������������������������,������;���0���Y������������������������$��������������3�������;���!���'���]���!�������!��������������*�������/������-���@���:���n���(�������!�������=�������#���2���3���V���1�������4�������-�������?������$���_�����������������#���������������������,���������B���A���V���I���������������������!���������8���,���E������r�����������*���<���?���g���/�������6�������������3���$������X������a������g������k�����������������!��������������!�������'���������@������\������s����������F�������(�������9���������M������e������t������|�����������������G�������#������5���+���/���a����������"�������4�������<����������5���!���U������w���)�����������������������������������!������'���:������b����������������������������A���4���Y��� �����������������������������������$�������$������	���C������M������l����������!���������������������!�������	��� ���M���*������x������������������������$�������������� �������"��� ���%���C������i������~����������(����������������������������
+-����������
+-���4���$������Y������v��������������������������������������������$���,������Q���;���d���*������������������������������������;������U���
+-���i������t���
+-���������������������9���������������������������'���!���#���I������m�����������������������%�������%�������������(���3���{���\����������7����������!������;������K���(���^��������������������������������������������
���
+-���������F���������c������~����������/���������������������
�������������'���������F������f����������$��������������7����������������+������@������Y���$���s�����������������,��������������������-���!������O������i������v���������� �������%�������.���������� ���$���<������a������|��� �������(��������������%�������%���#������I���"���R������u����������	�������$���������������������������,������(���I������r�����������������������!��������������,����������&������B������[������w��������������������������������������	�����������������������'���5���8������n����������#�������9�������)����������������.������F������[������s�����������������$���������������������$������#���@������d������k��� ��������������������������������������������"������>���$���Z���%������$���������������������"������� ���#��� ���D���#���e����������&�������������������������������������&������;������Q���=���a���8�������$�������$����������"������:������W������k���7�������.���������������������C���������^��� ���x����������&���������������������+���	������5������O������U������r���"����������������������������+����������������7������G���2���P����������#�������!�������)�������
��������� ������0������M������c���	���~��������������������������������������������$������.���1���
���`������n���&������������������/������8������U������u������~���K��������������������������#���������B������R���$���m����������'���������������������������������%���0��&���V��<���}��
������
+-������������*������*����$���1�'���V����~�"���������������
���������������������*����B����Z����p����������������������������������������	����$���#�P���H� ����� �����'���������!�������?�&���O�,���v�!�����&���������������������(����-����2����I�!���b�[�����
+-�����#�����/����;���?�:���{�:�����D��������6����S����r�%���z�%�����(�����#������������#����3����Q����o�*�����2�����/��������	�7���3	����k	�����	�J����	�/����	�?���
+-�0���Z
+-�(����
+-�)����
+-�2����
+-�$����.���6�F���e�,�����)�����-����'���1����Y�.���n�'�����>�����#���
�(���(
�;���Q
� ����
�+����
�/����
�6���
+-����A�%���_�5�����5�����)�����&����+���B�,���n�!�����%����������>�����0���?�2���p�+�����@�����#����"���4�&���W�5���~�"�����#�����A�����@���=�%���~������'�����+�����5����!���F�0���h������1�����I�����H���)����r�'�����!���������������/�������1����Q����i�%�����.�����3�����>���
+-�@���I�����������0�����"�����(���
+-�2���3�8���f�%����������*�����*����*���0�&���[�2�����#�����(���������*����%���<�,���b�3����������(����������I����K���`�H����������-���	�6���7�4���n�-�����&����������)����1���>����p���������������������(�����,���!�"���N����q�F����������C�����@���)�:���j�8�����J��������)����E�%���c�1�����3�����3��������# ����B ����a ����| ����� ����� ����� ����� ����� ����!����1!����G!�'���]!�5����!�C����!�����!����"�G���."����v"�����"�2����"�"����"�'����"�,���#����J#����\#�*���o#�9����#�7����#����$�2���$� ���Q$�;���r$�=����$�0����$�/���%� ���M%�$���n%�*����%�E����%�-���&�$���2&�S���W&�;����&�5����&�6���'�$���T'�7���y'� ����'�����'�1����'�
���(�8���)(�,���b(�����(�����(�,����(�����(�/����(����')����F)�<���b)�����)�'����)�-����)�#���*�&���6*�$���]*�����*�$����*�(����*�+����*����+����5+����U+�?���t+�����+�.����+�+���,�"���.,����Q,����p,�,����,�=����,�=����,����0-����A-�E���S-� ����-�&����-�%����-�B���.����J.�9���c.�-����.�(����.�2����.�5���'/�)���]/�!����/�+����/�!����/�,����/�"���$0�L���G0�E����0�Q����0�K���,1�Y���x1� ����1�'����1�'���2�*���C2�+���n2�#����2�,����2�-����2�-���3�4���G3�?���|3�8����3�$����3����4�-���64�6���d4�B����4�*����4����	5���� 5����35����C5����c5�!����5�����5�����5�����5�����5�2����5����16�"���H6�4���k6�����6�2����6�����6����7����7�'���"7����J7�*���f7�����7�����7�)����7�����7�����7����8����8����=8����X8�&���m8�����8�(����8�"����8�$����8�;���"9�=���^9�[����9�F����9�9���?:����y:�����:�%����:�����:� ����:����;����/;�,���F;����s;�
����;�"����;�����;�����;�����;����<�,���2<����_<�!���<�!����<�@����<�.���=��������k��������������������������>������,�������(�������������:��C����������������p��{���������2�������������i��D������������a���Q����q�������J������������v��5������������@���������������E��V��F���������r������l���s���������u���Z���������v������������������:������������������6��;������t������������������o���.������������z��b�����p���������������9�������������������"���������[�������������������l��?���������������A��^�����}���������*��~��X���9��I������S��T��n������!������������w��d������������������������������O������1�����������������n��]��
+-��� ���m���2���������?��������m������r�������������������������������]�������������������������������!������������������/���^��J���������������������������������������������q��d��Q��8�����p��������������������<������������������x������B��y��I�������������<����������D��M����������������������������>����������������o���������h�������@����������v����������������b��������������g���`�����������������E��n��e�������-��w��U������������������������������������������������Z�������s���R�� �������������4���������������-��������������������*����������(�������������������1�������j������J��V������L����)��������A������x���������*�����f���$������X������Q��'��#���K����������������[�������q�������B�����������T������_����������,���������T�������,��'�������s��Z������������!�������1������������f��������=��H���\�����-��5��M��x��������������������i�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��_�����������������������������������U������l�����y�����Q������c��P��������������������������������������������6���r����������������`���������s�����d��5�������������F��f��|�������������������`�������������������c�����\���~��2��E�������
���j�������#�����������	���������k��������������y��	����������1��M����������[����������4��e�����
��P��
+-��������7��W�������������f��L�������F�����������������������������������<�����������	�� ���������������{��g���������Y��������������������������������	���%���������(������b����������������������������|��������*����������{��������������������������������C���3��"���������?������v���)�������=������
+-����������+��������������/��|��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��N������������������������y���`�� ��:��w���}������_�����%��H������c��������������m����������������H���������E������5��>����+�������S�����������+���������Y������������!����������������I����������e����j���������\��z������������u����������������������������������������N��?������z�����t���������W��������������������������)��������$��3��h�����������������c����������������������b��&��A������i���������������������a��Y���������6�������������O��������m�����Y��#���������������q�����N���0����������������9��l��������������%����������������������������������������������������������C��
������K������������
+-��M�������������}�������������g�������V��������������T��t������������������^�����9�����K��
��H���������������>���+�����������������&���������2��a���������4��$��������V���)��������������������������������U��=�������B�������������;���t����������������.��������������������������#��������������������~���������]������������������������/���������������N��������o��0��i���'��8��0������-���D�����������S������������������������W������L��8�����������������������������������{�������������������,�����������������������r�������������&�����B��u�������������k�����������������G�����������������������������6��'��������������������S�������������������������:������(������D�������������������������������������������n���������.�����p������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��R��X��F����������������g��4�����o�����]��O��K��P��\����������������X�������������I�����������z���������������������������������������������������������G����������0�����a��A�����@�����h��U��������������������~��������������<��$������k���������������[��P�����������h���������������3��������������7����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1998-12-02 22:02+01:00
+-Last-Translator: Stanislav Meduna <stano@eunet.sk>
+-Language-Team: Slovak <sk-i18n@rak.isternet.sk>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-2
+-Content-Transfer-Encoding: 8bit
+-�		Pr�stupov� pr�va : �		Atrib�ty         : �	%s [-abkCLNTM][-Dn�zov[=hodnota]] [-i ve�kos�] [-I [-K sekundy]] [-Y cesta] vst_s�bor
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o v�st_s�bor] [vst_s�bor]
+-�	%s [-n netid]* [-o v�st_s�bor] [vst_s�bor]
+-�	%s [-s nettype]* [-o v�st_s�bor] [vst_s�bor]
+-�	Pr�stupov� pr�va: �	Vstupn� �daje typu %s
+-�	N�zov         : %s
+-�	Verejn� k���  : �	Typ             : %s
+-�	Univerz�lne adresy (%u)
+-�	[%d]	N�zov            : %s
+-�	[%u] - [%u bajtov] �
+-%s cache:
+-
+-%15s  cache je povolen�
+-%15Zd  navrhovan� ve�kos�
+-%15ld  sek�nd �ivotnos� pozit�vnych z�znamov
+-%15ld  sek�nd �ivotnos� negat�vnych z�znamov
+-%15ld  �spechov cache pre pozit�vne z�znamy
+-%15ld  �spechov cache pre negat�vne z�znamy
+-%15ld  ne�spechov cache pre pozit�vne z�znamy
+-%15ld  ne�spechov cache pre negat�vne z�znamy
+-%15ld%% �spe�nos� cache
+-%15s  skontrolujte /etc/%s na zmeny
+-�
+-�lenovia skup�n  :
+-�
+-�ivotnos�        : �       rpcinfo -b ��slo_programu ��slo_verzie
+-�       rpcinfo -d ��slo_programu ��slo_verzie
+-�       rpcinfo -p [ po��ta� ]
+-�       rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verzie ]
+-�      nie�     �no�    D�ka �dajov = %u
+-�    Explicitn� �lenovia:
+-�    Explicitn� ne�lenovia:
+-�    Implicitn� �lenovia:
+-�    Implicitn� ne�lenovia:
+-�    �iadni explicitn� �lenovia
+-�    �iadni explicitn� ne�lenovia
+-�    �iadni implicitn� �lenovia
+-�    �iadni implicitn� ne�lenovia
+-�    �iadni rekurz�vni �lenovia
+-�    �iadni rekurz�vni ne�lenovia
+-�    Rekurz�vni �lenovia:
+-�   program verz proto   port
+-�  alebo: � (pravidlo z "%s", riadok %d)� [VO�BA...]� hotovo
+-�"%s", riadok %d: %s�Riadok "Zone %s" a vo�ba -l sa navz�jom vylu�uj��Riadok "Zone %s" a vo�ba -p sa navz�jom vylu�uj��"vst_s�bor" je vy�adovan� pri pou�it� pr�znakov tvorby vzoru.
+-�%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu�%.*s: Nezn�my parameter ARGP_HELP_FMT�%s v z�ne bez pravidiel�%s%s%s:%u: %s%sPredpoklad `%s' nesplnen�.
+-�%s%s%s:%u: %s%sNeo�ak�van� chyba: %s.
+-�%s%sNezn�my sign�l %d
+-�%s: nespr�vne roz��renie znamienka pre %d
+-�%s: <mb_cur_max> mus� by� v��ie ako <mb_cur_min>
+-�%s: C preprocesor zlyhal s v�stupn�m k�dom %d
+-�%s: C preprocesor zlyhal so sign�lom %d
+-�%s: Nie je mo�n� vytvori� %s: %s
+-�%s: Nie je mo�n� vytvori� adres�r %s: %s
+-�%s: Nie je mo�n� vytvori� prepojenie z %s na %s: %s
+-�%s: Nie je mo�n� otvori� %s: %s
+-�%s: Nie je mo�n� odstr�ni� %s: %s
+-�%s: Chyba pri uzatv�ran� %s: %s
+-�%s: Chyba pri ��tan� %s
+-�%s: Chyba pri z�pise %s
+-�%s: Chyba pri z�pise na �tandardn� v�stup �%s: Priestupn� riadok v s�bore nepriestupn�ch sek�nd %s
+-�%s: Nedostatok pam�ti: %s
+-�%s: Vo�ba -L zadan� viac ako raz
+-�%s: Vo�ba -d zadan� viac ako raz
+-�%s: Vo�ba -l zadan� viac ako raz
+-�%s: Vo�ba -p zadan� viac ako raz
+-�%s: Vo�ba -y zadan� viac ako raz
+-�%s: Prive�a argumentov
+-�%s: nie je mo�n� zisti� �as zmeny�%s: pr�kaz bol '%s', v�sledok bol %d
+-�%s: chyba v stavovom automate�%s: nepr�pustn� vo�ba -- %c
+-�%s: chybn� vo�ba -- %c
+-�%s: vo�ba `%c%s' nedovo�uje pou�i� argument
+-�%s: vo�ba `%s' nie je jednozna�n�
+-�%s: vo�ba `%s' vy�aduje argument
+-�%s: vo�ba `--%s' nedovo�uje pou�i� argument
+-�%s: vo�ba `-W %s' nedovo�uje pou�i� argument
+-�%s: vo�ba `-W %s' nie je jednozna�n�
+-�%s: vo�ba vy�aduje argument -- %c
+-�%s: v�stup by prep�sal %s
+-�%s: fat�lna chyba: Nepr�pustn� l_hodnota %d
+-�%s: pred�asn� koniec s�boru�%s: Nie je mo�n� otvori� �%s: nerozpoznan� vo�ba `%c%s'
+-�%s: nerozpoznan� vo�ba `--%s'
+-�%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ]
+-	[ -d adres�r ] [ -L priestupn�_sekundy ] [ -y typ_roku ] [ s�bor ... ]
+-�%s: Pou�itie: %s [ -v ] [ -c limit ] meno_z�ny ...
+-�%s: po�as z�pisu v�stupu: �(CHYBA PROGRAMU) Verzia nezn�ma!?�(CHYBA PROGRAMU) Vo�ba by mala by� rozpoznan�!?�(Nezn�my objekt)
+-�(nezn�ma chyba pri overovan� toto�nosti - %d)�(nezn�my)�*** Zo s�boru `%s' boli odstr�nen� ladiace inform�cie: podrobn� anal�za nie je mo�n�
+-�*�tandardn� vstup*�-o V�STUPN�_S�BOR [VSTUPN�_S�BOR]...
+-[ V�STUPN�_S�BOR [VSTUPN�_S�BOR]...]�Po�koden� sekcia .lib v a.out�; ni��ia verzia = %lu, vy��ia verzia = %lu�; d�vod = �<%s> and <%s> s� nepr�pustn� n�zvy pre rozsah�<SP> znak nesmie by� v triede `%s'�<SP> znak nie je v triede `%s'�?�Zru�en��Pr�stupov� pr�va : �Pr�stup k po�kodenej zdie�anej kni�nici�Adresa je pou��van��Trieda adries nie je podporovan� po��ta�om�Trieda adries nie je podporovan� protokolom�Chyba pri zverejnen��Bud�k�Pr�li� dlh� zoznam argumentov�Pokus o odstr�nenie nepr�zdnej tabu�ky�Pokus o pou�itie prive�a zdie�an�ch kni�n�c�Overenie pr�v �spe�n��Overenie pr�v ne�spe�n��POCHYBN� OBJEKT
+-�Chybn� adresa�Chybn� deskriptor s�boru�Chybn� form�t s�boru rezov p�sma�Chybn� spr�va�Chybn� volanie syst�mu�Chybn� hodnota ai_flags�Presn� s�lad s POSIX�Bin�rne �daje
+-�Vy�adovan� blokov� zariadenie�Probl�m pri volan� poll pre v�eobecn� vysielanie�Preru�en� r�ra�Chyba na zbernici�CDS�Prekro�en� �asov� limit pre procesor��ivotnos� cache vypr�ala�Pr�stup k potrebnej zdie�anej kni�nici nie je mo�n��Pripojenie k serveru obsluhuj�cemu t�to dom�nu nie je mo�n��Komunik�cia s portmapperom nie je mo�n��Komunik�cia s ypbind nie je mo�n��Komunik�cia s ypserv nie je mo�n��Nie je mo�n� prideli� pam��Priradenie po�adovanej adresy nie je mo�n��Nie je mo�n� vytvori� z�suvku pre broadcast rpc�Nie je mo�n� priamo spusti� zdie�an� kni�nicu�Nie je mo�n� pou�i� viac ako jeden pr�znak tvorby s�boru!
+-�Nie je mo�n� prija� odpove� na broadcast�Nie je mo�n� zaregistrova� slu�bu�Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu�Nie je mo�n� vysla� broadcast bal�k�Nie je mo�n� nastavi� pre socket vo�bu SO_BROADCAST�Nie je mo�n� zada� viac ako jeden vstupn� s�bor!
+-�Pr�znaky netid a inetd nie je mo�n� pou�i� s��asne!
+-�Nie je mo�n� pou�i� pr�znak netid bez TIRPC!
+-�Pri pou�it� nov�ho �t�lu nie je mo�n� pou�i� pr�znaky tabu�ky!
+-���slo kan�lu mimo povolen�ho rozsahu�Odde�ova� znakov       : %c
+-�Detsk� proces skon�il�Opr�vnenia klienta s� neposta�uj�ce�St�pce                 :
+-�Chyba komunik�cie pri vysielan��Kompil�cia �pecifik�cie n�rodn�ho prostredia�Po��ta� k�pil farmu�V�po�et ve�kosti tabu�ky pre triedy znakov (m��e chv��u trva�)...�V�po�et ve�kosti tabu�ky pre inform�cie o trieden� (m��e chv��u trva�)...�Spojenie odmietnut��Spojenie zru�en� druhou stranou��asov� limit pre spojenie vypr�al�Pokra�ovanie�Konverzia k�dovania zadan�ch s�borov na in�.�Zmeni� k��� na mal� p�smen��Copyright (C) %s Free Software Foundation, Inc.
+-Toto je vo�ne ��rite�n� software; pre podmienky kop�rovania pozri
+-zdrojov� k�d.Na software nie je poskytovan� �IADNA z�ruka.
+-�Nie je mo�n� vytvori� �urn�lov� s�bor "%s"�Vytvori� C hlavi�kov� s�bor N�ZOV obsahuj�ci defin�cie symbolov�Vytvori� v�stupn� s�bor aj pri v�skyte varovan��Vytvorenie jednoduchej DB datab�zy z textov�ho vstupu.��as vytvorenia   : %s�DES z�znam pre sie�ov� n�zov %s nie je jednozna�n�
+-�ADRES�R
+-�DNANS�DNS�Datab�za pre tabu�ku neexistuje�Datab�za je pou��van��Implicitn� pr�st. pr�va  :
+-�Je potrebn� zada� cie�ov� hodnotu�Zariadenie nie je pr�d�Zariadenie nie je nakonfigurovan��Zariadenie alebo in� zdroj je pou��van��Diffie-Hellmann (%d bitov)
+-�Adres�r          : %s
+-�Adres�r nie je pr�zdny�Diskov� kv�ta prekro�en��Nesp���a� samostatn� proces a zobrazova� spr�vy na aktu�lnom termin�li�Po�as tvorby datab�zy nevypisova� spr�vy�Nepou��va� existuj�ci katal�g, vn�ti� nov� v�stupn� s�bor�Dom�na nie je pripojen��EMT preru�enie�Z�ZNAM
+-��ifrovan� �daje
+-�Nes�lad z�znamu s tabu�kou�Chyba v RPC subsyst�me�Chyba pri pr�stupe NIS+ s�boru studen�ho �tartu. Je NIS+ nain�talovan�?�Chyba v nezn�mom chybovom syst�me: �Chyba po�as komunik�cie s proced�rou sp�tn�ho volania�Chyba: s�bor .netrc je �itate�n� pre ostatn�ch.�Stredisko pln��Chybn� form�t spustite�n�ho s�boru�FAT�LNA CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'�S�BOR obsahuje mapovanie symbolick�ch n�zvov na UCS4 hodnoty�Zlyhalo (ne�pecifikovan� chyba)�Deskriptor s�boru v chybnom stave�S�bor existuje�Vz�jomn� zablokovanie pri zamykan� s�boru�Meno s�boru pr�li� dlh��Prekro�en� limit d�ky s�boru�S�bor je pr�li� ve�k��Chyba zre�azenia prv�/�al���V�nimka pohyblivej r�dovej �iarky�Adres�r vy�aduje �pln� resynchroniz�ciu�Funkcia nie je implementovan��SKUPINA
+-�Nezmysly v ARGP_HELP_FMT: %s�Tvorba katal�gu spr�v.\vAk je VSTUPN�_S�BOR -, vstup je na��tan� zo �tandardn�ho vstupu. Ak je
+-V�STUPN�_S�BOR -, v�stup je zap�san� na �tandardn� v�stup.
+-�V�eobecn� chyba syst�mu�Z�ska� inform�ciu �pecifick� pre n�rodn� prostredie.�Vyp�sa� kr�tky n�vod na pou�itie�Vyp�sa� t�to pomoc�V�a�n� chyba�Skupina          : %s
+-�Pr�znaky skupiny :�Z�znam skupiny pre skupinu "%s.%s":
+-�Po�ka� SECS sek�nd (implicitne 3600)�Zavesenie�Nen�jden� "%d" v cache skup�n!�Nen�jden� "%d" v cache hesiel!�Nen�jden� "%s" v cache skup�n!�Nen�jden� "%s" v cache po��ta�ov!�Nen�jden� "%s" v cache hesiel!�Po��ta� je vypnut��Nepodarilo sa n�js� meno po��ta�a�V/V mo�n��VSTUPN�_S�BOR V�STUPN�_S�BOR
+--o V�STUPN�_S�BOR VSTUPN�_S�BOR
+--u VSTUPN�_S�BOR�IOT preru�enie�IVY�Identifik�tor odstr�nen��Nepr�pustn� in�trukcia�Nepr�pustn� typ objektu pre oper�ciu�Nepr�pustn� nastavenie poz�cie�Nevhodn� typ alebo form�t s�boru�Nevhodn� ioctl pre toto zariadenie�Nevhodn� oper�cia pre proces v pozad���iados� o inform�ciu�Inform�cia:�Vstupn� s�bory:��pecifik�cia vstupno/v�stupn�ho form�tu:�Chyba vstupu/v�stupu�Intern� chyba NIS�Intern� chyba ypbind�Preru�enie�Preru�en� volanie syst�mu�Preru�en� volanie syst�mu by malo by� znovu spusten��Neplatn� objekt pre oper�ciu�Nepr�pustn� argument�Nepr�pustn� sp�tn� odkaz�Nepr�pustn� n�zov triedy znakov�Neplatn� opr�vnenie klienta�Neplatn� overenie klienta�Nepr�pustn� znak triedenia�Nepr�pustn� obsah \{\}�Nepr�pustn� odkaz medzi zariadeniami�Nepr�pustn� v�mena�Nepr�pustn� alebo nekompletn� viacbajtov� alebo �irok� znak�Nepr�pustn� predch�dzaj�ci regul�rny v�raz�Nepr�pustn� koniec rozsahu�Nepr�pustn� regul�rny v�raz�Nepr�pustn� k�d �iadosti�Nepr�pustn� deskriptor �iadosti�Neplatn� overenie servera�Neplatn� priehradka�Je adres�r�Je pomenovan� s�bor�Kerberos.
+-�Zabit��ODKAZ
+-�LOCAL z�znam pre UID %d v adres�ri %s nie je jednozna�n�
+-��rove� 2 zastaven���rove� 2 nie je synchronizovan���rove� 3 zastaven���rove� 3 nastaven� na v�chodzie hodnoty�Odkaz odkazuje na nepr�pustn� n�zov�Odkaz bol zni�en����slo odkazu mimo rozsahu�Typ odkazovan�ho objektu : �Odkazuje na : %s
+-�Meno miestnej dom�ny nie je nastaven��Chyba pri pridelen� miestnych zdrojov�Po��ta� nie je zapojen� v sieti�Chybne formovan� alebo nepr�pustn� n�zov�Povinn� alebo volite�n� argumenty dlh�ch tvarov volieb s� povinn� alebo volite�n� pre �ubovo�n� zodpovedaj�ce kr�tke vo�by.�Hlavn� server :
+-�Hlavn� server zanepr�zdnen�, �pln� prenos prepl�novan�.�Pridelenie pam�ti zlyhalo�Pam� vy�erpan��Pr�li� dlh� spr�va�Ch�baj�ci alebo chybne formovan� atrib�t��as zmeny        :%s�Modifik�cia zlyhala�Oper�cia zmeny zlyhala�Modifikova� v�stupn� form�t:�Pokus o spojenie cez viac uzlov�N�ZOV�N�ZOV
+-[-a|-m]�NIS�Rozdielne verzie NIS klienta a serveru - nie je mo�n� poskytn�� slu�bu�Datab�za m�p NIS je chybn��NIS+ oper�cia zlyhala�NIS+ server nie je dostupn��Slu�ba NIS+ nie je dostupn� alebo nain�talovan���IADNY OBJEKT
+-�PO�ET�N�zov : '%s'
+-�D�mon cache slu�by n�zvov.�N�zov nie je obsluhovan� t�mto serverom�Meno nie je v sieti jednozna�n��N�zov alebo slu�ba nezn�me�N�zov/z�znam nie s� jednozna�n��Zadan� objekt nie je preh�ad�vate�n��Potrebuje overovac� objekt�Sie� zru�ila spojenie (probl�m so vzdialen�m po��ta�om)�Sie� je nefunk�n��Sie� nie je dostupn��CSI �trukt�ra nedostupn��XENIX semaf�ry nedostupn��N�zov po��ta�a nem� priraden� adresu�N�zov nem� priraden� adresu��iadny anode�Nie je mo�n� prideli� pam� pre V/V oper�cie�Detsk� procesy neexistuj��D�ta nie s� k dispoz�cii�Na serveri u� nie je �iadne miesto pre s�bory�Z�mky nie s� k dispoz�cii��iadna zhoda�Nen�jden� �iadne m�dium��iadna spr�va �elan�ho typu��iadne �al�ie z�znamy v datab�ze��iadny predch�dzaj�ci regul�rny v�raz�Nie s� registrovan� �iadne vzdialen� programy
+-�Cesta k po��ta�u neexistuje�Na zariaden� u� nie je �iadne miesto�Tak� zariadenie neexistuje�Adres�r alebo s�bor neexistuje�Tento k��� v datab�ze neexistuje�T�to mapa sa v dom�ne servera nenach�dza�Tento proces neexistuje�Zaznamenan� priestor n�zvov mimo NIS+�Neopravite�n� chyba pri rie�en� n�zvu��iadne.
+-�Nen�jden�, tak�to n�zov neexistuje�Nejde o pomenovan� XENIX s�bor�Nie je adres�r�Nen�jden��Nie je hlavn� server pre t�to dom�nu�Nie je vlastn�kom�Po�et st�pcov          : %d
+-�Po�et objektov       : %u
+-���seln� rozsah mimo dom�ny defin�cie funkcie���seln� v�sledok mimo povolen�ho rozsahu�Objekt #%d:
+-�N�zov objektu    : %s
+-�Typ objektu      : �Objekt je vzdialen��Existuje objekt s rovnak�m n�zvom�Nep�rny po�et �vodzoviek�T�to vo�ba je dostupn� iba superu��vate�ovi!�Oper�cia je u� rozpracovan��Oper�cia nie je povolen��Oper�cia nie je podporovan��Oper�cia prebieha�Oper�cia by blokovala�Pr�dov� zdroje vy�erpan��Riadenie v�stupu:�V�ber v�stupu:�Vlastn�k         : %s
+-�S�KROMN�
+-�Bal�k nie je nain�talovan��Chyba anal�zy: %s��iasto�n� �spech�Odovzdan� objekt nie je na serveri t�m ist�m objektom�Pr�stup odmietnut��V�padok nap�jania�Pred�asn� koniec regul�rneho v�razu�Vyp�sa� obsah datab�zov�ho s�boru, jeden z�znam na riadok�Vyp�sa� �tatistiku aktu�lnej konfigur�cie�Vyp�sa� viac spr�v�Vyp�sa� verziu programu�Pravdepodobn� �spech�Pravdepodobne nen�jden��Profilovac� �asova� vypr�al�Ovl�da� protokolu nepripojen��Chyba protokolu�Rodina protokolov nie je podporovan��Protokol nie je k dispoz�cii�Protokol nie je podporovan��Protokol nie je socketom podporovan��Nepr�pustn� ot�zka pre dan� tabu�ku�Koniec�RFS-�pecifick� chyba�Chybn� RPC proced�ra pre program�Zlyhal RPC pri NIS oper�cii�RPC program nie je k dispoz�cii�Chybn� verzia RPC programu�RPC �trukt�ra je chybn��Chybn� verzia RPC�RPC: (nezn�mny chybov� k�d)�RPC: Chyba pri overen� pr�v�RPC: Nie je mo�n� dek�dova� v�sledok�RPC: Nie je mo�n� zak�dova� argumenty�RPC: Zlyhalo (ne�pecifikovan� chyba)�RPC: Nekompatibiln� verzie RPC�RPC: Chyba portmappera�RPC: Proced�ra nie je k dispoz�cii�RPC: Program nie je registrovan��RPC: Program nie je k dispoz�cii�RPC: Nes�hlas� program alebo verzia�RPC: Chyba vzdialen�ho syst�mu�RPC: Server nem��e dek�dova� argumenty�RPC: �spech�RPC: �asova� vypr�al�RPC: Nie je mo�n� prij�ma��RPC: Nie je mo�n� vysiela��RPC: Nezn�my po��ta��RPC: Nezn�my protokol�RSA (%d bitov)
+-�RTLD_NEXT je pou�it� pre k�d, ktor� nie je dynamicky zaveden��Pre��ta� a vyp�sa� profilovacie �daje zdie�an�ho objektu�Na��ta� �daje o konfigur�cii z N�ZOV�S�borov� syst�m dovo�uje len ��tanie�Sign�l re�lneho �asu %d�Regul�rny v�raz pr�li� ve�k��Vzdialen� V/V chyba�Vzdialen� adresa sa zmenila�Odstr��te heslo alebo zak�te ��tanie s�boru ostatn�mi.�Znovuotvorenie zdie�an�ho objektu `%s' zlyhalo�Replika      :
+-�Chyby hl�ste na adrese %s.
+-�Chyby hl�ste na adrese <bugs@gnu.org> - pou�ite skript `glibcbug'.
+-�Chybn� argumenty �iadosti�Chyba resolvera 0 (�iadna chyba)�Vn�torn� chyba resolvera�Bolo zabr�nen� vz�jomn�mu zablokovaniu�Zdroj bol straten��Zdroj je do�asne nepr�stupn��V�sledky poslan� proced�re sp�tn�ho volania�ZDIE�_OBJEKT [PROF_�DAJE]�SUNYP�Preh�ad�van� cesta     : %s
+-�Chyba segment�cie�Server zanepr�zdnen�, sk�ste znovu�Vy�erpan� pam� servera�Server odmietol opr�vnenie�Server odmietol overenie�Servname nie je pre ai_socktype podporovan��Nastavi� n�zov programu�Zastavi� server�Sign�l 0�Socketov� oper�cia na objekte, ktor� nie je socket�Typ socketu nie je podporovan��Software sp�sobil zru�enie spojenia�Bohu�ia� - nie ste superu��vate�
+-�Zdrojov� defin�cie sa nach�dzaj� v S�BORe�Chyba srmount�Chyba z�sobn�ka�Zastaral� odkaz na NFS s�bor�Spusti� PO�ET vl�kien�Stav                 : %s
+-�Zastaven��Zastaven� (sign�l)�Zastaven� (vstup z termin�lu)�Zastaven� (v�stup na termin�l)�Chyba r�ry pr�dov��trukt�ra potrebuje opravu��spech�Potla�i� varovn� a informa�n� spr�vy�Symbolick� n�zvy znakov s� definovan� v S�BORe�Chyba syst�mu�Syst�mov� inform�cie:�Pridelenie syst�mov�ch zdrojov zlyhalo�Syst�mov� adres�r pre mapy znakov:    : %s
+-                      mapy reperto�rov: %s
+-                      cestu locale    : %s
+-%s�TABU�KA
+-�Typ tabu�ky            : %s
+-�Do�asn� chyba pri rie�en� n�zvu�Ukon�en��Spustite�n� s�bor je pou��van��Nasleduj�ci zoznam obsahuje v�etky zn�me znakov� sady. To nutne neznamen�,
+-�e v�etky kombin�cie t�chto n�zvov m��u by� pou�it� pre argumenty Z a DO.
+-Jedna sada znakov m��e by� uveden� pod viacer�mi n�zvami (aliasmi).
+-  Niektor� z n�zvov nie s� oby�ajn� re�azce, ale regul�rne v�razy, ktor�
+-�pecifikuj� mo�n� parametre programu.
+-
+-  ��ivotnos�       : ��asova� vypr�al�Prive�a atrib�tov�Prive�a �rovn� symbolick�ch odkazov�Prive�a odkazov�Prive�a otvoren�ch s�borov�Prive�a otvoren�ch s�borov v syst�me�Prive�a procesov�Prive�a odkazov - nie je mo�n� rozdeli��Prive�a pou��vate�ov�Trasovacie/ladiace preru�enie�Koncov� sp�tn� lom�tko�Prekladac� program skon�il�Koncov� komunika�n� bod je u� spojen��Koncov� komunika�n� bod nie je spojen��Pou�ite `%s --help' alebo `%s --usage' pre viac inform�ci�.
+-�Sk��am %s...
+-�Typ  : %s
+-�NEZNAMY�Nie je mo�n� overi� toto�nos� NIS+ klienta�Nie je mo�n� overi� toto�nos� NIS+ servera�Nie je mo�n� vytvori� sp�tn� volanie�Nie je mo�n� vytvori� proces na serveri�Nezn�me (typ = %d, bitov = %d)
+-�Nezn�me k���ov� slovo v .netrc: %s�Nezn�my chybov� k�d NIS�Nezn�ma datab�za %s
+-�Nezn�ma chyba�Nezn�ma chyba �Nezn�my po��ta��Nezn�my objekt�Nezn�ma vo�ba: %s %s %s�Nezn�ma chyba resolvera�Nezn�ma chyba servera�Nezn�my sign�l %d�Nezn�ma chyba syst�mu�Nezn�ma chyba ypbind�Nep�rov� ( or \(�Nep�rov� ) or \)�Nep�rov� [ or [^�Nep�rov� \{�Nerozpoznan� premenn� `%s'�Urgentn� V/V stav�Pou�itie:�Pou�itie: %s meno_premennej [cesta]
+-�Pou�itie: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verzie ]
+-�Pou��vate�om definovan� sign�l 1�Pou��vate�om definovan� sign�l 2�Hodnota je pre dan� d�tov� typ prive�k��Vypr�al virtu�lny �asova���udn� v�sledok vykonania programu�Okno sa zmenilo�Vyp�sa� n�zvy dostupn�ch znakov�ch s�d�Vyp�sa� n�zvy dostupn�ch n�rodn�ch prostred��Vyp�sa� n�zvy vybran�ch kateg�ri��Vyp�sa� n�zvy vybran�ch k���ov�ch slov�Zap�sa� v�stup do s�boru S�BOR�Autor: %s.
+-�Chybn� typ m�dia�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-��no, 42 je v�znam �ivota�Tentokr�t si to skuto�ne poondial�Koncov� �as pokra�ovacieho riadku z�ny nie je v��� ako koncov� �as predch�dzaj�ceho riadku�[S�BOR...]�Defin�cia `%1$s' nekon�� `END %1$s'�`%s' nie s� spr�vne profilovacie �daje pre `%s'�`-1' mus� by� posledn�m z�znamom v poli `%s' kateg�rie `%s'�`...' m��e by� pou�it� iba v z�znamoch `...' a `UNDEFINED'�`from' je o�ak�van� po prvom argumente `collating-element'�`from' re�azec v deklar�cii elementu triedenia obsahuje nezn�my znak�ai_family nie je podporovan��ai_socktype nie je podporovan��u� be���argument pre <%s> mus� by� jeden znak�argument pre `%s' mus� by� jeden znak�auth_none.c - Fat�lna chyba marshallingu�authunix_create: nedostatok pam�ti
+-�chybn� argument�chybn� vlastn�k�pr�zdne pole OD v riadku Link�pr�zdne pole DO v riadku Link�blok uvo�nen� dvakr�t
+-�pochybn� mcheck_status, kni�nica m� chyby
+-�broadcast: ioctl (z�skanie konfigur�cie rozhrania)�broadcast: ioctl (z�skanie nastaven� rozhrania)�prete�enie vyrovn�vacej pam�ti�cache_set: nebolo mo�n� prideli� rpc vyrovn�vaciu pam��cache_set: obe� nen�jden��cache_set: obe� nen�jden��nie je mo�n� n�js� skratku �asovej z�ny pre pou�itie hne� po koncovom �ase�nie je mo�n� znovu prideli� ��slo proced�ry %d
+-�nie je mo�n� vykona� `stat' pre s�bor n�rodn�ho prostredia `%s'�nie je mo�n� prideli� pam� pre symbolick� �daje�nie je mo�n� vytvori� intern� deskriptor�nie je mo�n� vytvori� intern� deskriptory�nie je mo�n� povoli� socketu prij�ma� spojenia: %s�nie je mo�n� n�js� preprocesor: %s 
+-�nie je mo�n� n�js� �iadny C preprocesor (cpp)
+-�nie je mo�n� spracova� star� verziu �iadosti %d; aktu�lna verzia je %d�nie je mo�n� vlo�i� element triedenia `%.*s'�nie je mo�n� vklada� do v�slednej tabu�ky�nie je mo�n� vlo�i� nov� symbol triedenia: %s�nie je mo�n� na��ta� profilovacie �daje�nie je mo�n� otvori��nie je mo�n� otvori� datab�zov� s�bor `%s': %s�nie je mo�n� otvori� vstupn� s�bor `%s'�nie je mo�n� otvori� s�bor defin�cie n�rodn�ho prostredia `%s'�nie je mo�n� otvori� v�stupn� s�bor�nie je mo�n� otvori� v�stupn� s�bor `%s'�nie je mo�n� otvori� v�stupn� s�bor `%s' pre kateg�riu `%s'�nie je mo�n� otvori� socket `%s'�nie je mo�n� spracova� �pecifik�ciu poradia�nie je mo�n� na��ta� adres�r znakov�ch s�d `%s'�nie je mo�n� na��ta� konfigura�n� s�bor; to je fat�lne�nie je mo�n� ��ta� od klienta�nie je mo�n� pre��ta� hlavi�ku z `%s'�nie je mo�n� na��ta� adres�r n�rodn�ch prostred� `%s'�nie je mo�n� pre��ta� s�bor n�rodn�ho prostredia `%s'�nie je mo�n� na��ta� mapu reperto�ru `%s'�nie je mo�n� na��ta� �tatistick� �daje�nie je mo�n� vykona� stat() s�boru `%s': %s�nie je mo�n� zap�sa� v�stupn� s�bory do `%s'�nie je mo�n� zap�sa� v�sledok: %s�nie je mo�n� zap�sa� �tatistiku: `%s'�nie je mo�n� p�sa� klientovi��daje kateg�rie po�adovan� viac ako raz - to by sa nemalo sta��znak %s'%s' v triede `%s' mus� by� v triede `%s'�znak %s'%s' v triede `%s' nesmie by� v triede `%s'�znak <SP> nie je definovan� v znakovej sade�znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota�trieda znakov `%s' je u� definovan��znakov� sada `%s' je u� definovan��s�bor znakovej sady `%s' nebol n�jden��clnt_raw.c - Fat�lna chyba pri serializ�cii hlavi�ky.�clnttcp_create: nedostatok pam�ti
+-�clntunix_create: nedostatok pam�ti
+-�element triedenia `%.*s' uveden� viac ako raz - riadok ignorovan��symbol triedenia `%.*s' uveden� viac ako raz - riadok ignorovan��po `%s' je o�ak�van� symbol triedenia�spojenie s adresou %s: �o�ak�van� kon�tanta alebo identifik�tor�konverzia z `%s' do `%s' nie je podporovan��konverzia zastaven� kv�li probl�mu pri z�pise v�stupu�nebolo mo�n� vytvori� rpc server
+-�nebolo mo�n� zaregistrova� program %d verzie %d
+-�datab�za [k��� ...]�implicitn� s�bor znakovej sady `%s' nebol n�jden��pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je '+' ani '-'�pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je jeden znak�duplicitn� meno znaku `%s'�duplicitn� defin�cia elementu triedenia�duplicitn� defin�cia znaku `%.*s'�duplicitn� k����duplicitn� defin�cia sady�duplicitn� meno z�ny %s (s�bor "%s", riadok %d)�duplicitn� identifik�tor spr�vy�duplicitn� ��slo spr�vy�pr�zdny znakov� re�azec�pr�zdne meno v�hy - riadok ignorovan��enablecache: vyrovn�vacia pam� je u� povolen��enablecache: nebolo mo�n� prideli� vyrovn�ciu pam��enablecache: nebolo mo�n� prideli� d�ta pre vyrovn�vaciu pam��enablecache: nebolo mo�n� prideli� frontu pre vyrovn�vaciu pam��k�dovanie v�stupu�k�dovanie p�vodn�ho textu�koncov� bod pokra�ovania je v��� ako po�iato�n��chyba po�as zatv�rania vstupu `%s'�chyba po�as zatv�rania v�stupn�ho s�boru�chyba po�as zatv�rania s�boru profilovac�ch �dajov�chyba po�as vkladania elementu triedenia do hash-tabu�ky�chyba po�as vkladania do hash-tabu�ky�po�as ��tania vstupu�pre `copy' je o�ak�van� re�azcov� argyment�o�ak�van� pokra�ovac� riadok nebol n�jden��nepodarilo sa na��ta� zdie�an� objekt `%s'�nepodarilo sa na��ta� symbolick� �daje�nepodarilo sa mmap-ova� s�bor profilovac�ch �dajov�nepodarilo sa od�tartova� konverziu�chyba po�as z�pisu �dajov kateg�rie `%s'�fcntl: F_SETFD�pole `%s' keteg�rie `%s' nie je definovan��pole `%s' kateg�rie `%s' nedefinovan��s�bor '%s' u� existuje a m��e by� prep�san�
+-�hodnota od pre `collating-element' mus� by� re�azec�fstat sa nepodaril�smetie za koncom �pecifik�cie k�du znaku�smetie za koncom ��sla�smetie za koncom hodnoty posunutia v re�azci %d po�a `era' kateg�rie `%s'�smetie za koncom po�iato�n�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'�smetie za koncom koncov�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'�tvorba grafu volan��tvorba jednoduch�ho profilu s po�tami a tikmi�get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)�getent - z�ska� z�znamy z administrat�vnej datab�zy.�handle_request: �iados� prijat� (verzia = %d)�pevn� odkaz zlyhal, pou�it� symbolick��niekde existuje pevn� odkaz�nepr�pustn� pole CORRECTION v riadku Leap�nepr�pustn� pole Rolling/Stationary v riadku Leap�nepr�pustn� znak v re�azci�nepr�pustn� znak v s�bore: �nepr�pustn� element triedenia�nepr�pustn� defin�cia�zadan� nepr�pustn� k�dovanie�chybn� escape-sekvencia na konci re�azca�nepr�pustn� vstupn� sekvencia na poz�cii %ld�nepr�pustn� men� pre rozsah znakov�chybn� nettype :'%s'
+-�nepr�pustn� ��slo pre posunutie v re�azci %d po�a `era' kateg�rie `%s'�nepr�pustn� ��slo sady�nepr�pustn� po�iato�n� d�tum v re�azci %d po�a `era' kateg�rie `%s'�nepr�pustn� koncov� d�tum v re�azci %d po�a `era' kateg�rie `%s'�limit implement�cie: maxim�lne mno�stvo tried znakov je %d�limit implement�cie: maxim�lne mno�stvo s�d znakov je %d�nekompletn� znak alebo prera�ovacia sekvencia na konci vyrovn�vacej pam�ti�nespr�vne form�tovan� s�bor�vstupn� riadok nezn�meho typu�vn�torn� chyba (nespr�vny deskriptor)�vn�torn� chyba - addtype zavolan� s chybn�m isdst�vn�torn� chyba - addtype zavolan� s chybn�m ttisgmt�vn�torn� chyba - addtype zavolan� s chybn�m ttisstd�vn�torn� chyba %s na riadku %u�nepr�pustn� posunutie vo�i UTC�nepr�pustn� form�t skratky�nepr�pustn� de� mesiaca�nepr�pustn� koncov� rok�nepr�pustn� priestupn� rok�nepr�pustn� m�d pre dlopen()�nepr�pustn� n�zov mesiaca�nepr�pustn� ulo�en� �as�nepr�pustn� po�iato�n� rok�nepr�pustn� �as v dni�nepr�pustn� n�zov d�a�d�ka k���a v �iadosti pr�li� dlh�: %Zd�riadok za pokra�ovan�m mus� obsahova� defin�ciu znaku�riadok pred pokra�ovan�m neobsahuje defin�ciu pre znakov� kon�tantu�pridlh� riadok�vyp�� v�etky zn�me znakov� sady�s�bor n�rodn�ho prostredia `%s' pou�it�  v pr�kaze `copy' nebol n�jden��lstat zlyhal�nespr�vny riadok ignorovan��zlyhalo mapovanie tabu�ky re�azcov hlavi�ky sekcie�zlyhalo mapovanie hlavi�iek sekcie�pam� pred pridelen�m blokom prep�san�
+-�pam� za koncom pridelen�ho bloku prep�san�
+-�nedostatok pam�ti�nedostatok pam�ti
+-�pam� je konzistentn�, kni�nica je chybn�
+-�ch�ba form�t �ry v re�azci %d v poli `era' kateg�rie `%s'�ch�ba meno �ry v re�azci %d v poli `era' kateg�rie `%s'�bezmenn� pravidlo�nie je �pecifikovan� p�vodn� ani cie�ov� k�dovanie�netname2user: (nis+ lookup): %s
+-�netname2user: DES z�znam pre %s v adres�ri %s nejednozna�n��netname2user: LOCAL z�znam pre %s v adres�ri %s nejednozna�n��netname2user: ch�baj�ci zoznam id skup�n v '%s'.�netname2user: n�zov princip�la '%s' pr�li� dlh��netname2user: nemal by ma� uid 0�program %d nebol nikdy registrovan�
+-�nezadan� <Uxxxx> alebo <Uxxxxxxxx> hodnota�pre pole `%s' v kateg�rii `%s' neexistuje spr�vny regul�rny v�raz: %s�s pravidlom sa nezhoduje �iadny de� v mesiaci�neexistuje defin�cia pre `UNDEFINED'�nebol zadan� n�zov s�boru pre profilovacie �daje a zdie�an� objekt `%s' nem� soname�pri pou�it� `copy' nem� by� zadan� �iadne in� k���ov� slovo�v�stupn� s�bor nebol vytvoren� kv�li v�skytu varovan��nebola zadan� mapa reperto�ru: nie je mo�n� pokra�ova��nebolo zadan� �iadne symbolick� meno�nebolo zadan� �iadne symbolick� meno pre koniec rozsahu�symbol `%s' nem� definovan� v�hu�nie je regul�rny s�bor�nscd konfigur�cia:
+-
+-%15d  ladiaca �rove� servera
+-�nscd nebe��!
+-�po defin�cii CHARMAP m��u nasledova� iba defin�cie WIDTH�p�vodn� k�dovanie nebolo zadan� pomocou `-f'�v�stupn� s�bor�pmap_getmaps rpc probl�m�poll: chyba protokolu po�as pr�pravy okruhu
+-�chyba preprocesora�vyp�sa� zoznam ciest po�tov a po�et ich pou�it��vypisova� inform�ciu o postupe�probl�my po�as ��tania `%s'�profilovacie �daje `%s' nes�hlasia so zdie�an�mobjektom `%s'�program %lu nie je dostupn�
+-�program %lu verzie %lu nie je dostupn�
+-�program %lu verzie %lu pripraven� a �akaj�ci
+-�rcmd: poll (nastavenie stderr): %m
+-�rcmd: socket: V�etky porty s� pou�it�
+-�rcmd: write (nastavenie stderr): %m
+-�registerrpc: nedostatok pam�ti
+-�opakovan� moment priestupnej sekundy�s�bor mapy reperto�ru `%s' nebol n�jden��rpcgen: chyba k�dovania zoznamu argumentov
+-�rpcgen: prive�a defines
+-�rpcinfo: %s je nezn�my po��ta�
+-�rpcinfo: %s je nezn�ma slu�ba
+-�rpcinfo: Nie je mo�n� zru�i� registr�ciu programu %s verzie %s
+-�rpcinfo: broadcast zlyhal: %s
+-�rpcinfo: nie je mo�n� spoji� sa s portmapperom�rovnak� meno pravidla vo viacer�ch s�boroch�ne�pln� ��tanie k���a �iadosti: %s�ne�pln� ��tanie �iadosti: `%s'�ne�pln� z�pis v %s: %s�socket: chyba protokolu pri pr�prave okruhu
+-�poradie triedenia `forward' a `backward' sa navz�jom vylu�uj���pecifik�cia v�h triedenia pre symbol triedenia ned�va zmysel��tandardn� vstup��tandardn� v�stup�nepr�pustn� po�iato�n� d�tum v re�azci %d v poli `era' kateg�rie `%s'�po�iato�n� rok v��� ako koncov��po�iato�n� rok prive�k� pre zobrazenie�po�iato�n� rok primal� pre zobrazenie�nepr�pustn� koncov� d�tum v re�azci %d v poli `era' kateg�rie `%s'�svc_run: - select zlyhal�svc_tcp.c - nie je mo�n� vykona� getsockname alebo listen�svc_tcp.c - probl�m pri vytv�ran� tcp socketu�svc_tcp: makefd_xprt: nedostatok pam�ti
+-�svc_unix.c - probl�m pri vytv�ran� AF_UNIX socketu�svc_unix.c - nem��em vykona� getsockname alebo listen�svc_unix: makefd_xprt: nedostatok pam�ti
+-�svctcp_create: nedostatok pam�ti
+-�svcudp_create - nem��em vykona� getsockname�svcudp_create: nedostatok pam�ti
+-�svcudp_create: probl�m pri vytv�ran� socketu�svcunix_create: nedostatok pam�ti
+-�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu elementu�symbol pre viacznakov� element triedenia `%.*s' duplikuje in� element�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu in�ho symbolu�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu symbolu�symbol pre viacznakov� element triedenia `%.*s' duplikuje symbolick� meno v znakovej sade�chyba syntaxe v defin�cii %s: %s�chyba syntaxe v direkt�ve `order_start'�chyba syntaxe v defin�cii triedy znakov�chyba syntaxe v defin�cie konverzie znakov�chyba syntaxe v defin�cii poradia triedenia�chyba syntaxe v defin�cii triedenia�chyba syntaxe v defin�cii kateg�rie LC_CTYPE�chyba syntaxe v defin�cii novej triedy znakov�chyba syntaxe v defin�cii novej znakovej sady�chyba syntaxe v defin�cii n�rodn�ho prostredia spr�v�chyba syntaxe v defin�cii n�rodn�ho prostredia pe�a�n�ch hodn�t�chyba syntaxe v defin�cii n�rodn�ho prostredia pre ��sla�chyba syntaxe v �pecifik�cii poradia�chyba syntaxe v prol�gu: %s�chyba syntaxe v defin�cii mapy reperto�ru: %s�chyba syntaxe v defin�cii n�rodn�ho prostredia pre �as�chyba syntaxe: nie je vn�tri sekcie defin�cie n�rodn�ho prostredia�k�dovanie cie�a nebolo zadan� pomocou `-t'�toto je prv� defin�cia��as men�� ako nula�prete�enie �asu�prim�lo bajtov v k�dovan� znaku�prive�a bajtov v k�dovan� znaku�prive�a definovan�ch tried znakov�prive�a priestupn�ch sek�nd�prive�a lok�lnych typov �asu�prive�a prechodov?!�prive�a v�h�pr�li� ve�a alebo pr�li� dlh� skratku �asovej z�ny�smetie na konci riadku�probl�my pri odpovedi programu %d
+-�dva riadky za sebou obsahuj�ce `...' nie s� povolen��zadan� jeden rok�nie je mo�n� prideli� vyrovn�vaciu pam� pre vstup�nie je mo�n� uvo�ni� argumenty�nedefinovan��nezn�my znak `%s'�nezn�my znak v poli `%s' kateg�rie `%s'�nezn�ma direkt�va triedenia�nezn�ma direkt�va `%s' - riadok ignorovan��nezn�ma iconv() chyba %d�nezn�ma sada `%s'�nezn�my symbol `%.*s' - riadok ignorovan��z�na bez pravidiel�neukon�en� spr�va�neukon�en� re�azec�neukon�en� re�azcov� kon�tanta�neukon�en� symbolick� meno�neukon�en� meno v�hy�horn� limit rozsahu je men�� ako doln��pou�itie:  %s vstupn�_s�bor
+-�29. febru�r pou�it� v nepriestupnom roku�hodnota pre %s mus� by� cel� ��slo�honota pre <%s> mus� by� medzi 1 a 4�hodnota po�a `%s' kateg�rie `%s' nesmie by� pr�zdny re�azec�hodnota <mb_cur_max> mus� by� v��ia ako hodnota <mb_cur_min>�hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' nezodpoved� platn�mu menu v ISO 4217�hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' m� chybn� d�ku�hodnoty po�a `%s' kateg�rie `%s' musia by� men�ie ako 127�po�as prijatia spojenia: %s�po�as pridelenia z�znamu cache�po�as pridelenia z�znamu hash-tabu�ky�po�as pridelenia k�pie k���a�po�as otv�rania star�ho katal�gu�po�as pr�pravy v�stupu�po�as ��tania datab�zy�po�as stat-u s�boru profilovac�ch inform�ci��po�as z�pisu datab�zy�ne�pln� z�pis�zapisovate�n� nielen pre vlastn�ka�chybn� po�et argumentov�chybn� po�et pol� v riadku Leap�chybn� po�et pol� v riadku Link�chybn� po�t pol� v riadku Rule�chybn� po�et pol� v pokra�ovacom riadku Zone�chybn� po�et pol� v riadku Zone�xdr_reference: nedostatok pam�ti
+-�xdrrec_create: nedostatok pam�ti
+-�yp_update: nie je mo�n� konvertova� meno po��ta�a na meno siete
+-�yp_update: nie je mo�n� z�sti� adresu servera
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/sv.mo glibc-2.1.3/po/sv.mo
+--- ../glibc-2.1.3/po/sv.mo	1999-07-18 18:19:42.000000000 -0700
++++ glibc-2.1.3/po/sv.mo	1969-12-31 16:00:00.000000000 -0800
+@@ -1,456 +0,0 @@
+-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y��	���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)���
+-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[��
���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\��	����\������\������\��
���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_�����
+-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a��	���Ua��=���_a������a�������a�����b��7����b��2����b��-���	c�����7c��$���Jc��
+-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e��
���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h��
����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k��	����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l�����
+-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n��
+-���n�����#n�����*n��2���0n�����cn�����rn������n��
����n������n������n������n������n�����	o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q��
+-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u��	����u��!����u��	����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x��
���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{�����
|�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~��
���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0���
���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e���
+-������������������������P���
���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6�������
������
+-�������������"������"���*������M���"���g��������������������Ć�����ۆ��
����������������������������*������C������Z������o����������������������������������χ�����������������	���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>���	�������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č��	���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$���
+-���"���/���!���R���.���t�������������”��������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)�������
���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/���
���$���=������b���%���x���-�������$���̞�����������
������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G�������
������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ��
������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&���	������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ�����������	���
������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·��	���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#���߼��#������0���'���#���X������|����������*�������%������,��	������6������M���R���`���B�������#�������$���������?������U������j������|�����������������������������������������o���������� ������� ��������������7�������	���)������3������;������O������i������������������������"�������������"���������B���"���`�����������������	�����������������������������������6������6���<���4���s���3�������(�������������%������ ���@������a���'���v���3�������*�������-����������+���"���F���'���i����������������� ��������������������'���&���4���N����������$�������$�������$�������$������$���,������Q���"���i���+����������������������������&���	������0���&���N���&���u���'������� �������'�������!���
������/������O������f������z������������������5���A������w���!�������'��������������$�������������>������
���Y���&���g����������)��������������-�������'������!���7������Y������[������n���"��������������$�������(����������������������#���,���;���.���h�������������������������������������� ����������������3������I������f���
+-��������������������
+-���������������������"��������������0������6���?���#���v�������������������������������1������(���D���,���m���#��������������6������� ������9���1������k���;�������(�������(�������%���������?������U���!���j�������������������������������=�������J���1������|���!���������������������C���������� �������?���������5���*���3���`���%��������������&����������������������������!����������"������8������W������i���������������������������������������������9������-���L���0���z����������
���������������������"�������������<���������U���,���m������������������������4�������?������ ���S���&���t������������������������%�����������������������!���.���1������`������|����������t������������� ���&������G������c������z������������������������)���������������������"���������?������^���"���|����������$��������������#�������	���������������������,���#���B������f������x����������'����������������������������������	���������'������7������J������\���$���q��� ��������������������������������������������,������K��� ���d���
�������8�������%�����������������	������$������7������O���
���i���
���w����������
+-���������������������0������������������������
��������� ���-������N��� ���a������������������������������� �������#������n���(����������0�������������������������������������.������A������V������u�������������������������������5�����������������������"���3���<���
���p������~�����������������"��������������������������� ���������9���+���Q������}���������� �������!�������$�������"������
+-���1������<������[������n��������������������������������������"�������"������ ���=������^������r���������� ��������������#�����������������
���"���*������M������U������t�����������������!�������
+-���������������������%������,���1������^������k������������������������������5����������������.������H������_������t����������������������������������������������������
������/������
���F������T���$���a���-�������*������������������������
+-������������4���'���G������o������|�����������������#�������"����������������������(������G������a���������������������������������������������������%���)���"���O������r���������� ��������������%�������������&���&������M������Y������m�������������������������������4�������(������ ���1������R������m�����������������������2�������)�������
���$������2���q���K��� ��������������#����������������3���!���C���)���e������������������������������������������������������"���#���@������d������w����������&��������������"�����������������������/������;������D������\������p����������������������������������������������������0������(���8���	���a������k������~��������������"������*���&���D������k������t���o�������������������������%���#������I������Z��� ���p����������%����������������������������������'������&���D���>���k���
�������	��������������&�������&�������������!���/������Q������o�����������������	�������
+-�������
+-���������������������#����������������*������:������J������[������s��������������������������������������%�������<���������H������Y���'���j����������"��������������.�������!���������0������O������m���������������������������������������������#�������I��������V��*���_��.������6������=������C���.�M���r�����������	�����2�����2���'�$���Z������������������������������1����2���E�,���x������-�����'���������F���,�!���s�#���������� �����#�����9����#���U�*���y�D�����*�����"����4���7����l�����������"����������'������������#�+���=�!���i�)�����,�����1������������.����L����l�"����������"�����!��������	����)	����G	�7���c	�3����	�6����	�0���
+-�9���7
+-�!���q
+-�'����
+-�%����
+-�)����
+-��������(����E�<���c�;�����'���������&����,���C�E���p������&����������.���
�P���A
�S����
�����
�(����%���*����P����b�(�����"��������������������!����&���9�+���`�+���������������0����� �������;�$���X�6���}�!����������#�����$����(���5�!���^�-�����.�����*���������)����%���A�-���g�6����������)���������H���.�E���w�D���������)����5���@�0���v�/�����/���������)����1���G�!���y���������������������&�����(���$�"���M����p�H����������=�����<���'�B���d�H�����<��������-����F�"���Y�0���|�2�����2������������,����A����]����s������������������������������������#����1���;�=���m������#�����+������������'�4���>�&���s�%�����0�����
+-����������/���	�9���9�7���s�
�����(�����$�����7����9���?�+���y�*�����!����������-����=���<�"���z������I�����2����(���:�.���c������5�����%��������
+- �3��� ����Q �@���a �%���� ����� ����� �,���� ����!�4���*!����_!����|!�5����!�!����!�-����!�(���"�)���="�*���g"�+����"�����"�����"� ����"����#����5#����Q#����o#�?����#�%����#�%����#����$�-���5$�&���c$�����$�6����$�D����$�I���&%����p%����|%�@����%�����%�-����%�-���&�?���A&�����&�4����&�0����&�"���'�5���)'�5���_'�#����'�����'�+����'����(�/���(����M(�K���j(�Q����(�P���)�J���Y)�]����)� ���*�$���#*�!���H*�)���j*�*����*� ����*�,����*�(���
+�.���6+�)���e+�&����+�(����+�#����+����,�*���,�#���E,�)���i,�%����,� ����,�
����,�����,�����,� ���-�#���9-����]-����u-�����-�����-�.����-�����-����.�5���&.����\.�$���w.�����.�����.�����.�(����.�����/�"���/����</����V/�"���g/�
����/�����/�����/�����/�����/�����/�4���0����90����P0����m0�'����0�;����0�B����0�]���31�H����1�=����1� ���2����92����T2����t2�����2�����2�����2�"����2�����2����3����.3����K3����^3����{3�����3�)����3�����3�����3����4�/���44�'���d4��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������
����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^��
+-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b�������	�������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g��
+-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E�������
���j�������#�����������	���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<�����������	�� ���������������{��i���������Y��������������������������������	���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������
+-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E��
������K������������
+-��M��������������������������h�������X��������������T��t������������������^�����9�����M��
��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9����������		Access Rights : �		Attributes    : �	%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
+-�	%s [-n netid]* [-o outfile] [infile]
+-�	%s [-s nettype]* [-o outfile] [infile]
+-�	Access rights: �	Entry data of type %s
+-�	Name       : %s
+-�	Public Key : �	Type         : %s
+-�	Universal addresses (%u)
+-�	[%d]	Name          : %s
+-�	[%u] - [%u bytes] �
+-%s cache:
+-
+-%15s  cache is enabled
+-%15Zd  suggested size
+-%15ld  seconds time to live for positive entries
+-%15ld  seconds time to live for negative entries
+-%15ld  cache hits on positive entries
+-%15ld  cache hits on negative entries
+-%15ld  cache misses on positive entries
+-%15ld  cache misses on negative entries
+-%15ld%% cache hit rate
+-%15s  check /etc/%s for changes
+-�
+-Group Members :
+-�
+-Time to Live  : �       rpcinfo -b prognum versnum
+-�       rpcinfo -d prognum versnum
+-�       rpcinfo -p [ host ]
+-�       rpcinfo [ -n portnum ] -t host prognum [ versnum ]
+-�      no�     yes�    Data Length = %u
+-�    Explicit members:
+-�    Explicit nonmembers:
+-�    Implicit members:
+-�    Implicit nonmembers:
+-�    No explicit members
+-�    No explicit nonmembers
+-�    No implicit members
+-�    No implicit nonmembers
+-�    No recursive members
+-�    No recursive nonmembers
+-�    Recursive members:
+-�   program vers proto   port
+-�  or: � (rule from "%s", line %d)� [OPTION...]� done
+-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags.
+-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed.
+-�%s%s%s:%u: %s%sUnexpected error: %s.
+-�%s%sUnknown signal %d
+-�%s: %d did not sign extend correctly
+-�%s: <mb_cur_max> must be greater than <mb_cur_min>
+-�%s: C preprocessor failed with exit code %d
+-�%s: C preprocessor failed with signal %d
+-�%s: Can't create %s: %s
+-�%s: Can't create directory %s: %s
+-�%s: Can't link from %s to %s: %s
+-�%s: Can't open %s: %s
+-�%s: Can't remove %s: %s
+-�%s: Error closing %s: %s
+-�%s: Error reading %s
+-�%s: Error writing %s
+-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s
+-�%s: Memory exhausted: %s
+-�%s: More than one -L option specified
+-�%s: More than one -d option specified
+-�%s: More than one -l option specified
+-�%s: More than one -p option specified
+-�%s: More than one -y option specified
+-�%s: Too many arguments
+-�%s: cannot get modification time�%s: command was '%s', result was %d
+-�%s: error in state machine�%s: illegal option -- %c
+-�%s: invalid option -- %c
+-�%s: option `%c%s' doesn't allow an argument
+-�%s: option `%s' is ambiguous
+-�%s: option `%s' requires an argument
+-�%s: option `--%s' doesn't allow an argument
+-�%s: option `-W %s' doesn't allow an argument
+-�%s: option `-W %s' is ambiguous
+-�%s: option requires an argument -- %c
+-�%s: output would overwrite %s
+-�%s: panic: Invalid l_value %d
+-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s'
+-�%s: unrecognized option `--%s'
+-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]
+-	[ -L leapseconds ] [ -y yearistype ] [ filename ... ]
+-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ...
+-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object)
+-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible
+-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]...
+-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT
+-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data
+-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag!
+-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file!
+-�Cannot use netid flag with inetd flag!
+-�Cannot use netid flag without TIRPC!
+-�Cannot use table flags with newstyle!
+-�Channel number out of range�Character Separator : %c
+-�Child exited�Client credential too weak�Columns             :
+-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc.
+-This is free software; see the source for copying conditions.  There is NO
+-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique
+-�DIRECTORY
+-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights :
+-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits)
+-�Directory     : %s
+-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY
+-�Encrypted data
+-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file.  Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP
+-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE
+-is -, output is written to standard output.
+-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group         : %s
+-�Group Flags :�Group entry for "%s.%s" group:
+-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE
+--o OUTPUT-FILE INPUT-FILE
+--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos.
+-�Killed�LINK
+-�LOCAL entry for UID %d in directory %s not unique
+-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s
+-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server :
+-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time     : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME
+-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT
+-�NUMBER�Name : '%s'
+-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered.
+-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None.
+-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns   : %d
+-�Number of objects : %u
+-�Numerical argument out of domain�Numerical result out of range�Object #%d:
+-�Object Name   : %s
+-�Object Type   : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner         : %s
+-�PRIVATE
+-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits)
+-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate :
+-�Report bugs to %s.
+-�Report bugs using the `glibcbug' script to <bugs@gnu.org>.
+-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path         : %s
+-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root
+-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status            : %s
+-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s
+-                       repertoire maps: %s
+-                       locale path    : %s
+-%s�TABLE
+-�Table Type          : %s
+-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known.  This does
+-not necessarily mean that all combinations of these names can be used for
+-the FROM and TO command line parameters.  One coded character set can be
+-listed with several different names (aliases).
+-  Some of the names are no plain strings but instead regular expressions and
+-they match a variety of names which can be given as parameters to the
+-program.
+-
+-  �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information.
+-�Trying %s...
+-�Type : %s
+-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d)
+-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s
+-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname]
+-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]
+-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s.
+-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory
+-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice
+-�bogus mcheck_status, library is buggy
+-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d
+-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s 
+-�cannot find any C preprocessor (cpp)
+-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory
+-�clntudp_create: out of memory
+-�clntunix_create: out of memory
+-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server
+-�couldn't register prog %d vers %d
+-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten
+-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s'
+-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block
+-�memory clobbered past end of allocated block
+-�memory exhausted�memory exhausted
+-�memory is consistent, library is buggy
+-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s
+-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d
+-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration:
+-
+-%15d  server debug level
+-�nscd not running!
+-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup
+-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available
+-�program %lu version %lu is not available
+-�program %lu version %lu ready and waiting
+-�rcmd: poll (setting up stderr): %m
+-�rcmd: socket: All ports in use
+-�rcmd: write (setting up stderr): %m
+-�registerrpc: out of memory
+-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error
+-�rpcgen: too many defines
+-�rpcinfo: %s is unknown host
+-�rpcinfo: %s is unknown service
+-�rpcinfo: Could not delete registration for prog %s version %s
+-�rpcinfo: broadcast failed: %s
+-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup
+-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory
+-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory
+-�svctcp_create: out of memory
+-�svcudp_create - cannot getsockname�svcudp_create: out of memory
+-�svcudp_create: socket creation problem�svcunix_create: out of memory
+-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d
+-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage:  %s infile
+-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory
+-�xdrrec_create: out of memory
+-�yp_update: cannot convert host to netname
+-�yp_update: cannot get server address
+-�Project-Id-Version: libc 2.1
+-POT-Creation-Date: 1998-11-28 09:29-0800
+-PO-Revision-Date: 1999-01-24 18:00 +01:00
+-Last-Translator: Jan Dj�rv <Jan.Djarv@mbox200.swipnet.se>
+-Language-Team: Swedish <sv@li.org>
+-MIME-Version: 1.0
+-Content-Type: text/plain; charset=ISO-8859-1
+-Content-Transfer-Encoding: 8bit
+-�		Accessr�ttigheter : �		Attribut      : �	%s [-abkCLNTM][-Dnamn[=v�rde]] [-i storlek] [-I [-K sekunder]] [-Y s�kv�g] infil
+-�	%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o utfil] [infil]
+-�	%s [-n n�tid]* [-o utfil] [infil]
+-�	%s [-s n�ttyp]* [-o utfil] [infil]
+-�	�tkomstr�ttigheter: �	Postdata av typ %s
+-�	Namn       : %s
+-�	Publik nyckel : �	Typ          : %s
+-�	Universella adresser (%u)
+-�	[%d]	Namn          : %s
+-�	[%u] - [%u byte] �
+-%s cache:
+-
+-%15s  cache �r p�slagen
+-%15Zd  f�reslagen storlek
+-%15ld  livsl�ngd i sekunder f�r positiva poster
+-%15ld  livsl�ngd i sekunder f�r negativa poster
+-%15ld  cache-tr�ffar f�r positiva poster
+-%15ld  cache-tr�ffar f�r negativa poster
+-%15ld  cache-missar f�r positiva poster
+-%15ld  cache-missar f�r negativa poster
+-%15ld%% cache tr�ffprocent
+-%15s  kontrollera /etc/%s f�r �ndringar
+-�
+-Guppmedlemmar :
+-�
+-Livsl�ngd     : �       rpcinfo -b prognr versnr
+-�       rpcinfo -d prognr versnr
+-�       rpcinfo -p [ v�rd ]
+-�       rpcinfo [ -n portnr ] -t v�rd prognr [ versnr ]
+-�      nej�     ja�    Datal�ngd = %u
+-�    Explicita medlemmar:
+-�    Explicit icke-medlemmar:
+-�    Implicita medlemmar:
+-�    Implicita icke-medlemmar:
+-�    Inga explicita medlemmar
+-�    Inga explicita icke-medlemmar
+-�    Inga implicita medlemmar
+-�    Inga implicita icke-medlemmar
+-�    Inga rekursiva medlemmar
+-�    Inga rekursiva icke-medlemmar
+-�    Rekursiva medlemmar:
+-�   program vers proto   port
+-�  eller: � (regel fr�n "%s", rad %d)� [FLAGGA...]� klar
+-�"%s", rad %d: %s�"Zone %s"-rad och flaggan -l �r �msesidigt uteslutande�"Zone %s"-rad och flaggan -p �r �msesidigt uteslutande�"infil" �r obligatorisk f�r mallgenereringsflaggor.
+-�%.*s: parameter till ARGP_HELP_FMT kr�ver ett v�rde�%.*s: Parameter till ARGP_HELP_FMT ok�nd�%s i zon utan regler�%s%s%s:%u: %s%sF�rs�kran "%s" falsk.
+-�%s%s%s:%u: %s%sOv�ntat fel: %s.
+-�%s%sOk�nd signal %d
+-�%s: %d teckenexpanderades inte korrekt
+-�%s: <mb_cur_max> m�ste vara st�rre �n <mb_cur_min>
+-�%s: C preprocessorn avslutades med kod %d
+-�%s: C preprocessorn avslutades med signal %d
+-�%s: Kan inte skapa %s: %s
+-�%s: Kan inte skapa katalog %s: %s
+-�%s: Kan inte l�nka fr�n %s till %s: %s
+-�%s: Kan inte �ppna %s: %s
+-�%s: Kan inte ta bort %s: %s
+-�%s: Fel vid st�ngning av %s: %s
+-�%s: Fel vid l�sning fr�n %s
+-�%s: Fel vid skrivning till %s
+-�%s: Fel vid skrivning till standard ut �%s: "Leap"-rad i fil %s som inte �r skottsekundsfil
+-�%s: Minnet slut: %s
+-�%s: Flaggan -L given mer �n en g�ng
+-�%s: Flaggan -d given mer �n en g�ng
+-�%s: Flaggan -l given mer �n en g�ng
+-�%s: Flaggan -p given mer �n en g�ng
+-�%s: Flaggan -y given mer �n en g�ng
+-�%s: F�r m�nga argument
+-�%s: kan inte h�mta modifieringstid�%s: kommandot var "%s", resultatet blev %d
+-�%s: fel i tillst�ndsmaskin�%s: otill�ten flagga -- %c
+-�%s: ogiltig flagga -- %c
+-�%s: flaggan "%c%s" tar inget argument
+-�%s: flaggan "%s" �r tvetydig
+-�%s: flaggan "%s" beh�ver ett argument
+-�%s: flaggan "--%s" tar inget argument
+-�%s: flaggan "-W %s" tar inget argument
+-�%s: flaggan "-W %s" �r tvetydig
+-�%s: flaggan beh�ver ett argument -- %c
+-�%s: utdata skulle skriva �ver %s
+-�%s: panik: ogiltigt l_value %d
+-�%s: f�r tidigt filslut�%s: kan inte �ppna �%s: ok�nd flagga "%c%s"
+-�%s: ok�nd flagga "--%s"
+-�%s: anv�ndning �r %s [ -s ] [ -v ] [ -l lokaltid ] [ -p posixregler ] [ -d katalog ]
+-	[ -L skottsekunder ] [ -y �rkontrollprogram ] [ filnamn ... ]
+-�%s: anv�ndning �r %s [ -v ] [ -c gr�ns ] zonnamn ...
+-�%s: n�r resultatet skrevs: �(PROGRAMFEL) Ingen version k�nd!?�(PROGRAMFEL) Flagga skulle k�nts igen!?�(Ok�nt objekt)
+-�(ok�nt fel vid �kthetskontroll - %d)�(ok�nt)�*** Filen "%s" �r strippad: ingen detaljerad analys �r m�jlig
+-�*standard in*�-o UTFIL [INFIL]...
+-[UTFIL [INFIL]...]�.lib-sektion i a.out korrupt�; undre version = %lu, �vre version = %lu�; varf�r = �<%s> och <%s> �r otill�tna namn f�r intervall�<SP>-tecknet f�r inte vara i klass "%s"�<SP>-tecknet �r inte i klass "%s"�?�Avbruten (SIGABRT)��tkomstr�ttigheter : ��ppnar ett korrupt delat bibliotek�Adressen upptagen�Adressfamilj f�r v�rdnamn st�ds inte�Adressfamiljen st�ds inte av protokollet�Annonseringsfel�Alarmklocka�Argumentlistan f�r l�ng�F�rs�k att ta bort en tabell som inte �r tom�F�rs�k att l�nka in f�r m�nga delade bibliotek��kthetskontroll OK��kthetskontroll misslyckades�SKENOBJEKT
+-�Felaktig adress�Felaktig filidentifierare�Felaktigt format p� typsnittsfil�Felaktigt meddelande�Felaktigt systemanrop�Otill�tet v�rde f�r ai_flags�Var strikt POSIX-konform�Bin�rdata
+-�Blockspecialfil kr�vs�Problem med poll vid uts�ndning�Brutet r�r�Bussfel�CDS�Begr�nsning av CPU-tid �verskriden�Cache gick ur tiden�Kan inte komma �t ett n�dv�ndigt delat bibliotek�Kan inte ansluta till servern som betj�nar denna dom�n�Kan inte kommunicera med portmapper�Kan inte kommunicera med ypbind�Kan inte kommunicera med ypserv�Kan inte allokera minne�Kan inte tilldela beg�rd adress�Kan inte skapa uttag (socket) f�r uts�ndnings-rpc�Kan inte k�ra ett delat bibliotek direkt�Kan inte ha mer �n en filgenereringsflagga!
+-�Kan inte ta emot svar p� uts�ndning�Kan inte registrera tj�nst�Kan inte skicka efter att transportslutpunkten st�ngts�Kan inte skicka uts�ndningspaket�Kan inte s�tta uttagsflaggan (socket option) SO_BROADCAST�Kan inte ange mer �n en infil!
+-�Kan inte ange netid-flaggan tillsammans med inetd-flaggan!
+-�Kan inte ange netid-flaggan utan TIRPC!
+-�Kan inte ange tabellflaggor med ny stil
+-�Kanalnummer utanf�r giltigt intervall�Teckenseparator : %c
+-�Barnprocess avslutad�Klientens referenser �r f�r svaga�Kolumner            :
+-�Kommunikationsfel vid s�ndning�Kompilera lokalspecifikation�Datorn packade ihop�Att ber�kna tabellstorlek f�r teckenklasser kan ta ett tag...�Att ber�kna tabellstorlek f�r kollationeringsinformation kan ta ett tag...�F�rbindelse v�gras�F�rbindelse borttagen av partnern�F�rbindelsen dog ut (timeout)��terupptagen�Konvertera kodning i angivna infiler fr�n en kodning till en annan.�Konvertera nyckel till gemener�Copyright � %s Free Software Foundation, Inc.
+-Detta �r fri programvara; se k�llkoden f�r kopieringsvillkor.  Det finns
+-INGEN garanti; inte ens f�r S�LJBARHET eller L�MPLIGHET F�R N�GOT SPECIELLT
+-�NDAM�L.
+-�Kunde inte skapa loggfil "%s"�Skapa C-huvudfil NAMN inneh�llande symboldefinitioner�Skapa utfil �ven om varningsmeddelanden genererades�Skapa enkel DB-databas fr�n textdata.�Skapad : %s�DES-post f�r n�tnamn %s �r inte unikt
+-�KATALOG
+-�DNANS�DNS�Databas f�r tabell existerar inte�Databasen �r upptagen�Standard �tkomstr�ttigheter :
+-�Destination kr�vs�Enheten �r inte en stream�Enheten �r inte konfigurerad�Enhet eller resurs upptagen�Diffie-Hellmann (%d bitar)
+-�Katalog       : %s
+-�Katalog inte tom�Diskkvot �verskriden�Skapa inte barnprocess, visa meddelanden p� nuvarande tty�Skriv inte meddelanden medans databasen byggs�Anv�nd inte existerande katalog, g�r en ny utfil�Dom�n inte bunden�Emulatorf�lla�POST
+-�Krypterat data
+-�Post/Tabell-typer �r inkompatibila�Fel i RPC delsystem�Fel vid l�sande av NIS+ kallstartsfil.  �r NIS+ installerad?�Fel i ok�nt felsystem: �Fel vid kommunikation till �teranropsprocess�Fel: .netrc kan l�sas av andra.�V�xeln full�Formatfel p� k�rbar fil�FATALT: systemet definierar inte "_POSIX2_LOCALEDEF"�FIL inneh�ller avbildning fr�n symboliska namn till UCS4-v�rden�Misslyckades (ospecificerat fel)�Filidentifierare i felaktigt tillst�nd�Filen existerar�Fill�sning gav d�dl�ge�Filnamn f�r l�ngt�Begr�nsning av filstorlek �verskriden�Fil f�r stor�F�rsta/N�sta-kedja bruten�Aritmetiskt fel�Fullst�ndig resynkronisering kr�vs f�r katalog�Funktion inte implementerad�GRUPP
+-�Skr�p i ARGP_HELP_FMT: %s�Skapa meddelandekatalog.\vOm INFIL �r - s� l�ses standard in.  Om UTFIL
+-�r - s� skrivs resultatet till standard ut.
+-�Generiskt systemfel�H�mta lokal-specifik information�Ge ett kort hj�lpmeddelande�Skriv denna hj�lplista�Omotiverat fel�Grupp         : %s
+-�Gruppflaggor : �Grupppost f�r "%s.%s" grupp:
+-�V�nta i SEK sekunder (standardv�rde 3600)�Avringd�Hittar inte "%d" i gruppcache!�Hittar inte "%d" i l�senordscache!�Hittar inte "%s" i gruppcache!�Hittar inte "%s" i v�rdcache!�Hittar inte "%s" i l�senordscache!�V�rddator �r nere�Uppslagning av v�rdnamn misslyckades�I/O m�jligt�INFIL UTFIL
+--o UTFIL INFIL
+--u INFIL�IOT-f�lla�IVY�Identifierare borttagen�Otill�ten instruktion�Otill�ten objekttyp f�r operationen�Otill�ten s�kning�Filtyp eller format ol�mplig�Ol�mplig "ioctl" f�r enhet�Operation f�r bakgrundsprocess ol�mplig�Informationsbeg�ran�Information:�Infiler:�In/ut formatspecifikation:�In/ut-fel�Internt NIS-fel�Internt ypbind-fel�Avbruten (SIGINT)�Avbrutet systemanrop�Avbrutet systemanrop borde omstartas�Otill�tet objekt f�r operationen�Ogiltigt argument�Ogiltig bak�treferens�Ogiltigt teckenklassnamn�Ogiltiga klientreferenser�Ogiltig klientverifierare�Ogiltigt kollationeringstecken�Ogiltigt inneh�ll i \{\}�Ogiltig l�nk �ver skilda enheter�Ogiltig v�xel�Ogiltig eller inte komplett flerbyte- eller brett tecken�Ogiltigt f�reg�ende regulj�rt uttryck�Ogiltigt intervallslut�Ogiltigt regulj�rt uttryck�Ogiltig �tkomstkod�Ogiltig fr�gedeskriptor�Ogiltig serververifierare�Ogiltig plats��r en katalog��r en namngiven filtyp�Kerberos.
+-�D�dad�L�NK
+-�LOCAL-post f�r UID %d i katalog %s �r inte unik
+-�Niv� 2 stannad�Niv� 2 inte synkroniserad�Niv� 3 stannad�Niv� 3 omstartad�L�nk pekar p� ett otill�tet namn�L�nken har brutits�L�nkantal utanf�r giltigt omr�de�L�nkad objekttyp : �L�nkad till : %s
+-�Lokalt dom�nnamn inte satt�Allokeringsfel f�r lokal resurs�Maskinen finns inte p� n�tverket�Felaktigt namn eller otill�tet namn�Obligatoriska respektive valfria argument f�r l�nga flaggor �r obligatoriska repektive valfria �ven f�r korta.�Huvudserver :
+-�Huvudserver �r upptagen, full dump omskedulerad.�Minnesallokeringsfel�Minnet slut�Meddelandet f�r l�ngt�Saknat eller felaktigt attribut��ndr. tid     : %s��ndring misslyckades��ndringsoperation misslyckades��ndra utdataformat:�Flerhopp f�rs�ktes�NAMN�NAMN
+-[-a|-m]�NIS�NIS versionsskillnad klient/server - kan inte betj�na�NIS tabelldatabas �r felaktig�NIS+ operation misslyckades�NIS+ servers kan inte n�s�NIS+ service �r otillg�nglig eller inte installerad�INGET OBJEKT
+-�ANTAL�Namn : "%s"
+-�Namntj�nst cache-demon�Namn hanteras inte av denna server�Namnet inte unikt i n�tverket�Namn eller tj�nst ok�nd�Namn/post �r inte unik�Namngivet objekt �r inte s�kbart�Beh�ver �kthetsintygare�N�tverket tog bort f�rbindelsen vid omstart�N�tverket �r nere�N�tverket kan inte n�s�Inga CSI-strukturer tillg�ngliga�Inga XENIX-semaforer tillg�ngliga�Ingen adress associerad med v�rdnamn�Ingen adress associerad med namnet�Ingen anod�Ingen buffertplats tillg�nglig�Inga barnprocesser�Inga data tillg�ngliga�Inget filutrymme hos servern�Inga l�s tillg�ngliga�Ingen tr�ff�Inget medium funnet�Inget meddelande av �nskad typ�Inga fler poster i tabelldatabasen�Inget f�reg�ende regulj�rt uttryck�Inga fj�rrprogram registrerade.
+-�Ingen v�g till v�rd�Enheten �r full�Enheten finns inte�Filen eller katalogen finns inte�Ingen s�dan nyckel i tabellen�Ingen s�dan tabell i serverns dom�n�Processen finns inte�Icke-NIS+ namnrymd p�tr�ffad�Oreparerbart fel i namnuppslagning�Ingen.
+-�Inte hittad, inget s�dant namn�Inte en XENIX-namngiven fil�Inte en katalog�Inte funnet�Ingen huvudserver f�r denna dom�n�Inte �gare�Antal kolumner      : %d
+-�Antal objekt      : %u
+-�Numeriskt argument �r utanf�r omr�det�Numeriskt resultat �r utanf�r giltigt omr�de�Objekt #%d:
+-�Objektnamn    : %s
+-�Objekttyp     : ��r ett fj�rrobjekt�Objekt med samma namn existerar�Oj�mnt antal citationstecken�Bara root har till�telse att anv�nda denna operation!�Operationen p�g�r redan�Operationen inte till�ten�Operationen st�ds inte�Operationen p�g�r nu�Operationen skulle blockera�Stream-resurserna �r slut�Styr utdata:�V�lj utdata:��gare         : %s
+-�PRIVAT
+-�Paketet �r inte installerat�Parsfel: %s�Delvis lyckat�Skickat objekt �r inte samma objekt hos servern��tkomst nekas�Str�mavbrott�F�r tidigt slut p� regulj�rt uttryck�Skriv inneh�llet i databasen, en post per rad�Skriv ut nuvarande konfigurationsstatistik�Skriv mer meddelanden�Skriv programversion�Troligtvis lyckat�F�rmodligen inte funnen�Profileringsklocka�Styrprogram f�r protokoll inte anslutet�Protokollfel�Protokollfamiljen st�ds ej�Protokollet ej tillg�ngligt�Protokollet st�ds ej�Fel protokolltyp f�r uttag (socket)�Fr�ga ogiltig f�r namngiven tabell�L�mnad�RFS-specifikt fel�RPC d�lig procedur f�r program�RPC-fel vid NIS-operation�RPC programmet ej tillg�ngligt�RPC fel programversion�RPC struktur d�lig�RPC fel version�RPC: (ok�nd felkod)�RPC: Fel vid �kthetskontroll�RPC: Kan inte avkoda resultatet�RPC: Kan inte koda argumentet�RPC: Misslyckades (ospecificerat fel)�RPC: Inkompatibla versioner av RPC�RPC: Fel i port�vers�ttare�RPC: Procedur inte tillg�nglig�RPC: Programmet inte registrerat�RPC: Programmet otillg�ngligt�RPC: Program/version-inkompatibilitet�RPC: Fj�rrsystemsfel�RPC: Server kan inte avkoda argumenten�RPC: Lyckat�RPC: Tiden l�pte ut�RPC: Kan inte ta emot�RPC: Kan inte skicka�RPC: Ok�nd v�rdmaskin�RPC: Ok�nt protokoll�RSA (%d bitar)
+-�RTLD_NEXT anv�nds i kod som inte �r dynamiskt laddad�L�s och visa profildata f�r delat objekt�L�s konfigurationsdata fr�n NAMN�Filsystemet endast l�sbart�Realtidssignal %d�Regulj�rt uttryck f�r stort�I/O-fel p� fj�rrmaskin�Fj�rradress �ndrades�Ta bort l�senord eller g�r filen ol�sbar f�r andra��ppna delat object "%s" igen misslyckades�Replikerad :
+-�Rapportera fel till %s.
+-�Rapportera fel med programmet "glibcbug" till <bugs@gnu.org>.
+-Rapportera fel p� �vers�ttningen till <sv@li.org>.
+-�Argument f�r f�rfr�gan felaktiga�Resolver-fel 0 (inget fel)�Internt fel i namnl�sare (resolver)�Resursd�dl�ge undveks�F�rlorad resurs�Resursen tillf�lligt otillg�nglig�Resultat skickat till �teranropsprocessen�SHOBJ [PROFDATA]�SUNYP�S�kv�g              : %s
+-�Segmenteringsfel�Server upptagen, f�rs�k igen�Server har slut p� minne�Server f�rkastade kreditiv�Server f�rkastade verifierare�Servname st�ds inte f�r ai_socktype�S�tt programnamnet�Avsluta servern�Signal 0�Uttagsoperation p� icke-uttag (socket)�Uttagstyp (socket) st�ds inte�Mjukvara orsakade f�rbindelsebrott�Tyv�rr, du �r inte root
+-�K�lldefinitioner finns i FILE�Srmount-fel�Stackfel�F�rlegat NFS-filhandtag�Starta ANTAL tr�dar�Status            : %s
+-�Stoppad�Stoppad (signal)�Stoppad (terminall�sning)�Stoppad (terminalskrivning)�Streams-r�rfel�Strukturen beh�ver st�das�Lyckat�Undertryck varningar och informationsmeddelanden�Symboliska teckennamn definierade i FILE�Systemfel�Systeminformation:�Allokeringsfel f�r systemresurs�Systemets kataloger f�r teckentabeller: %s
+-                     repertoartabeller: %s
+-                       lokal-s�kv�g   : %s
+-%s�TABELL
+-�Tabelltyp           : %s
+-�Namnuppslagning misslyckades tempor�rt�Avslutad�Kodfil upptagen�F�ljande lista inneh�ller alla teckenupps�ttningar som �r k�nda.  Detta
+-betyder inte n�dv�ndigtvis att alla kombinationer av dessa namn kan ges
+-som FR�N och TILL argument.  En teckenupps�ttning kan ha flera olika namn
+-(alias).
+-  En del av namnen �r inte str�ngar utan regulj�ra uttryck och dessa
+-matchar varianter av namn som kan ges som argument till programmet.
+-
+-  �Livsl�ngd : �Klockan ringde�F�r m�nga attribut�F�r m�nga niv�er av symboliska l�nkar�F�r m�nga l�nkar�F�r m�nga �ppna filer�F�r m�nga �ppna filer i systemet�F�r m�nga processer�F�r m�nga referenser: kan inte skarva�F�r m�nga anv�ndare�Sp�rningsf�lla�Avslutande omv�nt snedstreck��vers�ttaren dog�Transportslutpunkten �r redan f�rbunden�Transportslutpunkten �r inte f�rbunden�F�rs�k med "%s --help" eller "%s --usage" f�r mer information
+-�Provar %s...
+-�Typ : %s
+-�OK�ND�Kan inte bevisa �kthet hos NIS+ klient�Kan inte bevisa �kthet hos NIS+ server�Kan inte skapa �teranrop�Kan inte skapa process hos server�Ok�nd (typ = %d, bitar = %d)
+-�Ok�nt .netrc-nyckelord %s�Ok�nd NIS-felkod�Ok�nd databas: %s
+-�Ok�nt fel�Ok�nt fel �Ok�nd v�rd�Ok�nt objekt�Ok�nd flagga: %s %s %s�Ok�nt fel hos namnl�sare (resolver)�Ok�nt fel hos server�Ok�nd signal %d�Ok�nt systemfel�Ok�nt ypbind-fel�Obalanserade ( eller \(�Obalanserade ) eller \)�Obalanserade [ eller [^�Obalanserad \{�Ok�nd variabel "%s"�Akut I/O-tillst�nd�Anv�ndning:�Anv�ndning: %s variabelnamn [s�kv�g]
+-�Anv�ndning: rpcinfo [ -n portnr ] -u v�rd prognr [ versnr ]
+-�Anv�ndarsignal 1�Anv�ndarsignal 2�V�rdet f�r stort f�r definierad datatyp�Alarmklocka - virtuell tid�Vilt resultat fr�n kommandok�rning��ndrat f�nster�Skriv namn p� tillg�ngliga teckenupps�ttningar�Skriv namn p� tilg�ngliga lokaler�Skriv namn p� valda kategorier�Skriv namn p� valda nyckelord�Skriv resultatet till NAMN�Skriven av %s.
+-�Fel typ p� mediet�X500�XCHS�YPBINDPROC_DOMAIN: %s
+-�Ja, meningen med livet �r 42�Du strulade till det den h�r g�ngen�Zon-forts�ttningsradens sluttid �r inte efter sluttiden p� f�reg�ende rad�[FIL...]�"%1$s" definition slutar ej med "END %1$s"�"%s" �r inte en korrekt profildatafil f�r "%s"�"-1" m�ste vara sista post i f�lt "%s" i kategori "%s"�"..." f�r endast anv�ndas f�r post "..." och post "UNDEFINED"�"from" f�rv�ntades efter f�rsta argumentet till "collating-element"�"fr�n"-str�ng i deklaration av kollationeringselement inneh�ller ok�nt tecken�ai_family st�ds ej�ai_socktype st�ds inte�k�r redan�argumentet till <%s> m�ste vara ett enskilt tecken�argumentet till "%s" m�ste vara ett enskilt tecken�auth_none.c - Fatalt kodningsproblem�authunix_create: minnet slut
+-�d�ligt argument�ol�mplig �gare�tomt "FROM"-f�lt p� "Link"-rad�tomt "TO"-f�lt p� "Link"-rad�block frigjort tv� g�nger
+-�felaktig mcheck_status, biblioteket �r felaktigt
+-�uts�ndning: ioctl (h�mta gr�nssnittskonfiguration)�uts�ndning: ioctl (h�mta gr�nssnittsflaggor)�buffert fl�dar �ver�cache_set: kunde inte allokera ny rpc-buffert�cache_set: offerallokering misslyckades�cache_set: offer hittades ej�kan inte avg�ra tidszonsf�rkortning att anv�nda just efter "until"-tid�kan inte �ndra procedurnummer %d
+-�kan inte ta status p� lokalfil "%s"�kan inte allokera symboldata�kan inte skapa intern deskriptor�kan inte skapa interna deskriptorer�kan inte f� uttag (socket) att acceptera f�rbindelser: %s�kan inte hitta C preprocessor: %s 
+-�kan inte hitta n�gon C preprocessor (cpp)
+-�Kan inte hantera �ldre f�rfr�gansversion %d, nuvarande version �r %d�kan inte s�tta in kollationselement "%.*s"�kan inte s�tta in i resultattabell�kan inte s�tta in ny kollationssymbolsdefinition: %s�kan inte ladda profildata�kan inte �ppna�kan inte �ppna "%s"�kan inte �ppna databasfil "%s": %s�kan inte �ppna infil "%s"�kan inte �ppna lokaldefinitionsfil "%s"�kan inte �ppna utfil�kan inte �ppna utfil "%s"�kan inte �ppna utfil "%s" f�r kategori "%s"�kan inte �ppna uttag (socket): %s�kan inte bearbeta sorteringsspecifikation�kan inte l�sa teckenupps�ttningskatalog "%s"�kan inte l�sa konfigurationsdata, detta �r fatalt�kan inte l�sa fr�n klient�kan inte l�sa huvud fr�n "%s"�kan inte l�sa lokalkatalog "%s"�kan inte l�sa lokalfil "%s"�kan inte l�sa repertoartabell "%s"�kan inte l�sa statistikdata�kan inte ta status p� fil "%s": %s�kan inte skriva utfiler till "%s"�kan inte skriva resultat: %s�kan inte skriva statistik: %s�kan inte skriva till klient�kategoridata beg�rd mer �n en g�ng: borde inte intr�ffa�tecknet %s"%s" i klass "%s" m�ste vara i klass "%s"�tecknet %s"%s" i klass "%s" f�r inte vara i klass "%s"�tecknet <SP> inte definierat i teckenupps�ttning�tecknet "%s" inte definierat men beh�vs som standardv�rde�teckenklass "%s" redan definierad�teckenupps�ttning "%s" redan definierad�teckenupps�ttningsfil "%s" finns inte�clnt_raw.c - Fatalt fel vid serialisering�clnttcp_create: minnet slut
+-�clntudp_create: minnet slut
+-�clntunix_create: minnet slut
+-�kollationselement "%.*s" finns mer �n en g�ng: rad ignorerad�kollationssymbol "%.*s" finns mer �n en g�ng: rad ignorerad�kollationssymbol f�rv�ntades efter "%s"�koppla till adress %s: �konstant eller identifierare f�rv�ntad�konvertering fr�n "%s" till "%s" st�djs inte�konvertering avslutades p� grund av problem med att skriva resultatet�kunde inte skapa en rpc-server
+-�kunde inte registrera prog %d vers %d
+-�databas [nyckel ...]�standardteckenupps�ttningsfil "%s" inte hittad�riktningsflagga i str�ng %d i "era"-f�lt i kategori "%s" �r varken "+" eller "-"�riktningsflagga i str�ng %d i "era"-f�lt i kategori "%s" �r inte ett enskilt tecken�duplicerat teckennamn "%s"�dubbla definitioner av kollationselement�dubbla definitioner f�r tecken "%.*s"�duplicerad nyckel�duplicerad definition av m�ngd�duplicerat zonnamn %s (fil "%s", rad %d)�duplicerad meddelandeidentifierare�duplicerat meddelandenummer�tom teckenstr�ng�tomt viktnamn: rad ignorerad�enablecache: cache redan p�slagen�enablecache: kunde inte allokera cache�enablecache: kunde inte allokera cache-data�enablecache: kunde inte allokera cache-fifo�kodning f�r resultatet�kodning av originaltexten�slutpunkt f�r intervall �r st�rre �n startv�rdet�fel vid st�ngning av indata "%s"�fel vid st�ngning av utfilen�fel vid st�ngning av profildatafilen�fel vid ins�ttning av kollationselement i hashtabellen�fel vid ins�ttning i hashtabellen�fel n�r indata l�stes�f�rv�ntar str�ngargument f�r "copy"�f�rv�ntad forts�ttningsrad ej funnen�misslyckades att ladda delat objekt "%s"�misslyckades att ladda symboldata�misslyckades att mappa (mmap) profildatafilen�misslyckades att starta konverteringsprocessen�misslyckades skriva data f�r kategori "%s"�fcntl_ F_SETFD�f�lt "%s" i kategori "%s" inte definierat�f�lt "%s" i kategori "%s" odefinierat�fil "%s" finns redan och kan bli �verskriven
+-�fr�nv�rde f�r "collating-element" m�ste vara en str�ng�misslyckades ta status (fstat)�skr�p i slutet av teckenkodsspecifikation�skr�p i slutet av nummer�skr�p i slutet av till�ggsv�rde i str�ng %d i "era"-f�lt i kategori "%s"�skr�p i slutet av startdatum i str�ng %d i "era"-f�lt i kategori "%s"�skr�p i slutet av slutdatum i str�ng %d i "era"-f�lt i kategori "%s"�generera anropsgraf�generera platt profil med antal och tider�get_myaddress: ioctl (h�mta gr�nssnittskonfiguration)�getent - h�mta poster fr�n administrativ databas�handle_request: beg�ran mottagen (version = %d)�h�rd l�nk misslyckades, anv�nder symbolisk l�nk�h�rdl�nkad n�gonstans�otill�tet "CORRECTION"-f�lt p� "Leap"-rad�otill�tet "Rolling/Stationary"-f�lt p� "Leap"-rad�otill�ten teckenkonstant i str�ng�otill�tet tecken i fil: �otill�tet kollationselement�otill�ten definition�otill�ten kodning given�otill�ten teckensekvens vid str�ngslut�otill�ten indatasekvens vid position %ld�otill�tna namn f�r teckenintervall�otill�ten n�ttyp: "%s"
+-�otill�tet tal f�r till�ggsv�rde i str�ng %d i "era"-f�lt i kategori "%s"�otill�tet tal f�r m�ngd�otill�tet startdatum i str�ng %d i "era"-f�lt i kategori "%s"�otill�tet slutdatum i str�ng %d i "era"-f�lt i kategori "%s"�implementationsbegr�nsning: inte fler �n %d teckenklasser till�tna�implementationsbegr�nsning: inte fler �n %d teckenupps�ttningar till�tet�ofullst�ndigt tecken eller skift-sekvens i slutet p� buffert�felaktigt formaterad rad�inrad av ok�nd typ�internt fel (otill�ten deskriptor)�internt fel - addtype anropad med felaktig isdst�internt fel - addtype anropad med felaktig ttisgmt�internt fel - addtype anropad med felaktig ttisstd�internt fel i %s, rad %u�ogiltigt UTC-till�gg�ogiltigt f�rkortningsformat�ogiltig dag i m�naden�ogiltigt slut�r�ogiltigt skott�r�ogiltiga flaggor f�r dlopen()�ogiltigt m�nadsnamn�ogiltigt sparad tid�ogiltigt start�r�ogiltig tid p� dagen�ogiltigt veckodagsnamn�nyckell�ngd i beg�ran f�r l�ng: %Zd�rad efter ellips m�ste inneh�lla teckendefinition�rad f�re ellips inneh�ller inte definition f�r teckenkonstant�f�r l�ng rad�visa alla k�nda teckenupps�ttningar�lokalfil "%s", anv�nd i "copy", inte funnen�misslyckades ta status (lstat)�felaktig rad ignorerad�mappning av sektionshuvuds str�ngtabell misslyckades�mappning av sektionshuvud misslyckades�minnet f�rst�rt f�re allokerat block
+-�minnet f�rst�rt efter slutet p� allokerat block
+-�minne slut�minnet slut
+-�minnet �r konsistent, biblioteket �r felaktigt
+-�eraformat i str�ng %d i "era"-f�lt i kategori "%s" saknas�eranamn i str�ng %d i "era"-f�lt i kategori "%s" saknas�namnl�s regel�varken original- eller m�lkodning angvet�netname2user: (nis+ uppslagning) %s
+-�netname2user: DES-post f�r %s i katalog %s �r inte unik�netname2user: LOCAL-post f�r %s i katalog %s �r inte unik�netname2user: fattas grupp-id lista i "%s".�netname2user: principalnamn "%s" f�r l�ngt�netname2user: borde inte ha uid 0�aldrig registrerat prog %d
+-�inget <Uxxxx> eller <Uxxxxxxxx> v�rde angivet�felaktigt regulj�rt uttryck f�r f�lt "%s" i kategori "%s": %s�ingen dag i m�naden matchar regeln�ingen definition av "UNDEFINED"�inget filnam f�r profildata angivet och delat objekt "%s" saknar "soname"�inget annat nyckelord ska anges n�r "copy" anv�nds�ingen utfil skapad p� grund av varningar�ingen repertoarmap angiven: kan inte forts�tta�inget symboliskt namn givet�inget symboliskt namn givet f�r slutet av intervallet�ingen vikt definierad f�r symbol "%s"�inte en normal fil�nscd konfiguration:
+-
+-%15d  servers fels�kningsl�ge
+-�nscd k�r inte!
+-�endast definition av "WIDTH" f�r f�lja definitionen av "CHARMAP"�originalkodning inte angiven med "-f"�resultatfil�pmap_getmaps rpc problem�poll: protokollfel i f�rbindelseupps�ttning
+-�preprocessorfel�skriv lista med r�knade v�gar och antal anv�ndningar�skriv information om k�rning�problem l�sa "%s"�profildatafil "%s" st�mmer inte f�r delat objekt "%s"�program %lu �r inte tillg�ngligt
+-�program %lu version %lu �r inte tillg�ngligt
+-�program %lu version %lu redo och v�ntar
+-�rcmd: poll (s�tter upp standard fel): %m
+-�rcmd: uttag (socket): Alla portar anv�nds
+-�rcmd: write: (s�tter upp standard fel): %m
+-�registerrpc: minnet slut
+-�upprepat skottsekundstillf�lle�hittar inte repertoartabell "%s"�rpcgen: arglist kodningsfel
+-�rpcgen: f�r m�nga "define"
+-�rpcinfo: %s �r en ok�nd v�rd
+-�rpcinfo: %s �r en ok�nd tj�nst
+-�rpcinfo: Kunde inte ta bort registrering av prog %s version %s
+-�rpcinfo: uts�ndning misslyckades: %s
+-�rpcinfo: kan inte kontakta portmapper�samma regel i flera filer�fattas data vid l�sning av beg�ransnyckel: %s�fattas data vid l�sning av beg�ran: %s�ofullst�ndig skrivning i %s: %s�uttag (socket): protokollfel i f�rbindelseupps�ttning
+-�sorteringsordning "forward" och "backward" �r �msesidigt uteslutande�specifikation av sorteringsvikter f�r kollationssymbol verkar inte vettig�standard in�standard ut�startdatum �r otill�tet i str�ng %d i "era"-f�lt i kategori "%s"�start�r �r st�rre �n slut�r�start�r f�r stort f�r att kunna representeras�start�r f�r litet f�r att kunna representeras�slutdatum �r otill�tet i str�ng %d i "era"-f�lt i kategori "%s"�svc_run: - select misslyckades�svc_tcp.c - kan inte anropa getsockname eller listen�svc_tcp.c - problem att skapa tcp-uttag (socket)�svc_tcp: makefd_xprt: minnet slut
+-�svc_unix.c - problem att skapa AF_UNIX uttag (socket)�svc_unix.c - kan inte anropa getsockname eller listen�svc_unix: makefd_xprt: minnet slut
+-�svctcp_create: minnet slut
+-�svcudp_create - kan inte anropa getsockname�svcudb_create: minnet slut
+-�svcudp_create: problem att skapa uttag (socket)�svcunix_create: minnet slut
+-�symbol f�r flerteckenskollationselement "%.*s" duplicerar elementdefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar annan
+-elementdefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar annan
+-symboldefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar symboldefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar symboliskt
+-namn i teckenupps�ttning�syntaxfel i definition av %s: %s�syntaxfel i direktivet "order_start"�syntaxfel i teckenklassdefinition�syntaxfel i teckenkonverteringsdefinition�syntaxfel i kollationssorteringsdefinition�syntaxfel i kollationsdefinition�syntaxfel i definition av kategorin LC_CTYPE�syntaxfel i definition av ny teckenklass�syntaxfel i definition av ny teckenupps�ttning�syntaxfel i definition av meddelandelokal�syntaxfel i definition av monet�rlokal�syntaxfel i definition av numerisk lokal�syntaxfel i sorteringsspecifikation�syntaxfel i prolog: %s�syntaxfel i repertoartabellsdefinition: %s�syntaxfel i definition av tidslokal�syntaxfel: inte inne i en lokaldefinition�m�lkodning ej angivet med flagga "-t"�detta �r den f�rsta definitionen�tid f�re noll�f�r stort tidsv�rde�f�r f� byte i teckenkodning�f�r m�nga tecken i teckenkodning�f�r m�nga teckenklasser definierade�f�r m�nga skottsekunder�f�r m�nga lokala tidstyper�f�r m�nga �verg�ngar?!�f�r m�nga vikter�f�r m�nga eller f�r l�nga tidszonf�rkortningar�avslutande skr�p vid radslutet�problem att svara till prog %d
+-�tv� rader efter varann som har "..." �r inte till�tet�satte typ p� endast ett �r�kan inte allokera buffert f�r indata�kan inte avallokera argument�odefinierad�ok�nt tecken "%s"�ok�nt tecken i f�lt "%s" i kategori "%s"�ok�nt kollationsdirektiv�ok�nt direktiv "%s": rad ignorerad�ok�nt fel fr�n iconv() %d�ok�nd m�ngd "%s"�ok�nd symbol "%.*s": rad ignorerad�besv�rlig zon�oavslutat meddelande�oavslutad str�ng�oavslutad str�ngkonstant�oavslutat symboliskt namn�oavslutat viktnamn��vre gr�ns i intervall �r inte mindre �n undre gr�ns�anv�ndning:  %s infil
+-�anv�nder 29/2 i icke-skott�r�v�rdet p� %s m�ste vara heltal�v�rde p� <%s> m�ste vara mellan 1 och 4�v�rde p� f�lt "%s" i kategori "%s" f�r inte vara tom str�ng�v�rdet p� <mb_cur_max> m�ste vara st�rre �n v�rdet p� <mb_cur_min>�v�rdet p� f�ltet "int_curr_symbol" i kategorin LC_MONETARY st�mmer inte med v�rden i ISO 4217�v�rdet p� f�ltet "int_curr_symbol" i kategorin LC_MONETARY har fel l�ngd�v�rden p� f�lt "%s" i kategorin "%s" m�ste vara mindre �n 127�n�r f�rbindelse accepterades: %s�n�r cache-post allokerades�n�r hashtabellspost allokerades�n�r nyckelkopia allokerades�n�r gammal katalogfil �ppnades�n�r utdata f�rbereddes�n�r databasen l�stes�n�r status togs p� profildatafilen�n�r databasfilen skrevs�ofullst�nding skrivning�skrivbar f�r andra �n �garen�fel antal argument�fel antal f�lt p� "Leap"-rad�fel antal f�lt p� "Link"-rad�fel antal f�lt p� "Rule"-rad�fel antal f�lt p� "Zone"-forts�ttningsrad�fel antal f�lt p� "Zone"-rad�xdr_reference: minnet slut
+-�xdrrec_create: minnet slut
+-�yp_update: kan inte omvandla v�rd till n�tnamn
+-�yp_update: kan inte h�mta serveradress
+-�
+\ No newline at end of file
+diff -Naur ../glibc-2.1.3/po/sv.po glibc-2.1.3/po/sv.po
+--- ../glibc-2.1.3/po/sv.po	1999-01-24 07:37:32.000000000 -0800
++++ glibc-2.1.3/po/sv.po	1999-01-25 09:45:47.000000000 -0800
+@@ -1,7 +1,7 @@
+ # GNU libc message catalog for swedish
+ # Copyright � 1996, 1998 Free Software Foundation, Inc.
+ # Jan Dj�rv <Jan.Djarv@mbox200.swipnet.se>, 1996, 1998.
+-# $Revision: 1.5 $
++# $Revision: 1.1.1.1 $
+ #
+ msgid ""
+ msgstr ""
+diff -Naur ../glibc-2.1.3/posix/glob/ChangeLog glibc-2.1.3/posix/glob/ChangeLog
+--- ../glibc-2.1.3/posix/glob/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/ChangeLog	1998-02-07 12:24:16.000000000 -0800
+@@ -0,0 +1,23 @@
++Sat Jul 20 21:55:31 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
++
++	Win32 hacks from <Rob_Tulloh@tivoli.com>.
++	* posix/glob.c [WIN32]: Don't include <pwd.h>; don't use d_ino;
++	use void * for my_realloc; include <malloc.h> for alloca.
++	(glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable.
++	* posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__].
++	* posix/glob.h: Likewise.
++
++Fri Jul 19 16:56:41 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
++
++	* posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA]
++	for `struct stat;' forward decl.
++
++Sat Jun 22 10:44:09 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
++
++	* posix/glob.c: Include <alloca.h> only [HAVE_ALLOCA_H], not [sparc].
++
++Fri Jun 21 00:27:51 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
++
++	* posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr
++ 	only for ?s, not for *s.  Fix from Chet Ramey.
++
+diff -Naur ../glibc-2.1.3/posix/glob/Makefile.ami glibc-2.1.3/posix/glob/Makefile.ami
+--- ../glibc-2.1.3/posix/glob/Makefile.ami	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/Makefile.ami	1998-02-07 12:24:16.000000000 -0800
+@@ -0,0 +1,69 @@
++# Makefile for standalone distribution of libglob.a (fnmatch, glob).
++
++# Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License
++# as published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++
++# This library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++# Ultrix 2.2 make doesn't expand the value of VPATH.
++VPATH = /glob/
++# This must repeat the value, because configure will remove `VPATH = .'.
++srcdir = /glob/
++
++CC = sc
++RM = delete
++CPPFLAGS =
++CFLAGS =
++
++# Information determined by configure.
++DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
++	Define HAVE_DIRENT_H
++
++# How to invoke ar.
++AR = join
++ARFLAGS = as
++
++# How to invoke ranlib.
++RANLIB = ;
++
++.PHONY: all
++all: glob.lib
++
++glob.lib : glob.o fnmatch.o
++	$(AR) $(ARFLAGS) $@ glob.o fnmatch.o
++	$(RANLIB) $@
++
++# For some reason, Unix make wants the dependencies on the source files.
++# Otherwise it refuses to use an implicit rule!
++# And, get this: it doesn't work to use $(srcdir)foo.c!!
++glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
++fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
++
++OUTPUT_OPTION =
++.c.o:
++	$(CC) IDir "" \
++	      $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
++
++.PHONY: clean realclean glob-clean glob-realclean distclean
++clean glob-clean:
++	-$(RM) glob.lib "#?.o" core
++distclean glob-realclean: clean
++	-$(RM) TAGS tags Makefile config.status config.h config.log
++realcean: distclean
++
++# For inside the C library.
++glob.tar glob.tar.Z:
++	$(MAKE) -C .. $@
+diff -Naur ../glibc-2.1.3/posix/glob/Makefile.in glibc-2.1.3/posix/glob/Makefile.in
+--- ../glibc-2.1.3/posix/glob/Makefile.in	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/Makefile.in	1998-02-07 12:24:16.000000000 -0800
+@@ -0,0 +1,66 @@
++# Makefile for standalone distribution of libglob.a (fnmatch, glob).
++
++# Copyright (C) 1991, 92, 93, 94, 95 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License
++# as published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++
++# This library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with this library; see the file COPYING.LIB.  If
++# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
++# Cambridge, MA 02139, USA.
++
++# Ultrix 2.2 make doesn't expand the value of VPATH.
++VPATH = @srcdir@
++# This must repeat the value, because configure will remove `VPATH = .'.
++srcdir = @srcdir@
++
++CC = @CC@
++CPPFLAGS = @CPPFLAGS@
++CFLAGS = @CFLAGS@
++
++# Information determined by configure.
++DEFS = @DEFS@
++
++# How to invoke ar.
++AR = @AR@
++ARFLAGS = rv
++
++# How to invoke ranlib.
++RANLIB = @RANLIB@
++
++.PHONY: all
++all: libglob.a
++
++libglob.a: glob.o fnmatch.o
++	$(AR) $(ARFLAGS) $@ glob.o fnmatch.o
++	$(RANLIB) $@
++
++# For some reason, Unix make wants the dependencies on the source files.
++# Otherwise it refuses to use an implicit rule!
++# And, get this: it doesn't work to use $(srcdir)/foo.c!!
++glob.o: $(srcdir)/glob.h $(srcdir)/fnmatch.h glob.c
++fnmatch.o: $(srcdir)/fnmatch.h fnmatch.c
++
++.c.o:
++	$(CC) -I. -I$(srcdir) -c \
++	      $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
++
++.PHONY: clean realclean glob-clean glob-realclean distclean
++clean glob-clean:
++	-rm -f libglob.a *.o core
++distclean glob-realclean: clean
++	-rm -f TAGS tags Makefile config.status config.h config.log
++realcean: distclean
++
++# For inside the C library.
++glob.tar glob.tar.Z:
++	$(MAKE) -C .. $@
+diff -Naur ../glibc-2.1.3/posix/glob/SCOPTIONS glibc-2.1.3/posix/glob/SCOPTIONS
+--- ../glibc-2.1.3/posix/glob/SCOPTIONS	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/SCOPTIONS	1998-02-07 12:24:16.000000000 -0800
+@@ -0,0 +1,13 @@
++ERRORREXX
++OPTIMIZE
++NOVERSION
++OPTIMIZERTIME
++OPTIMIZERALIAS
++DEFINE INCLUDEDIR="include:"
++DEFINE LIBDIR="lib:"
++DEFINE NO_ALLOCA
++DEFINE NO_FLOAT
++DEFINE NO_ARCHIVES
++IGNORE=161
++IGNORE=100
++STARTUP=cres
+diff -Naur ../glibc-2.1.3/posix/glob/SMakefile glibc-2.1.3/posix/glob/SMakefile
+--- ../glibc-2.1.3/posix/glob/SMakefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/SMakefile	1998-02-07 12:24:16.000000000 -0800
+@@ -0,0 +1,69 @@
++# Makefile for standalone distribution of libglob.a (fnmatch, glob).
++
++# Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc.
++# This file is part of the GNU C Library.
++
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Library General Public License
++# as published by the Free Software Foundation; either version 2 of
++# the License, or (at your option) any later version.
++
++# This library 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
++# Library General Public License for more details.
++
++# You should have received a copy of the GNU Library General Public
++# License along with the GNU C Library; see the file COPYING.LIB.  If not,
++# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++# Boston, MA 02111-1307, USA.
++
++# Ultrix 2.2 make doesn't expand the value of VPATH.
++VPATH = /glob/
++# This must repeat the value, because configure will remove `VPATH = .'.
++srcdir = /glob/
++
++CC = sc
++CPPFLAGS =
++CFLAGS =
++MAKE = smake
++RM = delete
++
++# Information determined by configure.
++DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
++	Define HAVE_DIRENT_H
++
++# How to invoke ar.
++AR = join
++ARFLAGS = as
++
++# How to invoke ranlib.
++RANLIB = ;
++
++.PHONY: all
++all: glob.lib
++
++glob.lib : glob.o fnmatch.o
++	$(AR) $(ARFLAGS) $@ glob.o fnmatch.o
++	$(RANLIB) $@
++
++# For some reason, Unix make wants the dependencies on the source files.
++# Otherwise it refuses to use an implicit rule!
++# And, get this: it doesn't work to use $(srcdir)foo.c!!
++glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
++fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
++
++.c.o:
++	$(CC) IDir "" \
++	      $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
++
++.PHONY: clean realclean glob-clean glob-realclean distclean
++clean glob-clean:
++	-$(RM) -f glob.lib *.o core
++distclean glob-realclean: clean
++	-$(RM) -f TAGS tags Makefile config.status config.h config.log
++realcean: distclean
++
++# For inside the C library.
++glob.tar glob.tar.Z:
++	$(MAKE) -C .. $@
+diff -Naur ../glibc-2.1.3/posix/glob/configure glibc-2.1.3/posix/glob/configure
+--- ../glibc-2.1.3/posix/glob/configure	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/configure	1998-02-07 12:24:21.000000000 -0800
+@@ -0,0 +1,1664 @@
++#! /bin/sh
++
++# Guess values for system-dependent variables and create Makefiles.
++# Generated automatically using autoconf version 2.7 
++# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
++#
++# This configure script is free software; the Free Software Foundation
++# gives unlimited permission to copy, distribute and modify it.
++
++# Defaults:
++ac_help=
++ac_default_prefix=/usr/local
++# Any additions from configure.in:
++
++# Initialize some variables set by options.
++# The variables have the same names as the options, with
++# dashes changed to underlines.
++build=NONE
++cache_file=./config.cache
++exec_prefix=NONE
++host=NONE
++no_create=
++nonopt=NONE
++no_recursion=
++prefix=NONE
++program_prefix=NONE
++program_suffix=NONE
++program_transform_name=s,x,x,
++silent=
++site=
++srcdir=
++target=NONE
++verbose=
++x_includes=NONE
++x_libraries=NONE
++bindir='${exec_prefix}/bin'
++sbindir='${exec_prefix}/sbin'
++libexecdir='${exec_prefix}/libexec'
++datadir='${prefix}/share'
++sysconfdir='${prefix}/etc'
++sharedstatedir='${prefix}/com'
++localstatedir='${prefix}/var'
++libdir='${exec_prefix}/lib'
++includedir='${prefix}/include'
++oldincludedir='/usr/include'
++infodir='${prefix}/info'
++mandir='${prefix}/man'
++
++# Initialize some other variables.
++subdirs=
++MFLAGS= MAKEFLAGS=
++
++ac_prev=
++for ac_option
++do
++
++  # If the previous option needs an argument, assign it.
++  if test -n "$ac_prev"; then
++    eval "$ac_prev=\$ac_option"
++    ac_prev=
++    continue
++  fi
++
++  case "$ac_option" in
++  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
++  *) ac_optarg= ;;
++  esac
++
++  # Accept the important Cygnus configure options, so we can diagnose typos.
++
++  case "$ac_option" in
++
++  -bindir | --bindir | --bindi | --bind | --bin | --bi)
++    ac_prev=bindir ;;
++  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
++    bindir="$ac_optarg" ;;
++
++  -build | --build | --buil | --bui | --bu)
++    ac_prev=build ;;
++  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
++    build="$ac_optarg" ;;
++
++  -cache-file | --cache-file | --cache-fil | --cache-fi \
++  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
++    ac_prev=cache_file ;;
++  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
++  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
++    cache_file="$ac_optarg" ;;
++
++  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
++    ac_prev=datadir ;;
++  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
++  | --da=*)
++    datadir="$ac_optarg" ;;
++
++  -disable-* | --disable-*)
++    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
++    # Reject names that are not valid shell variable names.
++    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
++      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
++    fi
++    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
++    eval "enable_${ac_feature}=no" ;;
++
++  -enable-* | --enable-*)
++    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
++    # Reject names that are not valid shell variable names.
++    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
++      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
++    fi
++    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
++    case "$ac_option" in
++      *=*) ;;
++      *) ac_optarg=yes ;;
++    esac
++    eval "enable_${ac_feature}='$ac_optarg'" ;;
++
++  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
++  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
++  | --exec | --exe | --ex)
++    ac_prev=exec_prefix ;;
++  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
++  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
++  | --exec=* | --exe=* | --ex=*)
++    exec_prefix="$ac_optarg" ;;
++
++  -gas | --gas | --ga | --g)
++    # Obsolete; use --with-gas.
++    with_gas=yes ;;
++
++  -help | --help | --hel | --he)
++    # Omit some internal or obsolete options to make the list less imposing.
++    # This message is too long to be a string in the A/UX 3.1 sh.
++    cat << EOF
++Usage: configure [options] [host]
++Options: [defaults in brackets after descriptions]
++Configuration:
++  --cache-file=FILE       cache test results in FILE
++  --help                  print this message
++  --no-create             do not create output files
++  --quiet, --silent       do not print \`checking...' messages
++  --version               print the version of autoconf that created configure
++Directory and file names:
++  --prefix=PREFIX         install architecture-independent files in PREFIX
++                          [$ac_default_prefix]
++  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
++                          [same as prefix]
++  --bindir=DIR            user executables in DIR [EPREFIX/bin]
++  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
++  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
++  --datadir=DIR           read-only architecture-independent data in DIR
++                          [PREFIX/share]
++  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
++  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
++                          [PREFIX/com]
++  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
++  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
++  --includedir=DIR        C header files in DIR [PREFIX/include]
++  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
++  --infodir=DIR           info documentation in DIR [PREFIX/info]
++  --mandir=DIR            man documentation in DIR [PREFIX/man]
++  --srcdir=DIR            find the sources in DIR [configure dir or ..]
++  --program-prefix=PREFIX prepend PREFIX to installed program names
++  --program-suffix=SUFFIX append SUFFIX to installed program names
++  --program-transform-name=PROGRAM
++                          run sed PROGRAM on installed program names
++EOF
++    cat << EOF
++Host type:
++  --build=BUILD           configure for building on BUILD [BUILD=HOST]
++  --host=HOST             configure for HOST [guessed]
++  --target=TARGET         configure for TARGET [TARGET=HOST]
++Features and packages:
++  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
++  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
++  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
++  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
++  --x-includes=DIR        X include files are in DIR
++  --x-libraries=DIR       X library files are in DIR
++EOF
++    if test -n "$ac_help"; then
++      echo "--enable and --with options recognized:$ac_help"
++    fi
++    exit 0 ;;
++
++  -host | --host | --hos | --ho)
++    ac_prev=host ;;
++  -host=* | --host=* | --hos=* | --ho=*)
++    host="$ac_optarg" ;;
++
++  -includedir | --includedir | --includedi | --included | --include \
++  | --includ | --inclu | --incl | --inc)
++    ac_prev=includedir ;;
++  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
++  | --includ=* | --inclu=* | --incl=* | --inc=*)
++    includedir="$ac_optarg" ;;
++
++  -infodir | --infodir | --infodi | --infod | --info | --inf)
++    ac_prev=infodir ;;
++  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
++    infodir="$ac_optarg" ;;
++
++  -libdir | --libdir | --libdi | --libd)
++    ac_prev=libdir ;;
++  -libdir=* | --libdir=* | --libdi=* | --libd=*)
++    libdir="$ac_optarg" ;;
++
++  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
++  | --libexe | --libex | --libe)
++    ac_prev=libexecdir ;;
++  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
++  | --libexe=* | --libex=* | --libe=*)
++    libexecdir="$ac_optarg" ;;
++
++  -localstatedir | --localstatedir | --localstatedi | --localstated \
++  | --localstate | --localstat | --localsta | --localst \
++  | --locals | --local | --loca | --loc | --lo)
++    ac_prev=localstatedir ;;
++  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
++  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
++  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
++    localstatedir="$ac_optarg" ;;
++
++  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
++    ac_prev=mandir ;;
++  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
++    mandir="$ac_optarg" ;;
++
++  -nfp | --nfp | --nf)
++    # Obsolete; use --without-fp.
++    with_fp=no ;;
++
++  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
++  | --no-cr | --no-c)
++    no_create=yes ;;
++
++  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
++  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
++    no_recursion=yes ;;
++
++  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
++  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
++  | --oldin | --oldi | --old | --ol | --o)
++    ac_prev=oldincludedir ;;
++  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
++  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
++  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
++    oldincludedir="$ac_optarg" ;;
++
++  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
++    ac_prev=prefix ;;
++  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
++    prefix="$ac_optarg" ;;
++
++  -program-prefix | --program-prefix | --program-prefi | --program-pref \
++  | --program-pre | --program-pr | --program-p)
++    ac_prev=program_prefix ;;
++  -program-prefix=* | --program-prefix=* | --program-prefi=* \
++  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
++    program_prefix="$ac_optarg" ;;
++
++  -program-suffix | --program-suffix | --program-suffi | --program-suff \
++  | --program-suf | --program-su | --program-s)
++    ac_prev=program_suffix ;;
++  -program-suffix=* | --program-suffix=* | --program-suffi=* \
++  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
++    program_suffix="$ac_optarg" ;;
++
++  -program-transform-name | --program-transform-name \
++  | --program-transform-nam | --program-transform-na \
++  | --program-transform-n | --program-transform- \
++  | --program-transform | --program-transfor \
++  | --program-transfo | --program-transf \
++  | --program-trans | --program-tran \
++  | --progr-tra | --program-tr | --program-t)
++    ac_prev=program_transform_name ;;
++  -program-transform-name=* | --program-transform-name=* \
++  | --program-transform-nam=* | --program-transform-na=* \
++  | --program-transform-n=* | --program-transform-=* \
++  | --program-transform=* | --program-transfor=* \
++  | --program-transfo=* | --program-transf=* \
++  | --program-trans=* | --program-tran=* \
++  | --progr-tra=* | --program-tr=* | --program-t=*)
++    program_transform_name="$ac_optarg" ;;
++
++  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++  | -silent | --silent | --silen | --sile | --sil)
++    silent=yes ;;
++
++  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
++    ac_prev=sbindir ;;
++  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
++  | --sbi=* | --sb=*)
++    sbindir="$ac_optarg" ;;
++
++  -sharedstatedir | --sharedstatedir | --sharedstatedi \
++  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
++  | --sharedst | --shareds | --shared | --share | --shar \
++  | --sha | --sh)
++    ac_prev=sharedstatedir ;;
++  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
++  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
++  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
++  | --sha=* | --sh=*)
++    sharedstatedir="$ac_optarg" ;;
++
++  -site | --site | --sit)
++    ac_prev=site ;;
++  -site=* | --site=* | --sit=*)
++    site="$ac_optarg" ;;
++
++  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
++    ac_prev=srcdir ;;
++  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
++    srcdir="$ac_optarg" ;;
++
++  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
++  | --syscon | --sysco | --sysc | --sys | --sy)
++    ac_prev=sysconfdir ;;
++  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
++  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
++    sysconfdir="$ac_optarg" ;;
++
++  -target | --target | --targe | --targ | --tar | --ta | --t)
++    ac_prev=target ;;
++  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
++    target="$ac_optarg" ;;
++
++  -v | -verbose | --verbose | --verbos | --verbo | --verb)
++    verbose=yes ;;
++
++  -version | --version | --versio | --versi | --vers)
++    echo "configure generated by autoconf version 2.7"
++    exit 0 ;;
++
++  -with-* | --with-*)
++    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
++    # Reject names that are not valid shell variable names.
++    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
++      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
++    fi
++    ac_package=`echo $ac_package| sed 's/-/_/g'`
++    case "$ac_option" in
++      *=*) ;;
++      *) ac_optarg=yes ;;
++    esac
++    eval "with_${ac_package}='$ac_optarg'" ;;
++
++  -without-* | --without-*)
++    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
++    # Reject names that are not valid shell variable names.
++    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
++      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
++    fi
++    ac_package=`echo $ac_package| sed 's/-/_/g'`
++    eval "with_${ac_package}=no" ;;
++
++  --x)
++    # Obsolete; use --with-x.
++    with_x=yes ;;
++
++  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
++  | --x-incl | --x-inc | --x-in | --x-i)
++    ac_prev=x_includes ;;
++  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
++  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
++    x_includes="$ac_optarg" ;;
++
++  -x-libraries | --x-libraries | --x-librarie | --x-librari \
++  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
++    ac_prev=x_libraries ;;
++  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
++  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
++    x_libraries="$ac_optarg" ;;
++
++  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
++    ;;
++
++  *)
++    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
++      echo "configure: warning: $ac_option: invalid host type" 1>&2
++    fi
++    if test "x$nonopt" != xNONE; then
++      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
++    fi
++    nonopt="$ac_option"
++    ;;
++
++  esac
++done
++
++if test -n "$ac_prev"; then
++  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
++fi
++
++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
++
++# File descriptor usage:
++# 0 standard input
++# 1 file creation
++# 2 errors and warnings
++# 3 some systems may open it to /dev/tty
++# 4 used on the Kubota Titan
++# 6 checking for... messages and results
++# 5 compiler messages saved in config.log
++if test "$silent" = yes; then
++  exec 6>/dev/null
++else
++  exec 6>&1
++fi
++exec 5>./config.log
++
++echo "\
++This file contains any messages produced by compilers while
++running configure, to aid debugging if configure makes a mistake.
++" 1>&5
++
++# Strip out --no-create and --no-recursion so they do not pile up.
++# Also quote any args containing shell metacharacters.
++ac_configure_args=
++for ac_arg
++do
++  case "$ac_arg" in
++  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
++  | --no-cr | --no-c) ;;
++  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
++  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
++  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
++  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
++  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
++  esac
++done
++
++# NLS nuisances.
++# Only set LANG and LC_ALL to C if already set.
++# These must not be set unconditionally because not all systems understand
++# e.g. LANG=C (notably SCO).
++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
++if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
++
++# confdefs.h avoids OS command line length limits that DEFS can exceed.
++rm -rf conftest* confdefs.h
++# AIX cpp loses on an empty file, so make sure it contains at least a newline.
++echo > confdefs.h
++
++# A filename unique to this package, relative to the directory that
++# configure is in, which we can look for to find out if srcdir is correct.
++ac_unique_file=fnmatch.c
++
++# Find the source files, if location was not specified.
++if test -z "$srcdir"; then
++  ac_srcdir_defaulted=yes
++  # Try the directory containing this script, then its parent.
++  ac_prog=$0
++  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
++  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
++  srcdir=$ac_confdir
++  if test ! -r $srcdir/$ac_unique_file; then
++    srcdir=..
++  fi
++else
++  ac_srcdir_defaulted=no
++fi
++if test ! -r $srcdir/$ac_unique_file; then
++  if test "$ac_srcdir_defaulted" = yes; then
++    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
++  else
++    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
++  fi
++fi
++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
++
++# Prefer explicitly selected file to automatically selected ones.
++if test -z "$CONFIG_SITE"; then
++  if test "x$prefix" != xNONE; then
++    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
++  else
++    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
++  fi
++fi
++for ac_site_file in $CONFIG_SITE; do
++  if test -r "$ac_site_file"; then
++    echo "loading site script $ac_site_file"
++    . "$ac_site_file"
++  fi
++done
++
++if test -r "$cache_file"; then
++  echo "loading cache $cache_file"
++  . $cache_file
++else
++  echo "creating cache $cache_file"
++  > $cache_file
++fi
++
++ac_ext=c
++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
++ac_cpp='$CPP $CPPFLAGS'
++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
++ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
++
++if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
++  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
++  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
++    ac_n= ac_c='
++' ac_t='	'
++  else
++    ac_n=-n ac_c= ac_t=
++  fi
++else
++  ac_n= ac_c='\c' ac_t=
++fi
++
++					# Extract the first word of "gcc", so it can be a program name with args.
++set dummy gcc; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test -n "$CC"; then
++  ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
++  for ac_dir in $PATH; do
++    test -z "$ac_dir" && ac_dir=.
++    if test -f $ac_dir/$ac_word; then
++      ac_cv_prog_CC="gcc"
++      break
++    fi
++  done
++  IFS="$ac_save_ifs"
++fi
++fi
++CC="$ac_cv_prog_CC"
++if test -n "$CC"; then
++  echo "$ac_t""$CC" 1>&6
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++if test -z "$CC"; then
++  # Extract the first word of "cc", so it can be a program name with args.
++set dummy cc; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test -n "$CC"; then
++  ac_cv_prog_CC="$CC" # Let the user override the test.
++else
++  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
++  ac_prog_rejected=no
++  for ac_dir in $PATH; do
++    test -z "$ac_dir" && ac_dir=.
++    if test -f $ac_dir/$ac_word; then
++      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
++        ac_prog_rejected=yes
++	continue
++      fi
++      ac_cv_prog_CC="cc"
++      break
++    fi
++  done
++  IFS="$ac_save_ifs"
++if test $ac_prog_rejected = yes; then
++  # We found a bogon in the path, so make sure we never use it.
++  set dummy $ac_cv_prog_CC
++  shift
++  if test $# -gt 0; then
++    # We chose a different compiler from the bogus one.
++    # However, it has the same basename, so the bogon will be chosen
++    # first if we set CC to just the basename; use the full file name.
++    shift
++    set dummy "$ac_dir/$ac_word" "$@"
++    shift
++    ac_cv_prog_CC="$@"
++  fi
++fi
++fi
++fi
++CC="$ac_cv_prog_CC"
++if test -n "$CC"; then
++  echo "$ac_t""$CC" 1>&6
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
++fi
++
++echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.c <<EOF
++#ifdef __GNUC__
++  yes;
++#endif
++EOF
++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:601: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
++  ac_cv_prog_gcc=yes
++else
++  ac_cv_prog_gcc=no
++fi
++fi
++
++echo "$ac_t""$ac_cv_prog_gcc" 1>&6
++if test $ac_cv_prog_gcc = yes; then
++  GCC=yes
++  if test "${CFLAGS+set}" != set; then
++    echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  echo 'void f(){}' > conftest.c
++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
++  ac_cv_prog_gcc_g=yes
++else
++  ac_cv_prog_gcc_g=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6
++    if test $ac_cv_prog_gcc_g = yes; then
++      CFLAGS="-g -O"
++    else
++      CFLAGS="-O"
++    fi
++  fi
++else
++  GCC=
++  test "${CFLAGS+set}" = set || CFLAGS="-g"
++fi
++
++# Extract the first word of "ar", so it can be a program name with args.
++set dummy ar; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test -n "$AR"; then
++  ac_cv_prog_AR="$AR" # Let the user override the test.
++else
++  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
++  for ac_dir in $PATH; do
++    test -z "$ac_dir" && ac_dir=.
++    if test -f $ac_dir/$ac_word; then
++      ac_cv_prog_AR="ar"
++      break
++    fi
++  done
++  IFS="$ac_save_ifs"
++  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
++fi
++fi
++AR="$ac_cv_prog_AR"
++if test -n "$AR"; then
++  echo "$ac_t""$AR" 1>&6
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++# Extract the first word of "ranlib", so it can be a program name with args.
++set dummy ranlib; ac_word=$2
++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test -n "$RANLIB"; then
++  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
++else
++  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
++  for ac_dir in $PATH; do
++    test -z "$ac_dir" && ac_dir=.
++    if test -f $ac_dir/$ac_word; then
++      ac_cv_prog_RANLIB="ranlib"
++      break
++    fi
++  done
++  IFS="$ac_save_ifs"
++  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
++fi
++fi
++RANLIB="$ac_cv_prog_RANLIB"
++if test -n "$RANLIB"; then
++  echo "$ac_t""$RANLIB" 1>&6
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
++# On Suns, sometimes $CPP names a directory.
++if test -n "$CPP" && test -d "$CPP"; then
++  CPP=
++fi
++if test -z "$CPP"; then
++if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++    # This must be in double quotes, not single quotes, because CPP may get
++  # substituted into the Makefile and "${CC-cc}" will confuse make.
++  CPP="${CC-cc} -E"
++  # On the NeXT, cc -E runs the code through the compiler's parser,
++  # not just through cpp.
++  cat > conftest.$ac_ext <<EOF
++#line 709 "configure"
++#include "confdefs.h"
++#include <assert.h>
++Syntax Error
++EOF
++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
++{ (eval echo configure:715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++ac_err=`grep -v '^ *+' conftest.out`
++if test -z "$ac_err"; then
++  :
++else
++  echo "$ac_err" >&5
++  rm -rf conftest*
++  CPP="${CC-cc} -E -traditional-cpp"
++  cat > conftest.$ac_ext <<EOF
++#line 724 "configure"
++#include "confdefs.h"
++#include <assert.h>
++Syntax Error
++EOF
++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
++{ (eval echo configure:730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++ac_err=`grep -v '^ *+' conftest.out`
++if test -z "$ac_err"; then
++  :
++else
++  echo "$ac_err" >&5
++  rm -rf conftest*
++  CPP=/lib/cpp
++fi
++rm -f conftest*
++fi
++rm -f conftest*
++  ac_cv_prog_CPP="$CPP"
++fi
++  CPP="$ac_cv_prog_CPP"
++else
++  ac_cv_prog_CPP="$CPP"
++fi
++echo "$ac_t""$CPP" 1>&6
++			echo $ac_n "checking for AIX""... $ac_c" 1>&6
++cat > conftest.$ac_ext <<EOF
++#line 751 "configure"
++#include "confdefs.h"
++#ifdef _AIX
++  yes
++#endif
++
++EOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  egrep "yes" >/dev/null 2>&1; then
++  rm -rf conftest*
++  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
++#define _ALL_SOURCE 1
++EOF
++
++else
++  rm -rf conftest*
++  echo "$ac_t""no" 1>&6
++fi
++rm -f conftest*
++
++
++ac_safe=`echo "minix/config.h" | tr './\055' '___'`
++echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 778 "configure"
++#include "confdefs.h"
++#include <minix/config.h>
++EOF
++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
++{ (eval echo configure:783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++ac_err=`grep -v '^ *+' conftest.out`
++if test -z "$ac_err"; then
++  rm -rf conftest*
++  eval "ac_cv_header_$ac_safe=yes"
++else
++  echo "$ac_err" >&5
++  rm -rf conftest*
++  eval "ac_cv_header_$ac_safe=no"
++fi
++rm -f conftest*
++fi
++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++  MINIX=yes
++else
++  echo "$ac_t""no" 1>&6
++MINIX=
++fi
++
++if test "$MINIX" = yes; then
++  cat >> confdefs.h <<\EOF
++#define _POSIX_SOURCE 1
++EOF
++
++  cat >> confdefs.h <<\EOF
++#define _POSIX_1_SOURCE 2
++EOF
++
++  cat >> confdefs.h <<\EOF
++#define _MINIX 1
++EOF
++
++fi
++
++echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
++if test -d /etc/conf/kconfig.d &&
++  grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
++then
++  echo "$ac_t""yes" 1>&6
++  ISC=yes # If later tests want to check for ISC.
++  cat >> confdefs.h <<\EOF
++#define _POSIX_SOURCE 1
++EOF
++
++  if test "$GCC" = yes; then
++    CC="$CC -posix"
++  else
++    CC="$CC -Xp"
++  fi
++else
++  echo "$ac_t""no" 1>&6
++  ISC=
++fi
++
++echo $ac_n "checking for working const""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 843 "configure"
++#include "confdefs.h"
++
++int main() { return 0; }
++int t() {
++
++/* Ultrix mips cc rejects this.  */
++typedef int charset[2]; const charset x;
++/* SunOS 4.1.1 cc rejects this.  */
++char const *const *ccp;
++char **p;
++/* NEC SVR4.0.2 mips cc rejects this.  */
++struct point {int x, y;};
++static struct point const zero = {0,0};
++/* AIX XL C 1.02.0.0 rejects this.
++   It does not let you subtract one const X* pointer from another in an arm
++   of an if-expression whose if-part is not a constant expression */
++const char *g = "string";
++ccp = &g + (g ? g-g : 0);
++/* HPUX 7.0 cc rejects these. */
++++ccp;
++p = (char**) ccp;
++ccp = (char const *const *) p;
++{ /* SCO 3.2v4 cc rejects this.  */
++  char *t;
++  char const *s = 0 ? (char *) 0 : (char const *) 0;
++
++  *t++ = 0;
++}
++{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
++  int x[] = {25, 17};
++  const int *foo = &x[0];
++  ++foo;
++}
++{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
++  typedef const int *iptr;
++  iptr p = 0;
++  ++p;
++}
++{ /* AIX XL C 1.02.0.0 rejects this saying
++     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
++  struct s { int j; const int *ap[3]; };
++  struct s *b; b->j = 5;
++}
++{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
++  const int foo = 10;
++}
++
++; return 0; }
++EOF
++if { (eval echo configure:893: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++  rm -rf conftest*
++  ac_cv_c_const=yes
++else
++  rm -rf conftest*
++  ac_cv_c_const=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_c_const" 1>&6
++if test $ac_cv_c_const = no; then
++  cat >> confdefs.h <<\EOF
++#define const 
++EOF
++
++fi
++
++# If we cannot run a trivial program, we must be cross compiling.
++echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test "$cross_compiling" = yes; then
++  ac_cv_c_cross=yes
++else
++cat > conftest.$ac_ext <<EOF
++#line 921 "configure"
++#include "confdefs.h"
++main(){return(0);}
++EOF
++{ (eval echo configure:925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
++if test -s conftest && (./conftest; exit) 2>/dev/null; then
++  ac_cv_c_cross=no
++else
++  ac_cv_c_cross=yes
++fi
++fi
++rm -fr conftest*
++fi
++
++echo "$ac_t""$ac_cv_c_cross" 1>&6
++cross_compiling=$ac_cv_c_cross
++
++echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 943 "configure"
++#include "confdefs.h"
++#include <stdlib.h>
++#include <stdarg.h>
++#include <string.h>
++#include <float.h>
++EOF
++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
++{ (eval echo configure:951: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++ac_err=`grep -v '^ *+' conftest.out`
++if test -z "$ac_err"; then
++  rm -rf conftest*
++  ac_cv_header_stdc=yes
++else
++  echo "$ac_err" >&5
++  rm -rf conftest*
++  ac_cv_header_stdc=no
++fi
++rm -f conftest*
++
++if test $ac_cv_header_stdc = yes; then
++  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
++cat > conftest.$ac_ext <<EOF
++#line 966 "configure"
++#include "confdefs.h"
++#include <string.h>
++EOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  egrep "memchr" >/dev/null 2>&1; then
++  :
++else
++  rm -rf conftest*
++  ac_cv_header_stdc=no
++fi
++rm -f conftest*
++
++fi
++
++if test $ac_cv_header_stdc = yes; then
++  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
++cat > conftest.$ac_ext <<EOF
++#line 984 "configure"
++#include "confdefs.h"
++#include <stdlib.h>
++EOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  egrep "free" >/dev/null 2>&1; then
++  :
++else
++  rm -rf conftest*
++  ac_cv_header_stdc=no
++fi
++rm -f conftest*
++
++fi
++
++if test $ac_cv_header_stdc = yes; then
++  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
++if test "$cross_compiling" = yes; then
++  :
++else
++cat > conftest.$ac_ext <<EOF
++#line 1005 "configure"
++#include "confdefs.h"
++#include <ctype.h>
++#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
++#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
++int main () { int i; for (i = 0; i < 256; i++)
++if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
++exit (0); }
++
++EOF
++{ (eval echo configure:1016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
++if test -s conftest && (./conftest; exit) 2>/dev/null; then
++  :
++else
++  ac_cv_header_stdc=no
++fi
++fi
++rm -fr conftest*
++fi
++fi
++
++echo "$ac_t""$ac_cv_header_stdc" 1>&6
++if test $ac_cv_header_stdc = yes; then
++  cat >> confdefs.h <<\EOF
++#define STDC_HEADERS 1
++EOF
++
++fi
++
++for ac_hdr in memory.h unistd.h string.h
++do
++ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1043 "configure"
++#include "confdefs.h"
++#include <$ac_hdr>
++EOF
++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
++{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
++ac_err=`grep -v '^ *+' conftest.out`
++if test -z "$ac_err"; then
++  rm -rf conftest*
++  eval "ac_cv_header_$ac_safe=yes"
++else
++  echo "$ac_err" >&5
++  rm -rf conftest*
++  eval "ac_cv_header_$ac_safe=no"
++fi
++rm -f conftest*
++fi
++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++    ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'`
++  cat >> confdefs.h <<EOF
++#define $ac_tr_hdr 1
++EOF
++ 
++else
++  echo "$ac_t""no" 1>&6
++fi
++done
++
++ac_header_dirent=no
++for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
++do
++ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
++echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1081 "configure"
++#include "confdefs.h"
++#include <sys/types.h>
++#include <$ac_hdr>
++int main() { return 0; }
++int t() {
++DIR *dirp = 0;
++; return 0; }
++EOF
++if { (eval echo configure:1090: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
++  rm -rf conftest*
++  eval "ac_cv_header_dirent_$ac_safe=yes"
++else
++  rm -rf conftest*
++  eval "ac_cv_header_dirent_$ac_safe=no"
++fi
++rm -f conftest*
++
++fi
++if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++    ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdedfghijklmnopqrstuvwxyz./\055' 'ABCDEDFGHIJKLMNOPQRSTUVWXYZ___'`
++  cat >> confdefs.h <<EOF
++#define $ac_tr_hdr 1
++EOF
++ ac_header_dirent=$ac_hdr; break
++else
++  echo "$ac_t""no" 1>&6
++fi
++done
++# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
++if test $ac_header_dirent = dirent.h; then
++echo $ac_n "checking for -ldir""... $ac_c" 1>&6
++ac_lib_var=`echo dir | tr '.-/+' '___p'`
++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  ac_save_LIBS="$LIBS"
++LIBS="-ldir  $LIBS"
++cat > conftest.$ac_ext <<EOF
++#line 1121 "configure"
++#include "confdefs.h"
++
++int main() { return 0; }
++int t() {
++opendir()
++; return 0; }
++EOF
++if { (eval echo configure:1129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  rm -rf conftest*
++  eval "ac_cv_lib_$ac_lib_var=yes"
++else
++  rm -rf conftest*
++  eval "ac_cv_lib_$ac_lib_var=no"
++fi
++rm -f conftest*
++LIBS="$ac_save_LIBS"
++
++fi
++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++  LIBS="$LIBS -ldir"
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++else
++echo $ac_n "checking for -lx""... $ac_c" 1>&6
++ac_lib_var=`echo x | tr '.-/+' '___p'`
++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  ac_save_LIBS="$LIBS"
++LIBS="-lx  $LIBS"
++cat > conftest.$ac_ext <<EOF
++#line 1156 "configure"
++#include "confdefs.h"
++
++int main() { return 0; }
++int t() {
++opendir()
++; return 0; }
++EOF
++if { (eval echo configure:1164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  rm -rf conftest*
++  eval "ac_cv_lib_$ac_lib_var=yes"
++else
++  rm -rf conftest*
++  eval "ac_cv_lib_$ac_lib_var=no"
++fi
++rm -f conftest*
++LIBS="$ac_save_LIBS"
++
++fi
++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++  LIBS="$LIBS -lx"
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++fi
++
++echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test "$cross_compiling" = yes; then
++  ac_cv_func_closedir_void=yes
++else
++cat > conftest.$ac_ext <<EOF
++#line 1192 "configure"
++#include "confdefs.h"
++#include <sys/types.h>
++#include <$ac_header_dirent>
++int closedir(); main() { exit(closedir(opendir(".")) != 0); }
++EOF
++{ (eval echo configure:1198: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
++if test -s conftest && (./conftest; exit) 2>/dev/null; then
++  ac_cv_func_closedir_void=no
++else
++  ac_cv_func_closedir_void=yes
++fi
++fi
++rm -fr conftest*
++fi
++
++echo "$ac_t""$ac_cv_func_closedir_void" 1>&6
++if test $ac_cv_func_closedir_void = yes; then
++  cat >> confdefs.h <<\EOF
++#define CLOSEDIR_VOID 1
++EOF
++
++fi
++
++# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
++# for constant arguments.  Useless!
++echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1223 "configure"
++#include "confdefs.h"
++#include <alloca.h>
++int main() { return 0; }
++int t() {
++char *p = alloca(2 * sizeof(int));
++; return 0; }
++EOF
++if { (eval echo configure:1231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  rm -rf conftest*
++  ac_cv_header_alloca_h=yes
++else
++  rm -rf conftest*
++  ac_cv_header_alloca_h=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
++if test $ac_cv_header_alloca_h = yes; then
++  cat >> confdefs.h <<\EOF
++#define HAVE_ALLOCA_H 1
++EOF
++
++fi
++
++echo $ac_n "checking for alloca""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1255 "configure"
++#include "confdefs.h"
++
++#ifdef __GNUC__
++# define alloca __builtin_alloca
++#else
++# if HAVE_ALLOCA_H
++#  include <alloca.h>
++# else
++#  ifdef _AIX
++ #pragma alloca
++#  else
++#   ifndef alloca /* predefined by HP cc +Olibcalls */
++char *alloca ();
++#   endif
++#  endif
++# endif
++#endif
++
++int main() { return 0; }
++int t() {
++char *p = (char *) alloca(1);
++; return 0; }
++EOF
++if { (eval echo configure:1279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  rm -rf conftest*
++  ac_cv_func_alloca=yes
++else
++  rm -rf conftest*
++  ac_cv_func_alloca=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_func_alloca" 1>&6
++if test $ac_cv_func_alloca = yes; then
++  cat >> confdefs.h <<\EOF
++#define HAVE_ALLOCA 1
++EOF
++
++fi
++
++if test $ac_cv_func_alloca = no; then
++  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
++  # that cause trouble.  Some versions do not even contain alloca or
++  # contain a buggy version.  If you still want to use their alloca,
++  # use ar to extract alloca.o from them instead of compiling alloca.c.
++  ALLOCA=alloca.o
++  cat >> confdefs.h <<\EOF
++#define C_ALLOCA 1
++EOF
++
++
++echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1314 "configure"
++#include "confdefs.h"
++#if defined(CRAY) && ! defined(CRAY2)
++webecray
++#else
++wenotbecray
++#endif
++
++EOF
++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
++  egrep "webecray" >/dev/null 2>&1; then
++  rm -rf conftest*
++  ac_cv_os_cray=yes
++else
++  rm -rf conftest*
++  ac_cv_os_cray=no
++fi
++rm -f conftest*
++
++fi
++
++echo "$ac_t""$ac_cv_os_cray" 1>&6
++if test $ac_cv_os_cray = yes; then
++for ac_func in _getb67 GETB67 getb67; do
++  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  cat > conftest.$ac_ext <<EOF
++#line 1343 "configure"
++#include "confdefs.h"
++/* System header to define __stub macros and hopefully few prototypes,
++    which can conflict with char $ac_func(); below.  */
++#include <assert.h>
++/* Override any gcc2 internal prototype to avoid an error.  */
++char $ac_func();
++
++int main() { return 0; }
++int t() {
++
++/* The GNU C library defines this for functions which it implements
++    to always fail with ENOSYS.  Some functions are actually named
++    something starting with __ and the normal name is an alias.  */
++#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
++choke me
++#else
++$ac_func();
++#endif
++
++; return 0; }
++EOF
++if { (eval echo configure:1365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
++  rm -rf conftest*
++  eval "ac_cv_func_$ac_func=yes"
++else
++  rm -rf conftest*
++  eval "ac_cv_func_$ac_func=no"
++fi
++rm -f conftest*
++
++fi
++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
++  echo "$ac_t""yes" 1>&6
++  cat >> confdefs.h <<EOF
++#define CRAY_STACKSEG_END $ac_func
++EOF
++
++  break
++else
++  echo "$ac_t""no" 1>&6
++fi
++
++done
++fi
++
++echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test "$cross_compiling" = yes; then
++  ac_cv_c_stack_direction=0
++else
++cat > conftest.$ac_ext <<EOF
++#line 1397 "configure"
++#include "confdefs.h"
++find_stack_direction ()
++{
++  static char *addr = 0;
++  auto char dummy;
++  if (addr == 0)
++    {
++      addr = &dummy;
++      return find_stack_direction ();
++    }
++  else
++    return (&dummy > addr) ? 1 : -1;
++}
++main ()
++{
++  exit (find_stack_direction() < 0);
++}
++EOF
++{ (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
++if test -s conftest && (./conftest; exit) 2>/dev/null; then
++  ac_cv_c_stack_direction=1
++else
++  ac_cv_c_stack_direction=-1
++fi
++fi
++rm -fr conftest*
++fi
++
++echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
++cat >> confdefs.h <<EOF
++#define STACK_DIRECTION $ac_cv_c_stack_direction
++EOF
++
++fi
++
++echo $ac_n "checking for strcoll""... $ac_c" 1>&6
++if eval "test \"`echo '$''{'ac_cv_func_strcoll'+set}'`\" = set"; then
++  echo $ac_n "(cached) $ac_c" 1>&6
++else
++  if test "$cross_compiling" = yes; then
++  ac_cv_func_strcoll=no
++else
++cat > conftest.$ac_ext <<EOF
++#line 1441 "configure"
++#include "confdefs.h"
++#include <string.h>
++main ()
++{
++  exit (strcoll ("abc", "def") >= 0 ||
++	strcoll ("ABC", "DEF") >= 0 ||
++	strcoll ("123", "456") >= 0);
++}
++EOF
++{ (eval echo configure:1451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
++if test -s conftest && (./conftest; exit) 2>/dev/null; then
++  ac_cv_func_strcoll=yes
++else
++  ac_cv_func_strcoll=no
++fi
++fi
++rm -fr conftest*
++fi
++
++echo "$ac_t""$ac_cv_func_strcoll" 1>&6
++if test $ac_cv_func_strcoll = yes; then
++  cat >> confdefs.h <<\EOF
++#define HAVE_STRCOLL 1
++EOF
++
++fi
++
++trap '' 1 2 15
++cat > confcache <<\EOF
++# This file is a shell script that caches the results of configure
++# tests run on this system so they can be shared between configure
++# scripts and configure runs.  It is not useful on other systems.
++# If it contains results you don't want to keep, you may remove or edit it.
++#
++# By default, configure uses ./config.cache as the cache file,
++# creating it if it does not exist already.  You can give configure
++# the --cache-file=FILE option to use a different cache file; that is
++# what configure does when it calls configure scripts in
++# subdirectories, so they share the cache.
++# Giving --cache-file=/dev/null disables caching, for debugging configure.
++# config.status only pays attention to the cache file if you give it the
++# --recheck option to rerun configure.
++#
++EOF
++# Ultrix sh set writes to stderr and can't be redirected directly,
++# and sets the high bit in the cache file unless we assign to the vars.
++(set) 2>&1 |
++  sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \
++  >> confcache
++if cmp -s $cache_file confcache; then
++  :
++else
++  if test -w $cache_file; then
++    echo "updating cache $cache_file"
++    cat confcache > $cache_file
++  else
++    echo "not updating unwritable cache $cache_file"
++  fi
++fi
++rm -f confcache
++
++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
++
++test "x$prefix" = xNONE && prefix=$ac_default_prefix
++# Let make expand exec_prefix.
++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
++
++# Any assignment to VPATH causes Sun make to only execute
++# the first set of double-colon rules, so remove it if not needed.
++# If there is a colon in the path, we need to keep it.
++if test "x$srcdir" = x.; then
++  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
++fi
++
++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
++
++# Transform confdefs.h into DEFS.
++# Protect against shell expansion while executing Makefile rules.
++# Protect against Makefile macro expansion.
++cat > conftest.defs <<\EOF
++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
++s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
++s%\[%\\&%g
++s%\]%\\&%g
++s%\$%$$%g
++EOF
++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
++rm -f conftest.defs
++
++
++# Without the "./", some shells look in PATH for config.status.
++: ${CONFIG_STATUS=./config.status}
++
++echo creating $CONFIG_STATUS
++rm -f $CONFIG_STATUS
++cat > $CONFIG_STATUS <<EOF
++#! /bin/sh
++# Generated automatically by configure.
++# Run this file to recreate the current configuration.
++# This directory was configured as follows,
++# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
++#
++# $0 $ac_configure_args
++#
++# Compiler output produced by configure, useful for debugging
++# configure, is in ./config.log if it exists.
++
++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
++for ac_option
++do
++  case "\$ac_option" in
++  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
++    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
++    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
++  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
++    echo "$CONFIG_STATUS generated by autoconf version 2.7"
++    exit 0 ;;
++  -help | --help | --hel | --he | --h)
++    echo "\$ac_cs_usage"; exit 0 ;;
++  *) echo "\$ac_cs_usage"; exit 1 ;;
++  esac
++done
++
++ac_given_srcdir=$srcdir
++
++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
++EOF
++cat >> $CONFIG_STATUS <<EOF
++
++# Protect against being on the right side of a sed subst in config.status.
++sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
++ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
++$ac_vpsub
++$extrasub
++s%@CFLAGS@%$CFLAGS%g
++s%@CPPFLAGS@%$CPPFLAGS%g
++s%@CXXFLAGS@%$CXXFLAGS%g
++s%@DEFS@%$DEFS%g
++s%@LDFLAGS@%$LDFLAGS%g
++s%@LIBS@%$LIBS%g
++s%@exec_prefix@%$exec_prefix%g
++s%@prefix@%$prefix%g
++s%@program_transform_name@%$program_transform_name%g
++s%@bindir@%$bindir%g
++s%@sbindir@%$sbindir%g
++s%@libexecdir@%$libexecdir%g
++s%@datadir@%$datadir%g
++s%@sysconfdir@%$sysconfdir%g
++s%@sharedstatedir@%$sharedstatedir%g
++s%@localstatedir@%$localstatedir%g
++s%@libdir@%$libdir%g
++s%@includedir@%$includedir%g
++s%@oldincludedir@%$oldincludedir%g
++s%@infodir@%$infodir%g
++s%@mandir@%$mandir%g
++s%@CC@%$CC%g
++s%@AR@%$AR%g
++s%@RANLIB@%$RANLIB%g
++s%@CPP@%$CPP%g
++s%@ALLOCA@%$ALLOCA%g
++
++CEOF
++EOF
++cat >> $CONFIG_STATUS <<EOF
++
++CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
++EOF
++cat >> $CONFIG_STATUS <<\EOF
++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
++  # Support "outfile[:infile]", defaulting infile="outfile.in".
++  case "$ac_file" in
++  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
++       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
++  *) ac_file_in="${ac_file}.in" ;;
++  esac
++
++  # Adjust relative srcdir, etc. for subdirectories.
++
++  # Remove last slash and all that follows it.  Not all systems have dirname.
++  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
++  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
++    # The file is in a subdirectory.
++    test ! -d "$ac_dir" && mkdir "$ac_dir"
++    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
++    # A "../" for each directory in $ac_dir_suffix.
++    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
++  else
++    ac_dir_suffix= ac_dots=
++  fi
++
++  case "$ac_given_srcdir" in
++  .)  srcdir=.
++      if test -z "$ac_dots"; then top_srcdir=.
++      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
++  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
++  *) # Relative path.
++    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
++    top_srcdir="$ac_dots$ac_given_srcdir" ;;
++  esac
++
++  echo creating "$ac_file"
++  rm -f "$ac_file"
++  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
++  case "$ac_file" in
++  *Makefile*) ac_comsub="1i\\
++# $configure_input" ;;
++  *) ac_comsub= ;;
++  esac
++  sed -e "$ac_comsub
++s%@configure_input@%$configure_input%g
++s%@srcdir@%$srcdir%g
++s%@top_srcdir@%$top_srcdir%g
++" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file
++fi; done
++rm -f conftest.subs
++
++
++
++exit 0
++EOF
++chmod +x $CONFIG_STATUS
++rm -fr confdefs* $ac_clean_files
++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
++
+diff -Naur ../glibc-2.1.3/posix/glob/configure.bat glibc-2.1.3/posix/glob/configure.bat
+--- ../glibc-2.1.3/posix/glob/configure.bat	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/configure.bat	1998-02-07 12:24:21.000000000 -0800
+@@ -0,0 +1,26 @@
++@echo off
++echo Configuring glob for GO32
++rem This batch file assumes a unix-type "sed" program
++
++echo # Makefile generated by "configure.bat"> Makefile
++
++if exist config.sed del config.sed
++
++echo "s/@srcdir@/./					">> config.sed
++echo "s/@CC@/gcc/					">> config.sed
++echo "s/@CFLAGS@/-O2 -g/				">> config.sed
++echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../		">> config.sed
++echo "s/@AR@/ar/					">> config.sed
++echo "s/@RANLIB@/ranlib/				">> config.sed
++echo "s/@LDFLAGS@//					">> config.sed
++echo "s/@DEFS@//					">> config.sed
++echo "s/@ALLOCA@//					">> config.sed
++echo "s/@LIBS@//					">> config.sed
++echo "s/@LIBOBJS@//					">> config.sed
++echo "s/^Makefile *:/_Makefile:/			">> config.sed
++echo "s/^config.h *:/_config.h:/			">> config.sed
++
++sed -e "s/^\"//" -e "s/\"$//" -e "s/[ 	]*$//" config.sed > config2.sed
++sed -f config2.sed Makefile.in >> Makefile
++del config.sed
++del config2.sed
+diff -Naur ../glibc-2.1.3/posix/glob/configure.in glibc-2.1.3/posix/glob/configure.in
+--- ../glibc-2.1.3/posix/glob/configure.in	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/glob/configure.in	1998-02-07 12:24:21.000000000 -0800
+@@ -0,0 +1,19 @@
++dnl Process this file with autoconf to produce a configure script.
++AC_INIT(fnmatch.c)		dnl A distinctive file to look for in srcdir.
++AC_PREREQ(2.1)			dnl Minimum Autoconf version required.
++AC_PROG_CC
++AC_CHECK_PROG(AR, ar, ar, ar)
++AC_PROG_RANLIB
++AC_PROG_CPP			dnl Later checks need this.
++dnl These two want to come early.
++AC_AIX
++AC_MINIX
++AC_ISC_POSIX
++AC_CONST
++AC_HEADER_STDC
++AC_CHECK_HEADERS(memory.h unistd.h string.h)
++AC_HEADER_DIRENT
++AC_FUNC_CLOSEDIR_VOID
++AC_FUNC_ALLOCA
++AC_FUNC_STRCOLL
++AC_OUTPUT(Makefile)
+diff -Naur ../glibc-2.1.3/posix/id.c glibc-2.1.3/posix/id.c
+--- ../glibc-2.1.3/posix/id.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/posix/id.c	1999-06-30 09:00:24.000000000 -0700
+@@ -0,0 +1,176 @@
++/* Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <grp.h>
++#include <pwd.h>
++#include <limits.h>
++#include <sys/types.h>
++
++
++static void
++print_grpname (id, parens)
++     gid_t id;
++     int parens;
++{
++  const struct group *const g = getgrgid (id);
++  if (g == NULL)
++    {
++      if (parens)
++	return;
++      else
++	{
++	  fprintf (stderr, _("Couldn't find name for group %d\n"), id);
++	  exit (EXIT_FAILURE);
++	}
++    }
++
++  if (parens)
++    printf ("(%s)", g->gr_name);
++  else
++    puts (g->gr_name);
++}
++
++static void
++print_pwdname (id, parens)
++     uid_t id;
++     int parens;
++{
++  const struct passwd *const p = getpwuid (id);
++  if (p == NULL)
++    {
++      if (parens)
++	return;
++      else
++	{
++	  fprintf (stderr, _("Couldn't find name for user %d\n"), (int) id);
++	  exit (EXIT_FAILURE);
++	}
++    }
++
++  if (parens)
++    printf ("(%s)", p->pw_name);
++  else
++    puts (p->pw_name);
++}
++
++int
++main (argc, argv)
++     int argc;
++     char **argv;
++{
++  int print_gid = 1, print_uid = 1;
++  int real = 0, name = 0;
++  int error = 0;
++  int c;
++
++  uid_t ruid = getuid (), euid = geteuid ();
++  gid_t rgid = getgid (), egid = getegid ();
++
++  while ((c = getopt (argc, argv, "gurn")) != -1)
++    switch (c)
++      {
++      default:
++	error = 1;
++	break;
++
++      case 'g':
++	print_gid = 1;
++	print_uid = 0;
++	break;
++
++      case 'u':
++	print_uid = 1;
++	print_gid = 0;
++	break;
++
++      case 'r':
++	real = 1;
++	break;
++
++      case 'n':
++	name = 1;
++	break;
++      }
++
++  if (error || argc != optind)
++    {
++      fputs (_("Usage: id [-gurn]\n"), stderr);
++      exit (EXIT_FAILURE);
++    }
++
++  if (print_uid && !print_gid)
++    {
++      const uid_t uid = real ? ruid : euid;
++      if (name)
++	print_pwdname (uid, 0);
++      else
++	printf ("%d\n", (int) uid);
++    }
++  else if (print_gid && !print_uid)
++    {
++      const gid_t gid = real ? rgid : egid;
++      if (name)
++	print_grpname (gid, 0);
++      else
++	printf ("%d\n", (int) gid);
++    }
++  else
++    {
++#if	NGROUPS_MAX > 0
++      gid_t groups[NGROUPS_MAX];
++      int ngroups;
++      ngroups = getgroups (NGROUPS_MAX, groups);
++#endif
++
++      printf ("uid=%d", (int) ruid);
++      print_pwdname (ruid, 1);
++      printf (" gid=%d", (int) rgid);
++      print_grpname (rgid, 1);
++      if (euid != ruid)
++	{
++	  printf (" euid=%d", (int) euid);
++	  print_pwdname (euid, 1);
++	}
++      if (egid != rgid)
++	{
++	  printf (" egid=%d", (int) egid);
++	  print_grpname (egid, 1);
++	}
++
++#if	NGROUPS > 0
++      if (ngroups > 0)
++	{
++	  size_t i;
++	  printf (" groups=%d", (int) groups[0]);
++	  print_grpname (groups[0], 1);
++	  for (i = 1; i < ngroups; ++i)
++	    {
++	      printf (", %d", (int) groups[i]);
++	      print_grpname (groups[i], 1);
++	    }
++	}
++#endif
++
++      putchar ('\n');
++    }
++
++  exit (EXIT_SUCCESS);
++}
+diff -Naur ../glibc-2.1.3/redhat/.cvsignore glibc-2.1.3/redhat/.cvsignore
+--- ../glibc-2.1.3/redhat/.cvsignore	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/redhat/.cvsignore	2000-02-18 16:03:43.000000000 -0800
+@@ -0,0 +1,6 @@
++glibc-*.tar.gz
++glibc-2.1.spec
++diff-CYGNUS-to-REDHAT.patch
++build
++root
++
+diff -Naur ../glibc-2.1.3/redhat/ChangeLog glibc-2.1.3/redhat/ChangeLog
+--- ../glibc-2.1.3/redhat/ChangeLog	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/redhat/ChangeLog	2000-02-23 17:17:37.000000000 -0800
+@@ -0,0 +1,12 @@
++2000-02-23  Cristian Gafton  <gafton@redhat.com>
++
++	* Makefile (install-real): New target.
++	(install-locales-real): New.
++	(install-locales): New.
++	(install): Use install-locales.
++
++2000-01-03  Cristian Gafton  <gafton@redhat.com>
++
++	* Makefile (archive): be more verbose about what's happening
++	
++
+diff -Naur ../glibc-2.1.3/redhat/Makefile glibc-2.1.3/redhat/Makefile
+--- ../glibc-2.1.3/redhat/Makefile	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/redhat/Makefile	2000-02-23 17:16:13.000000000 -0800
+@@ -0,0 +1,81 @@
++#
++# Makefile for creating a source RPM out of the
++# internal CVS tree
++#
++# Cristian Gafton <gafton@redhat.com>
++# Red Hat, Inc.
++#
++
++SPEC	= glibc-2.1.spec
++PROJECT	= glibc
++
++EXTRA	 = diff-CYGNUS-to-REDHAT.patch glibc-2.1.spec
++
++VERSION=$(shell sed -n -e 's/^\#define VERSION \"\([^"]*\)\"/\1/p' < ../version.h)
++RELEASE=$(shell awk '/Release:/ { print $$2 }' $(SPEC).in)
++
++CVSTAG	 = glibc-$(subst .,-,$(VERSION))-release-$(subst .,-,$(RELEASE)) 
++CVS_ROOT = $(shell cat CVS/Root)
++
++# How to build stuff for testing
++ARCH	      = $(shell uname -m)-redhat-linux
++CONFIGURE     = ../../configure --prefix=/usr --enable-add-ons=yes --without-cvs $(ARCH)
++BUILD_FLAGS   = -r
++
++all:
++
++$(SPEC) : $(SPEC).in
++	sed -e "s|@@VERSION@@|$(VERSION)|g" < $< | \
++	grep -v "^%%" > $@	
++
++spec: $(SPEC)
++
++patch:
++	-cd .. ; cvs -q diff -N -rcygnus -rHEAD > redhat/diff-CYGNUS-to-REDHAT.patch
++
++commit:
++	cd .. ; cvs -q commit -m "Prepare to comit for releasing $(CVSTAG)"
++
++archive: clean spec commit patch
++	@rm -f $(PROJECT)-$(VERSION).tar.gz 
++	cd .. ; cvs -q tag -F $(CVSTAG) . 
++	@rm -rf /tmp/$(PROJECT)-$(VERSION) 
++	cd /tmp; CVSROOT=$(CVS_ROOT) cvs -Q export -r$(CVSTAG) -d $(PROJECT)-$(VERSION) glibc21
++	install -m 644 $(EXTRA) /tmp/$(PROJECT)-$(VERSION)
++	dir=$$PWD; cd /tmp; tar czf $$dir/$(PROJECT)-$(VERSION).tar.gz $(PROJECT)-$(VERSION) 
++	@rm -rf /tmp/$(PROJECT)-$(VERSION) 
++	@echo "The archive is in $(PROJECT)-$(VERSION).tar.gz" 
++
++clean:
++	@rm -fv *~
++	@rm -fv $(EXTRA)
++	@rm -fv glibc-*.tar.gz
++
++build-dir:
++	-mkdir build
++
++root-dir:
++	-mkdir root
++
++build/config.status build/Makefile: build-dir
++	cd build ; $(CONFIGURE)
++
++configure: build/config.status build/Makefile
++
++build:  configure
++	make $(BUILD_FLAGS) -C build
++
++
++install: root-dir build-dir
++	make install -C build install_root=$$PWD/root
++	$(MAKE) install-locales
++
++install-locales:
++	make install-locales -C ../localedata install_root=$$PWD/root objdir=$$PWD/build
++
++install-real: build-dir
++	make install -C build 
++	$(MAKE) install-locales-real
++
++install-locales-real:
++	make install-locales -C ../localedata objdir=$$PWD/build
+diff -Naur ../glibc-2.1.3/redhat/glibc-2.1.spec.in glibc-2.1.3/redhat/glibc-2.1.spec.in
+--- ../glibc-2.1.3/redhat/glibc-2.1.spec.in	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/redhat/glibc-2.1.spec.in	2000-02-29 13:15:05.000000000 -0800
+@@ -0,0 +1,305 @@
++Summary: The GNU libc libraries.
++Name: glibc
++Version: @@VERSION@@
++Release: 15
++Copyright: LGPL
++Group: System Environment/Libraries
++Source: %{name}-%{version}.tar.gz
++# Other sources are available at:
++#   http://www.ozemail.com.au/~geoffk/glibc-crypt/glibc-crypt-2.1.tar.gz
++# In the source tarball the file diff-CYGNUS-to-REDHAT.patch contains all
++# diffs applied by Red Hat to the current CVS version of glibc
++Buildroot: /var/tmp/glibc-%{PACKAGE_VERSION}-root
++Obsoletes: zoneinfo, libc-static, libc-devel, libc-profile, libc-headers,
++Obsoletes:  linuxthreads, gencat, locale
++Autoreq: false
++%ifarch alpha
++Provides: ld.so.2
++%else
++%endif
++%ifarch sparc
++Obsoletes: libc
++%endif
++
++%description
++The glibc package contains standard libraries which are used by
++multiple programs on the system. In order to save disk space and
++memory, as well as to make upgrading easier, common system code is
++kept in one place and shared between programs. This particular package
++contains the most important sets of shared libraries: the standard C
++library and the standard math library. Without these two libraries, a
++Linux system will not function.  The glibc package also contains
++national language (locale) support and timezone databases.
++
++%package devel
++Summary: Header and object files for development using standard C libraries.
++Group: Development/Libraries
++Conflicts: texinfo < 3.11
++Prereq: /sbin/install-info
++Obsoletes: libc-debug, libc-headers, libc-devel, linuxthreads-devel
++Obsoletes: glibc-debug
++Prereq: kernel-headers
++Requires: kernel-headers >= 2.2.1
++Autoreq: true
++
++%description devel
++The glibc-devel package contains the header and object files necessary
++for developing programs which use the standard C libraries (which are
++used by nearly all programs).  If you are developing programs which
++will use the standard C libraries, your system needs to have these
++standard header and object files available in order to create the
++executables.
++
++Install glibc-devel if you are going to develop programs which will
++use the standard C libraries.
++
++%package profile
++Summary: The GNU libc libraries, including support for gprof profiling.
++Group: Development/Libraries
++Obsoletes: libc-profile
++Autoreq: true
++
++%description profile
++The glibc-profile package includes the GNU libc libraries and support
++for profiling using the gprof program.  Profiling is analyzing a
++program's functions to see how much CPU time they use and determining
++which functions are calling other functions during execution.  To use
++gprof to profile a program, your program needs to use the GNU libc
++libraries included in glibc-profile (instead of the standard GNU libc
++libraries included in the glibc package).
++
++If you are going to use the gprof program to profile a program, you'll
++need to install the glibc-profile program.
++
++%package -n nscd
++Summary: A Name Service Caching Daemon (nscd).
++Group: System Environment/Daemons
++Conflicts: kernel < 2.2.0
++Prereq: /sbin/chkconfig
++Autoreq: true
++
++%description -n nscd
++Nscd caches name service lookups and can dramatically improve
++performance with NIS+, and may help with DNS as well. Note that you
++can't use nscd with 2.0 kernels because of bugs in the kernel-side
++thread support. Unfortunately, nscd happens to hit these bugs
++particularly hard.
++
++Install nscd if you need a name service lookup caching daemon, and
++you're not using a version 2.0 kernel.
++
++%prep
++%setup -q
++ 
++%ifarch armv4l
++rm -rf glibc-compat
++%endif
++
++find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \;
++
++%build
++rm -rf build-$RPM_ARCH-linux
++mkdir build-$RPM_ARCH-linux ; cd build-$RPM_ARCH-linux
++%ifarch i586 i686
++BuildFlags="-mpentium -D__USE_STRING_INLINES -fstrict-aliasing -mcpu=%{_target_cpu}"
++%endif
++%ifarch sparcv9
++BuildFlags="-mv8 -mtune=ultrasparc"
++%endif
++CC=egcs CFLAGS="$BuildFlags -g -O3" ../configure --prefix=/usr \
++	--enable-add-ons=yes --without-cvs  \
++	%{_target_cpu}-redhat-linux
++make -r CFLAGS="$BuildFlags -g -O3" PARALLELMFLAGS=-s
++
++%install
++rm -rf $RPM_BUILD_ROOT
++mkdir -p $RPM_BUILD_ROOT
++make install_root=$RPM_BUILD_ROOT install -C build-$RPM_ARCH-linux
++cd build-$RPM_ARCH-linux && \
++    make install_root=$RPM_BUILD_ROOT install-locales -C ../localedata objdir=`pwd` && \
++    cd ..
++
++# compatibility hack: this locale has vanished from glibc, but some other
++# programs are still using it. Normally we would handle it in the %pre
++# section but with glibc that is simply not an option
++mkdir -p $RPM_BUILD_ROOT/usr/share/locale/ru_RU/LC_MESSAGES
++
++# Remove the files we don't want to distribute
++rm -f $RPM_BUILD_ROOT/usr/lib/libNoVersion*
++
++# the man pages for the linuxthreads require special attention
++make -C linuxthreads/man
++mkdir -p $RPM_BUILD_ROOT/usr/man/man3
++install -m 0644 linuxthreads/man/*.3thr $RPM_BUILD_ROOT/usr/man/man3
++gzip -9nvf $RPM_BUILD_ROOT/usr/man/man3/*
++
++gzip -9nvf $RPM_BUILD_ROOT/usr/info/libc*
++
++ln -sf libbsd-compat.a $RPM_BUILD_ROOT/usr/lib/libbsd.a
++
++install -m 644 redhat/nsswitch.conf $RPM_BUILD_ROOT/etc/nsswitch.conf
++
++# Take care of setuids
++# -- new security review sez that this shouldn't be needed anymore
++#chmod 755 $RPM_BUILD_ROOT/usr/libexec/pt_chown
++
++# This is for ncsd - in glibc 2.1
++install -m 644 nscd/nscd.conf $RPM_BUILD_ROOT/etc
++mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
++install -m 755 nscd/nscd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/nscd
++
++# The database support
++mkdir -p $RPM_BUILD_ROOT/var/db
++install -m 644 nss/db-Makefile $RPM_BUILD_ROOT/var/db/Makefile
++
++# Strip binaries
++strip $RPM_BUILD_ROOT/sbin/* || :
++strip $RPM_BUILD_ROOT/usr/bin/* || :
++strip $RPM_BUILD_ROOT/usr/sbin/* || :
++
++# BUILD THE FILE LIST
++find $RPM_BUILD_ROOT -type f -or -type l | 
++	sed -e 's|.*/etc|%config &|' > rpm.filelist.in
++for n in /usr/share /usr/include; do 
++    find ${RPM_BUILD_ROOT}${n} -type d | \
++	grep -v '^/usr/share$' | \
++	sed "s/^/%dir /" >> rpm.filelist.in
++done
++
++# primary filelist
++sed "s|$RPM_BUILD_ROOT||" < rpm.filelist.in | 
++	grep -v '/etc/localtime'  | \
++	grep -v '/etc/nsswitch.conf'  | \
++	sort > rpm.filelist
++
++grep '/usr/lib/lib.*_p\.a' < rpm.filelist > profile.filelist
++egrep "(/usr/include)|(/usr/info)" < rpm.filelist | 
++	grep -v /usr/info/dir > devel.filelist
++
++mv rpm.filelist rpm.filelist.full
++grep -v '/usr/lib/lib.*_p.a' rpm.filelist.full | 
++	egrep -v "(/usr/include)|(/usr/info)" > rpm.filelist
++
++grep '/usr/lib/lib.*\.a' < rpm.filelist >> devel.filelist
++grep '/usr/lib/.*\.o' < rpm.filelist >> devel.filelist
++grep '/usr/lib/lib.*\.so' < rpm.filelist >> devel.filelist
++grep '/usr/man/man' < rpm.filelist >> devel.filelist
++
++mv rpm.filelist rpm.filelist.full
++grep -v '/usr/lib/lib.*\.a' < rpm.filelist.full |
++	grep -v '/usr/lib/.*\.o' |
++	grep -v '/usr/lib/lib.*\.so'|
++	grep -v '/usr/man/man' | 
++	grep -v 'nscd' > rpm.filelist
++
++# /etc/localtime - we're proud of our timezone
++rm -f $RPM_BUILD_ROOT/etc/localtime
++cp -f $RPM_BUILD_ROOT/usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime
++#ln -sf ../usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime
++
++# the last bit: more documentation
++rm -rf documentation
++mkdir documentation
++cp linuxthreads/ChangeLog  documentation/ChangeLog.threads
++cp linuxthreads/Changes documentation/Changes.threads
++cp linuxthreads/README documentation/README.threads
++cp linuxthreads/FAQ.html documentation/FAQ-threads.html
++cp -r linuxthreads/Examples documentation/examples.threads
++cp crypt/README documentation/README.crypt
++cp db2/README documentation/README.db2
++cp db2/mutex/README documentation/README.db2.mutex
++cp timezone/README documentation/README.timezone
++cp ChangeLog* documentation
++gzip -9 documentation/ChangeLog*
++
++%post -p /sbin/ldconfig
++
++%postun -p /sbin/ldconfig
++
++%post devel
++/sbin/install-info /usr/info/libc.info.gz /usr/info/dir
++
++%pre devel
++# this used to be a link and it is causing nightmares now
++if [ -L /usr/include/scsi ] ; then
++    rm -f /usr/include/scsi
++fi
++
++%preun devel
++if [ "$1" = 0 ]; then
++    /sbin/install-info --delete /usr/info/libc.info.gz /usr/info/dir
++fi
++
++%post -n nscd
++/sbin/chkconfig --add nscd
++
++%preun -n nscd
++if [ $1 = 0 ] ; then
++    /sbin/chkconfig --del nscd
++fi
++
++%clean
++rm -rf "$RPM_BUILD_ROOT"
++rm -f *.filelist*
++
++%files -f rpm.filelist
++%defattr(-,root,root)
++%config(noreplace) /etc/localtime
++%config(noreplace) /etc/nsswitch.conf
++%doc README NEWS INSTALL FAQ BUGS NOTES PROJECTS
++%doc documentation/* README.template README.libm
++%doc login/README.utmpd hesiod/README.hesiod
++%dir /var/db
++
++%ifnarch sparcv9 i586 i686
++%files -f devel.filelist devel
++%defattr(-,root,root)
++
++%files -f profile.filelist profile
++%defattr(-,root,root)
++
++%files -n nscd
++%defattr(-,root,root)
++%config /etc/nscd.conf
++/etc/rc.d/init.d/nscd
++/usr/sbin/nscd
++%endif
++
++%define date    %(echo `LC_ALL="C" date +"%a %b %d %Y"`)
++
++%changelog
++* %{date} Cristian Gafton <gafton@redhat.com>
++- fix c_stubs add-on to work around various assert()s in glibc
++- add Davem's patch for _NPROCESSORS_ONLN on Sparc
++
++* Fri Feb 25 2000 Cristian Gafton <gafton@redhat.com>
++- add the c_stubs add-on
++- sparc patch from davem
++
++* Thu Feb 24 2000 Cristian Gafton <gafton@redhat.com>
++- fix locale problems on 64 bit arches
++
++* Tue Feb 22 2000 Cristian Gafton <gafton@redhat.com>
++- cygnus sync up for fixes to nscd
++
++* Thu Feb 17 2000 Cristian Gafton <gafton@redhat.com>
++- updated to include new China timezones
++- sync up with the locale changes from Cygnus
++
++* Tue Feb 01 2000 Cristian Gafton <gafton@redhat.com>
++- updated from cygnus branch
++- fix syslog so that it will continuously try to fallback from SOK_DGRAM to
++  SOCK_STREAM and backwards
++
++* Mon Jan 31 2000 Cristian Gafton <gafton@redhat.com>
++- update from cygnus branch
++- compress man pages for the linuxthreads stuff
++
++* Fri Jan 21 2000 Cristian Gafton <gafton@redhat.com>
++- add Jakub's patch so we back out even more
++
++* Thu Jan 20 2000 Cristian Gafton <gafton@redhat.com>
++- back out the setrlimit changes (well, sort of)
++
++* Mon Jan 03 2000 Cristian Gafton <gafton@redhat.com>
++- make release from CVS server directly now
+diff -Naur ../glibc-2.1.3/redhat/nsswitch.conf glibc-2.1.3/redhat/nsswitch.conf
+--- ../glibc-2.1.3/redhat/nsswitch.conf	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/redhat/nsswitch.conf	2000-01-03 17:07:08.000000000 -0800
+@@ -0,0 +1,63 @@
++#
++# /etc/nsswitch.conf
++#
++# An example Name Service Switch config file. This file should be
++# sorted with the most-used services at the beginning.
++#
++# The entry '[NOTFOUND=return]' means that the search for an
++# entry should stop if the search in the previous entry turned
++# up nothing. Note that if the search failed due to some other reason
++# (like no NIS server responding) then the search continues with the
++# next entry.
++#
++# Legal entries are:
++#
++#	nisplus or nis+		Use NIS+ (NIS version 3)
++#	nis or yp		Use NIS (NIS version 2), also called YP
++#	dns			Use DNS (Domain Name Service)
++#	files			Use the local files
++#	db			Use the local database (.db) files
++#	compat			Use NIS on compat mode
++#	hesiod			Use Hesiod for user lookups
++#	[NOTFOUND=return]	Stop searching if not found so far
++#
++
++# To use db, put the "db" in front of "files" for entries you want to be
++# looked up first in the databases
++#
++# Example:
++#passwd:    db files nisplus nis
++#shadow:    db files nisplus nis
++#group:     db files nisplus nis
++
++passwd:     files nisplus nis
++shadow:     files nisplus nis
++group:      files nisplus nis
++
++#hosts:     db files nisplus nis dns
++hosts:      files nisplus nis dns
++
++# Example - obey only what nisplus tells us...
++#services:   nisplus [NOTFOUND=return] files
++#networks:   nisplus [NOTFOUND=return] files
++#protocols:  nisplus [NOTFOUND=return] files
++#rpc:        nisplus [NOTFOUND=return] files
++#ethers:     nisplus [NOTFOUND=return] files
++#netmasks:   nisplus [NOTFOUND=return] files     
++
++bootparams: nisplus [NOTFOUND=return] files
++
++ethers:     files
++netmasks:   files
++networks:   files
++protocols:  files
++rpc:        files
++services:   files
++
++netgroup:   nisplus
++
++publickey:  nisplus
++
++automount:  files nisplus
++aliases:    files nisplus
++
+diff -Naur ../glibc-2.1.3/resolv/arpa/nameser.h glibc-2.1.3/resolv/arpa/nameser.h
+--- ../glibc-2.1.3/resolv/arpa/nameser.h	1999-05-12 03:23:10.000000000 -0700
++++ glibc-2.1.3/resolv/arpa/nameser.h	1999-12-27 08:22:16.000000000 -0800
+@@ -77,7 +77,7 @@
+ 
+ /*
+  *      @(#)nameser.h	8.1 (Berkeley) 6/2/93
+- *	$Id: nameser.h,v 1.15 1999/05/12 10:23:10 drepper Exp $
++ *	$Id: nameser.h,v 1.2 1999/12/27 16:22:16 gafton Exp $
+  */
+ 
+ #ifndef _ARPA_NAMESER_H
+@@ -295,6 +295,11 @@
+ 	unsigned	arcount :16;	/* number of resource entries */
+ } HEADER;
+ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++    
++
+ /*
+  * Defines for handling compressed domain names
+  */
+@@ -345,6 +350,11 @@
+ 	(cp) += INT32SZ; \
+ }
+ 
++#ifdef __cplusplus
++}
++#endif
++    
++
+ __END_DECLS
+ 
+ #endif /* arpa/nameser.h */
+diff -Naur ../glibc-2.1.3/resolv/gethnamaddr.c glibc-2.1.3/resolv/gethnamaddr.c
+--- ../glibc-2.1.3/resolv/gethnamaddr.c	1999-10-25 15:23:46.000000000 -0700
++++ glibc-2.1.3/resolv/gethnamaddr.c	1999-12-07 08:50:36.000000000 -0800
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)gethostnamadr.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: gethnamaddr.c,v 1.29.2.2 1999/10/25 22:23:46 drepper Exp $";
++static char rcsid[] = "$Id: gethnamaddr.c,v 1.1.1.1 1999/12/07 16:50:36 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/getnetnamadr.c glibc-2.1.3/resolv/getnetnamadr.c
+--- ../glibc-2.1.3/resolv/getnetnamadr.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/resolv/getnetnamadr.c	1999-06-30 09:00:50.000000000 -0700
+@@ -0,0 +1,290 @@
++/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
++ *	Dep. Matematica Universidade de Coimbra, Portugal, Europe
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ */
++/*
++ * Copyright (c) 1983, 1993
++ *	The Regents of the University of California.  All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *	This product includes software developed by the University of
++ *	California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++#if defined(LIBC_SCCS) && !defined(lint)
++static char sccsid[] = "@(#)getnetbyaddr.c	8.1 (Berkeley) 6/4/93";
++static char sccsid_[] = "from getnetnamadr.c	1.4 (Coimbra) 93/06/03";
++static char rcsid[] = "$Id: getnetnamadr.c,v 1.1.1.1 1999/06/30 16:00:50 gafton Exp $";
++#endif /* LIBC_SCCS and not lint */
++
++#include <sys/types.h>
++#include <sys/param.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <arpa/nameser.h>
++
++#include <stdio.h>
++#include <netdb.h>
++#include <resolv.h>
++#include <ctype.h>
++#include <errno.h>
++#include <string.h>
++
++#ifndef h_errno
++extern int h_errno;
++#endif
++
++#if defined(mips) && defined(SYSTYPE_BSD43) && !defined(errno)
++extern int errno;
++#endif
++
++struct netent *_getnetbyaddr __P((long net, int type));
++struct netent *_getnetbyname __P((const char *name));
++
++#define BYADDR 0
++#define BYNAME 1
++#define	MAXALIASES	35
++
++#if PACKETSZ > 1024
++#define	MAXPACKET	PACKETSZ
++#else
++#define	MAXPACKET	1024
++#endif
++
++typedef union {
++	HEADER	hdr;
++	u_char	buf[MAXPACKET];
++} querybuf;
++
++typedef union {
++	long	al;
++	char	ac;
++} align;
++
++static struct netent *
++getnetanswer(answer, anslen, net_i)
++	querybuf *answer;
++	int anslen;
++	int net_i;
++{
++
++	register HEADER *hp;
++	register u_char *cp;
++	register int n;
++	u_char *eom;
++	int type, class, buflen, ancount, qdcount, haveanswer, i, nchar;
++	char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap,
++		*paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0;
++static	struct netent net_entry;
++static	char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1];
++
++	/*
++	 * find first satisfactory answer
++	 *
++	 *      answer --> +------------+  ( MESSAGE )
++	 *		   |   Header   |
++	 *		   +------------+
++	 *		   |  Question  | the question for the name server
++	 *		   +------------+
++	 *		   |   Answer   | RRs answering the question
++	 *		   +------------+
++	 *		   | Authority  | RRs pointing toward an authority
++	 *		   | Additional | RRs holding additional information
++	 *		   +------------+
++	 */
++	eom = answer->buf + anslen;
++	hp = &answer->hdr;
++	ancount = ntohs(hp->ancount); /* #/records in the answer section */
++	qdcount = ntohs(hp->qdcount); /* #/entries in the question section */
++	bp = netbuf;
++	buflen = sizeof(netbuf);
++	cp = answer->buf + HFIXEDSZ;
++	if (!qdcount) {
++		if (hp->aa)
++			__set_h_errno (HOST_NOT_FOUND);
++		else
++			__set_h_errno (TRY_AGAIN);
++		return (NULL);
++	}
++	while (qdcount-- > 0)
++		cp += __dn_skipname(cp, eom) + QFIXEDSZ;
++	ap = net_aliases;
++	*ap = NULL;
++	net_entry.n_aliases = net_aliases;
++	haveanswer = 0;
++	while (--ancount >= 0 && cp < eom) {
++		n = dn_expand(answer->buf, eom, cp, bp, buflen);
++		if ((n < 0) || !res_dnok(bp))
++			break;
++		cp += n;
++		ans[0] = '\0';
++		(void)strcpy(&ans[0], bp);
++		GETSHORT(type, cp);
++		GETSHORT(class, cp);
++		cp += INT32SZ;		/* TTL */
++		GETSHORT(n, cp);
++		if (class == C_IN && type == T_PTR) {
++			n = dn_expand(answer->buf, eom, cp, bp, buflen);
++			if ((n < 0) || !res_hnok(bp)) {
++				cp += n;
++				return (NULL);
++			}
++			cp += n;
++			*ap++ = bp;
++			bp += strlen(bp) + 1;
++			net_entry.n_addrtype =
++				(class == C_IN) ? AF_INET : AF_UNSPEC;
++			haveanswer++;
++		}
++	}
++	if (haveanswer) {
++		*ap = NULL;
++		switch (net_i) {
++		case BYADDR:
++			net_entry.n_name = *net_entry.n_aliases;
++			net_entry.n_net = 0L;
++			break;
++		case BYNAME:
++			in = *net_entry.n_aliases;
++			net_entry.n_name = &ans[0];
++			aux2[0] = '\0';
++			for (i = 0; i < 4; i++) {
++				for (st = in, nchar = 0;
++				     *st != '.';
++				     st++, nchar++)
++					;
++				if (nchar != 1 || *in != '0' || flag) {
++					flag = 1;
++					(void)strncpy(paux1,
++						      (i==0) ? in : in-1,
++						      (i==0) ?nchar : nchar+1);
++					paux1[(i==0) ? nchar : nchar+1] = '\0';
++					pauxt = paux2;
++					paux2 = strcat(paux1, paux2);
++					paux1 = pauxt;
++				}
++				in = ++st;
++			}
++			net_entry.n_net = inet_network(paux2);
++			break;
++		}
++		net_entry.n_aliases++;
++		return (&net_entry);
++	}
++	__set_h_errno (TRY_AGAIN);
++	return (NULL);
++}
++
++struct netent *
++getnetbyaddr(net, net_type)
++	register u_long net;
++	register int net_type;
++{
++	unsigned int netbr[4];
++	int nn, anslen;
++	querybuf buf;
++	char qbuf[MAXDNAME];
++	u_int32_t net2;		/* Changed from unsigned long --roland */
++	struct netent *net_entry;
++
++	if (net_type != AF_INET)
++		return (_getnetbyaddr(net, net_type));
++
++	for (nn = 4, net2 = net; net2; net2 >>= 8)
++		netbr[--nn] = net2 & 0xff;
++	switch (nn) {
++	case 3: 	/* Class A */
++		sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]);
++		break;
++	case 2: 	/* Class B */
++		sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]);
++		break;
++	case 1: 	/* Class C */
++		sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
++		    netbr[1]);
++		break;
++	case 0: 	/* Class D - E */
++		sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
++		    netbr[1], netbr[0]);
++		break;
++	}
++	anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
++	if (anslen < 0) {
++#ifdef DEBUG
++		if (_res.options & RES_DEBUG)
++			printf("res_query failed\n");
++#endif
++		if (errno == ECONNREFUSED)
++			return (_getnetbyaddr(net, net_type));
++		return (NULL);
++	}
++	net_entry = getnetanswer(&buf, anslen, BYADDR);
++	if (net_entry) {
++		unsigned u_net = net;	/* maybe net should be unsigned ? */
++
++		/* Strip trailing zeros */
++		while ((u_net & 0xff) == 0 && u_net != 0)
++			u_net >>= 8;
++		net_entry->n_net = u_net;
++		return (net_entry);
++	}
++	return (_getnetbyaddr(net, net_type));
++}
++
++struct netent *
++getnetbyname(net)
++	register const char *net;
++{
++	int anslen;
++	querybuf buf;
++	char qbuf[MAXDNAME];
++	struct netent *net_entry;
++
++	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
++		__set_h_errno (NETDB_INTERNAL);
++		return (NULL);
++	}
++	strcpy(&qbuf[0], net);
++	anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
++	if (anslen < 0) {
++#ifdef DEBUG
++		if (_res.options & RES_DEBUG)
++			printf("res_query failed\n");
++#endif
++		if (errno == ECONNREFUSED)
++			return (_getnetbyname(net));
++		return (_getnetbyname(net));
++	}
++	net_entry = getnetanswer(&buf, anslen, BYNAME);
++	if (net_entry)
++		return (net_entry);
++	return (_getnetbyname(net));
++}
+diff -Naur ../glibc-2.1.3/resolv/herror.c glibc-2.1.3/resolv/herror.c
+--- ../glibc-2.1.3/resolv/herror.c	1998-07-16 04:00:26.000000000 -0700
++++ glibc-2.1.3/resolv/herror.c	1999-06-30 09:00:51.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)herror.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: herror.c,v 1.9 1998/07/16 11:00:26 drepper Exp $";
++static char rcsid[] = "$Id: herror.c,v 1.1.1.1 1999/06/30 16:00:51 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_addr.c glibc-2.1.3/resolv/inet_addr.c
+--- ../glibc-2.1.3/resolv/inet_addr.c	1999-04-29 11:19:53.000000000 -0700
++++ glibc-2.1.3/resolv/inet_addr.c	1999-06-30 09:00:52.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)inet_addr.c	8.1 (Berkeley) 6/17/93";
+-static char rcsid[] = "$Id: inet_addr.c,v 1.11 1999/04/29 18:19:53 drepper Exp $";
++static char rcsid[] = "$Id: inet_addr.c,v 1.1.1.1 1999/06/30 16:00:52 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_net_ntop.c glibc-2.1.3/resolv/inet_net_ntop.c
+--- ../glibc-2.1.3/resolv/inet_net_ntop.c	1996-09-26 20:24:07.000000000 -0700
++++ glibc-2.1.3/resolv/inet_net_ntop.c	1998-02-07 12:24:30.000000000 -0800
+@@ -16,7 +16,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.2 1996/09/27 03:24:07 drepper Exp $";
++static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1.1.1 1998/02/07 20:24:30 gafton Exp $";
+ #endif
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_net_pton.c glibc-2.1.3/resolv/inet_net_pton.c
+--- ../glibc-2.1.3/resolv/inet_net_pton.c	1999-04-28 15:32:02.000000000 -0700
++++ glibc-2.1.3/resolv/inet_net_pton.c	1999-05-07 07:36:46.000000000 -0700
+@@ -16,7 +16,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static const char rcsid[] = "$Id: inet_net_pton.c,v 1.7 1999/04/28 22:32:02 drepper Exp $";
++static const char rcsid[] = "$Id: inet_net_pton.c,v 1.1.1.1 1999/05/07 14:36:46 gafton Exp $";
+ #endif
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_neta.c glibc-2.1.3/resolv/inet_neta.c
+--- ../glibc-2.1.3/resolv/inet_neta.c	1997-12-03 15:11:54.000000000 -0800
++++ glibc-2.1.3/resolv/inet_neta.c	1998-02-07 12:24:31.000000000 -0800
+@@ -16,7 +16,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static const char rcsid[] = "$Id: inet_neta.c,v 1.4 1997/12/03 23:11:54 drepper Exp $";
++static const char rcsid[] = "$Id: inet_neta.c,v 1.1.1.1 1998/02/07 20:24:31 gafton Exp $";
+ #endif
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_ntop.c glibc-2.1.3/resolv/inet_ntop.c
+--- ../glibc-2.1.3/resolv/inet_ntop.c	1997-10-05 18:23:28.000000000 -0700
++++ glibc-2.1.3/resolv/inet_ntop.c	1998-02-07 12:24:32.000000000 -0800
+@@ -15,7 +15,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static char rcsid[] = "$Id: inet_ntop.c,v 1.5 1997/10/06 01:23:28 drepper Exp $";
++static char rcsid[] = "$Id: inet_ntop.c,v 1.1.1.1 1998/02/07 20:24:32 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/param.h>
+diff -Naur ../glibc-2.1.3/resolv/inet_pton.c glibc-2.1.3/resolv/inet_pton.c
+--- ../glibc-2.1.3/resolv/inet_pton.c	1999-04-29 09:29:36.000000000 -0700
++++ glibc-2.1.3/resolv/inet_pton.c	1999-05-07 07:36:48.000000000 -0700
+@@ -15,7 +15,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static char rcsid[] = "$Id: inet_pton.c,v 1.9 1999/04/29 16:29:36 drepper Exp $";
++static char rcsid[] = "$Id: inet_pton.c,v 1.1.1.1 1999/05/07 14:36:48 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/param.h>
+diff -Naur ../glibc-2.1.3/resolv/nsap_addr.c glibc-2.1.3/resolv/nsap_addr.c
+--- ../glibc-2.1.3/resolv/nsap_addr.c	1998-12-01 11:34:42.000000000 -0800
++++ glibc-2.1.3/resolv/nsap_addr.c	1998-12-02 11:04:04.000000000 -0800
+@@ -16,7 +16,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static char rcsid[] = "$Id: nsap_addr.c,v 1.6 1998/12/01 19:34:42 drepper Exp $";
++static char rcsid[] = "$Id: nsap_addr.c,v 1.1.1.1 1998/12/02 19:04:04 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_comp.c glibc-2.1.3/resolv/res_comp.c
+--- ../glibc-2.1.3/resolv/res_comp.c	1999-02-06 15:55:49.000000000 -0800
++++ glibc-2.1.3/resolv/res_comp.c	1999-06-30 09:00:59.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_comp.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: res_comp.c,v 1.16 1999/02/06 23:55:49 drepper Exp $";
++static char rcsid[] = "$Id: res_comp.c,v 1.1.1.1 1999/06/30 16:00:59 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_data.c glibc-2.1.3/resolv/res_data.c
+--- ../glibc-2.1.3/resolv/res_data.c	1996-08-13 20:48:55.000000000 -0700
++++ glibc-2.1.3/resolv/res_data.c	1999-06-30 09:01:00.000000000 -0700
+@@ -54,7 +54,7 @@
+  */
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+-static char rcsid[] = "$Id: res_data.c,v 1.2 1996/08/14 03:48:55 drepper Exp $";
++static char rcsid[] = "$Id: res_data.c,v 1.1.1.1 1999/06/30 16:01:00 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_debug.c glibc-2.1.3/resolv/res_debug.c
+--- ../glibc-2.1.3/resolv/res_debug.c	1998-09-07 08:06:02.000000000 -0700
++++ glibc-2.1.3/resolv/res_debug.c	1999-06-30 09:01:02.000000000 -0700
+@@ -77,7 +77,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_debug.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: res_debug.c,v 1.24 1998/09/07 15:06:02 drepper Exp $";
++static char rcsid[] = "$Id: res_debug.c,v 1.1.1.1 1999/06/30 16:01:02 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/param.h>
+diff -Naur ../glibc-2.1.3/resolv/res_init.c glibc-2.1.3/resolv/res_init.c
+--- ../glibc-2.1.3/resolv/res_init.c	1999-04-28 15:34:01.000000000 -0700
++++ glibc-2.1.3/resolv/res_init.c	1999-06-30 09:01:03.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_init.c	8.1 (Berkeley) 6/7/93";
+-static char rcsid[] = "$Id: res_init.c,v 1.19 1999/04/28 22:34:01 drepper Exp $";
++static char rcsid[] = "$Id: res_init.c,v 1.1.1.1 1999/06/30 16:01:03 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_mkquery.c glibc-2.1.3/resolv/res_mkquery.c
+--- ../glibc-2.1.3/resolv/res_mkquery.c	1996-10-01 18:37:29.000000000 -0700
++++ glibc-2.1.3/resolv/res_mkquery.c	1999-06-30 09:01:05.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_mkquery.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: res_mkquery.c,v 1.7 1996/10/02 01:37:29 drepper Exp $";
++static char rcsid[] = "$Id: res_mkquery.c,v 1.1.1.1 1999/06/30 16:01:05 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_query.c glibc-2.1.3/resolv/res_query.c
+--- ../glibc-2.1.3/resolv/res_query.c	1997-05-23 08:31:34.000000000 -0700
++++ glibc-2.1.3/resolv/res_query.c	1999-06-30 09:01:06.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_query.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: res_query.c,v 1.12 1997/05/23 15:31:34 drepper Exp $";
++static char rcsid[] = "$Id: res_query.c,v 1.1.1.1 1999/06/30 16:01:06 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ #include <sys/types.h>
+diff -Naur ../glibc-2.1.3/resolv/res_send.c glibc-2.1.3/resolv/res_send.c
+--- ../glibc-2.1.3/resolv/res_send.c	1999-08-06 20:16:16.000000000 -0700
++++ glibc-2.1.3/resolv/res_send.c	1999-08-10 13:37:00.000000000 -0700
+@@ -51,7 +51,7 @@
+ 
+ #if defined(LIBC_SCCS) && !defined(lint)
+ static char sccsid[] = "@(#)res_send.c	8.1 (Berkeley) 6/4/93";
+-static char rcsid[] = "$Id: res_send.c,v 1.20.2.3 1999/08/07 03:16:16 drepper Exp $";
++static char rcsid[] = "$Id: res_send.c,v 1.1.1.1 1999/08/10 20:37:00 gafton Exp $";
+ #endif /* LIBC_SCCS and not lint */
+ 
+ 	/* change this to "0"
+diff -Naur ../glibc-2.1.3/resolv/resolv.h glibc-2.1.3/resolv/resolv.h
+--- ../glibc-2.1.3/resolv/resolv.h	1998-06-29 05:41:27.000000000 -0700
++++ glibc-2.1.3/resolv/resolv.h	1999-06-30 09:01:08.000000000 -0700
+@@ -55,7 +55,7 @@
+ 
+ /*
+  *	@(#)resolv.h	8.1 (Berkeley) 6/2/93
+- *	$Id: resolv.h,v 1.19 1998/06/29 12:41:27 drepper Exp $
++ *	$Id: resolv.h,v 1.1.1.1 1999/06/30 16:01:08 gafton Exp $
+  */
+ 
+ #ifndef _RESOLV_H
+diff -Naur ../glibc-2.1.3/scripts/=__ify glibc-2.1.3/scripts/=__ify
+--- ../glibc-2.1.3/scripts/=__ify	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/scripts/=__ify	1998-08-28 03:07:38.000000000 -0700
+@@ -0,0 +1,12 @@
++for func in $*; do
++    for file in `find sysdeps -name "${func}.c"`;
++    do
++        script=/tmp/foo$$;
++        ( echo "%s/${func}/__&/g";
++        echo x )>$script ;
++        ex $file <$script ;
++        newfile=`echo $file | sed "s/${func}/__&/"`;
++        mv $file $newfile;
++        echo $newfile;
++    done
++done
+diff -Naur ../glibc-2.1.3/scripts/mkinstalldirs glibc-2.1.3/scripts/mkinstalldirs
+--- ../glibc-2.1.3/scripts/mkinstalldirs	1998-05-08 13:55:06.000000000 -0700
++++ glibc-2.1.3/scripts/mkinstalldirs	1998-08-28 03:07:38.000000000 -0700
+@@ -4,7 +4,7 @@
+ # Created: 1993-05-16
+ # Public domain
+ 
+-# $Id: mkinstalldirs,v 1.1 1998/05/08 20:55:06 drepper Exp $
++# $Id: mkinstalldirs,v 1.1.1.1 1998/08/28 10:07:38 gafton Exp $
+ 
+ errstatus=0
+ 
+diff -Naur ../glibc-2.1.3/scripts/printsources glibc-2.1.3/scripts/printsources
+--- ../glibc-2.1.3/scripts/printsources	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/scripts/printsources	1998-08-28 03:07:38.000000000 -0700
+@@ -0,0 +1,29 @@
++#! /bin/csh -f
++
++#
++#	Prints all the files given as arguments.
++#	Files that will fit on less than a printed page
++#	are concatenated together.  Bigger ones are pr'd.
++#
++
++
++set tocat='' topr=''
++
++foreach file ($*)
++	set lines=`wc -l $file | sed "s/$file//"`
++	if ($lines > 40) then
++		set topr=($topr $file)
++	else
++		set tocat=($tocat $file)
++	endif
++end
++
++
++if ("$topr" != '') pr $topr
++
++if ("$tocat" != '') foreach file ($tocat)
++	echo -n "==================== $file ======================"
++	cat $file
++end
++
++exit 0
+diff -Naur ../glibc-2.1.3/stdio-common/scanf11.c glibc-2.1.3/stdio-common/scanf11.c
+--- ../glibc-2.1.3/stdio-common/scanf11.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/stdio-common/scanf11.c	1998-02-07 12:25:38.000000000 -0800
+@@ -0,0 +1,14 @@
++/* This test comes from ISO C Corrigendum 1.  */
++#include <stdio.h>
++
++int
++main (int argc, char *argv[])
++{
++  int d1, n1, n2, i;
++#define NOISE 1234567
++  int d2 = NOISE;
++
++  i = sscanf ("123", "%d%n%n%d", &d1, &n1, &n2, &d2);
++
++  return i != 3 || d1 != 123 || n1 != 3 || n2 != 3 || d2 != NOISE;
++}
+diff -Naur ../glibc-2.1.3/stdio-common/scanf6.c glibc-2.1.3/stdio-common/scanf6.c
+--- ../glibc-2.1.3/stdio-common/scanf6.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/stdio-common/scanf6.c	1998-02-07 12:25:38.000000000 -0800
+@@ -0,0 +1,16 @@
++#include <stdio.h>
++#include <stdlib.h>
++
++int
++main (int argc, char *argv[])
++{
++  int n = -1;
++  char c = '!';
++  int ret;
++
++  ret = sscanf ("0x", "%i%c", &n, &c);
++  printf ("ret: %d, n: %d, c: %c\n", ret, n, c);
++  if (ret != 2 || n != 0 || c != 'x')
++    abort ();
++  return 0;
++}
+diff -Naur ../glibc-2.1.3/string/bits/string2.h glibc-2.1.3/string/bits/string2.h
+--- ../glibc-2.1.3/string/bits/string2.h	2000-02-22 23:03:05.000000000 -0800
++++ glibc-2.1.3/string/bits/string2.h	2000-02-23 14:48:17.000000000 -0800
+@@ -609,7 +609,7 @@
+       __u = __extension__ ((void *) __u + 3);
+       break;
+     }
+-  return &__u->__c;
++  return (char *) &__u->__c;
+ }
+ #  else
+ #  define __stpcpy_args(src) \
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_clntout.c glibc-2.1.3/sunrpc/rpc_clntout.c
+--- ../glibc-2.1.3/sunrpc/rpc_clntout.c	1999-11-23 09:11:05.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_clntout.c	1999-12-07 08:50:37.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI
+  */
+ char clntout_rcsid[] =
+-  "$Id: rpc_clntout.c,v 1.5.2.1 1999/11/23 17:11:05 drepper Exp $";
++  "$Id: rpc_clntout.c,v 1.1.1.1 1999/12/07 16:50:37 gafton Exp $";
+ 
+ /*
+  * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_cout.c glibc-2.1.3/sunrpc/rpc_cout.c
+--- ../glibc-2.1.3/sunrpc/rpc_cout.c	1999-04-17 02:41:43.000000000 -0700
++++ glibc-2.1.3/sunrpc/rpc_cout.c	1999-04-21 11:13:33.000000000 -0700
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI
+  */
+ char cout_rcsid[] =
+-"$Id: rpc_cout.c,v 1.10 1999/04/17 09:41:43 drepper Exp $";
++"$Id: rpc_cout.c,v 1.1.1.1 1999/04/21 18:13:33 gafton Exp $";
+ 
+ /*
+  * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_hout.c glibc-2.1.3/sunrpc/rpc_hout.c
+--- ../glibc-2.1.3/sunrpc/rpc_hout.c	1998-12-01 03:23:36.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_hout.c	1998-12-01 11:41:59.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI
+  */
+ char hout_rcsid[] =
+-  "$Id: rpc_hout.c,v 1.4 1998/12/01 11:23:36 drepper Exp $";
++  "$Id: rpc_hout.c,v 1.1.1.1 1998/12/01 19:41:59 gafton Exp $";
+ 
+ /*
+  * rpc_hout.c, Header file outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_main.c glibc-2.1.3/sunrpc/rpc_main.c
+--- ../glibc-2.1.3/sunrpc/rpc_main.c	1999-01-23 14:46:54.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_main.c	1999-06-30 09:03:23.000000000 -0700
+@@ -32,7 +32,7 @@
+  * From @(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI;
+  */
+ const char main_rcsid[] =
+-  "$Id: rpc_main.c,v 1.14 1999/01/23 22:46:54 drepper Exp $";
++  "$Id: rpc_main.c,v 1.1.1.1 1999/06/30 16:03:23 gafton Exp $";
+ 
+ /*
+  * rpc_main.c, Top level of the RPC protocol compiler.
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_parse.c glibc-2.1.3/sunrpc/rpc_parse.c
+--- ../glibc-2.1.3/sunrpc/rpc_parse.c	1998-02-16 09:41:53.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_parse.c	1998-02-20 07:54:02.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI
+  */
+ const char parse_rcsid[] =
+-  "$Id: rpc_parse.c,v 1.4 1998/02/16 17:41:53 drepper Exp $";
++  "$Id: rpc_parse.c,v 1.1.1.1 1998/02/20 15:54:02 gafton Exp $";
+ 
+ /*
+  * rpc_parse.c, Parser for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_sample.c glibc-2.1.3/sunrpc/rpc_sample.c
+--- ../glibc-2.1.3/sunrpc/rpc_sample.c	1998-11-16 03:56:33.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_sample.c	1998-11-17 07:30:23.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_sample.c  1.1  90/08/30  (C) 1987 SMI
+  */
+ char sample_rcsid[] =
+-  "$Id: rpc_sample.c,v 1.5 1998/11/16 11:56:33 drepper Exp $";
++  "$Id: rpc_sample.c,v 1.1.1.1 1998/11/17 15:30:23 gafton Exp $";
+ 
+ /*
+  * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_scan.c glibc-2.1.3/sunrpc/rpc_scan.c
+--- ../glibc-2.1.3/sunrpc/rpc_scan.c	1998-02-16 09:41:55.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_scan.c	1999-06-30 09:03:25.000000000 -0700
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI
+  */
+ char scan_rcsid[] =
+-  "$Id: rpc_scan.c,v 1.6 1998/02/16 17:41:55 drepper Exp $";
++  "$Id: rpc_scan.c,v 1.1.1.1 1999/06/30 16:03:25 gafton Exp $";
+ 
+ /*
+  * rpc_scan.c, Scanner for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_svcout.c glibc-2.1.3/sunrpc/rpc_svcout.c
+--- ../glibc-2.1.3/sunrpc/rpc_svcout.c	1998-12-01 03:24:21.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_svcout.c	1998-12-01 11:42:01.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI
+  */
+ char svcout_rcsid[] =
+-  "$Id: rpc_svcout.c,v 1.7 1998/12/01 11:24:21 drepper Exp $";
++  "$Id: rpc_svcout.c,v 1.1.1.1 1998/12/01 19:42:01 gafton Exp $";
+ 
+ /*
+  * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_tblout.c glibc-2.1.3/sunrpc/rpc_tblout.c
+--- ../glibc-2.1.3/sunrpc/rpc_tblout.c	1997-03-26 17:51:46.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_tblout.c	1998-02-07 12:28:22.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI
+  */
+ char tblout_rcsid[] =
+-  "$Id: rpc_tblout.c,v 1.2 1997/03/27 01:51:46 drepper Exp $";
++  "$Id: rpc_tblout.c,v 1.1.1.1 1998/02/07 20:28:22 gafton Exp $";
+ 
+ /*
+  * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sunrpc/rpc_util.c glibc-2.1.3/sunrpc/rpc_util.c
+--- ../glibc-2.1.3/sunrpc/rpc_util.c	1998-02-16 09:41:57.000000000 -0800
++++ glibc-2.1.3/sunrpc/rpc_util.c	1998-02-20 07:54:05.000000000 -0800
+@@ -32,7 +32,7 @@
+  * From: @(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI
+  */
+ char util_rcsid[] =
+-  "$Id: rpc_util.c,v 1.6 1998/02/16 17:41:57 drepper Exp $";
++  "$Id: rpc_util.c,v 1.1.1.1 1998/02/20 15:54:05 gafton Exp $";
+ 
+ /*
+  * rpc_util.c, Utility routines for the RPC protocol compiler
+diff -Naur ../glibc-2.1.3/sysdeps/generic/nlist.c glibc-2.1.3/sysdeps/generic/nlist.c
+--- ../glibc-2.1.3/sysdeps/generic/nlist.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/generic/nlist.c	1998-02-07 12:29:37.000000000 -0800
+@@ -0,0 +1,43 @@
++/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <errno.h>
++#include <nlist.h>
++#include <stddef.h>
++
++/* Search the executable FILE for symbols matching those in NL,
++   which is terminated by an element with a NULL `n_un.n_name' member,
++   and fill in the elements of NL.  */
++int
++nlist (file, nl)
++     const char *file;
++     struct nlist *nl;
++{
++  if (nl == NULL)
++    {
++      __set_errno (EINVAL);
++      return -1;
++    }
++
++  __set_errno (ENOSYS);
++  return -1;
++}
++
++
++stub_warning (nlist)
++#include <stub-tag.h>
+diff -Naur ../glibc-2.1.3/sysdeps/generic/paths.h glibc-2.1.3/sysdeps/generic/paths.h
+--- ../glibc-2.1.3/sysdeps/generic/paths.h	1998-07-20 10:19:37.000000000 -0700
++++ glibc-2.1.3/sysdeps/generic/paths.h	1999-12-27 08:34:12.000000000 -0800
+@@ -49,7 +49,7 @@
+ #define	_PATH_DEVNULL	"/dev/null"
+ #define	_PATH_DRUM	"/dev/drum"
+ #define	_PATH_KMEM	"/dev/kmem"
+-#define	_PATH_MAILDIR	"/var/mail"
++#define	_PATH_MAILDIR	"/var/spool/mail"
+ #define	_PATH_LASTLOG	"/var/log/lastlog"
+ #define	_PATH_MAN	"/usr/man"
+ #define	_PATH_MEM	"/dev/mem"
+@@ -62,10 +62,10 @@
+ #define	_PATH_SHADOW	"/etc/shadow"
+ #define	_PATH_SHELLS	"/etc/shells"
+ #define	_PATH_TTY	"/dev/tty"
+-#define	_PATH_UNIX	"/vmunix"
++#define	_PATH_UNIX	"/boot/vmunix"
+ #define	_PATH_UTMP	"/var/run/utmp"
+ #define	_PATH_UTMP_DB	"/var/run/utmp.db"
+-#define	_PATH_VI	"/usr/bin/vi"
++#define	_PATH_VI	"/bin/vi"
+ #define	_PATH_WTMP	"/var/log/wtmp"
+ 
+ /* Provide trailing slash, since mostly used for building pathnames. */
+diff -Naur ../glibc-2.1.3/sysdeps/generic/varargs.h glibc-2.1.3/sysdeps/generic/varargs.h
+--- ../glibc-2.1.3/sysdeps/generic/varargs.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/generic/varargs.h	1998-02-07 12:29:56.000000000 -0800
+@@ -0,0 +1,61 @@
++/* Copyright (C) 1991, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#ifndef	_VARARGS_H
++
++#define	_VARARGS_H	1
++#include <features.h>
++
++#ifdef	__GNUC__
++
++#define va_alist  __builtin_va_alist
++#define va_dcl    int __builtin_va_alist;
++#define va_list   char *
++
++#ifdef __sparc__
++#define va_start(AP) 						\
++ (__builtin_saveregs (),					\
++  AP = ((void *) &__builtin_va_alist))
++#else
++#define va_start(AP)  AP=(char *) &__builtin_va_alist
++#endif
++#define va_end(AP)
++
++#define __va_rounded_size(TYPE)  \
++  (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
++
++#define va_arg(AP, TYPE)					\
++ (*((TYPE *) (AP += __va_rounded_size (TYPE),			\
++	      AP - __va_rounded_size (TYPE))))
++
++#else	/* Not GCC.  */
++
++/* Implement varargs on top of our stdarg implementation.  */
++
++#include <stdarg.h>
++
++#define	va_alist	__va_fakearg
++#define	va_dcl		int __va_fakearg;
++
++#undef	va_start
++#define	va_start(ap)	(__va_start((ap), __va_fakearg), \
++			 (ap) -= sizeof(__va_fakearg))
++
++#endif	/* GCC.  */
++
++#endif	/* varargs.h  */
+diff -Naur ../glibc-2.1.3/sysdeps/mach/sys/reboot.h glibc-2.1.3/sysdeps/mach/sys/reboot.h
+--- ../glibc-2.1.3/sysdeps/mach/sys/reboot.h	1998-05-29 03:19:59.000000000 -0700
++++ glibc-2.1.3/sysdeps/mach/sys/reboot.h	1998-07-09 11:55:57.000000000 -0700
+@@ -26,6 +26,9 @@
+ /*
+  * HISTORY
+  * $Log: reboot.h,v $
++ * Revision 1.1.1.1  1998/07/09 18:55:57  gafton
++ * import from sourceware
++ *
+  * Revision 1.2  1998/05/29 10:19:59  drepper
+  * Use __ASSEMBLER__ test macro not ASSEMBLER.
+  *
+diff -Naur ../glibc-2.1.3/sysdeps/powerpc/test-arith.c glibc-2.1.3/sysdeps/powerpc/test-arith.c
+--- ../glibc-2.1.3/sysdeps/powerpc/test-arith.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/powerpc/test-arith.c	1998-02-26 11:10:25.000000000 -0800
+@@ -0,0 +1,605 @@
++/* Test floating-point arithmetic operations.
++   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++#ifndef _GNU_SOURCE
++#define _GNU_SOURCE
++#endif
++#include <math.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <fenv.h>
++#include <assert.h>
++
++#ifndef ESIZE
++typedef double tocheck_t;
++#define ESIZE 11
++#define MSIZE 52
++#define FUNC(x) x
++#endif
++
++#define R_NEAREST 1
++#define R_ZERO 2
++#define R_UP 4
++#define R_DOWN 8
++#define R_ALL (R_NEAREST|R_ZERO|R_UP|R_DOWN)
++static fenv_t rmodes[4];
++static const char * const rmnames[4] =
++{ "nearest","zero","+Inf","-Inf" };
++
++typedef union {
++  tocheck_t tc;
++  unsigned char c[sizeof(tocheck_t)];
++} union_t;
++
++/* Don't try reading these in a font that doesn't distinguish
++   O and zero.  */
++typedef enum {
++  P_Z    = 0x0,  /* 00000...0 */
++  P_000O = 0x1,  /* 00011...1 */
++  P_001Z = 0x2,  /* 00100...0 */
++  P_00O  = 0x3,  /* 00111...1 */
++  P_01Z  = 0x4,  /* 01000...0 */
++  P_010O = 0x5,  /* 01011...1 */
++  P_011Z = 0x6,  /* 01100...0 */
++  P_0O   = 0x7,  /* 01111...1 */
++  P_1Z   = 0x8,  /* 10000...0 */
++  P_100O = 0x9,  /* 10011...1 */
++  P_101Z = 0xa,  /* 10100...0 */
++  P_10O  = 0xb,  /* 10111...1 */
++  P_11Z  = 0xc,  /* 11000...0 */
++  P_110O = 0xd,  /* 11011...1 */
++  P_111Z = 0xe,  /* 11100...0 */
++  P_O    = 0xf,  /* 11111...1 */
++  P_Z1   = 0x11, /* 000...001 */
++  P_Z10  = 0x12, /* 000...010 */
++  P_Z11  = 0x13, /* 000...011 */
++  P_0O00 = 0x14, /* 011...100 */
++  P_0O01 = 0x15, /* 011...101 */
++  P_0O0  = 0x16, /* 011...110 */
++  P_1Z1  = 0x19, /* 100...001 */
++  P_1Z10 = 0x1a, /* 100...010 */
++  P_1Z11 = 0x1b, /* 100...011 */
++  P_O00  = 0x1c, /* 111...100 */
++  P_O01  = 0x1d, /* 111...101 */
++  P_O0   = 0x1e, /* 111...110 */
++  P_R    = 0x20, /* rrr...rrr */ /* ('r' means random. ) */
++  P_Ro   = 0x21, /* rrr...rrr, with odd parity.  */
++  P_0R   = 0x22, /* 0rr...rrr */
++  P_1R   = 0x23, /* 1rr...rrr */
++  P_Rno  = 0x24, /* rrr...rrr, but not all ones.  */
++} pattern_t;
++
++static void
++pattern_fill(pattern_t ptn, unsigned char *start, int bitoffset, int count)
++{
++#define bitset(count, value) \
++      start[(count)/8] = (start[(count)/8] & ~(1 << 7-(count)%8)  \
++                          |  (value) << 7-(count)%8)
++  int i;
++
++  if (ptn >= 0 && ptn <= 0xf)
++    {
++      /* Patterns between 0 and 0xF have the following format:
++	 The LSBit is used to fill the last n-3 bits of the pattern;
++	 The next 3 bits are the first 3 bits of the pattern. */
++      for (i = 0; i < count; i++)
++	if (i < 3)
++	  bitset((bitoffset+i), ptn >> (3-i) & 1);
++	else
++	  bitset((bitoffset+i), ptn >> 0 & 1);
++    }
++  else if (ptn <= 0x1f)
++    {
++      /* Patterns between 0x10 and 0x1F have the following format:
++	 The two LSBits are the last two bits of the pattern;
++	 The 0x8 bit is the first bit of the pattern;
++	 The 0x4 bit is used to fill the remainder. */
++      for (i = 0; i < count; i++)
++	if (i == 0)
++	  bitset((bitoffset+i), ptn >> 3 & 1);
++	else if (i >= count-2)
++	  bitset((bitoffset+i), ptn >> (count-1-i) & 1);
++	else
++	  bitset((bitoffset+i), ptn >> 2 & 1);
++    }
++  else switch (ptn)
++    {
++    case P_0R: case P_1R:
++      assert(count > 0);
++      bitset(bitoffset, ptn & 1);
++      count--;
++      bitoffset++;
++    case P_R:
++      for (; count > 0; count--, bitoffset++)
++	bitset(bitoffset, rand() & 1);
++      break;
++    case P_Ro:
++      {
++	int op = 1;
++	assert(count > 0);
++	for (; count > 1; count--, bitoffset++)
++	  bitset(bitoffset, op ^= (rand() & 1));
++	bitset(bitoffset, op);
++	break;
++      }
++    case P_Rno:
++      {
++	int op = 1;
++	assert(count > 0);
++	for (; count > 1; count--, bitoffset++)
++	{
++	  int r = rand() & 1;
++	  op &= r;
++	  bitset(bitoffset, r);
++	}
++	bitset(bitoffset, rand() & (op ^ 1));
++	break;
++      }
++
++    default:
++      assert(0);
++    }
++#undef bitset
++}
++
++static tocheck_t
++pattern(int negative, pattern_t exp, pattern_t mant)
++{
++  union_t result;
++#if 0
++  int i;
++#endif
++
++  pattern_fill(negative ? P_O : P_Z, result.c, 0, 1);
++  pattern_fill(exp, result.c, 1, ESIZE);
++  pattern_fill(mant, result.c, ESIZE+1, MSIZE);
++#if 0
++  printf("neg=%d exp=%02x mant=%02x: ", negative, exp, mant);
++  for (i = 0; i < sizeof(tocheck_t); i++)
++    printf("%02x", result.c[i]);
++  printf("\n");
++#endif
++  return result.tc;
++}
++
++/* Return the closest different tocheck_t to 'x' in the direction of
++   'direction', or 'x' if there is no such value.  Assumes 'x' is not
++   a NaN.  */
++static tocheck_t
++delta(tocheck_t x, int direction)
++{
++  union_t xx;
++  int i;
++
++  xx.tc = x;
++  if (xx.c[0] & 0x80)
++    direction = -direction;
++  if (direction == +1)
++    {
++      union_t tx;
++      tx.tc = pattern(xx.c[0] >> 7, P_O, P_Z);
++      if (memcmp(tx.c, xx.c, sizeof(tocheck_t)) == 0)
++	return x;
++    }
++  for (i = sizeof(tocheck_t)-1; i > 0; i--)
++    {
++      xx.c[i] += direction;
++      if (xx.c[i] != (direction > 0 ? 0 : 0xff))
++	return xx.tc;
++    }
++  if (direction < 0 && (xx.c[0] & 0x7f) == 0)
++    return pattern(~(xx.c[0] >> 7) & 1, P_Z, P_Z1);
++  else
++    {
++      xx.c[0] += direction;
++      return xx.tc;
++    }
++}
++
++static int nerrors = 0;
++
++#ifdef FE_ALL_INVALID
++static const int all_exceptions = FE_ALL_INVALID | FE_ALL_EXCEPT;
++#else
++static const int all_exceptions = FE_ALL_EXCEPT;
++#endif
++
++static void
++check_result(int line, const char *rm, tocheck_t expected, tocheck_t actual)
++{
++  if (memcmp(&expected, &actual, sizeof(tocheck_t)) != 0)
++    {
++      unsigned char *ex, *ac;
++      size_t i;
++
++      printf("%s:%d:round %s:result failed\n"
++	     " expected result 0x", __FILE__, line, rm);
++      ex = (unsigned char *)&expected;
++      ac = (unsigned char *)&actual;
++      for (i = 0; i < sizeof(tocheck_t); i++)
++	printf("%02x", ex[i]);
++      printf(" got 0x");
++      for (i = 0; i < sizeof(tocheck_t); i++)
++	printf("%02x", ac[i]);
++      printf("\n");
++      nerrors++;
++    }
++}
++
++static const struct {
++  int except;
++  const char *name;
++} excepts[] = {
++#define except_entry(ex) { ex, #ex } ,
++#ifdef FE_INEXACT
++  except_entry(FE_INEXACT)
++#else
++# define FE_INEXACT 0
++#endif
++#ifdef FE_DIVBYZERO
++  except_entry(FE_DIVBYZERO)
++#else
++# define FE_DIVBYZERO 0
++#endif
++#ifdef FE_UNDERFLOW
++  except_entry(FE_UNDERFLOW)
++#else
++# define FE_UNDERFLOW 0
++#endif
++#ifdef FE_OVERFLOW
++  except_entry(FE_OVERFLOW)
++#else
++# define FE_OVERFLOW 0
++#endif
++#ifdef FE_INVALID
++  except_entry(FE_INVALID)
++#else
++# define FE_INVALID 0
++#endif
++#ifdef FE_INVALID_SNAN
++  except_entry(FE_INVALID_SNAN)
++#else
++# define FE_INVALID_SNAN FE_INVALID
++#endif
++#ifdef FE_INVALID_ISI
++  except_entry(FE_INVALID_ISI)
++#else
++# define FE_INVALID_ISI FE_INVALID
++#endif
++#ifdef FE_INVALID_IDI
++  except_entry(FE_INVALID_IDI)
++#else
++# define FE_INVALID_IDI FE_INVALID
++#endif
++#ifdef FE_INVALID_ZDZ
++  except_entry(FE_INVALID_ZDZ)
++#else
++# define FE_INVALID_ZDZ FE_INVALID
++#endif
++#ifdef FE_INVALID_COMPARE
++  except_entry(FE_INVALID_COMPARE)
++#else
++# define FE_INVALID_COMPARE FE_INVALID
++#endif
++#ifdef FE_INVALID_SOFTWARE
++  except_entry(FE_INVALID_SOFTWARE)
++#else
++# define FE_INVALID_SOFTWARE FE_INVALID
++#endif
++#ifdef FE_INVALID_SQRT
++  except_entry(FE_INVALID_SQRT)
++#else
++# define FE_INVALID_SQRT FE_INVALID
++#endif
++#ifdef FE_INVALID_INTEGER_CONVERSION
++  except_entry(FE_INVALID_INTEGER_CONVERSION)
++#else
++# define FE_INVALID_INTEGER_CONVERSION FE_INVALID
++#endif
++};
++
++static int excepts_missing = 0;
++
++static void
++check_excepts(int line, const char *rm, int expected, int actual)
++{
++  if (expected & excepts_missing)
++    expected = expected & ~excepts_missing | FE_INVALID_SNAN;
++  if ((expected & all_exceptions) != actual)
++    {
++      size_t i;
++      printf("%s:%d:round %s:exceptions failed\n"
++	     " expected exceptions ", __FILE__, line,rm);
++      for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++)
++	if (expected & excepts[i].except)
++	  printf("%s ",excepts[i].name);
++      if ((expected & all_exceptions) == 0)
++	printf("- ");
++      printf("got");
++      for (i = 0; i < sizeof(excepts)/sizeof(excepts[0]); i++)
++	if (actual & excepts[i].except)
++	  printf(" %s",excepts[i].name);
++      if ((actual & all_exceptions) == 0)
++	printf("- ");
++      printf(".\n");
++      nerrors++;
++    }
++}
++
++typedef enum {
++  B_ADD, B_SUB, B_MUL, B_DIV, B_NEG, B_ABS, B_SQRT
++} op_t;
++typedef struct {
++  int line;
++  op_t op;
++  int a_sgn;
++  pattern_t a_exp, a_mant;
++  int b_sgn;
++  pattern_t b_exp, b_mant;
++  int rmode;
++  int excepts;
++  int x_sgn;
++  pattern_t x_exp, x_mant;
++} optest_t;
++static const optest_t optests[] = {
++  /* Additions of zero.  */
++  {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_Z,P_Z },
++  {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_ALL & ~R_DOWN,0, 0,P_Z,P_Z },
++  {__LINE__,B_ADD, 1,P_Z,P_Z, 0,P_Z,P_Z, R_DOWN,0, 1,P_Z,P_Z },
++  {__LINE__,B_ADD, 1,P_Z,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_Z,P_Z },
++
++  /* Additions with NaN.  */
++  {__LINE__,B_ADD, 0,P_O,P_101Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_101Z },
++  {__LINE__,B_ADD, 0,P_O,P_01Z, 0,P_Z,P_Z, R_ALL,
++   FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_0O, R_ALL,
++   FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_O },
++  {__LINE__,B_ADD, 0,P_Z,P_Z, 0,P_O,P_11Z, R_ALL,0, 0,P_O,P_11Z },
++  {__LINE__,B_ADD, 0,P_O,P_001Z, 0,P_O,P_001Z, R_ALL,
++   FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_101Z },
++  {__LINE__,B_ADD, 0,P_O,P_1Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_1Z },
++  {__LINE__,B_ADD, 0,P_0O,P_Z, 0,P_O,P_10O, R_ALL,0, 0,P_O,P_10O },
++
++  /* Additions with infinity.  */
++  {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_Z,P_Z, R_ALL,0, 1,P_O,P_Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_O,P_Z, R_ALL,0, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_O,P_Z, R_ALL,0, 1,P_O,P_Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_O,P_Z, R_ALL,
++   FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_O,P_Z, R_ALL,
++   FE_INVALID | FE_INVALID_ISI, 0,P_O,P_1Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 0,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z },
++  {__LINE__,B_ADD, 0,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O,P_Z, 1,P_0O,P_Z, R_ALL,0, 1,P_O,P_Z },
++
++  /* Overflow (and zero).  */
++  {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_NEAREST | R_UP,
++   FE_INEXACT | FE_OVERFLOW, 0,P_O,P_Z },
++  {__LINE__,B_ADD, 0,P_O0,P_Z, 0,P_O0,P_Z, R_ZERO | R_DOWN,
++   FE_INEXACT | FE_OVERFLOW, 0,P_O0,P_O },
++  {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_NEAREST | R_DOWN,
++   FE_INEXACT | FE_OVERFLOW, 1,P_O,P_Z },
++  {__LINE__,B_ADD, 1,P_O0,P_Z, 1,P_O0,P_Z, R_ZERO | R_UP,
++   FE_INEXACT | FE_OVERFLOW, 1,P_O0,P_O },
++  {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_ALL & ~R_DOWN,
++   0, 0,P_Z,P_Z },
++  {__LINE__,B_ADD, 0,P_O0,P_Z, 1,P_O0,P_Z, R_DOWN,
++   0, 1,P_Z,P_Z },
++
++  /* Negation.  */
++  {__LINE__,B_NEG, 0,P_Z,P_Z,   0,0,0, R_ALL, 0, 1,P_Z,P_Z },
++  {__LINE__,B_NEG, 1,P_Z,P_Z,   0,0,0, R_ALL, 0, 0,P_Z,P_Z },
++  {__LINE__,B_NEG, 0,P_O,P_Z,   0,0,0, R_ALL, 0, 1,P_O,P_Z },
++  {__LINE__,B_NEG, 1,P_O,P_Z,   0,0,0, R_ALL, 0, 0,P_O,P_Z },
++  {__LINE__,B_NEG, 0,P_O,P_1Z,  0,0,0, R_ALL, 0, 1,P_O,P_1Z },
++  {__LINE__,B_NEG, 1,P_O,P_1Z,  0,0,0, R_ALL, 0, 0,P_O,P_1Z },
++  {__LINE__,B_NEG, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 1,P_O,P_01Z },
++  {__LINE__,B_NEG, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z },
++  {__LINE__,B_NEG, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 1,P_1Z,P_1Z1 },
++  {__LINE__,B_NEG, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 },
++  {__LINE__,B_NEG, 0,P_Z,P_Z1,  0,0,0, R_ALL, 0, 1,P_Z,P_Z1 },
++  {__LINE__,B_NEG, 1,P_Z,P_Z1,  0,0,0, R_ALL, 0, 0,P_Z,P_Z1 },
++
++  /* Absolute value.  */
++  {__LINE__,B_ABS, 0,P_Z,P_Z,   0,0,0, R_ALL, 0, 0,P_Z,P_Z },
++  {__LINE__,B_ABS, 1,P_Z,P_Z,   0,0,0, R_ALL, 0, 0,P_Z,P_Z },
++  {__LINE__,B_ABS, 0,P_O,P_Z,   0,0,0, R_ALL, 0, 0,P_O,P_Z },
++  {__LINE__,B_ABS, 1,P_O,P_Z,   0,0,0, R_ALL, 0, 0,P_O,P_Z },
++  {__LINE__,B_ABS, 0,P_O,P_1Z,  0,0,0, R_ALL, 0, 0,P_O,P_1Z },
++  {__LINE__,B_ABS, 1,P_O,P_1Z,  0,0,0, R_ALL, 0, 0,P_O,P_1Z },
++  {__LINE__,B_ABS, 0,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z },
++  {__LINE__,B_ABS, 1,P_O,P_01Z, 0,0,0, R_ALL, 0, 0,P_O,P_01Z },
++  {__LINE__,B_ABS, 0,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 },
++  {__LINE__,B_ABS, 1,P_1Z,P_1Z1, 0,0,0, R_ALL, 0, 0,P_1Z,P_1Z1 },
++  {__LINE__,B_ABS, 0,P_Z,P_Z1,  0,0,0, R_ALL, 0, 0,P_Z,P_Z1 },
++  {__LINE__,B_ABS, 1,P_Z,P_Z1,  0,0,0, R_ALL, 0, 0,P_Z,P_Z1 },
++
++  /* Square root.  */
++  {__LINE__,B_SQRT, 0,P_Z,P_Z,   0,0,0, R_ALL, 0, 0,P_Z,P_Z },
++  {__LINE__,B_SQRT, 1,P_Z,P_Z,   0,0,0, R_ALL, 0, 1,P_Z,P_Z },
++  {__LINE__,B_SQRT, 0,P_O,P_1Z,  0,0,0, R_ALL, 0, 0,P_O,P_1Z },
++  {__LINE__,B_SQRT, 1,P_O,P_1Z,  0,0,0, R_ALL, 0, 1,P_O,P_1Z },
++  {__LINE__,B_SQRT, 0,P_O,P_01Z, 0,0,0, R_ALL,
++   FE_INVALID | FE_INVALID_SNAN, 0,P_O,P_11Z },
++  {__LINE__,B_SQRT, 1,P_O,P_01Z, 0,0,0, R_ALL,
++   FE_INVALID | FE_INVALID_SNAN, 1,P_O,P_11Z },
++
++  {__LINE__,B_SQRT, 0,P_O,P_Z,   0,0,0, R_ALL, 0, 0,P_O,P_Z },
++  {__LINE__,B_SQRT, 0,P_0O,P_Z,  0,0,0, R_ALL, 0, 0,P_0O,P_Z },
++
++  {__LINE__,B_SQRT, 1,P_O,P_Z,   0,0,0, R_ALL,
++   FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z },
++  {__LINE__,B_SQRT, 1,P_1Z,P_1Z1, 0,0,0, R_ALL,
++   FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z },
++  {__LINE__,B_SQRT, 1,P_Z,P_Z1,  0,0,0, R_ALL,
++   FE_INVALID | FE_INVALID_SQRT, 0,P_O,P_1Z },
++
++};
++
++static void
++check_op(void)
++{
++  size_t i;
++  int j;
++  tocheck_t r, a, b, x;
++  int raised;
++
++  for (i = 0; i < sizeof(optests)/sizeof(optests[0]); i++)
++    {
++      a = pattern(optests[i].a_sgn, optests[i].a_exp,
++		  optests[i].a_mant);
++      b = pattern(optests[i].b_sgn, optests[i].b_exp,
++		  optests[i].b_mant);
++      x = pattern(optests[i].x_sgn, optests[i].x_exp,
++		  optests[i].x_mant);
++      for (j = 0; j < 4; j++)
++	if (optests[i].rmode & 1<<j)
++	  {
++	    fesetenv(rmodes+j);
++	    switch (optests[i].op)
++	      {
++	      case B_ADD: r = a + b; break;
++	      case B_SUB: r = a - b; break;
++	      case B_MUL: r = a * b; break;
++	      case B_DIV: r = a / b; break;
++	      case B_NEG: r = -a; break;
++	      case B_ABS: r = FUNC(fabs)(a); break;
++	      case B_SQRT: r = FUNC(sqrt)(a); break;
++	      }
++	    raised = fetestexcept(all_exceptions);
++	    check_result(optests[i].line,rmnames[j],x,r);
++	    check_excepts(optests[i].line,rmnames[j],
++			  optests[i].excepts,raised);
++	  }
++    }
++}
++
++static void
++fail_xr(int line, const char *rm, tocheck_t x, tocheck_t r, tocheck_t xx,
++	int xflag)
++{
++  size_t i;
++  unsigned char *cx, *cr, *cxx;
++
++  printf("%s:%d:round %s:fail\n with x=0x", __FILE__, line,rm);
++  cx = (unsigned char *)&x;
++  cr = (unsigned char *)&r;
++  cxx = (unsigned char *)&xx;
++  for (i = 0; i < sizeof(tocheck_t); i++)
++    printf("%02x", cx[i]);
++  printf(" r=0x");
++  for (i = 0; i < sizeof(tocheck_t); i++)
++    printf("%02x", cr[i]);
++  printf(" xx=0x");
++  for (i = 0; i < sizeof(tocheck_t); i++)
++    printf("%02x", cxx[i]);
++  printf(" inexact=%d\n", xflag != 0);
++  nerrors++;
++}
++
++static void
++check_sqrt(tocheck_t a)
++{
++  int j;
++  tocheck_t r0, r1, r2, x0, x1, x2;
++  int raised = 0;
++  int ok;
++
++  for (j = 0; j < 4; j++)
++    {
++      int excepts;
++
++      fesetenv(rmodes+j);
++      r1 = FUNC(sqrt)(a);
++      excepts = fetestexcept(all_exceptions);
++      fesetenv(FE_DFL_ENV);
++      raised |= excepts & ~FE_INEXACT;
++      x1 = r1 * r1 - a;
++      if (excepts & FE_INEXACT)
++	{
++	  r0 = delta(r1,-1); r2 = delta(r1,1);
++	  switch (1 << j)
++	    {
++	    case R_NEAREST:
++	      x0 = r0 * r0 - a; x2 = r2 * r2 - a;
++	      ok = fabs(x0) >= fabs(x1) && fabs(x1) <= fabs(x2);
++	      break;
++	    case R_ZERO:  case R_DOWN:
++	      x2 = r2 * r2 - a;
++	      ok = x1 <= 0 && x2 >= 0;
++	      break;
++	    case R_UP:
++	      x0 = r0 * r0 - a;
++	      ok = x1 >= 0 && x0 <= 0;
++	      break;
++	    default:
++	      assert(0);
++	    }
++	}
++      else
++	ok = x1 == 0;
++      if (!ok)
++	fail_xr(__LINE__,rmnames[j],a,r1,x1,excepts&FE_INEXACT);
++    }
++  check_excepts(__LINE__,"all",0,raised);
++}
++
++int main(int argc, char **argv)
++{
++  int i;
++
++  _LIB_VERSION = _IEEE_;
++
++  /* Set up environments for rounding modes.  */
++  fesetenv(FE_DFL_ENV);
++  fesetround(FE_TONEAREST);
++  fegetenv(rmodes+0);
++  fesetround(FE_TOWARDZERO);
++  fegetenv(rmodes+1);
++  fesetround(FE_UPWARD);
++  fegetenv(rmodes+2);
++  fesetround(FE_DOWNWARD);
++  fegetenv(rmodes+3);
++
++#if defined(FE_INVALID_SOFTWARE) || defined(FE_INVALID_SQRT)
++  /* There's this really stupid feature of the 601... */
++  fesetenv(FE_DFL_ENV);
++  feraiseexcept(FE_INVALID_SOFTWARE);
++  if (!fetestexcept(FE_INVALID_SOFTWARE))
++    excepts_missing |= FE_INVALID_SOFTWARE;
++  fesetenv(FE_DFL_ENV);
++  feraiseexcept(FE_INVALID_SQRT);
++  if (!fetestexcept(FE_INVALID_SQRT))
++    excepts_missing |= FE_INVALID_SQRT;
++#endif
++
++  check_op();
++  for (i = 0; i < 100000; i++)
++    check_sqrt(pattern(0, P_Rno, P_R));
++  for (i = 0; i < 100; i++)
++    check_sqrt(pattern(0, P_Z, P_R));
++  check_sqrt(pattern(0,P_Z,P_Z1));
++
++  printf("%d errors.\n", nerrors);
++  return nerrors == 0 ? 0 : 1;
++}
+diff -Naur ../glibc-2.1.3/sysdeps/powerpc/test-arithf.c glibc-2.1.3/sysdeps/powerpc/test-arithf.c
+--- ../glibc-2.1.3/sysdeps/powerpc/test-arithf.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/powerpc/test-arithf.c	1998-02-07 12:36:26.000000000 -0800
+@@ -0,0 +1,6 @@
++typedef float tocheck_t;
++#define ESIZE 8
++#define MSIZE 23
++#define FUNC(x) x##f
++
++#include "test-arith.c"
+diff -Naur ../glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h
+--- ../glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h	1998-02-07 12:37:25.000000000 -0800
+@@ -0,0 +1,44 @@
++/* Copyright (C) 1993 Free Software Foundation, Inc.
++   Contributed by Brendan Kehoe (brendan@zen.org).
++
++The GNU C Library is free software; you can redistribute it and/or
++modify it under the terms of the GNU Library General Public License as
++published by the Free Software Foundation; either version 2 of the
++License, or (at your option) any later version.
++
++The GNU C Library 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
++Library General Public License for more details.
++
++You should have received a copy of the GNU Library General Public
++License along with the GNU C Library; see the file COPYING.LIB.  If
++not, write to the Free Software Foundation, Inc., 675 Mass Ave,
++Cambridge, MA 02139, USA.  */
++
++#ifndef	_DIRSTREAM_H
++
++#define	_DIRSTREAM_H	1
++
++#define __need_size_t
++#include <stddef.h>
++
++/* Directory stream type.  */
++
++typedef struct
++  {
++    int __fd;			/* File descriptor.  */
++
++    size_t __offset;		/* Current offset into the block.  */
++    size_t __size;		/* Total valid data in the block.  */
++    char *__data;		/* Directory block.  */
++
++    int __allocation;		/* Space allocated for the block.  */
++
++    int __data_len;		/* Size of __data.  */
++    long __dd_seek;		/* OSF/1 magic cookie returned by getdents. */
++    void *dd_lock;		/* Used by OSF/1 for inter-thread locking.  */
++    
++  } DIR;
++
++#endif	/* dirstream.h */
+diff -Naur ../glibc-2.1.3/sysdeps/unix/nlist.c glibc-2.1.3/sysdeps/unix/nlist.c
+--- ../glibc-2.1.3/sysdeps/unix/nlist.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/nlist.c	1998-02-07 12:37:11.000000000 -0800
+@@ -0,0 +1,91 @@
++/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <errno.h>
++#include <a.out.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++
++/* Search the executable FILE for symbols matching those in NL,
++   which is terminated by an element with a NULL `n_un.n_name' member,
++   and fill in the elements of NL.  */
++int
++nlist (const char *file, struct nlist *nl)
++{
++  FILE *f;
++  struct exec header;
++  size_t nsymbols;
++  struct nlist *symbols;
++  unsigned long int string_table_size;
++  char *string_table;
++  register size_t i;
++
++  if (nl == NULL)
++    {
++      __set_errno (EINVAL);
++      return -1;
++    }
++
++  f = fopen (file, "r");
++  if (f == NULL)
++    return -1;
++
++  if (fread ((void *) &header, sizeof (header), 1, f) != 1)
++    goto lose;
++
++  if (fseek (f, N_SYMOFF (header), SEEK_SET) != 0)
++    goto lose;
++
++  symbols = (struct nlist *) __alloca (header.a_syms);
++  nsymbols = header.a_syms / sizeof (symbols[0]);
++
++  if (fread ((void *) symbols, sizeof (symbols[0]), nsymbols, f) != nsymbols)
++    goto lose;
++
++  if (fread ((void *) &string_table_size, sizeof (string_table_size), 1, f)
++      != 1)
++    goto lose;
++  string_table_size -= sizeof (string_table_size);
++
++  string_table = (char *) __alloca (string_table_size);
++  if (fread ((void *) string_table, string_table_size, 1, f) != 1)
++    goto lose;
++
++  for (i = 0; i < nsymbols; ++i)
++    {
++      register struct nlist *nlp;
++      for (nlp = nl; nlp->n_un.n_name != NULL; ++nlp)
++	if (!strcmp (nlp->n_un.n_name,
++		     &string_table[symbols[i].n_un.n_strx -
++				  sizeof (string_table_size)]))
++	  {
++	    char *const name = nlp->n_un.n_name;
++	    *nlp = symbols[i];
++	    nlp->n_un.n_name = name;
++	  }
++    }
++
++  (void) fclose (f);
++  return 0;
++
++ lose:;
++  (void) fclose (f);
++  return -1;
++}
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h	1999-12-21 15:52:15.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h	2000-01-21 10:20:54.000000000 -0800
+@@ -57,8 +57,8 @@
+ typedef __int64_t  __loff_t;		/* Type of file sizes and offsets.  */
+ typedef __int32_t  __pid_t;		/* Type of process identifications.  */
+ typedef __int64_t  __ssize_t;		/* Type of a byte count, or error.  */
+-typedef __uint64_t  __rlim_t;		/* Type of resource counts.  */
+-typedef __uint64_t  __rlim64_t;		/*  "" (LFS) */
++typedef __int64_t  __rlim_t;		/* Type of resource counts.  */
++typedef __int64_t  __rlim64_t;		/*  "" (LFS) */
+ typedef __uint32_t  __blkcnt_t;		/* Type to count nr disk blocks.  */
+ typedef __uint64_t  __blkcnt64_t;	/*  "" (LFS) */
+ typedef __int32_t __fsblkcnt_t;		/* Type to count file system blocks. */
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h	1999-12-21 15:52:16.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h	2000-01-21 10:20:54.000000000 -0800
+@@ -68,8 +68,8 @@
+ typedef __quad_t __loff_t;		/* Type of file sizes and offsets.  */
+ typedef int __pid_t;			/* Type of process identifications.  */
+ typedef int __ssize_t;			/* Type of a byte count, or error.  */
+-typedef __u_long __rlim_t;		/* Type of resource counts.  */
+-typedef __u_quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
++typedef long int __rlim_t;		/* Type of resource counts.  */
++typedef __quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
+ typedef __u_int __id_t;			/* General type for ID.  */
+ 
+ typedef struct
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h	2000-01-25 20:09:30.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h	1969-12-31 16:00:00.000000000 -0800
+@@ -1,205 +0,0 @@
+-/* Bit values & structures for resource limits.  Linux version.
+-   Copyright (C) 1994, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Library General Public License as
+-   published by the Free Software Foundation; either version 2 of the
+-   License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Library General Public License for more details.
+-
+-   You should have received a copy of the GNU Library General Public
+-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+-   Boston, MA 02111-1307, USA.  */
+-
+-#ifndef _SYS_RESOURCE_H
+-# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
+-#endif
+-
+-#include <bits/types.h>
+-
+-/* Transmute defines to enumerations.  The macro re-definitions are
+-   necessary because some programs want to test for operating system
+-   features with #ifdef RUSAGE_SELF.  In ISO C the reflexive
+-   definition is a no-op.  */
+-
+-/* Kinds of resource limit.  */
+-enum __rlimit_resource
+-{
+-  /* Per-process CPU limit, in seconds.  */
+-  RLIMIT_CPU = 0,
+-#define RLIMIT_CPU RLIMIT_CPU
+-
+-  /* Largest file that can be created, in bytes.  */
+-  RLIMIT_FSIZE = 1,
+-#define	RLIMIT_FSIZE RLIMIT_FSIZE
+-
+-  /* Maximum size of data segment, in bytes.  */
+-  RLIMIT_DATA = 2,
+-#define	RLIMIT_DATA RLIMIT_DATA
+-
+-  /* Maximum size of stack segment, in bytes.  */
+-  RLIMIT_STACK = 3,
+-#define	RLIMIT_STACK RLIMIT_STACK
+-
+-  /* Largest core file that can be created, in bytes.  */
+-  RLIMIT_CORE = 4,
+-#define	RLIMIT_CORE RLIMIT_CORE
+-
+-  /* Largest resident set size, in bytes.
+-     This affects swapping; processes that are exceeding their
+-     resident set size will be more likely to have physical memory
+-     taken from them.  */
+-  RLIMIT_RSS = 5,
+-#define	RLIMIT_RSS RLIMIT_RSS
+-
+-  /* Number of open files.  */
+-  RLIMIT_NOFILE = 7,
+-  RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same.  */
+-#define RLIMIT_NOFILE RLIMIT_NOFILE
+-#define RLIMIT_OFILE RLIMIT_OFILE
+-
+-  /* Address space limit.  */
+-  RLIMIT_AS = 9,
+-#define RLIMIT_AS RLIMIT_AS
+-
+-  /* Number of processes.  */
+-  RLIMIT_NPROC = 6,
+-#define RLIMIT_NPROC RLIMIT_NPROC
+-
+-  /* Locked-in-memory address space.  */
+-  RLIMIT_MEMLOCK = 8,
+-#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
+-
+-  RLIMIT_NLIMITS = 10,
+-  RLIM_NLIMITS = RLIMIT_NLIMITS
+-#define RLIMIT_NLIMITS RLIMIT_NLIMITS
+-#define RLIM_NLIMITS RLIM_NLIMITS
+-};
+-
+-/* Value to indicate that there is no limit.  */
+-#ifndef __USE_FILE_OFFSET64
+-# define RLIM_INFINITY ((long int) (~0UL >> 1))
+-#else
+-# define RLIM_INFINITY 0x7fffffffffffffffLL
+-#endif
+-
+-#ifdef __USE_LARGEFILE64
+-# define RLIM64_INFINITY 0x7fffffffffffffffLL
+-#endif
+-
+-/* We can represent all limits.  */
+-#define RLIM_SAVED_MAX	RLIM_INFINITY
+-#define RLIM_SAVED_CUR	RLIM_INFINITY
+-
+-
+-/* Type for resource quantity measurement.  */
+-#ifndef __USE_FILE_OFFSET64
+-typedef __rlim_t rlim_t;
+-#else
+-typedef __rlim64_t rlim_t;
+-#endif
+-#ifdef __USE_LARGEFILE64
+-typedef __rlim64_t rlim64_t;
+-#endif
+-
+-struct rlimit
+-  {
+-    /* The current (soft) limit.  */
+-    rlim_t rlim_cur;
+-    /* The hard limit.  */
+-    rlim_t rlim_max;
+-  };
+-
+-#ifdef __USE_LARGEFILE64
+-struct rlimit64
+-  {
+-    /* The current (soft) limit.  */
+-    rlim64_t rlim_cur;
+-    /* The hard limit.  */
+-    rlim64_t rlim_max;
+- };
+-#endif
+-
+-/* Whose usage statistics do you want?  */
+-enum __rusage_who
+-{
+-  /* The calling process.  */
+-  RUSAGE_SELF = 0,
+-#define RUSAGE_SELF RUSAGE_SELF
+-
+-  /* All of its terminated child processes.  */
+-  RUSAGE_CHILDREN = -1,
+-#define RUSAGE_CHILDREN RUSAGE_CHILDREN
+-
+-  /* Both.  */
+-  RUSAGE_BOTH = -2
+-#define RUSAGE_BOTH RUSAGE_BOTH
+-};
+-
+-#define __need_timeval
+-#include <bits/time.h>		/* For `struct timeval'.  */
+-
+-/* Structure which says how much of each resource has been used.  */
+-struct rusage
+-  {
+-    /* Total amount of user time used.  */
+-    struct timeval ru_utime;
+-    /* Total amount of system time used.  */
+-    struct timeval ru_stime;
+-    /* Maximum resident set size (in kilobytes).  */
+-    long int ru_maxrss;
+-    /* Amount of sharing of text segment memory
+-       with other processes (kilobyte-seconds).  */
+-    long int ru_ixrss;
+-    /* Amount of data segment memory used (kilobyte-seconds).  */
+-    long int ru_idrss;
+-    /* Amount of stack memory used (kilobyte-seconds).  */
+-    long int ru_isrss;
+-    /* Number of soft page faults (i.e. those serviced by reclaiming
+-       a page from the list of pages awaiting reallocation.  */
+-    long int ru_minflt;
+-    /* Number of hard page faults (i.e. those that required I/O).  */
+-    long int ru_majflt;
+-    /* Number of times a process was swapped out of physical memory.  */
+-    long int ru_nswap;
+-    /* Number of input operations via the file system.  Note: This
+-       and `ru_oublock' do not include operations with the cache.  */
+-    long int ru_inblock;
+-    /* Number of output operations via the file system.  */
+-    long int ru_oublock;
+-    /* Number of IPC messages sent.  */
+-    long int ru_msgsnd;
+-    /* Number of IPC messages received.  */
+-    long int ru_msgrcv;
+-    /* Number of signals delivered.  */
+-    long int ru_nsignals;
+-    /* Number of voluntary context switches, i.e. because the process
+-       gave up the process before it had to (usually to wait for some
+-       resource to be available).  */
+-    long int ru_nvcsw;
+-    /* Number of involuntary context switches, i.e. a higher priority process
+-       became runnable or the current process used up its time slice.  */
+-    long int ru_nivcsw;
+-  };
+-
+-/* Priority limits.  */
+-#define PRIO_MIN	-20	/* Minimum priority a process can have.  */
+-#define PRIO_MAX	20	/* Maximum priority a process can have.  */
+-
+-/* The type of the WHICH argument to `getpriority' and `setpriority',
+-   indicating what flavor of entity the WHO argument specifies.  */
+-enum __priority_which
+-{
+-  PRIO_PROCESS = 0,		/* WHO is a process ID.  */
+-#define PRIO_PROCESS PRIO_PROCESS
+-  PRIO_PGRP = 1,		/* WHO is a process group ID.  */
+-#define PRIO_PGRP PRIO_PGRP
+-  PRIO_USER = 2			/* WHO is a user ID.  */
+-#define PRIO_USER PRIO_USER
+-};
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h	1999-12-21 15:52:18.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h	2000-01-21 10:20:54.000000000 -0800
+@@ -68,8 +68,8 @@
+ typedef __quad_t __loff_t;		/* Type of file sizes and offsets.  */
+ typedef int __pid_t;			/* Type of process identifications.  */
+ typedef int __ssize_t;			/* Type of a byte count, or error.  */
+-typedef __u_long __rlim_t;		/* Type of resource counts.  */
+-typedef __u_quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
++typedef long int __rlim_t;		/* Type of resource counts.  */
++typedef __quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
+ typedef __u_int __id_t;			/* General type for ID.  */
+ 
+ typedef struct
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h	1998-08-12 10:05:51.000000000 -0700
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h	1999-12-27 08:34:12.000000000 -0800
+@@ -51,7 +51,7 @@
+ #define	_PATH_KLOG	"/proc/kmsg"
+ #define	_PATH_KMEM	"/dev/kmem"
+ #define	_PATH_LASTLOG	"/var/log/lastlog"
+-#define	_PATH_MAILDIR	"/var/mail"
++#define	_PATH_MAILDIR	"/var/spool/mail"
+ #define	_PATH_MAN	"/usr/man"
+ #define	_PATH_MEM	"/dev/mem"
+ #define	_PATH_MNTTAB	"/etc/fstab"
+@@ -63,9 +63,9 @@
+ #define	_PATH_SHADOW	"/etc/shadow"
+ #define	_PATH_SHELLS	"/etc/shells"
+ #define	_PATH_TTY	"/dev/tty"
+-#define	_PATH_UNIX	"/vmlinux"
++#define	_PATH_UNIX	"/boot/vmlinux"
+ #define _PATH_UTMP	"/var/run/utmp"
+-#define	_PATH_VI	"/usr/bin/vi"
++#define	_PATH_VI	"/bin/vi"
+ #define _PATH_WTMP	"/var/log/wtmp"
+ 
+ /* Provide trailing slash, since mostly used for building pathnames. */
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h	1999-12-21 15:52:19.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h	2000-01-21 10:20:54.000000000 -0800
+@@ -85,8 +85,8 @@
+ #else
+ typedef int __ssize_t;			/* Type of a byte count, or error.  */
+ #endif
+-typedef __u_long __rlim_t;		/* Type of resource counts.  */
+-typedef __u_quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
++typedef long int __rlim_t;		/* Type of resource counts.  */
++typedef __quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
+ typedef __u_int __id_t;			/* General type for IDs.  */
+ 
+ typedef struct
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c	2000-02-29 13:25:59.000000000 -0800
+@@ -0,0 +1,55 @@
++/* Determine various system internal values, Linux/Sparc version.
++   Copyright (C) 1999 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Andreas Schwab <schwab@suse.de> and
++		  Jakub Jelinek <jj@ultra.linux.cz>
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++
++/* We need to define a special parser for /proc/cpuinfo.  */
++#define GET_NPROCS_PARSER(FP, BUFFER, RESULT)				  \
++  do									  \
++    {									  \
++      (RESULT) = 0;							  \
++      /* Find the line that contains the information about the number of  \
++	 active cpus.  We don't have to fear extremely long lines since	  \
++	 the kernel will not generate them.  8192 bytes are really	  \
++	 enough.  */							  \
++      while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL)	  \
++	if (sscanf (BUFFER, "ncpus active : %d", &(RESULT)) == 1)	  \
++	  break;							  \
++    }									  \
++  while (0)
++
++
++/* On the Sparc we can distinguish between the number of configured and
++   active cpus.  */
++#define GET_NPROCS_CONF_PARSER(FP, BUFFER, RESULT)			 \
++  do									 \
++    {									 \
++      (RESULT) = 0;							 \
++      /* Find the line that contains the information about the number of \
++	 probed cpus.  We don't have to fear extremely long lines since	 \
++	 the kernel will not generate them.  8192 bytes are really	 \
++	 enough.  */							 \
++      while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL)	 \
++	if (sscanf (buffer, "ncpus probed : %d", &(RESULT)) == 1)	 \
++	  break;							 \
++    }									 \
++  while (0)
++
++#include <sysdeps/unix/sysv/linux/getsysstats.c>
+diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h
+--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h	1998-10-05 06:40:12.000000000 -0700
++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h	1999-06-30 09:20:26.000000000 -0700
+@@ -35,7 +35,7 @@
+  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+  * SUCH DAMAGE.
+  *
+- * Version: $Id: quota.h,v 1.5 1998/10/05 13:40:12 drepper Exp $
++ * Version: $Id: quota.h,v 1.1.1.1 1999/06/30 16:20:26 gafton Exp $
+  */
+ 
+ #ifndef _SYS_QUOTA_H
+diff -Naur ../glibc-2.1.3/time/ap.c glibc-2.1.3/time/ap.c
+--- ../glibc-2.1.3/time/ap.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/time/ap.c	1998-02-07 12:39:22.000000000 -0800
+@@ -0,0 +1,45 @@
++/* Copyright (C) 1991, 1996, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <time.h>
++#include <malloc.h>
++#include <mcheck.h>
++
++/* Prints the time in the form "hh:mm ?M", where ? is A or P.
++   A simple test for strftime().  */
++int
++main (int argc, char *argv[])
++{
++  char buf[20];
++  time_t t;
++
++  mcheck (NULL);
++
++  if (argc != 1)
++    fprintf (stderr, "Usage: %s\n", argv[0]);
++
++  t = time ((time_t *) NULL);
++  if (strftime (buf, sizeof (buf), "%I:%M %p", localtime (&t)) == 0)
++    exit (EXIT_FAILURE);
++
++  puts (buf);
++
++  return EXIT_SUCCESS;
++}
+diff -Naur ../glibc-2.1.3/time/date.c glibc-2.1.3/time/date.c
+--- ../glibc-2.1.3/time/date.c	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/time/date.c	1998-02-07 12:39:31.000000000 -0800
+@@ -0,0 +1,49 @@
++/* Copyright (C) 1991, 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <stddef.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <time.h>
++
++
++/* Prints the date in the form "Day Mon dd hh:mm:ss ZZZ yyyy\n".
++   A simple test for localtime and strftime.  */
++int
++main (argc, argv)
++     int argc;
++     char **argv;
++{
++  time_t t = time (NULL);
++  struct tm *tp = localtime (&t);
++  char good = tp != NULL;
++
++  if (good)
++    {
++      char buf[BUFSIZ];
++      good = strftime (buf, sizeof (buf), "%a %b %d %X %Z %Y", tp);
++      if (good)
++	puts (buf);
++      else
++	perror ("strftime");
++    }
++  else
++    perror ("localtime");
++
++  return good ? EXIT_SUCCESS : EXIT_FAILURE;
++}
+diff -Naur ../glibc-2.1.3/timezone/Makefile glibc-2.1.3/timezone/Makefile
+--- ../glibc-2.1.3/timezone/Makefile	1999-05-05 04:32:09.000000000 -0700
++++ glibc-2.1.3/timezone/Makefile	2000-02-14 15:34:01.000000000 -0800
+@@ -33,7 +33,7 @@
+ tzbases := africa antarctica asia australasia europe northamerica \
+ 	   southamerica etcetera factory systemv \
+ 	   solar87 solar88 solar89
+-tzlinks := backward
++tzlinks := backward aliases
+ tzfiles := $(tzbases) $(tzlinks)
+ # pacificnew doesn't compile; if it is to be used, it should be included in
+ # northamerica.
+diff -Naur ../glibc-2.1.3/timezone/aliases glibc-2.1.3/timezone/aliases
+--- ../glibc-2.1.3/timezone/aliases	1969-12-31 16:00:00.000000000 -0800
++++ glibc-2.1.3/timezone/aliases	2000-02-14 15:34:01.000000000 -0800
+@@ -0,0 +1,10 @@
++# $Id: aliases,v 1.2 2000/02/14 23:34:01 gafton Exp $
++
++# this file contains timezone aliases people might care about. We do not
++# add them to the backward file because we want to be able to clearly
++# identify the ones that are not official timezones. It is better to
++# maintain this list separately, because it is for the benefit of the user
++# config tools only.
++
++Link	Asia/Shanghai		China/Shanghai
++Link	Asia/Shanghai		China/Beijing
diff --git a/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch b/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch
new file mode 100644
index 00000000..5bef1fd4
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch
@@ -0,0 +1,32 @@
+2000-05-03  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/generic/dl-environ.c (unsetenv): Follow change to the
+	real unsetenv implementation from 1999-07-29 [PR libc/1714].
+
+--- glibc-2.1.3/sysdeps/generic/dl-environ.c.jj	Thu Jul 23 16:56:52 1998
++++ glibc-2.1.3/sysdeps/generic/dl-environ.c	Tue May  9 13:48:11 2000
+@@ -1,5 +1,5 @@
+-/*Environment handling for dynamic loader.
+-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
++/* Environment handling for dynamic loader.
++   Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -55,7 +55,8 @@ unsetenv (const char *name)
+   const size_t len = strlen (name);
+   char **ep;
+ 
+-  for (ep = _environ; *ep != NULL; ++ep)
++  ep = _environ;
++  while (*ep != NULL)
+     if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+       {
+ 	/* Found it.  Remove this pointer by moving later ones back.  */
+@@ -66,4 +67,6 @@ unsetenv (const char *name)
+ 	while (*dp++);
+ 	/* Continue the loop in case NAME appears again.  */
+       }
++    else
++      ++ep;
+ }
diff --git a/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch b/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch
new file mode 100644
index 00000000..7466ac2c
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch
@@ -0,0 +1,76 @@
+2000-08-27  Ulrich Drepper  <drepper@redhat.com>
+
+	* intl/dcgettext.c (DCGETTEXT): Remove _nl_find_language in code
+	to determine invalid locale name.
+	* locale/findlocale.c (_nl_find_locale): Likewise.
+
+2000-08-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* catgets/catgets.c (catopen): Filter out env_var values with / if
+	necessary.
+
+	* locale/findlocale.c (_nl_find_locale): Move test for unusable
+	locale name after all getenvs.
+
+--- glibc-2.1.3/catgets/catgets.c	2000/01/29 11:56:33	1.15
++++ glibc-2.1.3/catgets/catgets.c	2000/08/21 20:55:30	1.16
+@@ -50,7 +50,8 @@
+ 	/* Use the LANG environment variable.  */
+ 	env_var = getenv ("LANG");
+ 
+-      if (env_var == NULL)
++      if (env_var == NULL || *env_var == '\0'
++	  || (__libc_enable_secure && strchr (env_var, '/') != NULL))
+ 	env_var = "C";
+ 
+       env_var_len = strlen (env_var) + 1;
+--- glibc-2.1.3/locale/findlocale.c	1999/11/08 23:45:13	1.10.2.1
++++ glibc-2.1.3/locale/findlocale.c	2000/08/21 21:02:42	1.10.2.2
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
+ 
+@@ -54,11 +54,7 @@
+   const char *revision;
+   struct loaded_l10nfile *locale_file;
+ 
+-  if ((*name)[0] == '\0'
+-      /* In SUID binaries we must not allow people to access files
+-	 outside the dedicated locale directories.  */
+-      || (__libc_enable_secure
+-	  && memchr (*name, '/', _nl_find_language (*name) - *name) != NULL))
++  if ((*name)[0] == '\0')
+     {
+       /* The user decides which locale to use by setting environment
+ 	 variables.  */
+@@ -67,9 +63,12 @@
+ 	*name = getenv (_nl_category_names[category]);
+       if (*name == NULL || (*name)[0] == '\0')
+ 	*name = getenv ("LANG");
+-      if (*name == NULL || (*name)[0] == '\0')
+-	*name = (char *) _nl_C_name;
+     }
++
++  if (*name == NULL || (*name)[0] == '\0'
++      || (__builtin_expect (__libc_enable_secure, 0)
++	  && strchr (*name, '/') != NULL))
++    *name = (char *) _nl_C_name;
+ 
+   if (strcmp (*name, _nl_C_name) == 0 || strcmp (*name, _nl_POSIX_name) == 0)
+     {
+--- glibc-2.1.3/intl/dcgettext.c	Sun Aug 27 23:15:33 2000
++++ glibc-2.1.3/intl/dcgettext.c	Sun Aug 27 23:16:34 2000
+@@ -371,10 +371,7 @@
+ 
+ 	  /* When this is a SUID binary we must not allow accessing files
+ 	     outside the dedicated directories.  */
+-	  if (ENABLE_SECURE
+-	      && (memchr (single_locale, '/',
+-			  _nl_find_language (single_locale) - single_locale)
+-		  != NULL))
++	  if (ENABLE_SECURE && strchr (single_locale, '/') != NULL)
+ 	    /* Ingore this entry.  */
+ 	    continue;
+ 	}
diff --git a/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch b/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch
new file mode 100644
index 00000000..bc3289c5
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch
@@ -0,0 +1,207 @@
+--- glibc-2.1.3/md5-crypt/md5-crypt.c	2000/03/04 00:47:30	1.1
++++ glibc-2.1.3/md5-crypt/md5-crypt.c	2000/08/24 06:10:02	1.8
+@@ -1,5 +1,5 @@
+ /* One way encryption based on MD5 sum.
+-   Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ 
+@@ -18,6 +18,7 @@
+    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
+ 
++#include <assert.h>
+ #include <errno.h>
+ #include <stdlib.h>
+ #include <string.h>
+@@ -37,9 +38,9 @@
+ 
+ 
+ /* Prototypes for local functions.  */
+-extern char *__md5_crypt_r __P ((const char *key, const char *salt,
+-				 char *buffer, int buflen));
+-extern char *__md5_crypt __P ((const char *key, const char *salt));
++extern char *__md5_crypt_r (const char *key, const char *salt,
++			    char *buffer, int buflen);
++extern char *__md5_crypt (const char *key, const char *salt);
+ 
+ 
+ /* This entry point is equivalent to the `crypt' function in Unix
+@@ -51,13 +52,16 @@
+      char *buffer;
+      int buflen;
+ {
+-  unsigned char alt_result[16];
++  unsigned char alt_result[16]
++    __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
+   struct md5_ctx ctx;
+   struct md5_ctx alt_ctx;
+   size_t salt_len;
+   size_t key_len;
+   size_t cnt;
+   char *cp;
++  char *copied_key = NULL;
++  char *copied_salt = NULL;
+ 
+   /* Find beginning of salt string.  The prefix should normally always
+      be present.  Just in case it is not.  */
+@@ -68,6 +72,26 @@
+   salt_len = MIN (strcspn (salt, "$"), 8);
+   key_len = strlen (key);
+ 
++  if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0)
++    {
++      char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32));
++      key = copied_key =
++	memcpy (tmp + __alignof__ (md5_uint32)
++		- (tmp - (char *) 0) % __alignof__ (md5_uint32),
++		key, key_len);
++      assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0);
++    }
++
++  if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0)
++    {
++      char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32));
++      salt = copied_salt =
++	memcpy (tmp + __alignof__ (md5_uint32)
++		- (tmp - (char *) 0) % __alignof__ (md5_uint32),
++		salt, salt_len);
++      assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0);
++    }
++
+   /* Prepare for the real work.  */
+   __md5_init_ctx (&ctx);
+ 
+@@ -195,21 +219,30 @@
+ 
+   /* Clear the buffer for the intermediate result so that people
+      attaching to processes or reading core dumps cannot get any
+-     information.  */
+-  memset (alt_result, '\0', sizeof (alt_result));
++     information.  We do it in this way to clear correct_words[]
++     inside the MD5 implementation as well.  */
++  __md5_init_ctx (&ctx);
++  __md5_finish_ctx (&ctx, alt_result);
++  memset (&ctx, '\0', sizeof (ctx));
++  memset (&alt_ctx, '\0', sizeof (alt_ctx));
++  if (copied_key != NULL)
++    memset (copied_key, '\0', key_len);
++  if (copied_salt != NULL)
++    memset (copied_salt, '\0', salt_len);
+ 
+   return buffer;
+ }
+ 
+ 
++static char *buffer;
++
+ char *
+ __md5_crypt (const char *key, const char *salt)
+ {
+   /* We don't want to have an arbitrary limit in the size of the
+      password.  We can compute the size of the result in advance and
+      so we can prepare the buffer we pass to `md5_crypt_r'.  */
+-  static char *buffer = NULL;
+-  static int buflen = 0;
++  static int buflen;
+   int needed = 3 + strlen (salt) + 1 + 26 + 1;
+ 
+   if (buflen < needed)
+@@ -220,4 +253,12 @@
+     }
+ 
+   return __md5_crypt_r (key, salt, buffer, buflen);
++}
++
++
++static void
++__attribute__ ((__destructor__))
++free_mem (void)
++{
++  free (buffer);
+ }
+--- glibc-2.1.3/md5-crypt/md5.c	2000/03/04 00:47:30	1.1
++++ glibc-2.1.3/md5-crypt/md5.c	2000/07/04 18:22:44	1.2
+@@ -1,6 +1,6 @@
+-/* md5.c - Functions to compute MD5 message digest of files or memory blocks
++/* Functions to compute MD5 message digest of files or memory blocks.
+    according to the definition of MD5 in RFC 1321 from April 1992.
+-   Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -217,6 +217,8 @@
+      size_t len;
+      struct md5_ctx *ctx;
+ {
++  //const void aligned_buffer = buffer;
++
+   /* When we already have some bits in our internal buffer concatenate
+      both inputs first.  */
+   if (ctx->buflen != 0)
+@@ -224,16 +226,20 @@
+       size_t left_over = ctx->buflen;
+       size_t add = 128 - left_over > len ? len : 128 - left_over;
+ 
++      /* Only put full words in the buffer.  */
++      add -= add % __alignof__ (md5_uint32);
++
+       memcpy (&ctx->buffer[left_over], buffer, add);
+       ctx->buflen += add;
+ 
+-      if (left_over + add > 64)
++      if (ctx->buflen > 64)
+ 	{
+-	  md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
++	  md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
++
++	  ctx->buflen &= 63;
+ 	  /* The regions in the following copy operation cannot overlap.  */
+ 	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+-		  (left_over + add) & 63);
+-	  ctx->buflen = (left_over + add) & 63;
++		  ctx->buflen);
+ 	}
+ 
+       buffer = (const char *) buffer + add;
+@@ -251,8 +257,17 @@
+   /* Move remaining bytes in internal buffer.  */
+   if (len > 0)
+     {
+-      memcpy (ctx->buffer, buffer, len);
+-      ctx->buflen = len;
++      size_t left_over = ctx->buflen;
++
++      memcpy (&ctx->buffer[left_over], buffer, len);
++      left_over += len;
++      if (left_over >= 64)
++	{
++	  md5_process_block (ctx->buffer, 64, ctx);
++	  left_over -= 64;
++	  memcpy (ctx->buffer, &ctx->buffer[64], left_over);
++	}
++      ctx->buflen = left_over;
+     }
+ }
+ 
+--- glibc-2.1.3/md5-crypt/md5.h	2000/03/04 00:47:30	1.1
++++ glibc-2.1.3/md5-crypt/md5.h	2000/07/04 18:22:44	1.2
+@@ -1,6 +1,6 @@
+ /* Declaration of functions and data types used for MD5 sum computing
+    library functions.
+-   Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -87,7 +87,7 @@
+ 
+   md5_uint32 total[2];
+   md5_uint32 buflen;
+-  char buffer[128];
++  char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
+ };
+ 
+ /*
diff --git a/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch b/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch
new file mode 100644
index 00000000..06df6334
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch
@@ -0,0 +1,22 @@
+2000-08-09  Jakub Jelinek  <jakub@redhat.com>
+
+	* time/tzfile.c (__tzfile_compute): __tzstring zones
+	from zone_names.
+
+--- glibc-2.1.3/time/tzfile.c.jj	Fri May  7 16:41:44 1999
++++ glibc-2.1.3/time/tzfile.c	Fri Aug 25 09:55:20 2000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991,92,93,95,96,97,98,99 Free Software Foundation, Inc.
++/* Copyright (C) 1991,92,93,95,96,97,98,99,2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -498,7 +498,7 @@ __tzfile_compute (time_t timer, int use_
+ 	/* There is no daylight saving time.  */
+ 	__tzname[1] = __tzname[0];
+       tp->tm_isdst = info->isdst;
+-      tp->tm_zone = &zone_names[info->idx];
++      tp->tm_zone = __tzstring (&zone_names[info->idx]);
+       tp->tm_gmtoff = info->offset;
+     }
+ 
diff --git a/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch b/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch
new file mode 100644
index 00000000..4b72e085
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch
@@ -0,0 +1,86 @@
+2001-01-08  Ulrich Drepper  <drepper@redhat.com>
+
+	* elf/rtld.c (process_envvars): Place output files for profiling
+	in SUID binaries in /var/profile.
+
+	* elf/dl-load.c (_dl_map_object): Don't look in cache for
+	preloading in SUID binaries.
+
+	* elf/dl-profile.c (_dl_start_profile): Open the output file with
+	O_NOFOLLOW if possible.
+
+	* sysdeps/generic/segfault.c (install_handler): Check output file
+	name with access().
+
+--- libc/elf/rtld.c	2000/03/15 05:42:01	1.148.2.7
++++ libc/elf/rtld.c	2001/01/10 07:45:19
+@@ -1273,7 +1273,7 @@
+   char *debug_output = NULL;
+ 
+   /* This is the default place for profiling data file.  */
+-  _dl_profile_output = "/var/tmp";
++  _dl_profile_output = __libc_enable_secure ? "/var/profile" : "/var/tmp";
+ 
+   while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
+     {
+--- libc/elf/dl-load.c	1999/11/20 02:26:38	1.103.2.5
++++ libc/elf/dl-load.c	2001/01/10 07:45:20
+@@ -1338,7 +1338,7 @@
+       if (fd == -1 && env_path_list != NULL)
+ 	fd = open_path (name, namelen, preloaded, env_path_list, &realname);
+ 
+-      if (fd == -1)
++      if (fd == -1 && (! preloaded || ! __libc_enable_secure))
+ 	{
+ 	  /* Check the list of libraries in the file /etc/ld.so.cache,
+ 	     for compatibility with Linux's ldconfig program.  */
+--- libc/elf/dl-profile.c	1998/06/07 13:35:48	1.14
++++ libc/elf/dl-profile.c	2001/01/10 07:45:21
+@@ -263,7 +263,12 @@
+   *cp++ = '/';
+   __stpcpy (__stpcpy (cp, _dl_profile), ".profile");
+ 
+-  fd = __open (filename, O_RDWR | O_CREAT, 0666);
++#ifdef O_NOFOLLOW
++# define EXTRA_FLAGS | O_NOFOLLOW
++#else
++# define EXTRA_FLAGS
++#endif
++  fd = __open (filename, O_RDWR | O_CREAT EXTRA_FLAGS, 0666);
+   if (fd == -1)
+     {
+       /* We cannot write the profiling data so don't do anything.  */
+--- libc/sysdeps/generic/segfault.c	2000/03/21 04:53:40	1.10.2.2
++++ libc/sysdeps/generic/segfault.c	2001/01/10 07:45:22
+@@ -236,6 +236,7 @@
+ 
+   /* Preserve the output file name if there is any given.  */
+   name = getenv ("SEGFAULT_OUTPUT_NAME");
+-  if (name != NULL && name[0] != '\0')
++  if (name != NULL && name[0] != '\0'
++      && (!__libc_enable_secure || access (name, R_OK | W_OK) == 0))
+     fname = __strdup (name);
+ }
+
+--- libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h.jj	Wed Feb 24 23:01:58 1999
++++ libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h	Mon Jan 15 04:30:57 2001
+@@ -49,13 +49,17 @@
+ /* Recognizing extra environment variables.  */
+ #define EXTRA_LD_ENVVARS \
+   case 15:								      \
+-    if (memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0)		      \
++    if (!__libc_enable_secure						      \
++	&& memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0)		      \
+       {									      \
+ 	_dl_correct_cache_id = envline[19] == '5' ? 2 : 3;		      \
+ 	break;								      \
+       }
+ 
+ /* Extra unsecure variables.  */
+-#define EXTRA_UNSECURE_ENVVARS "LD_AOUT_LIBRARY_PATH", "LD_AOUT_PRELOAD"
++#define EXTRA_UNSECURE_ENVVARS	\
++  "LD_AOUT_LIBRARY_PATH",	\
++  "LD_AOUT_PRELOAD",		\
++  "LD_LIBRARY_VERSION"
+ 
+ #endif /* dl-librecon.h */
diff --git a/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch b/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch
new file mode 100644
index 00000000..037758cd
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch
@@ -0,0 +1,124 @@
+2000-03-15  Cristian Gafton  <gafton@redhat.com>
+
+	* db2/mutex/alpha.gcc (TSL_SET): Backport from db3.
+	* sysdeps/alpha/Makefile (CPPFLAGS): Define for db2 directory.
+	* db2/mutex/mutex.c: Include alpha.gcc ifdef HAVE_ASSEM_ALPHA_GCC.
+
+2000-03-14  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/alpha/ioperm.c (platform): Add entry for
+	Nautilus.  Patch by Soohoon Lee <soohoon.lee@alpha-processor.com>.
+
+--- glibc-2.1.3-15/db2/mutex/alpha.gcc	Wed Aug 27 15:32:54 1997
++++ glibc-2.1.3-16/db2/mutex/alpha.gcc	Wed Mar 15 16:50:45 2000
+@@ -1,52 +1,24 @@
+ /*
+- * @(#)alpha.gcc	10.1 (Sleepycat) 4/12/97
+- *
+- * The code appearing below is taken from Richard L. Sites, ed.  "Alpha
+- * Architecture Reference Manual", Digital Press, 1992, page 5-7 and 5-8.
+- * There are 2 modifications:
+- *
+- * 1. The jump from blbs __r1,30f to !__r1, which is dictated by the way the
+- * TSL_SET macro is used.  The code suggested in Sites includes the main loop
+- * of the spin lock, whereas in this code the rest the loop is specified in C.
+- * The generated code might be suboptimal if the compiler generates a forward
+- * branch for the usual case in which the mutex is uncontested.
+- *
+- * 2. At label 20, Sites suggests including code for testing for an excessive
+- * number of _processor_ lock conflicts.  (The seq_c instruction stores its
+- * first argument provided that no other processor has written to a byte range
+- * including its memory-location argument.)  Absent such checking the code
+- * below could conceivably stall silently on a multiprocessor alpha, depending
+- * on how often processor/processor conflicts occur in a particular byte range.
+- *
+- * Note that the mb ("memory-barrier") instruction in TSL_UNSET is critical to
+- * correct operation in a multiprocessor alpha (as is, of course, the mb in
+- * the TSL_SET macro).  Without the mb, changes to shared memory that occurred
+- * inside the critical section (before the TSL_UNSET) might reach shared memory
+- * _after_ the change of tsl to 0, thereby permitting another processor to see
+- * an inconsistent view of the data protected by the mutex.
++ * @(#)alpha.gcc	11.1 (Sleepycat) 8/30/99
+  *
+  * For gcc/alpha, 0 is clear, 1 is set.
+  */
+-#define TSL_SET(tsl) ({							\
++#ifdef __GNUC__
++#define	TSL_SET(tsl) ({							\
+ 	register tsl_t *__l = (tsl);					\
+-	register tsl_t __r1, __r2;					\
+-	__asm__ volatile("						\n\
+-	   10: ldq_l %0,(%2)						\n\
+-	       blbs  %0,30f						\n\
+-	       or    %0,1,%1						\n\
+-	       stq_c %1,(%2)						\n\
+-	       beq   %1,20f						\n\
+-	       mb							\n\
+-	       br    30f						\n\
+-	   20: br    10b						\n\
+-	   30: "							\
+-	  : "=&r" (__r1), "=&r" (__r2)					\
+-	  : "r" (__l));							\
+-	!__r1;								\
++	int __r;							\
++	asm volatile(							\
++		"1:	ldl_l	%0,%1\n"				\
++		"	blbs	%0,2f\n"				\
++		"	mov	1,%0\n"					\
++		"	stl_c	%0,%1\n"				\
++		"	bne	%0,1b\n"				\
++		"	mb\n"						\
++		"2:"							\
++		: "=&r"(__r), "=m"(*__l) : "m"(*__l) : "memory");	\
++	__r;								\
+ })
++#endif
+ 
+-#define TSL_UNSET(tsl) ({						\
+-	register tsl_t *__l = (tsl);					\
+-	__asm__ volatile("mb; stq $31,(%0);" : : "r" (__l));		\
+-})
++#define	TSL_UNSET(tsl)	(*(tsl) = 0)
+ #define	TSL_INIT(tsl)	TSL_UNSET(tsl)
+--- glibc-2.1.3-15/db2/mutex/mutex.c	Wed Jun 30 11:51:07 1999
++++ glibc-2.1.3-16/db2/mutex/mutex.c	Wed Mar 15 16:50:45 2000
+@@ -86,6 +86,10 @@ static const char sccsid[] = "@(#)mutex.
+ #include "sparc.gcc"
+ #endif
+ 
++#ifdef HAVE_ASSEM_ALPHA_GCC
++#include "alpha.gcc"
++#endif
++
+ #ifdef HAVE_ASSEM_UTS4_CC
+ #define TSL_INIT(x)
+ #define TSL_SET(x)	(!uts_lock(x, 1))
+--- glibc-2.1.3-15/sysdeps/alpha/Makefile	Thu Jul  9 14:52:03 1998
++++ glibc-2.1.3-16/sysdeps/alpha/Makefile	Wed Mar 15 16:50:45 2000
+@@ -17,6 +17,10 @@
+ # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ # Boston, MA 02111-1307, USA.
+ 
++ifeq ($(subdir),db2)
++CPPFLAGS += -DHAVE_SPINLOCKS=1 -DHAVE_ASSEM_ALPHA_GCC=1
++endif
++
+ ifeq ($(subdir),gmon)
+ sysdep_routines += _mcount
+ endif
+--- glibc-2.1.3-15/sysdeps/unix/sysv/linux/alpha/ioperm.c	Mon Oct 11 10:25:24 1999
++++ glibc-2.1.3-16/sysdeps/unix/sysv/linux/alpha/ioperm.c	Wed Mar 15 11:57:14 2000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1992, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1992, 1996-1999, 2000 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by David Mosberger.
+ 
+@@ -139,6 +139,7 @@ static struct platform {
+   {"Sable",	IOSYS_CPUDEP},
+   {"Miata",	IOSYS_CIA},
+   {"Tsunami",	IOSYS_TSUNAMI},
++  {"Nautilus",	IOSYS_TSUNAMI},
+   {"Rawhide",	IOSYS_MCPCIA},
+   {"Ruffian",	IOSYS_CIA},
+   {"Takara",	IOSYS_CIA},
diff --git a/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch b/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch
new file mode 100644
index 00000000..cdd4c0be
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch
@@ -0,0 +1,57 @@
+2001-11-29  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/generic/glob.c (next_brace_sub): Return NULL if braces
+	don't match, fix {{a,b},c} globbing, clean up.
+	Patch by Flavio Veloso <flaviovs@magnux.com>.
+
+--- libc/sysdeps/generic/glob.c.jj	Thu Aug 23 18:49:29 2001
++++ libc/sysdeps/generic/glob.c	Thu Nov 29 13:17:21 2001
+@@ -355,42 +355,14 @@ static
+ inline
+ #endif
+ const char *
+-next_brace_sub (begin)
+-     const char *begin;
++next_brace_sub (cp)
++     const char *cp;
+ {
+   unsigned int depth = 0;
+-  const char *cp = begin;
+-
+-  while (1)
+-    {
+-      if (depth == 0)
+-	{
+-	  if (*cp != ',' && *cp != '}' && *cp != '\0')
+-	    {
+-	      if (*cp == '{')
+-		++depth;
+-	      ++cp;
+-	      continue;
+-	    }
+-	}
+-      else
+-	{
+-	  while (*cp != '\0' && (*cp != '}' || depth > 0))
+-	    {
+-	      if (*cp == '}')
+-		--depth;
+-	      ++cp;
+-	    }
+-	  if (*cp == '\0')
+-	    /* An incorrectly terminated brace expression.  */
+-	    return NULL;
+-
+-	  continue;
+-	}
+-      break;
+-    }
+-
+-  return cp;
++  while (*cp != '\0' && (*cp != '}' || depth--) && (*cp != ',' || depth))
++    if (*cp++ == '{')
++      depth++;
++  return *cp != '\0' ? cp : NULL;
+ }
+ 
+ #endif /* !GLOB_ONLY_P */
diff --git a/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch b/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch
new file mode 100644
index 00000000..dd12af8e
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch
@@ -0,0 +1,66 @@
+2002-07-05  Tomohiro Kato <tomop@teamgedoh.net>
+
+	* glibc-compat/nss_dns/dns-network.c (getanswer_r): Reduce
+	linebuflen in parallel to bumping up the buffer pointer.
+	* glibc-compat/nss_dns/dns-host.c (getanswer_r): Likewise.
+	Compare n with linebuflen instead of buflen.
+
+2002-07-02  Andreas Schwab  <schwab@suse.de>
+
+	* resolv/nss_dns/dns-network.c (getanswer_r): Reduce linebuflen
+	in parallel to bumping up the buffer pointer.
+
+--- libc/glibc-compat/nss_dns/dns-network.c.jj	Wed Jan 10 11:58:20 2001
++++ libc/glibc-compat/nss_dns/dns-network.c	Tue Jul  9 10:31:15 2002
+@@ -283,7 +283,9 @@ getanswer_r (const querybuf *answer, int
+ 	    }
+ 	  cp += n;
+ 	  *alias_pointer++ = bp;
+-	  bp += strlen (bp) + 1;
++	  n = strlen (bp) + 1;
++	  bp += n;
++	  linebuflen -= n;
+ 	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
+ 	  ++have_answer;
+ 	}
+--- libc/glibc-compat/nss_dns/dns-host.c.jj	Wed Jan 10 11:58:20 2001
++++ libc/glibc-compat/nss_dns/dns-host.c	Tue Jul  9 10:36:41 2002
+@@ -424,7 +424,7 @@ getanswer_r (const querybuf *answer, int
+ 	  linebuflen -= n;
+ 	  /* Get canonical name.  */
+ 	  n = strlen (tbuf) + 1;	/* For the \0.  */
+-	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	  if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN)
+ 	    {
+ 	      ++had_error;
+ 	      continue;
+@@ -447,7 +447,7 @@ getanswer_r (const querybuf *answer, int
+ 	  cp += n;
+ 	  /* Get canonical name. */
+ 	  n = strlen (tbuf) + 1;   /* For the \0.  */
+-	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	  if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN)
+ 	    {
+ 	      ++had_error;
+ 	      continue;
+@@ -542,6 +542,7 @@ getanswer_r (const querybuf *answer, int
+ 	      linebuflen -= nn;
+ 	    }
+ 
++	  linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align));
+ 	  bp += sizeof (align) - ((u_long) bp % sizeof (align));
+ 
+ 	  if (n >= linebuflen)
+--- libc/resolv/nss_dns/dns-network.c.jj	Mon Jul  9 14:59:24 2001
++++ libc/resolv/nss_dns/dns-network.c	Tue Jul  9 10:30:31 2002
+@@ -328,7 +328,9 @@ getanswer_r (const querybuf *answer, int
+ 	    }
+ 	  cp += n;
+ 	  *alias_pointer++ = bp;
+-	  bp += strlen (bp) + 1;
++	  n = strlen (bp) + 1;
++	  bp += n;
++	  linebuflen -= n;
+ 	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
+ 	  ++have_answer;
+ 	}
diff --git a/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch b/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch
new file mode 100644
index 00000000..7f0784f3
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch
@@ -0,0 +1,36 @@
+--- glibc-2.1.3/sunrpc/rpc/types.h	Fri Oct 16 13:43:49 1998
++++ glibc-2.1.3/sunrpc/rpc/types.h	Thu Aug  1 09:06:38 2002
+@@ -55,6 +55,10 @@
+ 
+ #include <stdlib.h>		/* For malloc decl.  */
+ #define mem_alloc(bsize)	malloc(bsize)
++/*
++ * XXX: This must not use the second argument, or code in xdr_array.c needs
++ * to be modified.
++ */
+ #define mem_free(ptr, bsize)	free(ptr)
+ 
+ #ifndef makedev /* ie, we haven't already included it */
+--- glibc-2.1.3/sunrpc/xdr_array.c	Thu Jul 16 15:23:51 1998
++++ glibc-2.1.3/sunrpc/xdr_array.c	Thu Aug  1 09:07:45 2002
+@@ -44,6 +44,7 @@
+ #include <string.h>
+ #include <rpc/types.h>
+ #include <rpc/xdr.h>
++#include <limits.h>
+ 
+ #define LASTUNSIGNED	((u_int)0-1)
+ 
+@@ -76,7 +77,11 @@
+       return FALSE;
+     }
+   c = *sizep;
+-  if ((c > maxsize) && (xdrs->x_op != XDR_FREE))
++  /*
++   * XXX: Let the overflow possibly happen with XDR_FREE because mem_free()
++   * doesn't actually use its second argument anyway.
++   */
++  if ((c > maxsize || c > UINT_MAX / elsize) && (xdrs->x_op != XDR_FREE))
+     {
+       return FALSE;
+     }
diff --git a/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch b/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch
new file mode 100644
index 00000000..54593651
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch
@@ -0,0 +1,35 @@
+diff -ur glibc-2.1.3.orig/malloc/malloc.c glibc-2.1.3/malloc/malloc.c
+--- glibc-2.1.3.orig/malloc/malloc.c	Wed Feb 23 10:02:55 2000
++++ glibc-2.1.3/malloc/malloc.c	Thu Aug  1 09:24:10 2002
+@@ -3656,12 +3656,20 @@
+ {
+   arena *ar_ptr;
+   mchunkptr p, oldtop;
+-  INTERNAL_SIZE_T sz, csz, oldtopsize;
++  INTERNAL_SIZE_T bytes, sz, csz, oldtopsize;
+   Void_t* mem;
+ 
++  /* size_t is unsigned so the behavior on overflow is defined;
++   * request2size() uses similar post-checks anyway. */
++  bytes = n * elem_size;
++  if ((n | elem_size) >= 65536 && elem_size && bytes / elem_size != n) {
++    __set_errno (ENOMEM);
++    return 0;
++  }
++
+ #if defined _LIBC || defined MALLOC_HOOKS
+   if (__malloc_hook != NULL) {
+-    sz = n * elem_size;
++    sz = bytes;
+ #if defined __GNUC__ && __GNUC__ >= 2
+     mem = (*__malloc_hook)(sz, __builtin_return_address (0));
+ #else
+@@ -3678,7 +3686,7 @@
+   }
+ #endif
+ 
+-  if(request2size(n * elem_size, sz))
++  if(request2size(bytes, sz))
+     return 0;
+   arena_get(ar_ptr, sz);
+   if(!ar_ptr)
diff --git a/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch b/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch
new file mode 100644
index 00000000..3efac038
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch
@@ -0,0 +1,512 @@
+--- libc/resolv/nss_dns/dns-host.c.jj	Tue Sep 14 03:05:08 1999
++++ libc/resolv/nss_dns/dns-host.c	Thu Oct 10 13:07:33 2002
+@@ -129,9 +129,10 @@ _nss_dns_gethostbyname2_r (const char *n
+ 			   char *buffer, size_t buflen, int *errnop,
+ 			   int *h_errnop)
+ {
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   int size, type, n;
+   const char *cp;
++  enum nss_status status;
+ 
+   switch (af) {
+   case AF_INET:
+@@ -159,16 +160,25 @@ _nss_dns_gethostbyname2_r (const char *n
+   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
+     name = cp;
+ 
+-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
++  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
++  if (host_buffer == NULL) {
++    *errnop = ENOMEM;
++    return NSS_STATUS_UNAVAIL;
++  }
++
++  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
+       *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
+-		      errnop, h_errnop);
++  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
++			errnop, h_errnop);
++  free (host_buffer);
++  return status; 
+ }
+ 
+ 
+@@ -205,7 +215,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
+     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+     char linebuffer[0];
+   } *host_data = (struct host_data *) buffer;
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   char qbuf[MAXDNAME+1], *qp;
+   size_t size;
+   int n, status;
+@@ -257,17 +267,25 @@ _nss_dns_gethostbyaddr_r (const char *ad
+       /* Cannot happen.  */
+     }
+ 
+-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
+-		 sizeof host_buffer);
++  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
++  if (host_buffer == NULL) {
++    *errnop = ENOMEM;
++    return NSS_STATUS_UNAVAIL;
++  }
++
++  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
++		 sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
+       *errnop = errno;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
++  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+ 			errnop, h_errnop);
++  free (host_buffer);
+   if (status != NSS_STATUS_SUCCESS)
+     {
+       *h_errnop = h_errno;
+--- libc/resolv/nss_dns/dns-network.c.jj	Wed Jun 30 12:01:14 1999
++++ libc/resolv/nss_dns/dns-network.c	Thu Oct 10 13:09:49 2002
+@@ -113,24 +113,36 @@ _nss_dns_getnetbyname_r (const char *nam
+ 			 char *buffer, size_t buflen, int *errnop)
+ {
+   /* Return entry for network with NAME.  */
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   int anslen;
+   char *qbuf;
++  enum nss_status status;
+ 
+   qbuf = strdupa (name);
+-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		       sizeof (querybuf));
++
++  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
++  if (net_buffer == NULL)
++    {
++      *errnop = ENOMEM;
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
++		       sizeof (net_buffer->buf));
+   if (anslen < 0)
+     {
+       /* Nothing found.  */
+       *errnop = errno;
++      free (net_buffer);
+       return (errno == ECONNREFUSED
+ 	      || errno == EPFNOSUPPORT
+ 	      || errno == EAFNOSUPPORT)
+ 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
++  free (net_buffer);
++  return status;
+ }
+ 
+ 
+@@ -140,7 +152,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
+ {
+   /* Return entry for network with NAME.  */
+   enum nss_status status;
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   unsigned int net_bytes[4];
+   char qbuf[MAXDNAME];
+   int cnt, anslen;
+@@ -176,19 +188,28 @@ _nss_dns_getnetbyaddr_r (long net, int t
+       break;
+     }
+ 
+-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		      sizeof (querybuf));
++  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
++  if (net_buffer == NULL)
++    {
++      *errnop = ENOMEM;
++      return NSS_STATUS_UNAVAIL;
++    }
++
++  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
++		      sizeof (net_buffer->buf));
+   if (anslen < 0)
+     {
+       /* Nothing found.  */
+       *errnop = errno;
++      free (net_buffer);
+       return (errno == ECONNREFUSED
+ 	      || errno == EPFNOSUPPORT
+ 	      || errno == EAFNOSUPPORT)
+ 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
++  free (net_buffer);
+   if (status == NSS_STATUS_SUCCESS)
+     {
+       /* Strip trailing zeros.  */
+--- libc/resolv/res_query.c.jj	Wed Jun 30 12:01:06 1999
++++ libc/resolv/res_query.c	Thu Oct 10 13:01:12 2002
+@@ -106,7 +106,7 @@ res_query(name, class, type, answer, ans
+ 	u_char *answer;		/* buffer to put answer */
+ 	int anslen;		/* size of answer buffer */
+ {
+-	u_char buf[MAXPACKET];
++	u_char *buf;
+ 	register HEADER *hp = (HEADER *) answer;
+ 	int n;
+ 
+@@ -121,17 +121,25 @@ res_query(name, class, type, answer, ans
+ 		printf(";; res_query(%s, %d, %d)\n", name, class, type);
+ #endif
+ 
++	buf = malloc (MAXPACKET);
++	if (buf == NULL) {
++		__set_h_errno (NETDB_INTERNAL);
++		return -1;
++	}
++
+ 	n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
+-			buf, sizeof(buf));
++			buf, MAXPACKET);
+ 	if (n <= 0) {
+ #ifdef DEBUG
+ 		if (_res.options & RES_DEBUG)
+ 			printf(";; res_query: mkquery failed\n");
+ #endif
+ 		__set_h_errno (NO_RECOVERY);
++		free (buf);
+ 		return (n);
+ 	}
+ 	n = res_send(buf, n, answer, anslen);
++	free (buf);
+ 	if (n < 0) {
+ #ifdef DEBUG
+ 		if (_res.options & RES_DEBUG)
+--- libc/resolv/gethnamaddr.c.jj	Tue Dec  7 11:50:36 1999
++++ libc/resolv/gethnamaddr.c	Thu Oct 10 15:05:50 2002
+@@ -512,10 +512,11 @@ gethostbyname2(name, af)
+ 	const char *name;
+ 	int af;
+ {
+-	querybuf buf;
++	querybuf *buf;
+ 	register const char *cp;
+ 	char *bp;
+ 	int n, size, type, len;
++	struct hostent *ret;
+ 	extern struct hostent *_gethtbyname2();
+ 
+ 	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+@@ -617,13 +618,22 @@ gethostbyname2(name, af)
+ 				break;
+ 		}
+ 
+-	if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
++	buf = (querybuf *) malloc (sizeof (*buf));
++	if (buf == NULL) {
++		__set_h_errno (NETDB_INTERNAL);
++		return NULL;
++	}
++
++	if ((n = res_search(name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) {
++		free (buf);
+ 		dprintf("res_search failed (%d)\n", n);
+ 		if (errno == ECONNREFUSED)
+ 			return (_gethtbyname2(name, af));
+ 		return (NULL);
+ 	}
+-	return (getanswer(&buf, n, name, type));
++	ret = getanswer(buf, n, name, type);
++	free (buf);
++	return ret;
+ }
+ 
+ struct hostent *
+@@ -636,7 +646,7 @@ gethostbyaddr(addr, len, af)
+ 	static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
+ 	static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
+ 	int n, size;
+-	querybuf buf;
++	querybuf *buf;
+ 	register struct hostent *hp;
+ 	char qbuf[MAXDNAME+1], *qp;
+ #ifdef SUNSECURITY
+@@ -697,14 +707,24 @@ gethostbyaddr(addr, len, af)
+ 	default:
+ 		abort();
+ 	}
+-	n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
++
++	buf = (querybuf *) malloc (sizeof (*buf));
++	if (buf == NULL) {
++		__set_h_errno (NETDB_INTERNAL);
++		return NULL;
++	}
++
++	n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
+ 	if (n < 0) {
++		free (buf);
+ 		dprintf("res_query failed (%d)\n", n);
+ 		if (errno == ECONNREFUSED)
+ 			return (_gethtbyaddr(addr, len, af));
+ 		return (NULL);
+ 	}
+-	if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
++	hp = getanswer(buf, n, qbuf, T_PTR);
++	free (buf);
++	if (!hp)
+ 		return (NULL);	/* h_errno was set by getanswer() */
+ #ifdef SUNSECURITY
+ 	if (af == AF_INET) {
+--- libc/resolv/getnetnamadr.c.jj	Wed Jun 30 12:00:50 1999
++++ libc/resolv/getnetnamadr.c	Thu Oct 10 13:14:01 2002
+@@ -210,7 +210,7 @@ getnetbyaddr(net, net_type)
+ {
+ 	unsigned int netbr[4];
+ 	int nn, anslen;
+-	querybuf buf;
++	querybuf *buf;
+ 	char qbuf[MAXDNAME];
+ 	u_int32_t net2;		/* Changed from unsigned long --roland */
+ 	struct netent *net_entry;
+@@ -236,8 +236,15 @@ getnetbyaddr(net, net_type)
+ 		    netbr[1], netbr[0]);
+ 		break;
+ 	}
+-	anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
++
++	buf = (querybuf *) malloc (sizeof (*buf));
++	if (buf == NULL) {
++		return NULL;
++	}
++
++	anslen = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
+ 	if (anslen < 0) {
++		free (buf);
+ #ifdef DEBUG
+ 		if (_res.options & RES_DEBUG)
+ 			printf("res_query failed\n");
+@@ -246,7 +253,8 @@ getnetbyaddr(net, net_type)
+ 			return (_getnetbyaddr(net, net_type));
+ 		return (NULL);
+ 	}
+-	net_entry = getnetanswer(&buf, anslen, BYADDR);
++	net_entry = getnetanswer(buf, anslen, BYADDR);
++	free (buf);
+ 	if (net_entry) {
+ 		unsigned u_net = net;	/* maybe net should be unsigned ? */
+ 
+@@ -264,7 +272,7 @@ getnetbyname(net)
+ 	register const char *net;
+ {
+ 	int anslen;
+-	querybuf buf;
++	querybuf *buf;
+ 	char qbuf[MAXDNAME];
+ 	struct netent *net_entry;
+ 
+@@ -273,8 +281,13 @@ getnetbyname(net)
+ 		return (NULL);
+ 	}
+ 	strcpy(&qbuf[0], net);
+-	anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
++	buf = (querybuf *) malloc (sizeof (*buf));
++	if (buf == NULL) {
++		return NULL;
++	}
++	anslen = res_search(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
+ 	if (anslen < 0) {
++		free (buf);
+ #ifdef DEBUG
+ 		if (_res.options & RES_DEBUG)
+ 			printf("res_query failed\n");
+@@ -283,7 +296,8 @@ getnetbyname(net)
+ 			return (_getnetbyname(net));
+ 		return (_getnetbyname(net));
+ 	}
+-	net_entry = getnetanswer(&buf, anslen, BYNAME);
++	net_entry = getnetanswer(buf, anslen, BYNAME);
++	free (buf);
+ 	if (net_entry)
+ 		return (net_entry);
+ 	return (_getnetbyname(net));
+--- libc/glibc-compat/nss_dns/dns-host.c.jj	Mon Jan  3 20:07:08 2000
++++ libc/glibc-compat/nss_dns/dns-host.c	Thu Oct 10 12:46:24 2002
+@@ -126,9 +126,10 @@ enum nss_status
+ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
+ 			   char *buffer, size_t buflen, int *h_errnop)
+ {
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   int size, type, n;
+   const char *cp;
++  enum nss_status status;
+ 
+   switch (af) {
+   case AF_INET:
+@@ -156,15 +157,22 @@ _nss_dns_gethostbyname2_r (const char *n
+   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
+     name = cp;
+ 
+-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (host_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
+-		      h_errnop);
++  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
++			h_errnop);
++  free (host_buffer);
++  return status;
+ }
+ 
+ 
+@@ -200,7 +208,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
+     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+     char linebuffer[0];
+   } *host_data = (struct host_data *) buffer;
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   char qbuf[MAXDNAME+1], *qp;
+   int size, n, status;
+ 
+@@ -251,16 +259,22 @@ _nss_dns_gethostbyaddr_r (const char *ad
+       /* Cannot happen.  */
+     }
+ 
+-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
+-		 sizeof host_buffer);
++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (host_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
++		 sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
++  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+ 			h_errnop);
++  free (host_buffer);
+   if (status != NSS_STATUS_SUCCESS)
+     {
+       *h_errnop = h_errno;
+--- libc/glibc-compat/nss_dns/dns-network.c.jj	Mon Jan  3 20:07:08 2000
++++ libc/glibc-compat/nss_dns/dns-network.c	Thu Oct 10 12:46:24 2002
+@@ -107,21 +107,32 @@ _nss_dns_getnetbyname_r (const char *nam
+ 			 char *buffer, size_t buflen)
+ {
+   /* Return entry for network with NAME.  */
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   int anslen;
+   char *qbuf;
++  enum nss_status status;
+ 
+   qbuf = strdupa (name);
+-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		       sizeof (querybuf));
++
++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (net_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
++		       sizeof (net_buffer->buf));
+   if (anslen < 0)
+-    /* Nothing found.  */
+-    return (errno == ECONNREFUSED
+-	    || errno == EPFNOSUPPORT
+-	    || errno == EAFNOSUPPORT)
+-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    {
++      free (net_buffer);
++      /* Nothing found.  */
++      return (errno == ECONNREFUSED
++	      || errno == EPFNOSUPPORT
++	      || errno == EAFNOSUPPORT)
++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
+ 
+-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
++  free (net_buffer);
++  return status;
+ }
+ 
+ 
+@@ -131,7 +142,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
+ {
+   /* Return entry for network with NAME.  */
+   enum nss_status status;
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   unsigned int net_bytes[4];
+   char qbuf[MAXDNAME];
+   int cnt, anslen;
+@@ -167,16 +178,24 @@ _nss_dns_getnetbyaddr_r (long net, int t
+       break;
+     }
+ 
+-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		      sizeof (querybuf));
++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (net_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
++		      sizeof (net_buffer->buf));
+   if (anslen < 0)
+-    /* Nothing found.  */
+-    return (errno == ECONNREFUSED
+-	    || errno == EPFNOSUPPORT
+-	    || errno == EAFNOSUPPORT)
+-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    {
++      free (net_buffer);
++      /* Nothing found.  */
++      return (errno == ECONNREFUSED
++	      || errno == EPFNOSUPPORT
++	      || errno == EAFNOSUPPORT)
++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
+ 
+-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
++  free (net_buffer);
+   if (status == NSS_STATUS_SUCCESS)
+     {
+       /* Strip trailing zeros.  */
diff --git a/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch
new file mode 100644
index 00000000..bada1fca
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch
@@ -0,0 +1,11 @@
+--- glibc-2.1.3/glibc-compat/nss_dns/dns-host.c.old	Sun Apr 11 21:46:14 2004
++++ glibc-2.1.3/glibc-compat/nss_dns/dns-host.c	Sun Apr 11 21:46:26 2004
+@@ -256,7 +256,7 @@
+       strcpy(qp, "ip6.int");
+       break;
+     default:
+-      /* Cannot happen.  */
++      ; /* Cannot happen.  */
+     }
+ 
+   host_buffer = (querybuf *) malloc (sizeof (querybuf));
diff --git a/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch
new file mode 100644
index 00000000..af0b4b1f
--- /dev/null
+++ b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch
@@ -0,0 +1,44 @@
+"Fixes" gcc-3.4.0 errors:
+gconv_stubs.c:49: error: conflicting types for '__gconv_close_transform'
+../iconv/gconv_int.h:131: error: previous declaration of '__gconv_close_transform' was here
+gconv_stubs.c:49: error: conflicting types for '__gconv_close_transform'
+../iconv/gconv_int.h:131: error: previous declaration of '__gconv_close_transform' was here
+gconv_stubs.c:52: error: conflicting types for '__gconv'
+../iconv/gconv_int.h:112: error: previous declaration of '__gconv' was here
+gconv_stubs.c:52: error: conflicting types for '__gconv'
+../iconv/gconv_int.h:112: error: previous declaration of '__gconv' was here
+gconv_stubs.c:54: error: conflicting types for '__gconv_find_transform'
+../iconv/gconv_int.h:119: error: previous declaration of '__gconv_find_transform' was here
+gconv_stubs.c:54: error: conflicting types for '__gconv_find_transform'
+../iconv/gconv_int.h:119: error: previous declaration of '__gconv_find_transform' was here
+gconv_stubs.c:56: error: conflicting types for '__gconv_open'
+../iconv/gconv_int.h:99: error: previous declaration of '__gconv_open' was here
+gconv_stubs.c:56: error: conflicting types for '__gconv_open'
+../iconv/gconv_int.h:99: error: previous declaration of '__gconv_open' was here
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/c_stubs/gconv_stubs.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/c_stubs'
+
+although the right thing would probably be to declare the 
+stubs to have the right attributes.
+
+--- glibc-2.1.3/c_stubs/gconv_stubs.c.old	Sun Apr 11 20:25:09 2004
++++ glibc-2.1.3/c_stubs/gconv_stubs.c	Sun Apr 11 20:29:35 2004
+@@ -18,7 +18,18 @@
+    Boston, MA 02111-1307, USA.  */
+ 
+ #include <features.h>
++
++/* strange hack workaround for gcc-3.4.0.  Might be a better way. */
++#define __gconv_close_transform foo__gconv_close_transform
++#define __gconv foo__gconv
++#define __gconv_find_transform foo__gconv_find_transform
++#define __gconv_open foo__gconv_open
++
+ #include <gconv_int.h>
++#undef __gconv_close_transform
++#undef __gconv
++#undef __gconv_find_transform
++#undef __gconv_open
+ 
+ /* hack for self identification */
+ int __c_stubs_is_compiled_in;
diff --git a/patches/glibc/2.1.3/sk.po.patch b/patches/glibc/2.1.3/sk.po.patch
new file mode 100644
index 00000000..50564da3
--- /dev/null
+++ b/patches/glibc/2.1.3/sk.po.patch
@@ -0,0 +1,6678 @@
+From
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/po/sk.po.diff?r1=1.2&r2=1.3&cvsroot=glibc
+
+Fixes build error
+  msgfmt -o sk.mo sk.po
+  sk.po:2913: duplicate message definition
+  sk.po:2909: ...this is the location of the first definition
+  sk.po:3894: duplicate message definition
+  sk.po:3070: ...this is the location of the first definition
+  msgfmt: found 2 fatal errors
+  make[2]: *** [sk.mo] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/po/sk.po,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/po/sk.po	1998/12/04 21:08:17	1.2
++++ libc/po/sk.po	2001/06/05 22:43:33	1.3
+@@ -4,82 +4,82 @@
+ #
+ msgid ""
+ msgstr ""
+-"Project-Id-Version: libc 2.1\n"
+-"POT-Creation-Date: 1998-11-28 09:29-0800\n"
+-"PO-Revision-Date: 1998-12-02 22:02+01:00\n"
++"Project-Id-Version: libc 2.2.3\n"
++"POT-Creation-Date: 2001-01-21 08:03-0800\n"
++"PO-Revision-Date: 2001-06-05 17:57+02:00\n"
+ "Last-Translator: Stanislav Meduna <stano@eunet.sk>\n"
+ "Language-Team: Slovak <sk-i18n@rak.isternet.sk>\n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=ISO-8859-2\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ 
+-#: nis/nis_print.c:273
++#: nis/nis_print.c:274
+ msgid "\t\tAccess Rights : "
+ msgstr "\t\tPr�stupov� pr�va : "
+ 
+-#: nis/nis_print.c:271
++#: nis/nis_print.c:272
+ msgid "\t\tAttributes    : "
+ msgstr "\t\tAtrib�ty         : "
+ 
+-#: sunrpc/rpc_main.c:1416
++#: sunrpc/rpc_main.c:1425
+ #, c-format
+ msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n"
+ msgstr "\t%s [-abkCLNTM][-Dn�zov[=hodnota]] [-i ve�kos�] [-I [-K sekundy]] [-Y cesta] vst_s�bor\n"
+ 
+-#: sunrpc/rpc_main.c:1418
++#: sunrpc/rpc_main.c:1427
+ #, c-format
+ msgid "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]\n"
+ msgstr "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o v�st_s�bor] [vst_s�bor]\n"
+ 
+-#: sunrpc/rpc_main.c:1421
++#: sunrpc/rpc_main.c:1430
+ #, c-format
+ msgid "\t%s [-n netid]* [-o outfile] [infile]\n"
+ msgstr "\t%s [-n netid]* [-o v�st_s�bor] [vst_s�bor]\n"
+ 
+-#: sunrpc/rpc_main.c:1420
++#: sunrpc/rpc_main.c:1429
+ #, c-format
+ msgid "\t%s [-s nettype]* [-o outfile] [infile]\n"
+ msgstr "\t%s [-s nettype]* [-o v�st_s�bor] [vst_s�bor]\n"
+ 
+-#: nis/nis_print.c:235
++#: nis/nis_print.c:236
+ msgid "\tAccess rights: "
+ msgstr "\tPr�stupov� pr�va: "
+ 
+-#: nis/nis_print.c:293
++#: nis/nis_print.c:294
+ #, c-format
+ msgid "\tEntry data of type %s\n"
+ msgstr "\tVstupn� �daje typu %s\n"
+ 
+-#: nis/nis_print.c:171
++#: nis/nis_print.c:172
+ #, c-format
+ msgid "\tName       : %s\n"
+ msgstr "\tN�zov         : %s\n"
+ 
+-#: nis/nis_print.c:172
++#: nis/nis_print.c:173
+ msgid "\tPublic Key : "
+ msgstr "\tVerejn� k���  : "
+ 
+-#: nis/nis_print.c:234
++#: nis/nis_print.c:235
+ #, c-format
+ msgid "\tType         : %s\n"
+ msgstr "\tTyp             : %s\n"
+ 
+-#: nis/nis_print.c:201
++#: nis/nis_print.c:202
+ #, c-format
+ msgid "\tUniversal addresses (%u)\n"
+ msgstr "\tUniverz�lne adresy (%u)\n"
+ 
+-#: nis/nis_print.c:269
++#: nis/nis_print.c:270
+ #, c-format
+ msgid "\t[%d]\tName          : %s\n"
+ msgstr "\t[%d]\tN�zov            : %s\n"
+ 
+-#: nis/nis_print.c:296
++#: nis/nis_print.c:297
+ #, c-format
+ msgid "\t[%u] - [%u bytes] "
+ msgstr "\t[%u] - [%u bajtov] "
+ 
+-#: nscd/nscd_stat.c:153
++#: nscd/nscd_stat.c:154
+ msgid ""
+ "\n"
+ "%s cache:\n"
+@@ -109,11 +109,11 @@
+ "%15ld%% �spe�nos� cache\n"
+ "%15s  skontrolujte /etc/%s na zmeny\n"
+ 
+-#: nis/nis_print.c:251
++#: nis/nis_print.c:252
+ msgid "\nGroup Members :\n"
+ msgstr "\n�lenovia skup�n  :\n"
+ 
+-#: nis/nis_print.c:320
++#: nis/nis_print.c:323
+ msgid "\nTime to Live  : "
+ msgstr "\n�ivotnos�        : "
+ 
+@@ -133,60 +133,60 @@
+ msgid "       rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n"
+ msgstr "       rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verzie ]\n"
+ 
+-#: nscd/nscd_stat.c:145 nscd/nscd_stat.c:147
++#: nscd/nscd_stat.c:146 nscd/nscd_stat.c:148
+ msgid "      no"
+ msgstr "      nie"
+ 
+-#: nscd/nscd_stat.c:145 nscd/nscd_stat.c:147
++#: nscd/nscd_stat.c:146 nscd/nscd_stat.c:148
+ msgid "     yes"
+ msgstr "     �no"
+ 
+-#: nis/nis_print.c:344
++#: nis/nis_print.c:349
+ #, c-format
+ msgid "    Data Length = %u\n"
+ msgstr "    D�ka �dajov = %u\n"
+ 
+-#: nis/nis_print_group_entry.c:121
++#: nis/nis_print_group_entry.c:123
+ msgid "    Explicit members:\n"
+ msgstr "    Explicitn� �lenovia:\n"
+ 
+-#: nis/nis_print_group_entry.c:145 nis/nis_print_group_entry.c:161
++#: nis/nis_print_group_entry.c:147 nis/nis_print_group_entry.c:163
+ msgid "    Explicit nonmembers:\n"
+ msgstr "    Explicitn� ne�lenovia:\n"
+ 
+-#: nis/nis_print_group_entry.c:129
++#: nis/nis_print_group_entry.c:131
+ msgid "    Implicit members:\n"
+ msgstr "    Implicitn� �lenovia:\n"
+ 
+-#: nis/nis_print_group_entry.c:153
++#: nis/nis_print_group_entry.c:155
+ msgid "    Implicit nonmembers:\n"
+ msgstr "    Implicitn� ne�lenovia:\n"
+ 
+-#: nis/nis_print_group_entry.c:126
++#: nis/nis_print_group_entry.c:128
+ msgid "    No explicit members\n"
+ msgstr "    �iadni explicitn� �lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:150
++#: nis/nis_print_group_entry.c:152
+ msgid "    No explicit nonmembers\n"
+ msgstr "    �iadni explicitn� ne�lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:134
++#: nis/nis_print_group_entry.c:136
+ msgid "    No implicit members\n"
+ msgstr "    �iadni implicitn� �lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:158
++#: nis/nis_print_group_entry.c:160
+ msgid "    No implicit nonmembers\n"
+ msgstr "    �iadni implicitn� ne�lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:142
++#: nis/nis_print_group_entry.c:144
+ msgid "    No recursive members\n"
+ msgstr "    �iadni rekurz�vni �lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:166
++#: nis/nis_print_group_entry.c:168
+ msgid "    No recursive nonmembers\n"
+ msgstr "    �iadni rekurz�vni ne�lenovia\n"
+ 
+-#: nis/nis_print_group_entry.c:137
++#: nis/nis_print_group_entry.c:139
+ msgid "    Recursive members:\n"
+ msgstr "    Rekurz�vni �lenovia:\n"
+ 
+@@ -194,138 +194,198 @@
+ msgid "   program vers proto   port\n"
+ msgstr "   program verz proto   port\n"
+ 
+-#: argp/argp-help.c:1571
++#: argp/argp-help.c:1572
+ msgid "  or: "
+ msgstr "  alebo: "
+ 
++#: elf/ldconfig.c:448
++msgid " (SKIPPED)\n"
++msgstr " (VYNECHAN�)\n"
++
++#: elf/ldconfig.c:446
++msgid " (changed)\n"
++msgstr " (zmenen�)\n"
++
+ #: timezone/zic.c:421
+ #, c-format
+ msgid " (rule from \"%s\", line %d)"
+ msgstr " (pravidlo z \"%s\", riadok %d)"
+ 
+-#: argp/argp-help.c:1583
++#: argp/argp-help.c:1584
+ msgid " [OPTION...]"
+ msgstr " [VO�BA...]"
+ 
+-#: locale/programs/ld-collate.c:370 locale/programs/ld-ctype.c:1291
+-msgid " done\n"
+-msgstr " hotovo\n"
+-
+ #: timezone/zic.c:418
+ #, c-format
+ msgid "\"%s\", line %d: %s"
+ msgstr "\"%s\", riadok %d: %s"
+ 
+-#: timezone/zic.c:958
++#: timezone/zic.c:983
+ #, c-format
+ msgid "\"Zone %s\" line and -l option are mutually exclusive"
+ msgstr "Riadok \"Zone %s\" a vo�ba -l sa navz�jom vylu�uj�"
+ 
+-#: timezone/zic.c:966
++#: timezone/zic.c:991
+ #, c-format
+ msgid "\"Zone %s\" line and -p option are mutually exclusive"
+ msgstr "Riadok \"Zone %s\" a vo�ba -p sa navz�jom vylu�uj�"
+ 
+-#: sunrpc/rpc_main.c:1401
++#: sunrpc/rpc_main.c:1410
+ msgid "\"infile\" is required for template generation flags.\n"
+ msgstr "\"vst_s�bor\" je vy�adovan� pri pou�it� pr�znakov tvorby vzoru.\n"
+ 
+-#: argp/argp-help.c:210
++#: argp/argp-help.c:209
+ #, c-format
+ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+ msgstr "%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu"
+ 
+-#: argp/argp-help.c:219
++#: argp/argp-help.c:218
+ #, c-format
+ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+ msgstr "%.*s: Nezn�my parameter ARGP_HELP_FMT"
+ 
+-#: timezone/zic.c:768
++#: locale/programs/ld-address.c:576 locale/programs/ld-collate.c:2593
++#: locale/programs/ld-collate.c:3719 locale/programs/ld-ctype.c:2110
++#: locale/programs/ld-ctype.c:2847 locale/programs/ld-identification.c:440
++#: locale/programs/ld-measurement.c:232 locale/programs/ld-messages.c:326
++#: locale/programs/ld-monetary.c:934 locale/programs/ld-name.c:300
++#: locale/programs/ld-numeric.c:370 locale/programs/ld-paper.c:233
++#: locale/programs/ld-telephone.c:308 locale/programs/ld-time.c:1172
++#, c-format
++msgid "%1$s: definition does not end with `END %1$s'"
++msgstr "%1$s: Defin�cia nekon�� `END %1$s'"
++
++#: elf/cache.c:165 elf/cache.c:175
++#, c-format
++msgid "%d libs found in cache `%s'\n"
++msgstr "%d kni�n�c n�jden�ch v cache `%s'\n"
++
++#: timezone/zic.c:793
+ #, c-format
+ msgid "%s in ruleless zone"
+ msgstr "%s v z�ne bez pravidiel"
+ 
+-#: assert/assert.c:51
++#: elf/../sysdeps/generic/readelflib.c:65
++#, c-format
++msgid "%s is a 32 bit ELF file.\n"
++msgstr "%s je 32-bitov� ELF s�bor.\n"
++
++#: elf/../sysdeps/generic/readelflib.c:67
++#, c-format
++msgid "%s is a 64 bit ELF file.\n"
++msgstr "%s je 64-bitov� ELF s�bor.\n"
++
++#: elf/../sysdeps/unix/sysv/linux/i386/readelflib.c:48
++#, c-format
++msgid "%s is for unknown machine %d.\n"
++msgstr "%s je pre nezn�my stroj %d.\n"
++
++#: elf/ldconfig.c:329
++#, c-format
++msgid "%s is not a known library type"
++msgstr "%s nie je zn�my typ kni�nice"
++
++#: elf/../sysdeps/generic/readelflib.c:76
++#, c-format
++msgid "%s is not a shared object file (Type: %d).\n"
++msgstr "%s nie je zdie�an� objektov� s�bor (Typ: %d).\n"
++
++#: elf/ldconfig.c:415
++#, c-format
++msgid "%s is not a symbolic link\n"
++msgstr "%s nie je symbolick� odkaz\n"
++
++#: elf/readlib.c:157
++#, c-format
++msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n"
++msgstr "%s nie je ELF s�bor - na za�iatku obsahuj� chybn� magick� bajty.\n"
++
++#: assert/assert.c:52
+ #, c-format
+ msgid "%s%s%s:%u: %s%sAssertion `%s' failed.\n"
+ msgstr "%s%s%s:%u: %s%sPredpoklad `%s' nesplnen�.\n"
+ 
+-#: assert/assert-perr.c:52
++#: assert/assert-perr.c:54
+ #, c-format
+ msgid "%s%s%s:%u: %s%sUnexpected error: %s.\n"
+ msgstr "%s%s%s:%u: %s%sNeo�ak�van� chyba: %s.\n"
+ 
+-#: stdio-common/psignal.c:47
++#: stdio-common/psignal.c:48
+ #, c-format
+ msgid "%s%sUnknown signal %d\n"
+ msgstr "%s%sNezn�my sign�l %d\n"
+ 
+-#: timezone/zic.c:2201
++#: timezone/zic.c:2228
+ #, c-format
+ msgid "%s: %d did not sign extend correctly\n"
+ msgstr "%s: nespr�vne roz��renie znamienka pre %d\n"
+ 
+-#: locale/programs/charmap.c:261
++#: locale/programs/charmap.c:326
+ #, c-format
+ msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
+ msgstr "%s: <mb_cur_max> mus� by� v��ie ako <mb_cur_min>\n"
+ 
+-#: sunrpc/rpc_main.c:422
++#: sunrpc/rpc_main.c:423
+ #, c-format
+ msgid "%s: C preprocessor failed with exit code %d\n"
+ msgstr "%s: C preprocesor zlyhal s v�stupn�m k�dom %d\n"
+ 
+-#: sunrpc/rpc_main.c:419
++#: sunrpc/rpc_main.c:420
+ #, c-format
+ msgid "%s: C preprocessor failed with signal %d\n"
+ msgstr "%s: C preprocesor zlyhal so sign�lom %d\n"
+ 
+-#: timezone/zic.c:1469
++#: timezone/zic.c:1494
+ #, c-format
+ msgid "%s: Can't create %s: %s\n"
+ msgstr "%s: Nie je mo�n� vytvori� %s: %s\n"
+ 
+-#: timezone/zic.c:2179
++#: timezone/zic.c:2206
+ #, c-format
+ msgid "%s: Can't create directory %s: %s\n"
+ msgstr "%s: Nie je mo�n� vytvori� adres�r %s: %s\n"
+ 
+-#: timezone/zic.c:620
++#: timezone/zic.c:645
+ #, c-format
+ msgid "%s: Can't link from %s to %s: %s\n"
+ msgstr "%s: Nie je mo�n� vytvori� prepojenie z %s na %s: %s\n"
+ 
+-#: timezone/zic.c:794
++#: timezone/zic.c:819
+ #, c-format
+ msgid "%s: Can't open %s: %s\n"
+ msgstr "%s: Nie je mo�n� otvori� %s: %s\n"
+ 
+-#: timezone/zic.c:1459
++#: timezone/zic.c:1484
+ #, c-format
+ msgid "%s: Can't remove %s: %s\n"
+ msgstr "%s: Nie je mo�n� odstr�ni� %s: %s\n"
+ 
+-#: timezone/zic.c:863
++#: timezone/zic.c:630
++#, c-format
++msgid "%s: Can't unlink  %s: %s\n"
++msgstr "%s: Nie je mo�n� zmaza� %s: %s\n"
++
++#: timezone/zic.c:888
+ #, c-format
+ msgid "%s: Error closing %s: %s\n"
+ msgstr "%s: Chyba pri uzatv�ran� %s: %s\n"
+ 
+-#: timezone/zic.c:856
++#: timezone/zic.c:881
+ #, c-format
+ msgid "%s: Error reading %s\n"
+ msgstr "%s: Chyba pri ��tan� %s\n"
+ 
+-#: timezone/zic.c:1535
++#: timezone/zdump.c:267
+ #, c-format
+-msgid "%s: Error writing %s\n"
+-msgstr "%s: Chyba pri z�pise %s\n"
++msgid "%s: Error writing "
++msgstr "%s: Chyba pri z�pise "
+ 
+-#: timezone/zdump.c:266
++#: timezone/zic.c:1560
+ #, c-format
+-msgid "%s: Error writing standard output "
+-msgstr "%s: Chyba pri z�pise na �tandardn� v�stup "
++msgid "%s: Error writing %s\n"
++msgstr "%s: Chyba pri z�pise %s\n"
+ 
+-#: timezone/zic.c:841
++#: timezone/zic.c:866
+ #, c-format
+ msgid "%s: Leap line in non leap seconds file %s\n"
+ msgstr "%s: Priestupn� riadok v s�bore nepriestupn�ch sek�nd %s\n"
+@@ -335,122 +395,551 @@
+ msgid "%s: Memory exhausted: %s\n"
+ msgstr "%s: Nedostatok pam�ti: %s\n"
+ 
+-#: timezone/zic.c:524
++#: timezone/zic.c:525
+ #, c-format
+ msgid "%s: More than one -L option specified\n"
+ msgstr "%s: Vo�ba -L zadan� viac ako raz\n"
+ 
+-#: timezone/zic.c:484
++#: timezone/zic.c:485
+ #, c-format
+ msgid "%s: More than one -d option specified\n"
+ msgstr "%s: Vo�ba -d zadan� viac ako raz\n"
+ 
+-#: timezone/zic.c:494
++#: timezone/zic.c:495
+ #, c-format
+ msgid "%s: More than one -l option specified\n"
+ msgstr "%s: Vo�ba -l zadan� viac ako raz\n"
+ 
+-#: timezone/zic.c:504
++#: timezone/zic.c:505
+ #, c-format
+ msgid "%s: More than one -p option specified\n"
+ msgstr "%s: Vo�ba -p zadan� viac ako raz\n"
+ 
+-#: timezone/zic.c:514
++#: timezone/zic.c:515
+ #, c-format
+ msgid "%s: More than one -y option specified\n"
+ msgstr "%s: Vo�ba -y zadan� viac ako raz\n"
+ 
+-#: argp/argp-parse.c:640
++#: argp/argp-parse.c:646
+ #, c-format
+ msgid "%s: Too many arguments\n"
+ msgstr "%s: Prive�a argumentov\n"
+ 
+-#: login/programs/database.c:129
++#: locale/programs/ld-collate.c:457 locale/programs/ld-collate.c:483
++#: locale/programs/ld-collate.c:499
++#, c-format
++msgid "%s: `%s' mentioned more than once in definition of weight %d"
++msgstr "%s: `%s' spomenut� viac ako raz v defin�cii v�hy %d"
++
++#: locale/programs/ld-collate.c:1323
++#, c-format
++msgid "%s: `%s' must be a character"
++msgstr "%s: `%s' mus� by� znak"
++
++#: locale/programs/ld-address.c:248 locale/programs/ld-address.c:276
++#: locale/programs/ld-address.c:309 locale/programs/ld-address.c:321
++#, c-format
++msgid "%s: `%s' value does not match `%s' value"
++msgstr "%s: hodnota `%s' nezodpoved� hodnote `%s'"
++
++#: locale/programs/ld-monetary.c:835 locale/programs/ld-numeric.c:313
++#, c-format
++msgid "%s: `-1' must be last entry in `%s' field"
++msgstr "%s: `-1' mus� by� posledn�m z�znamom v poli `%s'"
++
++#: locale/programs/ld-collate.c:447 locale/programs/ld-collate.c:473
++#, c-format
++msgid "%s: `forward' and `backward' are mutually excluding each other"
++msgstr "%s: `forward' a `backward' sa navz�jom vylu�uj�"
++
++#: locale/programs/ld-collate.c:1515
++#, c-format
++msgid "%s: `position' must be used for a specific level in all sections or none"
++msgstr "%s: `position' mus� by� pre dan� �rove� pou�it� vo v�etk�ch sekci�ch, alebo v �iadnej"
++
++#: locale/programs/ld-ctype.c:2635 locale/programs/ld-ctype.c:2775
++#, c-format
++msgid "%s: `translit_start' section does not end with `translit_end'"
++msgstr "%s: sekcia `translit_start' nekon�� `translit_end'"
++
++#: locale/programs/ld-collate.c:1123
++#, c-format
++msgid "%s: byte sequence of first character of sequence is not lower than that of the last character"
++msgstr "%s: poradie bajtu prv�ho znaku sekvencie nie je men�ie ako posledn�ho"
++
++#: locale/programs/ld-collate.c:1081
++#, c-format
++msgid "%s: byte sequences of first and last character must have the same length"
++msgstr "%s: bajtov� sekvencie prv�ho a posledn�ho znaku musia ma� rovnak� d�ku"
++
++#: locale/programs/ld-collate.c:3642
++#, c-format
++msgid "%s: cannot have `%s' as end of ellipsis range"
++msgstr "%s: `%s' nem��e by� koncov�m znakom rozsahu pokra�ovania"
++
++#: locale/programs/ld-collate.c:3308
++#, c-format
++msgid "%s: cannot reorder after %.*s: symbol not known"
++msgstr "%s: nie je mo�n� preradi� za %.*s: nezn�my symbol"
++
++#: locale/programs/ld-ctype.c:2910 locale/programs/ld-ctype.c:2994
++#: locale/programs/ld-ctype.c:3014 locale/programs/ld-ctype.c:3035
++#: locale/programs/ld-ctype.c:3056 locale/programs/ld-ctype.c:3077
++#: locale/programs/ld-ctype.c:3098 locale/programs/ld-ctype.c:3138
++#: locale/programs/ld-ctype.c:3159 locale/programs/ld-ctype.c:3226
++#, c-format
++msgid "%s: character `%s' in charmap not representable with one byte"
++msgstr "%s: znak `%s' v znakovej mape nie je vyjadrite�n� jedn�m bajtom"
++
++#: locale/programs/ld-ctype.c:3270 locale/programs/ld-ctype.c:3295
+ #, c-format
+-msgid "%s: cannot get modification time"
+-msgstr "%s: nie je mo�n� zisti� �as zmeny"
++msgid "%s: character `%s' needed as default value not representable with one byte"
++msgstr "%s: znak `%s' je potrebn� ako prednastaven� hodnota nevyjadrite�n� jedn�m bajtom"
+ 
+-#: timezone/zic.c:1900
++#: locale/programs/ld-ctype.c:2905
++#, c-format
++msgid "%s: character `%s' not defined in charmap while needed as default value"
++msgstr "%s: znak `%s' nie je definovan� v mape znakov a je potrebn� ako implicitn� hodnota"
++
++#: locale/programs/ld-ctype.c:2989 locale/programs/ld-ctype.c:3009
++#: locale/programs/ld-ctype.c:3051 locale/programs/ld-ctype.c:3072
++#: locale/programs/ld-ctype.c:3093 locale/programs/ld-ctype.c:3133
++#: locale/programs/ld-ctype.c:3154 locale/programs/ld-ctype.c:3221
++#: locale/programs/ld-ctype.c:3263 locale/programs/ld-ctype.c:3288
++#, c-format
++msgid "%s: character `%s' not defined while needed as default value"
++msgstr "%s: znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota"
++
++#: timezone/zic.c:1927
+ #, c-format
+ msgid "%s: command was '%s', result was %d\n"
+ msgstr "%s: pr�kaz bol '%s', v�sledok bol %d\n"
+ 
+-#: locale/programs/charmap.c:677 locale/programs/locfile.c:1008
++#: locale/programs/ld-time.c:225
++#, c-format
++msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'"
++msgstr "%s: pr�znak smeru v re�azci %Zd po�a `era' nie je '+' ani '-'"
++
++#: locale/programs/ld-time.c:237
++#, c-format
++msgid "%s: direction flag in string %Zd in `era' field is not a single character"
++msgstr "%s: pr�znak smeru v re�azci %Zd po�a `era' nie je jeden znak"
++
++#: locale/programs/ld-ctype.c:2727
++#, c-format
++msgid "%s: duplicate `default_missing' definition"
++msgstr "%s: duplicitn� defin�cia `default_missing'"
++
++#: locale/programs/ld-identification.c:423
++#, c-format
++msgid "%s: duplicate category version definition"
++msgstr "%s: duplicitn� defin�cia verzie kateg�rie"
++
++#: locale/programs/ld-collate.c:2711
++#, c-format
++msgid "%s: duplicate declaration of section `%s'"
++msgstr "%s: duplicitn� deklar�cia sekcie `%s'"
++
++#: locale/programs/ld-collate.c:2675
++#, c-format
++msgid "%s: duplicate definition of `%s'"
++msgstr "%s: duplicitn� defin�cia `%s'"
++
++#: locale/programs/ld-collate.c:3691
++#, c-format
++msgid "%s: empty category description not allowed"
++msgstr "%s: pr�zdny popis kateg�rie nie je povolen�"
++
++#: locale/programs/ld-collate.c:755
++#, c-format
++msgid "%s: empty weight string not allowed"
++msgstr "%s: pr�zdny re�azec v�hy nie je povolen�"
++
++#: locale/programs/charmap.c:831
+ #, c-format
+ msgid "%s: error in state machine"
+ msgstr "%s: chyba v stavovom automate"
+ 
+-#: posix/getopt.c:784
++#: locale/programs/ld-ctype.c:2483
++#, c-format
++msgid "%s: field `%s' declared more than once"
++msgstr "%s: pole `%s' deklarovan� viac ako raz"
++
++#: locale/programs/ld-ctype.c:1525 locale/programs/ld-ctype.c:1650
++#: locale/programs/ld-ctype.c:1756 locale/programs/ld-ctype.c:2346
++#: locale/programs/ld-ctype.c:3329
++#, c-format
++msgid "%s: field `%s' does not contain exactly ten entries"
++msgstr "%s: pole `%s' neobsahuje presne desa� polo�iek"
++
++#: locale/programs/ld-address.c:154 locale/programs/ld-address.c:205
++#: locale/programs/ld-address.c:230 locale/programs/ld-address.c:259
++#: locale/programs/ld-name.c:115 locale/programs/ld-telephone.c:117
++#, c-format
++msgid "%s: field `%s' must not be empty"
++msgstr "%s: pole `%s' nesmie by� pr�zdne"
++
++#: locale/programs/ld-address.c:142 locale/programs/ld-address.c:197
++#: locale/programs/ld-address.c:224 locale/programs/ld-address.c:284
++#: locale/programs/ld-address.c:303 locale/programs/ld-address.c:315
++#: locale/programs/ld-measurement.c:104 locale/programs/ld-monetary.c:244
++#: locale/programs/ld-monetary.c:260 locale/programs/ld-name.c:104
++#: locale/programs/ld-numeric.c:113 locale/programs/ld-numeric.c:127
++#: locale/programs/ld-paper.c:101 locale/programs/ld-paper.c:109
++#: locale/programs/ld-telephone.c:105
++#, c-format
++msgid "%s: field `%s' not defined"
++msgstr "%s: pole `%s' nie je definovan�"
++
++#: locale/programs/ld-messages.c:115 locale/programs/ld-messages.c:148
++#, c-format
++msgid "%s: field `%s' undefined"
++msgstr "%s: pole `%s' nedefinovan�"
++
++#: locale/programs/ld-time.c:258
++#, c-format
++msgid "%s: garbage at end of offset value in string %Zd in `era' field"
++msgstr "%s: smetie za koncom hodnoty posunutia v re�azci %Zd po�a `era'"
++
++#: locale/programs/ld-time.c:318
++#, c-format
++msgid "%s: garbage at end of starting date in string %Zd in `era' field "
++msgstr "%s: smetie za koncom po�iato�n�ho d�tumu v re�azci %Zd po�a `era' "
++
++#: locale/programs/ld-time.c:395
++#, c-format
++msgid "%s: garbage at end of stopping date in string %Zd in `era' field"
++msgstr "%s: smetie za koncom koncov�ho d�tumu v re�azci %Zd po�a `era'"
++
++#: posix/getopt.c:795
+ #, c-format
+ msgid "%s: illegal option -- %c\n"
+ msgstr "%s: nepr�pustn� vo�ba -- %c\n"
+ 
+-#: posix/getopt.c:787
++#: locale/programs/ld-address.c:573 locale/programs/ld-collate.c:3717
++#: locale/programs/ld-ctype.c:2844 locale/programs/ld-identification.c:437
++#: locale/programs/ld-measurement.c:229 locale/programs/ld-messages.c:324
++#: locale/programs/ld-monetary.c:932 locale/programs/ld-name.c:298
++#: locale/programs/ld-numeric.c:368 locale/programs/ld-paper.c:231
++#: locale/programs/ld-telephone.c:306 locale/programs/ld-time.c:1170
++#, c-format
++msgid "%s: incomplete `END' line"
++msgstr "%s: nekompletn� riadok `END'"
++
++#: locale/programs/ld-address.c:166
++msgid "%s: invalid escape `%%%c' sequence in field `%s'"
++msgstr "%s: nepr�pustn� escape `%%%x' sekvencia v poli `%s'"
++
++#: locale/programs/ld-name.c:127 locale/programs/ld-telephone.c:126
++#: locale/programs/ld-telephone.c:150
++#, c-format
++msgid "%s: invalid escape sequence in field `%s'"
++msgstr "%s: chybn� escape-sekvencia v poli `%s'"
++
++#: locale/programs/ld-time.c:250
++#, c-format
++msgid "%s: invalid number for offset in string %Zd in `era' field"
++msgstr "%s: nepr�pustn� ��slo pre posunutie v re�azci %Zd po�a `era'"
++
++#: locale/programs/ld-collate.c:3143
++#, c-format
++msgid "%s: invalid number of sorting rules"
++msgstr "%s: chybn� po�et pravidiel triedenia"
++
++#: posix/getopt.c:798
+ #, c-format
+ msgid "%s: invalid option -- %c\n"
+ msgstr "%s: chybn� vo�ba -- %c\n"
+ 
+-#: posix/getopt.c:707
++#: locale/programs/ld-time.c:309
++#, c-format
++msgid "%s: invalid starting date in string %Zd in `era' field"
++msgstr "%s: nepr�pustn� po�iato�n� d�tum v re�azci %Zd po�a `era'"
++
++#: locale/programs/ld-time.c:386
++#, c-format
++msgid "%s: invalid stopping date in string %Zd in `era' field"
++msgstr "%s: nepr�pustn� koncov� d�tum v re�azci %d po�a `era'"
++
++#: locale/programs/ld-measurement.c:112
++#, c-format
++msgid "%s: invalid value for field `%s'"
++msgstr "%s: nepr�pustn� hodnota po�a `%s'"
++
++#: locale/programs/ld-address.c:242 locale/programs/ld-address.c:270
++#, c-format
++msgid "%s: language abbreviation `%s' not defined"
++msgstr "%s: skratka jazyka `%s' nie je definovan�"
++
++#: locale/programs/ld-collate.c:3223 locale/programs/ld-collate.c:3346
++#: locale/programs/ld-collate.c:3695
++#, c-format
++msgid "%s: missing `order_end' keyword"
++msgstr "%s: ch�baj�ce k���ov� slovo `order_end'"
++
++#: locale/programs/ld-collate.c:3360 locale/programs/ld-collate.c:3707
++#, c-format
++msgid "%s: missing `reorder-end' keyword"
++msgstr "%s: ch�baj�ce k���ov� slovo `reorder-end'"
++
++#: locale/programs/ld-collate.c:3710
++#, c-format
++msgid "%s: missing `reorder-sections-end' keyword"
++msgstr "%s: ch�baj�ce k���ov� slovo `reorder-sections-end'"
++
++#: locale/programs/ld-time.c:435
++#, c-format
++msgid "%s: missing era format in string %Zd in `era' field"
++msgstr "%s: ch�ba form�t �ry v re�azci %Zd v poli `era'"
++
++#: locale/programs/ld-time.c:423
++#, c-format
++msgid "%s: missing era name in string %Zd in `era' field"
++msgstr "%s: ch�ba meno �ry v re�azci %Zd v poli `era'"
++
++#: locale/programs/ld-collate.c:3119
++#, c-format
++msgid "%s: multiple order definitions for section `%s'"
++msgstr "%s: viacn�sobn� defin�cia poradia pre sekciu `%s'"
++
++#: locale/programs/ld-collate.c:3169
++#, c-format
++msgid "%s: multiple order definitions for unnamed section"
++msgstr "%s: viacn�sobn� defin�cia poradia pre sekciu bez mena"
++
++#: locale/programs/ld-messages.c:137 locale/programs/ld-messages.c:170
++#, c-format
++msgid "%s: no correct regular expression for field `%s': %s"
++msgstr "%s: pre pole `%s' neexistuje korektn� regul�rny v�raz: %s"
++
++#: locale/programs/ld-identification.c:169
++#, c-format
++msgid "%s: no identification for category `%s'"
++msgstr "%s: kateg�ria `%s' nem� identifik�ciu"
++
++#: locale/programs/ld-ctype.c:2753
++#, c-format
++msgid "%s: no representable `default_missing' definition found"
++msgstr "%s: nen�jden� zobrazite�n� defin�cia `default_missing'"
++
++#: locale/programs/ld-collate.c:591
++#, c-format
++msgid "%s: not enough sorting rules"
++msgstr "%s: nedostato�n� po�et pravidiel triedenia"
++
++#: locale/programs/ld-address.c:295
++#, c-format
++msgid "%s: numeric country code `%d' not valid"
++msgstr "%s: ��seln� k�d krajiny `%d' nie je platn�"
++
++#: posix/getopt.c:718
+ #, c-format
+ msgid "%s: option `%c%s' doesn't allow an argument\n"
+ msgstr "%s: vo�ba `%c%s' nedovo�uje pou�i� argument\n"
+ 
+-#: posix/getopt.c:677
++#: posix/getopt.c:688
+ #, c-format
+ msgid "%s: option `%s' is ambiguous\n"
+ msgstr "%s: vo�ba `%s' nie je jednozna�n�\n"
+ 
+-#: posix/getopt.c:725 posix/getopt.c:898
++#: posix/getopt.c:736 posix/getopt.c:909
+ #, c-format
+ msgid "%s: option `%s' requires an argument\n"
+ msgstr "%s: vo�ba `%s' vy�aduje argument\n"
+ 
+-#: posix/getopt.c:702
++#: posix/getopt.c:713
+ #, c-format
+ msgid "%s: option `--%s' doesn't allow an argument\n"
+ msgstr "%s: vo�ba `--%s' nedovo�uje pou�i� argument\n"
+ 
+-#: posix/getopt.c:882
++#: posix/getopt.c:893
+ #, c-format
+ msgid "%s: option `-W %s' doesn't allow an argument\n"
+ msgstr "%s: vo�ba `-W %s' nedovo�uje pou�i� argument\n"
+ 
+-#: posix/getopt.c:864
++#: posix/getopt.c:875
+ #, c-format
+ msgid "%s: option `-W %s' is ambiguous\n"
+ msgstr "%s: vo�ba `-W %s' nie je jednozna�n�\n"
+ 
+-#: posix/getopt.c:817 posix/getopt.c:947
++#: posix/getopt.c:828 posix/getopt.c:958
+ #, c-format
+ msgid "%s: option requires an argument -- %c\n"
+ msgstr "%s: vo�ba vy�aduje argument -- %c\n"
+ 
+-#: sunrpc/rpc_main.c:287
++#: locale/programs/ld-collate.c:1314 locale/programs/ld-collate.c:3654
++#, c-format
++msgid "%s: order for `%.*s' already defined at %s:%Zu"
++msgstr "%s: poradie pre `%.*s' je u� definovan� na %s:%Zu"
++
++#: locale/programs/ld-collate.c:3297
++#, c-format
++msgid "%s: order for collating element %.*s not yet defined"
++msgstr "%s: poradie pre element triedenia `%.*s' e�te nebolo definovan�"
++
++#: locale/programs/ld-collate.c:3281
++#, c-format
++msgid "%s: order for collating symbol %.*s not yet defined"
++msgstr "%s: poradie pre symbol triedenia `%.*s' e�te nebolo definovan�"
++
++#: sunrpc/rpc_main.c:289
+ #, c-format
+ msgid "%s: output would overwrite %s\n"
+ msgstr "%s: v�stup by prep�sal %s\n"
+ 
+-#: timezone/zic.c:848 timezone/zic.c:1262 timezone/zic.c:1287
++#: timezone/zic.c:873 timezone/zic.c:1287 timezone/zic.c:1312
+ #, c-format
+ msgid "%s: panic: Invalid l_value %d\n"
+ msgstr "%s: fat�lna chyba: Nepr�pustn� l_hodnota %d\n"
+ 
+-#: locale/programs/charmap.c:684 locale/programs/repertoire.c:289
++#: locale/programs/charmap.c:838 locale/programs/ld-address.c:592
++#: locale/programs/ld-collate.c:2590 locale/programs/ld-collate.c:3735
++#: locale/programs/ld-ctype.c:2107 locale/programs/ld-ctype.c:2864
++#: locale/programs/ld-identification.c:456
++#: locale/programs/ld-measurement.c:248 locale/programs/ld-messages.c:342
++#: locale/programs/ld-monetary.c:950 locale/programs/ld-name.c:316
++#: locale/programs/ld-numeric.c:386 locale/programs/ld-paper.c:249
++#: locale/programs/ld-telephone.c:324 locale/programs/ld-time.c:1188
++#: locale/programs/locfile.h:103 locale/programs/repertoire.c:325
+ #, c-format
+ msgid "%s: premature end of file"
+ msgstr "%s: pred�asn� koniec s�boru"
+ 
+-#: sunrpc/rpc_main.c:294
++#: locale/programs/ld-collate.c:3394 locale/programs/ld-collate.c:3580
++#, c-format
++msgid "%s: section `%.*s' not known"
++msgstr "%s: nezn�ma sekcia `%.*s'"
++
++#: locale/programs/ld-time.c:337
++#, c-format
++msgid "%s: starting date is invalid in string %Zd in `era' field"
++msgstr "%s: nepr�pustn� po�iato�n� d�tum v re�azci %Zd v poli `era'"
++
++#: locale/programs/ld-time.c:414
++#, c-format
++msgid "%s: stopping date is invalid in string %Zd in `era' field"
++msgstr "%s: nepr�pustn� koncov� d�tum v re�azci %d v poli `era'"
++
++#: locale/programs/ld-collate.c:1248
++#, c-format
++msgid "%s: symbolic range ellipsis must not be direct followed by `order_end'"
++msgstr "%s: pokra�ovanie symbolick�ho rozsahu nesmie by� priamo nasledovan� `order_end'"
++
++#: locale/programs/ld-collate.c:1244
++#, c-format
++msgid "%s: symbolic range ellipsis must not directly follow `order_start'"
++msgstr "%s: pokra�ovanie symbolick�ho rozsahu nesmie priamo nasledo� `order_start'"
++
++#: locale/programs/ld-address.c:583 locale/programs/ld-collate.c:518
++#: locale/programs/ld-collate.c:570 locale/programs/ld-collate.c:865
++#: locale/programs/ld-collate.c:878 locale/programs/ld-collate.c:2581
++#: locale/programs/ld-collate.c:3726 locale/programs/ld-ctype.c:1840
++#: locale/programs/ld-ctype.c:2098 locale/programs/ld-ctype.c:2673
++#: locale/programs/ld-ctype.c:2855 locale/programs/ld-identification.c:447
++#: locale/programs/ld-measurement.c:239 locale/programs/ld-messages.c:333
++#: locale/programs/ld-monetary.c:941 locale/programs/ld-name.c:307
++#: locale/programs/ld-numeric.c:377 locale/programs/ld-paper.c:240
++#: locale/programs/ld-telephone.c:315 locale/programs/ld-time.c:1179
++#, c-format
++msgid "%s: syntax error"
++msgstr "%s: chyba syntaxe"
++
++#: locale/programs/ld-ctype.c:2178
++#, c-format
++msgid "%s: syntax error in definition of new character class"
++msgstr "%s: chyba syntaxe v defin�cii novej triedy znakov"
++
++#: locale/programs/ld-ctype.c:2193
++#, c-format
++msgid "%s: syntax error in definition of new character map"
++msgstr "%s: chyba syntaxe v defin�cii novej znakovej mapy"
++
++#: locale/programs/ld-ctype.c:3735
++#, c-format
++msgid "%s: table for class \"%s\": %lu bytes\n"
++msgstr "%s: tabu�ka triedy \"%s\": %lu bajtov\n"
++
++#: locale/programs/ld-ctype.c:3803
++#, c-format
++msgid "%s: table for map \"%s\": %lu bytes\n"
++msgstr "%s: tabu�ka mapy \"%s\": %lu bajtov\n"
++
++#: locale/programs/ld-ctype.c:3935
++#, c-format
++msgid "%s: table for width: %lu bytes\n"
++msgstr "%s: tabu�ka ��rky: %lu bajtov\n"
++
++#: locale/programs/ld-address.c:216
++#, c-format
++msgid "%s: terminology language code `%s' not defined"
++msgstr "%s: k�d jazyka terminol�gie `%s' nie je definovan�"
++
++#: locale/programs/ld-collate.c:1054
++#, c-format
++msgid "%s: the start and the end symbol of a range must stand for characters"
++msgstr "%s: po�iato�n� a koncov� symbol rozsahu musia zastupova� znaky"
++
++#: locale/programs/ld-time.c:464
++#, c-format
++msgid "%s: third operand for value of field `%s' must not be larger than %d"
++msgstr "%s: tret� operand hodnoty po�a `%s' nesmie by� v��� ako %d"
++
++#: locale/programs/ld-collate.c:555
++#, c-format
++msgid "%s: too many rules; first entry only had %d"
++msgstr "%s: prive�a pravidiel; prv� z�znam mal iba %d"
++
++#: locale/programs/ld-collate.c:906
++#, c-format
++msgid "%s: too many values"
++msgstr "%s: prive�a hodn�t"
++
++#: locale/programs/ld-ctype.c:3639
++#, c-format
++msgid "%s: transliteration data from locale `%s' not available"
++msgstr "%s: translitera�n� �daje prostredia `%s' nie s� dostupn�"
++
++#: sunrpc/rpc_main.c:296
++#, c-format
++msgid "%s: unable to open %s: %m\n"
++msgstr "%s: nie je mo�n� otvori� %s: %m\n"
++
++#: locale/programs/ld-collate.c:2849
++#, c-format
++msgid "%s: unknown character in collating symbol name"
++msgstr "%s: nezn�my znak v n�zve symbolu triedenia"
++
++#: locale/programs/ld-collate.c:2981
++#, c-format
++msgid "%s: unknown character in equivalent definition name"
++msgstr "%s: nezn�my znak v n�zve ekvivalentnej defin�cie"
++
++#: locale/programs/ld-collate.c:2994
++#, c-format
++msgid "%s: unknown character in equivalent definition value"
++msgstr "%s: nezn�my znak v hodnote ekvivalentnej defin�cie"
++
++#: locale/programs/ld-time.c:1040
++#, c-format
++msgid "%s: unknown character in field `%s'"
++msgstr "%s: nezn�my znak v poli `%s'"
++
++#: locale/programs/ld-collate.c:3091
++#, c-format
++msgid "%s: unknown section name `%s'"
++msgstr "%s: nezn�my n�zov sekcie `%s'"
++
++#: locale/programs/ld-collate.c:3004
+ #, c-format
+-msgid "%s: unable to open "
+-msgstr "%s: Nie je mo�n� otvori� "
++msgid "%s: unknown symbol `%s' in equivalent definition"
++msgstr "%s: nezn�my symbol `%s' v ekvivalentnej defin�cii"
+ 
+-#: posix/getopt.c:758
++#: posix/getopt.c:769
+ #, c-format
+ msgid "%s: unrecognized option `%c%s'\n"
+ msgstr "%s: nerozpoznan� vo�ba `%c%s'\n"
+ 
+-#: posix/getopt.c:754
++#: posix/getopt.c:765
+ #, c-format
+ msgid "%s: unrecognized option `--%s'\n"
+ msgstr "%s: nerozpoznan� vo�ba `--%s'\n"
+@@ -458,35 +947,75 @@
+ #: timezone/zic.c:443
+ #, c-format
+ msgid ""
+-"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]\n"
+-"\t[ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
++"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n"
++"\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
+ msgstr ""
+-"%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ]\n"
++"%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ] \\\n"
+ "\t[ -d adres�r ] [ -L priestupn�_sekundy ] [ -y typ_roku ] [ s�bor ... ]\n"
+ 
+-#: timezone/zdump.c:174
++#: timezone/zdump.c:175
+ #, c-format
+ msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
+ msgstr "%s: Pou�itie: %s [ -v ] [ -c limit ] meno_z�ny ...\n"
+ 
+-#: sunrpc/rpc_main.c:307
++#: locale/programs/ld-messages.c:121 locale/programs/ld-messages.c:154
++#, c-format
++msgid "%s: value for field `%s' must not be an empty string"
++msgstr "%s: hodnota po�a `%s' nesmie by� pr�zdny re�azec"
++
++#: locale/programs/ld-monetary.c:250 locale/programs/ld-numeric.c:119
++#, c-format
++msgid "%s: value for field `%s' must not be the empty string"
++msgstr "%s: hodnota po�a `%s' nesmie by� pr�zdny re�azec"
++
++#: locale/programs/ld-monetary.c:232
++#, c-format
++msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217"
++msgstr "%s: hodnota po�a `int_curr_symbol' nezodpoved� platn�mu n�zvu v ISO 4217"
++
++#: locale/programs/ld-monetary.c:224
++#, c-format
++msgid "%s: value of field `int_curr_symbol' has wrong length"
++msgstr "%s: hodnota po�a `int_curr_symbol' m� chybn� d�ku"
++
++#: locale/programs/ld-monetary.c:857 locale/programs/ld-numeric.c:334
++#, c-format
++msgid "%s: values for field `%s' must be smaller than 127"
++msgstr "%s: hodnoty po�a `%s' musia by� men�ie ako 127"
++
++#: locale/programs/ld-time.c:488
++#, c-format
++msgid "%s: values for field `%s' must not be larger than %d"
++msgstr "%s: hodnoty po�a `%s' nesm� by� v��ie ako %d"
++
++#: locale/programs/ld-time.c:472 locale/programs/ld-time.c:480
++#, c-format
++msgid "%s: values of field `%s' must not be larger than %d"
++msgstr "%s: hodnoty po�a `%s' nesm� by� v��ie ako %d"
++
++#: locale/programs/ld-collate.c:850
+ #, c-format
+-msgid "%s: while writing output: "
+-msgstr "%s: po�as z�pisu v�stupu: "
++msgid "%s: weights must use the same ellipsis symbol as the name"
++msgstr "%s: v�hy musia ako n�zov pou�i� rovnak� symbol pokra�ovania"
+ 
+-#: argp/argp-parse.c:164
++#: sunrpc/rpc_main.c:308
++#, c-format
++msgid "%s: while writing output %s: %m"
++msgstr "%s: po�as z�pisu v�stupu %s: %m"
++
++#: argp/argp-parse.c:170
+ msgid "(PROGRAM ERROR) No version known!?"
+ msgstr "(CHYBA PROGRAMU) Verzia nezn�ma!?"
+ 
+-#: argp/argp-parse.c:781
++#: argp/argp-parse.c:787
+ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+ msgstr "(CHYBA PROGRAMU) Vo�ba by mala by� rozpoznan�!?"
+ 
+-#: nis/nis_print.c:129
++#: nis/nis_print.c:130
+ msgid "(Unknown object)\n"
+ msgstr "(Nezn�my objekt)\n"
+ 
+-#: sunrpc/clnt_perr.c:124
++#: sunrpc/clnt_perr.c:125
+ #, c-format
+ msgid "(unknown authentication error - %d)"
+ msgstr "(nezn�ma chyba pri overovan� toto�nosti - %d)"
+@@ -495,16 +1024,16 @@
+ msgid "(unknown)"
+ msgstr "(nezn�my)"
+ 
+-#: elf/sprof.c:574
++#: elf/sprof.c:570
+ #, c-format
+ msgid "*** The file `%s' is stripped: no detailed analysis possible\n"
+ msgstr "*** Zo s�boru `%s' boli odstr�nen� ladiace inform�cie: podrobn� anal�za nie je mo�n�\n"
+ 
+-#: catgets/gencat.c:266
++#: catgets/gencat.c:282
+ msgid "*standard input*"
+ msgstr "*�tandardn� vstup*"
+ 
+-#: catgets/gencat.c:120
++#: catgets/gencat.c:125
+ msgid ""
+ "-o OUTPUT-FILE [INPUT-FILE]...\n"
+ "[OUTPUT-FILE [INPUT-FILE]...]"
+@@ -512,30 +1041,36 @@
+ "-o V�STUPN�_S�BOR [VSTUPN�_S�BOR]...\n"
+ "[ V�STUPN�_S�BOR [VSTUPN�_S�BOR]...]"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:778
++#: stdio-common/../sysdeps/gnu/errlist.c:797
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:115
+ msgid ".lib section in a.out corrupted"
+ msgstr "Po�koden� sekcia .lib v a.out"
+ 
+-#: sunrpc/clnt_perr.c:110 sunrpc/clnt_perr.c:131
++#: sunrpc/clnt_perr.c:111 sunrpc/clnt_perr.c:132
+ #, c-format
+ msgid "; low version = %lu, high version = %lu"
+ msgstr "; ni��ia verzia = %lu, vy��ia verzia = %lu"
+ 
+-#: sunrpc/clnt_perr.c:117
++#: sunrpc/clnt_perr.c:118
+ msgid "; why = "
+ msgstr "; d�vod = "
+ 
+-#: locale/programs/charset.c:98
++#: locale/programs/charmap.c:999
+ #, c-format
+ msgid "<%s> and <%s> are illegal names for range"
+ msgstr "<%s> and <%s> s� nepr�pustn� n�zvy pre rozsah"
+ 
+-#: locale/programs/ld-ctype.c:342
++#: locale/programs/repertoire.c:448
++#, c-format
++msgid "<%s> and <%s> are invalid names for range"
++msgstr "<%s> a <%s> s� nepr�pustn� n�zvy pre rozsah"
++
++#: locale/programs/ld-ctype.c:565 locale/programs/ld-ctype.c:600
+ #, c-format
+ msgid "<SP> character must not be in class `%s'"
+ msgstr "<SP> znak nesmie by� v triede `%s'"
+ 
+-#: locale/programs/ld-ctype.c:330
++#: locale/programs/ld-ctype.c:553 locale/programs/ld-ctype.c:589
+ #, c-format
+ msgid "<SP> character not in class `%s'"
+ msgstr "<SP> znak nie je v triede `%s'"
+@@ -543,102 +1078,149 @@
+ #. TRANS The experienced user will know what is wrong.
+ #. TRANS @c This error code is a joke.  Its perror text is part of the joke.
+ #. TRANS @c Don't change it.
+-#: stdio-common/../sysdeps/gnu/errlist.c:603
++#: stdio-common/../sysdeps/gnu/errlist.c:622
+ msgid "?"
+ msgstr "?"
+ 
+-#: sysdeps/unix/sysv/linux/siglist.h:27
++#: sysdeps/generic/siglist.h:34
+ msgid "Aborted"
+ msgstr "Zru�en�"
+ 
+-#: nis/nis_print.c:318
++#: nis/nis_print.c:321
+ msgid "Access Rights : "
+ msgstr "Pr�stupov� pr�va : "
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:774
++#: stdio-common/../sysdeps/gnu/errlist.c:793
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:114
+ msgid "Accessing a corrupted shared library"
+ msgstr "Pr�stup k po�kodenej zdie�anej kni�nici"
+ 
+ #. TRANS The requested socket address is already in use.  @xref{Socket Addresses}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:366
++#: stdio-common/../sysdeps/gnu/errlist.c:367
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:155
+ msgid "Address already in use"
+ msgstr "Adresa je pou��van�"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:30
++#: posix/../sysdeps/posix/gai_strerror.c:31
+ msgid "Address family for hostname not supported"
+ msgstr "Trieda adries nie je podporovan� po��ta�om"
+ 
+ #. TRANS The address family specified for a socket is not supported; it is
+ #. TRANS inconsistent with the protocol being used on the socket.  @xref{Sockets}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:361
++#: stdio-common/../sysdeps/gnu/errlist.c:362
+ msgid "Address family not supported by protocol"
+ msgstr "Trieda adries nie je podporovan� protokolom"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:742
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:154
++msgid "Address family not supported by protocol family"
++msgstr "Trieda adries nie je podporovan� rodinou protokolov"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:761
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:98
+ msgid "Advertise error"
+ msgstr "Chyba pri zverejnen�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:39
+-#: sysdeps/unix/sysv/linux/siglist.h:33
++#: stdio-common/../sysdeps/unix/siglist.c:40 sysdeps/generic/siglist.h:40
+ msgid "Alarm clock"
+ msgstr "Bud�k"
+ 
++#: malloc/memusagestat.c:57
++msgid "Also draw graph for total memory consumption"
++msgstr "Vykresl� aj graf celkovej spotreby pam�ti"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:83
++msgid "Anode table overflow"
++msgstr "Prete�enie tabu�ky anode"
++
++#: intl/tst-gettext2.c:37
++msgid "Another string for testing."
++msgstr "In� re�azec pre testovanie."
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:37
++msgid "Arg list too long"
++msgstr "Pr�li� dlh� zoznam argumentov"
++
+ #. TRANS Argument list too long; used when the arguments passed to a new program
+ #. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a
+ #. TRANS File}) occupy too much memory space.  This condition never arises in the
+ #. TRANS GNU system.
+-#: stdio-common/../sysdeps/gnu/errlist.c:69
++#: stdio-common/../sysdeps/gnu/errlist.c:70
+ msgid "Argument list too long"
+ msgstr "Pr�li� dlh� zoznam argumentov"
+ 
+-#: nis/nis_error.c:65
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:63
++msgid "Argument out of domain"
++msgstr "Argument mimo dom�ny"
++
++#: nis/nis_error.c:66
+ msgid "Attempt to remove a non-empty table"
+ msgstr "Pokus o odstr�nenie nepr�zdnej tabu�ky"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:782
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:116
++msgid "Attempting to link in more shared libraries than system limit"
++msgstr "Pokus o pou�itie viac zdie�an�ch kni�n�c, ako je syst�mov� limit"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:801
+ msgid "Attempting to link in too many shared libraries"
+ msgstr "Pokus o pou�itie prive�a zdie�an�ch kni�n�c"
+ 
+-#: sunrpc/clnt_perr.c:273
++#: sunrpc/clnt_perr.c:329
+ msgid "Authentication OK"
+ msgstr "Overenie pr�v �spe�n�"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:561
++#: stdio-common/../sysdeps/gnu/errlist.c:562
+ msgid "Authentication error"
+ msgstr "Overenie pr�v ne�spe�n�"
+ 
+-#: nis/nis_print.c:105
++#: nis/nis_print.c:106
+ msgid "BOGUS OBJECT\n"
+ msgstr "POCHYBN� OBJEKT\n"
+ 
+ #. TRANS Bad address; an invalid pointer was detected.
+ #. TRANS In the GNU system, this error never happens; you get a signal instead.
+-#: stdio-common/../sysdeps/gnu/errlist.c:114
++#: stdio-common/../sysdeps/gnu/errlist.c:115
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:44
+ msgid "Bad address"
+ msgstr "Chybn� adresa"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:80
++msgid "Bad exchange descriptor"
++msgstr "Chybn� exchange deskriptor"
++
+ #. TRANS Bad file descriptor; for example, I/O on a descriptor that has been
+ #. TRANS closed or reading from a descriptor open only for writing (or vice
+ #. TRANS versa).
+-#: stdio-common/../sysdeps/gnu/errlist.c:82
++#: stdio-common/../sysdeps/gnu/errlist.c:83
+ msgid "Bad file descriptor"
+ msgstr "Chybn� deskriptor s�boru"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:730
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:39
++msgid "Bad file number"
++msgstr "Chybn� ��slo s�boru"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:749
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:87
+ msgid "Bad font file format"
+ msgstr "Chybn� form�t s�boru rezov p�sma"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:622
++#: stdio-common/../sysdeps/gnu/errlist.c:641
+ msgid "Bad message"
+ msgstr "Chybn� spr�va"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:37
+-#: sysdeps/unix/sysv/linux/siglist.h:56
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:84
++msgid "Bad request code"
++msgstr "Nepr�pustn� k�d �iadosti"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:81
++msgid "Bad request descriptor"
++msgstr "Nepr�pustn� deskriptor �iadosti"
++
++#: stdio-common/../sysdeps/unix/siglist.c:38 sysdeps/generic/siglist.h:63
+ msgid "Bad system call"
+ msgstr "Chybn� volanie syst�mu"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:32
++#: posix/../sysdeps/posix/gai_strerror.c:33
+ msgid "Bad value for ai_flags"
+ msgstr "Chybn� hodnota ai_flags"
+ 
+@@ -646,18 +1228,19 @@
+ msgid "Be strictly POSIX conform"
+ msgstr "Presn� s�lad s POSIX"
+ 
+-#: nis/nis_print.c:301
++#: nis/nis_print.c:302
+ msgid "Binary data\n"
+ msgstr "Bin�rne �daje\n"
+ 
+ #. TRANS A file that isn't a block special file was given in a situation that
+ #. TRANS requires one.  For example, trying to mount an ordinary file as a file
+ #. TRANS system in Unix gives this error.
+-#: stdio-common/../sysdeps/gnu/errlist.c:121
++#: stdio-common/../sysdeps/gnu/errlist.c:122
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:45
+ msgid "Block device required"
+ msgstr "Vy�adovan� blokov� zariadenie"
+ 
+-#: sunrpc/pmap_rmt.c:347
++#: sunrpc/pmap_rmt.c:348
+ msgid "Broadcast poll problem"
+ msgstr "Probl�m pri volan� poll pre v�eobecn� vysielanie"
+ 
+@@ -666,135 +1249,223 @@
+ #. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
+ #. TRANS or blocked.  Thus, your program will never actually see @code{EPIPE}
+ #. TRANS unless it has handled or blocked @code{SIGPIPE}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:234
+-#: stdio-common/../sysdeps/unix/siglist.c:38
+-#: sysdeps/unix/sysv/linux/siglist.h:32
++#: stdio-common/../sysdeps/gnu/errlist.c:235
++#: stdio-common/../sysdeps/unix/siglist.c:39
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:62
++#: sysdeps/generic/siglist.h:39
+ msgid "Broken pipe"
+ msgstr "Preru�en� r�ra"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:35
+-#: sysdeps/unix/sysv/linux/siglist.h:30
++#: stdio-common/../sysdeps/unix/siglist.c:36 sysdeps/generic/siglist.h:37
+ msgid "Bus error"
+ msgstr "Chyba na zbernici"
+ 
+-#: nis/nis_print.c:45
++#: nis/nis_print.c:46
+ msgid "CDS"
+ msgstr "CDS"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:49
+-#: sysdeps/unix/sysv/linux/siglist.h:43
++#: stdio-common/../sysdeps/unix/siglist.c:50 sysdeps/generic/siglist.h:50
+ msgid "CPU time limit exceeded"
+ msgstr "Prekro�en� �asov� limit pre procesor"
+ 
+-#: nis/nis_error.c:32
++#: nis/nis_error.c:33
+ msgid "Cache expired"
+ msgstr "�ivotnos� cache vypr�ala"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:770
++#: stdio-common/../sysdeps/gnu/errlist.c:789
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:113
+ msgid "Can not access a needed shared library"
+ msgstr "Pr�stup k potrebnej zdie�anej kni�nici nie je mo�n�"
+ 
+-#: nis/ypclnt.c:769
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:117
++msgid "Can not exec a shared library directly"
++msgstr "Nie je mo�n� priamo spusti� zdie�an� kni�nicu"
++
++#: nis/ypclnt.c:792
+ msgid "Can't bind to server which serves this domain"
+ msgstr "Pripojenie k serveru obsluhuj�cemu t�to dom�nu nie je mo�n�"
+ 
+-#: nis/ypclnt.c:781
++#: elf/ldconfig.c:934
++msgid "Can't chdir to /"
++msgstr "Nie je mo�n� zmeni� adres�r na /"
++
++#: nis/ypclnt.c:804
+ msgid "Can't communicate with portmapper"
+ msgstr "Komunik�cia s portmapperom nie je mo�n�"
+ 
+-#: nis/ypclnt.c:783
++#: nis/ypclnt.c:806
+ msgid "Can't communicate with ypbind"
+ msgstr "Komunik�cia s ypbind nie je mo�n�"
+ 
+-#: nis/ypclnt.c:785
++#: nis/ypclnt.c:808
+ msgid "Can't communicate with ypserv"
+ msgstr "Komunik�cia s ypserv nie je mo�n�"
+ 
++#: elf/cache.c:359
++#, c-format
++msgid "Can't create temporary cache file %s"
++msgstr "Nie je mo�n� vytvori� do�asn� cache s�bor %s"
++
++#: elf/ldconfig.c:502
++#, c-format
++msgid "Can't find %s"
++msgstr "Nie je mo�n� n�js� %s"
++
++#: elf/ldconfig.c:440
++#, c-format
++msgid "Can't link %s to %s"
++msgstr "Nie je mo�n� vytvori� odkaz %s na %s"
++
++#: elf/ldconfig.c:518 elf/ldconfig.c:672
++#, c-format
++msgid "Can't lstat %s"
++msgstr "Zlyhal lstat %s"
++
++#: elf/cache.c:108 elf/ldconfig.c:955
++#, c-format
++msgid "Can't open cache file %s\n"
++msgstr "Nie je mo�n� otvori� cache s�bor %s\n"
++
++#: elf/ldconfig.c:976
++#, c-format
++msgid "Can't open cache file directory %s\n"
++msgstr "Nie je mo�n� otvori� adres�r cache s�boru %s\n"
++
++#: elf/ldconfig.c:865
++#, c-format
++msgid "Can't open configuration file %s"
++msgstr "Nie je mo�n� otvori� konfigura�n� s�bor %s"
++
++#: elf/ldconfig.c:621
++#, c-format
++msgid "Can't open directory %s"
++msgstr "Nie je mo�n� otvori� adres�r %s"
++
++#: elf/cache.c:353
++#, c-format
++msgid "Can't remove old temporary cache file %s"
++msgstr "Nie je mo�n� zmaza� do�asn� cache s�bor %s"
++
++#: elf/ldconfig.c:405
++#, c-format
++msgid "Can't stat %s\n"
++msgstr "Zlyhal stat %s\n"
++
++#: elf/ldconfig.c:434
++#, c-format
++msgid "Can't unlink %s"
++msgstr "Nie je mo�n� odstr�ni� %s"
++
+ #. TRANS No memory available.  The system cannot allocate more virtual memory
+ #. TRANS because its capacity is full.
+-#: stdio-common/../sysdeps/gnu/errlist.c:103
++#: stdio-common/../sysdeps/gnu/errlist.c:104
+ msgid "Cannot allocate memory"
+ msgstr "Nie je mo�n� prideli� pam�"
+ 
+ #. TRANS The requested socket address is not available; for example, you tried
+ #. TRANS to give a socket a name that doesn't match the local host name.
+ #. TRANS @xref{Socket Addresses}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:373
++#: stdio-common/../sysdeps/gnu/errlist.c:374
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:156
+ msgid "Cannot assign requested address"
+ msgstr "Priradenie po�adovanej adresy nie je mo�n�"
+ 
+-#: sunrpc/pmap_rmt.c:264
++#: sunrpc/pmap_rmt.c:265
+ msgid "Cannot create socket for broadcast rpc"
+ msgstr "Nie je mo�n� vytvori� z�suvku pre broadcast rpc"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:786
++#: stdio-common/../sysdeps/gnu/errlist.c:805
+ msgid "Cannot exec a shared library directly"
+ msgstr "Nie je mo�n� priamo spusti� zdie�an� kni�nicu"
+ 
+-#: sunrpc/rpc_main.c:1406
++#: elf/readlib.c:98
++#, c-format
++msgid "Cannot fstat file %s.\n"
++msgstr "Nie je mo�n� vykona� fstat() s�boru %s.\n"
++
++#: sunrpc/rpc_main.c:1415
+ msgid "Cannot have more than one file generation flag!\n"
+ msgstr "Nie je mo�n� pou�i� viac ako jeden pr�znak tvorby s�boru!\n"
+ 
+-#: sunrpc/pmap_rmt.c:360
++#: elf/readlib.c:117
++#, c-format
++msgid "Cannot mmap file %s.\n"
++msgstr "Nie je mo�n� mmap-ova� s�bor %s.\n"
++
++#: sunrpc/pmap_rmt.c:361
+ msgid "Cannot receive reply to broadcast"
+ msgstr "Nie je mo�n� prija� odpove� na broadcast"
+ 
+-#: sunrpc/pmap_clnt.c:74
++#: sunrpc/pmap_clnt.c:136
+ msgid "Cannot register service"
+ msgstr "Nie je mo�n� zaregistrova� slu�bu"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:173
++msgid "Cannot send after socket shutdown"
++msgstr "Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu"
++
+ #. TRANS The socket has already been shut down.
+-#: stdio-common/../sysdeps/gnu/errlist.c:434
++#: stdio-common/../sysdeps/gnu/errlist.c:435
+ msgid "Cannot send after transport endpoint shutdown"
+ msgstr "Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu"
+ 
+-#: sunrpc/pmap_rmt.c:322
++#: sunrpc/pmap_rmt.c:323
+ msgid "Cannot send broadcast packet"
+ msgstr "Nie je mo�n� vysla� broadcast bal�k"
+ 
+-#: sunrpc/pmap_rmt.c:271
++#: sunrpc/pmap_rmt.c:272
+ msgid "Cannot set socket option SO_BROADCAST"
+ msgstr "Nie je mo�n� nastavi� pre socket vo�bu SO_BROADCAST"
+ 
+-#: sunrpc/rpc_main.c:1193
++#: sunrpc/rpc_main.c:1195
+ msgid "Cannot specify more than one input file!\n"
+ msgstr "Nie je mo�n� zada� viac ako jeden vstupn� s�bor!\n"
+ 
+-#: sunrpc/rpc_main.c:1363
++#: sunrpc/rpc_main.c:1372
+ msgid "Cannot use netid flag with inetd flag!\n"
+ msgstr "Pr�znaky netid a inetd nie je mo�n� pou�i� s��asne!\n"
+ 
+-#: sunrpc/rpc_main.c:1375
++#: sunrpc/rpc_main.c:1384
+ msgid "Cannot use netid flag without TIRPC!\n"
+ msgstr "Nie je mo�n� pou�i� pr�znak netid bez TIRPC!\n"
+ 
+-#: sunrpc/rpc_main.c:1382
++#: sunrpc/rpc_main.c:1391
+ msgid "Cannot use table flags with newstyle!\n"
+ msgstr "Pri pou�it� nov�ho �t�lu nie je mo�n� pou�i� pr�znaky tabu�ky!\n"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:670
++#: elf/ldconfig.c:131
++msgid "Change to and use ROOT as root directory"
++msgstr "Zmeni� adres�r na ROOT a pou�i� ho ako kore�ov� adres�r"
++
++#: elf/cache.c:390
++#, c-format
++msgid "Changing access rights of %s to 0644 failed"
++msgstr "Zmena pr�stupov�ch pr�v %s na 0644 zlyhala"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:689
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:67
+ msgid "Channel number out of range"
+ msgstr "��slo kan�lu mimo povolen�ho rozsahu"
+ 
+-#: nis/nis_print.c:264
++#: nis/nis_print.c:265
+ #, c-format
+ msgid "Character Separator : %c\n"
+ msgstr "Odde�ova� znakov       : %c\n"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:45
+-#: sysdeps/unix/sysv/linux/siglist.h:39
++#: stdio-common/../sysdeps/unix/siglist.c:46 sysdeps/generic/siglist.h:46
+ msgid "Child exited"
+ msgstr "Detsk� proces skon�il"
+ 
+-#: sunrpc/clnt_perr.c:283
++#: sunrpc/clnt_perr.c:348
+ msgid "Client credential too weak"
+ msgstr "Opr�vnenia klienta s� neposta�uj�ce"
+ 
+-#: nis/nis_print.c:266
++#: nis/nis_print.c:267
+ msgid "Columns             :\n"
+ msgstr "St�pce                 :\n"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:750
++#: stdio-common/../sysdeps/gnu/errlist.c:769
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:100
+ msgid "Communication error on send"
+ msgstr "Chyba komunik�cie pri vysielan�"
+ 
+@@ -803,54 +1474,48 @@
+ msgstr "Kompil�cia �pecifik�cie n�rodn�ho prostredia"
+ 
+ #. TRANS Go home and have a glass of warm, dairy-fresh milk.
+-#: stdio-common/../sysdeps/gnu/errlist.c:613
++#: stdio-common/../sysdeps/gnu/errlist.c:632
+ msgid "Computer bought the farm"
+ msgstr "Po��ta� k�pil farmu"
+ 
+-#: locale/programs/ld-ctype.c:1253
+-msgid "Computing table size for character classes might take a while..."
+-msgstr "V�po�et ve�kosti tabu�ky pre triedy znakov (m��e chv��u trva�)..."
+-
+-#: locale/programs/ld-collate.c:336
+-msgid "Computing table size for collation information might take a while..."
+-msgstr "V�po�et ve�kosti tabu�ky pre inform�cie o trieden� (m��e chv��u trva�)..."
++#: elf/ldconfig.c:141
++msgid "Configure Dynamic Linker Run Time Bindings."
++msgstr "Konfigur�cia runtime v�zieb dynamick�ho linkera."
+ 
+ #. TRANS A remote host refused to allow the network connection (typically because
+ #. TRANS it is not running the requested service).
+-#: stdio-common/../sysdeps/gnu/errlist.c:451
++#: stdio-common/../sysdeps/gnu/errlist.c:452
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:176
+ msgid "Connection refused"
+ msgstr "Spojenie odmietnut�"
+ 
+ #. TRANS A network connection was closed for reasons outside the control of the
+ #. TRANS local host, such as by the remote machine rebooting or an unrecoverable
+ #. TRANS protocol violation.
+-#: stdio-common/../sysdeps/gnu/errlist.c:401
++#: stdio-common/../sysdeps/gnu/errlist.c:402
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:161
+ msgid "Connection reset by peer"
+ msgstr "Spojenie zru�en� druhou stranou"
+ 
+ #. TRANS A socket operation with a specified timeout received no response during
+ #. TRANS the timeout period.
+-#: stdio-common/../sysdeps/gnu/errlist.c:445
++#: stdio-common/../sysdeps/gnu/errlist.c:446
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:175
+ msgid "Connection timed out"
+ msgstr "�asov� limit pre spojenie vypr�al"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:44
+-#: sysdeps/unix/sysv/linux/siglist.h:38
++#: stdio-common/../sysdeps/unix/siglist.c:45 sysdeps/generic/siglist.h:45
+ msgid "Continued"
+ msgstr "Pokra�ovanie"
+ 
+-#: iconv/iconv_prog.c:66
++#: iconv/iconv_prog.c:69
+ msgid "Convert encoding of given files from one encoding to another."
+ msgstr "Konverzia k�dovania zadan�ch s�borov na in�."
+ 
+-#: db2/makedb.c:58
+-msgid "Convert key to lower case"
+-msgstr "Zmeni� k��� na mal� p�smen�"
+-
+-#: catgets/gencat.c:236 db2/makedb.c:242 elf/sprof.c:359
+-#: iconv/iconv_prog.c:294 locale/programs/locale.c:267
+-#: locale/programs/localedef.c:403 nscd/nscd.c:223 nss/getent.c:65
+-#: posix/getconf.c:624
++#: catgets/gencat.c:246 elf/ldconfig.c:264 elf/sprof.c:355
++#: iconv/iconv_prog.c:351 locale/programs/locale.c:269
++#: locale/programs/localedef.c:311 nscd/nscd.c:287 nscd/nscd_nischeck.c:90
++#: nss/getent.c:63 posix/getconf.c:751
+ #, c-format
+ msgid ""
+ "Copyright (C) %s Free Software Foundation, Inc.\n"
+@@ -861,167 +1526,353 @@
+ "Toto je vo�ne ��rite�n� software; pre podmienky kop�rovania pozri\n"
+ "zdrojov� k�d.Na software nie je poskytovan� �IADNA z�ruka.\n"
+ 
+-#: nscd/nscd_conf.c:167
++#: nscd/nscd_conf.c:166
+ #, c-format
+ msgid "Could not create log file \"%s\""
+ msgstr "Nie je mo�n� vytvori� �urn�lov� s�bor \"%s\""
+ 
+-#: catgets/gencat.c:107
++#: catgets/gencat.c:112
+ msgid "Create C header file NAME containing symbol definitions"
+ msgstr "Vytvori� C hlavi�kov� s�bor N�ZOV obsahuj�ci defin�cie symbolov"
+ 
+-#: locale/programs/localedef.c:103
++#: locale/programs/localedef.c:102
++msgid "Create old-style tables"
++msgstr "Vytvori� tabu�ky na star� sp�sob"
++
++#: locale/programs/localedef.c:101
+ msgid "Create output even if warning messages were issued"
+ msgstr "Vytvori� v�stupn� s�bor aj pri v�skyte varovan�"
+ 
+-#: db2/makedb.c:68
+-msgid "Create simple DB database from textual input."
+-msgstr "Vytvorenie jednoduchej DB datab�zy z textov�ho vstupu."
+-
+-#: nis/nis_print.c:322
++#: nis/nis_print.c:326
+ #, c-format
+ msgid "Creation Time : %s"
+ msgstr "�as vytvorenia   : %s"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:89
+-#: nis/nss_nisplus/nisplus-publickey.c:159
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:48
++msgid "Cross-device link"
++msgstr "Odkaz medzi zariadeniami"
++
++#: malloc/memusagestat.c:67
++msgid "DATAFILE [OUTFILE]"
++msgstr "D�TOV�_S�BOR [V�STUPN�_S�BOR]"
++
++#: nis/nss_nisplus/nisplus-publickey.c:96
++#: nis/nss_nisplus/nisplus-publickey.c:172
+ #, c-format
+ msgid "DES entry for netname %s not unique\n"
+ msgstr "DES z�znam pre sie�ov� n�zov %s nie je jednozna�n�\n"
+ 
+-#: nis/nis_print.c:111
++#: nis/nis_print.c:112
+ msgid "DIRECTORY\n"
+ msgstr "ADRES�R\n"
+ 
+-#: nis/nis_print.c:41
++#: nis/nis_print.c:42
+ msgid "DNANS"
+ msgstr "DNANS"
+ 
+-#: nis/nis_print.c:37
++#: nis/nis_print.c:38
+ msgid "DNS"
+ msgstr "DNS"
+ 
+-#: nis/nis_error.c:51
++#: elf/dl-open.c:189
++msgid "DST not allowed in SUID/SGID programs"
++msgstr "DST nie je pre SUID/SGID programy povolen�"
++
++#: elf/dl-error.c:71
++msgid "DYNAMIC LINKER BUG!!!"
++msgstr "CHYBA V DYNAMICKOM LINKERI!!!"
++
++#: nis/nis_error.c:52
+ msgid "Database for table does not exist"
+ msgstr "Datab�za pre tabu�ku neexistuje"
+ 
+-#: nis/ypclnt.c:795
++#: nis/ypclnt.c:818
+ msgid "Database is busy"
+ msgstr "Datab�za je pou��van�"
+ 
+-#: nis/nis_print.c:225
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:75
++msgid "Deadlock situation detected/avoided"
++msgstr "Bol detekovan� a znemo�nen� deadlock"
++
++#: nis/nis_print.c:226
+ msgid "Default Access rights :\n"
+ msgstr "Implicitn� pr�st. pr�va  :\n"
+ 
+ #. TRANS No default destination address was set for the socket.  You get this
+ #. TRANS error when you try to transmit data over a connectionless socket,
+ #. TRANS without first specifying a destination for the data with @code{connect}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:429
++#: stdio-common/../sysdeps/gnu/errlist.c:430
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:126
+ msgid "Destination address required"
+ msgstr "Je potrebn� zada� cie�ov� hodnotu"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:650
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:46
++msgid "Device busy"
++msgstr "Zariadenie je pou��van�"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:669
+ msgid "Device not a stream"
+ msgstr "Zariadenie nie je pr�d"
+ 
+-#. TRANS No such device or address.  The system tried to use the device
+-#. TRANS represented by a file you specified, and it couldn't find the device.
+-#. TRANS This can mean that the device file was installed incorrectly, or that
+-#. TRANS the physical device is missing or not correctly attached to the
+-#. TRANS computer.
+-#: stdio-common/../sysdeps/gnu/errlist.c:61
+-msgid "Device not configured"
+-msgstr "Zariadenie nie je nakonfigurovan�"
+-
+ #. TRANS Resource busy; a system resource that can't be shared is already in use.
+ #. TRANS For example, if you try to delete a file that is the root of a currently
+ #. TRANS mounted filesystem, you get this error.
+-#: stdio-common/../sysdeps/gnu/errlist.c:128
++#: stdio-common/../sysdeps/gnu/errlist.c:129
+ msgid "Device or resource busy"
+ msgstr "Zariadenie alebo in� zdroj je pou��van�"
+ 
+-#: nis/nis_print.c:179
++#: nis/nis_print.c:180
+ #, c-format
+ msgid "Diffie-Hellmann (%d bits)\n"
+ msgstr "Diffie-Hellmann (%d bitov)\n"
+ 
+-#: nis/nis_print.c:315
++#: nis/nis_print.c:318
+ #, c-format
+ msgid "Directory     : %s\n"
+ msgstr "Adres�r          : %s\n"
+ 
+ #. TRANS Directory not empty, where an empty directory was expected.  Typically,
+ #. TRANS this error occurs when you are trying to delete a directory.
+-#: stdio-common/../sysdeps/gnu/errlist.c:480
++#: stdio-common/../sysdeps/gnu/errlist.c:481
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:123
+ msgid "Directory not empty"
+ msgstr "Adres�r nie je pr�zdny"
+ 
+-#. TRANS The user's disk quota was exceeded.
+-#: stdio-common/../sysdeps/gnu/errlist.c:498
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:79
+ msgid "Disc quota exceeded"
+ msgstr "Diskov� kv�ta prekro�en�"
+ 
+-#: nscd/nscd.c:80
++#. TRANS The user's disk quota was exceeded.
++#: stdio-common/../sysdeps/gnu/errlist.c:499
++msgid "Disk quota exceeded"
++msgstr "Diskov� kv�ta prekro�en�"
++
++#: nscd/nscd.c:86
+ msgid "Do not fork and display messages on the current tty"
+ msgstr "Nesp���a� samostatn� proces a zobrazova� spr�vy na aktu�lnom termin�li"
+ 
+-#: db2/makedb.c:61
+-msgid "Do not print messages while building database"
+-msgstr "Po�as tvorby datab�zy nevypisova� spr�vy"
+-
+-#: catgets/gencat.c:109
++#: catgets/gencat.c:114
+ msgid "Do not use existing catalog, force new output file"
+ msgstr "Nepou��va� existuj�ci katal�g, vn�ti� nov� v�stupn� s�bor"
+ 
+-#: nis/ypclnt.c:841
++#: nis/ypclnt.c:864
+ msgid "Domain not bound"
+ msgstr "Dom�na nie je pripojen�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:32
+-#: sysdeps/unix/sysv/linux/siglist.h:53
++#: elf/ldconfig.c:129
++msgid "Don't build cache"
++msgstr "Nevytvori� cache"
++
++#: elf/ldconfig.c:130
++msgid "Don't generate links"
++msgstr "Negenerova� odkazy"
++
++#: debug/pcprofiledump.c:56
++msgid "Dump information generated by PC profiling."
++msgstr "Vyp�sa� inform�ciu z�skan� profilovan�m PC."
++
++#: elf/dl-load.c:1290
++msgid "ELF file ABI version invalid"
++msgstr "Neplatn� verzia ABI ELF s�boru"
++
++#: elf/dl-load.c:1287
++msgid "ELF file OS ABI invalid"
++msgstr "Neplatn� OS ABI ELF s�boru"
++
++#: elf/dl-load.c:1296
++msgid "ELF file version does not match current one"
++msgstr "Verzia s�boru ELF sa nezhoduje s aktu�lnou"
++
++#: elf/dl-load.c:1283
++msgid "ELF file version ident does not match current one"
++msgstr "Identifik�cia verzie ELF s�boru sa nezhoduje s aktu�lnou"
++
++#: elf/dl-load.c:1307
++msgid "ELF file's phentsize not the expected size"
++msgstr "phentsize ELF s�boru nie je o�ak�van�"
++
++#: elf/dl-load.c:876
++msgid "ELF load command address/offset not properly aligned"
++msgstr "ELF zav�dzacia adresa/posunutie nie je spr�vne zarovnan�"
++
++#: elf/dl-load.c:873
++msgid "ELF load command alignment not page-aligned"
++msgstr "ELF zarovnanie pr�kazu nie je zarovnan� na str�nku"
++
++#: stdio-common/../sysdeps/unix/siglist.c:33 sysdeps/generic/siglist.h:60
+ msgid "EMT trap"
+ msgstr "EMT preru�enie"
+ 
+-#: nis/nis_print.c:120
++#: nis/nis_print.c:121
+ msgid "ENTRY\n"
+ msgstr "Z�ZNAM\n"
+ 
+-#: nis/nis_print.c:299
++#: nis/nis_print.c:300
+ msgid "Encrypted data\n"
+ msgstr "�ifrovan� �daje\n"
+ 
+-#: nis/nis_error.c:52
+-msgid "Entry/Table type mismatch"
++#: nis/nis_error.c:53
++msgid "Entry/table type mismatch"
+ msgstr "Nes�lad z�znamu s tabu�kou"
+ 
+-#: nis/nis_error.c:56
++#: nss/getent.c:127 nss/getent.c:292
++#, c-format
++msgid "Enumeration not supported on %s\n"
++msgstr "Enumer�cia %s nie je podporovan�\n"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:30
++msgid "Error 0"
++msgstr "Chyba 0"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:130
++msgid "Error 100"
++msgstr "Chyba 100"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:131
++msgid "Error 101"
++msgstr "Chyba 101"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:132
++msgid "Error 102"
++msgstr "Chyba 102"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:133
++msgid "Error 103"
++msgstr "Chyba 103"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:134
++msgid "Error 104"
++msgstr "Chyba 104"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:135
++msgid "Error 105"
++msgstr "Chyba 105"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:136
++msgid "Error 106"
++msgstr "Chyba 106"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:137
++msgid "Error 107"
++msgstr "Chyba 107"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:138
++msgid "Error 108"
++msgstr "Chyba 108"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:139
++msgid "Error 109"
++msgstr "Chyba 109"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:140
++msgid "Error 110"
++msgstr "Chyba 110"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:141
++msgid "Error 111"
++msgstr "Chyba 111"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:142
++msgid "Error 112"
++msgstr "Chyba 112"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:143
++msgid "Error 113"
++msgstr "Chyba 113"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:144
++msgid "Error 114"
++msgstr "Chyba 114"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:145
++msgid "Error 115"
++msgstr "Chyba 115"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:146
++msgid "Error 116"
++msgstr "Chyba 116"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:147
++msgid "Error 117"
++msgstr "Chyba 117"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:148
++msgid "Error 118"
++msgstr "Chyba 118"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:149
++msgid "Error 119"
++msgstr "Chyba 119"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:166
++msgid "Error 136"
++msgstr "Chybe 136"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:172
++msgid "Error 142"
++msgstr "Chyba 142"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:88
++msgid "Error 58"
++msgstr "Chyba 58"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:89
++msgid "Error 59"
++msgstr "Chyba 59"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:102
++msgid "Error 72"
++msgstr "Chyba 72"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:103
++msgid "Error 73"
++msgstr "Chyba 73"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:105
++msgid "Error 75"
++msgstr "Chyba 75"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:106
++msgid "Error 76"
++msgstr "Chyba 76"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:121
++msgid "Error 91"
++msgstr "Chyba 91"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:122
++msgid "Error 92"
++msgstr "Chyba 92"
++
++#: nis/nis_error.c:57
+ msgid "Error in RPC subsystem"
+ msgstr "Chyba v RPC subsyst�me"
+ 
+-#: nis/nis_error.c:66
++#: nis/nis_error.c:67
+ msgid "Error in accessing NIS+ cold start file.  Is NIS+ installed?"
+ msgstr "Chyba pri pr�stupe NIS+ s�boru studen�ho �tartu. Je NIS+ nain�talovan�?"
+ 
+-#: string/../sysdeps/mach/_strerror.c:56
+-#: sysdeps/mach/hurd/mips/dl-machine.c:67
++#: string/../sysdeps/mach/_strerror.c:58
++#: sysdeps/mach/hurd/mips/dl-machine.c:68
+ msgid "Error in unknown error system: "
+ msgstr "Chyba v nezn�mom chybovom syst�me: "
+ 
+-#: nis/nis_error.c:59
++#: nis/nis_error.c:60
+ msgid "Error while talking to callback proc"
+ msgstr "Chyba po�as komunik�cie s proced�rou sp�tn�ho volania"
+ 
+-#: inet/ruserpass.c:161
++#: inet/ruserpass.c:181
+ msgid "Error: .netrc file is readable by others."
+ msgstr "Chyba: s�bor .netrc je �itate�n� pre ostatn�ch."
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:710
++#: stdio-common/../sysdeps/gnu/errlist.c:729
+ msgid "Exchange full"
+ msgstr "Stredisko pln�"
+ 
+ #. TRANS Invalid executable file format.  This condition is detected by the
+ #. TRANS @code{exec} functions; see @ref{Executing a File}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:75
++#: stdio-common/../sysdeps/gnu/errlist.c:76
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:38
+ msgid "Exec format error"
+ msgstr "Chybn� form�t spustite�n�ho s�boru"
+ 
+@@ -1029,75 +1880,113 @@
+ msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
+ msgstr "FAT�LNA CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'"
+ 
+-#: locale/programs/localedef.c:99
++#: locale/programs/localedef.c:97
+ msgid "FILE contains mapping from symbolic names to UCS4 values"
+ msgstr "S�BOR obsahuje mapovanie symbolick�ch n�zvov na UCS4 hodnoty"
+ 
+-#: sunrpc/clnt_perr.c:287
++#: sunrpc/clnt_perr.c:356
+ msgid "Failed (unspecified error)"
+ msgstr "Zlyhalo (ne�pecifikovan� chyba)"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:762
++#: nscd/nscd.c:400
++#, c-format
++msgid "Failed to look up user '%s' to run server as"
++msgstr "Nepodarilo sa vyh�ada� pou��vate�a '%s', pod ktor�m m� server be�a�"
++
++#: elf/readlib.c:108
++#, c-format
++msgid "File %s is too small, not checked."
++msgstr "S�bor %s je pr�li� kr�tky, neskontrolovan�."
++
++#: stdio-common/../sysdeps/gnu/errlist.c:781
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:111
+ msgid "File descriptor in bad state"
+ msgstr "Deskriptor s�boru v chybnom stave"
+ 
+ #. TRANS File exists; an existing file was specified in a context where it only
+ #. TRANS makes sense to specify a new file.
+-#: stdio-common/../sysdeps/gnu/errlist.c:134
++#: stdio-common/../sysdeps/gnu/errlist.c:135
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:47
+ msgid "File exists"
+ msgstr "S�bor existuje"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:726
++#: elf/cache.c:124 elf/cache.c:134
++msgid "File is not a cache file.\n"
++msgstr "S�bor nie je cache s�borom.\n"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:86
++msgid "File locking deadlock"
++msgstr "Vz�jomn� zablokovanie pri zamykan� s�boru"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:745
+ msgid "File locking deadlock error"
+ msgstr "Vz�jomn� zablokovanie pri zamykan� s�boru"
+ 
+ #. TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for
+ #. TRANS Files}) or host name too long (in @code{gethostname} or
+ #. TRANS @code{sethostname}; @pxref{Host Identification}).
+-#: stdio-common/../sysdeps/gnu/errlist.c:464
++#: stdio-common/../sysdeps/gnu/errlist.c:465
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:108
+ msgid "File name too long"
+ msgstr "Meno s�boru pr�li� dlh�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:50
+-#: sysdeps/unix/sysv/linux/siglist.h:44
++#: stdio-common/../sysdeps/unix/siglist.c:51 sysdeps/generic/siglist.h:51
+ msgid "File size limit exceeded"
+ msgstr "Prekro�en� limit d�ky s�boru"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:53
++msgid "File table overflow"
++msgstr "Prete�enie tabu�ky s�borov"
++
+ #. TRANS File too big; the size of a file would be larger than allowed by the system.
+-#: stdio-common/../sysdeps/gnu/errlist.c:202
++#: stdio-common/../sysdeps/gnu/errlist.c:203
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:57
+ msgid "File too large"
+ msgstr "S�bor je pr�li� ve�k�"
+ 
+-#: nis/nis_error.c:37
+-msgid "First/Next chain broken"
+-msgstr "Chyba zre�azenia prv�/�al��"
++#: intl/tst-gettext2.c:36
++msgid "First string for testing."
++msgstr "Prv� testovac� re�azec."
++
++#: nis/nis_error.c:38
++msgid "First/next chain broken"
++msgstr "Preru�en� zre�azenie prv�/�al��"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:33
+-#: sysdeps/unix/sysv/linux/siglist.h:28
++#: stdio-common/../sysdeps/unix/siglist.c:34 sysdeps/generic/siglist.h:35
+ msgid "Floating point exception"
+ msgstr "V�nimka pohyblivej r�dovej �iarky"
+ 
+-#: nis/nis_error.c:67
++#: elf/ldconfig.c:136
++msgid "Format to use: new, old or compat (default)"
++msgstr "Pou�i� form�t: nov� (new), star� (old) alebo kompatibiln� (compat - prednastaven�)"
++
++#: nis/nis_error.c:68
+ msgid "Full resync required for directory"
+ msgstr "Adres�r vy�aduje �pln� resynchroniz�ciu"
+ 
+-#. TRANS Function not implemented.  Some functions have commands or options defined
+-#. TRANS that might not be supported in all implementations, and this is the kind
+-#. TRANS of error you get if you request them and they are not supported.
+-#: stdio-common/../sysdeps/gnu/errlist.c:573
++#. TRANS Function not implemented.  This indicates that the function called is
++#. TRANS not implemented at all, either in the C library itself or in the
++#. TRANS operating system.  When you get this error, you can be sure that this
++#. TRANS particular function will always fail with @code{ENOSYS} unless you
++#. TRANS install a new version of the C library or the operating system.
++#: stdio-common/../sysdeps/gnu/errlist.c:576
+ msgid "Function not implemented"
+ msgstr "Funkcia nie je implementovan�"
+ 
+-#: nis/nis_print.c:114
++#: nis/nis_print.c:115
+ msgid "GROUP\n"
+ msgstr "SKUPINA\n"
+ 
+-#: argp/argp-help.c:231
++#: argp/argp-help.c:230
+ #, c-format
+ msgid "Garbage in ARGP_HELP_FMT: %s"
+ msgstr "Nezmysly v ARGP_HELP_FMT: %s"
+ 
+-#: catgets/gencat.c:115
++#: malloc/memusagestat.c:64
++msgid "Generate graphic from memory profiling data"
++msgstr "Generova� graf z �dajov profilu pam�ti"
++
++#: catgets/gencat.c:120
+ msgid ""
+ "Generate message catalog.\\vIf INPUT-FILE is -, input is read from standard input.  If OUTPUT-FILE\n"
+ "is -, output is written to standard output.\n"
+@@ -1105,123 +1994,134 @@
+ "Tvorba katal�gu spr�v.\\vAk je VSTUPN�_S�BOR -, vstup je na��tan� zo �tandardn�ho vstupu. Ak je\n"
+ "V�STUPN�_S�BOR -, v�stup je zap�san� na �tandardn� v�stup.\n"
+ 
+-#: nis/nis_error.c:36
++#: malloc/memusagestat.c:55
++msgid "Generate output linear to time (default is linear to number of function calls)"
++msgstr "Generova� v�stup line�rny s �asom (prednastaven� je line�rne k po�tu volan� funkci�)"
++
++#: elf/ldconfig.c:128
++msgid "Generate verbose messages"
++msgstr "Vyp�sova� podrobnej�ie spr�vy"
++
++#: nis/nis_error.c:37
+ msgid "Generic system error"
+ msgstr "V�eobecn� chyba syst�mu"
+ 
+-#: locale/programs/locale.c:75
++#: locale/programs/locale.c:77
+ msgid "Get locale-specific information."
+ msgstr "Z�ska� inform�ciu �pecifick� pre n�rodn� prostredie."
+ 
+-#: argp/argp-parse.c:88
++#: argp/argp-parse.c:94
+ msgid "Give a short usage message"
+ msgstr "Vyp�sa� kr�tky n�vod na pou�itie"
+ 
+-#: argp/argp-parse.c:87
++#: argp/argp-parse.c:93
+ msgid "Give this help list"
+ msgstr "Vyp�sa� t�to pomoc"
+ 
+ #. TRANS This error code has no purpose.
+-#: stdio-common/../sysdeps/gnu/errlist.c:618
++#: stdio-common/../sysdeps/gnu/errlist.c:637
+ msgid "Gratuitous error"
+ msgstr "V�a�n� chyba"
+ 
+-#: nis/nis_print.c:317
++#: nis/nis_print.c:320
+ #, c-format
+ msgid "Group         : %s\n"
+ msgstr "Skupina          : %s\n"
+ 
+-#: nis/nis_print.c:248
++#: nis/nis_print.c:249
+ msgid "Group Flags :"
+ msgstr "Pr�znaky skupiny :"
+ 
+-#: nis/nis_print_group_entry.c:113
++#: nis/nis_print_group_entry.c:115
+ #, c-format
+ msgid "Group entry for \"%s.%s\" group:\n"
+ msgstr "Z�znam skupiny pre skupinu \"%s.%s\":\n"
+ 
+-#: argp/argp-parse.c:91
++#: argp/argp-parse.c:97
+ msgid "Hang for SECS seconds (default 3600)"
+ msgstr "Po�ka� SECS sek�nd (implicitne 3600)"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:26
+-#: sysdeps/unix/sysv/linux/siglist.h:22
++#: stdio-common/../sysdeps/unix/siglist.c:27 sysdeps/generic/siglist.h:29
+ msgid "Hangup"
+ msgstr "Zavesenie"
+ 
+-#: nscd/grpcache.c:238
++#: nscd/grpcache.c:253
+ #, c-format
+ msgid "Haven't found \"%d\" in group cache!"
+ msgstr "Nen�jden� \"%d\" v cache skup�n!"
+ 
+-#: nscd/pwdcache.c:235
++#: nscd/pwdcache.c:249
+ #, c-format
+ msgid "Haven't found \"%d\" in password cache!"
+ msgstr "Nen�jden� \"%d\" v cache hesiel!"
+ 
+-#: nscd/grpcache.c:210
++#: nscd/grpcache.c:214
+ #, c-format
+ msgid "Haven't found \"%s\" in group cache!"
+ msgstr "Nen�jden� \"%s\" v cache skup�n!"
+ 
+-#: nscd/hstcache.c:297 nscd/hstcache.c:328 nscd/hstcache.c:359
+-#: nscd/hstcache.c:390
++#: nscd/hstcache.c:299 nscd/hstcache.c:341 nscd/hstcache.c:386
++#: nscd/hstcache.c:430
+ #, c-format
+ msgid "Haven't found \"%s\" in hosts cache!"
+ msgstr "Nen�jden� \"%s\" v cache po��ta�ov!"
+ 
+-#: nscd/pwdcache.c:207
++#: nscd/pwdcache.c:210
+ #, c-format
+ msgid "Haven't found \"%s\" in password cache!"
+ msgstr "Nen�jden� \"%s\" v cache hesiel!"
+ 
+ #. TRANS The remote host for a requested network connection is down.
+-#: stdio-common/../sysdeps/gnu/errlist.c:469
++#: stdio-common/../sysdeps/gnu/errlist.c:470
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:177
+ msgid "Host is down"
+ msgstr "Po��ta� je vypnut�"
+ 
+-#: resolv/herror.c:75
++#: resolv/herror.c:69
+ msgid "Host name lookup failure"
+ msgstr "Nepodarilo sa n�js� meno po��ta�a"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:48
+-#: sysdeps/unix/sysv/linux/siglist.h:42
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:35
++msgid "I/O error"
++msgstr "V/V chyba"
++
++#: stdio-common/../sysdeps/unix/siglist.c:49 sysdeps/generic/siglist.h:49
+ msgid "I/O possible"
+ msgstr "V/V mo�n�"
+ 
+-#: db2/makedb.c:71
+-msgid ""
+-"INPUT-FILE OUTPUT-FILE\n"
+-"-o OUTPUT-FILE INPUT-FILE\n"
+-"-u INPUT-FILE"
+-msgstr ""
+-"VSTUPN�_S�BOR V�STUPN�_S�BOR\n"
+-"-o V�STUPN�_S�BOR VSTUPN�_S�BOR\n"
+-"-u VSTUPN�_S�BOR"
+-
+-#: stdio-common/../sysdeps/unix/siglist.c:31
++#: stdio-common/../sysdeps/unix/siglist.c:32
+ msgid "IOT trap"
+ msgstr "IOT preru�enie"
+ 
+-#: nis/nis_print.c:35
++#: nis/nis_print.c:36
+ msgid "IVY"
+ msgstr "IVY"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:626
++#: stdio-common/../sysdeps/gnu/errlist.c:645
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:66
+ msgid "Identifier removed"
+ msgstr "Identifik�tor odstr�nen�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:29
+-#: sysdeps/unix/sysv/linux/siglist.h:25
++#: elf/ldconfig.c:525
++#, c-format
++msgid "Ignored file %s since it is not a regular file."
++msgstr "S�bor %s ignorovan�, ke�e nie je regul�rnym s�borom."
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:118
++msgid "Illegal byte sequence"
++msgstr "Nepr�pustn� sekvencia bajtov"
++
++#: stdio-common/../sysdeps/unix/siglist.c:30 sysdeps/generic/siglist.h:32
+ msgid "Illegal instruction"
+ msgstr "Nepr�pustn� in�trukcia"
+ 
+-#: nis/nis_error.c:61
++#: nis/nis_error.c:62
+ msgid "Illegal object type for operation"
+ msgstr "Nepr�pustn� typ objektu pre oper�ciu"
+ 
+ #. TRANS Invalid seek operation (such as on a pipe).
+-#: stdio-common/../sysdeps/gnu/errlist.c:213
++#: stdio-common/../sysdeps/gnu/errlist.c:214
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:59
+ msgid "Illegal seek"
+ msgstr "Nepr�pustn� nastavenie poz�cie"
+ 
+@@ -1230,13 +2130,14 @@
+ #. TRANS
+ #. TRANS On some systems @code{chmod} returns this error if you try to set the
+ #. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:556
++#: stdio-common/../sysdeps/gnu/errlist.c:557
+ msgid "Inappropriate file type or format"
+ msgstr "Nevhodn� typ alebo form�t s�boru"
+ 
+ #. TRANS Inappropriate I/O control operation, such as trying to set terminal
+ #. TRANS modes on an ordinary file.
+-#: stdio-common/../sysdeps/gnu/errlist.c:188
++#: stdio-common/../sysdeps/gnu/errlist.c:189
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:55
+ msgid "Inappropriate ioctl for device"
+ msgstr "Nevhodn� ioctl pre toto zariadenie"
+ 
+@@ -1246,41 +2147,45 @@
+ #. TRANS error because functions such as @code{read} and @code{write} translate
+ #. TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal.  @xref{Job Control},
+ #. TRANS for information on process groups and these signals.
+-#: stdio-common/../sysdeps/gnu/errlist.c:589
++#: stdio-common/../sysdeps/gnu/errlist.c:608
+ msgid "Inappropriate operation for background process"
+ msgstr "Nevhodn� oper�cia pre proces v pozad�"
+ 
+-#: sysdeps/unix/sysv/linux/siglist.h:62
++#: sysdeps/generic/siglist.h:69
+ msgid "Information request"
+ msgstr "�iados� o inform�ciu"
+ 
+-#: iconv/iconv_prog.c:57
++#: iconv/iconv_prog.c:58
+ msgid "Information:"
+ msgstr "Inform�cia:"
+ 
+-#: locale/programs/localedef.c:94
++#: locale/programs/localedef.c:92
+ msgid "Input Files:"
+ msgstr "Vstupn� s�bory:"
+ 
+-#: iconv/iconv_prog.c:54
++#: elf/ldconfig.c:698 elf/readlib.c:92
++#, c-format
++msgid "Input file %s not found.\n"
++msgstr "Vstupn� s�bor %s nebol n�jden�.\n"
++
++#: iconv/iconv_prog.c:55
+ msgid "Input/Output format specification:"
+ msgstr "�pecifik�cia vstupno/v�stupn�ho form�tu:"
+ 
+ #. TRANS Input/output error; usually used for physical read or write errors.
+-#: stdio-common/../sysdeps/gnu/errlist.c:52
++#: stdio-common/../sysdeps/gnu/errlist.c:53
+ msgid "Input/output error"
+ msgstr "Chyba vstupu/v�stupu"
+ 
+-#: nis/ypclnt.c:775
++#: nis/ypclnt.c:798
+ msgid "Internal NIS error"
+ msgstr "Intern� chyba NIS"
+ 
+-#: nis/ypclnt.c:839
++#: nis/ypclnt.c:862
+ msgid "Internal ypbind error"
+ msgstr "Intern� chyba ypbind"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:27
+-#: sysdeps/unix/sysv/linux/siglist.h:23
++#: stdio-common/../sysdeps/unix/siglist.c:28 sysdeps/generic/siglist.h:30
+ msgid "Interrupt"
+ msgstr "Preru�enie"
+ 
+@@ -1291,231 +2196,263 @@
+ #. TRANS You can choose to have functions resume after a signal that is handled,
+ #. TRANS rather than failing with @code{EINTR}; see @ref{Interrupted
+ #. TRANS Primitives}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:47
++#: stdio-common/../sysdeps/gnu/errlist.c:48
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:34
+ msgid "Interrupted system call"
+ msgstr "Preru�en� volanie syst�mu"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:666
++#: stdio-common/../sysdeps/gnu/errlist.c:685
+ msgid "Interrupted system call should be restarted"
+ msgstr "Preru�en� volanie syst�mu by malo by� znovu spusten�"
+ 
+-#: nis/nis_error.c:44
+-msgid "Invalid Object for operation"
+-msgstr "Neplatn� objekt pre oper�ciu"
+-
+ #. TRANS Invalid argument.  This is used to indicate various kinds of problems
+ #. TRANS with passing the wrong argument to a library function.
+-#: stdio-common/../sysdeps/gnu/errlist.c:164
++#: stdio-common/../sysdeps/gnu/errlist.c:165
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:52
+ msgid "Invalid argument"
+ msgstr "Nepr�pustn� argument"
+ 
+-#: posix/regex.c:1018
++#: posix/regex.c:1102
+ msgid "Invalid back reference"
+ msgstr "Nepr�pustn� sp�tn� odkaz"
+ 
+-#: posix/regex.c:1016
++#: posix/regex.c:1096
+ msgid "Invalid character class name"
+ msgstr "Nepr�pustn� n�zov triedy znakov"
+ 
+-#: sunrpc/clnt_perr.c:275
++#: sunrpc/clnt_perr.c:332
+ msgid "Invalid client credential"
+ msgstr "Neplatn� opr�vnenie klienta"
+ 
+-#: sunrpc/clnt_perr.c:279
++#: sunrpc/clnt_perr.c:340
+ msgid "Invalid client verifier"
+ msgstr "Neplatn� overenie klienta"
+ 
+-#: posix/regex.c:1015
++#: posix/regex.c:1093
+ msgid "Invalid collation character"
+ msgstr "Nepr�pustn� znak triedenia"
+ 
+-#: posix/regex.c:1022
++#: posix/regex.c:1114
+ msgid "Invalid content of \\{\\}"
+ msgstr "Nepr�pustn� obsah \\{\\}"
+ 
+ #. TRANS An attempt to make an improper link across file systems was detected.
+ #. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
+ #. TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}).
+-#: stdio-common/../sysdeps/gnu/errlist.c:141
++#: stdio-common/../sysdeps/gnu/errlist.c:142
+ msgid "Invalid cross-device link"
+ msgstr "Nepr�pustn� odkaz medzi zariadeniami"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:702
++#: stdio-common/../sysdeps/gnu/errlist.c:721
+ msgid "Invalid exchange"
+ msgstr "Nepr�pustn� v�mena"
+ 
++#: nis/nis_error.c:45
++msgid "Invalid object for operation"
++msgstr "Neplatn� objekt pre oper�ciu"
++
+ #. TRANS While decoding a multibyte character the function came along an invalid
+ #. TRANS or an incomplete sequence of bytes or the given wide character is invalid.
+-#: stdio-common/../sysdeps/gnu/errlist.c:579
++#: stdio-common/../sysdeps/gnu/errlist.c:598
+ msgid "Invalid or incomplete multibyte or wide character"
+ msgstr "Nepr�pustn� alebo nekompletn� viacbajtov� alebo �irok� znak"
+ 
+-#: posix/regex.c:1025
++#: posix/regex.c:1123
+ msgid "Invalid preceding regular expression"
+ msgstr "Nepr�pustn� predch�dzaj�ci regul�rny v�raz"
+ 
+-#: posix/regex.c:1023
++#: posix/regex.c:1117
+ msgid "Invalid range end"
+ msgstr "Nepr�pustn� koniec rozsahu"
+ 
+-#: posix/regex.c:1014
++#: posix/regex.c:1090
+ msgid "Invalid regular expression"
+ msgstr "Nepr�pustn� regul�rny v�raz"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:718
++#: stdio-common/../sysdeps/gnu/errlist.c:737
+ msgid "Invalid request code"
+ msgstr "Nepr�pustn� k�d �iadosti"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:706
++#: stdio-common/../sysdeps/gnu/errlist.c:725
+ msgid "Invalid request descriptor"
+ msgstr "Nepr�pustn� deskriptor �iadosti"
+ 
+-#: sunrpc/clnt_perr.c:285
++#: sunrpc/clnt_perr.c:352
+ msgid "Invalid server verifier"
+ msgstr "Neplatn� overenie servera"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:722
++#: stdio-common/../sysdeps/gnu/errlist.c:741
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:85
+ msgid "Invalid slot"
+ msgstr "Neplatn� priehradka"
+ 
++#: nscd/nscd.c:91
++msgid "Invalidate the specified cache"
++msgstr "Zneplatni� zadan� cache"
++
+ #. TRANS File is a directory; you cannot open a directory for writing,
+ #. TRANS or create or remove hard links to it.
+-#: stdio-common/../sysdeps/gnu/errlist.c:158
++#: stdio-common/../sysdeps/gnu/errlist.c:159
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:51
+ msgid "Is a directory"
+ msgstr "Je adres�r"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:806
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:169
++msgid "Is a name file"
++msgstr "Je s�bor n�zvu"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:825
+ msgid "Is a named type file"
+-msgstr "Je pomenovan� s�bor"
++msgstr "Je pomenovan� s�bor typu"
+ 
+-#: nis/nis_print.c:187
++#: nis/nis_print.c:188
+ msgid "Kerberos.\n"
+ msgstr "Kerberos.\n"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:34
+-#: sysdeps/unix/sysv/linux/siglist.h:29
++#: stdio-common/../sysdeps/unix/siglist.c:35 sysdeps/generic/siglist.h:36
+ msgid "Killed"
+ msgstr "Zabit�"
+ 
+-#: nis/nis_print.c:123
++#: nis/nis_print.c:124
+ msgid "LINK\n"
+ msgstr "ODKAZ\n"
+ 
+-#: nis/nis_local_names.c:125
++#: nis/nis_local_names.c:126
+ #, c-format
+ msgid "LOCAL entry for UID %d in directory %s not unique\n"
+ msgstr "LOCAL z�znam pre UID %d v adres�ri %s nie je jednozna�n�\n"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:698
++#: stdio-common/../sysdeps/gnu/errlist.c:717
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:74
+ msgid "Level 2 halted"
+ msgstr "�rove� 2 zastaven�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:674
++#: stdio-common/../sysdeps/gnu/errlist.c:693
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:68
+ msgid "Level 2 not synchronized"
+ msgstr "�rove� 2 nie je synchronizovan�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:678
++#: stdio-common/../sysdeps/gnu/errlist.c:697
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:69
+ msgid "Level 3 halted"
+ msgstr "�rove� 3 zastaven�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:682
++#: stdio-common/../sysdeps/gnu/errlist.c:701
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:70
+ msgid "Level 3 reset"
+ msgstr "�rove� 3 nastaven� na v�chodzie hodnoty"
+ 
+-#: nis/nis_error.c:53
+-msgid "Link Points to illegal name"
+-msgstr "Odkaz odkazuje na nepr�pustn� n�zov"
+-
+-#: stdio-common/../sysdeps/gnu/errlist.c:638
++#: stdio-common/../sysdeps/gnu/errlist.c:657
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:97
+ msgid "Link has been severed"
+ msgstr "Odkaz bol zni�en�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:686
++#: stdio-common/../sysdeps/gnu/errlist.c:705
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:71
+ msgid "Link number out of range"
+ msgstr "��slo odkazu mimo rozsahu"
+ 
+-#: nis/nis_print.c:282
++#: nis/nis_error.c:54
++msgid "Link points to illegal name"
++msgstr "Odkaz odkazuje na nepr�pustn� n�zov"
++
++#: nis/nis_print.c:283
+ msgid "Linked Object Type : "
+ msgstr "Typ odkazovan�ho objektu : "
+ 
+-#: nis/nis_print.c:284
++#: nis/nis_print.c:285
+ #, c-format
+ msgid "Linked to : %s\n"
+ msgstr "Odkazuje na : %s\n"
+ 
+-#: nis/ypclnt.c:787
++#: nis/ypclnt.c:810
+ msgid "Local domain name not set"
+ msgstr "Meno miestnej dom�ny nie je nastaven�"
+ 
+-#: nis/ypclnt.c:777
++#: nis/ypclnt.c:800
+ msgid "Local resource allocation failure"
+ msgstr "Chyba pri pridelen� miestnych zdrojov"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:734
++#: stdio-common/../sysdeps/gnu/errlist.c:753
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:94
+ msgid "Machine is not on the network"
+ msgstr "Po��ta� nie je zapojen� v sieti"
+ 
+-#: nis/nis_error.c:45
+-msgid "Malformed Name, or illegal name"
+-msgstr "Chybne formovan� alebo nepr�pustn� n�zov"
++#: nis/nis_error.c:46
++msgid "Malformed name, or illegal name"
++msgstr "Chybne formovan� alebo nepr�pustn� n�zov"
+ 
+-#: argp/argp-help.c:1182
++#: argp/argp-help.c:1185
+ msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options."
+ msgstr "Povinn� alebo volite�n� argumenty dlh�ch tvarov volieb s� povinn� alebo volite�n� pre �ubovo�n� zodpovedaj�ce kr�tke vo�by."
+ 
+-#: nis/nis_print.c:168
++#: elf/ldconfig.c:135
++msgid "Manually link individual libraries."
++msgstr "Ru�ne linkova� jednotliv� kni�nice."
++
++#: nis/nis_print.c:169
+ msgid "Master Server :\n"
+ msgstr "Hlavn� server :\n"
+ 
+-#: nis/nis_error.c:75
++#: nis/nis_error.c:76
+ msgid "Master server busy, full dump rescheduled."
+ msgstr "Hlavn� server zanepr�zdnen�, �pln� prenos prepl�novan�."
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:35
++#: posix/../sysdeps/posix/gai_strerror.c:36
+ msgid "Memory allocation failure"
+ msgstr "Pridelenie pam�ti zlyhalo"
+ 
+-#: posix/regex.c:1024
++#: posix/regex.c:1120
+ msgid "Memory exhausted"
+ msgstr "Pam� vy�erpan�"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:82
++msgid "Message tables full"
++msgstr "Pln� tabu�ka spr�v"
++
+ #. TRANS The size of a message sent on a socket was larger than the supported
+ #. TRANS maximum size.
+-#: stdio-common/../sysdeps/gnu/errlist.c:317
++#: stdio-common/../sysdeps/gnu/errlist.c:318
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:127
+ msgid "Message too long"
+ msgstr "Pr�li� dlh� spr�va"
+ 
+-#: nis/nis_error.c:57
++#: nis/nis_error.c:58
+ msgid "Missing or malformed attribute"
+ msgstr "Ch�baj�ci alebo chybne formovan� atrib�t"
+ 
+-#: nis/nis_print.c:323
++#: nis/nis_print.c:328
+ #, c-format
+ msgid "Mod. Time     : %s"
+ msgstr "�as zmeny        :%s"
+ 
+-#: nis/nis_error.c:50
++#: nis/nis_error.c:51
+ msgid "Modification failed"
+ msgstr "Modifik�cia zlyhala"
+ 
+-#: nis/nis_error.c:63
++#: nis/nis_error.c:64
+ msgid "Modify operation failed"
+ msgstr "Oper�cia zmeny zlyhala"
+ 
+-#: locale/programs/locale.c:68
++#: locale/programs/locale.c:70
+ msgid "Modify output format:"
+ msgstr "Modifikova� v�stupn� form�t:"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:630
++#: stdio-common/../sysdeps/gnu/errlist.c:649
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:104
+ msgid "Multihop attempted"
+ msgstr "Pokus o spojenie cez viac uzlov"
+ 
+-#: catgets/gencat.c:106 catgets/gencat.c:110 db2/makedb.c:59
+-#: locale/programs/localedef.c:115 nscd/nscd.c:77
++#: nscd/nscd_conf.c:182
++msgid "Must specify user name for server-user option"
++msgstr "Pre server-user vo�bu je potrebn� zada� meno pou��vate�a"
++
++#: catgets/gencat.c:111 catgets/gencat.c:115 locale/programs/localedef.c:115
++#: nscd/nscd.c:83
+ msgid "NAME"
+ msgstr "N�ZOV"
+ 
+-#: locale/programs/locale.c:78
++#: locale/programs/locale.c:80
+ msgid ""
+ "NAME\n"
+ "[-a|-m]"
+@@ -1523,269 +2460,365 @@
+ "N�ZOV\n"
+ "[-a|-m]"
+ 
+-#: nis/nis_print.c:31
++#: nis/nis_print.c:32
+ msgid "NIS"
+ msgstr "NIS"
+ 
+-#: nis/ypclnt.c:791
++#: nis/ypclnt.c:814
+ msgid "NIS client/server version mismatch - can't supply service"
+ msgstr "Rozdielne verzie NIS klienta a serveru - nie je mo�n� poskytn�� slu�bu"
+ 
+-#: nis/ypclnt.c:789
++#: nis/ypclnt.c:812
+ msgid "NIS map database is bad"
+ msgstr "Datab�za m�p NIS je chybn�"
+ 
+-#: nis/nis_error.c:68
++#: nis/nis_error.c:69
+ msgid "NIS+ operation failed"
+ msgstr "NIS+ oper�cia zlyhala"
+ 
+-#: nis/nis_error.c:33
++#: nis/nis_error.c:34
+ msgid "NIS+ servers unreachable"
+ msgstr "NIS+ server nie je dostupn�"
+ 
+-#: nis/nis_error.c:69
++#: nis/nis_error.c:70
+ msgid "NIS+ service is unavailable or not installed"
+ msgstr "Slu�ba NIS+ nie je dostupn� alebo nain�talovan�"
+ 
+-#: nis/nis_print.c:108
++#: nis/nis_print.c:109
+ msgid "NO OBJECT\n"
+ msgstr "�IADNY OBJEKT\n"
+ 
+-#: nscd/nscd.c:81
++#: nscd/nscd.c:87
+ msgid "NUMBER"
+ msgstr "PO�ET"
+ 
+-#: nis/nis_print.c:162
++#: nis/nis_print.c:163
+ #, c-format
+-msgid "Name : '%s'\n"
+-msgstr "N�zov : '%s'\n"
++msgid "Name : `%s'\n"
++msgstr "N�zov : `%s'\n"
+ 
+-#: nscd/nscd.c:88
++#: nscd/nscd.c:97
+ msgid "Name Service Cache Daemon."
+ msgstr "D�mon cache slu�by n�zvov."
+ 
+-#: nis/nis_error.c:40
++#: nis/nis_error.c:41
+ msgid "Name not served by this server"
+ msgstr "N�zov nie je obsluhovan� t�mto serverom"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:758
++#: stdio-common/../sysdeps/gnu/errlist.c:777
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:110
+ msgid "Name not unique on network"
+ msgstr "Meno nie je v sieti jednozna�n�"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:37
++#: posix/../sysdeps/posix/gai_strerror.c:38
+ msgid "Name or service not known"
+ msgstr "N�zov alebo slu�ba nezn�me"
+ 
+-#: nis/nis_error.c:49
++#: malloc/memusagestat.c:53
++msgid "Name output file"
++msgstr "V�stupn� s�bor n�zvu"
++
++#: nis/nis_error.c:50
+ msgid "Name/entry isn't unique"
+ msgstr "N�zov/z�znam nie s� jednozna�n�"
+ 
+-#: nis/nis_error.c:58
++#: nis/nis_error.c:59
+ msgid "Named object is not searchable"
+ msgstr "Zadan� objekt nie je preh�ad�vate�n�"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:566
++#: stdio-common/../sysdeps/gnu/errlist.c:567
+ msgid "Need authenticator"
+ msgstr "Potrebuje overovac� objekt"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:159
++msgid "Network dropped connection because of reset"
++msgstr "Sie� zru�ila spojenie kv�li resetu"
++
+ #. TRANS A network connection was reset because the remote host crashed.
+-#: stdio-common/../sysdeps/gnu/errlist.c:389
++#: stdio-common/../sysdeps/gnu/errlist.c:390
+ msgid "Network dropped connection on reset"
+ msgstr "Sie� zru�ila spojenie (probl�m so vzdialen�m po��ta�om)"
+ 
+ #. TRANS A socket operation failed because the network was down.
+-#: stdio-common/../sysdeps/gnu/errlist.c:378
++#: stdio-common/../sysdeps/gnu/errlist.c:379
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:157
+ msgid "Network is down"
+ msgstr "Sie� je nefunk�n�"
+ 
+ #. TRANS A socket operation failed because the subnet containing the remote host
+ #. TRANS was unreachable.
+-#: stdio-common/../sysdeps/gnu/errlist.c:384
++#: stdio-common/../sysdeps/gnu/errlist.c:385
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:158
+ msgid "Network is unreachable"
+ msgstr "Sie� nie je dostupn�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:694
++#: stdio-common/../sysdeps/gnu/errlist.c:713
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:73
+ msgid "No CSI structure available"
+ msgstr "CSI �trukt�ra nedostupn�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:802
++#: stdio-common/../sysdeps/gnu/errlist.c:821
+ msgid "No XENIX semaphores available"
+ msgstr "XENIX semaf�ry nedostupn�"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:36
++#: posix/../sysdeps/posix/gai_strerror.c:37
+ msgid "No address associated with hostname"
+ msgstr "N�zov po��ta�a nem� priraden� adresu"
+ 
+-#: resolv/herror.c:77
++#: resolv/herror.c:71
+ msgid "No address associated with name"
+ msgstr "N�zov nem� priraden� adresu"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:714
++#: stdio-common/../sysdeps/gnu/errlist.c:733
+ msgid "No anode"
+ msgstr "�iadny anode"
+ 
+ #. TRANS The kernel's buffers for I/O operations are all in use.  In GNU, this
+ #. TRANS error is always synonymous with @code{ENOMEM}; you may get one or the
+ #. TRANS other from network operations.
+-#: stdio-common/../sysdeps/gnu/errlist.c:408
++#: stdio-common/../sysdeps/gnu/errlist.c:409
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:162
+ msgid "No buffer space available"
+ msgstr "Nie je mo�n� prideli� pam� pre V/V oper�cie"
+ 
++#: locale/programs/ld-ctype.c:425
++msgid "No character set name specified in charmap"
++msgstr "V znakovej mape nie je zadan� n�zov znakovej sady"
++
+ #. TRANS There are no child processes.  This error happens on operations that are
+ #. TRANS supposed to manipulate child processes, when there aren't any processes
+ #. TRANS to manipulate.
+-#: stdio-common/../sysdeps/gnu/errlist.c:89
++#: stdio-common/../sysdeps/gnu/errlist.c:90
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:40
+ msgid "No child processes"
+ msgstr "Detsk� procesy neexistuj�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:634
++#: stdio-common/../sysdeps/gnu/errlist.c:653
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:91
+ msgid "No data available"
+ msgstr "D�ta nie s� k dispoz�cii"
+ 
+-#: nis/nis_error.c:73
++#: locale/programs/ld-address.c:131 locale/programs/ld-collate.c:1500
++#: locale/programs/ld-ctype.c:407 locale/programs/ld-identification.c:132
++#: locale/programs/ld-measurement.c:93 locale/programs/ld-messages.c:98
++#: locale/programs/ld-monetary.c:194 locale/programs/ld-name.c:94
++#: locale/programs/ld-numeric.c:99 locale/programs/ld-paper.c:91
++#: locale/programs/ld-telephone.c:94 locale/programs/ld-time.c:160
++#, c-format
++msgid "No definition for %s category found"
++msgstr "Nebola n�jden� defin�cia kateg�rie %s"
++
++#: nis/nis_error.c:74
+ msgid "No file space on server"
+ msgstr "Na serveri u� nie je �iadne miesto pre s�bory"
+ 
++#: elf/ldconfig.c:532
++#, c-format
++msgid "No link created since soname could not be found for %s"
++msgstr "Odkaz nebol vytvoren�, ke�e pre %s nebolo mo�n� n�js� soname"
++
+ #. TRANS No locks available.  This is used by the file locking facilities; see
+ #. TRANS @ref{File Locks}.  This error is never generated by the GNU system, but
+ #. TRANS it can result from an operation to an NFS server running another
+ #. TRANS operating system.
+-#: stdio-common/../sysdeps/gnu/errlist.c:547
++#: stdio-common/../sysdeps/gnu/errlist.c:548
+ msgid "No locks available"
+ msgstr "Z�mky nie s� k dispoz�cii"
+ 
+-#: posix/regex.c:1013
++#: posix/regex.c:1087
+ msgid "No match"
+ msgstr "�iadna zhoda"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:814
++#: stdio-common/../sysdeps/gnu/errlist.c:833
+ msgid "No medium found"
+ msgstr "Nen�jden� �iadne m�dium"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:642
++#: stdio-common/../sysdeps/gnu/errlist.c:661
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:65
+ msgid "No message of desired type"
+ msgstr "�iadna spr�va �elan�ho typu"
+ 
+-#: nis/ypclnt.c:779
++#: nis/ypclnt.c:802
+ msgid "No more records in map database"
+ msgstr "�iadne �al�ie z�znamy v datab�ze"
+ 
+-#: posix/regex.c:5515
++#: posix/regex.c:5955
+ msgid "No previous regular expression"
+ msgstr "�iadny predch�dzaj�ci regul�rny v�raz"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:76
++msgid "No record locks available"
++msgstr "Nie s� k dispoz�cii �iadne z�mky"
++
+ #: sunrpc/rpcinfo.c:570
+ msgid "No remote programs registered.\n"
+ msgstr "Nie s� registrovan� �iadne vzdialen� programy\n"
+ 
+ #. TRANS The remote host for a requested network connection is not reachable.
+-#: stdio-common/../sysdeps/gnu/errlist.c:474
++#: stdio-common/../sysdeps/gnu/errlist.c:475
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:178
+ msgid "No route to host"
+ msgstr "Cesta k po��ta�u neexistuje"
+ 
+ #. TRANS No space left on device; write operation on a file failed because the
+ #. TRANS disk is full.
+-#: stdio-common/../sysdeps/gnu/errlist.c:208
++#: stdio-common/../sysdeps/gnu/errlist.c:209
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:58
+ msgid "No space left on device"
+ msgstr "Na zariaden� u� nie je �iadne miesto"
+ 
+ #. TRANS The wrong type of device was given to a function that expects a
+ #. TRANS particular sort of device.
+-#: stdio-common/../sysdeps/gnu/errlist.c:147
++#: stdio-common/../sysdeps/gnu/errlist.c:148
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:49
+ msgid "No such device"
+ msgstr "Tak� zariadenie neexistuje"
+ 
++#. TRANS No such device or address.  The system tried to use the device
++#. TRANS represented by a file you specified, and it couldn't find the device.
++#. TRANS This can mean that the device file was installed incorrectly, or that
++#. TRANS the physical device is missing or not correctly attached to the
++#. TRANS computer.
++#: stdio-common/../sysdeps/gnu/errlist.c:62
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:36
++msgid "No such device or address"
++msgstr "Tak� zariadenie alebo adresa neexistuje"
++
+ #. TRANS No such file or directory.  This is a ``file doesn't exist'' error
+ #. TRANS for ordinary files that are referenced in contexts where they are
+ #. TRANS expected to already exist.
+-#: stdio-common/../sysdeps/gnu/errlist.c:31
++#: stdio-common/../sysdeps/gnu/errlist.c:32
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:32
+ msgid "No such file or directory"
+ msgstr "Adres�r alebo s�bor neexistuje"
+ 
+-#: nis/ypclnt.c:773
++#: nis/ypclnt.c:796
+ msgid "No such key in map"
+ msgstr "Tento k��� v datab�ze neexistuje"
+ 
+-#: nis/ypclnt.c:771
++#: nis/ypclnt.c:794
+ msgid "No such map in server's domain"
+ msgstr "T�to mapa sa v dom�ne servera nenach�dza"
+ 
+ #. TRANS No process matches the specified process ID.
+-#: stdio-common/../sysdeps/gnu/errlist.c:36
++#: stdio-common/../sysdeps/gnu/errlist.c:37
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:33
+ msgid "No such process"
+ msgstr "Tento proces neexistuje"
+ 
+-#: nis/nis_error.c:60
++#: nis/nis_error.c:61
+ msgid "Non NIS+ namespace encountered"
+ msgstr "Zaznamenan� priestor n�zvov mimo NIS+"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:33
++#: posix/../sysdeps/posix/gai_strerror.c:34
+ msgid "Non-recoverable failure in name resolution"
+ msgstr "Neopravite�n� chyba pri rie�en� n�zvu"
+ 
+-#: nis/nis_print.c:176
++#: nis/nis_print.c:177
+ msgid "None.\n"
+ msgstr "�iadne.\n"
+ 
+-#: nis/nis_error.c:48
+-msgid "Not Found, no such name"
+-msgstr "Nen�jden�, tak�to n�zov neexistuje"
+-
+-#: stdio-common/../sysdeps/gnu/errlist.c:798
++#: stdio-common/../sysdeps/gnu/errlist.c:817
+ msgid "Not a XENIX named type file"
+ msgstr "Nejde o pomenovan� XENIX s�bor"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:107
++msgid "Not a data message"
++msgstr "Nejde o d�tov� spr�vu"
++
+ #. TRANS A file that isn't a directory was specified when a directory is required.
+-#: stdio-common/../sysdeps/gnu/errlist.c:152
++#: stdio-common/../sysdeps/gnu/errlist.c:153
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:50
+ msgid "Not a directory"
+ msgstr "Nie je adres�r"
+ 
+-#: nis/nis_error.c:30
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:167
++msgid "Not a name file"
++msgstr "Nejde o s�bor n�zvu"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:90
++msgid "Not a stream device"
++msgstr "Nejde o pr�dov� zariadenie"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:168
++msgid "Not available"
++msgstr "Nie je k dispoz�cii"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:42
++msgid "Not enough space"
++msgstr "Nedostatok miesta"
++
++#: nis/nis_error.c:31
+ msgid "Not found"
+ msgstr "Nen�jden�"
+ 
+-#: nis/nis_error.c:43
++#: nis/nis_error.c:49
++msgid "Not found, no such name"
++msgstr "Nen�jden�, tak�to n�zov neexistuje"
++
++#: nis/nis_error.c:44
+ msgid "Not master server for this domain"
+ msgstr "Nie je hlavn� server pre t�to dom�nu"
+ 
+-#: nis/nis_error.c:39
++#: nis/nis_error.c:40
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:31
+ msgid "Not owner"
+ msgstr "Nie je vlastn�kom"
+ 
+-#: nis/nis_print.c:263
++#. TRANS Not supported.  A function returns this error when certain parameter
++#. TRANS values are valid, but the functionality they request is not available.
++#. TRANS This can mean that the function does not implement a particular command
++#. TRANS or option value or flag bit at all.  For functions that operate on some
++#. TRANS object given in a parameter, such as a file descriptor or a port, it
++#. TRANS might instead mean that only @emph{that specific object} (file
++#. TRANS descriptor, port, etc.) is unable to support the other parameters given;
++#. TRANS different file descriptors might support different ranges of parameter
++#. TRANS values.
++#. TRANS
++#. TRANS If the entire function is not available at all in the implementation,
++#. TRANS it returns @code{ENOSYS} instead.
++#: stdio-common/../sysdeps/gnu/errlist.c:592
++msgid "Not supported"
++msgstr "Nie je podporovan�"
++
++#: nis/nis_print.c:264
+ #, c-format
+ msgid "Number of Columns   : %d\n"
+ msgstr "Po�et st�pcov          : %d\n"
+ 
+-#: nis/nis_print.c:358
++#: nis/nis_print.c:363
+ #, c-format
+ msgid "Number of objects : %u\n"
+ msgstr "Po�et objektov       : %u\n"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:120
++msgid "Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"
++msgstr "Po�et symbolick�ch odkazov n�jden�ch po�as prech�dzania cesty presahuje MAXSYMLINKS"
++
+ #. TRANS Domain error; used by mathematical functions when an argument value does
+ #. TRANS not fall into the domain over which the function is defined.
+-#: stdio-common/../sysdeps/gnu/errlist.c:240
++#: stdio-common/../sysdeps/gnu/errlist.c:241
+ msgid "Numerical argument out of domain"
+ msgstr "��seln� rozsah mimo dom�ny defin�cie funkcie"
+ 
+ #. TRANS Range error; used by mathematical functions when the result value is
+ #. TRANS not representable because of overflow or underflow.
+-#: stdio-common/../sysdeps/gnu/errlist.c:246
++#: stdio-common/../sysdeps/gnu/errlist.c:247
+ msgid "Numerical result out of range"
+ msgstr "��seln� v�sledok mimo povolen�ho rozsahu"
+ 
+-#: nis/nis_print.c:362
++#: nis/nis_print.c:367
+ #, c-format
+ msgid "Object #%d:\n"
+ msgstr "Objekt #%d:\n"
+ 
+-#: nis/nis_print.c:314
++#: nis/nis_print.c:317
+ #, c-format
+ msgid "Object Name   : %s\n"
+ msgstr "N�zov objektu    : %s\n"
+ 
+-#: nis/nis_print.c:324
++#: nis/nis_print.c:329
+ msgid "Object Type   : "
+ msgstr "Typ objektu      : "
+ 
+@@ -1793,31 +2826,45 @@
+ #. TRANS already specifies an NFS-mounted file.
+ #. TRANS (This is an error on some operating systems, but we expect it to work
+ #. TRANS properly on the GNU system, making this error code impossible.)
+-#: stdio-common/../sysdeps/gnu/errlist.c:514
++#: stdio-common/../sysdeps/gnu/errlist.c:515
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:96
+ msgid "Object is remote"
+ msgstr "Objekt je vzdialen�"
+ 
+-#: nis/nis_error.c:42
++#: nis/nis_error.c:43
+ msgid "Object with same name exists"
+ msgstr "Existuje objekt s rovnak�m n�zvom"
+ 
+-#: timezone/zic.c:1995
++#: timezone/zic.c:2022
+ msgid "Odd number of quotation marks"
+ msgstr "Nep�rny po�et �vodzoviek"
+ 
+-#: nscd/nscd.c:185
++#: elf/ldconfig.c:134
++msgid "Only process directories specified on the command line.  Don't build cache."
++msgstr "Na pr�kazovom riadku s� zadan� iba adres�re procesov. Nevytv�ra� cache."
++
++#: nscd/nscd.c:200 nscd/nscd.c:220 nscd/nscd.c:226
+ msgid "Only root is allowed to use this option!"
+ msgstr "T�to vo�ba je dostupn� iba superu��vate�ovi!"
+ 
+ #. TRANS An operation is already in progress on an object that has non-blocking
+ #. TRANS mode selected.
+-#: stdio-common/../sysdeps/gnu/errlist.c:306
++#: stdio-common/../sysdeps/gnu/errlist.c:307
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:179
+ msgid "Operation already in progress"
+ msgstr "Oper�cia je u� rozpracovan�"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:77
++msgid "Operation canceled"
++msgstr "Oper�cia zru�en�"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:119
++msgid "Operation not applicable"
++msgstr "Oper�cia nie je aplikovate�n�"
++
+ #. TRANS Operation not permitted; only the owner of the file (or other resource)
+ #. TRANS or processes with special privileges can perform the operation.
+-#: stdio-common/../sysdeps/gnu/errlist.c:24
++#: stdio-common/../sysdeps/gnu/errlist.c:25
+ msgid "Operation not permitted"
+ msgstr "Oper�cia nie je povolen�"
+ 
+@@ -1827,10 +2874,15 @@
+ #. TRANS error can happen for many calls when the object does not support the
+ #. TRANS particular operation; it is a generic indication that the server knows
+ #. TRANS nothing to do for that call.
+-#: stdio-common/../sysdeps/gnu/errlist.c:350
++#: stdio-common/../sysdeps/gnu/errlist.c:351
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:78
+ msgid "Operation not supported"
+ msgstr "Oper�cia nie je podporovan�"
+ 
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:152
++msgid "Operation not supported on transport endpoint"
++msgstr "Oper�cia nie je podporovan� na koncovom bode komunik�cie"
++
+ #. TRANS An operation that cannot complete immediately was initiated on an object
+ #. TRANS that has non-blocking mode selected.  Some functions that must always
+ #. TRANS block (such as @code{connect}; @pxref{Connecting}) never return
+@@ -1839,7 +2891,8 @@
+ #. TRANS the object before the call completes return @code{EALREADY}.  You can
+ #. TRANS use the @code{select} function to find out when the pending operation
+ #. TRANS has completed; @pxref{Waiting for I/O}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:300
++#: stdio-common/../sysdeps/gnu/errlist.c:301
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:180
+ msgid "Operation now in progress"
+ msgstr "Oper�cia prebieha"
+ 
+@@ -1848,67 +2901,86 @@
+ #. TRANS
+ #. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
+ #. TRANS separate error code.
+-#: stdio-common/../sysdeps/gnu/errlist.c:288
++#: stdio-common/../sysdeps/gnu/errlist.c:289
+ msgid "Operation would block"
+ msgstr "Oper�cia by blokovala"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:646
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:129
++msgid "Option not supported by protocol"
++msgstr "Vo�ba nie je protokolom podporovan�"
++
++#: locale/programs/localedef.c:103
++msgid "Optional output file prefix"
++msgstr "Volite�n� prefix v�stupn�ho s�boru"
++
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:93
++msgid "Out of stream resources"
++msgstr "Pr�dov� zdroje vy�erpan�"
++
++#: stdio-common/../sysdeps/gnu/errlist.c:665
+ msgid "Out of streams resources"
+ msgstr "Pr�dov� zdroje vy�erpan�"
+ 
+-#: iconv/iconv_prog.c:59 locale/programs/localedef.c:101
++#: iconv/iconv_prog.c:60 locale/programs/localedef.c:99
+ msgid "Output control:"
+ msgstr "Riadenie v�stupu:"
+ 
+-#: elf/sprof.c:76
++#: elf/sprof.c:72
+ msgid "Output selection:"
+ msgstr "V�ber v�stupu:"
+ 
+-#: nis/nis_print.c:316
++#: nis/nis_print.c:319
+ #, c-format
+ msgid "Owner         : %s\n"
+ msgstr "Vlastn�k         : %s\n"
+ 
+-#: nis/nis_print.c:126
++#: nis/nis_print.c:127
+ msgid "PRIVATE\n"
+ msgstr "S�KROMN�\n"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:738
++#: stdio-common/../sysdeps/gnu/errlist.c:757
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:95
+ msgid "Package not installed"
+ msgstr "Bal�k nie je nain�talovan�"
+ 
+-#: nscd/nscd_conf.c:84
++#: nscd/nscd_conf.c:83
+ #, c-format
+ msgid "Parse error: %s"
+ msgstr "Chyba anal�zy: %s"
+ 
+-#: nis/nis_error.c:54
+-msgid "Partial Success"
++#: nis/nis_error.c:55
++msgid "Partial success"
+ msgstr "�iasto�n� �spech"
+ 
+-#: nis/nis_error.c:62
++#: nis/nis_error.c:63
+ msgid "Passed object is not the same object on server"
+ msgstr "Odovzdan� objekt nie je na serveri t�m ist�m objektom"
+ 
++#: elf/ldconfig.c:287
++#, c-format
++msgid "Path `%s' given more than once"
++msgstr "Cesta `%s' bola zadan� viac ako raz"
++
+ #. TRANS Permission denied; the file permissions do not allow the attempted operation.
+-#: nis/nis_error.c:38 nis/ypclnt.c:793
+-#: stdio-common/../sysdeps/gnu/errlist.c:108
++#: nis/nis_error.c:39 nis/ypclnt.c:816
++#: stdio-common/../sysdeps/gnu/errlist.c:109
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:43
+ msgid "Permission denied"
+ msgstr "Pr�stup odmietnut�"
+ 
+-#: sysdeps/unix/sysv/linux/siglist.h:64
++#: sysdeps/generic/siglist.h:71
+ msgid "Power failure"
+ msgstr "V�padok nap�jania"
+ 
+-#: posix/regex.c:1026
++#: posix/regex.c:1126
+ msgid "Premature end of regular expression"
+ msgstr "Pred�asn� koniec regul�rneho v�razu"
+ 
+-#: db2/makedb.c:63
+-msgid "Print content of database file, one entry a line"
+-msgstr "Vyp�sa� obsah datab�zov�ho s�boru, jeden z�znam na riadok"
++#: elf/ldconfig.c:127
++msgid "Print cache"
++msgstr "Vyp�sa� cache"
+ 
+-#: nscd/nscd.c:83
++#: nscd/nscd.c:89
+ msgid "Print current configuration statistic"
+ msgstr "Vyp�sa� �tatistiku aktu�lnej konfigur�cie"
+ 
+@@ -1916,243 +2988,259 @@
+ msgid "Print more messages"
+ msgstr "Vyp�sa� viac spr�v"
+ 
+-#: argp/argp-parse.c:148
++#: argp/argp-parse.c:154
+ msgid "Print program version"
+ msgstr "Vyp�sa� verziu programu"
+ 
+-#: nis/nis_error.c:29
++#: nis/nis_error.c:30
+ msgid "Probable success"
+ msgstr "Pravdepodobn� �spech"
+ 
+-#: nis/nis_error.c:31
++#: nis/nis_error.c:32
+ msgid "Probably not found"
+ msgstr "Pravdepodobne nen�jden�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:52
+-#: sysdeps/unix/sysv/linux/siglist.h:46
++#: stdio-common/../sysdeps/unix/siglist.c:53 sysdeps/generic/siglist.h:53
+ msgid "Profiling timer expired"
+ msgstr "Profilovac� �asova� vypr�al"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:690
++#: stdio-common/../sysdeps/gnu/errlist.c:709
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:72
+ msgid "Protocol driver not attached"
+ msgstr "Ovl�da� protokolu nepripojen�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:658
++#: stdio-common/../sysdeps/gnu/errlist.c:677
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:101
+ msgid "Protocol error"
+ msgstr "Chyba protokolu"
+ 
+ #. TRANS The socket communications protocol family you requested is not supported.
+-#: stdio-common/../sysdeps/gnu/errlist.c:355
++#: stdio-common/../sysdeps/gnu/errlist.c:356
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:153
+ msgid "Protocol family not supported"
+ msgstr "Rodina protokolov nie je podporovan�"
+ 
+ #. TRANS You specified a socket option that doesn't make sense for the
+ #. TRANS particular protocol being used by the socket.  @xref{Socket Options}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:328
++#: stdio-common/../sysdeps/gnu/errlist.c:329
+ msgid "Protocol not available"
+ msgstr "Protokol nie je k dispoz�cii"
+ 
+ #. TRANS The socket domain does not support the requested communications protocol
+ #. TRANS (perhaps because the requested protocol is completely invalid).
+ #. TRANS @xref{Creating a Socket}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:335
++#: stdio-common/../sysdeps/gnu/errlist.c:336
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:150
+ msgid "Protocol not supported"
+ msgstr "Protokol nie je podporovan�"
+ 
+ #. TRANS The socket type does not support the requested communications protocol.
+-#: stdio-common/../sysdeps/gnu/errlist.c:322
++#: stdio-common/../sysdeps/gnu/errlist.c:323
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:128
+ msgid "Protocol wrong type for socket"
+ msgstr "Protokol nie je socketom podporovan�"
+ 
+-#: nis/nis_error.c:64
++#: nis/nis_error.c:65
+ msgid "Query illegal for named table"
+ msgstr "Nepr�pustn� ot�zka pre dan� tabu�ku"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:28
+-#: sysdeps/unix/sysv/linux/siglist.h:24
++#: stdio-common/../sysdeps/unix/siglist.c:29 sysdeps/generic/siglist.h:31
+ msgid "Quit"
+ msgstr "Koniec"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:754
++#: stdio-common/../sysdeps/gnu/errlist.c:773
+ msgid "RFS specific error"
+ msgstr "RFS-�pecifick� chyba"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:539
++#: stdio-common/../sysdeps/gnu/errlist.c:540
+ msgid "RPC bad procedure for program"
+ msgstr "Chybn� RPC proced�ra pre program"
+ 
+-#: nis/ypclnt.c:767
++#: nis/ypclnt.c:790
+ msgid "RPC failure on NIS operation"
+ msgstr "Zlyhal RPC pri NIS oper�cii"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:529
++#: stdio-common/../sysdeps/gnu/errlist.c:530
+ msgid "RPC program not available"
+ msgstr "RPC program nie je k dispoz�cii"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:534
++#: stdio-common/../sysdeps/gnu/errlist.c:535
+ msgid "RPC program version wrong"
+ msgstr "Chybn� verzia RPC programu"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:519
++#: stdio-common/../sysdeps/gnu/errlist.c:520
+ msgid "RPC struct is bad"
+ msgstr "RPC �trukt�ra je chybn�"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:524
++#: stdio-common/../sysdeps/gnu/errlist.c:525
+ msgid "RPC version wrong"
+ msgstr "Chybn� verzia RPC"
+ 
+-#: sunrpc/clnt_perr.c:215
++#: sunrpc/clnt_perr.c:271
+ msgid "RPC: (unknown error code)"
+ msgstr "RPC: (nezn�mny chybov� k�d)"
+ 
+-#: sunrpc/clnt_perr.c:176
++#: sunrpc/clnt_perr.c:190
+ msgid "RPC: Authentication error"
+ msgstr "RPC: Chyba pri overen� pr�v"
+ 
+-#: sunrpc/clnt_perr.c:166
++#: sunrpc/clnt_perr.c:170
+ msgid "RPC: Can't decode result"
+ msgstr "RPC: Nie je mo�n� dek�dova� v�sledok"
+ 
+-#: sunrpc/clnt_perr.c:164
++#: sunrpc/clnt_perr.c:166
+ msgid "RPC: Can't encode arguments"
+ msgstr "RPC: Nie je mo�n� zak�dova� argumenty"
+ 
+-#: sunrpc/clnt_perr.c:196
++#: sunrpc/clnt_perr.c:230
+ msgid "RPC: Failed (unspecified error)"
+ msgstr "RPC: Zlyhalo (ne�pecifikovan� chyba)"
+ 
+-#: sunrpc/clnt_perr.c:174
++#: sunrpc/clnt_perr.c:186
+ msgid "RPC: Incompatible versions of RPC"
+ msgstr "RPC: Nekompatibiln� verzie RPC"
+ 
+-#: sunrpc/clnt_perr.c:192
++#: sunrpc/clnt_perr.c:222
+ msgid "RPC: Port mapper failure"
+ msgstr "RPC: Chyba portmappera"
+ 
+-#: sunrpc/clnt_perr.c:182
++#: sunrpc/clnt_perr.c:202
+ msgid "RPC: Procedure unavailable"
+ msgstr "RPC: Proced�ra nie je k dispoz�cii"
+ 
+-#: sunrpc/clnt_perr.c:194
++#: sunrpc/clnt_perr.c:226
+ msgid "RPC: Program not registered"
+ msgstr "RPC: Program nie je registrovan�"
+ 
+-#: sunrpc/clnt_perr.c:178
++#: sunrpc/clnt_perr.c:194
+ msgid "RPC: Program unavailable"
+ msgstr "RPC: Program nie je k dispoz�cii"
+ 
+-#: sunrpc/clnt_perr.c:180
++#: sunrpc/clnt_perr.c:198
+ msgid "RPC: Program/version mismatch"
+ msgstr "RPC: Nes�hlas� program alebo verzia"
+ 
+-#: sunrpc/clnt_perr.c:186
++#: sunrpc/clnt_perr.c:210
+ msgid "RPC: Remote system error"
+ msgstr "RPC: Chyba vzdialen�ho syst�mu"
+ 
+-#: sunrpc/clnt_perr.c:184
++#: sunrpc/clnt_perr.c:206
+ msgid "RPC: Server can't decode arguments"
+ msgstr "RPC: Server nem��e dek�dova� argumenty"
+ 
+-#: sunrpc/clnt_perr.c:162
++#: sunrpc/clnt_perr.c:163
+ msgid "RPC: Success"
+ msgstr "RPC: �spech"
+ 
+-#: sunrpc/clnt_perr.c:172
++#: sunrpc/clnt_perr.c:182
+ msgid "RPC: Timed out"
+ msgstr "RPC: �asova� vypr�al"
+ 
+-#: sunrpc/clnt_perr.c:170
++#: sunrpc/clnt_perr.c:178
+ msgid "RPC: Unable to receive"
+ msgstr "RPC: Nie je mo�n� prij�ma�"
+ 
+-#: sunrpc/clnt_perr.c:168
++#: sunrpc/clnt_perr.c:174
+ msgid "RPC: Unable to send"
+ msgstr "RPC: Nie je mo�n� vysiela�"
+ 
+-#: sunrpc/clnt_perr.c:188
++#: sunrpc/clnt_perr.c:214
+ msgid "RPC: Unknown host"
+ msgstr "RPC: Nezn�my po��ta�"
+ 
+-#: sunrpc/clnt_perr.c:190
++#: sunrpc/clnt_perr.c:218
+ msgid "RPC: Unknown protocol"
+ msgstr "RPC: Nezn�my protokol"
+ 
+-#: nis/nis_print.c:184
++#: nis/nis_print.c:185
+ #, c-format
+ msgid "RSA (%d bits)\n"
+ msgstr "RSA (%d bitov)\n"
+ 
+-#: elf/dlsym.c:59 elf/dlvsym.c:62
++#: elf/dl-sym.c:68 elf/dl-sym.c:125
+ msgid "RTLD_NEXT used in code not dynamically loaded"
+ msgstr "RTLD_NEXT je pou�it� pre k�d, ktor� nie je dynamicky zaveden�"
+ 
+-#: elf/sprof.c:88
++#: elf/sprof.c:84
+ msgid "Read and display shared object profiling data"
+ msgstr "Pre��ta� a vyp�sa� profilovacie �daje zdie�an�ho objektu"
+ 
+-#: nscd/nscd.c:78
++#: nscd/nscd.c:84
+ msgid "Read configuration data from NAME"
+ msgstr "Na��ta� �daje o konfigur�cii z N�ZOV"
+ 
+ #. TRANS An attempt was made to modify something on a read-only file system.
+-#: stdio-common/../sysdeps/gnu/errlist.c:218
++#: stdio-common/../sysdeps/gnu/errlist.c:219
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:60
+ msgid "Read-only file system"
+ msgstr "S�borov� syst�m dovo�uje len ��tanie"
+ 
+-#: string/strsignal.c:66
++#: string/strsignal.c:67
+ #, c-format
+ msgid "Real-time signal %d"
+ msgstr "Sign�l re�lneho �asu %d"
+ 
+-#: posix/regex.c:1027
++#: posix/regex.c:1129
+ msgid "Regular expression too big"
+ msgstr "Regul�rny v�raz pr�li� ve�k�"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:810
++#: stdio-common/../sysdeps/gnu/errlist.c:829
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:170
+ msgid "Remote I/O error"
+ msgstr "Vzdialen� V/V chyba"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:766
++#: stdio-common/../sysdeps/gnu/errlist.c:785
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:112
+ msgid "Remote address changed"
+ msgstr "Vzdialen� adresa sa zmenila"
+ 
+-#: inet/ruserpass.c:162
++#: inet/ruserpass.c:182
+ msgid "Remove password or make file unreadable by others."
+ msgstr "Odstr��te heslo alebo zak�te ��tanie s�boru ostatn�mi."
+ 
+-#: elf/sprof.c:537
++#: elf/cache.c:394
++#, c-format
++msgid "Renaming of %s to %s failed"
++msgstr "Premenovanie %s na %s zlyhalo"
++
++#: elf/sprof.c:532
+ #, c-format
+ msgid "Reopening shared object `%s' failed"
+ msgstr "Znovuotvorenie zdie�an�ho objektu `%s' zlyhalo"
+ 
+-#: nis/nis_print.c:170
++#: nis/nis_print.c:171
+ msgid "Replicate :\n"
+ msgstr "Replika      :\n"
+ 
+-#: argp/argp-help.c:1638
++#: argp/argp-help.c:1639
+ #, c-format
+ msgid "Report bugs to %s.\n"
+ msgstr "Chyby hl�ste na adrese %s.\n"
+ 
+-#: catgets/gencat.c:223 db2/makedb.c:229 iconv/iconv_prog.c:280
+-#: locale/programs/locale.c:254 locale/programs/localedef.c:389
++#: catgets/gencat.c:233 debug/pcprofiledump.c:181 iconv/iconv_prog.c:337
++#: locale/programs/locale.c:256 locale/programs/localedef.c:297
++#: malloc/memusagestat.c:602
+ msgid "Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n"
+ msgstr "Chyby hl�ste na adrese <bugs@gnu.org> - pou�ite skript `glibcbug'.\n"
+ 
+-#: nis/ypclnt.c:765
++#: nis/ypclnt.c:788
+ msgid "Request arguments bad"
+ msgstr "Chybn� argumenty �iadosti"
+ 
+-#: resolv/herror.c:73
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:171
++msgid "Reserved for future use"
++msgstr "Rezervovan� pre bud�ce pou�itie"
++
++#: resolv/herror.c:67
+ msgid "Resolver Error 0 (no error)"
+ msgstr "Chyba resolvera 0 (�iadna chyba)"
+ 
+-#: resolv/herror.c:117
++#: resolv/herror.c:107
+ msgid "Resolver internal error"
+ msgstr "Vn�torn� chyba resolvera"
+ 
+@@ -2160,11 +3248,11 @@
+ #. TRANS deadlock situation.  The system does not guarantee that it will notice
+ #. TRANS all such situations.  This error means you got lucky and the system
+ #. TRANS noticed; it might just hang.  @xref{File Locks}, for an example.
+-#: stdio-common/../sysdeps/gnu/errlist.c:97
++#: stdio-common/../sysdeps/gnu/errlist.c:98
+ msgid "Resource deadlock avoided"
+ msgstr "Bolo zabr�nen� vz�jomn�mu zablokovaniu"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:54
++#: stdio-common/../sysdeps/unix/siglist.c:55 sysdeps/generic/siglist.h:74
+ msgid "Resource lost"
+ msgstr "Zdroj bol straten�"
+ 
+@@ -2197,76 +3285,83 @@
+ #. TRANS so usually an interactive program should report the error to the user
+ #. TRANS and return to its command loop.
+ #. TRANS @end itemize
+-#: stdio-common/../sysdeps/gnu/errlist.c:279
++#: stdio-common/../sysdeps/gnu/errlist.c:280
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:41
+ msgid "Resource temporarily unavailable"
+ msgstr "Zdroj je do�asne nepr�stupn�"
+ 
+-#: nis/nis_error.c:47
+-msgid "Results Sent to callback proc"
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:64
++msgid "Result too large"
++msgstr "V�sledok je pr�li� ve�k�"
++
++#: nis/nis_error.c:48
++msgid "Results sent to callback proc"
+ msgstr "V�sledky poslan� proced�re sp�tn�ho volania"
+ 
+-#: elf/sprof.c:91
++#: elf/sprof.c:87
+ msgid "SHOBJ [PROFDATA]"
+ msgstr "ZDIE�_OBJEKT [PROF_�DAJE]"
+ 
+-#: nis/nis_print.c:33
++#: nis/nis_print.c:34
+ msgid "SUNYP"
+ msgstr "SUNYP"
+ 
+-#: nis/nis_print.c:265
++#: nis/nis_print.c:266
+ #, c-format
+ msgid "Search Path         : %s\n"
+ msgstr "Preh�ad�van� cesta     : %s\n"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:36
+-#: sysdeps/unix/sysv/linux/siglist.h:31
++#: stdio-common/../sysdeps/unix/siglist.c:37 sysdeps/generic/siglist.h:38
+ msgid "Segmentation fault"
+ msgstr "Chyba segment�cie"
+ 
+-#: nis/nis_error.c:35
++#: nis/nis_error.c:36
+ msgid "Server busy, try again"
+ msgstr "Server zanepr�zdnen�, sk�ste znovu"
+ 
+-#: nis/nis_error.c:41
++#: nis/nis_error.c:42
+ msgid "Server out of memory"
+ msgstr "Vy�erpan� pam� servera"
+ 
+-#: sunrpc/clnt_perr.c:277
++#: sunrpc/clnt_perr.c:336
+ msgid "Server rejected credential"
+ msgstr "Server odmietol opr�vnenie"
+ 
+-#: sunrpc/clnt_perr.c:281
++#: sunrpc/clnt_perr.c:344
+ msgid "Server rejected verifier"
+ msgstr "Server odmietol overenie"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:38
++#: posix/../sysdeps/posix/gai_strerror.c:39
+ msgid "Servname not supported for ai_socktype"
+ msgstr "Servname nie je pre ai_socktype podporovan�"
+ 
+-#: argp/argp-parse.c:89
++#: argp/argp-parse.c:95
+ msgid "Set the program name"
+ msgstr "Nastavi� n�zov programu"
+ 
+-#: nscd/nscd.c:82
++#: nscd/nscd.c:88
+ msgid "Shut the server down"
+ msgstr "Zastavi� server"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:25
++#: stdio-common/../sysdeps/unix/siglist.c:26
+ msgid "Signal 0"
+ msgstr "Sign�l 0"
+ 
+ #. TRANS A file that isn't a socket was specified when a socket is required.
+-#: stdio-common/../sysdeps/gnu/errlist.c:311
++#: stdio-common/../sysdeps/gnu/errlist.c:312
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:125
+ msgid "Socket operation on non-socket"
+ msgstr "Socketov� oper�cia na objekte, ktor� nie je socket"
+ 
+ #. TRANS The socket type is not supported.
+-#: stdio-common/../sysdeps/gnu/errlist.c:340
++#: stdio-common/../sysdeps/gnu/errlist.c:341
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:151
+ msgid "Socket type not supported"
+ msgstr "Typ socketu nie je podporovan�"
+ 
+ #. TRANS A network connection was aborted locally.
+-#: stdio-common/../sysdeps/gnu/errlist.c:394
++#: stdio-common/../sysdeps/gnu/errlist.c:395
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:160
+ msgid "Software caused connection abort"
+ msgstr "Software sp�sobil zru�enie spojenia"
+ 
+@@ -2274,15 +3369,16 @@
+ msgid "Sorry. You are not root\n"
+ msgstr "Bohu�ia� - nie ste superu��vate�\n"
+ 
+-#: locale/programs/localedef.c:97
++#: locale/programs/localedef.c:95
+ msgid "Source definitions are found in FILE"
+ msgstr "Zdrojov� defin�cie sa nach�dzaj� v S�BORe"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:746
++#: stdio-common/../sysdeps/gnu/errlist.c:765
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:99
+ msgid "Srmount error"
+ msgstr "Chyba srmount"
+ 
+-#: sysdeps/unix/sysv/linux/siglist.h:59
++#: sysdeps/generic/siglist.h:66
+ msgid "Stack fault"
+ msgstr "Chyba z�sobn�ka"
+ 
+@@ -2290,73 +3386,75 @@
+ #. TRANS system which is due to file system rearrangements on the server host.
+ #. TRANS Repairing this condition usually requires unmounting and remounting
+ #. TRANS the NFS file system on the local host.
+-#: stdio-common/../sysdeps/gnu/errlist.c:506
++#: stdio-common/../sysdeps/gnu/errlist.c:507
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:181
+ msgid "Stale NFS file handle"
+ msgstr "Zastaral� odkaz na NFS s�bor"
+ 
+-#: nscd/nscd.c:81
++#: nscd/nscd.c:87
+ msgid "Start NUMBER threads"
+ msgstr "Spusti� PO�ET vl�kien"
+ 
+-#: nis/nis_print.c:357
++#: nis/nis_print.c:362
+ #, c-format
+ msgid "Status            : %s\n"
+ msgstr "Stav                 : %s\n"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:43
+-#: sysdeps/unix/sysv/linux/siglist.h:37
++#: stdio-common/../sysdeps/unix/siglist.c:44 sysdeps/generic/siglist.h:44
+ msgid "Stopped"
+ msgstr "Zastaven�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:42
+-#: sysdeps/unix/sysv/linux/siglist.h:36
++#: stdio-common/../sysdeps/unix/siglist.c:43 sysdeps/generic/siglist.h:43
+ msgid "Stopped (signal)"
+ msgstr "Zastaven� (sign�l)"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:46
+-#: sysdeps/unix/sysv/linux/siglist.h:40
++#: stdio-common/../sysdeps/unix/siglist.c:47 sysdeps/generic/siglist.h:47
+ msgid "Stopped (tty input)"
+ msgstr "Zastaven� (vstup z termin�lu)"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:47
+-#: sysdeps/unix/sysv/linux/siglist.h:41
++#: stdio-common/../sysdeps/unix/siglist.c:48 sysdeps/generic/siglist.h:48
+ msgid "Stopped (tty output)"
+ msgstr "Zastaven� (v�stup na termin�l)"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:790
++#: stdio-common/../sysdeps/gnu/errlist.c:809
+ msgid "Streams pipe error"
+ msgstr "Chyba r�ry pr�dov"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:794
++#: stdio-common/../sysdeps/gnu/errlist.c:813
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:165
+ msgid "Structure needs cleaning"
+ msgstr "�trukt�ra potrebuje opravu"
+ 
+-#: nis/nis_error.c:28 nis/ypclnt.c:763 nis/ypclnt.c:837 posix/regex.c:1012
+-#: stdio-common/../sysdeps/gnu/errlist.c:19
++#: nis/nis_error.c:29 nis/ypclnt.c:786 nis/ypclnt.c:860 posix/regex.c:1084
++#: stdio-common/../sysdeps/gnu/errlist.c:20
+ msgid "Success"
+ msgstr "�spech"
+ 
++#: nss/getent.c:703
++msgid "Supported databases:"
++msgstr "Podporovan� datab�zy:"
++
+ #: locale/programs/localedef.c:106
+ msgid "Suppress warnings and information messages"
+ msgstr "Potla�i� varovn� a informa�n� spr�vy"
+ 
+-#: locale/programs/localedef.c:96
++#: locale/programs/localedef.c:94
+ msgid "Symbolic character names defined in FILE"
+ msgstr "Symbolick� n�zvy znakov s� definovan� v S�BORe"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:40
++#: posix/../sysdeps/posix/gai_strerror.c:41
+ msgid "System error"
+ msgstr "Chyba syst�mu"
+ 
+-#: locale/programs/locale.c:63
++#: locale/programs/locale.c:65
+ msgid "System information:"
+ msgstr "Syst�mov� inform�cie:"
+ 
+-#: nis/ypclnt.c:843
++#: nis/ypclnt.c:866
+ msgid "System resource allocation failure"
+ msgstr "Pridelenie syst�mov�ch zdrojov zlyhalo"
+ 
+-#: locale/programs/localedef.c:384
++#: locale/programs/localedef.c:292
+ #, c-format
+ msgid ""
+ "System's directory for character maps : %s\n"
+@@ -2369,21 +3467,28 @@
+ "                      cestu locale    : %s\n"
+ "%s"
+ 
+-#: nis/nis_print.c:117
++#: nscd/nscd.c:90
++msgid "TABLE"
++msgstr "TABU�KA"
++
++#: nis/nis_print.c:118
+ msgid "TABLE\n"
+ msgstr "TABU�KA\n"
+ 
+-#: nis/nis_print.c:262
++#: nscd/nscd.c:92
++msgid "TABLE,yes"
++msgstr "TABU�KA,�no"
++
++#: nis/nis_print.c:263
+ #, c-format
+ msgid "Table Type          : %s\n"
+ msgstr "Typ tabu�ky            : %s\n"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:31
++#: posix/../sysdeps/posix/gai_strerror.c:32
+ msgid "Temporary failure in name resolution"
+ msgstr "Do�asn� chyba pri rie�en� n�zvu"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:40
+-#: sysdeps/unix/sysv/linux/siglist.h:34
++#: stdio-common/../sysdeps/unix/siglist.c:41 sysdeps/generic/siglist.h:41
+ msgid "Terminated"
+ msgstr "Ukon�en�"
+ 
+@@ -2392,52 +3497,58 @@
+ #. TRANS debugger to run a program is considered having it open for writing and
+ #. TRANS will cause this error.  (The name stands for ``text file busy''.)  This
+ #. TRANS is not an error in the GNU system; the text is copied as necessary.
+-#: stdio-common/../sysdeps/gnu/errlist.c:197
++#: stdio-common/../sysdeps/gnu/errlist.c:198
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:56
+ msgid "Text file busy"
+ msgstr "Spustite�n� s�bor je pou��van�"
+ 
+-#: iconv/iconv_prog.c:536
++#: iconv/iconv_prog.c:627
+ msgid ""
+ "The following list contain all the coded character sets known.  This does\n"
+ "not necessarily mean that all combinations of these names can be used for\n"
+ "the FROM and TO command line parameters.  One coded character set can be\n"
+ "listed with several different names (aliases).\n"
+-"  Some of the names are no plain strings but instead regular expressions and\n"
+-"they match a variety of names which can be given as parameters to the\n"
+-"program.\n"
+ "\n"
+ "  "
+ msgstr ""
+ "Nasleduj�ci zoznam obsahuje v�etky zn�me znakov� sady. To nutne neznamen�,\n"
+ "�e v�etky kombin�cie t�chto n�zvov m��u by� pou�it� pre argumenty Z a DO.\n"
+ "Jedna sada znakov m��e by� uveden� pod viacer�mi n�zvami (aliasmi).\n"
+-"  Niektor� z n�zvov nie s� oby�ajn� re�azce, ale regul�rne v�razy, ktor�\n"
+-"�pecifikuj� mo�n� parametre programu.\n"
+ "\n"
+ "  "
+ 
+-#: nis/nis_print.c:223
++#: sunrpc/rpc_main.c:1364
++msgid "This implementation doesn't support newstyle or MT-safe code!\n"
++msgstr "T�to implement�cia nepodporuje nov� �t�l alebo MT-bezpe�n� k�d!\n"
++
++#: nis/nis_print.c:224
+ msgid "Time to live : "
+ msgstr "�ivotnos�       : "
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:662
++#: stdio-common/../sysdeps/gnu/errlist.c:681
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:92
+ msgid "Timer expired"
+ msgstr "�asova� vypr�al"
+ 
+-#: nis/nis_error.c:55
+-msgid "Too Many Attributes"
++#: malloc/memusagestat.c:54
++msgid "Title string used in output graphic"
++msgstr "Titulok pou�it� pre v�stupn� graf"
++
++#: nis/nis_error.c:56
++msgid "Too many attributes"
+ msgstr "Prive�a atrib�tov"
+ 
+ #. TRANS Too many levels of symbolic links were encountered in looking up a file name.
+ #. TRANS This often indicates a cycle of symbolic links.
+-#: stdio-common/../sysdeps/gnu/errlist.c:457
++#: stdio-common/../sysdeps/gnu/errlist.c:458
+ msgid "Too many levels of symbolic links"
+ msgstr "Prive�a �rovn� symbolick�ch odkazov"
+ 
+ #. TRANS Too many links; the link count of a single file would become too large.
+ #. TRANS @code{rename} can cause this error if the file being renamed already has
+ #. TRANS as many links as it can take (@pxref{Renaming Files}).
+-#: stdio-common/../sysdeps/gnu/errlist.c:225
++#: stdio-common/../sysdeps/gnu/errlist.c:226
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:61
+ msgid "Too many links"
+ msgstr "Prive�a odkazov"
+ 
+@@ -2448,54 +3559,57 @@
+ #. TRANS limit that can usually be increased.  If you get this error, you might
+ #. TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
+ #. TRANS @pxref{Limits on Resources}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:175
++#: stdio-common/../sysdeps/gnu/errlist.c:176
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:54
+ msgid "Too many open files"
+ msgstr "Prive�a otvoren�ch s�borov"
+ 
+ #. TRANS There are too many distinct file openings in the entire system.  Note
+ #. TRANS that any number of linked channels count as just one file opening; see
+ #. TRANS @ref{Linked Channels}.  This error never occurs in the GNU system.
+-#: stdio-common/../sysdeps/gnu/errlist.c:182
++#: stdio-common/../sysdeps/gnu/errlist.c:183
+ msgid "Too many open files in system"
+ msgstr "Prive�a otvoren�ch s�borov v syst�me"
+ 
+ #. TRANS This means that the per-user limit on new process would be exceeded by
+ #. TRANS an attempted @code{fork}.  @xref{Limits on Resources}, for details on
+ #. TRANS the @code{RLIMIT_NPROC} limit.
+-#: stdio-common/../sysdeps/gnu/errlist.c:487
++#: stdio-common/../sysdeps/gnu/errlist.c:488
+ msgid "Too many processes"
+ msgstr "Prive�a procesov"
+ 
+ #. TRANS ???
+-#: stdio-common/../sysdeps/gnu/errlist.c:439
++#: stdio-common/../sysdeps/gnu/errlist.c:440
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:174
+ msgid "Too many references: cannot splice"
+ msgstr "Prive�a odkazov - nie je mo�n� rozdeli�"
+ 
+ #. TRANS The file quota system is confused because there are too many users.
+ #. TRANS @c This can probably happen in a GNU system when using NFS.
+-#: stdio-common/../sysdeps/gnu/errlist.c:493
++#: stdio-common/../sysdeps/gnu/errlist.c:494
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:124
+ msgid "Too many users"
+ msgstr "Prive�a pou��vate�ov"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:30
+-#: sysdeps/unix/sysv/linux/siglist.h:26
++#: stdio-common/../sysdeps/unix/siglist.c:31 sysdeps/generic/siglist.h:33
+ msgid "Trace/breakpoint trap"
+ msgstr "Trasovacie/ladiace preru�enie"
+ 
+-#: posix/regex.c:1017
++#: posix/regex.c:1099
+ msgid "Trailing backslash"
+ msgstr "Koncov� sp�tn� lom�tko"
+ 
+ #. TRANS In the GNU system, opening a file returns this error when the file is
+ #. TRANS translated by a program and the translator program dies while starting
+ #. TRANS up, before it has connected to the file.
+-#: stdio-common/../sysdeps/gnu/errlist.c:596
++#: stdio-common/../sysdeps/gnu/errlist.c:615
+ msgid "Translator died"
+ msgstr "Prekladac� program skon�il"
+ 
+ #. TRANS You tried to connect a socket that is already connected.
+ #. TRANS @xref{Connecting}.
+-#: stdio-common/../sysdeps/gnu/errlist.c:414
++#: stdio-common/../sysdeps/gnu/errlist.c:415
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:163
+ msgid "Transport endpoint is already connected"
+ msgstr "Koncov� komunika�n� bod je u� spojen�"
+ 
+@@ -2503,139 +3617,139 @@
+ #. TRANS try to transmit data over a socket, without first specifying a
+ #. TRANS destination for the data.  For a connectionless socket (for datagram
+ #. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead.
+-#: stdio-common/../sysdeps/gnu/errlist.c:422
++#: stdio-common/../sysdeps/gnu/errlist.c:423
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:164
+ msgid "Transport endpoint is not connected"
+ msgstr "Koncov� komunika�n� bod nie je spojen�"
+ 
+-#: argp/argp-help.c:1610
++#: argp/argp-help.c:1611
+ #, c-format
+ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+ msgstr "Pou�ite `%s --help' alebo `%s --usage' pre viac inform�ci�.\n"
+ 
+-#: inet/rcmd.c:143
+-#, c-format
+-msgid "Trying %s...\n"
+-msgstr "Sk��am %s...\n"
+-
+-#: nis/nis_print.c:163
++#: nis/nis_print.c:164
+ #, c-format
+ msgid "Type : %s\n"
+ msgstr "Typ  : %s\n"
+ 
+-#: nis/nis_print.c:47
++#: nis/nis_print.c:48
+ msgid "UNKNOWN"
+ msgstr "NEZNAMY"
+ 
+-#: nis/nis_error.c:72
++#: nis/nis_error.c:73
+ msgid "Unable to authenticate NIS+ client"
+ msgstr "Nie je mo�n� overi� toto�nos� NIS+ klienta"
+ 
+-#: nis/nis_error.c:71
++#: nis/nis_error.c:72
+ msgid "Unable to authenticate NIS+ server"
+ msgstr "Nie je mo�n� overi� toto�nos� NIS+ servera"
+ 
+-#: nis/nis_error.c:46
++#: nis/nis_error.c:47
+ msgid "Unable to create callback"
+ msgstr "Nie je mo�n� vytvori� sp�tn� volanie"
+ 
+-#: nis/nis_error.c:74
++#: nis/nis_error.c:75
+ msgid "Unable to create process on server"
+ msgstr "Nie je mo�n� vytvori� proces na serveri"
+ 
+-#: nis/nis_print.c:190
++#: nis/nis_print.c:191
+ #, c-format
+ msgid "Unknown (type = %d, bits = %d)\n"
+ msgstr "Nezn�me (typ = %d, bitov = %d)\n"
+ 
+-#: inet/ruserpass.c:248
++#: inet/ruserpass.c:274
+ #, c-format
+ msgid "Unknown .netrc keyword %s"
+ msgstr "Nezn�me k���ov� slovo v .netrc: %s"
+ 
+-#: nis/ypclnt.c:797
++#: elf/../sysdeps/generic/readelflib.c:69
++#, c-format
++msgid "Unknown ELFCLASS in file %s.\n"
++msgstr "Nezn�ma ELFCLASS v s�bore %s.\n"
++
++#: nis/ypclnt.c:820
+ msgid "Unknown NIS error code"
+ msgstr "Nezn�my chybov� k�d NIS"
+ 
+-#: nss/getent.c:505
++#: nss/getent.c:771
+ #, c-format
+ msgid "Unknown database: %s\n"
+ msgstr "Nezn�ma datab�za %s\n"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:51
++#: posix/../sysdeps/posix/gai_strerror.c:52
+ msgid "Unknown error"
+ msgstr "Nezn�ma chyba"
+ 
+ #: string/../sysdeps/generic/_strerror.c:48
+-#: string/../sysdeps/mach/_strerror.c:86
+-#: sysdeps/mach/hurd/mips/dl-machine.c:82
++#: string/../sysdeps/mach/_strerror.c:88
++#: sysdeps/mach/hurd/mips/dl-machine.c:83
+ msgid "Unknown error "
+ msgstr "Nezn�ma chyba "
+ 
+-#: resolv/herror.c:74
++#: resolv/herror.c:68
+ msgid "Unknown host"
+ msgstr "Nezn�my po��ta�"
+ 
+-#: nis/nis_error.c:34
++#: nis/nis_error.c:35
+ msgid "Unknown object"
+ msgstr "Nezn�my objekt"
+ 
+-#: nscd/nscd_conf.c:181
++#: nscd/nscd_conf.c:187
+ #, c-format
+ msgid "Unknown option: %s %s %s"
+ msgstr "Nezn�ma vo�ba: %s %s %s"
+ 
+-#: resolv/herror.c:120
++#: resolv/herror.c:110
+ msgid "Unknown resolver error"
+ msgstr "Nezn�ma chyba resolvera"
+ 
+-#: resolv/herror.c:76
++#: resolv/herror.c:70
+ msgid "Unknown server error"
+ msgstr "Nezn�ma chyba servera"
+ 
+-#: string/strsignal.c:70
++#: string/strsignal.c:71
+ #, c-format
+ msgid "Unknown signal %d"
+ msgstr "Nezn�my sign�l %d"
+ 
+-#: misc/error.c:107
++#: misc/error.c:114 timezone/zic.c:384
+ msgid "Unknown system error"
+ msgstr "Nezn�ma chyba syst�mu"
+ 
+-#: nis/ypclnt.c:845
++#: nis/ypclnt.c:868
+ msgid "Unknown ypbind error"
+ msgstr "Nezn�ma chyba ypbind"
+ 
+-#: posix/regex.c:1020
++#: posix/regex.c:1108
+ msgid "Unmatched ( or \\("
+ msgstr "Nep�rov� ( or \\("
+ 
+-#: posix/regex.c:1028
++#: posix/regex.c:1132
+ msgid "Unmatched ) or \\)"
+ msgstr "Nep�rov� ) or \\)"
+ 
+-#: posix/regex.c:1019
++#: posix/regex.c:1105
+ msgid "Unmatched [ or [^"
+ msgstr "Nep�rov� [ or [^"
+ 
+-#: posix/regex.c:1021
++#: posix/regex.c:1111
+ msgid "Unmatched \\{"
+ msgstr "Nep�rov� \\{"
+ 
+-#: posix/getconf.c:692
++#: posix/getconf.c:819
+ #, c-format
+ msgid "Unrecognized variable `%s'"
+ msgstr "Nerozpoznan� premenn� `%s'"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:41
+-#: sysdeps/unix/sysv/linux/siglist.h:35
++#: stdio-common/../sysdeps/unix/siglist.c:42 sysdeps/generic/siglist.h:42
+ msgid "Urgent I/O condition"
+ msgstr "Urgentn� V/V stav"
+ 
+-#: argp/argp-help.c:1567
++#: argp/argp-help.c:1568
+ msgid "Usage:"
+ msgstr "Pou�itie:"
+ 
+-#: posix/getconf.c:604
++#: posix/getconf.c:731
+ #, c-format
+ msgid "Usage: %s variable_name [pathname]\n"
+ msgstr "Pou�itie: %s meno_premennej [cesta]\n"
+@@ -2644,1031 +3758,1117 @@
+ msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
+ msgstr "Pou�itie: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verzie ]\n"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:55
+-#: sysdeps/unix/sysv/linux/siglist.h:48
++#: elf/ldconfig.c:132
++msgid "Use CACHE as cache file"
++msgstr "Pou�i� CACHE ako cache s�bor"
++
++#: elf/ldconfig.c:133
++msgid "Use CONF as configuration file"
++msgstr "Pou�i� CONF ako konfigura�n� s�bor"
++
++#: nscd/nscd.c:92
++msgid "Use separate cache for each user"
++msgstr "Pou�i� samostatn� cache pre ka�d�ho pou��vate�a"
++
++#: stdio-common/../sysdeps/unix/siglist.c:56 sysdeps/generic/siglist.h:55
+ msgid "User defined signal 1"
+ msgstr "Pou��vate�om definovan� sign�l 1"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:56
+-#: sysdeps/unix/sysv/linux/siglist.h:49
++#: stdio-common/../sysdeps/unix/siglist.c:57 sysdeps/generic/siglist.h:56
+ msgid "User defined signal 2"
+ msgstr "Pou��vate�om definovan� sign�l 2"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:654
++#: stdio-common/../sysdeps/gnu/errlist.c:673
++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:109
+ msgid "Value too large for defined data type"
+ msgstr "Hodnota je pre dan� d�tov� typ prive�k�"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:51
+-#: sysdeps/unix/sysv/linux/siglist.h:45
++#: stdio-common/../sysdeps/unix/siglist.c:52 sysdeps/generic/siglist.h:52
+ msgid "Virtual timer expired"
+ msgstr "Vypr�al virtu�lny �asova�"
+ 
+-#: timezone/zic.c:1899
++#: timezone/zic.c:1926
+ msgid "Wild result from command execution"
+ msgstr "�udn� v�sledok vykonania programu"
+ 
+-#: stdio-common/../sysdeps/unix/siglist.c:53
+-#: sysdeps/unix/sysv/linux/siglist.h:47
++#: stdio-common/../sysdeps/unix/siglist.c:54 sysdeps/generic/siglist.h:54
+ msgid "Window changed"
+ msgstr "Okno sa zmenilo"
+ 
+-#: locale/programs/locale.c:67
++#: locale/programs/locale.c:69
+ msgid "Write names of available charmaps"
+ msgstr "Vyp�sa� n�zvy dostupn�ch znakov�ch s�d"
+ 
+-#: locale/programs/locale.c:65
++#: locale/programs/locale.c:67
+ msgid "Write names of available locales"
+ msgstr "Vyp�sa� n�zvy dostupn�ch n�rodn�ch prostred�"
+ 
+-#: locale/programs/locale.c:69
++#: locale/programs/locale.c:71
+ msgid "Write names of selected categories"
+ msgstr "Vyp�sa� n�zvy vybran�ch kateg�ri�"
+ 
+-#: locale/programs/locale.c:70
++#: locale/programs/locale.c:72
+ msgid "Write names of selected keywords"
+ msgstr "Vyp�sa� n�zvy vybran�ch k���ov�ch slov"
+ 
+-#: catgets/gencat.c:110 db2/makedb.c:59
++#: catgets/gencat.c:115
+ msgid "Write output to file NAME"
+ msgstr "Zap�sa� v�stup do s�boru S�BOR"
+ 
+-#: catgets/gencat.c:241 db2/makedb.c:247 elf/sprof.c:365
+-#: iconv/iconv_prog.c:299 locale/programs/locale.c:272
+-#: locale/programs/localedef.c:408 nscd/nscd.c:228 nss/getent.c:70
+-#: posix/getconf.c:629
++#: elf/cache.c:366 elf/cache.c:375 elf/cache.c:379
++msgid "Writing of cache data failed"
++msgstr "Z�pi �dajov do cache zlyhal"
++
++#: elf/cache.c:383
++msgid "Writing of cache data failed."
++msgstr "Z�pi �dajov do cache zlyhal."
++
++#: catgets/gencat.c:251 elf/ldconfig.c:269 elf/sprof.c:361
++#: iconv/iconv_prog.c:356 locale/programs/locale.c:274
++#: locale/programs/localedef.c:316 nscd/nscd.c:292 nscd/nscd_nischeck.c:95
++#: nss/getent.c:68 posix/getconf.c:756
+ #, c-format
+ msgid "Written by %s.\n"
+ msgstr "Autor: %s.\n"
+ 
+-#: stdio-common/../sysdeps/gnu/errlist.c:818
++#: stdio-common/../sysdeps/gnu/errlist.c:837
+ msgid "Wrong medium type"
+ msgstr "Chybn� typ m�dia"
+ 
+-#: nis/nis_print.c:39
++#: nis/nis_print.c:40
+ msgid "X500"
+ msgstr "X500"
+ 
+-#: nis/nis_print.c:43
++#: nis/nis_print.c:44
+ msgid "XCHS"
+ msgstr "XCHS"
+ 
+-#: nis/ypclnt.c:185
++#: nis/ypclnt.c:174
+ #, c-format
+ msgid "YPBINDPROC_DOMAIN: %s\n"
+ msgstr "YPBINDPROC_DOMAIN: %s\n"
+ 
+-#: nis/nis_error.c:70
++#: nis/nis_error.c:71
+ msgid "Yes, 42 is the meaning of life"
+ msgstr "�no, 42 je v�znam �ivota"
+ 
+ #. TRANS You did @strong{what}?
+-#: stdio-common/../sysdeps/gnu/errlist.c:608
++#: stdio-common/../sysdeps/gnu/errlist.c:627
+ msgid "You really blew it this time"
+ msgstr "Tentokr�t si to skuto�ne poondial"
+ 
+-#: timezone/zic.c:1063
++#: timezone/zic.c:1088
+ msgid "Zone continuation line end time is not after end time of previous line"
+ msgstr "Koncov� �as pokra�ovacieho riadku z�ny nie je v��� ako koncov� �as predch�dzaj�ceho riadku"
+ 
+-#: iconv/iconv_prog.c:70
++#: iconv/iconv_prog.c:73
+ msgid "[FILE...]"
+ msgstr "[S�BOR...]"
+ 
+-#: locale/programs/charmap.c:481 locale/programs/locfile.c:471
+-#: locale/programs/repertoire.c:278
++#: debug/pcprofiledump.c:59
++msgid "[FILE]"
++msgstr "[S�BOR]"
++
++#: sunrpc/pmap_clnt.c:72
++msgid "__get_myaddress: ioctl (get interface configuration)"
++msgstr "__get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)"
++
++#: locale/programs/ld-collate.c:417
++#, c-format
++msgid "`%.*s' already defined as collating element"
++msgstr "`%.*s' bol u� definovan� ako element triedenia"
++
++#: locale/programs/ld-collate.c:410
++#, c-format
++msgid "`%.*s' already defined as collating symbol"
++msgstr "`%.*s' bol u� definovan� ako symbol triedenia"
++
++#: locale/programs/ld-collate.c:394
++#, c-format
++msgid "`%.*s' already defined in charmap"
++msgstr "`%.*s' bol u� definovan� v znakovej mape"
++
++#: locale/programs/ld-collate.c:403
++#, c-format
++msgid "`%.*s' already defined in repertoire"
++msgstr "`%.*s' bol u� definovan� v reperto�ri"
++
++#: locale/programs/charmap.c:599 locale/programs/locfile.h:96
++#: locale/programs/repertoire.c:314
+ #, c-format
+ msgid "`%1$s' definition does not end with `END %1$s'"
+ msgstr "Defin�cia `%1$s' nekon�� `END %1$s'"
+ 
+-#: elf/sprof.c:766
++#: locale/programs/ld-collate.c:1268 locale/programs/ld-ctype.c:1454
+ #, c-format
+-msgid "`%s' is no correct profile data file for `%s'"
+-msgstr "`%s' nie s� spr�vne profilovacie �daje pre `%s'"
++msgid "`%s' and `%.*s' are no valid names for symbolic range"
++msgstr "`%s' a `%.*s' s� nepr�pustn� n�zvy pre symbolick� rozsah"
+ 
+-#: locale/programs/ld-monetary.c:369 locale/programs/ld-numeric.c:193
++#: elf/sprof.c:762
+ #, c-format
+-msgid "`-1' must be last entry in `%s' field in `%s' category"
+-msgstr "`-1' mus� by� posledn�m z�znamom v poli `%s' kateg�rie `%s'"
++msgid "`%s' is no correct profile data file for `%s'"
++msgstr "`%s' nie s� spr�vne profilovacie �daje pre `%s'"
+ 
+-#: locale/programs/ld-collate.c:1666
+-msgid "`...' must only be used in `...' and `UNDEFINED' entries"
+-msgstr "`...' m��e by� pou�it� iba v z�znamoch `...' a `UNDEFINED'"
+-
+-#: locale/programs/locfile.c:668
+-msgid "`from' expected after first argument to `collating-element'"
+-msgstr "`from' je o�ak�van� po prvom argumente `collating-element'"
+-
+-#: locale/programs/ld-collate.c:1118
+-msgid "`from' string in collation element declaration contains unknown character"
+-msgstr "`from' re�azec v deklar�cii elementu triedenia obsahuje nezn�my znak"
++#: locale/programs/ld-ctype.c:691
++msgid "`digit' category has not entries in groups of ten"
++msgstr "kateg�ria `digit' neobsahuje z�znamy v skupin�ch po desiatich"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:34
++#: posix/../sysdeps/posix/gai_strerror.c:35
+ msgid "ai_family not supported"
+ msgstr "ai_family nie je podporovan�"
+ 
+-#: posix/../sysdeps/posix/gai_strerror.c:39
++#: posix/../sysdeps/posix/gai_strerror.c:40
+ msgid "ai_socktype not supported"
+ msgstr "ai_socktype nie je podporovan�"
+ 
+-#: nscd/nscd.c:121
++#: nscd/nscd.c:130
+ msgid "already running"
+ msgstr "u� be��"
+ 
+-#: locale/programs/charmap.c:352 locale/programs/repertoire.c:152
++#: locale/programs/charmap.c:434 locale/programs/repertoire.c:184
+ #, c-format
+ msgid "argument to <%s> must be a single character"
+ msgstr "argument pre <%s> mus� by� jeden znak"
+ 
+-#: locale/programs/locfile.c:240
++#: locale/programs/locfile.c:124
+ #, c-format
+ msgid "argument to `%s' must be a single character"
+ msgstr "argument pre `%s' mus� by� jeden znak"
+ 
+-#: sunrpc/auth_unix.c:321
++#: sunrpc/auth_unix.c:311
+ msgid "auth_none.c - Fatal marshalling problem"
+ msgstr "auth_none.c - Fat�lna chyba marshallingu"
+ 
+-#: sunrpc/auth_unix.c:116 sunrpc/auth_unix.c:122 sunrpc/auth_unix.c:151
++#: sunrpc/auth_unix.c:106 sunrpc/auth_unix.c:112 sunrpc/auth_unix.c:142
+ msgid "authunix_create: out of memory\n"
+ msgstr "authunix_create: nedostatok pam�ti\n"
+ 
+-#: locale/programs/charmap.c:297 locale/programs/locfile.c:234
+-#: locale/programs/locfile.c:261 locale/programs/repertoire.c:144
++#: locale/programs/charmap.c:364 locale/programs/locfile.c:118
++#: locale/programs/locfile.c:145 locale/programs/repertoire.c:176
+ msgid "bad argument"
+ msgstr "chybn� argument"
+ 
+-#: inet/rcmd.c:318
++#: inet/rcmd.c:424
+ msgid "bad owner"
+ msgstr "chybn� vlastn�k"
+ 
+-#: timezone/zic.c:1185
++#: timezone/zic.c:1210
+ msgid "blank FROM field on Link line"
+ msgstr "pr�zdne pole OD v riadku Link"
+ 
+-#: timezone/zic.c:1189
++#: timezone/zic.c:1214
+ msgid "blank TO field on Link line"
+ msgstr "pr�zdne pole DO v riadku Link"
+ 
+-#: malloc/mcheck.c:208
++#: malloc/mcheck.c:291
+ msgid "block freed twice\n"
+ msgstr "blok uvo�nen� dvakr�t\n"
+ 
+-#: malloc/mcheck.c:211
++#: malloc/mcheck.c:294
+ msgid "bogus mcheck_status, library is buggy\n"
+ msgstr "pochybn� mcheck_status, kni�nica m� chyby\n"
+ 
+-#: sunrpc/pmap_rmt.c:185
++#: sunrpc/pmap_rmt.c:186
+ msgid "broadcast: ioctl (get interface configuration)"
+ msgstr "broadcast: ioctl (z�skanie konfigur�cie rozhrania)"
+ 
+-#: sunrpc/pmap_rmt.c:194
++#: sunrpc/pmap_rmt.c:195
+ msgid "broadcast: ioctl (get interface flags)"
+ msgstr "broadcast: ioctl (z�skanie nastaven� rozhrania)"
+ 
+-#: login/programs/request.c:167
+-msgid "buffer overflow"
+-msgstr "prete�enie vyrovn�vacej pam�ti"
+-
+-#: sunrpc/svc_udp.c:446
++#: sunrpc/svc_udp.c:528
+ msgid "cache_set: could not allocate new rpc_buffer"
+ msgstr "cache_set: nebolo mo�n� prideli� rpc vyrovn�vaciu pam�"
+ 
+-#: sunrpc/svc_udp.c:440
++#: sunrpc/svc_udp.c:522
+ msgid "cache_set: victim alloc failed"
+ msgstr "cache_set: obe� nen�jden�"
+ 
+-#: sunrpc/svc_udp.c:429
++#: sunrpc/svc_udp.c:511
+ msgid "cache_set: victim not found"
+ msgstr "cache_set: obe� nen�jden�"
+ 
+-#: timezone/zic.c:1726
++#: timezone/zic.c:1751
+ msgid "can't determine time zone abbreviation to use just after until time"
+ msgstr "nie je mo�n� n�js� skratku �asovej z�ny pre pou�itie hne� po koncovom �ase"
+ 
+-#: sunrpc/svc_simple.c:75
++#: sunrpc/svc_simple.c:76
+ #, c-format
+-msgid "can't reassign procedure number %d\n"
+-msgstr "nie je mo�n� znovu prideli� ��slo proced�ry %d\n"
++msgid "can't reassign procedure number %ld\n"
++msgstr "nie je mo�n� znovu prideli� ��slo proced�ry %ld\n"
++
++#: elf/dl-reloc.c:152
++msgid "can't restore segment prot after reloc"
++msgstr "nie je mo�n� obnovi� segment prot po relok�cii"
+ 
+-#: locale/programs/localedef.c:279
++#: locale/programs/localedef.c:487
+ #, c-format
+-msgid "cannot `stat' locale file `%s'"
+-msgstr "nie je mo�n� vykona� `stat' pre s�bor n�rodn�ho prostredia `%s'"
++msgid "cannot add already read locale `%s' a second time"
++msgstr "nie je mo�n� znovu prida� u� na��tan� prostredie `%s'"
+ 
+-#: elf/sprof.c:935 elf/sprof.c:987
++#: elf/dl-deps.c:470
++msgid "cannot allocate dependency list"
++msgstr "nie je mo�n� prideli� pam� pre zoznam z�vislost�"
++
++#: elf/dl-load.c:1031
++msgid "cannot allocate memory for program header"
++msgstr "nie je mo�n� prideli� pam� pre hlavi�ku programu"
++
++#: elf/dl-load.c:339
++msgid "cannot allocate name record"
++msgstr "nie je mo�n� prideli� pam� pre z�znam n�zvu"
++
++#: elf/sprof.c:930 elf/sprof.c:982
+ msgid "cannot allocate symbol data"
+ msgstr "nie je mo�n� prideli� pam� pre symbolick� �daje"
+ 
+-#: elf/sprof.c:719 elf/sprof.c:777
++#: elf/dl-deps.c:501
++msgid "cannot allocate symbol search list"
++msgstr "nie je mo�n� prideli� pam� pre vyh�ad�vac� zoznam symbolov"
++
++#: elf/dl-version.c:291
++msgid "cannot allocate version reference table"
++msgstr "nie je mo�n� prideli� pam� pre referen�n� tabu�ku verzi�"
++
++#: elf/dl-load.c:1000
++msgid "cannot change memory protections"
++msgstr "nie je mo�n� zmeni� ochranu pam�ti"
++
++#: elf/dl-load.c:533
++msgid "cannot create RUNPATH/RPATH copy"
++msgstr "nie je mo�n� vytvori� k�piu RUNPATH/RPATH"
++
++#: elf/dl-load.c:418 elf/dl-load.c:518 elf/dl-load.c:546 elf/dl-load.c:593
++#: elf/dl-load.c:685
++msgid "cannot create cache for search path"
++msgstr "Nie je mo�n� vytvori� cache pre h�adanie v ceste"
++
++#: elf/dl-support.c:191
++msgid "cannot create capability list"
++msgstr "nie je mo�n� vytvori� zoznam schopnost�"
++
++#: elf/sprof.c:715 elf/sprof.c:773
+ msgid "cannot create internal descriptor"
+ msgstr "nie je mo�n� vytvori� intern� deskriptor"
+ 
+-#: elf/sprof.c:417
++#: elf/sprof.c:413
+ msgid "cannot create internal descriptors"
+ msgstr "nie je mo�n� vytvori� intern� deskriptory"
+ 
+-#: nscd/connections.c:180
++#: elf/dl-load.c:583
++msgid "cannot create search path array"
++msgstr "nie je mo�n� vytvori� pole ciest"
++
++#: elf/dl-load.c:1137
++msgid "cannot create searchlist"
++msgstr "nie je mo�n� vytvori� vyh�ad�vac� zoznam"
++
++#: elf/dl-load.c:822 elf/dl-load.c:1682
++msgid "cannot create shared object descriptor"
++msgstr "nie je mo�n� vytvori� deskriptor zdie�an�ho objektu"
++
++#: catgets/gencat.c:1316
++msgid "cannot determine escape character"
++msgstr "nie je mo�n� ur�i� znak escape"
++
++#: elf/dl-load.c:950
++msgid "cannot dynamically load executable"
++msgstr "nie je mo�n� dynamicky na��ta� spustite�n� s�bor"
++
++#: nscd/connections.c:183
+ #, c-format
+ msgid "cannot enable socket to accept connections: %s"
+ msgstr "nie je mo�n� povoli� socketu prij�ma� spojenia: %s"
+ 
+-#: sunrpc/rpc_main.c:342
++#: elf/dl-open.c:121
++msgid "cannot extend global scope"
++msgstr "nie je mo�n� roz��ri� glob�lny rozsah"
++
++#: sunrpc/rpc_main.c:343
+ #, c-format
+ msgid "cannot find C preprocessor: %s \n"
+ msgstr "nie je mo�n� n�js� preprocesor: %s \n"
+ 
+-#: sunrpc/rpc_main.c:350
++#: sunrpc/rpc_main.c:351
+ msgid "cannot find any C preprocessor (cpp)\n"
+ msgstr "nie je mo�n� n�js� �iadny C preprocesor (cpp)\n"
+ 
+-#: nscd/connections.c:205
++#: nscd/connections.c:225
+ #, c-format
+ msgid "cannot handle old request version %d; current version is %d"
+ msgstr "nie je mo�n� spracova� star� verziu �iadosti %d; aktu�lna verzia je %d"
+ 
+-#: locale/programs/ld-collate.c:1324
+-#, c-format
+-msgid "cannot insert collation element `%.*s'"
+-msgstr "nie je mo�n� vlo�i� element triedenia `%.*s'"
+-
+-#: locale/programs/ld-collate.c:1503 locale/programs/ld-collate.c:1510
+-msgid "cannot insert into result table"
+-msgstr "nie je mo�n� vklada� do v�slednej tabu�ky"
+-
+-#: locale/programs/ld-collate.c:1175 locale/programs/ld-collate.c:1218
+-#, c-format
+-msgid "cannot insert new collating symbol definition: %s"
+-msgstr "nie je mo�n� vlo�i� nov� symbol triedenia: %s"
+-
+-#: elf/sprof.c:674
++#: elf/sprof.c:670
+ msgid "cannot load profiling data"
+ msgstr "nie je mo�n� na��ta� profilovacie �daje"
+ 
+-#: inet/rcmd.c:314
++#: elf/dl-deps.c:586
++msgid "cannot load shared object file"
++msgstr "nepodarilo sa na��ta� s�bor zdie�an�ho objektu"
++
++#: elf/dl-reloc.c:63
++msgid "cannot make segment writable for relocation"
++msgstr "nie je mo�n� zmeni� segment na zapisovate�n� pre relok�ciu"
++
++#: elf/dl-load.c:1016
++msgid "cannot map zero-fill pages"
++msgstr "nie je mo�n� namapova� str�nky vyplnen� nulami"
++
++#: inet/rcmd.c:420
+ msgid "cannot open"
+ msgstr "nie je mo�n� otvori�"
+ 
+ #: sysdeps/unix/sysv/linux/lddlibc4.c:64
+ #, c-format
+-msgid "cannot open"
+-msgstr "nie je mo�n� otvori�"
++msgid "cannot open `%s'"
++msgstr "nie je mo�n� otvori� `%s'"
+ 
+-#: db2/makedb.c:146
+-#, c-format
+-msgid "cannot open database file `%s': %s"
+-msgstr "nie je mo�n� otvori� datab�zov� s�bor `%s': %s"
++#: debug/pcprofiledump.c:96
++msgid "cannot open input file"
++msgstr "nie je mo�n� otvori� vstupn� s�bor"
+ 
+-#: catgets/gencat.c:272 db2/makedb.c:167 iconv/iconv_prog.c:177
++#: catgets/gencat.c:288 iconv/iconv_prog.c:225
+ #, c-format
+ msgid "cannot open input file `%s'"
+ msgstr "nie je mo�n� otvori� vstupn� s�bor `%s'"
+ 
+-#: locale/programs/localedef.c:198
++#: locale/programs/localedef.c:203 locale/programs/localedef.c:218
++#: locale/programs/localedef.c:513 locale/programs/localedef.c:533
+ #, c-format
+ msgid "cannot open locale definition file `%s'"
+ msgstr "nie je mo�n� otvori� s�bor defin�cie n�rodn�ho prostredia `%s'"
+ 
+-#: iconv/iconv_prog.c:155
++#: iconv/iconv_prog.c:194
+ msgid "cannot open output file"
+ msgstr "nie je mo�n� otvori� v�stupn� s�bor"
+ 
+-#: catgets/gencat.c:774 catgets/gencat.c:815 db2/makedb.c:181
++#: catgets/gencat.c:944 catgets/gencat.c:985
+ #, c-format
+ msgid "cannot open output file `%s'"
+ msgstr "nie je mo�n� otvori� v�stupn� s�bor `%s'"
+ 
+-#: locale/programs/locfile.c:1129
++#: locale/programs/locfile.c:381
+ #, c-format
+ msgid "cannot open output file `%s' for category `%s'"
+ msgstr "nie je mo�n� otvori� v�stupn� s�bor `%s' pre kateg�riu `%s'"
+ 
+-#: nscd/connections.c:162
++#: elf/dl-load.c:1695
++msgid "cannot open shared object file"
++msgstr "nie je mo�n� otvori� s�bor zdie�an�ho objektu"
++
++#: nscd/connections.c:165
+ #, c-format
+ msgid "cannot open socket: %s"
+ msgstr "nie je mo�n� otvori� socket `%s'"
+ 
+-#: locale/programs/ld-collate.c:1370
+-msgid "cannot process order specification"
+-msgstr "nie je mo�n� spracova� �pecifik�ciu poradia"
++#: elf/dl-load.c:814
++msgid "cannot open zero fill device"
++msgstr "nie je mo�n� otvori� zariadenie pre naplnenie nulami"
+ 
+-#: locale/programs/locale.c:449
++#: locale/programs/charmap-dir.c:61
+ #, c-format
+ msgid "cannot read character map directory `%s'"
+ msgstr "nie je mo�n� na��ta� adres�r znakov�ch s�d `%s'"
+ 
+-#: nscd/connections.c:122
++#: nscd/connections.c:125
+ msgid "cannot read configuration file; this is fatal"
+ msgstr "nie je mo�n� na��ta� konfigura�n� s�bor; to je fat�lne"
+ 
+-#: login/programs/request.c:91
+-msgid "cannot read from client"
+-msgstr "nie je mo�n� ��ta� od klienta"
++#: elf/dl-load.c:838 elf/dl-load.c:1244
++msgid "cannot read file data"
++msgstr "nie je mo�n� na��ta� �daje s�boru"
++
++#: debug/pcprofiledump.c:102
++msgid "cannot read header"
++msgstr "nie je mo�n� pre��ta� hlavi�ku"
+ 
+ #: sysdeps/unix/sysv/linux/lddlibc4.c:68
+ #, c-format
+ msgid "cannot read header from `%s'"
+ msgstr "nie je mo�n� pre��ta� hlavi�ku z `%s'"
+ 
+-#: locale/programs/locale.c:306
++#: locale/programs/locale.c:308
+ #, c-format
+ msgid "cannot read locale directory `%s'"
+ msgstr "nie je mo�n� na��ta� adres�r n�rodn�ch prostred� `%s'"
+ 
+-#: locale/programs/localedef.c:303
+-#, c-format
+-msgid "cannot read locale file `%s'"
+-msgstr "nie je mo�n� pre��ta� s�bor n�rodn�ho prostredia `%s'"
+-
+-#: locale/programs/locfile.c:288 locale/programs/locfile.c:306
+-#: locale/programs/locfile.c:324 locale/programs/locfile.c:342
+-#: locale/programs/locfile.c:360 locale/programs/locfile.c:378
+-#, c-format
+-msgid "cannot read repertoire map `%s'"
+-msgstr "nie je mo�n� na��ta� mapu reperto�ru `%s'"
+-
+-#: nscd/nscd_stat.c:127
++#: nscd/nscd_stat.c:128
+ msgid "cannot read statistics data"
+ msgstr "nie je mo�n� na��ta� �tatistick� �daje"
+ 
+-#: nscd/cache.c:141 nscd/connections.c:148
++#: locale/programs/repertoire.c:331
++msgid "cannot safe new repertoire map"
++msgstr "nie je mo�n� uchova� mapu reperto�ru"
++
++#: elf/dl-load.c:776
++msgid "cannot stat shared object"
++msgstr "nepodarilo sa zisti� stav zdie�an�ho objektu"
++
++#: nscd/cache.c:150 nscd/connections.c:151
+ #, c-format
+ msgid "cannot stat() file `%s': %s"
+ msgstr "nie je mo�n� vykona� stat() s�boru `%s': %s"
+ 
+-#: locale/programs/localedef.c:328
++#: locale/programs/localedef.c:230
+ #, c-format
+ msgid "cannot write output files to `%s'"
+ msgstr "nie je mo�n� zap�sa� v�stupn� s�bory do `%s'"
+ 
+-#: nscd/connections.c:229 nscd/connections.c:250
++#: nscd/connections.c:261 nscd/connections.c:282
+ #, c-format
+ msgid "cannot write result: %s"
+ msgstr "nie je mo�n� zap�sa� v�sledok: %s"
+ 
+-#: nscd/nscd_stat.c:86
++#: nscd/nscd_stat.c:87
+ #, c-format
+ msgid "cannot write statistics: %s"
+ msgstr "nie je mo�n� zap�sa� �tatistiku: `%s'"
+ 
+-#: login/programs/request.c:120
+-msgid "cannot write to client"
+-msgstr "nie je mo�n� p�sa� klientovi"
+-
+-#: locale/programs/localedef.c:442
+-msgid "category data requested more than once: should not happen"
+-msgstr "�daje kateg�rie po�adovan� viac ako raz - to by sa nemalo sta�"
+-
+-#: locale/programs/ld-ctype.c:269
++#: locale/programs/ld-ctype.c:509
+ #, c-format
+-msgid "character %s'%s' in class `%s' must be in class `%s'"
+-msgstr "znak %s'%s' v triede `%s' mus� by� v triede `%s'"
++msgid "character '%s' in class `%s' must be in class `%s'"
++msgstr "znak '%s' v triede `%s' mus� by� v triede `%s'"
+ 
+-#: locale/programs/ld-ctype.c:294
++#: locale/programs/ld-ctype.c:524
+ #, c-format
+-msgid "character %s'%s' in class `%s' must not be in class `%s'"
+-msgstr "znak %s'%s' v triede `%s' nesmie by� v triede `%s'"
++msgid "character '%s' in class `%s' must not be in class `%s'"
++msgstr "znak '%s' v triede `%s' nesmie by� v triede `%s'"
+ 
+-#: locale/programs/ld-ctype.c:320
++#: locale/programs/ld-ctype.c:579
+ msgid "character <SP> not defined in character map"
+ msgstr "znak <SP> nie je definovan� v znakovej sade"
+ 
+-#: locale/programs/ld-ctype.c:964 locale/programs/ld-ctype.c:1029
+-#: locale/programs/ld-ctype.c:1040 locale/programs/ld-ctype.c:1051
+-#: locale/programs/ld-ctype.c:1062 locale/programs/ld-ctype.c:1073
+-#: locale/programs/ld-ctype.c:1084 locale/programs/ld-ctype.c:1113
+-#: locale/programs/ld-ctype.c:1124 locale/programs/ld-ctype.c:1165
+-#: locale/programs/ld-ctype.c:1194 locale/programs/ld-ctype.c:1206
++#: locale/programs/ld-ctype.c:453
++#, c-format
++msgid "character L'\\u%0*x' in class `%s' must be in class `%s'"
++msgstr "znak L'\\u%0*x' v triede `%s' mus� by� v triede `%s'"
++
++#: locale/programs/ld-ctype.c:467
++#, c-format
++msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'"
++msgstr "znak L'\\u%0*x' v triede `%s' nesmie by� v triede `%s'"
++
++#: locale/programs/ld-ctype.c:3030
+ #, c-format
+ msgid "character `%s' not defined while needed as default value"
+ msgstr "znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota"
+ 
+-#: locale/programs/ld-ctype.c:825
++#: locale/programs/ld-ctype.c:1215
+ #, c-format
+ msgid "character class `%s' already defined"
+ msgstr "trieda znakov `%s' je u� definovan�"
+ 
+-#: locale/programs/ld-ctype.c:857
++#: locale/programs/ld-ctype.c:1247
+ #, c-format
+ msgid "character map `%s' already defined"
+ msgstr "znakov� sada `%s' je u� definovan�"
+ 
+-#: locale/programs/charmap.c:83
++#: locale/programs/charmap.c:249
++#, c-format
++msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant\n"
++msgstr "znakov� mapa `%s' nie je kompatibiln� s ASCII, prostredie nevyhovuje ISO C\n"
++
++#: locale/programs/charmap.c:135
+ #, c-format
+ msgid "character map file `%s' not found"
+ msgstr "s�bor znakovej sady `%s' nebol n�jden�"
+ 
+-#: sunrpc/clnt_raw.c:110
++#: locale/programs/charmap.c:460
++msgid "character sets with locking states are not supported"
++msgstr "znakov� sady so zamykac�mi stavmi nie s� podporovan�"
++
++#: locale/programs/localedef.c:482
++msgid "circular dependencies between locale definitions"
++msgstr "kruhov� z�vislos� medzi defin�ciami prostred�"
++
++#: sunrpc/clnt_raw.c:111
+ msgid "clnt_raw.c - Fatal header serialization error."
+ msgstr "clnt_raw.c - Fat�lna chyba pri serializ�cii hlavi�ky."
+ 
+-#: sunrpc/clnt_tcp.c:125 sunrpc/clnt_tcp.c:133
++#: sunrpc/clnt_tcp.c:126 sunrpc/clnt_tcp.c:134
+ msgid "clnttcp_create: out of memory\n"
+ msgstr "clnttcp_create: nedostatok pam�ti\n"
+ 
+-#: sunrpc/clnt_udp.c:124 sunrpc/clnt_udp.c:134
+-msgid "svctcp_create: out of memory\n"
+-msgstr "svctcp_create: nedostatok pam�ti\n"
++#: sunrpc/clnt_udp.c:131 sunrpc/clnt_udp.c:141
++msgid "clntudp_create: out of memory\n"
++msgstr "clntudp_create: nedostatok pam�ti\n"
+ 
+-#: sunrpc/clnt_unix.c:123 sunrpc/clnt_unix.c:131
++#: sunrpc/clnt_unix.c:124 sunrpc/clnt_unix.c:132
+ msgid "clntunix_create: out of memory\n"
+ msgstr "clntunix_create: nedostatok pam�ti\n"
+ 
+-#: locale/programs/ld-collate.c:1339
+-#, c-format
+-msgid "collation element `%.*s' appears more than once: ignore line"
+-msgstr "element triedenia `%.*s' uveden� viac ako raz - riadok ignorovan�"
+-
+-#: locale/programs/ld-collate.c:1357
+-#, c-format
+-msgid "collation symbol `%.*s' appears more than once: ignore line"
+-msgstr "symbol triedenia `%.*s' uveden� viac ako raz - riadok ignorovan�"
+-
+-#: locale/programs/locfile.c:652
+-#, c-format
+-msgid "collation symbol expected after `%s'"
+-msgstr "po `%s' je o�ak�van� symbol triedenia"
+-
+-#: inet/rcmd.c:136
+-#, c-format
+-msgid "connect to address %s: "
+-msgstr "spojenie s adresou %s: "
+-
+-#: sunrpc/rpc_scan.c:115
++#: sunrpc/rpc_scan.c:116
+ msgid "constant or identifier expected"
+ msgstr "o�ak�van� kon�tanta alebo identifik�tor"
+ 
+-#: iconv/iconv_prog.c:144
++#: iconv/iconv_prog.c:182
+ #, c-format
+ msgid "conversion from `%s' to `%s' not supported"
+ msgstr "konverzia z `%s' do `%s' nie je podporovan�"
+ 
+-#: iconv/iconv_prog.c:326
++#: catgets/gencat.c:1290
++msgid "conversion modules not available"
++msgstr "moduly konverzie nie s� dostupn�"
++
++#: locale/programs/ld-monetary.c:900
++msgid "conversion rate value cannot be zero"
++msgstr "konverzn� pomer nem��e by� nula"
++
++#: iconv/iconv_prog.c:385 iconv/iconv_prog.c:410
+ msgid "conversion stopped due to problem in writing the output"
+ msgstr "konverzia zastaven� kv�li probl�mu pri z�pise v�stupu"
+ 
+-#: sunrpc/svc_simple.c:83
++#: sunrpc/svc_simple.c:84
+ msgid "couldn't create an rpc server\n"
+ msgstr "nebolo mo�n� vytvori� rpc server\n"
+ 
+-#: sunrpc/svc_simple.c:91
++#: sunrpc/svc_simple.c:92
+ #, c-format
+-msgid "couldn't register prog %d vers %d\n"
+-msgstr "nebolo mo�n� zaregistrova� program %d verzie %d\n"
++msgid "couldn't register prog %ld vers %ld\n"
++msgstr "nebolo mo�n� zaregistrova� program %ld verzie %ld\n"
+ 
+-#: nss/getent.c:49
++#: nss/getent.c:51
+ msgid "database [key ...]"
+ msgstr "datab�za [k��� ...]"
+ 
+-#: locale/programs/charmap.c:170
++#: locale/programs/charmap.c:192
+ #, c-format
+ msgid "default character map file `%s' not found"
+ msgstr "implicitn� s�bor znakovej sady `%s' nebol n�jden�"
+ 
+-#: locale/programs/ld-time.c:163
+-#, c-format
+-msgid "direction flag in string %d in `era' field in category `%s' is not '+' nor '-'"
+-msgstr "pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je '+' ani '-'"
+-
+-#: locale/programs/ld-time.c:174
+-#, c-format
+-msgid "direction flag in string %d in `era' field in category `%s' is not a single character"
+-msgstr "pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je jeden znak"
+-
+-#: locale/programs/charset.c:64 locale/programs/charset.c:118
++#: locale/programs/charmap.c:392
+ #, c-format
+-msgid "duplicate character name `%s'"
+-msgstr "duplicitn� meno znaku `%s'"
+-
+-#: locale/programs/ld-collate.c:1150
+-msgid "duplicate collating element definition"
+-msgstr "duplicitn� defin�cia elementu triedenia"
++msgid "duplicate definition of <%s>"
++msgstr "duplicitn� defin�cia <%s>"
+ 
+-#: locale/programs/ld-collate.c:1297
++#: locale/programs/ld-collate.c:3043
+ #, c-format
+-msgid "duplicate definition for character `%.*s'"
+-msgstr "duplicitn� defin�cia znaku `%.*s'"
++msgid "duplicate definition of script `%s'"
++msgstr "duplicitn� defin�cia skriptu `%s'"
+ 
+-#: db2/makedb.c:328
+-msgid "duplicate key"
+-msgstr "duplicitn� k���"
+-
+-#: catgets/gencat.c:388
++#: catgets/gencat.c:430
+ msgid "duplicate set definition"
+ msgstr "duplicitn� defin�cia sady"
+ 
+-#: timezone/zic.c:978
++#: timezone/zic.c:1003
+ #, c-format
+ msgid "duplicate zone name %s (file \"%s\", line %d)"
+ msgstr "duplicitn� meno z�ny %s (s�bor \"%s\", riadok %d)"
+ 
+-#: catgets/gencat.c:551
++#: locale/programs/ld-ctype.c:2557
++#, c-format
++msgid "duplicated definition for mapping `%s'"
++msgstr "duplicitn� defin�cia mapovania `%s'"
++
++#: catgets/gencat.c:631
+ msgid "duplicated message identifier"
+ msgstr "duplicitn� identifik�tor spr�vy"
+ 
+-#: catgets/gencat.c:524
++#: catgets/gencat.c:603
+ msgid "duplicated message number"
+ msgstr "duplicitn� ��slo spr�vy"
+ 
+-#: sunrpc/rpc_scan.c:382
++#: locale/programs/ld-ctype.c:2368
++msgid "ellipsis range must be marked by two operands of same type"
++msgstr "rozsah pokra�ovania mus� by� ozna�en� dvomi operandami rovnak�ho typu"
++
++#: sunrpc/rpc_scan.c:383
+ msgid "empty char string"
+ msgstr "pr�zdny znakov� re�azec"
+ 
+-#: locale/programs/ld-collate.c:1710
+-msgid "empty weight name: line ignored"
+-msgstr "pr�zdne meno v�hy - riadok ignorovan�"
++#: elf/dl-open.c:223
++msgid "empty dynamic string token substitution"
++msgstr "pr�zdna substit�cia tokenu dynamick�ho re�azca"
+ 
+-#: sunrpc/svc_udp.c:372
++#: sunrpc/svc_udp.c:454
+ msgid "enablecache: cache already enabled"
+ msgstr "enablecache: vyrovn�vacia pam� je u� povolen�"
+ 
+-#: sunrpc/svc_udp.c:378
++#: sunrpc/svc_udp.c:460
+ msgid "enablecache: could not allocate cache"
+ msgstr "enablecache: nebolo mo�n� prideli� vyrovn�ciu pam�"
+ 
+-#: sunrpc/svc_udp.c:386
++#: sunrpc/svc_udp.c:468
+ msgid "enablecache: could not allocate cache data"
+ msgstr "enablecache: nebolo mo�n� prideli� d�ta pre vyrovn�vaciu pam�"
+ 
+-#: sunrpc/svc_udp.c:393
++#: sunrpc/svc_udp.c:475
+ msgid "enablecache: could not allocate cache fifo"
+ msgstr "enablecache: nebolo mo�n� prideli� frontu pre vyrovn�vaciu pam�"
+ 
+-#: iconv/iconv_prog.c:56
++#: iconv/iconv_prog.c:57
+ msgid "encoding for output"
+ msgstr "k�dovanie v�stupu"
+ 
+-#: iconv/iconv_prog.c:55
++#: iconv/iconv_prog.c:56
+ msgid "encoding of original text"
+ msgstr "k�dovanie p�vodn�ho textu"
+ 
+-#: locale/programs/ld-collate.c:1429
+-msgid "end point of ellipsis range is bigger then start"
+-msgstr "koncov� bod pokra�ovania je v��� ako po�iato�n�"
++#: nscd/connections.c:361 nscd/connections.c:453
++#, c-format
++msgid "error getting callers id: %s"
++msgstr "chyba pri z�skan� id volaj�ceho: %s"
++
++#: locale/programs/ld-collate.c:3013
++msgid "error while adding equivalent collating symbol"
++msgstr "chyba pri prid�van� ekvivalentn�ho symbolu triedenia"
+ 
+-#: iconv/iconv_prog.c:193
++#: iconv/iconv_prog.c:242
+ #, c-format
+ msgid "error while closing input `%s'"
+ msgstr "chyba po�as zatv�rania vstupu `%s'"
+ 
+-#: iconv/iconv_prog.c:239
++#: iconv/iconv_prog.c:288
+ msgid "error while closing output file"
+ msgstr "chyba po�as zatv�rania v�stupn�ho s�boru"
+ 
+-#: elf/sprof.c:710
++#: elf/sprof.c:706
+ msgid "error while closing the profiling data file"
+ msgstr "chyba po�as zatv�rania s�boru profilovac�ch �dajov"
+ 
+-#: locale/programs/ld-collate.c:1158
+-msgid "error while inserting collation element into hash table"
+-msgstr "chyba po�as vkladania elementu triedenia do hash-tabu�ky"
+-
+-#: locale/programs/ld-collate.c:1170
+-msgid "error while inserting to hash table"
+-msgstr "chyba po�as vkladania do hash-tabu�ky"
+-
+-#: iconv/iconv_prog.c:389 iconv/iconv_prog.c:420
++#: iconv/iconv_prog.c:474 iconv/iconv_prog.c:505
+ msgid "error while reading the input"
+ msgstr "po�as ��tania vstupu"
+ 
+-#: locale/programs/locfile.c:595
++#: locale/programs/locfile.h:59
+ msgid "expect string argument for `copy'"
+ msgstr "pre `copy' je o�ak�van� re�azcov� argyment"
+ 
+-#: timezone/zic.c:868
++#: timezone/zic.c:893
+ msgid "expected continuation line not found"
+ msgstr "o�ak�van� pokra�ovac� riadok nebol n�jden�"
+ 
+-#: elf/sprof.c:408
++#: elf/sprof.c:404
+ #, c-format
+ msgid "failed to load shared object `%s'"
+ msgstr "nepodarilo sa na��ta� zdie�an� objekt `%s'"
+ 
+-#: elf/sprof.c:604
++#: elf/sprof.c:600
+ msgid "failed to load symbol data"
+ msgstr "nepodarilo sa na��ta� symbolick� �daje"
+ 
+-#: elf/sprof.c:702
++#: elf/dl-load.c:763
++msgid "failed to map segment from shared object"
++msgstr "nepodarilo sa namapova� segment zo zdie�an�ho objektu"
++
++#: elf/sprof.c:698
+ msgid "failed to mmap the profiling data file"
+ msgstr "nepodarilo sa mmap-ova� s�bor profilovac�ch �dajov"
+ 
+-#: iconv/iconv_prog.c:147
++#: iconv/iconv_prog.c:186
+ msgid "failed to start conversion processing"
+ msgstr "nepodarilo sa od�tartova� konverziu"
+ 
+-#: locale/programs/locfile.c:1154
++#: locale/programs/locfile.c:406
+ #, c-format
+ msgid "failure while writing data for category `%s'"
+ msgstr "chyba po�as z�pisu �dajov kateg�rie `%s'"
+ 
+-#: nis/nis_call.c:155
++#: nis/nis_call.c:156
+ msgid "fcntl: F_SETFD"
+ msgstr "fcntl: F_SETFD"
+ 
+-#: locale/programs/ld-monetary.c:163 locale/programs/ld-numeric.c:98
+-#, c-format
+-msgid "field `%s' in category `%s' not defined"
+-msgstr "pole `%s' keteg�rie `%s' nie je definovan�"
+-
+-#: locale/programs/ld-messages.c:86 locale/programs/ld-messages.c:110
+-#, c-format
+-msgid "field `%s' in category `%s' undefined"
+-msgstr "pole `%s' kateg�rie `%s' nedefinovan�"
+-
+-#: sunrpc/rpc_main.c:1148
+-#, c-format
+-msgid "file '%s' already exists and may be overwritten\n"
+-msgstr "s�bor '%s' u� existuje a m��e by� prep�san�\n"
+-
+-#: locale/programs/locfile.c:677
+-msgid "from-value of `collating-element' must be a string"
+-msgstr "hodnota od pre `collating-element' mus� by� re�azec"
++#. TRANS: the file will not be removed; this is an
++#. TRANS: informative message.
++#: sunrpc/rpc_main.c:1150
++#, c-format
++msgid "file `%s' already exists and may be overwritten\n"
++msgstr "s�bor `%s' u� existuje a m��e by� prep�san�\n"
++
++#: elf/dl-load.c:1244
++msgid "file too short"
++msgstr "s�bor je pr�li� kr�tky"
+ 
+-#: inet/rcmd.c:316
++#: inet/rcmd.c:422
+ msgid "fstat failed"
+ msgstr "fstat sa nepodaril"
+ 
+-#: locale/programs/linereader.c:333
++#: locale/programs/linereader.c:383
+ msgid "garbage at end of character code specification"
+ msgstr "smetie za koncom �pecifik�cie k�du znaku"
+ 
+-#: locale/programs/linereader.c:219
++#: locale/programs/linereader.c:271
+ msgid "garbage at end of number"
+ msgstr "smetie za koncom ��sla"
+ 
+-#: locale/programs/ld-time.c:195
+-#, c-format
+-msgid "garbage at end of offset value in string %d in `era' field in category `%s'"
+-msgstr "smetie za koncom hodnoty posunutia v re�azci %d po�a `era' kateg�rie `%s'"
+-
+-#: locale/programs/ld-time.c:252
+-#, c-format
+-msgid "garbage at end of starting date in string %d in `era' field in category `%s'"
+-msgstr "smetie za koncom po�iato�n�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'"
+-
+-#: locale/programs/ld-time.c:328
+-#, c-format
+-msgid "garbage at end of stopping date in string %d in `era' field in category `%s'"
+-msgstr "smetie za koncom koncov�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'"
+-
+-#: elf/sprof.c:81
++#: elf/sprof.c:77
+ msgid "generate call graph"
+ msgstr "tvorba grafu volan�"
+ 
+-#: elf/sprof.c:80
++#: elf/sprof.c:76
+ msgid "generate flat profile with counts and ticks"
+ msgstr "tvorba jednoduch�ho profilu s po�tami a tikmi"
+ 
+-#: sunrpc/get_myaddr.c:77
++#: sunrpc/get_myaddr.c:78
+ msgid "get_myaddress: ioctl (get interface configuration)"
+ msgstr "get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)"
+ 
+-#: nss/getent.c:53
++#: nss/getent.c:702
+ msgid "getent - get entries from administrative database."
+ msgstr "getent - z�ska� z�znamy z administrat�vnej datab�zy."
+ 
+-#: nscd/connections.c:200
++#: nscd/connections.c:220
+ #, c-format
+ msgid "handle_request: request received (Version = %d)"
+ msgstr "handle_request: �iados� prijat� (verzia = %d)"
+ 
+-#: timezone/zic.c:613
++#: timezone/zic.c:637
+ msgid "hard link failed, symbolic link used"
+ msgstr "pevn� odkaz zlyhal, pou�it� symbolick�"
+ 
+-#: inet/rcmd.c:322
++#: inet/rcmd.c:428
+ msgid "hard linked somewhere"
+ msgstr "niekde existuje pevn� odkaz"
+ 
+-#: timezone/zic.c:1162
++#: locale/programs/charmap.c:981 locale/programs/repertoire.c:430
++msgid "hexadecimal range format should use only capital characters"
++msgstr "hexadecim�lny form�t rozsahu by mal pou��va� iba ve�k� p�smen�"
++
++#: timezone/zic.c:1187
+ msgid "illegal CORRECTION field on Leap line"
+ msgstr "nepr�pustn� pole CORRECTION v riadku Leap"
+ 
+-#: timezone/zic.c:1166
++#: timezone/zic.c:1191
+ msgid "illegal Rolling/Stationary field on Leap line"
+ msgstr "nepr�pustn� pole Rolling/Stationary v riadku Leap"
+ 
+-#: locale/programs/ld-collate.c:1782
+-msgid "illegal character constant in string"
+-msgstr "nepr�pustn� znak v re�azci"
+-
+-#: sunrpc/rpc_scan.c:311
++#: sunrpc/rpc_scan.c:312
+ msgid "illegal character in file: "
+ msgstr "nepr�pustn� znak v s�bore: "
+ 
+-#: locale/programs/ld-collate.c:1125
+-msgid "illegal collation element"
+-msgstr "nepr�pustn� element triedenia"
+-
+-#: locale/programs/charmap.c:281
+-msgid "illegal definition"
+-msgstr "nepr�pustn� defin�cia"
+-
+-#: locale/programs/charmap.c:434
+-msgid "illegal encoding given"
+-msgstr "zadan� nepr�pustn� k�dovanie"
+-
+-#: locale/programs/linereader.c:551
++#: locale/programs/linereader.c:595
+ msgid "illegal escape sequence at end of string"
+ msgstr "chybn� escape-sekvencia na konci re�azca"
+ 
+-#: iconv/iconv_prog.c:342
++#: iconv/iconv_prog.c:427
+ #, c-format
+ msgid "illegal input sequence at position %ld"
+ msgstr "nepr�pustn� vstupn� sekvencia na poz�cii %ld"
+ 
+-#: locale/programs/charset.c:78
+-msgid "illegal names for character range"
+-msgstr "nepr�pustn� men� pre rozsah znakov"
+-
+-#: sunrpc/rpc_main.c:462
++#: sunrpc/rpc_main.c:463
+ #, c-format
+-msgid "illegal nettype :'%s'\n"
+-msgstr "chybn� nettype :'%s'\n"
++msgid "illegal nettype :`%s'\n"
++msgstr "chybn� nettype :`%s'\n"
+ 
+-#: locale/programs/ld-time.c:187
+-#, c-format
+-msgid "illegal number for offset in string %d in `era' field in category `%s'"
+-msgstr "nepr�pustn� ��slo pre posunutie v re�azci %d po�a `era' kateg�rie `%s'"
+-
+-#: catgets/gencat.c:361 catgets/gencat.c:438
++#: catgets/gencat.c:403 catgets/gencat.c:480
+ msgid "illegal set number"
+ msgstr "nepr�pustn� ��slo sady"
+ 
+-#: locale/programs/ld-time.c:243
+-#, c-format
+-msgid "illegal starting date in string %d in `era' field in category `%s'"
+-msgstr "nepr�pustn� po�iato�n� d�tum v re�azci %d po�a `era' kateg�rie `%s'"
+-
+-#: locale/programs/ld-time.c:319
++#: locale/programs/ld-ctype.c:1221
+ #, c-format
+-msgid "illegal stopping date in string %d in `era' field in category `%s'"
+-msgstr "nepr�pustn� koncov� d�tum v re�azci %d po�a `era' kateg�rie `%s'"
++msgid "implementation limit: no more than %Zd character classes allowed"
++msgstr "limit implement�cie: maxim�lne mno�stvo tried znakov je %Zd"
+ 
+-#: locale/programs/ld-ctype.c:831
+-#, c-format
+-msgid "implementation limit: no more than %d character classes allowed"
+-msgstr "limit implement�cie: maxim�lne mno�stvo tried znakov je %d"
+-
+-#: locale/programs/ld-ctype.c:863
++#: locale/programs/ld-ctype.c:1253
+ #, c-format
+ msgid "implementation limit: no more than %d character maps allowed"
+ msgstr "limit implement�cie: maxim�lne mno�stvo s�d znakov je %d"
+ 
+-#: iconv/iconv_prog.c:346
++#: iconv/iconv_prog.c:431
+ msgid "incomplete character or shift sequence at end of buffer"
+ msgstr "nekompletn� znak alebo prera�ovacia sekvencia na konci vyrovn�vacej pam�ti"
+ 
+-#: db2/makedb.c:148
+-msgid "incorrectly formatted file"
+-msgstr "nespr�vne form�tovan� s�bor"
+-
+-#: timezone/zic.c:825
++#: timezone/zic.c:850
+ msgid "input line of unknown type"
+ msgstr "vstupn� riadok nezn�meho typu"
+ 
+-#: iconv/iconv_prog.c:350
++#: elf/dl-load.c:1291
++msgid "internal error"
++msgstr "intern� chyba"
++
++#: iconv/iconv_prog.c:435
+ msgid "internal error (illegal descriptor)"
+ msgstr "vn�torn� chyba (nespr�vny deskriptor)"
+ 
+-#: timezone/zic.c:1788
++#: timezone/zic.c:1813
+ msgid "internal error - addtype called with bad isdst"
+ msgstr "vn�torn� chyba - addtype zavolan� s chybn�m isdst"
+ 
+-#: timezone/zic.c:1796
++#: timezone/zic.c:1821
+ msgid "internal error - addtype called with bad ttisgmt"
+ msgstr "vn�torn� chyba - addtype zavolan� s chybn�m ttisgmt"
+ 
+-#: timezone/zic.c:1792
++#: timezone/zic.c:1817
+ msgid "internal error - addtype called with bad ttisstd"
+ msgstr "vn�torn� chyba - addtype zavolan� s chybn�m ttisstd"
+ 
+-#: locale/programs/ld-ctype.c:307
++#: locale/programs/ld-ctype.c:480 locale/programs/ld-ctype.c:536
+ #, c-format
+ msgid "internal error in %s, line %u"
+ msgstr "vn�torn� chyba %s na riadku %u"
+ 
+-#: timezone/zic.c:1034
++#: elf/dl-load.c:1264
++msgid "invalid ELF header"
++msgstr "nepr�pustn� ELF hlavi�ka"
++
++#: timezone/zic.c:1059
+ msgid "invalid UTC offset"
+ msgstr "nepr�pustn� posunutie vo�i UTC"
+ 
+-#: timezone/zic.c:1037
++#: timezone/zic.c:1062
+ msgid "invalid abbreviation format"
+ msgstr "nepr�pustn� form�t skratky"
+ 
+-#: timezone/zic.c:1127 timezone/zic.c:1339 timezone/zic.c:1353
++#: catgets/gencat.c:687
++msgid "invalid character: message ignored"
++msgstr "nepr�pustn� znak: spr�va ignorovan�"
++
++#: timezone/zic.c:1152 timezone/zic.c:1364 timezone/zic.c:1378
+ msgid "invalid day of month"
+ msgstr "nepr�pustn� de� mesiaca"
+ 
+-#: timezone/zic.c:1291
++#: locale/programs/charmap.c:347
++msgid "invalid definition"
++msgstr "nepr�pustn� defin�cia"
++
++#: locale/programs/charmap.c:542
++msgid "invalid encoding given"
++msgstr "zadan� nepr�pustn� k�dovanie"
++
++#: timezone/zic.c:1316
+ msgid "invalid ending year"
+ msgstr "nepr�pustn� koncov� rok"
+ 
+-#: timezone/zic.c:1099
++#: catgets/gencat.c:1147 locale/programs/linereader.c:533
++msgid "invalid escape sequence"
++msgstr "nepr�pustn� escape-sekvencia"
++
++#: timezone/zic.c:1124
+ msgid "invalid leaping year"
+ msgstr "nepr�pustn� priestupn� rok"
+ 
+-#: elf/dl-open.c:159
++#: catgets/gencat.c:726
++msgid "invalid line"
++msgstr "nepr�pustn� riadok"
++
++#: elf/dl-open.c:371
+ msgid "invalid mode for dlopen()"
+ msgstr "nepr�pustn� m�d pre dlopen()"
+ 
+-#: timezone/zic.c:1114 timezone/zic.c:1217
++#: timezone/zic.c:1139 timezone/zic.c:1242
+ msgid "invalid month name"
+ msgstr "nepr�pustn� n�zov mesiaca"
+ 
+-#: timezone/zic.c:933
++#: locale/programs/charmap.c:969 locale/programs/ld-collate.c:2869
++#: locale/programs/repertoire.c:418
++msgid "invalid names for character range"
++msgstr "nepr�pustn� men� pre rozsah znakov"
++
++#: debug/pcprofiledump.c:166
++msgid "invalid pointer size"
++msgstr "nepr�pustn� ve�kost� ukazovate�a"
++
++#: catgets/gencat.c:549
++msgid "invalid quote character"
++msgstr "nepr�pustn� znak cit�cie"
++
++#: timezone/zic.c:958
+ msgid "invalid saved time"
+ msgstr "nepr�pustn� ulo�en� �as"
+ 
+-#: timezone/zic.c:1266
++#: timezone/zic.c:1291
+ msgid "invalid starting year"
+ msgstr "nepr�pustn� po�iato�n� rok"
+ 
+-#: timezone/zic.c:1143 timezone/zic.c:1246
++#: timezone/zic.c:1168 timezone/zic.c:1271
+ msgid "invalid time of day"
+ msgstr "nepr�pustn� �as v dni"
+ 
+-#: timezone/zic.c:1344
++#: timezone/zic.c:1369
+ msgid "invalid weekday name"
+ msgstr "nepr�pustn� n�zov d�a"
+ 
+-#: nscd/connections.c:375
++#: nscd/connections.c:470
++#, c-format
++msgid "key length in request too long: %d"
++msgstr "d�ka k���a v �iadosti pr�li� dlh�: %d"
++
++#: elf/ldconfig.c:738
++#, c-format
++msgid "libc4 library %s in wrong directory"
++msgstr "libc4 kni�nica %s je v nespr�vnom adres�ri"
++
++#: elf/ldconfig.c:732
+ #, c-format
+-msgid "key length in request too long: %Zd"
+-msgstr "d�ka k���a v �iadosti pr�li� dlh�: %Zd"
++msgid "libc5 library %s in wrong directory"
++msgstr "libc5 kni�nica %s je v nespr�vnom adres�ri"
+ 
+-#: locale/programs/ld-collate.c:1422
+-msgid "line after ellipsis must contain character definition"
+-msgstr "riadok za pokra�ovan�m mus� obsahova� defin�ciu znaku"
++#: elf/ldconfig.c:735
++#, c-format
++msgid "libc6 library %s in wrong directory"
++msgstr "libc6 kni�nica %s je v nespr�vnom adres�ri"
+ 
+-#: locale/programs/ld-collate.c:1401
+-msgid "line before ellipsis does not contain definition for character constant"
+-msgstr "riadok pred pokra�ovan�m neobsahuje defin�ciu pre znakov� kon�tantu"
++#: elf/ldconfig.c:765
++#, c-format
++msgid "libraries %s and %s in directory %s have same soname but different type."
++msgstr "kni�nice %s a %s v adres�ri %s maj� rovnak� soname, ale odli�n� typ."
+ 
+-#: timezone/zic.c:805
++#: timezone/zic.c:830
+ msgid "line too long"
+ msgstr "pridlh� riadok"
+ 
+-#: iconv/iconv_prog.c:58
++#: iconv/iconv_prog.c:59
+ msgid "list all known coded character sets"
+ msgstr "vyp�� v�etky zn�me znakov� sady"
+ 
+-#: locale/programs/localedef.c:273
+-#, c-format
+-msgid "locale file `%s', used in `copy' statement, not found"
+-msgstr "s�bor n�rodn�ho prostredia `%s' pou�it�  v pr�kaze `copy' nebol n�jden�"
++#: locale/programs/locfile.h:63
++msgid "locale name should consist only of portable characters"
++msgstr "n�zov prostredia by malo obsahova� iba prenosite�n� znaky"
+ 
+-#: inet/rcmd.c:307
++#: inet/rcmd.c:413
+ msgid "lstat failed"
+ msgstr "lstat zlyhal"
+ 
+-#: catgets/gencat.c:619
++#: malloc/memusagestat.c:59
++msgid "make output graphic VALUE pixel high"
++msgstr "v�stupn� graf bude VALUE pixlov vysok�"
++
++#: malloc/memusagestat.c:58
++msgid "make output graphic VALUE pixel wide"
++msgstr "v�stupn� graf bude VALUE pixlov �irok�"
++
++#: catgets/gencat.c:780
+ msgid "malformed line ignored"
+ msgstr "nespr�vny riadok ignorovan�"
+ 
+-#: elf/sprof.c:554
++#: elf/sprof.c:550
+ msgid "mapping of section header string table failed"
+ msgstr "zlyhalo mapovanie tabu�ky re�azcov hlavi�ky sekcie"
+ 
+-#: elf/sprof.c:544
++#: elf/sprof.c:540
+ msgid "mapping of section headers failed"
+ msgstr "zlyhalo mapovanie hlavi�iek sekcie"
+ 
+-#: malloc/mcheck.c:202
++#: malloc/mcheck.c:285
+ msgid "memory clobbered before allocated block\n"
+ msgstr "pam� pred pridelen�m blokom prep�san�\n"
+ 
+-#: malloc/mcheck.c:205
++#: malloc/mcheck.c:288
+ msgid "memory clobbered past end of allocated block\n"
+ msgstr "pam� za koncom pridelen�ho bloku prep�san�\n"
+ 
+-#: locale/programs/ld-collate.c:170 locale/programs/ld-collate.c:176
+-#: locale/programs/ld-collate.c:180 locale/programs/ld-collate.c:1449
+-#: locale/programs/ld-collate.c:1478 locale/programs/locfile.c:1082
+-#: locale/programs/xmalloc.c:70 login/programs/database.c:62
+-#: login/programs/database.c:79 login/programs/database.c:95
+-#: posix/getconf.c:682
++#: locale/programs/locfile.c:334 locale/programs/xmalloc.c:70
++#: malloc/obstack.c:477 posix/getconf.c:809
+ msgid "memory exhausted"
+ msgstr "nedostatok pam�ti"
+ 
+-#: malloc/obstack.c:471
+-msgid "memory exhausted\n"
+-msgstr "nedostatok pam�ti\n"
+-
+-#: malloc/mcheck.c:199
++#: malloc/mcheck.c:282
+ msgid "memory is consistent, library is buggy\n"
+ msgstr "pam� je konzistentn�, kni�nica je chybn�\n"
+ 
+-#: locale/programs/ld-time.c:370
+-#, c-format
+-msgid "missing era format in string %d in `era' field in category `%s'"
+-msgstr "ch�ba form�t �ry v re�azci %d v poli `era' kateg�rie `%s'"
+-
+-#: locale/programs/ld-time.c:358
+-#, c-format
+-msgid "missing era name in string %d in `era' field in category `%s'"
+-msgstr "ch�ba meno �ry v re�azci %d v poli `era' kateg�rie `%s'"
++#: elf/cache.c:120
++msgid "mmap of cache file failed.\n"
++msgstr "zlyhalo mapovanie cache s�boru\n"
++
++#: elf/../sysdeps/generic/readelflib.c:108
++msgid "more than one dynamic segment\n"
++msgstr "viac ako jeden dynamick� segment\n"
+ 
+-#: timezone/zic.c:928
++#: timezone/zic.c:953
+ msgid "nameless rule"
+ msgstr "bezmenn� pravidlo"
+ 
+-#: iconv/iconv_prog.c:133
++#: iconv/iconv_prog.c:139
+ msgid "neither original nor target encoding specified"
+ msgstr "nie je �pecifikovan� p�vodn� ani cie�ov� k�dovanie"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:262
+-#: nis/nss_nisplus/nisplus-publickey.c:268
+-#: nis/nss_nisplus/nisplus-publickey.c:327
+-#: nis/nss_nisplus/nisplus-publickey.c:336
++#: nis/nss_nisplus/nisplus-publickey.c:281
++#: nis/nss_nisplus/nisplus-publickey.c:287
++#: nis/nss_nisplus/nisplus-publickey.c:346
++#: nis/nss_nisplus/nisplus-publickey.c:355
+ #, c-format
+ msgid "netname2user: (nis+ lookup): %s\n"
+ msgstr "netname2user: (nis+ lookup): %s\n"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:281
++#: nis/nss_nisplus/nisplus-publickey.c:300
+ #, c-format
+ msgid "netname2user: DES entry for %s in directory %s not unique"
+ msgstr "netname2user: DES z�znam pre %s v adres�ri %s nejednozna�n�"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:349
++#: nis/nss_nisplus/nisplus-publickey.c:368
+ #, c-format
+ msgid "netname2user: LOCAL entry for %s in directory %s not unique"
+ msgstr "netname2user: LOCAL z�znam pre %s v adres�ri %s nejednozna�n�"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:194
++#: nis/nss_nisplus/nisplus-publickey.c:207
+ #, c-format
+-msgid "netname2user: missing group id list in '%s'."
+-msgstr "netname2user: ch�baj�ci zoznam id skup�n v '%s'."
++msgid "netname2user: missing group id list in `%s'."
++msgstr "netname2user: ch�baj�ci zoznam id skup�n v `%s'."
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:299
++#: nis/nss_nisplus/nisplus-publickey.c:318
+ #, c-format
+-msgid "netname2user: principal name '%s' too long"
+-msgstr "netname2user: n�zov princip�la '%s' pr�li� dlh�"
++msgid "netname2user: principal name `%s' too long"
++msgstr "netname2user: n�zov princip�la `%s' pr�li� dlh�"
+ 
+-#: nis/nss_nisplus/nisplus-publickey.c:356
++#: nis/nss_nisplus/nisplus-publickey.c:375
+ msgid "netname2user: should not have uid 0"
+ msgstr "netname2user: nemal by ma� uid 0"
+ 
+-#: sunrpc/svc_simple.c:158
++#: sunrpc/svc_simple.c:159
+ #, c-format
+ msgid "never registered prog %d\n"
+ msgstr "program %d nebol nikdy registrovan�\n"
+ 
+-#: locale/programs/repertoire.c:238
++#: locale/programs/repertoire.c:272
+ msgid "no <Uxxxx> or <Uxxxxxxxx> value given"
+ msgstr "nezadan� <Uxxxx> alebo <Uxxxxxxxx> hodnota"
+ 
+-#: locale/programs/ld-messages.c:101 locale/programs/ld-messages.c:125
+-#, c-format
+-msgid "no correct regular expression for field `%s' in category `%s': %s"
+-msgstr "pre pole `%s' v kateg�rii `%s' neexistuje spr�vny regul�rny v�raz: %s"
+-
+-#: timezone/zic.c:2115
++#: timezone/zic.c:2142
+ msgid "no day in month matches rule"
+ msgstr "s pravidlom sa nezhoduje �iadny de� v mesiaci"
+ 
+-#: locale/programs/ld-collate.c:267
++#: locale/programs/ld-collate.c:1757
+ msgid "no definition of `UNDEFINED'"
+ msgstr "neexistuje defin�cia pre `UNDEFINED'"
+ 
+-#: elf/sprof.c:276
++#: elf/sprof.c:272
+ #, c-format
+ msgid "no filename for profiling data given and shared object `%s' has no soname"
+ msgstr "nebol zadan� n�zov s�boru pre profilovacie �daje a zdie�an� objekt `%s' nem� soname"
+ 
+-#: locale/programs/locfile.c:609
++#: locale/programs/ld-ctype.c:739
++msgid "no input digits defined and none of the standard names in the charmap"
++msgstr "neboli definovan� �iadne vstupn� ��slice a v znakovej mape nie je �iadne zo �tandardn�ch mien"
++
++#: locale/programs/locfile.h:82
+ msgid "no other keyword shall be specified when `copy' is used"
+ msgstr "pri pou�it� `copy' nem� by� zadan� �iadne in� k���ov� slovo"
+ 
+-#: locale/programs/localedef.c:334
++#: locale/programs/ld-ctype.c:3349
++msgid "no output digits defined and none of the standard names in the charmap"
++msgstr "neboli definovan� �iadne v�stupn� ��slice a v znakovej mape nie je �iadne zo �tandardn�ch mien"
++
++#: locale/programs/localedef.c:236
+ msgid "no output file produced because warning were issued"
+ msgstr "v�stupn� s�bor nebol vytvoren� kv�li v�skytu varovan�"
+ 
+-#: locale/programs/locfile.c:283 locale/programs/locfile.c:301
+-#: locale/programs/locfile.c:319 locale/programs/locfile.c:337
+-#: locale/programs/locfile.c:355 locale/programs/locfile.c:373
+-msgid "no repertoire map specified: cannot proceed"
+-msgstr "nebola zadan� mapa reperto�ru: nie je mo�n� pokra�ova�"
+-
+-#: locale/programs/charmap.c:400 locale/programs/charmap.c:550
+-#: locale/programs/charmap.c:629 locale/programs/repertoire.c:199
++#: locale/programs/charmap.c:488 locale/programs/charmap.c:668
++#: locale/programs/charmap.c:764 locale/programs/repertoire.c:231
+ msgid "no symbolic name given"
+ msgstr "nebolo zadan� �iadne symbolick� meno"
+ 
+-#: locale/programs/charmap.c:465 locale/programs/charmap.c:596
+-#: locale/programs/charmap.c:662 locale/programs/repertoire.c:261
++#: locale/programs/charmap.c:575 locale/programs/charmap.c:723
++#: locale/programs/charmap.c:806 locale/programs/repertoire.c:297
+ msgid "no symbolic name given for end of range"
+ msgstr "nebolo zadan� �iadne symbolick� meno pre koniec rozsahu"
+ 
+-#: locale/programs/ld-collate.c:249
+-#, c-format
+-msgid "no weight defined for symbol `%s'"
+-msgstr "symbol `%s' nem� definovan� v�hu"
++#: locale/programs/linereader.c:641
++msgid "non-symbolic character value should not be used"
++msgstr "nesymbolick� hodnoty znakov by nemali by� pou��van�"
++
++#: locale/programs/ld-ctype.c:804
++msgid "not all characters used in `outdigit' are available in the charmap"
++msgstr "nie v�etky znaky pou�it� v `outdigit' s� dostupn� v znakovej mape"
++
++#: locale/programs/ld-ctype.c:821
++msgid "not all characters used in `outdigit' are available in the repertoire"
++msgstr "nie v�etky znaky pou�it� v `outdigit' s� dostupn� v reperto�ri"
+ 
+-#: inet/rcmd.c:309
++#: inet/rcmd.c:415
+ msgid "not regular file"
+ msgstr "nie je regul�rny s�bor"
+ 
+-#: nscd/nscd_stat.c:130
++#: nscd/nscd_stat.c:131
+ #, c-format
+ msgid ""
+ "nscd configuration:\n"
+@@ -3679,48 +4879,72 @@
+ "\n"
+ "%15d  ladiaca �rove� servera\n"
+ 
+-#: nscd/nscd_stat.c:104
++#: nscd/nscd_stat.c:105
+ msgid "nscd not running!\n"
+ msgstr "nscd nebe��!\n"
+ 
+-#: locale/programs/charmap.c:514
++#: elf/dl-load.c:1051
++msgid "object file has no dynamic section"
++msgstr "objektov� s�bor neobsahuje �iadnu dynamick� sekciu"
++
++#: iconv/iconv_prog.c:61
++msgid "omit invalid characters from output"
++msgstr "vynecha� z v�stupu neplatn� znaky"
++
++#: elf/dl-load.c:1311
++msgid "only ET_DYN and ET_EXEC can be loaded"
++msgstr "iba ET_DYN a ET_EXEC m��u by� na��tan�"
++
++#: locale/programs/charmap.c:632
+ msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
+ msgstr "po defin�cii CHARMAP m��u nasledova� iba defin�cie WIDTH"
+ 
+-#: iconv/iconv_prog.c:135
++#: locale/programs/ld-collate.c:1005 locale/programs/ld-collate.c:1175
++#, c-format
++msgid "order for `%.*s' already defined at %s:%Zu"
++msgstr "poradie pre `%.*s' je u� definovan� na %s:%Zu"
++
++#: iconv/iconv_prog.c:141
+ msgid "original encoding not specified using `-f'"
+ msgstr "p�vodn� k�dovanie nebolo zadan� pomocou `-f'"
+ 
+-#: iconv/iconv_prog.c:60
++#: inet/ruserpass.c:167 inet/ruserpass.c:190
++msgid "out of memory"
++msgstr "nedostatok pam�ti"
++
++#: iconv/iconv_prog.c:62
+ msgid "output file"
+ msgstr "v�stupn� s�bor"
+ 
+-#: sunrpc/pm_getmaps.c:73
++#: sunrpc/pm_getmaps.c:74
+ msgid "pmap_getmaps rpc problem"
+ msgstr "pmap_getmaps rpc probl�m"
+ 
+-#: inet/rcmd.c:179
++#: inet/rcmd.c:233
+ msgid "poll: protocol failure in circuit setup\n"
+ msgstr "poll: chyba protokolu po�as pr�pravy okruhu\n"
+ 
+-#: sunrpc/rpc_scan.c:523 sunrpc/rpc_scan.c:533
++#: locale/programs/ld-ctype.c:1949 locale/programs/ld-ctype.c:2000
++msgid "premature end of `translit_ignore' definition"
++msgstr "pred�asn� koniec defin�cie `translit_ignore'"
++
++#: sunrpc/rpc_scan.c:524 sunrpc/rpc_scan.c:534
+ msgid "preprocessor error"
+ msgstr "chyba preprocesora"
+ 
+-#: elf/sprof.c:78
++#: locale/programs/ld-ctype.c:2731
++msgid "previous definition was here"
++msgstr "predch�dzaj�ca defin�cia bola tu"
++
++#: elf/sprof.c:74
+ msgid "print list of count paths and their number of use"
+ msgstr "vyp�sa� zoznam ciest po�tov a po�et ich pou�it�"
+ 
+-#: iconv/iconv_prog.c:61
++#: iconv/iconv_prog.c:64
+ msgid "print progress information"
+ msgstr "vypisova� inform�ciu o postupe"
+ 
+-#: db2/makedb.c:345
+-#, c-format
+-msgid "problems while reading `%s'"
+-msgstr "probl�my po�as ��tania `%s'"
+-
+-#: elf/sprof.c:691
++#: elf/sprof.c:687
+ #, c-format
+ msgid "profiling data file `%s' does not match shared object `%s'"
+ msgstr "profilovacie �daje `%s' nes�hlasia so zdie�an�mobjektom `%s'"
+@@ -3742,33 +4966,42 @@
+ msgid "program %lu version %lu ready and waiting\n"
+ msgstr "program %lu verzie %lu pripraven� a �akaj�ci\n"
+ 
+-#: inet/rcmd.c:176
++#: inet/rcmd.c:270
++#, c-format
++msgid "rcmd: %s: short read"
++msgstr "rcmd: %s: kr�tke ��tanie"
++
++#: inet/rcmd.c:230
+ #, c-format
+ msgid "rcmd: poll (setting up stderr): %m\n"
+ msgstr "rcmd: poll (nastavenie stderr): %m\n"
+ 
+-#: inet/rcmd.c:110
++#: inet/rcmd.c:158
+ msgid "rcmd: socket: All ports in use\n"
+ msgstr "rcmd: socket: V�etky porty s� pou�it�\n"
+ 
+-#: inet/rcmd.c:166
++#: inet/rcmd.c:220
+ #, c-format
+ msgid "rcmd: write (setting up stderr): %m\n"
+ msgstr "rcmd: write (nastavenie stderr): %m\n"
+ 
+-#: sunrpc/svc_simple.c:98
++#: sunrpc/svc_simple.c:99
+ msgid "registerrpc: out of memory\n"
+ msgstr "registerrpc: nedostatok pam�ti\n"
+ 
+-#: timezone/zic.c:1849
++#: timezone/zic.c:1874
+ msgid "repeated leap second moment"
+ msgstr "opakovan� moment priestupnej sekundy"
+ 
+-#: locale/programs/repertoire.c:95
++#: locale/programs/repertoire.c:342
+ #, c-format
+ msgid "repertoire map file `%s' not found"
+ msgstr "s�bor mapy reperto�ru `%s' nebol n�jden�"
+ 
++#: locale/programs/charmap.c:1063
++msgid "resulting bytes for range not representable."
++msgstr "v�sledn� bajty rozsahu nie s� zobrazite�n�"
++
+ #: sunrpc/rpc_main.c:1117
+ msgid "rpcgen: arglist coding error\n"
+ msgstr "rpcgen: chyba k�dovania zoznamu argumentov\n"
+@@ -3801,469 +5034,401 @@
+ msgid "rpcinfo: can't contact portmapper"
+ msgstr "rpcinfo: nie je mo�n� spoji� sa s portmapperom"
+ 
+-#: timezone/zic.c:718 timezone/zic.c:720
++#: timezone/zic.c:743 timezone/zic.c:745
+ msgid "same rule name in multiple files"
+ msgstr "rovnak� meno pravidla vo viacer�ch s�boroch"
+ 
+-#: nscd/connections.c:387
++#: elf/dl-load.c:1116
++msgid "shared object cannot be dlopen()ed"
++msgstr "zdie�an� objekt nem��e by� otvoren� pomocou dlopen()"
++
++#: elf/dl-close.c:63
++msgid "shared object not open"
++msgstr "zdie�an� objekt nie je otvoren�"
++
++#: nscd/connections.c:482
+ #, c-format
+ msgid "short read while reading request key: %s"
+ msgstr "ne�pln� ��tanie k���a �iadosti: %s"
+ 
+-#: nscd/connections.c:364
++#: nscd/connections.c:436
+ #, c-format
+ msgid "short read while reading request: %s"
+ msgstr "ne�pln� ��tanie �iadosti: `%s'"
+ 
+-#: nscd/grpcache.c:191 nscd/hstcache.c:278 nscd/pwdcache.c:188
++#: nscd/grpcache.c:193 nscd/hstcache.c:278 nscd/pwdcache.c:189
+ #, c-format
+ msgid "short write in %s: %s"
+ msgstr "ne�pln� z�pis v %s: %s"
+ 
+-#: inet/rcmd.c:197
++#: inet/rcmd.c:260
+ msgid "socket: protocol failure in circuit setup\n"
+ msgstr "socket: chyba protokolu pri pr�prave okruhu\n"
+ 
+-#: locale/programs/locfile.c:730
+-msgid "sorting order `forward' and `backward' are mutually exclusive"
+-msgstr "poradie triedenia `forward' a `backward' sa navz�jom vylu�uj�"
+-
+-#: locale/programs/ld-collate.c:1582 locale/programs/ld-collate.c:1628
+-msgid "specification of sorting weight for collation symbol does not make sense"
+-msgstr "�pecifik�cia v�h triedenia pre symbol triedenia ned�va zmysel"
+-
+-#: timezone/zic.c:789
++#: timezone/zic.c:814
+ msgid "standard input"
+ msgstr "�tandardn� vstup"
+ 
+-#: timezone/zdump.c:268
++#: timezone/zdump.c:269
+ msgid "standard output"
+ msgstr "�tandardn� v�stup"
+ 
+-#: locale/programs/ld-time.c:272
+-#, c-format
+-msgid "starting date is illegal in string %d in `era' field in category `%s'"
+-msgstr "nepr�pustn� po�iato�n� d�tum v re�azci %d v poli `era' kateg�rie `%s'"
++#: locale/programs/ld-ctype.c:1680
++msgid "start and end character sequence of range must have the same length"
++msgstr "�vodn� a koncov� znakov� sekvencia rozsahu musia ma� rovnak� d�ku"
+ 
+-#: timezone/zic.c:1300
++#: timezone/zic.c:1325
+ msgid "starting year greater than ending year"
+ msgstr "po�iato�n� rok v��� ako koncov�"
+ 
+-#: timezone/zic.c:1272 timezone/zic.c:1297
++#: timezone/zic.c:1297 timezone/zic.c:1322
+ msgid "starting year too high to be represented"
+ msgstr "po�iato�n� rok prive�k� pre zobrazenie"
+ 
+-#: timezone/zic.c:1270 timezone/zic.c:1295
++#: timezone/zic.c:1295 timezone/zic.c:1320
+ msgid "starting year too low to be represented"
+ msgstr "po�iato�n� rok primal� pre zobrazenie"
+ 
+-#: locale/programs/ld-time.c:348
+-#, c-format
+-msgid "stopping date is illegal in string %d in `era' field in category `%s'"
+-msgstr "nepr�pustn� koncov� d�tum v re�azci %d v poli `era' kateg�rie `%s'"
+-
+-#: sunrpc/svc_run.c:81
+-msgid "svc_run: - select failed"
+-msgstr "svc_run: - select zlyhal"
++#: iconv/iconv_prog.c:63
++msgid "suppress warnings"
++msgstr "potla�i� varovania"
++
++#: sunrpc/svc_run.c:76
++msgid "svc_run: - poll failed"
++msgstr "svc_run: - poll zlyhal"
+ 
+-#: sunrpc/svc_tcp.c:160
++#: sunrpc/svc_tcp.c:161
+ msgid "svc_tcp.c - cannot getsockname or listen"
+ msgstr "svc_tcp.c - nie je mo�n� vykona� getsockname alebo listen"
+ 
+-#: sunrpc/svc_tcp.c:145
++#: sunrpc/svc_tcp.c:146
+ msgid "svc_tcp.c - tcp socket creation problem"
+ msgstr "svc_tcp.c - probl�m pri vytv�ran� tcp socketu"
+ 
+-#: sunrpc/svc_tcp.c:209 sunrpc/svc_tcp.c:215
++#: sunrpc/svc_tcp.c:210 sunrpc/svc_tcp.c:216
+ msgid "svc_tcp: makefd_xprt: out of memory\n"
+ msgstr "svc_tcp: makefd_xprt: nedostatok pam�ti\n"
+ 
+-#: sunrpc/svc_unix.c:135
++#: sunrpc/svc_unix.c:137
+ msgid "svc_unix.c - AF_UNIX socket creation problem"
+ msgstr "svc_unix.c - probl�m pri vytv�ran� AF_UNIX socketu"
+ 
+-#: sunrpc/svc_unix.c:151
++#: sunrpc/svc_unix.c:153
+ msgid "svc_unix.c - cannot getsockname or listen"
+ msgstr "svc_unix.c - nem��em vykona� getsockname alebo listen"
+ 
+-#: sunrpc/svc_unix.c:201 sunrpc/svc_unix.c:207
++#: sunrpc/svc_unix.c:203 sunrpc/svc_unix.c:209
+ msgid "svc_unix: makefd_xprt: out of memory\n"
+ msgstr "svc_unix: makefd_xprt: nedostatok pam�ti\n"
+ 
+-#: sunrpc/svc_tcp.c:168 sunrpc/svc_tcp.c:176
++#: sunrpc/svc_tcp.c:169 sunrpc/svc_tcp.c:177
+ msgid "svctcp_create: out of memory\n"
+ msgstr "svctcp_create: nedostatok pam�ti\n"
+ 
+-#: sunrpc/svc_udp.c:135
++# msgmerge complains: duplicate message definition
++# 3073: ...this is the location of the first definition
++# entry disabled, Martin v. L�wis
++# #: sunrpc/svc_tcp.c:168 sunrpc/svc_tcp.c:176
++# msgid "svctcp_create: out of memory\n"
++# msgstr "svctcp_create: nedostatok pam�ti\n"
++#: sunrpc/svc_udp.c:141
+ msgid "svcudp_create - cannot getsockname"
+ msgstr "svcudp_create - nem��em vykona� getsockname"
+ 
+-#: sunrpc/svc_udp.c:143 sunrpc/svc_udp.c:149 sunrpc/svc_udp.c:155
++#: sunrpc/svc_udp.c:149 sunrpc/svc_udp.c:155 sunrpc/svc_udp.c:161
+ msgid "svcudp_create: out of memory\n"
+ msgstr "svcudp_create: nedostatok pam�ti\n"
+ 
+-#: sunrpc/svc_udp.c:121
++#: sunrpc/svc_udp.c:127
+ msgid "svcudp_create: socket creation problem"
+ msgstr "svcudp_create: probl�m pri vytv�ran� socketu"
+ 
+-#: sunrpc/svc_unix.c:160 sunrpc/svc_unix.c:168
++#: sunrpc/svc_udp.c:177
++msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n"
++msgstr "svcudp_create: xp_pad je pr�li� mal� pre IP_PKTINFO\n"
++
++#: sunrpc/svc_unix.c:162 sunrpc/svc_unix.c:170
+ msgid "svcunix_create: out of memory\n"
+ msgstr "svcunix_create: nedostatok pam�ti\n"
+ 
+-#: locale/programs/ld-collate.c:1201
++#: locale/programs/linereader.c:745
+ #, c-format
+-msgid "symbol for multicharacter collating element `%.*s' duplicates element definition"
+-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu elementu"
++msgid "symbol `%.*s' not in charmap"
++msgstr "symbol `%.*s' nie je v mape znakov"
+ 
+-#: locale/programs/ld-collate.c:1073
++#: locale/programs/linereader.c:766
+ #, c-format
+-msgid "symbol for multicharacter collating element `%.*s' duplicates other element definition"
+-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje in� element"
++msgid "symbol `%.*s' not in repertoire map"
++msgstr "symbol `%.*s' nie je v mape reperto�ru"
+ 
+-#: locale/programs/ld-collate.c:1210
++#: locale/programs/ld-collate.c:1617 locale/programs/ld-collate.c:1716
+ #, c-format
+-msgid "symbol for multicharacter collating element `%.*s' duplicates other symbol definition"
+-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu in�ho symbolu"
++msgid "symbol `%s'"
++msgstr "symbol `%s'"
+ 
+-#: locale/programs/ld-collate.c:1082
++#: locale/programs/ld-collate.c:1614 locale/programs/ld-collate.c:1713
+ #, c-format
+-msgid "symbol for multicharacter collating element `%.*s' duplicates symbol definition"
+-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu symbolu"
++msgid "symbol `%s' has the same encoding as"
++msgstr "symbol `%s' m� rovnak� k�dovanie ako"
+ 
+-#: locale/programs/ld-collate.c:1064 locale/programs/ld-collate.c:1192
++#: locale/programs/ld-collate.c:1539
+ #, c-format
+-msgid "symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset"
+-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje symbolick� meno v znakovej sade"
++msgid "symbol `%s' not defined"
++msgstr "symbol `%s' nie je definovan�"
+ 
+-#: locale/programs/charmap.c:399 locale/programs/charmap.c:433
+-#: locale/programs/charmap.c:463 locale/programs/charmap.c:549
+-#: locale/programs/charmap.c:595 locale/programs/charmap.c:628
+-#: locale/programs/charmap.c:660
++#: locale/programs/ld-ctype.c:1955 locale/programs/ld-ctype.c:2006
++#: locale/programs/ld-ctype.c:2048
++msgid "syntax error"
++msgstr "chyba syntaxe"
++
++#: locale/programs/charmap.c:487 locale/programs/charmap.c:541
++#: locale/programs/charmap.c:573 locale/programs/charmap.c:667
++#: locale/programs/charmap.c:722 locale/programs/charmap.c:763
++#: locale/programs/charmap.c:804
+ #, c-format
+ msgid "syntax error in %s definition: %s"
+ msgstr "chyba syntaxe v defin�cii %s: %s"
+ 
+-#: locale/programs/locfile.c:750
+-msgid "syntax error in `order_start' directive"
+-msgstr "chyba syntaxe v direkt�ve `order_start'"
+-
+-#: locale/programs/locfile.c:492
+-msgid "syntax error in character class definition"
+-msgstr "chyba syntaxe v defin�cii triedy znakov"
+-
+-#: locale/programs/locfile.c:550
+-msgid "syntax error in character conversion definition"
+-msgstr "chyba syntaxe v defin�cie konverzie znakov"
+-
+-#: locale/programs/locfile.c:792
+-msgid "syntax error in collating order definition"
+-msgstr "chyba syntaxe v defin�cii poradia triedenia"
+-
+-#: locale/programs/locfile.c:642
+-msgid "syntax error in collation definition"
+-msgstr "chyba syntaxe v defin�cii triedenia"
+-
+-#: locale/programs/locfile.c:465
+-msgid "syntax error in definition of LC_CTYPE category"
+-msgstr "chyba syntaxe v defin�cii kateg�rie LC_CTYPE"
+-
+-#: locale/programs/locfile.c:408
+-msgid "syntax error in definition of new character class"
+-msgstr "chyba syntaxe v defin�cii novej triedy znakov"
+-
+-#: locale/programs/locfile.c:418
+-msgid "syntax error in definition of new character map"
+-msgstr "chyba syntaxe v defin�cii novej znakovej sady"
+-
+-#: locale/programs/locfile.c:1003
+-msgid "syntax error in message locale definition"
+-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia spr�v"
+-
+-#: locale/programs/locfile.c:914
+-msgid "syntax error in monetary locale definition"
+-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pe�a�n�ch hodn�t"
+-
+-#: locale/programs/locfile.c:941
+-msgid "syntax error in numeric locale definition"
+-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pre ��sla"
+-
+-#: locale/programs/locfile.c:852
+-msgid "syntax error in order specification"
+-msgstr "chyba syntaxe v �pecifik�cii poradia"
+-
+-#: locale/programs/charmap.c:280 locale/programs/charmap.c:296
+-#: locale/programs/repertoire.c:143
++#: locale/programs/charmap.c:346 locale/programs/charmap.c:363
++#: locale/programs/repertoire.c:175
+ #, c-format
+ msgid "syntax error in prolog: %s"
+ msgstr "chyba syntaxe v prol�gu: %s"
+ 
+-#: locale/programs/repertoire.c:198 locale/programs/repertoire.c:237
+-#: locale/programs/repertoire.c:260
++#: locale/programs/repertoire.c:230 locale/programs/repertoire.c:271
++#: locale/programs/repertoire.c:296
+ #, c-format
+ msgid "syntax error in repertoire map definition: %s"
+ msgstr "chyba syntaxe v defin�cii mapy reperto�ru: %s"
+ 
+-#: locale/programs/locfile.c:979
+-msgid "syntax error in time locale definition"
+-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pre �as"
+-
+-#: locale/programs/locfile.c:385
++#: locale/programs/locfile.c:243
+ msgid "syntax error: not inside a locale definition section"
+ msgstr "chyba syntaxe: nie je vn�tri sekcie defin�cie n�rodn�ho prostredia"
+ 
+-#: iconv/iconv_prog.c:137
++#: iconv/iconv_prog.c:143
+ msgid "target encoding not specified using `-t'"
+ msgstr "k�dovanie cie�a nebolo zadan� pomocou `-t'"
+ 
+-#: catgets/gencat.c:390 catgets/gencat.c:526 catgets/gencat.c:553
++#: catgets/gencat.c:432 catgets/gencat.c:605 catgets/gencat.c:634
+ msgid "this is the first definition"
+ msgstr "toto je prv� defin�cia"
+ 
+-#: timezone/zic.c:1132
++#: timezone/zic.c:1157
+ msgid "time before zero"
+ msgstr "�as men�� ako nula"
+ 
+-#: timezone/zic.c:1140 timezone/zic.c:2015 timezone/zic.c:2034
++#: timezone/zic.c:1165 timezone/zic.c:2042 timezone/zic.c:2061
+ msgid "time overflow"
+ msgstr "prete�enie �asu"
+ 
+-#: locale/programs/charmap.c:443
++#: locale/programs/ld-ctype.c:1553 locale/programs/ld-ctype.c:2029
++#, c-format
++msgid "to-value <U%0*X> of range is smaller than from-value <U%0*X>"
++msgstr "to-value <U%0*X> rozsahu je men�ia ako from-value <U%0*X>"
++
++#: locale/programs/ld-ctype.c:1687
++msgid "to-value character sequence is smaller than from-value sequence"
++msgstr "to-value sekvencia znakov je men�ia ako sekvencia from-value"
++
++#: locale/programs/charmap.c:551
+ msgid "too few bytes in character encoding"
+ msgstr "prim�lo bajtov v k�dovan� znaku"
+ 
+-#: locale/programs/charmap.c:445
++#: locale/programs/charmap.c:553
+ msgid "too many bytes in character encoding"
+ msgstr "prive�a bajtov v k�dovan� znaku"
+ 
+-#: locale/programs/locales.h:92
+-msgid "too many character classes defined"
+-msgstr "prive�a definovan�ch tried znakov"
+-
+-#: timezone/zic.c:1843
++#: timezone/zic.c:1868
+ msgid "too many leap seconds"
+ msgstr "prive�a priestupn�ch sek�nd"
+ 
+-#: timezone/zic.c:1815
++#: timezone/zic.c:1840
+ msgid "too many local time types"
+ msgstr "prive�a lok�lnych typov �asu"
+ 
+-#: timezone/zic.c:1769
++#: timezone/zic.c:1794
+ msgid "too many transitions?!"
+ msgstr "prive�a prechodov?!"
+ 
+-#: locale/programs/ld-collate.c:1637
+-msgid "too many weights"
+-msgstr "prive�a v�h"
+-
+-#: timezone/zic.c:2138
++#: timezone/zic.c:2165
+ msgid "too many, or too long, time zone abbreviations"
+ msgstr "pr�li� ve�a alebo pr�li� dlh� skratku �asovej z�ny"
+ 
+-#: locale/programs/linereader.h:146
++#: locale/programs/linereader.h:157
+ msgid "trailing garbage at end of line"
+ msgstr "smetie na konci riadku"
+ 
+-#: sunrpc/svc_simple.c:150
++#: sunrpc/svc_simple.c:151
+ #, c-format
+ msgid "trouble replying to prog %d\n"
+ msgstr "probl�my pri odpovedi programu %d\n"
+ 
+-#: locale/programs/ld-collate.c:1393
+-msgid "two lines in a row containing `...' are not allowed"
+-msgstr "dva riadky za sebou obsahuj�ce `...' nie s� povolen�"
+-
+-#: timezone/zic.c:1307
++#: timezone/zic.c:1332
+ msgid "typed single year"
+ msgstr "zadan� jeden rok"
+ 
+-#: iconv/iconv_prog.c:406
++#: iconv/iconv_prog.c:491
+ msgid "unable to allocate buffer for input"
+ msgstr "nie je mo�n� prideli� vyrovn�vaciu pam� pre vstup"
+ 
+-#: nis/nis_callback.c:187
++#: nis/nis_callback.c:189
+ msgid "unable to free arguments"
+ msgstr "nie je mo�n� uvo�ni� argumenty"
+ 
+-#: posix/getconf.c:654 posix/getconf.c:670
++#: posix/getconf.c:781 posix/getconf.c:797
+ msgid "undefined"
+ msgstr "nedefinovan�"
+ 
+-#: locale/programs/charmap.c:701 locale/programs/charmap.c:712
++#: locale/programs/charmap.c:856 locale/programs/charmap.c:867
+ #, c-format
+ msgid "unknown character `%s'"
+ msgstr "nezn�my znak `%s'"
+ 
+-#: locale/programs/ld-messages.c:202 locale/programs/ld-messages.c:213
+-#: locale/programs/ld-messages.c:224 locale/programs/ld-messages.c:235
+-#: locale/programs/ld-time.c:718
+-#, c-format
+-msgid "unknown character in field `%s' of category `%s'"
+-msgstr "nezn�my znak v poli `%s' kateg�rie `%s'"
+-
+-#: locale/programs/locfile.c:715
+-msgid "unknown collation directive"
+-msgstr "nezn�ma direkt�va triedenia"
+-
+-#: catgets/gencat.c:487
++#: catgets/gencat.c:562
+ #, c-format
+ msgid "unknown directive `%s': line ignored"
+ msgstr "nezn�ma direkt�va `%s' - riadok ignorovan�"
+ 
+-#: iconv/iconv_prog.c:353
++#: iconv/iconv_prog.c:438
+ #, c-format
+ msgid "unknown iconv() error %d"
+ msgstr "nezn�ma iconv() chyba %d"
+ 
+-#: catgets/gencat.c:466
++#: catgets/gencat.c:508
+ #, c-format
+ msgid "unknown set `%s'"
+ msgstr "nezn�ma sada `%s'"
+ 
+-#: locale/programs/ld-collate.c:1377 locale/programs/ld-collate.c:1572
+-#: locale/programs/ld-collate.c:1747
+-#, c-format
+-msgid "unknown symbol `%.*s': line ignored"
+-msgstr "nezn�my symbol `%.*s' - riadok ignorovan�"
+-
+-#: timezone/zic.c:761
++#: timezone/zic.c:786
+ msgid "unruly zone"
+ msgstr "z�na bez pravidiel"
+ 
+-#: catgets/gencat.c:971
++#: catgets/gencat.c:1169
+ msgid "unterminated message"
+ msgstr "neukon�en� spr�va"
+ 
+-#: locale/programs/linereader.c:520 locale/programs/linereader.c:555
++#: locale/programs/linereader.c:599 locale/programs/linereader.c:784
+ msgid "unterminated string"
+ msgstr "neukon�en� re�azec"
+ 
+-#: sunrpc/rpc_scan.c:350 sunrpc/rpc_scan.c:376
++#: sunrpc/rpc_scan.c:351 sunrpc/rpc_scan.c:377
+ msgid "unterminated string constant"
+ msgstr "neukon�en� re�azcov� kon�tanta"
+ 
+-#: locale/programs/linereader.c:390
++#: locale/programs/linereader.c:469
+ msgid "unterminated symbolic name"
+ msgstr "neukon�en� symbolick� meno"
+ 
+-#: locale/programs/ld-collate.c:1699
+-msgid "unterminated weight name"
+-msgstr "neukon�en� meno v�hy"
++#: locale/programs/charmap.c:1005
++msgid "upper limit in range is not higher then lower limit"
++msgstr "horn� limit rozsahu nie je v��� ako doln�"
+ 
+-#: locale/programs/charset.c:104
++#: locale/programs/repertoire.c:455
+ msgid "upper limit in range is not smaller then lower limit"
+ msgstr "horn� limit rozsahu je men�� ako doln�"
+ 
+-#: sunrpc/rpc_main.c:1415
++#: sunrpc/rpc_main.c:1424
+ #, c-format
+-msgid "usage:  %s infile\n"
++msgid "usage: %s infile\n"
+ msgstr "pou�itie:  %s vstupn�_s�bor\n"
+ 
+-#: timezone/zic.c:2081
++#: timezone/zic.c:2108
+ msgid "use of 2/29 in non leap-year"
+ msgstr "29. febru�r pou�it� v nepriestupnom roku"
+ 
+-#: locale/programs/charmap.c:522 locale/programs/charmap.c:576
++#: locale/programs/charmap.c:640 locale/programs/charmap.c:703
+ #, c-format
+ msgid "value for %s must be an integer"
+ msgstr "hodnota pre %s mus� by� cel� ��slo"
+ 
+-#: locale/programs/charmap.c:318
++#: locale/programs/charmap.c:399
+ #, c-format
+-msgid "value for <%s> must lie between 1 and 4"
+-msgstr "honota pre <%s> mus� by� medzi 1 a 4"
++msgid "value for <%s> must be 1 or greater"
++msgstr "hodnota pre <%s> mus� by� 1 alebo viac"
+ 
+-#: locale/programs/ld-monetary.c:157 locale/programs/ld-numeric.c:92
++#: locale/programs/charmap.c:411
+ #, c-format
+-msgid "value for field `%s' in category `%s' must not be the empty string"
+-msgstr "hodnota po�a `%s' kateg�rie `%s' nesmie by� pr�zdny re�azec"
+-
+-#: locale/programs/charmap.c:330
+-msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
+-msgstr "hodnota <mb_cur_max> mus� by� v��ia ako hodnota <mb_cur_min>"
++msgid "value of <%s> must be greater or equal than the value of <%s>"
++msgstr "hodnota <%s> mus� by� v��ia alebo rovn� hodnote <%s>"
+ 
+-#: locale/programs/ld-monetary.c:147
+-msgid "value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217"
+-msgstr "hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' nezodpoved� platn�mu menu v ISO 4217"
++#: timezone/zic.c:433
++msgid "warning: "
++msgstr "varovanie: "
+ 
+-#: locale/programs/ld-monetary.c:139
+-msgid "value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length"
+-msgstr "hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' m� chybn� d�ku"
+-
+-#: locale/programs/ld-monetary.c:383 locale/programs/ld-numeric.c:207
+-#, c-format
+-msgid "values for field `%s' in category `%s' must be smaller than 127"
+-msgstr "hodnoty po�a `%s' kateg�rie `%s' musia by� men�ie ako 127"
+-
+-#: nscd/connections.c:355
++#: nscd/connections.c:427
+ #, c-format
+ msgid "while accepting connection: %s"
+ msgstr "po�as prijatia spojenia: %s"
+ 
+-#: nscd/grpcache.c:149 nscd/hstcache.c:168 nscd/pwdcache.c:142
++#: nscd/grpcache.c:150 nscd/hstcache.c:165 nscd/pwdcache.c:143
+ msgid "while allocating cache entry"
+ msgstr "po�as pridelenia z�znamu cache"
+ 
+-#: nscd/cache.c:85
++#: nscd/cache.c:88
+ msgid "while allocating hash table entry"
+ msgstr "po�as pridelenia z�znamu hash-tabu�ky"
+ 
+-#: nscd/grpcache.c:99 nscd/hstcache.c:109 nscd/pwdcache.c:105
++#: nscd/grpcache.c:100 nscd/hstcache.c:108 nscd/pwdcache.c:106
+ msgid "while allocating key copy"
+ msgstr "po�as pridelenia k�pie k���a"
+ 
+-#: catgets/gencat.c:1001
++#: catgets/gencat.c:1199
+ msgid "while opening old catalog file"
+ msgstr "po�as otv�rania star�ho katal�gu"
+ 
+-#: locale/programs/locale.c:346
++#: locale/programs/locale.c:361
+ msgid "while preparing output"
+ msgstr "po�as pr�pravy v�stupu"
+ 
+-#: db2/makedb.c:365 db2/makedb.c:382
+-msgid "while reading database"
+-msgstr "po�as ��tania datab�zy"
+-
+-#: elf/sprof.c:683
++#: elf/sprof.c:679
+ msgid "while stat'ing profiling data file"
+ msgstr "po�as stat-u s�boru profilovac�ch inform�ci�"
+ 
+-#: db2/makedb.c:334
+-msgid "while writing database file"
+-msgstr "po�as z�pisu datab�zy"
++#: locale/programs/ld-ctype.c:2392
++msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'"
++msgstr "v rozsahu hodn�t UCS treba pou�i� hexadecim�lne symbolick� pokra�ovanie `..'"
++
++#: locale/programs/ld-ctype.c:2406
++msgid "with character code range values one must use the absolute ellipsis `...'"
++msgstr "v rozsahu hodn�t k�dov znakov treba pou�i� absol�tne pokra�ovanie `...'"
++
++#: locale/programs/ld-ctype.c:2377
++msgid "with symbolic name range values the absolute ellipsis `...' must not be used"
++msgstr "v symbolickom rozsahu hodn�t nesmie by� pou�it� absol�tne pokra�ovanie `...'"
+ 
+-#: nscd/nscd_stat.c:115
++#: nscd/nscd_stat.c:116
+ msgid "write incomplete"
+ msgstr "ne�pln� z�pis"
+ 
+-#: inet/rcmd.c:320
++#: inet/rcmd.c:426
+ msgid "writeable by other than owner"
+ msgstr "zapisovate�n� nielen pre vlastn�ka"
+ 
+-#: db2/makedb.c:124 nscd/nscd.c:114 nss/getent.c:392
++#: nscd/nscd.c:123 nscd/nscd_nischeck.c:64 nss/getent.c:761
+ msgid "wrong number of arguments"
+ msgstr "chybn� po�et argumentov"
+ 
+-#: timezone/zic.c:1090
++#: timezone/zic.c:1115
+ msgid "wrong number of fields on Leap line"
+ msgstr "chybn� po�et pol� v riadku Leap"
+ 
+-#: timezone/zic.c:1181
++#: timezone/zic.c:1206
+ msgid "wrong number of fields on Link line"
+ msgstr "chybn� po�et pol� v riadku Link"
+ 
+-#: timezone/zic.c:924
++#: timezone/zic.c:949
+ msgid "wrong number of fields on Rule line"
+ msgstr "chybn� po�t pol� v riadku Rule"
+ 
+-#: timezone/zic.c:994
++#: timezone/zic.c:1019
+ msgid "wrong number of fields on Zone continuation line"
+ msgstr "chybn� po�et pol� v pokra�ovacom riadku Zone"
+ 
+-#: timezone/zic.c:952
++#: timezone/zic.c:977
+ msgid "wrong number of fields on Zone line"
+ msgstr "chybn� po�et pol� v riadku Zone"
+ 
+-#: sunrpc/xdr_ref.c:84
++#: sunrpc/xdr_ref.c:85
+ msgid "xdr_reference: out of memory\n"
+ msgstr "xdr_reference: nedostatok pam�ti\n"
+ 
+@@ -4271,10 +5436,10 @@
+ msgid "xdrrec_create: out of memory\n"
+ msgstr "xdrrec_create: nedostatok pam�ti\n"
+ 
+-#: nis/ypclnt.c:884
++#: nis/ypclnt.c:907
+ msgid "yp_update: cannot convert host to netname\n"
+ msgstr "yp_update: nie je mo�n� konvertova� meno po��ta�a na meno siete\n"
+ 
+-#: nis/ypclnt.c:896
++#: nis/ypclnt.c:919
+ msgid "yp_update: cannot get server address\n"
+ msgstr "yp_update: nie je mo�n� z�sti� adresu servera\n"
diff --git a/patches/glibc/2.2.2/arm-ctl_bus_isa.patch b/patches/glibc/2.2.2/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.2.2/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch
new file mode 100644
index 00000000..db70efb2
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch
@@ -0,0 +1,56 @@
+Fixes
+initgroups.c: In function `internal_getgrouplist':
+initgroups.c:179: error: parse error before "__FUNCTION__"
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	roland@sources.redhat.com	2001-12-16 21:52:12
+
+Modified files:
+	nss            : nsswitch.c 
+	grp            : initgroups.c 
+
+Log message:
+	2001-12-16  Roland McGrath  <roland@frob.com>
+	
+	* nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal.
+	* grp/initgroups.c (internal_getgrouplist): Likewise.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc
+
+Removed 2nd hunk for glibc-2.1.3 (it was just whitespace)
+
+===================================================================
+RCS file: /cvs/glibc/libc/grp/initgroups.c,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- libc/grp/initgroups.c	2001/07/06 04:54:46	1.26
++++ libc/grp/initgroups.c	2001/12/17 05:52:11	1.27
+@@ -176,7 +176,7 @@
+ 
+       /* This is really only for debugging.  */
+       if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	__libc_fatal ("illegal status in " __FUNCTION__);
++	__libc_fatal ("illegal status in internal_getgrouplist");
+ 
+       if (status != NSS_STATUS_SUCCESS
+ 	  && nss_next_action (nip, status) == NSS_ACTION_RETURN)
+
+===================================================================
+RCS file: /cvs/glibc/libc/nss/nsswitch.c,v
+retrieving revision 1.52
+retrieving revision 1.53
+diff -u -r1.52 -r1.53
+--- libc/nss/nsswitch.c	2001/07/17 08:21:36	1.52
++++ libc/nss/nsswitch.c	2001/12/17 05:52:11	1.53
+@@ -178,7 +178,7 @@
+     {
+       /* This is really only for debugging.  */
+        if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	 __libc_fatal ("illegal status in " __FUNCTION__);
++	 __libc_fatal ("illegal status in __nss_next");
+ 
+        if (nss_next_action (*ni, status) == NSS_ACTION_RETURN)
+ 	 return 1;
diff --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch
new file mode 100644
index 00000000..b1269e09
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch
@@ -0,0 +1,73 @@
+http://sources.redhat.com/ml/bug-glibc/2003-08/msg00087.html
+
+From: Gernot Hillier <gernot dot hillier at siemens dot com>
+Organization: Siemens AG
+To: Jeffrey Bedard <jefbed at e-list dot net>, bug-glibc at gnu dot org
+Date: Mon, 18 Aug 2003 08:50:03 +0200
+References: <3F3D0899.6020004@e-list.net>
+Message-Id: <200308180850.03431.gernot.hillier@siemens.com>
+Subject: Re: Build Fails with gcc 3.3.1
+X-BeenThere: bug-glibc@gnu.org
+
+Hi!
+
+Am Freitag, 15. August 2003 18:21 schrieb Jeffrey Bedard:
+> gcc sscanf.c -c -std=gnu99 -O2 -Wall -Winline -Wstrict-prototypes
+[...]
+> sscanf.c:31: warning: conflicting types for built-in function `sscanf'
+> sscanf.c: In function `sscanf':
+> sscanf.c:37: error: `va_start' used in function with fixed args
+> .../stdio-common/_itoa.h: At top level:
+> .../stdio-common/_itoa.h:40: warning: inlining failed in call to
+> `_itoa_word' .../stdio-common/_itoa.h:76: warning: called from here
+> make[2]: ***
+> [/home/jefbed/src/packages/glibc-build/stdio-common/sscanf.o] Error 1
+
+You can find the fitting patch in the glibc CVS. You have to replace some 
+function headers. 
+
+I created a patch for glibc-2.2.5 for the same reason. I don't know if it 
+applies cleanly, but if not it should at least show you what to do...
+
+-- 
+Bye,
+
+Gernot Hillier
+Siemens AG
+
+
+
+
+Content-Disposition: attachment; filename="glibc-2.2.5-gcc-3.3.diff"
+
+diff -ur glibc-2.2.5.orig/stdio-common/sprintf.c glibc-2.2.5/stdio-common/sprintf.c
+--- glibc-2.2.5.orig/stdio-common/sprintf.c	2001-07-06 06:55:41.000000000 +0200
++++ glibc-2.2.5/stdio-common/sprintf.c	2003-08-11 13:25:48.000000000 +0200
+@@ -27,9 +27,7 @@
+ /* Write formatted output into S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sprintf (s, format)
+-     char *s;
+-     const char *format;
++sprintf (char *s, const char *format,...)
+ {
+   va_list arg;
+   int done;
+Only in glibc-2.2.5/stdio-common: sprintf.c.orig
+Only in glibc-2.2.5/stdio-common: sprintf.c.rej
+diff -ur glibc-2.2.5.orig/stdio-common/sscanf.c glibc-2.2.5/stdio-common/sscanf.c
+--- glibc-2.2.5.orig/stdio-common/sscanf.c	2001-07-06 06:55:41.000000000 +0200
++++ glibc-2.2.5/stdio-common/sscanf.c	2003-08-11 13:27:58.000000000 +0200
+@@ -27,9 +27,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sscanf (s, format)
+-     const char *s;
+-     const char *format;
++sscanf (const char *s, const char *format,...)
+ {
+   va_list arg;
+   int done;
+
diff --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch
new file mode 100644
index 00000000..ce888792
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch
@@ -0,0 +1,17 @@
+# gcc-3.x doesn't like run-on strings
+# See also http://sources.redhat.com/ml/libc-alpha/2004-01/msg00032.html
+
+--- glibc-2.1.3/csu/Makefile.old	2004-03-04 12:18:52.000000000 -0800
++++ glibc-2.1.3/csu/Makefile	2004-03-04 12:19:35.000000000 -0800
+@@ -188,8 +188,8 @@
+ 	 esac; \
+ 	 files="$(all-Banner-files)";				\
+ 	 if test -n "$$files"; then				\
+-	   echo "\"Available extensions:";			\
+-	   sed -e '/^#/d' -e 's/^[[:space:]]*/	/' $$files;	\
+-	   echo "\"";						\
++	   echo -e "\"Available extensions:\\\\n\"";		\
++  	   sed -e '/^#/d' -e 's/^[[:space:]]*/	/'		\
++	       -e 's/^\(.*\)$$/\"\1\\n\"/' $$files;		\
+ 	 fi) > $@T
+ 	mv -f $@T $@
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch
new file mode 100644
index 00000000..efd6b2a0
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch
@@ -0,0 +1,21 @@
+Works around version check:
+
+checking for i686-unknown-linux-gnu-gcc... gcc
+checking version of gcc... 3.4.2, bad
+...
+configure: error: 
+*** Some critical program is missing or too old.
+*** Check the INSTALL file for required versions.
+
+
+--- glibc-2.2.2/configure.old	2005-04-10 16:57:42.692071968 -0700
++++ glibc-2.2.2/configure	2005-04-10 16:58:52.993384544 -0700
+@@ -1437,7 +1437,7 @@
+   ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*)
++    *gcc-2.9[5-9].*|*3.[234].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch
new file mode 100644
index 00000000..b9461658
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch
@@ -0,0 +1,232 @@
+Fixes errors:
+In file included from dynamic-link.h:21,
+                 from dl-load.c:32:
+../sysdeps/i386/dl-machine.h:121: error: parse error before '.' token
+../sysdeps/i386/dl-machine.h:122: error: stray '@' in program
+../sysdeps/i386/dl-machine.h:125: error: syntax error at '#' token
+../sysdeps/i386/dl-machine.h:128: error: syntax error at '#' token
+../sysdeps/i386/dl-machine.h:129: error: syntax error at '#' token
+../sysdeps/i386/dl-machine.h:129: error: stray '`' in program
+../sysdeps/i386/dl-machine.h:129: error: missing terminating ' character
+...
+../sysdeps/i386/dl-machine.h:227:22: warning: character constant too long for its type
+../sysdeps/i386/dl-machine.h:209: error: stray '\' in program
+../sysdeps/i386/dl-machine.h:209: error: stray '\' in program
+../sysdeps/i386/dl-machine.h:209: error: stray '\' in program
+../sysdeps/i386/dl-machine.h:209: error: missing terminating " character
+../sysdeps/i386/dl-machine.h: In function `dl_platform_init':
+../sysdeps/i386/dl-machine.h:273: error: `_dl_platform' undeclared (first use in this function)
+../sysdeps/i386/dl-machine.h:273: error: (Each undeclared identifier is reported only once
+../sysdeps/i386/dl-machine.h:273: error: for each function it appears in.)
+dl-load.c: In function `_dl_map_object_from_fd':
+dl-load.c:1043: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1043: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1058: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1058: warning: use of cast expressions as lvalues is deprecated
+
+dl-runtime.c:53: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:67: error: previous declaration of 'fixup' was here
+dl-runtime.c:53: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:67: error: previous declaration of 'fixup' was here
+dl-runtime.c:135: error: conflicting types for 'profile_fixup'
+../sysdeps/i386/dl-machine.h:70: error: previous declaration of 'profile_fixup' was here
+dl-runtime.c:135: error: conflicting types for 'profile_fixup'
+../sysdeps/i386/dl-machine.h:70: error: previous declaration of 'profile_fixup' was here
+../sysdeps/i386/dl-machine.h:67: warning: 'fixup' declared `static' but never defined
+../sysdeps/i386/dl-machine.h:70: warning: 'profile_fixup' declared `static' but never defined
+
+Updated to repair breakage caused by unconditionally requiring ARCH_FIXUP_ATTRIBUTE
+to be defined.  (No wonder glibc-2.2.2 didn't build for anything but x86...)
+
+===================================================================
+--- glibc-2.2.2/sysdeps/i386/dl-machine.h.old	2005-04-11 17:45:13.000000000 -0700
++++ glibc-2.2.2/sysdeps/i386/dl-machine.h	2005-04-12 10:01:47.000000000 -0700
+@@ -63,11 +63,14 @@
+    destroys the passed register information.  */
+ /* GKM FIXME: Fix trampoline to pass bounds so we can do
+    without the `__unbounded' qualifier.  */
++
++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused))
++
+ static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset)
+-     __attribute__ ((regparm (2), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+ 				 ElfW(Addr) retaddr)
+-     __attribute__ ((regparm (3), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ #endif
+ 
+ /* Set up the loaded object described by L so its unrelocated PLT
+@@ -117,68 +120,68 @@
+    and then redirect to the address it returns.  */
+ #if !defined PROF && !__BOUNDED_POINTERS__
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.type _dl_runtime_resolve, @function
+-	.align 16
+-_dl_runtime_resolve:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note
+-	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.
+-	call fixup		# Call resolver.
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_profile, @function
+-	.align 16
+-_dl_runtime_profile:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 20(%esp), %ecx	# Load return address
+-	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note
+-	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.
+-	call profile_fixup	# Call resolver.
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_profile, .-_dl_runtime_profile
+-	.previous
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.type _dl_runtime_resolve, @function\n\
++	.align 16\n\
++_dl_runtime_resolve:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note\n\
++	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.\n\
++	call fixup		# Call resolver.\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_profile, @function\n\
++	.align 16\n\
++_dl_runtime_profile:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 20(%esp), %ecx	# Load return address\n\
++	movl 16(%esp), %edx	# Copy args pushed by PLT in register.  Note\n\
++	movl 12(%esp), %eax	# that `fixup' takes its parameters in regs.\n\
++	call profile_fixup	# Call resolver.\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
++	.previous\n\
+ ");
+ #else
+-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_resolve, @function
+-	.type _dl_runtime_profile, @function
+-	.align 16
+-_dl_runtime_resolve:
+-_dl_runtime_profile:
+-	pushl %eax		# Preserve registers otherwise clobbered.
+-	pushl %ecx
+-	pushl %edx
+-	movl 16(%esp), %edx	# Push the arguments for `fixup'
+-	movl 12(%esp), %eax
+-	pushl %edx
+-	pushl %eax
+-	call fixup		# Call resolver.
+-	popl %edx		# Pop the parameters
+-	popl %ecx
+-	popl %edx		# Get register content back.
+-	popl %ecx
+-	xchgl %eax, (%esp)	# Get %eax contents end store function address.
+-	ret $8			# Jump to function address.
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-	.size _dl_runtime_profile, .-_dl_runtime_profile
+-	.previous
++# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_resolve, @function\n\
++	.type _dl_runtime_profile, @function\n\
++	.align 16\n\
++_dl_runtime_resolve:\n\
++_dl_runtime_profile:\n\
++	pushl %eax		# Preserve registers otherwise clobbered.\n\
++	pushl %ecx\n\
++	pushl %edx\n\
++	movl 16(%esp), %edx	# Push the arguments for `fixup'\n\
++	movl 12(%esp), %eax\n\
++	pushl %edx\n\
++	pushl %eax\n\
++	call fixup		# Call resolver.\n\
++	popl %edx		# Pop the parameters\n\
++	popl %ecx\n\
++	popl %edx		# Get register content back.\n\
++	popl %ecx\n\
++	xchgl %eax, (%esp)	# Get %eax contents end store function address.\n\
++	ret $8			# Jump to function address.\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
++	.previous\n\
+ ");
+ #endif
+ 
+@@ -205,7 +208,7 @@
+ _dl_start_user:\n\
+ 	# Save the user entry point address in %edi.\n\
+ 	movl %eax, %edi\n\
+-	# Point %ebx at the GOT.
++	# Point %ebx at the GOT.\n\
+ 	call 0b\n\
+ 	addl $_GLOBAL_OFFSET_TABLE_, %ebx\n\
+ 	# Store the highest stack address\n\
+
+===================================================================
+--- glibc-2.2.2/elf/dl-runtime.c.old	2005-07-07 15:40:26.000000000 -0700
++++ glibc-2.2.2/elf/dl-runtime.c	2005-07-07 15:41:57.000000000 -0700
+@@ -33,6 +33,11 @@
+ # define VERSYMIDX(sym)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
+ #endif
+ 
++/* The fixup functions might have need special attributes.  If none
++   are provided define the macro as empty.  */
++#ifndef ARCH_FIXUP_ATTRIBUTE
++# define ARCH_FIXUP_ATTRIBUTE
++#endif
+ 
+ /* This function is called through a special trampoline from the PLT the
+    first time each PLT entry is called.  We must perform the relocation
+@@ -42,7 +47,7 @@
+    function.  */
+ 
+ #ifndef ELF_MACHINE_NO_PLT
+-static ElfW(Addr) __attribute__ ((unused))
++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE
+ fixup (
+ # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+@@ -126,7 +131,7 @@
+ 
+ #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__
+ 
+-static ElfW(Addr) __attribute__ ((unused))
++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE
+ profile_fixup (
+ #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch
new file mode 100644
index 00000000..1a9d4072
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch
@@ -0,0 +1,18 @@
+Fixes error
+../sysdeps/unix/sysv/linux/errlist.c:41: error: weak declaration of '_old_sys_nerr' must precede definition
+
+===================================================================
+--- glibc-2.2.2/sysdeps/unix/sysv/linux/errlist.c.old	2005-04-11 16:58:21.000000000 -0700
++++ glibc-2.2.2/sysdeps/unix/sysv/linux/errlist.c	2005-04-11 16:58:10.000000000 -0700
+@@ -38,10 +38,9 @@
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0);
+ #endif
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch
new file mode 100644
index 00000000..b119b929
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch
@@ -0,0 +1,811 @@
+Fixes error
+./longlong.h:423: error: parse error before '%' token
+./longlong.h:423: error: missing terminating " character
+./longlong.h:432: error: missing terminating " character
+See also patches/glibc-2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch
+
+===================================================================
+--- glibc-2.2.2/stdlib/longlong.h.old	2000-02-11 15:48:58.000000000 -0800
++++ glibc-2.2.2/stdlib/longlong.h	2005-04-11 15:36:10.000000000 -0700
+@@ -108,8 +108,8 @@
+ 
+ #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add %1,%4,%5
+-	addc %0,%2,%3"							\
++  __asm__ ("add %1,%4,%5\n"           \
++	"addc %0,%2,%3"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	    "=&r" ((USItype) (sl))					\
+ 	   : "%r" ((USItype) (ah)),					\
+@@ -117,8 +117,8 @@
+ 	     "%r" ((USItype) (al)),					\
+ 	     "rI" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub %1,%4,%5
+-	subc %0,%2,%3"							\
++  __asm__ ("sub %1,%4,%5\n"           \
++	"subc %0,%2,%3"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "r" ((USItype) (ah)),					\
+@@ -175,8 +175,8 @@
+ 
+ #if defined (__arc__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add.f	%1, %4, %5
+-	adc	%0, %2, %3"						\
++  __asm__ ("add.f	%1, %4, %5\n"       \
++	"adc	%0, %2, %3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%r" ((USItype) (ah)),					\
+@@ -184,8 +184,8 @@
+ 	     "%r" ((USItype) (al)),					\
+ 	     "rIJ" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub.f	%1, %4, %5
+-	sbc	%0, %2, %3"						\
++  __asm__ ("sub.f	%1, %4, %5\n"       \
++	"sbc	%0, %2, %3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "r" ((USItype) (ah)),					\
+@@ -206,8 +206,8 @@
+ 
+ #if defined (__arm__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("adds	%1, %4, %5
+-	adc	%0, %2, %3"						\
++  __asm__ ("adds	%1, %4, %5\n"       \
++	"adc	%0, %2, %3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%r" ((USItype) (ah)),					\
+@@ -215,8 +215,8 @@
+ 	     "%r" ((USItype) (al)),					\
+ 	     "rI" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subs	%1, %4, %5
+-	sbc	%0, %2, %3"						\
++  __asm__ ("subs	%1, %4, %5\n"       \
++	"sbc	%0, %2, %3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "r" ((USItype) (ah)),					\
+@@ -225,19 +225,19 @@
+ 	     "rI" ((USItype) (bl)))
+ #define umul_ppmm(xh, xl, a, b) \
+ {register USItype __t0, __t1, __t2;					\
+-  __asm__ ("%@ Inlined umul_ppmm
+-	mov	%2, %5, lsr #16
+-	mov	%0, %6, lsr #16
+-	bic	%3, %5, %2, lsl #16
+-	bic	%4, %6, %0, lsl #16
+-	mul	%1, %3, %4
+-	mul	%4, %2, %4
+-	mul	%3, %0, %3
+-	mul	%0, %2, %0
+-	adds	%3, %4, %3
+-	addcs	%0, %0, #65536
+-	adds	%1, %1, %3, lsl #16
+-	adc	%0, %0, %3, lsr #16"					\
++  __asm__ ("%@ Inlined umul_ppmm\n"   \
++	"mov	%2, %5, lsr #16\n"            \
++	"mov	%0, %6, lsr #16\n"            \
++	"bic	%3, %5, %2, lsl #16\n"        \
++	"bic	%4, %6, %0, lsl #16\n"        \
++	"mul	%1, %3, %4\n"                 \
++	"mul	%4, %2, %4\n"                 \
++	"mul	%3, %0, %3\n"                 \
++	"mul	%0, %2, %0\n"                 \
++	"adds	%3, %4, %3\n"                 \
++	"addcs	%0, %0, #65536\n"           \
++	"adds	%1, %1, %3, lsl #16\n"        \
++	"adc	%0, %0, %3, lsr #16"					\
+ 	   : "=&r" ((USItype) (xh)),					\
+ 	     "=r" ((USItype) (xl)),					\
+ 	     "=&r" (__t0), "=&r" (__t1), "=r" (__t2)			\
+@@ -277,8 +277,8 @@
+ 
+ #if defined (__gmicro__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add.w %5,%1
+-	addx %3,%0"							\
++  __asm__ ("add.w %5,%1\n"            \
++	"addx %3,%0"							\
+ 	   : "=g" ((USItype) (sh)),					\
+ 	     "=&g" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -286,8 +286,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "g" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub.w %5,%1
+-	subx %3,%0"							\
++  __asm__ ("sub.w %5,%1\n"            \
++	"subx %3,%0"							\
+ 	   : "=g" ((USItype) (sh)),					\
+ 	     "=&g" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -316,8 +316,8 @@
+ 
+ #if defined (__hppa) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add %4,%5,%1
+-	addc %2,%3,%0"							\
++  __asm__ ("add %4,%5,%1\n"           \
++	"addc %2,%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%rM" ((USItype) (ah)),					\
+@@ -325,8 +325,8 @@
+ 	     "%rM" ((USItype) (al)),					\
+ 	     "rM" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub %4,%5,%1
+-	subb %2,%3,%0"							\
++  __asm__ ("sub %4,%5,%1\n"           \
++	"subb %2,%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "rM" ((USItype) (ah)),					\
+@@ -357,22 +357,22 @@
+   do {									\
+     USItype __tmp;							\
+     __asm__ (								\
+-       "ldi		1,%0
+-	extru,=		%1,15,16,%%r0		; Bits 31..16 zero?
+-	extru,tr	%1,15,16,%1		; No.  Shift down, skip add.
+-	ldo		16(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,23,8,%%r0		; Bits 15..8 zero?
+-	extru,tr	%1,23,8,%1		; No.  Shift down, skip add.
+-	ldo		8(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,27,4,%%r0		; Bits 7..4 zero?
+-	extru,tr	%1,27,4,%1		; No.  Shift down, skip add.
+-	ldo		4(%0),%0		; Yes.  Perform add.
+-	extru,=		%1,29,2,%%r0		; Bits 3..2 zero?
+-	extru,tr	%1,29,2,%1		; No.  Shift down, skip add.
+-	ldo		2(%0),%0		; Yes.  Perform add.
+-	extru		%1,30,1,%1		; Extract bit 1.
+-	sub		%0,%1,%0		; Subtract it.
+-	" : "=r" (count), "=r" (__tmp) : "1" (x));			\
++       "ldi		1,%0\n"                                        \
++	"extru,=		%1,15,16,%%r0		; Bits 31..16 zero?\n"         \
++	"extru,tr	%1,15,16,%1		; No.  Shift down, skip add.\n"    \
++	"ldo		16(%0),%0		; Yes.  Perform add.\n"                \
++	"extru,=		%1,23,8,%%r0		; Bits 15..8 zero?\n"          \
++	"extru,tr	%1,23,8,%1		; No.  Shift down, skip add.\n"    \
++	"ldo		8(%0),%0		; Yes.  Perform add.\n"                \
++	"extru,=		%1,27,4,%%r0		; Bits 7..4 zero?\n"           \
++	"extru,tr	%1,27,4,%1		; No.  Shift down, skip add.\n"    \
++	"ldo		4(%0),%0		; Yes.  Perform add.\n"                \
++	"extru,=		%1,29,2,%%r0		; Bits 3..2 zero?\n"           \
++	"extru,tr	%1,29,2,%1		; No.  Shift down, skip add.\n"    \
++	"ldo		2(%0),%0		; Yes.  Perform add.\n"                \
++	"extru		%1,30,1,%1		; Extract bit 1.\n"                \
++	"sub		%0,%1,%0		; Subtract it.\n"                      \
++	: "=r" (count), "=r" (__tmp) : "1" (x));			\
+   } while (0)
+ #endif
+ 
+@@ -419,8 +419,8 @@
+ 
+ #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addl %5,%1
+-	adcl %3,%0"							\
++  __asm__ ("addl %5,%1\n"             \
++	"adcl %3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -428,8 +428,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "g" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subl %5,%1
+-	sbbl %3,%0"							\
++  __asm__ ("subl %5,%1\n"             \
++	"sbbl %3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -525,9 +525,9 @@
+ #if defined (__M32R__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+   /* The cmp clears the condition bit.  */ \
+-  __asm__ ("cmp %0,%0
+-	addx %%5,%1
+-	addx %%3,%0"							\
++  __asm__ ("cmp %0,%0\n"              \
++	"addx %%5,%1\n"                     \
++	"addx %%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -537,9 +537,9 @@
+ 	   : "cbit")
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+   /* The cmp clears the condition bit.  */ \
+-  __asm__ ("cmp %0,%0
+-	subx %5,%1
+-	subx %3,%0"							\
++  __asm__ ("cmp %0,%0\n"              \
++	"subx %5,%1\n"                      \
++	"subx %3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -551,8 +551,8 @@
+ 
+ #if defined (__mc68000__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("add%.l %5,%1
+-	addx%.l %3,%0"							\
++  __asm__ ("add%.l %5,%1\n"           \
++	"addx%.l %3,%0"							\
+ 	   : "=d" ((USItype) (sh)),					\
+ 	     "=&d" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -560,8 +560,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "g" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("sub%.l %5,%1
+-	subx%.l %3,%0"							\
++  __asm__ ("sub%.l %5,%1\n"           \
++	"subx%.l %3,%0"							\
+ 	   : "=d" ((USItype) (sh)),					\
+ 	     "=&d" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -602,32 +602,32 @@
+ #if !defined(__mcf5200__)
+ /* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX.  */
+ #define umul_ppmm(xh, xl, a, b) \
+-  __asm__ ("| Inlined umul_ppmm
+-	move%.l	%2,%/d0
+-	move%.l	%3,%/d1
+-	move%.l	%/d0,%/d2
+-	swap	%/d0
+-	move%.l	%/d1,%/d3
+-	swap	%/d1
+-	move%.w	%/d2,%/d4
+-	mulu	%/d3,%/d4
+-	mulu	%/d1,%/d2
+-	mulu	%/d0,%/d3
+-	mulu	%/d0,%/d1
+-	move%.l	%/d4,%/d0
+-	eor%.w	%/d0,%/d0
+-	swap	%/d0
+-	add%.l	%/d0,%/d2
+-	add%.l	%/d3,%/d2
+-	jcc	1f
+-	add%.l	%#65536,%/d1
+-1:	swap	%/d2
+-	moveq	%#0,%/d0
+-	move%.w	%/d2,%/d0
+-	move%.w	%/d4,%/d2
+-	move%.l	%/d2,%1
+-	add%.l	%/d1,%/d0
+-	move%.l	%/d0,%0"						\
++  __asm__ ("| Inlined umul_ppmm\n"    \
++	"move%.l	%2,%/d0\n"                \
++	"move%.l	%3,%/d1\n"                \
++	"move%.l	%/d0,%/d2\n"              \
++	"swap	%/d0\n"                       \
++	"move%.l	%/d1,%/d3\n"              \
++	"swap	%/d1\n"                       \
++	"move%.w	%/d2,%/d4\n"              \
++	"mulu	%/d3,%/d4\n"                  \
++	"mulu	%/d1,%/d2\n"                  \
++	"mulu	%/d0,%/d3\n"                  \
++	"mulu	%/d0,%/d1\n"                  \
++	"move%.l	%/d4,%/d0\n"              \
++	"eor%.w	%/d0,%/d0\n"                \
++	"swap	%/d0\n"                       \
++	"add%.l	%/d0,%/d2\n"                \
++	"add%.l	%/d3,%/d2\n"                \
++	"jcc	1f\n"                         \
++	"add%.l	%#65536,%/d1\n"             \
++"1:	swap	%/d2\n"                     \
++	"moveq	%#0,%/d0\n"                 \
++	"move%.w	%/d2,%/d0\n"              \
++	"move%.w	%/d4,%/d2\n"              \
++	"move%.l	%/d2,%1\n"                \
++	"add%.l	%/d1,%/d0\n"                \
++	"move%.l	%/d0,%0"						\
+ 	   : "=g" ((USItype) (xh)),					\
+ 	     "=g" ((USItype) (xl))					\
+ 	   : "g" ((USItype) (a)),					\
+@@ -653,8 +653,8 @@
+ 
+ #if defined (__m88000__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addu.co %1,%r4,%r5
+-	addu.ci %0,%r2,%r3"						\
++  __asm__ ("addu.co %1,%r4,%r5\n"     \
++	"addu.ci %0,%r2,%r3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%rJ" ((USItype) (ah)),					\
+@@ -662,8 +662,8 @@
+ 	     "%rJ" ((USItype) (al)),					\
+ 	     "rJ" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subu.co %1,%r4,%r5
+-	subu.ci %0,%r2,%r3"						\
++  __asm__ ("subu.co %1,%r4,%r5\n"     \
++	"subu.ci %0,%r2,%r3"						\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "rJ" ((USItype) (ah)),					\
+@@ -880,8 +880,8 @@
+ 
+ #if defined (__pyr__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addw	%5,%1
+-	addwc	%3,%0"							\
++  __asm__ ("addw	%5,%1\n"            \
++	"addwc	%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -889,8 +889,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "g" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subw	%5,%1
+-	subwb	%3,%0"							\
++  __asm__ ("subw	%5,%1\n"            \
++	"subwb	%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -902,8 +902,8 @@
+   ({union {UDItype __ll;						\
+ 	   struct {USItype __h, __l;} __i;				\
+ 	  } __xx;							\
+-  __asm__ ("movw %1,%R0
+-	uemul %2,%0"							\
++  __asm__ ("movw %1,%R0\n"          \
++	"uemul %2,%0"							\
+ 	   : "=&r" (__xx.__ll)						\
+ 	   : "g" ((USItype) (u)),					\
+ 	     "g" ((USItype) (v)));					\
+@@ -912,8 +912,8 @@
+ 
+ #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("a %1,%5
+-	ae %0,%3"							\
++  __asm__ ("a %1,%5\n"                \
++	"ae %0,%3"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -921,8 +921,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "r" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("s %1,%5
+-	se %0,%3"							\
++  __asm__ ("s %1,%5\n"                \
++	"se %0,%3"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
+@@ -933,26 +933,26 @@
+   do {									\
+     USItype __m0 = (m0), __m1 = (m1);					\
+     __asm__ (								\
+-       "s	r2,r2
+-	mts	r10,%2
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	m	r2,%3
+-	cas	%0,r2,r0
+-	mfs	r10,%1"							\
++       "s	r2,r2\n"
++	"mts	r10,%2\n"                       \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"m	r2,%3\n"                          \
++	"cas	%0,r2,r0\n"                     \
++	"mfs	r10,%1"							\
+ 	     : "=r" ((USItype) (ph)),					\
+ 	       "=r" ((USItype) (pl))					\
+ 	     : "%r" (__m0),						\
+@@ -982,9 +982,9 @@
+ #if defined (__sh2__) && W_TYPE_SIZE == 32
+ #define umul_ppmm(w1, w0, u, v) \
+   __asm__ (								\
+-       "dmulu.l	%2,%3
+-	sts	macl,%1
+-	sts	mach,%0"						\
++       "dmulu.l	%2,%3\n"            \
++	"sts	macl,%1\n"                  \
++	"sts	mach,%0"						\
+ 	   : "=r" ((USItype)(w1)),					\
+ 	     "=r" ((USItype)(w0))					\
+ 	   : "r" ((USItype)(u)),					\
+@@ -996,8 +996,8 @@
+ #if defined (__sparc__) && !defined(__arch64__) \
+     && !defined(__sparcv9) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addcc %r4,%5,%1
+-	addx %r2,%3,%0"							\
++  __asm__ ("addcc %r4,%5,%1\n"        \
++	"addx %r2,%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "%rJ" ((USItype) (ah)),					\
+@@ -1006,8 +1006,8 @@
+ 	     "rI" ((USItype) (bl))					\
+ 	   __CLOBBER_CC)
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subcc %r4,%5,%1
+-	subx %r2,%3,%0"							\
++  __asm__ ("subcc %r4,%5,%1\n"        \
++	"subx %r2,%3,%0"							\
+ 	   : "=r" ((USItype) (sh)),					\
+ 	     "=&r" ((USItype) (sl))					\
+ 	   : "rJ" ((USItype) (ah)),					\
+@@ -1040,45 +1040,45 @@
+ 	   : "r" ((USItype) (u)),					\
+ 	     "r" ((USItype) (v)))
+ #define udiv_qrnnd(q, r, n1, n0, d) \
+-  __asm__ ("! Inlined udiv_qrnnd
+-	wr	%%g0,%2,%%y	! Not a delayed write for sparclite
+-	tst	%%g0
+-	divscc	%3,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%%g1
+-	divscc	%%g1,%4,%0
+-	rd	%%y,%1
+-	bl,a 1f
+-	add	%1,%4,%1
+-1:	! End of inline udiv_qrnnd"					\
++  __asm__ ("! Inlined udiv_qrnnd\n"                      \
++	"wr	%%g0,%2,%%y	! Not a delayed write for sparclite\n" \
++	"tst	%%g0\n"                                          \
++	"divscc	%3,%4,%%g1\n"                                  \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%%g1\n"                                \
++	"divscc	%%g1,%4,%0\n"                                  \
++	"rd	%%y,%1\n"                                          \
++	"bl,a 1f\n"                                            \
++	"add	%1,%4,%1\n"                                      \
++"1:	! End of inline udiv_qrnnd"					\
+ 	   : "=r" ((USItype) (q)),					\
+ 	     "=r" ((USItype) (r))					\
+ 	   : "r" ((USItype) (n1)),					\
+@@ -1099,46 +1099,46 @@
+ /* SPARC without integer multiplication and divide instructions.
+    (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */
+ #define umul_ppmm(w1, w0, u, v) \
+-  __asm__ ("! Inlined umul_ppmm
+-	wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr
+-	sra	%3,31,%%o5	! Don't move this insn
+-	and	%2,%%o5,%%o5	! Don't move this insn
+-	andcc	%%g0,0,%%g1	! Don't move this insn
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,%3,%%g1
+-	mulscc	%%g1,0,%%g1
+-	add	%%g1,%%o5,%0
+-	rd	%%y,%1"							\
++  __asm__ ("! Inlined umul_ppmm\n"                         \
++	"wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr\n" \
++	"sra	%3,31,%%o5	! Don't move this insn\n"              \
++	"and	%2,%%o5,%%o5	! Don't move this insn\n"            \
++	"andcc	%%g0,0,%%g1	! Don't move this insn\n"            \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,%3,%%g1\n"                                  \
++	"mulscc	%%g1,0,%%g1\n"                                   \
++	"add	%%g1,%%o5,%0\n"                                    \
++	"rd	%%y,%1"							\
+ 	   : "=r" ((USItype) (w1)),					\
+ 	     "=r" ((USItype) (w0))					\
+ 	   : "%rI" ((USItype) (u)),					\
+@@ -1148,30 +1148,30 @@
+ /* It's quite necessary to add this much assembler for the sparc.
+    The default udiv_qrnnd (in C) is more than 10 times slower!  */
+ #define udiv_qrnnd(q, r, n1, n0, d) \
+-  __asm__ ("! Inlined udiv_qrnnd
+-	mov	32,%%g1
+-	subcc	%1,%2,%%g0
+-1:	bcs	5f
+-	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+-	sub	%1,%2,%1	! this kills msb of n
+-	addx	%1,%1,%1	! so this can't give carry
+-	subcc	%%g1,1,%%g1
+-2:	bne	1b
+-	 subcc	%1,%2,%%g0
+-	bcs	3f
+-	 addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb
+-	b	3f
+-	 sub	%1,%2,%1	! this kills msb of n
+-4:	sub	%1,%2,%1
+-5:	addxcc	%1,%1,%1
+-	bcc	2b
+-	 subcc	%%g1,1,%%g1
+-! Got carry from n.  Subtract next step to cancel this carry.
+-	bne	4b
+-	 addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb
+-	sub	%1,%2,%1
+-3:	xnor	%0,0,%0
+-	! End of inline udiv_qrnnd"					\
++  __asm__ ("! Inlined udiv_qrnnd\n"                                 \
++	"mov	32,%%g1\n"                                                  \
++	"subcc	%1,%2,%%g0\n"                                             \
++"1:	bcs	5f\n"                                                       \
++	 "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n"              \
++	"sub	%1,%2,%1	! this kills msb of n\n"                          \
++	"addx	%1,%1,%1	! so this can't give carry\n"                     \
++	"subcc	%%g1,1,%%g1\n"                                            \
++"2:	bne	1b\n"                                                       \
++	 "subcc	%1,%2,%%g0\n"                                             \
++	"bcs	3f\n"                                                       \
++	 "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n"              \
++	"b	3f\n"                                                         \
++	 "sub	%1,%2,%1	! this kills msb of n\n"                          \
++"4:	sub	%1,%2,%1\n"                                                 \
++"5:	addxcc	%1,%1,%1\n"                                             \
++	"bcc	2b\n"                                                       \
++	 "subcc	%%g1,1,%%g1\n"                                            \
++"! Got carry from n.  Subtract next step to cancel this carry.\n"   \
++	"bne	4b\n"                                                       \
++	 "addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb\n"              \
++	"sub	%1,%2,%1\n"                                                 \
++"3:	xnor	%0,0,%0\n"                                                \
++	"! End of inline udiv_qrnnd"					\
+ 	   : "=&r" ((USItype) (q)),					\
+ 	     "=&r" ((USItype) (r))					\
+ 	   : "r" ((USItype) (d)),					\
+@@ -1185,11 +1185,11 @@
+ #if ((defined (__sparc__) && defined (__arch64__)) \
+      || defined (__sparcv9)) && W_TYPE_SIZE == 64
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl)				\
+-  __asm__ ("addcc %r4,%5,%1
+-  	    add %r2,%3,%0
+-  	    bcs,a,pn %%xcc, 1f
+-  	    add %0, 1, %0
+-  	    1:"								\
++  __asm__ ("addcc %r4,%5,%1\n"            \
++  	    "add %r2,%3,%0\n"                 \
++  	    "bcs,a,pn %%xcc, 1f\n"            \
++  	    "add %0, 1, %0\n"                 \
++  	    "1:"								\
+ 	   : "=r" ((UDItype)(sh)),				      	\
+ 	     "=&r" ((UDItype)(sl))				      	\
+ 	   : "%rJ" ((UDItype)(ah)),				     	\
+@@ -1199,11 +1199,11 @@
+ 	   __CLOBBER_CC)
+ 
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) 				\
+-  __asm__ ("subcc %r4,%5,%1
+-  	    sub %r2,%3,%0
+-  	    bcs,a,pn %%xcc, 1f
+-  	    sub %0, 1, %0
+-  	    1:"								\
++  __asm__ ("subcc %r4,%5,%1\n"            \
++  	    "sub %r2,%3,%0\n"                 \
++  	    "bcs,a,pn %%xcc, 1f\n"            \
++  	    "sub %0, 1, %0\n"                 \
++  	    "1:"								\
+ 	   : "=r" ((UDItype)(sh)),				      	\
+ 	     "=&r" ((UDItype)(sl))				      	\
+ 	   : "rJ" ((UDItype)(ah)),				     	\
+@@ -1216,27 +1216,27 @@
+   do {									\
+ 	  UDItype tmp1, tmp2, tmp3, tmp4;				\
+ 	  __asm__ __volatile__ (					\
+-		   "srl %7,0,%3
+-		    mulx %3,%6,%1
+-		    srlx %6,32,%2
+-		    mulx %2,%3,%4
+-		    sllx %4,32,%5
+-		    srl %6,0,%3
+-		    sub %1,%5,%5
+-		    srlx %5,32,%5
+-		    addcc %4,%5,%4
+-		    srlx %7,32,%5
+-		    mulx %3,%5,%3
+-		    mulx %2,%5,%5
+-		    sethi %%hi(0x80000000),%2
+-		    addcc %4,%3,%4
+-		    srlx %4,32,%4
+-		    add %2,%2,%2
+-		    movcc %%xcc,%%g0,%2
+-		    addcc %5,%4,%5
+-		    sllx %3,32,%3
+-		    add %1,%3,%1
+-		    add %5,%2,%0"					\
++		   "srl %7,0,%3\n"                     \
++		    "mulx %3,%6,%1\n"                  \
++		    "srlx %6,32,%2\n"                  \
++		    "mulx %2,%3,%4\n"                  \
++		    "sllx %4,32,%5\n"                  \
++		    "srl %6,0,%3\n"                    \
++		    "sub %1,%5,%5\n"                   \
++		    "srlx %5,32,%5\n"                  \
++		    "addcc %4,%5,%4\n"                 \
++		    "srlx %7,32,%5\n"                  \
++		    "mulx %3,%5,%3\n"                  \
++		    "mulx %2,%5,%5\n"                  \
++		    "sethi %%hi(0x80000000),%2\n"      \
++		    "addcc %4,%3,%4\n"                 \
++		    "srlx %4,32,%4\n"                  \
++		    "add %2,%2,%2\n"                   \
++		    "movcc %%xcc,%%g0,%2\n"            \
++		    "addcc %5,%4,%5\n"                 \
++		    "sllx %3,32,%3\n"                  \
++		    "add %1,%3,%1\n"                   \
++		    "add %5,%2,%0"					\
+ 	   : "=r" ((UDItype)(wh)),					\
+ 	     "=&r" ((UDItype)(wl)),					\
+ 	     "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)	\
+@@ -1250,8 +1250,8 @@
+ 
+ #if defined (__vax__) && W_TYPE_SIZE == 32
+ #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("addl2 %5,%1
+-	adwc %3,%0"							\
++  __asm__ ("addl2 %5,%1\n"            \
++	"adwc %3,%0"							\
+ 	   : "=g" ((USItype) (sh)),					\
+ 	     "=&g" ((USItype) (sl))					\
+ 	   : "%0" ((USItype) (ah)),					\
+@@ -1259,8 +1259,8 @@
+ 	     "%1" ((USItype) (al)),					\
+ 	     "g" ((USItype) (bl)))
+ #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+-  __asm__ ("subl2 %5,%1
+-	sbwc %3,%0"							\
++  __asm__ ("subl2 %5,%1\n"            \
++	"sbwc %3,%0"							\
+ 	   : "=g" ((USItype) (sh)),					\
+ 	     "=&g" ((USItype) (sl))					\
+ 	   : "0" ((USItype) (ah)),					\
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch b/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch
new file mode 100644
index 00000000..a14e1d45
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch
@@ -0,0 +1,30 @@
+Fixes undefined symbol _fp_hw required by the ABI:
+readelf -s /opt/crosstool/i686-pc-linux-gnu/i686-unknown-linux-gnu/gcc-3.4.3-glibc-2.2.2/i686-unknown-linux-gnu/lib/crt1.o | grep fp_hw
+    29: 00000000     4 NOTYPE  GLOBAL DEFAULT  UND _fp_hw 
+Rumored to fix problems with icc, which gets upset at any symbol
+which is undefined, even if nobody cares about it.
+
+Revision 1.16, Thu Feb 22 19:57:34 2001 UTC (4 years, 2 months ago) by drepper
+Branch: MAIN
+CVS Tags: glibc-2_2_3
+Changes since 1.15: +1 -1 lines
+Diff to previous 1.15 (colored)
+
+(_fp_hw): Actually define label.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/elf/start.S,v
+retrieving revision 1.15
+retrieving revision 1.16
+diff -u -r1.15 -r1.16
+--- libc/sysdeps/i386/elf/start.S	2001/02/03 21:34:54	1.15
++++ libc/sysdeps/i386/elf/start.S	2001/02/22 19:57:34	1.16
+@@ -85,7 +85,7 @@
+    meaningless since we don't support machines < 80386.  */
+ 	.section .rodata
+ 	.globl _fp_hw
+-	.long 3
++_fp_hw:	.long 3
+ 	.size _fp_hw, 4
+ 
+ /* Define a symbol for the first piece of initialized data.  */
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch b/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch
new file mode 100644
index 00000000..eae6fec3
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch
@@ -0,0 +1,36 @@
+I'm testing toolchains with glibc-2.2.2 now.  It looks ok except
+that glibc-2.2.2 headers contain the gosh-awful line
+  #  define printf(fmt, args...) fprintf (stdout, fmt, ##args)
+which causes builds of programs with methods named 'printf' to fail with
+  error: `stdout' is not a type
+Feh.
+
+Revision 1.8, Thu Aug 2 16:09:51 2001 UTC (3 years, 9 months ago) by aj
+Branch: MAIN
+CVS Tags: glibc-2_3_2, glibc-2_2_4, glibc-2-3-1, glibc-2-3, glibc-2-2-branch, glibc-2-2-5
+
+(printf): Remove printf optimization since GCC 3.0 can optimize printf.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/libio/bits/stdio.h.diff?r1=1.7&r2=1.8&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/libio/bits/stdio.h,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- libc/libio/bits/stdio.h	2001/07/06 04:55:32	1.7
++++ libc/libio/bits/stdio.h	2001/08/02 16:09:51	1.8
+@@ -29,13 +29,6 @@
+ 
+ 
+ #ifdef __USE_EXTERN_INLINES
+-/* Since version 2.97 GCC knows about `fprintf' and can optimize certain
+-   cases.  Help gcc to optimize more code by mapping `printf' to the known
+-   `fprintf' function.  Unfortunately we have to use a macro.  */
+-# if __GNUC_PREREQ (2,97)
+-#  define printf(fmt, args...) fprintf (stdout, fmt, ##args)
+-# endif
+-
+ /* Write formatted output to stdout from argument list ARG.  */
+ __STDIO_INLINE int
+ vprintf (__const char *__restrict __fmt, _G_va_list __arg) __THROW
diff --git a/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch b/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch
new file mode 100644
index 00000000..1a48c00a
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch
@@ -0,0 +1,60 @@
+Backport a bugfix from glibc-2.2.5 to glibc-2.2.2 for the following problem:
+  When syslog-ng is restarted (or HUPed), vixie-cron (and probably other
+  programs) stop logging to syslog.
+
+
+2001-08-27 Ulrich Drepper <Drepper@redhat.com> * misc/syslog.c (vsyslog):
+  Try a bit harder to use syslogd.  If the connection went down after we
+  first used it try to connect again and resend the message before printing
+  to the console.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/misc/Attic/syslog.c.diff?r1=1.32&r2=1.30&cvsroot=glibc
+[ paths adjusted ]
+
+===================================================================
+RCS file: /cvs/glibc/libc/misc/Attic/syslog.c,v
+retrieving revision 1.30
+retrieving revision 1.32
+diff -u -r1.30 -r1.32
+--- glibc-2.2.2/misc/syslog.c	2001/08/24 03:21:14	1.30
++++ glibc-2.2.5/misc/syslog.c	2001/08/30 23:13:49	1.32
+@@ -239,17 +239,29 @@
+ 
+ 	if (!connected || __send(LogFile, buf, bufsize, 0) < 0)
+ 	  {
+-	    closelog_internal ();	/* attempt re-open next time */
+-	    /*
+-	     * Output the message to the console; don't worry about blocking,
+-	     * if console blocks everything will.  Make sure the error reported
+-	     * is the one from the syslogd failure.
+-	     */
+-	    if (LogStat & LOG_CONS &&
+-		(fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)
++	    if (connected)
+ 	      {
+-		dprintf (fd, "%s\r\n", buf + msgoff);
+-		(void)__close(fd);
++		/* Try to reopen the syslog connection.  Maybe it went
++		   down.  */
++		closelog_internal ();
++		openlog_internal(LogTag, LogStat | LOG_NDELAY, 0);
++	      }
++
++	    if (!connected || __send(LogFile, buf, bufsize, 0) < 0)
++	      {
++		closelog_internal ();	/* attempt re-open next time */
++		/*
++		 * Output the message to the console; don't worry
++		 * about blocking, if console blocks everything will.
++		 * Make sure the error reported is the one from the
++		 * syslogd failure.
++		 */
++		if (LogStat & LOG_CONS &&
++		    (fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)
++		  {
++		    dprintf (fd, "%s\r\n", buf + msgoff);
++		    (void)__close(fd);
++		  }
+ 	      }
+ 	  }
+ 
diff --git a/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch
new file mode 100644
index 00000000..89cc9ead
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch
@@ -0,0 +1,58 @@
+Fix for this error:
+
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.)
+make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+[ Same as glibc-2.3.2-alpha-pwrite.patch except for copyright date ]
+
+extracted from GLIBC CVS by Dan Kegel
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc'
+(to match context of...)
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc'
+and rediffed.
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+Originally thought we needed this hunk, too:
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html
+but it seems the sysdep.h change is sufficient, and works better 
+when compiling against linux-2.4.
+
+===================================================================
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old	2004-05-24 22:21:44.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h	2004-05-24 22:22:48.000000000 -0700
+@@ -1,3 +1,3 @@
+-/* Copyright (C) 1992, 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+@@ -60,6 +60,21 @@
+ #define __NR_osf_getsysinfo	256
+ #define __NR_osf_setsysinfo	257
+ 
++/* Help old kernel headers where particular syscalls are not available.  */
++#ifndef __NR_semtimedop
++# define __NR_semtimedop	423
++#endif
++
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ /*
+  * In order to get the hidden arguments for rt_sigaction set up
+  * properly, we need to call the assembly version.  Detect this in the
diff --git a/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch
new file mode 100644
index 00000000..c4bd19c7
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch
@@ -0,0 +1,30 @@
+Should fix
+
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.)
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+
+Copied from similar patch for alpha.
+
+--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/arm/sysdep.h	2001-07-05 21:56:13.000000000 -0700
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h	2004-08-07 10:45:26.000000000 -0700
+@@ -32,6 +32,15 @@
+ #define SWI_BASE  (0x900000)
+ #define SYS_ify(syscall_name)	(__NR_##syscall_name)
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
+ 
+ #ifdef __ASSEMBLER__
+ 
diff --git a/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch
new file mode 100644
index 00000000..761771f8
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch
@@ -0,0 +1,20 @@
+diff -urN glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h
+--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h	2001-07-06 06:56:16.000000000 +0200
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h	2004-09-03 12:35:44.000000000 +0200
+@@ -36,6 +36,16 @@
+ #undef L
+ #define L(name)	.L##name
+ 
++/* This is a kludge to make syscalls.list find these under the names
++ *    pread and pwrite, since some kernel headers define those names
++ *       and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ #ifdef __ASSEMBLER__
+ 
+ /* Linux uses a negative return value to indicate syscall errors,
diff --git a/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch b/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch
new file mode 100644
index 00000000..eefc6fa7
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch
@@ -0,0 +1,32 @@
+Copied from similar patch for other architectures.
+
+Should fix this error:
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:53: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:53: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:53: for each function it appears in.)
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h.old	2004-10-05 08:37:37.000000000 -0700
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h	2004-10-05 08:38:22.000000000 -0700
+@@ -32,6 +32,16 @@
+ # define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ #ifdef __ASSEMBLER__
+ 
+ /* Linux uses a negative return value to indicate syscall errors, unlike
diff --git a/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch
new file mode 100644
index 00000000..70245a6f
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch
@@ -0,0 +1,18 @@
+===================================================================
+RCS file: /cvs/glibc/libc/manual/stdio.texi,v
+retrieving revision 1.126
+retrieving revision 1.127
+diff -u -r1.126 -r1.127
+--- libc/manual/stdio.texi	2001/06/06 07:11:31	1.126
++++ libc/manual/stdio.texi	2001/07/31 18:57:16	1.127
+@@ -3265,8 +3265,8 @@
+ If you are trying to read input that doesn't match a single, fixed
+ pattern, you may be better off using a tool such as Flex to generate a
+ lexical scanner, or Bison to generate a parser, rather than using
+-@code{scanf}.  For more information about these tools, see @ref{, , ,
+-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , ,
++@code{scanf}.  For more information about these tools, see @ref{Top, , ,
++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , ,
+ bison.info, The Bison Reference Manual}.
+ 
+ @node Input Conversion Syntax
diff --git a/patches/glibc/2.2.2/glibc-nss-noopt.patch b/patches/glibc/2.2.2/glibc-nss-noopt.patch
new file mode 100644
index 00000000..28aa2e14
--- /dev/null
+++ b/patches/glibc/2.2.2/glibc-nss-noopt.patch
@@ -0,0 +1,26 @@
+--- glibc-2.2.2/nss/Makefile.orig	Tue May 20 16:02:47 2003
++++ glibc-2.2.2/nss/Makefile	Tue May 20 16:03:52 2003
+@@ -41,6 +41,10 @@
+ 
+ tests			= test-netdb
+ 
++# Disable optimization when building nss to avoid crash described in
++# http://gcc.gnu.org/ml/gcc-bugs/1998-06/msg00168.html
++default_cflags := -g -O0
++
+ include ../Makeconfig
+ 
+ ifeq (yes,$(build-static-nss))
+--- glibc-2.2.2/locale/Makefile.orig	Tue May 20 17:29:11 2003
++++ glibc-2.2.2/locale/Makefile	Tue May 20 17:29:39 2003
+@@ -66,6 +66,10 @@
+ GPERF = gperf
+ GPERFFLAGS = -acCgopt -k1,2,5,9,$$ -L ANSI-C
+ 
++# Disable optimization when building locale or nss to avoid crash described in
++# http://gcc.gnu.org/ml/gcc-bugs/1998-06/msg00168.html
++default_cflags := -g -O0
++
+ include ../Rules
+ 
+ programs/%-kw.h: programs/%-kw.gperf
diff --git a/patches/glibc/2.2.2/tst-pathopt-cross.patch b/patches/glibc/2.2.2/tst-pathopt-cross.patch
new file mode 100644
index 00000000..f64d673c
--- /dev/null
+++ b/patches/glibc/2.2.2/tst-pathopt-cross.patch
@@ -0,0 +1,23 @@
+Fixes error
+tst-pathopt.sh: /crosstool-0.20/build/powerpc-750-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-glibc/elf/ld.so: cannot execute binary file
+make[2]: *** [/crosstool-0.20/build/powerpc-750-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-glibc/elf/tst-pathopt.out] Error 126
+See also http://sources.redhat.com/ml/libc-alpha/2001-03/msg00113.html
+
+===================================================================
+RCS file: /cvs/glibc/libc/elf/Makefile,v
+retrieving revision 1.196
+retrieving revision 1.197
+diff -u -r1.196 -r1.197
+--- libc/elf/Makefile	2001/03/16 07:29:45	1.196
++++ libc/elf/Makefile	2001/03/25 04:57:51	1.197
+@@ -246,8 +246,10 @@
+ generated += $(addsuffix .so,$(strip $(modules-names)))
+ 
+ ifeq (yes,$(build-shared))
++ifeq ($(cross-compiling),no)
+ tests: $(objpfx)tst-pathopt.out
+ endif
++endif
+ 
+ $(objpfx)testobj1.so: $(libdl)
+ $(objpfx)testobj1_1.so: $(objpfx)testobj1.so $(libdl)
diff --git a/patches/glibc/2.2.3/errlist-1.9.patch b/patches/glibc/2.2.3/errlist-1.9.patch
new file mode 100644
index 00000000..594569be
--- /dev/null
+++ b/patches/glibc/2.2.3/errlist-1.9.patch
@@ -0,0 +1,30 @@
+Fixes:
+
+../sysdeps/unix/sysv/linux/errlist.c:41: weak declaration of `_old_sys_nerr' must precede definition
+make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/stdio-common/errlist.os] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Attic/errlist.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/sysdeps/unix/sysv/linux/errlist.c	2001/07/06 04:56:12	1.8
++++ libc/sysdeps/unix/sysv/linux/errlist.c	2002/05/20 06:56:53	1.9
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -38,10 +38,9 @@
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0);
+ #endif
diff --git a/patches/glibc/2.2.3/errlist-arm.patch b/patches/glibc/2.2.3/errlist-arm.patch
new file mode 100644
index 00000000..ac4eb5be
--- /dev/null
+++ b/patches/glibc/2.2.3/errlist-arm.patch
@@ -0,0 +1,48 @@
+Subject: patch for arm
+From: Philip Blundell <Philip dot Blundell at pobox dot com>
+To: libc-hacker at sources dot redhat dot com
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+Date: 22 Jul 2002 20:12:06 +0100
+Message-Id: <1027365126.725.10.camel@kc>
+Mime-Version: 1.0
+
+The mainline seems to need this patch in order to compile.
+
+p.
+
+2002-07-22  Philip Blundell  <philb@gnu.org>
+
+	* sysdeps/unix/sysv/linux/arm/errlist.c: Remove extra weak alias
+	definiton of _old_sys_nerr.  Define _old_sys_errlist as strong
+	alias.
+
+Index: sysdeps/unix/sysv/linux/arm/errlist.c
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/errlist.c,v
+retrieving revision 1.4
+diff -u -p -r1.4 errlist.c
+--- glibc/sysdeps/unix/sysv/linux/arm/errlist.c	6 Jul 2001 04:56:13 -0000	1.4
++++ glibc/sysdeps/unix/sysv/linux/arm/errlist.c	22 Jul 2002 19:10:57 -0000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -38,10 +38,9 @@ extern const char *const *__old_sys_errl
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0);
+ #endif
+
+
+
+
diff --git a/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch b/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch
new file mode 100644
index 00000000..1773002c
--- /dev/null
+++ b/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch
@@ -0,0 +1,276 @@
+From http://www.ltc.com/~brad/mips/glibc-2.2.3-mips-base-addr-got.diff
+
+Hopefully fixes the error:
+
+/opt/crosstool/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/../../../../mipsel-unknown-linux-gnu/bin/ld: target elf32-littlemips not found
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/elf/ld.so] Error 1
+
+
+diff -urNbB glibc-2.2.3/sysdeps/mips/dl-machine.h glibc-2.2.3-mips/sysdeps/mips/dl-machine.h
+--- glibc-2.2.3/sysdeps/mips/dl-machine.h	Mon Mar 26 23:53:28 2001
++++ glibc-2.2.3-mips/sysdeps/mips/dl-machine.h	Sun Aug 12 11:08:17 2001
+@@ -61,23 +61,6 @@
+    in l_info array.  */
+ #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM)
+ 
+-/*
+- * MIPS libraries are usually linked to a non-zero base address.  We
+- * subtract the base address from the address where we map the object
+- * to.  This results in more efficient address space usage.
+- *
+- * FIXME: By the time when MAP_BASE_ADDR is called we don't have the
+- * DYNAMIC section read.  Until this is fixed make the assumption that
+- * libraries have their base address at 0x5ffe0000.  This needs to be
+- * fixed before we can safely get rid of this MIPSism.
+- */
+-#if 0
+-#define MAP_BASE_ADDR(l) ((l)->l_info[DT_MIPS(BASE_ADDRESS)] ? \
+-			  (l)->l_info[DT_MIPS(BASE_ADDRESS)]->d_un.d_ptr : 0)
+-#else
+-#define MAP_BASE_ADDR(l) 0x5ffe0000
+-#endif
+-
+ /* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in
+    with the run-time address of the r_debug structure  */
+ #define ELF_MACHINE_DEBUG_SETUP(l,r) \
+@@ -557,51 +540,30 @@
+   /* Do nothing.  */
+ }
+ 
++#ifndef RTLD_BOOTSTRAP
+ /* Relocate GOT. */
+ static inline void
+ elf_machine_got_rel (struct link_map *map, int lazy)
+ {
+   ElfW(Addr) *got;
+   ElfW(Sym) *sym;
++  const ElfW(Half) *vernum;
+   int i, n, symidx;
+-  /*  This function is loaded in dl-reloc as a nested function and can
+-      therefore access the variables scope and strtab from
+-      _dl_relocate_object.  */
+-#ifdef RTLD_BOOTSTRAP
+-# define RESOLVE_GOTSYM(sym,sym_index) 0
+-#else
+-# define RESOLVE_GOTSYM(sym,sym_index)					  \
++
++#define RESOLVE_GOTSYM(sym,vernum,sym_index)				  \
+     ({									  \
+       const ElfW(Sym) *ref = sym;					  \
++      const struct r_found_version *version				  \
++        = vernum ? &map->l_versions [vernum [sym_index]] : NULL;	  \
+       ElfW(Addr) value;							  \
+-									  \
+-      switch (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)		  \
+-	{								  \
+-	default:							  \
+-	  {								  \
+-	    const ElfW(Half) *vernum =					  \
+-	      (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);  \
+-	    ElfW(Half) ndx = vernum[sym_index];				  \
+-	    const struct r_found_version *version = &l->l_versions[ndx];  \
+-									  \
+-	    if (version->hash != 0)					  \
+-	      {								  \
+-		value = _dl_lookup_versioned_symbol(strtab + sym->st_name,\
+-						    map,		  \
+-						    &ref, scope, version, \
+-						    R_MIPS_REL32, 0);	  \
+-		break;							  \
+-	      }								  \
+-	    /* Fall through.  */					  \
+-	  }								  \
+-	case 0:								  \
+-	  value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref,	  \
+-				     scope, R_MIPS_REL32, 0);		  \
+-	}								  \
+-									  \
++      value = RESOLVE (&ref, version, R_MIPS_REL32);			  \
+       (ref)? value + ref->st_value: 0;					  \
+     })
+-#endif /* RTLD_BOOTSTRAP */
++
++  if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
++    vernum = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
++  else
++    vernum = NULL;
+ 
+   got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);
+ 
+@@ -639,10 +601,10 @@
+ 	      && sym->st_value && lazy)
+ 	    *got = sym->st_value + map->l_addr;
+ 	  else
+-	    *got = RESOLVE_GOTSYM (sym, symidx);
++	    *got = RESOLVE_GOTSYM (sym, vernum, symidx);
+ 	}
+       else if (sym->st_shndx == SHN_COMMON)
+-	*got = RESOLVE_GOTSYM (sym, symidx);
++	*got = RESOLVE_GOTSYM (sym, vernum, symidx);
+       else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC
+ 	       && *got != sym->st_value
+ 	       && lazy)
+@@ -653,7 +615,7 @@
+ 	    *got += map->l_addr;
+ 	}
+       else
+-	*got = RESOLVE_GOTSYM (sym, symidx);
++	*got = RESOLVE_GOTSYM (sym, vernum, symidx);
+ 
+       ++got;
+       ++sym;
+@@ -661,9 +623,8 @@
+     }
+ 
+ #undef RESOLVE_GOTSYM
+-
+-  return;
+ }
++#endif
+ 
+ /* Set up the loaded object described by L so its stub function
+    will jump to the on-demand fixup code __dl_runtime_resolve.  */
+diff -urNbB glibc-2.2.3/sysdeps/mips/mips64/rtld-parms glibc-2.2.3-mips/sysdeps/mips/mips64/rtld-parms
+--- glibc-2.2.3/sysdeps/mips/mips64/rtld-parms	Sat Jul 12 18:26:11 1997
++++ glibc-2.2.3-mips/sysdeps/mips/mips64/rtld-parms	Wed Dec 31 19:00:00 1969
+@@ -1,3 +0,0 @@
+-ifndef rtld-wordsize
+-rtld-wordsize = 64
+-endif
+diff -urNbB glibc-2.2.3/sysdeps/mips/mipsel/rtld-parms glibc-2.2.3-mips/sysdeps/mips/mipsel/rtld-parms
+--- glibc-2.2.3/sysdeps/mips/mipsel/rtld-parms	Sat Jul 12 18:26:15 1997
++++ glibc-2.2.3-mips/sysdeps/mips/mipsel/rtld-parms	Wed Dec 31 19:00:00 1969
+@@ -1,3 +0,0 @@
+-ifndef rtld-oformat
+-rtld-oformat = elf32-littlemips
+-endif
+diff -urNbB glibc-2.2.3/sysdeps/mips/rtld-ldscript.in glibc-2.2.3-mips/sysdeps/mips/rtld-ldscript.in
+--- glibc-2.2.3/sysdeps/mips/rtld-ldscript.in	Sat Jul 12 18:23:14 1997
++++ glibc-2.2.3-mips/sysdeps/mips/rtld-ldscript.in	Wed Dec 31 19:00:00 1969
+@@ -1,106 +0,0 @@
+-OUTPUT_FORMAT("@@rtld-oformat@@")
+-OUTPUT_ARCH(@@rtld-arch@@)
+-ENTRY(@@rtld-entry@@)
+-SECTIONS
+-{
+-  /* Read-only sections, merged into text segment: */
+-  . = @@rtld-base@@;
+-  .reginfo       : { *(.reginfo) }
+-  .dynamic       : { *(.dynamic) }
+-  .dynstr        : { *(.dynstr)		}
+-  .dynsym        : { *(.dynsym)		}
+-  .hash          : { *(.hash)		}
+-  .rel.text      : { *(.rel.text)		}
+-  .rela.text     : { *(.rela.text) 	}
+-  .rel.data      : { *(.rel.data)		}
+-  .rela.data     : { *(.rela.data) 	}
+-  .rel.rodata    : { *(.rel.rodata) 	}
+-  .rela.rodata   : { *(.rela.rodata) 	}
+-  .rel.got       : { *(.rel.got)		}
+-  .rela.got      : { *(.rela.got)		}
+-  .rel.ctors     : { *(.rel.ctors)	}
+-  .rela.ctors    : { *(.rela.ctors)	}
+-  .rel.dtors     : { *(.rel.dtors)	}
+-  .rela.dtors    : { *(.rela.dtors)	}
+-  .rel.init      : { *(.rel.init)	}
+-  .rela.init     : { *(.rela.init)	}
+-  .rel.fini      : { *(.rel.fini)	}
+-  .rela.fini     : { *(.rela.fini)	}
+-  .rel.bss       : { *(.rel.bss)		}
+-  .rela.bss      : { *(.rela.bss)		}
+-  .rel.plt       : { *(.rel.plt)		}
+-  .rela.plt      : { *(.rela.plt)		}
+-  .rodata    : { *(.rodata)  }
+-  .rodata1   : { *(.rodata1) }
+-  .init          : { *(.init)	} =0
+-  .text      :
+-  {
+-    *(.text)
+-    *(.stub)
+-    /* .gnu.warning sections are handled specially by elf32.em.  */
+-    *(.gnu.warning)
+-  } =0
+-  .fini      : { *(.fini)    } =0
+-  /* Adjust the address for the data segment.  We want to adjust up to
+-     the same address within the page on the next page up.  It would
+-     be more correct to do this:
+-       . = 0x10000000;
+-     The current expression does not correctly handle the case of a
+-     text segment ending precisely at the end of a page; it causes the
+-     data segment to skip a page.  The above expression does not have
+-     this problem, but it will currently (2/95) cause BFD to allocate
+-     a single segment, combining both text and data, for this case.
+-     This will prevent the text segment from being shared among
+-     multiple executions of the program; I think that is more
+-     important than losing a page of the virtual address space (note
+-     that no actual memory is lost; the page which is skipped can not
+-     be referenced).  */
+-  . += 0x10000;
+-  .data    :
+-  {
+-    *(.data)
+-    CONSTRUCTORS
+-  }
+-  .data1   : { *(.data1) }
+-  .ctors         : { *(.ctors)   }
+-  .dtors         : { *(.dtors)   }
+-  _gp = ALIGN(16) + 0x7ff0;
+-  .got           :
+-  {
+-    *(.got.plt) *(.got)
+-   }
+-  /* We want the small data sections together, so single-instruction offsets
+-     can access them all, and initialized data all before uninitialized, so
+-     we can shorten the on-disk segment size.  */
+-  .sdata     : { *(.sdata) }
+-  .lit8 : { *(.lit8) }
+-  .lit4 : { *(.lit4) }
+-  .sbss      : { *(.sbss) *(.scommon) }
+-  .bss       :
+-  {
+-   *(.dynbss)
+-   *(.bss)
+-   *(COMMON)
+-  }
+-  /* The normal linker scripts created by the binutils doesn't have the
+-     symbols end and _end which breaks ld.so's dl-minimal.c.  */
+-  _end = . ;
+-  PROVIDE (end = .);
+-  /* These are needed for ELF backends which have not yet been
+-     converted to the new style linker.  */
+-  .stab 0 : { *(.stab) }
+-  .stabstr 0 : { *(.stabstr) }
+-  /* DWARF debug sections.
+-     Symbols in the .debug DWARF section are relative to the beginning of the
+-     section so we begin .debug at 0.  It's not clear yet what needs to happen
+-     for the others.   */
+-  .debug          0 : { *(.debug) }
+-  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+-  .debug_aranges  0 : { *(.debug_aranges) }
+-  .debug_pubnames 0 : { *(.debug_pubnames) }
+-  .debug_sfnames  0 : { *(.debug_sfnames) }
+-  .line           0 : { *(.line) }
+-  /* These must appear regardless of  .  */
+-  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
+-  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
+-}
+diff -urNbB glibc-2.2.3/sysdeps/mips/rtld-parms glibc-2.2.3-mips/sysdeps/mips/rtld-parms
+--- glibc-2.2.3/sysdeps/mips/rtld-parms	Mon Jul 21 19:04:07 1997
++++ glibc-2.2.3-mips/sysdeps/mips/rtld-parms	Wed Dec 31 19:00:00 1969
+@@ -1,15 +0,0 @@
+-ifndef rtld-wordsize
+-rtld-wordsize = 32
+-endif
+-ifndef rtld-oformat
+-rtld-oformat = elf$(rtld-wordsize)-bigmips
+-endif
+-ifndef rtld-arch
+-rtld-arch = mips
+-endif
+-ifndef rtld-entry
+-rtld-entry = __start
+-endif
+-ifndef rtld-base
+-rtld-base = 0x0fb60000 + SIZEOF_HEADERS
+-endif
diff --git a/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch
new file mode 100644
index 00000000..66fee299
--- /dev/null
+++ b/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch
@@ -0,0 +1,47 @@
+This is a workaround for
+
+mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c  -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio  -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h  -DPIC   -DASSEMBLER   -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o
+../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages:
+../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format
+make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1
+
+which was using h.j.lu's binutils-2.13.90.0.18.
+
+
+But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html
+which says
+"A newer version of binutils (CVS post 2003-03-12) fixes it without
+the need of changing perfectly legal code."
+So presumably this can be ditched sooner or later.
+
+From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff
+
+2003-03-13  Guido Guenther  <agx@sigxcpu.org>
+
+	* sysdeps/unix/sysv/linux/mips/clone.S: introduce and use local label
+	  .Lthread_start since current binutils don't allow branches to globally
+	  visible symbols.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v
+retrieving revision 1.10
+diff -u -r1.10 clone.S
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 01:04:51 -0000	1.10
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 19:04:39 -0000
+@@ -63,7 +63,7 @@
+ 	syscall
+ 
+ 	bnez		a3,error
+-	beqz		v0,__thread_start
++	beqz		v0,.Lthread_start
+ 
+ 	/* Successful return from the parent */
+ 	addiu		sp,32
+@@ -85,6 +85,7 @@
+    debug info.  */
+ 
+ ENTRY(__thread_start)
++.Lthread_start:
+ 	/* cp is already loaded.  */
+ 	.cprestore	16
+ 	/* The stackframe has been created on entry of clone().  */
diff --git a/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch
new file mode 100644
index 00000000..c6945253
--- /dev/null
+++ b/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch
@@ -0,0 +1,25 @@
+Fixes error
+./stdio.texi:3269: First argument to cross-reference may not be empty.
+./stdio.texi:3270: First argument to cross-reference may not be empty.
+makeinfo: Removing output file `/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/glibc-2.2.3/manual/libc.info' due to errors; use --force to preserve.
+make[2]: *** [libc.info] Error 2
+make[2]: Leaving directory `/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/glibc-2.2.3/manual'
+
+===================================================================
+RCS file: /cvs/glibc/libc/manual/stdio.texi,v
+retrieving revision 1.126
+retrieving revision 1.127
+diff -u -r1.126 -r1.127
+--- libc/manual/stdio.texi	2001/06/06 07:11:31	1.126
++++ libc/manual/stdio.texi	2001/07/31 18:57:16	1.127
+@@ -3265,8 +3265,8 @@
+ If you are trying to read input that doesn't match a single, fixed
+ pattern, you may be better off using a tool such as Flex to generate a
+ lexical scanner, or Bison to generate a parser, rather than using
+-@code{scanf}.  For more information about these tools, see @ref{, , ,
+-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , ,
++@code{scanf}.  For more information about these tools, see @ref{Top, , ,
++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , ,
+ bison.info, The Bison Reference Manual}.
+ 
+ @node Input Conversion Syntax
diff --git a/patches/glibc/2.2.5/alpha-build-failure.patch b/patches/glibc/2.2.5/alpha-build-failure.patch
new file mode 100644
index 00000000..d131f1bf
--- /dev/null
+++ b/patches/glibc/2.2.5/alpha-build-failure.patch
@@ -0,0 +1,37 @@
+See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=156841
+
+Here's the error I got before I applied the patch:
+
+/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __divlu
+/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __divqu
+/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __remlu
+/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __remqu
+collect2: ld returned 1 exit status
+make[1]: *** [/home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so] Error 1
+
+
+--- glibc-2.2.5/sysdeps/alpha/divrem.h	6 Jul 2001 04:55:45 -0000	1.8
++++ glibc-2.2.5/sysdeps/alpha/divrem.h	15 Jun 2002 20:53:37 -0000	1.9
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
++/* Copyright (C) 1996,97,2002 Free Software Foundation, Inc.
+    Contributed by David Mosberger (davidm@cs.arizona.edu).
+    This file is part of the GNU C Library.
+ 
+@@ -86,6 +86,7 @@
+ 
+ 	.align 3
+ UFUNC_NAME:
++$udiv_entry:
+ 	lda	sp, -STACK(sp)
+ 	.frame	sp, STACK, retaddr, 0
+ #ifdef PROF
+@@ -206,7 +207,7 @@
+ 	cmovge	AT, AT, arg2
+ 
+ 	/* Do the unsigned division.  */
+-	bsr	retaddr, UFUNC_NAME
++	bsr	retaddr, $udiv_entry
+ 
+ 	/* Restore originals and adjust the sign of the result.  */
+ 	ldq	arg1, 0(sp)
diff --git a/patches/glibc/2.2.5/arm-asm-clobber.patch b/patches/glibc/2.2.5/arm-asm-clobber.patch
new file mode 100644
index 00000000..06376b5b
--- /dev/null
+++ b/patches/glibc/2.2.5/arm-asm-clobber.patch
@@ -0,0 +1,23 @@
+http://gcc.gnu.org/PR11103
+
+Error:
+../sysdeps/unix/sysv/linux/arm/sigaction.c: In function `__libc_sigaction':
+../sysdeps/unix/sysv/linux/arm/sigaction.c:100: error: asm-specifier for variable `_a1' conflicts with asm clobber list
+../sysdeps/unix/sysv/linux/arm/sigaction.c:139: error: asm-specifier for variable `_a1' conflicts with asm clobber list
+make[2]: *** [/crosstool-0.22/build/arm-unknown-linux-gnu/gcc-3.3-glibc-2.2.5/build-glibc/signal/sigaction.o] Error 1
+
+Fix from http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-July/005826.html
+rediffed against glibc-2.2.5
+Not tested.  (I don't even understand it, just being a patch monkey...)
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h.old	Wed Aug 27 09:58:15 2003
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h	Wed Aug 27 09:59:04 2003
+@@ -131,7 +131,7 @@
+        asm volatile ("swi	%1	@ syscall " #name	\
+ 		     : "=r" (_a1)				\
+ 		     : "i" (SYS_ify(name)) ASM_ARGS_##nr	\
+-		     : "a1", "memory");				\
++		     : "memory");				\
+        _sys_result = _a1;					\
+      }								\
+      if (_sys_result >= (unsigned int) -4095)			\
diff --git a/patches/glibc/2.2.5/arm-ctl_bus_isa.patch b/patches/glibc/2.2.5/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.2.5/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.2.5/cris-libc-symbols.patch b/patches/glibc/2.2.5/cris-libc-symbols.patch
new file mode 100644
index 00000000..42c67d29
--- /dev/null
+++ b/patches/glibc/2.2.5/cris-libc-symbols.patch
@@ -0,0 +1,97 @@
+From http://sources.redhat.com/ml/libc-alpha/2002-06/msg00006.html
+
+Message-ID: <15612.44195.299251.921969@honolulu.ilog.fr>
+Date: Tue, 4 Jun 2002 14:03:47 +0200 (CEST)
+From: Bruno Haible <bruno at clisp dot org>
+To: libc-alpha at sources dot redhat dot com
+Subject: link_warning fix
+
+
+Hi,
+
+While cross-compiling glibc-2.2.5 for target=cris-linux using gcc-3.1 and
+binutils-2.12.90.0.7, I get an error
+
+cris-linux-gcc ../sysdeps/unix/sysv/linux/sigstack.c -c -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -g      -I../include -I. -I/backup/cross-build/build-glibc-cris/signal -I.. -I../libio  -I/backup/cross-build/build-glibc-cris -I../sysdeps/cris/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/cris -I../sysdeps/unix/sysv/linux/cris -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/cris -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /cross/cris-linux-tools/lib/gcc-lib/cris-linux/3.1/include -isystem /cross/cris-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h     -o /backup/cross-build/build-glibc-cris/signal/sigstack.o
+/tmp/cca7qZyI.s: Assembler messages:
+/tmp/cca7qZyI.s:87: Warning: rest of line ignored; first ignored character is `,'
+/tmp/cca7qZyI.s:87: Error: Unknown opcode: `progbits'
+make[2]: *** [/backup/cross-build/build-glibc-cris/signal/sigstack.o] Fehler 1
+
+
+The reason is that the .s file contains the following.
+
+...
+	.size	sigstack,.Lfe1-sigstack
+#APP
+	.section .gnu.warning.sigstack
+	.previous
+#NO_APP
+	.section	.gnu.warning.sigstack
+	#,"a",@progbits
+	.align 2
+	.type	__evoke_link_warning_sigstack,@object
+...
+
+and comments (introduced by '#') are recognized by the assembler only after
+#APP, not after #NO_APP. The workaround is to add '#APP' to the fake section
+name. The following patch works for me.
+
+2002-06-02  Bruno Haible  <bruno@clisp.org>
+
+	* include/libc-symbols.h (__as_app_line): New macro.
+	(link_warning): Emit #APP line to turn comment recognition on.
+
+*** glibc-2.2.5/include/libc-symbols.h.bak	2001-08-04 01:02:52.000000000 +0200
+--- glibc-2.2.5/include/libc-symbols.h	2002-06-02 16:22:15.000000000 +0200
+***************
+*** 207,224 ****
+  #   define __make_section_unallocated(section_string)
+  #  endif
+  
+! /* Tacking on "\n\t#" to the section name makes gcc put it's bogus
+!    section attributes on what looks like a comment to the assembler.  */
+  #  ifdef HAVE_SECTION_QUOTES
+  #   define link_warning(symbol, msg) \
+    __make_section_unallocated (".gnu.warning." #symbol) \
+!   static const char __evoke_link_warning_##symbol[]	\
+!     __attribute__ ((section (".gnu.warning." #symbol "\"\n\t#\""))) = msg;
+  #  else
+  #   define link_warning(symbol, msg) \
+    __make_section_unallocated (".gnu.warning." #symbol) \
+!   static const char __evoke_link_warning_##symbol[]	\
+!     __attribute__ ((section (".gnu.warning." #symbol "\n\t#"))) = msg;
+  #  endif
+  # else /* Not ELF: a.out */
+  #  ifdef HAVE_XCOFF
+--- 207,235 ----
+  #   define __make_section_unallocated(section_string)
+  #  endif
+  
+! /* Tacking on "\n\t#" to the section name makes gcc put its bogus
+!    section attributes on what looks like a comment to the assembler.
+!    Furthermore, with gas, we need to add a "#APP" line so the comment
+!    is recognized as such.  */
+! #  ifdef HAVE_GNU_AS
+! #   define __as_app_line "#APP\n"
+! #  else
+! #   define __as_app_line ""
+! #  endif
+  #  ifdef HAVE_SECTION_QUOTES
+  #   define link_warning(symbol, msg) \
+    __make_section_unallocated (".gnu.warning." #symbol) \
+!   static const char __evoke_link_warning_##symbol[]			 \
+!     __attribute__							 \
+!       ((section (".gnu.warning." #symbol "\"\n" __as_app_line "\t#\""))) \
+!     = msg;
+  #  else
+  #   define link_warning(symbol, msg) \
+    __make_section_unallocated (".gnu.warning." #symbol) \
+!   static const char __evoke_link_warning_##symbol[]			\
+!     __attribute__							\
+!       ((section (".gnu.warning." #symbol "\n" __as_app_line "\t#")))	\
+!     = msg;
+  #  endif
+  # else /* Not ELF: a.out */
+  #  ifdef HAVE_XCOFF
+
diff --git a/patches/glibc/2.2.5/cris-stack-direction.patch b/patches/glibc/2.2.5/cris-stack-direction.patch
new file mode 100644
index 00000000..158eb391
--- /dev/null
+++ b/patches/glibc/2.2.5/cris-stack-direction.patch
@@ -0,0 +1,61 @@
+From http://sources.redhat.com/ml/libc-alpha/2002-06/msg00007.html
+
+Message-ID: <15612.44228.774370.154718@honolulu.ilog.fr>
+Date: Tue, 4 Jun 2002 14:04:20 +0200 (CEST)
+From: Bruno Haible <bruno at clisp dot org>
+To: libc-alpha at sources dot redhat dot com
+Subject: cris stack direction
+
+
+Hi,
+
+While cross-compiling glibc-2.2.5 for target=cris-linux using gcc-3.1 and
+binutils-2.12.90.0.7, I get an error
+
+cris-linux-gcc cancel.c -c -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -g   -D__NO_WEAK_PTHREAD_ALIASES -D_RPC_THREAD_SAFE_   -I../include -I. -I/backup/cross-build/build-glibc-cris/linuxthreads -I.. -I../libio  -I/backup/cross-build/build-glibc-cris -I../sysdeps/cris/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/cris -I../sysdeps/unix/sysv/linux/cris -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/cris -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /cross/cris-linux-tools/lib/gcc-lib/cris-linux/3.1/include -isystem /cross/cris-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h     -o /backup/cross-build/build-glibc-cris/linuxthreads/cancel.o
+cancel.c:29:3: #error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
+cancel.c: In function `_pthread_cleanup_push':
+cancel.c:134: warning: implicit declaration of function `FRAME_LEFT'
+make[2]: *** [/backup/cross-build/build-glibc-cris/linuxthreads/cancel.o] Fehler 1
+
+The fix is to add a file sysdeps/cris/stackinfo.h.
+
+
+2002-06-02  Bruno Haible  <bruno@clisp.org>
+
+	* sysdeps/cris/stackinfo.h: New file.
+
+*** glibc-2.2.5/sysdeps/cris/stackinfo.h.bak	2002-06-02 17:52:05.000000000 +0200
+--- glibc-2.2.5/sysdeps/cris/stackinfo.h	2002-06-02 17:52:24.000000000 +0200
+***************
+*** 0 ****
+--- 1,28 ----
++ /* Copyright (C) 2002 Free Software Foundation, Inc.
++    This file is part of the GNU C Library.
++ 
++    The GNU C Library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++ 
++    The GNU C Library 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
++    Lesser General Public License for more details.
++ 
++    You should have received a copy of the GNU Lesser General Public
++    License along with the GNU C Library; if not, write to the Free
++    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++    02111-1307 USA.  */
++ 
++ /* This file contains a bit of information about the stack allocation
++    of the processor.  */
++ 
++ #ifndef _STACKINFO_H
++ #define _STACKINFO_H	1
++ 
++ /* On cris the stack grows down.  */
++ #define _STACK_GROWS_DOWN	1
++ 
++ #endif	/* stackinfo.h */
+
diff --git a/patches/glibc/2.2.5/dl-machine-alpha.patch b/patches/glibc/2.2.5/dl-machine-alpha.patch
new file mode 100644
index 00000000..50e5bc54
--- /dev/null
+++ b/patches/glibc/2.2.5/dl-machine-alpha.patch
@@ -0,0 +1,424 @@
+From http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/alpha/dl-machine.h.diff?r1=1.56&r2=1.57&cvsroot=glibc
+(minus first hunk)
+Lets glibc-2.2.5 compile with gcc-3.3
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/alpha/dl-machine.h,v
+retrieving revision 1.56
+retrieving revision 1.57
+diff -u -r1.56 -r1.57
+--- libc/sysdeps/alpha/dl-machine.h	2001/12/12 00:10:27	1.56
++++ libc/sysdeps/alpha/dl-machine.h	2001/12/31 17:33:59	1.57
+@@ -156,125 +157,126 @@
+ #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name, IMB)	\
+   extern void tramp_name (void);				\
+   asm ( "\
+-	.globl " #tramp_name "
+-	.ent " #tramp_name "
+-" #tramp_name ":
+-	lda	$sp, -44*8($sp)
+-	.frame	$sp, 44*8, $26
+-	/* Preserve all integer registers that C normally doesn't.  */
+-	stq	$26, 0*8($sp)
+-	stq	$0, 1*8($sp)
+-	stq	$1, 2*8($sp)
+-	stq	$2, 3*8($sp)
+-	stq	$3, 4*8($sp)
+-	stq	$4, 5*8($sp)
+-	stq	$5, 6*8($sp)
+-	stq	$6, 7*8($sp)
+-	stq	$7, 8*8($sp)
+-	stq	$8, 9*8($sp)
+-	stq	$16, 10*8($sp)
+-	stq	$17, 11*8($sp)
+-	stq	$18, 12*8($sp)
+-	stq	$19, 13*8($sp)
+-	stq	$20, 14*8($sp)
+-	stq	$21, 15*8($sp)
+-	stq	$22, 16*8($sp)
+-	stq	$23, 17*8($sp)
+-	stq	$24, 18*8($sp)
+-	stq	$25, 19*8($sp)
+-	stq	$29, 20*8($sp)
+-	stt	$f0, 21*8($sp)
+-	stt	$f1, 22*8($sp)
+-	stt	$f10, 23*8($sp)
+-	stt	$f11, 24*8($sp)
+-	stt	$f12, 25*8($sp)
+-	stt	$f13, 26*8($sp)
+-	stt	$f14, 27*8($sp)
+-	stt	$f15, 28*8($sp)
+-	stt	$f16, 29*8($sp)
+-	stt	$f17, 30*8($sp)
+-	stt	$f18, 31*8($sp)
+-	stt	$f19, 32*8($sp)
+-	stt	$f20, 33*8($sp)
+-	stt	$f21, 34*8($sp)
+-	stt	$f22, 35*8($sp)
+-	stt	$f23, 36*8($sp)
+-	stt	$f24, 37*8($sp)
+-	stt	$f25, 38*8($sp)
+-	stt	$f26, 39*8($sp)
+-	stt	$f27, 40*8($sp)
+-	stt	$f28, 41*8($sp)
+-	stt	$f29, 42*8($sp)
+-	stt	$f30, 43*8($sp)
+-	.mask	0x27ff01ff, -44*8
+-	.fmask	0xfffffc03, -(44-21)*8
+-	/* Set up our $gp */
+-	br	$gp, .+4
+-	ldgp	$gp, 0($gp)
+-	.prologue 0
+-	/* Set up the arguments for fixup: */
+-	/* $16 = link_map out of plt0 */
+-	/* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */
+-	/* $18 = return address */
+-	subq	$28, $27, $17
+-	ldq	$16, 8($27)
+-	subq	$17, 20, $17
+-	mov	$26, $18
+-	addq	$17, $17, $17
+-	/* Do the fixup */
+-	bsr	$26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng
+-	/* Move the destination address into position.  */
+-	mov	$0, $27
+-	/* Restore program registers.  */
+-	ldq	$26, 0*8($sp)
+-	ldq	$0, 1*8($sp)
+-	ldq	$1, 2*8($sp)
+-	ldq	$2, 3*8($sp)
+-	ldq	$3, 4*8($sp)
+-	ldq	$4, 5*8($sp)
+-	ldq	$5, 6*8($sp)
+-	ldq	$6, 7*8($sp)
+-	ldq	$7, 8*8($sp)
+-	ldq	$8, 9*8($sp)
+-	ldq	$16, 10*8($sp)
+-	ldq	$17, 11*8($sp)
+-	ldq	$18, 12*8($sp)
+-	ldq	$19, 13*8($sp)
+-	ldq	$20, 14*8($sp)
+-	ldq	$21, 15*8($sp)
+-	ldq	$22, 16*8($sp)
+-	ldq	$23, 17*8($sp)
+-	ldq	$24, 18*8($sp)
+-	ldq	$25, 19*8($sp)
+-	ldq	$29, 20*8($sp)
+-	ldt	$f0, 21*8($sp)
+-	ldt	$f1, 22*8($sp)
+-	ldt	$f10, 23*8($sp)
+-	ldt	$f11, 24*8($sp)
+-	ldt	$f12, 25*8($sp)
+-	ldt	$f13, 26*8($sp)
+-	ldt	$f14, 27*8($sp)
+-	ldt	$f15, 28*8($sp)
+-	ldt	$f16, 29*8($sp)
+-	ldt	$f17, 30*8($sp)
+-	ldt	$f18, 31*8($sp)
+-	ldt	$f19, 32*8($sp)
+-	ldt	$f20, 33*8($sp)
+-	ldt	$f21, 34*8($sp)
+-	ldt	$f22, 35*8($sp)
+-	ldt	$f23, 36*8($sp)
+-	ldt	$f24, 37*8($sp)
+-	ldt	$f25, 38*8($sp)
+-	ldt	$f26, 39*8($sp)
+-	ldt	$f27, 40*8($sp)
+-	ldt	$f28, 41*8($sp)
+-	ldt	$f29, 42*8($sp)
+-	ldt	$f30, 43*8($sp)
+-	/* Flush the Icache after having modified the .plt code.  */
+-	" #IMB "
+-	/* Clean up and turn control to the destination */
+-	lda	$sp, 44*8($sp)
+-	jmp	$31, ($27)
++	.globl " #tramp_name "					\n\
++	.ent " #tramp_name "					\n\
++" #tramp_name ":						\n\
++	lda	$sp, -44*8($sp)					\n\
++	.frame	$sp, 44*8, $26					\n\
++	/* Preserve all integer registers that C normally	\n\
++	   doesn't.  */						\n\
++	stq	$26, 0*8($sp)					\n\
++	stq	$0, 1*8($sp)					\n\
++	stq	$1, 2*8($sp)					\n\
++	stq	$2, 3*8($sp)					\n\
++	stq	$3, 4*8($sp)					\n\
++	stq	$4, 5*8($sp)					\n\
++	stq	$5, 6*8($sp)					\n\
++	stq	$6, 7*8($sp)					\n\
++	stq	$7, 8*8($sp)					\n\
++	stq	$8, 9*8($sp)					\n\
++	stq	$16, 10*8($sp)					\n\
++	stq	$17, 11*8($sp)					\n\
++	stq	$18, 12*8($sp)					\n\
++	stq	$19, 13*8($sp)					\n\
++	stq	$20, 14*8($sp)					\n\
++	stq	$21, 15*8($sp)					\n\
++	stq	$22, 16*8($sp)					\n\
++	stq	$23, 17*8($sp)					\n\
++	stq	$24, 18*8($sp)					\n\
++	stq	$25, 19*8($sp)					\n\
++	stq	$29, 20*8($sp)					\n\
++	stt	$f0, 21*8($sp)					\n\
++	stt	$f1, 22*8($sp)					\n\
++	stt	$f10, 23*8($sp)					\n\
++	stt	$f11, 24*8($sp)					\n\
++	stt	$f12, 25*8($sp)					\n\
++	stt	$f13, 26*8($sp)					\n\
++	stt	$f14, 27*8($sp)					\n\
++	stt	$f15, 28*8($sp)					\n\
++	stt	$f16, 29*8($sp)					\n\
++	stt	$f17, 30*8($sp)					\n\
++	stt	$f18, 31*8($sp)					\n\
++	stt	$f19, 32*8($sp)					\n\
++	stt	$f20, 33*8($sp)					\n\
++	stt	$f21, 34*8($sp)					\n\
++	stt	$f22, 35*8($sp)					\n\
++	stt	$f23, 36*8($sp)					\n\
++	stt	$f24, 37*8($sp)					\n\
++	stt	$f25, 38*8($sp)					\n\
++	stt	$f26, 39*8($sp)					\n\
++	stt	$f27, 40*8($sp)					\n\
++	stt	$f28, 41*8($sp)					\n\
++	stt	$f29, 42*8($sp)					\n\
++	stt	$f30, 43*8($sp)					\n\
++	.mask	0x27ff01ff, -44*8				\n\
++	.fmask	0xfffffc03, -(44-21)*8				\n\
++	/* Set up our $gp */					\n\
++	br	$gp, .+4					\n\
++	ldgp	$gp, 0($gp)					\n\
++	.prologue 0						\n\
++	/* Set up the arguments for fixup: */			\n\
++	/* $16 = link_map out of plt0 */			\n\
++	/* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */\n\
++	/* $18 = return address */				\n\
++	subq	$28, $27, $17					\n\
++	ldq	$16, 8($27)					\n\
++	subq	$17, 20, $17					\n\
++	mov	$26, $18					\n\
++	addq	$17, $17, $17					\n\
++	/* Do the fixup */					\n\
++	bsr	$26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng\n\
++	/* Move the destination address into position.  */	\n\
++	mov	$0, $27						\n\
++	/* Restore program registers.  */			\n\
++	ldq	$26, 0*8($sp)					\n\
++	ldq	$0, 1*8($sp)					\n\
++	ldq	$1, 2*8($sp)					\n\
++	ldq	$2, 3*8($sp)					\n\
++	ldq	$3, 4*8($sp)					\n\
++	ldq	$4, 5*8($sp)					\n\
++	ldq	$5, 6*8($sp)					\n\
++	ldq	$6, 7*8($sp)					\n\
++	ldq	$7, 8*8($sp)					\n\
++	ldq	$8, 9*8($sp)					\n\
++	ldq	$16, 10*8($sp)					\n\
++	ldq	$17, 11*8($sp)					\n\
++	ldq	$18, 12*8($sp)					\n\
++	ldq	$19, 13*8($sp)					\n\
++	ldq	$20, 14*8($sp)					\n\
++	ldq	$21, 15*8($sp)					\n\
++	ldq	$22, 16*8($sp)					\n\
++	ldq	$23, 17*8($sp)					\n\
++	ldq	$24, 18*8($sp)					\n\
++	ldq	$25, 19*8($sp)					\n\
++	ldq	$29, 20*8($sp)					\n\
++	ldt	$f0, 21*8($sp)					\n\
++	ldt	$f1, 22*8($sp)					\n\
++	ldt	$f10, 23*8($sp)					\n\
++	ldt	$f11, 24*8($sp)					\n\
++	ldt	$f12, 25*8($sp)					\n\
++	ldt	$f13, 26*8($sp)					\n\
++	ldt	$f14, 27*8($sp)					\n\
++	ldt	$f15, 28*8($sp)					\n\
++	ldt	$f16, 29*8($sp)					\n\
++	ldt	$f17, 30*8($sp)					\n\
++	ldt	$f18, 31*8($sp)					\n\
++	ldt	$f19, 32*8($sp)					\n\
++	ldt	$f20, 33*8($sp)					\n\
++	ldt	$f21, 34*8($sp)					\n\
++	ldt	$f22, 35*8($sp)					\n\
++	ldt	$f23, 36*8($sp)					\n\
++	ldt	$f24, 37*8($sp)					\n\
++	ldt	$f25, 38*8($sp)					\n\
++	ldt	$f26, 39*8($sp)					\n\
++	ldt	$f27, 40*8($sp)					\n\
++	ldt	$f28, 41*8($sp)					\n\
++	ldt	$f29, 42*8($sp)					\n\
++	ldt	$f30, 43*8($sp)					\n\
++	/* Flush the Icache after having modified the .plt code.  */\n\
++	" #IMB "						\n\
++	/* Clean up and turn control to the destination */	\n\
++	lda	$sp, 44*8($sp)					\n\
++	jmp	$31, ($27)					\n\
+ 	.end " #tramp_name)
+ 
+ #ifndef PROF
+@@ -292,85 +294,87 @@
+    its return value is the user program's entry point.  */
+ 
+ #define RTLD_START asm ("\
+-.text
+-	.set at
+-	.globl _start
+-	.ent _start
+-_start:
+-	br	$gp, 0f
+-0:	ldgp	$gp, 0($gp)
+-	.prologue 0
+-	/* Pass pointer to argument block to _dl_start.  */
+-	mov	$sp, $16
+-	bsr	$26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng
+-	.end _start
+-	/* FALLTHRU */
+-	.globl _dl_start_user
+-	.ent _dl_start_user
+-_dl_start_user:
+-	.frame $30,0,$31,0
+-	.prologue 0
+-	/* Save the user entry point address in s0.  */
+-	mov	$0, $9
+-	/* Store the highest stack address.  */
+-	stq	$30, __libc_stack_end
+-	/* See if we were run as a command with the executable file
+-	   name as an extra leading argument.  */
+-	ldl	$1, _dl_skip_args
+-	bne	$1, $fixup_stack
+-$fixup_stack_ret:
+-	/* The special initializer gets called with the stack just
+-	   as the application's entry point will see it; it can
+-	   switch stacks if it moves these contents over.  */
+-" RTLD_START_SPECIAL_INIT "
+-	/* Call _dl_init(_dl_loaded, argc, argv, envp) to run initializers.  */
+-	ldq	$16, _dl_loaded
+-	ldq	$17, 0($sp)
+-	lda	$18, 8($sp)
+-	s8addq	$17, 8, $19
+-	addq	$19, $18, $19
+-	jsr	$26, _dl_init
+-	/* Pass our finalizer function to the user in $0. */
+-	lda	$0, _dl_fini
+-	/* Jump to the user's entry point.  */
+-	mov	$9, $27
+-	jmp	($9)
+-$fixup_stack:
+-	/* Adjust the stack pointer to skip _dl_skip_args words.  This
+-	   involves copying everything down, since the stack pointer must
+-	   always be 16-byte aligned.  */
+-	ldq	$2, 0($sp)
+-	ldq	$5, _dl_argv
+-	subq	$31, $1, $6
+-	subq	$2, $1, $2
+-	s8addq	$6, $5, $5
+-	mov	$sp, $4
+-	s8addq	$1, $sp, $3
+-	stq	$2, 0($sp)
+-	stq	$5, _dl_argv
+-	/* Copy down argv.  */
+-0:	ldq	$5, 8($3)
+-	addq	$4, 8, $4
+-	addq	$3, 8, $3
+-	stq	$5, 0($4)
+-	bne	$5, 0b
+-	/* Copy down envp.  */
+-1:	ldq	$5, 8($3)
+-	addq	$4, 8, $4
+-	addq	$3, 8, $3
+-	stq	$5, 0($4)
+-	bne	$5, 1b
+-	/* Copy down auxiliary table.  */
+-2:	ldq	$5, 8($3)
+-	ldq	$6, 16($3)
+-	addq	$4, 16, $4
+-	addq	$3, 16, $3
+-	stq	$5, -8($4)
+-	stq	$6, 0($4)
+-	bne	$5, 2b
+-	br	$fixup_stack_ret
+-	.end _dl_start_user
+-	.set noat
++.text								\n\
++	.set at							\n\
++	.globl _start						\n\
++	.ent _start						\n\
++_start:								\n\
++	br	$gp, 0f						\n\
++0:	ldgp	$gp, 0($gp)					\n\
++	.prologue 0						\n\
++	/* Pass pointer to argument block to _dl_start.  */	\n\
++	mov	$sp, $16					\n\
++	bsr	$26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng	\n\
++	.end _start						\n\
++	/* FALLTHRU */						\n\
++	.globl _dl_start_user					\n\
++	.ent _dl_start_user					\n\
++_dl_start_user:							\n\
++	.frame $30,0,$31,0					\n\
++	.prologue 0						\n\
++	/* Save the user entry point address in s0.  */		\n\
++	mov	$0, $9						\n\
++	/* Store the highest stack address.  */			\n\
++	stq	$30, __libc_stack_end				\n\
++	/* See if we were run as a command with the executable	\n\
++	   file name as an extra leading argument.  */		\n\
++	ldl	$1, _dl_skip_args				\n\
++	bne	$1, $fixup_stack				\n\
++$fixup_stack_ret:						\n\
++	/* The special initializer gets called with the stack	\n\
++	   just as the application's entry point will see it;	\n\
++	   it can switch stacks if it moves these contents	\n\
++	   over.  */						\n\
++" RTLD_START_SPECIAL_INIT "					\n\
++	/* Call _dl_init(_dl_loaded, argc, argv, envp) to run	\n\
++	   initializers.  */					\n\
++	ldq	$16, _dl_loaded					\n\
++	ldq	$17, 0($sp)					\n\
++	lda	$18, 8($sp)					\n\
++	s8addq	$17, 8, $19					\n\
++	addq	$19, $18, $19					\n\
++	jsr	$26, _dl_init					\n\
++	/* Pass our finalizer function to the user in $0. */	\n\
++	lda	$0, _dl_fini					\n\
++	/* Jump to the user's entry point.  */			\n\
++	mov	$9, $27						\n\
++	jmp	($9)						\n\
++$fixup_stack:							\n\
++	/* Adjust the stack pointer to skip _dl_skip_args words.\n\
++	   This involves copying everything down, since the	\n\
++	   stack pointer must always be 16-byte aligned.  */	\n\
++	ldq	$2, 0($sp)					\n\
++	ldq	$5, _dl_argv					\n\
++	subq	$31, $1, $6					\n\
++	subq	$2, $1, $2					\n\
++	s8addq	$6, $5, $5					\n\
++	mov	$sp, $4						\n\
++	s8addq	$1, $sp, $3					\n\
++	stq	$2, 0($sp)					\n\
++	stq	$5, _dl_argv					\n\
++	/* Copy down argv.  */					\n\
++0:	ldq	$5, 8($3)					\n\
++	addq	$4, 8, $4					\n\
++	addq	$3, 8, $3					\n\
++	stq	$5, 0($4)					\n\
++	bne	$5, 0b						\n\
++	/* Copy down envp.  */					\n\
++1:	ldq	$5, 8($3)					\n\
++	addq	$4, 8, $4					\n\
++	addq	$3, 8, $3					\n\
++	stq	$5, 0($4)					\n\
++	bne	$5, 1b						\n\
++	/* Copy down auxiliary table.  */			\n\
++2:	ldq	$5, 8($3)					\n\
++	ldq	$6, 16($3)					\n\
++	addq	$4, 16, $4					\n\
++	addq	$3, 16, $3					\n\
++	stq	$5, -8($4)					\n\
++	stq	$6, 0($4)					\n\
++	bne	$5, 2b						\n\
++	br	$fixup_stack_ret				\n\
++	.end _dl_start_user					\n\
++	.set noat						\n\
+ .previous");
+ 
+ #ifndef RTLD_START_SPECIAL_INIT
diff --git a/patches/glibc/2.2.5/dl-machine-arm.patch b/patches/glibc/2.2.5/dl-machine-arm.patch
new file mode 100644
index 00000000..176983b7
--- /dev/null
+++ b/patches/glibc/2.2.5/dl-machine-arm.patch
@@ -0,0 +1,389 @@
+Fixes error:
+In file included from dynamic-link.h:21,
+                 from dl-load.c:32:
+../sysdeps/arm/dl-machine.h:124:25: missing terminating " character
+...
+make[2]: *** [/crosstool-0.22/build/arm-unknown-linux-gnu/gcc-3.3-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1
+
+The first two hunks of 
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.39&r2=1.40&cvsroot=glibc
+applied cleanly, but the third hunk didn't, so I just added the \n\'s by hand for that section.
+
+--- glibc-2.2.5/sysdeps/arm/dl-machine.h.orig	Sat Sep  8 14:31:40 2001
++++ glibc-2.2.5/sysdeps/arm/dl-machine.h	Wed Aug 27 10:55:26 2003
+@@ -121,14 +121,15 @@
+    and then redirect to the address it returns.  */
+    // macro for handling PIC situation....
+ #ifdef PIC
+-#define CALL_ROUTINE(x) " ldr sl,0f
+-	add 	sl, pc, sl
+-1:	ldr	r2, 2f
+-	mov	lr, pc
+-	add	pc, sl, r2
+-	b	3f
+-0:	.word	_GLOBAL_OFFSET_TABLE_ - 1b - 4
+-2:	.word " #x "(GOTOFF)
++#define CALL_ROUTINE(x) "\
++	ldr sl,0f\n\
++	add 	sl, pc, sl\n\
++1:	ldr	r2, 2f\n\
++	mov	lr, pc\n\
++	add	pc, sl, r2\n\
++	b	3f\n\
++0:	.word	_GLOBAL_OFFSET_TABLE_ - 1b - 4\n\
++2:	.word " #x "(GOTOFF)\n\
+ 3:	"
+ #else
+ #define CALL_ROUTINE(x) " bl " #x
+@@ -136,114 +137,114 @@
+ 
+ #ifndef PROF
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.type _dl_runtime_resolve, #function
+-	.align 2
+-_dl_runtime_resolve:
+-	@ we get called with
+-	@ 	stack[0] contains the return address from this call
+-	@	ip contains &GOT[n+3] (pointer to function)
+-	@	lr points to &GOT[2]
+-
+-	@ save almost everything; lr is already on the stack
+-	stmdb	sp!,{r0-r3,sl,fp}
+-
+-	@ prepare to call fixup()
+-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+-	sub	r1, ip, lr
+-	sub	r1, r1, #4
+-	add	r1, r1, r1
+-
+-	@ get pointer to linker struct
+-	ldr	r0, [lr, #-4]
+-
+-	@ call fixup routine
+-	" CALL_ROUTINE(fixup) "
+-
+-	@ save the return
+-	mov	ip, r0
+-
+-	@ restore the stack
+-	ldmia	sp!,{r0-r3,sl,fp,lr}
+-
+-	@ jump to the newly found address
+-	mov	pc, ip
+-
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_profile, #function
+-	.align 2
+-_dl_runtime_profile:
+-	@ save almost everything; lr is already on the stack
+-	stmdb	sp!,{r0-r3,sl,fp}
+-
+-	@ prepare to call fixup()
+-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+-	sub	r1, ip, lr
+-	sub	r1, r1, #4
+-	add	r1, r1, r1
+-
+-	@ get pointer to linker struct
+-	ldr	r0, [lr, #-4]
+-
+-	@ call profiling fixup routine
+-	" CALL_ROUTINE(profile_fixup) "
+-
+-	@ save the return
+-	mov	ip, r0
+-
+-	@ restore the stack
+-	ldmia	sp!,{r0-r3,sl,fp,lr}
+-
+-	@ jump to the newly found address
+-	mov	pc, ip
+-
+-	.size _dl_runtime_resolve, .-_dl_runtime_resolve
+-	.previous
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.type _dl_runtime_resolve, #function\n\
++	.align 2\n\
++_dl_runtime_resolve:\n\
++	@ we get called with\n\
++	@ 	stack[0] contains the return address from this call\n\
++	@	ip contains &GOT[n+3] (pointer to function)\n\
++	@	lr points to &GOT[2]\n\
++\n\
++	@ save almost everything; lr is already on the stack\n\
++	stmdb	sp!,{r0-r3,sl,fp}\n\
++\n\
++	@ prepare to call fixup()\n\
++	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
++	sub	r1, ip, lr\n\
++	sub	r1, r1, #4\n\
++	add	r1, r1, r1\n\
++\n\
++	@ get pointer to linker struct\n\
++	ldr	r0, [lr, #-4]\n\
++\n\
++	@ call fixup routine\n\
++	" CALL_ROUTINE(fixup) "\n\
++\n\
++	@ save the return\n\
++	mov	ip, r0\n\
++\n\
++	@ restore the stack\n\
++	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++	@ jump to the newly found address\n\
++	mov	pc, ip\n\
++\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_profile, #function\n\
++	.align 2\n\
++_dl_runtime_profile:\n\
++	@ save almost everything; lr is already on the stack\n\
++	stmdb	sp!,{r0-r3,sl,fp}\n\
++\n\
++	@ prepare to call fixup()\n\
++	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
++	sub	r1, ip, lr\n\
++	sub	r1, r1, #4\n\
++	add	r1, r1, r1\n\
++\n\
++	@ get pointer to linker struct\n\
++	ldr	r0, [lr, #-4]\n\
++\n\
++	@ call profiling fixup routine\n\
++	" CALL_ROUTINE(profile_fixup) "\n\
++\n\
++	@ save the return\n\
++	mov	ip, r0\n\
++\n\
++	@ restore the stack\n\
++	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++	@ jump to the newly found address\n\
++	mov	pc, ip\n\
++\n\
++	.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
++	.previous\n\
+ ");
+ #else // PROF
+ # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+-	.text
+-	.globl _dl_runtime_resolve
+-	.globl _dl_runtime_profile
+-	.type _dl_runtime_resolve, #function
+-	.type _dl_runtime_profile, #function
+-	.align 2
+-_dl_runtime_resolve:
+-_dl_runtime_profile:
+-	@ we get called with
+-	@ 	stack[0] contains the return address from this call
+-	@	ip contains &GOT[n+3] (pointer to function)
+-	@	lr points to &GOT[2]
+-
+-	@ save almost everything; return add is already on the stack
+-	stmdb	sp!,{r0-r3,sl,fp}
+-
+-	@ prepare to call fixup()
+-	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each
+-	sub	r1, ip, lr
+-	sub	r1, r1, #4
+-	add	r1, r1, r1
+-
+-	@ get pointer to linker struct
+-	ldr	r0, [lr, #-4]
+-
+-	@ call profiling fixup routine
+-	" CALL_ROUTINE(fixup) "
+-
+-	@ save the return
+-	mov	ip, r0
+-
+-	@ restore the stack
+-	ldmia	sp!,{r0-r3,sl,fp,lr}
+-
+-	@ jump to the newly found address
+-	mov	pc, ip
+-
+-	.size _dl_runtime_profile, .-_dl_runtime_profile
+-	.previous
++	.text\n\
++	.globl _dl_runtime_resolve\n\
++	.globl _dl_runtime_profile\n\
++	.type _dl_runtime_resolve, #function\n\
++	.type _dl_runtime_profile, #function\n\
++	.align 2\n\
++_dl_runtime_resolve:\n\
++_dl_runtime_profile:\n\
++	@ we get called with\n\
++	@ 	stack[0] contains the return address from this call\n\
++	@	ip contains &GOT[n+3] (pointer to function)\n\
++	@	lr points to &GOT[2]\n\
++\n\
++	@ save almost everything; return add is already on the stack\n\
++	stmdb	sp!,{r0-r3,sl,fp}\n\
++\n\
++	@ prepare to call fixup()\n\
++	@ change &GOT[n+3] into 8*n        NOTE: reloc are 8 bytes each\n\
++	sub	r1, ip, lr\n\
++	sub	r1, r1, #4\n\
++	add	r1, r1, r1\n\
++\n\
++	@ get pointer to linker struct\n\
++	ldr	r0, [lr, #-4]\n\
++\n\
++	@ call profiling fixup routine\n\
++	" CALL_ROUTINE(fixup) "\n\
++\n\
++	@ save the return\n\
++	mov	ip, r0\n\
++\n\
++	@ restore the stack\n\
++	ldmia	sp!,{r0-r3,sl,fp,lr}\n\
++\n\
++	@ jump to the newly found address\n\
++	mov	pc, ip\n\
++\n\
++	.size _dl_runtime_profile, .-_dl_runtime_profile\n\
++	.previous\n\
+ ");
+ #endif //PROF
+ 
+@@ -256,70 +257,70 @@
+    its return value is the user program's entry point.  */
+ 
+ #define RTLD_START asm ("\
+-.text
+-.globl _start
+-.globl _dl_start_user
+-_start:
+-	@ at start time, all the args are on the stack
+-	mov	r0, sp
+-	bl	_dl_start
+-	@ returns user entry point in r0
+-_dl_start_user:
+-	mov	r6, r0
+-	@ we are PIC code, so get global offset table
+-	ldr	sl, .L_GET_GOT
+-	add	sl, pc, sl
+-.L_GOT_GOT:
+-	@ Store the highest stack address
+-	ldr	r1, .L_STACK_END
+-	ldr	r1, [sl, r1]
+-	str	sp, [r1]
+-	@ See if we were run as a command with the executable file
+-	@ name as an extra leading argument.
+-	ldr	r4, .L_SKIP_ARGS
+-	ldr	r4, [sl, r4]
+-	@ get the original arg count
+-	ldr	r1, [sp]
+-	@ subtract _dl_skip_args from it
+-	sub	r1, r1, r4
+-	@ adjust the stack pointer to skip them
+-	add	sp, sp, r4, lsl #2
+-	@ get the argv address
+-	add	r2, sp, #4
+-	@ store the new argc in the new stack location
+-	str	r1, [sp]
+-	@ compute envp
+-	add	r3, r2, r1, lsl #2
+-	add	r3, r3, #4
+-
+-	@ now we call _dl_init
+-	ldr	r0, .L_LOADED
+-	ldr	r0, [sl, r0]
+-	ldr	r0, [r0]
+-	@ call _dl_init
+-	bl	_dl_init(PLT)
+-	@ clear the startup flag
+-	ldr	r2, .L_STARTUP_FLAG
+-	ldr	r1, [sl, r2]
+-	mov	r0, #0
+-	str	r0, [r1]
+-	@ load the finalizer function
+-	ldr	r0, .L_FINI_PROC
+-	ldr	r0, [sl, r0]
+-	@ jump to the user_s entry point
+-	mov	pc, r6
+-.L_GET_GOT:
++.text\n\
++.globl _start\n\
++.globl _dl_start_user\n\
++_start:\n\
++	@ at start time, all the args are on the stack\n\
++	mov	r0, sp\n\
++	bl	_dl_start\n\
++	@ returns user entry point in r0\n\
++_dl_start_user:\n\
++	mov	r6, r0\n\
++	@ we are PIC code, so get global offset table\n\
++	ldr	sl, .L_GET_GOT\n\
++	add	sl, pc, sl\n\
++.L_GOT_GOT:\n\
++	@ Store the highest stack address\n\
++	ldr	r1, .L_STACK_END\n\
++	ldr	r1, [sl, r1]\n\
++	str	sp, [r1]\n\
++	@ See if we were run as a command with the executable file\n\
++	@ name as an extra leading argument.\n\
++	ldr	r4, .L_SKIP_ARGS\n\
++	ldr	r4, [sl, r4]\n\
++	@ get the original arg count\n\
++	ldr	r1, [sp]\n\
++	@ subtract _dl_skip_args from it\n\
++	sub	r1, r1, r4\n\
++	@ adjust the stack pointer to skip them\n\
++	add	sp, sp, r4, lsl #2\n\
++	@ get the argv address\n\
++	add	r2, sp, #4\n\
++	@ store the new argc in the new stack location\n\
++	str	r1, [sp]\n\
++	@ compute envp\n\
++	add	r3, r2, r1, lsl #2\n\
++	add	r3, r3, #4\n\
++\n\
++	@ now we call _dl_init\n\
++	ldr	r0, .L_LOADED\n\
++	ldr	r0, [sl, r0]\n\
++	ldr	r0, [r0]\n\
++	@ call _dl_init\n\
++	bl	_dl_init(PLT)\n\
++	@ clear the startup flag\n\
++	ldr	r2, .L_STARTUP_FLAG\n\
++	ldr	r1, [sl, r2]\n\
++	mov	r0, #0\n\
++	str	r0, [r1]\n\
++	@ load the finalizer function\n\
++	ldr	r0, .L_FINI_PROC\n\
++	ldr	r0, [sl, r0]\n\
++	@ jump to the user_s entry point\n\
++	mov	pc, r6\n\
++.L_GET_GOT:\n\
+ 	.word	_GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4	\n\
+ .L_SKIP_ARGS:					\n\
+ 	.word	_dl_skip_args(GOTOFF)		\n\
+-.L_STARTUP_FLAG:
+-	.word	_dl_starting_up(GOT)
+-.L_FINI_PROC:
+-	.word	_dl_fini(GOT)
+-.L_STACK_END:
+-	.word	__libc_stack_end(GOT)
+-.L_LOADED:
+-	.word	_dl_loaded(GOT)
++.L_STARTUP_FLAG:\n\
++	.word	_dl_starting_up(GOT)\n\
++.L_FINI_PROC:\n\
++	.word	_dl_fini(GOT)\n\
++.L_STACK_END:\n\
++	.word	__libc_stack_end(GOT)\n\
++.L_LOADED:\n\
++	.word	_dl_loaded(GOT)\n\
+ .previous\n\
+ ");
+ 
diff --git a/patches/glibc/2.2.5/dl-machine-m68k.patch b/patches/glibc/2.2.5/dl-machine-m68k.patch
new file mode 100644
index 00000000..2e9ee04e
--- /dev/null
+++ b/patches/glibc/2.2.5/dl-machine-m68k.patch
@@ -0,0 +1,206 @@
+Retrieved with
+ wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/m68k/dl-machine.h.diff?r1=1.53&r2=1.55&cvsroot=glibc'
+
+Fixes error
+
+In file included from dynamic-link.h:21,
+                 from dl-load.c:32:
+../sysdeps/m68k/dl-machine.h:108: error: parse error before '.' token
+../sysdeps/m68k/dl-machine.h:109: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:120: error: syntax error at '#' token
+../sysdeps/m68k/dl-machine.h:123: error: stray '\' in program
+../sysdeps/m68k/dl-machine.h:123: error: missing terminating " character
+../sysdeps/m68k/dl-machine.h:148: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:152: error: syntax error at '#' token
+../sysdeps/m68k/dl-machine.h:156: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:161: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:163: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:166: error: stray '@' in program
+In file included from dynamic-link.h:21,
+                 from dl-load.c:32:
+../sysdeps/m68k/dl-machine.h:175:4: invalid preprocessing directive #Call
+../sysdeps/m68k/dl-machine.h:179: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:180: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:181: error: syntax error at '#' token
+../sysdeps/m68k/dl-machine.h:182: error: syntax error at '#' token
+../sysdeps/m68k/dl-machine.h:184: error: stray '@' in program
+../sysdeps/m68k/dl-machine.h:187: error: missing terminating ' character
+../sysdeps/m68k/dl-machine.h:190: error: missing terminating " character
+dl-load.c: In function `_dl_map_object_from_fd':
+dl-load.c:1089: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1089: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1109: warning: use of cast expressions as lvalues is deprecated
+dl-load.c:1109: warning: use of cast expressions as lvalues is deprecated
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/m68k-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/m68k/dl-machine.h,v
+retrieving revision 1.53
+retrieving revision 1.55
+diff -u -r1.53 -r1.55
+--- libc/sysdeps/m68k/dl-machine.h	2001/08/26 22:26:36	1.53
++++ libc/sysdeps/m68k/dl-machine.h	2002/02/01 10:28:20	1.55
+@@ -1,5 +1,5 @@
+ /* Machine-dependent ELF dynamic relocation inline functions.  m68k version.
+-   Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
++   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -85,11 +85,11 @@
+ 	{
+ 	  got[2] = (Elf32_Addr) &_dl_runtime_profile;
+ 
+-	  if (_dl_name_match_p (_dl_profile, l))
++	  if (_dl_name_match_p (GL(dl_profile), l))
+ 	    {
+ 	      /* This is the object we are looking for.  Say that we really
+ 		 want profiling and the timers are started.  */
+-	      _dl_profile_map = l;
++	      GL(dl_profile_map) = l;
+ 	    }
+ 	}
+       else
+@@ -104,22 +104,22 @@
+ /* This code is used in dl-runtime.c to call the `fixup' function
+    and then redirect to the address it returns.  */
+ #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \
+-"| Trampoline for " #fixup_name "
+-	.globl " #tramp_name "
+-	.type " #tramp_name ", @function
+-" #tramp_name ":
+-	| Save %a0 (struct return address) and %a1.
+-	move.l %a0, -(%sp)
+-	move.l %a1, -(%sp)
+-	| Call the real address resolver.
+-	jbsr " #fixup_name "
+-	| Restore register %a0 and %a1.
+-	move.l (%sp)+, %a1
+-	move.l (%sp)+, %a0
+-	| Pop parameters
+-	addq.l #8, %sp
+-	| Call real function.
+-	jmp (%d0)
++"| Trampoline for " #fixup_name "\n\
++	.globl " #tramp_name "\n\
++	.type " #tramp_name ", @function\n\
++" #tramp_name ":\n\
++	| Save %a0 (struct return address) and %a1.\n\
++	move.l %a0, -(%sp)\n\
++	move.l %a1, -(%sp)\n\
++	| Call the real address resolver.\n\
++	jbsr " #fixup_name "\n\
++	| Restore register %a0 and %a1.\n\
++	move.l (%sp)+, %a1\n\
++	move.l (%sp)+, %a0\n\
++	| Pop parameters\n\
++	addq.l #8, %sp\n\
++	| Call real function.\n\
++	jmp (%d0)\n\
+ 	.size " #tramp_name ", . - " #tramp_name "\n"
+ #ifndef PROF
+ #define ELF_MACHINE_RUNTIME_TRAMPOLINE \
+@@ -143,50 +143,50 @@
+    its return value is the user program's entry point.  */
+ 
+ #define RTLD_START asm ("\
+-	.text
+-	.globl _start
+-	.type _start,@function
+-_start:
+-	move.l %sp, -(%sp)
+-	jbsr _dl_start
+-	addq.l #4, %sp
+-	/* FALLTHRU */
+-
+-	.globl _dl_start_user
+-	.type _dl_start_user,@function
+-_dl_start_user:
+-	| Save the user entry point address in %a4.
+-	move.l %d0, %a4
+-	| Point %a5 at the GOT.
+-	lea _GLOBAL_OFFSET_TABLE_@GOTPC(%pc), %a5
+-	| Remember the highest stack address.
+-	move.l %sp, ([__libc_stack_end@GOT.w, %a5])
+-	| See if we were run as a command with the executable file
+-	| name as an extra leading argument.
+-	move.l ([_dl_skip_args@GOT.w, %a5]), %d0
+-	| Pop the original argument count
+-	move.l (%sp)+, %d1
+-	| Subtract _dl_skip_args from it.
+-	sub.l %d0, %d1
+-	| Adjust the stack pointer to skip _dl_skip_args words.
+-	lea (%sp, %d0*4), %sp
+-	| Push back the modified argument count.
+-	move.l %d1, -(%sp)
+-	# Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
+-	pea 8(%sp, %d1*4)
+-	pea 8(%sp)
+-	move.l %d1, -(%sp)
+-	move.l ([_dl_loaded@GOT.w, %a5]), -(%sp)
+-	jbsr _dl_init@PLTPC
+-	addq.l #8, %sp
+-	addq.l #8, %sp
+-	| Pass our finalizer function to the user in %a1.
+-	move.l _dl_fini@GOT.w(%a5), %a1
+-	| Initialize %fp with the stack pointer.
+-	move.l %sp, %fp
+-	| Jump to the user's entry point.
+-	jmp (%a4)
+-	.size _dl_start_user, . - _dl_start_user
++	.text\n\
++	.globl _start\n\
++	.type _start,@function\n\
++_start:\n\
++	move.l %sp, -(%sp)\n\
++	jbsr _dl_start\n\
++	addq.l #4, %sp\n\
++	/* FALLTHRU */\n\
++\n\
++	.globl _dl_start_user\n\
++	.type _dl_start_user,@function\n\
++_dl_start_user:\n\
++	| Save the user entry point address in %a4.\n\
++	move.l %d0, %a4\n\
++	| Point %a5 at the GOT.\n\
++	lea _GLOBAL_OFFSET_TABLE_@GOTPC(%pc), %a5\n\
++	| Remember the highest stack address.\n\
++	move.l %sp, ([__libc_stack_end@GOT.w, %a5])\n\
++	| See if we were run as a command with the executable file\n\
++	| name as an extra leading argument.\n\
++	move.l ([_dl_skip_args@GOT.w, %a5]), %d0\n\
++	| Pop the original argument count\n\
++	move.l (%sp)+, %d1\n\
++	| Subtract _dl_skip_args from it.\n\
++	sub.l %d0, %d1\n\
++	| Adjust the stack pointer to skip _dl_skip_args words.\n\
++	lea (%sp, %d0*4), %sp\n\
++	| Push back the modified argument count.\n\
++	move.l %d1, -(%sp)\n\
++	# Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\
++	pea 8(%sp, %d1*4)\n\
++	pea 8(%sp)\n\
++	move.l %d1, -(%sp)\n\
++	move.l ([_rtld_global@GOT.w, %a5]), -(%sp)\n\
++	jbsr _dl_init@PLTPC\n\
++	addq.l #8, %sp\n\
++	addq.l #8, %sp\n\
++	| Pass our finalizer function to the user in %a1.\n\
++	move.l _dl_fini@GOT.w(%a5), %a1\n\
++	| Initialize %fp with the stack pointer.\n\
++	move.l %sp, %fp\n\
++	| Jump to the user's entry point.\n\
++	jmp (%a4)\n\
++	.size _dl_start_user, . - _dl_start_user\n\
+ 	.previous");
+ 
+ /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+@@ -251,7 +251,7 @@
+ 	       found.  */
+ 	    break;
+ 	  if (sym->st_size > refsym->st_size
+-	      || (sym->st_size < refsym->st_size && _dl_verbose))
++	      || (sym->st_size < refsym->st_size && GL(dl_verbose)))
+ 	    {
+ 	      extern char **_dl_argv;
+ 	      const char *strtab;
diff --git a/patches/glibc/2.2.5/dl-machine-sh.patch b/patches/glibc/2.2.5/dl-machine-sh.patch
new file mode 100644
index 00000000..ac046e4d
--- /dev/null
+++ b/patches/glibc/2.2.5/dl-machine-sh.patch
@@ -0,0 +1,41 @@
+Retrieved with 
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/sh/dl-machine.h.diff?r1=1.21&r2=1.22&cvsroot=glibc'
+
+Fixes error
+/tmp/ccFobT8r.s: Assembler messages:
+/tmp/ccFobT8r.s:1819: Error: symbol `.L3' is already defined
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/sh4-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/rtld.os] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc24/build/sh4-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/glibc-2.2.5/elf'
+
+See also http://sources.redhat.com/ml/libc-alpha/2002-07/msg00001.html
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/sh/dl-machine.h,v
+retrieving revision 1.21
+retrieving revision 1.22
+diff -u -r1.21 -r1.22
+--- libc/sysdeps/sh/dl-machine.h	2002/04/08 20:59:36	1.21
++++ libc/sysdeps/sh/dl-machine.h	2002/06/28 17:26:01	1.22
+@@ -53,16 +53,16 @@
+ elf_machine_load_address (void)
+ {
+   Elf32_Addr addr;
+-  asm ("mov.l .L1,r0\n\
+-	mov.l .L3,r2\n\
++  asm ("mov.l 1f,r0\n\
++	mov.l 3f,r2\n\
+ 	add r12,r2\n\
+ 	mov.l @(r0,r12),r0\n\
+-	bra .L2\n\
++	bra 2f\n\
+ 	 sub r0,r2\n\
+ 	.align 2\n\
+-	.L1: .long _dl_start@GOT\n\
+-	.L3: .long _dl_start@GOTOFF\n\
+-	.L2: mov r2,%0"
++	1: .long _dl_start@GOT\n\
++	3: .long _dl_start@GOTOFF\n\
++	2: mov r2,%0"
+        : "=r" (addr) : : "r0", "r1", "r2");
+   return addr;
+ }
diff --git a/patches/glibc/2.2.5/dl-machine-sparc.patch b/patches/glibc/2.2.5/dl-machine-sparc.patch
new file mode 100644
index 00000000..ccdb6d30
--- /dev/null
+++ b/patches/glibc/2.2.5/dl-machine-sparc.patch
@@ -0,0 +1,230 @@
+--- glibc-2.2.5/sysdeps/sparc/sparc32/dl-machine.h.old	Sat Jun  7 18:19:03 2003
++++ glibc-2.2.5/sysdeps/sparc/sparc32/dl-machine.h	Sat Jun  7 18:20:04 2003
+@@ -148,23 +148,23 @@
+    and then redirect to the address it returns.  */
+ #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name)	\
+   asm ( "\
+-	.text
+-	.globl	" #tramp_name "
+-	.type	" #tramp_name ", @function
+-	.align	32
+-" #tramp_name ":
+-	/* Set up the arguments to fixup --
+-	   %o0 = link_map out of plt0
+-	   %o1 = offset of reloc entry
+-	   %o2 = return address  */
+-	ld	[%o7 + 8], %o0
+-	srl	%g1, 10, %o1
+-	mov	%i7, %o2
+-	call	" #fixup_name "
+-	 sub	%o1, 4*12, %o1
+-	jmp	%o0
+-	 restore
+-	.size	" #tramp_name ", . - " #tramp_name "
++	.text\n\
++	.globl	" #tramp_name "\n\
++	.type	" #tramp_name ", @function\n\
++	.align	32\n\
++" #tramp_name ":\n\
++	/* Set up the arguments to fixup --\n\
++	   %o0 = link_map out of plt0\n\
++	   %o1 = offset of reloc entry\n\
++	   %o2 = return address  */\n\
++	ld	[%o7 + 8], %o0\n\
++	srl	%g1, 10, %o1\n\
++	mov	%i7, %o2\n\
++	call	" #fixup_name "\n\
++	 sub	%o1, 4*12, %o1\n\
++	jmp	%o0\n\
++	 restore\n\
++	.size	" #tramp_name ", . - " #tramp_name "\n\
+ 	.previous")
+ 
+ #ifndef PROF
+@@ -199,96 +199,96 @@
+    its return value is the user program's entry point.  */
+ 
+ #define RTLD_START __asm__ ("\
+-	.text
+-	.globl	_start
+-	.type	_start, @function
+-	.align	32
+-_start:
+-  /* Allocate space for functions to drop their arguments.  */
+-	sub	%sp, 6*4, %sp
+-  /* Pass pointer to argument block to _dl_start.  */
+-	call	_dl_start
+-	 add	%sp, 22*4, %o0
+-	/* FALTHRU */
+-	.globl	_dl_start_user
+-	.type	_dl_start_user, @function
+-_dl_start_user:
+-  /* Load the PIC register.  */
+-1:	call	2f
+-	 sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+-2:	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+-	add	%l7, %o7, %l7
+-  /* Save the user entry point address in %l0 */
+-	mov	%o0, %l0
+-  /* Store the highest stack address.  */
+-	sethi	%hi(__libc_stack_end), %g2
+-	or	%g2, %lo(__libc_stack_end), %g2
+-	ld	[%l7 + %g2], %l1
+-	sethi	%hi(_dl_skip_args), %g2
+-	add	%sp, 6*4, %l2
+-	or	%g2, %lo(_dl_skip_args), %g2
+-	st	%l2, [%l1]
+-  /* See if we were run as a command with the executable file name as an
+-     extra leading argument.  If so, adjust the contents of the stack.  */
+-	ld	[%l7+%g2], %i0
+-	ld	[%i0], %i0
+-	tst	%i0
+-	beq	3f
+-	 ld	[%sp+22*4], %i5		/* load argc */
+-	/* Find out how far to shift.  */
+-	sethi	%hi(_dl_argv), %l3
+-	or	%l3, %lo(_dl_argv), %l3
+-	ld	[%l7+%l3], %l3
+-	sub	%i5, %i0, %i5
+-	ld	[%l3], %l4
+-	sll	%i0, 2, %i2
+-	st	%i5, [%sp+22*4]
+-	sub	%l4, %i2, %l4
+-	add	%sp, 23*4, %i1
+-	add	%i1, %i2, %i2
+-	st	%l4, [%l3]
+-	/* Copy down argv */
+-21:	ld	[%i2], %i3
+-	add	%i2, 4, %i2
+-	tst	%i3
+-	st	%i3, [%i1]
+-	bne	21b
+-	 add	%i1, 4, %i1
+-	/* Copy down env */
+-22:	ld	[%i2], %i3
+-	add	%i2, 4, %i2
+-	tst	%i3
+-	st	%i3, [%i1]
+-	bne	22b
+-	 add	%i1, 4, %i1
+-	/* Copy down auxiliary table.  */
+-23:	ld	[%i2], %i3
+-	ld	[%i2+4], %i4
+-	add	%i2, 8, %i2
+-	tst	%i3
+-	st	%i3, [%i1]
+-	st	%i4, [%i1+4]
+-	bne	23b
+-	 add	%i1, 8, %i1
+-  /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp.  */
+-3:	sethi	%hi(_dl_loaded), %o0
+-	add	%sp, 23*4, %o2
+-	orcc	%o0, %lo(_dl_loaded), %o0
+-	sll	%i5, 2, %o3
+-	ld	[%l7+%o0], %o0
+-	add	%o3, 4, %o3
+-	mov	%i5, %o1
+-	add	%o2, %o3, %o3
+-	call	_dl_init
+-	 ld	[%o0], %o0
+-  /* Pass our finalizer function to the user in %g1.  */
+-	sethi	%hi(_dl_fini), %g1
+-	or	%g1, %lo(_dl_fini), %g1
+-	ld	[%l7+%g1], %g1
+-  /* Jump to the user's entry point and deallocate the extra stack we got.  */
+-	jmp	%l0
+-	 add	%sp, 6*4, %sp
+-	.size   _dl_start_user, . - _dl_start_user
++	.text\n\
++	.globl	_start\n\
++	.type	_start, @function\n\
++	.align	32\n\
++_start:\n\
++  /* Allocate space for functions to drop their arguments.  */\n\
++	sub	%sp, 6*4, %sp\n\
++  /* Pass pointer to argument block to _dl_start.  */\n\
++	call	_dl_start\n\
++	 add	%sp, 22*4, %o0\n\
++	/* FALTHRU */\n\
++	.globl	_dl_start_user\n\
++	.type	_dl_start_user, @function\n\
++_dl_start_user:\n\
++  /* Load the PIC register.  */\n\
++1:	call	2f\n\
++	 sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\
++2:	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\
++	add	%l7, %o7, %l7\n\
++  /* Save the user entry point address in %l0 */\n\
++	mov	%o0, %l0\n\
++  /* Store the highest stack address.  */\n\
++	sethi	%hi(__libc_stack_end), %g2\n\
++	or	%g2, %lo(__libc_stack_end), %g2\n\
++	ld	[%l7 + %g2], %l1\n\
++	sethi	%hi(_dl_skip_args), %g2\n\
++	add	%sp, 6*4, %l2\n\
++	or	%g2, %lo(_dl_skip_args), %g2\n\
++	st	%l2, [%l1]\n\
++  /* See if we were run as a command with the executable file name as an\n\
++     extra leading argument.  If so, adjust the contents of the stack.  */\n\
++	ld	[%l7+%g2], %i0\n\
++	ld	[%i0], %i0\n\
++	tst	%i0\n\
++	beq	3f\n\
++	 ld	[%sp+22*4], %i5		/* load argc */\n\
++	/* Find out how far to shift.  */\n\
++	sethi	%hi(_dl_argv), %l3\n\
++	or	%l3, %lo(_dl_argv), %l3\n\
++	ld	[%l7+%l3], %l3\n\
++	sub	%i5, %i0, %i5\n\
++	ld	[%l3], %l4\n\
++	sll	%i0, 2, %i2\n\
++	st	%i5, [%sp+22*4]\n\
++	sub	%l4, %i2, %l4\n\
++	add	%sp, 23*4, %i1\n\
++	add	%i1, %i2, %i2\n\
++	st	%l4, [%l3]\n\
++	/* Copy down argv */\n\
++21:	ld	[%i2], %i3\n\
++	add	%i2, 4, %i2\n\
++	tst	%i3\n\
++	st	%i3, [%i1]\n\
++	bne	21b\n\
++	 add	%i1, 4, %i1\n\
++	/* Copy down env */\n\
++22:	ld	[%i2], %i3\n\
++	add	%i2, 4, %i2\n\
++	tst	%i3\n\
++	st	%i3, [%i1]\n\
++	bne	22b\n\
++	 add	%i1, 4, %i1\n\
++	/* Copy down auxiliary table.  */\n\
++23:	ld	[%i2], %i3\n\
++	ld	[%i2+4], %i4\n\
++	add	%i2, 8, %i2\n\
++	tst	%i3\n\
++	st	%i3, [%i1]\n\
++	st	%i4, [%i1+4]\n\
++	bne	23b\n\
++	 add	%i1, 8, %i1\n\
++  /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp.  */\n\
++3:	sethi	%hi(_dl_loaded), %o0\n\
++	add	%sp, 23*4, %o2\n\
++	orcc	%o0, %lo(_dl_loaded), %o0\n\
++	sll	%i5, 2, %o3\n\
++	ld	[%l7+%o0], %o0\n\
++	add	%o3, 4, %o3\n\
++	mov	%i5, %o1\n\
++	add	%o2, %o3, %o3\n\
++	call	_dl_init\n\
++	 ld	[%o0], %o0\n\
++  /* Pass our finalizer function to the user in %g1.  */\n\
++	sethi	%hi(_dl_fini), %g1\n\
++	or	%g1, %lo(_dl_fini), %g1\n\
++	ld	[%l7+%g1], %g1\n\
++  /* Jump to the user's entry point and deallocate the extra stack we got.  */\n\
++	jmp	%l0\n\
++	 add	%sp, 6*4, %sp\n\
++	.size   _dl_start_user, . - _dl_start_user\n\
+ 	.previous");
+ 
+ static inline Elf32_Addr
diff --git a/patches/glibc/2.2.5/errlist-1.9.patch b/patches/glibc/2.2.5/errlist-1.9.patch
new file mode 100644
index 00000000..3bd7fc6c
--- /dev/null
+++ b/patches/glibc/2.2.5/errlist-1.9.patch
@@ -0,0 +1,25 @@
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Attic/errlist.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/sysdeps/unix/sysv/linux/errlist.c	2001/07/06 04:56:12	1.8
++++ libc/sysdeps/unix/sysv/linux/errlist.c	2002/05/20 06:56:53	1.9
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -38,10 +38,9 @@
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0);
+ #endif
diff --git a/patches/glibc/2.2.5/errlist-arm.patch b/patches/glibc/2.2.5/errlist-arm.patch
new file mode 100644
index 00000000..ac4eb5be
--- /dev/null
+++ b/patches/glibc/2.2.5/errlist-arm.patch
@@ -0,0 +1,48 @@
+Subject: patch for arm
+From: Philip Blundell <Philip dot Blundell at pobox dot com>
+To: libc-hacker at sources dot redhat dot com
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+Date: 22 Jul 2002 20:12:06 +0100
+Message-Id: <1027365126.725.10.camel@kc>
+Mime-Version: 1.0
+
+The mainline seems to need this patch in order to compile.
+
+p.
+
+2002-07-22  Philip Blundell  <philb@gnu.org>
+
+	* sysdeps/unix/sysv/linux/arm/errlist.c: Remove extra weak alias
+	definiton of _old_sys_nerr.  Define _old_sys_errlist as strong
+	alias.
+
+Index: sysdeps/unix/sysv/linux/arm/errlist.c
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/errlist.c,v
+retrieving revision 1.4
+diff -u -p -r1.4 errlist.c
+--- glibc/sysdeps/unix/sysv/linux/arm/errlist.c	6 Jul 2001 04:56:13 -0000	1.4
++++ glibc/sysdeps/unix/sysv/linux/arm/errlist.c	22 Jul 2002 19:10:57 -0000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
++/* Copyright (C) 1998, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -38,10 +38,9 @@ extern const char *const *__old_sys_errl
+ const int __old_sys_nerr = OLD_ERRLIST_SIZE;
+ 
+ strong_alias (__old_sys_nerr, _old_sys_nerr);
+-weak_alias (__old_sys_nerr, _old_sys_nerr)
+ compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0);
+-weak_alias (__old_sys_errlist, _old_sys_errlist);
++strong_alias (__old_sys_errlist, _old_sys_errlist);
+ compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0);
+ compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0);
+ #endif
+
+
+
+
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch
new file mode 100644
index 00000000..2ee71745
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch
@@ -0,0 +1,68 @@
+Fixes
+dl-runtime.c:56: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here
+when building with gcc-3.4.0
+
+First hunk:
+Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc
+[rediffed against glibc-2.2.5]
+
+Second hunk:
+If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition.
+Use macro in fixup function definitions.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc
+[rediffed against glibc-2.3.2]
+
+===================================================================
+--- glibc-2.2.5/sysdeps/i386/dl-machine.h.old	Sun Apr 11 11:53:23 2004
++++ glibc-2.2.5/sysdeps/i386/dl-machine.h	Sun Apr 11 11:55:38 2004
+@@ -63,11 +63,12 @@
+    destroys the passed register information.  */
+ /* GKM FIXME: Fix trampoline to pass bounds so we can do
+    without the `__unbounded' qualifier.  */
++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused))
+ static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset)
+-     __attribute__ ((regparm (2), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+ 				 ElfW(Addr) retaddr)
+-     __attribute__ ((regparm (3), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ #endif
+ 
+ /* Set up the loaded object described by L so its unrelocated PLT
+===================================================================
+--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c	Fri Feb  7 11:41:12 2003
++++ glibc-2.3.2/elf/dl-runtime.c	Thu Apr  8 22:24:26 2004
+@@ -36,6 +36,12 @@
+ # define VERSYMIDX(sym)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
+ #endif
+ 
++/* The fixup functions might have need special attributes.  If none
++   are provided define the macro as empty.  */
++#ifndef ARCH_FIXUP_ATTRIBUTE
++# define ARCH_FIXUP_ATTRIBUTE
++#endif
++
+ 
+ /* This function is called through a special trampoline from the PLT the
+    first time each PLT entry is called.  We must perform the relocation
+@@ -45,7 +51,7 @@
+    function.  */
+ 
+ #ifndef ELF_MACHINE_NO_PLT
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ fixup (
+ # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+@@ -132,7 +138,7 @@
+ 
+ #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__
+ 
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ profile_fixup (
+ #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch
new file mode 100644
index 00000000..5d609f9a
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch
@@ -0,0 +1,63 @@
+Fixes
+initgroups.c: In function `internal_getgrouplist':
+initgroups.c:179: error: parse error before "__FUNCTION__"
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	roland@sources.redhat.com	2001-12-16 21:52:12
+
+Modified files:
+	nss            : nsswitch.c 
+	grp            : initgroups.c 
+
+Log message:
+	2001-12-16  Roland McGrath  <roland@frob.com>
+	
+	* nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal.
+	* grp/initgroups.c (internal_getgrouplist): Likewise.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/grp/initgroups.c,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- libc/grp/initgroups.c	2001/07/06 04:54:46	1.26
++++ libc/grp/initgroups.c	2001/12/17 05:52:11	1.27
+@@ -176,7 +176,7 @@
+ 
+       /* This is really only for debugging.  */
+       if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	__libc_fatal ("illegal status in " __FUNCTION__);
++	__libc_fatal ("illegal status in internal_getgrouplist");
+ 
+       if (status != NSS_STATUS_SUCCESS
+ 	  && nss_next_action (nip, status) == NSS_ACTION_RETURN)
+@@ -214,7 +214,7 @@
+     }
+   else
+     *ngroups = result;
+-      
++
+   memcpy (groups, newgroups, *ngroups * sizeof (gid_t));
+ 
+   free (newgroups);
+
+===================================================================
+RCS file: /cvs/glibc/libc/nss/nsswitch.c,v
+retrieving revision 1.52
+retrieving revision 1.53
+diff -u -r1.52 -r1.53
+--- libc/nss/nsswitch.c	2001/07/17 08:21:36	1.52
++++ libc/nss/nsswitch.c	2001/12/17 05:52:11	1.53
+@@ -178,7 +178,7 @@
+     {
+       /* This is really only for debugging.  */
+        if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
+-	 __libc_fatal ("illegal status in " __FUNCTION__);
++	 __libc_fatal ("illegal status in __nss_next");
+ 
+        if (nss_next_action (*ni, status) == NSS_ACTION_RETURN)
+ 	 return 1;
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch
new file mode 100644
index 00000000..31b7b67c
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch
@@ -0,0 +1,48 @@
+Suggested by Jake Page <jake at cs dot stanford dot edu>
+in http://sources.redhat.com/ml/crossgcc/2004-07/msg00169.html
+but the libc-symbols.h fragment has been reworked to fix typos
+and to still work on gcc-2.95.3, which lacks _Pragma.
+
+His comment was:
+ Fixes gcc-3.4 optimizing out comparisons to weak external symbols in code
+ like:
+  if (__pthread_mutex_init != NULL)
+    __pthread_mutex_init(...);
+ that causes segfaults during libc init when not linked to libpthread
+
+diff -uNr glibc-2.2.5-orig/resolv/res_libc.c glibc-2.2.5/resolv/res_libc.c
+--- glibc-2.2.5-orig/resolv/res_libc.c	2001-02-12 12:23:34.000000000 -0800
++++ glibc-2.2.5/resolv/res_libc.c	2004-07-27 22:56:32.000000000 -0700
+@@ -84,7 +84,8 @@
+ 
+ #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2)
+ # undef res_init
+-strong_alias (__res_init, __res_init_weak);
++extern int __res_init_weak (void);
+ weak_extern (__res_init_weak);
++strong_alias (__res_init, __res_init_weak);
+ compat_symbol (libc, __res_init_weak, res_init, GLIBC_2_0);
+ #endif
+--- glibc-2.2.5/include/libc-symbols.h.old	Fri Aug 13 04:20:55 2004
++++ glibc-2.2.5/include/libc-symbols.h	Fri Aug 13 04:37:06 2004
+@@ -108,10 +108,16 @@
+ 
+ /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
+ #  define weak_extern(symbol) _weak_extern (symbol)
+-#  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+-#   define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
+-#  else
+-#   define _weak_extern(symbol)    asm (".weak " __SYMBOL_PREFIX #symbol);
++#  if __GNUC__ >= 3
++    /* see http://sources.redhat.com/ml/libc-alpha/2003-01/msg00043.html */
++#   define __weak_extern_1(expr) _Pragma(#expr)
++#   define _weak_extern(symbol) __weak_extern_1(weak symbol)
++#  else /* __GNUC__ == 2 */
++#   ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
++#    define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol);
++#   else
++#    define _weak_extern(symbol)    asm (".weak " __SYMBOL_PREFIX #symbol);
++#   endif
+ #  endif
+ 
+ # else
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch
new file mode 100644
index 00000000..effd636a
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch
@@ -0,0 +1,21 @@
+Fixes
+checking version of powerpc-405-linux-gnu-gcc ... 4.0.0, bad
+checking for gnumake... no
+checking for gmake... no
+checking for make... make
+checking version of make... 3.80, ok
+configure: error:
+*** These critical programs are missing or too old:gcc 
+
+
+--- glibc-2.2.5/configure.old	2005-03-10 00:23:46.374213600 -0800
++++ glibc-2.2.5/configure	2005-03-10 00:25:13.313996744 -0800
+@@ -1476,7 +1476,7 @@
+   ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[0-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*)
++    *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[0-9]*|4.0*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch
new file mode 100644
index 00000000..0428c876
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch
@@ -0,0 +1,43 @@
+Fixes
+dynamic-link.h:38: error: invalid storage class for function 'elf_get_dynamic_info'
+kinda like http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dynamic-link.h.diff?r1=1.50&r2=1.51&cvsroot=glibc does
+and fixes
+In file included from dynamic-link.h:218,
+                 from dl-reloc.c:153:
+do-rel.h:46: error: invalid storage class for function 'elf_dynamic_do_rel'
+
+--- /home/dank/downloads/glibc-2.2.5/elf/dynamic-link.h	2001-07-05 21:54:46.000000000 -0700
++++ glibc-2.2.5/elf/dynamic-link.h	2005-03-11 14:18:34.542858064 -0800
+@@ -33,7 +33,16 @@
+ 
+ /* Read the dynamic section at DYN and fill in INFO with indices DT_*.  */
+ 
++#if __GNUC__ >= 4
++#ifndef RESOLVE_MAP
++static
++#else
++auto
++#endif
++inline void __attribute__ ((unused, always_inline))
++#else
+ static inline void __attribute__ ((unused))
++#endif
+ elf_get_dynamic_info (struct link_map *l)
+ {
+   ElfW(Dyn) *dyn = l->l_ld;
+
+--- /home/dank/downloads/glibc-2.2.5/elf/do-rel.h	2001-08-24 11:45:23.000000000 -0700
++++ glibc-2.2.5/elf/do-rel.h	2005-03-11 14:26:43.538519424 -0800
+@@ -39,7 +39,12 @@
+    relocations; they should be set up to call _dl_runtime_resolve, rather
+    than fully resolved now.  */
+ 
++#if __GNUC__ >= 4
++auto inline void
++__attribute ((always_inline))
++#else
+ static inline void
++#endif
+ elf_dynamic_do_rel (struct link_map *map,
+ 		    ElfW(Addr) reladdr, ElfW(Addr) relsize,
+ 		    int lazy)
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch
new file mode 100644
index 00000000..2a8c3a95
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch
@@ -0,0 +1,39 @@
+Fixes
+
+dl-load.c: In function '_dl_map_object_from_fd':
+dl-load.c:1089: error: invalid lvalue in assignment
+dl-load.c:1109: error: invalid lvalue in assignment
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc
+rediffed against glibc-2.2.5
+
+Revision 1.236, Sat Feb 21 18:25:41 2004 UTC by aj
+Branch: MAIN
+Changes since 1.235: +2 -2 lines
+Diff to previous 1.235 (colored)
+
+(_dl_map_object_from_fd): Fix casts used as lvalue.
+
+
+diff -ur glibc-2.2.5/elf/dl-load.c glibc-2.2.5-patched/elf/dl-load.c
+--- glibc-2.2.5/elf/dl-load.c	2001-11-10 14:43:10.000000000 -0800
++++ glibc-2.2.5-patched/elf/dl-load.c	2005-03-11 13:48:18.211982328 -0800
+@@ -1086,7 +1086,7 @@
+       }
+     else
+       /* Adjust the PT_PHDR value by the runtime load address.  */
+-      (ElfW(Addr)) l->l_phdr += l->l_addr;
++      l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr);
+   }
+ 
+   /* We are done mapping in the file.  We no longer need the descriptor.  */
+@@ -1106,7 +1106,7 @@
+ 	}
+     }
+   else
+-    (ElfW(Addr)) l->l_ld += l->l_addr;
++    l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
+ 
+   l->l_entry += l->l_addr;
+ 
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch
new file mode 100644
index 00000000..54c349ef
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch
@@ -0,0 +1,226 @@
+Fixes
+gconv_open.c: In function `__gconv_open':
+gconv_open.c:186: error: invalid lvalue in assignment
+when building glibc-2.2.5 with gcc-4.0.
+Same as ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch
+but rediffed against glibc-2.2.5.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc'
+        * (internal_ucs4_loop): Fix typo in last change.
+
+        * (internal_ucs4le_loop): Remove cast used as lvalue.
+
+        * Fix last commit.
+
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc'
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v
+retrieving revision 1.32
+retrieving revision 1.33
+diff -u -r1.32 -r1.33
+--- libc/iconv/gconv_open.c	2001/11/29 04:51:58	1.32
++++ libc/iconv/gconv_open.c	2004/02/07 15:56:32	1.33
+@@ -1,5 +1,5 @@
+ /* Find matching transformation algorithms and initialize steps.
+-   Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -182,8 +182,13 @@
+ 	      || __builtin_expect (__gconv_translit_find (runp), 0) == 0)
+ 	    lastp = runp;
+ 	  else
+-	    /* This means we haven't found the module.  Remove it.  */
+-	    (lastp == NULL ? trans : lastp->next) = runp->next;
++	    {
++	      /* This means we haven't found the module.  Remove it.  */
++	      if (lastp == NULL)
++		trans  = runp->next;
++	      else
++		lastp->next  = runp->next;
++	    }
+ 	}
+ 
+       /* Allocate room for handle.  */
+===================================================================
+--- glibc-2.2.5/iconv/gconv_simple.c.old	2001-08-03 15:06:46.000000000 -0700
++++ glibc-2.2.5/iconv/gconv_simple.c	2005-03-10 00:49:45.558181608 -0800
+@@ -1,5 +1,5 @@
+ /* Simple transformations functions.
+-   Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -73,12 +73,13 @@
+ #if __BYTE_ORDER == __LITTLE_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
+ 
+   *inptrp = inptr;
+-  *outptrp = outptr;
++  *outptrp = (unsigned char *) outptr32;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* Simply copy the data.  */
+   *inptrp = inptr + n_convert * 4;
+@@ -176,13 +177,16 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
+ #else
+ # error "This endianess is not supported."
+ #endif
++  *outptrp += 4;
+ 
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+@@ -251,7 +255,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -427,9 +432,11 @@
+ #if __BYTE_ORDER == __BIG_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
++  outptr = (unsigned char *) outptr32;
+ 
+   *inptrp = inptr;
+   *outptrp = outptr;
+@@ -530,12 +537,17 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #else
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
++
+ #endif
+ 
++  *outptrp += 4;
++
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+ 
+@@ -600,7 +612,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -782,7 +795,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *((uint32_t *) outptr)++ = *inptr++;				      \
++      *((uint32_t *) outptr) = *inptr++;				      \
++      outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -812,7 +826,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *outptr++ = *((const uint32_t *) inptr)++;			      \
++      *outptr++ = *((const uint32_t *) inptr);				      \
++      inptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -1031,7 +1046,8 @@
+       }									      \
+ 									      \
+     /* Now adjust the pointers and store the result.  */		      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ 
+@@ -1174,7 +1190,8 @@
+ 	continue;							      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1224,7 +1241,8 @@
+       }									      \
+     else 								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = val;					      \
++	*((uint16_t *) outptr) = val;					      \
++        outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
+@@ -1265,7 +1283,8 @@
+ 	continue;							      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1314,7 +1333,8 @@
+       }									      \
+     else 								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = bswap_16 (val);			      \
++	*((uint16_t *) outptr) = bswap_16 (val);			      \
++	outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch
new file mode 100644
index 00000000..f13a8921
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch
@@ -0,0 +1,49 @@
+Fixes
+../sysdeps/i386/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/i386/dl-machine.h:306: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/i386/dl-machine.h:385: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/i386/dl-machine.h:393: error: invalid storage class for function 'elf_machine_lazy_rel'
+
+when building glibc-2.2.5 with gcc-4.0.
+
+--- /home/dank/downloads/glibc-2.2.5/sysdeps/i386/dl-machine.h	2001-08-30 16:09:10.000000000 -0700
++++ glibc-2.2.5/sysdeps/i386/dl-machine.h	2005-03-11 14:00:22.601858328 -0800
+@@ -298,7 +299,12 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
++#if __GNUC__ >= 4
++auto inline void
++__attribute ((always_inline))
++#else
+ static inline void
++#endif
+ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
+ 		 const Elf32_Sym *sym, const struct r_found_version *version,
+ 		 Elf32_Addr *const reloc_addr)
+@@ -378,7 +384,12 @@
+     }
+ }
+ 
++#if __GNUC__ >= 4
++auto inline void
++__attribute ((always_inline))
++#else
+ static inline void
++#endif
+ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+ 			  Elf32_Addr *const reloc_addr)
+ {
+@@ -386,7 +397,12 @@
+   *reloc_addr += l_addr;
+ }
+ 
++#if __GNUC__ >= 4
++auto inline void
++__attribute ((always_inline))
++#else
+ static inline void
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rel *reloc)
+ {
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch
new file mode 100644
index 00000000..f7cfa584
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch
@@ -0,0 +1,20 @@
+Fixes
+iconvconfig.c: In function 'write_output':
+iconvconfig.c:973: error: invalid storage class for function 'name_insert'
+
+--- glibc-2.2.5/iconv/iconvconfig.c.old	2002-01-20 19:20:53.000000000 -0800
++++ glibc-2.2.5/iconv/iconvconfig.c	2005-03-11 14:30:27.000000000 -0800
+@@ -969,7 +969,12 @@
+   char tmpfname[sizeof (GCONV_MODULES_CACHE) + strlen (".XXXXXX")];
+ 
+   /* Function to insert the names.  */
+-  static void name_insert (const void *nodep, VISIT value, int level)
++#if __GNUC__ >= 4
++  auto 
++#else
++  static 
++#endif
++  void name_insert (const void *nodep, VISIT value, int level)
+     {
+       struct name *name;
+       unsigned int idx;
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch
new file mode 100644
index 00000000..50190318
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch
@@ -0,0 +1,114 @@
+Fixes
+
+In file included from jis0208.c:23:
+jis0208.h:32: error: array type has incomplete element type
+when building with gcc-4.0
+
+In file included from cp1258.c:869:
+../iconv/skeleton.c: In function 'gconv':
+../iconv/skeleton.c:323: error: invalid lvalue in increment
+
+In file included from cp1255.c:550:
+../iconv/skeleton.c: In function 'gconv':
+../iconv/skeleton.c:323: error: invalid lvalue in increment
+
+In file included from gb18030.c:22114:
+../iconv/loop.c: In function 'from_gb18030':
+../iconv/loop.c:282: error: invalid lvalue in increment
+../iconv/loop.c: In function 'from_gb18030_single':
+../iconv/loop.c:384: error: invalid lvalue in increment
+
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/iso8859-1.c	2001-08-03 15:06:50.000000000 -0700
++++ glibc-2.2.5/iconvdata/iso8859-1.c	2005-03-11 15:09:15.233602808 -0800
+@@ -35,7 +35,8 @@
+ #define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
+ #define LOOPFCT			FROM_LOOP
+ #define BODY \
+-  *((uint32_t *) outptr)++ = *inptr++;
++  *((uint32_t *) outptr) = *inptr++;					      \
++  outptr += sizeof (uint32_t);
+ #include <iconv/loop.c>
+ 
+ 
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/jis0208.h	2001-07-05 21:54:52.000000000 -0700
++++ glibc-2.2.5/iconvdata/jis0208.h	2005-03-11 15:27:23.295192304 -0800
+@@ -24,15 +24,6 @@
+ #include <gconv.h>
+ #include <stdint.h>
+ 
+-/* Conversion table.  */
+-extern const uint16_t __jis0208_to_ucs[];
+-
+-extern const char __jisx0208_from_ucs4_lat1[256][2];
+-extern const char __jisx0208_from_ucs4_greek[0xc1][2];
+-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
+-extern const char __jisx0208_from_ucs_tab[][2];
+-
+-
+ /* Struct for table with indeces in UCS mapping table.  */
+ struct jisx0208_ucs_idx
+ {
+@@ -42,6 +33,15 @@
+ };
+ 
+ 
++/* Conversion table.  */
++extern const uint16_t __jis0208_to_ucs[];
++
++extern const char __jisx0208_from_ucs4_lat1[256][2];
++extern const char __jisx0208_from_ucs4_greek[0xc1][2];
++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
++extern const char __jisx0208_from_ucs_tab[][2];
++
++
+ static inline uint32_t
+ jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset)
+ {
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/cp1258.c	2001-07-05 21:54:49.000000000 -0700
++++ glibc-2.2.5/iconvdata/cp1258.c	2005-03-11 15:41:44.953200376 -0800
+@@ -66,7 +66,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/cp1255.c	2001-07-05 21:54:49.000000000 -0700
++++ glibc-2.2.5/iconvdata/cp1255.c	2005-03-11 15:47:40.689120296 -0800
+@@ -65,7 +65,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/gb18030.c	2001-08-03 15:06:47.000000000 -0700
++++ glibc-2.2.5/iconvdata/gb18030.c	2005-03-11 15:54:59.060477720 -0800
+@@ -22108,7 +22108,8 @@
+ 	    }							      	      \
+ 	}								      \
+ 									      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+--- /home/dank/downloads/glibc-2.2.5/iconvdata/iso-2022-cn-ext.c	2001-07-05 21:54:51.000000000 -0700
++++ glibc-2.2.5/iconvdata/iso-2022-cn-ext.c	2005-03-11 15:55:42.002949472 -0800
+@@ -411,7 +411,8 @@
+ 	  }								      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define EXTRA_LOOP_DECLS	, int *setp
+ #define INIT_PARAMS		int set = (*setp >> 3) & CURRENT_MASK; \
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch
new file mode 100644
index 00000000..fa4b5b7f
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch
@@ -0,0 +1,49 @@
+Fixes
+
+In file included from strcoll.c:101:
+../locale/weight.h: In function 'strcoll':
+../locale/weight.h:23: error: invalid storage class for function 'findidx'
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/string/strcoll.o] Error 1
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/string'
+make[1]: *** [string/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+Discussed here
+http://sources.redhat.com/ml/libc-hacker/2004-09/msg00015.html
+the fix checked in to cvs seems to be
+http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg01071.html
+but that fix doesn't support older gcc's, so I can't use it directly.
+
+Here's a fix the does work with older versions of gcc:
+
+--- glibc-2.2.5/locale/weight.h.old	2001-07-05 21:55:33.000000000 -0700
++++ glibc-2.2.5/locale/weight.h	2005-03-10 16:07:46.669579888 -0800
+@@ -18,7 +18,12 @@
+    02111-1307 USA.  */
+ 
+ /* Find index of weight.  */
++#if __GNUC__ >= 4
++auto inline int32_t
++__attribute ((always_inline))
++#else
+ static inline int32_t
++#endif
+ findidx (const unsigned char **cpp)
+ {
+   int_fast32_t i = table[*(*cpp)++];
+--- glibc-2.2.5/locale/weightwc.h.old	2001-08-06 21:26:15.000000000 -0700
++++ glibc-2.2.5/locale/weightwc.h	2005-03-10 16:13:08.651631176 -0800
+@@ -18,7 +18,12 @@
+    02111-1307 USA.  */
+ 
+ /* Find index of weight.  */
++#if __GNUC__ >= 4
++auto inline int32_t
++__attribute ((always_inline))
++#else
+ static inline int32_t
++#endif
+ findidx (const wint_t **cpp)
+ {
+   int32_t i;
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch
new file mode 100644
index 00000000..2d9f0924
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch
@@ -0,0 +1,48 @@
+Fixes
+programs/ld-collate.c: In function 'obstack_int32_grow':
+programs/ld-collate.c:48: error: invalid lvalue in increment
+programs/ld-collate.c: In function 'obstack_int32_grow_fast':
+programs/ld-collate.c:57: error: invalid lvalue in increment
+
+Change taken by eyeball from version 1.20 at
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/malloc/obstack.h?cvsroot=glibc
+
+--- /home/dank/downloads/glibc-2.2.5/malloc/obstack.h	2001-07-05 21:55:35.000000000 -0700
++++ glibc-2.2.5/malloc/obstack.h	2005-03-11 16:12:16.175812224 -0800
+@@ -423,22 +423,29 @@
+ ({ struct obstack *__o = (OBSTACK);					\
+    if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
+      _obstack_newchunk (__o, sizeof (void *));				\
+-   *((void **)__o->next_free)++ = (datum);				\
+-   (void) 0; })
++   obstack_ptr_grow_fast (__o, datum); })
+ 
+ # define obstack_int_grow(OBSTACK,datum)				\
+ __extension__								\
+ ({ struct obstack *__o = (OBSTACK);					\
+    if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
+      _obstack_newchunk (__o, sizeof (int));				\
+-   *((int *)__o->next_free)++ = (datum);				\
++   obstack_int_grow_fast (__o, datum); })
++
++# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
++__extension__								\
++({ struct obstack *__o1 = (OBSTACK);					\
++   *(const void **) __o1->next_free = (aptr);				\
++   __o1->next_free += sizeof (const void *);				\
+    (void) 0; })
+ 
+-# define obstack_ptr_grow_fast(h,aptr)					\
+-  (*((void **) (h)->next_free)++ = (aptr))
++# define obstack_int_grow_fast(OBSTACK,aint)				\
++__extension__								\
++({ struct obstack *__o1 = (OBSTACK);					\
++   *(int *) __o1->next_free = (aint);					\
++   __o1->next_free += sizeof (int);					\
++   (void) 0; })
+ 
+-# define obstack_int_grow_fast(h,aint)					\
+-  (*((int *) (h)->next_free)++ = (aint))
+ 
+ # define obstack_blank(OBSTACK,length)					\
+ __extension__								\
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch
new file mode 100644
index 00000000..1b4f4457
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch
@@ -0,0 +1,81 @@
+Message-ID: <424A8F67.7060307@kaear.co.uk>
+Date: Wed, 30 Mar 2005 12:37:11 +0100
+From: Piete Sartain <kaear@kaear.co.uk>
+To:  crossgcc@sources.redhat.com
+Subject: [Patch]  CT 0.3 - glibc-2.2.5-allow-gcc-4.0-mipsel
+
+
+I copied the relevant sections out of 
+http://kegel.com/crosstool/crosstool-0.29/patches/glibc-2.3-20050307/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch 
+for a mipsel target.
+
+The build still fails, but now with an assembler error at crtbegin.o.
+
+[---dank: judging from my old buildlogs, this should fix:
+
+In file included from dynamic-link.h:21,
+                 from dl-reloc.c:153:
+../sysdeps/mips/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/mips/dl-machine.h:477: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/mips/dl-machine.h:539: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/mips/dl-machine.h:546: error: invalid storage class for function 'elf_machine_lazy_rel'
+../sysdeps/mips/dl-machine.h:554: error: invalid storage class for function 'elf_machine_got_rel'
+../sysdeps/mips/dl-machine.h:641: error: invalid storage class for function 'elf_machine_runtime_setup'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/elf'
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-reloc.o] Error 1
+make[1]: *** [elf/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+---]
+
+
+--- glibc-2.2.5/sysdeps/mips/dl-machine.h.old	2005-03-28 18:19:56.000000000 +0100
++++ glibc-2.2.5/sysdeps/mips/dl-machine.h	2005-03-28 18:25:15.000000000 +0100
+@@ -534,14 +534,28 @@
+     }
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+ 			  ElfW(Addr) *const reloc_addr)
+ {
+   /* XXX Nothing to do.  There is no relative relocation, right?  */
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc)
+ {
+@@ -550,7 +564,14 @@
+ 
+ #ifndef RTLD_BOOTSTRAP
+ /* Relocate GOT. */
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_got_rel (struct link_map *map, int lazy)
+ {
+   ElfW(Addr) *got;
+
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch
new file mode 100644
index 00000000..171d2e48
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch
@@ -0,0 +1,47 @@
+Fixes
+
+msort.c: In function 'msort_with_tmp':
+msort.c:59: error: invalid lvalue in increment
+msort.c:59: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/stdlib/msort.o] Error 1
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/stdlib'
+make[1]: *** [stdlib/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2 
+
+when building glibc-2.2.5 with gcc-3.4.
+
+Taken from ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch
+and rediffed.
+
+--- glibc-2.2.5/stdlib/msort.c.old	2001-07-05 21:55:41.000000000 -0700
++++ glibc-2.2.5/stdlib/msort.c	2005-03-10 08:24:24.152204976 -0800
+@@ -1,6 +1,6 @@
+ /* An alternative to qsort, with an identical interface.
+    This file is part of the GNU C Library.
+-   Copyright (C) 1992, 1995-1997, 1999, 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1992, 1995-1997, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+    Written by Mike Haertel, September 1988.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -56,12 +56,16 @@
+ 	if ((*cmp) (b1, b2) <= 0)
+ 	  {
+ 	    --n1;
+-	    *((op_t *) tmp)++ = *((op_t *) b1)++;
++	    *((op_t *) tmp) = *((op_t *) b1);
++	    tmp += sizeof (op_t);
++	    b1 += sizeof (op_t);
+ 	  }
+ 	else
+ 	  {
+ 	    --n2;
+-	    *((op_t *) tmp)++ = *((op_t *) b2)++;
++	    *((op_t *) tmp) = *((op_t *) b2);
++	    tmp += sizeof (op_t);
++	    b2 += sizeof (op_t);
+ 	  }
+       }
+   else
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch
new file mode 100644
index 00000000..fb1a0c99
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch
@@ -0,0 +1,54 @@
+(See similar patch for glibc-2.3.3)
+
+This fix discussed here:
+http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html
+
+Fixes
+
+In file included from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:6,
+                 from internals.h:36,
+                 from attr.c:23:
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: error: syntax error before 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: warning: type defaults to 'int' in declaration of 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: warning: data definition has no type or storage class
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: error: syntax error before 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: warning: type defaults to 'int' in declaration of 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: warning: data definition has no type or storage class
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/powerpc-405-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/linuxthreads'
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/powerpc-405-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/linuxthreads/attr.o] Error 1
+
+From: Martin Egholm Nielsen martin at egholm-nielsen dot dk
+To: crossgcc at sources dot redhat dot com
+Date: Thu, 24 Mar 2005 18:40:27 +0100
+Subject: [Patch] CT 0.29 - glibc-2.2.5-allow-gcc-4.0-powerpc-procfs
+
+Hi Dan,
+
+I had to add the following patch in order to make CT 0.29 and glibc 
+2.2.5 compile with gcc 4.0 (20050305) and Kernel 2.4.20...
+
+// Martin
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.old	2005-03-24 13:11:39.746062400 +0100
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2005-03-24 13:15:11.810996800 +0100
+@@ -42,15 +42,10 @@
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+ 
+-/* gcc 3.1 and newer support __uint128_t.  */
+-#if !__GNUC_PREREQ(3,1)
+-typedef struct {
+-  unsigned long u[4];
+-} __attribute((aligned(16))) __uint128_t;
+-#endif
+-
+ /* Altivec registers */
+-typedef __uint128_t elf_vrreg_t;
++typedef struct {
++  unsigned int u[4];
++} __attribute__ ((aligned (16))) elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
+ 
+ struct elf_siginfo
+
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch
new file mode 100644
index 00000000..6b889c24
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch
@@ -0,0 +1,23 @@
+In file included from dynamic-link.h:21,
+                 from dl-reloc.c:153:
+../sysdeps/powerpc/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/dl-machine.h:399: error: invalid storage class for function 'elf_machine_rela_relative'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-reloc.o] Error 1
+--- glibc-2.2.5/sysdeps/powerpc/dl-machine.h.old	Thu Mar 17 13:28:17 2005
++++ glibc-2.2.5/sysdeps/powerpc/dl-machine.h	Thu Mar 17 13:29:03 2005
+@@ -393,7 +393,14 @@
+ 			    reloc_addr, finaladdr, rinfo);
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   Elf32_Addr *const reloc_addr)
+ {
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch
new file mode 100644
index 00000000..4a07130e
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch
@@ -0,0 +1,221 @@
+[Taken from ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.4-sunrpc.patch,
+rediffed, and with a fix for sunrpc/auth_none.c that was
+inexplicably not included in the original patch.]
+
+Fixes 
+
+auth_none.c: In function 'authnone_create':
+auth_none.c:83: error: invalid lvalue in assignment
+clnt_perr.c: In function '_buf':
+clnt_perr.c:68: error: invalid lvalue in assignment 
+clnt_raw.c: In function 'clntraw_create':
+clnt_raw.c:103: error: invalid lvalue in assignment
+clnt_simp.c: In function 'callrpc':
+clnt_simp.c:78: error: invalid lvalue in assignment
+etc.
+
+building glibc-2.2.5 with gcc-4.0.
+
+---
+
+http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html
+[Also in CVS, but the original patch is easier to get.]
+
+Fixes errors like
+
+clnt_perr.c: In function `_buf':
+clnt_perr.c:67: error: invalid lvalue in assignment
+
+when building with gcc-3.5.
+
+To: libc-hacker at sources dot redhat dot com
+Subject: Fix cast as lvalue in sunrpc
+From: Andreas Schwab <schwab at suse dot de>
+X-Yow: SHHHH!!  I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS
+ into empty OIL DRUMS dot  dot 
+Date: Sun, 08 Feb 2004 17:38:31 +0100
+Message-ID: <je4qu1frw8.fsf@sykes.suse.de>
+
+This fixes the uses of casts as lvalue in the sunrpc code.
+
+Andreas.
+
+2004-02-08  Andreas Schwab  <schwab@suse.de>
+
+	* include/rpc/rpc.h: Declare thread variables with their correct
+	type.
+	* sunrpc/clnt_perr.c: Don't cast thread variables.
+	* sunrpc/clnt_raw.c: Likewise.
+	* sunrpc/clnt_simp.c: Likewise.
+	* sunrpc/key_call.c: Likewise.
+	* sunrpc/svcauth_des.c: Likewise.
+	* sunrpc/svc.c: Likewise.
+	* sunrpc/svc_raw.c: Likewise.
+	* sunrpc/svc_simple.c: Likewise.
+
+diff -ur glibc-2.2.5/include/rpc/rpc.h glibc-2.2.5-patched/include/rpc/rpc.h
+--- glibc-2.2.5/include/rpc/rpc.h	2001-03-25 21:11:32.000000000 -0800
++++ glibc-2.2.5-patched/include/rpc/rpc.h	2005-03-11 13:18:29.810860624 -0800
+@@ -18,24 +18,24 @@
+ 
+ 	void		*authnone_private_s;	/* auth_none.c */
+ 
+-	void		*clnt_perr_buf_s;	/* clnt_perr.c */
++	char		*clnt_perr_buf_s;	/* clnt_perr.c */
+ 
+-	void		*clntraw_private_s;	/* clnt_raw.c */
++	struct clntraw_private_s *clntraw_private_s;	/* clnt_raw.c */
+ 
+-	void		*callrpc_private_s;	/* clnt_simp.c */
++	struct callrpc_private_s *callrpc_private_s;	/* clnt_simp.c */
+ 
+-	void		*key_call_private_s;	/* key_call.c */
++	struct key_call_private *key_call_private_s;	/* key_call.c */
+ 
+-	void		*authdes_cache_s;	/* svcauth_des.c */
+-	void		*authdes_lru_s;		/* svcauth_des.c */
++	struct cache_entry *authdes_cache_s;	/* svcauth_des.c */
++	int		*authdes_lru_s;		/* svcauth_des.c */
+ 
+-	void		*svc_xports_s;		/* svc.c */
+-	void		*svc_head_s;		/* svc.c */
++	SVCXPRT		**svc_xports_s;		/* svc.c */
++	struct svc_callout *svc_head_s;		/* svc.c */
+ 
+-	void		*svcraw_private_s;	/* svc_raw.c */
++	struct svcraw_private_s *svcraw_private_s;	/* svc_raw.c */
+ 
+-	void		*svcsimple_proglst_s;	/* svc_simple.c */
+-	void		*svcsimple_transp_s;	/* svc_simple.c */
++	struct proglst_ *svcsimple_proglst_s;	/* svc_simple.c */
++	SVCXPRT		*svcsimple_transp_s;	/* svc_simple.c */
+ };
+ 
+ extern struct rpc_thread_variables *__rpc_thread_variables(void)
+--- glibc-2.2.5/sunrpc/auth_none.c.old	2005-03-10 16:26:53.874178280 -0800
++++ glibc-2.2.5/sunrpc/auth_none.c	2005-03-10 16:34:24.551664888 -0800
+@@ -62,7 +62,7 @@
+   u_int mcnt;
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define authnone_private ((struct authnone_private_s *)RPC_THREAD_VARIABLE(authnone_private_s))
++#define authnone_private RPC_THREAD_VARIABLE(authnone_private_s)
+ #else
+ static struct authnone_private_s *authnone_private;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/clnt_perr.c glibc-2.2.5-patched/sunrpc/clnt_perr.c
+--- glibc-2.2.5/sunrpc/clnt_perr.c	2001-08-16 21:48:31.000000000 -0700
++++ glibc-2.2.5-patched/sunrpc/clnt_perr.c	2005-03-11 13:18:29.812860320 -0800
+@@ -56,7 +56,7 @@
+  * buf variable in a few functions.  Overriding a global variable
+  * with a local variable of the same name is a bad idea, anyway.
+  */
+-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s))
++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s)
+ #else
+ static char *buf;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/clnt_raw.c glibc-2.2.5-patched/sunrpc/clnt_raw.c
+--- glibc-2.2.5/sunrpc/clnt_raw.c	2001-03-20 10:34:22.000000000 -0800
++++ glibc-2.2.5-patched/sunrpc/clnt_raw.c	2005-03-11 13:18:29.813860168 -0800
+@@ -61,7 +61,7 @@
+     u_int mcnt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s))
++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s)
+ #else
+ static struct clntraw_private_s *clntraw_private;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/clnt_simp.c glibc-2.2.5-patched/sunrpc/clnt_simp.c
+--- glibc-2.2.5/sunrpc/clnt_simp.c	2001-08-19 23:28:21.000000000 -0700
++++ glibc-2.2.5-patched/sunrpc/clnt_simp.c	2005-03-11 13:18:29.814860016 -0800
+@@ -55,7 +55,7 @@
+     char *oldhost;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s))
++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s)
+ #else
+ static struct callrpc_private_s *callrpc_private;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/key_call.c glibc-2.2.5-patched/sunrpc/key_call.c
+--- glibc-2.2.5/sunrpc/key_call.c	2001-03-20 10:34:22.000000000 -0800
++++ glibc-2.2.5-patched/sunrpc/key_call.c	2005-03-11 13:18:29.816859712 -0800
+@@ -360,7 +360,7 @@
+   uid_t   uid;            /* user-id at last authorization */
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define key_call_private_main ((struct  key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s))
++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s)
+ #else
+ static struct key_call_private *key_call_private_main;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/svcauth_des.c glibc-2.2.5-patched/sunrpc/svcauth_des.c
+--- glibc-2.2.5/sunrpc/svcauth_des.c	2001-08-19 23:37:09.000000000 -0700
++++ glibc-2.2.5-patched/sunrpc/svcauth_des.c	2005-03-11 13:18:29.821858952 -0800
+@@ -72,8 +72,8 @@
+     char *localcred;		/* generic local credential */
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s))
+-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s))
++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s)
++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s)
+ #else
+ static struct cache_entry *authdes_cache;
+ static int *authdes_lru;
+diff -ur glibc-2.2.5/sunrpc/svc.c glibc-2.2.5-patched/sunrpc/svc.c
+--- glibc-2.2.5/sunrpc/svc.c	2001-03-20 10:34:22.000000000 -0800
++++ glibc-2.2.5-patched/sunrpc/svc.c	2005-03-11 13:18:29.817859560 -0800
+@@ -44,7 +44,7 @@
+ #include <sys/poll.h>
+ 
+ #ifdef _RPC_THREAD_SAFE_
+-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s))
++#define xports RPC_THREAD_VARIABLE(svc_xports_s)
+ #else
+ static SVCXPRT **xports;
+ #endif
+@@ -63,7 +63,7 @@
+   void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s))
++#define svc_head RPC_THREAD_VARIABLE(svc_head_s)
+ #else
+ static struct svc_callout *svc_head;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/svc_raw.c glibc-2.2.5-patched/sunrpc/svc_raw.c
+--- glibc-2.2.5/sunrpc/svc_raw.c	2001-03-20 10:34:22.000000000 -0800
++++ glibc-2.2.5-patched/sunrpc/svc_raw.c	2005-03-11 13:18:29.818859408 -0800
+@@ -54,7 +54,7 @@
+     char verf_body[MAX_AUTH_BYTES];
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s))
++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s)
+ #else
+ static struct svcraw_private_s *svcraw_private;
+ #endif
+diff -ur glibc-2.2.5/sunrpc/svc_simple.c glibc-2.2.5-patched/sunrpc/svc_simple.c
+--- glibc-2.2.5/sunrpc/svc_simple.c	2001-08-17 00:16:04.000000000 -0700
++++ glibc-2.2.5-patched/sunrpc/svc_simple.c	2005-03-11 13:18:29.820859104 -0800
+@@ -62,7 +62,7 @@
+     struct proglst_ *p_nxt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s))
++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s)
+ #else
+ static struct proglst_ *proglst;
+ #endif
+@@ -70,7 +70,7 @@
+ 
+ static void universal (struct svc_req *rqstp, SVCXPRT *transp_s);
+ #ifdef _RPC_THREAD_SAFE_
+-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s))
++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s)
+ #else
+ static SVCXPRT *transp;
+ #endif
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch
new file mode 100644
index 00000000..89cc9ead
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch
@@ -0,0 +1,58 @@
+Fix for this error:
+
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.)
+make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+[ Same as glibc-2.3.2-alpha-pwrite.patch except for copyright date ]
+
+extracted from GLIBC CVS by Dan Kegel
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc'
+(to match context of...)
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc'
+and rediffed.
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+Originally thought we needed this hunk, too:
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html
+but it seems the sysdep.h change is sufficient, and works better 
+when compiling against linux-2.4.
+
+===================================================================
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old	2004-05-24 22:21:44.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h	2004-05-24 22:22:48.000000000 -0700
+@@ -1,3 +1,3 @@
+-/* Copyright (C) 1992, 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+@@ -60,6 +60,21 @@
+ #define __NR_osf_getsysinfo	256
+ #define __NR_osf_setsysinfo	257
+ 
++/* Help old kernel headers where particular syscalls are not available.  */
++#ifndef __NR_semtimedop
++# define __NR_semtimedop	423
++#endif
++
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ /*
+  * In order to get the hidden arguments for rt_sigaction set up
+  * properly, we need to call the assembly version.  Detect this in the
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch
new file mode 100644
index 00000000..c4bd19c7
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch
@@ -0,0 +1,30 @@
+Should fix
+
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.)
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+
+Copied from similar patch for alpha.
+
+--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/arm/sysdep.h	2001-07-05 21:56:13.000000000 -0700
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h	2004-08-07 10:45:26.000000000 -0700
+@@ -32,6 +32,15 @@
+ #define SWI_BASE  (0x900000)
+ #define SYS_ify(syscall_name)	(__NR_##syscall_name)
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
+ 
+ #ifdef __ASSEMBLER__
+ 
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch b/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch
new file mode 100644
index 00000000..c9f37011
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch
@@ -0,0 +1,27 @@
+Fixes errors like
+  /build-glibc/dlfcn/glrefmain: cannot load `glreflib1.so'
+in glibc regression test
+
+--- glibc-2.2.5/dlfcn/Makefile.old	Thu Jul 24 16:30:20 2003
++++ glibc-2.2.5/dlfcn/Makefile	Thu Jul 24 17:25:01 2003
+@@ -60,6 +60,8 @@
+ test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
+ $(test-modules): $(objpfx)%.so: $(objpfx)%.os
+ 	$(build-module)
++# without following rule, test-modules don't get built when cross-compiling
++tests: $(test-modules)
+ 
+ $(objpfx)glrefmain: $(libdl)
+ $(objpfx)glrefmain.out: $(objpfx)glrefmain \
+--- glibc-2.2.5/elf/Makefile.old	Thu Jul 24 18:17:12 2003
++++ glibc-2.2.5/elf/Makefile	Thu Jul 24 18:18:58 2003
+@@ -263,6 +263,9 @@
+ test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
+ generated += $(addsuffix .so,$(strip $(modules-names)))
+ 
++# without following rule, test-modules don't get built when cross-compiling
++tests: $(test-modules)
++
+ ifeq (yes,$(build-shared))
+ ifeq ($(cross-compiling),no)
+ tests: $(objpfx)tst-pathopt.out
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch b/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch
new file mode 100644
index 00000000..842d8f54
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch
@@ -0,0 +1,11 @@
+--- glibc-2.2.5/configure.old	2003-05-30 21:51:13.000000000 -0700
++++ glibc-2.2.5/configure	2003-05-30 21:51:23.000000000 -0700
+@@ -1738,7 +1738,7 @@
+   ac_cv_prog_cc_works=yes
+   # If we can't run a trivial program, we are probably using a cross compiler.
+   if (./conftest; exit) 2>/dev/null; then
+-    ac_cv_prog_cc_cross=no
++    ac_cv_prog_cc_cross=yes
+   else
+     ac_cv_prog_cc_cross=yes
+   fi
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch b/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch
new file mode 100644
index 00000000..f14998d3
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch
@@ -0,0 +1,89 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.2 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+forward ported to glibc-2.3.2.
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+
+diff -Naur from-cvs/Makeconfig patched/Makeconfig
+--- from-cvs/Makeconfig	Fri Jan 11 14:40:35 2002
++++ patched/Makeconfig	Fri Jan 11 15:07:30 2002
+@@ -439,13 +439,13 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ else
+ ifneq (,$(findstring aix,$(config-os)))
+ link-libc = $(common-objpfx)libc.a \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ rpath-dirs = math dlfcn nss nis rt resolv crypt
+ endif
+ endif
+@@ -649,7 +649,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -703,14 +703,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ 
+diff -Naur from-cvs/Makerules patched/Makerules
+--- from-cvs/Makerules	Fri Jan 11 14:40:42 2002
++++ patched/Makerules	Fri Jan 11 15:06:00 2002
+@@ -361,7 +361,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -842,14 +842,14 @@
+ # of the files are taken by the linker.
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+ 	 echo '   Use the shared library, but some functions are only in';\
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch b/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch
new file mode 100644
index 00000000..97740d54
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch
@@ -0,0 +1,1134 @@
+# See http://sources.redhat.com/ml/crossgcc/2002-05/msg00132.html
+# This patch is taken directly from the Montavista Hard Hat Linux 2.0 source RPMs,
+# but has been rediffed against glibc-2.2.5
+
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Dist glibc-2.2.5/sysdeps/powerpc/Dist
+--- glibc-2.2.5.old/sysdeps/powerpc/Dist	Fri Jun 30 23:30:21 2000
++++ glibc-2.2.5/sysdeps/powerpc/Dist	Thu Jul 10 11:43:17 2003
+@@ -1,9 +1,6 @@
+ dl-machine.c
+ dl-start.S
+ ppc-mcount.S
+-fe_nomask.c
+-fprrest.S
+-fprsave.S
+ gprsave1.S
+ gprsave0.S
+ gprrest1.S
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Makefile glibc-2.2.5/sysdeps/powerpc/Makefile
+--- glibc-2.2.5.old/sysdeps/powerpc/Makefile	Mon Nov 27 15:32:47 2000
++++ glibc-2.2.5/sysdeps/powerpc/Makefile	Thu Jul 10 11:43:17 2003
+@@ -3,16 +3,12 @@
+ +cflags += -mnew-mnemonics -Wa,-mppc -mpowerpc
+ asm-CPPFLAGS += -Wa,-mppc
+ 
+-ifeq ($(subdir),math)
+-libm-support += fenv_const fe_nomask
+-endif
+-
+ ifeq ($(subdir),gmon)
+ sysdep_routines += ppc-mcount
+ endif
+ 
+ ifeq ($(subdir),misc)
+-sysdep_routines += gprsave0 gprrest0 gprsave1 gprrest1 fprsave fprrest
++sysdep_routines += gprsave0 gprrest0 gprsave1 gprrest1
+ endif
+ 
+ # On PPC, -fpic works until the GOT contains 2^15 bytes, and possibly
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Versions glibc-2.2.5/sysdeps/powerpc/Versions
+--- glibc-2.2.5.old/sysdeps/powerpc/Versions	Mon Feb 28 13:27:57 2000
++++ glibc-2.2.5/sysdeps/powerpc/Versions	Thu Jul 10 11:43:17 2003
+@@ -1,8 +1,4 @@
+ libm {
+-  GLIBC_2.1 {
+-    # symbols used in macros from sysdeps/powerpc/bits/fenv.h
+-    __fe_dfl_env; __fe_enabled_env; __fe_nonieee_env; __fe_nomask_env;
+-  }
+   GLIBC_2.2 {
+     # Special functions to save and restore registers used by the
+     # runtime libraries.
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/__longjmp.S glibc-2.2.5/sysdeps/powerpc/__longjmp.S
+--- glibc-2.2.5.old/sysdeps/powerpc/__longjmp.S	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/__longjmp.S	Thu Jul 10 11:43:17 2003
+@@ -24,6 +24,8 @@
+ #include <bp-sym.h>
+ #include <bp-asm.h>
+ 
++/* The FPU loads have been removed from this file - see fpu/__longjmp.S */
++
+ ENTRY (BP_SYM (__longjmp))
+ 	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+ 
+@@ -31,44 +33,26 @@
+ 	lwz r2,(JB_GPR2*4)(r3)
+ 	lwz r0,(JB_LR*4)(r3)
+ 	lwz r14,((JB_GPRS+0)*4)(r3)
+-	lfd fp14,((JB_FPRS+0*2)*4)(r3)
+ 	lwz r15,((JB_GPRS+1)*4)(r3)
+-	lfd fp15,((JB_FPRS+1*2)*4)(r3)
+ 	lwz r16,((JB_GPRS+2)*4)(r3)
+-	lfd fp16,((JB_FPRS+2*2)*4)(r3)
+ 	lwz r17,((JB_GPRS+3)*4)(r3)
+-	lfd fp17,((JB_FPRS+3*2)*4)(r3)
+ 	lwz r18,((JB_GPRS+4)*4)(r3)
+-	lfd fp18,((JB_FPRS+4*2)*4)(r3)
+ 	lwz r19,((JB_GPRS+5)*4)(r3)
+-	lfd fp19,((JB_FPRS+5*2)*4)(r3)
+ 	lwz r20,((JB_GPRS+6)*4)(r3)
+-	lfd fp20,((JB_FPRS+6*2)*4)(r3)
+ 	mtlr r0
+ 	lwz r21,((JB_GPRS+7)*4)(r3)
+-	lfd fp21,((JB_FPRS+7*2)*4)(r3)
+ 	lwz r22,((JB_GPRS+8)*4)(r3)
+-	lfd fp22,((JB_FPRS+8*2)*4)(r3)
+ 	lwz r0,(JB_CR*4)(r3)
+ 	lwz r23,((JB_GPRS+9)*4)(r3)
+-	lfd fp23,((JB_FPRS+9*2)*4)(r3)
+ 	lwz r24,((JB_GPRS+10)*4)(r3)
+-	lfd fp24,((JB_FPRS+10*2)*4)(r3)
+ 	lwz r25,((JB_GPRS+11)*4)(r3)
+-	lfd fp25,((JB_FPRS+11*2)*4)(r3)
+ 	mtcrf 0xFF,r0
+ 	lwz r26,((JB_GPRS+12)*4)(r3)
+-	lfd fp26,((JB_FPRS+12*2)*4)(r3)
+ 	lwz r27,((JB_GPRS+13)*4)(r3)
+-	lfd fp27,((JB_FPRS+13*2)*4)(r3)
+ 	lwz r28,((JB_GPRS+14)*4)(r3)
+-	lfd fp28,((JB_FPRS+14*2)*4)(r3)
+ 	lwz r29,((JB_GPRS+15)*4)(r3)
+-	lfd fp29,((JB_FPRS+15*2)*4)(r3)
+ 	lwz r30,((JB_GPRS+16)*4)(r3)
+-	lfd fp30,((JB_FPRS+16*2)*4)(r3)
+ 	lwz r31,((JB_GPRS+17)*4)(r3)
+-	lfd fp31,((JB_FPRS+17*2)*4)(r3)
+ 	mr r3,r4
+ 	blr
+ END (BP_SYM (__longjmp))
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/bits/setjmp.h glibc-2.2.5/sysdeps/powerpc/bits/setjmp.h
+--- glibc-2.2.5.old/sysdeps/powerpc/bits/setjmp.h	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/bits/setjmp.h	Thu Jul 10 11:43:17 2003
+@@ -17,6 +17,7 @@
+    02111-1307 USA.  */
+ 
+ /* Define the machine-dependent type `jmp_buf'.  PowerPC version.  */
++/* For processors without floating point. */
+ 
+ #ifndef _SETJMP_H
+ # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+@@ -33,12 +34,11 @@
+ # define JB_LR     2  /* The address we will return to */
+ # define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
+ # define JB_CR     21 /* Condition code registers. */
+-# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
+-# define JB_SIZE   (58*4)
++# define JB_SIZE   (22*4)
+ #endif
+ 
+ #ifndef	_ASM
+-typedef long int __jmp_buf[58];
++typedef long int __jmp_buf[22];
+ #endif
+ 
+ /* Test if longjmp to JMPBUF would unwind the frame
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fclrexcpt.c glibc-2.2.5/sysdeps/powerpc/fclrexcpt.c
+--- glibc-2.2.5.old/sysdeps/powerpc/fclrexcpt.c	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/fclrexcpt.c	Wed Dec 31 16:00:00 1969
+@@ -1,48 +0,0 @@
+-/* Clear given exceptions in current floating-point environment.
+-   Copyright (C) 1997,99,2000,01 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#include <fenv_libc.h>
+-
+-#undef feclearexcept
+-int
+-__feclearexcept (int excepts)
+-{
+-  fenv_union_t u;
+-
+-  /* Get the current state.  */
+-  u.fenv = fegetenv_register ();
+-
+-  /* Clear the relevant bits.  */
+-  u.l[1] = u.l[1] & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID)
+-		      | (excepts & FPSCR_STICKY_BITS));
+-
+-  /* Put the new state in effect.  */
+-  fesetenv_register (u.fenv);
+-
+-  /* Success.  */
+-  return 0;
+-}
+-
+-#include <shlib-compat.h>
+-#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+-strong_alias (__feclearexcept, __old_feclearexcept)
+-compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1);
+-#endif
+-
+-versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fe_nomask.c glibc-2.2.5/sysdeps/powerpc/fe_nomask.c
+--- glibc-2.2.5.old/sysdeps/powerpc/fe_nomask.c	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/fe_nomask.c	Wed Dec 31 16:00:00 1969
+@@ -1,32 +0,0 @@
+-/* Procedure definition for FE_NOMASK_ENV.
+-   Copyright (C) 1997 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#include <fenv.h>
+-#include <errno.h>
+-
+-/* This is presently a stub, until it's decided how the kernels should
+-   support this.  */
+-
+-const fenv_t *
+-__fe_nomask_env(void)
+-{
+-  __set_errno (ENOSYS);
+-  return FE_ENABLED_ENV;
+-}
+-stub_warning (__fe_nomask_env)
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fprrest.S glibc-2.2.5/sysdeps/powerpc/fprrest.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fprrest.S	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/fprrest.S	Wed Dec 31 16:00:00 1969
+@@ -1,94 +0,0 @@
+-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-/*
+-    Floating Point Registers (FPRs) restore routine
+-*/
+-
+-#include <sysdep.h>
+-
+-ENTRY(_restfpr_all)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf14)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_14)
+-C_TEXT(_restf14):
+-C_TEXT(_restfpr_14):	lfd	fp14,-144(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf15)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_15)
+-C_TEXT(_restf15):
+-C_TEXT(_restfpr_15):	lfd	fp15,-136(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf16)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_16)
+-C_TEXT(_restf16):
+-C_TEXT(_restfpr_16):	lfd	fp16,-128(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf17)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_17)
+-C_TEXT(_restf17):
+-C_TEXT(_restfpr_17):	lfd	fp17,-120(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf18)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_18)
+-C_TEXT(_restf18):
+-C_TEXT(_restfpr_18):	lfd	fp18,-112(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf19)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_19)
+-C_TEXT(_restf19):
+-C_TEXT(_restfpr_19):	lfd	fp19,-104(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf20)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_20)
+-C_TEXT(_restf20):
+-C_TEXT(_restfpr_20):	lfd	fp20,-96(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf21)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_21)
+-C_TEXT(_restf21):
+-C_TEXT(_restfpr_21):	lfd	fp21,-88(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf22)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_22)
+-C_TEXT(_restf22):
+-C_TEXT(_restfpr_22):	lfd	fp22,-80(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf23)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_23)
+-C_TEXT(_restf23):
+-C_TEXT(_restfpr_23):	lfd	fp23,-72(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf24)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_24)
+-C_TEXT(_restf24):
+-C_TEXT(_restfpr_24):	lfd	fp24,-64(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf25)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_25)
+-C_TEXT(_restf25):
+-C_TEXT(_restfpr_25):	lfd	fp25,-56(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf26)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_26)
+-C_TEXT(_restf26):
+-C_TEXT(_restfpr_26):	lfd	fp26,-48(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf27)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_27)
+-C_TEXT(_restf27):
+-C_TEXT(_restfpr_27):	lfd	fp27,-40(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf28)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_28)
+-C_TEXT(_restf28):
+-C_TEXT(_restfpr_28):	lfd	fp28,-32(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf29)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_29)
+-C_TEXT(_restf29):
+-C_TEXT(_restfpr_29):	lwz	r0,8(r1)	#get return address from frame
+-			lfd	fp29,-24(r1)    #restore f29
+-			mtlr	r0		#move return address to LR
+-			lfd	fp30,-16(r1)	#restore f30
+-			lfd	fp31,-8(r1)	#restore f31
+-			blr			#return
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fprsave.S glibc-2.2.5/sysdeps/powerpc/fprsave.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fprsave.S	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/fprsave.S	Wed Dec 31 16:00:00 1969
+@@ -1,93 +0,0 @@
+-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-/*
+-    Floating Point Registers (FPRs) save routine
+-*/
+-
+-#include <sysdep.h>
+-
+-ENTRY(_savefpr_all)
+-                ASM_GLOBAL_DIRECTIVE C_TEXT(_savef14)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_14)
+-C_TEXT(_savef14):
+-C_TEXT(_savefpr_14):	stfd	fp14,-144(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef15)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_15)
+-C_TEXT(_savef15):
+-C_TEXT(_savefpr_15):	stfd	fp15,-136(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef16)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_16)
+-C_TEXT(_savef16):
+-C_TEXT(_savefpr_16):	stfd	fp16,-128(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef17)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_17)
+-C_TEXT(_savef17):
+-C_TEXT(_savefpr_17):	stfd	fp17,-120(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef18)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_18)
+-C_TEXT(_savef18):
+-C_TEXT(_savefpr_18):	stfd	fp18,-112(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef19)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_19)
+-C_TEXT(_savef19):
+-C_TEXT(_savefpr_19):	stfd	fp19,-104(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef20)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_20)
+-C_TEXT(_savef20):
+-C_TEXT(_savefpr_20):	stfd	fp20,-96(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef21)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_21)
+-C_TEXT(_savef21):
+-C_TEXT(_savefpr_21):	stfd	fp21,-88(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef22)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_22)
+-C_TEXT(_savef22):
+-C_TEXT(_savefpr_22):	stfd	fp22,-80(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef23)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_23)
+-C_TEXT(_savef23):
+-C_TEXT(_savefpr_23):	stfd	fp23,-72(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef24)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_24)
+-C_TEXT(_savef24):
+-C_TEXT(_savefpr_24):	stfd	fp24,-64(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef25)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_25)
+-C_TEXT(_savef25):
+-C_TEXT(_savefpr_25):	stfd	fp25,-56(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef26)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_26)
+-C_TEXT(_savef26):
+-C_TEXT(_savefpr_26):	stfd	fp26,-48(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef27)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_27)
+-C_TEXT(_savef27):
+-C_TEXT(_savefpr_27):	stfd	fp27,-40(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef28)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_28)
+-C_TEXT(_savef28):
+-C_TEXT(_savefpr_28):	stfd	fp28,-32(r1)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef29)
+-		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_29)
+-C_TEXT(_savef29):
+-C_TEXT(_savefpr_29):	stfd	fp29,-24(r1)	#save f29
+-			stfd	fp30,-16(r1)	#save f30
+-			stfd	fp31,-8(r1)	#save f31
+-			stw	r0,8(r1)	#save LR in callers frame
+-			blr			#return
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Dist glibc-2.2.5/sysdeps/powerpc/fpu/Dist
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Dist	Wed Jan 26 17:48:02 2000
++++ glibc-2.2.5/sysdeps/powerpc/fpu/Dist	Thu Jul 10 11:43:17 2003
+@@ -1,3 +1,6 @@
++fe_nomask.c
++fprrest.S
++fprsave.S
+ fenv_const.c
+ fenv_libc.h
+ t_sqrt.c
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Makefile glibc-2.2.5/sysdeps/powerpc/fpu/Makefile
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Makefile	Mon Oct 11 15:29:00 1999
++++ glibc-2.2.5/sysdeps/powerpc/fpu/Makefile	Thu Jul 10 11:43:17 2003
+@@ -1,3 +1,7 @@
+ ifeq ($(subdir),math)
+ libm-support += fenv_const fe_nomask t_sqrt
+ endif
++
++ifeq ($(subdir),misc)
++sysdep_routines += fprsave fprrest
++endif
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Versions glibc-2.2.5/sysdeps/powerpc/fpu/Versions
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Versions	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/Versions	Thu Jul 10 11:43:17 2003
+@@ -0,0 +1,6 @@
++libm {
++  GLIBC_2.1 {
++    # symbols used in macros from sysdeps/powerpc/bits/fenv.h
++    __fe_dfl_env; __fe_enabled_env; __fe_nonieee_env; __fe_nomask_env;
++  }
++}
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/__longjmp.S glibc-2.2.5/sysdeps/powerpc/fpu/__longjmp.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/__longjmp.S	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/__longjmp.S	Thu Jul 10 11:43:17 2003
+@@ -0,0 +1,74 @@
++/* longjmp for PowerPC.
++   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <sysdep.h>
++#define _ASM
++#define _SETJMP_H
++#include <bits/setjmp.h>
++#include <bp-sym.h>
++#include <bp-asm.h>
++
++ENTRY (BP_SYM (__longjmp))
++	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
++
++	lwz r1,(JB_GPR1*4)(r3)
++	lwz r2,(JB_GPR2*4)(r3)
++	lwz r0,(JB_LR*4)(r3)
++	lwz r14,((JB_GPRS+0)*4)(r3)
++	lfd fp14,((JB_FPRS+0*2)*4)(r3)
++	lwz r15,((JB_GPRS+1)*4)(r3)
++	lfd fp15,((JB_FPRS+1*2)*4)(r3)
++	lwz r16,((JB_GPRS+2)*4)(r3)
++	lfd fp16,((JB_FPRS+2*2)*4)(r3)
++	lwz r17,((JB_GPRS+3)*4)(r3)
++	lfd fp17,((JB_FPRS+3*2)*4)(r3)
++	lwz r18,((JB_GPRS+4)*4)(r3)
++	lfd fp18,((JB_FPRS+4*2)*4)(r3)
++	lwz r19,((JB_GPRS+5)*4)(r3)
++	lfd fp19,((JB_FPRS+5*2)*4)(r3)
++	lwz r20,((JB_GPRS+6)*4)(r3)
++	lfd fp20,((JB_FPRS+6*2)*4)(r3)
++	mtlr r0
++	lwz r21,((JB_GPRS+7)*4)(r3)
++	lfd fp21,((JB_FPRS+7*2)*4)(r3)
++	lwz r22,((JB_GPRS+8)*4)(r3)
++	lfd fp22,((JB_FPRS+8*2)*4)(r3)
++	lwz r0,(JB_CR*4)(r3)
++	lwz r23,((JB_GPRS+9)*4)(r3)
++	lfd fp23,((JB_FPRS+9*2)*4)(r3)
++	lwz r24,((JB_GPRS+10)*4)(r3)
++	lfd fp24,((JB_FPRS+10*2)*4)(r3)
++	lwz r25,((JB_GPRS+11)*4)(r3)
++	lfd fp25,((JB_FPRS+11*2)*4)(r3)
++	mtcrf 0xFF,r0
++	lwz r26,((JB_GPRS+12)*4)(r3)
++	lfd fp26,((JB_FPRS+12*2)*4)(r3)
++	lwz r27,((JB_GPRS+13)*4)(r3)
++	lfd fp27,((JB_FPRS+13*2)*4)(r3)
++	lwz r28,((JB_GPRS+14)*4)(r3)
++	lfd fp28,((JB_FPRS+14*2)*4)(r3)
++	lwz r29,((JB_GPRS+15)*4)(r3)
++	lfd fp29,((JB_FPRS+15*2)*4)(r3)
++	lwz r30,((JB_GPRS+16)*4)(r3)
++	lfd fp30,((JB_FPRS+16*2)*4)(r3)
++	lwz r31,((JB_GPRS+17)*4)(r3)
++	lfd fp31,((JB_FPRS+17*2)*4)(r3)
++	mr r3,r4
++	blr
++END (BP_SYM (__longjmp))
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/bits/setjmp.h glibc-2.2.5/sysdeps/powerpc/fpu/bits/setjmp.h
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/bits/setjmp.h	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/bits/setjmp.h	Thu Jul 10 11:43:17 2003
+@@ -0,0 +1,47 @@
++/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++/* Define the machine-dependent type `jmp_buf'.  PowerPC version.  */
++
++#ifndef _SETJMP_H
++# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
++#endif
++
++/* The previous bits/setjmp.h had __jmp_buf defined as a structure.
++   We use an array of 'long int' instead, to make writing the
++   assembler easier. Naturally, user code should not depend on
++   either representation. */
++
++#if defined __USE_MISC || defined _ASM
++# define JB_GPR1   0  /* Also known as the stack pointer */
++# define JB_GPR2   1
++# define JB_LR     2  /* The address we will return to */
++# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
++# define JB_CR     21 /* Condition code registers. */
++# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
++# define JB_SIZE   (58*4)
++#endif
++
++#ifndef	_ASM
++typedef long int __jmp_buf[58];
++#endif
++
++/* Test if longjmp to JMPBUF would unwind the frame
++   containing a local variable at ADDRESS.  */
++#define _JMPBUF_UNWINDS(jmpbuf, address) \
++  ((void *) (address) < (void *) (jmpbuf)[JB_GPR1])
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fclrexcpt.c glibc-2.2.5/sysdeps/powerpc/fpu/fclrexcpt.c
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fclrexcpt.c	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/fclrexcpt.c	Thu Jul  5 21:56:01 2001
+@@ -0,0 +1,48 @@
++/* Clear given exceptions in current floating-point environment.
++   Copyright (C) 1997,99,2000,01 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <fenv_libc.h>
++
++#undef feclearexcept
++int
++__feclearexcept (int excepts)
++{
++  fenv_union_t u;
++
++  /* Get the current state.  */
++  u.fenv = fegetenv_register ();
++
++  /* Clear the relevant bits.  */
++  u.l[1] = u.l[1] & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID)
++		      | (excepts & FPSCR_STICKY_BITS));
++
++  /* Put the new state in effect.  */
++  fesetenv_register (u.fenv);
++
++  /* Success.  */
++  return 0;
++}
++
++#include <shlib-compat.h>
++#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
++strong_alias (__feclearexcept, __old_feclearexcept)
++compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1);
++#endif
++
++versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fe_nomask.c glibc-2.2.5/sysdeps/powerpc/fpu/fe_nomask.c
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fe_nomask.c	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/fe_nomask.c	Thu Jul  5 21:56:01 2001
+@@ -0,0 +1,32 @@
++/* Procedure definition for FE_NOMASK_ENV.
++   Copyright (C) 1997 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <fenv.h>
++#include <errno.h>
++
++/* This is presently a stub, until it's decided how the kernels should
++   support this.  */
++
++const fenv_t *
++__fe_nomask_env(void)
++{
++  __set_errno (ENOSYS);
++  return FE_ENABLED_ENV;
++}
++stub_warning (__fe_nomask_env)
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fprrest.S glibc-2.2.5/sysdeps/powerpc/fpu/fprrest.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fprrest.S	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/fprrest.S	Thu Jul  5 21:56:01 2001
+@@ -0,0 +1,94 @@
++/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++/*
++    Floating Point Registers (FPRs) restore routine
++*/
++
++#include <sysdep.h>
++
++ENTRY(_restfpr_all)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf14)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_14)
++C_TEXT(_restf14):
++C_TEXT(_restfpr_14):	lfd	fp14,-144(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf15)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_15)
++C_TEXT(_restf15):
++C_TEXT(_restfpr_15):	lfd	fp15,-136(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf16)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_16)
++C_TEXT(_restf16):
++C_TEXT(_restfpr_16):	lfd	fp16,-128(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf17)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_17)
++C_TEXT(_restf17):
++C_TEXT(_restfpr_17):	lfd	fp17,-120(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf18)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_18)
++C_TEXT(_restf18):
++C_TEXT(_restfpr_18):	lfd	fp18,-112(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf19)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_19)
++C_TEXT(_restf19):
++C_TEXT(_restfpr_19):	lfd	fp19,-104(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf20)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_20)
++C_TEXT(_restf20):
++C_TEXT(_restfpr_20):	lfd	fp20,-96(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf21)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_21)
++C_TEXT(_restf21):
++C_TEXT(_restfpr_21):	lfd	fp21,-88(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf22)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_22)
++C_TEXT(_restf22):
++C_TEXT(_restfpr_22):	lfd	fp22,-80(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf23)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_23)
++C_TEXT(_restf23):
++C_TEXT(_restfpr_23):	lfd	fp23,-72(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf24)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_24)
++C_TEXT(_restf24):
++C_TEXT(_restfpr_24):	lfd	fp24,-64(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf25)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_25)
++C_TEXT(_restf25):
++C_TEXT(_restfpr_25):	lfd	fp25,-56(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf26)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_26)
++C_TEXT(_restf26):
++C_TEXT(_restfpr_26):	lfd	fp26,-48(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf27)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_27)
++C_TEXT(_restf27):
++C_TEXT(_restfpr_27):	lfd	fp27,-40(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf28)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_28)
++C_TEXT(_restf28):
++C_TEXT(_restfpr_28):	lfd	fp28,-32(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restf29)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_29)
++C_TEXT(_restf29):
++C_TEXT(_restfpr_29):	lwz	r0,8(r1)	#get return address from frame
++			lfd	fp29,-24(r1)    #restore f29
++			mtlr	r0		#move return address to LR
++			lfd	fp30,-16(r1)	#restore f30
++			lfd	fp31,-8(r1)	#restore f31
++			blr			#return
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fprsave.S glibc-2.2.5/sysdeps/powerpc/fpu/fprsave.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fprsave.S	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/fprsave.S	Thu Jul  5 21:56:01 2001
+@@ -0,0 +1,93 @@
++/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++/*
++    Floating Point Registers (FPRs) save routine
++*/
++
++#include <sysdep.h>
++
++ENTRY(_savefpr_all)
++                ASM_GLOBAL_DIRECTIVE C_TEXT(_savef14)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_14)
++C_TEXT(_savef14):
++C_TEXT(_savefpr_14):	stfd	fp14,-144(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef15)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_15)
++C_TEXT(_savef15):
++C_TEXT(_savefpr_15):	stfd	fp15,-136(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef16)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_16)
++C_TEXT(_savef16):
++C_TEXT(_savefpr_16):	stfd	fp16,-128(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef17)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_17)
++C_TEXT(_savef17):
++C_TEXT(_savefpr_17):	stfd	fp17,-120(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef18)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_18)
++C_TEXT(_savef18):
++C_TEXT(_savefpr_18):	stfd	fp18,-112(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef19)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_19)
++C_TEXT(_savef19):
++C_TEXT(_savefpr_19):	stfd	fp19,-104(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef20)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_20)
++C_TEXT(_savef20):
++C_TEXT(_savefpr_20):	stfd	fp20,-96(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef21)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_21)
++C_TEXT(_savef21):
++C_TEXT(_savefpr_21):	stfd	fp21,-88(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef22)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_22)
++C_TEXT(_savef22):
++C_TEXT(_savefpr_22):	stfd	fp22,-80(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef23)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_23)
++C_TEXT(_savef23):
++C_TEXT(_savefpr_23):	stfd	fp23,-72(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef24)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_24)
++C_TEXT(_savef24):
++C_TEXT(_savefpr_24):	stfd	fp24,-64(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef25)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_25)
++C_TEXT(_savef25):
++C_TEXT(_savefpr_25):	stfd	fp25,-56(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef26)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_26)
++C_TEXT(_savef26):
++C_TEXT(_savefpr_26):	stfd	fp26,-48(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef27)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_27)
++C_TEXT(_savef27):
++C_TEXT(_savefpr_27):	stfd	fp27,-40(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef28)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_28)
++C_TEXT(_savef28):
++C_TEXT(_savefpr_28):	stfd	fp28,-32(r1)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savef29)
++		ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_29)
++C_TEXT(_savef29):
++C_TEXT(_savefpr_29):	stfd	fp29,-24(r1)	#save f29
++			stfd	fp30,-16(r1)	#save f30
++			stfd	fp31,-8(r1)	#save f31
++			stw	r0,8(r1)	#save LR in callers frame
++			blr			#return
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fpu_control.h glibc-2.2.5/sysdeps/powerpc/fpu/fpu_control.h
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fpu_control.h	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/fpu_control.h	Thu Jul  5 21:56:01 2001
+@@ -0,0 +1,67 @@
++/* FPU control word definitions.  PowerPC version.
++   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#ifndef _FPU_CONTROL_H
++#define _FPU_CONTROL_H
++
++/* rounding control */
++#define _FPU_RC_NEAREST 0x00   /* RECOMMENDED */
++#define _FPU_RC_DOWN    0x03
++#define _FPU_RC_UP      0x02
++#define _FPU_RC_ZERO    0x01
++
++#define _FPU_MASK_NI  0x04 /* non-ieee mode */
++
++/* masking of interrupts */
++#define _FPU_MASK_ZM  0x10 /* zero divide */
++#define _FPU_MASK_OM  0x40 /* overflow */
++#define _FPU_MASK_UM  0x20 /* underflow */
++#define _FPU_MASK_XM  0x08 /* inexact */
++#define _FPU_MASK_IM  0x80 /* invalid operation */
++
++#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
++
++/* The fdlibm code requires no interrupts for exceptions.  */
++#define _FPU_DEFAULT  0x00000000 /* Default value.  */
++
++/* IEEE:  same as above, but (some) exceptions;
++   we leave the 'inexact' exception off.
++ */
++#define _FPU_IEEE     0x000000f0
++
++/* Type of the control word.  */
++typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
++
++/* Macros for accessing the hardware control word.  */
++#define _FPU_GETCW(cw) ( { \
++  union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \
++  __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \
++  (cw)=tmp.cw[1]; \
++  tmp.cw[1]; } )
++#define _FPU_SETCW(cw) { \
++  union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \
++  tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
++  tmp.cw[1] = cw; \
++  __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \
++}
++
++/* Default control word set at startup.  */
++extern fpu_control_t __fpu_control;
++
++#endif /* _FPU_CONTROL_H */
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/setjmp.S glibc-2.2.5/sysdeps/powerpc/fpu/setjmp.S
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu/setjmp.S	Wed Dec 31 16:00:00 1969
++++ glibc-2.2.5/sysdeps/powerpc/fpu/setjmp.S	Thu Jul 10 11:43:44 2003
+@@ -0,0 +1,73 @@
++/* setjmp for PowerPC.
++   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public License as
++   published by the Free Software Foundation; either version 2 of the
++   License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public
++   License along with the GNU C Library; see the file COPYING.LIB.  If not,
++   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
++
++#include <sysdep.h>
++#define _ASM
++#define _SETJMP_H
++#include <bits/setjmp.h>
++#include <bp-sym.h>
++#include <bp-asm.h>
++
++ENTRY (BP_SYM (__sigsetjmp))
++	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
++
++	stw  r1,(JB_GPR1*4)(3)
++	mflr r0
++	stw  r2,(JB_GPR2*4)(3)
++	stw  r14,((JB_GPRS+0)*4)(3)
++	stfd fp14,((JB_FPRS+0*2)*4)(3)
++	stw  r0,(JB_LR*4)(3)
++	stw  r15,((JB_GPRS+1)*4)(3)
++	stfd fp15,((JB_FPRS+1*2)*4)(3)
++	mfcr r0
++	stw  r16,((JB_GPRS+2)*4)(3)
++	stfd fp16,((JB_FPRS+2*2)*4)(3)
++	stw  r0,(JB_CR*4)(3)
++	stw  r17,((JB_GPRS+3)*4)(3)
++	stfd fp17,((JB_FPRS+3*2)*4)(3)
++	stw  r18,((JB_GPRS+4)*4)(3)
++	stfd fp18,((JB_FPRS+4*2)*4)(3)
++	stw  r19,((JB_GPRS+5)*4)(3)
++	stfd fp19,((JB_FPRS+5*2)*4)(3)
++	stw  r20,((JB_GPRS+6)*4)(3)
++	stfd fp20,((JB_FPRS+6*2)*4)(3)
++	stw  r21,((JB_GPRS+7)*4)(3)
++	stfd fp21,((JB_FPRS+7*2)*4)(3)
++	stw  r22,((JB_GPRS+8)*4)(3)
++	stfd fp22,((JB_FPRS+8*2)*4)(3)
++	stw  r23,((JB_GPRS+9)*4)(3)
++	stfd fp23,((JB_FPRS+9*2)*4)(3)
++	stw  r24,((JB_GPRS+10)*4)(3)
++	stfd fp24,((JB_FPRS+10*2)*4)(3)
++	stw  r25,((JB_GPRS+11)*4)(3)
++	stfd fp25,((JB_FPRS+11*2)*4)(3)
++	stw  r26,((JB_GPRS+12)*4)(3)
++	stfd fp26,((JB_FPRS+12*2)*4)(3)
++	stw  r27,((JB_GPRS+13)*4)(3)
++	stfd fp27,((JB_FPRS+13*2)*4)(3)
++	stw  r28,((JB_GPRS+14)*4)(3)
++	stfd fp28,((JB_FPRS+14*2)*4)(3)
++	stw  r29,((JB_GPRS+15)*4)(3)
++	stfd fp29,((JB_FPRS+15*2)*4)(3)
++	stw  r30,((JB_GPRS+16)*4)(3)
++	stfd fp30,((JB_FPRS+16*2)*4)(3)
++	stw  r31,((JB_GPRS+17)*4)(3)
++	stfd fp31,((JB_FPRS+17*2)*4)(3)
++	b JUMPTARGET (BP_SYM (__sigjmp_save))
++END (BP_SYM (__sigsetjmp))
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu_control.h glibc-2.2.5/sysdeps/powerpc/fpu_control.h
+--- glibc-2.2.5.old/sysdeps/powerpc/fpu_control.h	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/fpu_control.h	Wed Dec 31 16:00:00 1969
+@@ -1,67 +0,0 @@
+-/* FPU control word definitions.  PowerPC version.
+-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _FPU_CONTROL_H
+-#define _FPU_CONTROL_H
+-
+-/* rounding control */
+-#define _FPU_RC_NEAREST 0x00   /* RECOMMENDED */
+-#define _FPU_RC_DOWN    0x03
+-#define _FPU_RC_UP      0x02
+-#define _FPU_RC_ZERO    0x01
+-
+-#define _FPU_MASK_NI  0x04 /* non-ieee mode */
+-
+-/* masking of interrupts */
+-#define _FPU_MASK_ZM  0x10 /* zero divide */
+-#define _FPU_MASK_OM  0x40 /* overflow */
+-#define _FPU_MASK_UM  0x20 /* underflow */
+-#define _FPU_MASK_XM  0x08 /* inexact */
+-#define _FPU_MASK_IM  0x80 /* invalid operation */
+-
+-#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
+-
+-/* The fdlibm code requires no interrupts for exceptions.  */
+-#define _FPU_DEFAULT  0x00000000 /* Default value.  */
+-
+-/* IEEE:  same as above, but (some) exceptions;
+-   we leave the 'inexact' exception off.
+- */
+-#define _FPU_IEEE     0x000000f0
+-
+-/* Type of the control word.  */
+-typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
+-
+-/* Macros for accessing the hardware control word.  */
+-#define _FPU_GETCW(cw) ( { \
+-  union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \
+-  __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \
+-  (cw)=tmp.cw[1]; \
+-  tmp.cw[1]; } )
+-#define _FPU_SETCW(cw) { \
+-  union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \
+-  tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
+-  tmp.cw[1] = cw; \
+-  __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \
+-}
+-
+-/* Default control word set at startup.  */
+-extern fpu_control_t __fpu_control;
+-
+-#endif /* _FPU_CONTROL_H */
+diff -Naur glibc-2.2.5.old/sysdeps/powerpc/setjmp.S glibc-2.2.5/sysdeps/powerpc/setjmp.S
+--- glibc-2.2.5.old/sysdeps/powerpc/setjmp.S	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/setjmp.S	Thu Jul 10 11:43:44 2003
+@@ -24,6 +24,8 @@
+ #include <bp-sym.h>
+ #include <bp-asm.h>
+ 
++/* The FPU stores have been removed from this file - see fpu/setjmp.S */
++
+ ENTRY (BP_SYM (__sigsetjmp))
+ 	CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
+ 
+@@ -31,43 +33,25 @@
+ 	mflr r0
+ 	stw  r2,(JB_GPR2*4)(3)
+ 	stw  r14,((JB_GPRS+0)*4)(3)
+-	stfd fp14,((JB_FPRS+0*2)*4)(3)
+ 	stw  r0,(JB_LR*4)(3)
+ 	stw  r15,((JB_GPRS+1)*4)(3)
+-	stfd fp15,((JB_FPRS+1*2)*4)(3)
+ 	mfcr r0
+ 	stw  r16,((JB_GPRS+2)*4)(3)
+-	stfd fp16,((JB_FPRS+2*2)*4)(3)
+ 	stw  r0,(JB_CR*4)(3)
+ 	stw  r17,((JB_GPRS+3)*4)(3)
+-	stfd fp17,((JB_FPRS+3*2)*4)(3)
+ 	stw  r18,((JB_GPRS+4)*4)(3)
+-	stfd fp18,((JB_FPRS+4*2)*4)(3)
+ 	stw  r19,((JB_GPRS+5)*4)(3)
+-	stfd fp19,((JB_FPRS+5*2)*4)(3)
+ 	stw  r20,((JB_GPRS+6)*4)(3)
+-	stfd fp20,((JB_FPRS+6*2)*4)(3)
+ 	stw  r21,((JB_GPRS+7)*4)(3)
+-	stfd fp21,((JB_FPRS+7*2)*4)(3)
+ 	stw  r22,((JB_GPRS+8)*4)(3)
+-	stfd fp22,((JB_FPRS+8*2)*4)(3)
+ 	stw  r23,((JB_GPRS+9)*4)(3)
+-	stfd fp23,((JB_FPRS+9*2)*4)(3)
+ 	stw  r24,((JB_GPRS+10)*4)(3)
+-	stfd fp24,((JB_FPRS+10*2)*4)(3)
+ 	stw  r25,((JB_GPRS+11)*4)(3)
+-	stfd fp25,((JB_FPRS+11*2)*4)(3)
+ 	stw  r26,((JB_GPRS+12)*4)(3)
+-	stfd fp26,((JB_FPRS+12*2)*4)(3)
+ 	stw  r27,((JB_GPRS+13)*4)(3)
+-	stfd fp27,((JB_FPRS+13*2)*4)(3)
+ 	stw  r28,((JB_GPRS+14)*4)(3)
+-	stfd fp28,((JB_FPRS+14*2)*4)(3)
+ 	stw  r29,((JB_GPRS+15)*4)(3)
+-	stfd fp29,((JB_FPRS+15*2)*4)(3)
+ 	stw  r30,((JB_GPRS+16)*4)(3)
+-	stfd fp30,((JB_FPRS+16*2)*4)(3)
+ 	stw  r31,((JB_GPRS+17)*4)(3)
+-	stfd fp31,((JB_FPRS+17*2)*4)(3)
+ 	b JUMPTARGET (BP_SYM (__sigjmp_save))
+ END (BP_SYM (__sigsetjmp))
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch
new file mode 100644
index 00000000..761771f8
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch
@@ -0,0 +1,20 @@
+diff -urN glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h
+--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h	2001-07-06 06:56:16.000000000 +0200
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h	2004-09-03 12:35:44.000000000 +0200
+@@ -36,6 +36,16 @@
+ #undef L
+ #define L(name)	.L##name
+ 
++/* This is a kludge to make syscalls.list find these under the names
++ *    pread and pwrite, since some kernel headers define those names
++ *       and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ #ifdef __ASSEMBLER__
+ 
+ /* Linux uses a negative return value to indicate syscall errors,
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch b/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch
new file mode 100644
index 00000000..eefc6fa7
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch
@@ -0,0 +1,32 @@
+Copied from similar patch for other architectures.
+
+Should fix this error:
+../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread':
+../sysdeps/unix/sysv/linux/pread.c:53: `__NR_pread' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/pread.c:53: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/pread.c:53: for each function it appears in.)
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/build-glibc/posix/pread.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h.old	2004-10-05 08:37:37.000000000 -0700
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h	2004-10-05 08:38:22.000000000 -0700
+@@ -32,6 +32,16 @@
+ # define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ #ifdef __ASSEMBLER__
+ 
+ /* Linux uses a negative return value to indicate syscall errors, unlike
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch
new file mode 100644
index 00000000..a8267e61
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch
@@ -0,0 +1,86 @@
+From http://www.ltc.com/~brad/mips/glibc-2.2.5-mips-build-gmon.diff
+See http://www.ltc.com/~brad/mips/mips-cross-toolchain.html
+
+--- glibc-2.2.5/sysdeps/mips/machine-gmon.h	2001-08-13 04:42:44.000000000 -0400
++++ glibc-2.2.5/sysdeps/mips/machine-gmon.h	2002-09-25 17:10:59.000000000 -0400
+@@ -17,42 +17,52 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
+-#define _MCOUNT_DECL static void __mcount
++#define _MCOUNT_DECL(frompc,selfpc) \
++static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
+ 
+ /* Call __mcount with our the return PC for our caller,
+    and the return PC our caller will return to.  */
+ #ifdef __PIC__
+ #define CPLOAD ".cpload $25;"
++#define CPRESTORE ".cprestore 44\n\t"
+ #else
+ #define CPLOAD
++#define CPRESTORE
+ #endif
+ 
+ #define MCOUNT asm(\
+-	".globl _mcount;" \
+-	".align 2;" \
+-	".type _mcount,@function;" \
+-        "_mcount:;" \
+-        ".set noreorder;" \
+-        ".set noat;" \
++	".globl _mcount;\n\t" \
++	".align 2;\n\t" \
++	".type _mcount,@function;\n\t" \
++	".ent _mcount\n\t" \
++        "_mcount:\n\t" \
++        ".frame $sp,44,$31\n\t" \
++        ".set noreorder;\n\t" \
++        ".set noat;\n\t" \
+         CPLOAD \
+-        "sw $4,8($29);" \
+-        "sw $5,12($29);" \
+-        "sw $6,16($29);" \
+-        "sw $7,20($29);" \
+-        "sw $1,0($29);" \
+-        "sw $31,4($29);" \
+-        "move $5,$31;" \
+-        "move $4,$1;" \
+-        "jal __mcount;" \
+-	"nop;" \
+-        "lw $4,8($29);" \
+-        "lw $5,12($29);" \
+-        "lw $6,16($29);" \
+-        "lw $7,20($29);" \
+-        "lw $31,4($29);" \
+-        "lw $1,0($29);" \
+-        "addu $29,$29,8;" \
+-        "j $31;" \
+-        "move $31,$1;" \
+-        ".set reorder;" \
+-        ".set at");
++	"subu $29,$29,48;\n\t" \
++	CPRESTORE \
++        "sw $4,24($29);\n\t" \
++        "sw $5,28($29);\n\t" \
++        "sw $6,32($29);\n\t" \
++        "sw $7,36($29);\n\t" \
++        "sw $2,40($29);\n\t" \
++        "sw $1,16($29);\n\t" \
++        "sw $31,20($29);\n\t" \
++        "move $5,$31;\n\t" \
++        "move $4,$1;\n\t" \
++        "jal __mcount;\n\t" \
++        "nop;\n\t" \
++        "lw $4,24($29);\n\t" \
++        "lw $5,28($29);\n\t" \
++        "lw $6,32($29);\n\t" \
++        "lw $7,36($29);\n\t" \
++        "lw $2,40($29);\n\t" \
++        "lw $31,20($29);\n\t" \
++        "lw $1,16($29);\n\t" \
++        "addu $29,$29,56;\n\t" \
++        "j $31;\n\t" \
++        "move $31,$1;\n\t" \
++        ".set reorder;\n\t" \
++        ".set at\n\t" \
++        ".end _mcount");
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch
new file mode 100644
index 00000000..66fee299
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch
@@ -0,0 +1,47 @@
+This is a workaround for
+
+mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c  -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio  -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h  -DPIC   -DASSEMBLER   -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o
+../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages:
+../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format
+make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1
+
+which was using h.j.lu's binutils-2.13.90.0.18.
+
+
+But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html
+which says
+"A newer version of binutils (CVS post 2003-03-12) fixes it without
+the need of changing perfectly legal code."
+So presumably this can be ditched sooner or later.
+
+From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff
+
+2003-03-13  Guido Guenther  <agx@sigxcpu.org>
+
+	* sysdeps/unix/sysv/linux/mips/clone.S: introduce and use local label
+	  .Lthread_start since current binutils don't allow branches to globally
+	  visible symbols.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v
+retrieving revision 1.10
+diff -u -r1.10 clone.S
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 01:04:51 -0000	1.10
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 19:04:39 -0000
+@@ -63,7 +63,7 @@
+ 	syscall
+ 
+ 	bnez		a3,error
+-	beqz		v0,__thread_start
++	beqz		v0,.Lthread_start
+ 
+ 	/* Successful return from the parent */
+ 	addiu		sp,32
+@@ -85,6 +85,7 @@
+    debug info.  */
+ 
+ ENTRY(__thread_start)
++.Lthread_start:
+ 	/* cp is already loaded.  */
+ 	.cprestore	16
+ 	/* The stackframe has been created on entry of clone().  */
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch
new file mode 100644
index 00000000..4276eee9
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch
@@ -0,0 +1,31 @@
+wget http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.55&r2=1.56&cvsroot=glibc
+
+Changelog: 
+    (__dl_runtime_resolve): Remove `const' from `got'.
+
+Fixes error
+
+dl-runtime.c: In function `__dl_runtime_resolve':
+dl-runtime.c:235: error: assignment of read-only location
+make[2]: *** [/home/dank/crosstool-0.28-rc32/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-runtime.o] Error 1
+
+when building mipsel-gcc-3.4.0-glibc-2.2.5
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v
+retrieving revision 1.55
+retrieving revision 1.56
+diff -u -r1.55 -r1.56
+--- libc/sysdeps/mips/dl-machine.h	2001/09/08 17:16:44	1.55
++++ libc/sysdeps/mips/dl-machine.h	2002/01/17 23:21:33	1.56
+@@ -276,8 +276,8 @@
+     = (const void *) D_PTR (l, l_info[DT_SYMTAB]);			      \
+   const char *strtab							      \
+     = (const void *) D_PTR (l, l_info[DT_STRTAB]);			      \
+-  const ElfW(Addr) *got							      \
+-    = (const ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]);		      \
++  ElfW(Addr) *got							      \
++    = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]);			      \
+   const ElfW(Word) local_gotno						      \
+     = (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;	      \
+   const ElfW(Word) gotsym						      \
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch
new file mode 100644
index 00000000..129cffad
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch
@@ -0,0 +1,43 @@
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.57&r2=1.58&cvsroot=glibc'
+
+ChangeLog:
+    (ELF_MACHINE_BEFORE_RTLD_RELOC): Don't use label at end of compound statement.
+
+Fixes error
+
+rtld.c: In function `_dl_start':
+rtld.c:183: error: label at end of compound statement
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc32/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/rtld.os] Error 1
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v
+retrieving revision 1.56
+retrieving revision 1.57
+diff -u -r1.56 -r1.57
+--- libc/sysdeps/mips/dl-machine.h	2002/01/17 23:21:33	1.56
++++ libc/sysdeps/mips/dl-machine.h	2002/01/29 02:58:00	1.57
+@@ -1,5 +1,5 @@
+ /* Machine-dependent ELF dynamic relocation inline functions.  MIPS version.
+-   Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
++   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>.
+ 
+@@ -132,7 +132,7 @@
+   got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]);			\
+ 									\
+   if (__builtin_expect (map->l_addr == 0, 1))				\
+-    goto done;								\
++    break;								\
+ 									\
+   /* got[0] is reserved. got[1] is also reserved for the dynamic object	\
+      generated by gnu ld. Skip these reserved entries from		\
+@@ -169,7 +169,6 @@
+       got++;								\
+       sym++;								\
+     }									\
+-done:									\
+ } while(0)
+ 
+ 
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch
new file mode 100644
index 00000000..ef174c26
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch
@@ -0,0 +1,35 @@
+Fixes error
+
+In file included from dynamic-link.h:21,
+                 from dl-load.c:32:
+../sysdeps/mips/dl-machine.h:454: error: parse error before "$29"
+../sysdeps/mips/dl-machine.h:454: warning: type defaults to `int' in declaration of `$29'
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: syntax error at '#' token
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: syntax error at '#' token
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: stray '\' in program
+../sysdeps/mips/dl-machine.h:454: error: missing terminating " character
+...
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc24/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/glibc-2.2.5/elf'
+
+See also http://sources.redhat.com/ml/crossgcc/2003-12/msg00014.html
+
+===================================================================
+diff -u -r1.58 -r1.59
+--- libc/sysdeps/mips/dl-machine.h	2002/02/01 01:31:55	1.58
++++ libc/sysdeps/mips/dl-machine.h	2002/02/03 00:29:15	1.59
+@@ -449,7 +449,7 @@
+ 	addu $7, $7, 4\n\
+ 	subu $29, 16\n\
+ 	# Call the function to run the initializers.\n\
+-	jal _dl_init
++	jal _dl_init\n\
+ 	addiu $29, 16\n\
+ 	# Pass our finalizer function to the user in $2 as per ELF ABI.\n\
+ 	la $2, _dl_fini\n\
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch
new file mode 100644
index 00000000..ea3e28c4
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch
@@ -0,0 +1,53 @@
+Message-ID: <20040926095115.9204.qmail@webmail-2-5.mesa1.secureserver.net>
+Date: Sun, 26 Sep 2004 02:51:15 -0700
+From: ml@bitbash.net
+Subject: RE: crosstool-0.28-rc36: ld.so.1 undefined reference
+To: Dan Kegel <dank@kegel.com>
+cc: crossgcc@sources.redhat.com
+
+gcc-3.4.0-glibc-2.2.5 barfs with a few undefined refereces and multiple
+definitions. The follwing patch seems to take care of the undefined
+reference of __dl_runtime_resolve symbol. 
+
+Filename: patches/glibc-2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch 
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Retrieved with
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.59&r2=1.60&cvsroot=glibc'
+See http://sources.redhat.com/ml/libc-alpha/2002-02/msg00091.html
+See also glibc-2.2.5-mips-build-gmon.patch, which takes care of the other part of this for mips.
+
+ChangeLog:
+        sysdeps/mips/dl-machine.h (elf_machine_matches_host): Use
+        __attribute_used__.
+        (__dl_runtime_resolve): Likewise.
+
+Fixes error
+
+/home/cross/crosstool-0.28-rc36/build/mips-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/ld.so.1:
+undefined reference to `__dl_runtime_resolve'
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v
+retrieving revision 1.59
+retrieving revision 1.60
+diff -u -r1.59 -r1.60
+--- libc/sysdeps/mips/dl-machine.h	2002/02/03 00:29:15	1.59
++++ libc/sysdeps/mips/dl-machine.h	2002/02/08 18:56:57	1.60
+@@ -69,7 +69,7 @@
+    } while (0)
+ 
+ /* Return nonzero iff ELF header is compatible with the running host.  */
+-static inline int __attribute__ ((unused))
++static inline int __attribute_used__
+ elf_machine_matches_host (const ElfW(Ehdr) *ehdr)
+ {
+   switch (ehdr->e_machine)
+@@ -262,7 +262,7 @@
+ /* This is called from assembly stubs below which the compiler can't see.  */ \
+ static ElfW(Addr)							      \
+ __dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr))	      \
+-		  __attribute__ ((unused));				      \
++		  __attribute_used__;					      \
+ 									      \
+ static ElfW(Addr)							      \
+ __dl_runtime_resolve (ElfW(Word) sym_index,				      \
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch b/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch
new file mode 100644
index 00000000..c070bd4c
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch
@@ -0,0 +1,29 @@
+Based on glibc-2.3.2/glibc-2.3.2-powerpc-as.patch
+
+Fixes the following errors when building glibc for ppc7450:
+
+/tmp/ccwlHdbl.s: Assembler messages:
+/tmp/ccwlHdbl.s:73: Error: Unrecognized opcode: `stvx'
+/tmp/ccwlHdbl.s:74: Error: Unrecognized opcode: `mfvrsave'
+/tmp/ccwlHdbl.s:300: Error: Unrecognized opcode: `lvx'
+/tmp/ccwlHdbl.s:302: Error: Unrecognized opcode: `mtvrsave'
+make[2]: *** [/usr/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libio/iopopen.o] Error 1
+make[2]: Leaving directory `/home/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/glibc-2.2.5/libio'
+make[1]: *** [libio/subdir_lib] Error 2
+make[1]: Leaving directory `/home/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil>
+
+===================================================================
+--- glibc-2.2.5/sysdeps/powerpc/Makefile~	2004-08-31 14:59:15.000000000 -0400
++++ glibc-2.2.5/sysdeps/powerpc/Makefile	2004-09-02 19:47:21.000000000 -0400
+@@ -1,7 +1,6 @@
+ # We always want to use the new mnemonic syntax even if we are on a RS6000
+ # machine.
+-+cflags += -mnew-mnemonics -Wa,-mppc -mpowerpc
+-asm-CPPFLAGS += -Wa,-mppc
+++cflags += -mnew-mnemonics
+ 
+ ifeq ($(subdir),gmon)
+ sysdep_routines += ppc-mcount
diff --git a/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch b/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch
new file mode 100644
index 00000000..2267f856
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch
@@ -0,0 +1,65 @@
+# see http://bugs.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&pr=4155
+# and http://www.kegel.com/xgcc3/ppc405erratum77.html
+# See also matching patch for linuxthreads
+
+diff -aur glibc-2.2.5.orig/sysdeps/powerpc/atomicity.h glibc-2.2.5/sysdeps/powerpc/atomicity.h
+--- glibc-2.2.5.orig/sysdeps/powerpc/atomicity.h	Thu Jul  5 21:56:01 2001
++++ glibc-2.2.5/sysdeps/powerpc/atomicity.h	Tue Jul 23 05:39:38 2002
+@@ -28,6 +28,17 @@
+ # define __ATOMICITY_INLINE inline
+ #endif
+ 
++#ifdef __PPC405__
++/* workaround for PPC405 erratum #77 - Mark Hatle, dank.  References:
++   http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++   http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++   http://www.kegel.com/xgcc3/ppc405erratum77.html
++   FIXME: using dbct instead of sync would be faster  */
++#define __LIBC_PPC405_ERR77_SYNC   "sync \n\t"
++#else
++#define __LIBC_PPC405_ERR77_SYNC
++#endif
++
+ static __ATOMICITY_INLINE int
+ __attribute__ ((unused))
+ exchange_and_add (volatile uint32_t *mem, int val)
+@@ -36,6 +47,7 @@
+   __asm__ ("\n\
+ 0:	lwarx	%0,0,%2	\n\
+ 	add%I3	%1,%0,%3	\n\
++	" __LIBC_PPC405_ERR77_SYNC "\n\
+ 	stwcx.	%1,0,%2	\n\
+ 	bne-	0b	\n\
+ " : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
+@@ -50,6 +62,7 @@
+   __asm__ ("\n\
+ 0:	lwarx	%0,0,%1	\n\
+ 	add%I2	%0,%0,%2	\n\
++	" __LIBC_PPC405_ERR77_SYNC "\n\
+ 	stwcx.	%0,0,%1	\n\
+ 	bne-	0b	\n\
+ " : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
+@@ -65,6 +78,7 @@
+ 	sub%I2c.	%0,%0,%2	\n\
+ 	cntlzw	%0,%0	\n\
+ 	bne-	1f	\n\
++	" __LIBC_PPC405_ERR77_SYNC "\n\
+ 	stwcx.	%3,0,%1	\n\
+ 	bne-	0b	\n\
+ 1:	\n\
+@@ -79,6 +93,7 @@
+   long int result;
+   __asm__ ("\n\
+ 0:	lwarx	%0,0,%1	\n\
++	" __LIBC_PPC405_ERR77_SYNC "\n\
+ 	stwcx.	%2,0,%1	\n\
+ 	bne-	0b	\n\
+ " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
+@@ -94,6 +109,7 @@
+ 0:	lwarx	%0,0,%1	\n\
+ 	cmpwi	%0,0	\n\
+ 	bne-	1f	\n\
++	" __LIBC_PPC405_ERR77_SYNC "\n\
+ 	stwcx.	%2,0,%1	\n\
+ 	bne-	0b	\n\
+ 1:	\n\
diff --git a/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch
new file mode 100644
index 00000000..4d811e9f
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch
@@ -0,0 +1,44 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc
+(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html
+and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html)
+
+Fixes errors
+
+rpc_cmsg.c: In function `xdr_callmsg':
+rpc_cmsg.c:70: error: invalid lvalue in increment
+rpc_cmsg.c:71: error: invalid lvalue in increment
+rpc_cmsg.c:74: error: invalid lvalue in increment
+rpc_cmsg.c:77: error: invalid lvalue in increment
+rpc_cmsg.c:78: error: invalid lvalue in increment
+rpc_cmsg.c:79: error: invalid lvalue in increment
+rpc_cmsg.c:81: error: invalid lvalue in increment
+rpc_cmsg.c:89: error: invalid lvalue in increment
+rpc_cmsg.c:106: error: invalid lvalue in increment
+rpc_cmsg.c:107: error: invalid lvalue in increment
+rpc_cmsg.c:112: error: invalid lvalue in increment
+rpc_cmsg.c:117: error: invalid lvalue in increment
+rpc_cmsg.c:118: error: invalid lvalue in increment
+rpc_cmsg.c:119: error: invalid lvalue in increment
+rpc_cmsg.c:121: error: invalid lvalue in increment
+rpc_cmsg.c:160: error: invalid lvalue in increment
+
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v
+retrieving revision 1.27
+retrieving revision 1.28
+diff -u -r1.27 -r1.28
+--- libc/sunrpc/rpc/xdr.h	2002/12/16 02:05:49	1.27
++++ libc/sunrpc/rpc/xdr.h	2004/03/22 10:52:33	1.28
+@@ -262,10 +262,8 @@
+  * and shouldn't be used any longer. Code which use this defines or longs
+  * in the RPC code will not work on 64bit Solaris platforms !
+  */
+-#define IXDR_GET_LONG(buf) \
+-	((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++))
+-#define IXDR_PUT_LONG(buf, v) \
+-	(*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v)))
++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf))
++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v)))
+ #define IXDR_GET_U_LONG(buf)	      ((u_long)IXDR_GET_LONG(buf))
+ #define IXDR_PUT_U_LONG(buf, v)	      IXDR_PUT_LONG(buf, (long)(v))
+ 
diff --git a/patches/glibc/2.2.5/glibc-drow-sh.patch b/patches/glibc/2.2.5/glibc-drow-sh.patch
new file mode 100644
index 00000000..82984e54
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-drow-sh.patch
@@ -0,0 +1,77 @@
+[pread changes deleted, since those seem to be specific to glibc-2.3.2]
+
+Date: Thu, 19 Jun 2003 20:02:07 -0400
+From: Daniel Jacobowitz <drow@false.org>
+Subject: [linux-sh:02808] Patch needed for CVS glibc on SH
+To: linux-sh@m17n.org, libc-alpha@sources.redhat.com
+Message-Id: <20030620000207.GA19907@nevyn.them.org>
+X-ML-Name: linux-sh
+X-Mail-Count: 02808
+X-MLServer: fml [fml 4.0.1]; post only (only members can post)
+X-ML-Info: If you have a question, send e-mail with the body
+	"help" (without quotes) to the address linux-sh-ctl@m17n.org;
+	help=<mailto:linux-sh-ctl@m17n.org?body=help>
+Mail-Followup-To: linux-sh@m17n.org, libc-alpha@sources.redhat.com
+Content-Disposition: inline
+User-Agent: Mutt/1.5.1i
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Precedence: bulk
+Lines: 74
+List-Software: fml [fml 4.0.1]
+List-Post: <mailto:linux-sh@m17n.org>
+List-Owner: <mailto:linux-sh-admin@m17n.org>
+List-Help: <mailto:linux-sh-ctl@m17n.org?body=help>
+List-Unsubscribe: <mailto:linux-sh-ctl@m17n.org?body=unsubscribe>
+List-Id: linux-sh.m17n.org
+
+I believe this flushes my current patches to make glibc work on SH.  Issues:
+ - MIPS pread functions have some wackiness in them for the MIPS calling
+   conventions, which align long longs to even register pairs; it appears
+   that SH does not do this.  This fixes pread64/pwrite64.
+ - st_ino is _NOT_ 64-bit in the latest SH kernel trees, or at least it
+   wasn't when I checked in April.  --enable-kernel=2.4.x breaks terribly
+   without this patch; the errors are along the lines of "version GLIBC_2.3
+   not found", because that's the first consequence of a messed up inode
+   field - ld.so compares by inodes at some point.
+
+-- 
+Daniel Jacobowitz
+MontaVista Software                         Debian GNU/Linux Developer
+
+2003-06-19  Daniel Jacobowitz  <drow@mvista.com>
+
+	* sysdeps/unix/sysv/linux/kernel-features.h: Update kernel features
+	for the SH architecture.
+	* sysdeps/unix/sysv/linux/sh/pread.c: Use generic Linux version
+	instead of the MIPS version.
+	* sysdeps/unix/sysv/linux/sh/pread64.c: Likewise.
+	* sysdeps/unix/sysv/linux/sh/pwrite.c: Likewise.
+	* sysdeps/unix/sysv/linux/sh/pwrite64.c: Likewise.
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h.org	2003-04-21 10:57:55.000000000 -0400
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h	2003-04-21 11:16:47.000000000 -0400
+@@ -151,11 +151,20 @@
+ 
+ /* The changed st_ino field appeared in 2.4.0-test6.  But we cannot
+    distinguish this version from other 2.4.0 releases.  Therefore play
+-   save and assume it available is for 2.4.1 and up.  */
+-#if __LINUX_KERNEL_VERSION >= 132097
++   save and assume it available is for 2.4.1 and up.  However, SH is lame,
++   and still does not have a 64-bit inode field.  */
++#if __LINUX_KERNEL_VERSION >= 132097 \
++    && !defined __sh__
+ # define __ASSUME_ST_INO_64_BIT		1
+ #endif
+ 
++/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test.  */
++#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__
++# define __ASSUME_TRUNCATE64_SYSCALL	1
++# define __ASSUME_MMAP2_SYSCALL		1
++# define __ASSUME_STAT64_SYSCALL	1
++#endif
++
+ /* To support locking of large files a new fcntl() syscall was introduced
+    in 2.4.0-test7.  We test for 2.4.1 for the earliest version we know
+    the syscall is available.  */
+
diff --git a/patches/glibc/2.2.5/glibc-test-lowram.patch b/patches/glibc/2.2.5/glibc-test-lowram.patch
new file mode 100644
index 00000000..2308629a
--- /dev/null
+++ b/patches/glibc/2.2.5/glibc-test-lowram.patch
@@ -0,0 +1,14 @@
+--- glibc-2.2.5/malloc/tst-calloc.c.old	Sun Aug  3 16:17:58 2003
++++ glibc-2.2.5/malloc/tst-calloc.c	Sun Aug  3 16:20:01 2003
+@@ -24,9 +24,8 @@
+ #include <stdio.h>
+ 
+ 
+-/* Number of samples per size.  */
+-#define N 50000
+-
++/* Number of samples per size.  This is also the maximum memory consumption in kilobytes. */
++#define N 8000
+ 
+ static void
+ fixed_test (int size)
diff --git a/patches/glibc/2.2.5/initfini-alpha.patch b/patches/glibc/2.2.5/initfini-alpha.patch
new file mode 100644
index 00000000..49c4e671
--- /dev/null
+++ b/patches/glibc/2.2.5/initfini-alpha.patch
@@ -0,0 +1,125 @@
+Trivial fix to allow compiling with gcc3.3.
+
+--- glibc-2.2.5/sysdeps/alpha/elf/initfini.c.old	Fri Jun  6 17:59:45 2003
++++ glibc-2.2.5/sysdeps/alpha/elf/initfini.c	Fri Jun  6 18:00:20 2003
+@@ -37,62 +37,62 @@
+    files, all of which may have different GP values.  So we must reload
+    the GP value from crti.o in crtn.o.  */
+ 
+-__asm__ ("
+-
+-#include \"defs.h\"
+-
+-/*@HEADER_ENDS*/
+-
+-/*@_init_PROLOG_BEGINS*/
+-	.section .init, \"ax\", @progbits
+-	.globl	_init
+-	.ent	_init
+-_init:
+-	ldgp	$29, 0($27)
+-	subq	$30, 16, $30
+-	lda	$27, __gmon_start__
+-	stq	$26, 0($30)
+-	stq	$29, 8($30)
+-	.prologue 1
+-	beq	$27, 1f
+-	jsr	$26, ($27), __gmon_start__
+-	ldq	$29, 8($30)
+-1:
+-	.align 3
+-	.end	_init
+-	.size	_init, 0
+-/*@_init_PROLOG_ENDS*/
+-
+-/*@_init_EPILOG_BEGINS*/
+-	.section .init, \"ax\", @progbits
+-	ldq	$26, 0($30)
+-	ldq	$29, 8($30)
+-	addq	$30, 16, $30
+-	ret
+-/*@_init_EPILOG_ENDS*/
+-
+-/*@_fini_PROLOG_BEGINS*/
+-	.section .fini, \"ax\", @progbits
+-	.globl	_fini
+-	.ent	_fini
+-_fini:
+-	ldgp	$29, 0($27)
+-	subq	$30, 16, $30
+-	stq	$26, 0($30)
+-	stq	$29, 8($30)
+-	.prologue 1
+-	.align 3
+-	.end	_fini
+-	.size	_fini, 0
+-/*@_fini_PROLOG_ENDS*/
+-
+-/*@_fini_EPILOG_BEGINS*/
+-	.section .fini, \"ax\", @progbits
+-	ldq	$26, 0($30)
+-	ldq	$29, 8($30)
+-	addq	$30, 16, $30
+-	ret
+-/*@_fini_EPILOG_ENDS*/
+-
+-/*@TRAILER_BEGINS*/
++__asm__ ("\n\
++\n\
++#include \"defs.h\"\n\
++\n\
++/*@HEADER_ENDS*/\n\
++\n\
++/*@_init_PROLOG_BEGINS*/\n\
++	.section .init, \"ax\", @progbits\n\
++	.globl	_init\n\
++	.ent	_init\n\
++_init:\n\
++	ldgp	$29, 0($27)\n\
++	subq	$30, 16, $30\n\
++	lda	$27, __gmon_start__\n\
++	stq	$26, 0($30)\n\
++	stq	$29, 8($30)\n\
++	.prologue 1\n\
++	beq	$27, 1f\n\
++	jsr	$26, ($27), __gmon_start__\n\
++	ldq	$29, 8($30)\n\
++1:\n\
++	.align 3\n\
++	.end	_init\n\
++	.size	_init, 0\n\
++/*@_init_PROLOG_ENDS*/\n\
++\n\
++/*@_init_EPILOG_BEGINS*/\n\
++	.section .init, \"ax\", @progbits\n\
++	ldq	$26, 0($30)\n\
++	ldq	$29, 8($30)\n\
++	addq	$30, 16, $30\n\
++	ret\n\
++/*@_init_EPILOG_ENDS*/\n\
++\n\
++/*@_fini_PROLOG_BEGINS*/\n\
++	.section .fini, \"ax\", @progbits\n\
++	.globl	_fini\n\
++	.ent	_fini\n\
++_fini:\n\
++	ldgp	$29, 0($27)\n\
++	subq	$30, 16, $30\n\
++	stq	$26, 0($30)\n\
++	stq	$29, 8($30)\n\
++	.prologue 1\n\
++	.align 3\n\
++	.end	_fini\n\
++	.size	_fini, 0\n\
++/*@_fini_PROLOG_ENDS*/\n\
++\n\
++/*@_fini_EPILOG_BEGINS*/\n\
++	.section .fini, \"ax\", @progbits\n\
++	ldq	$26, 0($30)\n\
++	ldq	$29, 8($30)\n\
++	addq	$30, 16, $30\n\
++	ret\n\
++/*@_fini_EPILOG_ENDS*/\n\
++\n\
++/*@TRAILER_BEGINS*/\n\
+ ");
diff --git a/patches/glibc/2.2.5/initfini-ia64.patch b/patches/glibc/2.2.5/initfini-ia64.patch
new file mode 100644
index 00000000..a55a55a0
--- /dev/null
+++ b/patches/glibc/2.2.5/initfini-ia64.patch
@@ -0,0 +1,219 @@
+Retrieved with
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/ia64/elf/initfini.c.diff?r1=1.2&r2=1.3&cvsroot=glibc'
+
+Revision 1.3, Sun Aug 25 00:34:23 2002 UTC (2 years, 1 month ago) by drepper
+Branch: MAIN
+CVS Tags: glibc-2-3-1, glibc-2-3
+Changes since 1.2: +78 -78 lines
+
+(__asm__): Don't use newlines embedded in string.
+
+Fixes error
+
+../sysdeps/ia64/elf/initfini.c:30:10: missing terminating " character
+../sysdeps/ia64/elf/initfini.c:32:10: #include expects "FILENAME" or <FILENAME>
+../sysdeps/ia64/elf/initfini.c:37: error: request for member `section' in something not a structure or union
+../sysdeps/ia64/elf/initfini.c:38: error: parse error before numeric constant
+../sysdeps/ia64/elf/initfini.c:39: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:40: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:46: error: syntax error at '@' token
+../sysdeps/ia64/elf/initfini.c:46: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:48: error: parse error before "r15"
+../sysdeps/ia64/elf/initfini.c:48: warning: type defaults to `int' in declaration of `r15'
+../sysdeps/ia64/elf/initfini.c:50: error: parse error before '.' token
+../sysdeps/ia64/elf/initfini.c:56: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:57: error: parse error before "r12"
+../sysdeps/ia64/elf/initfini.c:57: warning: type defaults to `int' in declaration of `r12'
+../sysdeps/ia64/elf/initfini.c:58: warning: type defaults to `int' in declaration of `r12'
+../sysdeps/ia64/elf/initfini.c:58: warning: data definition has no type or storage class
+../sysdeps/ia64/elf/initfini.c:59: error: parse error before "gp"
+../sysdeps/ia64/elf/initfini.c:59: warning: type defaults to `int' in declaration of `gp'
+../sysdeps/ia64/elf/initfini.c:63: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:74: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:80: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:81: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:89: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:92: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:96: error: parse error before '.' token
+../sysdeps/ia64/elf/initfini.c:101: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:106: error: syntax error at '#' token
+../sysdeps/ia64/elf/initfini.c:107:1: missing terminating " character
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/csu/initfini.s] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/glibc-2.2.5/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/glibc-2.2.5'
+make: *** [all] Error 2
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/ia64/elf/initfini.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/sysdeps/ia64/elf/initfini.c	2001/07/06 04:55:54	1.2
++++ libc/sysdeps/ia64/elf/initfini.c	2002/08/25 00:34:23	1.3
+@@ -1,5 +1,5 @@
+ /* Special .init and .fini section support for ia64.
+-   Copyright (C) 2000 Free Software Foundation, Inc.
++   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -27,81 +27,81 @@
+    * crtn.s puts the corresponding function epilogues
+    in the .init and .fini sections. */
+ 
+-__asm__ ("
+-
+-#include \"defs.h\"
+-
+-/*@HEADER_ENDS*/
+-
+-/*@_init_PROLOG_BEGINS*/
+-	.section .init
+-	.align 16
+-	.global _init#
+-	.proc _init#
+-_init:
+-	alloc r34 = ar.pfs, 0, 3, 0, 0
+-	mov r32 = r12
+-	mov r33 = b0
+-	adds r12 = -16, r12
+-	addl r14 = @ltoff(@fptr(__gmon_start__#)), gp
+-	;;
+-	ld8 r15 = [r14]
+-	;;
+-	cmp.eq p6, p7 = 0, r15
+-	(p6) br.cond.dptk .L5
+-
+-/* we could use r35 to save gp, but we use the stack since that's what
+- * all the other init routines will do --davidm 00/04/05 */
+-	st8 [r12] = gp, -16
+-	br.call.sptk.many b0 = __gmon_start__# ;;
+-	adds r12 = 16, r12
+-	;;
+-	ld8 gp = [r12]
+-	;;
+-.L5:
+-	.align 16
+-	.endp _init#
+-
+-/*@_init_PROLOG_ENDS*/
+-
+-/*@_init_EPILOG_BEGINS*/
+-	.section .init
+-	.regstk 0,2,0,0
+-	mov r12 = r32
+-	mov ar.pfs = r34
+-	mov b0 = r33
+-	br.ret.sptk.many b0
+-	.endp _init#
+-/*@_init_EPILOG_ENDS*/
+-
+-/*@_fini_PROLOG_BEGINS*/
+-	.section .fini
+-	.align 16
+-	.global _fini#
+-	.proc _fini#
+-_fini:
+-	alloc r34 = ar.pfs, 0, 3, 0, 0
+-	mov r32 = r12
+-	mov r33 = b0
+-	adds r12 = -16, r12
+-	;;
+-	.align 16
+-	.endp _fini#
+-
+-/*@_fini_PROLOG_ENDS*/
+-	br.call.sptk.many b0 = i_am_not_a_leaf# ;;
+-	;;
+-
+-/*@_fini_EPILOG_BEGINS*/
+-	.section .fini
+-	mov r12 = r32
+-	mov ar.pfs = r34
+-	mov b0 = r33
+-	br.ret.sptk.many b0
+-	.endp _fini#
+-
+-/*@_fini_EPILOG_ENDS*/
+-
+-/*@TRAILER_BEGINS*/
+-	.weak	__gmon_start__#
++__asm__ ("\n\
++\n\
++#include \"defs.h\"\n\
++\n\
++/*@HEADER_ENDS*/\n\
++\n\
++/*@_init_PROLOG_BEGINS*/\n\
++	.section .init\n\
++	.align 16\n\
++	.global _init#\n\
++	.proc _init#\n\
++_init:\n\
++	alloc r34 = ar.pfs, 0, 3, 0, 0\n\
++	mov r32 = r12\n\
++	mov r33 = b0\n\
++	adds r12 = -16, r12\n\
++	addl r14 = @ltoff(@fptr(__gmon_start__#)), gp\n\
++	;;\n\
++	ld8 r15 = [r14]\n\
++	;;\n\
++	cmp.eq p6, p7 = 0, r15\n\
++	(p6) br.cond.dptk .L5\n\
++\n\
++/* we could use r35 to save gp, but we use the stack since that's what\n\
++ * all the other init routines will do --davidm 00/04/05 */\n\
++	st8 [r12] = gp, -16\n\
++	br.call.sptk.many b0 = __gmon_start__# ;;\n\
++	adds r12 = 16, r12\n\
++	;;\n\
++	ld8 gp = [r12]\n\
++	;;\n\
++.L5:\n\
++	.align 16\n\
++	.endp _init#\n\
++\n\
++/*@_init_PROLOG_ENDS*/\n\
++\n\
++/*@_init_EPILOG_BEGINS*/\n\
++	.section .init\n\
++	.regstk 0,2,0,0\n\
++	mov r12 = r32\n\
++	mov ar.pfs = r34\n\
++	mov b0 = r33\n\
++	br.ret.sptk.many b0\n\
++	.endp _init#\n\
++/*@_init_EPILOG_ENDS*/\n\
++\n\
++/*@_fini_PROLOG_BEGINS*/\n\
++	.section .fini\n\
++	.align 16\n\
++	.global _fini#\n\
++	.proc _fini#\n\
++_fini:\n\
++	alloc r34 = ar.pfs, 0, 3, 0, 0\n\
++	mov r32 = r12\n\
++	mov r33 = b0\n\
++	adds r12 = -16, r12\n\
++	;;\n\
++	.align 16\n\
++	.endp _fini#\n\
++\n\
++/*@_fini_PROLOG_ENDS*/\n\
++	br.call.sptk.many b0 = i_am_not_a_leaf# ;;\n\
++	;;\n\
++\n\
++/*@_fini_EPILOG_BEGINS*/\n\
++	.section .fini\n\
++	mov r12 = r32\n\
++	mov ar.pfs = r34\n\
++	mov b0 = r33\n\
++	br.ret.sptk.many b0\n\
++	.endp _fini#\n\
++\n\
++/*@_fini_EPILOG_ENDS*/\n\
++\n\
++/*@TRAILER_BEGINS*/\n\
++	.weak	__gmon_start__#\n\
+ ");
diff --git a/patches/glibc/2.2.5/initfini-sh.patch b/patches/glibc/2.2.5/initfini-sh.patch
new file mode 100644
index 00000000..d1e0eaef
--- /dev/null
+++ b/patches/glibc/2.2.5/initfini-sh.patch
@@ -0,0 +1,243 @@
+--- glibc-2.2.5/sysdeps/sh/elf/initfini.c.orig	Thu Jul  5 21:56:03 2001
++++ glibc-2.2.5/sysdeps/sh/elf/initfini.c	Wed May 28 08:45:08 2003
+@@ -27,122 +27,122 @@
+    * crtn.s puts the corresponding function epilogues
+    in the .init and .fini sections. */
+ 
+-__asm__ ("
+-
+-#include \"defs.h\"
+-#define SHARED
+-
+-/*@HEADER_ENDS*/
+-
+-/*@TESTS_BEGIN*/
+-
+-/*@TESTS_END*/
+-
+-/*@_init_PROLOG_BEGINS*/
+-	.section .init
+-	.align 5
+-	.global	_init
+-	.type	_init,@function
+-_init:
+-	mov.l	r12,@-r15
+-	mov.l	r14,@-r15
+-	sts.l	pr,@-r15
+-#ifdef SHARED
+-	mova	.L22,r0
+-	mov.l	.L22,r12
+-	add	r0,r12
+-	mova	.L23,r0
+-	mov.l	.L23,r1
+-	add	r0,r1
+-#else
+-	mov.l	.L23,r1
+-#endif
+-	jsr	@r1
+-	 mov	r15,r14
+-	bra	1f
+-	 nop
+-	.align 2
+-#ifdef SHARED
+-.L22:
+-	.long	_GLOBAL_OFFSET_TABLE_
+-.L23:
+-	.long	__gmon_start__@PLT
+-#else
+-.L23:
+-	.long	__gmon_start__
+-#endif
+-	.data
+-	.global __fpscr_values
+-__fpscr_values:
+-	.long   0
+-	.long   0x80000
+-	.previous
+-1:
+-	ALIGN
+-	END_INIT
+-
+-	
+-/*@_init_PROLOG_ENDS*/
+-
+-/*@_init_EPILOG_BEGINS*/
+-	.section .init
+-	mov	r14,r15
+-	lds.l	@r15+,pr
+-	mov.l	@r15+,r14
+-	rts	
+-	mov.l	@r15+,r12
+-	END_INIT
+-	.section .text
+-	.align 5
+-	.weak	__gmon_start__
+-	.type	__gmon_start__,@function
+-__gmon_start__:
+-	mov.l	r14,@-r15
+-	mov	r15,r14
+-	mov	r14,r15
+-	rts	
+-	mov.l	@r15+,r14
+-	
+-/*@_init_EPILOG_ENDS*/
+-
+-/*@_fini_PROLOG_BEGINS*/
+-	.section .fini
+-	.align 5
+-	.global	_fini
+-	.type	_fini,@function
+-_fini:
+-	mov.l	r12,@-r15
+-	mov.l	r14,@-r15
+-	sts.l	pr,@-r15
+-#ifdef SHARED
+-	mova	.L27,r0
+-	mov.l	.L27,r12
+-	add	r0,r12
+-#endif
+-	mov	r15,r14
+-	ALIGN
+-	END_FINI
+-#ifdef SHARED
+-	bra	1f
+-	 nop
+-	.align	2
+-.L27:
+-	.long	_GLOBAL_OFFSET_TABLE_
+-#endif
+-1:
+-/*@_fini_PROLOG_ENDS*/
+-
+-/*@_fini_EPILOG_BEGINS*/
+-	.section .fini
+-	mov	r14,r15
+-	lds.l	@r15+,pr
+-	mov.l	@r15+,r14
+-	rts	
+-	mov.l	@r15+,r12
+-
+-	END_FINI
+-	
+-/*@_fini_EPILOG_ENDS*/
+-
+-/*@TRAILER_BEGINS*/
++__asm__ ("\n\
++\n\
++#include \"defs.h\"\n\
++#define SHARED\n\
++\n\
++/*@HEADER_ENDS*/\n\
++\n\
++/*@TESTS_BEGIN*/\n\
++\n\
++/*@TESTS_END*/\n\
++\n\
++/*@_init_PROLOG_BEGINS*/\n\
++	.section .init\n\
++	.align 5\n\
++	.global	_init\n\
++	.type	_init,@function\n\
++_init:\n\
++	mov.l	r12,@-r15\n\
++	mov.l	r14,@-r15\n\
++	sts.l	pr,@-r15\n\
++#ifdef SHARED\n\
++	mova	.L22,r0\n\
++	mov.l	.L22,r12\n\
++	add	r0,r12\n\
++	mova	.L23,r0\n\
++	mov.l	.L23,r1\n\
++	add	r0,r1\n\
++#else\n\
++	mov.l	.L23,r1\n\
++#endif\n\
++	jsr	@r1\n\
++	 mov	r15,r14\n\
++	bra	1f\n\
++	 nop\n\
++	.align 2\n\
++#ifdef SHARED\n\
++.L22:\n\
++	.long	_GLOBAL_OFFSET_TABLE_\n\
++.L23:\n\
++	.long	__gmon_start__@PLT\n\
++#else\n\
++.L23:\n\
++	.long	__gmon_start__\n\
++#endif\n\
++	.data\n\
++	.global __fpscr_values\n\
++__fpscr_values:\n\
++	.long   0\n\
++	.long   0x80000\n\
++	.previous\n\
++1:\n\
++	ALIGN\n\
++	END_INIT\n\
++\n\
++	\n\
++/*@_init_PROLOG_ENDS*/\n\
++\n\
++/*@_init_EPILOG_BEGINS*/\n\
++	.section .init\n\
++	mov	r14,r15\n\
++	lds.l	@r15+,pr\n\
++	mov.l	@r15+,r14\n\
++	rts	\n\
++	mov.l	@r15+,r12\n\
++	END_INIT\n\
++	.section .text\n\
++	.align 5\n\
++	.weak	__gmon_start__\n\
++	.type	__gmon_start__,@function\n\
++__gmon_start__:\n\
++	mov.l	r14,@-r15\n\
++	mov	r15,r14\n\
++	mov	r14,r15\n\
++	rts	\n\
++	mov.l	@r15+,r14\n\
++	\n\
++/*@_init_EPILOG_ENDS*/\n\
++\n\
++/*@_fini_PROLOG_BEGINS*/\n\
++	.section .fini\n\
++	.align 5\n\
++	.global	_fini\n\
++	.type	_fini,@function\n\
++_fini:\n\
++	mov.l	r12,@-r15\n\
++	mov.l	r14,@-r15\n\
++	sts.l	pr,@-r15\n\
++#ifdef SHARED\n\
++	mova	.L27,r0\n\
++	mov.l	.L27,r12\n\
++	add	r0,r12\n\
++#endif\n\
++	mov	r15,r14\n\
++	ALIGN\n\
++	END_FINI\n\
++#ifdef SHARED\n\
++	bra	1f\n\
++	 nop\n\
++	.align	2\n\
++.L27:\n\
++	.long	_GLOBAL_OFFSET_TABLE_\n\
++#endif\n\
++1:\n\
++/*@_fini_PROLOG_ENDS*/\n\
++\n\
++/*@_fini_EPILOG_BEGINS*/\n\
++	.section .fini\n\
++	mov	r14,r15\n\
++	lds.l	@r15+,pr\n\
++	mov.l	@r15+,r14\n\
++	rts	\n\
++	mov.l	@r15+,r12\n\
++\n\
++	END_FINI\n\
++	\n\
++/*@_fini_EPILOG_ENDS*/\n\
++\n\
++/*@TRAILER_BEGINS*/\n\
+ ");
diff --git a/patches/glibc/2.2.5/longjmp-sparc.patch b/patches/glibc/2.2.5/longjmp-sparc.patch
new file mode 100644
index 00000000..d11e9f89
--- /dev/null
+++ b/patches/glibc/2.2.5/longjmp-sparc.patch
@@ -0,0 +1,75 @@
+From libc-alpha-return-8354-listarch-libc-alpha=sourceware dot cygnus dot com at sources dot redhat dot com Mon Jul 01 11:18:29 2002
+Return-Path: <libc-alpha-return-8354-listarch-libc-alpha=sourceware dot cygnus dot com at sources dot redhat dot com>
+Delivered-To: listarch-libc-alpha at sourceware dot cygnus dot com
+Received: (qmail 10698 invoked by alias); 1 Jul 2002 11:18:28 -0000
+Mailing-List: contact libc-alpha-help at sources dot redhat dot com; run by ezmlm
+Precedence: bulk
+List-Subscribe: <mailto:libc-alpha-subscribe at sources dot redhat dot com>
+List-Archive: <http://sources.redhat.com/ml/libc-alpha/>
+List-Post: <mailto:libc-alpha at sources dot redhat dot com>
+List-Help: <mailto:libc-alpha-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs>
+Sender: libc-alpha-owner at sources dot redhat dot com
+Delivered-To: mailing list libc-alpha at sources dot redhat dot com
+Received: (qmail 10659 invoked from network); 1 Jul 2002 11:18:27 -0000
+Received: from unknown (HELO sceaux.ilog.fr) (193.55.64.10)
+  by sources dot redhat dot com with SMTP; 1 Jul 2002 11:18:27 -0000
+Received: from ftp.ilog.fr (ftp.ilog.fr [193.55.64.11])
+	by sceaux dot ilog dot fr (8 dot 11 dot 6/8 dot 11 dot 6) with SMTP id g61BFDi08003
+	for <libc-alpha at sources dot redhat dot com>; Mon, 1 Jul 2002 13:15:18 +0200 (MET DST)
+Received: from laposte.ilog.fr ([193.55.64.67])
+ by ftp dot ilog dot fr (NAVGW 2 dot 5 dot 1 dot 16) with SMTP id M2002070113180506608
+ for <libc-alpha at sources dot redhat dot com>; Mon, 01 Jul 2002 13:18:05 +0200
+Received: from honolulu.ilog.fr ([172.17.4.43])
+	by laposte dot ilog dot fr (8 dot 11 dot 6/8 dot 11 dot 5) with ESMTP id g61BI2w29996;
+	Mon, 1 Jul 2002 13:18:02 +0200 (MET DST)
+Received: (from haible@localhost)
+	by honolulu dot ilog dot fr (8 dot 9 dot 3/8 dot 9 dot 3/SuSE Linux 8 dot 9 dot 3-0 dot 1) id NAA01763;
+	Mon, 1 Jul 2002 13:12:40 +0200
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: base64
+Message-ID: <15648.14632.526690.249866@honolulu.ilog.fr>
+Date: Mon, 1 Jul 2002 13:12:40 +0200 (CEST)
+From: Bruno Haible <bruno at clisp dot org>
+To: libc-alpha at sources dot redhat dot com
+Subject: sparc32/sysdep.h and gcc-3.1
+
+Hi,
+
+When building glibc-2.2.5 for sparc with gcc-3.1 I get a build error
+
+sparc-linux-gcc ../sysdeps/sparc/sparc32/__longjmp.S -c  -I../include -I. -I/backup/cross-build/build-glibc-sparc/setjmp -I.. -I../libio  -I/backup/cross-build/build-glibc-sparc -I../sysdeps/sparc/sparc32/elf -I../linuxthreads/sysdeps/unix/sysv/linux/sparc -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/sparc/sparc32 -I../linuxthreads/sysdeps/sparc -I../sysdeps/unix/sysv/linux/sparc/sparc32 -I../sysdeps/unix/sysv/linux/sparc -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/sparc -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/sparc/sparc32/fpu -I../sysdeps/sparc/sparc32 -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/sparc/sparc32/soft-fp -I../sysdeps/sparc/fpu -I../sysdeps/sparc -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /cross/sparc-linux-tools/lib/gcc-lib/sparc-linux/3.1/include -isystem /cross/sparc-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h     -DASSEMBLER -D__ASSEMBLY__  -o /backup/cross-build/build-glibc-sparc/setjmp/__longjmp.o
+../sysdeps/sparc/sparc32/__longjmp.S: Assembler messages:
+../sysdeps/sparc/sparc32/__longjmp.S:41: Error: Illegal operands
+../sysdeps/sparc/sparc32/__longjmp.S:43: Error: Illegal operands
+../sysdeps/sparc/sparc32/__longjmp.S:48: Error: unknown pseudo-op: `.'
+../sysdeps/sparc/sparc32/__longjmp.S:50: Error: Illegal operands
+../sysdeps/sparc/sparc32/__longjmp.S:52: Error: Illegal operands
+../sysdeps/sparc/sparc32/__longjmp.S:55: Error: unknown pseudo-op: `.'
+../sysdeps/sparc/sparc32/__longjmp.S:72: Error: unknown pseudo-op: `.'
+../sysdeps/sparc/sparc32/__longjmp.S:76: Error: unknown pseudo-op: `.'
+make[2]: *** [/backup/cross-build/build-glibc-sparc/setjmp/__longjmp.o] Fehler 1
+make[2]: Leaving directory `/packages2/glibc-2.2.5/setjmp'
+
+Apparently "cpp0 -lang-asm" now leaves spaces around ## in place, if the token
+on the left or right of it is a lone dot (not a valid C identifier). Hard to
+say that it's a bug in the gcc-3.1 cpp, because -lang-asm is a gcc extension.
+The fix is just to remove the spaces.
+
+
+2002-06-05  Bruno Haible  <bruno@clisp.org>
+
+	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (LOC): Remove spaces.
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.bak	2001-07-06 06:56:21.000000000 +0200
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h	2002-06-05 23:14:40.000000000 +0200
+@@ -48,7 +48,7 @@
+ #define END(name) \
+ 	.size name, . - name
+ 
+-#define LOC(name)  . ## L ## name
++#define LOC(name)  .##L##name
+ 
+ #ifdef PIC
+ #define SYSCALL_ERROR_HANDLER					\
+
diff --git a/patches/glibc/2.2.5/sh-setjmp-fix.patch b/patches/glibc/2.2.5/sh-setjmp-fix.patch
new file mode 100644
index 00000000..3f86a5e7
--- /dev/null
+++ b/patches/glibc/2.2.5/sh-setjmp-fix.patch
@@ -0,0 +1,29 @@
+Fixes glibc 'make tests' failure running isomac
+
+make[2]: *** [/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.15/build/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/build-glibc/stdlib/isomac.out] Error 2
+
+isomac.out contains:
+...
+setjmp.h
+#define JB_SIZE (4 * 15)
+
+See http://sources.redhat.com/ml/libc-hacker/2002-11/msg00009.html
+and http://www.schweikhardt.net/isomac.c.html
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/sh/bits/setjmp.h,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/sysdeps/sh/bits/setjmp.h	2001/07/06 04:56:03	1.4
++++ libc/sysdeps/sh/bits/setjmp.h	2002/11/06 00:08:30	1.5
+@@ -42,7 +42,9 @@
+   } __jmp_buf[1];
+ #endif
+ 
++#if defined __USE_MISC || defined _ASM
+ #define JB_SIZE		(4 * 15)
++#endif
+ 
+ /* Test if longjmp to JMPBUF would unwind the frame
+    containing a local variable at ADDRESS.  */
diff --git a/patches/glibc/2.2.5/sprintf-prototype.patch b/patches/glibc/2.2.5/sprintf-prototype.patch
new file mode 100644
index 00000000..b0d346b6
--- /dev/null
+++ b/patches/glibc/2.2.5/sprintf-prototype.patch
@@ -0,0 +1,13 @@
+--- glibc-2.2.5/stdio-common/sprintf.c.old	Wed May 28 08:59:11 2003
++++ glibc-2.2.5/stdio-common/sprintf.c	Wed May 28 08:59:45 2003
+@@ -27,9 +27,7 @@
+ /* Write formatted output into S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sprintf (s, format)
+-     char *s;
+-     const char *format;
++sprintf (char *s, const char *format, ...)
+ {
+   va_list arg;
+   int done;
diff --git a/patches/glibc/2.2.5/sscanf.patch b/patches/glibc/2.2.5/sscanf.patch
new file mode 100644
index 00000000..4ee33e2b
--- /dev/null
+++ b/patches/glibc/2.2.5/sscanf.patch
@@ -0,0 +1,82 @@
+[dank] Modified very slightly to apply to 2.2.5.
+
+2003-03-05  Roland McGrath  <roland@redhat.com>
+
+	* stdio-common/sscanf.c: Use prototype defn with ... syntax.
+	* libio/swscanf.c: Likewise.
+	* libio/swprintf.c: Likewise.
+
+===================================================================
+RCS file: /cvs/glibc/libc/stdio-common/sscanf.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/stdio-common/sscanf.c	2002/08/10 09:24:42	1.8
++++ libc/stdio-common/sscanf.c	2003/03/05 19:58:03	1.9
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991, 1995, 1996, 1998 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1996,1998,2002,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -27,9 +27,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sscanf (s, format)
+-     const char *s;
+-     const char *format;
++sscanf (const char *s, const char *format, ...)
+ {
+   va_list arg;
+   int done;
+===================================================================
+RCS file: /cvs/glibc/libc/libio/swprintf.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/libio/swprintf.c	2001/07/06 04:55:32	1.3
++++ libc/libio/swprintf.c	2003/03/05 19:58:03	1.4
+@@ -1,4 +1,5 @@
+-/* Copyright (C) 1991,1995,1997,1998,1999,2000 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1997,1998,1999,2000,2003
++	Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -22,10 +23,7 @@
+ /* Write formatted output into S, according to the format string FORMAT.  */
+ /* VARARGS3 */
+ int
+-swprintf (s, n, format)
+-     wchar_t *s;
+-     size_t n;
+-     const wchar_t *format;
++swprintf (wchar_t *s, size_t n, const wchar_t *format, ...)
+ {
+   va_list arg;
+   int done;
+===================================================================
+RCS file: /cvs/glibc/libc/libio/swscanf.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/libio/swscanf.c	2001/07/06 04:55:32	1.2
++++ libc/libio/swscanf.c	2003/03/05 19:58:03	1.3
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991, 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1996,1998,1999,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -22,9 +22,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-swscanf (s, format)
+-     const wchar_t *s;
+-     const wchar_t *format;
++swscanf (const wchar_t *s, const wchar_t *format, ...)
+ {
+   va_list arg;
+   int done;
diff --git a/patches/glibc/2.2.5/unwind-arm.patch b/patches/glibc/2.2.5/unwind-arm.patch
new file mode 100644
index 00000000..37f7b8db
--- /dev/null
+++ b/patches/glibc/2.2.5/unwind-arm.patch
@@ -0,0 +1,19 @@
+# See http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2002-September/011508.html
+# Fixes error
+# arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so.6: undefined reference to `size_of_encoded_value'
+# arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so.6: undefined reference to `read_encoded_value_with_base'
+# make[2]: *** [arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/iconv/iconvconfig] Error 1
+
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/configure.old	Sun Jan 20 19:27:33 2002
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/configure	Sun Jun  8 03:33:03 2003
+@@ -56,6 +56,10 @@
+     arch_minimum_kernel=2.1.100
+     libc_cv_gcc_unwind_find_fde=yes
+     ;;
++  arm*)
++    libc_cv_gcc_unwind_find_fde=yes
++    arch_minimum_kernel=2.0.10
++    ;;
+   i386*)
+     libc_cv_gcc_unwind_find_fde=yes
+     arch_minimum_kernel=2.0.10
diff --git a/patches/glibc/2.3.2/README-hppa b/patches/glibc/2.3.2/README-hppa
new file mode 100644
index 00000000..da242827
--- /dev/null
+++ b/patches/glibc/2.3.2/README-hppa
@@ -0,0 +1,32 @@
+[See also http://parisc-linux.org/toolchain
+ One of these days I'll have a look at what they've
+ got there, and incorporate their patches.]
+
+-------
+
+The error
+
+../linuxthreads/sysdeps/pthread/errno-loc.c: In function `__errno_location':
+../linuxthreads/sysdeps/pthread/errno-loc.c:39: `pthread_descr' undeclared (first use in this function)
+../linuxthreads/sysdeps/pthread/errno-loc.c:39: (Each undeclared identifier is reported only once
+../linuxthreads/sysdeps/pthread/errno-loc.c:39: for each function it appears in.)
+../linuxthreads/sysdeps/pthread/errno-loc.c:39: syntax error before "self"
+../linuxthreads/sysdeps/pthread/errno-loc.c:40: warning: implicit declaration of function `LIBC_THREAD_GETMEM'
+../linuxthreads/sysdeps/pthread/errno-loc.c:40: `self' undeclared (first use in this function)
+../linuxthreads/sysdeps/pthread/errno-loc.c:40: `p_errnop' undeclared (first use in this function)
+../linuxthreads/sysdeps/pthread/errno-loc.c:40: warning: return makes pointer from integer without a cast
+make[2]: *** [/home/gotom/glibc/glibc-2.3.2/build/csu/errno-loc.o] Error 1
+make[2]: Leaving directory `/home/gotom/glibc/glibc-2.3.2/glibc-2.3.2/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+
+means that hppa does not yet have the proper stuff for linuxthreads.
+
+See
+http://groups.google.com/groups?selm=20030322165012%247208%40gated-at.bofh.it
+http://lists.debian.org/debian-glibc/2003/debian-glibc-200303/msg00472.html
+
+A set of experimental patches is at
+http://www.baldric.uwo.ca/~carlos/glibc-2.3.2-patches.tar.gz
+but since they touch generic code, I'm not comfortable using them in general yet.
+Go ahead and grab them if you want to build for hppa before hppa
+support is merged into glibc.
diff --git a/patches/glibc/2.3.2/arm-asm-clobber.patch b/patches/glibc/2.3.2/arm-asm-clobber.patch
new file mode 100644
index 00000000..eca01c37
--- /dev/null
+++ b/patches/glibc/2.3.2/arm-asm-clobber.patch
@@ -0,0 +1,26 @@
+http://gcc.gnu.org/PR11103
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/arm/sysdep.h.diff?r1=1.22&r2=1.23&cvsroot=glibc
+http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-July/005826.html
+
+Error:
+../sysdeps/unix/sysv/linux/arm/sigaction.c: In function `__libc_sigaction':
+../sysdeps/unix/sysv/linux/arm/sigaction.c:100: error: asm-specifier for variable `_a1' conflicts with asm clobber list
+../sysdeps/unix/sysv/linux/arm/sigaction.c:139: error: asm-specifier for variable `_a1' conflicts with asm clobber list
+make[2]: *** [build-glibc/signal/sigaction.o] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/sysdep.h,v
+retrieving revision 1.22
+retrieving revision 1.23
+diff -u -r1.22 -r1.23
+--- libc/sysdeps/unix/sysv/linux/arm/sysdep.h	2003/03/23 19:42:22	1.22
++++ libc/sysdeps/unix/sysv/linux/arm/sysdep.h	2003/03/24 19:00:28	1.23
+@@ -174,7 +174,7 @@
+        asm volatile ("swi	%1	@ syscall " #name	\
+ 		     : "=r" (_a1)				\
+ 		     : "i" (SYS_ify(name)) ASM_ARGS_##nr	\
+-		     : "a1", "memory");				\
++		     : "memory");				\
+        _sys_result = _a1;					\
+      }								\
+      (int) _sys_result; })
diff --git a/patches/glibc/2.3.2/arm-ctl_bus_isa.patch b/patches/glibc/2.3.2/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.3.2/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.3.2/arm-mcount_internal.patch b/patches/glibc/2.3.2/arm-mcount_internal.patch
new file mode 100644
index 00000000..9e195ba2
--- /dev/null
+++ b/patches/glibc/2.3.2/arm-mcount_internal.patch
@@ -0,0 +1,30 @@
+#
+# Submitted:
+# 
+# Robert Schwebel, 2003-12-22
+#  
+# Error:
+# 
+# ... undefined reference to mcount_internal ...
+# 
+# Description: 
+#
+# State:
+# 
+# unknown
+#
+
+--- glibc-2.3.2/sysdeps/arm/machine-gmon.h	2001-07-07 21:21:19.000000000 +0200
++++ glibc-2.3.2-ptx/sysdeps/arm/machine-gmon.h	2003-12-21 23:58:26.000000000 +0100
+@@ -32,10 +32,8 @@
+ weak_alias (_mcount, mcount)
+ #endif
+ 
+-static void mcount_internal (u_long frompc, u_long selfpc);
+-
+ #define _MCOUNT_DECL(frompc, selfpc) \
+-static void mcount_internal (u_long frompc, u_long selfpc)
++void mcount_internal (u_long frompc, u_long selfpc)
+ 
+ /* This macro/func MUST save r0, r1 because the compiler inserts
+ 	blind calls to _mount(), ignoring the fact that _mcount may
diff --git a/patches/glibc/2.3.2/epoll-epollet.patch b/patches/glibc/2.3.2/epoll-epollet.patch
new file mode 100644
index 00000000..c73b36f3
--- /dev/null
+++ b/patches/glibc/2.3.2/epoll-epollet.patch
@@ -0,0 +1,28 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sys/epoll.h.diff?r1=1.1&r2=1.2&cvsroot=glibc
+Needed for modern sys_epoll.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sys/epoll.h,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- libc/sysdeps/unix/sysv/linux/sys/epoll.h	2002/12/16 23:35:27	1.1
++++ libc/sysdeps/unix/sysv/linux/sys/epoll.h	2003/03/24 23:50:25	1.2
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2002 Free Software Foundation, Inc.
++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -42,8 +42,10 @@
+ #define EPOLLMSG EPOLLMSG
+     EPOLLERR = 0x008,
+ #define EPOLLERR EPOLLERR
+-    EPOLLHUP = 0x010
++    EPOLLHUP = 0x010,
+ #define EPOLLHUP EPOLLHUP
++    EPOLLET = (1 << 31)
++#define EPOLLET EPOLLET
+   };
+ 
+ 
diff --git a/patches/glibc/2.3.2/epoll-stdint.patch b/patches/glibc/2.3.2/epoll-stdint.patch
new file mode 100644
index 00000000..b810e969
--- /dev/null
+++ b/patches/glibc/2.3.2/epoll-stdint.patch
@@ -0,0 +1,22 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sys/epoll.h.diff?r1=1.2&r2=1.3&cvsroot=glibc
+Include <stdint.h>.
+
+Fixes error
+/foo/gcc-3.3.2-glibc-2.3.2/powerpc-750-linux-gnu/sys-include/sys/epoll.h:60: error: parse error before "uint32_t"
+/foo/gcc-3.3.2-glibc-2.3.2/powerpc-750-linux-gnu/sys-include/sys/epoll.h:66: error: parse error before "uint32_t"
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sys/epoll.h,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/sysdeps/unix/sysv/linux/sys/epoll.h	2003/03/24 23:50:25	1.2
++++ libc/sysdeps/unix/sysv/linux/sys/epoll.h	2003/06/13 19:49:50	1.3
+@@ -19,6 +19,7 @@
+ #ifndef	_SYS_EPOLL_H
+ #define	_SYS_EPOLL_H	1
+ 
++#include <stdint.h>
+ #include <sys/types.h>
+ 
+ 
diff --git a/patches/glibc/2.3.2/errlist-awk.patch b/patches/glibc/2.3.2/errlist-awk.patch
new file mode 100644
index 00000000..6a40253d
--- /dev/null
+++ b/patches/glibc/2.3.2/errlist-awk.patch
@@ -0,0 +1,11 @@
+--- glibc-2.3.2/sysdeps/gnu/errlist.awk.old	Tue May 27 18:10:37 2003
++++ glibc-2.3.2/sysdeps/gnu/errlist.awk	Tue May 27 18:10:47 2003
+@@ -39,7 +39,7 @@
+ 
+     print "/* This file is generated from errno.texi by errlist.awk.  */"
+     print "";
+-    print "#include <errno.h>";
++    print "#include <stdlib/errno.h>";
+     print "#include <libintl.h>";
+     print "";
+     print "#ifndef ERR_REMAP";
diff --git a/patches/glibc/2.3.2/fixup.patch b/patches/glibc/2.3.2/fixup.patch
new file mode 100644
index 00000000..5f1e8a4e
--- /dev/null
+++ b/patches/glibc/2.3.2/fixup.patch
@@ -0,0 +1,74 @@
+Fixes
+dl-runtime.c:56: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here
+when building with gcc-3.4.0
+
+First hunk:
+Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc
+
+Second hunk:
+If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition.
+Use macro in fixup function definitions.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc
+[rediffed against glibc-2.3.2]
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/dl-machine.h,v
+retrieving revision 1.124
+retrieving revision 1.125
+diff -u -r1.124 -r1.125
+--- libc/sysdeps/i386/dl-machine.h	2004/03/05 10:14:49	1.124
++++ libc/sysdeps/i386/dl-machine.h	2004/03/09 07:42:29	1.125
+@@ -154,11 +154,14 @@
+    destroys the passed register information.  */
+ /* GKM FIXME: Fix trampoline to pass bounds so we can do
+    without the `__unbounded' qualifier.  */
+-static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset)
+-     __attribute__ ((regparm (2), unused));
++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused))
++
++static ElfW(Addr) fixup (struct link_map *__unbounded l,
++			 ElfW(Word) reloc_offset)
++     ARCH_FIXUP_ATTRIBUTE;
+ static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+ 				 ElfW(Addr) retaddr)
+-     __attribute__ ((regparm (3), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ # endif
+ 
+ /* This code is used in dl-runtime.c to call the `fixup' function
+===================================================================
+--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c	Fri Feb  7 11:41:12 2003
++++ glibc-2.3.2/elf/dl-runtime.c	Thu Apr  8 22:24:26 2004
+@@ -36,6 +36,12 @@
+ # define VERSYMIDX(sym)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
+ #endif
+ 
++/* The fixup functions might have need special attributes.  If none
++   are provided define the macro as empty.  */
++#ifndef ARCH_FIXUP_ATTRIBUTE
++# define ARCH_FIXUP_ATTRIBUTE
++#endif
++
+ 
+ /* This function is called through a special trampoline from the PLT the
+    first time each PLT entry is called.  We must perform the relocation
+@@ -45,7 +51,7 @@
+    function.  */
+ 
+ #ifndef ELF_MACHINE_NO_PLT
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ fixup (
+ # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+@@ -132,7 +138,7 @@
+ 
+ #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__
+ 
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ profile_fixup (
+ #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
diff --git a/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch b/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch
new file mode 100644
index 00000000..325c474f
--- /dev/null
+++ b/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch
@@ -0,0 +1,20 @@
+See http://gcc.gnu.org/PR9552
+
+Works around gcc error
+  "soinit.c:25: internal compiler error: in named_section_flags, at varasm.c:412"
+by fixing slightly incorrect code in glibc (the .eh_frame section used to
+be read-write, but it's now readonly according to discussion in
+http://sources.redhat.com/ml/binutils/2002-11/msg00592.html,
+so it's arguably incorrect to continue to put variables in there that aren't const).
+
+--- glibc-2.3.2/elf/soinit.c 2001-11-16 00:09:20.000000000 +0100
++++ glibc-2.3.2/elf/soinit.c   2003-08-12 09:13:34.000000000 +0200
+@@ -25,7 +25,7 @@
+ }
+
+ #ifdef HAVE_DWARF2_UNWIND_INFO
+-static char __EH_FRAME_BEGIN__[]
++const static char __EH_FRAME_BEGIN__[]
+      __attribute__ ((section (".eh_frame")))
+      = { };
+ # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
diff --git a/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch b/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch
new file mode 100644
index 00000000..c9f37011
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch
@@ -0,0 +1,27 @@
+Fixes errors like
+  /build-glibc/dlfcn/glrefmain: cannot load `glreflib1.so'
+in glibc regression test
+
+--- glibc-2.2.5/dlfcn/Makefile.old	Thu Jul 24 16:30:20 2003
++++ glibc-2.2.5/dlfcn/Makefile	Thu Jul 24 17:25:01 2003
+@@ -60,6 +60,8 @@
+ test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
+ $(test-modules): $(objpfx)%.so: $(objpfx)%.os
+ 	$(build-module)
++# without following rule, test-modules don't get built when cross-compiling
++tests: $(test-modules)
+ 
+ $(objpfx)glrefmain: $(libdl)
+ $(objpfx)glrefmain.out: $(objpfx)glrefmain \
+--- glibc-2.2.5/elf/Makefile.old	Thu Jul 24 18:17:12 2003
++++ glibc-2.2.5/elf/Makefile	Thu Jul 24 18:18:58 2003
+@@ -263,6 +263,9 @@
+ test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
+ generated += $(addsuffix .so,$(strip $(modules-names)))
+ 
++# without following rule, test-modules don't get built when cross-compiling
++tests: $(test-modules)
++
+ ifeq (yes,$(build-shared))
+ ifeq ($(cross-compiling),no)
+ tests: $(objpfx)tst-pathopt.out
diff --git a/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch
new file mode 100644
index 00000000..66fee299
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch
@@ -0,0 +1,47 @@
+This is a workaround for
+
+mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c  -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio  -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic  -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h  -DPIC   -DASSEMBLER   -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o
+../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages:
+../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format
+make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1
+
+which was using h.j.lu's binutils-2.13.90.0.18.
+
+
+But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html
+which says
+"A newer version of binutils (CVS post 2003-03-12) fixes it without
+the need of changing perfectly legal code."
+So presumably this can be ditched sooner or later.
+
+From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff
+
+2003-03-13  Guido Guenther  <agx@sigxcpu.org>
+
+	* sysdeps/unix/sysv/linux/mips/clone.S: introduce and use local label
+	  .Lthread_start since current binutils don't allow branches to globally
+	  visible symbols.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v
+retrieving revision 1.10
+diff -u -r1.10 clone.S
+--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 01:04:51 -0000	1.10
++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S	12 Mar 2003 19:04:39 -0000
+@@ -63,7 +63,7 @@
+ 	syscall
+ 
+ 	bnez		a3,error
+-	beqz		v0,__thread_start
++	beqz		v0,.Lthread_start
+ 
+ 	/* Successful return from the parent */
+ 	addiu		sp,32
+@@ -85,6 +85,7 @@
+    debug info.  */
+ 
+ ENTRY(__thread_start)
++.Lthread_start:
+ 	/* cp is already loaded.  */
+ 	.cprestore	16
+ 	/* The stackframe has been created on entry of clone().  */
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch
new file mode 100644
index 00000000..cdcd7ba0
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch
@@ -0,0 +1,23 @@
+Fixes
+cc1: error: invalid parameter `max-inline-insns'
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc6/build/powerpc64-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/dl-load.o] Error 1
+when building with gcc-3.4.0, which no longer has a single
+--max-inline-insns parameter.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.3&r2=1.4&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/powerpc/powerpc64/Makefile     2003/10/22 21:30:03     1.3
++++ libc/sysdeps/powerpc/powerpc64/Makefile     2004/02/20 05:43:52     1.4
+@@ -20,5 +20,5 @@
+ 
+ ifeq ($(subdir),elf)
+ # help gcc inline asm code from dl-machine.h
+-+cflags += --param max-inline-insns=2000
+++cflags += -finline-limit=2000
+ endif
+
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch
new file mode 100644
index 00000000..17f10dae
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch
@@ -0,0 +1,137 @@
+Fixes errors like
+
+# gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crtn.o(.text+0x0):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crtn.S:20: multiple definition of `dummy'
+# gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.o(.text+0x0):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.S:42: first defined here
+# /gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.o(.init+0x28):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.S:58: undefined reference to `i_am_not_a_leaf'
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	aj@sourceware.org	2003-12-02 07:37:29
+
+Modified files:
+	.              : configure.in configure config.make.in 
+	csu            : Makefile 
+	locale         : Makefile 
+	linuxthreads   : Makefile 
+	linuxthreads/sysdeps/unix/sysv/linux/x86_64: Makefile 
+	nptl           : Makefile 
+	nptl/sysdeps/unix/sysv/linux/x86_64: Makefile 
+
+Log message:
+	* config.make.in (fno-unit-at-a-time): Define.
+	
+	* configure.in: Add test for -fno-unit-at-a-time.
+	Fix text for -fpie.
+	
+	* csu/Makefile (CFLAGS-initfini.s): Add $(fno_unit_at_a_time).
+	* locale/Makefile (CFLAGS-loadlocale.c): Likewise.
+	
+	For linuxthreads:
+	* Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time).
+	* sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s):
+	Likewise.
+	
+	For nptl:
+	* Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time).
+	* sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s):
+	Likewise.
+
+Main glibc change retrieved with
+wget -O foo.patch 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/config.make.in.diff?r1=1.98&r2=1.99&cvsroot=glibc' \
+'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/configure.diff?r1=1.393&r2=1.394&cvsroot=glibc' \
+'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/csu/Makefile.diff?r1=1.71&r2=1.72&cvsroot=glibc' \
+'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/locale/Makefile.diff?r1=1.71&r2=1.72&cvsroot=glibc'
+
+and then rediffed against glibc-2.3.2
+See also ../glibc-linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch
+
+diff -aur glibc-2.3.2/config.make.in glibc-2.3.2-nounit/config.make.in
+--- glibc-2.3.2/config.make.in	2002-11-14 14:53:32.000000000 -0800
++++ glibc-2.3.2-nounit/config.make.in	2004-05-29 23:19:58.000000000 -0700
+@@ -50,6 +50,7 @@
+ old-glibc-headers = @old_glibc_headers@
+ unwind-find-fde = @libc_cv_gcc_unwind_find_fde@
+ have-initfini-array = @libc_cv_initfinit_array@
++fno-unit-at-a-time = @fno_unit_at_a_time@
+ 
+ static-libgcc = @libc_cv_gcc_static_libgcc@
+ 
+diff -aur glibc-2.3.2/configure glibc-2.3.2-nounit/configure
+--- glibc-2.3.2/configure	2003-02-26 01:20:48.000000000 -0800
++++ glibc-2.3.2-nounit/configure	2004-05-30 06:22:31.000000000 -0700
+@@ -312,7 +312,7 @@
+ # include <unistd.h>
+ #endif"
+ 
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs oldest_abi subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S PWD_P CC MAKE MSGFMT MAKEINFO SED AUTOCONF CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc libc_cv_have_initfini no_whole_archive exceptions LIBGD EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs oldest_abi subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S PWD_P CC MAKE MSGFMT MAKEINFO SED AUTOCONF CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc fno_unit_at_a_time libc_cv_have_initfini no_whole_archive exceptions LIBGD EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
+ ac_subst_files=''
+ 
+ # Initialize some variables set by options.
+@@ -4984,6 +4984,35 @@
+ fi
+ 
+ 
++echo "$as_me:$LINENO: checking for -fno-unit-at-a-time" >&5
++echo $ECHO_N "checking for -fno-unit-at-a-time... $ECHO_C" >&6
++if test "${libc_cv_fno_unit_at_a_time+set}" = set; then
++  echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++  cat > conftest.c <<EOF
++int foo;
++EOF
++if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -S -fno-unit-at-a-time
++			    conftest.c 1>&5'
++  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++  (eval $ac_try) 2>&5
++  ac_status=$?
++  echo "$as_me:$LINENO: \$? = $ac_status" >&5
++  (exit $ac_status); }; }
++then
++  libc_cv_fno_unit_at_a_time=yes
++else
++  libc_cv_fno_unit_at_a_time=no
++fi
++rm -f conftest*
++fi
++echo "$as_me:$LINENO: result: $libc_cv_fno_unit_at_a_time" >&5
++echo "${ECHO_T}$libc_cv_fno_unit_at_a_time" >&6
++if test $libc_cv_fno_unit_at_a_time = yes; then
++  fno_unit_at_a_time=-fno-unit-at-a-time
++fi
++
++
+ if test $elf != yes; then
+   echo "$as_me:$LINENO: checking for .init and .fini sections" >&5
+ echo $ECHO_N "checking for .init and .fini sections... $ECHO_C" >&6
+@@ -7236,6 +7265,7 @@
+ s,@libc_cv_z_initfirst@,$libc_cv_z_initfirst,;t t
+ s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t
+ s,@libc_cv_z_combreloc@,$libc_cv_z_combreloc,;t t
++s,@fno_unit_at_a_time@,$fno_unit_at_a_time,;t t
+ s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t
+ s,@no_whole_archive@,$no_whole_archive,;t t
+ s,@exceptions@,$exceptions,;t t
+diff -aur glibc-2.3.2/csu/Makefile glibc-2.3.2-nounit/csu/Makefile
+--- glibc-2.3.2/csu/Makefile	2002-12-31 14:24:37.000000000 -0800
++++ glibc-2.3.2-nounit/csu/Makefile	2004-05-29 23:18:27.000000000 -0700
+@@ -99,7 +99,7 @@
+ $(objpfx)crt%.o: $(objpfx)crt%.S $(objpfx)defs.h
+ 	$(compile.S) -g0 $(ASFLAGS-.os) -o $@
+ 
+-CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions
++CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time)
+ 
+ vpath initfini.c $(full_config_sysdirs)
+ 
+diff -aur glibc-2.3.2/locale/Makefile glibc-2.3.2-nounit/locale/Makefile
+--- glibc-2.3.2/locale/Makefile	2002-10-17 10:05:53.000000000 -0700
++++ glibc-2.3.2-nounit/locale/Makefile	2004-05-29 23:18:27.000000000 -0700
+@@ -100,6 +100,7 @@
+ CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts
+ CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts
+ CFLAGS-charmap-dir.c = -Wno-write-strings
++CFLAGS-loadlocale.c = $(fno-unit-at-a-time)
+ 
+ # This makes sure -DNOT_IN_libc is passed for all these modules.
+ cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch
new file mode 100644
index 00000000..fe97f678
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch
@@ -0,0 +1,55 @@
+--- glibc-2.3.2/stdlib/abs.c.old	2004-07-18 12:08:43.000000000 -0700
++++ glibc-2.3.2/stdlib/abs.c	2004-07-18 12:09:18.000000000 -0700
+@@ -16,6 +16,8 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define __NO_INLINE__ 1	/* avoid http://gcc.gnu.org/PR14096 */
++
+ #include <stdlib.h>
+ 
+ #undef	abs
+--- glibc-2.3.2/stdlib/atoi.c.old	2004-07-18 12:08:17.000000000 -0700
++++ glibc-2.3.2/stdlib/atoi.c	2004-07-18 12:08:27.000000000 -0700
+@@ -16,6 +16,8 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define __NO_INLINE__ 1	/* avoid http://gcc.gnu.org/PR14096 */
++
+ #include <stdlib.h>
+ 
+ #undef	atoi
+--- glibc-2.3.2/stdlib/atof.c.old	2004-07-18 12:06:09.000000000 -0700
++++ glibc-2.3.2/stdlib/atof.c	2004-07-18 12:05:31.000000000 -0700
+@@ -16,6 +16,8 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define __NO_INLINE__ 1	/* avoid http://gcc.gnu.org/PR14096 */
++
+ #include <stdlib.h>
+ 
+ #undef	atof
+--- glibc-2.3.2/stdlib/atol.c.old	2004-07-18 12:08:49.000000000 -0700
++++ glibc-2.3.2/stdlib/atol.c	2004-07-18 12:09:40.000000000 -0700
+@@ -16,6 +16,8 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define __NO_INLINE__ 1	/* avoid http://gcc.gnu.org/PR14096 */
++
+ #include <stdlib.h>
+ 
+ #undef	atol
+--- glibc-2.3.2/stdlib/atoll.c.old	2004-07-18 12:08:55.000000000 -0700
++++ glibc-2.3.2/stdlib/atoll.c	2004-07-18 12:09:59.000000000 -0700
+@@ -16,6 +16,8 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define __NO_INLINE__ 1	/* avoid http://gcc.gnu.org/PR14096 */
++
+ #include <stdlib.h>
+ 
+ #undef	atoll
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch
new file mode 100644
index 00000000..1bd61e50
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch
@@ -0,0 +1,34 @@
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc
+
+Fixes gcc-3.5 errors
+
+dl-load.c: In function `_dl_map_object_from_fd':
+dl-load.c:1179: error: invalid lvalue in assignment
+dl-load.c:1205: error: invalid lvalue in assignment
+
+===================================================================
+RCS file: /cvs/glibc/libc/elf/dl-load.c,v
+retrieving revision 1.235
+retrieving revision 1.236
+diff -u -r1.235 -r1.236
+--- libc/elf/dl-load.c	2004/02/09 07:03:48	1.235
++++ libc/elf/dl-load.c	2004/02/21 18:25:41	1.236
+@@ -1228,7 +1228,7 @@
+       }
+     else
+       /* Adjust the PT_PHDR value by the runtime load address.  */
+-      (ElfW(Addr)) l->l_phdr += l->l_addr;
++      l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr);
+   }
+ 
+ #ifdef USE_TLS
+@@ -1254,7 +1254,7 @@
+ 	}
+     }
+   else
+-    (ElfW(Addr)) l->l_ld += l->l_addr;
++    l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
+ 
+   l->l_entry += l->l_addr;
+ 
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch
new file mode 100644
index 00000000..3d6df5bd
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch
@@ -0,0 +1,228 @@
+Fixes
+gconv_open.c: In function `__gconv_open':
+gconv_open.c:186: error: invalid lvalue in assignment
+when building glibc-2.3.2 with gcc-3.5.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc'
+        * (internal_ucs4_loop): Fix typo in last change.
+
+        * (internal_ucs4le_loop): Remove cast used as lvalue.
+
+        * Fix last commit.
+
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc'
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v
+retrieving revision 1.32
+retrieving revision 1.33
+diff -u -r1.32 -r1.33
+--- libc/iconv/gconv_open.c	2001/11/29 04:51:58	1.32
++++ libc/iconv/gconv_open.c	2004/02/07 15:56:32	1.33
+@@ -1,5 +1,5 @@
+ /* Find matching transformation algorithms and initialize steps.
+-   Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -182,8 +182,13 @@
+ 	      || __builtin_expect (__gconv_translit_find (runp), 0) == 0)
+ 	    lastp = runp;
+ 	  else
+-	    /* This means we haven't found the module.  Remove it.  */
+-	    (lastp == NULL ? trans : lastp->next) = runp->next;
++	    {
++	      /* This means we haven't found the module.  Remove it.  */
++	      if (lastp == NULL)
++		trans  = runp->next;
++	      else
++		lastp->next  = runp->next;
++	    }
+ 	}
+ 
+       /* Allocate room for handle.  */
+===================================================================
+RCS file: /cvs/glibc/libc/iconv/gconv_simple.c,v
+retrieving revision 1.59
+retrieving revision 1.63
+diff -u -r1.59 -r1.63
+--- libc/iconv/gconv_simple.c	2003/06/11 21:36:37	1.59
++++ libc/iconv/gconv_simple.c	2004/03/09 10:00:31	1.63
+@@ -1,5 +1,5 @@
+ /* Simple transformations functions.
+-   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
++   Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -87,12 +87,13 @@
+ #if __BYTE_ORDER == __LITTLE_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
+ 
+   *inptrp = inptr;
+-  *outptrp = outptr;
++  *outptrp = (unsigned char *) outptr32;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* Simply copy the data.  */
+   *inptrp = inptr + n_convert * 4;
+@@ -192,13 +193,16 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
+ #else
+ # error "This endianess is not supported."
+ #endif
++  *outptrp += 4;
+ 
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+@@ -268,7 +272,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -447,9 +452,11 @@
+ #if __BYTE_ORDER == __BIG_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
++  outptr = (unsigned char *) outptr32;
+ 
+   *inptrp = inptr;
+   *outptrp = outptr;
+@@ -555,12 +562,17 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #else
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
++
+ #endif
+ 
++  *outptrp += 4;
++
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+ 
+@@ -626,7 +638,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -808,7 +821,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *((uint32_t *) outptr)++ = *inptr++;				      \
++      *((uint32_t *) outptr) = *inptr++;				      \
++      outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -838,7 +852,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *outptr++ = *((const uint32_t *) inptr)++;			      \
++      *outptr++ = *((const uint32_t *) inptr);				      \
++      inptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -1032,7 +1047,8 @@
+       }									      \
+ 									      \
+     /* Now adjust the pointers and store the result.  */		      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ 
+@@ -1153,7 +1169,8 @@
+ 	STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1201,7 +1218,8 @@
+       }									      \
+     else								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = val;					      \
++	*((uint16_t *) outptr) = val;					      \
++        outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
+@@ -1242,7 +1260,8 @@
+ 	continue;							      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1291,7 +1310,8 @@
+       }									      \
+     else								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = bswap_16 (val);			      \
++	*((uint16_t *) outptr) = bswap_16 (val);			      \
++	outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch
new file mode 100644
index 00000000..e2673dec
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch
@@ -0,0 +1,46 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/msort.c.diff?r1=1.20&r2=1.21&cvsroot=glibc
+
+Fixes
+
+msort.c: In function `msort_with_tmp':
+msort.c:59: error: invalid lvalue in increment
+msort.c:59: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+
+when building with gcc-3.5.
+
+===================================================================
+RCS file: /cvs/glibc/libc/stdlib/msort.c,v
+retrieving revision 1.20
+retrieving revision 1.21
+diff -u -r1.20 -r1.21
+--- libc/stdlib/msort.c	2002/09/24 04:20:57	1.20
++++ libc/stdlib/msort.c	2004/02/07 15:57:34	1.21
+@@ -1,6 +1,6 @@
+ /* An alternative to qsort, with an identical interface.
+    This file is part of the GNU C Library.
+-   Copyright (C) 1992,95-97,99,2000,01,02 Free Software Foundation, Inc.
++   Copyright (C) 1992,95-97,99,2000,01,02,04 Free Software Foundation, Inc.
+    Written by Mike Haertel, September 1988.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -56,12 +56,16 @@
+ 	if ((*cmp) (b1, b2) <= 0)
+ 	  {
+ 	    --n1;
+-	    *((op_t *) tmp)++ = *((op_t *) b1)++;
++	    *((op_t *) tmp) = *((op_t *) b1);
++	    tmp += sizeof (op_t);
++	    b1 += sizeof (op_t);
+ 	  }
+ 	else
+ 	  {
+ 	    --n2;
+-	    *((op_t *) tmp)++ = *((op_t *) b2)++;
++	    *((op_t *) tmp) = *((op_t *) b2);
++	    tmp += sizeof (op_t);
++	    b2 += sizeof (op_t);
+ 	  }
+       }
+   else
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch
new file mode 100644
index 00000000..5a68bc24
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch
@@ -0,0 +1,233 @@
+http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html
+[Also in CVS, but the original patch is easier to get.]
+
+Fixes errors like
+
+clnt_perr.c: In function `_buf':
+clnt_perr.c:67: error: invalid lvalue in assignment
+
+when building with gcc-3.5.
+
+To: libc-hacker at sources dot redhat dot com
+Subject: Fix cast as lvalue in sunrpc
+From: Andreas Schwab <schwab at suse dot de>
+X-Yow: SHHHH!!  I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS
+ into empty OIL DRUMS dot  dot 
+Date: Sun, 08 Feb 2004 17:38:31 +0100
+Message-ID: <je4qu1frw8.fsf@sykes.suse.de>
+
+This fixes the uses of casts as lvalue in the sunrpc code.
+
+Andreas.
+
+2004-02-08  Andreas Schwab  <schwab@suse.de>
+
+	* include/rpc/rpc.h: Declare thread variables with their correct
+	type.
+	* sunrpc/clnt_perr.c: Don't cast thread variables.
+	* sunrpc/clnt_raw.c: Likewise.
+	* sunrpc/clnt_simp.c: Likewise.
+	* sunrpc/key_call.c: Likewise.
+	* sunrpc/svcauth_des.c: Likewise.
+	* sunrpc/svc.c: Likewise.
+	* sunrpc/svc_raw.c: Likewise.
+	* sunrpc/svc_simple.c: Likewise.
+
+Index: include/rpc/rpc.h
+===================================================================
+RCS file: /cvs/glibc/libc/include/rpc/rpc.h,v
+retrieving revision 1.8
+diff -u -p -a -r1.8 rpc.h
+--- glibc/include/rpc/rpc.h	5 Aug 2002 22:10:59 -0000	1.8
++++ glibc/include/rpc/rpc.h	8 Feb 2004 14:19:14 -0000
+@@ -17,24 +17,24 @@ struct rpc_thread_variables {
+ 	struct pollfd	*svc_pollfd_s;		/* Global, rpc_common.c */
+ 	int		svc_max_pollfd_s;	/* Global, rpc_common.c */
+ 
+-	void		*clnt_perr_buf_s;	/* clnt_perr.c */
++	char		*clnt_perr_buf_s;	/* clnt_perr.c */
+ 
+-	void		*clntraw_private_s;	/* clnt_raw.c */
++	struct clntraw_private_s *clntraw_private_s;	/* clnt_raw.c */
+ 
+-	void		*callrpc_private_s;	/* clnt_simp.c */
++	struct callrpc_private_s *callrpc_private_s;	/* clnt_simp.c */
+ 
+-	void		*key_call_private_s;	/* key_call.c */
++	struct key_call_private *key_call_private_s;	/* key_call.c */
+ 
+-	void		*authdes_cache_s;	/* svcauth_des.c */
+-	void		*authdes_lru_s;		/* svcauth_des.c */
++	struct cache_entry *authdes_cache_s;	/* svcauth_des.c */
++	int		*authdes_lru_s;		/* svcauth_des.c */
+ 
+-	void		*svc_xports_s;		/* svc.c */
+-	void		*svc_head_s;		/* svc.c */
++	SVCXPRT		**svc_xports_s;		/* svc.c */
++	struct svc_callout *svc_head_s;		/* svc.c */
+ 
+-	void		*svcraw_private_s;	/* svc_raw.c */
++	struct svcraw_private_s *svcraw_private_s;	/* svc_raw.c */
+ 
+-	void		*svcsimple_proglst_s;	/* svc_simple.c */
+-	void		*svcsimple_transp_s;	/* svc_simple.c */
++	struct proglst_ *svcsimple_proglst_s;	/* svc_simple.c */
++	SVCXPRT		*svcsimple_transp_s;	/* svc_simple.c */
+ };
+ 
+ extern struct rpc_thread_variables *__rpc_thread_variables(void)
+Index: sunrpc/clnt_perr.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_perr.c,v
+retrieving revision 1.19
+diff -u -p -a -r1.19 clnt_perr.c
+--- glibc/sunrpc/clnt_perr.c	1 Nov 2002 20:43:54 -0000	1.19
++++ glibc/sunrpc/clnt_perr.c	8 Feb 2004 14:19:14 -0000
+@@ -55,7 +55,7 @@ static char *auth_errmsg (enum auth_stat
+  * buf variable in a few functions.  Overriding a global variable
+  * with a local variable of the same name is a bad idea, anyway.
+  */
+-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s))
++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s)
+ #else
+ static char *buf;
+ #endif
+Index: sunrpc/clnt_raw.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_raw.c,v
+retrieving revision 1.10
+diff -u -p -a -r1.10 clnt_raw.c
+--- glibc/sunrpc/clnt_raw.c	15 May 2002 00:21:00 -0000	1.10
++++ glibc/sunrpc/clnt_raw.c	8 Feb 2004 14:19:14 -0000
+@@ -61,7 +61,7 @@ struct clntraw_private_s
+     u_int mcnt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s))
++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s)
+ #else
+ static struct clntraw_private_s *clntraw_private;
+ #endif
+Index: sunrpc/clnt_simp.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_simp.c,v
+retrieving revision 1.14
+diff -u -p -a -r1.14 clnt_simp.c
+--- glibc/sunrpc/clnt_simp.c	15 May 2002 00:21:00 -0000	1.14
++++ glibc/sunrpc/clnt_simp.c	8 Feb 2004 14:19:14 -0000
+@@ -55,7 +55,7 @@ struct callrpc_private_s
+     char *oldhost;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s))
++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s)
+ #else
+ static struct callrpc_private_s *callrpc_private;
+ #endif
+Index: sunrpc/key_call.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/key_call.c,v
+retrieving revision 1.16
+diff -u -p -a -r1.16 key_call.c
+--- glibc/sunrpc/key_call.c	6 Aug 2002 06:08:50 -0000	1.16
++++ glibc/sunrpc/key_call.c	8 Feb 2004 14:19:14 -0000
+@@ -370,7 +370,7 @@ struct  key_call_private {
+   uid_t   uid;            /* user-id at last authorization */
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define key_call_private_main ((struct  key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s))
++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s)
+ #else
+ static struct key_call_private *key_call_private_main;
+ #endif
+Index: sunrpc/svc.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc.c,v
+retrieving revision 1.17
+diff -u -p -a -r1.17 svc.c
+--- glibc/sunrpc/svc.c	29 Aug 2003 07:45:18 -0000	1.17
++++ glibc/sunrpc/svc.c	8 Feb 2004 14:19:14 -0000
+@@ -44,7 +44,7 @@
+ #include <sys/poll.h>
+ 
+ #ifdef _RPC_THREAD_SAFE_
+-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s))
++#define xports RPC_THREAD_VARIABLE(svc_xports_s)
+ #else
+ static SVCXPRT **xports;
+ #endif
+@@ -63,7 +63,7 @@ struct svc_callout {
+   void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s))
++#define svc_head RPC_THREAD_VARIABLE(svc_head_s)
+ #else
+ static struct svc_callout *svc_head;
+ #endif
+Index: sunrpc/svc_raw.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc_raw.c,v
+retrieving revision 1.5
+diff -u -p -a -r1.5 svc_raw.c
+--- glibc/sunrpc/svc_raw.c	26 Feb 2002 01:43:56 -0000	1.5
++++ glibc/sunrpc/svc_raw.c	8 Feb 2004 14:19:14 -0000
+@@ -54,7 +54,7 @@ struct svcraw_private_s
+     char verf_body[MAX_AUTH_BYTES];
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s))
++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s)
+ #else
+ static struct svcraw_private_s *svcraw_private;
+ #endif
+Index: sunrpc/svc_simple.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc_simple.c,v
+retrieving revision 1.16
+diff -u -p -a -r1.16 svc_simple.c
+--- glibc/sunrpc/svc_simple.c	6 Aug 2002 05:10:30 -0000	1.16
++++ glibc/sunrpc/svc_simple.c	8 Feb 2004 14:19:14 -0000
+@@ -61,7 +61,7 @@ struct proglst_
+     struct proglst_ *p_nxt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s))
++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s)
+ #else
+ static struct proglst_ *proglst;
+ #endif
+@@ -69,7 +69,7 @@ static struct proglst_ *proglst;
+ 
+ static void universal (struct svc_req *rqstp, SVCXPRT *transp_s);
+ #ifdef _RPC_THREAD_SAFE_
+-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s))
++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s)
+ #else
+ static SVCXPRT *transp;
+ #endif
+Index: sunrpc/svcauth_des.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svcauth_des.c,v
+retrieving revision 1.8
+diff -u -p -a -r1.8 svcauth_des.c
+--- glibc/sunrpc/svcauth_des.c	20 Aug 2001 06:37:09 -0000	1.8
++++ glibc/sunrpc/svcauth_des.c	8 Feb 2004 14:19:14 -0000
+@@ -72,8 +72,8 @@ struct cache_entry
+     char *localcred;		/* generic local credential */
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s))
+-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s))
++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s)
++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s)
+ #else
+ static struct cache_entry *authdes_cache;
+ static int *authdes_lru;
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
+
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch
new file mode 100644
index 00000000..4d811e9f
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch
@@ -0,0 +1,44 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc
+(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html
+and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html)
+
+Fixes errors
+
+rpc_cmsg.c: In function `xdr_callmsg':
+rpc_cmsg.c:70: error: invalid lvalue in increment
+rpc_cmsg.c:71: error: invalid lvalue in increment
+rpc_cmsg.c:74: error: invalid lvalue in increment
+rpc_cmsg.c:77: error: invalid lvalue in increment
+rpc_cmsg.c:78: error: invalid lvalue in increment
+rpc_cmsg.c:79: error: invalid lvalue in increment
+rpc_cmsg.c:81: error: invalid lvalue in increment
+rpc_cmsg.c:89: error: invalid lvalue in increment
+rpc_cmsg.c:106: error: invalid lvalue in increment
+rpc_cmsg.c:107: error: invalid lvalue in increment
+rpc_cmsg.c:112: error: invalid lvalue in increment
+rpc_cmsg.c:117: error: invalid lvalue in increment
+rpc_cmsg.c:118: error: invalid lvalue in increment
+rpc_cmsg.c:119: error: invalid lvalue in increment
+rpc_cmsg.c:121: error: invalid lvalue in increment
+rpc_cmsg.c:160: error: invalid lvalue in increment
+
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v
+retrieving revision 1.27
+retrieving revision 1.28
+diff -u -r1.27 -r1.28
+--- libc/sunrpc/rpc/xdr.h	2002/12/16 02:05:49	1.27
++++ libc/sunrpc/rpc/xdr.h	2004/03/22 10:52:33	1.28
+@@ -262,10 +262,8 @@
+  * and shouldn't be used any longer. Code which use this defines or longs
+  * in the RPC code will not work on 64bit Solaris platforms !
+  */
+-#define IXDR_GET_LONG(buf) \
+-	((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++))
+-#define IXDR_PUT_LONG(buf, v) \
+-	(*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v)))
++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf))
++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v)))
+ #define IXDR_GET_U_LONG(buf)	      ((u_long)IXDR_GET_LONG(buf))
+ #define IXDR_PUT_U_LONG(buf, v)	      IXDR_PUT_LONG(buf, (long)(v))
+ 
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch b/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch
new file mode 100644
index 00000000..809c1b3c
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch
@@ -0,0 +1,54 @@
+Fix for this error:
+
+crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc_pic.os(.text+0xd9b2c): In function `posix_fallocate64':
+: undefined reference to `__GI___pwrite64'
+collect2: ld returned 1 exit status
+make[1]: *** [crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.so] Error 1
+make[1]: Leaving directory `crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+extracted from GLIBC CVS by Dan Kegel
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc'
+(to match context of...)
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc'
+and rediffed.
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+Originally thought we needed this hunk, too:
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html
+but it seems the sysdep.h change is sufficient, and works better 
+when compiling against linux-2.4.
+
+===================================================================
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old	2004-05-24 22:21:44.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h	2004-05-24 22:22:48.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003
++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+@@ -60,6 +60,21 @@
+ #define __NR_osf_getsysinfo	256
+ #define __NR_osf_setsysinfo	257
+ 
++/* Help old kernel headers where particular syscalls are not available.  */
++#ifndef __NR_semtimedop
++# define __NR_semtimedop	423
++#endif
++
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ /*
+  * In order to get the hidden arguments for rt_sigaction set up
+  * properly, we need to call the assembly version.  Detect this in the
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch b/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch
new file mode 100644
index 00000000..03e5c5b2
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch
@@ -0,0 +1,54 @@
+See also
+http://lists.gnu.org/archive/html/bug-glibc/2002-12/msg00056.html
+http://lists.arm.linux.org.uk/pipermail/linux-arm-toolchain/2004-June/000016.html
+
+2002-12-12  Andreas Schwab  <schwab@suse.de>
+        * sysdeps/arm/strlen.S: Fix last word check for big endian.
+
+To: libc-alpha at sources dot redhat dot com
+Subject: [PATCH] REPOST: ARM big-endian strlen() fix
+References: <m3brjy27mo.fsf@defiant.pm.waw.pl>
+From: Krzysztof Halasa <khc at pm dot waw dot pl>
+Date: Thu, 10 Jun 2004 13:41:44 +0200
+Message-ID: <m3r7sn8wsn.fsf@defiant.pm.waw.pl>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="=-=-="
+
+--=-=-=
+
+The attached patch fixes strlen() on big-endian ARM. Please apply.
+Thanks.
+-- 
+Krzysztof Halasa, B*FH
+
+--=-=-=
+Content-Type: text/x-patch
+Content-Disposition: inline; filename=glibc-strlen.patch
+
+--- glibc-2.3.3.old/sysdeps/arm/strlen.S	2003-04-30 00:47:20.000000000 +0200
++++ glibc-2.3.3/sysdeps/arm/strlen.S	2004-06-06 03:21:48.351931240 +0200
+@@ -53,12 +53,21 @@
+ 	ldrne   r2, [r1], $4            @ and we continue to the next word
+ 	bne     Laligned                @
+ Llastword:				@ drop through to here once we find a
++#ifdef __ARMEB__
++	tst     r2, $0xff000000         @ word that has a zero byte in it
++	addne   r0, r0, $1              @
++	tstne   r2, $0x00ff0000         @ and add up to 3 bytes on to it
++	addne   r0, r0, $1              @
++	tstne   r2, $0x0000ff00         @ (if first three all non-zero, 4th
++	addne   r0, r0, $1              @  must be zero)
++#else
+ 	tst     r2, $0x000000ff         @ word that has a zero byte in it
+ 	addne   r0, r0, $1              @
+ 	tstne   r2, $0x0000ff00         @ and add up to 3 bytes on to it
+ 	addne   r0, r0, $1              @
+ 	tstne   r2, $0x00ff0000         @ (if first three all non-zero, 4th
+ 	addne   r0, r0, $1              @  must be zero)
++#endif
+ 	RETINSTR(mov,pc,lr)
+ END(strlen)
+ libc_hidden_builtin_def (strlen)
+
+--=-=-=--
+
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch b/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch
new file mode 100644
index 00000000..7eae11a4
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch
@@ -0,0 +1,18 @@
+When configuring canadian cross toolchain and you're unlucky enough to be
+using a build and host that are different, but that config.sub thinks mean the same thing,
+you might end up without BUILD_CC being defined as 'cc' or 'gcc',
+which might cause $CC to be used instead, which would be wrong...
+
+Dan Kegel
+
+--- glibc-2.3.2/configure.old	2004-05-26 19:46:43.000000000 -0700
++++ glibc-2.3.2/configure	2004-05-26 19:52:47.000000000 -0700
+@@ -3323,7 +3323,7 @@
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+-if test $host != $build; then
++if test "$cross_compiling" = yes; then
+   for ac_prog in gcc cc
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-cross.patch b/patches/glibc/2.3.2/glibc-2.3.2-cross.patch
new file mode 100644
index 00000000..d28ab9ea
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-cross.patch
@@ -0,0 +1,27 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/resolv/Makefile.diff?r1=1.41&r2=1.42&cvsroot=glibc
+
+Fixes 
+/bin/sh: /crosstool-0.15/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/elf/ld.so.1: cannot execute binary file
+make[2]: *** [/crosstool-0.15/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/resolv/tst-leaks.out] Error 126
+
+2003-03-01  Andreas Schwab  <schwab@suse.de>
+
+	* resolv/Makefile (tests): Don't depend on
+	$(objpfx)mtrace-tst-leaks when cross compiling.
+
+===================================================================
+RCS file: /cvs/glibc/libc/resolv/Makefile,v
+retrieving revision 1.41
+retrieving revision 1.42
+diff -u -r1.41 -r1.42
+--- libc/resolv/Makefile	2003/02/23 03:35:39	1.41
++++ libc/resolv/Makefile	2003/03/01 22:15:00	1.42
+@@ -93,6 +93,8 @@
+ tst-leaks-ENV = MALLOC_TRACE=$(objpfx)tst-leaks.mtrace
+ $(objpfx)mtrace-tst-leaks: $(objpfx)tst-leaks.out
+ 	$(common-objpfx)malloc/mtrace $(objpfx)tst-leaks.mtrace > $@
++ifeq (no,$(cross-compiling))
+ ifneq (no,$(PERL))
+ tests: $(objpfx)mtrace-tst-leaks
+ endif
++endif
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch b/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch
new file mode 100644
index 00000000..2b468187
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch
@@ -0,0 +1,90 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.2 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.2 also requires a patch, see 
+../glibc-linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch
+
+
+--- glibc-2.3.2/Makeconfig.orig	2003-01-05 21:31:36.000000000 -0800
++++ glibc-2.3.2/Makeconfig	2004-03-13 23:42:03.781250000 -0800
+@@ -433,13 +433,13 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ else
+ ifneq (,$(filter aix aix%,$(config-os)))
+ link-libc = $(common-objpfx)libc.a \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ rpath-dirs = math dlfcn nss nis rt resolv crypt
+ endif
+ endif
+@@ -652,7 +652,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -706,14 +706,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ 
+--- glibc-2.3.2/Makerules.orig	2003-02-22 15:23:31.000000000 -0800
++++ glibc-2.3.2/Makerules	2004-03-13 23:43:40.984375000 -0800
+@@ -446,7 +446,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -958,7 +958,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -966,7 +966,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch b/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch
new file mode 100644
index 00000000..bd70d4a1
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch
@@ -0,0 +1,588 @@
+Retrieved from
+http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-04&msgid=orfzoof4j0.fsf%40free.redhat.lsd.ic.unicamp.br
+paths adjusted, and rediffed against glibc-2.3.2
+(i.e. to compensate for fact that
+http://sources.redhat.com/ml/glibc-cvs/2003-q1/msg01155.html
+is not present)
+
+Should fix
+
+In file included from ../sysdeps/unix/sysv/linux/mips/sys/procfs.h:29,
+                 from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:43,
+                 from ../linuxthreads/internals.h:29,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from ../sysdeps/mips/elf/ldsodefs.h:25,
+                 from ../sysdeps/unix/sysv/linux/init-first.c:30:
+../sysdeps/unix/sysv/linux/mips/sys/user.h:26:21: asm/reg.h: No such file or directory
+In file included from ../sysdeps/unix/sysv/linux/mips/sys/procfs.h:29,
+                 from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:43,
+                 from ../linuxthreads/internals.h:29,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from ../sysdeps/mips/elf/ldsodefs.h:25,
+                 from ../sysdeps/unix/sysv/linux/init-first.c:30:
+../sysdeps/unix/sysv/linux/mips/sys/user.h:30: error: `EF_SIZE' undeclared here (not in a function)
+make[2]: *** [mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/init-first.o] Error 1
+make[2]: Leaving directory `mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/csu'
+make[1]: *** [csu/subdir_lib] Error 2
+make[1]: Leaving directory `mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+From libc-alpha-return-12105-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com Sat Apr 12 09:28:56 2003
+Return-Path: <libc-alpha-return-12105-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com>
+Delivered-To: listarch-libc-alpha at sources dot redhat dot com
+Received: (qmail 2802 invoked by alias); 12 Apr 2003 09:28:56 -0000
+Mailing-List: contact libc-alpha-help at sources dot redhat dot com; run by ezmlm
+Precedence: bulk
+List-Subscribe: <mailto:libc-alpha-subscribe at sources dot redhat dot com>
+List-Archive: <http://sources.redhat.com/ml/libc-alpha/>
+List-Post: <mailto:libc-alpha at sources dot redhat dot com>
+List-Help: <mailto:libc-alpha-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs>
+Sender: libc-alpha-owner at sources dot redhat dot com
+Delivered-To: mailing list libc-alpha at sources dot redhat dot com
+Received: (qmail 2795 invoked from network); 12 Apr 2003 09:28:55 -0000
+Received: from unknown (HELO lacrosse.corp.redhat.com) (66.187.233.200)
+  by sources dot redhat dot com with SMTP; 12 Apr 2003 09:28:55 -0000
+Received: from free.redhat.lsd.ic.unicamp.br (aoliva.cipe.redhat.com [10.0.1.10])
+	by lacrosse dot corp dot redhat dot com (8 dot 11 dot 6/8 dot 9 dot 3) with ESMTP id h3C9SqV01131
+	for <libc-alpha at sources dot redhat dot com>; Sat, 12 Apr 2003 05:28:52 -0400
+Received: from free.redhat.lsd.ic.unicamp.br (free.redhat.lsd.ic.unicamp.br [127.0.0.1])
+	by free dot redhat dot lsd dot ic dot unicamp dot br (8 dot 12 dot 8/8 dot 12 dot 8) with ESMTP id h3C9SpVT028734
+	for <libc-alpha at sources dot redhat dot com>; Sat, 12 Apr 2003 06:28:51 -0300
+Received: (from aoliva@localhost)
+	by free dot redhat dot lsd dot ic dot unicamp dot br (8 dot 12 dot 8/8 dot 12 dot 8/Submit) id h3C9SpFb028730;
+	Sat, 12 Apr 2003 06:28:51 -0300
+To: libc-alpha at sources dot redhat dot com
+Subject: signal-handling tweaks for mips/mips64
+From: Alexandre Oliva <aoliva at redhat dot com>
+Organization: GCC Team, Red Hat
+Date: 12 Apr 2003 06:28:51 -0300
+Message-ID: <orfzoof4j0.fsf@free.redhat.lsd.ic.unicamp.br>
+Lines: 49
+User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="=-=-="
+
+--=-=-=
+
+It was reported to me that ucontext is utterly broken, even in o32
+with a stable 32-bit mips kernel.  Indeed, it doesn't match the
+ucontext structure defined by the kernel at all.  This means that
+programs taking real-time signals in o32 won't be able to extract
+correct information from the mcontext_t, since the kernel puts data in
+there that's in an entirely different format.
+
+I've looked for any ways in which the current data structures could
+possibly be useful, and didn't find any.  gdb and rda thought they
+were using the register arrays, but it turned out they were using the
+arrays in procps instead.  makecontext(), [sg]etcontext() et al aren't
+implemented on mips, so any uses thereof will just return ENOSYS,
+without messing with the given data structure.  So, I believe it is
+not too late for us to fix it such that it matches the kernel data
+structures.
+
+While at that, I fixed a number of incompatibilities introduced by
+either differences between kernel headers that we used to include,
+whose contents are different depending on whether asm points to
+asm-mips or asm-mips64.
+
+With this patch, after some pending kernel patches are checked in, one
+will be able to obtain the correct information from signal handlers in
+all mips ABIs.  With n64, this is already true.  With o32, it works
+with the 32-bit mips kernel, but the mips64 kernel needs a patch to
+implement the proper sigcontext ABI.  n32 still a patch to be
+developed for it to be possible for ucontext to be POSIX-compliant.
+Currently, the kernel uses the same ucontext for n32 and n64, but this
+doesn't work in n32 because uc_link must be a pointer and stack_t must
+contain a pointer and a size_t, whose sizes differ between n32 and
+n64.  I believe Ralf is working on a patch for the kernel to generate
+n32-compliant ucontext when invoking signal handlers in n32 processes.
+The only uncertainty is whether uc_flags will be a 32- or 64-bit value
+in n32; I left it as the latter, just because I already had that in
+place; if it changes, a (simplifying) follow-up patch will be posted.
+However, I wanted to circulate the idea of fixing ucontext_t for o32
+as soon as possible, so I didn't wait for a decision on the exact n32
+ABI.
+
+Ok to install?
+
+
+--=-=-=
+Content-Type: text/x-patch
+Content-Disposition: inline; filename=mips-sigstuff.patch
+
+Index: ChangeLog
+from  Alexandre Oliva  <aoliva@redhat.com>
+
+	* sysdeps/unix/sysv/linux/mips/profil-counter: New.
+	* sysdeps/unix/sysv/linux/mips/sigcontextinfo.h: Port to n32/n64.
+	* sysdeps/unix/sysv/linux/mips/bits/sigcontext.h: New.
+	* sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Port to n32/n64.
+	(mcontext_t): Make it match the 32-bit mips kernel in o32.
+	* sysdeps/unix/sysv/linux/mips/sys/user.h: Bring in constants from
+	the mips and mips64 headers.
+	(struct user): Port to n32/n64.
+
+Index: sysdeps/unix/sysv/linux/mips/profil-counter.h
+===================================================================
+RCS file: sysdeps/unix/sysv/linux/mips/profil-counter.h
+diff -N sysdeps/unix/sysv/linux/mips/profil-counter.h
+--- /dev/null	1 Jan 1970 00:00:00 -0000
++++ libc/sysdeps/unix/sysv/linux/mips/profil-counter.h 12 Apr 2003 09:13:13 -0000
+@@ -0,0 +1,2 @@
++/* We can use the ix86 version.  */
++#include <sysdeps/unix/sysv/linux/i386/profil-counter.h>
+Index: sysdeps/unix/sysv/linux/mips/sigcontextinfo.h
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h,v
+retrieving revision 1.6
+diff -u -p -r1.6 sigcontextinfo.h
+--- libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h 6 Jul 2001 04:56:18 -0000 1.6
++++ libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h 12 Apr 2003 09:13:13 -0000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
++/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Andreas Jaeger <aj@suse.de>, 2000.
+ 
+@@ -18,6 +18,8 @@
+    02111-1307 USA.  */
+ 
+ 
++#if _MIPS_SIM == _MIPS_SIM_ABI32
++
+ #define SIGCONTEXT unsigned long _code, struct sigcontext *
+ #define SIGCONTEXT_EXTRA_ARGS _code,
+ #define GET_PC(ctx)	((void *) ctx->sc_pc)
+@@ -25,3 +27,15 @@
+ #define GET_STACK(ctx)	((void *) ctx->sc_regs[29])
+ #define CALL_SIGHANDLER(handler, signo, ctx) \
+   (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
++
++#else
++
++#define SIGCONTEXT unsigned long _code, ucontext_t *
++#define SIGCONTEXT_EXTRA_ARGS _code,
++#define GET_PC(ctx)	((void *) ctx->uc_mcontext.pc)
++#define GET_FRAME(ctx)	((void *) ctx->uc_mcontext.gregs[30])
++#define GET_STACK(ctx)	((void *) ctx->uc_mcontext.gregs[29])
++#define CALL_SIGHANDLER(handler, signo, ctx) \
++  (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
++
++#endif
+Index: sysdeps/unix/sysv/linux/mips/bits/sigcontext.h
+===================================================================
+RCS file: sysdeps/unix/sysv/linux/mips/bits/sigcontext.h
+diff -N sysdeps/unix/sysv/linux/mips/bits/sigcontext.h
+--- /dev/null	1 Jan 1970 00:00:00 -0000
++++ libc/sysdeps/unix/sysv/linux/mips/bits/sigcontext.h 12 Apr 2003 09:13:13 -0000
+@@ -0,0 +1,103 @@
++/* Copyright (C) 1996, 1997, 1998, 2003 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
++# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
++#endif
++
++#ifndef sigcontext_struct
++/* Kernel headers before 2.1.1 define a struct sigcontext_struct, but
++   we need sigcontext.  */
++# define sigcontext_struct sigcontext
++
++/* # include <asm/sigcontext.h> */
++/* Instead of including the kernel header, that will vary depending on
++   whether the 32- or the 64-bit kernel is installed, we paste the
++   contents here.  In case you're wondering about the different
++   licenses, the fact that the file is pasted, instead of included,
++   doesn't really make any difference for the program that includes
++   this header.  */
++#if _MIPS_SIM == _MIPS_SIM_ABI32
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 1996, 1997, 2000 by Ralf Baechle
++ */
++#ifndef _ASM_SIGCONTEXT_H
++#define _ASM_SIGCONTEXT_H
++
++/*
++ * Keep this struct definition in sync with the sigcontext fragment
++ * in arch/mips/tools/offset.c
++ */
++struct sigcontext {
++	unsigned int       sc_regmask;		/* Unused */
++	unsigned int       sc_status;
++	unsigned long long sc_pc;
++	unsigned long long sc_regs[32];
++	unsigned long long sc_fpregs[32];
++	unsigned int       sc_ownedfp;		/* Unused */
++	unsigned int       sc_fpc_csr;
++	unsigned int       sc_fpc_eir;		/* Unused */
++	unsigned int       sc_used_math;
++	unsigned int       sc_ssflags;		/* Unused */
++	unsigned long long sc_mdhi;
++	unsigned long long sc_mdlo;
++
++	unsigned int       sc_cause;		/* Unused */
++	unsigned int       sc_badvaddr;		/* Unused */
++
++	unsigned long      sc_sigset[4];	/* kernel's sigset_t */
++};
++
++#endif /* _ASM_SIGCONTEXT_H */
++#else /* _MIPS_SIM != _MIPS_SIM_ABI32 */
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 1996, 1997, 1999 by Ralf Baechle
++ * Copyright (C) 1999 Silicon Graphics, Inc.
++ */
++#ifndef _ASM_SIGCONTEXT_H
++#define _ASM_SIGCONTEXT_H
++
++/*
++ * Keep this struct definition in sync with the sigcontext fragment
++ * in arch/mips/tools/offset.c
++ */
++struct sigcontext {
++	unsigned long long sc_regs[32];
++	unsigned long long sc_fpregs[32];
++	unsigned long long sc_mdhi;
++	unsigned long long sc_mdlo;
++	unsigned long long sc_pc;
++	unsigned int       sc_status;
++	unsigned int       sc_fpc_csr;
++	unsigned int       sc_fpc_eir;
++	unsigned int       sc_used_math;
++	unsigned int       sc_cause;
++	unsigned int       sc_badvaddr;
++};
++
++#endif /* _ASM_SIGCONTEXT_H */
++#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */
++#endif
+[hunk deleted, see below]
+Index: sysdeps/unix/sysv/linux/mips/sys/user.h
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/sys/user.h,v
+retrieving revision 1.1
+diff -u -p -r1.1 user.h
+--- libc/sysdeps/unix/sysv/linux/mips/sys/user.h 8 Feb 2002 16:21:00 -0000 1.1
++++ libc/sysdeps/unix/sysv/linux/mips/sys/user.h 12 Apr 2003 09:13:13 -0000
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2002 Free Software Foundation, Inc.
++/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -23,7 +23,154 @@
+    too much into it.  Don't use it for anything other than GDB unless
+    you know what you are doing.  */
+ 
+-#include <asm/reg.h>
++/* #include <asm/reg.h> */
++/* Instead of including the kernel header, that will vary depending on
++   whether the 32- or the 64-bit kernel is installed, we paste its
++   contents here.  Note that the fact that the file is inline here,
++   instead of included separately, doesn't change in any way the
++   licensing status of a program that includes user.h.  Since this is
++   for gdb alone, and gdb is GPLed, no surprises here.  */
++#if _MIPS_SIM == _MIPS_SIM_ABI32
++/*
++ * Various register offset definitions for debuggers, core file
++ * examiners and whatnot.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 1995, 1999 by Ralf Baechle
++ */
++#ifndef __ASM_MIPS_REG_H
++#define __ASM_MIPS_REG_H
++
++/*
++ * This defines/structures correspond to the register layout on stack -
++ * if the order here is changed, it needs to be updated in
++ * include/asm-mips/stackframe.h
++ */
++#define EF_REG0			6
++#define EF_REG1			7
++#define EF_REG2			8
++#define EF_REG3			9
++#define EF_REG4			10
++#define EF_REG5			11
++#define EF_REG6			12
++#define EF_REG7			13
++#define EF_REG8			14
++#define EF_REG9			15
++#define EF_REG10		16
++#define EF_REG11		17
++#define EF_REG12		18
++#define EF_REG13		19
++#define EF_REG14		20
++#define EF_REG15		21
++#define EF_REG16		22
++#define EF_REG17		23
++#define EF_REG18		24
++#define EF_REG19		25
++#define EF_REG20		26
++#define EF_REG21		27
++#define EF_REG22		28
++#define EF_REG23		29
++#define EF_REG24		30
++#define EF_REG25		31
++/*
++ * k0/k1 unsaved
++ */
++#define EF_REG28		34
++#define EF_REG29		35
++#define EF_REG30		36
++#define EF_REG31		37
++
++/*
++ * Saved special registers
++ */
++#define EF_LO			38
++#define EF_HI			39
++
++#define EF_CP0_EPC		40
++#define EF_CP0_BADVADDR		41
++#define EF_CP0_STATUS		42
++#define EF_CP0_CAUSE		43
++
++#define EF_SIZE			180	/* size in bytes */
++
++#endif /* __ASM_MIPS_REG_H */
++
++#else /* _MIPS_SIM != _MIPS_SIM_ABI32 */
++
++/*
++ * Various register offset definitions for debuggers, core file
++ * examiners and whatnot.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 1995, 1999 Ralf Baechle
++ * Copyright (C) 1995, 1999 Silicon Graphics
++ */
++#ifndef _ASM_REG_H
++#define _ASM_REG_H
++
++/*
++ * This defines/structures correspond to the register layout on stack -
++ * if the order here is changed, it needs to be updated in
++ * include/asm-mips/stackframe.h
++ */
++#define EF_REG0			 0
++#define EF_REG1			 1
++#define EF_REG2			 2
++#define EF_REG3			 3
++#define EF_REG4			 4
++#define EF_REG5			 5
++#define EF_REG6			 6
++#define EF_REG7			 7
++#define EF_REG8			 8
++#define EF_REG9			 9
++#define EF_REG10		10
++#define EF_REG11		11
++#define EF_REG12		12
++#define EF_REG13		13
++#define EF_REG14		14
++#define EF_REG15		15
++#define EF_REG16		16
++#define EF_REG17		17
++#define EF_REG18		18
++#define EF_REG19		19
++#define EF_REG20		20
++#define EF_REG21		21
++#define EF_REG22		22
++#define EF_REG23		23
++#define EF_REG24		24
++#define EF_REG25		25
++/*
++ * k0/k1 unsaved
++ */
++#define EF_REG28		28
++#define EF_REG29		29
++#define EF_REG30		30
++#define EF_REG31		31
++
++/*
++ * Saved special registers
++ */
++#define EF_LO			32
++#define EF_HI			33
++
++#define EF_CP0_EPC		34
++#define EF_CP0_BADVADDR		35
++#define EF_CP0_STATUS		36
++#define EF_CP0_CAUSE		37
++
++#define EF_SIZE			304	/* size in bytes */
++
++#endif /* _ASM_REG_H */
++
++#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */
++
++#if _MIPS_SIM == _MIPS_SIM_ABI32
+ 
+ struct user
+ {
+@@ -39,6 +186,24 @@ struct user
+   unsigned long	magic;			/* identifies a core file */
+   char		u_comm[32];		/* user command name */
+ };
++
++#else
++
++struct user {
++  __extension__ unsigned long	regs[EF_SIZE/8+64]; /* integer and fp regs */
++  __extension__ unsigned long	u_tsize;	/* text size (pages) */
++  __extension__ unsigned long	u_dsize;	/* data size (pages) */
++  __extension__ unsigned long	u_ssize;	/* stack size (pages) */
++  __extension__ unsigned long long start_code;	/* text starting address */
++  __extension__ unsigned long long start_data;	/* data starting address */
++  __extension__ unsigned long long start_stack;	/* stack starting address */
++  __extension__ long long	signal;		/* signal causing core dump */
++  __extension__ unsigned long long u_ar0;	/* help gdb find registers */
++  __extension__ unsigned long long magic;	/* identifies a core file */
++  char		u_comm[32];		/* user command name */
++};
++
++#endif
+ 
+ #define PAGE_SHIFT		12
+ #define PAGE_SIZE		(1UL << PAGE_SHIFT)
+
+--=-=-=
+
+
+-- 
+Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
+Red Hat GCC Developer                 aoliva@{redhat.com, gcc.gnu.org}
+CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
+Free Software Evangelist                Professional serial bug killer
+
+--=-=-=--
+
+And the rediffed hunk:
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h.old	2004-05-30 07:23:32.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h	2004-05-30 07:22:56.000000000 -0700
+@@ -29,43 +29,72 @@
+ #include <bits/sigcontext.h>
+ 
+ 
+-/* Type for general register.  */
+-typedef unsigned long int greg_t;
++/* Type for general register.  Even in o32 we assume 64-bit registers,
++   like the kernel.  */
++__extension__ typedef unsigned long long int greg_t;
+ 
+ /* Number of general registers.  */
+-#define NGREG	37
+-#define NFPREG	33
++#define NGREG	32
++#define NFPREG	32
+ 
+ /* Container for all general registers.  */
+-/* gregset_t must be an array.  The below declared array corresponds to:
+-typedef struct gregset {
+-	greg_t	g_regs[32];
+-	greg_t	g_hi;
+-	greg_t	g_lo;
+-	greg_t	g_pad[3];
+-} gregset_t;  */
+ typedef greg_t gregset_t[NGREG];
+ 
+ /* Container for all FPU registers.  */
+ typedef struct fpregset {
+ 	union {
+-		double	fp_dregs[32];
++		double	fp_dregs[NFPREG];
+ 		struct {
+ 			float		_fp_fregs;
+ 			unsigned int	_fp_pad;
+-		} fp_fregs[32];
++		} fp_fregs[NFPREG];
+ 	} fp_r;
+-	unsigned int	fp_csr;
+-	unsigned int	fp_pad;
+ } fpregset_t;
+ 
+ 
+ /* Context to describe whole processor state.  */
++#if _MIPS_SIM == _MIPS_SIM_ABI32
++/* Earlier versions of glibc for mips had an entirely different
++   definition of mcontext_t, that didn't even resemble the
++   corresponding kernel data structure.  Since all legitimate uses of
++   ucontext_t in glibc mustn't have accessed anything beyond
++   uc_mcontext and, even then, taking a pointer to it, casting it to
++   sigcontext_t, and accessing it as such, which is what it has always
++   been, this can still be rectified.  Fortunately, makecontext,
++   [gs]etcontext et all have never been implemented.  */
+ typedef struct
+   {
++    unsigned int regmask;
++    unsigned int status;
++    greg_t pc;
+     gregset_t gregs;
+     fpregset_t fpregs;
++    unsigned int fp_owned;
++    unsigned int fpc_csr;
++    unsigned int fpc_eir;
++    unsigned int used_math;
++    unsigned int ssflags;
++    greg_t mdhi;
++    greg_t mdlo;
++    unsigned int cause;
++    unsigned int badvaddr;
+   } mcontext_t;
++#else
++typedef struct
++  {
++    gregset_t gregs;
++    fpregset_t fpregs;
++    greg_t mdhi;
++    greg_t mdlo;
++    greg_t pc;
++    unsigned int status;
++    unsigned int fpc_csr;
++    unsigned int fpc_eir;
++    unsigned int used_math;
++    unsigned int cause;
++    unsigned int badvaddr;
++  } mcontext_t;
++#endif
+ 
+ /* Userlevel context.  */
+ typedef struct ucontext
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-mips.patch b/patches/glibc/2.3.2/glibc-2.3.2-mips.patch
new file mode 100644
index 00000000..20944294
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-mips.patch
@@ -0,0 +1,60 @@
+From Bill Gatliff, who said:
+"Attached is a glibc-2.3.2 patchfile I use for MIPS.  Versions prior to and including glibc-2.3.2 won't build without it."
+
+diff -bBurN glibc-2.3.2.orig/elf/dl-conflict.c glibc-2.3.2/elf/dl-conflict.c
+--- glibc-2.3.2.orig/elf/dl-conflict.c	2003-06-12 21:07:54.000000000 -0500
++++ glibc-2.3.2/elf/dl-conflict.c	2003-06-12 21:09:12.000000000 -0500
+@@ -33,6 +33,7 @@
+ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
+ 		       ElfW(Rela) *conflictend)
+ {
++#ifndef _DL_HAVE_NO_ELF_MACHINE_RELA
+   if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
+     _dl_printf ("\nconflict processing: %s\n",
+ 		l->l_name[0] ? l->l_name : rtld_progname);
+@@ -64,4 +65,5 @@
+     for (; conflict < conflictend; ++conflict)
+       elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset);
+   }
++#endif
+ }
+diff -bBurN glibc-2.3.2.orig/sysdeps/mips/dl-machine.h glibc-2.3.2/sysdeps/mips/dl-machine.h
+--- glibc-2.3.2.orig/sysdeps/mips/dl-machine.h	2003-06-12 21:07:49.000000000 -0500
++++ glibc-2.3.2/sysdeps/mips/dl-machine.h	2003-06-12 21:11:10.000000000 -0500
+@@ -56,6 +56,10 @@
+ #define ELF_MACHINE_JMP_SLOT			R_MIPS_REL32
+ #define elf_machine_type_class(type)		ELF_RTYPE_CLASS_PLT
+ 
++/* MIPS doesn't support RELA; see:
++   http://lists.debian.org/debian-mips/2002/debian-mips-200209/msg00020.html */
++#define _DL_HAVE_NO_ELF_MACHINE_RELA
++
+ /* Translate a processor specific dynamic tag to the index
+    in l_info array.  */
+ #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM)
+diff -bBurN glibc-2.3.2.orig/sysdeps/mips/Makefile glibc-2.3.2/sysdeps/mips/Makefile
+--- glibc-2.3.2.orig/sysdeps/mips/Makefile	2003-06-12 21:07:48.000000000 -0500
++++ glibc-2.3.2/sysdeps/mips/Makefile	2003-06-12 21:10:14.000000000 -0500
+@@ -6,3 +6,11 @@
+ ifeq ($(subdir),setjmp)
+ sysdep_routines += setjmp_aux
+ endif
++
++ifeq ($(subdir),csu)
++ifeq (yes,$(build-shared))
++# Compatibility
++sysdep_routines += divdi3
++shared-only-routines += divdi3
++endif
++endif
+diff -bBurN glibc-2.3.2.orig/sysdeps/unix/sysv/linux/mips/syscalls.list glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list
+--- glibc-2.3.2.orig/sysdeps/unix/sysv/linux/mips/syscalls.list	2003-06-12 21:07:53.000000000 -0500
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list	2003-06-12 21:12:30.000000000 -0500
+@@ -41,6 +41,7 @@
+ sys_mknod	xmknod	mknod		i:sii	__syscall_mknod
+ 
+ # System calls with wrappers.
++s_readahead     EXTRA   readahead       i:iipi  __syscall_readahead
+ rt_sigaction	-	rt_sigaction	i:ippi	__syscall_rt_sigaction
+ rt_sigpending	-	rt_sigpending	i:pi	__syscall_rt_sigpending
+ rt_sigprocmask	-	rt_sigprocmask	i:ippi	__syscall_rt_sigprocmask
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-override.patch b/patches/glibc/2.3.2/glibc-2.3.2-override.patch
new file mode 100644
index 00000000..17c999d1
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-override.patch
@@ -0,0 +1,38 @@
+The error
+
+make[2]: *** [.../gcc-3.3.3-glibc-2.1.3/i686-unknown-linux-gnu/share/zoneinfo/Africa/Algiers] Segmentation fault
+make[2]: Leaving directory `.../gcc-3.3.3-glibc-2.1.3/glibc-2.1.3/timezone'
+make[1]: *** [timezone/subdir_install] Error 2
+
+is caused by glibc trying to run something it just compiled.
+A crude workaround for this was posted at
+http://lists.scratchbox.org/pipermail/scratchbox-users/2004-February/000018.html
+but the following patch lets you optionally override these programs at
+make time by setting Make variables 
+  localedef_FOR_BUILD rpcgen_FOR_BUILD zic_FOR_BUILD
+and maybe a few others to point to versions of those programs
+that can run on the build machine.
+Thanks to http://groups.google.com/groups?selm=9012160052.AA23106%40kaos.ksr.com
+for pointing out the idiom for inline $(ifdef ...) in GNU Make.
+
+Dan Kegel 2004-05-17
+[rediffed for glibc-2.3.2]
+[typos corrected - those are make variables, not environment variables,
+ and it's $(built-program-override-name), not $(build-program-override-name)]
+
+--- glibc-2.3.2/Makeconfig.old	2004-05-17 13:53:46.000000000 -0700
++++ glibc-2.3.2/Makeconfig	2004-05-17 14:09:59.000000000 -0700
+@@ -534,9 +534,12 @@
+ run-program-prefix =
+ endif
+ # Never use $(run-program-prefix) for the statically-linked %-bp test programs
+-built-program-cmd = $(patsubst %,$(run-program-prefix),\
++built-program-real = $(patsubst %,$(run-program-prefix),\
+ 			$(filter-out %-bp,$(built-program-file))) \
+ 		    $(built-program-file)
++# If user set foo_FOR_BUILD, use that instead of actually running the program we just linked.
++built-program-override-name = $(notdir $(word 2,$^))_FOR_BUILD
++built-program-cmd = $(if $(findstring undefined,$(origin $(built-program-override-name))),$(built-program-real),$($(built-program-override-name)))
+ 
+ ifndef LD
+ LD := ld -X
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch b/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch
new file mode 100644
index 00000000..02c72b1c
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch
@@ -0,0 +1,58 @@
+Retrieved from
+  http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc32/Makefile.diff?r1=1.4&r2=1.5&cvsroot=glibc
+  http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.2&r2=1.3&cvsroot=glibc
+Fixes
+ /tmp/ccEVhqgD.s:279: Error: Unrecognized opcode: `stvx'
+ /tmp/ccEVhqgD.s:288: Error: Unrecognized opcode: `lvx'
+ make[2]: *** [powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/dlfcn/eval.os] Error 1
+ make[2]: Leaving directory `powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/dlfcn'
+ make[1]: *** [dlfcn/others] Error 2
+ make[1]: Leaving directory `powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2'
+ make: *** [all] Error 2
+
+
+Revision 1.5 Wed Oct 22 21:30:02 2003 UTC (7 months, 1 week ago) by roland
+Branch: MAIN
+CVS Tags: HEAD
+Changes since 1.4: +0 -3 lines
+Diff to previous 1.4 (colored)
+
+2003-10-22  Steven Munroe  <sjmunroe@us.ibm.com>
+
+	* sysdeps/powerpc/powerpc32/Makefile (+cflags, asm-CPPFLAGS): Don't
+	append options to these.
+	* sysdeps/powerpc/powerpc64/Makefile (+cflags, asm-CPPFLAGS): Likewise.
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc32/Makefile,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/sysdeps/powerpc/powerpc32/Makefile	2003/01/27 21:02:01	1.4
++++ libc/sysdeps/powerpc/powerpc32/Makefile	2003/10/22 21:30:02	1.5
+@@ -1,8 +1,5 @@
+ # Powerpc32 specific build options.
+ 
+-+cflags += -Wa,-mppc -mpowerpc
+-asm-CPPFLAGS += -Wa,-mppc
+-
+ ifeq ($(with-fp),no)
+ +cflags += -msoft-float
+ sysdep-LDFLAGS += -msoft-float
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/sysdeps/powerpc/powerpc64/Makefile	2002/09/27 19:44:16	1.2
++++ libc/sysdeps/powerpc/powerpc64/Makefile	2003/10/22 21:30:03	1.3
+@@ -1,9 +1,6 @@
+ # Powerpc64 specific build options.
+ # this is ./sysdeps/powerpc/powerpc64/Makefile
+ 
+-+cflags += -Wa,-mppc64 -mpowerpc64
+-asm-CPPFLAGS += -Wa,-mppc64
+-
+ # Each TOC entry takes 8 bytes and the TOC holds up to 2^16 bytes,
+ # or 8192 entries.
+ # If -fpic is not specified, the latest gcc-3.2.1 now generates
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch b/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch
new file mode 100644
index 00000000..96e8fb3b
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch
@@ -0,0 +1,104 @@
+2004-04-29  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c (_Qp_qtoi): Use %f31
+	for single precision register, add it to __asm clobbers [BZ #139].
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c (_Qp_qtoui): Use %f31
+	for single precision register, add it to __asm clobbers.
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c (_Qp_qtoux): Use fqtox
+	instead of fqtoi in QP_HANDLE_EXCEPTIONS.
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtox.c (_Qp_qtox): Likewise.
+	Reported by M. H. VanLeeuwen <vanl@megsinet.net>.
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=139
+Fixes error
+qp_qtoi.s:261: Error: Illegal operands: There are only 32 single precision f registers; [0-31]
+plus a couple other things vanl noticed.
+
+diff -ur orig/qp_qtoi.c new/qp_qtoi.c
+--- orig/qp_qtoi.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (int)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,9 +38,9 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
+-"	st %%f60, [%0]\n"
+-"	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
++"	fqtoi %%f52, %%f31\n"
++"	st %%f31, [%0]\n"
++"	" : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31");
+ 	r = rx);
+ 
+   return r;
+diff -ur orig/qp_qtoui.c new/qp_qtoui.c
+--- orig/qp_qtoui.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (unsigned int)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,9 +38,9 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
+-"	st %%f60, [%0]\n"
+-"	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
++"	fqtoi %%f52, %%f31\n"
++"	st %%f31, [%0]\n"
++"	" : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31");
+ 	r = rx);
+ 
+   return r;
+diff -ur orig/qp_qtoux.c new/qp_qtoux.c
+--- orig/qp_qtoux.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (unsigned long)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,7 +38,7 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
++"	fqtox %%f52, %%f60\n"
+ "	std %%f60, [%0]\n"
+ "	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
+ 	r = rx);
+diff -ur orig/qp_qtox.c new/qp_qtox.c
+--- orig/qp_qtox.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (long)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,7 +38,7 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
++"	fqtox %%f52, %%f60\n"
+ "	std %%f60, [%0]\n"
+ "	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
+ 	r = rx);
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch b/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch
new file mode 100644
index 00000000..51de6c8b
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch
@@ -0,0 +1,39 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sh/socket.S.diff?r1=1.5&r2=1.6&cvsroot=glibc
+
+Ankur Sheth said:
+"The problem that I ran into was that multi-threaded apps would crash with a
+seg fault when they invoked some of the socket calls (sendto() in my case.
+This happened only on the sh4.  Turns out that a certain register (PR) was
+not being saved and restored properly before and after invoking the system
+call.  This patch fixes it.  It applies cleanly on glibc 2.3.2. 
+[Thanks to Kaz for helping us find this.]"
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sh/socket.S,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/sysdeps/unix/sysv/linux/sh/socket.S	2003/01/05 11:07:44	1.5
++++ libc/sysdeps/unix/sysv/linux/sh/socket.S	2003/07/12 01:25:53	1.6
+@@ -94,7 +94,9 @@
+ #if defined NEED_CANCELLATION && defined CENABLE
+ .Lsocket_cancel:
+ 	/* Enable asynchronous cancellation.  */
++	sts.l pr,@-r15
+ 	CENABLE
++	lds.l @r15+,pr
+ 
+ 	/* Do the system call trap.  */
+ 	mov #+P(SOCKOP_,socket), r4
+@@ -102,9 +104,11 @@
+ 	mov.l .L1,r3
+ 	trapa #0x12
+ 
++	sts.l pr,@-r15
+ 	mov.l r0,@-r15
+ 	CDISABLE
+ 	mov.l @r15+,r0
++	lds.l @r15+,pr
+ 
+ 	/* Pop args off the stack */
+ 	P(POPARGS_,NARGS)
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch b/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch
new file mode 100644
index 00000000..f93bb6fb
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch
@@ -0,0 +1,55 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sh/sysdep.h.diff?r1=1.9&r2=1.10&cvsroot=glibc
+
+Ankur Sheth said:
+
+"This is actually a workaround for a bug in the sh4.  The actual bug is
+documented here :
+http://documentation.renesas.com/eng/products/mpumcu/tu/tnsh7456ae.pdf
+Basically the cache & TLB should not be accessed for 4 (or was it 5?) cycles
+after isssuing a TRAPA instruction.  I didn't run into any specific problem
+because of this bug, but it seems useful to have and the patch itself seems
+pretty harmless."
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sh/sysdep.h,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- libc/sysdeps/unix/sysv/linux/sh/sysdep.h	2003/09/01 04:05:21	1.9
++++ libc/sysdeps/unix/sysv/linux/sh/sysdep.h	2003/10/15 04:36:32	1.10
+@@ -183,6 +183,13 @@
+ # endif	/* _LIBC_REENTRANT */
+ #endif	/* PIC */
+ 
++# ifdef NEED_SYSCALL_INST_PAD
++#  define SYSCALL_INST_PAD \
++	or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0
++# else
++#  define SYSCALL_INST_PAD
++# endif
++
+ #define SYSCALL_INST0	trapa #0x10
+ #define SYSCALL_INST1	trapa #0x11
+ #define SYSCALL_INST2	trapa #0x12
+@@ -195,19 +202,13 @@
+ #define DO_CALL(syscall_name, args)	\
+     mov.l 1f,r3;			\
+     SYSCALL_INST##args;			\
++    SYSCALL_INST_PAD;			\
+     bra 2f;				\
+      nop;				\
+     .align 2;				\
+  1: .long SYS_ify (syscall_name);	\
+  2:
+ 
+-# ifdef NEED_SYSCALL_INST_PAD
+-#  define SYSCALL_INST_PAD \
+-	or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0
+-# else
+-#  define SYSCALL_INST_PAD
+-# endif
+-
+ #else /* not __ASSEMBLER__ */
+ 
+ #define SYSCALL_INST_STR0	"trapa #0x10\n\t"
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch
new file mode 100644
index 00000000..289f66e6
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch
@@ -0,0 +1,46 @@
+Fixes the error
+
+<stdin>: Assembler messages:
+<stdin>:2: Error: junk at end of line, first unrecognized character is `1' ...
+<stdin>:2: Error: Illegal operands: PC-relative operand can't be a constant
+make[4]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-open.os] Error 1
+make[4]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/io'
+make[3]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-xstat64.os] Error 2
+make[3]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf'
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/rtld-libc.a] Error 2
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf'
+make[1]: *** [elf/subdir_lib] Error 2
+
+when building glibc-2.3.2 with gcc-3.4.0 for sparc32.
+
+The .s file left behind by -save-temps contains the big long line
+
+.text; .global __libc_open; .align 4; __libc_open:; .type __libc_open,@function;; mov 5, %g1; ta 0x10; bcs __syscall_error_handler; nop; .section .gnu.linkonce.t. 1 .get_pic.l7,"ax",@progbits; .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; .type 1 .get_pic.l7,@function; 1 .get_pic.l7: retl; add %o7, %l7, %l7; .previous; .subsection 3; __syscall_error_handler: save %sp,-96,%sp; sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; call 1 .get_pic.l7; add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; ld [%l7 + errno], %l0; st %i0, [%l0]; jmpl %i7+8, %g0; restore %g0, -1, %o0; .previous;
+ retl; nop 
+ 
+The error messages appear to refer to the '1 .get_pic.17', e.g.
+        .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7;
+which seems to come from
+glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+where it appears originally as
+        .globl __sparc.get_pic.l7;                                      \
+        .hidden __sparc.get_pic.l7;                                     \
+
+Note that __sparc is a predefined symbol on Solaris and some other environments;
+it's not surprising to see it predefined on Linux, too.
+
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.old	2004-05-15 10:23:11.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h	2004-05-15 10:24:12.000000000 -0700
+@@ -39,6 +39,11 @@
+ #undef END
+ #undef LOC
+ 
++/* gcc-3.4.0 seems to expand __sparc as a predefined preprocessor symbol, which we don't want here */
++#ifdef __sparc
++#undef __sparc
++#endif
++
+ #define ENTRY(name) \
+ 	.global C_SYMBOL_NAME(name); \
+ 	.align 4;\
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch
new file mode 100644
index 00000000..20cb7998
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch
@@ -0,0 +1,29 @@
+See http://gcc.gnu.org/PR15345
+
+Quick kludge by H.J.Lu
+Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64:
+
+.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3':
+: undefined reference to `_DYNAMIC'
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1
+
+
+--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig	Sat May  8 20:54:26 2004
++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h	Sat May  8 17:18:04 2004
+@@ -65,6 +65,7 @@
+ }
+ 
+ /* Return the run-time load address of the shared object.  */
++#ifdef IS_IN_rtld
+ static inline Elf64_Addr
+ elf_machine_load_address (void)
+ {
+@@ -84,6 +85,7 @@
+      pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12  */
+   return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4;
+ }
++#endif
+ 
+ /* We have 4 cases to handle.  And we code different code sequences
+    for each one.  I love V9 code models...  */
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch
new file mode 100644
index 00000000..13e33812
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch
@@ -0,0 +1,22 @@
+From: "M.H.VanLeeuwen" 
+Subject: crosstool, sparc64, linux 2.6.4, gcc 3.3.3, glibc 2.3.2 success
+Date: Mon, 15 Mar 2004 00:23:04 -0600
+To: crossgcc@sources.redhat.com
+Message-ID: <40554BC8.749A5EC3@megsinet.net>
+...
+
+backported from GLIBC CVS
+
+Fixes:
+../sysdeps/unix/sysv/linux/sparc/sparc64/pause.c:1:39: sysdeps/unix/common/pause.c: No such file or directory
+make[2]: *** [/cross/build/sparc64-unknown-linux-gnu/gcc-3.3.2-glibc-2.3.2/build-glibc/posix/pause.o] Error 1
+make[2]: Leaving directory `/cross/build/sparc64-unknown-linux-gnu/gcc-3.3.2-glibc-2.3.2/glibc-2.3.2/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make: *** [all] Error 2
+
+=========================================================================================================================
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c.orig	Sun Mar  7 08:51:20 2004
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c	Sun Mar  7 08:51:29 2004
+@@ -1 +1 @@
+-#include <sysdeps/unix/common/pause.c>
++#include <sysdeps/posix/pause.c>
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch
new file mode 100644
index 00000000..9eefe578
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch
@@ -0,0 +1,36 @@
+Fix for this error:
+
+/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/libc_pic.os(.text+0xc4d28): In function `posix_fallocate64':
+: undefined reference to `__GI___pwrite64'
+collect2: ld returned 1 exit status
+make[1]: *** [/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/libc.so] Error 1
+
+extracted from GLIBC CVS by M.H.VanLeeuwen
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+Originally thought we needed this hunk, too:
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html
+but it seems the sysdep.h change is sufficient, and works better 
+when compiling against linux-2.4.
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h.orig	Sat Mar 13 02:01:51 2004
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h	Sat Mar 13 02:02:20 2004
+@@ -29,6 +29,16 @@
+ #undef SYS_ify
+ #define SYS_ify(syscall_name) __NR_##syscall_name
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ #ifdef __ASSEMBLER__
+ 
+ #define LOADSYSCALL(x) mov __NR_##x, %g1
diff --git a/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch b/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch
new file mode 100644
index 00000000..76cdfaad
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch
@@ -0,0 +1,89 @@
+Sender: libc-alpha-owner@sources.redhat.com
+Date: Tue, 29 Jul 2003 17:49:47 -0400
+From: Daniel Jacobowitz <drow@mvista.com>
+To: GNU C Library <libc-alpha@sources.redhat.com>
+Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp
+Message-ID: <20030729214947.GA29932@nevyn.them.org>
+
+On Tue, Jul 29, 2003 at 02:53:33PM -0700, Dan Kegel wrote:
+> On ppc405, I'm getting the following when linking glibc's libm:
+> /gcc-3.3-glibc-2.3.2/build-glibc/math/libm_pic.a(fclrexcpt.os)(.text+0x1a): 
+> In function `feclearexcept@GLIBC_2.1':
+> : undefined reference to `__sim_exceptions'
+> 
+> That symbol seems to be present in libc.so.  nm shows
+
+--without-fp doesn't work.  Try this.  Make up a changelog entry if it
+works.
+
+Date: Tue, 29 Jul 2003 14:56:50 -0700
+Message-Id: <200307292156.h6TLuol24356@magilla.sf.frob.com>
+From: Roland McGrath <roland@redhat.com>
+To: Daniel Jacobowitz <drow@mvista.com>
+Cc: GNU C Library <libc-alpha@sources.redhat.com>
+Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp
+In-Reply-To: Daniel Jacobowitz's message of  Tuesday, 29 July 2003 17:49:47 -0400 <20030729214947.GA29932@nevyn.them.org>
+
+> +int __sim_exceptions __attribute__ ((section(".bss")));
+
+Use __attribute__ ((nocommon)) instead (and please watch the standard
+whitespace conventions, i.e. ``section ('').
+
+diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c
+--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c	2002-10-19 16:06:29.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c	2003-05-14 15:10:42.000000000 -0400
+@@ -24,11 +24,14 @@
+ 
+ /* Global to store sticky exceptions.  */
+-int __sim_exceptions;
++int __sim_exceptions __attribute__ ((nocommon));
++libc_hidden_data_def (__sim_exceptions);
+ 
+ /* By default, no exceptions should trap.  */
+ int __sim_disabled_exceptions = 0xffffffff;
++libc_hidden_data_def (__sim_disabled_exceptions);
+ 
+-int __sim_round_mode;
++int __sim_round_mode __attribute__ ((nocommon));
++libc_hidden_data_def (__sim_round_mode);
+ 
+ void
+ __simulate_exceptions (int x)
+diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h
+--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h	2002-10-19 16:06:29.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h	2003-05-14 15:09:53.000000000 -0400
+@@ -27,7 +27,11 @@ typedef union
+ } fenv_union_t;
+ 
+ 
+-extern int __sim_exceptions attribute_hidden;
+-extern int __sim_disabled_exceptions attribute_hidden;
+-extern int __sim_round_mode attribute_hidden;
++extern int __sim_exceptions;
++libc_hidden_proto (__sim_exceptions);
++extern int __sim_disabled_exceptions;
++libc_hidden_proto (__sim_disabled_exceptions);
++extern int __sim_round_mode;
++libc_hidden_proto (__sim_round_mode);
++
+ extern void __simulate_exceptions (int x) attribute_hidden;
+diff -urp glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h
+--- glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h	2002-10-17 18:36:14.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h	2003-05-14 16:48:13.000000000 -0400
+@@ -52,7 +52,11 @@
+ #define FP_HANDLE_EXCEPTIONS  __simulate_exceptions (_fex)
+ #define FP_ROUNDMODE          __sim_round_mode
+ 
+-extern int __sim_exceptions attribute_hidden;
+-extern int __sim_disabled_exceptions attribute_hidden;
+-extern int __sim_round_mode attribute_hidden;
++extern int __sim_exceptions;
++libc_hidden_proto (__sim_exceptions);
++extern int __sim_disabled_exceptions;
++libc_hidden_proto (__sim_disabled_exceptions);
++extern int __sim_round_mode;
++libc_hidden_proto (__sim_round_mode);
++
+ extern void __simulate_exceptions (int x) attribute_hidden;
+
+
diff --git a/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch
new file mode 100644
index 00000000..3f568aee
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch
@@ -0,0 +1,30 @@
+Fixes following problem building glibc-2.3.3 with gcc-4.0:
+
+checking version of i686-unknown-linux-gnu-gcc ... 4.0.0, bad
+checking for gnumake... no
+checking for gmake... gmake
+checking version of gmake... 3.79.1, ok
+checking for gnumsgfmt... no
+checking for gmsgfmt... no
+checking for msgfmt... msgfmt
+checking version of msgfmt... 0.11.4, ok
+checking for makeinfo... makeinfo
+checking version of makeinfo... 4.3, ok
+checking for sed... sed
+checking version of sed... 4.0.5, ok
+checking for autoconf... autoconf
+checking whether autoconf works... yes
+configure: error:
+*** These critical programs are missing or too old: gcc
+
+--- glibc-2.3.3/configure.old	Mon Mar 14 12:01:10 2005
++++ glibc-2.3.3/configure	Mon Mar 14 12:02:03 2005
+@@ -3899,7 +3899,7 @@
+   ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    3.[2-9]*)
++    3.[2-9]*|4.[01]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
diff --git a/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch
new file mode 100644
index 00000000..0c824bcf
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch
@@ -0,0 +1,65 @@
+(Combined with earlier fix old/glibc-2.3.2-powerpc-procfs.patch
+from http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html)
+
+This fix discussed here:
+http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html
+
+Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050303T1335, HEAD
+Changes since 1.11: +3 -8 lines
+Diff to previous 1.11 (colored)
+
+2005-02-21  Alan Modra <amodra@bigpond.net.au>
+
+	* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't
+	use __uint128_t.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc
+
+Fixes
+
+In file included from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:44,
+                 from ../linuxthreads/internals.h:30,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from <stdin>:2:
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class
+make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu'
+
+Rediffed against glibc-2.3.3
+
+--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	Sun Jan 12 00:24:23 2003
++++ glibc-2.3.3.new/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	Fri Mar 18 11:20:58 2005
+@@ -45,18 +45,13 @@
+ 
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+-#endif
+-
+-/* gcc 3.1 and newer support __uint128_t.  */
+-#if !__GNUC_PREREQ(3,1)
+-typedef struct {
+-  unsigned long u[4];
+-} __attribute((aligned(16))) __uint128_t;
+-#endif
+ 
+ /* Altivec registers */
+-typedef __uint128_t elf_vrreg_t;
++typedef struct {
++  unsigned int u[4];
++} __attribute__ ((aligned (16))) elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
++#endif
+ 
+ struct elf_siginfo
+   {
diff --git a/patches/glibc/2.3.2/glibc-configure-apple-as.patch b/patches/glibc/2.3.2/glibc-configure-apple-as.patch
new file mode 100644
index 00000000..604c36d5
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-configure-apple-as.patch
@@ -0,0 +1,23 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3789,7 +3789,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
diff --git a/patches/glibc/2.3.2/glibc-drow-sh.patch b/patches/glibc/2.3.2/glibc-drow-sh.patch
new file mode 100644
index 00000000..82984e54
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-drow-sh.patch
@@ -0,0 +1,77 @@
+[pread changes deleted, since those seem to be specific to glibc-2.3.2]
+
+Date: Thu, 19 Jun 2003 20:02:07 -0400
+From: Daniel Jacobowitz <drow@false.org>
+Subject: [linux-sh:02808] Patch needed for CVS glibc on SH
+To: linux-sh@m17n.org, libc-alpha@sources.redhat.com
+Message-Id: <20030620000207.GA19907@nevyn.them.org>
+X-ML-Name: linux-sh
+X-Mail-Count: 02808
+X-MLServer: fml [fml 4.0.1]; post only (only members can post)
+X-ML-Info: If you have a question, send e-mail with the body
+	"help" (without quotes) to the address linux-sh-ctl@m17n.org;
+	help=<mailto:linux-sh-ctl@m17n.org?body=help>
+Mail-Followup-To: linux-sh@m17n.org, libc-alpha@sources.redhat.com
+Content-Disposition: inline
+User-Agent: Mutt/1.5.1i
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Precedence: bulk
+Lines: 74
+List-Software: fml [fml 4.0.1]
+List-Post: <mailto:linux-sh@m17n.org>
+List-Owner: <mailto:linux-sh-admin@m17n.org>
+List-Help: <mailto:linux-sh-ctl@m17n.org?body=help>
+List-Unsubscribe: <mailto:linux-sh-ctl@m17n.org?body=unsubscribe>
+List-Id: linux-sh.m17n.org
+
+I believe this flushes my current patches to make glibc work on SH.  Issues:
+ - MIPS pread functions have some wackiness in them for the MIPS calling
+   conventions, which align long longs to even register pairs; it appears
+   that SH does not do this.  This fixes pread64/pwrite64.
+ - st_ino is _NOT_ 64-bit in the latest SH kernel trees, or at least it
+   wasn't when I checked in April.  --enable-kernel=2.4.x breaks terribly
+   without this patch; the errors are along the lines of "version GLIBC_2.3
+   not found", because that's the first consequence of a messed up inode
+   field - ld.so compares by inodes at some point.
+
+-- 
+Daniel Jacobowitz
+MontaVista Software                         Debian GNU/Linux Developer
+
+2003-06-19  Daniel Jacobowitz  <drow@mvista.com>
+
+	* sysdeps/unix/sysv/linux/kernel-features.h: Update kernel features
+	for the SH architecture.
+	* sysdeps/unix/sysv/linux/sh/pread.c: Use generic Linux version
+	instead of the MIPS version.
+	* sysdeps/unix/sysv/linux/sh/pread64.c: Likewise.
+	* sysdeps/unix/sysv/linux/sh/pwrite.c: Likewise.
+	* sysdeps/unix/sysv/linux/sh/pwrite64.c: Likewise.
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h.org	2003-04-21 10:57:55.000000000 -0400
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h	2003-04-21 11:16:47.000000000 -0400
+@@ -151,11 +151,20 @@
+ 
+ /* The changed st_ino field appeared in 2.4.0-test6.  But we cannot
+    distinguish this version from other 2.4.0 releases.  Therefore play
+-   save and assume it available is for 2.4.1 and up.  */
+-#if __LINUX_KERNEL_VERSION >= 132097
++   save and assume it available is for 2.4.1 and up.  However, SH is lame,
++   and still does not have a 64-bit inode field.  */
++#if __LINUX_KERNEL_VERSION >= 132097 \
++    && !defined __sh__
+ # define __ASSUME_ST_INO_64_BIT		1
+ #endif
+ 
++/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test.  */
++#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__
++# define __ASSUME_TRUNCATE64_SYSCALL	1
++# define __ASSUME_MMAP2_SYSCALL		1
++# define __ASSUME_STAT64_SYSCALL	1
++#endif
++
+ /* To support locking of large files a new fcntl() syscall was introduced
+    in 2.4.0-test7.  We test for 2.4.1 for the earliest version we know
+    the syscall is available.  */
+
diff --git a/patches/glibc/2.3.2/glibc-fp-byteorder.patch b/patches/glibc/2.3.2/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..f20432ea
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-fp-byteorder.patch
@@ -0,0 +1,203 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
diff --git a/patches/glibc/2.3.2/glibc-test-lowram.patch b/patches/glibc/2.3.2/glibc-test-lowram.patch
new file mode 100644
index 00000000..2308629a
--- /dev/null
+++ b/patches/glibc/2.3.2/glibc-test-lowram.patch
@@ -0,0 +1,14 @@
+--- glibc-2.2.5/malloc/tst-calloc.c.old	Sun Aug  3 16:17:58 2003
++++ glibc-2.2.5/malloc/tst-calloc.c	Sun Aug  3 16:20:01 2003
+@@ -24,9 +24,8 @@
+ #include <stdio.h>
+ 
+ 
+-/* Number of samples per size.  */
+-#define N 50000
+-
++/* Number of samples per size.  This is also the maximum memory consumption in kilobytes. */
++#define N 8000
+ 
+ static void
+ fixed_test (int size)
diff --git a/patches/glibc/2.3.2/nobits.patch b/patches/glibc/2.3.2/nobits.patch
new file mode 100644
index 00000000..c639051a
--- /dev/null
+++ b/patches/glibc/2.3.2/nobits.patch
@@ -0,0 +1,27 @@
+Fix build on architectures (like arm) where gas accepts @ as comment.
+
+First reported here:
+http://sources.redhat.com/ml/libc-alpha/2003-04/msg00265.html
+
+In use here:
+http://www.netwinder.org/autobuild/nw-9/patches/glibc-2.3.2-nobits.patch
+
+Committed to cvs:
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.52&r2=1.53&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/include/libc-symbols.h,v
+retrieving revision 1.52
+retrieving revision 1.53
+diff -u -r1.52 -r1.53
+--- libc/include/libc-symbols.h	2003/04/30 04:18:03	1.52
++++ libc/include/libc-symbols.h	2003/05/02 02:20:48	1.53
+@@ -247,7 +247,7 @@
+     __attribute__ ((unused, section (".gnu.warning." #symbol __sec_comment))) \
+     = msg;
+ #  define libc_freeres_ptr(decl) \
+-  __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", @nobits") \
++  __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", %nobits") \
+   decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
+ #  define __libc_freeres_fn_section \
+   __attribute__ ((section ("__libc_freeres_fn")))
diff --git a/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch b/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch
new file mode 100644
index 00000000..e0bf46dc
--- /dev/null
+++ b/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch
@@ -0,0 +1,28 @@
+See http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html
+Fixes
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: conflicting types  for 'elf_vrreg_t' 
+when building glibc-2.3.2 for powerpc64 and linux-2.6.x
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2003/01/12 08:24:23	1.10
++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2003/12/17 23:09:34	1.11
+@@ -45,7 +45,6 @@
+ 
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+-#endif
+ 
+ /* gcc 3.1 and newer support __uint128_t.  */
+ #if !__GNUC_PREREQ(3,1)
+@@ -57,6 +56,7 @@
+ /* Altivec registers */
+ typedef __uint128_t elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
++#endif
+ 
+ struct elf_siginfo
+   {
diff --git a/patches/glibc/2.3.2/sscanf.patch b/patches/glibc/2.3.2/sscanf.patch
new file mode 100644
index 00000000..b18985ac
--- /dev/null
+++ b/patches/glibc/2.3.2/sscanf.patch
@@ -0,0 +1,80 @@
+2003-03-05  Roland McGrath  <roland@redhat.com>
+
+	* stdio-common/sscanf.c: Use prototype defn with ... syntax.
+	* libio/swscanf.c: Likewise.
+	* libio/swprintf.c: Likewise.
+
+===================================================================
+RCS file: /cvs/glibc/libc/stdio-common/sscanf.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/stdio-common/sscanf.c	2002/08/10 09:24:42	1.8
++++ libc/stdio-common/sscanf.c	2003/03/05 19:58:03	1.9
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991,95,96,98,2002 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1996,1998,2002,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -27,9 +27,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-sscanf (s, format)
+-     const char *s;
+-     const char *format;
++sscanf (const char *s, const char *format, ...)
+ {
+   va_list arg;
+   int done;
+===================================================================
+RCS file: /cvs/glibc/libc/libio/swprintf.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/libio/swprintf.c	2001/07/06 04:55:32	1.3
++++ libc/libio/swprintf.c	2003/03/05 19:58:03	1.4
+@@ -1,4 +1,5 @@
+-/* Copyright (C) 1991,1995,1997,1998,1999,2000 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1997,1998,1999,2000,2003
++	Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -22,10 +23,7 @@
+ /* Write formatted output into S, according to the format string FORMAT.  */
+ /* VARARGS3 */
+ int
+-swprintf (s, n, format)
+-     wchar_t *s;
+-     size_t n;
+-     const wchar_t *format;
++swprintf (wchar_t *s, size_t n, const wchar_t *format, ...)
+ {
+   va_list arg;
+   int done;
+===================================================================
+RCS file: /cvs/glibc/libc/libio/swscanf.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/libio/swscanf.c	2001/07/06 04:55:32	1.2
++++ libc/libio/swscanf.c	2003/03/05 19:58:03	1.3
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991, 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
++/* Copyright (C) 1991,1995,1996,1998,1999,2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -22,9 +22,7 @@
+ /* Read formatted input from S, according to the format string FORMAT.  */
+ /* VARARGS2 */
+ int
+-swscanf (s, format)
+-     const wchar_t *s;
+-     const wchar_t *format;
++swscanf (const wchar_t *s, const wchar_t *format, ...)
+ {
+   va_list arg;
+   int done;
diff --git a/patches/glibc/2.3.2/string2-typedef.patch b/patches/glibc/2.3.2/string2-typedef.patch
new file mode 100644
index 00000000..1cf48467
--- /dev/null
+++ b/patches/glibc/2.3.2/string2-typedef.patch
@@ -0,0 +1,35 @@
+See http://gcc.gnu.org/ml/gcc/2003-08/msg00959.html
+
+Compiling glibc-2.3.2 with a gcc-3.4 snapshot, I'm seeing
+a whole bunch of warnings like this:
+
+../string/bits/string2.h:80: warning: `packed' attribute ignored
+../string/bits/string2.h:81: warning: `packed' attribute ignored
+...
+
+Looks like it was bad code that was silently ignored by previous compilers.
+Ulrich fixed it as follows:
+
+===================================================================
+RCS file: /cvs/glibc/libc/string/bits/string2.h,v
+retrieving revision 1.68
+retrieving revision 1.69
+diff -u -r1.68 -r1.69
+--- libc/string/bits/string2.h	2002/05/25 06:10:18	1.68
++++ libc/string/bits/string2.h	2003/08/20 00:07:37	1.69
+@@ -1,5 +1,5 @@
+ /* Machine-independant string function optimizations.
+-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
++   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -76,7 +76,7 @@
+    use unaligned memory accesses.  */
+ # define __STRING2_COPY_TYPE(N) \
+   typedef struct { unsigned char __arr[N]; }				      \
+-    __STRING2_COPY_ARR##N __attribute__ ((packed))
++    __attribute__ ((__packed__)) __STRING2_COPY_ARR##N
+ __STRING2_COPY_TYPE (2);
+ __STRING2_COPY_TYPE (3);
+ __STRING2_COPY_TYPE (4);
diff --git a/patches/glibc/2.3.3/arm-ctl_bus_isa.patch b/patches/glibc/2.3.3/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.3.3/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch b/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch
new file mode 100644
index 00000000..fadee0e7
--- /dev/null
+++ b/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch
@@ -0,0 +1,51 @@
+Attempted fix for this error:
+
+
+crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/build-glibc/libc_pic.os(.text+0xc8bd0): In function `__posix_fallocate64_l64':
+: undefined reference to `__GI___pwrite64'
+collect2: ld returned 1 exit status
+make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/glibc-2.3.3'
+make[1]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/build-glibc/libc.so] Error 1
+make: *** [all] Error 2
+
+extracted from GLIBC CVS by Dan Kegel
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc'
+(to match context of...)
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc'
+and rediffed.
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+Originally thought we needed this hunk, too:
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html
+but it seems the sysdep.h change is sufficient, and works better 
+when compiling against linux-2.4.
+
+And then rediffed again against glibc-2.3.3
+
+--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/alpha/sysdep.h	Fri Jun 20 09:24:36 2003
++++ glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h	Wed Mar 23 23:59:58 2005
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003
++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+@@ -63,6 +63,16 @@
+ /* Help old kernel headers where particular syscalls are not available.  */
+ #ifndef __NR_semtimedop
+ # define __NR_semtimedop	423
++#endif
++
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
+ #endif
+ 
+ /*
diff --git a/patches/glibc/2.3.3/fixup.patch b/patches/glibc/2.3.3/fixup.patch
new file mode 100644
index 00000000..5f1e8a4e
--- /dev/null
+++ b/patches/glibc/2.3.3/fixup.patch
@@ -0,0 +1,74 @@
+Fixes
+dl-runtime.c:56: error: conflicting types for 'fixup'
+../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here
+when building with gcc-3.4.0
+
+First hunk:
+Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc
+
+Second hunk:
+If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition.
+Use macro in fixup function definitions.
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc
+[rediffed against glibc-2.3.2]
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/dl-machine.h,v
+retrieving revision 1.124
+retrieving revision 1.125
+diff -u -r1.124 -r1.125
+--- libc/sysdeps/i386/dl-machine.h	2004/03/05 10:14:49	1.124
++++ libc/sysdeps/i386/dl-machine.h	2004/03/09 07:42:29	1.125
+@@ -154,11 +154,14 @@
+    destroys the passed register information.  */
+ /* GKM FIXME: Fix trampoline to pass bounds so we can do
+    without the `__unbounded' qualifier.  */
+-static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset)
+-     __attribute__ ((regparm (2), unused));
++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused))
++
++static ElfW(Addr) fixup (struct link_map *__unbounded l,
++			 ElfW(Word) reloc_offset)
++     ARCH_FIXUP_ATTRIBUTE;
+ static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset,
+ 				 ElfW(Addr) retaddr)
+-     __attribute__ ((regparm (3), unused));
++     ARCH_FIXUP_ATTRIBUTE;
+ # endif
+ 
+ /* This code is used in dl-runtime.c to call the `fixup' function
+===================================================================
+--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c	Fri Feb  7 11:41:12 2003
++++ glibc-2.3.2/elf/dl-runtime.c	Thu Apr  8 22:24:26 2004
+@@ -36,6 +36,12 @@
+ # define VERSYMIDX(sym)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym))
+ #endif
+ 
++/* The fixup functions might have need special attributes.  If none
++   are provided define the macro as empty.  */
++#ifndef ARCH_FIXUP_ATTRIBUTE
++# define ARCH_FIXUP_ATTRIBUTE
++#endif
++
+ 
+ /* This function is called through a special trampoline from the PLT the
+    first time each PLT entry is called.  We must perform the relocation
+@@ -45,7 +51,7 @@
+    function.  */
+ 
+ #ifndef ELF_MACHINE_NO_PLT
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ fixup (
+ # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+         ELF_MACHINE_RUNTIME_FIXUP_ARGS,
+@@ -132,7 +138,7 @@
+ 
+ #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__
+ 
+-static ElfW(Addr) __attribute_used__
++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE
+ profile_fixup (
+ #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
+        ELF_MACHINE_RUNTIME_FIXUP_ARGS,
diff --git a/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch b/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch
new file mode 100644
index 00000000..2d9f0924
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch
@@ -0,0 +1,48 @@
+Fixes
+programs/ld-collate.c: In function 'obstack_int32_grow':
+programs/ld-collate.c:48: error: invalid lvalue in increment
+programs/ld-collate.c: In function 'obstack_int32_grow_fast':
+programs/ld-collate.c:57: error: invalid lvalue in increment
+
+Change taken by eyeball from version 1.20 at
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/malloc/obstack.h?cvsroot=glibc
+
+--- /home/dank/downloads/glibc-2.2.5/malloc/obstack.h	2001-07-05 21:55:35.000000000 -0700
++++ glibc-2.2.5/malloc/obstack.h	2005-03-11 16:12:16.175812224 -0800
+@@ -423,22 +423,29 @@
+ ({ struct obstack *__o = (OBSTACK);					\
+    if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
+      _obstack_newchunk (__o, sizeof (void *));				\
+-   *((void **)__o->next_free)++ = (datum);				\
+-   (void) 0; })
++   obstack_ptr_grow_fast (__o, datum); })
+ 
+ # define obstack_int_grow(OBSTACK,datum)				\
+ __extension__								\
+ ({ struct obstack *__o = (OBSTACK);					\
+    if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
+      _obstack_newchunk (__o, sizeof (int));				\
+-   *((int *)__o->next_free)++ = (datum);				\
++   obstack_int_grow_fast (__o, datum); })
++
++# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
++__extension__								\
++({ struct obstack *__o1 = (OBSTACK);					\
++   *(const void **) __o1->next_free = (aptr);				\
++   __o1->next_free += sizeof (const void *);				\
+    (void) 0; })
+ 
+-# define obstack_ptr_grow_fast(h,aptr)					\
+-  (*((void **) (h)->next_free)++ = (aptr))
++# define obstack_int_grow_fast(OBSTACK,aint)				\
++__extension__								\
++({ struct obstack *__o1 = (OBSTACK);					\
++   *(int *) __o1->next_free = (aint);					\
++   __o1->next_free += sizeof (int);					\
++   (void) 0; })
+ 
+-# define obstack_int_grow_fast(h,aint)					\
+-  (*((int *) (h)->next_free)++ = (aint))
+ 
+ # define obstack_blank(OBSTACK,length)					\
+ __extension__								\
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch
new file mode 100644
index 00000000..cdcd7ba0
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch
@@ -0,0 +1,23 @@
+Fixes
+cc1: error: invalid parameter `max-inline-insns'
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc6/build/powerpc64-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/dl-load.o] Error 1
+when building with gcc-3.4.0, which no longer has a single
+--max-inline-insns parameter.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.3&r2=1.4&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/powerpc/powerpc64/Makefile     2003/10/22 21:30:03     1.3
++++ libc/sysdeps/powerpc/powerpc64/Makefile     2004/02/20 05:43:52     1.4
+@@ -20,5 +20,5 @@
+ 
+ ifeq ($(subdir),elf)
+ # help gcc inline asm code from dl-machine.h
+-+cflags += --param max-inline-insns=2000
+++cflags += -finline-limit=2000
+ endif
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch
new file mode 100644
index 00000000..1bd61e50
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch
@@ -0,0 +1,34 @@
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc
+
+Fixes gcc-3.5 errors
+
+dl-load.c: In function `_dl_map_object_from_fd':
+dl-load.c:1179: error: invalid lvalue in assignment
+dl-load.c:1205: error: invalid lvalue in assignment
+
+===================================================================
+RCS file: /cvs/glibc/libc/elf/dl-load.c,v
+retrieving revision 1.235
+retrieving revision 1.236
+diff -u -r1.235 -r1.236
+--- libc/elf/dl-load.c	2004/02/09 07:03:48	1.235
++++ libc/elf/dl-load.c	2004/02/21 18:25:41	1.236
+@@ -1228,7 +1228,7 @@
+       }
+     else
+       /* Adjust the PT_PHDR value by the runtime load address.  */
+-      (ElfW(Addr)) l->l_phdr += l->l_addr;
++      l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr);
+   }
+ 
+ #ifdef USE_TLS
+@@ -1254,7 +1254,7 @@
+ 	}
+     }
+   else
+-    (ElfW(Addr)) l->l_ld += l->l_addr;
++    l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
+ 
+   l->l_entry += l->l_addr;
+ 
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch
new file mode 100644
index 00000000..3d6df5bd
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch
@@ -0,0 +1,228 @@
+Fixes
+gconv_open.c: In function `__gconv_open':
+gconv_open.c:186: error: invalid lvalue in assignment
+when building glibc-2.3.2 with gcc-3.5.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc'
+        * (internal_ucs4_loop): Fix typo in last change.
+
+        * (internal_ucs4le_loop): Remove cast used as lvalue.
+
+        * Fix last commit.
+
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc'
+	* iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue.
+	(internal_ucs4le_loop_single): Likewise.
+	(ucs4_internal_loop): Likewise.
+	(BODY): Likewise.
+	(internal_ucs4_loop_single): Likewise.
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v
+retrieving revision 1.32
+retrieving revision 1.33
+diff -u -r1.32 -r1.33
+--- libc/iconv/gconv_open.c	2001/11/29 04:51:58	1.32
++++ libc/iconv/gconv_open.c	2004/02/07 15:56:32	1.33
+@@ -1,5 +1,5 @@
+ /* Find matching transformation algorithms and initialize steps.
+-   Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -182,8 +182,13 @@
+ 	      || __builtin_expect (__gconv_translit_find (runp), 0) == 0)
+ 	    lastp = runp;
+ 	  else
+-	    /* This means we haven't found the module.  Remove it.  */
+-	    (lastp == NULL ? trans : lastp->next) = runp->next;
++	    {
++	      /* This means we haven't found the module.  Remove it.  */
++	      if (lastp == NULL)
++		trans  = runp->next;
++	      else
++		lastp->next  = runp->next;
++	    }
+ 	}
+ 
+       /* Allocate room for handle.  */
+===================================================================
+RCS file: /cvs/glibc/libc/iconv/gconv_simple.c,v
+retrieving revision 1.59
+retrieving revision 1.63
+diff -u -r1.59 -r1.63
+--- libc/iconv/gconv_simple.c	2003/06/11 21:36:37	1.59
++++ libc/iconv/gconv_simple.c	2004/03/09 10:00:31	1.63
+@@ -1,5 +1,5 @@
+ /* Simple transformations functions.
+-   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
++   Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -87,12 +87,13 @@
+ #if __BYTE_ORDER == __LITTLE_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
+ 
+   *inptrp = inptr;
+-  *outptrp = outptr;
++  *outptrp = (unsigned char *) outptr32;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* Simply copy the data.  */
+   *inptrp = inptr + n_convert * 4;
+@@ -192,13 +193,16 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
+ #else
+ # error "This endianess is not supported."
+ #endif
++  *outptrp += 4;
+ 
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+@@ -268,7 +272,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -447,9 +452,11 @@
+ #if __BYTE_ORDER == __BIG_ENDIAN
+   /* Sigh, we have to do some real work.  */
+   size_t cnt;
++  uint32_t *outptr32 = (uint32_t *) outptr;
+ 
+   for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
+-    *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr);
++    *outptr32++ = bswap_32 (*(const uint32_t *) inptr);
++  outptr = (unsigned char *) outptr32;
+ 
+   *inptrp = inptr;
+   *outptrp = outptr;
+@@ -555,12 +562,17 @@
+   (*outptrp)[2] = state->__value.__wchb[1];
+   (*outptrp)[3] = state->__value.__wchb[0];
+ 
+-  *outptrp += 4;
+ #else
+   /* XXX unaligned */
+-  *(*((uint32_t **) outptrp)++) = state->__value.__wch;
++  (*outptrp)[0] = state->__value.__wchb[0];
++  (*outptrp)[1] = state->__value.__wchb[1];
++  (*outptrp)[2] = state->__value.__wchb[2];
++  (*outptrp)[3] = state->__value.__wchb[3];
++
+ #endif
+ 
++  *outptrp += 4;
++
+   /* Clear the state buffer.  */
+   state->__count &= ~7;
+ 
+@@ -626,7 +638,8 @@
+ 	  return __GCONV_ILLEGAL_INPUT;
+ 	}
+ 
+-      *((uint32_t *) outptr)++ = inval;
++      *((uint32_t *) outptr) = inval;
++      outptr += sizeof (uint32_t);
+     }
+ 
+   *inptrp = inptr;
+@@ -808,7 +821,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *((uint32_t *) outptr)++ = *inptr++;				      \
++      *((uint32_t *) outptr) = *inptr++;				      \
++      outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -838,7 +852,8 @@
+       }									      \
+     else								      \
+       /* It's an one byte sequence.  */					      \
+-      *outptr++ = *((const uint32_t *) inptr)++;			      \
++      *outptr++ = *((const uint32_t *) inptr);				      \
++      inptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #include <iconv/loop.c>
+@@ -1032,7 +1047,8 @@
+       }									      \
+ 									      \
+     /* Now adjust the pointers and store the result.  */		      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ 
+@@ -1153,7 +1169,8 @@
+ 	STANDARD_FROM_LOOP_ERR_HANDLER (2);				      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1201,7 +1218,8 @@
+       }									      \
+     else								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = val;					      \
++	*((uint16_t *) outptr) = val;					      \
++        outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
+@@ -1242,7 +1260,8 @@
+ 	continue;							      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = u1;					      \
++    *((uint32_t *) outptr) = u1;					      \
++    outptr += sizeof (uint32_t);					      \
+     inptr += 2;								      \
+   }
+ #define LOOP_NEED_FLAGS
+@@ -1291,7 +1310,8 @@
+       }									      \
+     else								      \
+       {									      \
+-	*((uint16_t *) outptr)++ = bswap_16 (val);			      \
++	*((uint16_t *) outptr) = bswap_16 (val);			      \
++	outptr += sizeof (uint16_t);					      \
+ 	inptr += 4;							      \
+       }									      \
+   }
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch
new file mode 100644
index 00000000..e2673dec
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch
@@ -0,0 +1,46 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/msort.c.diff?r1=1.20&r2=1.21&cvsroot=glibc
+
+Fixes
+
+msort.c: In function `msort_with_tmp':
+msort.c:59: error: invalid lvalue in increment
+msort.c:59: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+msort.c:64: error: invalid lvalue in increment
+
+when building with gcc-3.5.
+
+===================================================================
+RCS file: /cvs/glibc/libc/stdlib/msort.c,v
+retrieving revision 1.20
+retrieving revision 1.21
+diff -u -r1.20 -r1.21
+--- libc/stdlib/msort.c	2002/09/24 04:20:57	1.20
++++ libc/stdlib/msort.c	2004/02/07 15:57:34	1.21
+@@ -1,6 +1,6 @@
+ /* An alternative to qsort, with an identical interface.
+    This file is part of the GNU C Library.
+-   Copyright (C) 1992,95-97,99,2000,01,02 Free Software Foundation, Inc.
++   Copyright (C) 1992,95-97,99,2000,01,02,04 Free Software Foundation, Inc.
+    Written by Mike Haertel, September 1988.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -56,12 +56,16 @@
+ 	if ((*cmp) (b1, b2) <= 0)
+ 	  {
+ 	    --n1;
+-	    *((op_t *) tmp)++ = *((op_t *) b1)++;
++	    *((op_t *) tmp) = *((op_t *) b1);
++	    tmp += sizeof (op_t);
++	    b1 += sizeof (op_t);
+ 	  }
+ 	else
+ 	  {
+ 	    --n2;
+-	    *((op_t *) tmp)++ = *((op_t *) b2)++;
++	    *((op_t *) tmp) = *((op_t *) b2);
++	    tmp += sizeof (op_t);
++	    b2 += sizeof (op_t);
+ 	  }
+       }
+   else
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch
new file mode 100644
index 00000000..5a68bc24
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch
@@ -0,0 +1,233 @@
+http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html
+[Also in CVS, but the original patch is easier to get.]
+
+Fixes errors like
+
+clnt_perr.c: In function `_buf':
+clnt_perr.c:67: error: invalid lvalue in assignment
+
+when building with gcc-3.5.
+
+To: libc-hacker at sources dot redhat dot com
+Subject: Fix cast as lvalue in sunrpc
+From: Andreas Schwab <schwab at suse dot de>
+X-Yow: SHHHH!!  I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS
+ into empty OIL DRUMS dot  dot 
+Date: Sun, 08 Feb 2004 17:38:31 +0100
+Message-ID: <je4qu1frw8.fsf@sykes.suse.de>
+
+This fixes the uses of casts as lvalue in the sunrpc code.
+
+Andreas.
+
+2004-02-08  Andreas Schwab  <schwab@suse.de>
+
+	* include/rpc/rpc.h: Declare thread variables with their correct
+	type.
+	* sunrpc/clnt_perr.c: Don't cast thread variables.
+	* sunrpc/clnt_raw.c: Likewise.
+	* sunrpc/clnt_simp.c: Likewise.
+	* sunrpc/key_call.c: Likewise.
+	* sunrpc/svcauth_des.c: Likewise.
+	* sunrpc/svc.c: Likewise.
+	* sunrpc/svc_raw.c: Likewise.
+	* sunrpc/svc_simple.c: Likewise.
+
+Index: include/rpc/rpc.h
+===================================================================
+RCS file: /cvs/glibc/libc/include/rpc/rpc.h,v
+retrieving revision 1.8
+diff -u -p -a -r1.8 rpc.h
+--- glibc/include/rpc/rpc.h	5 Aug 2002 22:10:59 -0000	1.8
++++ glibc/include/rpc/rpc.h	8 Feb 2004 14:19:14 -0000
+@@ -17,24 +17,24 @@ struct rpc_thread_variables {
+ 	struct pollfd	*svc_pollfd_s;		/* Global, rpc_common.c */
+ 	int		svc_max_pollfd_s;	/* Global, rpc_common.c */
+ 
+-	void		*clnt_perr_buf_s;	/* clnt_perr.c */
++	char		*clnt_perr_buf_s;	/* clnt_perr.c */
+ 
+-	void		*clntraw_private_s;	/* clnt_raw.c */
++	struct clntraw_private_s *clntraw_private_s;	/* clnt_raw.c */
+ 
+-	void		*callrpc_private_s;	/* clnt_simp.c */
++	struct callrpc_private_s *callrpc_private_s;	/* clnt_simp.c */
+ 
+-	void		*key_call_private_s;	/* key_call.c */
++	struct key_call_private *key_call_private_s;	/* key_call.c */
+ 
+-	void		*authdes_cache_s;	/* svcauth_des.c */
+-	void		*authdes_lru_s;		/* svcauth_des.c */
++	struct cache_entry *authdes_cache_s;	/* svcauth_des.c */
++	int		*authdes_lru_s;		/* svcauth_des.c */
+ 
+-	void		*svc_xports_s;		/* svc.c */
+-	void		*svc_head_s;		/* svc.c */
++	SVCXPRT		**svc_xports_s;		/* svc.c */
++	struct svc_callout *svc_head_s;		/* svc.c */
+ 
+-	void		*svcraw_private_s;	/* svc_raw.c */
++	struct svcraw_private_s *svcraw_private_s;	/* svc_raw.c */
+ 
+-	void		*svcsimple_proglst_s;	/* svc_simple.c */
+-	void		*svcsimple_transp_s;	/* svc_simple.c */
++	struct proglst_ *svcsimple_proglst_s;	/* svc_simple.c */
++	SVCXPRT		*svcsimple_transp_s;	/* svc_simple.c */
+ };
+ 
+ extern struct rpc_thread_variables *__rpc_thread_variables(void)
+Index: sunrpc/clnt_perr.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_perr.c,v
+retrieving revision 1.19
+diff -u -p -a -r1.19 clnt_perr.c
+--- glibc/sunrpc/clnt_perr.c	1 Nov 2002 20:43:54 -0000	1.19
++++ glibc/sunrpc/clnt_perr.c	8 Feb 2004 14:19:14 -0000
+@@ -55,7 +55,7 @@ static char *auth_errmsg (enum auth_stat
+  * buf variable in a few functions.  Overriding a global variable
+  * with a local variable of the same name is a bad idea, anyway.
+  */
+-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s))
++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s)
+ #else
+ static char *buf;
+ #endif
+Index: sunrpc/clnt_raw.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_raw.c,v
+retrieving revision 1.10
+diff -u -p -a -r1.10 clnt_raw.c
+--- glibc/sunrpc/clnt_raw.c	15 May 2002 00:21:00 -0000	1.10
++++ glibc/sunrpc/clnt_raw.c	8 Feb 2004 14:19:14 -0000
+@@ -61,7 +61,7 @@ struct clntraw_private_s
+     u_int mcnt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s))
++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s)
+ #else
+ static struct clntraw_private_s *clntraw_private;
+ #endif
+Index: sunrpc/clnt_simp.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/clnt_simp.c,v
+retrieving revision 1.14
+diff -u -p -a -r1.14 clnt_simp.c
+--- glibc/sunrpc/clnt_simp.c	15 May 2002 00:21:00 -0000	1.14
++++ glibc/sunrpc/clnt_simp.c	8 Feb 2004 14:19:14 -0000
+@@ -55,7 +55,7 @@ struct callrpc_private_s
+     char *oldhost;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s))
++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s)
+ #else
+ static struct callrpc_private_s *callrpc_private;
+ #endif
+Index: sunrpc/key_call.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/key_call.c,v
+retrieving revision 1.16
+diff -u -p -a -r1.16 key_call.c
+--- glibc/sunrpc/key_call.c	6 Aug 2002 06:08:50 -0000	1.16
++++ glibc/sunrpc/key_call.c	8 Feb 2004 14:19:14 -0000
+@@ -370,7 +370,7 @@ struct  key_call_private {
+   uid_t   uid;            /* user-id at last authorization */
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define key_call_private_main ((struct  key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s))
++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s)
+ #else
+ static struct key_call_private *key_call_private_main;
+ #endif
+Index: sunrpc/svc.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc.c,v
+retrieving revision 1.17
+diff -u -p -a -r1.17 svc.c
+--- glibc/sunrpc/svc.c	29 Aug 2003 07:45:18 -0000	1.17
++++ glibc/sunrpc/svc.c	8 Feb 2004 14:19:14 -0000
+@@ -44,7 +44,7 @@
+ #include <sys/poll.h>
+ 
+ #ifdef _RPC_THREAD_SAFE_
+-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s))
++#define xports RPC_THREAD_VARIABLE(svc_xports_s)
+ #else
+ static SVCXPRT **xports;
+ #endif
+@@ -63,7 +63,7 @@ struct svc_callout {
+   void (*sc_dispatch) (struct svc_req *, SVCXPRT *);
+ };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s))
++#define svc_head RPC_THREAD_VARIABLE(svc_head_s)
+ #else
+ static struct svc_callout *svc_head;
+ #endif
+Index: sunrpc/svc_raw.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc_raw.c,v
+retrieving revision 1.5
+diff -u -p -a -r1.5 svc_raw.c
+--- glibc/sunrpc/svc_raw.c	26 Feb 2002 01:43:56 -0000	1.5
++++ glibc/sunrpc/svc_raw.c	8 Feb 2004 14:19:14 -0000
+@@ -54,7 +54,7 @@ struct svcraw_private_s
+     char verf_body[MAX_AUTH_BYTES];
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s))
++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s)
+ #else
+ static struct svcraw_private_s *svcraw_private;
+ #endif
+Index: sunrpc/svc_simple.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svc_simple.c,v
+retrieving revision 1.16
+diff -u -p -a -r1.16 svc_simple.c
+--- glibc/sunrpc/svc_simple.c	6 Aug 2002 05:10:30 -0000	1.16
++++ glibc/sunrpc/svc_simple.c	8 Feb 2004 14:19:14 -0000
+@@ -61,7 +61,7 @@ struct proglst_
+     struct proglst_ *p_nxt;
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s))
++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s)
+ #else
+ static struct proglst_ *proglst;
+ #endif
+@@ -69,7 +69,7 @@ static struct proglst_ *proglst;
+ 
+ static void universal (struct svc_req *rqstp, SVCXPRT *transp_s);
+ #ifdef _RPC_THREAD_SAFE_
+-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s))
++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s)
+ #else
+ static SVCXPRT *transp;
+ #endif
+Index: sunrpc/svcauth_des.c
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/svcauth_des.c,v
+retrieving revision 1.8
+diff -u -p -a -r1.8 svcauth_des.c
+--- glibc/sunrpc/svcauth_des.c	20 Aug 2001 06:37:09 -0000	1.8
++++ glibc/sunrpc/svcauth_des.c	8 Feb 2004 14:19:14 -0000
+@@ -72,8 +72,8 @@ struct cache_entry
+     char *localcred;		/* generic local credential */
+   };
+ #ifdef _RPC_THREAD_SAFE_
+-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s))
+-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s))
++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s)
++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s)
+ #else
+ static struct cache_entry *authdes_cache;
+ static int *authdes_lru;
+
+-- 
+Andreas Schwab, SuSE Labs, schwab@suse.de
+SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
+Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
+"And now for something completely different."
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch
new file mode 100644
index 00000000..4d811e9f
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch
@@ -0,0 +1,44 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc
+(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html
+and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html)
+
+Fixes errors
+
+rpc_cmsg.c: In function `xdr_callmsg':
+rpc_cmsg.c:70: error: invalid lvalue in increment
+rpc_cmsg.c:71: error: invalid lvalue in increment
+rpc_cmsg.c:74: error: invalid lvalue in increment
+rpc_cmsg.c:77: error: invalid lvalue in increment
+rpc_cmsg.c:78: error: invalid lvalue in increment
+rpc_cmsg.c:79: error: invalid lvalue in increment
+rpc_cmsg.c:81: error: invalid lvalue in increment
+rpc_cmsg.c:89: error: invalid lvalue in increment
+rpc_cmsg.c:106: error: invalid lvalue in increment
+rpc_cmsg.c:107: error: invalid lvalue in increment
+rpc_cmsg.c:112: error: invalid lvalue in increment
+rpc_cmsg.c:117: error: invalid lvalue in increment
+rpc_cmsg.c:118: error: invalid lvalue in increment
+rpc_cmsg.c:119: error: invalid lvalue in increment
+rpc_cmsg.c:121: error: invalid lvalue in increment
+rpc_cmsg.c:160: error: invalid lvalue in increment
+
+===================================================================
+RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v
+retrieving revision 1.27
+retrieving revision 1.28
+diff -u -r1.27 -r1.28
+--- libc/sunrpc/rpc/xdr.h	2002/12/16 02:05:49	1.27
++++ libc/sunrpc/rpc/xdr.h	2004/03/22 10:52:33	1.28
+@@ -262,10 +262,8 @@
+  * and shouldn't be used any longer. Code which use this defines or longs
+  * in the RPC code will not work on 64bit Solaris platforms !
+  */
+-#define IXDR_GET_LONG(buf) \
+-	((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++))
+-#define IXDR_PUT_LONG(buf, v) \
+-	(*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v)))
++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf))
++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v)))
+ #define IXDR_GET_U_LONG(buf)	      ((u_long)IXDR_GET_LONG(buf))
+ #define IXDR_PUT_U_LONG(buf, v)	      IXDR_PUT_LONG(buf, (long)(v))
+ 
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch b/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch
new file mode 100644
index 00000000..03e5c5b2
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch
@@ -0,0 +1,54 @@
+See also
+http://lists.gnu.org/archive/html/bug-glibc/2002-12/msg00056.html
+http://lists.arm.linux.org.uk/pipermail/linux-arm-toolchain/2004-June/000016.html
+
+2002-12-12  Andreas Schwab  <schwab@suse.de>
+        * sysdeps/arm/strlen.S: Fix last word check for big endian.
+
+To: libc-alpha at sources dot redhat dot com
+Subject: [PATCH] REPOST: ARM big-endian strlen() fix
+References: <m3brjy27mo.fsf@defiant.pm.waw.pl>
+From: Krzysztof Halasa <khc at pm dot waw dot pl>
+Date: Thu, 10 Jun 2004 13:41:44 +0200
+Message-ID: <m3r7sn8wsn.fsf@defiant.pm.waw.pl>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="=-=-="
+
+--=-=-=
+
+The attached patch fixes strlen() on big-endian ARM. Please apply.
+Thanks.
+-- 
+Krzysztof Halasa, B*FH
+
+--=-=-=
+Content-Type: text/x-patch
+Content-Disposition: inline; filename=glibc-strlen.patch
+
+--- glibc-2.3.3.old/sysdeps/arm/strlen.S	2003-04-30 00:47:20.000000000 +0200
++++ glibc-2.3.3/sysdeps/arm/strlen.S	2004-06-06 03:21:48.351931240 +0200
+@@ -53,12 +53,21 @@
+ 	ldrne   r2, [r1], $4            @ and we continue to the next word
+ 	bne     Laligned                @
+ Llastword:				@ drop through to here once we find a
++#ifdef __ARMEB__
++	tst     r2, $0xff000000         @ word that has a zero byte in it
++	addne   r0, r0, $1              @
++	tstne   r2, $0x00ff0000         @ and add up to 3 bytes on to it
++	addne   r0, r0, $1              @
++	tstne   r2, $0x0000ff00         @ (if first three all non-zero, 4th
++	addne   r0, r0, $1              @  must be zero)
++#else
+ 	tst     r2, $0x000000ff         @ word that has a zero byte in it
+ 	addne   r0, r0, $1              @
+ 	tstne   r2, $0x0000ff00         @ and add up to 3 bytes on to it
+ 	addne   r0, r0, $1              @
+ 	tstne   r2, $0x00ff0000         @ (if first three all non-zero, 4th
+ 	addne   r0, r0, $1              @  must be zero)
++#endif
+ 	RETINSTR(mov,pc,lr)
+ END(strlen)
+ libc_hidden_builtin_def (strlen)
+
+--=-=-=--
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch b/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch
new file mode 100644
index 00000000..96e8fb3b
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch
@@ -0,0 +1,104 @@
+2004-04-29  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c (_Qp_qtoi): Use %f31
+	for single precision register, add it to __asm clobbers [BZ #139].
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c (_Qp_qtoui): Use %f31
+	for single precision register, add it to __asm clobbers.
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c (_Qp_qtoux): Use fqtox
+	instead of fqtoi in QP_HANDLE_EXCEPTIONS.
+	* sysdeps/sparc/sparc64/soft-fp/qp_qtox.c (_Qp_qtox): Likewise.
+	Reported by M. H. VanLeeuwen <vanl@megsinet.net>.
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=139
+Fixes error
+qp_qtoi.s:261: Error: Illegal operands: There are only 32 single precision f registers; [0-31]
+plus a couple other things vanl noticed.
+
+diff -ur orig/qp_qtoi.c new/qp_qtoi.c
+--- orig/qp_qtoi.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (int)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,9 +38,9 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
+-"	st %%f60, [%0]\n"
+-"	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
++"	fqtoi %%f52, %%f31\n"
++"	st %%f31, [%0]\n"
++"	" : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31");
+ 	r = rx);
+ 
+   return r;
+diff -ur orig/qp_qtoui.c new/qp_qtoui.c
+--- orig/qp_qtoui.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (unsigned int)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,9 +38,9 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
+-"	st %%f60, [%0]\n"
+-"	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
++"	fqtoi %%f52, %%f31\n"
++"	st %%f31, [%0]\n"
++"	" : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31");
+ 	r = rx);
+ 
+   return r;
+diff -ur orig/qp_qtoux.c new/qp_qtoux.c
+--- orig/qp_qtoux.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (unsigned long)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,7 +38,7 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
++"	fqtox %%f52, %%f60\n"
+ "	std %%f60, [%0]\n"
+ "	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
+ 	r = rx);
+diff -ur orig/qp_qtox.c new/qp_qtox.c
+--- orig/qp_qtox.c	Sat May  1 00:40:06 2004
++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c	Sat May  1 00:39:40 2004
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+    Return (long)(*a)
+-   Copyright (C) 1997,1999 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Richard Henderson (rth@cygnus.com) and
+ 		  Jakub Jelinek (jj@ultra.linux.cz).
+@@ -38,7 +38,7 @@
+   	__asm (
+ "	ldd [%1], %%f52\n"
+ "	ldd [%1+8], %%f54\n"
+-"	fqtoi %%f52, %%f60\n"
++"	fqtox %%f52, %%f60\n"
+ "	std %%f60, [%0]\n"
+ "	" : : "r" (&rx), "r" (a) : QP_CLOBBER);
+ 	r = rx);
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch b/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch
new file mode 100644
index 00000000..289f66e6
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch
@@ -0,0 +1,46 @@
+Fixes the error
+
+<stdin>: Assembler messages:
+<stdin>:2: Error: junk at end of line, first unrecognized character is `1' ...
+<stdin>:2: Error: Illegal operands: PC-relative operand can't be a constant
+make[4]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-open.os] Error 1
+make[4]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/io'
+make[3]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-xstat64.os] Error 2
+make[3]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf'
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/rtld-libc.a] Error 2
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf'
+make[1]: *** [elf/subdir_lib] Error 2
+
+when building glibc-2.3.2 with gcc-3.4.0 for sparc32.
+
+The .s file left behind by -save-temps contains the big long line
+
+.text; .global __libc_open; .align 4; __libc_open:; .type __libc_open,@function;; mov 5, %g1; ta 0x10; bcs __syscall_error_handler; nop; .section .gnu.linkonce.t. 1 .get_pic.l7,"ax",@progbits; .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; .type 1 .get_pic.l7,@function; 1 .get_pic.l7: retl; add %o7, %l7, %l7; .previous; .subsection 3; __syscall_error_handler: save %sp,-96,%sp; sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; call 1 .get_pic.l7; add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; ld [%l7 + errno], %l0; st %i0, [%l0]; jmpl %i7+8, %g0; restore %g0, -1, %o0; .previous;
+ retl; nop 
+ 
+The error messages appear to refer to the '1 .get_pic.17', e.g.
+        .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7;
+which seems to come from
+glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+where it appears originally as
+        .globl __sparc.get_pic.l7;                                      \
+        .hidden __sparc.get_pic.l7;                                     \
+
+Note that __sparc is a predefined symbol on Solaris and some other environments;
+it's not surprising to see it predefined on Linux, too.
+
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.old	2004-05-15 10:23:11.000000000 -0700
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h	2004-05-15 10:24:12.000000000 -0700
+@@ -39,6 +39,11 @@
+ #undef END
+ #undef LOC
+ 
++/* gcc-3.4.0 seems to expand __sparc as a predefined preprocessor symbol, which we don't want here */
++#ifdef __sparc
++#undef __sparc
++#endif
++
+ #define ENTRY(name) \
+ 	.global C_SYMBOL_NAME(name); \
+ 	.align 4;\
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch
new file mode 100644
index 00000000..20cb7998
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch
@@ -0,0 +1,29 @@
+See http://gcc.gnu.org/PR15345
+
+Quick kludge by H.J.Lu
+Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64:
+
+.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3':
+: undefined reference to `_DYNAMIC'
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1
+
+
+--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig	Sat May  8 20:54:26 2004
++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h	Sat May  8 17:18:04 2004
+@@ -65,6 +65,7 @@
+ }
+ 
+ /* Return the run-time load address of the shared object.  */
++#ifdef IS_IN_rtld
+ static inline Elf64_Addr
+ elf_machine_load_address (void)
+ {
+@@ -84,6 +85,7 @@
+      pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12  */
+   return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4;
+ }
++#endif
+ 
+ /* We have 4 cases to handle.  And we code different code sequences
+    for each one.  I love V9 code models...  */
diff --git a/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch b/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch
new file mode 100644
index 00000000..76cdfaad
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch
@@ -0,0 +1,89 @@
+Sender: libc-alpha-owner@sources.redhat.com
+Date: Tue, 29 Jul 2003 17:49:47 -0400
+From: Daniel Jacobowitz <drow@mvista.com>
+To: GNU C Library <libc-alpha@sources.redhat.com>
+Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp
+Message-ID: <20030729214947.GA29932@nevyn.them.org>
+
+On Tue, Jul 29, 2003 at 02:53:33PM -0700, Dan Kegel wrote:
+> On ppc405, I'm getting the following when linking glibc's libm:
+> /gcc-3.3-glibc-2.3.2/build-glibc/math/libm_pic.a(fclrexcpt.os)(.text+0x1a): 
+> In function `feclearexcept@GLIBC_2.1':
+> : undefined reference to `__sim_exceptions'
+> 
+> That symbol seems to be present in libc.so.  nm shows
+
+--without-fp doesn't work.  Try this.  Make up a changelog entry if it
+works.
+
+Date: Tue, 29 Jul 2003 14:56:50 -0700
+Message-Id: <200307292156.h6TLuol24356@magilla.sf.frob.com>
+From: Roland McGrath <roland@redhat.com>
+To: Daniel Jacobowitz <drow@mvista.com>
+Cc: GNU C Library <libc-alpha@sources.redhat.com>
+Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp
+In-Reply-To: Daniel Jacobowitz's message of  Tuesday, 29 July 2003 17:49:47 -0400 <20030729214947.GA29932@nevyn.them.org>
+
+> +int __sim_exceptions __attribute__ ((section(".bss")));
+
+Use __attribute__ ((nocommon)) instead (and please watch the standard
+whitespace conventions, i.e. ``section ('').
+
+diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c
+--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c	2002-10-19 16:06:29.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c	2003-05-14 15:10:42.000000000 -0400
+@@ -24,11 +24,14 @@
+ 
+ /* Global to store sticky exceptions.  */
+-int __sim_exceptions;
++int __sim_exceptions __attribute__ ((nocommon));
++libc_hidden_data_def (__sim_exceptions);
+ 
+ /* By default, no exceptions should trap.  */
+ int __sim_disabled_exceptions = 0xffffffff;
++libc_hidden_data_def (__sim_disabled_exceptions);
+ 
+-int __sim_round_mode;
++int __sim_round_mode __attribute__ ((nocommon));
++libc_hidden_data_def (__sim_round_mode);
+ 
+ void
+ __simulate_exceptions (int x)
+diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h
+--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h	2002-10-19 16:06:29.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h	2003-05-14 15:09:53.000000000 -0400
+@@ -27,7 +27,11 @@ typedef union
+ } fenv_union_t;
+ 
+ 
+-extern int __sim_exceptions attribute_hidden;
+-extern int __sim_disabled_exceptions attribute_hidden;
+-extern int __sim_round_mode attribute_hidden;
++extern int __sim_exceptions;
++libc_hidden_proto (__sim_exceptions);
++extern int __sim_disabled_exceptions;
++libc_hidden_proto (__sim_disabled_exceptions);
++extern int __sim_round_mode;
++libc_hidden_proto (__sim_round_mode);
++
+ extern void __simulate_exceptions (int x) attribute_hidden;
+diff -urp glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h
+--- glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h	2002-10-17 18:36:14.000000000 -0400
++++ glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h	2003-05-14 16:48:13.000000000 -0400
+@@ -52,7 +52,11 @@
+ #define FP_HANDLE_EXCEPTIONS  __simulate_exceptions (_fex)
+ #define FP_ROUNDMODE          __sim_round_mode
+ 
+-extern int __sim_exceptions attribute_hidden;
+-extern int __sim_disabled_exceptions attribute_hidden;
+-extern int __sim_round_mode attribute_hidden;
++extern int __sim_exceptions;
++libc_hidden_proto (__sim_exceptions);
++extern int __sim_disabled_exceptions;
++libc_hidden_proto (__sim_disabled_exceptions);
++extern int __sim_round_mode;
++libc_hidden_proto (__sim_round_mode);
++
+ extern void __simulate_exceptions (int x) attribute_hidden;
+
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch
new file mode 100644
index 00000000..3f568aee
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch
@@ -0,0 +1,30 @@
+Fixes following problem building glibc-2.3.3 with gcc-4.0:
+
+checking version of i686-unknown-linux-gnu-gcc ... 4.0.0, bad
+checking for gnumake... no
+checking for gmake... gmake
+checking version of gmake... 3.79.1, ok
+checking for gnumsgfmt... no
+checking for gmsgfmt... no
+checking for msgfmt... msgfmt
+checking version of msgfmt... 0.11.4, ok
+checking for makeinfo... makeinfo
+checking version of makeinfo... 4.3, ok
+checking for sed... sed
+checking version of sed... 4.0.5, ok
+checking for autoconf... autoconf
+checking whether autoconf works... yes
+configure: error:
+*** These critical programs are missing or too old: gcc
+
+--- glibc-2.3.3/configure.old	Mon Mar 14 12:01:10 2005
++++ glibc-2.3.3/configure	Mon Mar 14 12:02:03 2005
+@@ -3899,7 +3899,7 @@
+   ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustpi-]*[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    3.[2-9]*)
++    3.[2-9]*|4.[01]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch
new file mode 100644
index 00000000..3a235a4c
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch
@@ -0,0 +1,53 @@
+Fixes
+
+In file included from dynamic-link.h:310,
+                 from dl-reloc.c:265:
+do-rel.h:56: error: invalid storage class for function 'elf_dynamic_do_rela'
+In file included from dl-reloc.c:265:
+dynamic-link.h: In function '_dl_relocate_object':
+dynamic-link.h:33: error: invalid storage class for function 'elf_get_dynamic_info'
+
+when building glibc-2.3.3 with gcc-4.0
+2nd hunk is like http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dynamic-link.h.diff?r1=1.50&r2=1.51&cvsroot=glibc
+but works with older compilers, too
+
+--- glibc-2.3.3/elf/do-rel.h.old	2005-03-16 13:09:37.000000000 -0800
++++ glibc-2.3.3/elf/do-rel.h	2005-03-16 13:10:50.000000000 -0800
+@@ -49,7 +49,14 @@
+    relocations; they should be set up to call _dl_runtime_resolve, rather
+    than fully resolved now.  */
+ 
+-static inline void __attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_dynamic_do_rel (struct link_map *map,
+ 		    ElfW(Addr) reladdr, ElfW(Addr) relsize,
+ 		    int lazy)
+--- glibc-2.3.3/elf/dynamic-link.h.old	2005-03-16 13:22:35.000000000 -0800
++++ glibc-2.3.3/elf/dynamic-link.h	2005-03-16 13:26:23.000000000 -0800
+@@ -27,8 +27,17 @@
+ 
+ 
+ /* Read the dynamic section at DYN and fill in INFO with indices DT_*.  */
+-
+-static inline void __attribute__ ((unused, always_inline))
++#if !defined(RESOLVE) || __GNUC__ < 4
++static
++#else
++auto
++#endif
++inline void 
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute__ ((unused, always_inline))
++#else
++  __attribute__ ((unused))
++#endif
+ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
+ {
+   ElfW(Dyn) *dyn = l->l_ld;
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch
new file mode 100644
index 00000000..354bdee9
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch
@@ -0,0 +1,79 @@
+Fixes
+In file included from ldconfig.c:136:
+../sysdeps/i386/dl-procinfo.c:53: error: static declaration of '_dl_x86_cap_flags' follows non-static declaration
+../sysdeps/i386/dl-procinfo.c:61: error: previous declaration of '_dl_x86_cap_flags' was here
+../sysdeps/i386/dl-procinfo.c:72: error: static declaration of '_dl_x86_platforms' follows non-static declaration
+../sysdeps/i386/dl-procinfo.c:77: error: previous declaration of '_dl_x86_platforms' was here
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf'
+when building with gcc-4.0.
+
+2004-07-10  Ulrich Drepper  <drepper@redhat.com>
+
+        * elf/ldconfig.c: Define PROCINFO_CLASS as static before including
+        ldsodefs.h.
+        * sysdeps/generic/ldsodefs.h: Only define PROCINFO_CLASS if it is not
+        already defined.
+        * sysdeps/i386/dl-procinfo.c: Define PROCINFO_CALLS only if not
+        already defined.
+
+See 
+http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg00093.html
+http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg00097.html
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-procinfo.c.diff?cvsroot=glibc&r1=1.1&r2=1.2
+
+rediffed against glibc-2.3.3
+
+diff -ur glibc-2.3.3.orig/elf/ldconfig.c glibc-2.3.3/elf/ldconfig.c
+--- glibc-2.3.3.orig/elf/ldconfig.c	Tue Aug 26 01:07:19 2003
++++ glibc-2.3.3/elf/ldconfig.c	Sat Mar 19 12:02:08 2005
+@@ -17,6 +17,7 @@
+    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+    02111-1307 USA.  */
+ 
++#define PROCINFO_CLASS static
+ #include <alloca.h>
+ #include <argp.h>
+ #include <dirent.h>
+diff -ur glibc-2.3.3.orig/sysdeps/generic/ldsodefs.h glibc-2.3.3/sysdeps/generic/ldsodefs.h
+--- glibc-2.3.3.orig/sysdeps/generic/ldsodefs.h	Mon Nov 24 14:56:07 2003
++++ glibc-2.3.3/sysdeps/generic/ldsodefs.h	Sat Mar 19 12:02:08 2005
+@@ -348,7 +348,9 @@
+ 
+   /* Get architecture specific definitions.  */
+ #define PROCINFO_DECL
+-#define PROCINFO_CLASS EXTERN
++#ifndef PROCINFO_CLASS
++# define PROCINFO_CLASS EXTERN
++#endif
+ #include <dl-procinfo.c>
+ 
+   /* Structure describing the dynamic linker itself.  */
+Only in glibc-2.3.3/sysdeps/generic: ldsodefs.h~
+diff -ur glibc-2.3.3.orig/sysdeps/i386/dl-procinfo.c glibc-2.3.3/sysdeps/i386/dl-procinfo.c
+--- glibc-2.3.3.orig/sysdeps/i386/dl-procinfo.c	Wed Sep 24 20:54:54 2003
++++ glibc-2.3.3/sysdeps/i386/dl-procinfo.c	Sat Mar 19 12:02:08 2005
+@@ -1,5 +1,5 @@
+ /* Data for i386 version of processor capability information.
+-   Copyright (C) 2001,2002,2003 Free Software Foundation, Inc.
++   Copyright (C) 2001,2002,2003, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
+ 
+@@ -24,7 +24,7 @@
+    If anything should be added here check whether the size of each string
+    is still ok with the given array size.
+ 
+-   All the #ifdefs in the definitions ar equite irritating but
++   All the #ifdefs in the definitions are quite irritating but
+    necessary if we want to avoid duplicating the information.  There
+    are three different modes:
+ 
+@@ -41,7 +41,7 @@
+   */
+ 
+ #ifndef PROCINFO_CLASS
+-#define PROCINFO_CLASS
++# define PROCINFO_CLASS
+ #endif
+ 
+ #if !defined PROCINFO_DECL && defined SHARED
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch
new file mode 100644
index 00000000..d0ebb13f
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch
@@ -0,0 +1,111 @@
+Fixes
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/i386/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/i386/dl-machine.h:395: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/i386/dl-machine.h:539: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/i386/dl-machine.h:640: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/i386/dl-machine.h:650: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/i386/dl-machine.h:659: error: invalid storage class for function 'elf_machine_lazy_rel'
+../sysdeps/i386/dl-machine.h:680: error: invalid storage class for function 'elf_machine_lazy_rela'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/elf/dl-reloc.o] Error 1
+
+--- glibc-2.3.3/sysdeps/i386/dl-machine.h.old	Wed Mar 16 22:24:09 2005
++++ glibc-2.3.3/sysdeps/i386/dl-machine.h	Thu Mar 17 01:30:09 2005
+@@ -385,7 +385,14 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
+ 		 const Elf32_Sym *sym, const struct r_found_version *version,
+ 		 void *const reloc_addr_arg)
+@@ -529,7 +536,14 @@
+ }
+ 
+ #ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ 		  const Elf32_Sym *sym, const struct r_found_version *version,
+ 		  void *const reloc_addr_arg)
+@@ -631,7 +645,14 @@
+ }
+ #endif	/* !RTLD_BOOTSTRAP */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+ 			  void *const reloc_addr_arg)
+ {
+@@ -641,7 +662,14 @@
+ }
+ 
+ #ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -650,7 +678,14 @@
+ }
+ #endif	/* !RTLD_BOOTSTRAP */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rel *reloc)
+ {
+@@ -671,7 +706,14 @@
+ 
+ #ifndef RTLD_BOOTSTRAP
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rela (struct link_map *map,
+ 		       Elf32_Addr l_addr, const Elf32_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch
new file mode 100644
index 00000000..1aa023b4
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch
@@ -0,0 +1,24 @@
+Fixes
+iconvconfig.c: In function 'write_output':
+iconvconfig.c:1014: error: invalid storage class for function 'name_insert'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/iconv'
+
+Like http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/iconvconfig.c.diff?r1=1.19&r2=1.20&cvsroot=glibc
+but works with older compilers
+
+--- glibc-2.3.3/iconv/iconvconfig.c.old	Thu Mar 17 01:23:04 2005
++++ glibc-2.3.3/iconv/iconvconfig.c	Thu Mar 17 01:24:56 2005
+@@ -1010,7 +1010,12 @@
+   char finalname[prefix_len + sizeof (GCONV_MODULES_CACHE)];
+ 
+   /* Function to insert the names.  */
+-  static void name_insert (const void *nodep, VISIT value, int level)
++#if __GNUC__ >= 4
++  auto void 
++#else
++  static void 
++#endif
++  name_insert (const void *nodep, VISIT value, int level)
+     {
+       struct name *name;
+       unsigned int idx;
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch
new file mode 100644
index 00000000..98e99035
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch
@@ -0,0 +1,124 @@
+To: Glibc hackers <libc-hacker at sources dot redhat dot com>
+Subject: iconvdata: Get rid of lvalue casts
+From: Andreas Jaeger <aj at suse dot de>
+Date: Sun, 07 Mar 2004 08:29:47 +0100
+Message-ID: <m3fzclt8r8.fsf@gromit.moeb>
+
+Here's one more patch to get rid of lvalues to make GCC 3.5 happy.  It
+generates the same code as before on my machine and passes the
+testsuite.
+
+Ok to commit?
+
+Andreas
+
+2004-03-07  Andreas Jaeger  <aj@suse.de>
+
+	* iconvdata/iso-2022-cn-ext.c (BODY): Remove cast used as lvalue.
+	* iconvdata/tcvn5712-1.c (EMIT_SHIFT_TO_INIT): Likewise.
+	* iconvdata/euc-jisx0213.c (EMIT_SHIFT_TO_INIT): Likewise.
+	* iconvdata/shift_jisx0213.c (EMIT_SHIFT_TO_INIT): Likewise.
+	* iconvdata/tscii.c (EMIT_SHIFT_TO_INIT): Likewise.
+
+[rediffed to make crosstool happy]
+
+diff -ur glibc-2.3.3.orig/iconvdata/euc-jisx0213.c glibc-2.3.3.new/iconvdata/euc-jisx0213.c
+--- glibc-2.3.3.orig/iconvdata/euc-jisx0213.c	Mon Dec  2 14:07:54 2002
++++ glibc-2.3.3.new/iconvdata/euc-jisx0213.c	Fri Mar 18 09:29:22 2005
+@@ -1,5 +1,5 @@
+ /* Conversion from and to EUC-JISX0213.
+-   Copyright (C) 2002 Free Software Foundation, Inc.
++   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Bruno Haible <bruno@clisp.org>, 2002.
+ 
+@@ -83,7 +83,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+diff -ur glibc-2.3.3.orig/iconvdata/iso-2022-cn-ext.c glibc-2.3.3.new/iconvdata/iso-2022-cn-ext.c
+--- glibc-2.3.3.orig/iconvdata/iso-2022-cn-ext.c	Fri Jun 28 14:13:14 2002
++++ glibc-2.3.3.new/iconvdata/iso-2022-cn-ext.c	Fri Mar 18 09:29:22 2005
+@@ -1,5 +1,5 @@
+ /* Conversion module for ISO-2022-CN-EXT.
+-   Copyright (C) 2000-2002 Free Software Foundation, Inc.
++   Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.
+ 
+@@ -377,7 +377,8 @@
+ 	  }								      \
+       }									      \
+ 									      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define EXTRA_LOOP_DECLS	, int *setp
+ #define INIT_PARAMS		int set = (*setp >> 3) & CURRENT_MASK; \
+diff -ur glibc-2.3.3.orig/iconvdata/shift_jisx0213.c glibc-2.3.3.new/iconvdata/shift_jisx0213.c
+--- glibc-2.3.3.orig/iconvdata/shift_jisx0213.c	Mon Dec  2 14:07:56 2002
++++ glibc-2.3.3.new/iconvdata/shift_jisx0213.c	Fri Mar 18 09:29:22 2005
+@@ -1,5 +1,5 @@
+ /* Conversion from and to Shift_JISX0213.
+-   Copyright (C) 2002 Free Software Foundation, Inc.
++   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Bruno Haible <bruno@clisp.org>, 2002.
+ 
+@@ -83,7 +83,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+diff -ur glibc-2.3.3.orig/iconvdata/tcvn5712-1.c glibc-2.3.3.new/iconvdata/tcvn5712-1.c
+--- glibc-2.3.3.orig/iconvdata/tcvn5712-1.c	Mon Dec  2 14:07:52 2002
++++ glibc-2.3.3.new/iconvdata/tcvn5712-1.c	Fri Mar 18 09:29:22 2005
+@@ -1,5 +1,5 @@
+ /* Conversion to and from TCVN5712-1.
+-   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
++   Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
+ 
+@@ -68,7 +68,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+diff -ur glibc-2.3.3.orig/iconvdata/tscii.c glibc-2.3.3.new/iconvdata/tscii.c
+--- glibc-2.3.3.orig/iconvdata/tscii.c	Mon Sep 23 20:39:45 2002
++++ glibc-2.3.3.new/iconvdata/tscii.c	Fri Mar 18 09:29:22 2005
+@@ -1,5 +1,5 @@
+ /* Conversion from and to TSCII.
+-   Copyright (C) 2002 Free Software Foundation, Inc.
++   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Bruno Haible <bruno@clisp.org>, 2002.
+ 
+@@ -98,7 +98,8 @@
+ 		  break;						      \
+ 		}							      \
+ 	      /* Write out the pending character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 8;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 8;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      /* Retrieve the successor state.  */			      \
+ 	      data->__statep->__count =					      \
+ 		tscii_next_state[(data->__statep->__count >> 4) & 0x0f];      \
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch
new file mode 100644
index 00000000..e0ceba6a
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch
@@ -0,0 +1,142 @@
+Fixes
+
+In file included from jis0208.c:23:
+jis0208.h:32: error: array type has incomplete element type
+when building with gcc-4.0
+
+In file included from cp1258.c:869:
+../iconv/skeleton.c: In function 'gconv':
+../iconv/skeleton.c:323: error: invalid lvalue in increment
+
+In file included from cp1255.c:550:
+../iconv/skeleton.c: In function 'gconv':
+../iconv/skeleton.c:323: error: invalid lvalue in increment
+
+In file included from gb18030.c:22114:
+../iconv/loop.c: In function 'from_gb18030':
+../iconv/loop.c:282: error: invalid lvalue in increment
+../iconv/loop.c: In function 'from_gb18030_single':
+../iconv/loop.c:384: error: invalid lvalue in increment
+
+In file included from iso8859-1.c:43:
+../iconv/loop.c: In function 'from_iso8859_1':
+../iconv/loop.c:311: error: invalid lvalue in increment
+
+Rediffed, updated for glibc-2.3.3, added:
+
+In file included from armscii-8.c:85:
+../iconv/loop.c: In function 'from_armscii_8':
+../iconv/loop.c:311: error: invalid lvalue in increment
+../iconv/loop.c:311: error: invalid lvalue in increment
+
+--- glibc-2.3.3.orig/iconvdata/armscii-8.c	Mon Dec  2 14:07:52 2002
++++ glibc-2.3.3/iconvdata/armscii-8.c	Thu Mar 17 16:01:23 2005
+@@ -57,11 +57,17 @@
+     uint_fast8_t ch = *inptr;						      \
+ 									      \
+     if (ch <= 0xa0)							      \
+-      /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */    \
+-      *((uint32_t *) outptr)++ = ch;					      \
++      {									      \
++        /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode.  */  \
++        *((uint32_t *) outptr) = ch;					      \
++        outptr += sizeof (uint32_t);					      \
++      }									      \
+     else if (ch >= 0xa2 && ch <= 0xfe)					      \
+-      /* Use the table.  */						      \
+-      *((uint32_t *) outptr)++ = map_from_armscii_8[ch - 0xa2];		      \
++      {									      \
++        /* Use the table.  */						      \
++        *((uint32_t *) outptr) = map_from_armscii_8[ch - 0xa2];		      \
++        outptr += sizeof (uint32_t);					      \
++      }									      \
+     else								      \
+       {									      \
+ 	/* This is an illegal character.  */				      \
+diff -ur glibc-2.3.3.orig/iconvdata/cp1255.c glibc-2.3.3/iconvdata/cp1255.c
+--- glibc-2.3.3.orig/iconvdata/cp1255.c	Mon Dec  2 14:07:52 2002
++++ glibc-2.3.3/iconvdata/cp1255.c	Thu Mar 17 08:20:13 2005
+@@ -69,7 +69,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+diff -ur glibc-2.3.3.orig/iconvdata/cp1258.c glibc-2.3.3/iconvdata/cp1258.c
+--- glibc-2.3.3.orig/iconvdata/cp1258.c	Mon Dec  2 14:07:52 2002
++++ glibc-2.3.3/iconvdata/cp1258.c	Thu Mar 17 08:20:13 2005
+@@ -70,7 +70,8 @@
+ 	  if (__builtin_expect (outbuf + 4 <= outend, 1))		      \
+ 	    {								      \
+ 	      /* Write out the last character.  */			      \
+-	      *((uint32_t *) outbuf)++ = data->__statep->__count >> 3;	      \
++	      *((uint32_t *) outbuf) = data->__statep->__count >> 3;	      \
++	      outbuf += sizeof (uint32_t);				      \
+ 	      data->__statep->__count = 0;				      \
+ 	    }								      \
+ 	  else								      \
+diff -ur glibc-2.3.3.orig/iconvdata/gb18030.c glibc-2.3.3/iconvdata/gb18030.c
+--- glibc-2.3.3.orig/iconvdata/gb18030.c	Mon Dec  2 14:07:54 2002
++++ glibc-2.3.3/iconvdata/gb18030.c	Thu Mar 17 08:20:13 2005
+@@ -25769,7 +25769,8 @@
+ 	    }							      	      \
+ 	}								      \
+ 									      \
+-    *((uint32_t *) outptr)++ = ch;					      \
++    *((uint32_t *) outptr) = ch;					      \
++    outptr += sizeof (uint32_t);					      \
+   }
+ #define LOOP_NEED_FLAGS
+ #define ONEBYTE_BODY \
+diff -ur glibc-2.3.3.orig/iconvdata/iso8859-1.c glibc-2.3.3/iconvdata/iso8859-1.c
+--- glibc-2.3.3.orig/iconvdata/iso8859-1.c	Mon Dec  2 14:07:56 2002
++++ glibc-2.3.3/iconvdata/iso8859-1.c	Thu Mar 17 08:20:47 2005
+@@ -35,7 +35,8 @@
+ #define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
+ #define LOOPFCT			FROM_LOOP
+ #define BODY \
+-  *((uint32_t *) outptr)++ = *inptr++;
++  *((uint32_t *) outptr) = *inptr++;					      \
++  outptr += sizeof (uint32_t);
+ #define ONEBYTE_BODY \
+   {									      \
+     return c;								      \
+diff -ur glibc-2.3.3.orig/iconvdata/jis0208.h glibc-2.3.3/iconvdata/jis0208.h
+--- glibc-2.3.3.orig/iconvdata/jis0208.h	Wed Jun 11 14:40:42 2003
++++ glibc-2.3.3/iconvdata/jis0208.h	Thu Mar 17 08:20:13 2005
+@@ -24,15 +24,6 @@
+ #include <gconv.h>
+ #include <stdint.h>
+ 
+-/* Conversion table.  */
+-extern const uint16_t __jis0208_to_ucs[];
+-
+-extern const char __jisx0208_from_ucs4_lat1[256][2];
+-extern const char __jisx0208_from_ucs4_greek[0xc1][2];
+-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
+-extern const char __jisx0208_from_ucs_tab[][2];
+-
+-
+ /* Struct for table with indeces in UCS mapping table.  */
+ struct jisx0208_ucs_idx
+ {
+@@ -40,6 +31,15 @@
+   uint16_t end;
+   uint16_t idx;
+ };
++
++
++/* Conversion table.  */
++extern const uint16_t __jis0208_to_ucs[];
++
++extern const char __jisx0208_from_ucs4_lat1[256][2];
++extern const char __jisx0208_from_ucs4_greek[0xc1][2];
++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
++extern const char __jisx0208_from_ucs_tab[][2];
+ 
+ 
+ static inline uint32_t
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch
new file mode 100644
index 00000000..a0858223
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch
@@ -0,0 +1,34 @@
+--- glibc-2.3.3/locale/weight.h.old	2003-06-11 14:52:12.000000000 -0700
++++ glibc-2.3.3/locale/weight.h	2005-03-15 12:05:37.000000000 -0800
+@@ -18,8 +18,14 @@
+    02111-1307 USA.  */
+ 
+ /* Find index of weight.  */
++#if __GNUC__ >= 4
++auto inline int32_t
++#else
+ static inline int32_t
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+ __attribute ((always_inline))
++#endif
+ findidx (const unsigned char **cpp)
+ {
+   int_fast32_t i = table[*(*cpp)++];
+--- glibc-2.3.3/locale/weightwc.h.old	2003-06-13 13:44:58.000000000 -0700
++++ glibc-2.3.3/locale/weightwc.h	2005-03-15 12:06:46.000000000 -0800
+@@ -18,8 +18,14 @@
+    02111-1307 USA.  */
+ 
+ /* Find index of weight.  */
++#if __GNUC__ >= 4
++auto inline int32_t
++#else
+ static inline int32_t
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+ __attribute ((always_inline))
++#endif
+ findidx (const wint_t **cpp)
+ {
+   int32_t i;
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch
new file mode 100644
index 00000000..20f8825f
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch
@@ -0,0 +1,77 @@
+Fixes errors
+
+regcomp.c: In function 'parse_bracket_exp':
+regcomp.c:2724: error: invalid storage class for function 'seek_collating_symbol_entry'
+regcomp.c:2757: error: invalid storage class for function 'lookup_collation_sequence_value'
+regcomp.c:2826: error: invalid storage class for function 'build_range_exp'
+regcomp.c:2913: error: invalid storage class for function 'build_collating_symbol'
+...
+make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/posix/regex.o] Error 1
+
+See also http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg01071.html
+That fix requires gcc-4.0, but the fix proposed here works with older compilers, too
+
+--- glibc-2.3.3/posix/regcomp.c.old	2005-03-16 11:40:55.000000000 -0800
++++ glibc-2.3.3/posix/regcomp.c	2005-03-16 11:50:31.000000000 -0800
+@@ -2718,8 +2718,14 @@
+      Seek the collating symbol entry correspondings to NAME.
+      Return the index of the symbol in the SYMB_TABLE.  */
+ 
++#if __GNUC__ >= 4
++  auto inline int32_t
++#else
+   static inline int32_t
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+   __attribute ((always_inline))
++#endif
+   seek_collating_symbol_entry (name, name_len)
+ 	 const unsigned char *name;
+ 	 size_t name_len;
+@@ -2751,8 +2757,14 @@
+      Look up the collation sequence value of BR_ELEM.
+      Return the value if succeeded, UINT_MAX otherwise.  */
+ 
++#if __GNUC__ >= 4
++  auto inline unsigned int
++#else
+   static inline unsigned int
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+   __attribute ((always_inline))
++#endif
+   lookup_collation_sequence_value (br_elem)
+ 	 bracket_elem_t *br_elem;
+     {
+@@ -2819,8 +2831,14 @@
+      mbcset->range_ends, is a pointer argument sinse we may
+      update it.  */
+ 
+-  static inline reg_errcode_t
++#if __GNUC__ >= 4
++  auto inline reg_errcode_t
++#else
++  static inline reg_errcode_t
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+   __attribute ((always_inline))
++#endif
+ # ifdef RE_ENABLE_I18N
+   build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+ 	 re_charset_t *mbcset;
+@@ -2906,8 +2924,14 @@
+      COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+      pointer argument sinse we may update it.  */
+ 
+-  static inline reg_errcode_t
++#if __GNUC__ >= 4
++  auto inline reg_errcode_t
++#else
++  static inline reg_errcode_t
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+   __attribute ((always_inline))
++#endif
+ # ifdef RE_ENABLE_I18N
+   build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
+ 	 re_charset_t *mbcset;
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch
new file mode 100644
index 00000000..0c824bcf
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch
@@ -0,0 +1,65 @@
+(Combined with earlier fix old/glibc-2.3.2-powerpc-procfs.patch
+from http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html)
+
+This fix discussed here:
+http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html
+
+Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050303T1335, HEAD
+Changes since 1.11: +3 -8 lines
+Diff to previous 1.11 (colored)
+
+2005-02-21  Alan Modra <amodra@bigpond.net.au>
+
+	* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't
+	use __uint128_t.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc
+
+Fixes
+
+In file included from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:44,
+                 from ../linuxthreads/internals.h:30,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from <stdin>:2:
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class
+make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu'
+
+Rediffed against glibc-2.3.3
+
+--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	Sun Jan 12 00:24:23 2003
++++ glibc-2.3.3.new/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	Fri Mar 18 11:20:58 2005
+@@ -45,18 +45,13 @@
+ 
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+-#endif
+-
+-/* gcc 3.1 and newer support __uint128_t.  */
+-#if !__GNUC_PREREQ(3,1)
+-typedef struct {
+-  unsigned long u[4];
+-} __attribute((aligned(16))) __uint128_t;
+-#endif
+ 
+ /* Altivec registers */
+-typedef __uint128_t elf_vrreg_t;
++typedef struct {
++  unsigned int u[4];
++} __attribute__ ((aligned (16))) elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
++#endif
+ 
+ struct elf_siginfo
+   {
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch
new file mode 100644
index 00000000..c85aab90
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch
@@ -0,0 +1,60 @@
+Fixes
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/x86_64/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/x86_64/dl-machine.h:361: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/x86_64/dl-machine.h:525: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/x86_64/dl-machine.h:534: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/elf/dl-reloc.o] Error 1
+
+--- glibc-2.3.3/sysdeps/x86_64/dl-machine.h.old	Wed Mar 16 16:19:15 2005
++++ glibc-2.3.3/sysdeps/x86_64/dl-machine.h	Wed Mar 16 16:22:09 2005
+@@ -354,7 +354,14 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
+ 		  const Elf64_Sym *sym, const struct r_found_version *version,
+ 		  void *const reloc_addr_arg)
+@@ -519,7 +526,14 @@
+     }
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -528,7 +542,14 @@
+   *reloc_addr = l_addr + reloc->r_addend;
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch b/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch
new file mode 100644
index 00000000..7baea61c
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch
@@ -0,0 +1,41 @@
+Fix for this error:
+
+crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/build-glibc/libc_pic.os(.text+0xc8bd0): In function `__posix_fallocate64_l64':
+: undefined reference to `__GI___pwrite64'
+collect2: ld returned 1 exit status
+make[1]: *** [crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/build-glibc/libc.so] Error 1
+make[1]: Leaving directory `crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/glibc-2.3.3'
+make: *** [all] Error 2
+
+extracted from GLIBC CVS by Dan Kegel
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc'
+
+cf. 
+http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html
+
+
+--- glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h.old	2003-06-20 09:24:36.000000000 -0700
++++ glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h	2005-04-27 11:23:46.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003
++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+@@ -65,6 +65,16 @@
+ # define __NR_semtimedop	423
+ #endif
+ 
++/* This is a kludge to make syscalls.list find these under the names
++   pread and pwrite, since some kernel headers define those names
++   and some define the *64 names for the same system calls.  */
++#if !defined __NR_pread && defined __NR_pread64
++# define __NR_pread __NR_pread64
++#endif
++#if !defined __NR_pwrite && defined __NR_pwrite64
++# define __NR_pwrite __NR_pwrite64
++#endif
++
+ /*
+  * In order to get the hidden arguments for rt_sigaction set up
+  * properly, we need to call the assembly version.  This shouldn't
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch b/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch
new file mode 100644
index 00000000..0ad9a717
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch
@@ -0,0 +1,103 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ Rediffed against glibc-2.3.3 ]
+
+
+diff -aur glibc-2.3.3/Makeconfig glibc-2.3.3-cygwin/Makeconfig
+--- glibc-2.3.3/Makeconfig	2003-09-17 01:36:10.000000000 -0700
++++ glibc-2.3.3-cygwin/Makeconfig	2004-08-27 20:34:43.000000000 -0700
+@@ -439,13 +439,13 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ else
+ ifneq (,$(filter aix aix%,$(config-os)))
+ link-libc = $(common-objpfx)libc.a \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ rpath-dirs = math dlfcn nss nis rt resolv crypt
+ endif
+ endif
+@@ -658,7 +658,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -714,14 +714,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+diff -aur glibc-2.3.3/Makerules glibc-2.3.3-cygwin/Makerules
+--- glibc-2.3.3/Makerules	2003-10-31 16:35:57.000000000 -0800
++++ glibc-2.3.3-cygwin/Makerules	2004-08-27 20:33:47.000000000 -0700
+@@ -414,7 +414,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -934,7 +934,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -942,7 +942,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile	2002-08-29 03:41:15.000000000 -0700
++++ glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-27 20:35:43.000000000 -0700
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch b/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch
new file mode 100644
index 00000000..6ddc020f
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch
@@ -0,0 +1,75 @@
+wget "http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-09&msgid=20030911190500.GE12344%40sunsite.ms.mff.cuni.cz"
+aka http://sources.redhat.com/ml/libc-alpha/2003-09/msg00104.html
+
+This seems to fix the error
+   gcc-3.4.1-glibc-2.3.3/lib/gcc/powerpc-7400-linux-gnu/3.4.1/../../../../powerpc-7400-linux-gnu/bin/ld: cannot find -lgcc_eh
+   make[1]: *** [build/powerpc-7400-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/libc.so] Error 1
+but I assume it might cause trouble with nptl
+FIXME: once we figure out why this patch is wrong, fix it right :-)
+
+Date: Thu, 11 Sep 2003 21:05:00 +0200
+From: Jakub Jelinek <jakub at redhat dot com>
+To: libc-alpha at sources dot redhat dot com
+Subject: Re: Another ugly bootstrapping patch for libgcc_eh
+Message-ID: <20030911190500.GE12344@sunsite.ms.mff.cuni.cz>
+Reply-To: Jakub Jelinek <jakub at redhat dot com>
+References: <20030911194944.GA6104@nevyn.them.org> <20030911180703.GD12344@sunsite.ms.mff.cuni.cz> <20030911203621.GA31503@nevyn.them.org>
+In-Reply-To: <20030911203621 dot GA31503 at nevyn dot them dot org>
+
+On Thu, Sep 11, 2003 at 04:36:21PM -0400, Daniel Jacobowitz wrote:
+> > Why exactly do you need that?
+> > What exact library needs the functions from libgcc_eh.a?
+> > There shouldn't be any these days (__register_*/__frame_state_for etc.
+> > functions should come from sysdeps/generic on arches which need them,
+> > _Unwind_* come from unwind*.c).
+> > IMHO both:
+> > 
+> > # Force the backward compatibility EH functions to be linked.
+> > LDFLAGS-c.so += -u __register_frame
+> > 
+> > in Makerules and -lgcc_eh in Makeconfig should go.
+> 
+> If you say so.  That -lgcc_eh's been in and out quite a number of
+> times.  I was just assuming that it was necessary.
+
+I have been testing following patch on hammer.
+linuxthreads built just fine and NPTL libraries too,
+and in both cases libraries had the same exported symbols as without
+the patch (though its .text slightly shrunk because it no longer contained
+unneeded libgcc_eh routines (and also libc.so has fewer .plt slots).
+Unfortunately, sln in NPTL build doesn't link, as libgcc_eh.a is needed
+in this case.
+So, IMHO we need my Makerules change and Daniel's patch.
+
+2003-09-11  Jakub Jelinek  <jakub@redhat.com>
+
+	#* Makerules (LDFLAGS-c.so): Remove -u __register_frame.
+	* Makeconfig (gnulib): Remove -lgcc_eh.
+
+# Ulrich already applied this.
+#--- libc/Makerules.jj	2003-07-23 03:56:16.000000000 -0400
+#+++ libc/Makerules	2003-09-11 16:22:44.000000000 -0400
+#@@ -572,8 +572,6 @@ LDFLAGS-c.so = -nostdlib -nostartfiles
+# LDLIBS-c.so += $(gnulib)
+# # Give libc.so an entry point and make it directly runnable itself.
+# LDFLAGS-c.so += -e __libc_main
+#-# Force the backward compatibility EH functions to be linked.
+#-LDFLAGS-c.so += -u __register_frame
+# # Pre-link the objects of libc_pic.a so that we can locally resolve
+# # COMMON symbols before we link against ld.so.  This is because ld.so
+# # contains some of libc_pic.a already, which will prevent the COMMONs
+--- libc/Makeconfig.jj	2003-07-22 08:25:32.000000000 -0400
++++ libc/Makeconfig	2003-09-11 16:23:08.000000000 -0400
+@@ -505,7 +505,7 @@ link-libc-bounded = $(common-objpfx)libc
+ link-extra-libs-bounded = $(foreach lib,$(LDLIBS-$(@F:%-bp=%)),$(common-objpfx)$(lib)_b.a)
+ 
+ ifndef gnulib
+-gnulib := -lgcc -lgcc_eh
++gnulib := -lgcc
+ endif
+ ifeq ($(elf),yes)
+ +preinit = $(addprefix $(csu-objpfx),crti.o)
+
+
+	Jakub
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch b/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch
new file mode 100644
index 00000000..9f217445
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch
@@ -0,0 +1,128 @@
+See http://sources.redhat.com/ml/libc-hacker/2003-12/msg00023.html
+or http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c?cvsroot=glibc
+
+Should fix error 
+
+../sysdeps/unix/sysv/linux/posix_fadvise64.c: In function `__posix_fadvise64_l64':
+../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: warning: implicit declaration of function `DECLARGS_6'
+../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: error: parse error before "register"
+...
+../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: error: parse error before "ASMFMT_6"
+make[2]: *** [crosstool-0.28-rc34/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/io/posix_fadvise64.o] Error 1
+
+
+From: Martin Schwidefsky <schwidefsky at de dot ibm dot com>
+Organization: IBM Deutschland GmbH
+To: libc-hacker at sources dot redhat dot com
+Subject: fadvise64_64 for s390-32.
+Date: Fri, 5 Dec 2003 18:46:33 +0100
+
+Hi,
+on s390* system calls can have up to 5 paramters. The generic linux
+implemenation of fadvise64_64 for 32 bit systems needs 6 parameters,
+so we need to have a s390-32 special version of posix_fadvise64.c.
+For s390-64 we do not have the problem because there fadvise64_64
+has only 4 parameters.
+
+blue skies,
+  Martin.
+
+2003-12-05  Martin Schwidefsky  <schwidefsky@de.ibm.com>
+
+	* sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c: New file.
+
+diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c
+--- libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c	1970-01-01 01:00:00.000000000 +0100
++++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c	2003-11-13 15:31:40.000000000 +0100
+@@ -0,0 +1,90 @@
++/* Copyright (C) 2003 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, write to the Free
++   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++   02111-1307 USA.  */
++
++#include <errno.h>
++#include <fcntl.h>
++#include <sysdep.h>
++#include <kernel-features.h>
++
++int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise);
++int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise);
++
++/* Advice the system about the expected behaviour of the application with
++   respect to the file associated with FD.  */
++
++struct fadvise64_64_layout
++{
++  int fd;
++  off64_t offset;
++  off64_t len;
++  int advise;
++};
++
++int
++__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise)
++{
++#ifdef __NR_fadvise64_64
++  struct fadvise64_64_layout parameters;
++  INTERNAL_SYSCALL_DECL (err);
++  
++  parameters.fd = fd;
++  parameters.offset = offset;
++  parameters.len = len;
++  parameters.advise = advise;
++  int ret = INTERNAL_SYSCALL (fadvise64_64, err, 1, &parameters);
++  if (!INTERNAL_SYSCALL_ERROR_P (ret, err))
++    return 0;
++# ifndef __ASSUME_FADVISE64_64_SYSCALL
++  if (INTERNAL_SYSCALL_ERRNO (ret, err) != ENOSYS)
++# endif
++   return INTERNAL_SYSCALL_ERRNO (ret, err);
++#endif
++#ifndef __ASSUME_FADVISE64_64_SYSCALL
++# ifdef __NR_fadvise64
++  if (len != (off_t) len)
++    return EOVERFLOW;
++
++  INTERNAL_SYSCALL_DECL (err2);
++  int ret2 = INTERNAL_SYSCALL (fadvise64, err2, 5, fd,
++			       __LONG_LONG_PAIR ((long) (offset >> 32),
++						 (long) offset),
++			       (off_t) len, advise);
++  if (!INTERNAL_SYSCALL_ERROR_P (ret2, err2))
++    return 0;
++  return INTERNAL_SYSCALL_ERRNO (ret2, err2);
++# else
++  return ENOSYS;
++# endif
++#endif
++}
++
++#include <shlib-compat.h>
++
++#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3)
++
++int
++__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise)
++{
++  return __posix_fadvise64_l64 (fd, offset, len, advise);
++}
++
++versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3);
++compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2);
++#else
++strong_alias (__posix_fadvise64_l64, posix_fadvise64);
++#endif
+
diff --git a/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch b/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch
new file mode 100644
index 00000000..d75c4ba8
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch
@@ -0,0 +1,66 @@
+See http://sources.redhat.com/ml/libc-alpha/2004-02/msg00138.html
+aka http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2004-02&msgid=20040220044155.GE22135%40baldric.uwo.ca
+
+In CVS as
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/unwind-dw2.c.diff?r1=1.7&r2=1.8&cvsroot=glibc'
+
+Revision 1.8, Sat Feb 21 09:07:29 2004 UTC (5 months, 3 weeks ago) by drepper
+
+	Allow sjlj enabled compilers to build the code by removing
+	__USING_SJLJ_EXCEPTIONS__ wrapper.
+
+plus
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/framestate.c.diff?r1=1.3&r2=1.4&cvsroot=glibc'
+
+Revision 1.4, Sat Feb 21 09:07:05 2004 UTC (5 months, 3 weeks ago) by drepper
+
+	[__USING_SJLJ_EXCEPTIONS__] (__frame_state_for): Set frame_State_for
+	to abort if the compiler is using sjlj.
+
+Fixes compile error
+
+../sysdeps/generic/framestate.c: In function `__frame_state_for':
+../sysdeps/generic/framestate.c:44: error: `fallback_frame_state_for' undeclared (first use in this function)
+../sysdeps/generic/framestate.c:44: error: (Each undeclared identifier is reported only once
+../sysdeps/generic/framestate.c:44: error: for each function it appears in.)
+make[2]: *** [crosstool-0.28-rc34/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/elf/framestate.os] Error 1
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/generic/unwind-dw2.c,v
+retrieving revision 1.7
+retrieving revision 1.8
+diff -u -r1.7 -r1.8
+--- libc/sysdeps/generic/unwind-dw2.c	2003/07/22 23:55:55	1.7
++++ libc/sysdeps/generic/unwind-dw2.c	2004/02/21 09:07:29	1.8
+@@ -39,7 +39,6 @@
+ #endif
+ 
+ 
+-#ifndef __USING_SJLJ_EXCEPTIONS__
+ 
+ #ifndef STACK_GROWS_DOWNWARD
+ #define STACK_GROWS_DOWNWARD 0
+@@ -1287,4 +1286,3 @@
+ #include "unwind.inc"
+ 
+ #endif /* _LIBC */
+-#endif /* !USING_SJLJ_EXCEPTIONS */
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/generic/framestate.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/generic/framestate.c	2003/01/08 06:46:06	1.3
++++ libc/sysdeps/generic/framestate.c	2004/02/21 09:07:05	1.4
+@@ -41,7 +41,11 @@
+       if (handle == NULL
+ 	  || (frame_state_for
+ 	      = (framesf) __libc_dlsym (handle, "__frame_state_for")) == NULL)
++#ifndef __USING_SJLJ_EXCEPTIONS__
+ 	frame_state_for = fallback_frame_state_for;
++#else
++      	frame_state_for = abort;
++#endif
+     }
+ 
+   return frame_state_for (pc, frame_state);
diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch
new file mode 100644
index 00000000..f3ad0c61
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch
@@ -0,0 +1,117 @@
+Fixes
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24'
+../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf'
+
+when building glibc-2.3.[34] with gcc-4.0
+
+Like
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc
+but works with older compilers, and fixes fix_bad_pc24.
+
+
+--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old	Sun Mar 20 17:54:37 2005
++++ glibc-2.3.4/sysdeps/arm/dl-machine.h	Sun Mar 20 17:57:32 2005
+@@ -359,7 +359,14 @@
+ # endif
+ 
+ /* Deal with an out-of-range PC24 reloc.  */
+-static Elf32_Addr
++#if __GNUC__ >= 4
++  auto inline Elf32_Addr
++#else
++  static inline Elf32_Addr
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
+ {
+   static void *fix_page;
+@@ -392,7 +399,14 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
+ 		 const Elf32_Sym *sym, const struct r_found_version *version,
+ 		 void *const reloc_addr_arg)
+@@ -517,7 +531,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ 		  const Elf32_Sym *sym, const struct r_found_version *version,
+ 		  void *const reloc_addr_arg)
+@@ -597,7 +618,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+ 			  void *const reloc_addr_arg)
+ {
+@@ -606,7 +634,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -615,7 +650,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rel *reloc)
+ {
diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch
new file mode 100644
index 00000000..3bbe6ea8
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch
@@ -0,0 +1,61 @@
+From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+Fixes
+  rtld.c: In function '_dl_start':
+  dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined
+  dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined
+when compiling glibc-2.3.4 with gcc-4.0
+
+But see also
+http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and
+http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html
+which seem to propose less radical fixes?
+
+Aha.  See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721
+
+--- glibc-2.3-20050307/elf/dynamic-link.h.old	2005-03-12 18:12:37.000000000 -0800
++++ glibc-2.3-20050307/elf/dynamic-link.h	2005-03-12 18:12:59.777820848 -0800
+@@ -19,43 +19,6 @@
+ 
+ #include <elf.h>
+ #include <assert.h>
+-
+-#ifdef RESOLVE
+-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
+-   ElfW(Addr), because not all architectures can assume that the
+-   relocated address is properly aligned, whereas the compiler is
+-   entitled to assume that a pointer to a type is properly aligned for
+-   the type.  Even if we cast the pointer back to some other type with
+-   less strict alignment requirements, the compiler might still
+-   remember that the pointer was originally more aligned, thereby
+-   optimizing away alignment tests or using word instructions for
+-   copying memory, breaking the very code written to handle the
+-   unaligned cases.  */
+-auto void __attribute__((always_inline))
+-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
+-		 const ElfW(Sym) *sym, const struct r_found_version *version,
+-		 void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+-		  const ElfW(Sym) *sym, const struct r_found_version *version,
+-		  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+-			  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+-			   void *const reloc_addr);
+-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc);
+-# else
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc);
+-# endif
+-#endif
+-
+ #include <dl-machine.h>
+ 
+ #ifndef VERSYMIDX
diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
new file mode 100644
index 00000000..949a203e
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
@@ -0,0 +1,42 @@
+Fixes
+
+../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1
+
+diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h
+--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Jul 30 23:33:52 2003
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h	Thu Mar 17 13:19:16 2005
+@@ -455,7 +455,14 @@
+     }
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -463,7 +470,14 @@
+   *reloc_addr = l_addr + reloc->r_addend;
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
new file mode 100644
index 00000000..6844a9cd
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
@@ -0,0 +1,60 @@
+Fixes:
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:269:
+../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf'
+
+--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old	Thu Mar 17 13:35:23 2005
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h	Thu Mar 17 13:37:12 2005
+@@ -567,7 +567,14 @@
+                                 const Elf64_Sym *refsym)
+                                 attribute_hidden;
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -598,7 +605,14 @@
+ 
+ /* Perform the relocation specified by RELOC and SYM (which is fully
+    resolved).  MAP is the object containing the reloc.  */
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map,
+ 		  const Elf64_Rela *reloc,
+ 		  const Elf64_Sym *sym,
+@@ -883,7 +897,14 @@
+   MODIFIED_CODE_NOQUEUE (reloc_addr);
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.3/glibc-configure-apple-as.patch b/patches/glibc/2.3.3/glibc-configure-apple-as.patch
new file mode 100644
index 00000000..604c36d5
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-configure-apple-as.patch
@@ -0,0 +1,23 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3789,7 +3789,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
diff --git a/patches/glibc/2.3.3/glibc-fp-byteorder.patch b/patches/glibc/2.3.3/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..f20432ea
--- /dev/null
+++ b/patches/glibc/2.3.3/glibc-fp-byteorder.patch
@@ -0,0 +1,203 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
diff --git a/patches/glibc/2.3.4/arm-ctl_bus_isa.patch b/patches/glibc/2.3.4/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.3.4/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch b/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch
new file mode 100644
index 00000000..23ebc829
--- /dev/null
+++ b/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch
@@ -0,0 +1,96 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ Rediffed against glibc-2.3.3 ]
+
+
+diff -urN glibc-2.3.4-orig/Makeconfig glibc-2.3.4/Makeconfig
+--- glibc-2.3.4-orig/Makeconfig	2004-12-15 19:51:47.000000000 +0100
++++ glibc-2.3.4/Makeconfig	2005-03-13 18:54:58.000000000 +0100
+@@ -449,7 +449,7 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++            $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ endif
+@@ -667,7 +667,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -723,14 +723,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+diff -urN glibc-2.3.4-orig/Makerules glibc-2.3.4/Makerules
+--- glibc-2.3.4-orig/Makerules	2004-12-15 19:52:39.000000000 +0100
++++ glibc-2.3.4/Makerules	2005-03-13 18:50:09.000000000 +0100
+@@ -416,7 +416,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -961,7 +961,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -969,7 +969,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -urN glibc-2.3.4-orig/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.4/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.4-orig/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-16 08:46:14.000000000 +0200
++++ glibc-2.3.4/sysdeps/sparc/sparc32/sparcv9/Makefile	2005-03-13 18:50:09.000000000 +0100
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
diff --git a/patches/glibc/2.3.4/fix-pr398.patch b/patches/glibc/2.3.4/fix-pr398.patch
new file mode 100644
index 00000000..d5d03091
--- /dev/null
+++ b/patches/glibc/2.3.4/fix-pr398.patch
@@ -0,0 +1,70 @@
+Fixes error
+
+dl-runtime.c:222: error: parse error before "CFI_STARTPROC"
+make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim
+e.o] Error 1
+make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822/elf'
+make[1]: *** [elf/subdir_lib] Error 2
+make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822'
+make: *** [all] Error 2
+
+-----------------
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398
+http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html
+
+-----------------
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Branch: 	glibc-2_3-branch
+Changes by:	roland@sources.redhat.com	2006-02-23 22:36:51
+
+Modified files:
+	sysdeps/s390/s390-64: dl-machine.h 
+	sysdeps/s390/s390-32: dl-machine.h 
+
+Log message:
+	2004-07-10  GOTO Masanori  <gotom@debian.or.jp>
+	
+	[BZ #398]
+	* sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI
+	directive.
+	* sysdeps/s390/s390-64/dl-machine.h: Likewise.
+
+Patches:
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v
+retrieving revision 1.19.4.1
+retrieving revision 1.19.4.2
+diff -u -r1.19.4.1 -r1.19.4.2
+--- libc/sysdeps/s390/s390-64/dl-machine.h	2005/10/17 04:57:27	1.19.4.1
++++ libc/sysdeps/s390/s390-64/dl-machine.h	2006/02/23 22:36:51	1.19.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v
+retrieving revision 1.20.4.1
+retrieving revision 1.20.4.2
+diff -u -r1.20.4.1 -r1.20.4.2
+--- libc/sysdeps/s390/s390-32/dl-machine.h	2005/10/17 04:57:27	1.20.4.1
++++ libc/sysdeps/s390/s390-32/dl-machine.h	2006/02/23 22:36:51	1.20.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch
new file mode 100644
index 00000000..f3ad0c61
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch
@@ -0,0 +1,117 @@
+Fixes
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24'
+../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf'
+
+when building glibc-2.3.[34] with gcc-4.0
+
+Like
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc
+but works with older compilers, and fixes fix_bad_pc24.
+
+
+--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old	Sun Mar 20 17:54:37 2005
++++ glibc-2.3.4/sysdeps/arm/dl-machine.h	Sun Mar 20 17:57:32 2005
+@@ -359,7 +359,14 @@
+ # endif
+ 
+ /* Deal with an out-of-range PC24 reloc.  */
+-static Elf32_Addr
++#if __GNUC__ >= 4
++  auto inline Elf32_Addr
++#else
++  static inline Elf32_Addr
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
+ {
+   static void *fix_page;
+@@ -392,7 +399,14 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
+ 		 const Elf32_Sym *sym, const struct r_found_version *version,
+ 		 void *const reloc_addr_arg)
+@@ -517,7 +531,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ 		  const Elf32_Sym *sym, const struct r_found_version *version,
+ 		  void *const reloc_addr_arg)
+@@ -597,7 +618,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+ 			  void *const reloc_addr_arg)
+ {
+@@ -606,7 +634,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -615,7 +650,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rel *reloc)
+ {
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch
new file mode 100644
index 00000000..3bbe6ea8
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch
@@ -0,0 +1,61 @@
+From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+Fixes
+  rtld.c: In function '_dl_start':
+  dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined
+  dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined
+when compiling glibc-2.3.4 with gcc-4.0
+
+But see also
+http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and
+http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html
+which seem to propose less radical fixes?
+
+Aha.  See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721
+
+--- glibc-2.3-20050307/elf/dynamic-link.h.old	2005-03-12 18:12:37.000000000 -0800
++++ glibc-2.3-20050307/elf/dynamic-link.h	2005-03-12 18:12:59.777820848 -0800
+@@ -19,43 +19,6 @@
+ 
+ #include <elf.h>
+ #include <assert.h>
+-
+-#ifdef RESOLVE
+-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
+-   ElfW(Addr), because not all architectures can assume that the
+-   relocated address is properly aligned, whereas the compiler is
+-   entitled to assume that a pointer to a type is properly aligned for
+-   the type.  Even if we cast the pointer back to some other type with
+-   less strict alignment requirements, the compiler might still
+-   remember that the pointer was originally more aligned, thereby
+-   optimizing away alignment tests or using word instructions for
+-   copying memory, breaking the very code written to handle the
+-   unaligned cases.  */
+-auto void __attribute__((always_inline))
+-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
+-		 const ElfW(Sym) *sym, const struct r_found_version *version,
+-		 void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+-		  const ElfW(Sym) *sym, const struct r_found_version *version,
+-		  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+-			  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+-			   void *const reloc_addr);
+-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc);
+-# else
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc);
+-# endif
+-#endif
+-
+ #include <dl-machine.h>
+ 
+ #ifndef VERSYMIDX
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch
new file mode 100644
index 00000000..42be8a38
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch
@@ -0,0 +1,44 @@
+See http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+
+Fixes
+  In file included from jis0208.c:23:
+  jis0208.h:32: error: array type has incomplete element type
+when building glibc with gcc-4.0
+The bug has been present since at least glibc-2.2.5.
+This patch applies cleanly to glibc-2.3.4
+
+--- /home/dank/downloads/glibc-2.3-20050307/iconvdata/jis0208.h	2003-06-11 14:40:42.000000000 -0700
++++ glibc-2.3-20050307/iconvdata/jis0208.h	2005-03-13 20:55:01.784054760 -0800
+@@ -24,15 +24,6 @@
+ #include <gconv.h>
+ #include <stdint.h>
+ 
+-/* Conversion table.  */
+-extern const uint16_t __jis0208_to_ucs[];
+-
+-extern const char __jisx0208_from_ucs4_lat1[256][2];
+-extern const char __jisx0208_from_ucs4_greek[0xc1][2];
+-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
+-extern const char __jisx0208_from_ucs_tab[][2];
+-
+-
+ /* Struct for table with indeces in UCS mapping table.  */
+ struct jisx0208_ucs_idx
+ {
+@@ -42,6 +33,15 @@
+ };
+ 
+ 
++/* Conversion table.  */
++extern const uint16_t __jis0208_to_ucs[];
++
++extern const char __jisx0208_from_ucs4_lat1[256][2];
++extern const char __jisx0208_from_ucs4_greek[0xc1][2];
++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
++extern const char __jisx0208_from_ucs_tab[][2];
++
++
+ static inline uint32_t
+ __attribute ((always_inline))
+ jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset)
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch
new file mode 100644
index 00000000..d5d82934
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch
@@ -0,0 +1,62 @@
+First discussed here:
+http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html
+
+Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050303T1335, HEAD
+Changes since 1.11: +3 -8 lines
+Diff to previous 1.11 (colored)
+
+2005-02-21  Alan Modra <amodra@bigpond.net.au>
+
+	* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't
+	use __uint128_t.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc
+
+Fixes
+
+In file included from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:44,
+                 from ../linuxthreads/internals.h:30,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from <stdin>:2:
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class
+make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu'
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2003/12/17 23:09:34	1.11
++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2005/03/02 20:11:38	1.12
+@@ -46,15 +46,10 @@
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+ 
+-/* gcc 3.1 and newer support __uint128_t.  */
+-#if !__GNUC_PREREQ(3,1)
+-typedef struct {
+-  unsigned long u[4];
+-} __attribute((aligned(16))) __uint128_t;
+-#endif
+-
+ /* Altivec registers */
+-typedef __uint128_t elf_vrreg_t;
++typedef struct {
++  unsigned int u[4];
++} __attribute__ ((aligned (16))) elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
+ #endif
+ 
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
new file mode 100644
index 00000000..949a203e
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
@@ -0,0 +1,42 @@
+Fixes
+
+../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1
+
+diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h
+--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Jul 30 23:33:52 2003
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h	Thu Mar 17 13:19:16 2005
+@@ -455,7 +455,14 @@
+     }
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -463,7 +470,14 @@
+   *reloc_addr = l_addr + reloc->r_addend;
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
new file mode 100644
index 00000000..6844a9cd
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
@@ -0,0 +1,60 @@
+Fixes:
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:269:
+../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf'
+
+--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old	Thu Mar 17 13:35:23 2005
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h	Thu Mar 17 13:37:12 2005
+@@ -567,7 +567,14 @@
+                                 const Elf64_Sym *refsym)
+                                 attribute_hidden;
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -598,7 +605,14 @@
+ 
+ /* Perform the relocation specified by RELOC and SYM (which is fully
+    resolved).  MAP is the object containing the reloc.  */
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map,
+ 		  const Elf64_Rela *reloc,
+ 		  const Elf64_Sym *sym,
+@@ -883,7 +897,14 @@
+   MODIFIED_CODE_NOQUEUE (reloc_addr);
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch b/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch
new file mode 100644
index 00000000..ac72f53a
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch
@@ -0,0 +1,166 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.4 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.4 also requires a patch, see 
+../glibc-linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-cygwin.patch
+
+[ Ported to glibc-2.3.4 by steve@digidescorp.com ]
+
+--- glibc-2.3.4/Makeconfig.orig	2004-12-15 12:51:47.000000000 -0600
++++ glibc-2.3.4/Makeconfig	2005-06-29 00:31:27.000000000 -0500
+@@ -449,7 +449,7 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ endif
+@@ -667,7 +667,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -723,14 +723,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+--- glibc-2.3.4/Makerules.orig	2005-06-28 20:57:52.562500000 -0500
++++ glibc-2.3.4/Makerules	2005-06-29 00:27:21.328125000 -0500
+@@ -416,7 +416,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -968,7 +968,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -976,7 +976,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk
+--- glibc-2.3.5/extra-lib.mk	2004-12-02 23:54:47.000000000 +0100
++++ glibc-2.3.5-cygwin/extra-lib.mk	2005-05-11 08:27:28.156250000 +0200
+@@ -13,7 +13,7 @@
+ 
+ ifneq (,$($(lib)-static-only-routines))
+ ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version)))
+-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS)
++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST)
+ endif
+ endif
+ 
+@@ -29,7 +29,7 @@
+ 
+ # Add each flavor of library to the lists of things to build and install.
+ install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o)))
+-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\
++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\
+ 			$(patsubst %,%$o,$(filter-out \
+ 					   $($(lib)-shared-only-routines),\
+ 					   $(all-$(lib)-routines))))
+@@ -57,7 +57,7 @@
+ 
+ 
+ # Use o-iterator.mk to generate a rule for each flavor of library.
+-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib))))
++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib))))
+ define o-iterator-doit
+ $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \
+   $(patsubst %,$(objpfx)%$o,\
+@@ -65,7 +65,7 @@
+ 			  $(all-$(lib)-routines))); \
+ 	$$(build-extra-lib)
+ endef
+-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib)))
++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib)))
+ include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
+ endif
+ 
+@@ -77,9 +77,9 @@
+ 	$(build-extra-lib)
+ endif
+ 
+-ifneq (,$(filter .oS,$(object-suffixes-$(lib))))
+-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \
+-  $(patsubst %,$(objpfx)%.oS,\
++ifneq (,$(filter .oST,$(object-suffixes-$(lib))))
++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \
++  $(patsubst %,$(objpfx)%.oST,\
+ 	     $(filter $($(lib)-static-only-routines),\
+ 		      $(all-$(lib)-routines)))
+ 	$(build-extra-lib)
+diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile
+--- glibc-2.3.5/nptl/Makefile	2005-02-16 09:45:56.000000000 +0100
++++ glibc-2.3.5-cygwin/nptl/Makefile	2005-05-11 08:26:01.812500000 +0200
+@@ -360,7 +360,7 @@
+ 
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -368,7 +368,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-16 08:46:14.000000000 +0200
++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile	2005-05-11 08:26:25.937500000 +0200
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
diff --git a/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch b/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch
new file mode 100644
index 00000000..c01faf83
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch
@@ -0,0 +1,46 @@
+Fixes
+    ../sysdeps/i386/i686/memcmp.S: Assembler messages:
+    ../sysdeps/i386/i686/memcmp.S:390: Error: can't resolve  `.rodata' {.rodata section} - `memcmp' {.text section}
+when building on macosx.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S?cvsroot=glibc
+Revision 1.4, Thu Apr 28 18:19:25 2005 UTC by drepper
+Branch: MAIN
+CVS Tags: fedora-glibc-20050503T0852
+Changes since 1.3: +2 -2 lines
+Diff to previous 1.3 (colored)
+
+Move misplaced END.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S.diff?r1=1.3&r2=1.4&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/i686/memcmp.S,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/i386/i686/memcmp.S	2004/04/01 23:28:37	1.3
++++ libc/sysdeps/i386/i686/memcmp.S	2005/04/28 18:19:25	1.4
+@@ -1,5 +1,5 @@
+ /* Compare two memory blocks for differences in the first COUNT bytes.
+-   Copyright (C) 2004 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -350,6 +350,7 @@
+ 	sbbl	$-1, %eax
+ 	popl	%esi
+ 	RETURN
++END (BP_SYM (memcmp))
+ 
+ 	.section	.rodata
+ 	ALIGN (2)
+@@ -387,7 +388,6 @@
+ 	.long	L(30bytes) - . + 0x78
+ 	.long	L(31bytes) - . + 0x7c
+ 
+-END (BP_SYM (memcmp))
+ 
+ #undef bcmp
+ weak_alias (BP_SYM (memcmp), BP_SYM (bcmp))
diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch
new file mode 100644
index 00000000..7e2fdc8e
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch
@@ -0,0 +1,83 @@
+
+Fixes? the following error when building with gcc-4.0.0:
+
+../string/strcoll.c:39: error: '__EI_strcoll' aliased to undefined symbol '__GI_strcoll'
+make[2]: *** [/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcscoll.os] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/wcsmbs'
+
+
+Thu Mar 17 21:06:24 2005 UTC (3 weeks, 5 days ago) by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD
+
+2005-03-16  Richard Henderson  <rth@redhat.com>
+
+	* include/wchar.h (__wcscoll): Remove.
+	* wcsmbs/wcscoll.c: Define wcscoll directly instead of via __wcscoll.
+	* string/strcoll.c: Don't issue libc_hidden_def STRCOLL redefined.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/string/strcoll.c.diff?r1=1.33&r2=1.34&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/wchar.h.diff?r1=1.26&r2=1.27&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/wcsmbs/wcscoll.c.diff?r1=1.13&r2=1.14&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/string/strcoll.c,v
+retrieving revision 1.33
+retrieving revision 1.34
+diff -u -r1.33 -r1.34
+--- libc/string/strcoll.c	2004/03/14 20:51:30	1.33
++++ libc/string/strcoll.c	2005/03/17 21:06:24	1.34
+@@ -23,6 +23,7 @@
+ # define STRING_TYPE char
+ # define STRCOLL strcoll
+ # define STRCOLL_L __strcoll_l
++# define USE_HIDDEN_DEF
+ #endif
+ 
+ #include "../locale/localeinfo.h"
+@@ -35,6 +36,7 @@
+ {
+   return STRCOLL_L (s1, s2, _NL_CURRENT_LOCALE);
+ }
+-#if !defined WIDE_CHAR_VERSION
+-libc_hidden_def (strcoll)
++
++#ifdef USE_HIDDEN_DEF
++libc_hidden_def (STRCOLL)
+ #endif
+===================================================================
+RCS file: /cvs/glibc/libc/include/wchar.h,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- libc/include/wchar.h	2004/03/14 20:45:10	1.26
++++ libc/include/wchar.h	2005/03/17 21:06:24	1.27
+@@ -56,7 +56,6 @@
+ extern int __wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
+ 			  size_t __n)
+      __attribute_pure__;
+-extern int __wcscoll (__const wchar_t *__s1, __const wchar_t *__s2);
+ extern size_t __wcslen (__const wchar_t *__s) __attribute_pure__;
+ extern size_t __wcsnlen (__const wchar_t *__s, size_t __maxlen)
+      __attribute_pure__;
+===================================================================
+RCS file: /cvs/glibc/libc/wcsmbs/wcscoll.c,v
+retrieving revision 1.13
+retrieving revision 1.14
+diff -u -r1.13 -r1.14
+--- libc/wcsmbs/wcscoll.c	2004/03/14 21:05:48	1.13
++++ libc/wcsmbs/wcscoll.c	2005/03/17 21:06:24	1.14
+@@ -22,12 +22,11 @@
+ 
+ #define STRING_TYPE wchar_t
+ #define USTRING_TYPE wint_t
+-#define STRCOLL __wcscoll
++#define STRCOLL wcscoll
+ #define STRCOLL_L __wcscoll_l
+ 
+ #include "../string/strcoll.c"
+ 
+ #ifndef USE_IN_EXTENDED_LOCALE_MODEL
+-weak_alias (__wcscoll, wcscoll)
+ libc_hidden_weak (wcscoll)
+ #endif
diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch
new file mode 100644
index 00000000..ace71e24
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch
@@ -0,0 +1,126 @@
+If I'm really lucky, this fixes the following error building with gcc-4.0.0:
+
+../sysdeps/ieee754/dbl-64/s_isinf.c:29: error: 'isinf' aliased to undefined symbol '__isinf'
+make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/math/s_isinf.os] Error 1
+make[1]: *** [math/subdir_lib] Error 2
+make: *** [lib] Error 2
+
+---
+
+
+Revision 1.71, Thu Mar 17 21:06:27 2005 UTC (3 weeks, 5 days ago) by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD
+Changes since 1.70: +11 -66 lines
+Diff to previous 1.70 (colored)
+
+2005-03-16  Richard Henderson  <rth@redhat.com>
+
+	* include/libc-symbols.h (__hidden_proto): Remove bogus declaration
+	of internal.
+	(__hidden_def1, __hidden_dot_def1): Remove.
+	(__hidden_def2, __hidden_def3): Remove.
+	(__hidden_ver1): New.
+	(hidden_ver, hidden_def, hidden_weak): Use it.
+	(hidden_data_ver, hidden_data_ver, hidden_data_weak): Use non-data
+	version of the macro.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.70&r2=1.71&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/include/libc-symbols.h,v
+retrieving revision 1.70
+retrieving revision 1.71
+diff -u -r1.70 -r1.71
+--- libc/include/libc-symbols.h	2005/02/11 00:29:46	1.70
++++ libc/include/libc-symbols.h	2005/03/17 21:06:27	1.71
+@@ -583,78 +583,23 @@
+ #  define hidden_proto(name, attrs...) \
+   __hidden_proto (name, __GI_##name, ##attrs)
+ #  define __hidden_proto(name, internal, attrs...) \
+-  extern __typeof (name) internal; \
+   extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
+   __hidden_proto_hiddenattr (attrs);
+ #  define __hidden_asmname(name) \
+   __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
+ #  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
+ #  define __hidden_asmname2(prefix, name) #prefix name
+-#  ifdef HAVE_ASM_SET_DIRECTIVE
+-#   define __hidden_def1(original, alias)			\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP	\
+-  .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+-#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_def1(original, alias)	 ASM_LINE_SEP	\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+-#   else
+-#     define __hidden_dot_def1(original, alias)
+-#   endif
+-#  else
+-#   define __hidden_def1(original, alias)			\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+-#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#    define __hidden_dot_def1(original, alias)	ASM_LINE_SEP	\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+-#   else
+-#    define __hidden_dot_def1(original, alias)
+-#   endif
+-#  endif
+-#  define __hidden_def2(...) #__VA_ARGS__
+-#  define __hidden_def3(...) __hidden_def2 (__VA_ARGS__)
+-#  define hidden_def(name)					\
+-  __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \
+-  __hidden_dot_def1 (__GI_##name, name)));
+-#  define hidden_data_def(name)					\
+-  __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name)));
+-#  define hidden_ver(local, name)				\
+-  __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \
+-  __hidden_dot_def1 (local, __GI_##name)));
+-#  define hidden_data_ver(local, name)				\
+-  __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name)));
+-#  ifdef HAVE_WEAK_SYMBOLS
+-#   ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+-#    define __hidden_weak1(original, alias)			\
+-  .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+-#    ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_weak1(original, alias)	ASM_LINE_SEP	\
+-  .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+-#    else
+-#     define __hidden_dot_weak1(original, alias)
+-#    endif
+-#   else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+-#    define __hidden_weak1(original, alias)			\
+-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP			\
+-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+-#    ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_weak1(original, alias)	ASM_LINE_SEP	\
+-  .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+-#    else
+-#     define __hidden_dot_weak1(original, alias)
+-#    endif
+-#   endif
+-#   define hidden_weak(name)					\
+-  __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \
+-  __hidden_dot_weak1 (__GI_##name, name)));
+-#   define hidden_data_weak(name)					\
+-  __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name)));
+-#  else
+-#   define hidden_weak(name) hidden_def (name)
+-#  endif
++#  define __hidden_ver1(local, internal, name) \
++  extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
++  extern __typeof (name) __EI_##name \
++	__attribute__((alias (__hidden_asmname (#local))))
++#  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
++#  define hidden_data_ver(local, name)	hidden_ver(local, name)
++#  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
++#  define hidden_data_def(name)		hidden_def(name)
++#  define hidden_weak(name) \
++	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
++#  define hidden_data_weak(name)	hidden_weak(name)
+ # else
+ /* For assembly, we need to do the opposite of what we do in C:
+    in assembly gcc __REDIRECT stuff is not in place, so functions
diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch
new file mode 100644
index 00000000..5637ce64
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch
@@ -0,0 +1,57 @@
+Fixes
+../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal'
+../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l'
+../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l'
+make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1
+
+https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html
+%changelog
++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18
++- fix build on 64-bit arches with new GCC
+
+Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub
+Branch: fedora-branch
+CVS Tags: fedora-glibc-2_3_4-18
+Changes since 1.4: +2 -0 lines
+Diff to previous 1.4 (colored)
+
+	* sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED.
+	* sysdeps/wordsize-64/wcstol_l.c: Likewise.
+
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/strtol_l.c	2003/03/03 09:45:12	1.4
++++ libc/sysdeps/wordsize-64/strtol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,7 +8,9 @@
+ #undef ____strtoll_l_internal
+ #undef __strtoll_l
+ #undef strtoll_l
++#if !UNSIGNED
+ strong_alias (____strtol_l_internal, ____strtoll_l_internal)
+ libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal)
+ weak_alias (__strtol_l, __strtoll_l)
+ weak_alias (__strtol_l, strtoll_l)
++#endif
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/wcstol_l.c	2002/08/08 11:44:51	1.4
++++ libc/sysdeps/wordsize-64/wcstol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,6 +8,8 @@
+ #undef ____wcstoll_l_internal
+ #undef __wcstoll_l
+ #undef wcstoll_l
++#if !UNSIGNED
+ strong_alias (____wcstol_l_internal, ____wcstoll_l_internal)
+ weak_alias (__wcstol_l, __wcstoll_l)
+ weak_alias (__wcstol_l, wcstoll_l)
++#endif
diff --git a/patches/glibc/2.3.4/glibc-configure-apple-as.patch b/patches/glibc/2.3.4/glibc-configure-apple-as.patch
new file mode 100644
index 00000000..604c36d5
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-configure-apple-as.patch
@@ -0,0 +1,23 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3789,7 +3789,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
diff --git a/patches/glibc/2.3.4/glibc-fp-byteorder.patch b/patches/glibc/2.3.4/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..f20432ea
--- /dev/null
+++ b/patches/glibc/2.3.4/glibc-fp-byteorder.patch
@@ -0,0 +1,203 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
diff --git a/patches/glibc/2.3.4/make-install-lib-all.patch b/patches/glibc/2.3.4/make-install-lib-all.patch
new file mode 100644
index 00000000..38457228
--- /dev/null
+++ b/patches/glibc/2.3.4/make-install-lib-all.patch
@@ -0,0 +1,24 @@
+From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch
+Rule to install all needed libraries, not just the ones installed by install-lib,
+yet not install programs.  
+Needed because we can't use the main install target, as we can't build programs before
+we have the final gcc installed; linking fails because libeh.a is not present,
+and glibc insists on linking programs with that library.
+
+diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules
+--- glibc-2.3.4.orig/Makerules	2004-12-15 20:52:39.000000000 +0200
++++ glibc-2.3.4/Makerules	2005-02-19 15:16:31.415125176 +0200
+@@ -844,6 +844,13 @@
+ installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\
+ 			     $(inst_libdir)/$(patsubst %,$(libtype$o),\
+ 						     $(libprefix)$(libc-name)))
++
++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \
++		$(inst_slibdir)/libc-$(version).so \
++		$(inst_libdir)/libc.so \
++		$(inst_libdir)/libc.a \
++		install-lib
++
+ install: $(installed-libcs)
+ $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force)
+ 	$(make-target-directory)
diff --git a/patches/glibc/2.3.4/pr758.patch b/patches/glibc/2.3.4/pr758.patch
new file mode 100644
index 00000000..d1142a2d
--- /dev/null
+++ b/patches/glibc/2.3.4/pr758.patch
@@ -0,0 +1,256 @@
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=758
+
+Submitted By: Jim Gifford (patches at jg555 dot com)
+Date: 2005-02-23
+Initial Package Version: 2.3.4
+Origin: Richard Sandiford
+Upstream Status: Unknown
+Description: Fixes Syscall.h generation
+ 
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile	2004-11-24 04:38:15 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile	2005-02-23 18:21:54 +0000
+@@ -9,11 +9,73 @@
+ 
+ no_syscall_list_h = 1
+ 
+-# Generate the list of SYS_* macros for the system calls (__NR_* macros).
+-# We generate not only SYS_<syscall>, pointing at SYS_<abi>_<syscall> if
+-# it exists, but also define SYS_<abi>_<syscall> for all ABIs.
++# A callable macro that expands to a shell command.  Preprocess file $(1)
++# using ABI option $(2) and see which macros it defines.  Print FOO for each
++# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros
++# that have a prefix other than $(3).
++mips_list_syscalls =	$(filter-out -m%,$(CC)) -E -x c $(+includes) \
++			    $(sysincludes) -D_LIBC -dM -mabi=$(2) $(1) | \
++			sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \
++			sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \
++			LC_ALL=C sort
++
++# Generate a list of SYS_* macros from the linux __NR macros.
++#
++# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports,
++# each with its own set of headers.  The ports were merged for 2.6 and
++# this merged port defines the syscalls in a slightly different way.
++# There are therefore three sets of headers that we need to consider:
++#
++#    (1) Headers from the separate 32-bit MIPS port.  They just define
++#	 a single list of __NR macros.
++#
++#    (2) Headers from the separate 64-bit MIPS port.  They unconditionally
++#	 define syscalls for all three ABIs, with o32 syscalls prefixed
++#	 by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls
++#	 prefixed by plain __NR.
++#
++#    (3) Headers from the combined port.  They use the _MIPS_SIM macro to
++#	 define the right set of syscalls for the current ABI.  The syscalls
++#	 themselves have no special ABI prefix, but the headers also define:
++#
++#	    __NR_O32_Linux{,_syscalls}
++#	    __NR_N32_Linux{,_syscalls}
++#	    __NR_64_Linux{,_syscalls}
++#
++# In case (1) we just want a simple list of SYS_* macros.  In cases (2)
++# and (3) we want a file that will work for all three ABIs, regardless
++# of which ABI we are currently using.  We also want the file to work
++# if the user later moves from (2) to (3).  Thus the file we create
++# for (2) and (3) has the form:
++#
++#    #if _MIPS_SIM == _MIPS_SIM_NABI32
++#    # ifdef __NR_N32_open
++#    #  define SYS_n32syscall1 __NR_N32_n32syscall1
++#    #  ...
++#    # else
++#    #  define SYS_n32syscall1 __NR_n32syscall1
++#    #  ...
++#    # endif
++#    #elif _MIPS_SIM == _MIPS_SIM_ABI64
++#    # define SYS_n64syscall1 __NR_n64syscall1
++#    # ...
++#    #else
++#    # ifdef __NR_O32_open
++#    #  define SYS_o32syscall1 __NR_O32_o32syscall1
++#    #  ...
++#    # else
++#    #  define SYS_o32syscall1 __NR_o32syscall1
++#    #  ...
++#    # endif
++#    #endif
++#
++# Here, __NR_N32_open and __NR_O32_open are used to detect case (2)
++# over case (3).  The n64 SYS_* macros can always use the normal
++# ABI-less names.
+ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h
+ 	$(make-target-directory)
++	$(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \
++	      -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null
+ 	{ \
+ 	 echo '/* Generated at libc build time from kernel syscall list.  */';\
+ 	 echo ''; \
+@@ -22,28 +84,38 @@
+ 	 echo '#endif'; \
+ 	 echo ''; \
+ 	 echo '#include <sgidefs.h>'; \
+-	 rm -f $(@:.d=.h).newt; \
+-	 $(CC) -E -MD -MP -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' \
+-	       -x c $(+includes) $(sysincludes) $< -D_LIBC -dM | \
+-	 sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' \
+-	     > $(@:.d=.h).newt; \
+-	 if grep SYS_O32_ $(@:.d=.h).newt > /dev/null; then \
++ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
++ 	 $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \
++ 	 if test -s $(@:.d=.h).newn32; then \
++ 	   if grep open $(@:.d=.h).newn32 > /dev/null; then \
++ 	     $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \
++ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
++ 	   else \
++ 	     $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \
++ 	     $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \
++ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
++ 	   fi; \
+ 	   echo '#if _MIPS_SIM == _ABIN32'; \
+-	   sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   echo '# ifdef __NR_N32_open'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \
++ 	   echo '# else'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \
++ 	   echo '# endif'; \
+ 	   echo '#elif _MIPS_SIM == _ABI64'; \
+-	   sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \
+ 	   echo '#else'; \
+-	   sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   echo '# ifdef __NR_O32_open'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \
++ 	   echo '# else'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \
++ 	   echo '# endif'; \
+ 	   echo '#endif'; \
+-	   sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort +1.8; \
+ 	 else \
+-	   cat $(@:.d=.h).newt; \
++ 	   $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \
++ 	   sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \
++ 	   LC_ALL=C sort; \
+ 	 fi; \
+-	 rm $(@:.d=.h).newt; \
++ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
+ 	} > $(@:.d=.h).new
+ 	mv -f $(@:.d=.h).new $(@:.d=.h)
+ ifneq (,$(objpfx))
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure	2004-11-24 04:42:45 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure	2005-02-23 18:10:11 +0000
+@@ -18,7 +18,7 @@
+     { echo "$as_me:$LINENO: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&5
+ echo "$as_me: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&2;}
+     echo '#include <asm/unistd.h>' > asm-unistd.h
+-  else
++  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
+     # The point of this preprocessing is to turn __NR_<syscall> into
+     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
+     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
+@@ -68,6 +68,8 @@
+ {
+ 	print;
+ }'
++  else
++    echo '#include <asm/unistd.h>' > asm-unistd.h
+   fi ;;
+ mips*)
+   rm -f asm-unistd.h
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in	2004-11-24 04:38:31 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in	2005-02-23 18:10:11 +0000
+@@ -18,7 +18,7 @@
+   if test ! -f "$asm_unistd_h"; then
+     AC_MSG_WARN([*** asm/unistd.h not found, it will not be pre-processed])
+     echo '#include <asm/unistd.h>' > asm-unistd.h
+-  else
++  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
+     # The point of this preprocessing is to turn __NR_<syscall> into
+     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
+     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
+@@ -68,6 +68,8 @@
+ {
+ 	print;
+ }'
++  else
++    echo '#include <asm/unistd.h>' > asm-unistd.h
+   fi ;;
+ mips*)
+   rm -f asm-unistd.h
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2003-03-29 08:15:29 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -1,36 +0,0 @@
+-/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H
+-#define _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H 1
+-
+-/* There is some commonality.  */
+-#include <sysdeps/unix/sysv/linux/mips/mips32/sysdep.h>
+-
+-/* For Linux we can use the system call table in the header file
+-	/usr/include/asm/unistd.h
+-   of the kernel.  But these symbols do not follow the SYS_* syntax
+-   so we have to redefine the `SYS_ify' macro here.  */
+-#undef SYS_ify
+-#ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_O32_##syscall_name
+-#else
+-# define SYS_ify(syscall_name)	__NR_O32_/**/syscall_name
+-#endif
+-
+-#endif /* linux/mips/mips32/kern64/sysdep.h */
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2004-10-18 05:16:07 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -28,9 +28,9 @@
+    so we have to redefine the `SYS_ify' macro here.  */
+ #undef SYS_ify
+ #ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_N32_##syscall_name
++# define SYS_ify(syscall_name)	__NR_##syscall_name
+ #else
+-# define SYS_ify(syscall_name)	__NR_N32_/**/syscall_name
++# define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
+ #ifdef __ASSEMBLER__
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2004-10-18 05:16:08 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -28,9 +28,9 @@
+    so we have to redefine the `SYS_ify' macro here.  */
+ #undef SYS_ify
+ #ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_N64_##syscall_name
++# define SYS_ify(syscall_name)	__NR_##syscall_name
+ #else
+-# define SYS_ify(syscall_name)	__NR_N64_/**/syscall_name
++# define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
+ #ifdef __ASSEMBLER__
diff --git a/patches/glibc/2.3.5/arm-ctl_bus_isa.patch b/patches/glibc/2.3.5/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/2.3.5/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/2.3.5/fix-pr398.patch b/patches/glibc/2.3.5/fix-pr398.patch
new file mode 100644
index 00000000..d5d03091
--- /dev/null
+++ b/patches/glibc/2.3.5/fix-pr398.patch
@@ -0,0 +1,70 @@
+Fixes error
+
+dl-runtime.c:222: error: parse error before "CFI_STARTPROC"
+make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim
+e.o] Error 1
+make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822/elf'
+make[1]: *** [elf/subdir_lib] Error 2
+make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822'
+make: *** [all] Error 2
+
+-----------------
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398
+http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html
+
+-----------------
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Branch: 	glibc-2_3-branch
+Changes by:	roland@sources.redhat.com	2006-02-23 22:36:51
+
+Modified files:
+	sysdeps/s390/s390-64: dl-machine.h 
+	sysdeps/s390/s390-32: dl-machine.h 
+
+Log message:
+	2004-07-10  GOTO Masanori  <gotom@debian.or.jp>
+	
+	[BZ #398]
+	* sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI
+	directive.
+	* sysdeps/s390/s390-64/dl-machine.h: Likewise.
+
+Patches:
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v
+retrieving revision 1.19.4.1
+retrieving revision 1.19.4.2
+diff -u -r1.19.4.1 -r1.19.4.2
+--- libc/sysdeps/s390/s390-64/dl-machine.h	2005/10/17 04:57:27	1.19.4.1
++++ libc/sysdeps/s390/s390-64/dl-machine.h	2006/02/23 22:36:51	1.19.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v
+retrieving revision 1.20.4.1
+retrieving revision 1.20.4.2
+diff -u -r1.20.4.1 -r1.20.4.2
+--- libc/sysdeps/s390/s390-32/dl-machine.h	2005/10/17 04:57:27	1.20.4.1
++++ libc/sysdeps/s390/s390-32/dl-machine.h	2006/02/23 22:36:51	1.20.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch
new file mode 100644
index 00000000..f3ad0c61
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch
@@ -0,0 +1,117 @@
+Fixes
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24'
+../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel'
+../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative'
+../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf'
+
+when building glibc-2.3.[34] with gcc-4.0
+
+Like
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc
+but works with older compilers, and fixes fix_bad_pc24.
+
+
+--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old	Sun Mar 20 17:54:37 2005
++++ glibc-2.3.4/sysdeps/arm/dl-machine.h	Sun Mar 20 17:57:32 2005
+@@ -359,7 +359,14 @@
+ # endif
+ 
+ /* Deal with an out-of-range PC24 reloc.  */
+-static Elf32_Addr
++#if __GNUC__ >= 4
++  auto inline Elf32_Addr
++#else
++  static inline Elf32_Addr
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
+ {
+   static void *fix_page;
+@@ -392,7 +399,14 @@
+ /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+    MAP is the object containing the reloc.  */
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
+ 		 const Elf32_Sym *sym, const struct r_found_version *version,
+ 		 void *const reloc_addr_arg)
+@@ -517,7 +531,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ 		  const Elf32_Sym *sym, const struct r_found_version *version,
+ 		  void *const reloc_addr_arg)
+@@ -597,7 +618,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+ 			  void *const reloc_addr_arg)
+ {
+@@ -606,7 +634,14 @@
+ }
+ 
+ # ifndef RTLD_BOOTSTRAP
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -615,7 +650,14 @@
+ }
+ # endif
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rel *reloc)
+ {
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch
new file mode 100644
index 00000000..3bbe6ea8
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch
@@ -0,0 +1,61 @@
+From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+Fixes
+  rtld.c: In function '_dl_start':
+  dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined
+  dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined
+when compiling glibc-2.3.4 with gcc-4.0
+
+But see also
+http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and
+http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html
+which seem to propose less radical fixes?
+
+Aha.  See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721
+
+--- glibc-2.3-20050307/elf/dynamic-link.h.old	2005-03-12 18:12:37.000000000 -0800
++++ glibc-2.3-20050307/elf/dynamic-link.h	2005-03-12 18:12:59.777820848 -0800
+@@ -19,43 +19,6 @@
+ 
+ #include <elf.h>
+ #include <assert.h>
+-
+-#ifdef RESOLVE
+-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
+-   ElfW(Addr), because not all architectures can assume that the
+-   relocated address is properly aligned, whereas the compiler is
+-   entitled to assume that a pointer to a type is properly aligned for
+-   the type.  Even if we cast the pointer back to some other type with
+-   less strict alignment requirements, the compiler might still
+-   remember that the pointer was originally more aligned, thereby
+-   optimizing away alignment tests or using word instructions for
+-   copying memory, breaking the very code written to handle the
+-   unaligned cases.  */
+-auto void __attribute__((always_inline))
+-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
+-		 const ElfW(Sym) *sym, const struct r_found_version *version,
+-		 void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+-		  const ElfW(Sym) *sym, const struct r_found_version *version,
+-		  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+-			  void *const reloc_addr);
+-auto void __attribute__((always_inline))
+-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+-			   void *const reloc_addr);
+-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc);
+-# else
+-auto void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc);
+-# endif
+-#endif
+-
+ #include <dl-machine.h>
+ 
+ #ifndef VERSYMIDX
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch
new file mode 100644
index 00000000..42be8a38
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch
@@ -0,0 +1,44 @@
+See http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+
+Fixes
+  In file included from jis0208.c:23:
+  jis0208.h:32: error: array type has incomplete element type
+when building glibc with gcc-4.0
+The bug has been present since at least glibc-2.2.5.
+This patch applies cleanly to glibc-2.3.4
+
+--- /home/dank/downloads/glibc-2.3-20050307/iconvdata/jis0208.h	2003-06-11 14:40:42.000000000 -0700
++++ glibc-2.3-20050307/iconvdata/jis0208.h	2005-03-13 20:55:01.784054760 -0800
+@@ -24,15 +24,6 @@
+ #include <gconv.h>
+ #include <stdint.h>
+ 
+-/* Conversion table.  */
+-extern const uint16_t __jis0208_to_ucs[];
+-
+-extern const char __jisx0208_from_ucs4_lat1[256][2];
+-extern const char __jisx0208_from_ucs4_greek[0xc1][2];
+-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
+-extern const char __jisx0208_from_ucs_tab[][2];
+-
+-
+ /* Struct for table with indeces in UCS mapping table.  */
+ struct jisx0208_ucs_idx
+ {
+@@ -42,6 +33,15 @@
+ };
+ 
+ 
++/* Conversion table.  */
++extern const uint16_t __jis0208_to_ucs[];
++
++extern const char __jisx0208_from_ucs4_lat1[256][2];
++extern const char __jisx0208_from_ucs4_greek[0xc1][2];
++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[];
++extern const char __jisx0208_from_ucs_tab[][2];
++
++
+ static inline uint32_t
+ __attribute ((always_inline))
+ jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset)
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch
new file mode 100644
index 00000000..d5d82934
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch
@@ -0,0 +1,62 @@
+First discussed here:
+http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html
+
+Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050303T1335, HEAD
+Changes since 1.11: +3 -8 lines
+Diff to previous 1.11 (colored)
+
+2005-02-21  Alan Modra <amodra@bigpond.net.au>
+
+	* sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't
+	use __uint128_t.
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc
+
+Fixes
+
+In file included from ../linuxthreads_db/proc_service.h:20,
+                 from ../linuxthreads_db/thread_dbP.h:7,
+                 from ../linuxthreads/descr.h:44,
+                 from ../linuxthreads/internals.h:30,
+                 from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27,
+                 from ../sysdeps/generic/ldsodefs.h:38,
+                 from ../sysdeps/unix/sysv/linux/ldsodefs.h:25,
+                 from <stdin>:2:
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t'
+../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class
+make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu'
+
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2003/12/17 23:09:34	1.11
++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h	2005/03/02 20:11:38	1.12
+@@ -46,15 +46,10 @@
+ typedef double elf_fpreg_t;
+ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+ 
+-/* gcc 3.1 and newer support __uint128_t.  */
+-#if !__GNUC_PREREQ(3,1)
+-typedef struct {
+-  unsigned long u[4];
+-} __attribute((aligned(16))) __uint128_t;
+-#endif
+-
+ /* Altivec registers */
+-typedef __uint128_t elf_vrreg_t;
++typedef struct {
++  unsigned int u[4];
++} __attribute__ ((aligned (16))) elf_vrreg_t;
+ typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
+ #endif
+ 
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
new file mode 100644
index 00000000..949a203e
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch
@@ -0,0 +1,42 @@
+Fixes
+
+../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1
+
+diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h
+--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Jul 30 23:33:52 2003
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h	Thu Mar 17 13:19:16 2005
+@@ -455,7 +455,14 @@
+     }
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -463,7 +470,14 @@
+   *reloc_addr = l_addr + reloc->r_addend;
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
new file mode 100644
index 00000000..6844a9cd
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch
@@ -0,0 +1,60 @@
+Fixes:
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:269:
+../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf'
+
+--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old	Thu Mar 17 13:35:23 2005
++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h	Thu Mar 17 13:37:12 2005
+@@ -567,7 +567,14 @@
+                                 const Elf64_Sym *refsym)
+                                 attribute_hidden;
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -598,7 +605,14 @@
+ 
+ /* Perform the relocation specified by RELOC and SYM (which is fully
+    resolved).  MAP is the object containing the reloc.  */
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map,
+ 		  const Elf64_Rela *reloc,
+ 		  const Elf64_Sym *sym,
+@@ -883,7 +897,14 @@
+   MODIFIED_CODE_NOQUEUE (reloc_addr);
+ }
+ 
+-static inline void
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+ {
diff --git a/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch b/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch
new file mode 100644
index 00000000..c01faf83
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch
@@ -0,0 +1,46 @@
+Fixes
+    ../sysdeps/i386/i686/memcmp.S: Assembler messages:
+    ../sysdeps/i386/i686/memcmp.S:390: Error: can't resolve  `.rodata' {.rodata section} - `memcmp' {.text section}
+when building on macosx.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S?cvsroot=glibc
+Revision 1.4, Thu Apr 28 18:19:25 2005 UTC by drepper
+Branch: MAIN
+CVS Tags: fedora-glibc-20050503T0852
+Changes since 1.3: +2 -2 lines
+Diff to previous 1.3 (colored)
+
+Move misplaced END.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S.diff?r1=1.3&r2=1.4&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/i386/i686/memcmp.S,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/sysdeps/i386/i686/memcmp.S	2004/04/01 23:28:37	1.3
++++ libc/sysdeps/i386/i686/memcmp.S	2005/04/28 18:19:25	1.4
+@@ -1,5 +1,5 @@
+ /* Compare two memory blocks for differences in the first COUNT bytes.
+-   Copyright (C) 2004 Free Software Foundation, Inc.
++   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -350,6 +350,7 @@
+ 	sbbl	$-1, %eax
+ 	popl	%esi
+ 	RETURN
++END (BP_SYM (memcmp))
+ 
+ 	.section	.rodata
+ 	ALIGN (2)
+@@ -387,7 +388,6 @@
+ 	.long	L(30bytes) - . + 0x78
+ 	.long	L(31bytes) - . + 0x7c
+ 
+-END (BP_SYM (memcmp))
+ 
+ #undef bcmp
+ weak_alias (BP_SYM (memcmp), BP_SYM (bcmp))
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch
new file mode 100644
index 00000000..1df59555
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch
@@ -0,0 +1,19 @@
+../sysdeps/generic/wordexp.c: In function 'exec_comm':
+../sysdeps/generic/wordexp.c:815: sorry, unimplemented: inlining failed in call to 'exec_comm_child': function body not available
+../sysdeps/generic/wordexp.c:900: sorry, unimplemented: called from here
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/posix/wordexp.o] Error
+
+I had to add the keyword 'inline' to get it to compile:
+
+--- glibc-2.3-20050307/sysdeps/generic/wordexp.c.old	2005-03-12 08:54:15.709253928 -0800
++++ glibc-2.3-20050307/sysdeps/generic/wordexp.c	2005-03-12 08:54:51.242852000 -0800
+@@ -809,7 +809,7 @@
+ }
+
+ /* Function called by child process in exec_comm() */
+-static void
++static inline void
+ internal_function __attribute__ ((always_inline))
+ exec_comm_child (char *comm, int *fildes, int showerr, int noexec)
+ {
+
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch
new file mode 100644
index 00000000..7e2fdc8e
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch
@@ -0,0 +1,83 @@
+
+Fixes? the following error when building with gcc-4.0.0:
+
+../string/strcoll.c:39: error: '__EI_strcoll' aliased to undefined symbol '__GI_strcoll'
+make[2]: *** [/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcscoll.os] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/wcsmbs'
+
+
+Thu Mar 17 21:06:24 2005 UTC (3 weeks, 5 days ago) by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD
+
+2005-03-16  Richard Henderson  <rth@redhat.com>
+
+	* include/wchar.h (__wcscoll): Remove.
+	* wcsmbs/wcscoll.c: Define wcscoll directly instead of via __wcscoll.
+	* string/strcoll.c: Don't issue libc_hidden_def STRCOLL redefined.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/string/strcoll.c.diff?r1=1.33&r2=1.34&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/wchar.h.diff?r1=1.26&r2=1.27&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/wcsmbs/wcscoll.c.diff?r1=1.13&r2=1.14&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/string/strcoll.c,v
+retrieving revision 1.33
+retrieving revision 1.34
+diff -u -r1.33 -r1.34
+--- libc/string/strcoll.c	2004/03/14 20:51:30	1.33
++++ libc/string/strcoll.c	2005/03/17 21:06:24	1.34
+@@ -23,6 +23,7 @@
+ # define STRING_TYPE char
+ # define STRCOLL strcoll
+ # define STRCOLL_L __strcoll_l
++# define USE_HIDDEN_DEF
+ #endif
+ 
+ #include "../locale/localeinfo.h"
+@@ -35,6 +36,7 @@
+ {
+   return STRCOLL_L (s1, s2, _NL_CURRENT_LOCALE);
+ }
+-#if !defined WIDE_CHAR_VERSION
+-libc_hidden_def (strcoll)
++
++#ifdef USE_HIDDEN_DEF
++libc_hidden_def (STRCOLL)
+ #endif
+===================================================================
+RCS file: /cvs/glibc/libc/include/wchar.h,v
+retrieving revision 1.26
+retrieving revision 1.27
+diff -u -r1.26 -r1.27
+--- libc/include/wchar.h	2004/03/14 20:45:10	1.26
++++ libc/include/wchar.h	2005/03/17 21:06:24	1.27
+@@ -56,7 +56,6 @@
+ extern int __wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
+ 			  size_t __n)
+      __attribute_pure__;
+-extern int __wcscoll (__const wchar_t *__s1, __const wchar_t *__s2);
+ extern size_t __wcslen (__const wchar_t *__s) __attribute_pure__;
+ extern size_t __wcsnlen (__const wchar_t *__s, size_t __maxlen)
+      __attribute_pure__;
+===================================================================
+RCS file: /cvs/glibc/libc/wcsmbs/wcscoll.c,v
+retrieving revision 1.13
+retrieving revision 1.14
+diff -u -r1.13 -r1.14
+--- libc/wcsmbs/wcscoll.c	2004/03/14 21:05:48	1.13
++++ libc/wcsmbs/wcscoll.c	2005/03/17 21:06:24	1.14
+@@ -22,12 +22,11 @@
+ 
+ #define STRING_TYPE wchar_t
+ #define USTRING_TYPE wint_t
+-#define STRCOLL __wcscoll
++#define STRCOLL wcscoll
+ #define STRCOLL_L __wcscoll_l
+ 
+ #include "../string/strcoll.c"
+ 
+ #ifndef USE_IN_EXTENDED_LOCALE_MODEL
+-weak_alias (__wcscoll, wcscoll)
+ libc_hidden_weak (wcscoll)
+ #endif
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch
new file mode 100644
index 00000000..ace71e24
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch
@@ -0,0 +1,126 @@
+If I'm really lucky, this fixes the following error building with gcc-4.0.0:
+
+../sysdeps/ieee754/dbl-64/s_isinf.c:29: error: 'isinf' aliased to undefined symbol '__isinf'
+make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/math/s_isinf.os] Error 1
+make[1]: *** [math/subdir_lib] Error 2
+make: *** [lib] Error 2
+
+---
+
+
+Revision 1.71, Thu Mar 17 21:06:27 2005 UTC (3 weeks, 5 days ago) by roland
+Branch: MAIN
+CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD
+Changes since 1.70: +11 -66 lines
+Diff to previous 1.70 (colored)
+
+2005-03-16  Richard Henderson  <rth@redhat.com>
+
+	* include/libc-symbols.h (__hidden_proto): Remove bogus declaration
+	of internal.
+	(__hidden_def1, __hidden_dot_def1): Remove.
+	(__hidden_def2, __hidden_def3): Remove.
+	(__hidden_ver1): New.
+	(hidden_ver, hidden_def, hidden_weak): Use it.
+	(hidden_data_ver, hidden_data_ver, hidden_data_weak): Use non-data
+	version of the macro.
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.70&r2=1.71&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/include/libc-symbols.h,v
+retrieving revision 1.70
+retrieving revision 1.71
+diff -u -r1.70 -r1.71
+--- libc/include/libc-symbols.h	2005/02/11 00:29:46	1.70
++++ libc/include/libc-symbols.h	2005/03/17 21:06:27	1.71
+@@ -583,78 +583,23 @@
+ #  define hidden_proto(name, attrs...) \
+   __hidden_proto (name, __GI_##name, ##attrs)
+ #  define __hidden_proto(name, internal, attrs...) \
+-  extern __typeof (name) internal; \
+   extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
+   __hidden_proto_hiddenattr (attrs);
+ #  define __hidden_asmname(name) \
+   __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
+ #  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
+ #  define __hidden_asmname2(prefix, name) #prefix name
+-#  ifdef HAVE_ASM_SET_DIRECTIVE
+-#   define __hidden_def1(original, alias)			\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP	\
+-  .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+-#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_def1(original, alias)	 ASM_LINE_SEP	\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+-#   else
+-#     define __hidden_dot_def1(original, alias)
+-#   endif
+-#  else
+-#   define __hidden_def1(original, alias)			\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+-#   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#    define __hidden_dot_def1(original, alias)	ASM_LINE_SEP	\
+-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+-#   else
+-#    define __hidden_dot_def1(original, alias)
+-#   endif
+-#  endif
+-#  define __hidden_def2(...) #__VA_ARGS__
+-#  define __hidden_def3(...) __hidden_def2 (__VA_ARGS__)
+-#  define hidden_def(name)					\
+-  __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \
+-  __hidden_dot_def1 (__GI_##name, name)));
+-#  define hidden_data_def(name)					\
+-  __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name)));
+-#  define hidden_ver(local, name)				\
+-  __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \
+-  __hidden_dot_def1 (local, __GI_##name)));
+-#  define hidden_data_ver(local, name)				\
+-  __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name)));
+-#  ifdef HAVE_WEAK_SYMBOLS
+-#   ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
+-#    define __hidden_weak1(original, alias)			\
+-  .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
+-#    ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_weak1(original, alias)	ASM_LINE_SEP	\
+-  .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
+-#    else
+-#     define __hidden_dot_weak1(original, alias)
+-#    endif
+-#   else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
+-#    define __hidden_weak1(original, alias)			\
+-  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP			\
+-  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+-#    ifdef HAVE_ASM_GLOBAL_DOT_NAME
+-#     define __hidden_dot_weak1(original, alias)	ASM_LINE_SEP	\
+-  .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP	\
+-  C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+-#    else
+-#     define __hidden_dot_weak1(original, alias)
+-#    endif
+-#   endif
+-#   define hidden_weak(name)					\
+-  __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \
+-  __hidden_dot_weak1 (__GI_##name, name)));
+-#   define hidden_data_weak(name)					\
+-  __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name)));
+-#  else
+-#   define hidden_weak(name) hidden_def (name)
+-#  endif
++#  define __hidden_ver1(local, internal, name) \
++  extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
++  extern __typeof (name) __EI_##name \
++	__attribute__((alias (__hidden_asmname (#local))))
++#  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
++#  define hidden_data_ver(local, name)	hidden_ver(local, name)
++#  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
++#  define hidden_data_def(name)		hidden_def(name)
++#  define hidden_weak(name) \
++	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
++#  define hidden_data_weak(name)	hidden_weak(name)
+ # else
+ /* For assembly, we need to do the opposite of what we do in C:
+    in assembly gcc __REDIRECT stuff is not in place, so functions
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch
new file mode 100644
index 00000000..5637ce64
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch
@@ -0,0 +1,57 @@
+Fixes
+../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal'
+../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l'
+../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l'
+make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1
+
+https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html
+%changelog
++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18
++- fix build on 64-bit arches with new GCC
+
+Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub
+Branch: fedora-branch
+CVS Tags: fedora-glibc-2_3_4-18
+Changes since 1.4: +2 -0 lines
+Diff to previous 1.4 (colored)
+
+	* sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED.
+	* sysdeps/wordsize-64/wcstol_l.c: Likewise.
+
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/strtol_l.c	2003/03/03 09:45:12	1.4
++++ libc/sysdeps/wordsize-64/strtol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,7 +8,9 @@
+ #undef ____strtoll_l_internal
+ #undef __strtoll_l
+ #undef strtoll_l
++#if !UNSIGNED
+ strong_alias (____strtol_l_internal, ____strtoll_l_internal)
+ libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal)
+ weak_alias (__strtol_l, __strtoll_l)
+ weak_alias (__strtol_l, strtoll_l)
++#endif
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/wcstol_l.c	2002/08/08 11:44:51	1.4
++++ libc/sysdeps/wordsize-64/wcstol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,6 +8,8 @@
+ #undef ____wcstoll_l_internal
+ #undef __wcstoll_l
+ #undef wcstoll_l
++#if !UNSIGNED
+ strong_alias (____wcstol_l_internal, ____wcstoll_l_internal)
+ weak_alias (__wcstol_l, __wcstoll_l)
+ weak_alias (__wcstol_l, wcstoll_l)
++#endif
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch b/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch
new file mode 100644
index 00000000..8adea8bb
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch
@@ -0,0 +1,185 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.x on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.5 also requires a patch, see 
+../glibc-linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch
+
+[ forward ported to glibc-2.3.5 by Petr Cvachoucek:
+
+Message-ID: <4282FCBA.3040000@unicontrols.cz>
+Date: Thu, 12 May 2005 08:50:34 +0200
+From: Petr Cvachoucek <cvachoucek@unicontrols.cz>
+To: Dan Kegel <dank@kegel.com>
+CC:  crossgcc@sources.redhat.com
+Subject: Patches to build gcc 3.4.3 / glibc 2.3.5 on cygwin
+
+Hi Dan,
+following patches are needed to build gcc-3.4.3/glibc-2.3.5 toolchain
+on cygwin. Tested to build toolchains for powerpc 604 and 750 targets.
+
+-- 
+                     Petr Cvachoucek
+                     Unicontrols a.s.
+                     http://www.unicontrols.cz
+]
+
+diff -aur glibc-2.3.5/Makeconfig glibc-2.3.5-cygwin/Makeconfig
+--- glibc-2.3.5/Makeconfig	2005-02-16 11:50:19.000000000 +0100
++++ glibc-2.3.5-cygwin/Makeconfig	2005-05-11 08:24:51.046875000 +0200
+@@ -449,7 +449,7 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ endif
+@@ -656,7 +656,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -712,14 +712,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(PIC-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+diff -aur glibc-2.3.5/Makerules glibc-2.3.5-cygwin/Makerules
+--- glibc-2.3.5/Makerules	2004-12-15 19:52:39.000000000 +0100
++++ glibc-2.3.5-cygwin/Makerules	2005-05-11 08:25:33.578125000 +0200
+@@ -416,7 +416,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -961,7 +961,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -969,7 +969,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk
+--- glibc-2.3.5/extra-lib.mk	2004-12-02 23:54:47.000000000 +0100
++++ glibc-2.3.5-cygwin/extra-lib.mk	2005-05-11 08:27:28.156250000 +0200
+@@ -13,7 +13,7 @@
+ 
+ ifneq (,$($(lib)-static-only-routines))
+ ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version)))
+-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS)
++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST)
+ endif
+ endif
+ 
+@@ -29,7 +29,7 @@
+ 
+ # Add each flavor of library to the lists of things to build and install.
+ install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o)))
+-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\
++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\
+ 			$(patsubst %,%$o,$(filter-out \
+ 					   $($(lib)-shared-only-routines),\
+ 					   $(all-$(lib)-routines))))
+@@ -57,7 +57,7 @@
+ 
+ 
+ # Use o-iterator.mk to generate a rule for each flavor of library.
+-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib))))
++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib))))
+ define o-iterator-doit
+ $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \
+   $(patsubst %,$(objpfx)%$o,\
+@@ -65,7 +65,7 @@
+ 			  $(all-$(lib)-routines))); \
+ 	$$(build-extra-lib)
+ endef
+-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib)))
++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib)))
+ include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
+ endif
+ 
+@@ -77,9 +77,9 @@
+ 	$(build-extra-lib)
+ endif
+ 
+-ifneq (,$(filter .oS,$(object-suffixes-$(lib))))
+-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \
+-  $(patsubst %,$(objpfx)%.oS,\
++ifneq (,$(filter .oST,$(object-suffixes-$(lib))))
++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \
++  $(patsubst %,$(objpfx)%.oST,\
+ 	     $(filter $($(lib)-static-only-routines),\
+ 		      $(all-$(lib)-routines)))
+ 	$(build-extra-lib)
+diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile
+--- glibc-2.3.5/nptl/Makefile	2005-02-16 09:45:56.000000000 +0100
++++ glibc-2.3.5-cygwin/nptl/Makefile	2005-05-11 08:26:01.812500000 +0200
+@@ -360,7 +360,7 @@
+ 
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -368,7 +368,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-16 08:46:14.000000000 +0200
++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile	2005-05-11 08:26:25.937500000 +0200
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch b/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch
new file mode 100644
index 00000000..2ef3ae32
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch
@@ -0,0 +1,43 @@
+From dank@kegel.com
+Wed Jun 15 09:12:43 PDT 2005
+
+Fixes
+
+build-glibc/libc.a(nsswitch.o)(.data+0x64): undefined reference to `_nss_files_getaliasent_r'
+build-glibc/libc.a(nsswitch.o)(.data+0x6c): undefined reference to `_nss_files_endaliasent'
+... 53 lines deleted ...
+build-glibc/libc.a(nsswitch.o)(.data+0x21c): undefined reference to `_nss_files_getspnam_r'
+collect2: ld returned 1 exit status
+make[2]: *** [/build/gcc-3.4.3-glibc-2.3.5-hdrs-2.6.11.2/i686-unknown-linux-gnu/build-glibc/elf/ldconfig] Error 1
+
+when building glibc with --enable-static-nss.
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=631
+
+--- glibc-2.3.5/Makeconfig.old	Wed Jun 15 08:13:12 2005
++++ glibc-2.3.5/Makeconfig	Wed Jun 15 08:13:14 2005
+@@ -487,7 +487,7 @@
+ 
+ # The static libraries.
+ ifeq (yes,$(build-static))
+-link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a
++link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a
+ else
+ ifeq (yes,$(build-shared))
+ # We can try to link the programs with lib*_pic.a...
+--- glibc-2.3.5/elf/Makefile.old	Wed Jun 15 07:46:49 2005
++++ glibc-2.3.5/elf/Makefile	Wed Jun 15 08:14:00 2005
+@@ -114,6 +114,13 @@
+ install-bin-script = ldd
+ endif
+ 
++ifeq (yes,$(build-static-nss))
++nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
++resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
++otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \
++	     $(resolvobjdir)/libresolv.a
++endif
++
+ others		= sprof sln
+ install-bin	= sprof
+ others-static   = sln
diff --git a/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch b/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch
new file mode 100644
index 00000000..dcc7c9bd
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch
@@ -0,0 +1,69 @@
+[http://sources.redhat.com/ml/crossgcc/2005-10/msg00035.html]
+
+Message-ID: <434576E1.6020305@sscd.de>
+Date: Thu, 06 Oct 2005 21:11:29 +0200
+From: Alexander Sieb <sieb@sscd.de>
+To: crossgcc@sourceware.org
+Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches
+
+Hi,
+
+attached you find the files I needed to add to crosstool-0.38
+in order to build a sh4-linux gcc-4.0.2-glibc-2.3.5 tool chain.
+
+Files attached:
+
+sh4-gcc4.dat:
+        * gcc4 needs --with-multilib-list=m4,m4-nofpu otherwise a linux
+        kernel won't build as it uses the -m4-nofpu option.
+
+gcc-pr21623.patch:
+        * Kaz Kojima provided a patch [really, a workaround -dank] for http://gcc.gnu.org/PR21623
+
+glibc-2.3.5-sh-memset.patch:
+        * A patch for glibc-2.3.5 which corrects memset. From SUGIOKA Toshinobu.
+        See content for rationale.
+
+-- snip --
+
+-- Here's patch 2 of 2, plus URLs showing where it is in CVS --
+
+[http://sources.redhat.com/ml/glibc-cvs/2005-q3/msg00319.html]
+
+Date: 24 Jul 2005 22:54:32 -0000
+Message-ID: <20050724225432.2111.qmail@sourceware.org>
+From: roland at sourceware dot org
+To: glibc-cvs at sources dot redhat dot com
+Subject: libc/sysdeps/sh memset.S
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	roland@sources.redhat.com	2005-07-24 22:54:32
+
+Modified files:
+	sysdeps/sh     : memset.S 
+
+Log message:
+	2005-07-24  SUGIOKA Toshinobu  <sugioka@itonet.co.jp>
+	
+	* sysdeps/sh/memset.S (memset): Correct 2nd argument handling.
+
+[http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/sh/memset.S.diff?cvsroot=glibc&r1=1.4&r2=1.5]
+
+RCS file: /cvs/glibc/libc/sysdeps/sh/memset.S,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/sysdeps/sh/memset.S	2003/04/29 22:47:18	1.4
++++ libc/sysdeps/sh/memset.S	2005/07/24 22:54:32	1.5
+@@ -28,6 +28,7 @@
+ 	bt.s	L_byte_loop_init
+ 	mov	r4,r7
+ 
++	extu.b	r5,r5
+ 	swap.b	r5,r1
+ 	or	r1,r5
+ 	swap.w	r5,r1
+
+
+[See also http://sources.redhat.com/ml/libc-alpha/2005-07/msg00051.html]
diff --git a/patches/glibc/2.3.5/glibc-configure-apple-as.patch b/patches/glibc/2.3.5/glibc-configure-apple-as.patch
new file mode 100644
index 00000000..604c36d5
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-configure-apple-as.patch
@@ -0,0 +1,23 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3789,7 +3789,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
diff --git a/patches/glibc/2.3.5/glibc-fp-byteorder.patch b/patches/glibc/2.3.5/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..f20432ea
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-fp-byteorder.patch
@@ -0,0 +1,203 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
diff --git a/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch b/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
new file mode 100644
index 00000000..38873ec6
--- /dev/null
+++ b/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
@@ -0,0 +1,35 @@
+http://sourceware.org/ml/crossgcc/2005-05/msg00165.html
+Fixes a MIPS build problem (unrelated to NPTL)
+
+Message-ID: <428E8B24.1000201@realitydiluted.com>
+Date: Fri, 20 May 2005 20:13:08 -0500
+From: "Steven J dot  Hill" <sjhill at realitydiluted dot com>
+To:  crossgcc at sources dot redhat dot com,  toolchain at gentoo dot org, 
+ Shay_Gal-On at pmc-sierra dot com,  TheNop at gmx dot net
+Subject: New NPTL patches for crosstools and MIPS NPTL patches....
+
+Greetings.
+
+I have uploaded the latest NPTL patch for crosstool-0.34. I have also
+uploaded a tarball of the patches necessary to build a MIPS NPTL
+cross toolchain. To build a MIPS NPTL toolchain you will need the
+released version of binutils-2.16 and the absolute latest GCC and
+glibc code from the HEAD of cvs. Use the 'demo-mips-nptl.sh' script
+to build the toolchain. Please report bugs or issues to the crossgcc
+mailing list. Here is the link off of my FTP site:
+
+    ftp://ftp.realitydiluted.com/crosstools/crosstool-0.34/
+
+[Note: BOOTSTRAP_GCC is set by crosstool.sh when invoking make install-headers]
+
+diff -ur glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile
+--- glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile	2003-03-29 02:15:28.000000000 -0600
++++ glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile	2005-04-12 21:36:51.318837655 -0500
+@@ -1,3 +1,7 @@
++ifeq ($(filter -DBOOTSTRAP_GCC,$(CFLAGS)),)
+ ifeq ($(filter -mabi=32,$(CC)),)
+ CC += -mabi=32
+ endif
++else
++CC += -D"_MIPS_SZPTR=32"
++endif
diff --git a/patches/glibc/2.3.5/make-install-lib-all.patch b/patches/glibc/2.3.5/make-install-lib-all.patch
new file mode 100644
index 00000000..38457228
--- /dev/null
+++ b/patches/glibc/2.3.5/make-install-lib-all.patch
@@ -0,0 +1,24 @@
+From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch
+Rule to install all needed libraries, not just the ones installed by install-lib,
+yet not install programs.  
+Needed because we can't use the main install target, as we can't build programs before
+we have the final gcc installed; linking fails because libeh.a is not present,
+and glibc insists on linking programs with that library.
+
+diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules
+--- glibc-2.3.4.orig/Makerules	2004-12-15 20:52:39.000000000 +0200
++++ glibc-2.3.4/Makerules	2005-02-19 15:16:31.415125176 +0200
+@@ -844,6 +844,13 @@
+ installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\
+ 			     $(inst_libdir)/$(patsubst %,$(libtype$o),\
+ 						     $(libprefix)$(libc-name)))
++
++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \
++		$(inst_slibdir)/libc-$(version).so \
++		$(inst_libdir)/libc.so \
++		$(inst_libdir)/libc.a \
++		install-lib
++
+ install: $(installed-libcs)
+ $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force)
+ 	$(make-target-directory)
diff --git a/patches/glibc/2.3.5/pr758.patch b/patches/glibc/2.3.5/pr758.patch
new file mode 100644
index 00000000..d1142a2d
--- /dev/null
+++ b/patches/glibc/2.3.5/pr758.patch
@@ -0,0 +1,256 @@
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=758
+
+Submitted By: Jim Gifford (patches at jg555 dot com)
+Date: 2005-02-23
+Initial Package Version: 2.3.4
+Origin: Richard Sandiford
+Upstream Status: Unknown
+Description: Fixes Syscall.h generation
+ 
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile	2004-11-24 04:38:15 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile	2005-02-23 18:21:54 +0000
+@@ -9,11 +9,73 @@
+ 
+ no_syscall_list_h = 1
+ 
+-# Generate the list of SYS_* macros for the system calls (__NR_* macros).
+-# We generate not only SYS_<syscall>, pointing at SYS_<abi>_<syscall> if
+-# it exists, but also define SYS_<abi>_<syscall> for all ABIs.
++# A callable macro that expands to a shell command.  Preprocess file $(1)
++# using ABI option $(2) and see which macros it defines.  Print FOO for each
++# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros
++# that have a prefix other than $(3).
++mips_list_syscalls =	$(filter-out -m%,$(CC)) -E -x c $(+includes) \
++			    $(sysincludes) -D_LIBC -dM -mabi=$(2) $(1) | \
++			sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \
++			sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \
++			LC_ALL=C sort
++
++# Generate a list of SYS_* macros from the linux __NR macros.
++#
++# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports,
++# each with its own set of headers.  The ports were merged for 2.6 and
++# this merged port defines the syscalls in a slightly different way.
++# There are therefore three sets of headers that we need to consider:
++#
++#    (1) Headers from the separate 32-bit MIPS port.  They just define
++#	 a single list of __NR macros.
++#
++#    (2) Headers from the separate 64-bit MIPS port.  They unconditionally
++#	 define syscalls for all three ABIs, with o32 syscalls prefixed
++#	 by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls
++#	 prefixed by plain __NR.
++#
++#    (3) Headers from the combined port.  They use the _MIPS_SIM macro to
++#	 define the right set of syscalls for the current ABI.  The syscalls
++#	 themselves have no special ABI prefix, but the headers also define:
++#
++#	    __NR_O32_Linux{,_syscalls}
++#	    __NR_N32_Linux{,_syscalls}
++#	    __NR_64_Linux{,_syscalls}
++#
++# In case (1) we just want a simple list of SYS_* macros.  In cases (2)
++# and (3) we want a file that will work for all three ABIs, regardless
++# of which ABI we are currently using.  We also want the file to work
++# if the user later moves from (2) to (3).  Thus the file we create
++# for (2) and (3) has the form:
++#
++#    #if _MIPS_SIM == _MIPS_SIM_NABI32
++#    # ifdef __NR_N32_open
++#    #  define SYS_n32syscall1 __NR_N32_n32syscall1
++#    #  ...
++#    # else
++#    #  define SYS_n32syscall1 __NR_n32syscall1
++#    #  ...
++#    # endif
++#    #elif _MIPS_SIM == _MIPS_SIM_ABI64
++#    # define SYS_n64syscall1 __NR_n64syscall1
++#    # ...
++#    #else
++#    # ifdef __NR_O32_open
++#    #  define SYS_o32syscall1 __NR_O32_o32syscall1
++#    #  ...
++#    # else
++#    #  define SYS_o32syscall1 __NR_o32syscall1
++#    #  ...
++#    # endif
++#    #endif
++#
++# Here, __NR_N32_open and __NR_O32_open are used to detect case (2)
++# over case (3).  The n64 SYS_* macros can always use the normal
++# ABI-less names.
+ $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h
+ 	$(make-target-directory)
++	$(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \
++	      -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null
+ 	{ \
+ 	 echo '/* Generated at libc build time from kernel syscall list.  */';\
+ 	 echo ''; \
+@@ -22,28 +84,38 @@
+ 	 echo '#endif'; \
+ 	 echo ''; \
+ 	 echo '#include <sgidefs.h>'; \
+-	 rm -f $(@:.d=.h).newt; \
+-	 $(CC) -E -MD -MP -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' \
+-	       -x c $(+includes) $(sysincludes) $< -D_LIBC -dM | \
+-	 sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' \
+-	     > $(@:.d=.h).newt; \
+-	 if grep SYS_O32_ $(@:.d=.h).newt > /dev/null; then \
++ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
++ 	 $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \
++ 	 if test -s $(@:.d=.h).newn32; then \
++ 	   if grep open $(@:.d=.h).newn32 > /dev/null; then \
++ 	     $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \
++ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
++ 	   else \
++ 	     $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \
++ 	     $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \
++ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
++ 	   fi; \
+ 	   echo '#if _MIPS_SIM == _ABIN32'; \
+-	   sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   echo '# ifdef __NR_N32_open'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \
++ 	   echo '# else'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \
++ 	   echo '# endif'; \
+ 	   echo '#elif _MIPS_SIM == _ABI64'; \
+-	   sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \
+ 	   echo '#else'; \
+-	   sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort; \
++ 	   echo '# ifdef __NR_O32_open'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \
++ 	   echo '# else'; \
++ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \
++ 	   echo '# endif'; \
+ 	   echo '#endif'; \
+-	   sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt | \
+-		LC_ALL=C sort +1.8; \
+ 	 else \
+-	   cat $(@:.d=.h).newt; \
++ 	   $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \
++ 	   sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \
++ 	   LC_ALL=C sort; \
+ 	 fi; \
+-	 rm $(@:.d=.h).newt; \
++ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
+ 	} > $(@:.d=.h).new
+ 	mv -f $(@:.d=.h).new $(@:.d=.h)
+ ifneq (,$(objpfx))
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure	2004-11-24 04:42:45 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure	2005-02-23 18:10:11 +0000
+@@ -18,7 +18,7 @@
+     { echo "$as_me:$LINENO: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&5
+ echo "$as_me: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&2;}
+     echo '#include <asm/unistd.h>' > asm-unistd.h
+-  else
++  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
+     # The point of this preprocessing is to turn __NR_<syscall> into
+     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
+     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
+@@ -68,6 +68,8 @@
+ {
+ 	print;
+ }'
++  else
++    echo '#include <asm/unistd.h>' > asm-unistd.h
+   fi ;;
+ mips*)
+   rm -f asm-unistd.h
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in	2004-11-24 04:38:31 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in	2005-02-23 18:10:11 +0000
+@@ -18,7 +18,7 @@
+   if test ! -f "$asm_unistd_h"; then
+     AC_MSG_WARN([*** asm/unistd.h not found, it will not be pre-processed])
+     echo '#include <asm/unistd.h>' > asm-unistd.h
+-  else
++  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
+     # The point of this preprocessing is to turn __NR_<syscall> into
+     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
+     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
+@@ -68,6 +68,8 @@
+ {
+ 	print;
+ }'
++  else
++    echo '#include <asm/unistd.h>' > asm-unistd.h
+   fi ;;
+ mips*)
+   rm -f asm-unistd.h
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2003-03-29 08:15:29 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -1,36 +0,0 @@
+-/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H
+-#define _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H 1
+-
+-/* There is some commonality.  */
+-#include <sysdeps/unix/sysv/linux/mips/mips32/sysdep.h>
+-
+-/* For Linux we can use the system call table in the header file
+-	/usr/include/asm/unistd.h
+-   of the kernel.  But these symbols do not follow the SYS_* syntax
+-   so we have to redefine the `SYS_ify' macro here.  */
+-#undef SYS_ify
+-#ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_O32_##syscall_name
+-#else
+-# define SYS_ify(syscall_name)	__NR_O32_/**/syscall_name
+-#endif
+-
+-#endif /* linux/mips/mips32/kern64/sysdep.h */
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2004-10-18 05:16:07 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -28,9 +28,9 @@
+    so we have to redefine the `SYS_ify' macro here.  */
+ #undef SYS_ify
+ #ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_N32_##syscall_name
++# define SYS_ify(syscall_name)	__NR_##syscall_name
+ #else
+-# define SYS_ify(syscall_name)	__NR_N32_/**/syscall_name
++# define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
+ #ifdef __ASSEMBLER__
+diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
+--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2004-10-18 05:16:08 +0000
++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2005-02-23 18:10:11 +0000
+@@ -28,9 +28,9 @@
+    so we have to redefine the `SYS_ify' macro here.  */
+ #undef SYS_ify
+ #ifdef __STDC__
+-# define SYS_ify(syscall_name)	__NR_N64_##syscall_name
++# define SYS_ify(syscall_name)	__NR_##syscall_name
+ #else
+-# define SYS_ify(syscall_name)	__NR_N64_/**/syscall_name
++# define SYS_ify(syscall_name)	__NR_/**/syscall_name
+ #endif
+ 
+ #ifdef __ASSEMBLER__
diff --git a/patches/glibc/2.3.6/arm-ctl_bus_isa.patch b/patches/glibc/2.3.6/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..413c685a
--- /dev/null
+++ b/patches/glibc/2.3.6/arm-ctl_bus_isa.patch
@@ -0,0 +1,53 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/fix-pr398.patch b/patches/glibc/2.3.6/fix-pr398.patch
new file mode 100644
index 00000000..d5d03091
--- /dev/null
+++ b/patches/glibc/2.3.6/fix-pr398.patch
@@ -0,0 +1,70 @@
+Fixes error
+
+dl-runtime.c:222: error: parse error before "CFI_STARTPROC"
+make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim
+e.o] Error 1
+make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822/elf'
+make[1]: *** [elf/subdir_lib] Error 2
+make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040
+822'
+make: *** [all] Error 2
+
+-----------------
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398
+http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html
+
+-----------------
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Branch: 	glibc-2_3-branch
+Changes by:	roland@sources.redhat.com	2006-02-23 22:36:51
+
+Modified files:
+	sysdeps/s390/s390-64: dl-machine.h 
+	sysdeps/s390/s390-32: dl-machine.h 
+
+Log message:
+	2004-07-10  GOTO Masanori  <gotom@debian.or.jp>
+	
+	[BZ #398]
+	* sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI
+	directive.
+	* sysdeps/s390/s390-64/dl-machine.h: Likewise.
+
+Patches:
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v
+retrieving revision 1.19.4.1
+retrieving revision 1.19.4.2
+diff -u -r1.19.4.1 -r1.19.4.2
+--- libc/sysdeps/s390/s390-64/dl-machine.h	2005/10/17 04:57:27	1.19.4.1
++++ libc/sysdeps/s390/s390-64/dl-machine.h	2006/02/23 22:36:51	1.19.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v
+retrieving revision 1.20.4.1
+retrieving revision 1.20.4.2
+diff -u -r1.20.4.1 -r1.20.4.2
+--- libc/sysdeps/s390/s390-32/dl-machine.h	2005/10/17 04:57:27	1.20.4.1
++++ libc/sysdeps/s390/s390-32/dl-machine.h	2006/02/23 22:36:51	1.20.4.2
+@@ -27,6 +27,7 @@
+ #include <sys/param.h>
+ #include <string.h>
+ #include <link.h>
++#include <sysdep.h>
+ 
+ /* This is an older, now obsolete value.  */
+ #define EM_S390_OLD	0xA390
diff --git a/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch
new file mode 100644
index 00000000..996359a8
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch
@@ -0,0 +1,21 @@
+../sysdeps/generic/wordexp.c: In function 'exec_comm':
+../sysdeps/generic/wordexp.c:815: sorry, unimplemented: inlining failed in call to 'exec_comm_child': function body not available
+../sysdeps/generic/wordexp.c:900: sorry, unimplemented: called from here
+make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/posix/wordexp.o] Error
+
+I had to add the keyword 'inline' to get it to compile:
+
+--- glibc-2.3-20050307/sysdeps/generic/wordexp.c.old	2005-03-12 08:54:15.709253928 -0800
++++ glibc-2.3-20050307/sysdeps/generic/wordexp.c	2005-03-12 08:54:51.242852000 -0800
+@@ -809,7 +809,7 @@
+ }
+
+ /* Function called by child process in exec_comm() */
+-static void
++static inline void
+ internal_function __attribute__ ((always_inline))
+ exec_comm_child (char *comm, int *fildes, int showerr, int noexec)
+ {
+
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch
new file mode 100644
index 00000000..0e6776f3
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch
@@ -0,0 +1,59 @@
+Fixes
+../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal'
+../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l'
+../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l'
+make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1
+
+https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html
+%changelog
++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18
++- fix build on 64-bit arches with new GCC
+
+Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub
+Branch: fedora-branch
+CVS Tags: fedora-glibc-2_3_4-18
+Changes since 1.4: +2 -0 lines
+Diff to previous 1.4 (colored)
+
+	* sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED.
+	* sysdeps/wordsize-64/wcstol_l.c: Likewise.
+
+
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc
+
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/strtol_l.c	2003/03/03 09:45:12	1.4
++++ libc/sysdeps/wordsize-64/strtol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,7 +8,9 @@
+ #undef ____strtoll_l_internal
+ #undef __strtoll_l
+ #undef strtoll_l
++#if !UNSIGNED
+ strong_alias (____strtol_l_internal, ____strtoll_l_internal)
+ libc_hidden_ver (____strtol_l_internal, ____strtoll_l_internal)
+ weak_alias (__strtol_l, __strtoll_l)
+ weak_alias (__strtol_l, strtoll_l)
++#endif
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v
+retrieving revision 1.4
+retrieving revision 1.4.2.1
+diff -u -r1.4 -r1.4.2.1
+--- libc/sysdeps/wordsize-64/wcstol_l.c	2002/08/08 11:44:51	1.4
++++ libc/sysdeps/wordsize-64/wcstol_l.c	2005/03/25 11:59:01	1.4.2.1
+@@ -8,6 +8,8 @@
+ #undef ____wcstoll_l_internal
+ #undef __wcstoll_l
+ #undef wcstoll_l
++#if !UNSIGNED
+ strong_alias (____wcstol_l_internal, ____wcstoll_l_internal)
+ weak_alias (__wcstol_l, __wcstoll_l)
+ weak_alias (__wcstol_l, wcstoll_l)
++#endif
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch b/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch
new file mode 100644
index 00000000..423a1c50
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch
@@ -0,0 +1,187 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.x on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.5 also requires a patch, see 
+../glibc-linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch
+
+[ forward ported to glibc-2.3.5 by Petr Cvachoucek:
+
+Message-ID: <4282FCBA.3040000@unicontrols.cz>
+Date: Thu, 12 May 2005 08:50:34 +0200
+From: Petr Cvachoucek <cvachoucek@unicontrols.cz>
+To: Dan Kegel <dank@kegel.com>
+CC:  crossgcc@sources.redhat.com
+Subject: Patches to build gcc 3.4.3 / glibc 2.3.5 on cygwin
+
+Hi Dan,
+following patches are needed to build gcc-3.4.3/glibc-2.3.5 toolchain
+on cygwin. Tested to build toolchains for powerpc 604 and 750 targets.
+
+-- 
+                     Petr Cvachoucek
+                     Unicontrols a.s.
+                     http://www.unicontrols.cz
+]
+
+diff -aur glibc-2.3.5/Makeconfig glibc-2.3.5-cygwin/Makeconfig
+--- glibc-2.3.5/Makeconfig	2005-02-16 11:50:19.000000000 +0100
++++ glibc-2.3.5-cygwin/Makeconfig	2005-05-11 08:24:51.046875000 +0200
+@@ -449,7 +449,7 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ endif
+@@ -656,7 +656,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -712,14 +712,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(PIC-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+diff -aur glibc-2.3.5/Makerules glibc-2.3.5-cygwin/Makerules
+--- glibc-2.3.5/Makerules	2004-12-15 19:52:39.000000000 +0100
++++ glibc-2.3.5-cygwin/Makerules	2005-05-11 08:25:33.578125000 +0200
+@@ -416,7 +416,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -961,7 +961,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -969,7 +969,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk
+--- glibc-2.3.5/extra-lib.mk	2004-12-02 23:54:47.000000000 +0100
++++ glibc-2.3.5-cygwin/extra-lib.mk	2005-05-11 08:27:28.156250000 +0200
+@@ -13,7 +13,7 @@
+ 
+ ifneq (,$($(lib)-static-only-routines))
+ ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version)))
+-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS)
++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST)
+ endif
+ endif
+ 
+@@ -29,7 +29,7 @@
+ 
+ # Add each flavor of library to the lists of things to build and install.
+ install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o)))
+-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\
++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\
+ 			$(patsubst %,%$o,$(filter-out \
+ 					   $($(lib)-shared-only-routines),\
+ 					   $(all-$(lib)-routines))))
+@@ -57,7 +57,7 @@
+ 
+ 
+ # Use o-iterator.mk to generate a rule for each flavor of library.
+-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib))))
++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib))))
+ define o-iterator-doit
+ $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \
+   $(patsubst %,$(objpfx)%$o,\
+@@ -65,7 +65,7 @@
+ 			  $(all-$(lib)-routines))); \
+ 	$$(build-extra-lib)
+ endef
+-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib)))
++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib)))
+ include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
+ endif
+ 
+@@ -77,9 +77,9 @@
+ 	$(build-extra-lib)
+ endif
+ 
+-ifneq (,$(filter .oS,$(object-suffixes-$(lib))))
+-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \
+-  $(patsubst %,$(objpfx)%.oS,\
++ifneq (,$(filter .oST,$(object-suffixes-$(lib))))
++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \
++  $(patsubst %,$(objpfx)%.oST,\
+ 	     $(filter $($(lib)-static-only-routines),\
+ 		      $(all-$(lib)-routines)))
+ 	$(build-extra-lib)
+diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile
+--- glibc-2.3.5/nptl/Makefile	2005-02-16 09:45:56.000000000 +0100
++++ glibc-2.3.5-cygwin/nptl/Makefile	2005-05-11 08:26:01.812500000 +0200
+@@ -360,7 +360,7 @@
+ 
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -368,7 +368,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-16 08:46:14.000000000 +0200
++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile	2005-05-11 08:26:25.937500000 +0200
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch b/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch
new file mode 100644
index 00000000..9af78d1b
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch
@@ -0,0 +1,43 @@
+ML:	http://sources.redhat.com/ml/libc-hacker/2005-09/msg00002.html
+
+Date: Mon, 05 Sep 2005 21:07:15 +0900 (JST)
+Message-Id: <20050905.210715.15267870.kkojima@rr.iij4u.or.jp>
+To: libc-hacker at sources dot redhat dot com
+Subject: SH: A typo in lowlevellock.S
+From: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp>
+
+Hi,
+
+The appended patch fixes a typo in a low-level lock function.  It
+set the correct 3rd argument for the futex syscall in loop.  Sorry
+for missing such an embarrassing bug.
+
+Regards,
+	kaz
+
+nptl/ChangeLog:
+2005-09-05  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+	* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait):
+	Fix typo in register name.
+
+--- glibc.old/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2004-10-26 04:06:44.000000000 +0900
++++ glibc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2005-09-05 19:18:25.000000000 +0900
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
++/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -51,8 +51,8 @@ __lll_mutex_lock_wait:
+ 	SYSCALL_INST_PAD
+ 
+ 2:
+-	mov	#2, r4
+-	XCHG (r4, @r8, r2)
++	mov	#2, r6
++	XCHG (r6, @r8, r2)
+ 	tst	r2, r2
+ 	bf	1b
+ 
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch b/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch
new file mode 100644
index 00000000..1ccc1e18
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch
@@ -0,0 +1,30 @@
+From:
+	http://sources.redhat.com/ml/libc-alpha/2005-07/msg00051.html
+	http://sources.redhat.com/ml/crossgcc/2005-10/msg00035.html
+
+Message-ID: <434576E1.6020305@sscd.de>
+Date: Thu, 06 Oct 2005 21:11:29 +0200
+From: Alexander Sieb <sieb at sscd dot de>
+To: crossgcc at sourceware dot org
+Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches
+
+On sh[34]-linux, memset function does not work if 2nd argument is negative
+and 3rd argument is greater than 12.
+for example, memset(ptr, "\xda", 20) sets 0xff instead of 0xda.
+ 
+Attached patch fixes this problem.
+ 
+	* sysdeps/sh/memset.S (memset): Correct 2nd argument handling.
+ 
+--- glibc-2.3.5.old/sysdeps/sh/memset.S	29 Apr 2003 22:47:18 -0000	1.4
++++ glibc-2.3.5/sysdeps/sh/memset.S	23 Jul 2005 08:37:21 -0000
+@@ -28,6 +28,7 @@ ENTRY(memset)
+ 	bt.s	L_byte_loop_init
+ 	mov	r4,r7
+ 
++	extu.b	r5,r5
+ 	swap.b	r5,r1
+ 	or	r1,r5
+	swap.w	r5,r1
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch
new file mode 100644
index 00000000..ea885eae
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch
@@ -0,0 +1,35 @@
+Fixes
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:265:
+../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24'
+make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.6/glibc-2.3.6/elf'
+
+when building glibc-2.3.6 with gcc-4.0
+
+Like
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc
+but fixes fix_bad_pc24.
+
+
+--- glibc-2.3.6-orig/sysdeps/arm/dl-machine.h	Sun Mar 20 17:54:37 2005
++++ glibc-2.3.6/sysdeps/arm/dl-machine.h	Sun Mar 20 17:57:32 2005
+@@ -357,7 +357,14 @@
+ #ifdef RESOLVE
+ 
+ /* Deal with an out-of-range PC24 reloc.  */
+-static Elf32_Addr
++#if __GNUC__ >= 4
++  auto inline Elf32_Addr
++#else
++  static inline Elf32_Addr
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
+ {
+   static void *fix_page;
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
+with a little editing by dank@kegel.com
diff --git a/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch
new file mode 100644
index 00000000..ec48544f
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch
@@ -0,0 +1,67 @@
+From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html
+Fixes
+  rtld.c: In function '_dl_start':
+  dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined
+  dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined
+when compiling glibc-2.3.4 with gcc-4.0
+
+But see also
+http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html
+and
+http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html
+which seem to propose less radical fixes?
+
+Aha.  See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721
+
+--- glibc-2.3.6.orig/elf/dynamic-link.h	2005-03-12 18:12:37.000000000 -0800
++++ glibc-2.3.6/elf/dynamic-link.h	2005-03-12 18:12:59.777820848 -0800
+@@ -19,47 +19,6 @@
+ 
+ #include <elf.h>
+ #include <assert.h>
+-
+-#ifdef RESOLVE
+-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
+-   ElfW(Addr), because not all architectures can assume that the
+-   relocated address is properly aligned, whereas the compiler is
+-   entitled to assume that a pointer to a type is properly aligned for
+-   the type.  Even if we cast the pointer back to some other type with
+-   less strict alignment requirements, the compiler might still
+-   remember that the pointer was originally more aligned, thereby
+-   optimizing away alignment tests or using word instructions for
+-   copying memory, breaking the very code written to handle the
+-   unaligned cases.  */
+-# if ! ELF_MACHINE_NO_REL
+-auto inline void __attribute__((always_inline))
+-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
+-		 const ElfW(Sym) *sym, const struct r_found_version *version,
+-		 void *const reloc_addr);
+-auto inline void __attribute__((always_inline))
+-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+-			  void *const reloc_addr);
+-# endif
+-# if ! ELF_MACHINE_NO_RELA
+-auto inline void __attribute__((always_inline))
+-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+-		  const ElfW(Sym) *sym, const struct r_found_version *version,
+-		  void *const reloc_addr);
+-auto inline void __attribute__((always_inline))
+-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+-			   void *const reloc_addr);
+-# endif
+-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
+-auto inline void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc);
+-# else
+-auto inline void __attribute__((always_inline))
+-elf_machine_lazy_rel (struct link_map *map,
+-		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc);
+-# endif
+-#endif
+-
+ #include <dl-machine.h>
+ 
+ #ifndef VERSYMIDX
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch b/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch
new file mode 100644
index 00000000..5d9943a5
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch
@@ -0,0 +1,25 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3914,7 +3914,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch b/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch
new file mode 100644
index 00000000..899fa2ae
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch
@@ -0,0 +1,45 @@
+From dank@kegel.com
+Wed Jun 15 09:12:43 PDT 2005
+
+Fixes
+
+build-glibc/libc.a(nsswitch.o)(.data+0x64): undefined reference to `_nss_files_getaliasent_r'
+build-glibc/libc.a(nsswitch.o)(.data+0x6c): undefined reference to `_nss_files_endaliasent'
+... 53 lines deleted ...
+build-glibc/libc.a(nsswitch.o)(.data+0x21c): undefined reference to `_nss_files_getspnam_r'
+collect2: ld returned 1 exit status
+make[2]: *** [/build/gcc-3.4.3-glibc-2.3.5-hdrs-2.6.11.2/i686-unknown-linux-gnu/build-glibc/elf/ldconfig] Error 1
+
+when building glibc with --enable-static-nss.
+
+See http://sources.redhat.com/bugzilla/show_bug.cgi?id=631
+
+--- glibc-2.3.5/Makeconfig.old	Wed Jun 15 08:13:12 2005
++++ glibc-2.3.5/Makeconfig	Wed Jun 15 08:13:14 2005
+@@ -487,7 +487,7 @@
+ 
+ # The static libraries.
+ ifeq (yes,$(build-static))
+-link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a
++link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a
+ else
+ ifeq (yes,$(build-shared))
+ # We can try to link the programs with lib*_pic.a...
+--- glibc-2.3.5/elf/Makefile.old	Wed Jun 15 07:46:49 2005
++++ glibc-2.3.5/elf/Makefile	Wed Jun 15 08:14:00 2005
+@@ -115,6 +115,13 @@
+ install-bin-script = ldd
+ endif
+ 
++ifeq (yes,$(build-static-nss))
++nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
++resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
++otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \
++	     $(resolvobjdir)/libresolv.a
++endif
++
+ others		= sprof sln
+ install-bin	= sprof
+ others-static   = sln
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-fp-byteorder.patch b/patches/glibc/2.3.6/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..d45cdbc8
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-fp-byteorder.patch
@@ -0,0 +1,205 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch b/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch
new file mode 100644
index 00000000..2fd72f8b
--- /dev/null
+++ b/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch
@@ -0,0 +1,37 @@
+http://sourceware.org/ml/crossgcc/2005-05/msg00165.html
+Fixes a MIPS build problem (unrelated to NPTL)
+
+Message-ID: <428E8B24.1000201@realitydiluted.com>
+Date: Fri, 20 May 2005 20:13:08 -0500
+From: "Steven J dot  Hill" <sjhill at realitydiluted dot com>
+To:  crossgcc at sources dot redhat dot com,  toolchain at gentoo dot org, 
+ Shay_Gal-On at pmc-sierra dot com,  TheNop at gmx dot net
+Subject: New NPTL patches for crosstools and MIPS NPTL patches....
+
+Greetings.
+
+I have uploaded the latest NPTL patch for crosstool-0.34. I have also
+uploaded a tarball of the patches necessary to build a MIPS NPTL
+cross toolchain. To build a MIPS NPTL toolchain you will need the
+released version of binutils-2.16 and the absolute latest GCC and
+glibc code from the HEAD of cvs. Use the 'demo-mips-nptl.sh' script
+to build the toolchain. Please report bugs or issues to the crossgcc
+mailing list. Here is the link off of my FTP site:
+
+    ftp://ftp.realitydiluted.com/crosstools/crosstool-0.34/
+
+[Note: BOOTSTRAP_GCC is set by crosstool.sh when invoking make install-headers]
+
+diff -ur glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile
+--- glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile	2003-03-29 02:15:28.000000000 -0600
++++ glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile	2005-04-12 21:36:51.318837655 -0500
+@@ -1,3 +1,7 @@
++ifeq ($(filter -DBOOTSTRAP_GCC,$(CFLAGS)),)
+ ifeq ($(filter -mabi=32,$(CC)),)
+ CC += -mabi=32
+ endif
++else
++CC += -D"_MIPS_SZPTR=32"
++endif
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/make-install-lib-all.patch b/patches/glibc/2.3.6/make-install-lib-all.patch
new file mode 100644
index 00000000..1e69bb23
--- /dev/null
+++ b/patches/glibc/2.3.6/make-install-lib-all.patch
@@ -0,0 +1,26 @@
+From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch
+Rule to install all needed libraries, not just the ones installed by install-lib,
+yet not install programs.  
+Needed because we can't use the main install target, as we can't build programs before
+we have the final gcc installed; linking fails because libeh.a is not present,
+and glibc insists on linking programs with that library.
+
+diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules
+--- glibc-2.3.4.orig/Makerules	2004-12-15 20:52:39.000000000 +0200
++++ glibc-2.3.4/Makerules	2005-02-19 15:16:31.415125176 +0200
+@@ -844,6 +844,13 @@
+ installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\
+ 			     $(inst_libdir)/$(patsubst %,$(libtype$o),\
+ 						     $(libprefix)$(libc-name)))
++
++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \
++		$(inst_slibdir)/libc-$(version).so \
++		$(inst_libdir)/libc.so \
++		$(inst_libdir)/libc.a \
++		install-lib
++
+ install: $(installed-libcs)
+ $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force)
+ 	$(make-target-directory)
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch
new file mode 100644
index 00000000..d8810fca
--- /dev/null
+++ b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch
@@ -0,0 +1,45 @@
+Fixes
+
+../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1
+
+--- glibc-2.3.6.orig/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Jul 30 23:33:52 2003
++++ glibc-2.3.6/sysdeps/powerpc/powerpc32/dl-machine.h		Thu Mar 17 13:19:16 2005
+@@ -455,8 +455,14 @@
+     }
+ }
+ 
+-auto inline void
+-__attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -464,8 +470,14 @@
+   *reloc_addr = l_addr + reloc->r_addend;
+ }
+ 
+-auto inline void
+-__attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf32_Addr l_addr, const Elf32_Rela *reloc)
+ {
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch
new file mode 100644
index 00000000..a729541d
--- /dev/null
+++ b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch
@@ -0,0 +1,65 @@
+Fixes:
+
+In file included from dynamic-link.h:22,
+                 from dl-reloc.c:269:
+../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object':
+../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative'
+../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela'
+../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel'
+make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf'
+
+--- glibc-2.3.6.orig/sysdeps/powerpc/powerpc64/dl-machine.h	Thu Mar 17 13:35:23 2005
++++ glibc-2.3.6/sysdeps/powerpc/powerpc64/dl-machine.h		Thu Mar 17 13:37:12 2005
+@@ -567,8 +567,14 @@
+                                 const Elf64_Sym *refsym)
+                                 attribute_hidden;
+ 
+-auto inline void
+-__attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+ 			   void *const reloc_addr_arg)
+ {
+@@ -599,8 +605,14 @@
+ 
+ /* Perform the relocation specified by RELOC and SYM (which is fully
+    resolved).  MAP is the object containing the reloc.  */
+-auto inline void
+-__attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_rela (struct link_map *map,
+ 		  const Elf64_Rela *reloc,
+ 		  const Elf64_Sym *sym,
+@@ -885,8 +897,14 @@
+   MODIFIED_CODE_NOQUEUE (reloc_addr);
+ }
+ 
+-auto inline void
+-__attribute__ ((always_inline))
++#if __GNUC__ >= 4
++  auto inline void
++#else
++  static inline void
++#endif
++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
++  __attribute ((always_inline))
++#endif
+ elf_machine_lazy_rel (struct link_map *map,
+ 		      Elf64_Addr l_addr, const Elf64_Rela *reloc)
+ {
+
+Signed-off-by: Robert P. J. Day <rpjday@mindspring.com>
diff --git a/patches/glibc/20040827/arm-ctl_bus_isa.patch b/patches/glibc/20040827/arm-ctl_bus_isa.patch
new file mode 100644
index 00000000..3422070b
--- /dev/null
+++ b/patches/glibc/20040827/arm-ctl_bus_isa.patch
@@ -0,0 +1,51 @@
+Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004.
+Needed to build glibc with linux kernels 2.4.23 or higher on ARM, 
+Fixes following error:
+
+../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys':
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.)
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]')
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant
+../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]')
+make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1
+
+cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA",  http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html
+
+--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old	2003-02-20 14:22:24.000000000 -0800
++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c	2004-01-31 16:01:50.000000000 -0800
+@@ -47,6 +47,12 @@
+ #include <asm/page.h>
+ #include <sys/sysctl.h>
+ 
++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */
++#include <linux/version.h>
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23))
++#define CTL_BUS_ISA BUS_ISA	/* and hope it's not the one from linux/input.h */
++#endif
++
+ #define PATH_ARM_SYSTYPE	"/etc/arm_systype"
+ #define PATH_CPUINFO		"/proc/cpuinfo"
+ 
+@@ -80,7 +86,7 @@
+  * Initialize I/O system.  There are several ways to get the information
+  * we need.  Each is tried in turn until one succeeds.
+  *
+- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*).  This is the preferred method
++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).  This is the preferred method
+  *    but not all kernels support it.
+  *
+  * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
+@@ -100,8 +106,8 @@
+ {
+   char systype[256];
+   int i, n;
+-  static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
+-  static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
++  static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
++  static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
+   size_t len = sizeof(io.base);
+ 
+   if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
diff --git a/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch
new file mode 100644
index 00000000..20cb7998
--- /dev/null
+++ b/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch
@@ -0,0 +1,29 @@
+See http://gcc.gnu.org/PR15345
+
+Quick kludge by H.J.Lu
+Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64:
+
+.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3':
+: undefined reference to `_DYNAMIC'
+collect2: ld returned 1 exit status
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1
+
+
+--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig	Sat May  8 20:54:26 2004
++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h	Sat May  8 17:18:04 2004
+@@ -65,6 +65,7 @@
+ }
+ 
+ /* Return the run-time load address of the shared object.  */
++#ifdef IS_IN_rtld
+ static inline Elf64_Addr
+ elf_machine_load_address (void)
+ {
+@@ -84,6 +85,7 @@
+      pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12  */
+   return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4;
+ }
++#endif
+ 
+ /* We have 4 cases to handle.  And we code different code sequences
+    for each one.  I love V9 code models...  */
diff --git a/patches/glibc/20040827/glibc-2.3.3-cygwin.patch b/patches/glibc/20040827/glibc-2.3.3-cygwin.patch
new file mode 100644
index 00000000..0ad9a717
--- /dev/null
+++ b/patches/glibc/20040827/glibc-2.3.3-cygwin.patch
@@ -0,0 +1,103 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ Rediffed against glibc-2.3.3 ]
+
+
+diff -aur glibc-2.3.3/Makeconfig glibc-2.3.3-cygwin/Makeconfig
+--- glibc-2.3.3/Makeconfig	2003-09-17 01:36:10.000000000 -0700
++++ glibc-2.3.3-cygwin/Makeconfig	2004-08-27 20:34:43.000000000 -0700
+@@ -439,13 +439,13 @@
+ # run the linked programs.
+ link-libc = -Wl,-rpath-link=$(rpath-link) \
+ 	    $(common-objpfx)libc.so$(libc.so-version) \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ # This is how to find at build-time things that will be installed there.
+ rpath-dirs = math elf dlfcn nss nis rt resolv crypt
+ else
+ ifneq (,$(filter aix aix%,$(config-os)))
+ link-libc = $(common-objpfx)libc.a \
+-	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
++	    $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib)
+ rpath-dirs = math dlfcn nss nis rt resolv crypt
+ endif
+ endif
+@@ -658,7 +658,7 @@
+ # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
+ # to pass different flags for each flavor.
+ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
+-all-object-suffixes := .o .os .op .og .ob .oS
++all-object-suffixes := .o .os .op .og .ob .oST
+ object-suffixes :=
+ CPPFLAGS-.o = $(pic-default)
+ CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
+@@ -714,14 +714,14 @@
+ 
+ ifeq (yes,$(build-shared))
+ # Build special library that contains the static-only routines for libc.
+-object-suffixes-for-libc += .oS
++object-suffixes-for-libc += .oST
+ 
+ # Must build the routines as PIC, though, because they can end up in (users')
+ # shared objects.  We don't want to use CFLAGS-os because users may, for
+ # example, make that processor-specific.
+-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag)
+-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
+-libtype.oS = lib%_nonshared.a
++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag)
++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
++libtype.oST = lib%_nonshared.a
+ endif
+ 
+ # The assembler can generate debug information too.
+diff -aur glibc-2.3.3/Makerules glibc-2.3.3-cygwin/Makerules
+--- glibc-2.3.3/Makerules	2003-10-31 16:35:57.000000000 -0800
++++ glibc-2.3.3-cygwin/Makerules	2004-08-27 20:33:47.000000000 -0700
+@@ -414,7 +414,7 @@
+ # Bounded pointer thunks are only built for *.ob
+ elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks))
+ 
+-elide-routines.oS += $(filter-out $(static-only-routines),\
++elide-routines.oST += $(filter-out $(static-only-routines),\
+ 				  $(routines) $(aux) $(sysdep_routines)) \
+ 		     $(elide-bp-thunks)
+ elide-routines.os += $(static-only-routines) $(elide-bp-thunks)
+@@ -934,7 +934,7 @@
+ install: $(inst_libdir)/libc.so
+ $(inst_libdir)/libc.so: $(common-objpfx)format.lds \
+ 			$(common-objpfx)libc.so$(libc.so-version) \
+-			$(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			$(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 						  $(libprefix)$(libc-name)) \
+ 			$(+force)
+ 	(echo '/* GNU ld script';\
+@@ -942,7 +942,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
+diff -aur glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile
+--- glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile	2002-08-29 03:41:15.000000000 -0700
++++ glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile	2004-08-27 20:35:43.000000000 -0700
+@@ -10,4 +10,4 @@
+ ASFLAGS-.op += -Wa,-Av9a
+ ASFLAGS-.og += -Wa,-Av9a
+ ASFLAGS-.ob += -Wa,-Av9a
+-ASFLAGS-.oS += -Wa,-Av9a
++ASFLAGS-.oST += -Wa,-Av9a
diff --git a/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch b/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch
new file mode 100644
index 00000000..0e8c2a66
--- /dev/null
+++ b/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch
@@ -0,0 +1,26 @@
+wget "http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-09&msgid=20030911190500.GE12344%40sunsite.ms.mff.cuni.cz"
+aka http://sources.redhat.com/ml/libc-alpha/2003-09/msg00104.html
+
+This seems to fix the error
+   gcc-3.4.1-glibc-2.3.3/lib/gcc/powerpc-7400-linux-gnu/3.4.1/../../../../powerpc-7400-linux-gnu/bin/ld: cannot find -lgcc_eh
+   make[1]: *** [build/powerpc-7400-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/libc.so] Error 1
+but I assume it will cause trouble with nptl, since it's so violent
+
+FIXME: once we figure out why this patch is wrong, fix it right :-)
+
+Rediffed against glibc-20040822
+
+
+--- glibc-20040822/Makeconfig.orig	2004-08-04 20:34:28.000000000 -0700
++++ glibc-20040822/Makeconfig	2004-08-24 07:36:49.000000000 -0700
+@@ -527,8 +527,8 @@
+  libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) -Wl,--no-as-needed
+ endif
+ ifneq ($(have-cc-with-libunwind),yes)
+- gnulib := -lgcc $(libgcc_eh)
+- static-gnulib := -lgcc -lgcc_eh
++ gnulib := -lgcc 
++ static-gnulib := -lgcc 
+ else
+  gnulib := -lgcc $(libgcc_eh) -lunwind
+  static-gnulib := -lgcc -lgcc_eh -lunwind
diff --git a/patches/glibc/20040827/glibc-configure-apple-as.patch b/patches/glibc/20040827/glibc-configure-apple-as.patch
new file mode 100644
index 00000000..604c36d5
--- /dev/null
+++ b/patches/glibc/20040827/glibc-configure-apple-as.patch
@@ -0,0 +1,23 @@
+http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch
+http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html
+
+The following makes it possible to configure glibc-2.3.2 on Mac OS X,
+where the assembler but doesn't understand the --version flag.
+
+Fixes the symptom
+checking whether ld is GNU ld... no
+checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as
+checking version of /usr/libexec/gcc/darwin/ppc/as... 
+<PAUSES HERE AND JUST SITS THERE DOING NOTHING>
+
+--- glibc-2.3.2/configure~	Wed Feb 26 09:20:48 2003
++++ glibc-2.3.2/configure	Fri Feb 27 13:12:53 2004
+@@ -3789,7 +3789,7 @@
+   # Found it, now check the version.
+   echo "$as_me:$LINENO: checking version of $AS" >&5
+ echo $ECHO_N "checking version of $AS... $ECHO_C" >&6
+-  ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
++  ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+     2.1[3-9]*)
diff --git a/patches/glibc/20040827/glibc-fp-byteorder.patch b/patches/glibc/20040827/glibc-fp-byteorder.patch
new file mode 100644
index 00000000..f20432ea
--- /dev/null
+++ b/patches/glibc/20040827/glibc-fp-byteorder.patch
@@ -0,0 +1,203 @@
+Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html
+Author: addsub@eyou.com
+Target: ARM
+
+Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c
+and makes printf("%f", 1.0) work.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html :
+ It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point
+ is broken' on my big-endian hardfloat FPA ARM platform. ...
+ It's definitely needed for hardfloat.  So I'd think it's needed for
+ big-endian systems in any case, and for VFP on little-endian systems
+ too.  Someone would have to verify that though.
+
+Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html
+ I just had a look at glibc-20040830, and [this patch] is still needed and useful
+ for this version.  glibc-20040830 out-of-the-box still contains the
+ following wrong assumptions:
+ - sysdeps/arm/bits/endian.h: float word order is big endian (which it is
+   not on vfp systems)
+ - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they
+   are not on big endian systems, neither on vfp systems)
+ - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order
+   (which they are not on big endian systems)
+ [This patch] seems the right solution for all of these issues.
+
+Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html :
+ It's even needed for glibc CVS, AFAICS.
+ The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h
+ (currently at version 1.4) is only needed for proper VFP operation.
+ But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk
+ that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed
+ for proper operation of *any* FP model on big endian ARM.
+
+See also discussion in followups to
+http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html)
+
+Message-ID: <276985760.37584@eyou.com>
+Received: from unknown (HELO eyou.com) (172.16.2.2)
+ by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800
+Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800
+Date: 17 Feb 2004 10:42:38 +0800
+Message-ID: <20040217104238.8237.qmail@eyou.com>
+From: "add" <addsub@eyou.com>
+To: dank@kegel.com
+Reply-To: "add" <addsub@eyou.com>
+Subject: Re:&nbsp;&nbsp;&nbsp;problem&nbsp;while&nbsp;building&nbsp;arm&nbsp;vfp&nbsp;softfloat&nbsp;gcc&nbsp;`
+
+Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat
+toolchain can printf("%f\n",1.0). So you may have a try of this
+
+
+diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h
+--- glibc.old/sysdeps/arm/bits/endian.h	1999-04-12 11:59:13.000000000 -0400
++++ glibc.new/sysdeps/arm/bits/endian.h	2004-02-12 09:15:13.000000000 -0500
+@@ -9,4 +9,9 @@
+ #else
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+ #endif
++
++#ifdef __VFP_FP__
++#define __FLOAT_WORD_ORDER __BYTE_ORDER
++#else
+ #define __FLOAT_WORD_ORDER __BIG_ENDIAN
++#endif
+diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h
+--- glibc.old/sysdeps/arm/gmp-mparam.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/gmp-mparam.h	2004-02-12 09:15:13.000000000 -0500
+@@ -26,5 +26,13 @@ MA 02111-1307, USA. */
+ #define BITS_PER_SHORTINT 16
+ #define BITS_PER_CHAR 8
+ 
+-#define IEEE_DOUBLE_BIG_ENDIAN 0
+-#define IEEE_DOUBLE_MIXED_ENDIAN 1
++#if defined(__ARMEB__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 1
++#elif defined(__VFP_FP__)
++# define IEEE_DOUBLE_MIXED_ENDIAN 0
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++#else
++# define IEEE_DOUBLE_BIG_ENDIAN 0
++# define IEEE_DOUBLE_MIXED_ENDIAN 1
++#endif
+diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h
+--- glibc.old/sysdeps/arm/ieee754.h	2001-07-07 15:21:19.000000000 -0400
++++ glibc.new/sysdeps/arm/ieee754.h	1969-12-31 19:00:00.000000000 -0500
+@@ -1,115 +0,0 @@
+-/* Copyright (C) 1992, 1995, 1996, 1998 Free Software Foundation, Inc.
+-   This file is part of the GNU C Library.
+-
+-   The GNU C Library is free software; you can redistribute it and/or
+-   modify it under the terms of the GNU Lesser General Public
+-   License as published by the Free Software Foundation; either
+-   version 2.1 of the License, or (at your option) any later version.
+-
+-   The GNU C Library 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
+-   Lesser General Public License for more details.
+-
+-   You should have received a copy of the GNU Lesser General Public
+-   License along with the GNU C Library; if not, write to the Free
+-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+-   02111-1307 USA.  */
+-
+-#ifndef _IEEE754_H
+-
+-#define _IEEE754_H 1
+-#include <features.h>
+-
+-#include <endian.h>
+-
+-__BEGIN_DECLS
+-
+-union ieee754_float
+-  {
+-    float f;
+-
+-    /* This is the IEEE 754 single-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa:23;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa:22;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:8;
+-	unsigned int negative:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
+-
+-
+-union ieee754_double
+-  {
+-    double d;
+-
+-    /* This is the IEEE 754 double-precision format.  */
+-    struct
+-      {
+-	unsigned int mantissa0:20;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee;
+-
+-    /* This format makes it easier to see if a NaN is a signalling NaN.  */
+-    struct
+-      {
+-	unsigned int mantissa0:19;
+-	unsigned int quiet_nan:1;
+-	unsigned int exponent:11;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
+-
+-
+-/* The following two structures are correct for `new' floating point systems but
+-   wrong for the old FPPC.  The only solution seems to be to avoid their use on
+-   old hardware.  */
+-
+-union ieee854_long_double
+-  {
+-    long double d;
+-
+-    /* This is the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:32;
+-      } ieee;
+-
+-    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
+-    struct
+-      {
+-	unsigned int exponent:15;
+-	unsigned int empty:16;
+-	unsigned int negative:1;
+-	unsigned int mantissa1:32;
+-	unsigned int mantissa0:30;
+-	unsigned int quiet_nan:1;
+-	unsigned int one:1;
+-      } ieee_nan;
+-  };
+-
+-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+-
+-__END_DECLS
+-
+-#endif /* ieee754.h */
diff --git a/patches/glibc/20050502/make-install-lib-all.patch b/patches/glibc/20050502/make-install-lib-all.patch
new file mode 100644
index 00000000..6de9f7e3
--- /dev/null
+++ b/patches/glibc/20050502/make-install-lib-all.patch
@@ -0,0 +1,24 @@
+From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch
+Rule to install all needed libraries, not just the ones installed by install-lib,
+yet not install programs.
+Needed because we can't use the main install target, as we can't build programs before
+we have the final gcc installed; linking fails because libeh.a is not present,
+and glibc insists on linking programs with that library.
+
+diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules
+--- glibc-2.3.4.orig/Makerules	2004-12-15 20:52:39.000000000 +0200
++++ glibc-2.3.4/Makerules	2005-02-19 15:16:31.415125176 +0200
+@@ -844,6 +844,13 @@
+ installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\
+ 			     $(inst_libdir)/$(patsubst %,$(libtype$o),\
+ 						     $(libprefix)$(libc-name)))
++
++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \
++		$(inst_slibdir)/libc-$(version).so \
++		$(inst_libdir)/libc.so \
++		$(inst_libdir)/libc.a \
++		install-lib
++
+ install: $(installed-libcs)
+ $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force)
+ 	$(make-target-directory)
diff --git a/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch b/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch
new file mode 100644
index 00000000..a16b4aff
--- /dev/null
+++ b/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch
@@ -0,0 +1,66 @@
+2002-07-05  Tomohiro Kato <tomop@teamgedoh.net>
+
+	* glibc-compat/nss_dns/dns-network.c (getanswer_r): Reduce
+	linebuflen in parallel to bumping up the buffer pointer.
+	* glibc-compat/nss_dns/dns-host.c (getanswer_r): Likewise.
+	Compare n with linebuflen instead of buflen.
+
+2002-07-02  Andreas Schwab  <schwab@suse.de>
+
+	* resolv/nss_dns/dns-network.c (getanswer_r): Reduce linebuflen
+	in parallel to bumping up the buffer pointer.
+
+--- libc/glibc-compat/nss_dns/dns-network.c.jj	Wed Jan 10 11:58:20 2001
++++ libc/glibc-compat/nss_dns/dns-network.c	Tue Jul  9 10:31:15 2002
+@@ -283,7 +283,9 @@ getanswer_r (const querybuf *answer, int
+ 	    }
+ 	  cp += n;
+ 	  *alias_pointer++ = bp;
+-	  bp += strlen (bp) + 1;
++	  n = strlen (bp) + 1;
++	  bp += n;
++	  linebuflen -= n;
+ 	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
+ 	  ++have_answer;
+ 	}
+--- libc/glibc-compat/nss_dns/dns-host.c.jj	Wed Jan 10 11:58:20 2001
++++ libc/glibc-compat/nss_dns/dns-host.c	Tue Jul  9 10:36:41 2002
+@@ -424,7 +424,7 @@ getanswer_r (const querybuf *answer, int
+ 	  linebuflen -= n;
+ 	  /* Get canonical name.  */
+ 	  n = strlen (tbuf) + 1;	/* For the \0.  */
+-	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	  if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN)
+ 	    {
+ 	      ++had_error;
+ 	      continue;
+@@ -447,7 +447,7 @@ getanswer_r (const querybuf *answer, int
+ 	  cp += n;
+ 	  /* Get canonical name. */
+ 	  n = strlen (tbuf) + 1;   /* For the \0.  */
+-	  if ((size_t) n > buflen || n >= MAXHOSTNAMELEN)
++	  if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN)
+ 	    {
+ 	      ++had_error;
+ 	      continue;
+@@ -542,6 +542,7 @@ getanswer_r (const querybuf *answer, int
+ 	      linebuflen -= nn;
+ 	    }
+ 
++	  linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align));
+ 	  bp += sizeof (align) - ((u_long) bp % sizeof (align));
+ 
+ 	  if (n >= linebuflen)
+#--- libc/resolv/nss_dns/dns-network.c.jj	Mon Jul  9 14:59:24 2001
+#+++ libc/resolv/nss_dns/dns-network.c	Tue Jul  9 10:30:31 2002
+#@@ -328,7 +328,9 @@ getanswer_r (const querybuf *answer, int
+# 	    }
+# 	  cp += n;
+# 	  *alias_pointer++ = bp;
+#-	  bp += strlen (bp) + 1;
+#+	  n = strlen (bp) + 1;
+#+	  bp += n;
+#+	  linebuflen -= n;
+# 	  result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
+# 	  ++have_answer;
+# 	}
diff --git a/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch b/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch
new file mode 100644
index 00000000..a5edd25d
--- /dev/null
+++ b/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch
@@ -0,0 +1,512 @@
+#--- libc/resolv/nss_dns/dns-host.c.jj	Tue Sep 14 03:05:08 1999
+#+++ libc/resolv/nss_dns/dns-host.c	Thu Oct 10 13:07:33 2002
+#@@ -129,9 +129,10 @@ _nss_dns_gethostbyname2_r (const char *n
+# 			   char *buffer, size_t buflen, int *errnop,
+# 			   int *h_errnop)
+# {
+#-  querybuf host_buffer;
+#+  querybuf *host_buffer;
+#   int size, type, n;
+#   const char *cp;
+#+  enum nss_status status;
+# 
+#   switch (af) {
+#   case AF_INET:
+#@@ -159,16 +160,25 @@ _nss_dns_gethostbyname2_r (const char *n
+#   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
+#     name = cp;
+# 
+#-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
+#+  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
+#+  if (host_buffer == NULL) {
+#+    *errnop = ENOMEM;
+#+    return NSS_STATUS_UNAVAIL;
+#+  }
+#+
+#+  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
+#   if (n < 0)
+#     {
+#       *h_errnop = h_errno;
+#       *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT;
+#+      free (host_buffer);
+#       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+#     }
+# 
+#-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
+#-		      errnop, h_errnop);
+#+  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
+#+			errnop, h_errnop);
+#+  free (host_buffer);
+#+  return status; 
+# }
+# 
+# 
+#@@ -205,7 +215,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
+#     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+#     char linebuffer[0];
+#   } *host_data = (struct host_data *) buffer;
+#-  querybuf host_buffer;
+#+  querybuf *host_buffer;
+#   char qbuf[MAXDNAME+1], *qp;
+#   size_t size;
+#   int n, status;
+#@@ -257,17 +267,25 @@ _nss_dns_gethostbyaddr_r (const char *ad
+#       /* Cannot happen.  */
+#     }
+# 
+#-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
+#-		 sizeof host_buffer);
+#+  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
+#+  if (host_buffer == NULL) {
+#+    *errnop = ENOMEM;
+#+    return NSS_STATUS_UNAVAIL;
+#+  }
+#+
+#+  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
+#+		 sizeof (host_buffer->buf));
+#   if (n < 0)
+#     {
+#       *h_errnop = h_errno;
+#       *errnop = errno;
+#+      free (host_buffer);
+#       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+#     }
+# 
+#-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+#+  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+# 			errnop, h_errnop);
+#+  free (host_buffer);
+#   if (status != NSS_STATUS_SUCCESS)
+#     {
+#       *h_errnop = h_errno;
+#--- libc/resolv/nss_dns/dns-network.c.jj	Wed Jun 30 12:01:14 1999
+#+++ libc/resolv/nss_dns/dns-network.c	Thu Oct 10 13:09:49 2002
+#@@ -113,24 +113,36 @@ _nss_dns_getnetbyname_r (const char *nam
+# 			 char *buffer, size_t buflen, int *errnop)
+# {
+#   /* Return entry for network with NAME.  */
+#-  querybuf net_buffer;
+#+  querybuf *net_buffer;
+#   int anslen;
+#   char *qbuf;
+#+  enum nss_status status;
+# 
+#   qbuf = strdupa (name);
+#-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+#-		       sizeof (querybuf));
+#+
+#+  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
+#+  if (net_buffer == NULL)
+#+    {
+#+      *errnop = ENOMEM;
+#+      return NSS_STATUS_UNAVAIL;
+#+    }
+#+
+#+  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
+#+		       sizeof (net_buffer->buf));
+#   if (anslen < 0)
+#     {
+#       /* Nothing found.  */
+#       *errnop = errno;
+#+      free (net_buffer);
+#       return (errno == ECONNREFUSED
+# 	      || errno == EPFNOSUPPORT
+# 	      || errno == EAFNOSUPPORT)
+# 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+#     }
+# 
+#-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
+#+  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
+#+  free (net_buffer);
+#+  return status;
+# }
+# 
+# 
+#@@ -140,7 +152,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
+# {
+#   /* Return entry for network with NAME.  */
+#   enum nss_status status;
+#-  querybuf net_buffer;
+#+  querybuf *net_buffer;
+#   unsigned int net_bytes[4];
+#   char qbuf[MAXDNAME];
+#   int cnt, anslen;
+#@@ -176,19 +188,28 @@ _nss_dns_getnetbyaddr_r (long net, int t
+#       break;
+#     }
+# 
+#-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+#-		      sizeof (querybuf));
+#+  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
+#+  if (net_buffer == NULL)
+#+    {
+#+      *errnop = ENOMEM;
+#+      return NSS_STATUS_UNAVAIL;
+#+    }
+#+
+#+  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
+#+		      sizeof (net_buffer->buf));
+#   if (anslen < 0)
+#     {
+#       /* Nothing found.  */
+#       *errnop = errno;
+#+      free (net_buffer);
+#       return (errno == ECONNREFUSED
+# 	      || errno == EPFNOSUPPORT
+# 	      || errno == EAFNOSUPPORT)
+# 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+#     }
+# 
+#-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
+#+  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
+#+  free (net_buffer);
+#   if (status == NSS_STATUS_SUCCESS)
+#     {
+#       /* Strip trailing zeros.  */
+#--- libc/resolv/res_query.c.jj	Wed Jun 30 12:01:06 1999
+#+++ libc/resolv/res_query.c	Thu Oct 10 13:01:12 2002
+#@@ -106,7 +106,7 @@ res_query(name, class, type, answer, ans
+# 	u_char *answer;		/* buffer to put answer */
+# 	int anslen;		/* size of answer buffer */
+# {
+#-	u_char buf[MAXPACKET];
+#+	u_char *buf;
+# 	register HEADER *hp = (HEADER *) answer;
+# 	int n;
+# 
+#@@ -121,17 +121,25 @@ res_query(name, class, type, answer, ans
+# 		printf(";; res_query(%s, %d, %d)\n", name, class, type);
+# #endif
+# 
+#+	buf = malloc (MAXPACKET);
+#+	if (buf == NULL) {
+#+		__set_h_errno (NETDB_INTERNAL);
+#+		return -1;
+#+	}
+#+
+# 	n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
+#-			buf, sizeof(buf));
+#+			buf, MAXPACKET);
+# 	if (n <= 0) {
+# #ifdef DEBUG
+# 		if (_res.options & RES_DEBUG)
+# 			printf(";; res_query: mkquery failed\n");
+# #endif
+# 		__set_h_errno (NO_RECOVERY);
+#+		free (buf);
+# 		return (n);
+# 	}
+# 	n = res_send(buf, n, answer, anslen);
+#+	free (buf);
+# 	if (n < 0) {
+# #ifdef DEBUG
+# 		if (_res.options & RES_DEBUG)
+#--- libc/resolv/gethnamaddr.c.jj	Tue Dec  7 11:50:36 1999
+#+++ libc/resolv/gethnamaddr.c	Thu Oct 10 15:05:50 2002
+#@@ -512,10 +512,11 @@ gethostbyname2(name, af)
+# 	const char *name;
+# 	int af;
+# {
+#-	querybuf buf;
+#+	querybuf *buf;
+# 	register const char *cp;
+# 	char *bp;
+# 	int n, size, type, len;
+#+	struct hostent *ret;
+# 	extern struct hostent *_gethtbyname2();
+# 
+# 	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+#@@ -617,13 +618,22 @@ gethostbyname2(name, af)
+# 				break;
+# 		}
+# 
+#-	if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
+#+	buf = (querybuf *) malloc (sizeof (*buf));
+#+	if (buf == NULL) {
+#+		__set_h_errno (NETDB_INTERNAL);
+#+		return NULL;
+#+	}
+#+
+#+	if ((n = res_search(name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) {
+#+		free (buf);
+# 		dprintf("res_search failed (%d)\n", n);
+# 		if (errno == ECONNREFUSED)
+# 			return (_gethtbyname2(name, af));
+# 		return (NULL);
+# 	}
+#-	return (getanswer(&buf, n, name, type));
+#+	ret = getanswer(buf, n, name, type);
+#+	free (buf);
+#+	return ret;
+# }
+# 
+# struct hostent *
+#@@ -636,7 +646,7 @@ gethostbyaddr(addr, len, af)
+# 	static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
+# 	static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
+# 	int n, size;
+#-	querybuf buf;
+#+	querybuf *buf;
+# 	register struct hostent *hp;
+# 	char qbuf[MAXDNAME+1], *qp;
+# #ifdef SUNSECURITY
+#@@ -697,14 +707,24 @@ gethostbyaddr(addr, len, af)
+# 	default:
+# 		abort();
+# 	}
+#-	n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
+#+
+#+	buf = (querybuf *) malloc (sizeof (*buf));
+#+	if (buf == NULL) {
+#+		__set_h_errno (NETDB_INTERNAL);
+#+		return NULL;
+#+	}
+#+
+#+	n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
+# 	if (n < 0) {
+#+		free (buf);
+# 		dprintf("res_query failed (%d)\n", n);
+# 		if (errno == ECONNREFUSED)
+# 			return (_gethtbyaddr(addr, len, af));
+# 		return (NULL);
+# 	}
+#-	if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
+#+	hp = getanswer(buf, n, qbuf, T_PTR);
+#+	free (buf);
+#+	if (!hp)
+# 		return (NULL);	/* h_errno was set by getanswer() */
+# #ifdef SUNSECURITY
+# 	if (af == AF_INET) {
+#--- libc/resolv/getnetnamadr.c.jj	Wed Jun 30 12:00:50 1999
+#+++ libc/resolv/getnetnamadr.c	Thu Oct 10 13:14:01 2002
+#@@ -210,7 +210,7 @@ getnetbyaddr(net, net_type)
+# {
+# 	unsigned int netbr[4];
+# 	int nn, anslen;
+#-	querybuf buf;
+#+	querybuf *buf;
+# 	char qbuf[MAXDNAME];
+# 	u_int32_t net2;		/* Changed from unsigned long --roland */
+# 	struct netent *net_entry;
+#@@ -236,8 +236,15 @@ getnetbyaddr(net, net_type)
+# 		    netbr[1], netbr[0]);
+# 		break;
+# 	}
+#-	anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
+#+
+#+	buf = (querybuf *) malloc (sizeof (*buf));
+#+	if (buf == NULL) {
+#+		return NULL;
+#+	}
+#+
+#+	anslen = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
+# 	if (anslen < 0) {
+#+		free (buf);
+# #ifdef DEBUG
+# 		if (_res.options & RES_DEBUG)
+# 			printf("res_query failed\n");
+#@@ -246,7 +253,8 @@ getnetbyaddr(net, net_type)
+# 			return (_getnetbyaddr(net, net_type));
+# 		return (NULL);
+# 	}
+#-	net_entry = getnetanswer(&buf, anslen, BYADDR);
+#+	net_entry = getnetanswer(buf, anslen, BYADDR);
+#+	free (buf);
+# 	if (net_entry) {
+# 		unsigned u_net = net;	/* maybe net should be unsigned ? */
+# 
+#@@ -264,7 +272,7 @@ getnetbyname(net)
+# 	register const char *net;
+# {
+# 	int anslen;
+#-	querybuf buf;
+#+	querybuf *buf;
+# 	char qbuf[MAXDNAME];
+# 	struct netent *net_entry;
+# 
+#@@ -273,8 +281,13 @@ getnetbyname(net)
+# 		return (NULL);
+# 	}
+# 	strcpy(&qbuf[0], net);
+#-	anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
+#+	buf = (querybuf *) malloc (sizeof (*buf));
+#+	if (buf == NULL) {
+#+		return NULL;
+#+	}
+#+	anslen = res_search(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
+# 	if (anslen < 0) {
+#+		free (buf);
+# #ifdef DEBUG
+# 		if (_res.options & RES_DEBUG)
+# 			printf("res_query failed\n");
+#@@ -283,7 +296,8 @@ getnetbyname(net)
+# 			return (_getnetbyname(net));
+# 		return (_getnetbyname(net));
+# 	}
+#-	net_entry = getnetanswer(&buf, anslen, BYNAME);
+#+	net_entry = getnetanswer(buf, anslen, BYNAME);
+#+	free (buf);
+# 	if (net_entry)
+# 		return (net_entry);
+# 	return (_getnetbyname(net));
+--- libc/glibc-compat/nss_dns/dns-host.c.jj	Mon Jan  3 20:07:08 2000
++++ libc/glibc-compat/nss_dns/dns-host.c	Thu Oct 10 12:46:24 2002
+@@ -126,9 +126,10 @@ enum nss_status
+ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
+ 			   char *buffer, size_t buflen, int *h_errnop)
+ {
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   int size, type, n;
+   const char *cp;
++  enum nss_status status;
+ 
+   switch (af) {
+   case AF_INET:
+@@ -156,15 +157,22 @@ _nss_dns_gethostbyname2_r (const char *n
+   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
+     name = cp;
+ 
+-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (host_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
+-		      h_errnop);
++  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
++			h_errnop);
++  free (host_buffer);
++  return status;
+ }
+ 
+ 
+@@ -200,7 +208,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
+     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
+     char linebuffer[0];
+   } *host_data = (struct host_data *) buffer;
+-  querybuf host_buffer;
++  querybuf *host_buffer;
+   char qbuf[MAXDNAME+1], *qp;
+   int size, n, status;
+ 
+@@ -251,16 +259,22 @@ _nss_dns_gethostbyaddr_r (const char *ad
+       /* Cannot happen.  */
+     }
+ 
+-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
+-		 sizeof host_buffer);
++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (host_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
++		 sizeof (host_buffer->buf));
+   if (n < 0)
+     {
+       *h_errnop = h_errno;
++      free (host_buffer);
+       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
+     }
+ 
+-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
++  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
+ 			h_errnop);
++  free (host_buffer);
+   if (status != NSS_STATUS_SUCCESS)
+     {
+       *h_errnop = h_errno;
+--- libc/glibc-compat/nss_dns/dns-network.c.jj	Mon Jan  3 20:07:08 2000
++++ libc/glibc-compat/nss_dns/dns-network.c	Thu Oct 10 12:46:24 2002
+@@ -107,21 +107,32 @@ _nss_dns_getnetbyname_r (const char *nam
+ 			 char *buffer, size_t buflen)
+ {
+   /* Return entry for network with NAME.  */
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   int anslen;
+   char *qbuf;
++  enum nss_status status;
+ 
+   qbuf = strdupa (name);
+-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		       sizeof (querybuf));
++
++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (net_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
++		       sizeof (net_buffer->buf));
+   if (anslen < 0)
+-    /* Nothing found.  */
+-    return (errno == ECONNREFUSED
+-	    || errno == EPFNOSUPPORT
+-	    || errno == EAFNOSUPPORT)
+-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    {
++      free (net_buffer);
++      /* Nothing found.  */
++      return (errno == ECONNREFUSED
++	      || errno == EPFNOSUPPORT
++	      || errno == EAFNOSUPPORT)
++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
+ 
+-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
++  free (net_buffer);
++  return status;
+ }
+ 
+ 
+@@ -131,7 +142,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
+ {
+   /* Return entry for network with NAME.  */
+   enum nss_status status;
+-  querybuf net_buffer;
++  querybuf *net_buffer;
+   unsigned int net_bytes[4];
+   char qbuf[MAXDNAME];
+   int cnt, anslen;
+@@ -167,16 +178,24 @@ _nss_dns_getnetbyaddr_r (long net, int t
+       break;
+     }
+ 
+-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
+-		      sizeof (querybuf));
++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
++  if (net_buffer == NULL)
++    return NSS_STATUS_UNAVAIL;
++
++  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
++		      sizeof (net_buffer->buf));
+   if (anslen < 0)
+-    /* Nothing found.  */
+-    return (errno == ECONNREFUSED
+-	    || errno == EPFNOSUPPORT
+-	    || errno == EAFNOSUPPORT)
+-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    {
++      free (net_buffer);
++      /* Nothing found.  */
++      return (errno == ECONNREFUSED
++	      || errno == EPFNOSUPPORT
++	      || errno == EAFNOSUPPORT)
++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
++    }
+ 
+-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
++  free (net_buffer);
+   if (status == NSS_STATUS_SUCCESS)
+     {
+       /* Strip trailing zeros.  */
diff --git a/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch
new file mode 100644
index 00000000..b52f3249
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch
@@ -0,0 +1,33 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/pthread/pthread.h.diff?r1=1.31&r2=1.32&cvsroot=glibc
+
+Fixes 
+../linuxthreads/sysdeps/pthread/pthread.h:141: error: parse error before "__thread"
+../linuxthreads/sysdeps/pthread/pthread.h:141: error: `pthread_create' declared as function returning a function
+../linuxthreads/sysdeps/pthread/pthread.h:141: warning: function declaration isn't a prototype
+../linuxthreads/sysdeps/pthread/pthread.h:141: error: parse error before "void"
+../linuxthreads/sysdeps/pthread/pthread.h:462: error: storage class specified for parameter `type name'
+
+when compiling with gcc3.x
+
+Rediffed against glibc-2.1.3
+
+--- glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h.orig	2000-01-20 17:40:19.000000000 -0800
++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h	2004-03-04 15:56:43.000000000 -0800
+@@ -138,7 +138,7 @@
+ /* Create a thread with given attributes ATTR (or default attributes
+    if ATTR is NULL), and call function START_ROUTINE with given
+    arguments ARG.  */
+-extern int pthread_create __P ((pthread_t *__thread,
++extern int pthread_create __P ((pthread_t *__threadp,
+ 				__const pthread_attr_t *__attr,
+ 				void *(*__start_routine) (void *),
+ 				void *__arg));
+@@ -459,7 +459,7 @@
+ extern int pthread_setcanceltype __P ((int __type, int *__oldtype));
+ 
+ /* Cancel THREAD immediately or at the next possibility.  */
+-extern int pthread_cancel __P ((pthread_t __thread));
++extern int pthread_cancel __P ((pthread_t __cancelthread));
+ 
+ /* Test for pending cancellation for the current thread and terminate
+    the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
diff --git a/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch
new file mode 100644
index 00000000..6234797f
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch
@@ -0,0 +1,18 @@
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h.diff?r1=1.5&r2=1.6&cvsroot=glibc
+
+Fixes 
+
+../linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h:35: error: storage class specified for parameter `type name'
+
+Rediffed to match glibc-2.1.3
+
+--- glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h.orig	1998-09-12 14:33:14.000000000 -0700
++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	2004-03-04 15:50:30.000000000 -0800
+@@ -32,6 +32,6 @@
+ 				 __sigset_t *__oldmask));
+ 
+ /* Send signal SIGNO to the given thread. */
+-extern int pthread_kill __P ((pthread_t __thread, int __signo));
++extern int pthread_kill __P ((pthread_t __threadid, int __signo));
+ 
+ #endif	/* bits/sigthread.h */
diff --git a/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch b/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch
new file mode 100644
index 00000000..081bc298
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch
@@ -0,0 +1,16 @@
+2000-08-03  Ulrich Drepper  <drepper@redhat.com>
+
+	* pthread.c (__pthread_set_own_extricate_if): Remove locking.
+
+--- glibc-2.1.3/linuxthreads/pthread.c.jj	Wed Mar 22 22:26:01 2000
++++ glibc-2.1.3/linuxthreads/pthread.c	Fri Aug 25 09:37:26 2000
+@@ -775,9 +775,7 @@ weak_alias (__pthread_getconcurrency, pt
+ 
+ void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif)
+ {
+-  __pthread_lock(self->p_lock, self);
+   THREAD_SETMEM(self, p_extricate, peif);
+-  __pthread_unlock(self->p_lock);
+ }
+ 
+ /* Primitives for controlling thread execution */
diff --git a/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch b/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch
new file mode 100644
index 00000000..59f6060e
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch
@@ -0,0 +1,808 @@
+Fixes following error building glibc-2.2.5 with gcc-3.4:
+td_init.c: In function `td_init':
+td_init.c:30: error: parse error before string constant
+td_init.c:30: error: parse error before string constant
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.2.5/build-glibc/linuxthreads_db/td_init.os] Error 1
+
+# Retrieved by diffing a +-1 day rng around the time mentioned
+# in http://sources.redhat.com/ml/glibc-cvs/2001-q4/msg00654.html
+# cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2001-12-27 08:41:30" -D"2001-12-29 08:41:32"
+# then fixing paths.
+
+# And then removing hunks that don't apply to rh6.2's glibc-2.1.3
+# (thankfully, all were comments)
+# and rediffing one hunk for glibc-2.1.3
+
+Index: td_init.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_init.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_init.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_init.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Initialization function of thread debugger support library.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -27,6 +27,6 @@
+ td_init (void)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_init");
+   return TD_OK;
+ }
+Index: td_log.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_log.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_log.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_log.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Noop, left for historical reasons.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,8 +25,8 @@
+ td_log (void)
+ {
+   /* This interface is deprecated in the Sun interface.  We provide it
+-     for compatibility but don't do anyhting ourself.  We might in
++     for compatibility but don't do anything ourself.  We might in
+      future do some logging if this seems reasonable.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_log");
+   return TD_OK;
+ }
+Index: td_ta_clear_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_clear_event.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_clear_event.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_clear_event.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Globally disable events.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_clear_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_delete.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_delete.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_delete.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_delete.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Detach to target process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -26,7 +26,7 @@
+ td_err_e
+ td_ta_delete (td_thragent_t *ta)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_delete");
+ 
+   /* Safety check.  */
+   if (ta == NULL || __td_agent_list == NULL)
+Index: td_ta_enable_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_enable_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_enable_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_enable_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Enable collection of statistics for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_enable_stats (const td_thragent_t *ta, int enable)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_enable_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_event_addr.c
+===================================================================
+--- glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c~	Tue Nov  9 21:05:07 1999
++++ glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c	Sun Apr 11 22:23:28 2004
+@@ -29,7 +29,7 @@
+   td_err_e res = TD_NOEVENT;
+   const char *symbol = NULL;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_addr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_event_getmsg.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_getmsg.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_event_getmsg.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_event_getmsg.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -1,5 +1,5 @@
+ /* Retrieve event.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -32,7 +32,7 @@
+   td_eventbuf_t event;
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_getmsg");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_nthreads.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_nthreads.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_get_nthreads.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_get_nthreads.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -25,7 +25,7 @@
+ {
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_nthreads");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_ph.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_ph.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_get_ph.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_get_ph.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Get external process handle.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -24,7 +24,7 @@
+ td_err_e
+ td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_ph");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_get_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_get_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Retrieve statistics for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_map_id2thr.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_id2thr.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_map_id2thr.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_map_id2thr.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -28,7 +28,7 @@
+   struct _pthread_descr_struct pds;
+   int pthread_threads_max;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_id2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_map_lwp2thr.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_lwp2thr.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_map_lwp2thr.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_map_lwp2thr.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -1,5 +1,5 @@
+ /* Which thread is running on an lwp?
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -34,7 +34,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_lwp2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_new.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_new.c,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- libc/linuxthreads_db/td_ta_new.c	6 Jul 2001 05:27:23 -0000	1.10
++++ libc/linuxthreads_db/td_ta_new.c	28 Dec 2001 16:41:29 -0000	1.11
+@@ -35,7 +35,7 @@
+   psaddr_t addr;
+   struct agent_list *elemp;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_new");
+ 
+   /* Get the global event mask.  This is one of the variables which
+      are new in the thread library to enable debugging.  If it is
+Index: td_ta_reset_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_reset_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_reset_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_reset_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Reset statistics.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_reset_stats (const td_thragent_t *ta)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_reset_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_set_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_set_event.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_set_event.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_set_event.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -1,5 +1,5 @@
+ /* Globally enable events.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_set_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_setconcurrency.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_setconcurrency.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_setconcurrency.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_setconcurrency.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Set suggested concurrency level for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_setconcurrency (const td_thragent_t *ta, int level)
+ {
+   /* This is something LinuxThreads does not support.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_setconcurrency");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_thr_iter.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_thr_iter.c,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- libc/linuxthreads_db/td_ta_thr_iter.c	6 Jul 2001 05:27:23 -0000	1.11
++++ libc/linuxthreads_db/td_ta_thr_iter.c	28 Dec 2001 16:41:29 -0000	1.12
+@@ -86,7 +86,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_thr_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_tsd_iter.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_tsd_iter.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_tsd_iter.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_tsd_iter.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -29,7 +29,7 @@
+   int pthread_keys_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_tsd_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_thr_clear_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_clear_event.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_clear_event.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_clear_event.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Disable specific event for thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -31,7 +31,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_clear_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_dbresume.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbresume.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_dbresume.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_dbresume.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Resume execution of given thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_dbresume (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbresume");
+   return TD_NOCAPAB;
+ }
+Index: td_thr_dbsuspend.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbsuspend.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_dbsuspend.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_dbsuspend.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Suspend execution of given thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_dbsuspend (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbsuspend");
+   return TD_NOCAPAB;
+ }
+Index: td_thr_event_enable.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_enable.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_event_enable.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_event_enable.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Enable event process-wide.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -28,7 +28,7 @@
+      const td_thrhandle_t *th;
+      int onoff;
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_enable");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdwrite (th->th_ta_p->ph,
+Index: td_thr_event_getmsg.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_getmsg.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_event_getmsg.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_event_getmsg.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Retrieve event.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+ {
+   td_eventbuf_t event;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_getmsg");
+ 
+   /* Read the even structure from the target.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_get_info.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_get_info.c,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- libc/linuxthreads_db/td_thr_get_info.c	6 Jul 2001 05:27:23 -0000	1.9
++++ libc/linuxthreads_db/td_thr_get_info.c	28 Dec 2001 16:41:29 -0000	1.10
+@@ -29,7 +29,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_get_info");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getfpregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getfpregs.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_getfpregs.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_getfpregs.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getgregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getgregs.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/linuxthreads_db/td_thr_getgregs.c	6 Jul 2001 05:27:23 -0000	1.8
++++ libc/linuxthreads_db/td_thr_getgregs.c	28 Dec 2001 16:41:29 -0000	1.9
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getxregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregs.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_getxregs.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_getxregs.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get a thread's extra state register set.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregs");
+   return TD_NOXREGS;
+ }
+Index: td_thr_getxregsize.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregsize.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_getxregsize.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_getxregsize.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get the size of the extra state register set for this architecture.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregsize");
+   return TD_NOXREGS;
+ }
+Index: td_thr_set_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_set_event.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_set_event.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_set_event.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -1,5 +1,5 @@
+ /* Enable specific event for thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -31,7 +31,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_set_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_setfpregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setfpregs.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_setfpregs.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_setfpregs.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_setgregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setgregs.c,v
+retrieving revision 1.6
+retrieving revision 1.7
+diff -u -r1.6 -r1.7
+--- libc/linuxthreads_db/td_thr_setgregs.c	6 Jul 2001 05:27:23 -0000	1.6
++++ libc/linuxthreads_db/td_thr_setgregs.c	28 Dec 2001 16:41:29 -0000	1.7
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_setprio.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setprio.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setprio.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setprio.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's priority.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_setprio (const td_thrhandle_t *th, int prio)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setprio");
+   return TD_OK;
+ }
+Index: td_thr_setsigpending.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setsigpending.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setsigpending.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setsigpending.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Raise a signal for a thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -26,6 +26,6 @@
+ 		      const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setsigpending");
+   return TD_OK;
+ }
+Index: td_thr_setxregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setxregs.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setxregs.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setxregs.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's extra state register set.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
+ {
+   /* XXX This might have to be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setxregs");
+   return TD_NOXREGS;
+ }
+Index: td_thr_sigsetmask.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_sigsetmask.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_sigsetmask.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_sigsetmask.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's signal mask.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_sigsetmask");
+   return TD_OK;
+ }
+Index: td_thr_tsd.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_tsd.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_tsd.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_tsd.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get a thread-specific data pointer for a thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -33,7 +33,7 @@
+   unsigned int idx2nd;
+   void *p;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_tsd");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_validate.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_validate.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_validate.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_validate.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -28,7 +28,7 @@
+   int pthread_threads_max = th->th_ta_p->pthread_threads_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_validate");
+ 
+   /* Now get all descriptors, one after the other.  */
+   for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
diff --git a/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch b/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch
new file mode 100644
index 00000000..7719e5e4
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch
@@ -0,0 +1,497 @@
+Fixes
+td_init.c:30: error: parse error before string constant
+td_init.c:30: error: parse error before string constant
+
+From http://sources.redhat.com/ml/crossgcc/2005-01/msg00106.html :
+---
+Date: Mon, 31 Jan 2005 10:27:32 -0800
+Message-ID: <BF124E1E7928E546B5705D93C699ABDC0C7E99@glimmer.glimmerglassnet.com>
+From: "Vince Chen" <chen at glimmerglass dot com>
+To: <crossgcc at sources dot redhat dot com>
+
+I needed to build glibc-2.2.2 using gcc-3.x to support
+some of our older redhat machines.
+
+This file patches glibc-linuxthreads-2.2.2.
+
+When using crosstool, I placed it in:
+
+   patches/glibc-linuxthreads-2.2.2/linuxthreads-gcc3.patch
+
+(you also need the glibc-gcc3.patch)
+
+-vince
+---
+[removed parts already in threadparam.patch]
+
+===================================================================
+--- glibc-2.2.2/linuxthreads_db.orig/td_init.c	1999-11-22 12:52:34.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_init.c	2005-01-27 19:05:36.000000000 -0800
+@@ -27,6 +27,6 @@
+ td_init (void)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_init");
+   return TD_OK;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_log.c glibc-2.2.2/linuxthreads_db/td_log.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_log.c	1999-10-07 23:31:32.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_log.c	2005-01-27 19:05:29.000000000 -0800
+@@ -27,6 +27,6 @@
+   /* This interface is deprecated in the Sun interface.  We provide it
+      for compatibility but don't do anyhting ourself.  We might in
+      future do some logging if this seems reasonable.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_log");
+   return TD_OK;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_clear_event.c glibc-2.2.2/linuxthreads_db/td_ta_clear_event.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_clear_event.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_clear_event.c	2005-01-27 19:05:20.000000000 -0800
+@@ -22,14 +22,12 @@
+ 
+ 
+ td_err_e
+-td_ta_clear_event (ta, event)
+-     const td_thragent_t *ta;
+-     td_thr_events_t *event;
++td_ta_clear_event (const td_thragent_t *ta, td_thr_events_t *event)
+ {
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_clear_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_delete.c glibc-2.2.2/linuxthreads_db/td_ta_delete.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_delete.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_delete.c	2005-01-27 19:04:59.000000000 -0800
+@@ -26,7 +26,7 @@
+ td_err_e
+ td_ta_delete (td_thragent_t *ta)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_delete");
+ 
+   /* Safety check.  */
+   if (ta == NULL || __td_agent_list == NULL)
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_enable_stats.c glibc-2.2.2/linuxthreads_db/td_ta_enable_stats.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_enable_stats.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_enable_stats.c	2005-01-27 19:04:50.000000000 -0800
+@@ -25,7 +25,7 @@
+ td_ta_enable_stats (const td_thragent_t *ta, int enable)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_enable_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_event_addr.c glibc-2.2.2/linuxthreads_db/td_ta_event_addr.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_event_addr.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_event_addr.c	2005-01-27 19:04:41.000000000 -0800
+@@ -29,7 +29,7 @@
+   td_err_e res = TD_NOEVENT;
+   const char *symbol = NULL;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_addr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_event_getmsg.c glibc-2.2.2/linuxthreads_db/td_ta_event_getmsg.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_event_getmsg.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_event_getmsg.c	2005-01-27 19:04:33.000000000 -0800
+@@ -32,7 +32,7 @@
+   td_eventbuf_t event;
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_getmsg");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_nthreads.c glibc-2.2.2/linuxthreads_db/td_ta_get_nthreads.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_nthreads.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_get_nthreads.c	2005-01-27 19:04:25.000000000 -0800
+@@ -26,7 +26,7 @@
+ {
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_nthreads");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_ph.c glibc-2.2.2/linuxthreads_db/td_ta_get_ph.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_ph.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_get_ph.c	2005-01-27 19:04:17.000000000 -0800
+@@ -24,7 +24,7 @@
+ td_err_e
+ td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_ph");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_stats.c glibc-2.2.2/linuxthreads_db/td_ta_get_stats.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_stats.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_get_stats.c	2005-01-27 19:04:06.000000000 -0800
+@@ -25,7 +25,7 @@
+ td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_map_id2thr.c glibc-2.2.2/linuxthreads_db/td_ta_map_id2thr.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_map_id2thr.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_map_id2thr.c	2005-01-27 19:03:54.000000000 -0800
+@@ -28,7 +28,7 @@
+   struct _pthread_descr_struct pds;
+   int pthread_threads_max;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_id2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_map_lwp2thr.c glibc-2.2.2/linuxthreads_db/td_ta_map_lwp2thr.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_map_lwp2thr.c	1999-11-22 18:25:26.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_map_lwp2thr.c	2005-01-27 19:03:46.000000000 -0800
+@@ -34,7 +34,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_lwp2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_new.c glibc-2.2.2/linuxthreads_db/td_ta_new.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_new.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_new.c	2005-01-27 19:03:36.000000000 -0800
+@@ -36,7 +36,7 @@
+   psaddr_t addr;
+   struct agent_list *elemp;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_new");
+ 
+   /* Get the global event mask.  This is one of the variables which
+      are new in the thread library to enable debugging.  If it is
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_reset_stats.c glibc-2.2.2/linuxthreads_db/td_ta_reset_stats.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_reset_stats.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_reset_stats.c	2005-01-27 19:03:27.000000000 -0800
+@@ -25,7 +25,7 @@
+ td_ta_reset_stats (const td_thragent_t *ta)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_reset_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_set_event.c glibc-2.2.2/linuxthreads_db/td_ta_set_event.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_set_event.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_set_event.c	2005-01-27 19:03:15.000000000 -0800
+@@ -22,14 +22,12 @@
+ 
+ 
+ td_err_e
+-td_ta_set_event (ta, event)
+-     const td_thragent_t *ta;
+-     td_thr_events_t *event;
++td_ta_set_event (const td_thragent_t *ta, td_thr_events_t *event)
+ {
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_set_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_setconcurrency.c glibc-2.2.2/linuxthreads_db/td_ta_setconcurrency.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_setconcurrency.c	1999-11-08 14:52:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_setconcurrency.c	2005-01-27 19:02:48.000000000 -0800
+@@ -25,7 +25,7 @@
+ td_ta_setconcurrency (const td_thragent_t *ta, int level)
+ {
+   /* This is something LinuxThreads does not support.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_setconcurrency");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_thr_iter.c glibc-2.2.2/linuxthreads_db/td_ta_thr_iter.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_thr_iter.c	2000-02-28 12:34:06.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_thr_iter.c	2005-01-27 19:02:39.000000000 -0800
+@@ -86,7 +86,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_thr_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_tsd_iter.c glibc-2.2.2/linuxthreads_db/td_ta_tsd_iter.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_ta_tsd_iter.c	2000-02-28 12:34:06.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_ta_tsd_iter.c	2005-01-27 19:02:29.000000000 -0800
+@@ -29,7 +29,7 @@
+   int pthread_keys_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_tsd_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_clear_event.c glibc-2.2.2/linuxthreads_db/td_thr_clear_event.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_clear_event.c	1999-11-03 10:37:18.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_clear_event.c	2005-01-27 19:02:19.000000000 -0800
+@@ -24,14 +24,12 @@
+ 
+ 
+ td_err_e
+-td_thr_clear_event (th, event)
+-     const td_thrhandle_t *th;
+-     td_thr_events_t *event;
++td_thr_clear_event (const td_thrhandle_t *th, td_thr_events_t *event)
+ {
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_clear_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_dbresume.c glibc-2.2.2/linuxthreads_db/td_thr_dbresume.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_dbresume.c	1999-10-07 23:40:02.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_dbresume.c	2005-01-27 19:01:54.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_dbresume (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbresume");
+   return TD_NOCAPAB;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_dbsuspend.c glibc-2.2.2/linuxthreads_db/td_thr_dbsuspend.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_dbsuspend.c	1999-10-07 23:40:33.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_dbsuspend.c	2005-01-27 19:01:46.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_dbsuspend (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbsuspend");
+   return TD_NOCAPAB;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_event_enable.c glibc-2.2.2/linuxthreads_db/td_thr_event_enable.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_event_enable.c	1999-11-02 16:06:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_event_enable.c	2005-01-27 19:01:35.000000000 -0800
+@@ -24,11 +24,9 @@
+ 
+ 
+ td_err_e
+-td_thr_event_enable (th, onoff)
+-     const td_thrhandle_t *th;
+-     int onoff;
++td_thr_event_enable (const td_thrhandle_t *th, int onoff)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_enable");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdwrite (th->th_ta_p->ph,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_event_getmsg.c glibc-2.2.2/linuxthreads_db/td_thr_event_getmsg.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_event_getmsg.c	1999-11-02 16:06:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_event_getmsg.c	2005-01-27 19:01:11.000000000 -0800
+@@ -29,7 +29,7 @@
+ {
+   td_eventbuf_t event;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_getmsg");
+ 
+   /* Read the even structure from the target.  */
+   if (ps_pdread (th->th_ta_p->ph,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_get_info.c glibc-2.2.2/linuxthreads_db/td_thr_get_info.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_get_info.c	2000-05-01 14:56:42.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_get_info.c	2005-01-27 19:00:59.000000000 -0800
+@@ -29,7 +29,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_get_info");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getfpregs.c glibc-2.2.2/linuxthreads_db/td_thr_getfpregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getfpregs.c	1999-11-02 16:06:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_getfpregs.c	2005-01-27 19:00:49.000000000 -0800
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getgregs.c glibc-2.2.2/linuxthreads_db/td_thr_getgregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getgregs.c	2000-02-11 15:48:51.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_getgregs.c	2005-01-27 19:00:37.000000000 -0800
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregs.c glibc-2.2.2/linuxthreads_db/td_thr_getxregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregs.c	1999-10-07 23:46:09.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_getxregs.c	2005-01-27 19:00:26.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregs");
+   return TD_NOXREGS;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregsize.c glibc-2.2.2/linuxthreads_db/td_thr_getxregsize.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregsize.c	1999-10-07 23:46:33.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_getxregsize.c	2005-01-27 19:00:16.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregsize");
+   return TD_NOXREGS;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_set_event.c glibc-2.2.2/linuxthreads_db/td_thr_set_event.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_set_event.c	1999-11-03 10:37:18.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_set_event.c	2005-01-27 19:00:08.000000000 -0800
+@@ -24,14 +24,12 @@
+ 
+ 
+ td_err_e
+-td_thr_set_event (th, event)
+-     const td_thrhandle_t *th;
+-     td_thr_events_t *event;
++td_thr_set_event (const td_thrhandle_t *th, td_thr_events_t *event)
+ {
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_set_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setfpregs.c glibc-2.2.2/linuxthreads_db/td_thr_setfpregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setfpregs.c	1999-11-02 16:06:10.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_setfpregs.c	2005-01-27 18:59:06.000000000 -0800
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setgregs.c glibc-2.2.2/linuxthreads_db/td_thr_setgregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setgregs.c	2000-02-11 15:48:51.000000000 -0800
++++ glibc-2.2.2/linuxthreads_db/td_thr_setgregs.c	2005-01-27 18:58:57.000000000 -0800
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setprio.c glibc-2.2.2/linuxthreads_db/td_thr_setprio.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setprio.c	1999-10-07 23:49:11.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_setprio.c	2005-01-27 18:58:46.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_setprio (const td_thrhandle_t *th, int prio)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setprio");
+   return TD_OK;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setsigpending.c glibc-2.2.2/linuxthreads_db/td_thr_setsigpending.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setsigpending.c	1999-10-07 23:49:38.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_setsigpending.c	2005-01-27 18:58:34.000000000 -0800
+@@ -26,6 +26,6 @@
+ 		      const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setsigpending");
+   return TD_OK;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setxregs.c glibc-2.2.2/linuxthreads_db/td_thr_setxregs.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setxregs.c	1999-10-07 23:48:20.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_setxregs.c	2005-01-27 18:58:21.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
+ {
+   /* XXX This might have to be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setxregs");
+   return TD_NOXREGS;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_sigsetmask.c glibc-2.2.2/linuxthreads_db/td_thr_sigsetmask.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_sigsetmask.c	1999-10-07 23:50:34.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_sigsetmask.c	2005-01-27 18:57:58.000000000 -0800
+@@ -25,6 +25,6 @@
+ td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_sigsetmask");
+   return TD_OK;
+ }
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_tsd.c glibc-2.2.2/linuxthreads_db/td_thr_tsd.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_tsd.c	1999-10-07 23:52:15.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_tsd.c	2005-01-27 18:58:09.000000000 -0800
+@@ -33,7 +33,7 @@
+   unsigned int idx2nd;
+   void *p;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_tsd");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_validate.c glibc-2.2.2/linuxthreads_db/td_thr_validate.c
+--- glibc-2.2.2/linuxthreads_db.orig/td_thr_validate.c	1999-10-14 17:24:20.000000000 -0700
++++ glibc-2.2.2/linuxthreads_db/td_thr_validate.c	2005-01-27 18:57:41.000000000 -0800
+@@ -28,7 +28,7 @@
+   int pthread_threads_max = th->th_ta_p->pthread_threads_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_validate");
+ 
+   /* Now get all descriptors, one after the other.  */
+   for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
diff --git a/patches/glibc/linuxthreads-2.2.2/threadparam.patch b/patches/glibc/linuxthreads-2.2.2/threadparam.patch
new file mode 100644
index 00000000..dd97838c
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.2/threadparam.patch
@@ -0,0 +1,69 @@
+2002-05-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/pthread/pthread.h (pthread_create): Rename first parameter.
+	(pthread_cancel): Likewise.
+	* internals.h (__pthread_create_2_1): Likewise.
+	* sysdeps/unix/sysv/linux/bits/sigthread.h (pthread_kill): Likewise.
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/internals.h,v
+retrieving revision 1.69.2.2
+retrieving revision 1.69.2.3
+diff -u -r1.69.2.2 -r1.69.2.3
+--- libc/linuxthreads/internals.h	2002/03/22 08:30:32	1.69.2.2
++++ libc/linuxthreads/internals.h	2002/08/20 22:01:25	1.69.2.3
+@@ -554,7 +554,7 @@
+ /* Prototypes for compatibility functions.  */
+ extern int __pthread_attr_init_2_1 (pthread_attr_t *__attr);
+ extern int __pthread_attr_init_2_0 (pthread_attr_t *__attr);
+-extern int __pthread_create_2_1 (pthread_t *__restrict __thread,
++extern int __pthread_create_2_1 (pthread_t *__restrict __threadp,
+ 				 const pthread_attr_t *__attr,
+ 				 void *(*__start_routine) (void *),
+ 				 void *__restrict __arg);
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/pthread.h,v
+retrieving revision 1.31
+retrieving revision 1.31.2.1
+diff -u -r1.31 -r1.31.2.1
+--- libc/linuxthreads/sysdeps/pthread/pthread.h	2001/03/15 21:12:31	1.31
++++ libc/linuxthreads/sysdeps/pthread/pthread.h	2002/08/20 22:01:26	1.31.2.1
+@@ -160,7 +160,7 @@
+ /* Create a thread with given attributes ATTR (or default attributes
+    if ATTR is NULL), and call function START_ROUTINE with given
+    arguments ARG.  */
+-extern int pthread_create (pthread_t *__restrict __thread,
++extern int pthread_create (pthread_t *__restrict __threadp,
+ 			   __const pthread_attr_t *__restrict __attr,
+ 			   void *(*__start_routine) (void *),
+ 			   void *__restrict __arg) __THROW;
+@@ -588,7 +588,7 @@
+ extern int pthread_setcanceltype (int __type, int *__oldtype) __THROW;
+ 
+ /* Cancel THREAD immediately or at the next possibility.  */
+-extern int pthread_cancel (pthread_t __thread) __THROW;
++extern int pthread_cancel (pthread_t __cancelthread) __THROW;
+ 
+ /* Test for pending cancellation for the current thread and terminate
+    the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h,v
+retrieving revision 1.5
+retrieving revision 1.5.2.1
+diff -u -r1.5 -r1.5.2.1
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	2000/08/21 06:48:03	1.5
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	2002/08/20 22:01:26	1.5.2.1
+@@ -1,5 +1,5 @@
+ /* Signal handling function for threaded programs.
+-   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
++   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -33,6 +33,6 @@
+ 			    __sigset_t *__restrict __oldmask)__THROW;
+ 
+ /* Send signal SIGNO to the given thread. */
+-extern int pthread_kill (pthread_t __thread, int __signo) __THROW;
++extern int pthread_kill (pthread_t __threadid, int __signo) __THROW;
+ 
+ #endif	/* bits/sigthread.h */
diff --git a/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch
new file mode 100644
index 00000000..0a6cee11
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch
@@ -0,0 +1,881 @@
+Fixes following error building glibc-2.2.5 with gcc-3.4:
+td_init.c: In function `td_init':
+td_init.c:30: error: parse error before string constant
+td_init.c:30: error: parse error before string constant
+make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.2.5/build-glibc/linuxthreads_db/td_init.os] Error 1
+
+# Retrieved by diffing a +-1 day rng around the time mentioned
+# in http://sources.redhat.com/ml/glibc-cvs/2001-q4/msg00654.html
+# cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2001-12-27 08:41:30" -D"2001-12-29 08:41:32"
+# then fixing paths.
+
+Index: ChangeLog
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/ChangeLog,v
+retrieving revision 1.41
+retrieving revision 1.42
+diff -u -r1.41 -r1.42
+--- libc/linuxthreads_db/ChangeLog	13 Apr 2001 00:09:54 -0000	1.41
++++ libc/linuxthreads_db/ChangeLog	29 Dec 2001 00:59:58 -0000	1.42
+@@ -1,3 +1,43 @@
++2001-12-28  Andreas Jaeger  <aj@suse.de>
++
++	* td_init.c (td_init): Don't use __FUNCTION__ as literal.
++	* td_log.c (td_log): Likewise.
++	* td_ta_delete.c (td_ta_delete): Likewise.
++	* td_ta_get_nthreads.c (td_ta_get_nthreads): Likewise.
++	* td_ta_get_ph.c (td_ta_get_ph): Likewise.
++	* td_ta_map_id2thr.c (td_ta_map_id2thr): Likewise.
++	* td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Likewise.
++	* td_ta_new.c (td_ta_new): Likewise.
++	* td_ta_clear_event.c (td_ta_clear_event): Likewise.
++	* td_ta_enable_stats.c (td_ta_enable_stats): Likewise.
++	* td_ta_event_addr.c (td_ta_event_addr): Likewise.
++	* td_ta_event_getmsg.c (td_ta_event_getmsg): Likewise.
++	* td_ta_get_stats.c (td_ta_get_stats): Likewise.
++	* td_ta_reset_stats.c (td_ta_reset_stats): Likewise.
++	* td_ta_set_event.c (td_ta_set_event): Likewise.
++	* td_ta_setconcurrency.c (td_ta_setconcurrency): Likewise.
++	* td_ta_thr_iter.c (td_ta_thr_iter): Likewise.
++	* td_ta_tsd_iter.c (td_ta_tsd_iter): Likewise.
++	* td_thr_clear_event.c (td_thr_clear_event): Likewise.
++	* td_thr_dbresume.c (td_thr_dbresume): Likewise.
++	* td_thr_dbsuspend.c (td_thr_dbsuspend): Likewise.
++	* td_thr_event_enable.c (td_thr_event_enable): Likewise.
++	* td_thr_event_getmsg.c (td_thr_event_getmsg): Likewise.
++	* td_thr_get_info.c (td_thr_get_info): Likewise.
++	* td_thr_getfpregs.c (td_thr_getfpregs): Likewise.
++	* td_thr_getgregs.c (td_thr_getgregs): Likewise.
++	* td_thr_getxregs.c (td_thr_getxregs): Likewise.
++	* td_thr_getxregsize.c (td_thr_getxregsize): Likewise.
++	* td_thr_set_event.c (td_thr_set_event): Likewise.
++	* td_thr_setfpregs.c (td_thr_setfpregs): Likewise.
++	* td_thr_setgregs.c (td_thr_setgregs): Likewise.
++	* td_thr_setprio.c (td_thr_setprio): Likewise.
++	* td_thr_setsigpending.c (td_thr_setsigpending): Likewise.
++	* td_thr_setxregs.c (td_thr_setxregs): Likewise.
++	* td_thr_sigsetmask.c (td_thr_sigsetmask): Likewise.
++	* td_thr_tsd.c (td_thr_tsd): Likewise.
++	* td_thr_validate.c (td_thr_validate): Likewise.
++
+ 2001-04-12  Ulrich Drepper  <drepper@redhat.com>
+ 
+ 	* td_ta_map_id2thr.c: If thread terminated return TD_NOTHR.
+Index: td_init.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_init.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_init.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_init.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Initialization function of thread debugger support library.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -27,6 +27,6 @@
+ td_init (void)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_init");
+   return TD_OK;
+ }
+Index: td_log.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_log.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_log.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_log.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Noop, left for historical reasons.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,8 +25,8 @@
+ td_log (void)
+ {
+   /* This interface is deprecated in the Sun interface.  We provide it
+-     for compatibility but don't do anyhting ourself.  We might in
++     for compatibility but don't do anything ourself.  We might in
+      future do some logging if this seems reasonable.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_log");
+   return TD_OK;
+ }
+Index: td_ta_clear_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_clear_event.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_clear_event.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_clear_event.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Globally disable events.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_clear_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_delete.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_delete.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_delete.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_delete.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Detach to target process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -26,7 +26,7 @@
+ td_err_e
+ td_ta_delete (td_thragent_t *ta)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_delete");
+ 
+   /* Safety check.  */
+   if (ta == NULL || __td_agent_list == NULL)
+Index: td_ta_enable_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_enable_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_enable_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_enable_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Enable collection of statistics for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_enable_stats (const td_thragent_t *ta, int enable)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_enable_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_event_addr.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_addr.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_event_addr.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_event_addr.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -27,7 +27,7 @@
+   td_err_e res = TD_NOEVENT;
+   int idx = -1;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_addr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_event_getmsg.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_getmsg.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_event_getmsg.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_event_getmsg.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -1,5 +1,5 @@
+ /* Retrieve event.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -32,7 +32,7 @@
+   td_eventbuf_t event;
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_event_getmsg");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_nthreads.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_nthreads.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_get_nthreads.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_get_nthreads.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -25,7 +25,7 @@
+ {
+   psaddr_t addr;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_nthreads");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_ph.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_ph.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_get_ph.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_get_ph.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Get external process handle.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -24,7 +24,7 @@
+ td_err_e
+ td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph)
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_ph");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_get_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_get_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_get_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Retrieve statistics for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_get_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_map_id2thr.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_id2thr.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_map_id2thr.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_map_id2thr.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -28,7 +28,7 @@
+   struct _pthread_descr_struct pds;
+   int pthread_threads_max;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_id2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_map_lwp2thr.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_lwp2thr.c,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads_db/td_ta_map_lwp2thr.c	6 Jul 2001 05:27:23 -0000	1.5
++++ libc/linuxthreads_db/td_ta_map_lwp2thr.c	28 Dec 2001 16:41:29 -0000	1.6
+@@ -1,5 +1,5 @@
+ /* Which thread is running on an lwp?
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -34,7 +34,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_map_lwp2thr");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_new.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_new.c,v
+retrieving revision 1.10
+retrieving revision 1.11
+diff -u -r1.10 -r1.11
+--- libc/linuxthreads_db/td_ta_new.c	6 Jul 2001 05:27:23 -0000	1.10
++++ libc/linuxthreads_db/td_ta_new.c	28 Dec 2001 16:41:29 -0000	1.11
+@@ -35,7 +35,7 @@
+   psaddr_t addr;
+   struct agent_list *elemp;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_new");
+ 
+   /* Get the global event mask.  This is one of the variables which
+      are new in the thread library to enable debugging.  If it is
+Index: td_ta_reset_stats.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_reset_stats.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_reset_stats.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_reset_stats.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Reset statistics.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_reset_stats (const td_thragent_t *ta)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_reset_stats");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_set_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_set_event.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_set_event.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_set_event.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -1,5 +1,5 @@
+ /* Globally enable events.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_set_event");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_setconcurrency.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_setconcurrency.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_ta_setconcurrency.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_ta_setconcurrency.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Set suggested concurrency level for process.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,7 +25,7 @@
+ td_ta_setconcurrency (const td_thragent_t *ta, int level)
+ {
+   /* This is something LinuxThreads does not support.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_setconcurrency");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_thr_iter.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_thr_iter.c,v
+retrieving revision 1.11
+retrieving revision 1.12
+diff -u -r1.11 -r1.12
+--- libc/linuxthreads_db/td_ta_thr_iter.c	6 Jul 2001 05:27:23 -0000	1.11
++++ libc/linuxthreads_db/td_ta_thr_iter.c	28 Dec 2001 16:41:29 -0000	1.12
+@@ -1,5 +1,5 @@
+ /* Iterate over a process's threads.
+-   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -86,7 +86,7 @@
+ # define num 1
+ #endif
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_thr_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_ta_tsd_iter.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_tsd_iter.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_ta_tsd_iter.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_ta_tsd_iter.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -1,5 +1,5 @@
+ /* Iterate over a process's thread-specific data.
+-   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+   int pthread_keys_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_ta_tsd_iter");
+ 
+   /* Test whether the TA parameter is ok.  */
+   if (! ta_ok (ta))
+Index: td_thr_clear_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_clear_event.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_clear_event.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_clear_event.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Disable specific event for thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -31,7 +31,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_clear_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_dbresume.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbresume.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_dbresume.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_dbresume.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Resume execution of given thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_dbresume (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbresume");
+   return TD_NOCAPAB;
+ }
+Index: td_thr_dbsuspend.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbsuspend.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_dbsuspend.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_dbsuspend.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Suspend execution of given thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_dbsuspend (const td_thrhandle_t *th)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_dbsuspend");
+   return TD_NOCAPAB;
+ }
+Index: td_thr_event_enable.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_enable.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_event_enable.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_event_enable.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Enable event process-wide.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -28,7 +28,7 @@
+      const td_thrhandle_t *th;
+      int onoff;
+ {
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_enable");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdwrite (th->th_ta_p->ph,
+Index: td_thr_event_getmsg.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_getmsg.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads_db/td_thr_event_getmsg.c	6 Jul 2001 05:27:23 -0000	1.3
++++ libc/linuxthreads_db/td_thr_event_getmsg.c	28 Dec 2001 16:41:29 -0000	1.4
+@@ -1,5 +1,5 @@
+ /* Retrieve event.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+ {
+   td_eventbuf_t event;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_event_getmsg");
+ 
+   /* Read the even structure from the target.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_get_info.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_get_info.c,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- libc/linuxthreads_db/td_thr_get_info.c	6 Jul 2001 05:27:23 -0000	1.9
++++ libc/linuxthreads_db/td_thr_get_info.c	28 Dec 2001 16:41:29 -0000	1.10
+@@ -1,5 +1,5 @@
+ /* Get thread information.
+-   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -29,7 +29,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_get_info");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getfpregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getfpregs.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_getfpregs.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_getfpregs.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getgregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getgregs.c,v
+retrieving revision 1.8
+retrieving revision 1.9
+diff -u -r1.8 -r1.9
+--- libc/linuxthreads_db/td_thr_getgregs.c	6 Jul 2001 05:27:23 -0000	1.8
++++ libc/linuxthreads_db/td_thr_getgregs.c	28 Dec 2001 16:41:29 -0000	1.9
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_getxregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregs.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_getxregs.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_getxregs.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get a thread's extra state register set.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_getxregs (const td_thrhandle_t *th, void *xregs)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregs");
+   return TD_NOXREGS;
+ }
+Index: td_thr_getxregsize.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregsize.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_getxregsize.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_getxregsize.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get the size of the extra state register set for this architecture.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_getxregsize (const td_thrhandle_t *th, int *sizep)
+ {
+   /* XXX This might be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_getxregsize");
+   return TD_NOXREGS;
+ }
+Index: td_thr_set_event.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_set_event.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_set_event.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_set_event.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -1,5 +1,5 @@
+ /* Enable specific event for thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -31,7 +31,7 @@
+   td_thr_events_t old_event;
+   int i;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_set_event");
+ 
+   /* Write the new value into the thread data structure.  */
+   if (ps_pdread (th->th_ta_p->ph,
+Index: td_thr_setfpregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setfpregs.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_setfpregs.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_setfpregs.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setfpregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_setgregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setgregs.c,v
+retrieving revision 1.6
+retrieving revision 1.7
+diff -u -r1.6 -r1.7
+--- libc/linuxthreads_db/td_thr_setgregs.c	6 Jul 2001 05:27:23 -0000	1.6
++++ libc/linuxthreads_db/td_thr_setgregs.c	28 Dec 2001 16:41:29 -0000	1.7
+@@ -26,7 +26,7 @@
+ {
+   struct _pthread_descr_struct pds;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setgregs");
+ 
+   /* We have to get the state and the PID for this thread.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_setprio.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setprio.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setprio.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setprio.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's priority.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_setprio (const td_thrhandle_t *th, int prio)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setprio");
+   return TD_OK;
+ }
+Index: td_thr_setsigpending.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setsigpending.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setsigpending.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setsigpending.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Raise a signal for a thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -26,6 +26,6 @@
+ 		      const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setsigpending");
+   return TD_OK;
+ }
+Index: td_thr_setxregs.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setxregs.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_setxregs.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_setxregs.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's extra state register set.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_setxregs (const td_thrhandle_t *ta, const void *addr)
+ {
+   /* XXX This might have to be platform specific.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_setxregs");
+   return TD_NOXREGS;
+ }
+Index: td_thr_sigsetmask.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_sigsetmask.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_sigsetmask.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_sigsetmask.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Set a thread's signal mask.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -25,6 +25,6 @@
+ td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss)
+ {
+   /* XXX We have to figure out what has to be done.  */
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_sigsetmask");
+   return TD_OK;
+ }
+Index: td_thr_tsd.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_tsd.c,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- libc/linuxthreads_db/td_thr_tsd.c	6 Jul 2001 05:27:23 -0000	1.2
++++ libc/linuxthreads_db/td_thr_tsd.c	28 Dec 2001 16:41:29 -0000	1.3
+@@ -1,5 +1,5 @@
+ /* Get a thread-specific data pointer for a thread.
+-   Copyright (C) 1999 Free Software Foundation, Inc.
++   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
+ 
+@@ -33,7 +33,7 @@
+   unsigned int idx2nd;
+   void *p;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_tsd");
+ 
+   /* Get the thread descriptor.  */
+   if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds,
+Index: td_thr_validate.c
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_validate.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- libc/linuxthreads_db/td_thr_validate.c	6 Jul 2001 05:27:23 -0000	1.4
++++ libc/linuxthreads_db/td_thr_validate.c	28 Dec 2001 16:41:29 -0000	1.5
+@@ -28,7 +28,7 @@
+   int pthread_threads_max = th->th_ta_p->pthread_threads_max;
+   int cnt;
+ 
+-  LOG (__FUNCTION__);
++  LOG ("td_thr_validate");
+ 
+   /* Now get all descriptors, one after the other.  */
+   for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles)
diff --git a/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch
new file mode 100644
index 00000000..fd340340
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch
@@ -0,0 +1,25 @@
+wget http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/alpha/pt-machine.h.diff?r1=1.9&r2=1.10&cvsroot=glibc
+
+Should fix error
+
+internals.h: In function `pthread_setcancelstate':
+internals.h:381: error: asm-specifier for variable `__self' conflicts with asm clobber list
+make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/linuxthreads/cancel.o] Error 1
+make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/linuxthreads'
+
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/alpha/pt-machine.h,v
+retrieving revision 1.9
+retrieving revision 1.10
+diff -u -r1.9 -r1.10
+--- libc/linuxthreads/sysdeps/alpha/pt-machine.h	2002/04/06 04:05:13	1.9
++++ libc/linuxthreads/sysdeps/alpha/pt-machine.h	2002/05/20 20:09:34	1.10
+@@ -76,7 +76,7 @@
+ #define THREAD_SELF \
+ ({									      \
+   register pthread_descr __self __asm__("$0");				      \
+-  __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq) : "$0");	      \
++  __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq));		      \
+   __self;								      \
+ })
+ 
diff --git a/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch b/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch
new file mode 100644
index 00000000..48127a12
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch
@@ -0,0 +1,34 @@
+# see http://bugs.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&pr=4155
+# and http://www.kegel.com/xgcc3/ppc405erratum77.html
+# See also matching patch for glibc
+
+diff -aur glibc-2.2.5.orig/linuxthreads/sysdeps/powerpc/pt-machine.h glibc-2.2.5/linuxthreads/sysdeps/powerpc/pt-machine.h
+--- glibc-2.2.5.orig/linuxthreads/sysdeps/powerpc/pt-machine.h	Thu May 17 12:47:46 2001
++++ glibc-2.2.5/linuxthreads/sysdeps/powerpc/pt-machine.h	Tue Jul 23 05:38:24 2002
+@@ -41,6 +41,17 @@
+ #define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
+ #define IMPLEMENT_TAS_WITH_CAS
+ 
++#ifdef __PPC405__
++/* workaround for PPC405 erratum #77 - Mark Hatle, dank.  References:
++   http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf
++   http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489
++   http://www.kegel.com/xgcc3/ppc405erratum77.html
++   FIXME: using dbct instead of sync would be faster  */
++#define __LINUXTHREADS_PPC405_ERR77_SYNC   "sync \n\t"
++#else
++#define __LINUXTHREADS_PPC405_ERR77_SYNC
++#endif
++
+ PT_EI int
+ __compare_and_swap (long int *p, long int oldval, long int newval)
+ {
+@@ -50,6 +61,7 @@
+ 	   "0:    lwarx %0,0,%1 ;"
+ 	   "      xor. %0,%3,%0;"
+ 	   "      bne 1f;"
++	   __LINUXTHREADS_PPC405_ERR77_SYNC
+ 	   "      stwcx. %2,0,%1;"
+ 	   "      bne- 0b;"
+ 	   "1:    "
+
diff --git a/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch b/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch
new file mode 100644
index 00000000..22a1cfed
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch
@@ -0,0 +1,119 @@
+--- glibc-2.2.5/linuxthreads/sysdeps/alpha/elf/pt-initfini.c.old	Fri Jun  6 22:02:08 2003
++++ glibc-2.2.5/linuxthreads/sysdeps/alpha/elf/pt-initfini.c	Fri Jun  6 22:02:33 2003
+@@ -37,60 +37,60 @@
+    files, all of which may have different GP values.  So we must reload
+    the GP value from crti.o in crtn.o.  */
+ 
+-__asm__ ("
+-
+-#include \"defs.h\"
+-
+-/*@HEADER_ENDS*/
+-
+-/*@_init_PROLOG_BEGINS*/
+-	.section .init, \"ax\", @progbits
+-	.globl	_init
+-	.ent	_init
+-_init:
+-	ldgp	$29, 0($27)
+-	subq	$30, 16, $30
+-	lda	$27, __pthread_initialize_minimal
+-	stq	$26, 0($30)
+-	stq	$29, 8($30)
+-	.prologue 1
+-	jsr	$26, ($27), __pthread_initialize_minimal
+-	ldq	$29, 8($30)
+-	.align 3
+-	.end	_init
+-	.size	_init, 0
+-/*@_init_PROLOG_ENDS*/
+-
+-/*@_init_EPILOG_BEGINS*/
+-	.section .init, \"ax\", @progbits
+-	ldq	$26, 0($30)
+-	ldq	$29, 8($30)
+-	addq	$30, 16, $30
+-	ret
+-/*@_init_EPILOG_ENDS*/
+-
+-/*@_fini_PROLOG_BEGINS*/
+-	.section .fini, \"ax\", @progbits
+-	.globl	_fini
+-	.ent	_fini
+-_fini:
+-	ldgp	$29, 0($27)
+-	subq	$30, 16, $30
+-	stq	$26, 0($30)
+-	stq	$29, 8($30)
+-	.prologue 1
+-	.align 3
+-	.end	_fini
+-	.size	_fini, 0
+-/*@_fini_PROLOG_ENDS*/
+-
+-/*@_fini_EPILOG_BEGINS*/
+-	.section .fini, \"ax\", @progbits
+-	ldq	$26, 0($30)
+-	ldq	$29, 8($30)
+-	addq	$30, 16, $30
+-	ret
+-/*@_fini_EPILOG_ENDS*/
+-
+-/*@TRAILER_BEGINS*/
++__asm__ ("\n\
++\n\
++#include \"defs.h\"\n\
++\n\
++/*@HEADER_ENDS*/\n\
++\n\
++/*@_init_PROLOG_BEGINS*/\n\
++	.section .init, \"ax\", @progbits\n\
++	.globl	_init\n\
++	.ent	_init\n\
++_init:\n\
++	ldgp	$29, 0($27)\n\
++	subq	$30, 16, $30\n\
++	lda	$27, __pthread_initialize_minimal\n\
++	stq	$26, 0($30)\n\
++	stq	$29, 8($30)\n\
++	.prologue 1\n\
++	jsr	$26, ($27), __pthread_initialize_minimal\n\
++	ldq	$29, 8($30)\n\
++	.align 3\n\
++	.end	_init\n\
++	.size	_init, 0\n\
++/*@_init_PROLOG_ENDS*/\n\
++\n\
++/*@_init_EPILOG_BEGINS*/\n\
++	.section .init, \"ax\", @progbits\n\
++	ldq	$26, 0($30)\n\
++	ldq	$29, 8($30)\n\
++	addq	$30, 16, $30\n\
++	ret\n\
++/*@_init_EPILOG_ENDS*/\n\
++\n\
++/*@_fini_PROLOG_BEGINS*/\n\
++	.section .fini, \"ax\", @progbits\n\
++	.globl	_fini\n\
++	.ent	_fini\n\
++_fini:\n\
++	ldgp	$29, 0($27)\n\
++	subq	$30, 16, $30\n\
++	stq	$26, 0($30)\n\
++	stq	$29, 8($30)\n\
++	.prologue 1\n\
++	.align 3\n\
++	.end	_fini\n\
++	.size	_fini, 0\n\
++/*@_fini_PROLOG_ENDS*/\n\
++\n\
++/*@_fini_EPILOG_BEGINS*/\n\
++	.section .fini, \"ax\", @progbits\n\
++	ldq	$26, 0($30)\n\
++	ldq	$29, 8($30)\n\
++	addq	$30, 16, $30\n\
++	ret\n\
++/*@_fini_EPILOG_ENDS*/\n\
++\n\
++/*@TRAILER_BEGINS*/\n\
+ ");
diff --git a/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch b/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch
new file mode 100644
index 00000000..8c9cdb8a
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch
@@ -0,0 +1,267 @@
+--- glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c.old	Wed May 28 09:29:55 2003
++++ glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c	Wed May 28 09:30:11 2003
+@@ -36,134 +36,134 @@
+    * crtn.s puts the corresponding function epilogues
+    in the .init and .fini sections. */
+ 
+-__asm__ ("
+-
+-#include \"defs.h\"
+-#define SHARED
+-
+-/*@HEADER_ENDS*/
+-
+-/*@TESTS_BEGIN*/
+-
+-/*@TESTS_END*/
+-
+-/*@_init_PROLOG_BEGINS*/
+-	.section .init
+-	.align 5
+-	.global	_init
+-	.type	_init,@function
+-_init:
+-	mov.l	r12,@-r15
+-	mov.l	r14,@-r15
+-	sts.l	pr,@-r15
+-#ifdef SHARED
+-	mova	.L22,r0
+-	mov.l	.L22,r12
+-	add	r0,r12
+-	mova	.L24,r0
+-	mov.l	.L24,r1
+-	add	r0,r1
+-	jsr	@r1
+-	 nop
+-	mova	.L23,r0
+-	mov.l	.L23,r1
+-	add	r0,r1
+-#else
+-	mov.l	.L24,r1
+-	jsr	@r1
+-	 nop
+-	mov.l	.L23,r1
+-#endif
+-	jsr	@r1
+-	 mov	r15,r14
+-	bra	1f
+-	 nop
+-	.align 2
+-#ifdef SHARED
+-.L22:
+-	.long	_GLOBAL_OFFSET_TABLE_
+-.L23:
+-	.long	__gmon_start__@PLT
+-.L24:
+-	.long	__pthread_initialize_minimal@PLT
+-#else
+-.L23:
+-	.long	__gmon_start__
+-.L24:
+-	.long	__pthread_initialize_minimal
+-#endif
+-	.data
+-	.global __fpscr_values
+-__fpscr_values:
+-	.long   0
+-	.long   0x80000
+-	.previous
+-1:
+-	ALIGN
+-	END_INIT
+-
+-	
+-/*@_init_PROLOG_ENDS*/
+-
+-/*@_init_EPILOG_BEGINS*/
+-	.section .init
+-	mov	r14,r15
+-	lds.l	@r15+,pr
+-	mov.l	@r15+,r14
+-	rts	
+-	mov.l	@r15+,r12
+-	END_INIT
+-	.section .text
+-	.align 5
+-	.weak	__gmon_start__
+-	.type	__gmon_start__,@function
+-__gmon_start__:
+-	mov.l	r14,@-r15
+-	mov	r15,r14
+-	mov	r14,r15
+-	rts	
+-	mov.l	@r15+,r14
+-	
+-/*@_init_EPILOG_ENDS*/
+-
+-/*@_fini_PROLOG_BEGINS*/
+-	.section .fini
+-	.align 5
+-	.global	_fini
+-	.type	_fini,@function
+-_fini:
+-	mov.l	r12,@-r15
+-	mov.l	r14,@-r15
+-	sts.l	pr,@-r15
+-#ifdef SHARED
+-	mova	.L27,r0
+-	mov.l	.L27,r12
+-	add	r0,r12
+-#endif
+-	mov	r15,r14
+-	ALIGN
+-	END_FINI
+-#ifdef SHARED
+-	bra	1f
+-	 nop
+-	.align	2
+-.L27:
+-	.long	_GLOBAL_OFFSET_TABLE_
+-#endif
+-1:
+-/*@_fini_PROLOG_ENDS*/
+-
+-/*@_fini_EPILOG_BEGINS*/
+-	.section .fini
+-	mov	r14,r15
+-	lds.l	@r15+,pr
+-	mov.l	@r15+,r14
+-	rts	
+-	mov.l	@r15+,r12
+-
+-	END_FINI
+-	
+-/*@_fini_EPILOG_ENDS*/
+-
+-/*@TRAILER_BEGINS*/
++__asm__ ("\n\
++\n\
++#include \"defs.h\"\n\
++#define SHARED\n\
++\n\
++/*@HEADER_ENDS*/\n\
++\n\
++/*@TESTS_BEGIN*/\n\
++\n\
++/*@TESTS_END*/\n\
++\n\
++/*@_init_PROLOG_BEGINS*/\n\
++	.section .init\n\
++	.align 5\n\
++	.global	_init\n\
++	.type	_init,@function\n\
++_init:\n\
++	mov.l	r12,@-r15\n\
++	mov.l	r14,@-r15\n\
++	sts.l	pr,@-r15\n\
++#ifdef SHARED\n\
++	mova	.L22,r0\n\
++	mov.l	.L22,r12\n\
++	add	r0,r12\n\
++	mova	.L24,r0\n\
++	mov.l	.L24,r1\n\
++	add	r0,r1\n\
++	jsr	@r1\n\
++	 nop\n\
++	mova	.L23,r0\n\
++	mov.l	.L23,r1\n\
++	add	r0,r1\n\
++#else\n\
++	mov.l	.L24,r1\n\
++	jsr	@r1\n\
++	 nop\n\
++	mov.l	.L23,r1\n\
++#endif\n\
++	jsr	@r1\n\
++	 mov	r15,r14\n\
++	bra	1f\n\
++	 nop\n\
++	.align 2\n\
++#ifdef SHARED\n\
++.L22:\n\
++	.long	_GLOBAL_OFFSET_TABLE_\n\
++.L23:\n\
++	.long	__gmon_start__@PLT\n\
++.L24:\n\
++	.long	__pthread_initialize_minimal@PLT\n\
++#else\n\
++.L23:\n\
++	.long	__gmon_start__\n\
++.L24:\n\
++	.long	__pthread_initialize_minimal\n\
++#endif\n\
++	.data\n\
++	.global __fpscr_values\n\
++__fpscr_values:\n\
++	.long   0\n\
++	.long   0x80000\n\
++	.previous\n\
++1:\n\
++	ALIGN\n\
++	END_INIT\n\
++\n\
++	\n\
++/*@_init_PROLOG_ENDS*/\n\
++\n\
++/*@_init_EPILOG_BEGINS*/\n\
++	.section .init\n\
++	mov	r14,r15\n\
++	lds.l	@r15+,pr\n\
++	mov.l	@r15+,r14\n\
++	rts	\n\
++	mov.l	@r15+,r12\n\
++	END_INIT\n\
++	.section .text\n\
++	.align 5\n\
++	.weak	__gmon_start__\n\
++	.type	__gmon_start__,@function\n\
++__gmon_start__:\n\
++	mov.l	r14,@-r15\n\
++	mov	r15,r14\n\
++	mov	r14,r15\n\
++	rts	\n\
++	mov.l	@r15+,r14\n\
++	\n\
++/*@_init_EPILOG_ENDS*/\n\
++\n\
++/*@_fini_PROLOG_BEGINS*/\n\
++	.section .fini\n\
++	.align 5\n\
++	.global	_fini\n\
++	.type	_fini,@function\n\
++_fini:\n\
++	mov.l	r12,@-r15\n\
++	mov.l	r14,@-r15\n\
++	sts.l	pr,@-r15\n\
++#ifdef SHARED\n\
++	mova	.L27,r0\n\
++	mov.l	.L27,r12\n\
++	add	r0,r12\n\
++#endif\n\
++	mov	r15,r14\n\
++	ALIGN\n\
++	END_FINI\n\
++#ifdef SHARED\n\
++	bra	1f\n\
++	 nop\n\
++	.align	2\n\
++.L27:\n\
++	.long	_GLOBAL_OFFSET_TABLE_\n\
++#endif\n\
++1:\n\
++/*@_fini_PROLOG_ENDS*/\n\
++\n\
++/*@_fini_EPILOG_BEGINS*/\n\
++	.section .fini\n\
++	mov	r14,r15\n\
++	lds.l	@r15+,pr\n\
++	mov.l	@r15+,r14\n\
++	rts	\n\
++	mov.l	@r15+,r12\n\
++\n\
++	END_FINI\n\
++	\n\
++/*@_fini_EPILOG_ENDS*/\n\
++\n\
++/*@TRAILER_BEGINS*/\n\
+ ");
diff --git a/patches/glibc/linuxthreads-2.2.5/threadparam.patch b/patches/glibc/linuxthreads-2.2.5/threadparam.patch
new file mode 100644
index 00000000..dd97838c
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.2.5/threadparam.patch
@@ -0,0 +1,69 @@
+2002-05-21  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/pthread/pthread.h (pthread_create): Rename first parameter.
+	(pthread_cancel): Likewise.
+	* internals.h (__pthread_create_2_1): Likewise.
+	* sysdeps/unix/sysv/linux/bits/sigthread.h (pthread_kill): Likewise.
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/internals.h,v
+retrieving revision 1.69.2.2
+retrieving revision 1.69.2.3
+diff -u -r1.69.2.2 -r1.69.2.3
+--- libc/linuxthreads/internals.h	2002/03/22 08:30:32	1.69.2.2
++++ libc/linuxthreads/internals.h	2002/08/20 22:01:25	1.69.2.3
+@@ -554,7 +554,7 @@
+ /* Prototypes for compatibility functions.  */
+ extern int __pthread_attr_init_2_1 (pthread_attr_t *__attr);
+ extern int __pthread_attr_init_2_0 (pthread_attr_t *__attr);
+-extern int __pthread_create_2_1 (pthread_t *__restrict __thread,
++extern int __pthread_create_2_1 (pthread_t *__restrict __threadp,
+ 				 const pthread_attr_t *__attr,
+ 				 void *(*__start_routine) (void *),
+ 				 void *__restrict __arg);
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/pthread.h,v
+retrieving revision 1.31
+retrieving revision 1.31.2.1
+diff -u -r1.31 -r1.31.2.1
+--- libc/linuxthreads/sysdeps/pthread/pthread.h	2001/03/15 21:12:31	1.31
++++ libc/linuxthreads/sysdeps/pthread/pthread.h	2002/08/20 22:01:26	1.31.2.1
+@@ -160,7 +160,7 @@
+ /* Create a thread with given attributes ATTR (or default attributes
+    if ATTR is NULL), and call function START_ROUTINE with given
+    arguments ARG.  */
+-extern int pthread_create (pthread_t *__restrict __thread,
++extern int pthread_create (pthread_t *__restrict __threadp,
+ 			   __const pthread_attr_t *__restrict __attr,
+ 			   void *(*__start_routine) (void *),
+ 			   void *__restrict __arg) __THROW;
+@@ -588,7 +588,7 @@
+ extern int pthread_setcanceltype (int __type, int *__oldtype) __THROW;
+ 
+ /* Cancel THREAD immediately or at the next possibility.  */
+-extern int pthread_cancel (pthread_t __thread) __THROW;
++extern int pthread_cancel (pthread_t __cancelthread) __THROW;
+ 
+ /* Test for pending cancellation for the current thread and terminate
+    the thread as per pthread_exit(PTHREAD_CANCELED) if it has been
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h,v
+retrieving revision 1.5
+retrieving revision 1.5.2.1
+diff -u -r1.5 -r1.5.2.1
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	2000/08/21 06:48:03	1.5
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h	2002/08/20 22:01:26	1.5.2.1
+@@ -1,5 +1,5 @@
+ /* Signal handling function for threaded programs.
+-   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
++   Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -33,6 +33,6 @@
+ 			    __sigset_t *__restrict __oldmask)__THROW;
+ 
+ /* Send signal SIGNO to the given thread. */
+-extern int pthread_kill (pthread_t __thread, int __signo) __THROW;
++extern int pthread_kill (pthread_t __threadid, int __signo) __THROW;
+ 
+ #endif	/* bits/sigthread.h */
diff --git a/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch b/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch
new file mode 100644
index 00000000..e9532c75
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch
@@ -0,0 +1,136 @@
+Retrieved with
+$ wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S.diff?r1=1.5&r2=1.6&cvsroot=glibc'
+$ wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h.diff?r1=1.3&r2=1.4&cvsroot=glibc'
+
+Might fix problem building with binutils-2.14.90.0.8/gcc-3.3.3 that was not
+present with binutils-2.13.90.0.18/gcc-3.3.2:
+
+../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S: Assembler messages:
+../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S:63: Warning: .ent
+directive without matching .end
+../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S:63: Error: can't resolve
+`0' {.text section} - `L0^A' {.text section}
+make[2]: ***
+[/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/build-glibc/posix/vfork.o]
+Error 1
+make[2]: Leaving directory
+`/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/glibc-2.3.2/posix'
+make[1]: *** [posix/subdir_lib] Error 2
+make[1]: Leaving directory
+`/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+See also alpha_cfi2.patch
+
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S	2003/02/11 06:27:53	1.5
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S	2003/06/06 05:51:03	1.6
+@@ -19,12 +19,13 @@
+ 
+ #include <sysdep-cancel.h>
+ 
+-	.globl __vfork
+         .align 4
+-        .ent __vfork,0
+-__LABEL(__vfork)
++	.globl	__vfork
++	.type	__vfork, @function
++	.usepv	__vfork, std
++	cfi_startproc
++__vfork:
+ 	ldgp	gp, 0(pv)
+-	.prologue 1
+ 	PSEUDO_PROF
+ 
+ #ifdef SHARED
+@@ -46,18 +47,24 @@
+ 	   fork and vfork object files.  */
+ $do_fork:
+ 	subq	sp, 16, sp
++	cfi_adjust_cfa_offset(16)
+ 	stq	ra, 0(sp)
++	cfi_offset(ra, -16)
+ 	jsr	ra, HIDDEN_JUMPTARGET (__fork)
+ 	ldgp	gp, 0(ra)
+ 	ldq	ra, 0(sp)
+ 	addq	sp, 16, sp
++	cfi_restore(ra)
++	cfi_adjust_cfa_offset(-16)
+ 	ret
+ 
+ $syscall_error:
+ 	SYSCALL_ERROR_HANDLER
+ #endif
+ 
+-PSEUDO_END(__vfork)
++	cfi_endproc
++	.size __vfork, .-__vfork
++
+ libc_hidden_def (__vfork)
+ 
+ weak_alias (__vfork, vfork)
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h	2003/01/12 19:26:41	1.3
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h	2003/06/06 05:51:03	1.4
+@@ -40,10 +40,11 @@
+ # define PSEUDO(name, syscall_name, args)			\
+ 	.globl name;						\
+ 	.align 4;						\
+-	.ent name, 0;						\
++	.type name, @function;					\
++	.usepv name, std;					\
++	cfi_startproc;						\
+ __LABEL(name)							\
+ 	ldgp	gp, 0(pv);					\
+-	.prologue 1;						\
+ 	PSEUDO_PROF;						\
+ 	PSEUDO_PREPARE_ARGS					\
+ 	SINGLE_THREAD_P(t0);					\
+@@ -55,7 +56,9 @@
+ 	.subsection 2;						\
+ __LABEL($pseudo_cancel)						\
+ 	subq	sp, 64, sp;					\
++	cfi_def_cfa_offset(64);					\
+ 	stq	ra, 0(sp);					\
++	cfi_offset(ra, -64);					\
+ 	SAVE_ARGS_##args;					\
+ 	CENABLE;						\
+ 	LOAD_ARGS_##args;					\
+@@ -67,19 +70,27 @@
+ 	ldq	ra, 0(sp);					\
+ 	ldq	v0, 8(sp);					\
+ 	addq	sp, 64, sp;					\
++	cfi_remember_state;					\
++	cfi_restore(ra);					\
++	cfi_def_cfa_offset(0);					\
+ 	ret;							\
++	cfi_restore_state;					\
+ __LABEL($multi_error)						\
+ 	CDISABLE;						\
+ 	ldq	ra, 0(sp);					\
+ 	ldq	v0, 8(sp);					\
+ 	addq	sp, 64, sp;					\
++	cfi_restore(ra);					\
++	cfi_def_cfa_offset(0);					\
+ __LABEL($syscall_error)						\
+ 	SYSCALL_ERROR_HANDLER;					\
+-	END(name);						\
+ 	.previous
+ 
+ # undef PSEUDO_END
+-# define PSEUDO_END(sym)
++# define PSEUDO_END(sym)					\
++	.subsection 2;						\
++	cfi_endproc;						\
++	.size sym, .-sym
+ 
+ # define SAVE_ARGS_0	/* Nothing.  */
+ # define SAVE_ARGS_1	SAVE_ARGS_0; stq a0, 8(sp)
diff --git a/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch b/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch
new file mode 100644
index 00000000..45373f8b
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch
@@ -0,0 +1,118 @@
+See http://sources.redhat.com/ml/libc-alpha/2004-05/msg00110.html
+
+Both his patches pulled into this file
+
+Should fix
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Assembler messages:
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_startproc'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: missing ')'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: syntax error
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_remember_state'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore_state'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset'
+../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:30: Error: unknown opcode `cfi_endproc'
+make[2]: *** [/usr/src/crosstool/crosstool-0.28-rc14/build/alpha-linux/gcc-3.4.0-glibc-2.3.2/build-glibc/signal/sigsuspend.o] Error 1
+
+when building with binutils-2.15.90.0.3 and gcc-3.4.0
+
+--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h.orig	2004-05-13 00:33:54.000000000 -0400
++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h	2004-05-13 00:34:19.000000000 -0400
+@@ -42,7 +42,7 @@
+ 	.align 4;						\
+ 	.type name, @function;					\
+ 	.usepv name, std;					\
+-	cfi_startproc;						\
++	.cfi_startproc;						\
+ __LABEL(name)							\
+ 	ldgp	gp, 0(pv);					\
+ 	PSEUDO_PROF;						\
+@@ -56,9 +56,9 @@
+ 	.subsection 2;						\
+ __LABEL($pseudo_cancel)						\
+ 	subq	sp, 64, sp;					\
+-	cfi_def_cfa_offset(64);					\
++	.cfi_def_cfa_offset(64);					\
+ 	stq	ra, 0(sp);					\
+-	cfi_offset(ra, -64);					\
++	.cfi_offset ra, -64;					\
+ 	SAVE_ARGS_##args;					\
+ 	CENABLE;						\
+ 	LOAD_ARGS_##args;					\
+@@ -70,18 +70,18 @@
+ 	ldq	ra, 0(sp);					\
+ 	ldq	v0, 8(sp);					\
+ 	addq	sp, 64, sp;					\
+-	cfi_remember_state;					\
+-	cfi_restore(ra);					\
+-	cfi_def_cfa_offset(0);					\
++	.cfi_remember_state;					\
++	.cfi_restore(ra);					\
++	.cfi_def_cfa_offset(0);					\
+ 	ret;							\
+-	cfi_restore_state;					\
++	.cfi_restore_state;					\
+ __LABEL($multi_error)						\
+ 	CDISABLE;						\
+ 	ldq	ra, 0(sp);					\
+ 	ldq	v0, 8(sp);					\
+ 	addq	sp, 64, sp;					\
+-	cfi_restore(ra);					\
+-	cfi_def_cfa_offset(0);					\
++	.cfi_restore(ra);					\
++	.cfi_def_cfa_offset(0);					\
+ __LABEL($syscall_error)						\
+ 	SYSCALL_ERROR_HANDLER;					\
+ 	.previous
+@@ -89,7 +89,7 @@
+ # undef PSEUDO_END
+ # define PSEUDO_END(sym)					\
+ 	.subsection 2;						\
+-	cfi_endproc;						\
++	.cfi_endproc;						\
+ 	.size sym, .-sym
+ 
+ # define SAVE_ARGS_0	/* Nothing.  */
+
+--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S.orig	2004-05-13 01:47:46.000000000 -0400
++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S	2004-05-13 01:48:17.000000000 -0400
+@@ -23,7 +23,7 @@
+ 	.globl	__vfork
+ 	.type	__vfork, @function
+ 	.usepv	__vfork, std
+-	cfi_startproc
++	.cfi_startproc
+ __vfork:
+ 	ldgp	gp, 0(pv)
+ 	PSEUDO_PROF
+@@ -47,22 +47,22 @@
+ 	   fork and vfork object files.  */
+ $do_fork:
+ 	subq	sp, 16, sp
+-	cfi_adjust_cfa_offset(16)
++	.cfi_adjust_cfa_offset(16)
+ 	stq	ra, 0(sp)
+-	cfi_offset(ra, -16)
++	.cfi_offset ra, -16
+ 	jsr	ra, HIDDEN_JUMPTARGET (__fork)
+ 	ldgp	gp, 0(ra)
+ 	ldq	ra, 0(sp)
+ 	addq	sp, 16, sp
+-	cfi_restore(ra)
+-	cfi_adjust_cfa_offset(-16)
++	.cfi_restore(ra)
++	.cfi_adjust_cfa_offset(-16)
+ 	ret
+ 
+ $syscall_error:
+ 	SYSCALL_ERROR_HANDLER
+ #endif
+ 
+-	cfi_endproc
++	.cfi_endproc
+ 	.size __vfork, .-__vfork
+ 
+ libc_hidden_def (__vfork)
diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch b/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch
new file mode 100644
index 00000000..90ecc880
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch
@@ -0,0 +1,26 @@
+From: "M.H.VanLeeuwen" 
+Subject: crosstool, sparc64, linux 2.6.4, gcc 3.3.3, glibc 2.3.2 success
+Date: Mon, 15 Mar 2004 00:23:04 -0600
+To: crossgcc@sources.redhat.com
+Message-ID: <40554BC8.749A5EC3@megsinet.net>
+...
+
+backported from GLIBC CVS
+
+Fix this error:
+
+/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/linuxthreads/libpthread_pic.a(ptw-pause.os)(.text+0x2c): In function `pause':
+: undefined reference to `__sigprocmask'
+collect2: ld returned 1 exit status
+make[2]: *** [/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/linuxthreads/libpthread.so] Error 1
+
+
+--- /cross/sources/glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile	Wed Dec 31 18:00:00 1969
++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile	Sat Mar 13 10:18:43 2004
+@@ -0,0 +1,5 @@
++# glibc makefile fragment for linuxthreads on sparc/sparc64.
++
++ifeq ($(subdir),linuxthreads)
++libpthread-routines += ptw-sigprocmask
++endif
+
diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch
new file mode 100644
index 00000000..3c4e3a10
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch
@@ -0,0 +1,100 @@
+[ Revised; now also changes CFLAGS-pt-initfini.s as suggested by 
+  http://sources.redhat.com/ml/crossgcc/2004-07/msg00169.html
+  to not crash when building a debug glibc on mips ]
+
+Fixes errors like
+
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.text+0x0):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:20: multiple definition of `dummy'
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.text+0x0):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:42: first defined here
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.text+0x18):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:37: multiple definition of `_init'
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.text+0x30):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:76: first defined here
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x1c):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:86: multiple definition of `_fini'
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.init+0x10):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:48: first defined here
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.init+0x28):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:58: undefined reference to `i_am_not_a_leaf'
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x4c):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:108: undefined reference to `i_am_not_a_leaf'
+mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x50):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:109: undefined reference to `i_am_not_a_leaf'
+collect2: ld returned 1 exit status
+make[2]: *** [build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/libpthread.so] Error 1
+make[2]: Leaving directory `build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/linuxthreads'
+make[1]: *** [linuxthreads/others] Error 2
+make[1]: Leaving directory `build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+
+CVSROOT:	/cvs/glibc
+Module name:	libc
+Changes by:	aj@sourceware.org	2003-12-02 07:37:29
+
+Modified files:
+	.              : configure.in configure config.make.in 
+	csu            : Makefile 
+	locale         : Makefile 
+	linuxthreads   : Makefile 
+	linuxthreads/sysdeps/unix/sysv/linux/x86_64: Makefile 
+	nptl           : Makefile 
+	nptl/sysdeps/unix/sysv/linux/x86_64: Makefile 
+
+Log message:
+	* config.make.in (fno-unit-at-a-time): Define.
+	
+	* configure.in: Add test for -fno-unit-at-a-time.
+	Fix text for -fpie.
+	
+	* csu/Makefile (CFLAGS-initfini.s): Add $(fno_unit_at_a_time).
+	* locale/Makefile (CFLAGS-loadlocale.c): Likewise.
+	
+	For linuxthreads:
+	* Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time).
+	* sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s):
+	Likewise.
+	
+	For nptl:
+	* Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time).
+	* sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s):
+	Likewise.
+
+linuxthreads change retrieved with
+wget -O foo.patch 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/Makefile.diff?r1=1.83&r2=1.84&cvsroot=glibc' \
+'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile.diff?r1=1.5&r2=1.6&cvsroot=glibc'
+
+and then rediffed against glibc-2.3.2
+And then extended to mips...
+
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/Makefile,v
+retrieving revision 1.83
+retrieving revision 1.84
+diff -u -r1.83 -r1.84
+--- libc/linuxthreads/Makefile	2003/10/02 18:48:48	1.83
++++ libc/linuxthreads/Makefile	2003/12/02 07:37:28	1.84
+@@ -101,7 +101,7 @@
+ extra-objs += $(crti-objs) $(crtn-objs)
+ omit-deps += crti crtn
+ 
+-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions
++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time)
+ endif
+ 
+ librt-tests = ex10 ex11
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile	2003/04/11 23:34:02	1.5
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile	2003/12/02 07:37:28	1.6
+@@ -1,3 +1,4 @@
+ ifeq ($(subdir),linuxthreads)
+-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions -fno-asynchronous-unwind-tables
++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions \
++		       -fno-asynchronous-unwind-tables $(fno-unit-at-a-time)
+ endif
+--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile.old	2004-05-30 18:24:41.000000000 -0700
++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile	2004-05-30 18:28:03.000000000 -0700
+@@ -1,2 +1,6 @@
+ # pull in __syscall_error routine
+ libpthread-routines += sysdep
++
++ifeq ($(subdir),linuxthreads)
++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time)
++endif
diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch
new file mode 100644
index 00000000..a382a0a9
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch
@@ -0,0 +1,30 @@
+Goes with ../glibc-2.3.2/glibc-2.3.2-cygwin.patch
+
+If you apply the above patch, but forget this one, you get a cryptic error
+ .../bin/../x86_64-unknown-linux-gnu/sys-root/usr/lib64/: file not recognized: Is a directory
+when linking with -lpthread, because the generated libpthread.so
+is missing a filename
+
+by dank@kegel.com, 2004 Mar 30
+
+
+--- glibc-linuxthreads-2.3.2/linuxthreads/Makefile.old	Tue Mar 30 10:33:12 2004
++++ glibc-linuxthreads-2.3.2/linuxthreads/Makefile	Tue Mar 30 10:33:24 2004
+@@ -114,7 +114,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -122,7 +122,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch b/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch
new file mode 100644
index 00000000..09ae0077
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch
@@ -0,0 +1,53 @@
+I haven't built glibc-2.3.2 for arm myself, but
+http://sources.redhat.com/ml/bug-glibc/2003-05/msg00076.html and
+http://www.linux.org.uk/pipermail/linux-arm/2003-November/006560.html
+give me the distinct impression that you need the latest sysdep-cancel.h from
+cvs.
+
+Retrieved with
+
+http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h.diff?cvsroot=glibc&r1=text&tr1=1.2&r2=text&tr2=1.6&f=u
+
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h,v
+retrieving revision 1.2
+retrieving revision 1.6
+diff -u -r1.2 -r1.6
+--- libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h	2003/01/12 09:14:25	1.2
++++ libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h	2003/06/06 17:31:40	1.6
+@@ -24,6 +24,17 @@
+ 
+ #if !defined NOT_IN_libc || defined IS_IN_libpthread
+ 
++/* We push lr onto the stack, so we have to use ldmib instead of ldmia
++   to find the saved arguments.  */
++# ifdef PIC
++#  undef DOARGS_5
++#  undef DOARGS_6
++#  undef DOARGS_7
++#  define DOARGS_5 str r4, [sp, $-4]!; ldr r4, [sp, $8];
++#  define DOARGS_6 mov ip, sp; stmfd sp!, {r4, r5}; ldmib ip, {r4, r5};
++#  define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6}; ldmib ip, {r4, r5, r6};
++# endif
++
+ # undef PSEUDO_RET
+ # define PSEUDO_RET						        \
+     ldrcc pc, [sp], $4;						        \
+@@ -34,7 +45,7 @@
+ # define PSEUDO(name, syscall_name, args)				\
+   .section ".text";							\
+     PSEUDO_PROLOGUE;							\
+-  ENTRY (name)								\
++  ENTRY (name);								\
+     SINGLE_THREAD_P_INT;						\
+     bne .Lpseudo_cancel;						\
+     DO_CALL (syscall_name, args);					\
+@@ -110,7 +121,7 @@
+   ldr reg, 2b;								\
+ 3:									\
+   add ip, pc, ip;							\
+-  ldr ip, [ip, lr];							\
++  ldr ip, [ip, reg];							\
+   teq ip, #0;
+ #   define SINGLE_THREAD_P_INT						\
+   str lr, [sp, $-4]!;							\
diff --git a/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch b/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch
new file mode 100644
index 00000000..87877ee3
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch
@@ -0,0 +1,36 @@
+wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c.diff?r1=1.3&r2=1.4&cvsroot=glibc'
+
+Revision 1.4, Wed Dec 10 05:46:41 2003 UTC (8 months, 1 week ago) by aj
+	(__asm__): Remove extra .prologue.
+
+Fixes error
+
+crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.S: Assembler messages:
+crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.S:34: Error: .prologue directive without a preceding .ent directive
+make[2]: *** [crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.o] Error 1
+make[2]: Leaving directory `crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/glibc-2.3.3/linuxthreads'
+
+when building with gcc-3.4.1
+
+===================================================================
+RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c	2003/07/05 22:56:39	1.3
++++ libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c	2003/12/10 05:46:41	1.4
+@@ -1,5 +1,5 @@
+ /* Special .init and .fini section support for Alpha.  Linuxthreads version.
+-   Copyright (C) 2002 Free Software Foundation, Inc.
++   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+    The GNU C Library is free software; you can redistribute it and/or
+@@ -75,7 +75,6 @@
+ 	subq	$30, 16, $30				\n\
+ 	stq	$26, 0($30)				\n\
+ 	stq	$29, 8($30)				\n\
+-	.prologue 1					\n\
+ 	.align 3					\n\
+ /*@_fini_PROLOG_ENDS*/					\n\
+ 							\n\
diff --git a/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
new file mode 100644
index 00000000..239b2909
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
@@ -0,0 +1,38 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ rediffed against glibc-2.3.3 ]
+
+
+diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile
+--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile	2004-08-27 20:38:40.000000000 -0700
++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile	2003-10-02 11:48:48.000000000 -0700
+@@ -156,7 +156,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -164,7 +164,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch
new file mode 100644
index 00000000..239b2909
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch
@@ -0,0 +1,38 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ rediffed against glibc-2.3.3 ]
+
+
+diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile
+--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile	2004-08-27 20:38:40.000000000 -0700
++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile	2003-10-02 11:48:48.000000000 -0700
+@@ -156,7 +156,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -164,7 +164,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch
new file mode 100644
index 00000000..46ee02ca
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch
@@ -0,0 +1,89 @@
+See http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html
+
+From libc-hacker-return-8343-listarch-libc-hacker=sources dot redhat dot com at sources dot redhat dot com Sat Mar 05 09:21:18 2005
+Return-Path: <libc-hacker-return-8343-listarch-libc-hacker=sources dot redhat dot com at sources dot redhat dot com>
+Delivered-To: listarch-libc-hacker at sources dot redhat dot com
+Received: (qmail 23370 invoked by alias); 5 Mar 2005 09:21:15 -0000
+Mailing-List: contact libc-hacker-help at sources dot redhat dot com; run by ezmlm
+Precedence: bulk
+List-Subscribe: <mailto:libc-hacker-subscribe at sources dot redhat dot com>
+List-Archive: <http://sources.redhat.com/ml/libc-hacker/>
+List-Post: <mailto:libc-hacker at sources dot redhat dot com>
+List-Help: <mailto:libc-hacker-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs>
+Sender: libc-hacker-owner at sources dot redhat dot com
+Delivered-To: mailing list libc-hacker at sources dot redhat dot com
+Received: (qmail 22971 invoked from network); 5 Mar 2005 09:20:51 -0000
+Received: from unknown (HELO sunsite.mff.cuni.cz) (195.113.15.26)
+  by sourceware dot org with SMTP; 5 Mar 2005 09:20:51 -0000
+Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1])
+	by sunsite dot mff dot cuni dot cz (8 dot 13 dot 1/8 dot 13 dot 1) with ESMTP id j259KoB5020894;
+	Sat, 5 Mar 2005 10:20:50 +0100
+Received: (from jj@localhost)
+	by sunsite dot mff dot cuni dot cz (8 dot 13 dot 1/8 dot 13 dot 1/Submit) id j259KnO1020889;
+	Sat, 5 Mar 2005 10:20:49 +0100
+Date: Sat, 5 Mar 2005 10:20:49 +0100
+From: Jakub Jelinek <jakub at redhat dot com>
+To: Ulrich Drepper <drepper at redhat dot com>, Roland McGrath <roland at redhat dot com>
+Cc: Glibc hackers <libc-hacker at sources dot redhat dot com>
+Subject: [PATCH] Fix build with GCC 4
+Message-ID: <20050305092049.GJ4777@sunsite.mff.cuni.cz>
+Reply-To: Jakub Jelinek <jakub at redhat dot com>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+User-Agent: Mutt/1.4.1i
+
+Hi!
+
+The thread_offsetof change just mirrors what Alan Modra did to NPTL
+tcb-offsets.sym.  Apparently for GCC 4 an offsetof like expression,
+but not really offsetof, is no longer constant folded and therefore
+not suitable for "i" constraint.
+
+The ELF_MACHINE_NO_RELA change is needed to avoid
+rtld.c: In function '_dl_start':
+dynamic-link.h:50: error: nested function 'elf_machine_rela_relative' declared but never defined
+dynamic-link.h:47: error: nested function 'elf_machine_rela' declared but never defined
+This is what happens.
+rtld.c first includes dl-machine.h without RESOLVE_MAP
+and without RTLD_BOOTSTRAP defined.  This means that ELF_MACHINE_NO_RELA
+is not defined on i386/arm.  Later on it defines RESOLVE_MAP
+and RTLD_BOOTSTRAP and includes dynamic-link.h which has:
+# if ! ELF_MACHINE_NO_RELA
+auto void __attribute__((always_inline))
+elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
+                  const ElfW(Sym) *sym, const struct r_found_version *version,
+                  void *const reloc_addr);
+auto void __attribute__((always_inline))
+elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
+                           void *const reloc_addr);
+# endif
+and later on includes dl-machine.h which sees RTLD_BOOTSTRAP is
+defined and defines ELF_MACHINE_NO_RELA and doesn't define
+elf_machine_rela* nested functions.
+But the prototypes were already defined and GCC 4 doesn't like this.
+ELF_MACHINE_NO_RELA is only ever used in preprocessing conditionals
+and never in defined ELF_MACHINE_NO_RELA, so the trick below
+already defines ELF_MACHINE_NO_RELA to 1/0 depending on whether
+RTLD_BOOTSTRAP is defined and thus the prototypes in dynamic-link.h
+that are not desirable are gone.
+
+2005-03-05  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/i386/dl-machine.h (ELF_MACHINE_NO_RELA): Define
+	unconditionally to (defined RTLD_BOOTSTRAP).
+	* sysdeps/arm/dl-machine.h (ELF_MACHINE_NO_RELA): Likewise.
+linuxthreads/
+	* sysdeps/powerpc/tcb-offsets.sym (thread_offsetof): Rework for GCC 4.
+
+--- libc/linuxthreads/sysdeps/powerpc/tcb-offsets.sym.jj	2005-03-04 14:21:29.000000000 -0500
++++ libc/linuxthreads/sysdeps/powerpc/tcb-offsets.sym	2005-03-04 14:26:29.000000000 -0500
+@@ -8,7 +8,7 @@
+ -- Abuse tls.h macros to derive offsets relative to the thread register.
+ #  undef __thread_register
+ #  define __thread_register	((void *) 0)
+-#  define thread_offsetof(mem)	((void *) &THREAD_SELF->p_##mem - (void *) 0)
++#  define thread_offsetof(mem)	((ptrdiff_t) THREAD_SELF + offsetof (struct _pthread_descr_struct, p_##mem))
+ 
+ # else
+ 
diff --git a/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch b/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch
new file mode 100644
index 00000000..0c0dac04
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch
@@ -0,0 +1,37 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ rediffed against glibc-2.3.5 ]
+
+diff -aur glibc-2.3.5/linuxthreads/Makefile glibc-2.3.5-cygwin/linuxthreads/Makefile
+--- glibc-2.3.5/linuxthreads/Makefile	2005-02-16 12:26:38.000000000 +0100
++++ glibc-2.3.5-cygwin/linuxthreads/Makefile	2005-05-11 08:32:50.453125000 +0200
+@@ -159,7 +159,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -167,7 +167,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch b/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch
new file mode 100644
index 00000000..0c0dac04
--- /dev/null
+++ b/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch
@@ -0,0 +1,37 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ rediffed against glibc-2.3.5 ]
+
+diff -aur glibc-2.3.5/linuxthreads/Makefile glibc-2.3.5-cygwin/linuxthreads/Makefile
+--- glibc-2.3.5/linuxthreads/Makefile	2005-02-16 12:26:38.000000000 +0100
++++ glibc-2.3.5-cygwin/linuxthreads/Makefile	2005-05-11 08:32:50.453125000 +0200
+@@ -159,7 +159,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -167,7 +167,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch
new file mode 100644
index 00000000..239b2909
--- /dev/null
+++ b/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch
@@ -0,0 +1,38 @@
+Fixes
+elf/librtld.os: In function `process_envvars': : undefined reference to `__access'
+...
+when building glibc-2.3.3 on cygwin
+
+Idea from
+http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch
+Basically, make glibc use .oST as suffix for 'object static'
+instead of .oS, since cygwin has trouble distinguishing .os from .oS
+(Original patch had .on, but .oST is more mnemonic for 'object static')
+
+glibc-linuxthreads-2.3.3 also requires a patch, see 
+../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch
+
+[ rediffed against glibc-2.3.3 ]
+
+
+diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile
+--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile	2004-08-27 20:38:40.000000000 -0700
++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile	2003-10-02 11:48:48.000000000 -0700
+@@ -156,7 +156,7 @@
+ install: $(inst_libdir)/libpthread.so
+ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
+ 			      $(objpfx)libpthread.so$(libpthread.so-version) \
+-			      $(inst_libdir)/$(patsubst %,$(libtype.oS),\
++			      $(inst_libdir)/$(patsubst %,$(libtype.oST),\
+ 							$(libprefix)pthread) \
+ 			      $(+force)
+ 	(echo '/* GNU ld script';\
+@@ -164,7 +164,7 @@
+ 	 echo '   the static library, so try that secondarily.  */';\
+ 	 cat $<; \
+ 	 echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \
+-	      '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\
++	      '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\
+ 	      ')' \
+ 	) > $@.new
+ 	mv -f $@.new $@
diff --git a/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch b/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch
new file mode 100644
index 00000000..30e7f2a3
--- /dev/null
+++ b/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch
@@ -0,0 +1,48 @@
+This patch comes from the Debian archive:
+  ftp://ftp.de.debian.org/debian/pool/main/libf/libfloat/libfloat_990616-3.diff.gz
+
+It was stripped of all Debian-related hunks.
+Kept is the library versioning.
+
+--- libfloat-990616.orig/Makefile
++++ libfloat-990616/Makefile
+@@ -4,15 +4,15 @@
+ #CC=gcc -g -O2 -freg-struct-return -D__LIBFLOAT__
+ AR=ar
+ 
+-all: libfloat.a libfloat.so
++all: libfloat.a libfloat.so.1
+ 
+ libfloat.a: softfloat.o fplib_glue.o
+ 	rm -f libfloat.a
+ 	$(AR) cq libfloat.a softfloat.o fplib_glue.o
+ 
+-libfloat.so: softfloat.os fplib_glue.os
+-	rm -f libfloat.so
+-	gcc -shared softfloat.os fplib_glue.os -o libfloat.so
++libfloat.so.1: softfloat.os fplib_glue.os
++	rm -f libfloat.so.1
++	gcc -shared -Wl,-soname,libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1
+ 
+ softfloat.o: softfloat/bits64/softfloat.c
+ 	$(CC) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c
+@@ -26,14 +26,14 @@
+ fplib_glue.os: fplib_glue.S
+ 	$(CC) -fpic -c -o fplib_glue.os fplib_glue.S
+ 
+-install: libfloat.a libfloat.so
+-	cp -a libfloat.a /usr/lib
+-	cp -a libfloat.so /usr/lib
+-	ldconfig
++install: libfloat.a libfloat.so.1
++	cp -a libfloat.a $(DESTDIR)/usr/lib
++	cp -a libfloat.so.1 $(DESTDIR)/usr/lib
++	cd $(DESTDIR)/usr/lib; ln -s libfloat.so.1 libfloat.so
+ 
+ clean: 
+ 	rm -f *.o
+ 	rm -f *.os
+ 	rm -f libfloat.a
+-	rm -f libfloat.so
++	rm -f libfloat.so.1
+ 	rm -f *~
diff --git a/patches/libfloat/990616/200-cross_compile.patch b/patches/libfloat/990616/200-cross_compile.patch
new file mode 100644
index 00000000..640008cb
--- /dev/null
+++ b/patches/libfloat/990616/200-cross_compile.patch
@@ -0,0 +1,63 @@
+When linking, call directly ld in place of the gcc wrapper, because the wrapper
+will try to link with -lfloat, which we don't have right now...
+
+Simplify CFLAGS to stay ABI compliant (ot so I guess)...
+
+diff -dur libfloat.orig/Makefile libfloat/Makefile
+--- libfloat.orig/Makefile	2007-02-16 19:38:55.000000000 +0100
++++ libfloat/Makefile	2007-02-16 19:46:23.000000000 +0100
+@@ -1,8 +1,11 @@
+ # Makefile for the Linux soft-float library
+ 
+-CC=gcc -O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__
+-#CC=gcc -g -O2 -freg-struct-return -D__LIBFLOAT__
+-AR=ar
++AR=$(CROSS_COMPILE)ar
++#CFLAGS=-O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__
++CFLAGS=-O2 -D__LIBFLOAT__
++CC=$(CROSS_COMPILE)gcc 
++LDFLAGS=-shared -nostdlib
++LD=$(CROSS_COMPILE)ld
+ 
+ all: libfloat.a libfloat.so.1
+ 
+@@ -12,28 +13,31 @@
+ 
+ libfloat.so.1: softfloat.os fplib_glue.os
+ 	rm -f libfloat.so.1
+-	gcc -shared -Wl,-soname,libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1
++	$(LD) $(LDFLAGS) -soname=libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1
+ 
+ softfloat.o: softfloat/bits64/softfloat.c
+-	$(CC) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c
++	$(CC) $(CFLAGS) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c
+ 
+ fplib_glue.o: fplib_glue.S
+-	$(CC) -c -o fplib_glue.o fplib_glue.S
++	$(CC) $(CFLAGS) -c -o fplib_glue.o fplib_glue.S
+ 
+ softfloat.os: softfloat/bits64/softfloat.c
+-	$(CC) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c
++	$(CC) $(CFLAGS) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c
+ 
+ fplib_glue.os: fplib_glue.S
+-	$(CC) -fpic -c -o fplib_glue.os fplib_glue.S
++	$(CC) $(CFLAGS) -fpic -c -o fplib_glue.os fplib_glue.S
+ 
+ install: libfloat.a libfloat.so.1
+-	cp -a libfloat.a $(DESTDIR)/usr/lib
+-	cp -a libfloat.so.1 $(DESTDIR)/usr/lib
+-	cd $(DESTDIR)/usr/lib; ln -s libfloat.so.1 libfloat.so
++	install -d -m 755 "$(DESTDIR)/usr/lib"
++	install -m 755 libfloat.a "$(DESTDIR)/usr/lib"
++	install -m 755 libfloat.so.1 "$(DESTDIR)/usr/lib"
++	cd $(DESTDIR)/usr/lib
++	ln -s libfloat.so.1 libfloat.so
+ 
+ clean: 
+ 	rm -f *.o
+ 	rm -f *.os
+ 	rm -f libfloat.a
+ 	rm -f libfloat.so.1
++	rm -f libfloat.so
+ 	rm -f *~
diff --git a/patches/linux/2.4.26/01-kmap-types-cleanup.patch b/patches/linux/2.4.26/01-kmap-types-cleanup.patch
new file mode 100644
index 00000000..4a900bc1
--- /dev/null
+++ b/patches/linux/2.4.26/01-kmap-types-cleanup.patch
@@ -0,0 +1,306 @@
+From http://www.uwsg.iu.edu/hypermail/linux/kernel/0307.2/att-1234/01-kmap-types-cleanup.patch
+See http://www.uwsg.iu.edu/hypermail/linux/kernel/0307.2/1234.html
+
+From: Marc-Christian Petersen (m.c.p@wolk-project.de)
+
+> > on alpha:
+> > internal.h:19:28: asm/kmap_types.h: No such file or directory
+> Same on s390 and some other platforms.We should just get rid of
+> this problem by providing a generic kmap_types header.
+I agree on this but your patch is bogus. Please use the attached one instead.
+
+Marcello, please apply this one instead. Against 2.4.22-BK (2.4.21-bk14)
+
+[ I commented out the hunk
+#+++ b/include/asm-mips/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+to get this to apply to linux-2.4.26. 
+- dank]
+
+diff -Naurp a/crypto/internal.h b/crypto/internal.h
+--- a/crypto/internal.h	2003-07-19 14:09:06.000000000 +0200
++++ b/crypto/internal.h	2003-07-19 14:18:58.000000000 +0200
+@@ -14,9 +14,9 @@
+ #include <linux/mm.h>
+ #include <linux/highmem.h>
+ #include <linux/init.h>
++#include <linux/kmap_types.h>
+ #include <asm/hardirq.h>
+ #include <asm/softirq.h>
+-#include <asm/kmap_types.h>
+ 
+ extern enum km_type crypto_km_types[];
+ 
+diff -Naurp a/include/asm-i386/fixmap.h b/include/asm-i386/fixmap.h
+--- a/include/asm-i386/fixmap.h	2003-07-19 14:09:31.000000000 +0200
++++ b/include/asm-i386/fixmap.h	2003-07-19 14:18:58.000000000 +0200
+@@ -20,7 +20,7 @@
+ #include <asm/page.h>
+ #ifdef CONFIG_HIGHMEM
+ #include <linux/threads.h>
+-#include <asm/kmap_types.h>
++#include <linux/kmap_types.h>
+ #endif
+ 
+ /*
+diff -Naurp a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h
+--- a/include/asm-i386/highmem.h	2003-07-15 10:28:54.000000000 +0200
++++ b/include/asm-i386/highmem.h	2003-07-19 14:18:58.000000000 +0200
+@@ -23,7 +23,6 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+-#include <asm/kmap_types.h>
+ #include <asm/pgtable.h>
+ 
+ #ifdef CONFIG_DEBUG_HIGHMEM
+diff -Naurp a/include/asm-i386/kmap_types.h b/include/asm-i386/kmap_types.h
+--- a/include/asm-i386/kmap_types.h	2003-07-19 14:09:31.000000000 +0200
++++ b/include/asm-i386/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,16 +0,0 @@
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BH_IRQ,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+diff -Naurp a/include/asm-m68k/kmap_types.h b/include/asm-m68k/kmap_types.h
+--- a/include/asm-m68k/kmap_types.h	2003-07-19 14:09:33.000000000 +0200
++++ b/include/asm-m68k/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,18 +0,0 @@
+-#ifdef __KERNEL__
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BH_IRQ,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+-#endif /* __KERNEL__ */
+diff -Naurp a/include/asm-mips/fixmap.h b/include/asm-mips/fixmap.h
+--- a/include/asm-mips/fixmap.h	2002-09-27 23:26:03.000000000 +0200
++++ b/include/asm-mips/fixmap.h	2003-07-19 14:18:58.000000000 +0200
+@@ -18,7 +18,7 @@
+ #include <asm/page.h>
+ #ifdef CONFIG_HIGHMEM
+ #include <linux/threads.h>
+-#include <asm/kmap_types.h>
++#include <linux/kmap_types.h>
+ #endif
+ 
+ /*
+diff -Naurp a/include/asm-mips/highmem.h b/include/asm-mips/highmem.h
+--- a/include/asm-mips/highmem.h	2002-12-18 01:03:59.000000000 +0100
++++ b/include/asm-mips/highmem.h	2003-07-19 14:18:58.000000000 +0200
+@@ -22,7 +22,6 @@
+ 
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+-#include <asm/kmap_types.h>
+ #include <asm/pgtable.h>
+ 
+ /* undef for production */
+#diff -Naurp a/include/asm-mips/kmap_types.h b/include/asm-mips/kmap_types.h
+#--- a/include/asm-mips/kmap_types.h	2002-12-18 01:03:59.000000000 +0100
+#+++ b/include/asm-mips/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+#@@ -1,14 +0,0 @@
+#-#ifndef _ASM_KMAP_TYPES_H
+#-#define _ASM_KMAP_TYPES_H
+#-
+#-enum km_type {
+#-	KM_BOUNCE_READ,
+#-	KM_SKB_SUNRPC_DATA,
+#-	KM_SKB_DATA_SOFTIRQ,
+#-	KM_USER0,
+#-	KM_USER1,
+#-	KM_BIO_IRQ,
+#-	KM_TYPE_NR
+#-};
+#-
+#-#endif
+diff -Naurp a/include/asm-ppc/highmem.h b/include/asm-ppc/highmem.h
+--- a/include/asm-ppc/highmem.h	2003-07-19 14:09:33.000000000 +0200
++++ b/include/asm-ppc/highmem.h	2003-07-19 14:18:58.000000000 +0200
+@@ -24,7 +24,7 @@
+ 
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+-#include <asm/kmap_types.h>
++#include <linux/kmap_types.h>
+ #include <asm/pgtable.h>
+ 
+ /* undef for production */
+diff -Naurp a/include/asm-ppc/kmap_types.h b/include/asm-ppc/kmap_types.h
+--- a/include/asm-ppc/kmap_types.h	2003-07-19 14:09:33.000000000 +0200
++++ b/include/asm-ppc/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,18 +0,0 @@
+-#ifdef __KERNEL__
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BH_IRQ,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+-#endif /* __KERNEL__ */
+diff -Naurp a/include/asm-ppc64/kmap_types.h b/include/asm-ppc64/kmap_types.h
+--- a/include/asm-ppc64/kmap_types.h	2003-07-19 14:09:35.000000000 +0200
++++ b/include/asm-ppc64/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,23 +0,0 @@
+-#ifdef __KERNEL__
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BIO_SRC_IRQ,
+-	KM_BIO_DST_IRQ,
+-	KM_PTE0,
+-	KM_PTE1,
+-	KM_IRQ0,
+-	KM_IRQ1,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,	
+-	KM_TYPE_NR
+-};
+-
+-#endif
+-#endif /* __KERNEL__ */
+diff -Naurp a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h
+--- a/include/asm-sparc/highmem.h	2003-07-15 10:28:56.000000000 +0200
++++ b/include/asm-sparc/highmem.h	2003-07-19 14:18:58.000000000 +0200
+@@ -21,7 +21,7 @@
+ #ifdef __KERNEL__
+ 
+ #include <linux/interrupt.h>
+-#include <asm/kmap_types.h>
++#include <linux/kmap_types.h>
+ 
+ /* undef for production */
+ #define HIGHMEM_DEBUG 1
+diff -Naurp a/include/asm-sparc/kmap_types.h b/include/asm-sparc/kmap_types.h
+--- a/include/asm-sparc/kmap_types.h	2003-07-19 14:09:37.000000000 +0200
++++ b/include/asm-sparc/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,16 +0,0 @@
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BH_IRQ,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+diff -Naurp a/include/asm-sparc64/kmap_types.h b/include/asm-sparc64/kmap_types.h
+--- a/include/asm-sparc64/kmap_types.h	2003-07-19 14:09:37.000000000 +0200
++++ b/include/asm-sparc64/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-/* Dummy header just to define km_type.  None of this
+- * is actually used on sparc64.  -DaveM
+- */
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_SUNRPC_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_BH_IRQ,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+diff -Naurp a/include/asm-x86_64/kmap_types.h b/include/asm-x86_64/kmap_types.h
+--- a/include/asm-x86_64/kmap_types.h	2003-07-19 14:09:37.000000000 +0200
++++ b/include/asm-x86_64/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,15 +0,0 @@
+-#ifndef _ASM_KMAP_TYPES_H
+-#define _ASM_KMAP_TYPES_H
+-
+-enum km_type {
+-	KM_BOUNCE_READ,
+-	KM_SKB_DATA,
+-	KM_SKB_DATA_SOFTIRQ,
+-	KM_USER0,
+-	KM_USER1,
+-	KM_SOFTIRQ0,
+-	KM_SOFTIRQ1,
+-	KM_TYPE_NR
+-};
+-
+-#endif
+diff -Naurp a/include/linux/highmem.h b/include/linux/highmem.h
+--- a/include/linux/highmem.h	2003-07-19 14:09:37.000000000 +0200
++++ b/include/linux/highmem.h	2003-07-19 14:18:58.000000000 +0200
+@@ -2,6 +2,7 @@
+ #define _LINUX_HIGHMEM_H
+ 
+ #include <linux/config.h>
++#include <linux/kmap_types.h>
+ #include <asm/pgalloc.h>
+ 
+ #ifdef CONFIG_HIGHMEM
+diff -Naurp a/include/linux/kmap_types.h b/include/linux/kmap_types.h
+--- a/include/linux/kmap_types.h	1970-01-01 01:00:00.000000000 +0100
++++ b/include/linux/kmap_types.h	2003-07-19 14:18:58.000000000 +0200
+@@ -0,0 +1,16 @@
++#ifndef _LINUX_KMAP_TYPES_H
++#define _LINUX_KMAP_TYPES_H
++
++enum km_type {
++	KM_BOUNCE_READ,
++	KM_SKB_SUNRPC_DATA,
++	KM_SKB_DATA_SOFTIRQ,
++	KM_USER0,
++	KM_USER1,
++	KM_BH_IRQ,
++	KM_SOFTIRQ0,
++	KM_SOFTIRQ1,
++	KM_TYPE_NR
++};
++
++#endif
+
diff --git a/patches/linux/2.4.26/kaz-types.patch b/patches/linux/2.4.26/kaz-types.patch
new file mode 100644
index 00000000..ec5de36a
--- /dev/null
+++ b/patches/linux/2.4.26/kaz-types.patch
@@ -0,0 +1,60 @@
+The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4:
+
+In file included from sys/ustat.h:30,
+                 from ../sysdeps/unix/sysv/linux/ustat.c:21:
+../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat'
+make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1
+make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc'
+make[1]: *** [misc/subdir_lib] Error 2
+make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+----------- snip ---------------
+
+Date: Fri, 06 Jun 2003 08:00:00 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32:
+ error: redefinition of `struct user_fpu_struct'"
+To: linux-sh@m17n.org
+Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> When I try to build glibc-2.3.2 for sh4, it fails with the error
+[snip]
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct'
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user'
+[snip]
+> The error reminds me of the kind of thing fixed by
+> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch
+
+It seems that the definitions in asm/user.h and the above patch collide.
+I'm not sure why you need this patch, but is it needed for the problem
+about struct ustat that you pointed out in this list, isn't it?
+I found why I don't hit ustat problem - my local kernel tree includes
+the following patch, though I can't recall about it.
+
+Regards,
+	kaz
+--
+diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h
+--- linux-2.5.69-sf-orig/include/linux/types.h	Wed Mar  5 12:29:34 2003
++++ sh4-unknown-linux-gnu/include/linux/types.h	Sat Apr 19 10:05:52 2003
+@@ -141,6 +141,7 @@
+ 
+ #endif /* __KERNEL_STRICT_NAMES */
+ 
++#ifdef	__KERNEL__
+ /*
+  * Below are truly Linux-specific types that should never collide with
+  * any application/library that wants linux/types.h.
+@@ -152,5 +153,6 @@
+ 	char			f_fname[6];
+ 	char			f_fpack[6];
+ };
++#endif
+ 
+ #endif /* _LINUX_TYPES_H */
+
+
diff --git a/patches/linux/2.4.26/linux-2.4-bsd-expr.patch b/patches/linux/2.4.26/linux-2.4-bsd-expr.patch
new file mode 100644
index 00000000..17625e53
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4-bsd-expr.patch
@@ -0,0 +1,25 @@
+# http://in3www.epfl.ch/~schaffne/linux-2.4-bsd-expr.patch
+The following makes it possible to compile linux 2.4.19 to 2.4.25 on Mac OS X,
+where "expr" doesn't understand the "length" construct
+(which it doesn't have to, according to SuSv3
+(see http://www.opengroup.org/onlinepubs/007904975/utilities/expr.html)
+See also http://sources.redhat.com/ml/crossgcc/2004-02/msg00131.html
+
+Fixes error
+  expr: syntax error
+  KERNELRELEASE "2.4.21" exceeds 64 characters
+  make: *** [include/linux/version.h] Error 1
+
+
+diff -ur linux-2.4.23-old/Makefile linux-2.4.23/Makefile
+--- linux-2.4.23-old/Makefile	2003-12-09 14:27:56.000000000 +0100
++++ linux-2.4.23/Makefile	2003-12-09 14:28:37.000000000 +0100
+@@ -353,7 +353,7 @@
+ 	@rm -f .ver1
+ 
+ include/linux/version.h: ./Makefile
+-	@expr length "$(KERNELRELEASE)" \<= $(uts_len) > /dev/null || \
++	@expr "$(KERNELRELEASE)" : '.*' \<= $(uts_len) > /dev/null || \
+ 	  (echo KERNELRELEASE \"$(KERNELRELEASE)\" exceeds $(uts_len) characters >&2; false)
+ 	@echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" > .ver
+ 	@echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
diff --git a/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch b/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch
new file mode 100644
index 00000000..8f8ddd67
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch
@@ -0,0 +1,203 @@
+Reconstructed from http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2003-December/018647.html
+See also http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=1540
+
+Message-ID: <DDA001.8070502@de.bosch.com>
+Subject: Help cross compiling the kernel for arm.
+From: dirk.behme at de.bosch.com
+
+Aitor Garcia wrote:
+> Hello everybody,
+> 
+> I am having problems cross compiling the kernel for arm.
+> 
+> This is the error message I get:
+> 
+> blkpg.c: In function `blk_ioctl':
+> blkpg.c:252: error: asm-specifier for variable `__r1' conflicts with asm clobber list
+> blkpg.c:252: confused by earlier errors, bailing out make[3]: *** [blkpg.o] Error 1
+> make[3]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers/block'
+> make[2]: *** [first_rule] Error 2
+> make[2]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers/block'
+> make[1]: *** [_subdir_block] Error 2
+> make[1]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers'
+> make: *** [_dir_drivers] Error 2
+> 
+> These are the toolchain versions I am using:
+>  host=i686-pc-linux-gnu
+>  binutils_version=2.14           
+>  gcc_version=3.3.2                
+>  glibc_version=2.3.2             
+>  kernel_version=2.4.21  
+> and applied the kernel patch for arm. 2.4.21-rmk1.
+> ... 
+> I have also seen references to this bug in ARM linux
+> Developer. Patch Number = 1540. But this patch is
+> classified as discarded.
+
+You need something like 1540 to compile 2.4.21 with gcc 3.3.2. 1540 was 
+discarded because of AFLAGS change.
+
+Try the attachment.
+
+Dirk
+-------------- next part --------------
+--- linux/arch/arm/lib/getuser.S.orig	Mon Nov 17 07:41:51 2003
++++ linux/arch/arm/lib/getuser.S	Mon Nov 17 07:43:16 2003
+@@ -17,7 +17,7 @@
+  *
+  * Inputs:	r0 contains the address
+  * Outputs:	r0 is the error code
+- *		r1, r2 contains the zero-extended value
++ *		r1, ip contains the zero-extended value
+  *		lr corrupted
+  *
+  * No other registers must be altered.  (see include/asm-arm/uaccess.h
+@@ -42,14 +42,14 @@ __get_user_1:
+ 
+ 	.global	__get_user_2
+ __get_user_2:
+-	bic	r2, sp, #0x1f00
+-	bic	r2, r2, #0x00ff
+-	ldr	r2, [r2, #TSK_ADDR_LIMIT]
+-	sub	r2, r2, #2
+-	cmp	r0, r2
++	bic	ip, sp, #0x1f00
++	bic	ip, ip, #0x00ff
++	ldr	ip, [ip, #TSK_ADDR_LIMIT]
++	sub	ip, ip, #2
++	cmp	r0, ip
+ 2:	ldrlsbt	r1, [r0], #1
+-3:	ldrlsbt	r2, [r0]
+-	orrls	r1, r1, r2, lsl #8
++3:	ldrlsbt	ip, [r0]
++	orrls	r1, r1, ip, lsl #8
+ 	movls	r0, #0
+ 	movls	pc, lr
+ 	b	__get_user_bad
+@@ -68,20 +68,20 @@ __get_user_4:
+ 
+ 	.global	__get_user_8
+ __get_user_8:
+-	bic	r2, sp, #0x1f00
+-	bic	r2, r2, #0x00ff
+-	ldr	r2, [r2, #TSK_ADDR_LIMIT]
+-	sub	r2, r2, #8
+-	cmp	r0, r2
++	bic	ip, sp, #0x1f00
++	bic	ip, ip, #0x00ff
++	ldr	ip, [ip, #TSK_ADDR_LIMIT]
++	sub	ip, ip, #8
++	cmp	r0, ip
+ 5:	ldrlst	r1, [r0], #4
+-6:	ldrlst	r2, [r0]
++6:	ldrlst	ip, [r0]
+ 	movls	r0, #0
+ 	movls	pc, lr
+ 
+ 	/* fall through */
+ 
+ __get_user_bad_8:
+-	mov	r2, #0
++	mov	ip, #0
+ __get_user_bad:
+ 	mov	r1, #0
+ 	mov	r0, #-14
+--- linux/arch/arm/lib/putuser.S.orig	Mon Nov 17 07:41:57 2003
++++ linux/arch/arm/lib/putuser.S	Mon Nov 17 07:42:26 2003
+@@ -16,7 +16,7 @@
+  * __put_user_X
+  *
+  * Inputs:	r0 contains the address
+- *		r1, r2 contains the value
++ *		r1, ip contains the value
+  * Outputs:	r0 is the error code
+  *		lr corrupted
+  *
+@@ -30,11 +30,11 @@
+ 
+ 	.global	__put_user_1
+ __put_user_1:
+-	bic	r2, sp, #0x1f00
+-	bic	r2, r2, #0x00ff
+-	ldr	r2, [r2, #TSK_ADDR_LIMIT]
+-	sub	r2, r2, #1
+-	cmp	r0, r2
++	bic	ip, sp, #0x1f00
++	bic	ip, ip, #0x00ff
++	ldr	ip, [ip, #TSK_ADDR_LIMIT]
++	sub	ip, ip, #1
++	cmp	r0, ip
+ 1:	strlsbt	r1, [r0]
+ 	movls	r0, #0
+ 	movls	pc, lr
+@@ -42,11 +42,11 @@ __put_user_1:
+ 
+ 	.global	__put_user_2
+ __put_user_2:
+-	bic	r2, sp, #0x1f00
+-	bic	r2, r2, #0x00ff
+-	ldr	r2, [r2, #TSK_ADDR_LIMIT]
+-	sub	r2, r2, #2
+-	cmp	r0, r2
++	bic	ip, sp, #0x1f00
++	bic	ip, ip, #0x00ff
++	ldr	ip, [ip, #TSK_ADDR_LIMIT]
++	sub	ip, ip, #2
++	cmp	r0, ip
+ 2:	strlsbt	r1, [r0], #1
+ 	movls	r1, r1, lsr #8
+ 3:	strlsbt	r1, [r0]
+@@ -56,11 +56,11 @@ __put_user_2:
+ 
+ 	.global	__put_user_4
+ __put_user_4:
+-	bic	r2, sp, #0x1f00
+-	bic	r2, r2, #0x00ff
+-	ldr	r2, [r2, #TSK_ADDR_LIMIT]
+-	sub	r2, r2, #4
+-	cmp	r0, r2
++	bic	ip, sp, #0x1f00
++	bic	ip, ip, #0x00ff
++	ldr	ip, [ip, #TSK_ADDR_LIMIT]
++	sub	ip, ip, #4
++	cmp	r0, ip
+ 4:	strlst	r1, [r0]
+ 	movls	r0, #0
+ 	movls	pc, lr
+@@ -74,7 +74,7 @@ __put_user_8:
+ 	sub	ip, ip, #8
+ 	cmp	r0, ip
+ 5:	strlst	r1, [r0], #4
+-6:	strlst	r2, [r0]
++6:	strlst	ip, [r0]
+ 	movls	r0, #0
+ 	movls	pc, lr
+ 
+--- linux/include/asm-arm/uaccess.h.orig	Mon Nov 17 07:41:04 2003
++++ linux/include/asm-arm/uaccess.h	Mon Nov 17 07:41:37 2003
+@@ -86,7 +86,7 @@ extern int __get_user_bad(void);
+ 			__get_user_x(__r1, __p, __e, 1, "lr");		\
+ 	       		break;						\
+ 		case 2:							\
+-			__get_user_x(__r1, __p, __e, 2, "r2", "lr");	\
++			__get_user_x(__r1, __p, __e, 2, "ip", "lr");	\
+ 			break;						\
+ 		case 4:							\
+ 	       		__get_user_x(__r1, __p, __e, 4, "lr");		\
+@@ -122,13 +122,13 @@ extern int __put_user_bad(void);
+ 		register int __e asm("r0");				\
+ 		switch (sizeof(*(p))) {					\
+ 		case 1:							\
+-			__put_user_x(__r1, __p, __e, 1, "r2", "lr");	\
++			__put_user_x(__r1, __p, __e, 1, "ip", "lr");	\
+ 			break;						\
+ 		case 2:							\
+-			__put_user_x(__r1, __p, __e, 2, "r2", "lr");	\
++			__put_user_x(__r1, __p, __e, 2, "ip", "lr");	\
+ 			break;						\
+ 		case 4:							\
+-			__put_user_x(__r1, __p, __e, 4, "r2", "lr");	\
++			__put_user_x(__r1, __p, __e, 4, "ip", "lr");	\
+ 			break;						\
+ 		case 8:							\
+ 			__put_user_x(__r1, __p, __e, 8, "ip", "lr");	\
diff --git a/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch b/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch
new file mode 100644
index 00000000..384926da
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch
@@ -0,0 +1,23 @@
+Fixes
+semaphore.c:180:5: missing terminating " character
+semaphore.c:213:9: missing terminating " character
+make[1]: *** [semaphore.o] Error 1
+make[1]: Leaving directory `/home/dank/queue/jobdir.fast/crosstool-dev/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/linux-2.4.26/arch/arm/kernel'
+make: *** [_dir_arch/arm/kernel] Error 2
+
+when building kernel.org 2.4.26 for arm with gcc-3.3.x
+(Note: one probably wants to apply ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/v2.4/patch-2.4.26-vrs1.bz2
+instead of my patches when really building 2.4.26 for arm;
+my patches only include the bare minimum to get the vanilla kernel to compile.)
+
+--- linux-2.4.26/arch/arm/kernel/semaphore.c.old	Mon Mar 21 06:50:38 2005
++++ linux-2.4.26/arch/arm/kernel/semaphore.c	Mon Mar 21 06:50:55 2005
+@@ -193,7 +193,7 @@
+ 	bl	__down_interruptible		\n\
+ 	mov	ip, r0				\n\
+ 	ldmfd	sp!, {r0 - r3, pc}^		\n\
+-
++						\n\
+ 	.align	5				\n\
+ 	.globl	__down_trylock_failed		\n\
+ __down_trylock_failed:				\n\
diff --git a/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch b/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch
new file mode 100644
index 00000000..1dd0b5e7
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch
@@ -0,0 +1,40 @@
+Backport of linux-2.6.8-arm-nonofpu.patch.
+Fixes error when building linux-2.4.26 kernel with gcc-3.4 on arm.
+
+/opt/crosstool/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/bin/arm-unknown-linux-gnu-gcc -D__KERNEL__ -I/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=strongarm110 -mshort-load-bytes -msoft-float -Uarm -S -o constants.h.tmp.1 getconstants.c
+cc1: error: invalid option `short-load-bytes'
+make[2]: *** [constants.h] Error 1
+make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/arch/arm/tools'
+make[1]: *** [dep] Error 2
+make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/arch/arm/tools'
+make: *** [archdep] Error 2
+
+
+--- linux-2.4.26/Makefile.old	Thu Sep 30 23:21:14 2004
++++ linux-2.4.26/Makefile	Thu Sep 30 23:24:12 2004
+@@ -21,6 +21,10 @@
+ 
+ CROSS_COMPILE 	=
+ 
++# From linux-2.6
++check_gcc = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
++export check_gcc
++
+ #
+ # Include the make variables (CC, etc...)
+ #
+--- linux-2.4.26/arch/arm/Makefile.old	Thu Sep 30 23:16:49 2004
++++ linux-2.4.26/arch/arm/Makefile	Thu Sep 30 23:25:27 2004
+@@ -50,9 +50,9 @@
+ tune-$(CONFIG_CPU_SA110)	:=-mtune=strongarm110
+ tune-$(CONFIG_CPU_SA1100)	:=-mtune=strongarm1100
+ 
+-CFLAGS_BOOT	:=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm
+-CFLAGS		+=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm
+-AFLAGS		+=$(apcs-y) $(arch-y) -mno-fpu -msoft-float
++CFLAGS_BOOT	:=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm
++CFLAGS		+=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm
++AFLAGS		+=$(apcs-y) $(arch-y) -msoft-float
+ 
+ ifeq ($(CONFIG_CPU_26),y)
+ PROCESSOR	:= armo
diff --git a/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch b/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch
new file mode 100644
index 00000000..60c68eff
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch
@@ -0,0 +1,28 @@
+About ten times, various people have noticed that 'make dep' uses
+really, really long commandlines.  This breaks sh even on linux sometimes.
+
+For 2.4, see e.g.
+http://marc.theaimsgroup.com/?l=linux-kernel&m=96589814004919&w=2
+http://marc.theaimsgroup.com/?l=linux-kernel&m=96589814004919&q=p3
+http://www.xraylith.wisc.edu/~khan/software/gnu-win32/cygwin-to-linux-cross-howto.txt
+http://www.uclinux.org/pub/uClinux/archive/1728.html
+
+Fixes error when building linux kernel for some default arm configurations:
+
+scripts/mkdep -- `find /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/asm /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/linux /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/scsi /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/net /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/math-emu \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
+/bin/sh: line 1: scripts/mkdep: Argument list too long
+make: *** [dep-files] Error 126
+
+[ For linux-2.4.26 ]
+
+--- linux-2.4.26/Makefile.old	2004-04-14 06:05:41.000000000 -0700
++++ linux-2.4.26/Makefile	2004-09-13 21:27:39.000000000 -0700
+@@ -500,7 +500,7 @@
+ ifdef CONFIG_MODVERSIONS
+ 	$(MAKE) update-modverfile
+ endif
+-	scripts/mkdep -- `find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
++	find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print | xargs scripts/mkdep | cat > .hdepend
+ 	scripts/mkdep -- init/*.c > .depend
+ 
+ ifdef CONFIG_MODVERSIONS
diff --git a/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch b/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch
new file mode 100644
index 00000000..3dc0a48b
--- /dev/null
+++ b/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch
@@ -0,0 +1,17 @@
+Fixes drivers/char/char.o(.text+0x178a4): In function `$a':
+: undefined reference to `get_user'
+
+Part of ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/v2.4/patch-2.4.26-vrs1.bz2
+
+diff -urN linux-2.4.26/drivers/char/wdt977.c linux-2.4.26-vrs1/drivers/char/wdt977.c
+--- linux-2.4.26/drivers/char/wdt977.c	2002-11-28 23:53:12.000000000 +0000
++++ linux-2.4.26-vrs1/drivers/char/wdt977.c	2004-01-14 21:32:25.000000000 +0000
+@@ -27,6 +27,7 @@
+ #include <asm/io.h>
+ #include <asm/system.h>
+ #include <asm/mach-types.h>
++#include <asm/uaccess.h>
+ 
+ #define WATCHDOG_MINOR	130
+ 
+
diff --git a/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch b/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch
new file mode 100644
index 00000000..c163a1ee
--- /dev/null
+++ b/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch
@@ -0,0 +1,134 @@
+Date: Sun, 20 Mar 2005 20:26:02 -0800
+From: Richard Henderson <rth@twiddle.net>
+To: Andrew Morton <akpm@osdl.org>
+Cc: Dan Kegel <dank@kegel.com>, jbglaw@lug-owl.de,
+        linux-kernel@vger.kernel.org, torvalds@osdl.org
+Subject: Re: 2.6.11.3 build problem in arch/alpha/kernel/srcons.c with gcc-4.0
+Message-ID: <20050321042602.GA3795@twiddle.net>
+Mail-Followup-To: Andrew Morton <akpm@osdl.org>, Dan Kegel <dank@kegel.com>,
+	jbglaw@lug-owl.de, linux-kernel@vger.kernel.org, torvalds@osdl.org
+References: <423E238F.3030805@kegel.com> <20050320190352.65cc1396.akpm@osdl.org>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+In-Reply-To: <20050320190352.65cc1396.akpm@osdl.org>
+User-Agent: Mutt/1.4.1i
+
+On Sun, Mar 20, 2005 at 07:03:52PM -0800, Andrew Morton wrote:
+> Dan Kegel <dank@kegel.com> wrote:
+> >
+> > Anyone with an alpha care to suggest a fix for this?
+> > 
+> > arch/alpha/kernel/srmcons.c: In function 'srmcons_open':
+> > arch/alpha/kernel/srmcons.c:196: warning: 'srmconsp' may be used uninitialized in this function
+> > make[1]: *** [arch/alpha/kernel/srmcons.o] Error 1
+> > make: *** [arch/alpha/kernel] Error 2
+> > 
+> > I get this when building the 2.6.11.3 kernel with a recent gcc-4.0 snapshot.
+> > 
+> 
+> It's beyond gcc's ability to figure out that the code is OK.  Options would
+> be to disable -Werror, or to artificially initialise that variable.
+
+Fixed thus.
+
+Note that even with a _raw_read_trylock implementation, smp still
+doesn't work.  Everything that init spawns dies immediately.  I
+havn't had a chance to find out why yet...
+
+[ Note: deleted changes to smp.c, since they didn't apply cleanly
+  to 2.6.11.3 (the function had moved, I guess), and they seemed unrelated.]
+
+r~
+
+
+
+You can import this changeset into BK by piping this whole message to:
+'| bk receive [path to repository]' or apply the patch as usual.
+
+===================================================================
+
+
+ChangeSet@1.2289, 2005-03-20 12:29:41-08:00, rth@kanga.twiddle.home
+  [ALPHA] Elimitate two warnings from gcc4.
+
+
+ smp.c     |   43 -------------------------------------------
+ srmcons.c |   27 ++++++++++-----------------
+ 2 files changed, 10 insertions(+), 60 deletions(-)
+
+
+diff -Nru a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c
+--- a/arch/alpha/kernel/srmcons.c	2005-03-20 20:23:28 -08:00
++++ b/arch/alpha/kernel/srmcons.c	2005-03-20 20:23:28 -08:00
+@@ -164,29 +164,22 @@
+ 	unsigned long flags;
+ 	int retval = 0;
+ 
+-	spin_lock_irqsave(&srmconsp_lock, flags);
+-
+-	do {
+-		if (srmconsp != NULL) {
+-			*ps = srmconsp;
+-			break;
+-		}
++	if (srmconsp == NULL) {
++		spin_lock_irqsave(&srmconsp_lock, flags);
+ 
+ 		srmconsp = kmalloc(sizeof(*srmconsp), GFP_KERNEL);
+-		if (srmconsp == NULL) {
++		if (srmconsp == NULL)
+ 			retval = -ENOMEM;
+-			break;
++		else {
++			srmconsp->tty = NULL;
++			spin_lock_init(&srmconsp->lock);
++			init_timer(&srmconsp->timer);
+ 		}
+ 
+-		srmconsp->tty = NULL;
+-		spin_lock_init(&srmconsp->lock);
+-		init_timer(&srmconsp->timer);
+-
+-		*ps = srmconsp;
+-	} while(0);
+-
+-	spin_unlock_irqrestore(&srmconsp_lock, flags);
++		spin_unlock_irqrestore(&srmconsp_lock, flags);
++	}
+ 
++	*ps = srmconsp;
+ 	return retval;
+ }
+ 
+
+===================================================================
+
+
+This BitKeeper patch contains the following changesets:
+1.2289
+## Wrapped with gzip_uu ##
+
+
+M'XL( $!,/D(  [56[V_;-A#]+/X5!Q38FFV628KZY<!!TJ98BP9;D"&?BL)@
+M),H6+%$:2=DQIOWO)>4XSH8D1KK%-F#@>'J\]^[>V6_@6@LU\919H#?PL=%F
+MXG$E?+,N\[P2OA3&QJ^:QL;'BZ868YLY?O=YS&_;$?4C9$\ON<D6L!)*3SSB
+M!_<1LVG%Q+OZ\.OUQ=D50M,IO%]P.1=_" /3*3*-6O$JUZ?<+*I&^D9QJ6MA
+MN)\U=7^?VE.,J7V') YP&/4DPBSN,Y(3PAD1.:8LB=@>3:P:O]%YY3=J_D^4
+M$ <DH4&0!LRBL"A YT!\2I,4<#C&P9AB('1"TPDC(YQ,, 9+]G1I(?B]($X#
+M^)G""*-W\/]2>(\R^')V<?GQ["M\J,JZ--P(,.L&UES)4LXU%*JI89YES$>?
+M@82,8'2Y5Q6-7OA""'.,3AZA:?O><Y4MQKQJ%WR\%$J*:JQ5G352^YEC%&!"
+ML664!%%/+:^PCW-:I 7)XUSDE*;Q$_(= K9]<FK1E(0]HPPS6^'S2C\"6+=;
+ML#O=&::T#^*8QGU*;D@>)3BWJA?I3?Z"*G>@#RND49R&PW0_0\O-^RN)C,R\
+MNCVM2MD9U<CRUL_%EYU:7P]+32@A$644]RQ,*!TL0>B_#4'" X8@&$8D?A5+
+M7(FU*JT1[@J?S869M:I<67/,M%%=9D!W;MTLN(&?6@VE!EZM^4:#>] (Z<RR
+M':3?8:36P\<._^5S'?L.+YV3*(88?;*4@"*O+.#M'5QK^P^_75]<',%?R/-T
+M6\I9U63+6:G^U'PEWOZP2QS"OT!1\;D^.K:0<03$0;HO[W%,EY5LLQ)@-DM4
+M6@P7>;O<T8DQ&]CF'P\'^Q)D:?;WCTY<\&C(<2<S4]9"/3P? D-I"8'$7IHD
+MCNT6L9,[6DIH.PI/,_/^=H^FCI7KV737WO;X*2\Y\QW^W?A/JP#==')YJDVG
+M+=HA'SU8!H1AS!@-^X"F=LJ<AT+R8@]9"['@52QT+BKA'%2W,]-):YML(?+.
+M[HSY,90&\D9H^:,!GIF.5]4&6J&*1M7 Y08Z+8JNLB!%)S-3-M)%:]M:YZKM
+I\COL*J?5=SG*3;1=2J%3<?]?PY:?+7573PFE(L5)@+X!A'U=W,@(    
+ 
+
+
diff --git a/patches/linux/2.6.11.3/kaz-types.patch b/patches/linux/2.6.11.3/kaz-types.patch
new file mode 100644
index 00000000..ec5de36a
--- /dev/null
+++ b/patches/linux/2.6.11.3/kaz-types.patch
@@ -0,0 +1,60 @@
+The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4:
+
+In file included from sys/ustat.h:30,
+                 from ../sysdeps/unix/sysv/linux/ustat.c:21:
+../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat'
+make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1
+make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc'
+make[1]: *** [misc/subdir_lib] Error 2
+make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+----------- snip ---------------
+
+Date: Fri, 06 Jun 2003 08:00:00 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32:
+ error: redefinition of `struct user_fpu_struct'"
+To: linux-sh@m17n.org
+Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> When I try to build glibc-2.3.2 for sh4, it fails with the error
+[snip]
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct'
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user'
+[snip]
+> The error reminds me of the kind of thing fixed by
+> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch
+
+It seems that the definitions in asm/user.h and the above patch collide.
+I'm not sure why you need this patch, but is it needed for the problem
+about struct ustat that you pointed out in this list, isn't it?
+I found why I don't hit ustat problem - my local kernel tree includes
+the following patch, though I can't recall about it.
+
+Regards,
+	kaz
+--
+diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h
+--- linux-2.5.69-sf-orig/include/linux/types.h	Wed Mar  5 12:29:34 2003
++++ sh4-unknown-linux-gnu/include/linux/types.h	Sat Apr 19 10:05:52 2003
+@@ -141,6 +141,7 @@
+ 
+ #endif /* __KERNEL_STRICT_NAMES */
+ 
++#ifdef	__KERNEL__
+ /*
+  * Below are truly Linux-specific types that should never collide with
+  * any application/library that wants linux/types.h.
+@@ -152,5 +153,6 @@
+ 	char			f_fname[6];
+ 	char			f_fpack[6];
+ };
++#endif
+ 
+ #endif /* _LINUX_TYPES_H */
+
+
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch
new file mode 100644
index 00000000..1193a8cd
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch
@@ -0,0 +1,150 @@
+Fixes
+
+In file included from include/asm/thread_info.h:16,
+                 from include/linux/thread_info.h:21,
+                 from include/linux/spinlock.h:12,
+                 from include/linux/capability.h:45,
+                 from include/linux/sched.h:7,
+                 from arch/i386/kernel/asm-offsets.c:7:
+include/asm/processor.h:87: error: array type has incomplete element type
+make[1]: *** [arch/i386/kernel/asm-offsets.asm] Error 1
+
+--- linux-2.6.11.3/include/asm-i386/processor.h.old	Tue Mar 15 06:45:26 2005
++++ linux-2.6.11.3/include/asm-i386/processor.h	Tue Mar 15 06:46:45 2005
+@@ -81,6 +81,64 @@
+ #define X86_VENDOR_UNKNOWN 0xff
+ 
+ /*
++ * Size of io_bitmap.
++ */
++#define IO_BITMAP_BITS  65536
++#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
++#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
++#define INVALID_IO_BITMAP_OFFSET 0x8000
++#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
++
++struct tss_struct {
++	unsigned short	back_link,__blh;
++	unsigned long	esp0;
++	unsigned short	ss0,__ss0h;
++	unsigned long	esp1;
++	unsigned short	ss1,__ss1h;	/* ss1 is used to cache MSR_IA32_SYSENTER_CS */
++	unsigned long	esp2;
++	unsigned short	ss2,__ss2h;
++	unsigned long	__cr3;
++	unsigned long	eip;
++	unsigned long	eflags;
++	unsigned long	eax,ecx,edx,ebx;
++	unsigned long	esp;
++	unsigned long	ebp;
++	unsigned long	esi;
++	unsigned long	edi;
++	unsigned short	es, __esh;
++	unsigned short	cs, __csh;
++	unsigned short	ss, __ssh;
++	unsigned short	ds, __dsh;
++	unsigned short	fs, __fsh;
++	unsigned short	gs, __gsh;
++	unsigned short	ldt, __ldth;
++	unsigned short	trace, io_bitmap_base;
++	/*
++	 * The extra 1 is there because the CPU will access an
++	 * additional byte beyond the end of the IO permission
++	 * bitmap. The extra byte must be all 1 bits, and must
++	 * be within the limit.
++	 */
++	unsigned long	io_bitmap[IO_BITMAP_LONGS + 1];
++	/*
++	 * Cache the current maximum and the last task that used the bitmap:
++	 */
++	unsigned long io_bitmap_max;
++	struct thread_struct *io_bitmap_owner;
++	/*
++	 * pads the TSS to be cacheline-aligned (size is 0x100)
++	 */
++	unsigned long __cacheline_filler[35];
++	/*
++	 * .. and then another 0x100 bytes for emergency kernel stack
++	 */
++	unsigned long stack[64];
++} __attribute__((packed));
++
++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
++#define ARCH_MIN_TASKALIGN	16
++
++/*
+  * capabilities of CPUs
+  */
+ 
+@@ -308,16 +366,6 @@
+ 
+ #define HAVE_ARCH_PICK_MMAP_LAYOUT
+ 
+-/*
+- * Size of io_bitmap.
+- */
+-#define IO_BITMAP_BITS  65536
+-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
+-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
+-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+-#define INVALID_IO_BITMAP_OFFSET 0x8000
+-#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
+-
+ struct i387_fsave_struct {
+ 	long	cwd;
+ 	long	swd;
+@@ -371,54 +419,6 @@
+ } mm_segment_t;
+ 
+ struct thread_struct;
+-
+-struct tss_struct {
+-	unsigned short	back_link,__blh;
+-	unsigned long	esp0;
+-	unsigned short	ss0,__ss0h;
+-	unsigned long	esp1;
+-	unsigned short	ss1,__ss1h;	/* ss1 is used to cache MSR_IA32_SYSENTER_CS */
+-	unsigned long	esp2;
+-	unsigned short	ss2,__ss2h;
+-	unsigned long	__cr3;
+-	unsigned long	eip;
+-	unsigned long	eflags;
+-	unsigned long	eax,ecx,edx,ebx;
+-	unsigned long	esp;
+-	unsigned long	ebp;
+-	unsigned long	esi;
+-	unsigned long	edi;
+-	unsigned short	es, __esh;
+-	unsigned short	cs, __csh;
+-	unsigned short	ss, __ssh;
+-	unsigned short	ds, __dsh;
+-	unsigned short	fs, __fsh;
+-	unsigned short	gs, __gsh;
+-	unsigned short	ldt, __ldth;
+-	unsigned short	trace, io_bitmap_base;
+-	/*
+-	 * The extra 1 is there because the CPU will access an
+-	 * additional byte beyond the end of the IO permission
+-	 * bitmap. The extra byte must be all 1 bits, and must
+-	 * be within the limit.
+-	 */
+-	unsigned long	io_bitmap[IO_BITMAP_LONGS + 1];
+-	/*
+-	 * Cache the current maximum and the last task that used the bitmap:
+-	 */
+-	unsigned long io_bitmap_max;
+-	struct thread_struct *io_bitmap_owner;
+-	/*
+-	 * pads the TSS to be cacheline-aligned (size is 0x100)
+-	 */
+-	unsigned long __cacheline_filler[35];
+-	/*
+-	 * .. and then another 0x100 bytes for emergency kernel stack
+-	 */
+-	unsigned long stack[64];
+-} __attribute__((packed));
+-
+-#define ARCH_MIN_TASKALIGN	16
+ 
+ struct thread_struct {
+ /* cached TLS descriptors. */
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch
new file mode 100644
index 00000000..b349ee02
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch
@@ -0,0 +1,32 @@
+Fixes
+
+In file included from include/asm/setup.h:8,
+                 from include/asm/machdep.h:8,
+                 from include/asm/irq.h:6,
+                 from include/asm/hardirq.h:8,
+                 from include/linux/hardirq.h:6,
+                 from include/asm-generic/local.h:6,
+                 from include/asm/local.h:4,
+                 from include/linux/module.h:21,
+                 from init/main.c:16:
+include/asm-m68k/setup.h:365: error: array type has incomplete element type
+
+when compiling with gcc-4.0.  (Affects ppc, too, for some reason.)
+
+--- linux-2.6.11.3/include/asm-m68k/setup.h.old	Fri Mar 18 13:48:03 2005
++++ linux-2.6.11.3/include/asm-m68k/setup.h	Fri Mar 18 13:48:14 2005
+@@ -362,12 +362,13 @@
+ #ifndef __ASSEMBLY__
+ extern int m68k_num_memory;		/* # of memory blocks found (and used) */
+ extern int m68k_realnum_memory;		/* real # of memory blocks found */
+-extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
+ 
+ struct mem_info {
+ 	unsigned long addr;		/* physical address of memory chunk */
+ 	unsigned long size;		/* length of memory chunk (in bytes) */
+ };
++
++extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
+ #endif
+ 
+ #endif /* __KERNEL__ */
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch
new file mode 100644
index 00000000..58e376d0
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch
@@ -0,0 +1,30 @@
+Fixes
+
+In file included from include/asm/current.h:4,
+                 from include/linux/wait.h:27,
+                 from include/asm/semaphore.h:15,
+                 from include/linux/sched.h:19,
+                 from arch/ppc64/kernel/asm-offsets.c:18:
+include/asm/paca.h:25: error: array type has incomplete element type
+make[1]: *** [arch/ppc64/kernel/asm-offsets.s] Error 1
+
+when building with gcc-4.0
+
+--- linux-2.6.11.3/include/asm-ppc64/paca.h.old	Fri Mar 18 13:23:40 2005
++++ linux-2.6.11.3/include/asm-ppc64/paca.h	Fri Mar 18 13:24:04 2005
+@@ -22,7 +22,6 @@
+ #include	<asm/iSeries/ItLpRegSave.h>
+ #include	<asm/mmu.h>
+ 
+-extern struct paca_struct paca[];
+ register struct paca_struct *local_paca asm("r13");
+ #define get_paca()	local_paca
+ 
+@@ -114,5 +113,7 @@
+ 	struct ItLpRegSave reg_save;
+ #endif
+ };
++
++extern struct paca_struct paca[];
+ 
+ #endif /* _PPC64_PACA_H */
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch
new file mode 100644
index 00000000..a87e12ef
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch
@@ -0,0 +1,28 @@
+Fixes:
+
+In file included from include/linux/spinlock.h:16,
+                 from include/linux/capability.h:45,
+                 from include/linux/sched.h:7,
+                 from arch/x86_64/kernel/asm-offsets.c:7:
+include/asm/processor.h:79: error: array type has incomplete element type
+make[1]: *** [arch/x86_64/kernel/asm-offsets.asm] Error 1
+
+--- linux-2.6.11.3/include/asm-x86_64/processor.h.old	Tue Mar 15 07:05:07 2005
++++ linux-2.6.11.3/include/asm-x86_64/processor.h	Tue Mar 15 07:09:53 2005
+@@ -179,7 +179,6 @@
+ #define IO_BITMAP_BITS  65536
+ #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
+ #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
+-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+ #define INVALID_IO_BITMAP_OFFSET 0x8000
+ 
+ struct i387_fxsave_struct {
+@@ -222,6 +221,8 @@
+ 	 */
+ 	unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
+ } __attribute__((packed)) ____cacheline_aligned;
++
++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+ 
+ extern struct cpuinfo_x86 boot_cpu_data;
+ DECLARE_PER_CPU(struct tss_struct,init_tss);
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch
new file mode 100644
index 00000000..c1df43da
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch
@@ -0,0 +1,58 @@
+Fixes
+
+In file included from fs/compat_ioctl.c:69,
+                 from arch/ppc64/kernel/ioctl32.c:24:
+include/linux/i2c.h:58: error: array type has incomplete element type
+include/linux/i2c.h:197: error: array type has incomplete element type
+
+when compiling with gcc-4.0.
+
+--- linux-2.6.11.3/include/linux/i2c.h.old	2005-03-19 10:59:09.000000000 -0800
++++ linux-2.6.11.3/include/linux/i2c.h	2005-03-19 11:01:37.000000000 -0800
+@@ -36,7 +36,22 @@
+ 
+ /* --- General options ------------------------------------------------	*/
+ 
+-struct i2c_msg;
++/*
++ * I2C Message - used for pure i2c transaction, also from /dev interface
++ */
++struct i2c_msg {
++	__u16 addr;	/* slave address			*/
++ 	__u16 flags;		
++#define I2C_M_TEN	0x10	/* we have a ten bit chip address	*/
++#define I2C_M_RD	0x01
++#define I2C_M_NOSTART	0x4000
++#define I2C_M_REV_DIR_ADDR	0x2000
++#define I2C_M_IGNORE_NAK	0x1000
++#define I2C_M_NO_RD_ACK		0x0800
++ 	__u16 len;		/* msg length				*/
++ 	__u8 *buf;		/* pointer to msg data			*/
++};
++
+ struct i2c_algorithm;
+ struct i2c_adapter;
+ struct i2c_client;
+@@ -379,22 +394,6 @@
+ /* Return 1 if adapter supports everything we need, 0 if not. */
+ extern int i2c_check_functionality (struct i2c_adapter *adap, u32 func);
+ 
+-/*
+- * I2C Message - used for pure i2c transaction, also from /dev interface
+- */
+-struct i2c_msg {
+-	__u16 addr;	/* slave address			*/
+- 	__u16 flags;		
+-#define I2C_M_TEN	0x10	/* we have a ten bit chip address	*/
+-#define I2C_M_RD	0x01
+-#define I2C_M_NOSTART	0x4000
+-#define I2C_M_REV_DIR_ADDR	0x2000
+-#define I2C_M_IGNORE_NAK	0x1000
+-#define I2C_M_NO_RD_ACK		0x0800
+- 	__u16 len;		/* msg length				*/
+- 	__u8 *buf;		/* pointer to msg data			*/
+-};
+-
+ /* To determine what functionality is present */
+ 
+ #define I2C_FUNC_I2C			0x00000001
diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch
new file mode 100644
index 00000000..60f02e3c
--- /dev/null
+++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch
@@ -0,0 +1,86 @@
+
+Fixes
+
+In file included from arch/ppc/kernel/time.c:68:
+arch/ppc/kernel/time.c:92: error: static declaration of 'time_offset' follows non-static declaration
+include/linux/timex.h:236: error: previous declaration of 'time_offset' was here
+make[1]: *** [arch/ppc/kernel/time.o] Error 1
+
+when compiling with gcc-4.0
+
+Taken from
+http://user.it.uu.se/~mikpe/linux/patches/2.6/patch-gcc4-fixes-v2-2.6.11
+Also removes some obsolete externs that caused problems for Mike
+Mike's patch has a bit more stuff in it, but this was enough for me
+
+
+diff -rupN linux-2.6.11/arch/ppc/kernel/time.c linux-2.6.11.gcc4-fixes-v2/arch/ppc/kernel/time.c
+--- linux-2.6.11/arch/ppc/kernel/time.c	2005-03-02 19:24:14.000000000 +0100
++++ linux-2.6.11.gcc4-fixes-v2/arch/ppc/kernel/time.c	2005-03-02 19:36:26.000000000 +0100
+@@ -89,7 +89,7 @@ unsigned long tb_to_ns_scale;
+ 
+ extern unsigned long wall_jiffies;
+ 
+-static long time_offset;
++static long ppc_time_offset;
+ 
+ DEFINE_SPINLOCK(rtc_lock);
+ 
+@@ -172,7 +172,7 @@ void timer_interrupt(struct pt_regs * re
+ 		     xtime.tv_sec - last_rtc_update >= 659 &&
+ 		     abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ &&
+ 		     jiffies - wall_jiffies == 1) {
+-		  	if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0)
++		  	if (ppc_md.set_rtc_time(xtime.tv_sec+1 + ppc_time_offset) == 0)
+ 				last_rtc_update = xtime.tv_sec+1;
+ 			else
+ 				/* Try again one minute later */
+@@ -289,7 +289,7 @@ void __init time_init(void)
+ 	unsigned old_stamp, stamp, elapsed;
+ 
+         if (ppc_md.time_init != NULL)
+-                time_offset = ppc_md.time_init();
++                ppc_time_offset = ppc_md.time_init();
+ 
+ 	if (__USE_RTC()) {
+ 		/* 601 processor: dec counts down by 128 every 128ns */
+@@ -334,10 +334,10 @@ void __init time_init(void)
+ 	set_dec(tb_ticks_per_jiffy);
+ 
+ 	/* If platform provided a timezone (pmac), we correct the time */
+-        if (time_offset) {
+-		sys_tz.tz_minuteswest = -time_offset / 60;
++        if (ppc_time_offset) {
++		sys_tz.tz_minuteswest = -ppc_time_offset / 60;
+ 		sys_tz.tz_dsttime = 0;
+-		xtime.tv_sec -= time_offset;
++		xtime.tv_sec -= ppc_time_offset;
+         }
+         set_normalized_timespec(&wall_to_monotonic,
+                                 -xtime.tv_sec, -xtime.tv_nsec);
+diff -rupN linux-2.6.11/arch/ppc/syslib/open_pic_defs.h linux-2.6.11.gcc4-fixes-v2/arch/ppc/syslib/open_pic_defs.h
+--- linux-2.6.11/arch/ppc/syslib/open_pic_defs.h	2005-03-02 19:24:14.000000000 +0100
++++ linux-2.6.11.gcc4-fixes-v2/arch/ppc/syslib/open_pic_defs.h	2005-03-02 19:36:26.000000000 +0100
+@@ -172,9 +172,6 @@ struct OpenPIC {
+     OpenPIC_Processor Processor[OPENPIC_MAX_PROCESSORS];
+ };
+ 
+-extern volatile struct OpenPIC __iomem *OpenPIC;
+-
+-
+     /*
+      *  Current Task Priority Register
+      */
+diff -rupN linux-2.6.11/include/asm-ppc/prom.h linux-2.6.11.gcc4-fixes-v2/include/asm-ppc/prom.h
+--- linux-2.6.11/include/asm-ppc/prom.h	2003-09-28 12:19:57.000000000 +0200
++++ linux-2.6.11.gcc4-fixes-v2/include/asm-ppc/prom.h	2005-03-02 19:36:26.000000000 +0100
+@@ -13,9 +13,6 @@
+ typedef void *phandle;
+ typedef void *ihandle;
+ 
+-extern char *prom_display_paths[];
+-extern unsigned int prom_num_displays;
+-
+ struct address_range {
+ 	unsigned int space;
+ 	unsigned int address;
diff --git a/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch b/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch
new file mode 100644
index 00000000..829f0d95
--- /dev/null
+++ b/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch
@@ -0,0 +1,80 @@
+Retrieved with wget http://www.x86-64.org/lists/discuss/msg04963.html
+then tabs fixed up by rediffing
+
+Message-Id: EFF62C7EE88E71429E38641A1172F4C2077104@net.teracruz.com
+To: discuss@xxxxxxxxxx
+Subject: Compile error with glibc 2.3.2 + Linux 2.6.5 ARCH=x86_64
+From: "David Lee" david.lee@xxxxxxxxxxxx
+Date: Wed, 21 Apr 2004 15:26:04 -0500</li>
+
+I am getting compiler errors when trying to compile glibc 2.3.2 using
+the kernel headers from linux 2.6.5.  The headers from linux 2.6.3 work
+fine.
+
+I've traced the cause of the problem to a change made in
+./include/asm-x86_64/unistd.h in the 2.6.4 release.
+
++#ifndef __ASSEMBLY__
++
++#include <linux/linkage.h>
++#include <linux/compiler.h>
++#include <linux/types.h>
++#include <asm/ptrace.h>
++
++asmlinkage long sys_ptrace(long request, long pid,
++                                unsigned long addr, long data);
++asmlinkage long sys_iopl(unsigned int level, struct pt_regs regs);
++asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int
+turn_on);
++struct sigaction;
++asmlinkage long sys_rt_sigaction(int sig,
++                                const struct sigaction __user *act,
++                                struct sigaction __user *oact,
++                                size_t sigsetsize);
++
++#endif  /* __ASSEMBLY__ */
+
+Within glibc, ./sysdeps/unix/sysv/linux/x86_64/syscall.S ends up
+including this file, which chokes the assembler with the struct
+declarations in the above #include's.
+
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/posix_types.h: Assembler messages:
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/posix_types.h:36: Error: no such
+instruction: `typedef struct{'
+
+There are also errors about conflicting re-declarations further along in
+the glibc build.
+
+../posix/sys/types.h:62: error: conflicting types for `dev_t'
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/types.h:23: error: previous declaration of
+`dev_t'
+
+Changing the '#ifndef __ASSEMBLY__' to '#if ((!defined __ASSEMBLY__) &&
+(defined __KERNEL__))' clears up the problem.  My patch is below.
+
+dave
+
+
+--- linux-2.6.5/include/asm-x86_64/unistd.h.old	2004-04-03 19:37:36.000000000 -0800
++++ linux-2.6.5/include/asm-x86_64/unistd.h	2004-05-05 11:07:11.000000000 -0700
+@@ -713,7 +713,7 @@
+ 
+ #endif /* __KERNEL_SYSCALLS__ */
+ 
+-#ifndef __ASSEMBLY__
++#if ((!defined __ASSEMBLY__) && (defined __KERNEL__))
+ 
+ #include <linux/linkage.h>
+ #include <linux/compiler.h>
+@@ -730,7 +730,7 @@
+ 				struct sigaction __user *oact,
+ 				size_t sigsetsize);
+ 
+-#endif	/* __ASSEMBLY__ */
++#endif /* ((!defined __ASSEMBLY__) && (defined __KERNEL__) */
+ 
+ #endif /* __NO_STUBS */
+ 
diff --git a/patches/linux/2.6.6/kaz-types.patch b/patches/linux/2.6.6/kaz-types.patch
new file mode 100644
index 00000000..ec5de36a
--- /dev/null
+++ b/patches/linux/2.6.6/kaz-types.patch
@@ -0,0 +1,60 @@
+The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4:
+
+In file included from sys/ustat.h:30,
+                 from ../sysdeps/unix/sysv/linux/ustat.c:21:
+../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat'
+make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1
+make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc'
+make[1]: *** [misc/subdir_lib] Error 2
+make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+----------- snip ---------------
+
+Date: Fri, 06 Jun 2003 08:00:00 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32:
+ error: redefinition of `struct user_fpu_struct'"
+To: linux-sh@m17n.org
+Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> When I try to build glibc-2.3.2 for sh4, it fails with the error
+[snip]
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct'
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user'
+[snip]
+> The error reminds me of the kind of thing fixed by
+> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch
+
+It seems that the definitions in asm/user.h and the above patch collide.
+I'm not sure why you need this patch, but is it needed for the problem
+about struct ustat that you pointed out in this list, isn't it?
+I found why I don't hit ustat problem - my local kernel tree includes
+the following patch, though I can't recall about it.
+
+Regards,
+	kaz
+--
+diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h
+--- linux-2.5.69-sf-orig/include/linux/types.h	Wed Mar  5 12:29:34 2003
++++ sh4-unknown-linux-gnu/include/linux/types.h	Sat Apr 19 10:05:52 2003
+@@ -141,6 +141,7 @@
+ 
+ #endif /* __KERNEL_STRICT_NAMES */
+ 
++#ifdef	__KERNEL__
+ /*
+  * Below are truly Linux-specific types that should never collide with
+  * any application/library that wants linux/types.h.
+@@ -152,5 +153,6 @@
+ 	char			f_fname[6];
+ 	char			f_fpack[6];
+ };
++#endif
+ 
+ #endif /* _LINUX_TYPES_H */
+
+
diff --git a/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch b/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch
new file mode 100644
index 00000000..829f0d95
--- /dev/null
+++ b/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch
@@ -0,0 +1,80 @@
+Retrieved with wget http://www.x86-64.org/lists/discuss/msg04963.html
+then tabs fixed up by rediffing
+
+Message-Id: EFF62C7EE88E71429E38641A1172F4C2077104@net.teracruz.com
+To: discuss@xxxxxxxxxx
+Subject: Compile error with glibc 2.3.2 + Linux 2.6.5 ARCH=x86_64
+From: "David Lee" david.lee@xxxxxxxxxxxx
+Date: Wed, 21 Apr 2004 15:26:04 -0500</li>
+
+I am getting compiler errors when trying to compile glibc 2.3.2 using
+the kernel headers from linux 2.6.5.  The headers from linux 2.6.3 work
+fine.
+
+I've traced the cause of the problem to a change made in
+./include/asm-x86_64/unistd.h in the 2.6.4 release.
+
++#ifndef __ASSEMBLY__
++
++#include <linux/linkage.h>
++#include <linux/compiler.h>
++#include <linux/types.h>
++#include <asm/ptrace.h>
++
++asmlinkage long sys_ptrace(long request, long pid,
++                                unsigned long addr, long data);
++asmlinkage long sys_iopl(unsigned int level, struct pt_regs regs);
++asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int
+turn_on);
++struct sigaction;
++asmlinkage long sys_rt_sigaction(int sig,
++                                const struct sigaction __user *act,
++                                struct sigaction __user *oact,
++                                size_t sigsetsize);
++
++#endif  /* __ASSEMBLY__ */
+
+Within glibc, ./sysdeps/unix/sysv/linux/x86_64/syscall.S ends up
+including this file, which chokes the assembler with the struct
+declarations in the above #include's.
+
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/posix_types.h: Assembler messages:
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/posix_types.h:36: Error: no such
+instruction: `typedef struct{'
+
+There are also errors about conflicting re-declarations further along in
+the glibc build.
+
+../posix/sys/types.h:62: error: conflicting types for `dev_t'
+/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86
+_64-linux/glibcinclude/linux/types.h:23: error: previous declaration of
+`dev_t'
+
+Changing the '#ifndef __ASSEMBLY__' to '#if ((!defined __ASSEMBLY__) &&
+(defined __KERNEL__))' clears up the problem.  My patch is below.
+
+dave
+
+
+--- linux-2.6.5/include/asm-x86_64/unistd.h.old	2004-04-03 19:37:36.000000000 -0800
++++ linux-2.6.5/include/asm-x86_64/unistd.h	2004-05-05 11:07:11.000000000 -0700
+@@ -713,7 +713,7 @@
+ 
+ #endif /* __KERNEL_SYSCALLS__ */
+ 
+-#ifndef __ASSEMBLY__
++#if ((!defined __ASSEMBLY__) && (defined __KERNEL__))
+ 
+ #include <linux/linkage.h>
+ #include <linux/compiler.h>
+@@ -730,7 +730,7 @@
+ 				struct sigaction __user *oact,
+ 				size_t sigsetsize);
+ 
+-#endif	/* __ASSEMBLY__ */
++#endif /* ((!defined __ASSEMBLY__) && (defined __KERNEL__) */
+ 
+ #endif /* __NO_STUBS */
+ 
diff --git a/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch
new file mode 100644
index 00000000..326cdcda
--- /dev/null
+++ b/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch
@@ -0,0 +1,28 @@
+Lets you run 'make oldconfig' and 'make menuconfig' on systems
+where shared libraries aren't easy.  (There's no harm in using the
+static version of libkconfig.)
+Idea mentioned by Bertrand Marquis, but this patch is a bit simpler than his.
+
+
+--- linux-2.6.8.1/scripts/kconfig/Makefile.old	2004-09-09 20:30:25.000000000 -0700
++++ linux-2.6.8.1/scripts/kconfig/Makefile	2004-09-09 20:47:51.000000000 -0700
+@@ -68,8 +68,8 @@
+ libkconfig-objs := zconf.tab.o
+ 
+ host-progs	:= conf mconf qconf gconf
+-conf-objs	:= conf.o  libkconfig.so
+-mconf-objs	:= mconf.o libkconfig.so
++conf-objs	:= conf.o  $(libkconfig-objs)
++mconf-objs	:= mconf.o $(libkconfig-objs)
+ 
+ ifeq ($(MAKECMDGOALS),xconfig)
+ 	qconf-target := 1
+@@ -88,7 +88,7 @@
+ gconf-objs	:= gconf.o kconfig_load.o
+ endif
+ 
+-clean-files	:= libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \
++clean-files	:= $(libkconfig-objs) lkc_defs.h qconf.moc .tmp_qtcheck \
+ 		   .tmp_gtkcheck zconf.tab.c zconf.tab.h lex.zconf.c
+ 
+ # generated files seem to need this to find local include files
diff --git a/patches/linux/2.6.7/kaz-types.patch b/patches/linux/2.6.7/kaz-types.patch
new file mode 100644
index 00000000..ec5de36a
--- /dev/null
+++ b/patches/linux/2.6.7/kaz-types.patch
@@ -0,0 +1,60 @@
+The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4:
+
+In file included from sys/ustat.h:30,
+                 from ../sysdeps/unix/sysv/linux/ustat.c:21:
+../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat'
+make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1
+make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc'
+make[1]: *** [misc/subdir_lib] Error 2
+make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+----------- snip ---------------
+
+Date: Fri, 06 Jun 2003 08:00:00 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32:
+ error: redefinition of `struct user_fpu_struct'"
+To: linux-sh@m17n.org
+Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> When I try to build glibc-2.3.2 for sh4, it fails with the error
+[snip]
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct'
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user'
+[snip]
+> The error reminds me of the kind of thing fixed by
+> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch
+
+It seems that the definitions in asm/user.h and the above patch collide.
+I'm not sure why you need this patch, but is it needed for the problem
+about struct ustat that you pointed out in this list, isn't it?
+I found why I don't hit ustat problem - my local kernel tree includes
+the following patch, though I can't recall about it.
+
+Regards,
+	kaz
+--
+diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h
+--- linux-2.5.69-sf-orig/include/linux/types.h	Wed Mar  5 12:29:34 2003
++++ sh4-unknown-linux-gnu/include/linux/types.h	Sat Apr 19 10:05:52 2003
+@@ -141,6 +141,7 @@
+ 
+ #endif /* __KERNEL_STRICT_NAMES */
+ 
++#ifdef	__KERNEL__
+ /*
+  * Below are truly Linux-specific types that should never collide with
+  * any application/library that wants linux/types.h.
+@@ -152,5 +153,6 @@
+ 	char			f_fname[6];
+ 	char			f_fpack[6];
+ };
++#endif
+ 
+ #endif /* _LINUX_TYPES_H */
+
+
diff --git a/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch b/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch
new file mode 100644
index 00000000..c9e0dd3c
--- /dev/null
+++ b/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch
@@ -0,0 +1,679 @@
+Submitted By: Martin Schaffner <schaffner@gmx.li>
+Date: 2004-06-19
+Initial Package Version: 2.6.7
+Upstream Status: Not submitted
+Origin: Martin Schaffner
+Description: Enables build on case-insensitive file systems
+URL: http://mirror.vtx.ch/lfs/patches/downloads/linux/linux-2.6.7-build_on_case_insensitive_fs-1.patch
+
+diff -ur linux-2.6.7/Makefile linux-2.6.7-mod/Makefile
+--- linux-2.6.7/Makefile	Fri Jun 18 22:51:03 2004
++++ linux-2.6.7-mod/Makefile	Sat Jun 19 12:43:10 2004
+@@ -549,7 +549,7 @@
+ 	$(NM) $@ | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
+ endef
+ 
+-LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.s
++LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.asm
+ 
+ #	Generate section listing all symbols and add it into vmlinux
+ #	It's a three stage process:
+@@ -575,23 +575,23 @@
+ .tmp_kallsyms%.S: .tmp_vmlinux%
+ 	$(call cmd,kallsyms)
+ 
+-.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	+$(call if_changed_rule,vmlinux__)
+ 
+-.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux__)
+ 
+ endif
+ 
+ #	Finally the vmlinux rule
+ 
+-vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux)
+ 
+ #	The actual objects are generated when descending, 
+ #	make sure no implicit rule kicks in
+ 
+-$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(vmlinux-dirs) ;
++$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.asm: $(vmlinux-dirs) ;
+ 
+ # 	Handle descending into subdirectories listed in $(vmlinux-dirs)
+ 
+@@ -640,7 +640,7 @@
+ # Single targets
+ # ---------------------------------------------------------------------------
+ 
+-%.s: %.c scripts FORCE
++%.asm: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+ %.i: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+@@ -650,7 +650,7 @@
+ 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D)
+ %.lst: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+-%.s: %.S scripts FORCE
++%.asm: %.S scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+ %.o: %.S scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+diff -ur linux-2.6.7/arch/alpha/Makefile linux-2.6.7-mod/arch/alpha/Makefile
+--- linux-2.6.7/arch/alpha/Makefile	Fri Jun 18 22:51:03 2004
++++ linux-2.6.7-mod/arch/alpha/Makefile	Sat Jun 19 12:46:32 2004
+@@ -114,10 +114,10 @@
+ 
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/alpha/kernel/Makefile linux-2.6.7-mod/arch/alpha/kernel/Makefile
+--- linux-2.6.7/arch/alpha/kernel/Makefile	Mon May 10 04:32:29 2004
++++ linux-2.6.7-mod/arch/alpha/kernel/Makefile	Sat Jun 19 12:46:48 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y		:= head.o vmlinux.lds.s
++extra-y		:= head.o vmlinux.lds.asm
+ EXTRA_AFLAGS	:= $(CFLAGS)
+ EXTRA_CFLAGS	:= -Werror -Wno-sign-compare
+ 
+diff -ur linux-2.6.7/arch/arm/Makefile linux-2.6.7-mod/arch/arm/Makefile
+--- linux-2.6.7/arch/arm/Makefile	Fri Jun 18 22:51:04 2004
++++ linux-2.6.7-mod/arch/arm/Makefile	Sat Jun 19 12:47:07 2004
+@@ -175,10 +175,10 @@
+ i:;	$(Q)$(MAKE) $(build)=$(boot) install
+ zi:;	$(Q)$(MAKE) $(build)=$(boot) zinstall
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/asm-arm/.arch
+ 
+-include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/arm/kernel/Makefile linux-2.6.7-mod/arch/arm/kernel/Makefile
+--- linux-2.6.7/arch/arm/kernel/Makefile	Mon May 10 04:33:19 2004
++++ linux-2.6.7-mod/arch/arm/kernel/Makefile	Sat Jun 19 12:47:25 2004
+@@ -27,7 +27,7 @@
+ head-y			:= head.o
+ obj-$(CONFIG_DEBUG_LL)	+= debug.o
+ 
+-extra-y := $(head-y) init_task.o vmlinux.lds.s
++extra-y := $(head-y) init_task.o vmlinux.lds.asm
+ 
+ # Spell out some dependencies that aren't automatically figured out
+ $(obj)/entry-armv.o: 	$(obj)/entry-header.S include/asm-arm/constants.h
+diff -ur linux-2.6.7/arch/arm26/Makefile linux-2.6.7-mod/arch/arm26/Makefile
+--- linux-2.6.7/arch/arm26/Makefile	Mon May 10 04:32:28 2004
++++ linux-2.6.7-mod/arch/arm26/Makefile	Sat Jun 19 12:48:24 2004
+@@ -101,10 +101,10 @@
+ 	fi; \
+ 	)
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/arm26/kernel/Makefile linux-2.6.7-mod/arch/arm26/kernel/Makefile
+--- linux-2.6.7/arch/arm26/kernel/Makefile	Mon May 10 04:32:29 2004
++++ linux-2.6.7-mod/arch/arm26/kernel/Makefile	Sat Jun 19 12:48:30 2004
+@@ -14,5 +14,5 @@
+ obj-$(CONFIG_FIQ)		+= fiq.o
+ obj-$(CONFIG_MODULES)		+= armksyms.o
+ 
+-extra-y := init_task.o vmlinux.lds.s
++extra-y := init_task.o vmlinux.lds.asm
+ 
+diff -ur linux-2.6.7/arch/cris/Makefile linux-2.6.7-mod/arch/cris/Makefile
+--- linux-2.6.7/arch/cris/Makefile	Fri Jun 18 22:51:07 2004
++++ linux-2.6.7-mod/arch/cris/Makefile	Sat Jun 19 12:48:47 2004
+@@ -107,8 +107,8 @@
+ 	@ln -sf $(SARCH) include/asm-$(ARCH)/arch
+ 	@touch $@
+ 
+-arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 					include/config/MARKER
+ 
+-include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+diff -ur linux-2.6.7/arch/cris/kernel/Makefile linux-2.6.7-mod/arch/cris/kernel/Makefile
+--- linux-2.6.7/arch/cris/kernel/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/cris/kernel/Makefile	Sat Jun 19 12:48:53 2004
+@@ -3,7 +3,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y	:= vmlinux.lds.s
++extra-y	:= vmlinux.lds.asm
+ 
+ obj-y   := process.o traps.o irq.o ptrace.o setup.o \
+ 	   time.o sys_cris.o semaphore.o
+diff -ur linux-2.6.7/arch/h8300/Makefile linux-2.6.7-mod/arch/h8300/Makefile
+--- linux-2.6.7/arch/h8300/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/h8300/Makefile	Sat Jun 19 12:49:12 2004
+@@ -64,7 +64,7 @@
+ 
+ prepare: include/asm-$(ARCH)/asm-offsets.h
+ 
+-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \
+ 				   include/asm include/linux/version.h
+ 	$(call filechk,gen-asm-offsets)
+ 
+diff -ur linux-2.6.7/arch/h8300/kernel/Makefile linux-2.6.7-mod/arch/h8300/kernel/Makefile
+--- linux-2.6.7/arch/h8300/kernel/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/h8300/kernel/Makefile	Sat Jun 19 12:49:32 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y := process.o traps.o ptrace.o ints.o \
+ 	 sys_h8300.o time.o semaphore.o signal.o \
+diff -ur linux-2.6.7/arch/i386/Makefile linux-2.6.7-mod/arch/i386/Makefile
+--- linux-2.6.7/arch/i386/Makefile	Fri Jun 18 22:51:10 2004
++++ linux-2.6.7-mod/arch/i386/Makefile	Sat Jun 19 12:49:43 2004
+@@ -141,10 +141,10 @@
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/i386/kernel/Makefile linux-2.6.7-mod/arch/i386/kernel/Makefile
+--- linux-2.6.7/arch/i386/kernel/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/i386/kernel/Makefile	Sat Jun 19 12:49:54 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y := head.o init_task.o vmlinux.lds.s
++extra-y := head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
+ 		ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \
+diff -ur linux-2.6.7/arch/ia64/Makefile linux-2.6.7-mod/arch/ia64/Makefile
+--- linux-2.6.7/arch/ia64/Makefile	Mon May 10 04:31:59 2004
++++ linux-2.6.7-mod/arch/ia64/Makefile	Sat Jun 19 12:50:12 2004
+@@ -88,12 +88,12 @@
+ 
+ prepare: include/asm-ia64/offsets.h
+ 
+-arch/ia64/kernel/asm-offsets.s: include/asm include/linux/version.h include/config/MARKER
++arch/ia64/kernel/asm-offsets.asm: include/asm include/linux/version.h include/config/MARKER
+ 
+-include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.s
++include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+-arch/ia64/kernel/asm-offsets.s: include/asm-ia64/.offsets.h.stamp
++arch/ia64/kernel/asm-offsets.asm: include/asm-ia64/.offsets.h.stamp
+ 
+ include/asm-ia64/.offsets.h.stamp:
+ 	mkdir -p include/asm-ia64
+diff -ur linux-2.6.7/arch/ia64/kernel/Makefile linux-2.6.7-mod/arch/ia64/kernel/Makefile
+--- linux-2.6.7/arch/ia64/kernel/Makefile	Fri Jun 18 22:51:13 2004
++++ linux-2.6.7-mod/arch/ia64/kernel/Makefile	Sat Jun 19 12:52:14 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y	:= head.o init_task.o vmlinux.lds.s
++extra-y	:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o	\
+ 	 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o		\
+@@ -21,7 +21,7 @@
+ # The gate DSO image is built using a special linker script.
+ targets += gate.so gate-syms.o
+ 
+-extra-y += gate.so gate-syms.o gate.lds.s gate.o
++extra-y += gate.so gate-syms.o gate.lds.asm gate.o
+ 
+ # fp_emulate() expects f2-f5,f16-f31 to contain the user-level state.
+ CFLAGS_traps.o  += -mfixed-range=f2-f5,f16-f31
+@@ -32,14 +32,14 @@
+       cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@
+ 
+ GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1
+-$(obj)/gate.so: $(obj)/gate.lds.s $(obj)/gate.o FORCE
++$(obj)/gate.so: $(obj)/gate.lds.asm $(obj)/gate.o FORCE
+ 	$(call if_changed,gate)
+ 
+ $(obj)/built-in.o: $(obj)/gate-syms.o
+ $(obj)/built-in.o: ld_flags += -R $(obj)/gate-syms.o
+ 
+ GATECFLAGS_gate-syms.o = -r
+-$(obj)/gate-syms.o: $(src)/gate.lds.s $(obj)/gate.o FORCE
++$(obj)/gate-syms.o: $(src)/gate.lds.asm $(obj)/gate.o FORCE
+ 	$(call if_changed,gate)
+ 
+ # gate-data.o contains the gate DSO image as data in section .data.gate.
+diff -ur linux-2.6.7/arch/m68k/Makefile linux-2.6.7-mod/arch/m68k/Makefile
+--- linux-2.6.7/arch/m68k/Makefile	Fri Jun 18 22:51:14 2004
++++ linux-2.6.7-mod/arch/m68k/Makefile	Sat Jun 19 12:52:30 2004
+@@ -114,10 +114,10 @@
+ prepare: include/asm-$(ARCH)/offsets.h
+ CLEAN_FILES += include/asm-$(ARCH)/offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/m68k/kernel/Makefile linux-2.6.7-mod/arch/m68k/kernel/Makefile
+--- linux-2.6.7/arch/m68k/kernel/Makefile	Mon May 10 04:33:10 2004
++++ linux-2.6.7-mod/arch/m68k/kernel/Makefile	Sat Jun 19 12:52:35 2004
+@@ -7,7 +7,7 @@
+ else
+   extra-y := sun3-head.o
+ endif
+-extra-y	+= vmlinux.lds.s
++extra-y	+= vmlinux.lds.asm
+ 
+ obj-y		:= entry.o process.o traps.o ints.o signal.o ptrace.o \
+ 			sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
+diff -ur linux-2.6.7/arch/m68knommu/Makefile linux-2.6.7-mod/arch/m68knommu/Makefile
+--- linux-2.6.7/arch/m68knommu/Makefile	Mon May 10 04:32:54 2004
++++ linux-2.6.7-mod/arch/m68knommu/Makefile	Sat Jun 19 12:52:57 2004
+@@ -89,7 +89,7 @@
+ head-y := arch/m68knommu/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o
+ 
+ CLEAN_FILES := include/asm-$(ARCH)/asm-offsets.h \
+-	       arch/$(ARCH)/kernel/asm-offsets.s
++	       arch/$(ARCH)/kernel/asm-offsets.asm
+ 
+ core-y	+= arch/m68knommu/kernel/ \
+ 	   arch/m68knommu/mm/ \
+@@ -102,7 +102,7 @@
+ archclean:
+ 	$(call descend arch/$(ARCH)/boot, subdirclean)
+ 
+-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \
+ 				   include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 	$(call filechk,gen-asm-offsets)
+diff -ur linux-2.6.7/arch/m68knommu/kernel/Makefile linux-2.6.7-mod/arch/m68knommu/kernel/Makefile
+--- linux-2.6.7/arch/m68knommu/kernel/Makefile	Mon May 10 04:32:26 2004
++++ linux-2.6.7-mod/arch/m68knommu/kernel/Makefile	Sat Jun 19 12:53:20 2004
+@@ -2,7 +2,7 @@
+ # Makefile for arch/m68knommu/kernel.
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y += dma.o entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \
+ 	 setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o
+diff -ur linux-2.6.7/arch/mips/Makefile linux-2.6.7-mod/arch/mips/Makefile
+--- linux-2.6.7/arch/mips/Makefile	Fri Jun 18 22:51:19 2004
++++ linux-2.6.7-mod/arch/mips/Makefile	Sat Jun 19 12:53:35 2004
+@@ -752,12 +752,12 @@
+ prepare: include/asm-$(ARCH)/offset.h \
+ 	 include/asm-$(ARCH)/reg.h
+ 
+-arch/$(ARCH)/kernel/offset.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/offset.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.s
++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.asm
+ 	$(call filechk,gen-asm-offset.h)
+-include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.s
++include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.asm
+ 	$(call filechk,gen-asm-reg.h)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offset.h.tmp \
+diff -ur linux-2.6.7/arch/mips/kernel/Makefile linux-2.6.7-mod/arch/mips/kernel/Makefile
+--- linux-2.6.7/arch/mips/kernel/Makefile	Mon May 10 04:32:28 2004
++++ linux-2.6.7-mod/arch/mips/kernel/Makefile	Sat Jun 19 12:53:41 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the Linux/MIPS kernel.
+ #
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y		+= cpu-probe.o branch.o entry.o genex.o irq.o process.o \
+ 		   ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \
+diff -ur linux-2.6.7/arch/parisc/Makefile linux-2.6.7-mod/arch/parisc/Makefile
+--- linux-2.6.7/arch/parisc/Makefile	Fri Jun 18 22:51:21 2004
++++ linux-2.6.7-mod/arch/parisc/Makefile	Sat Jun 19 12:53:47 2004
+@@ -88,10 +88,10 @@
+ 
+ prepare: include/asm-parisc/offsets.h
+ 
+-arch/parisc/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/parisc/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.s
++include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES	+= lifimage include/asm-parisc/offsets.h
+diff -ur linux-2.6.7/arch/parisc/kernel/Makefile linux-2.6.7-mod/arch/parisc/kernel/Makefile
+--- linux-2.6.7/arch/parisc/kernel/Makefile	Fri Jun 18 22:51:21 2004
++++ linux-2.6.7-mod/arch/parisc/kernel/Makefile	Sat Jun 19 12:53:53 2004
+@@ -4,7 +4,7 @@
+ 
+ head-y			:= head.o
+ head-$(CONFIG_PARISC64)	:= head64.o
+-extra-y			:= init_task.o $(head-y) vmlinux.lds.s
++extra-y			:= init_task.o $(head-y) vmlinux.lds.asm
+ 
+ AFLAGS_entry.o	:= -traditional
+ AFLAGS_pacache.o := -traditional
+diff -ur linux-2.6.7/arch/ppc/Makefile linux-2.6.7-mod/arch/ppc/Makefile
+--- linux-2.6.7/arch/ppc/Makefile	Fri Jun 18 22:51:22 2004
++++ linux-2.6.7-mod/arch/ppc/Makefile	Sat Jun 19 12:54:09 2004
+@@ -78,10 +78,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offsets.h checkbin
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ ifdef CONFIG_6xx
+@@ -104,4 +104,4 @@
+ endif
+ 
+ CLEAN_FILES +=	include/asm-$(ARCH)/offsets.h \
+-		arch/$(ARCH)/kernel/asm-offsets.s
++		arch/$(ARCH)/kernel/asm-offsets.asm
+diff -ur linux-2.6.7/arch/ppc/kernel/Makefile linux-2.6.7-mod/arch/ppc/kernel/Makefile
+--- linux-2.6.7/arch/ppc/kernel/Makefile	Fri Jun 18 22:51:24 2004
++++ linux-2.6.7-mod/arch/ppc/kernel/Makefile	Sat Jun 19 12:43:10 2004
+@@ -15,7 +15,7 @@
+ extra-$(CONFIG_8xx)		:= head_8xx.o
+ extra-$(CONFIG_6xx)		+= idle_6xx.o
+ extra-$(CONFIG_POWER4)		+= idle_power4.o
+-extra-y				+= vmlinux.lds.s
++extra-y				+= vmlinux.lds.asm
+ 
+ obj-y				:= entry.o traps.o irq.o idle.o time.o misc.o \
+ 					process.o signal.o ptrace.o align.o \
+diff -ur linux-2.6.7/arch/ppc64/Makefile linux-2.6.7-mod/arch/ppc64/Makefile
+--- linux-2.6.7/arch/ppc64/Makefile	Fri Jun 18 22:51:26 2004
++++ linux-2.6.7-mod/arch/ppc64/Makefile	Sat Jun 19 12:54:32 2004
+@@ -67,10 +67,10 @@
+ 
+ prepare: include/asm-ppc64/offsets.h
+ 
+-arch/ppc64/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/ppc64/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s
++include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/ppc64/kernel/Makefile linux-2.6.7-mod/arch/ppc64/kernel/Makefile
+--- linux-2.6.7/arch/ppc64/kernel/Makefile	Mon May 10 04:33:20 2004
++++ linux-2.6.7-mod/arch/ppc64/kernel/Makefile	Sat Jun 19 12:54:39 2004
+@@ -3,7 +3,7 @@
+ #
+ 
+ EXTRA_CFLAGS	+= -mno-minimal-toc
+-extra-y		:= head.o vmlinux.lds.s
++extra-y		:= head.o vmlinux.lds.asm
+ 
+ obj-y               :=	setup.o entry.o traps.o irq.o idle.o dma.o \
+ 			time.o process.o signal.o syscalls.o misc.o ptrace.o \
+diff -ur linux-2.6.7/arch/s390/Makefile linux-2.6.7-mod/arch/s390/Makefile
+--- linux-2.6.7/arch/s390/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/s390/Makefile	Sat Jun 19 12:54:46 2004
+@@ -68,10 +68,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offsets.h
+diff -ur linux-2.6.7/arch/s390/kernel/Makefile linux-2.6.7-mod/arch/s390/kernel/Makefile
+--- linux-2.6.7/arch/s390/kernel/Makefile	Mon May 10 04:33:20 2004
++++ linux-2.6.7-mod/arch/s390/kernel/Makefile	Sat Jun 19 12:54:52 2004
+@@ -10,7 +10,7 @@
+ 
+ extra-$(CONFIG_ARCH_S390_31)	+= head.o 
+ extra-$(CONFIG_ARCH_S390X)	+= head64.o 
+-extra-y				+= init_task.o vmlinux.lds.s
++extra-y				+= init_task.o vmlinux.lds.asm
+ 
+ obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
+ obj-$(CONFIG_SMP)		+= smp.o
+diff -ur linux-2.6.7/arch/sh/kernel/Makefile linux-2.6.7-mod/arch/sh/kernel/Makefile
+--- linux-2.6.7/arch/sh/kernel/Makefile	Mon May 10 04:32:39 2004
++++ linux-2.6.7-mod/arch/sh/kernel/Makefile	Sat Jun 19 12:55:33 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the Linux/SuperH kernel.
+ #
+ 
+-extra-y	:= head.o init_task.o vmlinux.lds.s
++extra-y	:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y	:= process.o signal.o entry.o traps.o irq.o \
+ 	ptrace.o setup.o time.o sys_sh.o semaphore.o \
+diff -ur linux-2.6.7/arch/sparc/Makefile linux-2.6.7-mod/arch/sparc/Makefile
+--- linux-2.6.7/arch/sparc/Makefile	Fri Jun 18 22:51:29 2004
++++ linux-2.6.7-mod/arch/sparc/Makefile	Sat Jun 19 12:55:48 2004
+@@ -61,14 +61,14 @@
+ 
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES +=	include/asm-$(ARCH)/asm_offsets.h	\
+-		arch/$(ARCH)/kernel/asm-offsets.s	\
++		arch/$(ARCH)/kernel/asm-offsets.asm	\
+ 		arch/$(ARCH)/boot/System.map
+ 
+ # Don't use tabs in echo arguments.
+diff -ur linux-2.6.7/arch/sparc/kernel/Makefile linux-2.6.7-mod/arch/sparc/kernel/Makefile
+--- linux-2.6.7/arch/sparc/kernel/Makefile	Mon May 10 04:33:13 2004
++++ linux-2.6.7-mod/arch/sparc/kernel/Makefile	Sat Jun 19 12:55:52 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ EXTRA_AFLAGS	:= -ansi
+ 
+diff -ur linux-2.6.7/arch/sparc64/kernel/Makefile linux-2.6.7-mod/arch/sparc64/kernel/Makefile
+--- linux-2.6.7/arch/sparc64/kernel/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/sparc64/kernel/Makefile	Sat Jun 19 12:56:24 2004
+@@ -5,7 +5,7 @@
+ EXTRA_AFLAGS := -ansi
+ EXTRA_CFLAGS := -Werror
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y		:= process.o setup.o cpu.o idprom.o \
+ 		   traps.o devices.o auxio.o \
+diff -ur linux-2.6.7/arch/um/Makefile linux-2.6.7-mod/arch/um/Makefile
+--- linux-2.6.7/arch/um/Makefile	Mon May 10 04:32:52 2004
++++ linux-2.6.7-mod/arch/um/Makefile	Sat Jun 19 12:57:07 2004
+@@ -77,7 +77,7 @@
+ # CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case.
+ 
+ LINK_TT = -static
+-LD_SCRIPT_TT := uml.lds.s
++LD_SCRIPT_TT := uml.lds.asm
+ 
+ ifeq ($(CONFIG_STATIC_LINK),y)
+   LINK-y += $(LINK_TT)
+@@ -103,11 +103,11 @@
+ 	-DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE_TT) \
+ 	-DKERNEL_STACK_SIZE=$(STACK_SIZE)
+ 
+-AFLAGS_$(LD_SCRIPT-y:.s=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum
++AFLAGS_$(LD_SCRIPT-y:.asm=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum
+ 
+ LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y)
+ 
+-$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.s=.S) scripts FORCE
++$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.asm=.S) scripts FORCE
+ 	$(call if_changed_dep,as_s_S)
+ 
+ linux: vmlinux $(LD_SCRIPT-y)
+@@ -122,8 +122,8 @@
+ # To get a definition of F_SETSIG
+ USER_CFLAGS += -D_GNU_SOURCE
+ 
+-CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.s \
+-	$(ARCH_DIR)/dyn_link.ld.s $(GEN_HEADERS)
++CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.asm \
++	$(ARCH_DIR)/dyn_link.ld.asm $(GEN_HEADERS)
+ 
+ $(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c
+ 	$(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
+diff -ur linux-2.6.7/arch/um/kernel/Makefile linux-2.6.7-mod/arch/um/kernel/Makefile
+--- linux-2.6.7/arch/um/kernel/Makefile	Mon May 10 04:32:53 2004
++++ linux-2.6.7-mod/arch/um/kernel/Makefile	Sat Jun 19 12:57:15 2004
+@@ -3,7 +3,7 @@
+ # Licensed under the GPL
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \
+ 	helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \
+diff -ur linux-2.6.7/arch/v850/Makefile linux-2.6.7-mod/arch/v850/Makefile
+--- linux-2.6.7/arch/v850/Makefile	Mon May 10 04:33:21 2004
++++ linux-2.6.7-mod/arch/v850/Makefile	Sat Jun 19 12:57:59 2004
+@@ -52,12 +52,12 @@
+ prepare: include/asm-$(ARCH)/asm-consts.h
+ 
+ # Generate constants from C code for use by asm files
+-arch/$(ARCH)/kernel/asm-consts.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-consts.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.s
++include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/asm-consts.h \
+-	       arch/$(ARCH)/kernel/asm-consts.s \
++	       arch/$(ARCH)/kernel/asm-consts.asm \
+ 	       root_fs_image.o
+diff -ur linux-2.6.7/arch/v850/kernel/Makefile linux-2.6.7-mod/arch/v850/kernel/Makefile
+--- linux-2.6.7/arch/v850/kernel/Makefile	Mon May 10 04:33:21 2004
++++ linux-2.6.7-mod/arch/v850/kernel/Makefile	Sat Jun 19 12:58:04 2004
+@@ -9,7 +9,7 @@
+ # for more details.
+ #
+ 
+-extra-y := head.o init_task.o vmlinux.lds.s
++extra-y := head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y += intv.o entry.o process.o syscalls.o time.o semaphore.o setup.o \
+ 	 signal.o irq.o mach.o ptrace.o bug.o
+diff -ur linux-2.6.7/arch/x86_64/Makefile linux-2.6.7-mod/arch/x86_64/Makefile
+--- linux-2.6.7/arch/x86_64/Makefile	Mon May 10 04:33:19 2004
++++ linux-2.6.7-mod/arch/x86_64/Makefile	Sat Jun 19 12:58:10 2004
+@@ -93,10 +93,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offset.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offset.h
+diff -ur linux-2.6.7/arch/x86_64/kernel/Makefile linux-2.6.7-mod/arch/x86_64/kernel/Makefile
+--- linux-2.6.7/arch/x86_64/kernel/Makefile	Fri Jun 18 22:51:32 2004
++++ linux-2.6.7-mod/arch/x86_64/kernel/Makefile	Sat Jun 19 12:58:17 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y 	:= head.o head64.o init_task.o vmlinux.lds.s
++extra-y 	:= head.o head64.o init_task.o vmlinux.lds.asm
+ EXTRA_AFLAGS	:= -traditional
+ obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o \
+ 		ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \
+diff -ur linux-2.6.7/scripts/Makefile.build linux-2.6.7-mod/scripts/Makefile.build
+--- linux-2.6.7/scripts/Makefile.build	Mon May 10 04:33:13 2004
++++ linux-2.6.7-mod/scripts/Makefile.build	Sat Jun 19 12:43:10 2004
+@@ -110,7 +110,7 @@
+ quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
+ cmd_cc_s_c       = $(CC) $(c_flags) -S -o $@ $< 
+ 
+-%.s: %.c FORCE
++%.asm: %.c FORCE
+ 	$(call if_changed_dep,cc_s_c)
+ 
+ quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
+@@ -197,7 +197,7 @@
+ quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
+ cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $< 
+ 
+-%.s: %.S FORCE
++%.asm: %.S FORCE
+ 	$(call if_changed_dep,as_s_S)
+ 
+ quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
diff --git a/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch
new file mode 100644
index 00000000..326cdcda
--- /dev/null
+++ b/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch
@@ -0,0 +1,28 @@
+Lets you run 'make oldconfig' and 'make menuconfig' on systems
+where shared libraries aren't easy.  (There's no harm in using the
+static version of libkconfig.)
+Idea mentioned by Bertrand Marquis, but this patch is a bit simpler than his.
+
+
+--- linux-2.6.8.1/scripts/kconfig/Makefile.old	2004-09-09 20:30:25.000000000 -0700
++++ linux-2.6.8.1/scripts/kconfig/Makefile	2004-09-09 20:47:51.000000000 -0700
+@@ -68,8 +68,8 @@
+ libkconfig-objs := zconf.tab.o
+ 
+ host-progs	:= conf mconf qconf gconf
+-conf-objs	:= conf.o  libkconfig.so
+-mconf-objs	:= mconf.o libkconfig.so
++conf-objs	:= conf.o  $(libkconfig-objs)
++mconf-objs	:= mconf.o $(libkconfig-objs)
+ 
+ ifeq ($(MAKECMDGOALS),xconfig)
+ 	qconf-target := 1
+@@ -88,7 +88,7 @@
+ gconf-objs	:= gconf.o kconfig_load.o
+ endif
+ 
+-clean-files	:= libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \
++clean-files	:= $(libkconfig-objs) lkc_defs.h qconf.moc .tmp_qtcheck \
+ 		   .tmp_gtkcheck zconf.tab.c zconf.tab.h lex.zconf.c
+ 
+ # generated files seem to need this to find local include files
diff --git a/patches/linux/2.6.8/kaz-types.patch b/patches/linux/2.6.8/kaz-types.patch
new file mode 100644
index 00000000..ec5de36a
--- /dev/null
+++ b/patches/linux/2.6.8/kaz-types.patch
@@ -0,0 +1,60 @@
+The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4:
+
+In file included from sys/ustat.h:30,
+                 from ../sysdeps/unix/sysv/linux/ustat.c:21:
+../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat'
+make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1
+make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc'
+make[1]: *** [misc/subdir_lib] Error 2
+make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2'
+make: *** [all] Error 2
+
+----------- snip ---------------
+
+Date: Fri, 06 Jun 2003 08:00:00 +0900
+From: kaz Kojima <kkojima@rr.iij4u.or.jp>
+Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32:
+ error: redefinition of `struct user_fpu_struct'"
+To: linux-sh@m17n.org
+Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp>
+
+Hi,
+
+Dan Kegel <dank@kegel.com> wrote:
+> When I try to build glibc-2.3.2 for sh4, it fails with the error
+[snip]
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct'
+> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user'
+[snip]
+> The error reminds me of the kind of thing fixed by
+> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch
+
+It seems that the definitions in asm/user.h and the above patch collide.
+I'm not sure why you need this patch, but is it needed for the problem
+about struct ustat that you pointed out in this list, isn't it?
+I found why I don't hit ustat problem - my local kernel tree includes
+the following patch, though I can't recall about it.
+
+Regards,
+	kaz
+--
+diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h
+--- linux-2.5.69-sf-orig/include/linux/types.h	Wed Mar  5 12:29:34 2003
++++ sh4-unknown-linux-gnu/include/linux/types.h	Sat Apr 19 10:05:52 2003
+@@ -141,6 +141,7 @@
+ 
+ #endif /* __KERNEL_STRICT_NAMES */
+ 
++#ifdef	__KERNEL__
+ /*
+  * Below are truly Linux-specific types that should never collide with
+  * any application/library that wants linux/types.h.
+@@ -152,5 +153,6 @@
+ 	char			f_fname[6];
+ 	char			f_fpack[6];
+ };
++#endif
+ 
+ #endif /* _LINUX_TYPES_H */
+
+
diff --git a/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch b/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch
new file mode 100644
index 00000000..71d4e23e
--- /dev/null
+++ b/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch
@@ -0,0 +1,138 @@
+Fixes
+
+In file included from include/asm/thread_info.h:16,
+                 from include/linux/thread_info.h:21,
+                 from include/linux/spinlock.h:12,
+                 from include/linux/capability.h:45,
+                 from include/linux/sched.h:7,
+                 from arch/i386/kernel/asm-offsets.c:7:
+include/asm/processor.h:87: error: array type has incomplete element type
+make[1]: *** [arch/i386/kernel/asm-offsets.asm] Error 1
+
+--- linux-2.6.8/include/asm-i386/processor.h.old	Tue Mar 15 00:14:42 2005
++++ linux-2.6.8/include/asm-i386/processor.h	Tue Mar 15 00:18:45 2005
+@@ -79,6 +79,58 @@
+ #define X86_VENDOR_UNKNOWN 0xff
+ 
+ /*
++ * Size of io_bitmap.
++ */
++#define IO_BITMAP_BITS  65536
++#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
++#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
++#define INVALID_IO_BITMAP_OFFSET 0x8000
++
++struct tss_struct {
++	unsigned short	back_link,__blh;
++	unsigned long	esp0;
++	unsigned short	ss0,__ss0h;
++	unsigned long	esp1;
++	unsigned short	ss1,__ss1h;	/* ss1 is used to cache MSR_IA32_SYSENTER_CS */
++	unsigned long	esp2;
++	unsigned short	ss2,__ss2h;
++	unsigned long	__cr3;
++	unsigned long	eip;
++	unsigned long	eflags;
++	unsigned long	eax,ecx,edx,ebx;
++	unsigned long	esp;
++	unsigned long	ebp;
++	unsigned long	esi;
++	unsigned long	edi;
++	unsigned short	es, __esh;
++	unsigned short	cs, __csh;
++	unsigned short	ss, __ssh;
++	unsigned short	ds, __dsh;
++	unsigned short	fs, __fsh;
++	unsigned short	gs, __gsh;
++	unsigned short	ldt, __ldth;
++	unsigned short	trace, io_bitmap_base;
++	/*
++	 * The extra 1 is there because the CPU will access an
++	 * additional byte beyond the end of the IO permission
++	 * bitmap. The extra byte must be all 1 bits, and must
++	 * be within the limit.
++	 */
++	unsigned long	io_bitmap[IO_BITMAP_LONGS + 1];
++	/*
++	 * pads the TSS to be cacheline-aligned (size is 0x100)
++	 */
++	unsigned long __cacheline_filler[37];
++	/*
++	 * .. and then another 0x100 bytes for emergency kernel stack
++	 */
++	unsigned long stack[64];
++} __attribute__((packed));
++
++#define ARCH_MIN_TASKALIGN	16
++
++/*
+  * capabilities of CPUs
+  */
+ 
+@@ -296,15 +348,6 @@
+  */
+ #define TASK_UNMAPPED_BASE	(PAGE_ALIGN(TASK_SIZE / 3))
+ 
+-/*
+- * Size of io_bitmap.
+- */
+-#define IO_BITMAP_BITS  65536
+-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
+-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
+-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+-#define INVALID_IO_BITMAP_OFFSET 0x8000
+-
+ struct i387_fsave_struct {
+ 	long	cwd;
+ 	long	swd;
+@@ -356,49 +399,6 @@
+ typedef struct {
+ 	unsigned long seg;
+ } mm_segment_t;
+-
+-struct tss_struct {
+-	unsigned short	back_link,__blh;
+-	unsigned long	esp0;
+-	unsigned short	ss0,__ss0h;
+-	unsigned long	esp1;
+-	unsigned short	ss1,__ss1h;	/* ss1 is used to cache MSR_IA32_SYSENTER_CS */
+-	unsigned long	esp2;
+-	unsigned short	ss2,__ss2h;
+-	unsigned long	__cr3;
+-	unsigned long	eip;
+-	unsigned long	eflags;
+-	unsigned long	eax,ecx,edx,ebx;
+-	unsigned long	esp;
+-	unsigned long	ebp;
+-	unsigned long	esi;
+-	unsigned long	edi;
+-	unsigned short	es, __esh;
+-	unsigned short	cs, __csh;
+-	unsigned short	ss, __ssh;
+-	unsigned short	ds, __dsh;
+-	unsigned short	fs, __fsh;
+-	unsigned short	gs, __gsh;
+-	unsigned short	ldt, __ldth;
+-	unsigned short	trace, io_bitmap_base;
+-	/*
+-	 * The extra 1 is there because the CPU will access an
+-	 * additional byte beyond the end of the IO permission
+-	 * bitmap. The extra byte must be all 1 bits, and must
+-	 * be within the limit.
+-	 */
+-	unsigned long	io_bitmap[IO_BITMAP_LONGS + 1];
+-	/*
+-	 * pads the TSS to be cacheline-aligned (size is 0x100)
+-	 */
+-	unsigned long __cacheline_filler[37];
+-	/*
+-	 * .. and then another 0x100 bytes for emergency kernel stack
+-	 */
+-	unsigned long stack[64];
+-} __attribute__((packed));
+-
+-#define ARCH_MIN_TASKALIGN	16
+ 
+ struct thread_struct {
+ /* cached TLS descriptors. */
diff --git a/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch b/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch
new file mode 100644
index 00000000..f638a00e
--- /dev/null
+++ b/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch
@@ -0,0 +1,50 @@
+http://www.spinics.net/lists/arm/msg08012.html
+
+To: Dimitry Andric <dimitry@xxxxxxxxxx>
+Subject: Re: Kernel Compile Error: use of old and new-style options to set FPU type
+From: Marc Britten <maillists@xxxxxxxxxxxxxxxxx>
+Date: Wed, 16 Jun 2004 03:03:15 -0400
+Cc: linux-arm@xxxxxxxxxxxxxxxxxxxxxx
+In-reply-to: <1525495613.20040615202902@andric.com>
+
+Dimitry Andric wrote:
+
+>>Assembler messages:
+>>Error: use of old and new-style options to set FPU type
+>   Try removing -Wa,-mno-fpu from CFLAGS (and possibly AFLAGS, but I'm
+>   not sure, depends on what your compiler generates by default) in
+>   arch/arm/Makefile.
+
+Just to let people know, this was successful.
+
+Thanks,
+
+Marc Britten
+
+--------
+
+Fixes error
+
+...
+make -f scripts/Makefile.build obj=scripts/mod
+  /opt/crosstool/arm-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/bin/arm-unknown-linux-gnu-gcc -Wp,-MD,scripts/mod/.empty.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude  -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mapcs-32   -malignment-traps -msoft-float -Wa,-mno-fpu -Uarm -Os -Wdeclaration-after-statement    -DKBUILD_BASENAME=empty -DKBUILD_MODNAME=empty -c -o scripts/mod/empty.o scripts/mod/empty.c
+Assembler messages:
+Error: use of old and new-style options to set FPU type
+make[2]: *** [scripts/mod/empty.o] Error 1
+make[1]: *** [scripts/mod] Error 2
+make: *** [scripts] Error 2
+
+
+--- linux-2.6.8/arch/arm/Makefile.old	2004-09-01 21:27:07.000000000 -0700
++++ linux-2.6.8/arch/arm/Makefile	2004-09-01 21:27:31.000000000 -0700
+@@ -55,8 +55,8 @@
+ tune-$(CONFIG_CPU_V6)		:=-mtune=strongarm
+ 
+ # Need -Uarm for gcc < 3.x
+-CFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Wa,-mno-fpu -Uarm
+-AFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) -msoft-float -Wa,-mno-fpu
++CFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm
++AFLAGS		+=-mapcs-32 $(arch-y) $(tune-y) -msoft-float
+ 
+ CHECK		:= $(CHECK) -D__arm__=1
+ 
diff --git a/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch b/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch
new file mode 100644
index 00000000..6472c178
--- /dev/null
+++ b/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch
@@ -0,0 +1,725 @@
+Submitted By: Martin Schaffner <schaffner@gmx.li>
+Date: 2004-06-19
+Initial Package Version: 2.6.7
+Upstream Status: Not submitted
+Origin: Martin Schaffner
+Description: Enables build on case-insensitive file systems
+URL: xxxhttp://mirror.vtx.ch/lfs/patches/downloads/linux/linux-2.6.7-build_on_case_insensitive_fs-1.patch
+--- Rediffed against 2.6.8 by dank@kegel.com
+--- plus a few missing hunks added to fix sparc32 build
+
+--- linux-2.6.8/Makefile.orig	2004-08-13 22:37:25.000000000 -0700
++++ linux-2.6.8/Makefile	2004-09-01 21:39:39.000000000 -0700
+@@ -540,7 +540,7 @@
+ 
+ do_system_map = $(NM) $(1) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > $(2)
+ 
+-LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.s
++LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.asm
+ 
+ #	Generate section listing all symbols and add it into vmlinux
+ #	It's a three stage process:
+@@ -584,13 +584,13 @@
+ .tmp_kallsyms%.S: .tmp_vmlinux%
+ 	$(call cmd,kallsyms)
+ 
+-.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux__)
+ 
+-.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux__)
+ 
+-.tmp_vmlinux3: $(vmlinux-objs) .tmp_kallsyms2.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++.tmp_vmlinux3: $(vmlinux-objs) .tmp_kallsyms2.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux__)
+ 
+ endif
+@@ -603,13 +603,13 @@
+ 	$(rule_verify_kallsyms)
+ endef
+ 
+-vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE
++vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE
+ 	$(call if_changed_rule,vmlinux)
+ 
+ #	The actual objects are generated when descending, 
+ #	make sure no implicit rule kicks in
+ 
+-$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(vmlinux-dirs) ;
++$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.asm: $(vmlinux-dirs) ;
+ 
+ # Handle descending into subdirectories listed in $(vmlinux-dirs)
+ # Preset locale variables to speed up the build process. Limit locale
+@@ -672,7 +672,7 @@
+ # Single targets
+ # ---------------------------------------------------------------------------
+ 
+-%.s: %.c scripts FORCE
++%.asm: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+ %.i: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+@@ -682,7 +682,7 @@
+ 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D)
+ %.lst: %.c scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+-%.s: %.S scripts FORCE
++%.asm: %.S scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+ %.o: %.S scripts FORCE
+ 	$(Q)$(MAKE) $(build)=$(@D) $@
+diff -ur linux-2.6.7/arch/alpha/Makefile linux-2.6.7-mod/arch/alpha/Makefile
+--- linux-2.6.7/arch/alpha/Makefile	Fri Jun 18 22:51:03 2004
++++ linux-2.6.7-mod/arch/alpha/Makefile	Sat Jun 19 12:46:32 2004
+@@ -114,10 +114,10 @@
+ 
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/alpha/kernel/Makefile linux-2.6.7-mod/arch/alpha/kernel/Makefile
+--- linux-2.6.7/arch/alpha/kernel/Makefile	Mon May 10 04:32:29 2004
++++ linux-2.6.7-mod/arch/alpha/kernel/Makefile	Sat Jun 19 12:46:48 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y		:= head.o vmlinux.lds.s
++extra-y		:= head.o vmlinux.lds.asm
+ EXTRA_AFLAGS	:= $(CFLAGS)
+ EXTRA_CFLAGS	:= -Werror -Wno-sign-compare
+ 
+--- linux-2.6.8/arch/arm/Makefile.orig	2004-08-13 22:36:56.000000000 -0700
++++ linux-2.6.8/arch/arm/Makefile	2004-09-01 21:40:21.000000000 -0700
+@@ -176,10 +176,10 @@
+ bp:;	$(Q)$(MAKE) $(build)=$(boot) $(boot)/bootpImage
+ i zi:;	$(Q)$(MAKE) $(build)=$(boot) $@
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/asm-arm/.arch
+ 
+-include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/arm/kernel/Makefile linux-2.6.7-mod/arch/arm/kernel/Makefile
+--- linux-2.6.7/arch/arm/kernel/Makefile	Mon May 10 04:33:19 2004
++++ linux-2.6.7-mod/arch/arm/kernel/Makefile	Sat Jun 19 12:47:25 2004
+@@ -27,7 +27,7 @@
+ head-y			:= head.o
+ obj-$(CONFIG_DEBUG_LL)	+= debug.o
+ 
+-extra-y := $(head-y) init_task.o vmlinux.lds.s
++extra-y := $(head-y) init_task.o vmlinux.lds.asm
+ 
+ # Spell out some dependencies that aren't automatically figured out
+ $(obj)/entry-armv.o: 	$(obj)/entry-header.S include/asm-arm/constants.h
+diff -ur linux-2.6.7/arch/arm26/Makefile linux-2.6.7-mod/arch/arm26/Makefile
+--- linux-2.6.7/arch/arm26/Makefile	Mon May 10 04:32:28 2004
++++ linux-2.6.7-mod/arch/arm26/Makefile	Sat Jun 19 12:48:24 2004
+@@ -101,10 +101,10 @@
+ 	fi; \
+ 	)
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/arm26/kernel/Makefile linux-2.6.7-mod/arch/arm26/kernel/Makefile
+--- linux-2.6.7/arch/arm26/kernel/Makefile	Mon May 10 04:32:29 2004
++++ linux-2.6.7-mod/arch/arm26/kernel/Makefile	Sat Jun 19 12:48:30 2004
+@@ -14,5 +14,5 @@
+ obj-$(CONFIG_FIQ)		+= fiq.o
+ obj-$(CONFIG_MODULES)		+= armksyms.o
+ 
+-extra-y := init_task.o vmlinux.lds.s
++extra-y := init_task.o vmlinux.lds.asm
+ 
+diff -ur linux-2.6.7/arch/cris/Makefile linux-2.6.7-mod/arch/cris/Makefile
+--- linux-2.6.7/arch/cris/Makefile	Fri Jun 18 22:51:07 2004
++++ linux-2.6.7-mod/arch/cris/Makefile	Sat Jun 19 12:48:47 2004
+@@ -107,8 +107,8 @@
+ 	@ln -sf $(SARCH) include/asm-$(ARCH)/arch
+ 	@touch $@
+ 
+-arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 					include/config/MARKER
+ 
+-include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+diff -ur linux-2.6.7/arch/cris/kernel/Makefile linux-2.6.7-mod/arch/cris/kernel/Makefile
+--- linux-2.6.7/arch/cris/kernel/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/cris/kernel/Makefile	Sat Jun 19 12:48:53 2004
+@@ -3,7 +3,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y	:= vmlinux.lds.s
++extra-y	:= vmlinux.lds.asm
+ 
+ obj-y   := process.o traps.o irq.o ptrace.o setup.o \
+ 	   time.o sys_cris.o semaphore.o
+diff -ur linux-2.6.7/arch/h8300/Makefile linux-2.6.7-mod/arch/h8300/Makefile
+--- linux-2.6.7/arch/h8300/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/h8300/Makefile	Sat Jun 19 12:49:12 2004
+@@ -64,7 +64,7 @@
+ 
+ prepare: include/asm-$(ARCH)/asm-offsets.h
+ 
+-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \
+ 				   include/asm include/linux/version.h
+ 	$(call filechk,gen-asm-offsets)
+ 
+diff -ur linux-2.6.7/arch/h8300/kernel/Makefile linux-2.6.7-mod/arch/h8300/kernel/Makefile
+--- linux-2.6.7/arch/h8300/kernel/Makefile	Fri Jun 18 22:51:09 2004
++++ linux-2.6.7-mod/arch/h8300/kernel/Makefile	Sat Jun 19 12:49:32 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y := process.o traps.o ptrace.o ints.o \
+ 	 sys_h8300.o time.o semaphore.o signal.o \
+diff -ur linux-2.6.7/arch/i386/Makefile linux-2.6.7-mod/arch/i386/Makefile
+--- linux-2.6.7/arch/i386/Makefile	Fri Jun 18 22:51:10 2004
++++ linux-2.6.7-mod/arch/i386/Makefile	Sat Jun 19 12:49:43 2004
+@@ -141,10 +141,10 @@
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/i386/kernel/Makefile linux-2.6.7-mod/arch/i386/kernel/Makefile
+--- linux-2.6.7/arch/i386/kernel/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/i386/kernel/Makefile	Sat Jun 19 12:49:54 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y := head.o init_task.o vmlinux.lds.s
++extra-y := head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
+ 		ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \
+diff -ur linux-2.6.7/arch/ia64/Makefile linux-2.6.7-mod/arch/ia64/Makefile
+--- linux-2.6.7/arch/ia64/Makefile	Mon May 10 04:31:59 2004
++++ linux-2.6.7-mod/arch/ia64/Makefile	Sat Jun 19 12:50:12 2004
+@@ -88,12 +88,12 @@
+ 
+ prepare: include/asm-ia64/offsets.h
+ 
+-arch/ia64/kernel/asm-offsets.s: include/asm include/linux/version.h include/config/MARKER
++arch/ia64/kernel/asm-offsets.asm: include/asm include/linux/version.h include/config/MARKER
+ 
+-include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.s
++include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+-arch/ia64/kernel/asm-offsets.s: include/asm-ia64/.offsets.h.stamp
++arch/ia64/kernel/asm-offsets.asm: include/asm-ia64/.offsets.h.stamp
+ 
+ include/asm-ia64/.offsets.h.stamp:
+ 	mkdir -p include/asm-ia64
+diff -ur linux-2.6.7/arch/ia64/kernel/Makefile linux-2.6.7-mod/arch/ia64/kernel/Makefile
+--- linux-2.6.7/arch/ia64/kernel/Makefile	Fri Jun 18 22:51:13 2004
++++ linux-2.6.7-mod/arch/ia64/kernel/Makefile	Sat Jun 19 12:52:14 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y	:= head.o init_task.o vmlinux.lds.s
++extra-y	:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o	\
+ 	 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o		\
+@@ -21,7 +21,7 @@
+ # The gate DSO image is built using a special linker script.
+ targets += gate.so gate-syms.o
+ 
+-extra-y += gate.so gate-syms.o gate.lds.s gate.o
++extra-y += gate.so gate-syms.o gate.lds.asm gate.o
+ 
+ # fp_emulate() expects f2-f5,f16-f31 to contain the user-level state.
+ CFLAGS_traps.o  += -mfixed-range=f2-f5,f16-f31
+@@ -32,14 +32,14 @@
+       cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@
+ 
+ GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1
+-$(obj)/gate.so: $(obj)/gate.lds.s $(obj)/gate.o FORCE
++$(obj)/gate.so: $(obj)/gate.lds.asm $(obj)/gate.o FORCE
+ 	$(call if_changed,gate)
+ 
+ $(obj)/built-in.o: $(obj)/gate-syms.o
+ $(obj)/built-in.o: ld_flags += -R $(obj)/gate-syms.o
+ 
+ GATECFLAGS_gate-syms.o = -r
+-$(obj)/gate-syms.o: $(src)/gate.lds.s $(obj)/gate.o FORCE
++$(obj)/gate-syms.o: $(src)/gate.lds.asm $(obj)/gate.o FORCE
+ 	$(call if_changed,gate)
+ 
+ # gate-data.o contains the gate DSO image as data in section .data.gate.
+diff -ur linux-2.6.7/arch/m68k/Makefile linux-2.6.7-mod/arch/m68k/Makefile
+--- linux-2.6.7/arch/m68k/Makefile	Fri Jun 18 22:51:14 2004
++++ linux-2.6.7-mod/arch/m68k/Makefile	Sat Jun 19 12:52:30 2004
+@@ -114,10 +114,10 @@
+ prepare: include/asm-$(ARCH)/offsets.h
+ CLEAN_FILES += include/asm-$(ARCH)/offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ archclean:
+diff -ur linux-2.6.7/arch/m68k/kernel/Makefile linux-2.6.7-mod/arch/m68k/kernel/Makefile
+--- linux-2.6.7/arch/m68k/kernel/Makefile	Mon May 10 04:33:10 2004
++++ linux-2.6.7-mod/arch/m68k/kernel/Makefile	Sat Jun 19 12:52:35 2004
+@@ -7,7 +7,7 @@
+ else
+   extra-y := sun3-head.o
+ endif
+-extra-y	+= vmlinux.lds.s
++extra-y	+= vmlinux.lds.asm
+ 
+ obj-y		:= entry.o process.o traps.o ints.o signal.o ptrace.o \
+ 			sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
+diff -ur linux-2.6.7/arch/m68knommu/Makefile linux-2.6.7-mod/arch/m68knommu/Makefile
+--- linux-2.6.7/arch/m68knommu/Makefile	Mon May 10 04:32:54 2004
++++ linux-2.6.7-mod/arch/m68knommu/Makefile	Sat Jun 19 12:52:57 2004
+@@ -89,7 +89,7 @@
+ head-y := arch/m68knommu/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o
+ 
+ CLEAN_FILES := include/asm-$(ARCH)/asm-offsets.h \
+-	       arch/$(ARCH)/kernel/asm-offsets.s
++	       arch/$(ARCH)/kernel/asm-offsets.asm
+ 
+ core-y	+= arch/m68knommu/kernel/ \
+ 	   arch/m68knommu/mm/ \
+@@ -102,7 +102,7 @@
+ archclean:
+ 	$(call descend arch/$(ARCH)/boot, subdirclean)
+ 
+-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \
+ 				   include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 	$(call filechk,gen-asm-offsets)
+diff -ur linux-2.6.7/arch/m68knommu/kernel/Makefile linux-2.6.7-mod/arch/m68knommu/kernel/Makefile
+--- linux-2.6.7/arch/m68knommu/kernel/Makefile	Mon May 10 04:32:26 2004
++++ linux-2.6.7-mod/arch/m68knommu/kernel/Makefile	Sat Jun 19 12:53:20 2004
+@@ -2,7 +2,7 @@
+ # Makefile for arch/m68knommu/kernel.
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y += dma.o entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \
+ 	 setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o
+diff -ur linux-2.6.7/arch/mips/Makefile linux-2.6.7-mod/arch/mips/Makefile
+--- linux-2.6.7/arch/mips/Makefile	Fri Jun 18 22:51:19 2004
++++ linux-2.6.7-mod/arch/mips/Makefile	Sat Jun 19 12:53:35 2004
+@@ -752,12 +752,12 @@
+ prepare: include/asm-$(ARCH)/offset.h \
+ 	 include/asm-$(ARCH)/reg.h
+ 
+-arch/$(ARCH)/kernel/offset.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/offset.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.s
++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.asm
+ 	$(call filechk,gen-asm-offset.h)
+-include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.s
++include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.asm
+ 	$(call filechk,gen-asm-reg.h)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offset.h.tmp \
+diff -ur linux-2.6.7/arch/mips/kernel/Makefile linux-2.6.7-mod/arch/mips/kernel/Makefile
+--- linux-2.6.7/arch/mips/kernel/Makefile	Mon May 10 04:32:28 2004
++++ linux-2.6.7-mod/arch/mips/kernel/Makefile	Sat Jun 19 12:53:41 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the Linux/MIPS kernel.
+ #
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y		+= cpu-probe.o branch.o entry.o genex.o irq.o process.o \
+ 		   ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \
+diff -ur linux-2.6.7/arch/parisc/Makefile linux-2.6.7-mod/arch/parisc/Makefile
+--- linux-2.6.7/arch/parisc/Makefile	Fri Jun 18 22:51:21 2004
++++ linux-2.6.7-mod/arch/parisc/Makefile	Sat Jun 19 12:53:47 2004
+@@ -88,10 +88,10 @@
+ 
+ prepare: include/asm-parisc/offsets.h
+ 
+-arch/parisc/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/parisc/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.s
++include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES	+= lifimage include/asm-parisc/offsets.h
+diff -ur linux-2.6.7/arch/parisc/kernel/Makefile linux-2.6.7-mod/arch/parisc/kernel/Makefile
+--- linux-2.6.7/arch/parisc/kernel/Makefile	Fri Jun 18 22:51:21 2004
++++ linux-2.6.7-mod/arch/parisc/kernel/Makefile	Sat Jun 19 12:53:53 2004
+@@ -4,7 +4,7 @@
+ 
+ head-y			:= head.o
+ head-$(CONFIG_PARISC64)	:= head64.o
+-extra-y			:= init_task.o $(head-y) vmlinux.lds.s
++extra-y			:= init_task.o $(head-y) vmlinux.lds.asm
+ 
+ AFLAGS_entry.o	:= -traditional
+ AFLAGS_pacache.o := -traditional
+diff -ur linux-2.6.7/arch/ppc/Makefile linux-2.6.7-mod/arch/ppc/Makefile
+--- linux-2.6.7/arch/ppc/Makefile	Fri Jun 18 22:51:22 2004
++++ linux-2.6.7-mod/arch/ppc/Makefile	Sat Jun 19 12:54:09 2004
+@@ -78,10 +78,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offsets.h checkbin
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ ifdef CONFIG_6xx
+@@ -104,4 +104,4 @@
+ endif
+ 
+ CLEAN_FILES +=	include/asm-$(ARCH)/offsets.h \
+-		arch/$(ARCH)/kernel/asm-offsets.s
++		arch/$(ARCH)/kernel/asm-offsets.asm
+diff -ur linux-2.6.7/arch/ppc/kernel/Makefile linux-2.6.7-mod/arch/ppc/kernel/Makefile
+--- linux-2.6.7/arch/ppc/kernel/Makefile	Fri Jun 18 22:51:24 2004
++++ linux-2.6.7-mod/arch/ppc/kernel/Makefile	Sat Jun 19 12:43:10 2004
+@@ -15,7 +15,7 @@
+ extra-$(CONFIG_8xx)		:= head_8xx.o
+ extra-$(CONFIG_6xx)		+= idle_6xx.o
+ extra-$(CONFIG_POWER4)		+= idle_power4.o
+-extra-y				+= vmlinux.lds.s
++extra-y				+= vmlinux.lds.asm
+ 
+ obj-y				:= entry.o traps.o irq.o idle.o time.o misc.o \
+ 					process.o signal.o ptrace.o align.o \
+diff -ur linux-2.6.7/arch/ppc64/Makefile linux-2.6.7-mod/arch/ppc64/Makefile
+--- linux-2.6.7/arch/ppc64/Makefile	Fri Jun 18 22:51:26 2004
++++ linux-2.6.7-mod/arch/ppc64/Makefile	Sat Jun 19 12:54:32 2004
+@@ -67,10 +67,10 @@
+ 
+ prepare: include/asm-ppc64/offsets.h
+ 
+-arch/ppc64/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/ppc64/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s
++include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ define archhelp
+diff -ur linux-2.6.7/arch/ppc64/kernel/Makefile linux-2.6.7-mod/arch/ppc64/kernel/Makefile
+--- linux-2.6.7/arch/ppc64/kernel/Makefile	Mon May 10 04:33:20 2004
++++ linux-2.6.7-mod/arch/ppc64/kernel/Makefile	Sat Jun 19 12:54:39 2004
+@@ -3,7 +3,7 @@
+ #
+ 
+ EXTRA_CFLAGS	+= -mno-minimal-toc
+-extra-y		:= head.o vmlinux.lds.s
++extra-y		:= head.o vmlinux.lds.asm
+ 
+ obj-y               :=	setup.o entry.o traps.o irq.o idle.o dma.o \
+ 			time.o process.o signal.o syscalls.o misc.o ptrace.o \
+diff -ur linux-2.6.7/arch/s390/Makefile linux-2.6.7-mod/arch/s390/Makefile
+--- linux-2.6.7/arch/s390/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/s390/Makefile	Sat Jun 19 12:54:46 2004
+@@ -68,10 +68,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offsets.h
+diff -ur linux-2.6.7/arch/s390/kernel/Makefile linux-2.6.7-mod/arch/s390/kernel/Makefile
+--- linux-2.6.7/arch/s390/kernel/Makefile	Mon May 10 04:33:20 2004
++++ linux-2.6.7-mod/arch/s390/kernel/Makefile	Sat Jun 19 12:54:52 2004
+@@ -10,7 +10,7 @@
+ 
+ extra-$(CONFIG_ARCH_S390_31)	+= head.o 
+ extra-$(CONFIG_ARCH_S390X)	+= head64.o 
+-extra-y				+= init_task.o vmlinux.lds.s
++extra-y				+= init_task.o vmlinux.lds.asm
+ 
+ obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
+ obj-$(CONFIG_SMP)		+= smp.o
+diff -ur linux-2.6.7/arch/sh/kernel/Makefile linux-2.6.7-mod/arch/sh/kernel/Makefile
+--- linux-2.6.7/arch/sh/kernel/Makefile	Mon May 10 04:32:39 2004
++++ linux-2.6.7-mod/arch/sh/kernel/Makefile	Sat Jun 19 12:55:33 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the Linux/SuperH kernel.
+ #
+ 
+-extra-y	:= head.o init_task.o vmlinux.lds.s
++extra-y	:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y	:= process.o signal.o entry.o traps.o irq.o \
+ 	ptrace.o setup.o time.o sys_sh.o semaphore.o \
+diff -ur linux-2.6.7/arch/sparc/Makefile linux-2.6.7-mod/arch/sparc/Makefile
+--- linux-2.6.7/arch/sparc/Makefile	Fri Jun 18 22:51:29 2004
++++ linux-2.6.7-mod/arch/sparc/Makefile	Sat Jun 19 12:55:48 2004
+@@ -61,14 +61,14 @@
+ 
+ prepare: include/asm-$(ARCH)/asm_offsets.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES +=	include/asm-$(ARCH)/asm_offsets.h	\
+-		arch/$(ARCH)/kernel/asm-offsets.s	\
++		arch/$(ARCH)/kernel/asm-offsets.asm	\
+ 		arch/$(ARCH)/boot/System.map
+ 
+ # Don't use tabs in echo arguments.
+diff -ur linux-2.6.7/arch/sparc/kernel/Makefile linux-2.6.7-mod/arch/sparc/kernel/Makefile
+--- linux-2.6.7/arch/sparc/kernel/Makefile	Mon May 10 04:33:13 2004
++++ linux-2.6.7-mod/arch/sparc/kernel/Makefile	Sat Jun 19 12:55:52 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ EXTRA_AFLAGS	:= -ansi
+ 
+diff -ur linux-2.6.7/arch/sparc64/kernel/Makefile linux-2.6.7-mod/arch/sparc64/kernel/Makefile
+--- linux-2.6.7/arch/sparc64/kernel/Makefile	Mon May 10 04:32:02 2004
++++ linux-2.6.7-mod/arch/sparc64/kernel/Makefile	Sat Jun 19 12:56:24 2004
+@@ -5,7 +5,7 @@
+ EXTRA_AFLAGS := -ansi
+ EXTRA_CFLAGS := -Werror
+ 
+-extra-y		:= head.o init_task.o vmlinux.lds.s
++extra-y		:= head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y		:= process.o setup.o cpu.o idprom.o \
+ 		   traps.o devices.o auxio.o \
+diff -ur linux-2.6.7/arch/um/Makefile linux-2.6.7-mod/arch/um/Makefile
+--- linux-2.6.7/arch/um/Makefile	Mon May 10 04:32:52 2004
++++ linux-2.6.7-mod/arch/um/Makefile	Sat Jun 19 12:57:07 2004
+@@ -77,7 +77,7 @@
+ # CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case.
+ 
+ LINK_TT = -static
+-LD_SCRIPT_TT := uml.lds.s
++LD_SCRIPT_TT := uml.lds.asm
+ 
+ ifeq ($(CONFIG_STATIC_LINK),y)
+   LINK-y += $(LINK_TT)
+@@ -103,11 +103,11 @@
+ 	-DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE_TT) \
+ 	-DKERNEL_STACK_SIZE=$(STACK_SIZE)
+ 
+-AFLAGS_$(LD_SCRIPT-y:.s=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum
++AFLAGS_$(LD_SCRIPT-y:.asm=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum
+ 
+ LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y)
+ 
+-$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.s=.S) scripts FORCE
++$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.asm=.S) scripts FORCE
+ 	$(call if_changed_dep,as_s_S)
+ 
+ linux: vmlinux $(LD_SCRIPT-y)
+@@ -122,8 +122,8 @@
+ # To get a definition of F_SETSIG
+ USER_CFLAGS += -D_GNU_SOURCE
+ 
+-CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.s \
+-	$(ARCH_DIR)/dyn_link.ld.s $(GEN_HEADERS)
++CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.asm \
++	$(ARCH_DIR)/dyn_link.ld.asm $(GEN_HEADERS)
+ 
+ $(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c
+ 	$(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
+diff -ur linux-2.6.7/arch/um/kernel/Makefile linux-2.6.7-mod/arch/um/kernel/Makefile
+--- linux-2.6.7/arch/um/kernel/Makefile	Mon May 10 04:32:53 2004
++++ linux-2.6.7-mod/arch/um/kernel/Makefile	Sat Jun 19 12:57:15 2004
+@@ -3,7 +3,7 @@
+ # Licensed under the GPL
+ #
+ 
+-extra-y := vmlinux.lds.s
++extra-y := vmlinux.lds.asm
+ 
+ obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \
+ 	helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \
+diff -ur linux-2.6.7/arch/v850/Makefile linux-2.6.7-mod/arch/v850/Makefile
+--- linux-2.6.7/arch/v850/Makefile	Mon May 10 04:33:21 2004
++++ linux-2.6.7-mod/arch/v850/Makefile	Sat Jun 19 12:57:59 2004
+@@ -52,12 +52,12 @@
+ prepare: include/asm-$(ARCH)/asm-consts.h
+ 
+ # Generate constants from C code for use by asm files
+-arch/$(ARCH)/kernel/asm-consts.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-consts.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.s
++include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/asm-consts.h \
+-	       arch/$(ARCH)/kernel/asm-consts.s \
++	       arch/$(ARCH)/kernel/asm-consts.asm \
+ 	       root_fs_image.o
+diff -ur linux-2.6.7/arch/v850/kernel/Makefile linux-2.6.7-mod/arch/v850/kernel/Makefile
+--- linux-2.6.7/arch/v850/kernel/Makefile	Mon May 10 04:33:21 2004
++++ linux-2.6.7-mod/arch/v850/kernel/Makefile	Sat Jun 19 12:58:04 2004
+@@ -9,7 +9,7 @@
+ # for more details.
+ #
+ 
+-extra-y := head.o init_task.o vmlinux.lds.s
++extra-y := head.o init_task.o vmlinux.lds.asm
+ 
+ obj-y += intv.o entry.o process.o syscalls.o time.o semaphore.o setup.o \
+ 	 signal.o irq.o mach.o ptrace.o bug.o
+diff -ur linux-2.6.7/arch/x86_64/Makefile linux-2.6.7-mod/arch/x86_64/Makefile
+--- linux-2.6.7/arch/x86_64/Makefile	Mon May 10 04:33:19 2004
++++ linux-2.6.7-mod/arch/x86_64/Makefile	Sat Jun 19 12:58:10 2004
+@@ -93,10 +93,10 @@
+ 
+ prepare: include/asm-$(ARCH)/offset.h
+ 
+-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \
+ 				   include/config/MARKER
+ 
+-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.s
++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.asm
+ 	$(call filechk,gen-asm-offsets)
+ 
+ CLEAN_FILES += include/asm-$(ARCH)/offset.h
+diff -ur linux-2.6.7/arch/x86_64/kernel/Makefile linux-2.6.7-mod/arch/x86_64/kernel/Makefile
+--- linux-2.6.7/arch/x86_64/kernel/Makefile	Fri Jun 18 22:51:32 2004
++++ linux-2.6.7-mod/arch/x86_64/kernel/Makefile	Sat Jun 19 12:58:17 2004
+@@ -2,7 +2,7 @@
+ # Makefile for the linux kernel.
+ #
+ 
+-extra-y 	:= head.o head64.o init_task.o vmlinux.lds.s
++extra-y 	:= head.o head64.o init_task.o vmlinux.lds.asm
+ EXTRA_AFLAGS	:= -traditional
+ obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o \
+ 		ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \
+diff -ur linux-2.6.7/scripts/Makefile.build linux-2.6.7-mod/scripts/Makefile.build
+--- linux-2.6.7/scripts/Makefile.build	Mon May 10 04:33:13 2004
++++ linux-2.6.7-mod/scripts/Makefile.build	Sat Jun 19 12:43:10 2004
+@@ -110,7 +110,7 @@
+ quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
+ cmd_cc_s_c       = $(CC) $(c_flags) -S -o $@ $< 
+ 
+-%.s: %.c FORCE
++%.asm: %.c FORCE
+ 	$(call if_changed_dep,cc_s_c)
+ 
+ quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
+@@ -197,7 +197,7 @@
+ quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
+ cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $< 
+ 
+-%.s: %.S FORCE
++%.asm: %.S FORCE
+ 	$(call if_changed_dep,as_s_S)
+ 
+ quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
+--- linux-2.6.8/arch/sparc/boot/Makefile.old	2004-09-21 21:46:18.000000000 -0700
++++ linux-2.6.8/arch/sparc/boot/Makefile	2004-09-21 21:52:35.000000000 -0700
+@@ -19,7 +19,7 @@
+ 
+ BTOBJS := $(HEAD_Y) $(INIT_Y)
+ BTLIBS := $(CORE_Y) $(LIBS_Y) $(DRIVERS_Y) $(NET_Y)
+-LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.s $(BTOBJS) --start-group $(BTLIBS) --end-group $(kallsyms.o)
++LDFLAGS_image := -T arch/sparc/kernel/vmlinux.lds.asm $(BTOBJS) --start-group $(BTLIBS) --end-group $(kallsyms.o)
+ 
+ # Actual linking
+ $(obj)/image: $(obj)/btfix.o FORCE
+--- linux-2.6.8/arch/sh64/Makefile.old	2004-09-21 21:46:18.000000000 -0700
++++ linux-2.6.8/arch/sh64/Makefile	2004-09-21 21:54:31.000000000 -0700
+@@ -71,7 +71,7 @@
+ 
+ prepare: include/asm-$(ARCH)/asm-offsets.h arch/$(ARCH)/lib/syscalltab.h
+ 
+-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \
+ 				   include/asm include/linux/version.h
+ 	$(call filechk,gen-asm-offsets)
+ 
+--- linux-2.6.8/arch/sh64/boot/compressed/Makefile.old	2004-09-21 21:46:18.000000000 -0700
++++ linux-2.6.8/arch/sh64/boot/compressed/Makefile	2004-09-21 21:54:41.000000000 -0700
+@@ -25,7 +25,7 @@
+ ZIMAGE_OFFSET = $(shell printf "0x%8x" $$[$(CONFIG_MEMORY_START)+0x400000+0x10000])
+ 
+ LDFLAGS_vmlinux := -Ttext $(ZIMAGE_OFFSET) -e startup \
+-		    -T $(obj)/../../kernel/vmlinux.lds.s \
++		    -T $(obj)/../../kernel/vmlinux.lds.asm \
+ 		    --no-warn-mismatch
+ 
+ $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE
+@@ -41,6 +41,6 @@
+ LDFLAGS_piggy.o := -r --format binary --oformat elf32-sh64-linux -T
+ OBJCOPYFLAGS += -R .empty_zero_page
+ 
+-$(obj)/piggy.o: $(obj)/vmlinux.lds.s $(obj)/vmlinux.bin.gz FORCE
++$(obj)/piggy.o: $(obj)/vmlinux.lds.asm $(obj)/vmlinux.bin.gz FORCE
+ 	$(call if_changed,ld)
+ 
diff --git a/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch b/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch
new file mode 100644
index 00000000..9cef5492
--- /dev/null
+++ b/patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch
@@ -0,0 +1,285 @@
+[ This patch not accepted into kernel for now - it touches the core too much -
+  but it's ok for crosstool since we just want to check whether toolchain is ok,
+  I think.    I had to rediff the sched.h changes with -U5 to get them to
+  apply properly -- patch got confused with just three lines of context?!  -dank ]
+
+Date: Sun, 5 Sep 2004 12:41:08 +0200 (CEST)
+From: Geert Uytterhoeven <geert@linux-m68k.org>
+Sender: geert@linux-m68k.org
+To: Dan Kegel <dank@kegel.com>
+cc: Roman Zippel <zippel@linux-m68k.org>,
+  Matthias Urlichs <smurf@smurf.noris.de>,
+  Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
+  Linux/m68k <linux-m68k@lists.linux-m68k.org>
+Subject: Re: Getting kernel.org kernel to build for m68k?
+In-Reply-To: <Pine.GSO.4.58.0409011029390.15681@waterleaf.sonytel.be>
+Message-ID: <Pine.LNX.4.58.0409051224020.30282@anakin>
+
+On Wed, 1 Sep 2004, Geert Uytterhoeven wrote:
+> On Tue, 31 Aug 2004, Dan Kegel wrote:
+> > I noticed today that Linus's m68k kernel can't be built (at least with gcc-3.4.1).
+> >
+> > The first problem I ran into,
+> >    CC      arch/m68k/kernel/asm-offsets.s
+> >    In file included from include/linux/spinlock.h:12,
+> >                   from include/linux/capability.h:45,
+> >                   from include/linux/sched.h:7,
+> >                   from arch/m68k/kernel/asm-offsets.c:12:
+> >    include/linux/thread_info.h:30: error: parse error before '{' token
+> > is solved already in the m68k tree.
+> > (In particular,
+> > the #ifndef __HAVE_THREAD_FUNCTIONS ... #endif in
+> > http://linux-m68k-cvs.apia.dhs.org/c/cvsweb/linux/include/linux/thread_info.h?rev=1.5;content-type=text%2Fplain
+> > probably solves it.)
+> > There are other problems after that.
+>
+> Roman Zippel changed the threading stuff on m68k. Since it would affect other
+> architectures, I never submitted it on my own.
+>
+> In short, we never really compile this code, since the m68k tree doesn't use it
+> anymore. And yes, it even fails with older compiler versions, like 2.95.2.
+
+The second part doesn't seem to be true: the code is used. And it does compile
+after applying the fixes below, even with gcc 3.4.1.
+
+> > Any chance you could spend a bit of time sending Linus enough
+> > patches for his kernel to build for m68k, if not run?
+>
+> I'll make sure a plain kernel.org kernel can build an m68k kernel.
+
+The patch below makes the plain kernel.org 2.6.8.1 compile for m68k,
+using gcc 2.95.2 or 3.3.3 (3.4.1 needs a few more changes in random
+places). The resulting kernel (I booted the gcc 2.95.2 case) works fine on my
+Amiga.
+
+It's more or less the patch created by Matthias Urlichs last year, so
+the credits are his:
+
+| This change implements a reasonable compromise between the task_info->flags
+| variable in other ports, which is too much work in the syscall path on m68k,
+| and moving the whole structure to thread_struct, which is way too intrusive
+| on other ports.
+
+The patch does affect generic code a bit, but the collateral damage is
+kept to a minimum.
+
+We can still keep Roman's thread info abstractions[*] in Linux/m68k CVS, but
+I'd really like the plain kernel.org kernel to be in a working state as well.
+That way more people may do cross-compile tests for m68k.
+
+Hence if no one objects, I'll submit the patch to Andrew and Linus.
+
+All comments are welcome!
+
+--- linux-2.6.8.1/arch/m68k/kernel/asm-offsets.c	2004-04-28 15:48:59.000000000 +0200
++++ linux-m68k-2.6.8.1/arch/m68k/kernel/asm-offsets.c	2004-09-05 12:04:00.000000000 +0200
+@@ -31,6 +31,7 @@ int main(void)
+ 	DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending));
+ 	DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume));
+ 	DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
++	DEFINE(TASK_TINFO, offsetof(struct task_struct, thread_info));
+ 	DEFINE(TASK_MM, offsetof(struct task_struct, mm));
+ 	DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
+
+@@ -45,6 +46,9 @@ int main(void)
+ 	DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl));
+ 	DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate));
+
++	/* offsets into the thread_info struct */
++	DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count));
++
+ 	/* offsets into the pt_regs */
+ 	DEFINE(PT_D0, offsetof(struct pt_regs, d0));
+ 	DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0));
+--- linux-2.6.8.1/arch/m68k/kernel/entry.S	2004-05-24 11:13:22.000000000 +0200
++++ linux-m68k-2.6.8.1/arch/m68k/kernel/entry.S	2004-09-02 20:13:12.000000000 +0200
+@@ -134,13 +134,13 @@ ENTRY(system_call)
+
+ syscall_exit_work:
+ 	btst	#5,%sp@(PT_SR)		| check if returning to kernel
+-	bnes	1b			| if so, skip resched, signals
++	bnes	1b			| if so, skip everything
+ 	tstw	%d0
+-	jeq	do_signal_return
++	jeq	do_signal_return | jump if only sig_pending or notify_resume
+ 	tstb	%d0
+-	jne	do_delayed_trace
++	jne	do_delayed_trace | jump if delayed_trace
+
+-	pea	resume_userspace
++	pea	resume_userspace | need_resched is set
+ 	jmp	schedule
+
+ ret_from_exception:
+@@ -223,10 +223,14 @@ ENTRY(nmi_handler)
+ */
+ inthandler:
+ 	SAVE_ALL_INT
+-	GET_CURRENT(%d0)
+-	addqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+2)
+-					|  put exception # in d0
+-	bfextu %sp@(PT_VECTOR){#4,#10},%d0
++	/* GET_CURRENT(%d0) */
++	movel	%sp,%d0
++	andw	#-THREAD_SIZE,%d0
++	movel	%d0,%a1
++	addqb	#1,%a1@(TINFO_PREEMPT+2)
++	movel	%a1@,%curptr
++
++	bfextu	%sp@(PT_VECTOR){#4,#10},%d0 |  put exception # in d0
+
+ 	movel	%sp,%sp@-
+ 	movel	%d0,%sp@-		|  put vector # on stack
+@@ -243,7 +247,8 @@ inthandler:
+ 3:	addql	#8,%sp			|  pop parameters off stack
+
+ ret_from_interrupt:
+-	subqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+2)
++	movel	%curptr@(TASK_TINFO),%a1
++	subqb	#1,%a1@(TINFO_PREEMPT+2)
+ 	jeq	1f
+ 2:
+ 	RESTORE_ALL
+--- linux-2.6.8.1/include/asm-m68k/processor.h	2004-04-28 15:49:03.000000000 +0200
++++ linux-m68k-2.6.8.1/include/asm-m68k/processor.h	2004-09-02 20:29:32.000000000 +0200
+@@ -84,7 +84,6 @@ struct thread_struct {
+ 	ksp:	sizeof(init_stack) + (unsigned long) init_stack,	\
+ 	sr:	PS_S,							\
+ 	fs:	__KERNEL_DS,						\
+-	info:	INIT_THREAD_INFO(init_task)				\
+ }
+
+ /*
+--- linux-2.6.8.1/include/asm-m68k/thread_info.h	2004-05-24 11:13:53.000000000 +0200
++++ linux-m68k-2.6.8.1/include/asm-m68k/thread_info.h	2004-09-05 12:19:47.000000000 +0200
+@@ -6,7 +6,7 @@
+ #include <asm/page.h>
+
+ struct thread_info {
+-	struct task_struct	*task;		/* main task structure */
++	struct task_struct	*task;		/* main task structure, must be first! */
+ 	struct exec_domain	*exec_domain;	/* execution domain */
+ 	__s32			preempt_count; /* 0 => preemptable, <0 => BUG */
+ 	__u32 cpu; /* should always be 0 on m68k */
+@@ -21,7 +21,8 @@ struct thread_info {
+ {						\
+ 	.task		= &tsk,			\
+ 	.exec_domain	= &default_exec_domain,	\
+-	.restart_block = {			\
++	.preempt_count	= 1,			\
++	.restart_block	= {			\
+ 		.fn = do_no_restart_syscall,	\
+ 	},					\
+ }
+@@ -35,10 +36,11 @@ struct thread_info {
+ #define free_thread_info(ti)  free_pages((unsigned long)(ti),1)
+ #endif /* PAGE_SHIFT == 13 */
+
+-//#define init_thread_info	(init_task.thread.info)
++#define init_thread_info	(init_thread_union.thread_info)
+ #define init_stack		(init_thread_union.stack)
+
+-#define current_thread_info()	(current->thread_info)
++register __u32 current_thread_info_reg asm("sp");
++#define current_thread_info()	((struct thread_info *)(current_thread_info_reg & ~0x1fff))
+
+
+ #define __HAVE_THREAD_FUNCTIONS
+@@ -91,8 +93,12 @@ extern int thread_flag_fixme(void);
+ })
+
+ #define __get_set_tsk_thread_flag(tsk, flag, val) ({	\
+-	int __res = __get_tsk_thread_flag(tsk, flag);	\
++	int __res;					\
++	unsigned long __flags; \
++	local_irq_save(__flags);  \
++	__res = __get_tsk_thread_flag(tsk, flag);	\
+ 	__set_tsk_thread_flag(tsk, flag, val);		\
++	local_irq_restore(__flags);  \
+ 	__res;						\
+ })
+
+@@ -105,7 +111,4 @@ extern int thread_flag_fixme(void);
+ #define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag)
+ #define test_thread_flag(flag) test_tsk_thread_flag(current, flag)
+
+-#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
+-#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
+-
+ #endif	/* _ASM_M68K_THREAD_INFO_H */
+--- linux-2.6.8/include/linux/sched.h.old	2004-09-13 21:48:58.000000000 -0700
++++ linux-2.6.8/include/linux/sched.h	2004-09-13 21:50:26.000000000 -0700
+@@ -975,10 +975,11 @@
+ 	task_unlock(task);
+ 
+ 	return mm;
+ }
+  
++#ifndef __HAVE_THREAD_FUNCTIONS
+  
+ /* set thread flags in other task's structures
+  * - see asm/thread_info.h for TIF_xxxx flags available
+  */
+ static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag)
+@@ -1004,10 +1005,12 @@
+ static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag)
+ {
+ 	return test_ti_thread_flag(tsk->thread_info,flag);
+ }
+ 
++#endif	/* __HAVE_THREAD_FUNCTIONS */
++
+ static inline void set_tsk_need_resched(struct task_struct *tsk)
+ {
+ 	set_tsk_thread_flag(tsk,TIF_NEED_RESCHED);
+ }
+ 
+--- linux-2.6.8.1/include/linux/thread_info.h	2004-04-27 20:42:22.000000000 +0200
++++ linux-m68k-2.6.8.1/include/linux/thread_info.h	2004-09-04 21:24:36.000000000 +0200
+@@ -21,6 +21,7 @@ extern long do_no_restart_syscall(struct
+ #include <asm/thread_info.h>
+
+ #ifdef __KERNEL__
++#ifndef __HAVE_THREAD_FUNCTIONS
+
+ /*
+  * flag set/clear/test wrappers
+@@ -77,16 +78,11 @@ static inline int test_ti_thread_flag(st
+ 	return test_bit(flag,&ti->flags);
+ }
+
+-static inline void set_need_resched(void)
+-{
+-	set_thread_flag(TIF_NEED_RESCHED);
+-}
++#endif	/* __HAVE_THREAD_FUNCTIONS */
+
+-static inline void clear_need_resched(void)
+-{
+-	clear_thread_flag(TIF_NEED_RESCHED);
+-}
++#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
++#define clear_need_resched(void) clear_thread_flag(TIF_NEED_RESCHED)
+
+-#endif
++#endif	/* __KERNEL__ */
+
+ #endif /* _LINUX_THREAD_INFO_H */
+
+Gr{oetje,eeting}s,
+
+						Geert
+
+[*] For reference:
+
+    http://linux-m68k-cvs.ubb.ca/~geert/linux-m68k-2.6.x-merging/POSTPONED/156-thread_info.diff
+
+--
+Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
+
+In personal conversations with technical people, I call myself a hacker. But
+when I'm talking to journalists I just say "programmer" or something like that.
+							    -- Linus Torvalds
+
+
+
diff --git a/patches/linux/2.6.8/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.8/linux-2.6.8-noshared-kconfig.patch
new file mode 100644
index 00000000..326cdcda
--- /dev/null
+++ b/patches/linux/2.6.8/linux-2.6.8-noshared-kconfig.patch
@@ -0,0 +1,28 @@
+Lets you run 'make oldconfig' and 'make menuconfig' on systems
+where shared libraries aren't easy.  (There's no harm in using the
+static version of libkconfig.)
+Idea mentioned by Bertrand Marquis, but this patch is a bit simpler than his.
+
+
+--- linux-2.6.8.1/scripts/kconfig/Makefile.old	2004-09-09 20:30:25.000000000 -0700
++++ linux-2.6.8.1/scripts/kconfig/Makefile	2004-09-09 20:47:51.000000000 -0700
+@@ -68,8 +68,8 @@
+ libkconfig-objs := zconf.tab.o
+ 
+ host-progs	:= conf mconf qconf gconf
+-conf-objs	:= conf.o  libkconfig.so
+-mconf-objs	:= mconf.o libkconfig.so
++conf-objs	:= conf.o  $(libkconfig-objs)
++mconf-objs	:= mconf.o $(libkconfig-objs)
+ 
+ ifeq ($(MAKECMDGOALS),xconfig)
+ 	qconf-target := 1
+@@ -88,7 +88,7 @@
+ gconf-objs	:= gconf.o kconfig_load.o
+ endif
+ 
+-clean-files	:= libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \
++clean-files	:= $(libkconfig-objs) lkc_defs.h qconf.moc .tmp_qtcheck \
+ 		   .tmp_gtkcheck zconf.tab.c zconf.tab.h lex.zconf.c
+ 
+ # generated files seem to need this to find local include files
diff --git a/patches/uClibc/0.9.28.1/000-string-functions.patch b/patches/uClibc/0.9.28.1/000-string-functions.patch
new file mode 100644
index 00000000..ab6c2553
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/000-string-functions.patch
@@ -0,0 +1,14 @@
+Give preference to target-optimised functions over glibc's ones,
+which in turn ahave precedence over generic ones.
+
+--- uClibc.orig/libc/Makefile	2005-07-20 08:10:44.000000000 +0200
++++ uclibc/libc/Makefile	2005-07-28 13:33:40.000000000 +0200
+@@ -59,7 +59,7 @@
+ 	$(AR) dN 2 $(LIBNAME) $$objs && \
+ 	$(AR) dN 2 $(LIBNAME) $$objs
+ 	@for objfile in obj.signal \
+-	                obj.string.generic obj.string.$(TARGET_ARCH) obj.string \
++	                obj.string obj.string.generic obj.string.$(TARGET_ARCH) \
+ 	                obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \
+ 		if [ -e $$objfile ] ; then \
+ 			echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \
diff --git a/patches/uClibc/0.9.28.1/001-install_dev.patch b/patches/uClibc/0.9.28.1/001-install_dev.patch
new file mode 100644
index 00000000..2fefe83e
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/001-install_dev.patch
@@ -0,0 +1,22 @@
+We know that the kernel headers are in place. Don't try to install them.
+
+diff -dur uClibc-0.9.28.1.orig/Makefile uClibc-0.9.28.1/Makefile
+--- uClibc-0.9.28.1.orig/Makefile	2007-01-28 06:38:00.000000000 +0100
++++ uClibc-0.9.28.1/Makefile	2007-01-28 18:55:46.000000000 +0100
+@@ -158,12 +158,10 @@
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include
+ 	-$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/
+-	if [ "$(KERNEL_SOURCE)" = "$(DEVEL_PREFIX)" ] ; then \
+-		extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
+-	else \
+-		extra_exclude="" ; \
+-	fi ; \
+-	tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \
++	extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
++	tar -chf - include --exclude .svn --exclude CVS \
++	                   --exclude include/linux      \
++	                   --exclude include/asm'*'     \
+ 		| tar -xf - -C $(PREFIX)$(DEVEL_PREFIX)
+ ifneq ($(strip $(UCLIBC_HAS_FLOATS)),y)
+ 	# Remove floating point related headers since float support is disabled.
diff --git a/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch
new file mode 100644
index 00000000..ca0568ca
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/002-no_LFS-no_readahead.patch
@@ -0,0 +1,14 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile	2007-01-26 00:54:19.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile	2007-02-01 08:44:37.000000000 +0100
+@@ -25,6 +25,10 @@
+ SRCS := $(filter-out sbrk.c,$(SRCS))
+ endif
+ 
++ifneq ($(strip $(UCLIBC_HAS_LFS)),y)
++SRCS := $(filter-out readahead.c,$(SRCS))
++endif
++
+ ifneq ($(strip $(UCLIBC_HAS_SSP)),y)
+ SRCS := $(filter-out ssp.c,$(SRCS))
+ endif
diff --git a/patches/uClibc/0.9.28.1/003-time-locale.patch b/patches/uClibc/0.9.28.1/003-time-locale.patch
new file mode 100644
index 00000000..f449ad6a
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/003-time-locale.patch
@@ -0,0 +1,15 @@
+Index: libc/misc/time/time.c
+===================================================================
+--- a/libc/misc/time/time.c	(revision 17534)
++++ b/libc/misc/time/time.c	(revision 17647)
+@@ -158,7 +158,9 @@
+ #endif
+ 
+ #if defined (L_tzset) || defined (L_localtime_r) || defined(L_strftime) || \
+-    defined(L__time_mktime) || defined(L__time_mktime_tzi)
++	 defined(L__time_mktime) || defined(L__time_mktime_tzi) || \
++	 ((defined(L_strftime) || defined(L_strftime_l)) && \
++	  defined(__UCLIBC_HAS_XLOCALE__))
+ 
+ void _time_tzset (int);
+ 
diff --git a/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch b/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch
new file mode 100644
index 00000000..b07ccdb9
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/004-uClibc_ctype.patch
@@ -0,0 +1,17 @@
+diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h
+--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:25 2005
++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:39 2005
+@@ -34,11 +34,11 @@
+
+ /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */
+
+-typedef __uint16_t __ctype_mask_t;
++typedef __uint32_t __ctype_mask_t;
+
+ #ifdef __UCLIBC_HAS_CTYPE_SIGNED__
+
+-typedef __int16_t __ctype_touplow_t;
++typedef __int32_t __ctype_touplow_t;
+ #define __UCLIBC_CTYPE_B_TBL_OFFSET       128
+ #define __UCLIBC_CTYPE_TO_TBL_OFFSET      128
+
diff --git a/patches/uClibc/0.9.28.1/200-custom-ISA.patch b/patches/uClibc/0.9.28.1/200-custom-ISA.patch
new file mode 100644
index 00000000..2cc9bcb5
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/200-custom-ISA.patch
@@ -0,0 +1,31 @@
+diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak
+--- uClibc-0.9.28.orig/Rules.mak	2005-08-18 00:49:49.000000000 +0200
++++ uClibc-0.9.28/Rules.mak	2007-01-30 10:53:34.000000000 +0100
+@@ -168,6 +168,7 @@
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32
++	CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM)
+ endif
+ 
+ ifeq ($(strip $(TARGET_ARCH)),sh)
+diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips
+--- uClibc-0.9.28.orig/extra/Configs/Config.mips	2005-08-18 00:49:41.000000000 +0200
++++ uClibc-0.9.28/extra/Configs/Config.mips	2007-01-30 10:52:12.000000000 +0100
+@@ -63,4 +63,16 @@
+ config CONFIG_MIPS_ISA_MIPS64
+ 	bool "MIPS64"
+ 
++config CONFIG_MIPS_ISA_CUSTOM
++	bool "Custom"
++
+ endchoice
++
++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM
++	string
++	prompt "Custon ISA"
++	depends on CONFIG_MIPS_ISA_CUSTOM
++	default ""
++	help
++	  Enter your custom ISA here (eg: lx4189!).
++
diff --git a/patches/uClibc/0.9.28.1/201-mips-asm.h.patch b/patches/uClibc/0.9.28.1/201-mips-asm.h.patch
new file mode 100644
index 00000000..285feed7
--- /dev/null
+++ b/patches/uClibc/0.9.28.1/201-mips-asm.h.patch
@@ -0,0 +1,41 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S	2007-02-07 10:41:34.000000000 +0100
+@@ -24,7 +24,7 @@
+ #include <sys/regdef.h>
+ #define _ERRNO_H	1
+ #include <bits/errno.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ 
+ /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */
+ 
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:16:52.000000000 +0100
+@@ -3,9 +3,9 @@
+ /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ #include <asm/unistd.h>
+-#include <asm/regdef.h>
++#include <sys/regdef.h>
+ 
+         .globl  pipe
+         .ent    pipe, 0
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:17:03.000000000 +0100
+@@ -17,8 +17,8 @@
+    02111-1307 USA.  */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
+-#include <asm/regdef.h>
++#include <sys/asm.h>
++#include <sys/regdef.h>
+ 
+ #ifdef __PIC__
+ 	.option pic2
diff --git a/patches/uClibc/0.9.28.2/000-string-functions.patch b/patches/uClibc/0.9.28.2/000-string-functions.patch
new file mode 100644
index 00000000..ab6c2553
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/000-string-functions.patch
@@ -0,0 +1,14 @@
+Give preference to target-optimised functions over glibc's ones,
+which in turn ahave precedence over generic ones.
+
+--- uClibc.orig/libc/Makefile	2005-07-20 08:10:44.000000000 +0200
++++ uclibc/libc/Makefile	2005-07-28 13:33:40.000000000 +0200
+@@ -59,7 +59,7 @@
+ 	$(AR) dN 2 $(LIBNAME) $$objs && \
+ 	$(AR) dN 2 $(LIBNAME) $$objs
+ 	@for objfile in obj.signal \
+-	                obj.string.generic obj.string.$(TARGET_ARCH) obj.string \
++	                obj.string obj.string.generic obj.string.$(TARGET_ARCH) \
+ 	                obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \
+ 		if [ -e $$objfile ] ; then \
+ 			echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \
diff --git a/patches/uClibc/0.9.28.2/001-install_dev.patch b/patches/uClibc/0.9.28.2/001-install_dev.patch
new file mode 100644
index 00000000..4b424678
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/001-install_dev.patch
@@ -0,0 +1,22 @@
+We know that the kernel headers are in place. Don't try to install them.
+
+diff -dur uClibc-0.9.28.1.orig/Makefile uClibc-0.9.28.1/Makefile
+--- uClibc-0.9.28.1.orig/Makefile	2007-01-28 06:38:00.000000000 +0100
++++ uClibc-0.9.28.1/Makefile	2007-01-28 18:55:46.000000000 +0100
+@@ -158,12 +158,10 @@
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include
+ 	-$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/
+-	if [ "$(KERNEL_SOURCE)" = "$(DEVEL_PREFIX)" ] ; then \
+-		extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
+-	else \
+-		extra_exclude="" ; \
+-	fi ; \
+-	tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \
++	extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
++	tar -chf - include --exclude .svn --exclude CVS \
++	                   --exclude include/linux      \
++	                   --exclude include/asm'*'     \
+ 		| tar -xf - -C $(PREFIX)$(DEVEL_PREFIX)
+ 	echo '/* Dont use _syscall#() macros; use the syscall() function */' > \
+ 		$(PREFIX)$(DEVEL_PREFIX)include/bits/syscalls.h
diff --git a/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch
new file mode 100644
index 00000000..ca0568ca
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/002-no_LFS-no_readahead.patch
@@ -0,0 +1,14 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile	2007-01-26 00:54:19.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile	2007-02-01 08:44:37.000000000 +0100
+@@ -25,6 +25,10 @@
+ SRCS := $(filter-out sbrk.c,$(SRCS))
+ endif
+ 
++ifneq ($(strip $(UCLIBC_HAS_LFS)),y)
++SRCS := $(filter-out readahead.c,$(SRCS))
++endif
++
+ ifneq ($(strip $(UCLIBC_HAS_SSP)),y)
+ SRCS := $(filter-out ssp.c,$(SRCS))
+ endif
diff --git a/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch b/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch
new file mode 100644
index 00000000..b07ccdb9
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/004-uClibc_ctype.patch
@@ -0,0 +1,17 @@
+diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h
+--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:25 2005
++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:39 2005
+@@ -34,11 +34,11 @@
+
+ /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */
+
+-typedef __uint16_t __ctype_mask_t;
++typedef __uint32_t __ctype_mask_t;
+
+ #ifdef __UCLIBC_HAS_CTYPE_SIGNED__
+
+-typedef __int16_t __ctype_touplow_t;
++typedef __int32_t __ctype_touplow_t;
+ #define __UCLIBC_CTYPE_B_TBL_OFFSET       128
+ #define __UCLIBC_CTYPE_TO_TBL_OFFSET      128
+
diff --git a/patches/uClibc/0.9.28.2/200-custom-ISA.patch b/patches/uClibc/0.9.28.2/200-custom-ISA.patch
new file mode 100644
index 00000000..2cc9bcb5
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/200-custom-ISA.patch
@@ -0,0 +1,31 @@
+diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak
+--- uClibc-0.9.28.orig/Rules.mak	2005-08-18 00:49:49.000000000 +0200
++++ uClibc-0.9.28/Rules.mak	2007-01-30 10:53:34.000000000 +0100
+@@ -168,6 +168,7 @@
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32
++	CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM)
+ endif
+ 
+ ifeq ($(strip $(TARGET_ARCH)),sh)
+diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips
+--- uClibc-0.9.28.orig/extra/Configs/Config.mips	2005-08-18 00:49:41.000000000 +0200
++++ uClibc-0.9.28/extra/Configs/Config.mips	2007-01-30 10:52:12.000000000 +0100
+@@ -63,4 +63,16 @@
+ config CONFIG_MIPS_ISA_MIPS64
+ 	bool "MIPS64"
+ 
++config CONFIG_MIPS_ISA_CUSTOM
++	bool "Custom"
++
+ endchoice
++
++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM
++	string
++	prompt "Custon ISA"
++	depends on CONFIG_MIPS_ISA_CUSTOM
++	default ""
++	help
++	  Enter your custom ISA here (eg: lx4189!).
++
diff --git a/patches/uClibc/0.9.28.2/201-mips-asm.h.patch b/patches/uClibc/0.9.28.2/201-mips-asm.h.patch
new file mode 100644
index 00000000..285feed7
--- /dev/null
+++ b/patches/uClibc/0.9.28.2/201-mips-asm.h.patch
@@ -0,0 +1,41 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S	2007-02-07 10:41:34.000000000 +0100
+@@ -24,7 +24,7 @@
+ #include <sys/regdef.h>
+ #define _ERRNO_H	1
+ #include <bits/errno.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ 
+ /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */
+ 
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:16:52.000000000 +0100
+@@ -3,9 +3,9 @@
+ /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ #include <asm/unistd.h>
+-#include <asm/regdef.h>
++#include <sys/regdef.h>
+ 
+         .globl  pipe
+         .ent    pipe, 0
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:17:03.000000000 +0100
+@@ -17,8 +17,8 @@
+    02111-1307 USA.  */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
+-#include <asm/regdef.h>
++#include <sys/asm.h>
++#include <sys/regdef.h>
+ 
+ #ifdef __PIC__
+ 	.option pic2
diff --git a/patches/uClibc/0.9.28/000-string-functions.patch b/patches/uClibc/0.9.28/000-string-functions.patch
new file mode 100644
index 00000000..4436bfe1
--- /dev/null
+++ b/patches/uClibc/0.9.28/000-string-functions.patch
@@ -0,0 +1,11 @@
+--- uClibc.orig/libc/Makefile	2005-07-20 08:10:44.000000000 +0200
++++ uclibc/libc/Makefile	2005-07-28 13:33:40.000000000 +0200
+@@ -59,7 +59,7 @@
+ 	$(AR) dN 2 $(LIBNAME) $$objs && \
+ 	$(AR) dN 2 $(LIBNAME) $$objs
+ 	@for objfile in obj.signal \
+-	                obj.string.generic obj.string.$(TARGET_ARCH) obj.string \
++	                obj.string obj.string.generic obj.string.$(TARGET_ARCH) \
+ 	                obj.sysdeps.common obj.sysdeps.$(TARGET_ARCH) ; do \
+ 		if [ -e $$objfile ] ; then \
+ 			echo $(AR) $(ARFLAGS) $(LIBNAME) $$objfile ; \
diff --git a/patches/uClibc/0.9.28/001-install_dev.patch b/patches/uClibc/0.9.28/001-install_dev.patch
new file mode 100644
index 00000000..476525be
--- /dev/null
+++ b/patches/uClibc/0.9.28/001-install_dev.patch
@@ -0,0 +1,39 @@
+There are at least three weird glitches in the Makefile:
+ - the test operator is a dual-equal sign (==) when it should be a single one (=);
+ - the exclude options are not accepted as is by GNU tar;
+ - how on earth could KERNEL_SOURCE possibly be equal to DEVEL_PREFIX ???
+
+We (Cedric DUVAL and I, Yann E. MORIN) are not quite sure why it is that way.
+We're not quite sure either on how to solve this.
+
+What we need is to built a toolchain; in no way we need to install the linux headers.
+  ==> systematically exclude them from the [s]tar command.
+
+This patch is inspired by the svn repository of uClibc as of 20060209.
+diff -dur /home/ymorin/dev/uClibc-0.9.28/Makefile uClibc-0.9.28/Makefile
+--- /home/ymorin/dev/uClibc-0.9.28/Makefile	2005-08-18 00:49:49.000000000 +0200
++++ uClibc-0.9.28/Makefile	2006-02-09 17:06:58.000000000 +0100
+@@ -158,12 +158,17 @@
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)lib
+ 	$(INSTALL) -d $(PREFIX)$(DEVEL_PREFIX)include
+ 	-$(INSTALL) -m 644 lib/*.[ao] $(PREFIX)$(DEVEL_PREFIX)lib/
+-	if [ "$(KERNEL_SOURCE)" == "$(DEVEL_PREFIX)" ] ; then \
+-		extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
+-	else \
+-		extra_exclude="" ; \
+-	fi ; \
+-	tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \
++#	if [ "$(KERNEL_SOURCE)" == "$(DEVEL_PREFIX)" ] ; then \
++#		extra_exclude="--exclude include/linux --exclude include/asm'*'" ; \
++#	else \
++#		extra_exclude="" ; \
++#	fi ; \
++#	tar -chf - include --exclude .svn --exclude CVS $$extra_exclude \
++#		| tar -xf - -C $(PREFIX)$(DEVEL_PREFIX)
++	printf ".svn\n.cvsignore\nCVS\n" > tar_exclude ; \
++	ls -1d include/linux include/asm* >> tar_exclude ; \
++	tar -chf - -X tar_exclude include \
+ 		| tar -xf - -C $(PREFIX)$(DEVEL_PREFIX)
++	rm -f tar_exclude
+ ifneq ($(strip $(UCLIBC_HAS_FLOATS)),y)
+ 	# Remove floating point related headers since float support is disabled.
diff --git a/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch b/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch
new file mode 100644
index 00000000..ca0568ca
--- /dev/null
+++ b/patches/uClibc/0.9.28/002-no_LFS-no_readahead.patch
@@ -0,0 +1,14 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/common/Makefile	2007-01-26 00:54:19.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/common/Makefile	2007-02-01 08:44:37.000000000 +0100
+@@ -25,6 +25,10 @@
+ SRCS := $(filter-out sbrk.c,$(SRCS))
+ endif
+ 
++ifneq ($(strip $(UCLIBC_HAS_LFS)),y)
++SRCS := $(filter-out readahead.c,$(SRCS))
++endif
++
+ ifneq ($(strip $(UCLIBC_HAS_SSP)),y)
+ SRCS := $(filter-out ssp.c,$(SRCS))
+ endif
diff --git a/patches/uClibc/0.9.28/004-uClibc_ctype.patch b/patches/uClibc/0.9.28/004-uClibc_ctype.patch
new file mode 100644
index 00000000..b07ccdb9
--- /dev/null
+++ b/patches/uClibc/0.9.28/004-uClibc_ctype.patch
@@ -0,0 +1,17 @@
+diff -urN uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h
+--- uClibc-dist/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:25 2005
++++ uClibc/libc/sysdeps/linux/common/bits/uClibc_touplow.h   Fri Jun  3 13:30:39 2005
+@@ -34,11 +34,11 @@
+
+ /* glibc uses the equivalent of - typedef __int32_t __ctype_touplow_t; */
+
+-typedef __uint16_t __ctype_mask_t;
++typedef __uint32_t __ctype_mask_t;
+
+ #ifdef __UCLIBC_HAS_CTYPE_SIGNED__
+
+-typedef __int16_t __ctype_touplow_t;
++typedef __int32_t __ctype_touplow_t;
+ #define __UCLIBC_CTYPE_B_TBL_OFFSET       128
+ #define __UCLIBC_CTYPE_TO_TBL_OFFSET      128
+
diff --git a/patches/uClibc/0.9.28/005-fix_includes.sh.patch b/patches/uClibc/0.9.28/005-fix_includes.sh.patch
new file mode 100644
index 00000000..0311c83a
--- /dev/null
+++ b/patches/uClibc/0.9.28/005-fix_includes.sh.patch
@@ -0,0 +1,316 @@
+--- uClibc-0.9.28/extra/scripts/fix_includes.sh.orig	2006-12-13 05:44:21.000000000 -0700
++++ uClibc-0.9.28/extra/scripts/fix_includes.sh	2006-12-13 05:44:35.000000000 -0700
+@@ -1,183 +1,155 @@
+ #!/bin/sh
+-# Copyright (C) 2003 Erik Andersen <andersen@uclibc.org>
+ #
+-# This program is free software; you can redistribute it and/or
+-# modify it under the terms of the GNU Library General Public
+-# License as published by the Free Software Foundation; either
+-# version 2 of the License, 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 Library General Public License for more details.
+-#
+-# You should have received a copy of the GNU Library General
+-# Public License along with this program; if not, write to the
+-# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+-# Boston, MA 02111-1307 USA
+-
+-usage () {
+-    echo ""
+-    echo "usage: "`basename $0`" -k KERNEL_SOURCE_DIRECTORY -t TARGET_ARCH"
+-    echo ""
+-    echo "This utility scans the KERNEL_SOURCE_DIRECTORY directory and"
+-    echo "checks that it contains well formed kernel headers suitable"
+-    echo "for inclusion as the include/linux/ directory provided by"
+-    echo "uClibc."
+-    echo ""
+-    echo "If the specified kernel headers are present and already"
+-    echo "configured for the architecture specified by TARGET_ARCH,"
+-    echo "they will be used as-is."
+-    echo ""
+-    echo "If the specified kernel headers are missing entirely, this"
+-    echo "script will return an error."
+-    echo ""
+-    echo "If the specified kernel headers are present, but are either"
+-    echo "not yet configured or are configured for an architecture"
+-    echo "different than that specified by TARGET_ARCH, this script"
+-    echo "will attempt to 'fix' the kernel headers and make them"
+-    echo "suitable for use by uClibc.  This fixing process may fail."
+-    echo "It is therefore best to always provide kernel headers that"
+-    echo "are already configured for the selected architecture."
+-    echo ""
+-    echo "Most Linux distributions provide 'kernel-headers' packages"
+-    echo "that are suitable for use by uClibc."
+-    echo ""
+-    echo ""
+-    exit 1;
++# Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org>
++#
++# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
++#
++
++usage() {
++	echo ""
++	echo "usage: "`basename $0`" -k KERNEL_SOURCE_DIRECTORY -t TARGET_ARCH"
++	echo ""
++	echo "This utility scans the KERNEL_SOURCE_DIRECTORY directory and"
++	echo "checks that it contains well formed kernel headers suitable"
++	echo "for inclusion as the include/linux/ directory provided by"
++	echo "uClibc."
++	echo ""
++	echo "If the specified kernel headers are present and already"
++	echo "configured for the architecture specified by TARGET_ARCH,"
++	echo "they will be used as-is."
++	echo ""
++	echo "If the specified kernel headers are missing entirely, this"
++	echo "script will return an error."
++	echo ""
++	echo "If the specified kernel headers are present, but are either"
++	echo "not yet configured or are configured for an architecture"
++	echo "different than that specified by TARGET_ARCH, this script"
++	echo "will attempt to 'fix' the kernel headers and make them"
++	echo "suitable for use by uClibc.  This fixing process may fail."
++	echo "It is therefore best to always provide kernel headers that"
++	echo "are already configured for the selected architecture."
++	echo ""
++	echo "Most Linux distributions provide 'kernel-headers' packages"
++	echo "that are suitable for use by uClibc."
++	echo ""
++	echo ""
++	exit 1
+ }
+ 
+-HAS_MMU="y";
++
++#
++# Parse our arguments
++#
++HAS_MMU="y"
+ while [ -n "$1" ]; do
+-    case $1 in
+-	-k ) shift; if [ -n "$1" ]; then KERNEL_SOURCE=$1; shift; else usage; fi; ;;
+-	-t ) shift; if [ -n "$1" ]; then TARGET_ARCH=$1; shift; else usage; fi; ;;
+-	-n ) shift; HAS_MMU="n"; ;;
+-	-* ) usage; ;;
+-	* ) usage; ;;
+-    esac;
+-done;
++	case $1 in
++		-k ) shift; if [ -n "$1" ]; then KERNEL_SOURCE=$1; shift; else usage; fi; ;;
++		-t ) shift; if [ -n "$1" ]; then TARGET_ARCH=$1; shift; else usage; fi; ;;
++		-n ) shift; HAS_MMU="n"; ;;
++		-* ) usage; ;;
++		* ) usage; ;;
++	esac
++done
+ 
+-if [ ! -f "$KERNEL_SOURCE/Makefile" -a ! -f "$KERNEL_SOURCE/include/linux/version.h" ]; then
+-    echo "";
+-    echo "";
+-    echo "The file $KERNEL_SOURCE/Makefile or $KERNEL_SOURCE/include/linux/version.h is missing!";
+-    echo "Perhaps your kernel source is broken?"
+-    echo "";
+-    echo "";
+-    exit 1;
+-fi;
+ 
+-if [ ! -d "$KERNEL_SOURCE" ]; then
+-    echo "";
+-    echo "";
+-    echo "$KERNEL_SOURCE is not a directory";
+-    echo "";
+-    echo "";
+-    exit 1;
+-fi;
+-
+-if [ -f "$KERNEL_SOURCE/Makefile" ] ; then
+-# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
+-eval `sed -n -e 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' -e 's/^\([A-Z]*\) = \(-[-a-z0-9]*\)$/\1=\2/p' $KERNEL_SOURCE/Makefile`
+-else
+-ver=`grep UTS_RELEASE $KERNEL_SOURCE/include/linux/version.h | cut -d '"' -f 2`
+-VERSION=`echo "$ver" | cut -d '.' -f 1`
+-PATCHLEVEL=`echo "$ver" | cut -d '.' -f 2`
+-if echo "$ver" | grep -q '-' ; then
+-SUBLEVEL=`echo "$ver" | sed "s/${VERSION}.${PATCHLEVEL}.//" | cut -d '-' -f 1`
+-EXTRAVERSION=`echo "$ver" | sed "s/${VERSION}.${PATCHLEVEL}.${SUBLEVEL}-//"`
+-else
+-SUBLEVEL=`echo "$ver" | cut -d '.' -f 3`
+-#EXTRAVERSION=
+-fi
++#
++# Perform some sanity checks on our kernel sources
++#
++if [ ! -f "$KERNEL_SOURCE/Makefile" -a ! -f "$KERNEL_SOURCE/include/linux/version.h" ]; then
++	echo ""
++	echo ""
++	echo "The file $KERNEL_SOURCE/Makefile or $KERNEL_SOURCE/include/linux/version.h is missing!"
++	echo "Perhaps your kernel source is broken?"
++	echo ""
++	echo ""
++	exit 1
+ fi
+-if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
+-then
+-    echo "Unable to determine version for kernel headers"
+-    echo -e "\tprovided in directory $KERNEL_SOURCE"
+-    exit 1
++if [ ! -d "$KERNEL_SOURCE" ]; then
++	echo ""
++	echo ""
++	echo "$KERNEL_SOURCE is not a directory"
++	echo ""
++	echo ""
++	exit 1
+ fi
+ 
+-if [ "$MAKE_IS_SILENT" != "y" ]; then
+-echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}"
+-echo -e "\n"
+-echo "Using kernel headers from $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} for architecture '$TARGET_ARCH'"
+-echo -e "\tprovided in directory $KERNEL_SOURCE"
+-echo -e "\n"
+-fi
+ 
++#
+ # Create a symlink to include/asm
+-
++#
+ rm -f include/asm*
+ if [ ! -d "$KERNEL_SOURCE/include/asm" ]; then
+-    echo "";
+-    echo "";
+-    echo "The symlink $KERNEL_SOURCE/include/asm is missing\!";
+-    echo "Perhaps you forgot to configure your kernel source?";
+-    echo "You really should configure your kernel source tree so I";
+-    echo "do not have to try and guess about this sort of thing.";
+-    echo ""
+-    echo "Attempting to guess a usable value....";
+-    echo ""
+-    echo "";
+-    sleep 1;
+-
+-    if [ "$TARGET_ARCH" = "powerpc" ];then
+-	set -x;
+-	ln -fs $KERNEL_SOURCE/include/asm-ppc include/asm;
+-	set +x;
+-    elif [ "$TARGET_ARCH" = "mips" ];then
+-	set -x;
+-	ln -fs $KERNEL_SOURCE/include/asm-mips include/asm;
+-	set +x;
+-    elif [ "$TARGET_ARCH" = "arm" ];then
+-	set -x;
+-	ln -fs $KERNEL_SOURCE/include/asm-arm include/asm;
+-	set +x;
+-	if [ ! -L $KERNEL_SOURCE/include/asm-arm/proc ] ; then
+-	    if [ ! -L proc ] ; then
+-		(cd include/asm;
+-		ln -fs proc-armv proc;
+-		ln -fs arch-ebsa285 arch);
+-	    fi
++	echo ""
++	echo ""
++	echo "The symlink $KERNEL_SOURCE/include/asm is missing\!"
++	echo "Perhaps you forgot to configure your kernel source?"
++	echo "You really should configure your kernel source tree so I"
++	echo "do not have to try and guess about this sort of thing."
++	echo ""
++	echo "Attempting to guess a usable value...."
++	echo ""
++	echo ""
++	sleep 1
++
++	if [ "$TARGET_ARCH" = "powerpc" ]; then
++		set -x
++		ln -fs $KERNEL_SOURCE/include/asm-ppc include/asm
++		set +x
++	elif [ "$TARGET_ARCH" = "mips" ]; then
++		set -x
++		ln -fs $KERNEL_SOURCE/include/asm-mips include/asm
++		set +x
++	elif [ "$TARGET_ARCH" = "arm" ]; then
++		set -x
++		ln -fs $KERNEL_SOURCE/include/asm-arm include/asm
++		set +x
++	if [ ! -L $KERNEL_SOURCE/include/asm-arm/proc ]; then
++		if [ ! -L proc ]; then
++			(
++				cd include/asm
++				ln -fs proc-armv proc
++				ln -fs arch-ebsa285 arch
++			)
++		fi
++	fi
++	elif [ "$TARGET_ARCH" = "cris" ]; then
++		set -x
++		ln -fs $KERNEL_SOURCE/include/asm-cris include/asm
++		set +x
++	elif [ "$HAS_MMU" != "y" ]; then
++		if [ -d $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu ]; then
++			set -x
++			ln -fs $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu include/asm
++			set +x
++		else
++			set -x
++			ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm
++			set +x
++		fi
++	else
++		set -x
++		ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm
++		set +x
+ 	fi;
+-    elif [ "$TARGET_ARCH" = "cris" ]; then
+-	set -x;
+-	ln -fs $KERNEL_SOURCE/include/asm-cris include/asm;
+-	set +x;
+-    elif [ "$HAS_MMU" != "y" ]; then
+-	    if [ -d $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu ] ; then
+-		set -x;
+-		ln -fs $KERNEL_SOURCE/include/asm-${TARGET_ARCH}nommu include/asm;
+-		set +x;
+-	    else
+-		set -x;
+-		ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm;
+-		set +x;
+-	    fi;
+-    else
+-	set -x;
+-	ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm;
+-	set +x;
+-    fi;
+ else
+-# No guessing required.....
+-ln -fs $KERNEL_SOURCE/include/asm include/asm
+-if [ -e $KERNEL_SOURCE/include/asm-$TARGET_ARCH ] ; then
+-ln -fs $KERNEL_SOURCE/include/asm-$TARGET_ARCH include/asm-$TARGET_ARCH
++	# No guessing required.....
++	for x in $KERNEL_SOURCE/include/asm* ; do
++		ln -fs ${x} include/
++	done
+ fi
+-fi;
+ 
+ 
++#
+ # Annoyingly, 2.6.x kernel headers also need an include/asm-generic/ directory
+-if [ $VERSION -eq 2 ] && [ $PATCHLEVEL -ge 6 ] ; then
+-    ln -fs $KERNEL_SOURCE/include/asm-generic include/asm-generic
+-fi;
++#
++if [ -e $KERNEL_SOURCE/include/asm-generic ]; then
++	rm -f include/asm-generic
++	ln -fs $KERNEL_SOURCE/include/asm-generic include/asm-generic
++fi
+ 
+ 
++#
+ # Create the include/linux symlink.
++#
+ rm -f include/linux
+ ln -fs $KERNEL_SOURCE/include/linux include/linux
+-
diff --git a/patches/uClibc/0.9.28/200-custom-ISA.patch b/patches/uClibc/0.9.28/200-custom-ISA.patch
new file mode 100644
index 00000000..2cc9bcb5
--- /dev/null
+++ b/patches/uClibc/0.9.28/200-custom-ISA.patch
@@ -0,0 +1,31 @@
+diff -dur uClibc-0.9.28.orig/Rules.mak uClibc-0.9.28/Rules.mak
+--- uClibc-0.9.28.orig/Rules.mak	2005-08-18 00:49:49.000000000 +0200
++++ uClibc-0.9.28/Rules.mak	2007-01-30 10:53:34.000000000 +0100
+@@ -168,6 +168,7 @@
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32
+ 	CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32
++	CPU_CFLAGS-$(CONFIG_MIPS_ISA_CUSTOM)+=-march=$(CONFIG_MIPS_CPU_CFLAGS_CUSTOM)
+ endif
+ 
+ ifeq ($(strip $(TARGET_ARCH)),sh)
+diff -dur uClibc-0.9.28.orig/extra/Configs/Config.mips uClibc-0.9.28/extra/Configs/Config.mips
+--- uClibc-0.9.28.orig/extra/Configs/Config.mips	2005-08-18 00:49:41.000000000 +0200
++++ uClibc-0.9.28/extra/Configs/Config.mips	2007-01-30 10:52:12.000000000 +0100
+@@ -63,4 +63,16 @@
+ config CONFIG_MIPS_ISA_MIPS64
+ 	bool "MIPS64"
+ 
++config CONFIG_MIPS_ISA_CUSTOM
++	bool "Custom"
++
+ endchoice
++
++config CONFIG_MIPS_CPU_CFLAGS_CUSTOM
++	string
++	prompt "Custon ISA"
++	depends on CONFIG_MIPS_ISA_CUSTOM
++	default ""
++	help
++	  Enter your custom ISA here (eg: lx4189!).
++
diff --git a/patches/uClibc/0.9.28/201-mips-asm.h.patch b/patches/uClibc/0.9.28/201-mips-asm.h.patch
new file mode 100644
index 00000000..285feed7
--- /dev/null
+++ b/patches/uClibc/0.9.28/201-mips-asm.h.patch
@@ -0,0 +1,41 @@
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/clone.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/clone.S	2007-02-07 10:41:34.000000000 +0100
+@@ -24,7 +24,7 @@
+ #include <sys/regdef.h>
+ #define _ERRNO_H	1
+ #include <bits/errno.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ 
+ /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */
+ 
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/pipe.S	2007-02-07 11:16:52.000000000 +0100
+@@ -3,9 +3,9 @@
+ /*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
++#include <sys/asm.h>
+ #include <asm/unistd.h>
+-#include <asm/regdef.h>
++#include <sys/regdef.h>
+ 
+         .globl  pipe
+         .ent    pipe, 0
+diff -dur uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S
+--- uClibc-0.9.28.1.orig/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:18:12.000000000 +0100
++++ uClibc-0.9.28.1/libc/sysdeps/linux/mips/syscall.S	2007-02-07 11:17:03.000000000 +0100
+@@ -17,8 +17,8 @@
+    02111-1307 USA.  */
+ 
+ #include <features.h>
+-#include <asm/asm.h>
+-#include <asm/regdef.h>
++#include <sys/asm.h>
++#include <sys/regdef.h>
+ 
+ #ifdef __PIC__
+ 	.option pic2
diff --git a/samples/arm-qemu-linux-uclibc/crosstool.config b/samples/arm-qemu-linux-uclibc/crosstool.config
new file mode 100644
index 00000000..fdbc1af7
--- /dev/null
+++ b/samples/arm-qemu-linux-uclibc/crosstool.config
@@ -0,0 +1,388 @@
+#
+# Automatically generated make config: don't edit
+# crosstool-NG version: 0.0.1
+# Thu Feb  8 21:23:17 2007
+#
+
+#
+# Paths and misc options
+#
+CT_PARALLEL_JOBS=1
+CT_LOAD=0
+CT_NICE=5
+CT_USE_PIPES=y
+
+#
+# Paths
+#
+CT_TARBALLS_DIR="${HOME}/dev/src"
+CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}"
+CT_INSTALL_DIR="${CT_PREFIX_DIR}"
+
+#
+# Downloading and extracting
+#
+# CT_NO_DOWNLOAD is not set
+# CT_ONLY_DOWNLOAD is not set
+# CT_FORCE_DOWNLOAD is not set
+# CT_FORCE_EXTRACT is not set
+
+#
+# Logging
+#
+# CT_LOG_ERROR is not set
+# CT_LOG_WARN is not set
+# CT_LOG_INFO is not set
+CT_LOG_EXTRA=y
+# CT_LOG_DEBUG is not set
+CT_LOG_LEVEL_MAX="EXTRA"
+# CT_LOG_PROGRESS_BAR is not set
+# CT_LOG_USE_COLORS is not set
+CT_LOG_TO_FILE=y
+CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log"
+
+#
+# Target options
+#
+
+#
+# General target options
+#
+CT_ARCH_ARM=y
+# CT_ARCH_MIPS is not set
+# CT_ARCH_x86 is not set
+# CT_ARCH_x86_64 is not set
+# CT_ARCH_BE is not set
+CT_ARCH_LE=y
+# CT_ARCH_FLOAT_HW is not set
+CT_ARCH_FLOAT_SW=y
+
+#
+# Target optimisations
+#
+CT_ARCH_CPU=""
+CT_ARCH_TUNE=""
+CT_ARCH_ARCH="armv5te"
+CT_TARGET_CFLAGS=""
+
+#
+# Toolchain options
+#
+CT_USE_SYSROOT=y
+CT_SHARED_LIBS=y
+CT_TARGET_VENDOR="qemu"
+CT_TARGET_ALIAS=""
+CT_ARCH="arm"
+CT_BUILD=""
+CT_CC_NATIVE="gcc"
+# CT_CANADIAN is not set
+CT_HOST=""
+CT_HOST_CC=""
+
+#
+# Kernel
+#
+CT_KERNEL_LINUX=y
+# CT_KERNEL_CYGWIN is not set
+CT_KERNEL_VERSION="2.6.20"
+CT_KERNEL_LINUX_HEADERS_INSTALL=y
+# CT_KERNEL_LINUX_HEADERS_SANITISED is not set
+# CT_KERNEL_LINUX_HEADERS_COPY is not set
+CT_KERNEL="linux"
+CT_KERNEL_VERSION_SEE_EXTRAVERSION=y
+# CT_KERNEL_INSTALL_V_2_6_18 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_1 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_2 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_3 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_4 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_5 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_6 is not set
+# CT_KERNEL_INSTALL_V_2_6_19 is not set
+# CT_KERNEL_INSTALL_V_2_6_19_1 is not set
+# CT_KERNEL_INSTALL_V_2_6_19_2 is not set
+CT_KERNEL_INSTALL_V_2_6_20=y
+# CT_KERNEL_COPY_V_2_6_0 is not set
+# CT_KERNEL_COPY_V_2_6_1 is not set
+# CT_KERNEL_COPY_V_2_6_2 is not set
+# CT_KERNEL_COPY_V_2_6_3 is not set
+# CT_KERNEL_COPY_V_2_6_4 is not set
+# CT_KERNEL_COPY_V_2_6_5 is not set
+# CT_KERNEL_COPY_V_2_6_6 is not set
+# CT_KERNEL_COPY_V_2_6_7 is not set
+# CT_KERNEL_COPY_V_2_6_8 is not set
+# CT_KERNEL_COPY_V_2_6_8_1 is not set
+# CT_KERNEL_COPY_V_2_6_9 is not set
+# CT_KERNEL_COPY_V_2_6_10 is not set
+# CT_KERNEL_COPY_V_2_6_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_1 is not set
+# CT_KERNEL_COPY_V_2_6_11_10 is not set
+# CT_KERNEL_COPY_V_2_6_11_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_12 is not set
+# CT_KERNEL_COPY_V_2_6_11_2 is not set
+# CT_KERNEL_COPY_V_2_6_11_3 is not set
+# CT_KERNEL_COPY_V_2_6_11_4 is not set
+# CT_KERNEL_COPY_V_2_6_11_5 is not set
+# CT_KERNEL_COPY_V_2_6_11_6 is not set
+# CT_KERNEL_COPY_V_2_6_11_7 is not set
+# CT_KERNEL_COPY_V_2_6_11_8 is not set
+# CT_KERNEL_COPY_V_2_6_11_9 is not set
+# CT_KERNEL_COPY_V_2_6_12 is not set
+# CT_KERNEL_COPY_V_2_6_12_1 is not set
+# CT_KERNEL_COPY_V_2_6_12_2 is not set
+# CT_KERNEL_COPY_V_2_6_12_3 is not set
+# CT_KERNEL_COPY_V_2_6_12_4 is not set
+# CT_KERNEL_COPY_V_2_6_12_5 is not set
+# CT_KERNEL_COPY_V_2_6_12_6 is not set
+# CT_KERNEL_COPY_V_2_6_13 is not set
+# CT_KERNEL_COPY_V_2_6_13_1 is not set
+# CT_KERNEL_COPY_V_2_6_13_2 is not set
+# CT_KERNEL_COPY_V_2_6_13_3 is not set
+# CT_KERNEL_COPY_V_2_6_13_4 is not set
+# CT_KERNEL_COPY_V_2_6_13_5 is not set
+# CT_KERNEL_COPY_V_2_6_14 is not set
+# CT_KERNEL_COPY_V_2_6_14_1 is not set
+# CT_KERNEL_COPY_V_2_6_14_2 is not set
+# CT_KERNEL_COPY_V_2_6_14_3 is not set
+# CT_KERNEL_COPY_V_2_6_14_4 is not set
+# CT_KERNEL_COPY_V_2_6_14_5 is not set
+# CT_KERNEL_COPY_V_2_6_14_6 is not set
+# CT_KERNEL_COPY_V_2_6_14_7 is not set
+# CT_KERNEL_COPY_V_2_6_15 is not set
+# CT_KERNEL_COPY_V_2_6_15_1 is not set
+# CT_KERNEL_COPY_V_2_6_15_2 is not set
+# CT_KERNEL_COPY_V_2_6_15_3 is not set
+# CT_KERNEL_COPY_V_2_6_15_4 is not set
+# CT_KERNEL_COPY_V_2_6_15_5 is not set
+# CT_KERNEL_COPY_V_2_6_15_6 is not set
+# CT_KERNEL_COPY_V_2_6_15_7 is not set
+# CT_KERNEL_COPY_V_2_6_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_1 is not set
+# CT_KERNEL_COPY_V_2_6_16_10 is not set
+# CT_KERNEL_COPY_V_2_6_16_11 is not set
+# CT_KERNEL_COPY_V_2_6_16_12 is not set
+# CT_KERNEL_COPY_V_2_6_16_13 is not set
+# CT_KERNEL_COPY_V_2_6_16_14 is not set
+# CT_KERNEL_COPY_V_2_6_16_15 is not set
+# CT_KERNEL_COPY_V_2_6_16_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_17 is not set
+# CT_KERNEL_COPY_V_2_6_16_18 is not set
+# CT_KERNEL_COPY_V_2_6_16_19 is not set
+# CT_KERNEL_COPY_V_2_6_16_2 is not set
+# CT_KERNEL_COPY_V_2_6_16_20 is not set
+# CT_KERNEL_COPY_V_2_6_16_21 is not set
+# CT_KERNEL_COPY_V_2_6_16_22 is not set
+# CT_KERNEL_COPY_V_2_6_16_23 is not set
+# CT_KERNEL_COPY_V_2_6_16_24 is not set
+# CT_KERNEL_COPY_V_2_6_16_25 is not set
+# CT_KERNEL_COPY_V_2_6_16_26 is not set
+# CT_KERNEL_COPY_V_2_6_16_27 is not set
+# CT_KERNEL_COPY_V_2_6_16_28 is not set
+# CT_KERNEL_COPY_V_2_6_16_29 is not set
+# CT_KERNEL_COPY_V_2_6_16_3 is not set
+# CT_KERNEL_COPY_V_2_6_16_30 is not set
+# CT_KERNEL_COPY_V_2_6_16_31 is not set
+# CT_KERNEL_COPY_V_2_6_16_32 is not set
+# CT_KERNEL_COPY_V_2_6_16_33 is not set
+# CT_KERNEL_COPY_V_2_6_16_34 is not set
+# CT_KERNEL_COPY_V_2_6_16_35 is not set
+# CT_KERNEL_COPY_V_2_6_16_36 is not set
+# CT_KERNEL_COPY_V_2_6_16_4 is not set
+# CT_KERNEL_COPY_V_2_6_16_5 is not set
+# CT_KERNEL_COPY_V_2_6_16_6 is not set
+# CT_KERNEL_COPY_V_2_6_16_7 is not set
+# CT_KERNEL_COPY_V_2_6_16_8 is not set
+# CT_KERNEL_COPY_V_2_6_16_9 is not set
+# CT_KERNEL_COPY_V_2_6_17 is not set
+# CT_KERNEL_COPY_V_2_6_17_1 is not set
+# CT_KERNEL_COPY_V_2_6_17_10 is not set
+# CT_KERNEL_COPY_V_2_6_17_11 is not set
+# CT_KERNEL_COPY_V_2_6_17_12 is not set
+# CT_KERNEL_COPY_V_2_6_17_13 is not set
+# CT_KERNEL_COPY_V_2_6_17_14 is not set
+# CT_KERNEL_COPY_V_2_6_17_2 is not set
+# CT_KERNEL_COPY_V_2_6_17_3 is not set
+# CT_KERNEL_COPY_V_2_6_17_4 is not set
+# CT_KERNEL_COPY_V_2_6_17_5 is not set
+# CT_KERNEL_COPY_V_2_6_17_6 is not set
+# CT_KERNEL_COPY_V_2_6_17_7 is not set
+# CT_KERNEL_COPY_V_2_6_17_8 is not set
+# CT_KERNEL_COPY_V_2_6_17_9 is not set
+# CT_KERNEL_COPY_V_2_6_18 is not set
+# CT_KERNEL_COPY_V_2_6_18_1 is not set
+# CT_KERNEL_COPY_V_2_6_18_2 is not set
+# CT_KERNEL_COPY_V_2_6_18_3 is not set
+# CT_KERNEL_COPY_V_2_6_18_4 is not set
+# CT_KERNEL_COPY_V_2_6_18_5 is not set
+# CT_KERNEL_COPY_V_2_6_18_6 is not set
+# CT_KERNEL_COPY_V_2_6_19 is not set
+# CT_KERNEL_COPY_V_2_6_19_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_7_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_10_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_2 is not set
+# CT_KERNEL_SANITISED_V_2_6_12_0 is not set
+CT_KERNEL_LINUX_VERBOSITY_0=y
+# CT_KERNEL_LINUX_VERBOSITY_1 is not set
+# CT_KERNEL_LINUX_VERBOSITY_2 is not set
+CT_KERNEL_LINUX_VERBOSE_LEVEL=0
+CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config"
+
+#
+# binutils
+#
+CT_BINUTILS_VERSION="2.17.50.0.10"
+# CT_BINUTILS_V_2_11_2 is not set
+# CT_BINUTILS_V_2_13_90 is not set
+# CT_BINUTILS_V_2_14 is not set
+# CT_BINUTILS_V_2_14_90 is not set
+# CT_BINUTILS_V_2_14_92 is not set
+# CT_BINUTILS_V_2_15 is not set
+# CT_BINUTILS_V_2_15_90 is not set
+# CT_BINUTILS_V_2_15_91 is not set
+# CT_BINUTILS_V_2_16 is not set
+# CT_BINUTILS_V_2_16_1 is not set
+# CT_BINUTILS_V_2_17 is not set
+# CT_BINUTILS_V_2_17_50_0_1 is not set
+# CT_BINUTILS_V_2_17_50_0_2 is not set
+# CT_BINUTILS_V_2_17_50_0_3 is not set
+# CT_BINUTILS_V_2_17_50_0_4 is not set
+# CT_BINUTILS_V_2_17_50_0_5 is not set
+# CT_BINUTILS_V_2_17_50_0_6 is not set
+# CT_BINUTILS_V_2_17_50_0_7 is not set
+# CT_BINUTILS_V_2_17_50_0_8 is not set
+# CT_BINUTILS_V_2_17_50_0_9 is not set
+CT_BINUTILS_V_2_17_50_0_10=y
+CT_BINUTILS_EXTRA_CONFIG=""
+
+#
+# C compiler
+#
+
+#
+# Core C Compiler (used to build the C library)
+#
+# CT_CC_USE_CORE is not set
+CT_CC_CORE_GCC=y
+# CT_CC_CORE_TCC is not set
+CT_CC_CORE_VERSION=""
+CT_CC_CORE="gcc"
+# CT_CC_CORE_V_2_95_3 is not set
+# CT_CC_CORE_V_3_2_3 is not set
+# CT_CC_CORE_V_3_3 is not set
+# CT_CC_CORE_V_3_3_1 is not set
+# CT_CC_CORE_V_3_3_2 is not set
+# CT_CC_CORE_V_3_3_3 is not set
+# CT_CC_CORE_V_3_3_4 is not set
+# CT_CC_CORE_V_3_3_5 is not set
+# CT_CC_CORE_V_3_3_6 is not set
+# CT_CC_CORE_V_3_4_0 is not set
+# CT_CC_CORE_V_3_4_1 is not set
+# CT_CC_CORE_V_3_4_2 is not set
+# CT_CC_CORE_V_3_4_3 is not set
+# CT_CC_CORE_V_3_4_4 is not set
+# CT_CC_CORE_V_3_4_5 is not set
+# CT_CC_CORE_V_3_4_6 is not set
+# CT_CC_CORE_V_4_0_0 is not set
+# CT_CC_CORE_V_4_0_1 is not set
+# CT_CC_CORE_V_4_0_2 is not set
+# CT_CC_CORE_V_4_0_3 is not set
+# CT_CC_CORE_V_4_0_4 is not set
+# CT_CC_CORE_V_4_1_0 is not set
+# CT_CC_CORE_V_4_1_1 is not set
+CT_CC_CORE_EXTRA_CONFIG=""
+
+#
+# Final C compiler
+#
+CT_CC_GCC=y
+CT_CC_VERSION="4.1.1"
+CT_CC="gcc"
+# CT_CC_V_2_95_3 is not set
+# CT_CC_V_3_2_3 is not set
+# CT_CC_V_3_3 is not set
+# CT_CC_V_3_3_1 is not set
+# CT_CC_V_3_3_2 is not set
+# CT_CC_V_3_3_3 is not set
+# CT_CC_V_3_3_4 is not set
+# CT_CC_V_3_3_5 is not set
+# CT_CC_V_3_3_6 is not set
+# CT_CC_V_3_4_0 is not set
+# CT_CC_V_3_4_1 is not set
+# CT_CC_V_3_4_2 is not set
+# CT_CC_V_3_4_3 is not set
+# CT_CC_V_3_4_4 is not set
+# CT_CC_V_3_4_5 is not set
+# CT_CC_V_4_0_0 is not set
+# CT_CC_V_4_0_1 is not set
+# CT_CC_V_4_0_2 is not set
+# CT_CC_V_4_0_3 is not set
+# CT_CC_V_4_0_4 is not set
+# CT_CC_V_4_1_0 is not set
+CT_CC_V_4_1_1=y
+CT_CC_EXTRA_CONFIG=""
+CT_CC_SUPPORT_C=y
+CT_CC_SUPPORT_CXX=y
+CT_CC_SUPPORT_JAVA=y
+
+#
+# Supported languages:
+#
+CT_CC_LANG_C=y
+# CT_CC_LANG_CXX is not set
+# CT_CC_LANG_JAVA is not set
+
+#
+# C-library
+#
+# CT_LIBC_GLIBC is not set
+CT_LIBC_UCLIBC=y
+CT_LIBC_VERSION="0.9.28.1"
+CT_LIBC="uClibc"
+# CT_LIBC_V_1_09_1 is not set
+# CT_LIBC_V_2_0_1 is not set
+# CT_LIBC_V_2_0_6 is not set
+# CT_LIBC_V_2_1_1 is not set
+# CT_LIBC_V_2_1_2 is not set
+# CT_LIBC_V_2_1_3 is not set
+# CT_LIBC_V_2_2 is not set
+# CT_LIBC_V_2_2_1 is not set
+# CT_LIBC_V_2_2_2 is not set
+# CT_LIBC_V_2_2_3 is not set
+# CT_LIBC_V_2_2_4 is not set
+# CT_LIBC_V_2_2_5 is not set
+# CT_LIBC_V_2_3 is not set
+# CT_LIBC_V_2_3_1 is not set
+# CT_LIBC_V_2_3_2 is not set
+# CT_LIBC_V_2_3_3 is not set
+# CT_LIBC_V_2_3_4 is not set
+# CT_LIBC_V_2_3_5 is not set
+# CT_LIBC_V_2_3_6 is not set
+# CT_LIBC_V_2_4 is not set
+# CT_LIBC_V_2_5 is not set
+# CT_LIBC_GLIBC_THREADS_NPTL is not set
+# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set
+# CT_LIBC_GLIBC_THREADS_NONE is not set
+CT_LIBC_GLIBC_EXTRA_CONFIG=""
+CT_LIBC_GLIBC_EXTRA_CFLAGS=""
+CT_LIBC_EXTRA_CC_ARGS=""
+CT_LIBC_GLIBC_CONFIGPARMS=""
+CT_LIBC_ADDONS=""
+# CT_LIBC_V_snapshot is not set
+# CT_LIBC_V_specific_date is not set
+# CT_LIBC_V_0_9_26 is not set
+# CT_LIBC_V_0_9_27 is not set
+# CT_LIBC_V_0_9_28 is not set
+CT_LIBC_V_0_9_28_1=y
+CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
+CT_LIBC_UCLIBC_DEBUG_LEVEL=0
+CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
+# CT_LIBC_UCLIBC_LOCALES is not set
diff --git a/samples/arm-qemu-linux-uclibc/linux-2.6.20.config b/samples/arm-qemu-linux-uclibc/linux-2.6.20.config
new file mode 100644
index 00000000..1de6c95b
--- /dev/null
+++ b/samples/arm-qemu-linux-uclibc/linux-2.6.20.config
@@ -0,0 +1,997 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20
+# Thu Feb  8 19:19:07 2007
+#
+CONFIG_ARM=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION="-qemu"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+CONFIG_ARCH_VERSATILE=y
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+
+#
+# Versatile platform type
+#
+CONFIG_ARCH_VERSATILE_PB=y
+# CONFIG_MACH_VERSATILE_AB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+CONFIG_CPU_ICACHE_DISABLE=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_VIC=y
+CONFIG_ICST307=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+CONFIG_PCI=y
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=1f03 mem=32M"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+# CONFIG_APM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=m
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+# CONFIG_MTD_CFI_NOSWAP is not set
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_SMC91X=y
+# CONFIG_DM9000 is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_PCI=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL011 is not set
+CONFIG_SERIAL_CORE=m
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+CONFIG_FB_ARMCLCD=y
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+CONFIG_FONT_ACORN_8x8=y
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_BANDWIDTH=y
+CONFIG_USB_DYNAMIC_MINORS=y
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_EHCI_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+# CONFIG_USB_HID is not set
+
+#
+# USB HID Boot Protocol drivers
+#
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_MOUSE is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_MON is not set
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_MINIX_FS=y
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_SQUASHFS_VMALLOC is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_FORCED_INLINING is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
diff --git a/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config b/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config
new file mode 100644
index 00000000..3bd0dc12
--- /dev/null
+++ b/samples/arm-qemu-linux-uclibc/uClibc-0.9.28.1.config
@@ -0,0 +1,169 @@
+#
+# Automatically generated make config: don't edit
+#
+# TARGET_alpha is not set
+TARGET_arm=y
+# TARGET_bfin is not set
+# TARGET_cris is not set
+# TARGET_e1 is not set
+# TARGET_frv is not set
+# TARGET_h8300 is not set
+# TARGET_i386 is not set
+# TARGET_i960 is not set
+# TARGET_m68k is not set
+# TARGET_microblaze is not set
+# TARGET_mips is not set
+# TARGET_nios is not set
+# TARGET_nios2 is not set
+# TARGET_powerpc is not set
+# TARGET_sh is not set
+# TARGET_sh64 is not set
+# TARGET_sparc is not set
+# TARGET_v850 is not set
+# TARGET_x86_64 is not set
+
+#
+# Target Architecture Features and Options
+#
+HAVE_ELF=y
+ARCH_SUPPORTS_LITTLE_ENDIAN=y
+TARGET_ARCH="arm"
+ARCH_SUPPORTS_BIG_ENDIAN=y
+# CONFIG_GENERIC_ARM is not set
+# CONFIG_ARM610 is not set
+# CONFIG_ARM710 is not set
+# CONFIG_ARM720T is not set
+# CONFIG_ARM920T is not set
+# CONFIG_ARM922T is not set
+# CONFIG_ARM926T is not set
+# CONFIG_ARM1136JF_S is not set
+# CONFIG_ARM_SA110 is not set
+# CONFIG_ARM_SA1100 is not set
+CONFIG_ARM_XSCALE=y
+ARCH_LITTLE_ENDIAN=y
+# ARCH_BIG_ENDIAN is not set
+# ARCH_HAS_NO_MMU is not set
+ARCH_HAS_MMU=y
+UCLIBC_HAS_FLOATS=y
+# HAS_FPU is not set
+UCLIBC_HAS_SOFT_FLOAT=y
+DO_C99_MATH=y
+KERNEL_SOURCE="/usr/src/linux"
+C_SYMBOL_PREFIX=""
+HAVE_DOT_CONFIG=y
+
+#
+# General Library Settings
+#
+# HAVE_NO_PIC is not set
+DOPIC=y
+# HAVE_NO_SHARED is not set
+HAVE_SHARED=y
+# ARCH_HAS_NO_LDSO is not set
+BUILD_UCLIBC_LDSO=y
+# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
+LDSO_LDD_SUPPORT=y
+LDSO_CACHE_SUPPORT=y
+# LDSO_PRELOAD_FILE_SUPPORT is not set
+LDSO_BASE_FILENAME="ld.so"
+# LDSO_RUNPATH is not set
+# DL_FINI_CRT_COMPAT is not set
+UCLIBC_CTOR_DTOR=y
+# HAS_NO_THREADS is not set
+UCLIBC_HAS_THREADS=y
+# PTHREADS_DEBUG_SUPPORT is not set
+UCLIBC_HAS_LFS=y
+UCLIBC_STATIC_LDCONFIG=y
+# MALLOC is not set
+# MALLOC_SIMPLE is not set
+MALLOC_STANDARD=y
+# MALLOC_GLIBC_COMPAT is not set
+UCLIBC_DYNAMIC_ATEXIT=y
+HAS_SHADOW=y
+UNIX98PTY_ONLY=y
+ASSUME_DEVPTS=y
+UCLIBC_HAS_TM_EXTENSIONS=y
+# UCLIBC_HAS_TZ_CACHING is not set
+UCLIBC_HAS_TZ_FILE=y
+# UCLIBC_HAS_TZ_FILE_READ_MANY is not set
+UCLIBC_TZ_FILE_PATH="/etc/TZ"
+
+#
+# Networking Support
+#
+# UCLIBC_HAS_IPV6 is not set
+UCLIBC_HAS_RPC=y
+UCLIBC_HAS_FULL_RPC=y
+
+#
+# String and Stdio Support
+#
+UCLIBC_HAS_STRING_GENERIC_OPT=y
+UCLIBC_HAS_STRING_ARCH_OPT=y
+UCLIBC_HAS_CTYPE_TABLES=y
+UCLIBC_HAS_CTYPE_SIGNED=y
+# UCLIBC_HAS_CTYPE_UNSAFE is not set
+# UCLIBC_HAS_CTYPE_CHECKED is not set
+UCLIBC_HAS_CTYPE_ENFORCED=y
+# UCLIBC_HAS_WCHAR is not set
+# UCLIBC_HAS_LOCALE is not set
+UCLIBC_HAS_HEXADECIMAL_FLOATS=y
+# UCLIBC_HAS_GLIBC_CUSTOM_PRINTF is not set
+# USE_OLD_VFPRINTF is not set
+UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
+# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
+UCLIBC_HAS_STDIO_BUFSIZ_4096=y
+# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
+UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
+UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT=y
+UCLIBC_HAS_STDIO_GETC_MACRO=y
+UCLIBC_HAS_STDIO_PUTC_MACRO=y
+UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
+UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y
+UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
+UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
+UCLIBC_HAS_PRINTF_M_SPEC=y
+UCLIBC_HAS_ERRNO_MESSAGES=y
+# UCLIBC_HAS_SYS_ERRLIST is not set
+UCLIBC_HAS_SIGNUM_MESSAGES=y
+# UCLIBC_HAS_SYS_SIGLIST is not set
+UCLIBC_HAS_GNU_GETOPT=y
+
+#
+# Big and Tall
+#
+UCLIBC_HAS_REGEX=y
+UCLIBC_HAS_WORDEXP=y
+UCLIBC_HAS_FTW=y
+UCLIBC_HAS_GLOB=y
+
+#
+# Library Installation Options
+#
+SHARED_LIB_LOADER_PREFIX="$(RUNTIME_PREFIX)lib"
+RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/"
+DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/"
+
+#
+# uClibc security related options
+#
+# UCLIBC_SECURITY is not set
+
+#
+# uClibc development/debugging options
+#
+CROSS_COMPILER_PREFIX=""
+# DODEBUG is not set
+# DODEBUG_PT is not set
+# DOASSERTS is not set
+# SUPPORT_LD_DEBUG is not set
+# SUPPORT_LD_DEBUG_EARLY is not set
+WARNINGS="-Wall"
+# UCLIBC_MJN3_ONLY is not set
diff --git a/samples/armeb-unknown-linux-gnu/crosstool.config b/samples/armeb-unknown-linux-gnu/crosstool.config
new file mode 100644
index 00000000..e59523a4
--- /dev/null
+++ b/samples/armeb-unknown-linux-gnu/crosstool.config
@@ -0,0 +1,377 @@
+#
+# Automatically generated make config: don't edit
+# crosstool-NG version: 0.0.1
+# Fri Jan 26 19:25:07 2007
+#
+
+#
+# Paths and misc options
+#
+CT_PARALLEL_JOBS=1
+CT_NICE=0
+
+#
+# Paths
+#
+CT_TARBALLS_DIR="${HOME}/dev/src"
+CT_SRC_DIR="${HOME}/x-tools/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}/src"
+CT_BUILD_DIR="${HOME}/x-tools/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}/build"
+CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}"
+CT_INSTALL_DIR="${CT_PREFIX_DIR}"
+
+#
+# Downloading and extracting
+#
+# CT_NO_DOWNLOAD is not set
+# CT_ONLY_DOWNLOAD is not set
+# CT_FORCE_DOWNLOAD is not set
+# CT_FORCE_EXTRACT is not set
+
+#
+# Logging
+#
+# CT_LOG_ERROR is not set
+# CT_LOG_WARN is not set
+# CT_LOG_INFO is not set
+CT_LOG_EXTRA=y
+# CT_LOG_DEBUG is not set
+CT_LOG_LEVEL_MAX="EXTRA"
+# CT_LOG_PROGRESS_BAR is not set
+# CT_LOG_USE_COLORS is not set
+CT_LOG_TO_FILE=y
+CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log"
+
+#
+# Target options
+#
+
+#
+# General target options
+#
+CT_ARCH_ARM=y
+# CT_ARCH_MIPS is not set
+# CT_ARCH_x86 is not set
+# CT_ARCH_x86_64 is not set
+CT_ARCH_BE=y
+# CT_ARCH_LE is not set
+# CT_ARCH_FLOAT_HW is not set
+CT_ARCH_FLOAT_SW=y
+
+#
+# Target optimisations
+#
+CT_ARCH_CPU="xscale"
+CT_ARCH_TUNE="xscale"
+CT_ARCH_ARCH="armv5te"
+CT_TARGET_CFLAGS=""
+
+#
+# Toolchain options
+#
+CT_USE_SYSROOT=y
+CT_SHARED_LIBS=y
+CT_TARGET_VENDOR="unknown"
+CT_ARCH="arm"
+CT_BUILD=""
+CT_CC_NATIVE="gcc"
+# CT_CANADIAN is not set
+CT_HOST=""
+CT_HOST_CC=""
+
+#
+# Kernel
+#
+CT_KERNEL_LINUX=y
+# CT_KERNEL_CYGWIN is not set
+CT_KERNEL_VERSION="2.6.19.1"
+CT_KERNEL_LINUX_HEADERS_INSTALL=y
+# CT_KERNEL_LINUX_HEADERS_SANITISED is not set
+# CT_KERNEL_LINUX_HEADERS_COPY is not set
+CT_KERNEL="linux"
+CT_KERNEL_VERSION_SEE_EXTRAVERSION=y
+# CT_KERNEL_INSTALL_V_2_6_18 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_1 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_2 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_3 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_4 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_5 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_6 is not set
+# CT_KERNEL_INSTALL_V_2_6_19 is not set
+CT_KERNEL_INSTALL_V_2_6_19_1=y
+# CT_KERNEL_COPY_V_2_6_0 is not set
+# CT_KERNEL_COPY_V_2_6_1 is not set
+# CT_KERNEL_COPY_V_2_6_2 is not set
+# CT_KERNEL_COPY_V_2_6_3 is not set
+# CT_KERNEL_COPY_V_2_6_4 is not set
+# CT_KERNEL_COPY_V_2_6_5 is not set
+# CT_KERNEL_COPY_V_2_6_6 is not set
+# CT_KERNEL_COPY_V_2_6_7 is not set
+# CT_KERNEL_COPY_V_2_6_8 is not set
+# CT_KERNEL_COPY_V_2_6_8_1 is not set
+# CT_KERNEL_COPY_V_2_6_9 is not set
+# CT_KERNEL_COPY_V_2_6_10 is not set
+# CT_KERNEL_COPY_V_2_6_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_1 is not set
+# CT_KERNEL_COPY_V_2_6_11_10 is not set
+# CT_KERNEL_COPY_V_2_6_11_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_12 is not set
+# CT_KERNEL_COPY_V_2_6_11_2 is not set
+# CT_KERNEL_COPY_V_2_6_11_3 is not set
+# CT_KERNEL_COPY_V_2_6_11_4 is not set
+# CT_KERNEL_COPY_V_2_6_11_5 is not set
+# CT_KERNEL_COPY_V_2_6_11_6 is not set
+# CT_KERNEL_COPY_V_2_6_11_7 is not set
+# CT_KERNEL_COPY_V_2_6_11_8 is not set
+# CT_KERNEL_COPY_V_2_6_11_9 is not set
+# CT_KERNEL_COPY_V_2_6_12 is not set
+# CT_KERNEL_COPY_V_2_6_12_1 is not set
+# CT_KERNEL_COPY_V_2_6_12_2 is not set
+# CT_KERNEL_COPY_V_2_6_12_3 is not set
+# CT_KERNEL_COPY_V_2_6_12_4 is not set
+# CT_KERNEL_COPY_V_2_6_12_5 is not set
+# CT_KERNEL_COPY_V_2_6_12_6 is not set
+# CT_KERNEL_COPY_V_2_6_13 is not set
+# CT_KERNEL_COPY_V_2_6_13_1 is not set
+# CT_KERNEL_COPY_V_2_6_13_2 is not set
+# CT_KERNEL_COPY_V_2_6_13_3 is not set
+# CT_KERNEL_COPY_V_2_6_13_4 is not set
+# CT_KERNEL_COPY_V_2_6_13_5 is not set
+# CT_KERNEL_COPY_V_2_6_14 is not set
+# CT_KERNEL_COPY_V_2_6_14_1 is not set
+# CT_KERNEL_COPY_V_2_6_14_2 is not set
+# CT_KERNEL_COPY_V_2_6_14_3 is not set
+# CT_KERNEL_COPY_V_2_6_14_4 is not set
+# CT_KERNEL_COPY_V_2_6_14_5 is not set
+# CT_KERNEL_COPY_V_2_6_14_6 is not set
+# CT_KERNEL_COPY_V_2_6_14_7 is not set
+# CT_KERNEL_COPY_V_2_6_15 is not set
+# CT_KERNEL_COPY_V_2_6_15_1 is not set
+# CT_KERNEL_COPY_V_2_6_15_2 is not set
+# CT_KERNEL_COPY_V_2_6_15_3 is not set
+# CT_KERNEL_COPY_V_2_6_15_4 is not set
+# CT_KERNEL_COPY_V_2_6_15_5 is not set
+# CT_KERNEL_COPY_V_2_6_15_6 is not set
+# CT_KERNEL_COPY_V_2_6_15_7 is not set
+# CT_KERNEL_COPY_V_2_6_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_1 is not set
+# CT_KERNEL_COPY_V_2_6_16_10 is not set
+# CT_KERNEL_COPY_V_2_6_16_11 is not set
+# CT_KERNEL_COPY_V_2_6_16_12 is not set
+# CT_KERNEL_COPY_V_2_6_16_13 is not set
+# CT_KERNEL_COPY_V_2_6_16_14 is not set
+# CT_KERNEL_COPY_V_2_6_16_15 is not set
+# CT_KERNEL_COPY_V_2_6_16_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_17 is not set
+# CT_KERNEL_COPY_V_2_6_16_18 is not set
+# CT_KERNEL_COPY_V_2_6_16_19 is not set
+# CT_KERNEL_COPY_V_2_6_16_2 is not set
+# CT_KERNEL_COPY_V_2_6_16_20 is not set
+# CT_KERNEL_COPY_V_2_6_16_21 is not set
+# CT_KERNEL_COPY_V_2_6_16_22 is not set
+# CT_KERNEL_COPY_V_2_6_16_23 is not set
+# CT_KERNEL_COPY_V_2_6_16_24 is not set
+# CT_KERNEL_COPY_V_2_6_16_25 is not set
+# CT_KERNEL_COPY_V_2_6_16_26 is not set
+# CT_KERNEL_COPY_V_2_6_16_27 is not set
+# CT_KERNEL_COPY_V_2_6_16_28 is not set
+# CT_KERNEL_COPY_V_2_6_16_29 is not set
+# CT_KERNEL_COPY_V_2_6_16_3 is not set
+# CT_KERNEL_COPY_V_2_6_16_30 is not set
+# CT_KERNEL_COPY_V_2_6_16_31 is not set
+# CT_KERNEL_COPY_V_2_6_16_32 is not set
+# CT_KERNEL_COPY_V_2_6_16_33 is not set
+# CT_KERNEL_COPY_V_2_6_16_34 is not set
+# CT_KERNEL_COPY_V_2_6_16_35 is not set
+# CT_KERNEL_COPY_V_2_6_16_36 is not set
+# CT_KERNEL_COPY_V_2_6_16_4 is not set
+# CT_KERNEL_COPY_V_2_6_16_5 is not set
+# CT_KERNEL_COPY_V_2_6_16_6 is not set
+# CT_KERNEL_COPY_V_2_6_16_7 is not set
+# CT_KERNEL_COPY_V_2_6_16_8 is not set
+# CT_KERNEL_COPY_V_2_6_16_9 is not set
+# CT_KERNEL_COPY_V_2_6_17 is not set
+# CT_KERNEL_COPY_V_2_6_17_1 is not set
+# CT_KERNEL_COPY_V_2_6_17_10 is not set
+# CT_KERNEL_COPY_V_2_6_17_11 is not set
+# CT_KERNEL_COPY_V_2_6_17_12 is not set
+# CT_KERNEL_COPY_V_2_6_17_13 is not set
+# CT_KERNEL_COPY_V_2_6_17_14 is not set
+# CT_KERNEL_COPY_V_2_6_17_2 is not set
+# CT_KERNEL_COPY_V_2_6_17_3 is not set
+# CT_KERNEL_COPY_V_2_6_17_4 is not set
+# CT_KERNEL_COPY_V_2_6_17_5 is not set
+# CT_KERNEL_COPY_V_2_6_17_6 is not set
+# CT_KERNEL_COPY_V_2_6_17_7 is not set
+# CT_KERNEL_COPY_V_2_6_17_8 is not set
+# CT_KERNEL_COPY_V_2_6_17_9 is not set
+# CT_KERNEL_COPY_V_2_6_18 is not set
+# CT_KERNEL_COPY_V_2_6_18_1 is not set
+# CT_KERNEL_COPY_V_2_6_18_2 is not set
+# CT_KERNEL_COPY_V_2_6_18_3 is not set
+# CT_KERNEL_COPY_V_2_6_18_4 is not set
+# CT_KERNEL_COPY_V_2_6_18_5 is not set
+# CT_KERNEL_COPY_V_2_6_18_6 is not set
+# CT_KERNEL_COPY_V_2_6_19 is not set
+# CT_KERNEL_COPY_V_2_6_19_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_7_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_10_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_2 is not set
+# CT_KERNEL_SANITISED_V_2_6_12_0 is not set
+CT_KERNEL_LINUX_VERBOSITY_0=y
+# CT_KERNEL_LINUX_VERBOSITY_1 is not set
+# CT_KERNEL_LINUX_VERBOSITY_2 is not set
+CT_KERNEL_LINUX_VERBOSE_LEVEL=0
+CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config"
+
+#
+# binutils
+#
+CT_BINUTILS_VERSION="2.17.50.0.8"
+# CT_BINUTILS_V_2_11_2 is not set
+# CT_BINUTILS_V_2_13_90 is not set
+# CT_BINUTILS_V_2_14 is not set
+# CT_BINUTILS_V_2_14_90 is not set
+# CT_BINUTILS_V_2_14_92 is not set
+# CT_BINUTILS_V_2_15 is not set
+# CT_BINUTILS_V_2_15_90 is not set
+# CT_BINUTILS_V_2_15_91 is not set
+# CT_BINUTILS_V_2_16 is not set
+# CT_BINUTILS_V_2_16_1 is not set
+# CT_BINUTILS_V_2_17 is not set
+# CT_BINUTILS_V_2_17_50_0_1 is not set
+# CT_BINUTILS_V_2_17_50_0_2 is not set
+# CT_BINUTILS_V_2_17_50_0_3 is not set
+# CT_BINUTILS_V_2_17_50_0_4 is not set
+# CT_BINUTILS_V_2_17_50_0_5 is not set
+# CT_BINUTILS_V_2_17_50_0_6 is not set
+# CT_BINUTILS_V_2_17_50_0_7 is not set
+CT_BINUTILS_V_2_17_50_0_8=y
+CT_BINUTILS_EXTRA_CONFIG=""
+
+#
+# C compiler
+#
+
+#
+# Core C Compiler (used to build the C library)
+#
+# CT_CC_USE_CORE is not set
+CT_CC_CORE_GCC=y
+# CT_CC_CORE_TCC is not set
+CT_CC_CORE_VERSION=""
+CT_CC_CORE="gcc"
+# CT_CC_CORE_V_2_95_3 is not set
+# CT_CC_CORE_V_3_2_3 is not set
+# CT_CC_CORE_V_3_3 is not set
+# CT_CC_CORE_V_3_3_1 is not set
+# CT_CC_CORE_V_3_3_2 is not set
+# CT_CC_CORE_V_3_3_3 is not set
+# CT_CC_CORE_V_3_3_4 is not set
+# CT_CC_CORE_V_3_3_5 is not set
+# CT_CC_CORE_V_3_3_6 is not set
+# CT_CC_CORE_V_3_4_0 is not set
+# CT_CC_CORE_V_3_4_1 is not set
+# CT_CC_CORE_V_3_4_2 is not set
+# CT_CC_CORE_V_3_4_3 is not set
+# CT_CC_CORE_V_3_4_4 is not set
+# CT_CC_CORE_V_3_4_5 is not set
+# CT_CC_CORE_V_3_4_6 is not set
+# CT_CC_CORE_V_4_0_0 is not set
+# CT_CC_CORE_V_4_0_1 is not set
+# CT_CC_CORE_V_4_0_2 is not set
+# CT_CC_CORE_V_4_0_3 is not set
+# CT_CC_CORE_V_4_1_0 is not set
+# CT_CC_CORE_V_4_1_1 is not set
+CT_CC_CORE_EXTRA_CONFIG=""
+
+#
+# Final C compiler
+#
+CT_CC_GCC=y
+CT_CC_VERSION="3.4.4"
+CT_CC="gcc"
+# CT_CC_V_2_95_3 is not set
+# CT_CC_V_3_2_3 is not set
+# CT_CC_V_3_3 is not set
+# CT_CC_V_3_3_1 is not set
+# CT_CC_V_3_3_2 is not set
+# CT_CC_V_3_3_3 is not set
+# CT_CC_V_3_3_4 is not set
+# CT_CC_V_3_3_5 is not set
+# CT_CC_V_3_3_6 is not set
+# CT_CC_V_3_4_0 is not set
+# CT_CC_V_3_4_1 is not set
+# CT_CC_V_3_4_2 is not set
+# CT_CC_V_3_4_3 is not set
+CT_CC_V_3_4_4=y
+# CT_CC_V_3_4_5 is not set
+# CT_CC_V_4_0_0 is not set
+# CT_CC_V_4_0_1 is not set
+# CT_CC_V_4_0_2 is not set
+# CT_CC_V_4_1_0 is not set
+# CT_CC_V_4_1_1 is not set
+CT_CC_EXTRA_CONFIG=""
+CT_CC_SUPPORT_C=y
+CT_CC_SUPPORT_CXX=y
+CT_CC_SUPPORT_JAVA=y
+
+#
+# Supported languages:
+#
+CT_CC_LANG_C=y
+# CT_CC_LANG_CXX is not set
+# CT_CC_LANG_JAVA is not set
+
+#
+# C-library
+#
+# CT_LIBC_GLIBC is not set
+CT_LIBC_UCLIBC=y
+CT_LIBC_VERSION="20070103"
+CT_LIBC="uClibc"
+# CT_LIBC_V_1_09_1 is not set
+# CT_LIBC_V_2_0_1 is not set
+# CT_LIBC_V_2_0_6 is not set
+# CT_LIBC_V_2_1_1 is not set
+# CT_LIBC_V_2_1_2 is not set
+# CT_LIBC_V_2_1_3 is not set
+# CT_LIBC_V_2_2 is not set
+# CT_LIBC_V_2_2_1 is not set
+# CT_LIBC_V_2_2_2 is not set
+# CT_LIBC_V_2_2_3 is not set
+# CT_LIBC_V_2_2_4 is not set
+# CT_LIBC_V_2_2_5 is not set
+# CT_LIBC_V_2_3 is not set
+# CT_LIBC_V_2_3_1 is not set
+# CT_LIBC_V_2_3_2 is not set
+# CT_LIBC_V_2_3_3 is not set
+# CT_LIBC_V_2_3_4 is not set
+# CT_LIBC_V_2_3_5 is not set
+# CT_LIBC_V_2_3_6 is not set
+# CT_LIBC_V_2_4 is not set
+# CT_LIBC_V_2_5 is not set
+# CT_LIBC_GLIBC_THREADS_NPTL is not set
+# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set
+# CT_LIBC_GLIBC_THREADS_NONE is not set
+CT_LIBC_GLIBC_EXTRA_CONFIG=""
+CT_LIBC_GLIBC_EXTRA_CFLAGS=""
+CT_LIBC_EXTRA_CC_ARGS=""
+CT_LIBC_GLIBC_CONFIGPARMS=""
+CT_LIBC_ADDONS=""
+# CT_LIBC_V_snapshot is not set
+CT_LIBC_V_specific_date=y
+# CT_LIBC_V_0_9_26 is not set
+# CT_LIBC_V_0_9_27 is not set
+# CT_LIBC_V_0_9_28 is not set
+CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
+CT_LIBC_UCLIBC_DEBUG_LEVEL=0
+CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
+# CT_LIBC_UCLIBC_LOCALES is not set
diff --git a/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config b/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config
new file mode 100644
index 00000000..a3c490ce
--- /dev/null
+++ b/samples/armeb-unknown-linux-gnu/linux-2.6.19.1.config
@@ -0,0 +1,1197 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19.1
+# Sat Dec 23 17:36:49 2006
+#
+CONFIG_ARM=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION="-nslu2"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+CONFIG_ARCH_IXP4XX=y
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
+
+#
+# Intel IXP4xx Implementation Options
+#
+
+#
+# IXP4xx Platforms
+#
+CONFIG_MACH_NSLU2=y
+# CONFIG_ARCH_AVILA is not set
+# CONFIG_ARCH_ADI_COYOTE is not set
+# CONFIG_ARCH_IXDP425 is not set
+# CONFIG_MACH_IXDPG425 is not set
+# CONFIG_MACH_IXDP465 is not set
+# CONFIG_ARCH_PRPMC1100 is not set
+# CONFIG_MACH_NAS100D is not set
+# CONFIG_MACH_GTWX5715 is not set
+
+#
+# IXP4xx Options
+#
+CONFIG_DMABOUNCE=y
+# CONFIG_IXP4XX_INDIRECT_PCI is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+CONFIG_CPU_BIG_ENDIAN=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+CONFIG_PCI=y
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=1f03 mem=32M"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+# CONFIG_APM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_ARM_INTEGRATOR=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_SMC91X=y
+# CONFIG_DM9000 is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_PCI=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=m
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_IXP4XX=y
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_IOP3XX is not set
+# CONFIG_I2C_IXP4XX is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+CONFIG_SENSORS_EEPROM=m
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+CONFIG_FONT_ACORN_8x8=y
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_HDA_INTEL is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+
+#
+# ALSA ARM devices
+#
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_MINIX_FS=y
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=m
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=m
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_WAITQ is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
diff --git a/samples/armeb-unknown-linux-uclibc/crosstool.config b/samples/armeb-unknown-linux-uclibc/crosstool.config
new file mode 100644
index 00000000..dfc8c0df
--- /dev/null
+++ b/samples/armeb-unknown-linux-uclibc/crosstool.config
@@ -0,0 +1,390 @@
+#
+# Automatically generated make config: don't edit
+# crosstool-NG version: 0.0.1
+# Sat Feb 17 15:37:13 2007
+#
+
+#
+# Paths and misc options
+#
+CT_PARALLEL_JOBS=1
+CT_LOAD=0
+CT_NICE=5
+CT_USE_PIPES=y
+
+#
+# Paths
+#
+CT_TARBALLS_DIR="${HOME}/dev/src"
+CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}"
+CT_INSTALL_DIR="${CT_PREFIX_DIR}"
+
+#
+# Downloading and extracting
+#
+# CT_NO_DOWNLOAD is not set
+# CT_ONLY_DOWNLOAD is not set
+# CT_FORCE_DOWNLOAD is not set
+# CT_FORCE_EXTRACT is not set
+
+#
+# Logging
+#
+# CT_LOG_ERROR is not set
+# CT_LOG_WARN is not set
+# CT_LOG_INFO is not set
+CT_LOG_EXTRA=y
+# CT_LOG_DEBUG is not set
+CT_LOG_LEVEL_MAX="EXTRA"
+# CT_LOG_PROGRESS_BAR is not set
+# CT_LOG_USE_COLORS is not set
+CT_LOG_TO_FILE=y
+CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log"
+
+#
+# Target options
+#
+
+#
+# General target options
+#
+CT_ARCH_ARM=y
+# CT_ARCH_MIPS is not set
+# CT_ARCH_x86 is not set
+# CT_ARCH_x86_64 is not set
+CT_ARCH_BE=y
+# CT_ARCH_LE is not set
+
+#
+# Target optimisations
+#
+CT_ARCH_CPU="xscale"
+CT_ARCH_TUNE="xscale"
+CT_ARCH_ARCH="armv5te"
+CT_ARCH_FPU=""
+# CT_ARCH_FLOAT_HW is not set
+CT_ARCH_FLOAT_SW=y
+CT_TARGET_CFLAGS=""
+
+#
+# Toolchain options
+#
+CT_USE_SYSROOT=y
+CT_SHARED_LIBS=y
+CT_TARGET_VENDOR="unknown"
+CT_TARGET_ALIAS=""
+CT_ARCH="arm"
+CT_BUILD=""
+CT_CC_NATIVE="gcc"
+# CT_CANADIAN is not set
+CT_HOST=""
+CT_HOST_CC=""
+
+#
+# Kernel
+#
+CT_KERNEL_LINUX=y
+# CT_KERNEL_CYGWIN is not set
+CT_KERNEL_VERSION="2.6.19.2"
+CT_KERNEL_LINUX_HEADERS_INSTALL=y
+# CT_KERNEL_LINUX_HEADERS_SANITISED is not set
+# CT_KERNEL_LINUX_HEADERS_COPY is not set
+CT_KERNEL="linux"
+CT_KERNEL_VERSION_SEE_EXTRAVERSION=y
+# CT_KERNEL_INSTALL_V_2_6_18 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_1 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_2 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_3 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_4 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_5 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_6 is not set
+# CT_KERNEL_INSTALL_V_2_6_19 is not set
+# CT_KERNEL_INSTALL_V_2_6_19_1 is not set
+CT_KERNEL_INSTALL_V_2_6_19_2=y
+# CT_KERNEL_INSTALL_V_2_6_20 is not set
+# CT_KERNEL_COPY_V_2_6_0 is not set
+# CT_KERNEL_COPY_V_2_6_1 is not set
+# CT_KERNEL_COPY_V_2_6_2 is not set
+# CT_KERNEL_COPY_V_2_6_3 is not set
+# CT_KERNEL_COPY_V_2_6_4 is not set
+# CT_KERNEL_COPY_V_2_6_5 is not set
+# CT_KERNEL_COPY_V_2_6_6 is not set
+# CT_KERNEL_COPY_V_2_6_7 is not set
+# CT_KERNEL_COPY_V_2_6_8 is not set
+# CT_KERNEL_COPY_V_2_6_8_1 is not set
+# CT_KERNEL_COPY_V_2_6_9 is not set
+# CT_KERNEL_COPY_V_2_6_10 is not set
+# CT_KERNEL_COPY_V_2_6_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_1 is not set
+# CT_KERNEL_COPY_V_2_6_11_10 is not set
+# CT_KERNEL_COPY_V_2_6_11_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_12 is not set
+# CT_KERNEL_COPY_V_2_6_11_2 is not set
+# CT_KERNEL_COPY_V_2_6_11_3 is not set
+# CT_KERNEL_COPY_V_2_6_11_4 is not set
+# CT_KERNEL_COPY_V_2_6_11_5 is not set
+# CT_KERNEL_COPY_V_2_6_11_6 is not set
+# CT_KERNEL_COPY_V_2_6_11_7 is not set
+# CT_KERNEL_COPY_V_2_6_11_8 is not set
+# CT_KERNEL_COPY_V_2_6_11_9 is not set
+# CT_KERNEL_COPY_V_2_6_12 is not set
+# CT_KERNEL_COPY_V_2_6_12_1 is not set
+# CT_KERNEL_COPY_V_2_6_12_2 is not set
+# CT_KERNEL_COPY_V_2_6_12_3 is not set
+# CT_KERNEL_COPY_V_2_6_12_4 is not set
+# CT_KERNEL_COPY_V_2_6_12_5 is not set
+# CT_KERNEL_COPY_V_2_6_12_6 is not set
+# CT_KERNEL_COPY_V_2_6_13 is not set
+# CT_KERNEL_COPY_V_2_6_13_1 is not set
+# CT_KERNEL_COPY_V_2_6_13_2 is not set
+# CT_KERNEL_COPY_V_2_6_13_3 is not set
+# CT_KERNEL_COPY_V_2_6_13_4 is not set
+# CT_KERNEL_COPY_V_2_6_13_5 is not set
+# CT_KERNEL_COPY_V_2_6_14 is not set
+# CT_KERNEL_COPY_V_2_6_14_1 is not set
+# CT_KERNEL_COPY_V_2_6_14_2 is not set
+# CT_KERNEL_COPY_V_2_6_14_3 is not set
+# CT_KERNEL_COPY_V_2_6_14_4 is not set
+# CT_KERNEL_COPY_V_2_6_14_5 is not set
+# CT_KERNEL_COPY_V_2_6_14_6 is not set
+# CT_KERNEL_COPY_V_2_6_14_7 is not set
+# CT_KERNEL_COPY_V_2_6_15 is not set
+# CT_KERNEL_COPY_V_2_6_15_1 is not set
+# CT_KERNEL_COPY_V_2_6_15_2 is not set
+# CT_KERNEL_COPY_V_2_6_15_3 is not set
+# CT_KERNEL_COPY_V_2_6_15_4 is not set
+# CT_KERNEL_COPY_V_2_6_15_5 is not set
+# CT_KERNEL_COPY_V_2_6_15_6 is not set
+# CT_KERNEL_COPY_V_2_6_15_7 is not set
+# CT_KERNEL_COPY_V_2_6_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_1 is not set
+# CT_KERNEL_COPY_V_2_6_16_10 is not set
+# CT_KERNEL_COPY_V_2_6_16_11 is not set
+# CT_KERNEL_COPY_V_2_6_16_12 is not set
+# CT_KERNEL_COPY_V_2_6_16_13 is not set
+# CT_KERNEL_COPY_V_2_6_16_14 is not set
+# CT_KERNEL_COPY_V_2_6_16_15 is not set
+# CT_KERNEL_COPY_V_2_6_16_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_17 is not set
+# CT_KERNEL_COPY_V_2_6_16_18 is not set
+# CT_KERNEL_COPY_V_2_6_16_19 is not set
+# CT_KERNEL_COPY_V_2_6_16_2 is not set
+# CT_KERNEL_COPY_V_2_6_16_20 is not set
+# CT_KERNEL_COPY_V_2_6_16_21 is not set
+# CT_KERNEL_COPY_V_2_6_16_22 is not set
+# CT_KERNEL_COPY_V_2_6_16_23 is not set
+# CT_KERNEL_COPY_V_2_6_16_24 is not set
+# CT_KERNEL_COPY_V_2_6_16_25 is not set
+# CT_KERNEL_COPY_V_2_6_16_26 is not set
+# CT_KERNEL_COPY_V_2_6_16_27 is not set
+# CT_KERNEL_COPY_V_2_6_16_28 is not set
+# CT_KERNEL_COPY_V_2_6_16_29 is not set
+# CT_KERNEL_COPY_V_2_6_16_3 is not set
+# CT_KERNEL_COPY_V_2_6_16_30 is not set
+# CT_KERNEL_COPY_V_2_6_16_31 is not set
+# CT_KERNEL_COPY_V_2_6_16_32 is not set
+# CT_KERNEL_COPY_V_2_6_16_33 is not set
+# CT_KERNEL_COPY_V_2_6_16_34 is not set
+# CT_KERNEL_COPY_V_2_6_16_35 is not set
+# CT_KERNEL_COPY_V_2_6_16_36 is not set
+# CT_KERNEL_COPY_V_2_6_16_4 is not set
+# CT_KERNEL_COPY_V_2_6_16_5 is not set
+# CT_KERNEL_COPY_V_2_6_16_6 is not set
+# CT_KERNEL_COPY_V_2_6_16_7 is not set
+# CT_KERNEL_COPY_V_2_6_16_8 is not set
+# CT_KERNEL_COPY_V_2_6_16_9 is not set
+# CT_KERNEL_COPY_V_2_6_17 is not set
+# CT_KERNEL_COPY_V_2_6_17_1 is not set
+# CT_KERNEL_COPY_V_2_6_17_10 is not set
+# CT_KERNEL_COPY_V_2_6_17_11 is not set
+# CT_KERNEL_COPY_V_2_6_17_12 is not set
+# CT_KERNEL_COPY_V_2_6_17_13 is not set
+# CT_KERNEL_COPY_V_2_6_17_14 is not set
+# CT_KERNEL_COPY_V_2_6_17_2 is not set
+# CT_KERNEL_COPY_V_2_6_17_3 is not set
+# CT_KERNEL_COPY_V_2_6_17_4 is not set
+# CT_KERNEL_COPY_V_2_6_17_5 is not set
+# CT_KERNEL_COPY_V_2_6_17_6 is not set
+# CT_KERNEL_COPY_V_2_6_17_7 is not set
+# CT_KERNEL_COPY_V_2_6_17_8 is not set
+# CT_KERNEL_COPY_V_2_6_17_9 is not set
+# CT_KERNEL_COPY_V_2_6_18 is not set
+# CT_KERNEL_COPY_V_2_6_18_1 is not set
+# CT_KERNEL_COPY_V_2_6_18_2 is not set
+# CT_KERNEL_COPY_V_2_6_18_3 is not set
+# CT_KERNEL_COPY_V_2_6_18_4 is not set
+# CT_KERNEL_COPY_V_2_6_18_5 is not set
+# CT_KERNEL_COPY_V_2_6_18_6 is not set
+# CT_KERNEL_COPY_V_2_6_19 is not set
+# CT_KERNEL_COPY_V_2_6_19_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_7_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_10_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_2 is not set
+# CT_KERNEL_SANITISED_V_2_6_12_0 is not set
+CT_KERNEL_LINUX_VERBOSITY_0=y
+# CT_KERNEL_LINUX_VERBOSITY_1 is not set
+# CT_KERNEL_LINUX_VERBOSITY_2 is not set
+CT_KERNEL_LINUX_VERBOSE_LEVEL=0
+CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config"
+
+#
+# binutils
+#
+CT_BINUTILS_VERSION="2.17.50.0.10"
+# CT_BINUTILS_V_2_11_2 is not set
+# CT_BINUTILS_V_2_13_90 is not set
+# CT_BINUTILS_V_2_14 is not set
+# CT_BINUTILS_V_2_14_90 is not set
+# CT_BINUTILS_V_2_14_92 is not set
+# CT_BINUTILS_V_2_15 is not set
+# CT_BINUTILS_V_2_15_90 is not set
+# CT_BINUTILS_V_2_15_91 is not set
+# CT_BINUTILS_V_2_16 is not set
+# CT_BINUTILS_V_2_16_1 is not set
+# CT_BINUTILS_V_2_17 is not set
+# CT_BINUTILS_V_2_17_50_0_1 is not set
+# CT_BINUTILS_V_2_17_50_0_2 is not set
+# CT_BINUTILS_V_2_17_50_0_3 is not set
+# CT_BINUTILS_V_2_17_50_0_4 is not set
+# CT_BINUTILS_V_2_17_50_0_5 is not set
+# CT_BINUTILS_V_2_17_50_0_6 is not set
+# CT_BINUTILS_V_2_17_50_0_7 is not set
+# CT_BINUTILS_V_2_17_50_0_8 is not set
+# CT_BINUTILS_V_2_17_50_0_9 is not set
+CT_BINUTILS_V_2_17_50_0_10=y
+CT_BINUTILS_EXTRA_CONFIG=""
+
+#
+# C compiler
+#
+
+#
+# Core C Compiler (used to build the C library)
+#
+# CT_CC_USE_CORE is not set
+CT_CC_CORE_GCC=y
+# CT_CC_CORE_TCC is not set
+CT_CC_CORE_VERSION=""
+CT_CC_CORE="gcc"
+# CT_CC_CORE_V_2_95_3 is not set
+# CT_CC_CORE_V_3_2_3 is not set
+# CT_CC_CORE_V_3_3 is not set
+# CT_CC_CORE_V_3_3_1 is not set
+# CT_CC_CORE_V_3_3_2 is not set
+# CT_CC_CORE_V_3_3_3 is not set
+# CT_CC_CORE_V_3_3_4 is not set
+# CT_CC_CORE_V_3_3_5 is not set
+# CT_CC_CORE_V_3_3_6 is not set
+# CT_CC_CORE_V_3_4_0 is not set
+# CT_CC_CORE_V_3_4_1 is not set
+# CT_CC_CORE_V_3_4_2 is not set
+# CT_CC_CORE_V_3_4_3 is not set
+# CT_CC_CORE_V_3_4_4 is not set
+# CT_CC_CORE_V_3_4_5 is not set
+# CT_CC_CORE_V_3_4_6 is not set
+# CT_CC_CORE_V_4_0_0 is not set
+# CT_CC_CORE_V_4_0_1 is not set
+# CT_CC_CORE_V_4_0_2 is not set
+# CT_CC_CORE_V_4_0_3 is not set
+# CT_CC_CORE_V_4_0_4 is not set
+# CT_CC_CORE_V_4_1_0 is not set
+# CT_CC_CORE_V_4_1_1 is not set
+CT_CC_CORE_EXTRA_CONFIG=""
+
+#
+# Final C compiler
+#
+CT_CC_GCC=y
+CT_CC_VERSION="4.0.4"
+CT_CC="gcc"
+# CT_CC_V_2_95_3 is not set
+# CT_CC_V_3_2_3 is not set
+# CT_CC_V_3_3 is not set
+# CT_CC_V_3_3_1 is not set
+# CT_CC_V_3_3_2 is not set
+# CT_CC_V_3_3_3 is not set
+# CT_CC_V_3_3_4 is not set
+# CT_CC_V_3_3_5 is not set
+# CT_CC_V_3_3_6 is not set
+# CT_CC_V_3_4_0 is not set
+# CT_CC_V_3_4_1 is not set
+# CT_CC_V_3_4_2 is not set
+# CT_CC_V_3_4_3 is not set
+# CT_CC_V_3_4_4 is not set
+# CT_CC_V_3_4_5 is not set
+# CT_CC_V_4_0_0 is not set
+# CT_CC_V_4_0_1 is not set
+# CT_CC_V_4_0_2 is not set
+# CT_CC_V_4_0_3 is not set
+CT_CC_V_4_0_4=y
+# CT_CC_V_4_1_0 is not set
+# CT_CC_V_4_1_1 is not set
+CT_CC_EXTRA_CONFIG=""
+CT_CC_SUPPORT_C=y
+CT_CC_SUPPORT_CXX=y
+CT_CC_SUPPORT_JAVA=y
+
+#
+# Supported languages:
+#
+CT_CC_LANG_C=y
+CT_CC_LANG_CXX=y
+# CT_CC_LANG_JAVA is not set
+
+#
+# C-library
+#
+# CT_LIBC_GLIBC is not set
+CT_LIBC_UCLIBC=y
+CT_LIBC_VERSION="0.9.28.1"
+CT_LIBC="uClibc"
+# CT_LIBC_V_1_09_1 is not set
+# CT_LIBC_V_2_0_1 is not set
+# CT_LIBC_V_2_0_6 is not set
+# CT_LIBC_V_2_1_1 is not set
+# CT_LIBC_V_2_1_2 is not set
+# CT_LIBC_V_2_1_3 is not set
+# CT_LIBC_V_2_2 is not set
+# CT_LIBC_V_2_2_1 is not set
+# CT_LIBC_V_2_2_2 is not set
+# CT_LIBC_V_2_2_3 is not set
+# CT_LIBC_V_2_2_4 is not set
+# CT_LIBC_V_2_2_5 is not set
+# CT_LIBC_V_2_3 is not set
+# CT_LIBC_V_2_3_1 is not set
+# CT_LIBC_V_2_3_2 is not set
+# CT_LIBC_V_2_3_3 is not set
+# CT_LIBC_V_2_3_4 is not set
+# CT_LIBC_V_2_3_5 is not set
+# CT_LIBC_V_2_3_6 is not set
+# CT_LIBC_V_2_4 is not set
+# CT_LIBC_V_2_5 is not set
+# CT_LIBC_GLIBC_THREADS_NPTL is not set
+# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set
+# CT_LIBC_GLIBC_THREADS_NONE is not set
+CT_LIBC_GLIBC_EXTRA_CONFIG=""
+CT_LIBC_GLIBC_EXTRA_CFLAGS=""
+CT_LIBC_EXTRA_CC_ARGS=""
+CT_LIBC_GLIBC_CONFIGPARMS=""
+# CT_LIBC_ADDONS is not set
+CT_LIBC_ADDONS_LIST=""
+# CT_LIBC_V_snapshot is not set
+# CT_LIBC_V_specific_date is not set
+# CT_LIBC_V_0_9_26 is not set
+# CT_LIBC_V_0_9_27 is not set
+# CT_LIBC_V_0_9_28 is not set
+CT_LIBC_V_0_9_28_1=y
+CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
+CT_LIBC_UCLIBC_DEBUG_LEVEL=0
+CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
+# CT_LIBC_UCLIBC_LOCALES is not set
diff --git a/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config b/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config
new file mode 100644
index 00000000..a3c490ce
--- /dev/null
+++ b/samples/armeb-unknown-linux-uclibc/linux-2.6.19.2.config
@@ -0,0 +1,1197 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19.1
+# Sat Dec 23 17:36:49 2006
+#
+CONFIG_ARM=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION="-nslu2"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+CONFIG_ARCH_IXP4XX=y
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
+
+#
+# Intel IXP4xx Implementation Options
+#
+
+#
+# IXP4xx Platforms
+#
+CONFIG_MACH_NSLU2=y
+# CONFIG_ARCH_AVILA is not set
+# CONFIG_ARCH_ADI_COYOTE is not set
+# CONFIG_ARCH_IXDP425 is not set
+# CONFIG_MACH_IXDPG425 is not set
+# CONFIG_MACH_IXDP465 is not set
+# CONFIG_ARCH_PRPMC1100 is not set
+# CONFIG_MACH_NAS100D is not set
+# CONFIG_MACH_GTWX5715 is not set
+
+#
+# IXP4xx Options
+#
+CONFIG_DMABOUNCE=y
+# CONFIG_IXP4XX_INDIRECT_PCI is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+CONFIG_CPU_BIG_ENDIAN=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+CONFIG_PCI=y
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=1f03 mem=32M"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+# CONFIG_APM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_ARM_INTEGRATOR=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_SMC91X=y
+# CONFIG_DM9000 is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_PCI=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=m
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_IXP4XX=y
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_IOP3XX is not set
+# CONFIG_I2C_IXP4XX is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+CONFIG_SENSORS_EEPROM=m
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+CONFIG_FONT_ACORN_8x8=y
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_HDA_INTEL is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+
+#
+# ALSA ARM devices
+#
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_MINIX_FS=y
+CONFIG_ROMFS_FS=y
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=m
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=m
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_WAITQ is not set
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
diff --git a/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config b/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config
new file mode 100644
index 00000000..92c4faf6
--- /dev/null
+++ b/samples/armeb-unknown-linux-uclibc/uClibc-0.9.28.2.config
@@ -0,0 +1,169 @@
+#
+# Automatically generated make config: don't edit
+#
+# TARGET_alpha is not set
+TARGET_arm=y
+# TARGET_bfin is not set
+# TARGET_cris is not set
+# TARGET_e1 is not set
+# TARGET_frv is not set
+# TARGET_h8300 is not set
+# TARGET_i386 is not set
+# TARGET_i960 is not set
+# TARGET_m68k is not set
+# TARGET_microblaze is not set
+# TARGET_mips is not set
+# TARGET_nios is not set
+# TARGET_nios2 is not set
+# TARGET_powerpc is not set
+# TARGET_sh is not set
+# TARGET_sh64 is not set
+# TARGET_sparc is not set
+# TARGET_v850 is not set
+# TARGET_x86_64 is not set
+
+#
+# Target Architecture Features and Options
+#
+HAVE_ELF=y
+ARCH_SUPPORTS_LITTLE_ENDIAN=y
+TARGET_ARCH="arm"
+ARCH_SUPPORTS_BIG_ENDIAN=y
+# CONFIG_GENERIC_ARM is not set
+# CONFIG_ARM610 is not set
+# CONFIG_ARM710 is not set
+# CONFIG_ARM720T is not set
+# CONFIG_ARM920T is not set
+# CONFIG_ARM922T is not set
+# CONFIG_ARM926T is not set
+# CONFIG_ARM1136JF_S is not set
+# CONFIG_ARM_SA110 is not set
+# CONFIG_ARM_SA1100 is not set
+CONFIG_ARM_XSCALE=y
+# ARCH_LITTLE_ENDIAN is not set
+ARCH_BIG_ENDIAN=y
+# ARCH_HAS_NO_MMU is not set
+ARCH_HAS_MMU=y
+UCLIBC_HAS_FLOATS=y
+# HAS_FPU is not set
+UCLIBC_HAS_SOFT_FLOAT=y
+DO_C99_MATH=y
+KERNEL_SOURCE="/usr/src/linux"
+C_SYMBOL_PREFIX=""
+HAVE_DOT_CONFIG=y
+
+#
+# General Library Settings
+#
+# HAVE_NO_PIC is not set
+DOPIC=y
+# HAVE_NO_SHARED is not set
+HAVE_SHARED=y
+# ARCH_HAS_NO_LDSO is not set
+BUILD_UCLIBC_LDSO=y
+# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
+LDSO_LDD_SUPPORT=y
+LDSO_CACHE_SUPPORT=y
+# LDSO_PRELOAD_FILE_SUPPORT is not set
+LDSO_BASE_FILENAME="ld.so"
+# LDSO_RUNPATH is not set
+# DL_FINI_CRT_COMPAT is not set
+UCLIBC_CTOR_DTOR=y
+# HAS_NO_THREADS is not set
+UCLIBC_HAS_THREADS=y
+# PTHREADS_DEBUG_SUPPORT is not set
+UCLIBC_HAS_LFS=y
+UCLIBC_STATIC_LDCONFIG=y
+# MALLOC is not set
+# MALLOC_SIMPLE is not set
+MALLOC_STANDARD=y
+# MALLOC_GLIBC_COMPAT is not set
+UCLIBC_DYNAMIC_ATEXIT=y
+HAS_SHADOW=y
+UNIX98PTY_ONLY=y
+ASSUME_DEVPTS=y
+UCLIBC_HAS_TM_EXTENSIONS=y
+# UCLIBC_HAS_TZ_CACHING is not set
+UCLIBC_HAS_TZ_FILE=y
+# UCLIBC_HAS_TZ_FILE_READ_MANY is not set
+UCLIBC_TZ_FILE_PATH="/etc/TZ"
+
+#
+# Networking Support
+#
+# UCLIBC_HAS_IPV6 is not set
+UCLIBC_HAS_RPC=y
+UCLIBC_HAS_FULL_RPC=y
+
+#
+# String and Stdio Support
+#
+UCLIBC_HAS_STRING_GENERIC_OPT=y
+UCLIBC_HAS_STRING_ARCH_OPT=y
+UCLIBC_HAS_CTYPE_TABLES=y
+UCLIBC_HAS_CTYPE_SIGNED=y
+# UCLIBC_HAS_CTYPE_UNSAFE is not set
+# UCLIBC_HAS_CTYPE_CHECKED is not set
+UCLIBC_HAS_CTYPE_ENFORCED=y
+# UCLIBC_HAS_WCHAR is not set
+# UCLIBC_HAS_LOCALE is not set
+UCLIBC_HAS_HEXADECIMAL_FLOATS=y
+# UCLIBC_HAS_GLIBC_CUSTOM_PRINTF is not set
+# USE_OLD_VFPRINTF is not set
+UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
+# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
+UCLIBC_HAS_STDIO_BUFSIZ_4096=y
+# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
+UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
+UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT=y
+UCLIBC_HAS_STDIO_GETC_MACRO=y
+UCLIBC_HAS_STDIO_PUTC_MACRO=y
+UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
+UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y
+UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
+UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
+UCLIBC_HAS_PRINTF_M_SPEC=y
+UCLIBC_HAS_ERRNO_MESSAGES=y
+# UCLIBC_HAS_SYS_ERRLIST is not set
+UCLIBC_HAS_SIGNUM_MESSAGES=y
+# UCLIBC_HAS_SYS_SIGLIST is not set
+UCLIBC_HAS_GNU_GETOPT=y
+
+#
+# Big and Tall
+#
+UCLIBC_HAS_REGEX=y
+UCLIBC_HAS_WORDEXP=y
+UCLIBC_HAS_FTW=y
+UCLIBC_HAS_GLOB=y
+
+#
+# Library Installation Options
+#
+SHARED_LIB_LOADER_PREFIX="$(RUNTIME_PREFIX)lib"
+RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/"
+DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/"
+
+#
+# uClibc security related options
+#
+# UCLIBC_SECURITY is not set
+
+#
+# uClibc development/debugging options
+#
+CROSS_COMPILER_PREFIX=""
+# DODEBUG is not set
+# DODEBUG_PT is not set
+# DOASSERTS is not set
+# SUPPORT_LD_DEBUG is not set
+# SUPPORT_LD_DEBUG_EARLY is not set
+WARNINGS="-Wall"
+# UCLIBC_MJN3_ONLY is not set
diff --git a/samples/i586-geode-linux-uclibc/crosstool.config b/samples/i586-geode-linux-uclibc/crosstool.config
new file mode 100644
index 00000000..dac5019f
--- /dev/null
+++ b/samples/i586-geode-linux-uclibc/crosstool.config
@@ -0,0 +1,386 @@
+#
+# Automatically generated make config: don't edit
+# crosstool-NG version: 0.0.1
+# Sat Feb  3 14:14:42 2007
+#
+
+#
+# Paths and misc options
+#
+CT_PARALLEL_JOBS=1
+CT_LOAD=0
+CT_NICE=5
+CT_USE_PIPES=y
+
+#
+# Paths
+#
+CT_TARBALLS_DIR="${HOME}/dev/src"
+CT_SRC_DIR="${HOME}/x-tools/src/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_BUILD_DIR="${HOME}/x-tools/build/${CT_TARGET}/${CT_CC}-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}"
+CT_PREFIX_DIR="${HOME}/x-tools/${CT_TARGET}"
+CT_INSTALL_DIR="${CT_PREFIX_DIR}"
+
+#
+# Downloading and extracting
+#
+# CT_NO_DOWNLOAD is not set
+# CT_ONLY_DOWNLOAD is not set
+# CT_FORCE_DOWNLOAD is not set
+# CT_FORCE_EXTRACT is not set
+
+#
+# Logging
+#
+# CT_LOG_ERROR is not set
+# CT_LOG_WARN is not set
+# CT_LOG_INFO is not set
+CT_LOG_EXTRA=y
+# CT_LOG_DEBUG is not set
+CT_LOG_LEVEL_MAX="EXTRA"
+# CT_LOG_PROGRESS_BAR is not set
+# CT_LOG_USE_COLORS is not set
+CT_LOG_TO_FILE=y
+CT_LOG_FILE="${CT_PREFIX_DIR}/${CT_TARGET}.log"
+
+#
+# Target options
+#
+
+#
+# General target options
+#
+# CT_ARCH_ARM is not set
+# CT_ARCH_MIPS is not set
+CT_ARCH_x86=y
+# CT_ARCH_x86_64 is not set
+# CT_ARCH_BE is not set
+CT_ARCH_LE=y
+CT_ARCH_FLOAT_HW=y
+# CT_ARCH_FLOAT_SW is not set
+
+#
+# Target optimisations
+#
+CT_ARCH_CPU=""
+CT_ARCH_TUNE=""
+CT_ARCH_ARCH="pentium-mmx"
+CT_TARGET_CFLAGS=""
+
+#
+# Toolchain options
+#
+CT_USE_SYSROOT=y
+CT_SHARED_LIBS=y
+CT_TARGET_VENDOR="geode"
+CT_ARCH="x86"
+CT_BUILD=""
+CT_CC_NATIVE="gcc"
+# CT_CANADIAN is not set
+CT_HOST=""
+CT_HOST_CC=""
+
+#
+# Kernel
+#
+CT_KERNEL_LINUX=y
+# CT_KERNEL_CYGWIN is not set
+CT_KERNEL_VERSION="2.6.19.2"
+CT_KERNEL_LINUX_HEADERS_INSTALL=y
+# CT_KERNEL_LINUX_HEADERS_SANITISED is not set
+# CT_KERNEL_LINUX_HEADERS_COPY is not set
+CT_KERNEL="linux"
+CT_KERNEL_VERSION_SEE_EXTRAVERSION=y
+# CT_KERNEL_INSTALL_V_2_6_18 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_1 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_2 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_3 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_4 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_5 is not set
+# CT_KERNEL_INSTALL_V_2_6_18_6 is not set
+# CT_KERNEL_INSTALL_V_2_6_19 is not set
+# CT_KERNEL_INSTALL_V_2_6_19_1 is not set
+CT_KERNEL_INSTALL_V_2_6_19_2=y
+# CT_KERNEL_COPY_V_2_6_0 is not set
+# CT_KERNEL_COPY_V_2_6_1 is not set
+# CT_KERNEL_COPY_V_2_6_2 is not set
+# CT_KERNEL_COPY_V_2_6_3 is not set
+# CT_KERNEL_COPY_V_2_6_4 is not set
+# CT_KERNEL_COPY_V_2_6_5 is not set
+# CT_KERNEL_COPY_V_2_6_6 is not set
+# CT_KERNEL_COPY_V_2_6_7 is not set
+# CT_KERNEL_COPY_V_2_6_8 is not set
+# CT_KERNEL_COPY_V_2_6_8_1 is not set
+# CT_KERNEL_COPY_V_2_6_9 is not set
+# CT_KERNEL_COPY_V_2_6_10 is not set
+# CT_KERNEL_COPY_V_2_6_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_1 is not set
+# CT_KERNEL_COPY_V_2_6_11_10 is not set
+# CT_KERNEL_COPY_V_2_6_11_11 is not set
+# CT_KERNEL_COPY_V_2_6_11_12 is not set
+# CT_KERNEL_COPY_V_2_6_11_2 is not set
+# CT_KERNEL_COPY_V_2_6_11_3 is not set
+# CT_KERNEL_COPY_V_2_6_11_4 is not set
+# CT_KERNEL_COPY_V_2_6_11_5 is not set
+# CT_KERNEL_COPY_V_2_6_11_6 is not set
+# CT_KERNEL_COPY_V_2_6_11_7 is not set
+# CT_KERNEL_COPY_V_2_6_11_8 is not set
+# CT_KERNEL_COPY_V_2_6_11_9 is not set
+# CT_KERNEL_COPY_V_2_6_12 is not set
+# CT_KERNEL_COPY_V_2_6_12_1 is not set
+# CT_KERNEL_COPY_V_2_6_12_2 is not set
+# CT_KERNEL_COPY_V_2_6_12_3 is not set
+# CT_KERNEL_COPY_V_2_6_12_4 is not set
+# CT_KERNEL_COPY_V_2_6_12_5 is not set
+# CT_KERNEL_COPY_V_2_6_12_6 is not set
+# CT_KERNEL_COPY_V_2_6_13 is not set
+# CT_KERNEL_COPY_V_2_6_13_1 is not set
+# CT_KERNEL_COPY_V_2_6_13_2 is not set
+# CT_KERNEL_COPY_V_2_6_13_3 is not set
+# CT_KERNEL_COPY_V_2_6_13_4 is not set
+# CT_KERNEL_COPY_V_2_6_13_5 is not set
+# CT_KERNEL_COPY_V_2_6_14 is not set
+# CT_KERNEL_COPY_V_2_6_14_1 is not set
+# CT_KERNEL_COPY_V_2_6_14_2 is not set
+# CT_KERNEL_COPY_V_2_6_14_3 is not set
+# CT_KERNEL_COPY_V_2_6_14_4 is not set
+# CT_KERNEL_COPY_V_2_6_14_5 is not set
+# CT_KERNEL_COPY_V_2_6_14_6 is not set
+# CT_KERNEL_COPY_V_2_6_14_7 is not set
+# CT_KERNEL_COPY_V_2_6_15 is not set
+# CT_KERNEL_COPY_V_2_6_15_1 is not set
+# CT_KERNEL_COPY_V_2_6_15_2 is not set
+# CT_KERNEL_COPY_V_2_6_15_3 is not set
+# CT_KERNEL_COPY_V_2_6_15_4 is not set
+# CT_KERNEL_COPY_V_2_6_15_5 is not set
+# CT_KERNEL_COPY_V_2_6_15_6 is not set
+# CT_KERNEL_COPY_V_2_6_15_7 is not set
+# CT_KERNEL_COPY_V_2_6_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_1 is not set
+# CT_KERNEL_COPY_V_2_6_16_10 is not set
+# CT_KERNEL_COPY_V_2_6_16_11 is not set
+# CT_KERNEL_COPY_V_2_6_16_12 is not set
+# CT_KERNEL_COPY_V_2_6_16_13 is not set
+# CT_KERNEL_COPY_V_2_6_16_14 is not set
+# CT_KERNEL_COPY_V_2_6_16_15 is not set
+# CT_KERNEL_COPY_V_2_6_16_16 is not set
+# CT_KERNEL_COPY_V_2_6_16_17 is not set
+# CT_KERNEL_COPY_V_2_6_16_18 is not set
+# CT_KERNEL_COPY_V_2_6_16_19 is not set
+# CT_KERNEL_COPY_V_2_6_16_2 is not set
+# CT_KERNEL_COPY_V_2_6_16_20 is not set
+# CT_KERNEL_COPY_V_2_6_16_21 is not set
+# CT_KERNEL_COPY_V_2_6_16_22 is not set
+# CT_KERNEL_COPY_V_2_6_16_23 is not set
+# CT_KERNEL_COPY_V_2_6_16_24 is not set
+# CT_KERNEL_COPY_V_2_6_16_25 is not set
+# CT_KERNEL_COPY_V_2_6_16_26 is not set
+# CT_KERNEL_COPY_V_2_6_16_27 is not set
+# CT_KERNEL_COPY_V_2_6_16_28 is not set
+# CT_KERNEL_COPY_V_2_6_16_29 is not set
+# CT_KERNEL_COPY_V_2_6_16_3 is not set
+# CT_KERNEL_COPY_V_2_6_16_30 is not set
+# CT_KERNEL_COPY_V_2_6_16_31 is not set
+# CT_KERNEL_COPY_V_2_6_16_32 is not set
+# CT_KERNEL_COPY_V_2_6_16_33 is not set
+# CT_KERNEL_COPY_V_2_6_16_34 is not set
+# CT_KERNEL_COPY_V_2_6_16_35 is not set
+# CT_KERNEL_COPY_V_2_6_16_36 is not set
+# CT_KERNEL_COPY_V_2_6_16_4 is not set
+# CT_KERNEL_COPY_V_2_6_16_5 is not set
+# CT_KERNEL_COPY_V_2_6_16_6 is not set
+# CT_KERNEL_COPY_V_2_6_16_7 is not set
+# CT_KERNEL_COPY_V_2_6_16_8 is not set
+# CT_KERNEL_COPY_V_2_6_16_9 is not set
+# CT_KERNEL_COPY_V_2_6_17 is not set
+# CT_KERNEL_COPY_V_2_6_17_1 is not set
+# CT_KERNEL_COPY_V_2_6_17_10 is not set
+# CT_KERNEL_COPY_V_2_6_17_11 is not set
+# CT_KERNEL_COPY_V_2_6_17_12 is not set
+# CT_KERNEL_COPY_V_2_6_17_13 is not set
+# CT_KERNEL_COPY_V_2_6_17_14 is not set
+# CT_KERNEL_COPY_V_2_6_17_2 is not set
+# CT_KERNEL_COPY_V_2_6_17_3 is not set
+# CT_KERNEL_COPY_V_2_6_17_4 is not set
+# CT_KERNEL_COPY_V_2_6_17_5 is not set
+# CT_KERNEL_COPY_V_2_6_17_6 is not set
+# CT_KERNEL_COPY_V_2_6_17_7 is not set
+# CT_KERNEL_COPY_V_2_6_17_8 is not set
+# CT_KERNEL_COPY_V_2_6_17_9 is not set
+# CT_KERNEL_COPY_V_2_6_18 is not set
+# CT_KERNEL_COPY_V_2_6_18_1 is not set
+# CT_KERNEL_COPY_V_2_6_18_2 is not set
+# CT_KERNEL_COPY_V_2_6_18_3 is not set
+# CT_KERNEL_COPY_V_2_6_18_4 is not set
+# CT_KERNEL_COPY_V_2_6_18_5 is not set
+# CT_KERNEL_COPY_V_2_6_18_6 is not set
+# CT_KERNEL_COPY_V_2_6_19 is not set
+# CT_KERNEL_COPY_V_2_6_19_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_7_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_8_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_9_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_10_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_0 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_1 is not set
+# CT_KERNEL_SANITISED_V_2_6_11_2 is not set
+# CT_KERNEL_SANITISED_V_2_6_12_0 is not set
+CT_KERNEL_LINUX_VERBOSITY_0=y
+# CT_KERNEL_LINUX_VERBOSITY_1 is not set
+# CT_KERNEL_LINUX_VERBOSITY_2 is not set
+CT_KERNEL_LINUX_VERBOSE_LEVEL=0
+CT_KERNEL_LINUX_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_KERNEL}-${CT_KERNEL_VERSION}.config"
+
+#
+# binutils
+#
+CT_BINUTILS_VERSION="2.17.50.0.10"
+# CT_BINUTILS_V_2_11_2 is not set
+# CT_BINUTILS_V_2_13_90 is not set
+# CT_BINUTILS_V_2_14 is not set
+# CT_BINUTILS_V_2_14_90 is not set
+# CT_BINUTILS_V_2_14_92 is not set
+# CT_BINUTILS_V_2_15 is not set
+# CT_BINUTILS_V_2_15_90 is not set
+# CT_BINUTILS_V_2_15_91 is not set
+# CT_BINUTILS_V_2_16 is not set
+# CT_BINUTILS_V_2_16_1 is not set
+# CT_BINUTILS_V_2_17 is not set
+# CT_BINUTILS_V_2_17_50_0_1 is not set
+# CT_BINUTILS_V_2_17_50_0_2 is not set
+# CT_BINUTILS_V_2_17_50_0_3 is not set
+# CT_BINUTILS_V_2_17_50_0_4 is not set
+# CT_BINUTILS_V_2_17_50_0_5 is not set
+# CT_BINUTILS_V_2_17_50_0_6 is not set
+# CT_BINUTILS_V_2_17_50_0_7 is not set
+# CT_BINUTILS_V_2_17_50_0_8 is not set
+# CT_BINUTILS_V_2_17_50_0_9 is not set
+CT_BINUTILS_V_2_17_50_0_10=y
+CT_BINUTILS_EXTRA_CONFIG=""
+
+#
+# C compiler
+#
+
+#
+# Core C Compiler (used to build the C library)
+#
+# CT_CC_USE_CORE is not set
+CT_CC_CORE_GCC=y
+# CT_CC_CORE_TCC is not set
+CT_CC_CORE_VERSION=""
+CT_CC_CORE="gcc"
+# CT_CC_CORE_V_2_95_3 is not set
+# CT_CC_CORE_V_3_2_3 is not set
+# CT_CC_CORE_V_3_3 is not set
+# CT_CC_CORE_V_3_3_1 is not set
+# CT_CC_CORE_V_3_3_2 is not set
+# CT_CC_CORE_V_3_3_3 is not set
+# CT_CC_CORE_V_3_3_4 is not set
+# CT_CC_CORE_V_3_3_5 is not set
+# CT_CC_CORE_V_3_3_6 is not set
+# CT_CC_CORE_V_3_4_0 is not set
+# CT_CC_CORE_V_3_4_1 is not set
+# CT_CC_CORE_V_3_4_2 is not set
+# CT_CC_CORE_V_3_4_3 is not set
+# CT_CC_CORE_V_3_4_4 is not set
+# CT_CC_CORE_V_3_4_5 is not set
+# CT_CC_CORE_V_3_4_6 is not set
+# CT_CC_CORE_V_4_0_0 is not set
+# CT_CC_CORE_V_4_0_1 is not set
+# CT_CC_CORE_V_4_0_2 is not set
+# CT_CC_CORE_V_4_0_3 is not set
+# CT_CC_CORE_V_4_0_4 is not set
+# CT_CC_CORE_V_4_1_0 is not set
+# CT_CC_CORE_V_4_1_1 is not set
+CT_CC_CORE_EXTRA_CONFIG=""
+
+#
+# Final C compiler
+#
+CT_CC_GCC=y
+CT_CC_VERSION="4.1.1"
+CT_CC="gcc"
+# CT_CC_V_2_95_3 is not set
+# CT_CC_V_3_2_3 is not set
+# CT_CC_V_3_3 is not set
+# CT_CC_V_3_3_1 is not set
+# CT_CC_V_3_3_2 is not set
+# CT_CC_V_3_3_3 is not set
+# CT_CC_V_3_3_4 is not set
+# CT_CC_V_3_3_5 is not set
+# CT_CC_V_3_3_6 is not set
+# CT_CC_V_3_4_0 is not set
+# CT_CC_V_3_4_1 is not set
+# CT_CC_V_3_4_2 is not set
+# CT_CC_V_3_4_3 is not set
+# CT_CC_V_3_4_4 is not set
+# CT_CC_V_3_4_5 is not set
+# CT_CC_V_4_0_0 is not set
+# CT_CC_V_4_0_1 is not set
+# CT_CC_V_4_0_2 is not set
+# CT_CC_V_4_0_3 is not set
+# CT_CC_V_4_0_4 is not set
+# CT_CC_V_4_1_0 is not set
+CT_CC_V_4_1_1=y
+CT_CC_EXTRA_CONFIG=""
+CT_CC_SUPPORT_C=y
+CT_CC_SUPPORT_CXX=y
+CT_CC_SUPPORT_JAVA=y
+
+#
+# Supported languages:
+#
+CT_CC_LANG_C=y
+CT_CC_LANG_CXX=y
+# CT_CC_LANG_JAVA is not set
+
+#
+# C-library
+#
+# CT_LIBC_GLIBC is not set
+CT_LIBC_UCLIBC=y
+CT_LIBC_VERSION="0.9.28.1"
+CT_LIBC="uClibc"
+# CT_LIBC_V_1_09_1 is not set
+# CT_LIBC_V_2_0_1 is not set
+# CT_LIBC_V_2_0_6 is not set
+# CT_LIBC_V_2_1_1 is not set
+# CT_LIBC_V_2_1_2 is not set
+# CT_LIBC_V_2_1_3 is not set
+# CT_LIBC_V_2_2 is not set
+# CT_LIBC_V_2_2_1 is not set
+# CT_LIBC_V_2_2_2 is not set
+# CT_LIBC_V_2_2_3 is not set
+# CT_LIBC_V_2_2_4 is not set
+# CT_LIBC_V_2_2_5 is not set
+# CT_LIBC_V_2_3 is not set
+# CT_LIBC_V_2_3_1 is not set
+# CT_LIBC_V_2_3_2 is not set
+# CT_LIBC_V_2_3_3 is not set
+# CT_LIBC_V_2_3_4 is not set
+# CT_LIBC_V_2_3_5 is not set
+# CT_LIBC_V_2_3_6 is not set
+# CT_LIBC_V_2_4 is not set
+# CT_LIBC_V_2_5 is not set
+# CT_LIBC_GLIBC_THREADS_NPTL is not set
+# CT_LIBC_GLIBC_THREADS_LINUXTHREADS is not set
+# CT_LIBC_GLIBC_THREADS_NONE is not set
+CT_LIBC_GLIBC_EXTRA_CONFIG=""
+CT_LIBC_GLIBC_EXTRA_CFLAGS=""
+CT_LIBC_EXTRA_CC_ARGS=""
+CT_LIBC_GLIBC_CONFIGPARMS=""
+CT_LIBC_ADDONS=""
+# CT_LIBC_V_snapshot is not set
+# CT_LIBC_V_specific_date is not set
+# CT_LIBC_V_0_9_26 is not set
+# CT_LIBC_V_0_9_27 is not set
+# CT_LIBC_V_0_9_28 is not set
+CT_LIBC_V_0_9_28_1=y
+CT_LIBC_UCLIBC_DEBUG_LEVEL_0=y
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_1 is not set
+# CT_LIBC_UCLIBC_DEBUG_LEVEL_2 is not set
+CT_LIBC_UCLIBC_DEBUG_LEVEL=0
+CT_LIBC_UCLIBC_CONFIG_FILE="${CT_TOP_DIR}/samples/${CT_TARGET}/${CT_LIBC}-${CT_LIBC_VERSION}.config"
+# CT_LIBC_UCLIBC_LOCALES is not set
diff --git a/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config b/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config
new file mode 100644
index 00000000..b2c383fc
--- /dev/null
+++ b/samples/i586-geode-linux-uclibc/linux-2.6.19.2.config
@@ -0,0 +1,1508 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19.2
+# Wed Jan 31 21:35:53 2007
+#
+CONFIG_X86_32=y
+CONFIG_GENERIC_TIME=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_X86=y
+CONFIG_MMU=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_DMI=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# Processor type and features
+#
+# CONFIG_SMP is not set
+CONFIG_X86_PC=y
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+CONFIG_MGEODEGX1=y
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_L1_CACHE_SHIFT=4
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_X86_PPRO_FENCE=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_ALIGNMENT_16=y
+CONFIG_X86_TSC=y
+# CONFIG_HPET_TIMER is not set
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+# CONFIG_X86_UP_APIC is not set
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_NONFATAL=y
+CONFIG_VM86=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_OLD_INTERFACE=y
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_RESOURCES_64BIT=y
+# CONFIG_HIGHPTE is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+# CONFIG_EFI is not set
+CONFIG_REGPARM=y
+CONFIG_SECCOMP=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x100000
+CONFIG_COMPAT_VDSO=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+
+#
+# Power management options (ACPI, APM)
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SYSFS_DEPRECATED=y
+# CONFIG_SOFTWARE_SUSPEND is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+# CONFIG_ACPI_VIDEO is not set
+# CONFIG_ACPI_HOTKEY is not set
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_ASUS is not set
+# CONFIG_ACPI_IBM is not set
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_BLACKLIST_YEAR=2001
+CONFIG_ACPI_DEBUG=y
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_SYSTEM=y
+CONFIG_X86_PM_TIMER=y
+# CONFIG_ACPI_CONTAINER is not set
+
+#
+# APM (Advanced Power Management) BIOS Support
+#
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+
+#
+# CPUFreq processor drivers
+#
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_POWERNOW_K8_ACPI=y
+# CONFIG_X86_GX_SUSPMOD is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_ICH is not set
+# CONFIG_X86_SPEEDSTEP_SMI is not set
+# CONFIG_X86_P4_CLOCKMOD is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# CONFIG_X86_LONGRUN is not set
+# CONFIG_X86_LONGHAUL is not set
+
+#
+# shared options
+#
+CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+CONFIG_K8_NB=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+# CONFIG_INET6_XFRM_MODE_BEET is not set
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_TCPPROBE is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+CONFIG_BLK_DEV_FD=y
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_IBM_ASM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+# CONFIG_BLK_DEV_HD_IDE is not set
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_BLK_DEV_CMD640 is not set
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_IDEPCI_SHARE_IRQ is not set
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=y
+# CONFIG_BLK_DEV_ATIIXP is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_CS5535 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_NETLINK=y
+# CONFIG_SCSI_PROC_FS is not set
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=y
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+CONFIG_BLK_DEV_3W_XXXX_RAID=y
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+CONFIG_SCSI_AIC7XXX=y
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
+CONFIG_AIC7XXX_RESET_DELAY_MS=5000
+CONFIG_AIC7XXX_DEBUG_ENABLE=y
+CONFIG_AIC7XXX_DEBUG_MASK=0
+CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+CONFIG_SCSI_AIC79XX=y
+CONFIG_AIC79XX_CMDS_PER_DEVICE=32
+CONFIG_AIC79XX_RESET_DELAY_MS=4000
+# CONFIG_AIC79XX_ENABLE_RD_STRM is not set
+# CONFIG_AIC79XX_DEBUG_ENABLE is not set
+CONFIG_AIC79XX_DEBUG_MASK=0
+# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_SVW=y
+CONFIG_ATA_PIIX=y
+# CONFIG_SATA_MV is not set
+CONFIG_SATA_NV=y
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_SATA_SIL=y
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+CONFIG_SATA_VIA=y
+# CONFIG_SATA_VITESSE is not set
+CONFIG_SATA_INTEL_COMBINED=y
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_DM=y
+# CONFIG_DM_DEBUG is not set
+# CONFIG_DM_CRYPT is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+
+#
+# Fusion MPT device support
+#
+CONFIG_FUSION=y
+CONFIG_FUSION_SPI=y
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+CONFIG_FUSION_MAX_SGE=128
+# CONFIG_FUSION_CTL is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+CONFIG_IEEE1394=y
+
+#
+# Subsystem Options
+#
+# CONFIG_IEEE1394_VERBOSEDEBUG is not set
+# CONFIG_IEEE1394_OUI_DB is not set
+# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
+# CONFIG_IEEE1394_EXPORT_FULL_API is not set
+
+#
+# Device Drivers
+#
+
+#
+# Texas Instruments PCILynx requires I2C
+#
+CONFIG_IEEE1394_OHCI1394=y
+
+#
+# Protocol Drivers
+#
+# CONFIG_IEEE1394_VIDEO1394 is not set
+# CONFIG_IEEE1394_SBP2 is not set
+# CONFIG_IEEE1394_ETH1394 is not set
+# CONFIG_IEEE1394_DV1394 is not set
+CONFIG_IEEE1394_RAWIO=y
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_ULI526X is not set
+# CONFIG_HP100 is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+CONFIG_B44=y
+CONFIG_FORCEDETH=y
+# CONFIG_FORCEDETH_NAPI is not set
+# CONFIG_DGRS is not set
+# CONFIG_EEPRO100 is not set
+CONFIG_E100=y
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+CONFIG_8139CP=y
+CONFIG_8139TOO=y
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=y
+# CONFIG_E1000_NAPI is not set
+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_R8169=y
+# CONFIG_R8169_NAPI is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+CONFIG_SKY2=y
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_TIGON3=y
+CONFIG_BNX2=y
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+CONFIG_NETCONSOLE=y
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_INTEL=y
+CONFIG_HW_RANDOM_AMD=y
+CONFIG_HW_RANDOM_GEODE=y
+CONFIG_HW_RANDOM_VIA=y
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+CONFIG_AGP=y
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_ATI is not set
+# CONFIG_AGP_AMD is not set
+CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL=y
+# CONFIG_AGP_NVIDIA is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_SWORKS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AGP_EFFICEON is not set
+# CONFIG_DRM is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_CS5535_GPIO is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=256
+CONFIG_HPET=y
+# CONFIG_HPET_RTC_IRQ is not set
+CONFIG_HPET_MMAP=y
+CONFIG_HANGCHECK_TIMER=y
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128
+CONFIG_VIDEO_SELECT=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=y
+CONFIG_OSS_OBSOLETE_DRIVER=y
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_ES1371 is not set
+CONFIG_SOUND_ICH=y
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_UHCI_HCD=y
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+CONFIG_USB_PRINTER=y
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+CONFIG_USB_HIDINPUT=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+# CONFIG_EDAC is not set
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+# CONFIG_EXT2_FS_SECURITY is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=y
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+# CONFIG_REISERFS_FS_SECURITY is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+# CONFIG_FUSE_FS is not set
+CONFIG_GENERIC_ACL=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Instrumentation Support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_KPROBES=y
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_FRAME_POINTER is not set
+CONFIG_UNWIND_INFO=y
+CONFIG_STACK_UNWIND=y
+# CONFIG_FORCED_INLINING is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_LKDTM is not set
+CONFIG_EARLY_PRINTK=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_RODATA is not set
+# CONFIG_4KSTACKS is not set
+CONFIG_DOUBLEFAULT=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_KTIME_SCALAR=y
diff --git a/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config b/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config
new file mode 100644
index 00000000..7a94163a
--- /dev/null
+++ b/samples/i586-geode-linux-uclibc/uClibc-0.9.28.1.config
@@ -0,0 +1,172 @@
+#
+# Automatically generated make config: don't edit
+#
+# TARGET_alpha is not set
+# TARGET_arm is not set
+# TARGET_bfin is not set
+# TARGET_cris is not set
+# TARGET_e1 is not set
+# TARGET_frv is not set
+# TARGET_h8300 is not set
+TARGET_i386=y
+# TARGET_i960 is not set
+# TARGET_m68k is not set
+# TARGET_microblaze is not set
+# TARGET_mips is not set
+# TARGET_nios is not set
+# TARGET_nios2 is not set
+# TARGET_powerpc is not set
+# TARGET_sh is not set
+# TARGET_sh64 is not set
+# TARGET_sparc is not set
+# TARGET_v850 is not set
+# TARGET_x86_64 is not set
+
+#
+# Target Architecture Features and Options
+#
+HAVE_ELF=y
+ARCH_SUPPORTS_LITTLE_ENDIAN=y
+TARGET_ARCH="i386"
+# CONFIG_GENERIC_386 is not set
+# CONFIG_386 is not set
+# CONFIG_486 is not set
+# CONFIG_586 is not set
+CONFIG_586MMX=y
+# CONFIG_686 is not set
+# CONFIG_PENTIUMII is not set
+# CONFIG_PENTIUMIII is not set
+# CONFIG_PENTIUM4 is not set
+# CONFIG_K6 is not set
+# CONFIG_K7 is not set
+# CONFIG_ELAN is not set
+# CONFIG_CRUSOE is not set
+# CONFIG_WINCHIPC6 is not set
+# CONFIG_WINCHIP2 is not set
+# CONFIG_CYRIXIII is not set
+# CONFIG_NEHEMIAH is not set
+ARCH_LITTLE_ENDIAN=y
+# ARCH_BIG_ENDIAN is not set
+# ARCH_HAS_NO_MMU is not set
+ARCH_HAS_MMU=y
+UCLIBC_HAS_FLOATS=y
+HAS_FPU=y
+DO_C99_MATH=y
+KERNEL_SOURCE="/usr/src/linux"
+C_SYMBOL_PREFIX=""
+HAVE_DOT_CONFIG=y
+
+#
+# General Library Settings
+#
+# HAVE_NO_PIC is not set
+DOPIC=y
+# HAVE_NO_SHARED is not set
+HAVE_SHARED=y
+# ARCH_HAS_NO_LDSO is not set
+BUILD_UCLIBC_LDSO=y
+# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
+LDSO_LDD_SUPPORT=y
+LDSO_CACHE_SUPPORT=y
+# LDSO_PRELOAD_FILE_SUPPORT is not set
+LDSO_BASE_FILENAME="ld.so"
+# LDSO_RUNPATH is not set
+# DL_FINI_CRT_COMPAT is not set
+UCLIBC_CTOR_DTOR=y
+# HAS_NO_THREADS is not set
+UCLIBC_HAS_THREADS=y
+# PTHREADS_DEBUG_SUPPORT is not set
+UCLIBC_HAS_LFS=y
+UCLIBC_STATIC_LDCONFIG=y
+# MALLOC is not set
+# MALLOC_SIMPLE is not set
+MALLOC_STANDARD=y
+# MALLOC_GLIBC_COMPAT is not set
+UCLIBC_DYNAMIC_ATEXIT=y
+HAS_SHADOW=y
+UNIX98PTY_ONLY=y
+ASSUME_DEVPTS=y
+UCLIBC_HAS_TM_EXTENSIONS=y
+UCLIBC_HAS_TZ_CACHING=y
+UCLIBC_HAS_TZ_FILE=y
+UCLIBC_HAS_TZ_FILE_READ_MANY=y
+UCLIBC_TZ_FILE_PATH="/etc/TZ"
+
+#
+# Networking Support
+#
+# UCLIBC_HAS_IPV6 is not set
+UCLIBC_HAS_RPC=y
+UCLIBC_HAS_FULL_RPC=y
+
+#
+# String and Stdio Support
+#
+UCLIBC_HAS_STRING_GENERIC_OPT=y
+UCLIBC_HAS_STRING_ARCH_OPT=y
+UCLIBC_HAS_CTYPE_TABLES=y
+UCLIBC_HAS_CTYPE_SIGNED=y
+UCLIBC_HAS_CTYPE_UNSAFE=y
+# UCLIBC_HAS_CTYPE_CHECKED is not set
+# UCLIBC_HAS_CTYPE_ENFORCED is not set
+UCLIBC_HAS_WCHAR=y
+# UCLIBC_HAS_LOCALE is not set
+UCLIBC_HAS_HEXADECIMAL_FLOATS=y
+UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
+UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
+# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
+UCLIBC_HAS_STDIO_BUFSIZ_4096=y
+# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE is not set
+UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4=y
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
+# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
+UCLIBC_HAS_STDIO_GETC_MACRO=y
+UCLIBC_HAS_STDIO_PUTC_MACRO=y
+UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
+# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
+UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
+UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
+UCLIBC_HAS_PRINTF_M_SPEC=y
+UCLIBC_HAS_ERRNO_MESSAGES=y
+# UCLIBC_HAS_SYS_ERRLIST is not set
+UCLIBC_HAS_SIGNUM_MESSAGES=y
+# UCLIBC_HAS_SYS_SIGLIST is not set
+UCLIBC_HAS_GNU_GETOPT=y
+
+#
+# Big and Tall
+#
+UCLIBC_HAS_REGEX=y
+UCLIBC_HAS_WORDEXP=y
+UCLIBC_HAS_FTW=y
+UCLIBC_HAS_GLOB=y
+
+#
+# Library Installation Options
+#
+SHARED_LIB_LOADER_PREFIX="$(DEVEL_PREFIX)/lib"
+RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/"
+DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/"
+
+#
+# uClibc security related options
+#
+# UCLIBC_SECURITY is not set
+
+#
+# uClibc development/debugging options
+#
+CROSS_COMPILER_PREFIX=""
+# DODEBUG is not set
+# DODEBUG_PT is not set
+# DOASSERTS is not set
+# SUPPORT_LD_DEBUG is not set
+# SUPPORT_LD_DEBUG_EARLY is not set
+WARNINGS="-Wall"
+# UCLIBC_MJN3_ONLY is not set
diff --git a/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config b/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config
new file mode 100644
index 00000000..b2c383fc
--- /dev/null
+++ b/samples/i686-unknown-linux-uclibc/linux-2.6.19.2.config
@@ -0,0 +1,1508 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19.2
+# Wed Jan 31 21:35:53 2007
+#
+CONFIG_X86_32=y
+CONFIG_GENERIC_TIME=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_SEMAPHORE_SLEEPERS=y
+CONFIG_X86=y
+CONFIG_MMU=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_DMI=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# Processor type and features
+#
+# CONFIG_SMP is not set
+CONFIG_X86_PC=y
+# CONFIG_X86_ELAN is not set
+# CONFIG_X86_VOYAGER is not set
+# CONFIG_X86_NUMAQ is not set
+# CONFIG_X86_SUMMIT is not set
+# CONFIG_X86_BIGSMP is not set
+# CONFIG_X86_VISWS is not set
+# CONFIG_X86_GENERICARCH is not set
+# CONFIG_X86_ES7000 is not set
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M686 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWINCHIP2 is not set
+# CONFIG_MWINCHIP3D is not set
+CONFIG_MGEODEGX1=y
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_X86_GENERIC is not set
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_L1_CACHE_SHIFT=4
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_X86_PPRO_FENCE=y
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_ALIGNMENT_16=y
+CONFIG_X86_TSC=y
+# CONFIG_HPET_TIMER is not set
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+# CONFIG_X86_UP_APIC is not set
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_NONFATAL=y
+CONFIG_VM86=y
+# CONFIG_TOSHIBA is not set
+# CONFIG_I8K is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_OLD_INTERFACE=y
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+
+#
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+# CONFIG_DELL_RBU is not set
+# CONFIG_DCDBAS is not set
+# CONFIG_NOHIGHMEM is not set
+CONFIG_HIGHMEM4G=y
+# CONFIG_HIGHMEM64G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_HIGHMEM=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_RESOURCES_64BIT=y
+# CONFIG_HIGHPTE is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_MTRR=y
+# CONFIG_EFI is not set
+CONFIG_REGPARM=y
+CONFIG_SECCOMP=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x100000
+CONFIG_COMPAT_VDSO=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+
+#
+# Power management options (ACPI, APM)
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SYSFS_DEPRECATED=y
+# CONFIG_SOFTWARE_SUSPEND is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set
+CONFIG_ACPI_AC=y
+CONFIG_ACPI_BATTERY=y
+CONFIG_ACPI_BUTTON=y
+# CONFIG_ACPI_VIDEO is not set
+# CONFIG_ACPI_HOTKEY is not set
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_DOCK is not set
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_ASUS is not set
+# CONFIG_ACPI_IBM is not set
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_BLACKLIST_YEAR=2001
+CONFIG_ACPI_DEBUG=y
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_SYSTEM=y
+CONFIG_X86_PM_TIMER=y
+# CONFIG_ACPI_CONTAINER is not set
+
+#
+# APM (Advanced Power Management) BIOS Support
+#
+# CONFIG_APM is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+
+#
+# CPUFreq processor drivers
+#
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_POWERNOW_K8_ACPI=y
+# CONFIG_X86_GX_SUSPMOD is not set
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_ICH is not set
+# CONFIG_X86_SPEEDSTEP_SMI is not set
+# CONFIG_X86_P4_CLOCKMOD is not set
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+# CONFIG_X86_LONGRUN is not set
+# CONFIG_X86_LONGHAUL is not set
+
+#
+# shared options
+#
+CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+CONFIG_PCI=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+# CONFIG_PCI_GODIRECT is not set
+CONFIG_PCI_GOANY=y
+CONFIG_PCI_BIOS=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISA is not set
+# CONFIG_MCA is not set
+# CONFIG_SCx200 is not set
+CONFIG_K8_NB=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+# CONFIG_INET6_XFRM_MODE_BEET is not set
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_TCPPROBE is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+CONFIG_BLK_DEV_FD=y
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_IBM_ASM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+# CONFIG_BLK_DEV_HD_IDE is not set
+CONFIG_BLK_DEV_IDEDISK=y
+CONFIG_IDEDISK_MULTI_MODE=y
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_BLK_DEV_CMD640 is not set
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_IDEPCI_SHARE_IRQ is not set
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=y
+# CONFIG_BLK_DEV_ATIIXP is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_CS5535 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_NETLINK=y
+# CONFIG_SCSI_PROC_FS is not set
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=y
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+CONFIG_BLK_DEV_3W_XXXX_RAID=y
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+CONFIG_SCSI_AIC7XXX=y
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
+CONFIG_AIC7XXX_RESET_DELAY_MS=5000
+CONFIG_AIC7XXX_DEBUG_ENABLE=y
+CONFIG_AIC7XXX_DEBUG_MASK=0
+CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+CONFIG_SCSI_AIC79XX=y
+CONFIG_AIC79XX_CMDS_PER_DEVICE=32
+CONFIG_AIC79XX_RESET_DELAY_MS=4000
+# CONFIG_AIC79XX_ENABLE_RD_STRM is not set
+# CONFIG_AIC79XX_DEBUG_ENABLE is not set
+CONFIG_AIC79XX_DEBUG_MASK=0
+# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+CONFIG_SATA_SVW=y
+CONFIG_ATA_PIIX=y
+# CONFIG_SATA_MV is not set
+CONFIG_SATA_NV=y
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_SATA_SIL=y
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+CONFIG_SATA_VIA=y
+# CONFIG_SATA_VITESSE is not set
+CONFIG_SATA_INTEL_COMBINED=y
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_DM=y
+# CONFIG_DM_DEBUG is not set
+# CONFIG_DM_CRYPT is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+
+#
+# Fusion MPT device support
+#
+CONFIG_FUSION=y
+CONFIG_FUSION_SPI=y
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+CONFIG_FUSION_MAX_SGE=128
+# CONFIG_FUSION_CTL is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+CONFIG_IEEE1394=y
+
+#
+# Subsystem Options
+#
+# CONFIG_IEEE1394_VERBOSEDEBUG is not set
+# CONFIG_IEEE1394_OUI_DB is not set
+# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
+# CONFIG_IEEE1394_EXPORT_FULL_API is not set
+
+#
+# Device Drivers
+#
+
+#
+# Texas Instruments PCILynx requires I2C
+#
+CONFIG_IEEE1394_OHCI1394=y
+
+#
+# Protocol Drivers
+#
+# CONFIG_IEEE1394_VIDEO1394 is not set
+# CONFIG_IEEE1394_SBP2 is not set
+# CONFIG_IEEE1394_ETH1394 is not set
+# CONFIG_IEEE1394_DV1394 is not set
+CONFIG_IEEE1394_RAWIO=y
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_ULI526X is not set
+# CONFIG_HP100 is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+CONFIG_B44=y
+CONFIG_FORCEDETH=y
+# CONFIG_FORCEDETH_NAPI is not set
+# CONFIG_DGRS is not set
+# CONFIG_EEPRO100 is not set
+CONFIG_E100=y
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+CONFIG_8139CP=y
+CONFIG_8139TOO=y
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=y
+# CONFIG_E1000_NAPI is not set
+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_R8169=y
+# CONFIG_R8169_NAPI is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+CONFIG_SKY2=y
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_TIGON3=y
+CONFIG_BNX2=y
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+CONFIG_NETCONSOLE=y
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_INTEL=y
+CONFIG_HW_RANDOM_AMD=y
+CONFIG_HW_RANDOM_GEODE=y
+CONFIG_HW_RANDOM_VIA=y
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_SONYPI is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+CONFIG_AGP=y
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_ATI is not set
+# CONFIG_AGP_AMD is not set
+CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL=y
+# CONFIG_AGP_NVIDIA is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_SWORKS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AGP_EFFICEON is not set
+# CONFIG_DRM is not set
+# CONFIG_MWAVE is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_NSC_GPIO is not set
+# CONFIG_CS5535_GPIO is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=256
+CONFIG_HPET=y
+# CONFIG_HPET_RTC_IRQ is not set
+CONFIG_HPET_MMAP=y
+CONFIG_HANGCHECK_TIMER=y
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_VGACON_SOFT_SCROLLBACK=y
+CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=128
+CONFIG_VIDEO_SELECT=y
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=y
+CONFIG_OSS_OBSOLETE_DRIVER=y
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_ES1371 is not set
+CONFIG_SOUND_ICH=y
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+# CONFIG_SOUND_OSS is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_UHCI_HCD=y
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+CONFIG_USB_PRINTER=y
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+CONFIG_USB_HIDINPUT=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+# CONFIG_EDAC is not set
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+# CONFIG_EXT2_FS_SECURITY is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=y
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+# CONFIG_REISERFS_FS_SECURITY is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+# CONFIG_FUSE_FS is not set
+CONFIG_GENERIC_ACL=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+# CONFIG_JOLIET is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Instrumentation Support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_KPROBES=y
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_FRAME_POINTER is not set
+CONFIG_UNWIND_INFO=y
+CONFIG_STACK_UNWIND=y
+# CONFIG_FORCED_INLINING is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_LKDTM is not set
+CONFIG_EARLY_PRINTK=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_RODATA is not set
+# CONFIG_4KSTACKS is not set
+CONFIG_DOUBLEFAULT=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_X86_BIOS_REBOOT=y
+CONFIG_KTIME_SCALAR=y
diff --git a/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config b/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config
new file mode 100644
index 00000000..7a94163a
--- /dev/null
+++ b/samples/i686-unknown-linux-uclibc/uClibc-0.9.28.1.config
@@ -0,0 +1,172 @@
+#
+# Automatically generated make config: don't edit
+#
+# TARGET_alpha is not set
+# TARGET_arm is not set
+# TARGET_bfin is not set
+# TARGET_cris is not set
+# TARGET_e1 is not set
+# TARGET_frv is not set
+# TARGET_h8300 is not set
+TARGET_i386=y
+# TARGET_i960 is not set
+# TARGET_m68k is not set
+# TARGET_microblaze is not set
+# TARGET_mips is not set
+# TARGET_nios is not set
+# TARGET_nios2 is not set
+# TARGET_powerpc is not set
+# TARGET_sh is not set
+# TARGET_sh64 is not set
+# TARGET_sparc is not set
+# TARGET_v850 is not set
+# TARGET_x86_64 is not set
+
+#
+# Target Architecture Features and Options
+#
+HAVE_ELF=y
+ARCH_SUPPORTS_LITTLE_ENDIAN=y
+TARGET_ARCH="i386"
+# CONFIG_GENERIC_386 is not set
+# CONFIG_386 is not set
+# CONFIG_486 is not set
+# CONFIG_586 is not set
+CONFIG_586MMX=y
+# CONFIG_686 is not set
+# CONFIG_PENTIUMII is not set
+# CONFIG_PENTIUMIII is not set
+# CONFIG_PENTIUM4 is not set
+# CONFIG_K6 is not set
+# CONFIG_K7 is not set
+# CONFIG_ELAN is not set
+# CONFIG_CRUSOE is not set
+# CONFIG_WINCHIPC6 is not set
+# CONFIG_WINCHIP2 is not set
+# CONFIG_CYRIXIII is not set
+# CONFIG_NEHEMIAH is not set
+ARCH_LITTLE_ENDIAN=y
+# ARCH_BIG_ENDIAN is not set
+# ARCH_HAS_NO_MMU is not set
+ARCH_HAS_MMU=y
+UCLIBC_HAS_FLOATS=y
+HAS_FPU=y
+DO_C99_MATH=y
+KERNEL_SOURCE="/usr/src/linux"
+C_SYMBOL_PREFIX=""
+HAVE_DOT_CONFIG=y
+
+#
+# General Library Settings
+#
+# HAVE_NO_PIC is not set
+DOPIC=y
+# HAVE_NO_SHARED is not set
+HAVE_SHARED=y
+# ARCH_HAS_NO_LDSO is not set
+BUILD_UCLIBC_LDSO=y
+# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
+LDSO_LDD_SUPPORT=y
+LDSO_CACHE_SUPPORT=y
+# LDSO_PRELOAD_FILE_SUPPORT is not set
+LDSO_BASE_FILENAME="ld.so"
+# LDSO_RUNPATH is not set
+# DL_FINI_CRT_COMPAT is not set
+UCLIBC_CTOR_DTOR=y
+# HAS_NO_THREADS is not set
+UCLIBC_HAS_THREADS=y
+# PTHREADS_DEBUG_SUPPORT is not set
+UCLIBC_HAS_LFS=y
+UCLIBC_STATIC_LDCONFIG=y
+# MALLOC is not set
+# MALLOC_SIMPLE is not set
+MALLOC_STANDARD=y
+# MALLOC_GLIBC_COMPAT is not set
+UCLIBC_DYNAMIC_ATEXIT=y
+HAS_SHADOW=y
+UNIX98PTY_ONLY=y
+ASSUME_DEVPTS=y
+UCLIBC_HAS_TM_EXTENSIONS=y
+UCLIBC_HAS_TZ_CACHING=y
+UCLIBC_HAS_TZ_FILE=y
+UCLIBC_HAS_TZ_FILE_READ_MANY=y
+UCLIBC_TZ_FILE_PATH="/etc/TZ"
+
+#
+# Networking Support
+#
+# UCLIBC_HAS_IPV6 is not set
+UCLIBC_HAS_RPC=y
+UCLIBC_HAS_FULL_RPC=y
+
+#
+# String and Stdio Support
+#
+UCLIBC_HAS_STRING_GENERIC_OPT=y
+UCLIBC_HAS_STRING_ARCH_OPT=y
+UCLIBC_HAS_CTYPE_TABLES=y
+UCLIBC_HAS_CTYPE_SIGNED=y
+UCLIBC_HAS_CTYPE_UNSAFE=y
+# UCLIBC_HAS_CTYPE_CHECKED is not set
+# UCLIBC_HAS_CTYPE_ENFORCED is not set
+UCLIBC_HAS_WCHAR=y
+# UCLIBC_HAS_LOCALE is not set
+UCLIBC_HAS_HEXADECIMAL_FLOATS=y
+UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
+UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
+# UCLIBC_HAS_SCANF_GLIBC_A_FLAG is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
+UCLIBC_HAS_STDIO_BUFSIZ_4096=y
+# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE is not set
+UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4=y
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
+# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
+UCLIBC_HAS_STDIO_GETC_MACRO=y
+UCLIBC_HAS_STDIO_PUTC_MACRO=y
+UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
+# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
+UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
+UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
+UCLIBC_HAS_PRINTF_M_SPEC=y
+UCLIBC_HAS_ERRNO_MESSAGES=y
+# UCLIBC_HAS_SYS_ERRLIST is not set
+UCLIBC_HAS_SIGNUM_MESSAGES=y
+# UCLIBC_HAS_SYS_SIGLIST is not set
+UCLIBC_HAS_GNU_GETOPT=y
+
+#
+# Big and Tall
+#
+UCLIBC_HAS_REGEX=y
+UCLIBC_HAS_WORDEXP=y
+UCLIBC_HAS_FTW=y
+UCLIBC_HAS_GLOB=y
+
+#
+# Library Installation Options
+#
+SHARED_LIB_LOADER_PREFIX="$(DEVEL_PREFIX)/lib"
+RUNTIME_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/"
+DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc/usr/"
+
+#
+# uClibc security related options
+#
+# UCLIBC_SECURITY is not set
+
+#
+# uClibc development/debugging options
+#
+CROSS_COMPILER_PREFIX=""
+# DODEBUG is not set
+# DODEBUG_PT is not set
+# DOASSERTS is not set
+# SUPPORT_LD_DEBUG is not set
+# SUPPORT_LD_DEBUG_EARLY is not set
+WARNINGS="-Wall"
+# UCLIBC_MJN3_ONLY is not set
diff --git a/scripts/build/binutils.sh b/scripts/build/binutils.sh
new file mode 100644
index 00000000..26493c43
--- /dev/null
+++ b/scripts/build/binutils.sh
@@ -0,0 +1,39 @@
+# This file adds functions to build binutils
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+do_binutils() {
+    mkdir -p "${CT_BUILD_DIR}/build-binutils"
+    cd "${CT_BUILD_DIR}/build-binutils"
+
+    CT_DoStep INFO "Installing binutils"
+
+    CT_DoLog EXTRA "Configuring binutils"
+    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
+    "${CT_SRC_DIR}/${CT_BINUTILS_FILE}/configure"   \
+        ${CT_CANADIAN_OPT}                          \
+        --target=${CT_TARGET}                       \
+        --host=${CT_HOST}                           \
+        --prefix=${CT_PREFIX_DIR}                   \
+        --disable-nls                               \
+        ${CT_BINUTILS_EXTRA_CONFIG}                 \
+        ${BINUTILS_SYSROOT_ARG}                     2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Building binutils"
+    make ${PARALLELMFLAGS}  2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing binutils"
+    make install            2>&1 |CT_DoLog DEBUG
+
+    # Make those new tools available to the core C compiler to come:
+    # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
+    # well. Create that (libfloat is one such sucker).
+    mkdir -p "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/bin"
+    mkdir -p "${CT_CC_CORE_PREFIX_DIR}/bin"
+    for t in ar as ld strip; do
+        ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
+        ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
+    done |CT_DoLog DEBUG
+
+    CT_EndStep
+}
diff --git a/scripts/build/cc_core_gcc.sh b/scripts/build/cc_core_gcc.sh
new file mode 100644
index 00000000..720a581c
--- /dev/null
+++ b/scripts/build/cc_core_gcc.sh
@@ -0,0 +1,58 @@
+# This file adds the function to build the core gcc C compiler
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+do_cc_core() {
+    mkdir -p "${CT_BUILD_DIR}/build-cc-core"
+    cd "${CT_BUILD_DIR}/build-cc-core"
+
+    CT_DoStep INFO "Installing core C compiler"
+
+    CT_DoLog EXTRA "Copy headers to install area of bootstrap gcc, so it can build libgcc2"
+    mkdir -p "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/include"
+    cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Configuring core C compiler"
+
+    extra_config=""
+    [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft"
+    [ -n "${CT_ARCH_CPU}" ]  && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}"
+    [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}"
+    [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}"
+    [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}"
+
+    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
+
+    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
+    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
+    "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/configure"    \
+        ${CT_CANADIAN_OPT}                          \
+        --target=${CT_TARGET}                       \
+        --host=${CT_HOST}                           \
+        --prefix="${CT_CC_CORE_PREFIX_DIR}"         \
+        --with-local-prefix="${CT_SYSROOT_DIR}"     \
+        --disable-multilib                          \
+        --with-newlib                               \
+        ${CC_CORE_SYSROOT_ARG}                      \
+        ${extra_config}                             \
+        --disable-nls                               \
+        --enable-threads=no                         \
+        --enable-symvers=gnu                        \
+        --enable-__cxa_atexit                       \
+        --enable-languages=c                        \
+        --disable-shared                            \
+        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog DEBUG
+
+    if [ ! "${CT_CANADIAN}" = "y" ]; then
+        CT_DoLog EXTRA "Building libiberty"
+        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog DEBUG
+    fi
+
+    CT_DoLog EXTRA "Building core C compiler"
+    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing core C compiler"
+    make install-gcc 2>&1 |CT_DoLog DEBUG
+
+    CT_EndStep
+}
diff --git a/scripts/build/cc_core_tcc.sh b/scripts/build/cc_core_tcc.sh
new file mode 100644
index 00000000..e69de29b
diff --git a/scripts/build/cc_gcc.sh b/scripts/build/cc_gcc.sh
new file mode 100644
index 00000000..7621d42f
--- /dev/null
+++ b/scripts/build/cc_gcc.sh
@@ -0,0 +1,115 @@
+# This file adds the function to build the final gcc C compiler
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+do_cc() {
+    CT_DoStep INFO "Installing final C compiler"
+
+    mkdir -p "${CT_BUILD_DIR}/build-cc"
+    cd "${CT_BUILD_DIR}/build-cc"
+
+    CT_DoLog EXTRA "Configuring C compiler"
+
+    # Enable selected languages
+    lang_opt="c"
+    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
+    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
+    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
+    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
+    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
+    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
+    CT_Test "Building Fortran language is not yet supported. Will try..." "${CT_CC_LANG_FORTRAN}" = "y"
+    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
+    CT_Test "Building Java language is not yet supported. Will try..." "${CT_CC_LANG_JAVA}" = "y"
+    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
+    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
+    CT_Test "Building ${CT_CC_LANG_OTHERS} language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
+    lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/^(.*),*$/\1/;'`
+
+    extra_config="--enable-languages=${lang_opt}"
+    [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft"
+    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared"
+    [ -n "${CT_ARCH_CPU}" ]  && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}"
+    [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}"
+    [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}"
+    [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}"
+    if [ "${CT_TARGET_MULTILIB}" = "y" ]; then
+       extra_config="${extra_config} --enable-multilib"
+    else
+       extra_config="${extra_config} --disable-multilib"
+    fi
+
+    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
+
+    # --enable-symvers=gnu really only needed for sh4 to work around a
+    # detection problem only matters for gcc-3.2.x and later, I think.
+    # --disable-nls to work around crash bug on ppc405, but also because
+    # embedded systems don't really need message catalogs...
+    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
+    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
+        ${CT_CANADIAN_OPT}                      \
+        --target=${CT_TARGET} --host=${CT_HOST} \
+        --prefix="${CT_PREFIX_DIR}"             \
+        ${CC_SYSROOT_ARG}                       \
+        ${extra_config}                         \
+        --with-local-prefix="${CT_SYSROOT_DIR}" \
+        --disable-nls                           \
+        --enable-threads=posix                  \
+        --enable-symvers=gnu                    \
+        --enable-__cxa_atexit                   \
+        --enable-c99                            \
+        --enable-long-long                      \
+        ${CT_CC_EXTRA_CONFIG}                   2>&1 |CT_DoLog DEBUG
+
+    if [ ! "${CT_CANADIAN}" = "y" ]; then
+        CT_DoLog EXTRA "Building libiberty"
+        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog DEBUG
+    fi
+
+
+    # Idea from <cort.dougan at gmail.com>:
+    # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
+    # GCC 3.4.0 and up don't suffer from this confusion, and don't need this
+    # kludge.
+    # FIXME: we should patch gcc's source rather than uglify crosstool.sh.
+    # FIXME: is this needed for gcc-3.3.[56]?
+    case "${CT_CC_FILE}" in
+      gcc-3.3.[34])
+        case "${CT_TARGET}" in
+          powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
+            for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do
+              if [ -d `dirname "${d}"`/lib64 ] ; then
+                rm -rf "${d}"
+                ln -s `dirname "${d}"`/lib64 "${d}"
+              fi
+            done ;;
+          *) ;;
+        esac ;;
+    esac
+
+    CT_DoLog EXTRA "Building C compiler"
+    make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing C compiler"
+    make install 2>&1 |CT_DoLog DEBUG
+
+    # FIXME: shouldn't people who want this just --disable-multilib in final gcc
+    # and be done with it?
+    # This code should probably be deleted, it was written long ago and hasn't
+    # been tested in ages.
+    # kludge: If the chip does not have a floating point unit
+    # (i.e. if GLIBC_EXTRA_CONFIG contains --without-fp),
+    # and there are shared libraries in /lib/nof, copy them to /lib
+    # so they get used by default.
+    # FIXME: only rs6000/powerpc seem to use nof.  See MULTILIB_DIRNAMES
+    # in $GCC_DIR/gcc/config/$TARGET/* to see what your arch calls it.
+    #case "${CT_LIBC_EXTRA_CONFIG}" in
+    #    *--without-fp*)
+    #        if test -d "${CT_SYSROOT_DIR}/lib/nof"; then
+    #            cp -af "${CT_SYSROOT_DIR}/lib/nof/"*.so* "${CT_SYSROOT_DIR}/lib" || true
+    #        fi
+    #    ;;
+    #esac
+
+    CT_EndStep
+}
diff --git a/scripts/build/cc_tcc.sh b/scripts/build/cc_tcc.sh
new file mode 100644
index 00000000..e69de29b
diff --git a/scripts/build/kernel_cygwin.sh b/scripts/build/kernel_cygwin.sh
new file mode 100644
index 00000000..e69de29b
diff --git a/scripts/build/kernel_linux-libc-headers.sh b/scripts/build/kernel_linux-libc-headers.sh
new file mode 120000
index 00000000..05c7045a
--- /dev/null
+++ b/scripts/build/kernel_linux-libc-headers.sh
@@ -0,0 +1 @@
+kernel_linux.sh
\ No newline at end of file
diff --git a/scripts/build/kernel_linux.sh b/scripts/build/kernel_linux.sh
new file mode 100644
index 00000000..caf35d1d
--- /dev/null
+++ b/scripts/build/kernel_linux.sh
@@ -0,0 +1,148 @@
+# This file declares functions to install the kernel headers for linux
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+# Check kernel configuration
+do_kernel_check_config() {
+    CT_DoStep INFO "Checking kernel configuration"
+
+    CT_TestOrAbort "You did not provide a kernel config file!" -n "${CT_KERNEL_LINUX_CONFIG_FILE}" -a -f "${CT_KERNEL_LINUX_CONFIG_FILE}"
+
+    CT_EndStep
+}
+
+# Wrapper to the actual headers install method
+do_kernel_headers() {
+    CT_DoStep INFO "Installing kernel headers"
+
+    # We need to enter this directory to find the kernel version strings
+    cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
+    if [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" != "y" ]; then
+        k_version=`awk '/^VERSION =/ { print $3 }' Makefile`
+        k_patchlevel=`awk '/^PATCHLEVEL =/ { print $3 }' Makefile`
+        k_sublevel=`awk '/^SUBLEVEL =/ { print $3 }' Makefile`
+        k_extraversion=`awk '/^EXTRAVERSION =/ { print $3 }' Makefile`
+    else
+        k_version=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 1`
+        k_patchlevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 2`
+        k_sublevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 3`
+        k_extraversion=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 4`
+    fi
+
+    case "${k_version}.${k_patchlevel}" in
+        2.2|2.4|2.6) ;;
+        *)  CT_Abort "Unsupported kernel version \"linux-${k_version}.${k_patchlevel}\".";;
+    esac
+
+    # Kernel version that support verbosity will use this, others will ignore it:
+    V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
+
+    if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL}" = "y" ]; then
+        do_kernel_install
+    elif [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" = "y" ]; then
+        do_kernel_sanitised
+    else [ "${CT_KERNEL_LINUX_HEADERS_COPY}" = "y" ];
+        do_kernel_copy
+    fi
+
+    CT_EndStep
+}
+
+# Install kernel headers using headers_install from kernel sources.
+do_kernel_install() {
+    CT_DoLog EXTRA "Using kernel's headers_install"
+
+    mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
+    cd "${CT_BUILD_DIR}/build-kernel-headers"
+
+    case "${k_version}.${k_patchlevel}" in
+        2.6) [ ${k_sublevel} -ge 18 ] || CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
+        *)   CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
+    esac
+
+    CT_DoLog EXTRA "Configuring kernel headers"
+    cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
+    CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"      \
+                      O="${CT_BUILD_DIR}/build-kernel-headers"  \
+                      ${V_OPT}                                  \
+                      ARCH=${CT_KERNEL_ARCH} oldconfig          2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing kernel headers"
+    make ARCH=${CT_KERNEL_ARCH}                     \
+         INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
+         ${V_OPT}                                   \
+         headers_install                            2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Checking installed headers"
+    make ARCH=${CT_KERNEL_ARCH}                     \
+         INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
+         ${V_OPT}                                   \
+         headers_check                              2>&1 |CT_DoLog DEBUG
+}
+
+# Install kernel headers from oldish Mazur's sanitised headers.
+do_kernel_sanitised() {
+    CT_DoLog EXTRA "Copying sanitised headers"
+    cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
+    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
+    cp -rv "include/asm-${CT_KERNEL_ARCH}" "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
+}
+
+# Install kernel headers by plain copy.
+do_kernel_copy() {
+    CT_DoLog EXTRA "Copying plain kernel headers"
+    CT_DoLog WARN "You are using plain kernel headers. You really shouldn't do that."
+    CT_DoLog WARN "You'd be better off by using installed headers (or sanitised headers)."
+
+    # 2.2 and 2.4 don't support building out-of-tree. 2.6 does.
+    CT_DoLog EXTRA "Preparing kernel headers"
+    case "${k_version}.${k_patchlevel}" in
+        2.2|2.4) cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
+                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
+                 CT_DoYes "" |make ARCH=${CT_KERNEL_ARCH} oldconfig
+                 # 2.4 doesn't follow V=# for verbosity... :-(
+                 make ARCH=${CT_KERNEL_ARCH} symlinks include/linux/version.h
+                 ;;
+        2.6)     mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
+                 cd "${CT_BUILD_DIR}/build-kernel-headers"
+                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
+                 CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"         \
+                                   O="`pwd`" ${V_OPT} ARCH=${CT_KERNEL_ARCH}    \
+                                   oldconfig
+                 case "${CT_KERNEL_ARCH}" in
+                     sh*)        # sh does secret stuff in 'make prepare' that can't be
+                                 # triggered separately, but happily, it doesn't use
+                                 # target gcc, so we can use it.
+                                 # Update: this fails on 2.6.11, as it installs
+                                 # elfconfig.h, which requires target compiler :-(
+                                 make ${PARALLELMFLAGS}                 \
+                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
+                                      prepare include/linux/version.h
+                                 ;;
+                     arm*|cris*) make ${PARALLELMFLAGS}                 \
+                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}       \
+                                      include/asm include/linux/version.h   \
+                                      include/asm-${CT_KERNEL_ARCH}/.arch
+                                 ;;
+                     mips*)      # for linux-2.6, 'make prepare' for mips doesn't 
+                                 # actually create any symlinks.  Hope generic is ok.
+                                 # Note that glibc ignores all -I flags passed in CFLAGS,
+                                 # so you have to use -isystem.
+                                 make ${PARALLELMFLAGS}                 \
+                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
+                                      include/asm include/linux/version.h
+                                 TARGET_CFLAGS="${TARGET_CFLAGS} -isystem ${LINUX_HEADER_DIR}/include/asm-mips/mach-generic"
+                                 ;;
+                     *)          make ${PARALLELMFLAGS}                 \
+                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
+                                      include/asm include/linux/version.h
+                                 ;;
+                 esac
+                 ;;
+    esac 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Copying kernel headers"
+    cp -rv include/asm-generic "${CT_HEADERS_DIR}/asm-generic" 2>&1 |CT_DoLog DEBUG
+    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
+    cp -rv include/asm-${CT_KERNEL_ARCH} "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
+}
diff --git a/scripts/build/libc_glibc.sh b/scripts/build/libc_glibc.sh
new file mode 100644
index 00000000..2fa9ac79
--- /dev/null
+++ b/scripts/build/libc_glibc.sh
@@ -0,0 +1,285 @@
+# This file adds functions to build glibc
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+# There is nothing to do for glibc check config
+do_libc_check_config() {
+    CT_DoStep INFO "Checking C library configuration"
+    CT_DoLog EXTRA "glibc has nothing to check"
+    CT_EndStep
+}
+
+# This function installs the glibc headers needed to build the core compiler
+do_libc_headers() {
+    # Only need to install bootstrap glibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
+    # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
+    grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0
+
+    CT_DoStep INFO "Installing C library headers"
+
+    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
+    cd "${CT_BUILD_DIR}/build-libc-headers"
+
+    CT_DoLog EXTRA "Configuring C library headers"
+
+    # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
+    # 1. override CC to keep glibc's configure from using $TARGET-gcc. 
+    # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
+    # 3. build with gcc 3.2 or later
+    # Compare these options with the ones used when building glibc for real below - they're different.
+    # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
+    # so when configure checks to make sure gcc has access to the assembler you just built...
+    # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
+    # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
+    # Note: the warning
+    # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
+    # *** add-on?"
+    # is ok here, since all we want are the basic headers at this point.
+    # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
+    # 'a version of binutils that supports .machine "altivec" is needed'.
+    libc_cv_ppc_machine=yes                     \
+    CC=${CT_CC_NATIVE}                          \
+    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"   \
+        --build="${CT_BUILD}"                   \
+        --host="${CT_TARGET}"                   \
+        --prefix=/usr                           \
+        --with-headers="${CT_HEADERS_DIR}"      \
+        --without-cvs --disable-sanity-checks   \
+        --enable-hacker-mode                    \
+        --enable-add-ons=""                     \
+        --without-nptl                          2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing C library headers"
+
+    if grep -q GLIBC_2.3 "${CT_SRC_DIR}/${CT_LIBC_FILE}/ChangeLog"; then
+        # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c,
+        # which fails without a real cross-compiler.
+        # Fortunately, we don't need errlist-compat.c, since we just need .h
+        # files, so work around this by creating a fake errlist-compat.c and
+        # satisfying its dependencies.
+        # Another workaround might be to tell configure to not use any cross
+        # options to $(CC).
+        # The real fix would be to get install-headers to not generate
+        # errlist-compat.c.
+        # Note: BOOTSTRAP_GCC is used by:
+        # patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
+        libc_cv_ppc_machine=yes                             \
+        make CFLAGS=-DBOOTSTRAP_GCC sysdeps/gnu/errlist.c   2>&1 |CT_DoLog DEBUG
+        mkdir -p stdio-common
+        # sleep for 2 seconds for benefit of filesystems with lousy time
+        # resolution, like FAT, so make knows for sure errlist-compat.c doesn't
+        # need generating
+        sleep 2
+        touch stdio-common/errlist-compat.c
+    fi
+    # Note: BOOTSTRAP_GCC (see above)
+    libc_cv_ppc_machine=yes                                 \
+    make cross-compiling=yes install_root=${CT_SYSROOT_DIR} \
+        CFLAGS=-DBOOTSTRAP_GCC ${LIBC_SYSROOT_ARG}          \
+        install-headers                                     2>&1 |CT_DoLog DEBUG
+
+    # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
+    # so do them by hand.  We can tolerate an empty stubs.h for the moment.
+    # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
+    mkdir -p "${CT_HEADERS_DIR}/gnu"
+    touch "${CT_HEADERS_DIR}/gnu/stubs.h"
+    cp "${CT_SRC_DIR}/${CT_LIBC_FILE}/include/features.h" "${CT_HEADERS_DIR}/features.h"
+
+    # Building the bootstrap gcc requires either setting inhibit_libc, or
+    # having a copy of stdio_lim.h... see
+    # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
+    cp bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
+
+    # Following error building gcc-4.0.0's gcj:
+    #  error: bits/syscall.h: No such file or directory
+    # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
+    # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
+    [ "${CT_ARCH}" != "arm" ] && cp misc/syscall-list.h "${CT_HEADERS_DIR}/bits/syscall.h" || true
+
+    CT_EndStep
+}
+
+# This function builds and install the full glibc
+do_libc() {
+    CT_DoStep INFO "Installing C library"
+
+    mkdir -p "${CT_BUILD_DIR}/build-libc"
+    cd "${CT_BUILD_DIR}/build-libc"
+
+    CT_DoLog EXTRA "Configuring C library"
+
+    # Add some default glibc config options if not given by user.
+    extra_config=""
+    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
+        *enable-kernel*) ;;
+        *) extra_config="${extra_config} --enable-kernel=${CT_KERNEL_VERSION}"
+    esac
+    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
+        *-tls*) ;;
+        *) extra_config="${extra_config} --without-tls"
+    esac
+    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
+        *-__thread*) ;;
+        *) extra_config="${extra_config} --without-__thread"
+    esac
+    case "${CT_SHARED_LIBS}" in
+        y) extra_config="${extra_config} --enable-shared";;
+        *) extra_config="${extra_config} --disable-shared";;
+    esac
+    case "${CT_LIBC_GLIBC_EXTRA_CONFIG}" in
+    	*--with-fp*) ;;
+    	*--without-fp*) ;;
+    	*)  case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
+                y,) extra_config="${extra_config} --with-fp";;
+                ,y) extra_config="${extra_config} --without-fp";;
+            esac;;
+    esac
+    case "${CT_LIBC_ADDONS},${CT_LIBC_ADDONS_LIST}" in
+        y,) extra_config="${extra_config} --enable-add-ons";;
+        y,*) extra_config="${extra_config} --enable-add-ons=${CT_LIBC_ADDONS_LIST}";;
+    esac
+
+    CT_DoLog DEBUG "Extra config args passed: \"${extra_config}\""
+
+    # Add some default CC args
+    extra_cc_args=
+    case "${CT_LIBC_EXTRA_CC_ARGS}" in
+        *-mbig-endian*) ;;
+        *-mlittle-endian*) ;;
+        *)  case "${CT_ARCH_BE},${CT_ARCH_LE}" in
+                y,) extra_cc_args="${extra_cc_args} -mbig-endian";;
+                ,y) extra_cc_args="${extra_cc_args} -mlittle-endian";;
+            esac;;
+    esac
+
+    CT_DoLog DEBUG "Extra CC args passed: \"${extra_cc_args}\""
+
+    # sh3 and sh4 really need to set configparms as of gcc-3.4/glibc-2.3.2
+    # note: this is awkward, doesn't work well if you need more than one line in configparms
+    echo ${CT_LIBC_GLIBC_CONFIGPARMS} > configparms
+
+    # For glibc 2.3.4 and later we need to set some autoconf cache
+    # variables, because nptl/sysdeps/pthread/configure.in does not
+    # work when cross-compiling.
+    if test -d ${GLIBC_DIR}/nptl; then
+        libc_cv_forced_unwind=yes
+        libc_cv_c_cleanup=yes
+        export libc_cv_forced_unwind libc_cv_c_cleanup
+    fi
+
+    # Configure with --prefix the way we want it on the target...
+    # There are a whole lot of settings here.  You'll probably want
+    # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG
+    # Compare these options with the ones used when installing the glibc headers above - they're different.
+    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
+    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
+    # Set BUILD_CC, or you won't be able to build datafiles
+    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
+
+    BUILD_CC=${CT_CC_NATIVE}                                        \
+    CFLAGS="${CT_TARGET_CFLAGS} ${CT_LIBC_GLIBC_EXTRA_CFLAGS} -O"   \
+    CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
+    AR=${CT_TARGET}-ar                                              \
+    RANLIB=${CT_TARGET}-ranlib                                      \
+    "${CT_SRC_DIR}/${CT_LIBC_FILE}/configure"                       \
+        --prefix=/usr                                               \
+        --build=${CT_BUILD} --host=${CT_TARGET}                     \
+        ${CT_LIBC_GLIBC_EXTRA_CONFIG}                               \
+        ${extra_config}                                             \
+        --without-cvs                                               \
+        --disable-profile                                           \
+        --disable-debug                                             \
+        --without-gd                                                \
+        --with-headers="${CT_HEADERS_DIR}"                          2>&1 |CT_DoLog DEBUG
+
+    if grep -l '^install-lib-all:' "${CT_SRC_DIR}/${CT_LIBC_FILE}/Makerules" > /dev/null; then
+        # nptl-era glibc.
+        # If the install-lib-all target (which is added by our make-install-lib-all.patch)
+        # is present, it means we're building glibc-2.3.3 or later, and we can't
+        # build programs yet, as they require libeh, which won't be installed
+        # until full build of gcc
+        GLIBC_INITIAL_BUILD_RULE=lib
+        GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
+        GLIBC_INSTALL_APPS_LATER=yes
+    else
+        # classic glibc.  
+        # We can build and install everything with the bootstrap compiler.
+        GLIBC_INITIAL_BUILD_RULE=all
+        GLIBC_INITIAL_INSTALL_RULE=install
+        GLIBC_INSTALL_APPS_LATER=no
+    fi
+
+    # If this fails with an error like this:
+    # ...  linux/autoconf.h: No such file or directory 
+    # then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
+    # The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
+    # Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
+    # No need for PARALLELMFLAGS here, Makefile already reads this environment variable
+    CT_DoLog EXTRA "Building C library"
+    make LD=${CT_TARGET}-ld             \
+         RANLIB=${CT_TARGET}-ranlib     \
+         ${GLIBC_INITIAL_BUILD_RULE}    2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing C library"
+    make install_root="${CT_SYSROOT_DIR}"   \
+         ${LIBC_SYSROOT_ARG}                \
+         ${GLIBC_INITIAL_INSTALL_RULE}      2>&1 |CT_DoLog DEBUG
+
+    # This doesn't seem to work when building a crosscompiler,
+    # as it tries to execute localedef using the just-built ld.so!?
+    #CT_DoLog EXTRA "Installing locales"
+    #make localedata/install-locales install_root=${SYSROOT} 2>&1 |CT_DoLog DEBUG
+
+    # Fix problems in linker scripts.
+    #
+    # 1. Remove absolute paths
+    # Any file in a list of known suspects that isn't a symlink is assumed to be a linker script.
+    # FIXME: test -h is not portable
+    # FIXME: probably need to check more files than just these three...
+    # Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks
+    #
+    # 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
+    # needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
+    #
+    # To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
+    CT_DoLog EXTRA "Fixing C library linker scripts"
+    for file in libc.so libpthread.so libgcc_s.so; do
+        for dir in lib lib64 usr/lib usr/lib64; do
+            if [ -f "${CT_SYSROOT_DIR}/${dir}/${file}" -a ! -L ${CT_SYSROOT_DIR}/$lib/$file ]; then
+                mv "${CT_SYSROOT_DIR}/${dir}/${file}" "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
+                CT_DoLog DEBUG "Fixing \"${CT_SYS_ROOT_DIR}/${dir}/${file}\""
+                sed -i -r -e 's,/usr/lib/,,g;
+                              s,/usr/lib64/,,g;
+                              s,/lib/,,g;
+                              s,/lib64/,,g;
+                              /BUG in libc.scripts.output-format.sed/d' "${CT_SYSROOT_DIR}/${dir}/${file}_orig"
+            fi
+        done
+    done
+
+    CT_EndStep
+}
+
+# This function finishes the glibc install
+do_libc_finish() {
+    # Finally, build and install glibc programs, now that libeh (if any) is installed
+    # Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
+    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
+    # .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
+    [ "${GLIBC_INSTALL_APPS_LATER}" = "yes" ] || return 0
+
+    CT_DoStep INFO "Finishing C library"
+
+    cd "${CT_BUILD_DIR}/build-libc"
+
+    CT_DoLog EXTRA "Re-building C library"
+    make LD=${CT_TARGET}-ld RANLIB=${CT_TARGET}-ranlib 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing missing C library components"
+    # note: should do full install and then fix linker scripts, but this is faster
+    for t in bin rootsbin sbin data others; do
+        make install_root="${CT_SYSROOT_DIR}"   \
+             ${LIBC_SYSROOT_ARG}                \
+             install-${t}                       2>&1 |CT_DoLog DEBUG
+    done
+}
diff --git a/scripts/build/libc_libfloat.sh b/scripts/build/libc_libfloat.sh
new file mode 100644
index 00000000..3828a3f0
--- /dev/null
+++ b/scripts/build/libc_libfloat.sh
@@ -0,0 +1,31 @@
+# This file adds functions to build libfloat
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+do_libfloat() {
+    # Here we build and install libfloat for the target, so that the C library
+    # builds OK with those versions of gcc that have severed softfloat support
+    # code
+    [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] || return 0
+	CT_DoStep INFO "Installing software floating point emulation library libfloat"
+
+    CT_Pushd "${CT_BUILD_DIR}"
+    CT_DoLog EXTRA "Copying sources to build dir"
+    mkdir build-libfloat
+    cd build-libfloat
+    ( cd "${CT_SRC_DIR}/${CT_LIBFLOAT_FILE}"; tar cf - . ) |tar xvf - |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Cleaning library"
+    make clean 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Building library"
+    make CROSS_COMPILE="${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-" 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing library"
+    make CROSS_COMPILE="${CT_CC_CORE_PREFIX_DIR}/bin/${CT_TARGET}-" \
+         DESTDIR="${CT_SYSROOT_DIR}" install                       2>&1 |CT_DoLog DEBUG
+
+    CT_Popd
+
+    CT_EndStep
+}
diff --git a/scripts/build/libc_uClibc.sh b/scripts/build/libc_uClibc.sh
new file mode 100644
index 00000000..171736d1
--- /dev/null
+++ b/scripts/build/libc_uClibc.sh
@@ -0,0 +1,235 @@
+# This file declares functions to install the uClibc C library
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+
+# Check that uClibc has been previously configured
+do_libc_check_config() {
+    CT_DoStep INFO "Checking C library configuration"
+
+    CT_TestOrAbort "You did not provide a uClibc config file!" -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" -a -f "${CT_LIBC_UCLIBC_CONFIG_FILE}"
+
+    cp "${CT_LIBC_UCLIBC_CONFIG_FILE}" "${CT_BUILD_DIR}/uClibc.config"
+
+    if egrep '^KERNEL_SOURCE=' "${CT_LIBC_UCLIBC_CONFIG_FILE}" >/dev/null 2>&1; then
+        CT_DoLog WARN "Your uClibc version refers to the kernel _sources_, which is bad."
+        CT_DoLog WARN "I can't guarantee that our little hack will work. Please try to upgrade."
+    fi
+
+    CT_DoLog EXTRA "Munging uClibc configuration"
+    mungeuClibcConfig "${CT_BUILD_DIR}/uClibc.config"
+
+    CT_EndStep
+}
+
+# This functions installs uClibc's headers
+do_libc_headers() {
+    # Only need to install bootstrap uClibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
+    # See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
+    grep -q 'gcc-[34]' "${CT_SRC_DIR}/${CT_CC_CORE_FILE}/ChangeLog" || return 0
+
+    CT_DoStep INFO "Installing C library headers"
+
+    mkdir -p "${CT_BUILD_DIR}/build-libc-headers"
+    cd "${CT_BUILD_DIR}/build-libc-headers"
+
+    # Simply copy files until uClibc has the ablity to build out-of-tree
+    CT_DoLog EXTRA "Copying sources to build dir"
+    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
+
+    # Retrieve the config file
+    cp "${CT_BUILD_DIR}/uClibc.config" .config
+
+    # uClibc uses the CROSS environment variable as a prefix to the
+    # compiler tools to use.  Setting it to the empty string forces
+    # use of the native build host tools, which we need at this
+    # stage, as we don't have target tools yet.
+    CT_DoLog EXTRA "Applying configuration"
+    CT_DoYes "" |make CROSS= PREFIX="${CT_SYSROOT_DIR}/" oldconfig 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Building headers"
+    make ${PARALLELMFLAGS} CROSS= PREFIX="${CT_SYSROOT_DIR}/" headers 2>&1 |CT_DoLog DEBUG
+
+    CT_DoLog EXTRA "Installing headers"
+    make CROSS= PREFIX="${CT_SYSROOT_DIR}/" install_dev 2>&1 |CT_DoLog DEBUG
+
+    CT_EndStep
+}
+
+# This function build and install the full uClibc
+do_libc() {
+    CT_DoStep INFO "Installing C library"
+
+    mkdir -p "${CT_BUILD_DIR}/build-libc"
+    cd "${CT_BUILD_DIR}/build-libc"
+
+    # Simply copy files until uClibc has the ablity to build out-of-tree
+    CT_DoLog EXTRA "Copying sources to build dir"
+    { cd "${CT_SRC_DIR}/${CT_LIBC_FILE}"; tar cf - .; } |tar xf -
+
+    # Retrieve the config file
+    cp "${CT_BUILD_DIR}/uClibc.config" .config
+
+    # uClibc uses the CROSS environment variable as a prefix to the compiler
+    # tools to use.  The newly built tools should be in our path, so we need
+    # only give the correct name for them.
+    # Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
+    # depending  on the configuration of the library. That is, they are tailored
+    # to best fit the target. So it is useless and seems to be a bad thing to
+    # use LIBC_EXTRA_CFLAGS here.
+    CT_DoLog EXTRA "Applying configuration"
+    CT_DoYes "" |make ${PARALLELMFLAGS}             \
+                      CROSS=${CT_TARGET}-           \
+                      PREFIX="${CT_SYSROOT_DIR}/"   \
+                      oldconfig                     2>&1 |CT_DoLog DEBUG
+
+    # We do _not_ want to strip anything for now, in case we specifically
+    # asked for a debug toolchain, thus the STRIPTOOL= assignment
+    CT_DoLog EXTRA "Building C library"
+    make ${PARALLELMFLAGS}              \
+         CROSS=${CT_TARGET}-            \
+         PREFIX="${CT_SYSROOT_DIR}/"    \
+         STRIPTOOL=true                 \
+         all                            2>&1 |CT_DoLog DEBUG
+
+    # YEM-FIXME: we want to install libraries in $SYSROOT/lib, but we don't want
+    # to install headers in $SYSROOT/include, thus making only install_runtime.
+    # Plus, the headers were previously installed earlier with install_dev, so
+    # all should be well. Unfortunately, the install_dev target does not install
+    # crti.o and consorts... :-( So reverting to target 'install'.
+    # Note: PARALLELMFLAGS is not usefull for installation.
+    # We do _not_ want to strip anything for now, in case we specifically
+    # asked for a debug toolchain, thus the STRIPTOOL= assignment
+    CT_DoLog EXTRA "Installing C library"
+    make CROSS=${CT_TARGET}-            \
+         PREFIX="${CT_SYSROOT_DIR}/"    \
+         STRIPTOOL=true                 \
+         install                        2>&1 |CT_DoLog DEBUG
+
+    CT_EndStep
+}
+
+# This function is used to install those components needing the final C compiler
+do_libc_finish() {
+    CT_DoStep INFO "Finishing C library"
+    # uClibc has nothing to finish
+    CT_DoLog EXTRA "uClibc has nothing to finish"
+    CT_EndStep
+}
+
+# Initialises the .config file to sensible values
+mungeuClibcConfig() {
+    config_file="$1"
+    munge_file="${CT_BUILD_DIR}/munge-uClibc-config.sed"
+
+    cat > "${munge_file}" <<-ENDSED
+s/^(TARGET_.*)=y$/# \\1 is not set/
+s/^# TARGET_${CT_KERNEL_ARCH} is not set/TARGET_${CT_KERNEL_ARCH}=y/
+s/^TARGET_ARCH=".*"/TARGET_ARCH="${CT_KERNEL_ARCH}"/
+ENDSED
+
+    case "${CT_ARCH_BE},${CT_ARCH_LE}" in
+        y,) cat >> "${munge_file}" <<-ENDSED
+s/.*(ARCH_BIG_ENDIAN).*/\\1=y/
+s/.*(ARCH_LITTLE_ENDIAN).*/# \\1 is not set/
+ENDSED
+        ;;
+        ,y) cat >> "${munge_file}" <<-ENDSED
+s/.*(ARCH_BIG_ENDIAN).*/# \\1 is not set/
+s/.*(ARCH_LITTLE_ENDIAN).*/\\1=y/
+ENDSED
+        ;;
+    esac
+
+    case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in
+        y,) cat >> "${munge_file}" <<-ENDSED
+s/.*(HAS_FPU).*/\\1=y/
+ENDSED
+            ;;
+        ,y) cat >> "${munge_file}" <<-ENDSED
+s/.*(HAS_FPU).*/\\# \\1 is not set/
+ENDSED
+            ;;
+    esac
+
+    # Change paths to work with crosstool
+    # From http://www.uclibc.org/cgi-bin/viewcvs.cgi?rev=16846&view=rev
+    #  " we just want the kernel headers, not the whole kernel source ...
+    #  " so people may need to update their paths slightly
+    quoted_kernel_source=`echo "${CT_HEADERS_DIR}" | sed -r -e 's,/include/?$,,; s,/,\\\\/,g;'`
+    quoted_headers_dir=`echo ${CT_HEADERS_DIR} | sed -r -e 's,/,\\\\/,g;'`
+    # CROSS_COMPILER_PREFIX is left as is, as the CROSS parameter is forced on the command line
+    # DEVEL_PREFIX is left as '/usr/' because it is post-pended to $PREFIX, wich is the correct value of ${PREFIX}/${TARGET}
+    # Some (old) versions of uClibc use KERNEL_SOURCE (which is _wrong_), and
+    # newer versions use KERNEL_HEADERS (which is right). See:
+    cat >> "${munge_file}" <<-ENDSED
+s/^DEVEL_PREFIX=".*"/DEVEL_PREFIX="\\/usr\\/"/
+s/^RUNTIME_PREFIX=".*"/RUNTIME_PREFIX="\\/"/
+s/^SHARED_LIB_LOADER_PREFIX=.*/SHARED_LIB_LOADER_PREFIX="\\/lib\\/"/
+s/^KERNEL_SOURCE=".*"/KERNEL_SOURCE="${quoted_kernel_source}"/
+s/^KERNEL_HEADERS=".*"/KERNEL_HEADERS="${quoted_headers_dir}"/
+s/^UCLIBC_DOWNLOAD_PREGENERATED_LOCALE=y/\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE is not set/
+ENDSED
+
+    # Hack our -pipe into WARNINGS, which will be internally incorporated to
+    # CFLAGS. This a dirty hack, but yet needed
+    if [ "${CT_USE_PIPES}" = "y" ]; then
+        cat >> "${munge_file}" <<-ENDSED
+s/^(WARNINGS=".*)"$/\\1 -pipe"/
+ENDSED
+    fi
+
+    # Force on options needed for C++ if we'll be making a C++ compiler.
+    # Note that the two PREGEN_LOCALE and the XLOCALE lines may be missing
+    # entirely if LOCALE is not set.  If LOCALE was already set, we'll
+    # assume the user has already made all the appropriate generation
+    # arrangements.  Note that having the uClibc Makefile download the
+    # pregenerated locales is not compatible with crosstool; besides,
+    # crosstool downloads them as part of getandpatch.sh.
+    if [ "${CT_CC_LANG_CXX}" = "y" ]; then
+        cat >> "${munge_file}" <<-ENDSED
+s/^# DO_C99_MATH is not set/DO_C99_MATH=y/
+s/^# UCLIBC_CTOR_DTOR is not set/UCLIBC_CTOR_DTOR=y/
+# Add these three lines when doing C++?
+#s/^# UCLIBC_HAS_WCHAR is not set/UCLIBC_HAS_WCHAR=y/
+#s/^# UCLIBC_HAS_LOCALE is not set/UCLIBC_HAS_LOCALE=y\\nUCLIBC_PREGENERATED_LOCALE_DATA=y\\n\\# UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA is not set\\n\\# UCLIBC_HAS_XLOCALE is not set/
+#s/^# UCLIBC_HAS_GNU_GETOPT is not set/UCLIBC_HAS_GNU_GETOPT=y/
+ENDSED
+    fi
+
+    # Force on debug options if asked for
+    case "${CT_LIBC_UCLIBC_DEBUG_LEVEL}" in
+      0)
+        cat >>"${munge_file}" <<-ENDSED
+s/^PTHREADS_DEBUG_SUPPORT=y/# PTHREADS_DEBUG_SUPPORT is not set/
+s/^DODEBUG=y/# DODEBUG is not set/
+s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
+s/^DOASSERTS=y/# DOASSERTS is not set/
+s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
+s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
+ENDSED
+        ;;
+      1)
+        cat >>"${munge_file}" <<-ENDSED
+s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
+s/^# DODEBUG is not set.*/DODEBUG=y/
+s/^DODEBUG_PT=y/# DODEBUG_PT is not set/
+s/^DOASSERTS=y/# DOASSERTS is not set/
+s/^SUPPORT_LD_DEBUG=y/# SUPPORT_LD_DEBUG is not set/
+s/^SUPPORT_LD_DEBUG_EARLY=y/# SUPPORT_LD_DEBUG_EARLY is not set/
+ENDSED
+        ;;
+      2)
+        cat >>"${munge_file}" <<-ENDSED
+s/^# PTHREADS_DEBUG_SUPPORT is not set.*/PTHREADS_DEBUG_SUPPORT=y/
+s/^# DODEBUG is not set.*/DODEBUG=y/
+s/^# DODEBUG_PT is not set.*/DODEBUG_PT=y/
+s/^# DOASSERTS is not set.*/DOASSERTS=y/
+s/^# SUPPORT_LD_DEBUG is not set.*/SUPPORT_LD_DEBUG=y/
+s/^# SUPPORT_LD_DEBUG_EARLY is not set.*/SUPPORT_LD_DEBUG_EARLY=y/
+ENDSED
+        ;;
+    esac
+    sed -r -i -f "${munge_file}" "${config_file}"
+    rm -f "${munge_file}"
+}
diff --git a/scripts/buildToolchain.sh b/scripts/buildToolchain.sh
new file mode 100644
index 00000000..dff1f6fc
--- /dev/null
+++ b/scripts/buildToolchain.sh
@@ -0,0 +1,123 @@
+# This scripts calls each component's build script.
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+# Parse all build files to have the needed functions.
+. "${CT_TOP_DIR}/scripts/build/kernel_${CT_KERNEL}.sh"
+. "${CT_TOP_DIR}/scripts/build/binutils.sh"
+. "${CT_TOP_DIR}/scripts/build/libc_libfloat.sh"
+. "${CT_TOP_DIR}/scripts/build/libc_${CT_LIBC}.sh"
+. "${CT_TOP_DIR}/scripts/build/cc_core_${CT_CC_CORE}.sh"
+. "${CT_TOP_DIR}/scripts/build/cc_${CT_CC}.sh"
+
+# Arrange paths depending on wether we use sys-root or not.
+if [ "${CT_USE_SYSROOT}" = "y" ]; then
+    CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/sys-root"
+    CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
+    BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
+    CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
+    CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
+    LIBC_SYSROOT_ARG=""
+    # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
+    # confused when $sysroot/usr/include is not present.
+    # Note: --prefix=/usr is magic!
+    # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
+else
+    # plain old way. All libraries in prefix/target/lib
+    CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
+    CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
+    # hack!  Always use --with-sysroot for binutils.
+    # binutils 2.14 and later obey it, older binutils ignore it.
+    # Lets you build a working 32->64 bit cross gcc
+    BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
+    # Use --with-headers, else final gcc will define disable_glibc while
+    # building libgcc, and you'll have no profiling
+    CC_CORE_SYSROOT_ARG="--without-headers"
+    CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
+    LIBC_SYSROOT_ARG="prefix="
+fi
+
+# Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
+# 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail with
+#  "ld: cannot open crti.o: No such file or directory"
+mkdir -p "${CT_SYSROOT_DIR}/lib"
+mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
+
+# Canadian-cross are really picky on the way they are built. Tweak the values.
+if [ "${CT_CANADIAN}" = "y" ]; then
+    # Arrange so that gcc never, ever think that build system == host system
+    CT_CANADIAN_OPT="--build=`echo \"${CT_BUILD}\" |sed -r -e 's/-/-build_/'`"
+    # We shall have a compiler for this target!
+    # Do test here...
+else
+    CT_HOST="${CT_BUILD}"
+    CT_CANADIAN_OPT=
+    # Add the target toolchain in the path so that we can build the C library
+    export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_PREFIX_DIR}/bin:${PATH}"
+fi
+
+# Modify GCC_HOST to never be equal to $BUILD or $TARGET
+# This strange operation causes gcc to always generate a cross-compiler
+# even if the build machine is the same kind as the host.
+# This is why CC has to be set when doing a canadian cross; you can't find a
+# host compiler by appending -gcc to our whacky $GCC_HOST
+# Kludge: it is reported that the above causes canadian crosses with cygwin
+# hosts to fail, so avoid it just in that one case.  It would be cleaner to
+# just move this into the non-canadian case above, but I'm afraid that might
+# cause some configure script somewhere to decide that since build==host, they
+# could run host binaries.
+# (Copied almost as-is from original crosstool):
+case "${CT_KERNEL},${CT_CANADIAN}" in
+    cygwin,y) ;;
+    *)        CT_HOST="`echo \"${CT_HOST}\" |sed -r -e 's/-/-host_/;'`";;
+esac
+
+# Ha. cygwin host have an .exe suffix (extension) for executables.
+[ "${CT_KERNEL}" = "cygwin" ] && EXEEXT=".exe" || EXEEXT=""
+
+# Transform the ARCH into a kernel-understandable ARCH
+case "${CT_ARCH}" in
+    x86) CT_KERNEL_ARCH=i386;;
+    ppc) CT_KERNL_ARCH=powerpc;;
+    *)   CT_KERNEL_ARCH="${CT_ARCH}";;
+esac
+
+# Build up the TARGET_CFLAGS from user-provided options
+tmp_target_CFLAGS=
+[ -n "${CT_ARCH_CPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mcpu=${CT_ARCH_CPU}"
+[ -n "${CT_ARCH_TUNE}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mtune=${CT_ARCH_TUNE}"
+[ -n "${CT_ARCH_ARCH}" ] && tmp_target_CFLAGS="${tmp_target_CFLAGS} -march=${CT_ARCH_ARCH}"
+[ -n "${CT_ARCH_FPU}" ]  && tmp_target_CFLAGS="${tmp_target_CFLAGS} -mfpu=${CT_ARCH_FPU}"
+# Override with user-specified CFLAGS
+CT_TARGET_CFLAGS="${tmp_target_CFLAGS} ${CT_TARGET_CFLAGS}"
+
+# Help gcc
+CT_CFLAGS_FOR_HOST=
+[ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
+
+# And help make go faster
+PARALLELMFLAGS=
+[ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
+[ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
+
+CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
+CT_DoLog EXTRA "Building a toolchain for :"
+CT_DoLog EXTRA "  build  = ${CT_BUILD}"
+CT_DoLog EXTRA "  host   = ${CT_HOST}"
+CT_DoLog EXTRA "  target = ${CT_TARGET}"
+set |egrep '^CT_.+=' |sort |CT_DoLog DEBUG
+CT_EndStep
+
+# Now for the job by itself.
+# Check the C library config ASAP, before the user gets bored, and is
+# gone having his/her coffee
+do_libc_check_config
+do_kernel_check_config
+do_kernel_headers
+do_binutils
+do_libc_headers
+do_cc_core
+do_libfloat
+do_libc
+do_cc
+do_libc_finish
diff --git a/scripts/crosstool.sh b/scripts/crosstool.sh
new file mode 100755
index 00000000..48ddca29
--- /dev/null
+++ b/scripts/crosstool.sh
@@ -0,0 +1,273 @@
+#!/bin/bash
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package.
+
+# This is the main entry point to crosstool
+# This will:
+#   - download, extract and patch the toolchain components
+#   - build and install each components in turn
+#   - and eventually test the resulting toolchain
+
+# What this file does is prepare the environment, based upon the user-choosen
+# options. It also checks the existing environment for un-friendly variables,
+# and checks for needed tools. It eventually calls the main build script.
+
+# User must set CT_TOP_DIR in is environment!
+# Once we can build out-of-tree, then this will have to go.
+if [ -z "${CT_TOP_DIR}" -o ! -d "${CT_TOP_DIR}" ]; then
+    # We don't have the functions right now, because we don't have CT_TOP_DIR.
+    # Do the print stuff by hand:
+    echo "CT_TOP_DIR not set. You must set CT_TOP_DIR to the top directory where crosstool is installed."
+    exit 1
+fi
+
+# Parse the common functions
+. "${CT_TOP_DIR}/scripts/functions"
+
+CT_STAR_DATE=`CT_DoDate +%s%N`
+CT_STAR_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
+
+# Log to a temporary file until we have built our environment
+CT_ACTUAL_LOG_FILE="`pwd`/$$.log"
+
+# CT_TOP_DIR should be an absolute path.
+CT_TOP_DIR="`CT_MakeAbsolutePath \"${CT_TOP_DIR}\"`"
+
+# Parse the configuration file
+CT_TestOrAbort "Configuration file not found. Please create one." -f "${CT_TOP_DIR}/.config"
+. "${CT_TOP_DIR}/.config"
+
+# The progress bar indicator is asked for
+if [ "${CT_LOG_PROGRESS_BAR}" = "y" ]; then
+    _CT_PROG_BAR() {
+        [ $((cpt/5)) -eq 0 ] && echo -en "/"
+        [ $((cpt/5)) -eq 1 ] && echo -en "-"
+        [ $((cpt/5)) -eq 2 ] && echo -en "\\"
+        [ $((cpt/5)) -eq 3 ] && echo -en "|"
+        echo -en "\r"
+        cpt=$(((cpt+1)%20))
+    }
+    CT_PROG_BAR=_CT_PROG_BAR
+    export -f _CT_PROG_BAR
+else
+    CT_PROG_BAR=
+fi
+
+# Apply the color scheme if needed
+if [ "${CT_LOG_USE_COLORS}" = "y" ]; then
+    CT_ERROR_COLOR="${_A_NOR}${_A_BRI}${_F_RED}"
+    CT_WARN_COLOR="${_A_NOR}${_A_BRI}${_F_YEL}"
+    CT_INFO_COLOR="${_A_NOR}${_A_BRI}${_F_GRN}"
+    CT_EXTRA_COLOR="${_A_NOR}${_A_DIM}${_F_GRN}"
+    CT_DEBUG_COLOR="${_A_NOR}${_A_DIM}${_F_WHI}"
+    CT_NORMAL_COLOR="${_A_NOR}"
+else
+    CT_ERROR_COLOR=
+    CT_WARN_COLOR=
+    CT_INFO_COLOR=
+    CT_EXTRA_COLOR=
+    CT_DEBUG_COLOR=
+    CT_NORMAL_COLOR=
+fi
+
+# Yes! We can do full logging from now on!
+CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
+
+# Some sanity checks in the environment and needed tools
+CT_DoLog INFO "Checking environment sanity"
+
+# Enable known ordering of files in directory listings:
+CT_Test "Crosstool-NG might not work as expected with LANG=\"${LANG}\"" -n "${LANG}"
+case "${LC_COLLATE},${LC_ALL}" in
+  # These four combinations are known to sort files in the correct order:
+  fr_FR*,)  ;;
+  en_US*,)  ;;
+  *,fr_FR*) ;;
+  *,en_US*) ;;
+  # Anything else is destined to be borked if not gracefuly handled:
+  *) CT_DoLog WARN "Either LC_COLLATE=\"${LC_COLLATE}\" or LC_ALL=\"${LC_ALL}\" is not supported."
+     export LC_ALL=`locale -a |egrep "^(fr_FR|en_US)" |head -n 1`
+     CT_TestOrAbort "Neither en_US* nor fr_FR* locales found on your system." -n "${LC_ALL}"
+     CT_DoLog WARN "Forcing to known working LC_ALL=\"${LC_ALL}\"."
+     ;;
+esac
+
+# Other environment sanity checks
+CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
+CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
+CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
+CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
+GREP_OPTIONS=
+CT_HasOrAbort awk
+CT_HasOrAbort sed
+CT_HasOrAbort bison
+CT_HasOrAbort flex
+
+CT_DoStep DEBUG "Dumping crosstool-NG configuration"
+cat ${CT_TOP_DIR}/.config |egrep '^(# |)CT_' |CT_DoLog DEBUG
+CT_EndStep
+
+CT_DoLog INFO "Building environment variables"
+
+# This should go in buildToolchain.sh, but we might need it because it could
+# be used by the user in his/her paths definitions.
+# Target triplet: CT_TARGET needs a little love:
+case "${CT_ARCH_BE},${CT_ARCH_LE}" in
+    y,) target_endian_eb=eb; target_endian_el=;;
+    ,y) target_endian_eb=; target_endian_el=el;;
+esac
+case "${CT_ARCH}" in
+    arm)  CT_TARGET="${CT_ARCH}${target_endian_eb}";;
+    mips) CT_TARGET="${CT_ARCH}${target_endian_el}";;
+    x86*) # Much love for this one :-(
+          # Ultimately, we should use config.sub to output the correct
+          # procesor name. Work for later...
+          arch="${CT_ARCH_ARCH}"
+          [ -z "${arch}" ] && arch="${CT_ARCH_TUNE}"
+          case "${CT_ARCH}" in
+              x86_64)      CT_TARGET=x86_64;;
+          	  *)  case "${arch}" in
+                      "")                                       CT_TARGET=i386;;
+                      i386|i486|i586|i686)                      CT_TARGET="${arch}";;
+                      winchip*)                                 CT_TARGET=i486;;
+                      pentium|pentium-mmx|c3*)                  CT_TARGET=i586;;
+                      nocona|athlon*64|k8|athlon-fx|opteron)    CT_TARGET=x86_64;;
+                      pentiumpro|pentium*|athlon*)              CT_TARGET=i686;;
+                      *)                                        CT_TARGET=i586;;
+                  esac;;
+          esac;;
+esac
+case "${CT_TARGET_VENDOR}" in
+    "") CT_TARGET="${CT_TARGET}-unknown";;
+    *)  CT_TARGET="${CT_TARGET}-${CT_TARGET_VENDOR}";;
+esac
+case "${CT_KERNEL}" in
+    linux*)  CT_TARGET="${CT_TARGET}-linux";;
+    cygwin*) CT_TARGET="${CT_TARGET}-cygwin";;
+esac
+case "${CT_LIBC}" in
+    glibc)  CT_TARGET="${CT_TARGET}-gnu";;
+    uClibc) CT_TARGET="${CT_TARGET}-uclibc";;
+esac
+CT_TARGET="`${CT_TOP_DIR}/tools/config.sub ${CT_TARGET}`"
+
+# Now, build up the variables from the user-configured options.
+CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}"
+CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}"
+if [ "${CT_CC_USE_CORE}" != "y" ]; then
+    CT_CC_CORE="${CT_CC}"
+    CT_CC_CORE_VERSION="${CT_CC_VERSION}"
+    CT_CC_CORE_EXTRA_CONFIG="${CT_CC_EXTRA_CONFIG}"
+fi
+CT_CC_CORE_FILE="${CT_CC_CORE}-${CT_CC_CORE_VERSION}"
+CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}"
+CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}"
+[ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_LIBFLOAT_FILE="libfloat-990616"
+
+# Kludge: If any of the configured options needs CT_TARGET or CT_TOP_DIR,
+# then rescan the options file now:
+. "${CT_TOP_DIR}/.config"
+
+# Determine build system if not set by the user
+CT_Test "You did not specify the build system. Guessing." -z "${CT_BUILD}"
+CT_BUILD="`${CT_TOP_DIR}/tools/config.sub \"${CT_BUILD:-\`${CT_TOP_DIR}/tools/config.guess\`}\"`"
+
+# Get rid of pre-existing installed toolchain and previous build directories.
+# We need to do that _before_ we can safely log, because the log file will
+# most probably be in the toolchain directory.
+if [ -d "${CT_PREFIX_DIR}" ]; then
+    mv "${CT_PREFIX_DIR}" "${CT_PREFIX_DIR}.$$"
+    nohup rm -rf "${CT_PREFIX_DIR}.$$" >/dev/null 2>&1 &
+fi
+mkdir -p "${CT_PREFIX_DIR}"
+if [ -d "${CT_BUILD_DIR}" ]; then
+    mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
+    nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
+fi
+mkdir -p "${CT_BUILD_DIR}"
+
+# Check now if we can write to the destination directory:
+if [ -d "${CT_PREFIX_DIR}" ]; then
+    CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not writeable" ! -w "${CT_PREFIX_DIR}"
+else
+    mkdir -p "${CT_PREFIX_DIR}" || CT_Abort "Could not create destination directory \"${CT_PREFIX_DIR}\""
+fi
+
+# Redirect log to the actual log file now we can
+# It's quite understandable that the log file will be installed in the
+# install directory, so we must first ensure it exists and is writeable (above)
+# before we can log there
+t="${CT_ACTUAL_LOG_FILE}"
+case "${CT_LOG_TO_FILE},${CT_LOG_FILE}" in
+    ,*)   CT_ACTUAL_LOG_FILE=/dev/null
+          rm -f "${t}"
+          ;;
+    y,/*) mkdir -p "`dirname \"${CT_LOG_FILE}\"`"
+          CT_ACTUAL_LOG_FILE="${CT_LOG_FILE}"
+          mv "${t}" "${CT_ACTUAL_LOG_FILE}"
+          ;;
+    y,*)  mkdir -p "`pwd`/`dirname \"${CT_LOG_FILE}\"`"
+          CT_ACTUAL_LOG_FILE="`pwd`/${CT_LOG_FILE}"
+          mv "${t}" "${CT_ACTUAL_LOG_FILE}"
+          ;;
+esac
+
+# Some more sanity checks now that we have all paths set up
+case "${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
+    *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
+esac
+
+# Note: we'll always install the core compiler in its own directory, so as to
+# not mix the two builds: core and final. Anyway, its generic, wether we use
+# a different compiler as core, or not.
+CT_CC_CORE_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core"
+
+# Good, now grab a bit of informations on the system we're being run,
+# just in case something goes awok, and it's not our fault:
+CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true`
+# Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
+CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}"
+CT_SYS_KERNEL=`uname -s`
+CT_SYS_REVISION=`uname -r`
+# MacOS X lacks '-o' :
+CT_SYS_OS=`uname -o || echo Unkown`
+CT_SYS_MACHINE=`uname -m`
+CT_SYS_PROCESSOR=`uname -p`
+CT_SYS_USER="`id -un`"
+CT_SYS_DATE=`CT_DoDate +%Y%m%d.%H%M%S`
+CT_SYS_GCC=`gcc -dumpversion`
+CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_SYS_DATE} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME} for ${CT_TARGET}"
+
+# renice oursleves
+renice ${CT_NICE} $$ |CT_DoLog DEBUG
+
+# Include sub-scripts instead of calling them: that way, we do not have to
+# export any variable, nor re-parse the configuration and functions files.
+. "${CT_TOP_DIR}/scripts/getExtractPatch.sh"
+. "${CT_TOP_DIR}/scripts/buildToolchain.sh"
+#. "${CT_TOP_DIR}/scripts/testToolchain.sh"
+
+if [ -n "${CT_TARGET_ALIAS}" ]; then
+    CT_DoLog EXTRA "Creating symlinks from \"${CT_TARGET}-*\" to \"${CT_TARGET_ALIAS}-*\""
+    CT_Pushd "${CT_PREFIX_DIR}/bin"
+    for t in "${CT_TARGET}-"*; do
+        _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`"
+        CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
+        ln -s "${t}" "${_t}"
+    done
+    CT_Popd
+fi
+
+CT_STOP_DATE=`CT_DoDate +%s%N`
+CT_STOP_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
+CT_DoLog INFO "Build completed at ${CT_STOP_DATE_HUMAN}"
+elapsed=$((CT_STOP_DATE-CT_STAR_DATE))
+elapsed_min=$((elapsed/(60*1000*1000*1000)))
+elapsed_sec=`printf "%02d" $(((elapsed%(60*1000*1000*1000))/(1000*1000*1000)))`
+elapsed_csec=`printf "%02d" $(((elapsed%(1000*1000*1000))/(10*1000*1000)))`
+CT_DoLog INFO "(elapsed: ${elapsed_min}:${elapsed_sec}.${elapsed_csec})"
+
+# Restore a 'normal' color setting
+echo -en "${CT_NORMAL_COLOR}"
+
+trap - EXIT
diff --git a/scripts/functions b/scripts/functions
new file mode 100644
index 00000000..2e7859d7
--- /dev/null
+++ b/scripts/functions
@@ -0,0 +1,215 @@
+# This file contains some usefull common functions
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+CT_OnError() {
+    ret=$?
+    CT_DoLog ERROR "Build failed in step \"${CT_STEP_MESSAGE[${CT_STEP_COUNT}]}\""
+    for((step=(CT_STEP_COUNT-1); step>1; step--)); do
+        CT_DoLog ERROR "      called in step \"${CT_STEP_MESSAGE[${step}]}\""
+    done
+    CT_DoLog ERROR "Error happened in \"${BASH_SOURCE[1]}\" in function \"${FUNCNAME[1]}\" (line unknown, sorry)"
+    for((depth=2; ${BASH_LINENO[$((${depth}-1))]}>0; depth++)); do
+        CT_DoLog ERROR "      called from \"${BASH_SOURCE[${depth}]}\" at line # ${BASH_LINENO[${depth}-1]} in function \"${FUNCNAME[${depth}]}\""
+    done
+    CT_DoLog ERROR "Look at \"${CT_ACTUAL_LOG_FILE}\" for more info on this error."
+    exit $ret
+}
+trap CT_OnError ERR
+
+set -E
+set -o pipefail
+
+# This is crosstool-ng-0.0.1
+CT_VERSION=ng-0.0.1
+
+# The different log levels:
+CT_LOG_LEVEL_ERROR=0
+CT_LOG_LEVEL_WARN=1
+CT_LOG_LEVEL_INFO=2
+CT_LOG_LEVEL_EXTRA=3
+CT_LOG_LEVEL_DEBUG=4
+
+# Attributes
+_A_NOR="\\033[0m"
+_A_BRI="\\033[1m"
+_A_DIM="\\033[2m"
+_A_UND="\\033[4m"
+_A_BRB="\\033[5m"
+_A_REV="\\033[7m"
+_A_HID="\\033[8m"
+
+# Fore colors
+_F_BLK="\\033[30m"
+_F_RED="\\033[31m"
+_F_GRN="\\033[32m"
+_F_YEL="\\033[33m"
+_F_BLU="\\033[34m"
+_F_MAG="\\033[35m"
+_F_CYA="\\033[36m"
+_F_WHI="\\033[37m"
+
+# A function to log what is happening
+# Different log level are available:
+#   - ERROR:   A serious, fatal error occurred
+#   - WARN:    A non fatal, non serious error occurred, take your responsbility with the generated build
+#   - INFO:    Informational messages
+#   - EXTRA:   Extra informational messages
+#   - DEBUG:   Debug messages
+# Usage: CT_DoLog <level> [message]
+# If message is empty, then stdin will be logged.
+CT_DoLog() {
+    local max_level
+    local level
+    eval max_level="\${CT_LOG_LEVEL_${CT_LOG_LEVEL_MAX}}"
+    # Set the maximum log level to DEBUG if we have none
+    [ -z ${max_level} ] && max_level=${CT_LOG_LEVEL_DEBUG}
+
+    local LEVEL="$1"
+    shift
+    eval level="\${CT_LOG_LEVEL_${LEVEL}}"
+
+    if [ $# -eq 0 ]; then
+        cat -
+    else
+        echo "${1}"
+    fi |( IFS="\n" # We want the full lines, even leading spaces
+          cpt=0
+          indent=$((2*CT_STEP_COUNT))
+          while read line; do
+              l="`printf \"[%-5s]%*s%s%s\" \"${LEVEL}\" \"${indent}\" \" \" \"${line}\"`"
+              # There will always be a log file, be it /dev/null
+              echo -e "${l}" >>"${CT_ACTUAL_LOG_FILE}"
+              color="CT_${LEVEL}_COLOR"
+              normal="CT_NORMAL_COLOR"
+              if [ ${level} -le ${max_level} ]; then
+                  echo -e "${!color}${l}${!normal}"
+              else
+                  ${CT_PROG_BAR}
+              fi
+          done
+        )
+
+    return 0
+}
+
+# Abort the execution with a error message
+# Usage: CT_Abort <message>
+CT_Abort() {
+    CT_DoLog ERROR "$1" >&2
+    exit 1
+}
+
+# Test a condition, and print a message if satisfied
+# Usage: CT_Test <message> <tests>
+CT_Test() {
+    local ret
+    local m="$1"
+    shift
+    test "$@" && CT_DoLog WARN "$m"
+    return 0
+}
+
+# Test a condition, and abort with an error message if satisfied
+# Usage: CT_TestAndAbort <message> <tests>
+CT_TestAndAbort() {
+    local m="$1"
+    shift
+    test "$@" && CT_Abort "$m"
+    return 0
+}
+
+# Test a condition, and abort with an error message if not satisfied
+# Usage: CT_TestAndAbort <message> <tests>
+CT_TestOrAbort() {
+    local m="$1"
+    shift
+    test "$@" || CT_Abort "$m"
+    return 0
+}
+
+# Test the presence of a tool, or abort if not found
+# Usage: CT_HasOrAbort <tool>
+CT_HasOrAbort() {
+    CT_TestAndAbort "\"${1}\" not found and needed for successfull toolchain build." -z "`which \"${1}\"`"
+    return 0
+}
+
+# Get current date with nanosecond precision
+# On those system not supporting nanosecond precision, faked with rounding down
+# to the highest entire second
+# Usage: CT_DoDate <fmt>
+CT_DoDate() {
+    date "$1" |sed -r -e 's/%N$/000000000/;'
+}
+
+CT_STEP_COUNT=1
+CT_STEP_MESSAGE[${CT_STEP_COUNT}]="<none>"
+# Memorise a step being done so that any error is caught
+# Usage: CT_DoStep <loglevel> <message>
+CT_DoStep() {
+    local start=`CT_DoDate +%s%N`
+    CT_DoLog "$1" "================================================================="
+    CT_DoLog "$1" "$2"
+    CT_STEP_COUNT=$((CT_STEP_COUNT+1))
+    CT_STEP_LEVEL[${CT_STEP_COUNT}]="$1"; shift
+    CT_STEP_START[${CT_STEP_COUNT}]="${start}"
+    CT_STEP_MESSAGE[${CT_STEP_COUNT}]="$1"
+    return 0
+}
+
+# End the step just being done
+# Usage: CT_EndStep
+CT_EndStep() {
+    local stop=`CT_DoDate +%s%N`
+    local duration=`printf "%032d" $((stop-${CT_STEP_START[${CT_STEP_COUNT}]})) |sed -r -e 's/([[:digit:]]{2})[[:digit:]]{7}$/\.\1/; s/^0+//; s/^\./0\./;'`
+    local level="${CT_STEP_LEVEL[${CT_STEP_COUNT}]}"
+    local message="${CT_STEP_MESSAGE[${CT_STEP_COUNT}]}"
+    CT_STEP_COUNT=$((CT_STEP_COUNT-1))
+    CT_DoLog "${level}" "${message}: done in ${duration}s"
+    return 0
+}
+
+# Pushes into a directory, and pops back
+CT_Pushd() {
+    pushd "$1" >/dev/null 2>&1
+}
+CT_Popd() {
+    popd >/dev/null 2>&1
+}
+
+# Makes a path absolute
+# Usage: CT_MakeAbsolutePath path
+CT_MakeAbsolutePath() {
+    # Try to cd in that directory
+    if [ -d "$1" ]; then
+        CT_Pushd "$1"
+        pwd
+        CT_Popd
+    else
+        # No such directory, fail back to guessing
+        case "$1" in
+            /*)  echo "$1";;
+            *)   echo "`pwd`/$1";;
+        esac
+    fi
+    
+    return 0
+}
+
+# Creates a temporary directory
+# $1: variable to assign to
+# Usage: CT_MktempDir foo
+CT_MktempDir() {
+    # Some mktemp do not allow more than 6 Xs
+    eval "$1"="`mktemp -q -d \"${CT_BUILD_DIR}/.XXXXXX\"`"
+    CT_TestOrAbort "Could not make temporary directory" -n "${!1}" -a -d "${!1}"
+}
+
+# Echoes the specified string on stdout until the pipe breaks.
+# Doesn't fail
+# $1: string to echo
+# Usage: CT_DoYes "" |make oldconfig
+CT_DoYes() {
+    yes "$1" || true
+}
diff --git a/scripts/getExtractPatch.sh b/scripts/getExtractPatch.sh
new file mode 100644
index 00000000..ed411b81
--- /dev/null
+++ b/scripts/getExtractPatch.sh
@@ -0,0 +1,336 @@
+# This script will download tarballs, extract them and patch the source.
+# Copyright 2007 Yann E. MORIN
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+# Download tarballs in sequence. Once we have everything, start extracting
+# and patching the tarballs.
+
+#-----------------------------------------------------------------------------
+
+_wget=`which wget || true`
+_curl=`which curl || true`
+#_svn=`which svn ||true`
+#_cvs=`which cvs || true`
+
+case "${_wget},${_curl}" in
+    ,)  CT_Abort "Found neither curl nor wget. Please install one.";;
+    ,*) CT_DoLog DEBUG "Using curl to retrieve tarballs"; CT_DoGetFile=CT_DoGetFileCurl;;
+    *)  CT_DoLog DEBUG "Using wget to retrieve tarballs"; CT_DoGetFile=CT_DoGetFileWget;;
+esac
+
+CT_DoGetFileWget() {
+    # Need to return true because it is legitimate not to find the tarball at
+    # some of the provided URLs (think about snapshots, different layouts for
+    # different gcc versions, etc...)
+    # Some (very old!) FTP server might not support the passive mode, thus
+    # retry without
+    # With automated download as we are doing, it can be very dangerous to use
+    # -c to continue the downloads. It's far better to simply overwrite the
+    # destination file
+    wget -nc --progress=dot:binary --tries=3 --passive-ftp "$1" || wget -nc --progress=dot:binary --tries=3 "$1" || true
+}
+
+CT_DoGetFileCurl() {
+	# Note: comments about wget method are also valid here
+	# Plus: no good progreess indicator is available with curl,
+	#       so output is consigned to oblivion
+	curl --ftp-pasv -O --retry 3 "$1" >/dev/null || curl -O --retry 3 "$1" >/dev/null || true
+}
+
+# For those wanting bleading edge, or to retrieve old uClibc snapshots
+# Usage: CT_GetFileSVN basename url
+#CT_DoGetFileSVN() {
+#    local basename="$1"
+#    local url="`echo \"$2\" |cut -d : -f 2-`"
+#    local tmp_dir
+#
+#    CT_TestOrAbort "You don't have subversion" -n "${_svn}"
+#    CT_MktempDir tmp_dir
+#    CT_Pushd "${tmp_dir}"
+#    svn export --force "${url}" "${basename}"
+#    tar cfj "${CT_TARBALLS_DIR}/${basename}.tar.bz2" "${basename}"
+#    CT_Popd
+#    rm -rf "${tmp_dir}"
+#}
+#
+#CT_DoGetFileCVS() {
+#    :
+#}
+
+# Download the file from one of the URLs passed as argument
+# Usage: CT_GetFile <filename> <url> [<url> ...]
+CT_GetFile() {
+    local got_it
+    local ext
+    local url
+    local file="$1"
+    shift
+
+    # Do we already have it?
+    ext=`CT_GetFileExtension "${file}"`
+    if [ -n "${ext}" ]; then
+        if [ "${CT_FORCE_DOWNLOAD}" = "y" ]; then
+            rm -f "${CT_TARBALLS_DIR}/${file}${ext}"
+        else
+            return 0
+        fi
+    fi
+
+    CT_DoLog EXTRA "Retrieving \"${file}\""
+    CT_Pushd "${CT_TARBALLS_DIR}"
+    # File not yet downloaded, try to get it
+    got_it=0
+    if [ "${got_it}" != "y" ]; then
+        # We'd rather have a bzip2'ed tarball, then gzipped, and finally plain tar.
+        for ext in .tar.bz2 .tar.gz .tgz .tar; do
+            # Try all urls in turn
+            for url in "$@"; do
+                case "${url}" in
+#                    svn://*)    CT_DoGetFileSVN "${file}" ${url}";;
+#                    cvs://*)    CT_DoGetFileCVS "${file}" ${url}";;
+                    *)  CT_DoLog EXTRA "Trying \"${url}/${file}${ext}\""
+                        ${CT_DoGetFile} "${url}/${file}${ext}" 2>&1 |CT_DoLog DEBUG
+                        ;;
+                esac
+                [ -f "${file}${ext}" ] && got_it=1 && break 2 || true
+            done
+        done
+    fi
+    CT_Popd
+
+    CT_TestAndAbort "Could not download \"${file}\", and not present in \"${CT_TARBALLS_DIR}\"" ${got_it} -eq 0
+}
+
+#-----------------------------------------------------------------------------
+
+# Extract a tarball and patch.
+# Some tarballs need to be extracted in specific places. Eg.: glibc addons
+# must be extracted in the glibc directory; uCLibc locales must be extracted
+# in the extra/locale sub-directory of uClibc.
+CT_ExtractAndPatch() {
+    local file="$1"
+    local base_file=`echo "${file}" |cut -d - -f 1`
+    local ver_file=`echo "${file}" |cut -d - -f 2-`
+    local official_patch_dir
+    local custom_patch_dir
+    local libc_addon
+    local ext=`CT_GetFileExtension "${file}"`
+    CT_TestAndAbort "\"${file}\" not found in \"${CT_TARBALLS_DIR}\"" -z "${ext}"
+    local full_file="${CT_TARBALLS_DIR}/${file}${ext}"
+
+    CT_Pushd "${CT_SRC_DIR}"
+
+    # Add-ons need a little love, really.
+    case "${file}" in
+        glibc-[a-z]*-*)
+            CT_TestAndAbort "Trying to extract the C-library addon/locales \"${file}\" when C-library not yet extracted" ! -d "${CT_LIBC_FILE}"
+            cd "${CT_LIBC_FILE}"
+            libc_addon=y
+            [ -f ".${file}.extracted" ] && return 0
+            touch ".${file}.extracted"
+            ;;
+        uClibc-locale-*)
+            CT_TestAndAbort "Trying to extract the C-library addon/locales \"${file}\" when C-library not yet extracted" ! -d "${CT_LIBC_FILE}"
+            cd "${CT_LIBC_FILE}/extra/locale"
+            libc_addon=y
+            [ -f ".${file}.extracted" ] && return 0
+            touch ".${file}.extracted"
+            ;;
+    esac
+
+    # If the directory exists, then consider extraction and patching done
+    [ -d "${file}" ] && return 0
+
+    CT_DoLog EXTRA "Extracting \"${file}\""
+    case "${ext}" in
+        .tar.bz2)     tar xvjf "${full_file}" |CT_DoLog DEBUG;;
+        .tar.gz|.tgz) tar xvzf "${full_file}" |CT_DoLog DEBUG;;
+        .tar)         tar xvf  "${full_file}" |CT_DoLog DEBUG;;
+        *)            CT_Abort "Don't know how to handle \"${file}\": unknown extension" ;;
+    esac
+
+    # Snapshots might not have the version number in the extracted directory
+    # name. This is also the case for some (old) packages, such as libfloat.
+    # Overcome this issue by symlink'ing the directory.
+    if [ ! -d "${file}" -a "${libc_addon}" != "y" ]; then
+        case "${ext}" in
+            .tar.bz2)     base=`tar tjf "${full_file}" |head -n 1 |cut -d / -f 1 || true`;;
+            .tar.gz|.tgz) base=`tar tzf "${full_file}" |head -n 1 |cut -d / -f 1 || true`;;
+            .tar)         base=`tar tf  "${full_file}" |head -n 1 |cut -d / -f 1 || true`;;
+        esac
+        CT_TestOrAbort "There was a problem when extracting \"${file}\"" -d "${base}" -o "${base}" != "${file}"
+        ln -s "${base}" "${file}"
+    fi
+
+    # Kludge: outside this function, we wouldn't know if we had just extracted
+    # a libc addon, or a plain package. Apply patches now.
+    CT_DoLog EXTRA "Patching \"${file}\""
+
+    # If libc addon, we're already in the correct place.
+    [ -z "${libc_addon}" ] && cd "${file}"
+
+    [ "${CUSTOM_PATCH_ONLY}" = "y" ] || official_patch_dir="${CT_TOP_DIR}/patches/${base_file}/${ver_file}"
+    [ "${CT_CUSTOM_PATCH}" = "y" ] && custom_patch_dir="${CT_CUSTOM_PATCH_DIR}/${base_file}/${ver_file}"
+    for patch_dir in "${official_patch_dir}" "${custom_patch_dir}"; do
+        if [ -n "${patch_dir}" -a -d "${patch_dir}" ]; then
+            for p in "${patch_dir}"/*.patch; do
+                if [ -f "${p}" ]; then
+                    CT_DoLog DEBUG "Applying patch \"${p}\""
+                    patch -g0 -F1 -p1 -f <"${p}" |CT_DoLog DEBUG
+                    CT_TestAndAbort "Failed while applying patch file \"${p}\"" ${PIPESTATUS[0]} -ne 0
+                fi
+            done
+        fi
+    done
+
+    CT_Popd
+}
+
+#-----------------------------------------------------------------------------
+
+# Get the file name extension of a component
+# Usage: CT_GetFileExtension <component-version>
+# If found, echoes the extension to stdout
+# If not found, echoes nothing on stdout.
+CT_GetFileExtension() {
+    local ext
+    local file="$1"
+    local got_it=1
+
+    CT_Pushd "${CT_TARBALLS_DIR}"
+    for ext in .tar.gz .tar.bz2 .tgz .tar; do
+        if [ -f "${file}${ext}" ]; then
+            echo "${ext}"
+            got_it=0
+            break
+        fi
+    done
+    CT_Popd
+
+    return 0
+}
+
+#-----------------------------------------------------------------------------
+
+# Create needed directories, remove old ones
+mkdir -p "${CT_TARBALLS_DIR}"
+if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
+    mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.$$"
+    nohup rm -rf "${CT_SRC_DIR}.$$" >/dev/null 2>&1 &
+fi
+mkdir -p "${CT_SRC_DIR}"
+
+# Make all path absolute, it so much easier!
+# Now we have had the directories created, we even will get rid of embedded .. in paths:
+CT_SRC_DIR="`CT_MakeAbsolutePath \"${CT_SRC_DIR}\"`"
+CT_TARBALLS_DIR="`CT_MakeAbsolutePath \"${CT_TARBALLS_DIR}\"`"
+
+# Prepare the addons list to be parsable:
+addons_list="`echo \"${CT_LIBC_ADDONS_LIST}\" |sed -r -e 's/,/ /g; s/ $//g;'`"
+
+if [ "${CT_NO_DOWNLOAD}" != "y" ]; then
+    CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
+
+    # Kernel: for now, I don't care about cygwin.
+    CT_GetFile "${CT_KERNEL_FILE}"                                  \
+               ftp://ftp.kernel.org/pub/linux/kernel/v2.6           \
+               ftp://ftp.kernel.org/pub/linux/kernel/v2.4           \
+               ftp://ftp.kernel.org/pub/linux/kernel/v2.2           \
+               ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing   \
+               http://ep09.pld-linux.org/~mmazur/linux-libc-headers
+
+    # binutils
+    CT_GetFile "${CT_BINUTILS_FILE}"                            \
+               ftp://ftp.gnu.org/gnu/binutils                   \
+               ftp://ftp.kernel.org/pub/linux/devel/binutils
+
+    # Core and final gcc
+    # Ah! gcc folks are kind of 'different': they store the tarballs in
+    # subdirectories of the same name! That's because gcc is such /crap/ that
+    # it is such /big/ that it needs being splitted for distribution! Sad. :-(
+    # Arrgghh! Some of those versions does not follow this convention:
+    # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
+    # subdirectory! You bastard!
+    CT_GetFile "${CT_CC_CORE_FILE}"                                    \
+               ftp://ftp.gnu.org/gnu/gcc/${CT_CC_CORE_FILE}            \
+               ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_CORE_FILE}   \
+               ftp://ftp.gnu.org/gnu/gcc
+    CT_GetFile "${CT_CC_FILE}"                                  \
+               ftp://ftp.gnu.org/gnu/gcc/${CT_CC_FILE}          \
+               ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_FILE} \
+               ftp://ftp.gnu.org/gnu/gcc
+
+    # C library
+    case "${CT_LIBC}" in
+        glibc)
+            # Ah! Not all GNU folks seem stupid. All glibc releases are in the same
+            # directory. Good. Alas, there is no snapshot there. I'll deal with them
+            # later on... :-/
+            libc_src="ftp://ftp.gnu.org/gnu/glibc"
+            ;;
+        uClibc)
+            # For uClibc, we have almost every thing: releases, and snapshots
+            # for the last month or so. We'll have to deal with svn revisions
+            # later...
+            libc_src="http://www.uclibc.org/downloads
+                      http://www.uclibc.org/downloads/snapshots
+                      http://www.uclibc.org/downloads/old-releases"
+            ;;
+    esac
+    CT_GetFile "${CT_LIBC_FILE}" ${libc_src}
+
+    # C library addons
+    addons_list=`echo "${CT_LIBC_ADDONS}" |sed -r -e 's/,/ /g; s/ $//g;'`
+    for addon in ${addons_list}; do
+        CT_GetFile "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" \
+                   ftp://ftp.gnu.org/gnu/glibc
+    done
+    if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then
+        CT_GetFile "uClibc-locale-030818"                        \
+                   http://www.uclibc.org/downloads               \
+                   http://www.uclibc.org/downloads/snapshots     \
+                   http://www.uclibc.org/downloads/old-releases
+    fi
+
+    # libfloat if asked for
+    if [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ]; then
+        lib_float_url="ftp://ftp.de.debian.org/debian/pool/main/libf/libfloat/"
+
+        # Please note: because the file we download, and the file we store on the
+        # file system don't have the same name, CT_GetFile will always try to
+        # download the file over and over.
+        # To avoid this, we check that the file we want already exists in the
+        # tarball directory first. This is an ugly hack that overrides the standard
+        # CT_GetFile behavior... Sight...
+        ext=`CT_GetFileExtension "${CT_LIBFLOAT_FILE}"`
+        if [ -z "${ext}" ]; then
+            CT_GetFile libfloat_990616.orig "${lib_float_url}"
+            ext=`CT_GetFileExtension "libfloat_990616.orig"`
+            # Hack: remove the .orig extension, and change _ to -
+            mv -v "${CT_TARBALLS_DIR}/libfloat_990616.orig${ext}" \
+                  "${CT_TARBALLS_DIR}/libfloat-990616${ext}"      2>&1 |CT_DoLog DEBUG
+        fi
+    fi
+    
+    CT_EndStep
+fi # CT_NO_DOWNLOAD
+
+if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
+    CT_DoStep INFO "Extracting and patching toolchain components"
+
+    CT_ExtractAndPatch "${CT_KERNEL_FILE}"
+    CT_ExtractAndPatch "${CT_BINUTILS_FILE}"
+    CT_ExtractAndPatch "${CT_CC_CORE_FILE}"
+    CT_ExtractAndPatch "${CT_CC_FILE}"
+    CT_ExtractAndPatch "${CT_LIBC_FILE}"
+    for addon in ${addons_list}; do
+        CT_ExtractAndPatch "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
+    done
+    if [ "${CT_LIBC_UCLIBC_LOCALES}" = "y" ]; then
+        CT_ExtractAndPatch "uclibc-locale-030818"
+    fi
+
+    [ "${CT_ARCH_FLOAT_SW_LIBFLOAT}" = "y" ] && CT_ExtractAndPatch "${CT_LIBFLOAT_FILE}"
+
+    CT_EndStep
+fi
diff --git a/tools/Makefile b/tools/Makefile
new file mode 100644
index 00000000..c62796e3
--- /dev/null
+++ b/tools/Makefile
@@ -0,0 +1,11 @@
+CONFIG_SUB_SRC="http://cvs.savannah.gnu.org/viewcvs/*checkout*/config/config/config.sub"
+CONFIG_SUB_DEST="$(CT_TOP_DIR)/tools/config.sub"
+CONFIG_GUESS_SRC="http://cvs.savannah.gnu.org/viewcvs/*checkout*/config/config/config.guess"
+CONFIG_GUESS_DEST="$(CT_TOP_DIR)/tools/config.guess"
+
+updatetools:
+	@wget "$(CONFIG_SUB_SRC)" -O "$(CONFIG_SUB_DEST)"
+	@wget "$(CONFIG_GUESS_SRC)" -O "$(CONFIG_GUESS_DEST)"
+
+help::
+	@echo '  updatetools	  - Update the config tools'
diff --git a/tools/addToolVersion.sh b/tools/addToolVersion.sh
new file mode 100755
index 00000000..5a53ea7e
--- /dev/null
+++ b/tools/addToolVersion.sh
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+# Adds a new version to one of the toolchain component
+myname="$0"
+
+doHelp() {
+    cat <<-EOF
+Usage: ${myname} <tool> [option] <version>
+  'tool' in one of:
+    --gcc, --tcc, --binutils, --glibc, --uClibc, --linux, --cygwin
+
+  Valid mandatory 'option' for tool==gcc is one of:
+    --core, --final
+
+  Valid mandatory 'option' for tool==linux is one of:
+    --install, --sanitised, --copy
+
+  'version' is a valid version for the specified tool.
+
+  Examples:
+    add version 2.6.19.2 to linux kernel install method:
+      ${myname} --linux --install 2.6.19.2
+
+    add versions 2.3.5 and 2.3.6 to glibc:
+      ${myname} --glibc 2.3.5 2.3.6
+EOF
+}
+
+tool=
+tool_prefix=
+CORE=
+FINAL=
+VERSION=
+
+i=1
+while [ $i -le $# ]; do
+    case "${!i}" in
+        --gcc)          cat=CC;        tool=gcc;      tool_prefix=cc_;      tool_suffix=;;
+#        --tcc)          cat=CC;        tool=tcc;      tool_prefix=cc_;      tool_suffix=;;
+        --binutils)     cat=BINUTILS;  tool=binutils; tool_prefix=;         tool_suffix=;;
+        --glibc)        cat=LIBC;      tool=glibc;    tool_prefix=libc_;    tool_suffix=;;
+        --uClibc)       cat=LIBC;      tool=uClibc;   tool_prefix=libc_;    tool_suffix=;;
+        --linux)        cat=KERNEL;    tool=linux;    tool_prefix=kernel_;;
+#        --cygwin)       cat=KERNEL;    tool=cygwin;   tool_prefix=kernel_;;
+        --core)         CORE=1;;
+        --final)        FINAL=1;;
+        --install)      tool_suffix=install;;
+        --sanitised)    tool_suffix=sanitised;;
+        --copy)         tool_suffix=copy;;
+        -h|--help)      doHelp; exit 0;;
+        -*)             echo "Unknown option: \"${!i}\". (use -h/--help for help"; exit 1;;
+        *)              VERSION="${VERSION} ${!i}";;
+    esac
+    i=$((i+1))
+done
+
+[ -n "${tool}" -o -n "${VERSION}" ] || { doHelp; exit 1; }
+
+case "${cat}" in
+    CC)     ;;
+    KERNEL) FINAL=; CORE=;;
+    *)      FINAL=1; CORE=;;
+esac
+
+for ver in ${VERSION}; do
+	v=`echo "${ver}" |sed -r -e 's/-/_/g; s/\./_/g;'`
+    if [ -n "${CORE}" ]; then
+        L1="config ${cat}_CORE_V_${v}\n"
+        L2="    bool\n"
+        L3="    prompt \"${ver}\"\n"
+        L4="    default \"${ver}\" if ${cat}_CORE_V_${v}"
+        sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}"'\n\1/;
+                      s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L4}"'\n\1/;' config/${tool_prefix}core_${tool}.in
+    fi
+    if [ -n "${FINAL}" ]; then
+        L1="config ${cat}_V_${v}\n"
+        L2="    bool\n"
+        L3="    prompt \"${ver}\"\n"
+        L4="    default \"${ver}\" if ${cat}_V_${v}"
+        sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}"'\n\1/;
+                      s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L4}"'\n\1/;' config/${tool_prefix}${tool}.in
+    fi
+    if [ "${cat}" = "KERNEL" ]; then
+        TOOL_SUFFIX="`echo \"${tool_suffix}\" |tr [[:lower:]] [[:upper:]]`"
+        L1="config ${cat}_${TOOL_SUFFIX}_V_${v}\n"
+        L2="    bool\n"
+        L3="    prompt \"${ver}\"\n"
+        # Extra versions are not necessary visible:
+        case "${ver}" in
+            *.*.*.*) L4="    depends on KERNEL_VERSION_SEE_EXTRAVERSION\n";;
+            *)       L4=;;
+        esac
+        # Sanitised headers always have an extra version:
+        [ "${tool_suffix}" = "sanitised" ] && L4=
+        L5="    default \"${ver}\" if ${cat}_${TOOL_SUFFIX}_V_${v}"
+        sed -r -i -e 's/^(# CT_INSERT_VERSION_ABOVE)$/'"${L1}${L2}${L3}${L4}"'\n\1/;
+                      s/^(# CT_INSERT_VERSION_STRING_ABOVE)$/'"${L5}"'\n\1/;' config/${tool_prefix}${tool}_headers_${tool_suffix}.in
+    fi
+done
diff --git a/tools/config.guess b/tools/config.guess
new file mode 100755
index 00000000..6cc26cd3
--- /dev/null
+++ b/tools/config.guess
@@ -0,0 +1,1513 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2007-01-15'
+
+# This file 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 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    x86:Interix*:[3456]*)
+	echo i586-pc-interix${UNAME_RELEASE}
+	exit ;;
+    EM64T:Interix*:[3456]* | authenticamd:Interix*:[3456]*)
+	echo x86_64-unknown-interix${UNAME_RELEASE}
+	exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa:Linux:*:*)
+    	echo xtensa-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/tools/config.sub b/tools/config.sub
new file mode 100755
index 00000000..5defff65
--- /dev/null
+++ b/tools/config.sub
@@ -0,0 +1,1622 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2007-01-18'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End: